settingBody.js 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229
  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, {
  109. $set: {
  110. 'mailServer.host': host, 'mailServer.port': port, 'mailServer.username': username,
  111. 'mailServer.password': password, 'mailServer.enableTLS': tls, 'mailServer.from': from,
  112. },
  113. });
  114. } catch (e) {
  115. return;
  116. } finally {
  117. this.setLoading(false);
  118. }
  119. },
  120. sendSMTPTestEmail() {
  121. Meteor.call('sendSMTPTestEmail', (err, ret) => {
  122. if (!err && ret) { /* eslint-disable no-console */
  123. const message = `${TAPi18n.__(ret.message)}: ${ret.email}`;
  124. console.log(message);
  125. alert(message);
  126. } else {
  127. const reason = err.reason || '';
  128. const message = `${TAPi18n.__(err.error)}\n${reason}`;
  129. console.log(message, err);
  130. alert(message);
  131. }
  132. /* eslint-enable no-console */
  133. });
  134. },
  135. events() {
  136. return [{
  137. 'click a.js-toggle-registration': this.toggleRegistration,
  138. 'click a.js-toggle-tls': this.toggleTLS,
  139. 'click a.js-setting-menu': this.switchMenu,
  140. 'click a.js-toggle-board-choose': this.checkBoard,
  141. 'click button.js-email-invite': this.inviteThroughEmail,
  142. 'click button.js-save': this.saveMailServerInfo,
  143. 'click button.js-send-smtp-test-email': this.sendSMTPTestEmail,
  144. }];
  145. },
  146. }).register('setting');
  147. BlazeComponent.extendComponent({
  148. saveAccountsChange() {
  149. const allowEmailChange = ($('input[name=allowEmailChange]:checked').val() === 'true');
  150. const allowUserNameChange = ($('input[name=allowUserNameChange]:checked').val() === 'true');
  151. AccountSettings.update('accounts-allowEmailChange', {
  152. $set: {'booleanValue': allowEmailChange},
  153. });
  154. AccountSettings.update('accounts-allowUserNameChange', {
  155. $set: {'booleanValue': allowUserNameChange},
  156. });
  157. },
  158. allowEmailChange() {
  159. return AccountSettings.findOne('accounts-allowEmailChange').booleanValue;
  160. },
  161. allowUserNameChange() {
  162. return AccountSettings.findOne('accounts-allowUserNameChange').booleanValue;
  163. },
  164. events() {
  165. return [{
  166. 'click button.js-accounts-save': this.saveAccountsChange,
  167. }];
  168. },
  169. }).register('accountSettings');
  170. BlazeComponent.extendComponent({
  171. onCreated() {
  172. this.loading = new ReactiveVar(false);
  173. },
  174. setLoading(w) {
  175. this.loading.set(w);
  176. },
  177. currentSetting() {
  178. return Announcements.findOne();
  179. },
  180. saveMessage() {
  181. const message = $('#admin-announcement').val().trim();
  182. Announcements.update(Announcements.findOne()._id, {
  183. $set: {'body': message},
  184. });
  185. },
  186. toggleActive() {
  187. this.setLoading(true);
  188. const isActive = this.currentSetting().enabled;
  189. Announcements.update(Announcements.findOne()._id, {
  190. $set: {'enabled': !isActive},
  191. });
  192. this.setLoading(false);
  193. if (isActive) {
  194. $('.admin-announcement').slideUp();
  195. } else {
  196. $('.admin-announcement').slideDown();
  197. }
  198. },
  199. events() {
  200. return [{
  201. 'click a.js-toggle-activemessage': this.toggleActive,
  202. 'click button.js-announcement-save': this.saveMessage,
  203. }];
  204. },
  205. }).register('announcementSettings');