settingBody.js 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215
  1. BlazeComponent.extendComponent({
  2. onCreated() {
  3. this.error = new ReactiveVar('');
  4. this.loading = new ReactiveVar(false);
  5. this.generalSetting = new ReactiveVar(true);
  6. this.emailSetting = new ReactiveVar(false);
  7. this.accountSetting = new ReactiveVar(false);
  8. this.announcementSetting = new ReactiveVar(false);
  9. Meteor.subscribe('setting');
  10. Meteor.subscribe('mailServer');
  11. Meteor.subscribe('accountSettings');
  12. Meteor.subscribe('announcements');
  13. },
  14. setError(error) {
  15. this.error.set(error);
  16. },
  17. setLoading(w) {
  18. this.loading.set(w);
  19. },
  20. checkField(selector) {
  21. const value = $(selector).val();
  22. if(!value || value.trim() === ''){
  23. $(selector).parents('li.smtp-form').addClass('has-error');
  24. throw Error('blank field');
  25. } else {
  26. return value;
  27. }
  28. },
  29. currentSetting(){
  30. return Settings.findOne();
  31. },
  32. boards() {
  33. return Boards.find({
  34. archived: false,
  35. 'members.userId': Meteor.userId(),
  36. 'members.isAdmin': true,
  37. }, {
  38. sort: ['title'],
  39. });
  40. },
  41. toggleRegistration(){
  42. this.setLoading(true);
  43. const registrationClosed = this.currentSetting().disableRegistration;
  44. Settings.update(Settings.findOne()._id, {$set:{disableRegistration: !registrationClosed}});
  45. this.setLoading(false);
  46. if(registrationClosed){
  47. $('.invite-people').slideUp();
  48. }else{
  49. $('.invite-people').slideDown();
  50. }
  51. },
  52. toggleTLS(){
  53. $('#mail-server-tls').toggleClass('is-checked');
  54. },
  55. switchMenu(event){
  56. const target = $(event.target);
  57. if(!target.hasClass('active')){
  58. $('.side-menu li.active').removeClass('active');
  59. target.parent().addClass('active');
  60. const targetID = target.data('id');
  61. this.generalSetting.set('registration-setting' === targetID);
  62. this.emailSetting.set('email-setting' === targetID);
  63. this.accountSetting.set('account-setting' === targetID);
  64. this.announcementSetting.set('announcement-setting' === targetID);
  65. }
  66. },
  67. checkBoard(event){
  68. let target = $(event.target);
  69. if(!target.hasClass('js-toggle-board-choose')){
  70. target = target.parent();
  71. }
  72. const checkboxId = target.attr('id');
  73. $(`#${checkboxId} .materialCheckBox`).toggleClass('is-checked');
  74. $(`#${checkboxId}`).toggleClass('is-checked');
  75. },
  76. inviteThroughEmail(){
  77. const emails = $('#email-to-invite').val().trim().split('\n').join(',').split(',');
  78. const boardsToInvite = [];
  79. $('.js-toggle-board-choose .materialCheckBox.is-checked').each(function () {
  80. boardsToInvite.push($(this).data('id'));
  81. });
  82. const validEmails = [];
  83. emails.forEach((email) => {
  84. if (email && SimpleSchema.RegEx.Email.test(email.trim())) {
  85. validEmails.push(email.trim());
  86. }
  87. });
  88. if (validEmails.length) {
  89. this.setLoading(true);
  90. Meteor.call('sendInvitation', validEmails, boardsToInvite, () => {
  91. // if (!err) {
  92. // TODO - show more info to user
  93. // }
  94. this.setLoading(false);
  95. });
  96. }
  97. },
  98. saveMailServerInfo(){
  99. this.setLoading(true);
  100. $('li').removeClass('has-error');
  101. try{
  102. const host = this.checkField('#mail-server-host');
  103. const port = this.checkField('#mail-server-port');
  104. const username = $('#mail-server-username').val().trim();
  105. const password = $('#mail-server-password').val().trim();
  106. const from = this.checkField('#mail-server-from');
  107. const tls = $('#mail-server-tls.is-checked').length > 0;
  108. Settings.update(Settings.findOne()._id, {$set:{'mailServer.host':host, 'mailServer.port': port, 'mailServer.username': username,
  109. 'mailServer.password': password, 'mailServer.enableTLS': tls, 'mailServer.from': from}});
  110. } catch (e) {
  111. return;
  112. } finally {
  113. this.setLoading(false);
  114. }
  115. },
  116. sendSMTPTestEmail() {
  117. Meteor.call('sendSMTPTestEmail', (err, ret) => {
  118. if (!err && ret) { /* eslint-disable no-console */
  119. const message = `${TAPi18n.__(ret.message)}: ${ret.email}`;
  120. console.log(message);
  121. alert(message);
  122. } else {
  123. const reason = err.reason || '';
  124. const message = `${TAPi18n.__(err.error)}\n${reason}`;
  125. console.log(message, err);
  126. alert(message);
  127. } /* eslint-enable no-console */
  128. });
  129. },
  130. events(){
  131. return [{
  132. 'click a.js-toggle-registration': this.toggleRegistration,
  133. 'click a.js-toggle-tls': this.toggleTLS,
  134. 'click a.js-setting-menu': this.switchMenu,
  135. 'click a.js-toggle-board-choose': this.checkBoard,
  136. 'click button.js-email-invite': this.inviteThroughEmail,
  137. 'click button.js-save': this.saveMailServerInfo,
  138. 'click button.js-send-smtp-test-email': this.sendSMTPTestEmail,
  139. }];
  140. },
  141. }).register('setting');
  142. BlazeComponent.extendComponent({
  143. saveAllowEmailChange() {
  144. const allowEmailChange = ($('input[name=allowEmailChange]:checked').val() === 'true');
  145. AccountSettings.update('accounts-allowEmailChange', {
  146. $set: { 'booleanValue': allowEmailChange },
  147. });
  148. },
  149. allowEmailChange() {
  150. return AccountSettings.findOne('accounts-allowEmailChange').booleanValue;
  151. },
  152. events() {
  153. return [{
  154. 'click button.js-accounts-save': this.saveAllowEmailChange,
  155. }];
  156. },
  157. }).register('accountSettings');
  158. BlazeComponent.extendComponent({
  159. onCreated() {
  160. this.loading = new ReactiveVar(false);
  161. },
  162. setLoading(w) {
  163. this.loading.set(w);
  164. },
  165. currentSetting(){
  166. return Announcements.findOne();
  167. },
  168. saveMessage() {
  169. const message = $('#admin-announcement').val().trim();
  170. Announcements.update(Announcements.findOne()._id, {
  171. $set: { 'body': message },
  172. });
  173. },
  174. toggleActive(){
  175. this.setLoading(true);
  176. const isActive = this.currentSetting().enabled;
  177. Announcements.update(Announcements.findOne()._id, {
  178. $set:{ 'enabled': !isActive},
  179. });
  180. this.setLoading(false);
  181. if(isActive){
  182. $('.admin-announcement').slideUp();
  183. }else{
  184. $('.admin-announcement').slideDown();
  185. }
  186. },
  187. events() {
  188. return [{
  189. 'click a.js-toggle-activemessage': this.toggleActive,
  190. 'click button.js-announcement-save': this.saveMessage,
  191. }];
  192. },
  193. }).register('announcementSettings');