settingBody.js 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231
  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. /* eslint-disable no-console */
  78. const emails = $('#email-to-invite').val().trim().split('\n').join(',').split(',');
  79. const boardsToInvite = [];
  80. $('.js-toggle-board-choose .materialCheckBox.is-checked').each(function () {
  81. boardsToInvite.push($(this).data('id'));
  82. });
  83. const validEmails = [];
  84. emails.forEach((email) => {
  85. if (email && SimpleSchema.RegEx.Email.test(email.trim())) {
  86. validEmails.push(email.trim());
  87. }
  88. });
  89. if (validEmails.length) {
  90. this.setLoading(true);
  91. Meteor.call('sendInvitation', validEmails, boardsToInvite, () => {
  92. // if (!err) {
  93. // TODO - show more info to user
  94. // }
  95. this.setLoading(false);
  96. });
  97. }
  98. /* eslint-enable no-console */
  99. },
  100. saveMailServerInfo() {
  101. this.setLoading(true);
  102. $('li').removeClass('has-error');
  103. try {
  104. const host = this.checkField('#mail-server-host');
  105. const port = this.checkField('#mail-server-port');
  106. const username = $('#mail-server-username').val().trim();
  107. const password = $('#mail-server-password').val().trim();
  108. const from = this.checkField('#mail-server-from');
  109. const tls = $('#mail-server-tls.is-checked').length > 0;
  110. Settings.update(Settings.findOne()._id, {
  111. $set: {
  112. 'mailServer.host': host, 'mailServer.port': port, 'mailServer.username': username,
  113. 'mailServer.password': password, 'mailServer.enableTLS': tls, 'mailServer.from': from,
  114. },
  115. });
  116. } catch (e) {
  117. return;
  118. } finally {
  119. this.setLoading(false);
  120. }
  121. },
  122. sendSMTPTestEmail() {
  123. Meteor.call('sendSMTPTestEmail', (err, ret) => {
  124. if (!err && ret) { /* eslint-disable no-console */
  125. const message = `${TAPi18n.__(ret.message)}: ${ret.email}`;
  126. console.log(message);
  127. alert(message);
  128. } else {
  129. const reason = err.reason || '';
  130. const message = `${TAPi18n.__(err.error)}\n${reason}`;
  131. console.log(message, err);
  132. alert(message);
  133. }
  134. /* eslint-enable no-console */
  135. });
  136. },
  137. events() {
  138. return [{
  139. 'click a.js-toggle-registration': this.toggleRegistration,
  140. 'click a.js-toggle-tls': this.toggleTLS,
  141. 'click a.js-setting-menu': this.switchMenu,
  142. 'click a.js-toggle-board-choose': this.checkBoard,
  143. 'click button.js-email-invite': this.inviteThroughEmail,
  144. 'click button.js-save': this.saveMailServerInfo,
  145. 'click button.js-send-smtp-test-email': this.sendSMTPTestEmail,
  146. }];
  147. },
  148. }).register('setting');
  149. BlazeComponent.extendComponent({
  150. saveAccountsChange() {
  151. const allowEmailChange = ($('input[name=allowEmailChange]:checked').val() === 'true');
  152. const allowUserNameChange = ($('input[name=allowUserNameChange]:checked').val() === 'true');
  153. AccountSettings.update('accounts-allowEmailChange', {
  154. $set: {'booleanValue': allowEmailChange},
  155. });
  156. AccountSettings.update('accounts-allowUserNameChange', {
  157. $set: {'booleanValue': allowUserNameChange},
  158. });
  159. },
  160. allowEmailChange() {
  161. return AccountSettings.findOne('accounts-allowEmailChange').booleanValue;
  162. },
  163. allowUserNameChange() {
  164. return AccountSettings.findOne('accounts-allowUserNameChange').booleanValue;
  165. },
  166. events() {
  167. return [{
  168. 'click button.js-accounts-save': this.saveAccountsChange,
  169. }];
  170. },
  171. }).register('accountSettings');
  172. BlazeComponent.extendComponent({
  173. onCreated() {
  174. this.loading = new ReactiveVar(false);
  175. },
  176. setLoading(w) {
  177. this.loading.set(w);
  178. },
  179. currentSetting() {
  180. return Announcements.findOne();
  181. },
  182. saveMessage() {
  183. const message = $('#admin-announcement').val().trim();
  184. Announcements.update(Announcements.findOne()._id, {
  185. $set: {'body': message},
  186. });
  187. },
  188. toggleActive() {
  189. this.setLoading(true);
  190. const isActive = this.currentSetting().enabled;
  191. Announcements.update(Announcements.findOne()._id, {
  192. $set: {'enabled': !isActive},
  193. });
  194. this.setLoading(false);
  195. if (isActive) {
  196. $('.admin-announcement').slideUp();
  197. } else {
  198. $('.admin-announcement').slideDown();
  199. }
  200. },
  201. events() {
  202. return [{
  203. 'click a.js-toggle-activemessage': this.toggleActive,
  204. 'click button.js-announcement-save': this.saveMessage,
  205. }];
  206. },
  207. }).register('announcementSettings');