peopleBody.js 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250
  1. const usersPerPage = 25;
  2. BlazeComponent.extendComponent({
  3. mixins() {
  4. return [Mixins.InfiniteScrolling];
  5. },
  6. onCreated() {
  7. this.error = new ReactiveVar('');
  8. this.loading = new ReactiveVar(false);
  9. this.people = new ReactiveVar(true);
  10. this.findUsersOptions = new ReactiveVar({});
  11. this.number = new ReactiveVar(0);
  12. this.page = new ReactiveVar(1);
  13. this.loadNextPageLocked = false;
  14. this.callFirstWith(null, 'resetNextPeak');
  15. this.autorun(() => {
  16. const limit = this.page.get() * usersPerPage;
  17. this.subscribe('people', limit, () => {
  18. this.loadNextPageLocked = false;
  19. const nextPeakBefore = this.callFirstWith(null, 'getNextPeak');
  20. this.calculateNextPeak();
  21. const nextPeakAfter = this.callFirstWith(null, 'getNextPeak');
  22. if (nextPeakBefore === nextPeakAfter) {
  23. this.callFirstWith(null, 'resetNextPeak');
  24. }
  25. });
  26. });
  27. },
  28. events() {
  29. return [
  30. {
  31. 'click #searchButton'() {
  32. this.filterPeople();
  33. },
  34. 'keydown #searchInput'(event) {
  35. if (event.keyCode === 13 && !event.shiftKey) {
  36. this.filterPeople();
  37. }
  38. },
  39. },
  40. ];
  41. },
  42. filterPeople() {
  43. const value = $('#searchInput')
  44. .first()
  45. .val();
  46. if (value === '') {
  47. this.findUsersOptions.set({});
  48. } else {
  49. const regex = new RegExp(value, 'i');
  50. this.findUsersOptions.set({
  51. $or: [
  52. { username: regex },
  53. { 'profile.fullname': regex },
  54. { 'emails.address': regex },
  55. ],
  56. });
  57. }
  58. },
  59. loadNextPage() {
  60. if (this.loadNextPageLocked === false) {
  61. this.page.set(this.page.get() + 1);
  62. this.loadNextPageLocked = true;
  63. }
  64. },
  65. calculateNextPeak() {
  66. const element = this.find('.main-body');
  67. if (element) {
  68. const altitude = element.scrollHeight;
  69. this.callFirstWith(this, 'setNextPeak', altitude);
  70. }
  71. },
  72. reachNextPeak() {
  73. this.loadNextPage();
  74. },
  75. setError(error) {
  76. this.error.set(error);
  77. },
  78. setLoading(w) {
  79. this.loading.set(w);
  80. },
  81. peopleList() {
  82. const users = Users.find(this.findUsersOptions.get(), {
  83. fields: { _id: true },
  84. });
  85. this.number.set(users.count());
  86. return users;
  87. },
  88. peopleNumber() {
  89. return this.number.get();
  90. },
  91. }).register('people');
  92. Template.peopleRow.helpers({
  93. userData() {
  94. const userCollection = this.esSearch ? ESSearchResults : Users;
  95. return userCollection.findOne(this.userId);
  96. },
  97. });
  98. Template.editUserPopup.onCreated(function() {
  99. this.authenticationMethods = new ReactiveVar([]);
  100. this.errorMessage = new ReactiveVar('');
  101. Meteor.call('getAuthenticationsEnabled', (_, result) => {
  102. if (result) {
  103. // TODO : add a management of different languages
  104. // (ex {value: ldap, text: TAPi18n.__('ldap', {}, T9n.getLanguage() || 'en')})
  105. this.authenticationMethods.set([
  106. { value: 'password' },
  107. // Gets only the authentication methods availables
  108. ...Object.entries(result)
  109. .filter(e => e[1])
  110. .map(e => ({ value: e[0] })),
  111. ]);
  112. }
  113. });
  114. });
  115. Template.editUserPopup.helpers({
  116. user() {
  117. return Users.findOne(this.userId);
  118. },
  119. authentications() {
  120. return Template.instance().authenticationMethods.get();
  121. },
  122. isSelected(match) {
  123. const userId = Template.instance().data.userId;
  124. const selected = Users.findOne(userId).authenticationMethod;
  125. return selected === match;
  126. },
  127. isLdap() {
  128. const userId = Template.instance().data.userId;
  129. const selected = Users.findOne(userId).authenticationMethod;
  130. return selected === 'ldap';
  131. },
  132. errorMessage() {
  133. return Template.instance().errorMessage.get();
  134. },
  135. });
  136. BlazeComponent.extendComponent({
  137. onCreated() {},
  138. user() {
  139. return Users.findOne(this.userId);
  140. },
  141. events() {
  142. return [
  143. {
  144. 'click a.edit-user': Popup.open('editUser'),
  145. },
  146. ];
  147. },
  148. }).register('peopleRow');
  149. Template.editUserPopup.events({
  150. submit(event, templateInstance) {
  151. event.preventDefault();
  152. const user = Users.findOne(this.userId);
  153. const fullname = templateInstance.find('.js-profile-fullname').value.trim();
  154. const username = templateInstance.find('.js-profile-username').value.trim();
  155. const password = templateInstance.find('.js-profile-password').value;
  156. const isAdmin = templateInstance.find('.js-profile-isadmin').value.trim();
  157. const isActive = templateInstance.find('.js-profile-isactive').value.trim();
  158. const email = templateInstance.find('.js-profile-email').value.trim();
  159. const authentication = templateInstance
  160. .find('.js-authenticationMethod')
  161. .value.trim();
  162. const isChangePassword = password.length > 0;
  163. const isChangeUserName = username !== user.username;
  164. const isChangeEmail =
  165. email.toLowerCase() !== user.emails[0].address.toLowerCase();
  166. Users.update(this.userId, {
  167. $set: {
  168. 'profile.fullname': fullname,
  169. isAdmin: isAdmin === 'true',
  170. loginDisabled: isActive === 'true',
  171. authenticationMethod: authentication,
  172. },
  173. });
  174. if (isChangePassword) {
  175. Meteor.call('setPassword', password, this.userId);
  176. }
  177. if (isChangeUserName && isChangeEmail) {
  178. Meteor.call(
  179. 'setUsernameAndEmail',
  180. username,
  181. email.toLowerCase(),
  182. this.userId,
  183. function(error) {
  184. const usernameMessageElement = templateInstance.$('.username-taken');
  185. const emailMessageElement = templateInstance.$('.email-taken');
  186. if (error) {
  187. const errorElement = error.error;
  188. if (errorElement === 'username-already-taken') {
  189. usernameMessageElement.show();
  190. emailMessageElement.hide();
  191. } else if (errorElement === 'email-already-taken') {
  192. usernameMessageElement.hide();
  193. emailMessageElement.show();
  194. }
  195. } else {
  196. usernameMessageElement.hide();
  197. emailMessageElement.hide();
  198. Popup.close();
  199. }
  200. },
  201. );
  202. } else if (isChangeUserName) {
  203. Meteor.call('setUsername', username, this.userId, function(error) {
  204. const usernameMessageElement = templateInstance.$('.username-taken');
  205. if (error) {
  206. const errorElement = error.error;
  207. if (errorElement === 'username-already-taken') {
  208. usernameMessageElement.show();
  209. }
  210. } else {
  211. usernameMessageElement.hide();
  212. Popup.close();
  213. }
  214. });
  215. } else if (isChangeEmail) {
  216. Meteor.call('setEmail', email.toLowerCase(), this.userId, function(
  217. error,
  218. ) {
  219. const emailMessageElement = templateInstance.$('.email-taken');
  220. if (error) {
  221. const errorElement = error.error;
  222. if (errorElement === 'email-already-taken') {
  223. emailMessageElement.show();
  224. }
  225. } else {
  226. emailMessageElement.hide();
  227. Popup.close();
  228. }
  229. });
  230. } else Popup.close();
  231. },
  232. 'click #deleteButton'() {
  233. Users.remove(this.userId);
  234. Popup.close();
  235. },
  236. });