const usersPerPage = 25; BlazeComponent.extendComponent({ mixins() { return [Mixins.InfiniteScrolling]; }, onCreated() { this.error = new ReactiveVar(''); this.loading = new ReactiveVar(false); this.people = new ReactiveVar(true); this.findUsersOptions = new ReactiveVar({}); this.number = new ReactiveVar(0); this.page = new ReactiveVar(1); this.loadNextPageLocked = false; this.callFirstWith(null, 'resetNextPeak'); this.autorun(() => { const limit = this.page.get() * usersPerPage; this.subscribe('people', limit, () => { this.loadNextPageLocked = false; const nextPeakBefore = this.callFirstWith(null, 'getNextPeak'); this.calculateNextPeak(); const nextPeakAfter = this.callFirstWith(null, 'getNextPeak'); if (nextPeakBefore === nextPeakAfter) { this.callFirstWith(null, 'resetNextPeak'); } }); }); }, events() { return [ { 'click #searchButton'() { this.filterPeople(); }, 'keydown #searchInput'(event) { if (event.keyCode === 13 && !event.shiftKey) { this.filterPeople(); } }, }, ]; }, filterPeople() { const value = $('#searchInput') .first() .val(); if (value === '') { this.findUsersOptions.set({}); } else { const regex = new RegExp(value, 'i'); this.findUsersOptions.set({ $or: [ { username: regex }, { 'profile.fullname': regex }, { 'emails.address': regex }, ], }); } }, loadNextPage() { if (this.loadNextPageLocked === false) { this.page.set(this.page.get() + 1); this.loadNextPageLocked = true; } }, calculateNextPeak() { const element = this.find('.main-body'); if (element) { const altitude = element.scrollHeight; this.callFirstWith(this, 'setNextPeak', altitude); } }, reachNextPeak() { this.loadNextPage(); }, setError(error) { this.error.set(error); }, setLoading(w) { this.loading.set(w); }, peopleList() { const users = Users.find(this.findUsersOptions.get(), { fields: { _id: true }, }); this.number.set(users.count()); return users; }, peopleNumber() { return this.number.get(); }, }).register('people'); Template.peopleRow.helpers({ userData() { const userCollection = this.esSearch ? ESSearchResults : Users; return userCollection.findOne(this.userId); }, }); Template.editUserPopup.onCreated(function() { this.authenticationMethods = new ReactiveVar([]); this.errorMessage = new ReactiveVar(''); Meteor.call('getAuthenticationsEnabled', (_, result) => { if (result) { // TODO : add a management of different languages // (ex {value: ldap, text: TAPi18n.__('ldap', {}, T9n.getLanguage() || 'en')}) this.authenticationMethods.set([ { value: 'password' }, // Gets only the authentication methods availables ...Object.entries(result) .filter(e => e[1]) .map(e => ({ value: e[0] })), ]); } }); }); Template.editUserPopup.helpers({ user() { return Users.findOne(this.userId); }, authentications() { return Template.instance().authenticationMethods.get(); }, isSelected(match) { const userId = Template.instance().data.userId; const selected = Users.findOne(userId).authenticationMethod; return selected === match; }, isLdap() { const userId = Template.instance().data.userId; const selected = Users.findOne(userId).authenticationMethod; return selected === 'ldap'; }, errorMessage() { return Template.instance().errorMessage.get(); }, }); BlazeComponent.extendComponent({ onCreated() {}, user() { return Users.findOne(this.userId); }, events() { return [ { 'click a.edit-user': Popup.open('editUser'), }, ]; }, }).register('peopleRow'); Template.editUserPopup.events({ submit(event, templateInstance) { event.preventDefault(); const user = Users.findOne(this.userId); const fullname = templateInstance.find('.js-profile-fullname').value.trim(); const username = templateInstance.find('.js-profile-username').value.trim(); const password = templateInstance.find('.js-profile-password').value; const isAdmin = templateInstance.find('.js-profile-isadmin').value.trim(); const isActive = templateInstance.find('.js-profile-isactive').value.trim(); const email = templateInstance.find('.js-profile-email').value.trim(); const authentication = templateInstance .find('.js-authenticationMethod') .value.trim(); const isChangePassword = password.length > 0; const isChangeUserName = username !== user.username; const isChangeEmail = email.toLowerCase() !== user.emails[0].address.toLowerCase(); Users.update(this.userId, { $set: { 'profile.fullname': fullname, isAdmin: isAdmin === 'true', loginDisabled: isActive === 'true', authenticationMethod: authentication, }, }); if (isChangePassword) { Meteor.call('setPassword', password, this.userId); } if (isChangeUserName && isChangeEmail) { Meteor.call( 'setUsernameAndEmail', username, email.toLowerCase(), this.userId, function(error) { const usernameMessageElement = templateInstance.$('.username-taken'); const emailMessageElement = templateInstance.$('.email-taken'); if (error) { const errorElement = error.error; if (errorElement === 'username-already-taken') { usernameMessageElement.show(); emailMessageElement.hide(); } else if (errorElement === 'email-already-taken') { usernameMessageElement.hide(); emailMessageElement.show(); } } else { usernameMessageElement.hide(); emailMessageElement.hide(); Popup.close(); } }, ); } else if (isChangeUserName) { Meteor.call('setUsername', username, this.userId, function(error) { const usernameMessageElement = templateInstance.$('.username-taken'); if (error) { const errorElement = error.error; if (errorElement === 'username-already-taken') { usernameMessageElement.show(); } } else { usernameMessageElement.hide(); Popup.close(); } }); } else if (isChangeEmail) { Meteor.call('setEmail', email.toLowerCase(), this.userId, function( error, ) { const emailMessageElement = templateInstance.$('.email-taken'); if (error) { const errorElement = error.error; if (errorElement === 'email-already-taken') { emailMessageElement.show(); } } else { emailMessageElement.hide(); Popup.close(); } }); } else Popup.close(); }, 'click #deleteButton': Popup.afterConfirm('userDelete', function() { Users.remove(this.userId); Popup.close(); }), });