| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663 | const orgsPerPage = 25;const teamsPerPage = 25;const usersPerPage = 25;BlazeComponent.extendComponent({  mixins() {    return [Mixins.InfiniteScrolling];  },  onCreated() {    this.error = new ReactiveVar('');    this.loading = new ReactiveVar(false);    this.orgSetting = new ReactiveVar(true);    this.teamSetting = new ReactiveVar(true);    this.peopleSetting = new ReactiveVar(true);    this.findOrgsOptions = new ReactiveVar({});    this.findTeamsOptions = new ReactiveVar({});    this.findUsersOptions = new ReactiveVar({});    this.numberOrgs = new ReactiveVar(0);    this.numberTeams = new ReactiveVar(0);    this.numberPeople = new ReactiveVar(0);    this.page = new ReactiveVar(1);    this.loadNextPageLocked = false;    this.callFirstWith(null, 'resetNextPeak');    this.autorun(() => {      const limitOrgs = this.page.get() * orgsPerPage;      const limitTeams = this.page.get() * teamsPerPage;      const limitUsers = this.page.get() * usersPerPage;      this.subscribe('org', this.findOrgsOptions.get(), limitOrgs, () => {        this.loadNextPageLocked = false;        const nextPeakBefore = this.callFirstWith(null, 'getNextPeak');        this.calculateNextPeak();        const nextPeakAfter = this.callFirstWith(null, 'getNextPeak');        if (nextPeakBefore === nextPeakAfter) {          this.callFirstWith(null, 'resetNextPeak');        }      });      this.subscribe('team', this.findTeamsOptions.get(), limitTeams, () => {        this.loadNextPageLocked = false;        const nextPeakBefore = this.callFirstWith(null, 'getNextPeak');        this.calculateNextPeak();        const nextPeakAfter = this.callFirstWith(null, 'getNextPeak');        if (nextPeakBefore === nextPeakAfter) {          this.callFirstWith(null, 'resetNextPeak');        }      });      this.subscribe('people', this.findUsersOptions.get(), limitUsers, () => {        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 #searchOrgButton'() {          this.filterOrg();        },        'keydown #searchOrgInput'(event) {          if (event.keyCode === 13 && !event.shiftKey) {            this.filterOrg();          }        },        'click #searchTeamButton'() {          this.filterTeam();        },        'keydown #searchTeamInput'(event) {          if (event.keyCode === 13 && !event.shiftKey) {            this.filterTeam();          }        },        'click #searchButton'() {          this.filterPeople();        },        'keydown #searchInput'(event) {          if (event.keyCode === 13 && !event.shiftKey) {            this.filterPeople();          }        },        'click #newOrgButton'() {          Popup.open('newOrg');        },        'click #newTeamButton'() {          Popup.open('newTeam');        },        'click #newUserButton'() {          Popup.open('newUser');        },        'click a.js-org-menu': this.switchMenu,        'click a.js-team-menu': this.switchMenu,        'click a.js-people-menu': this.switchMenu,      },    ];  },  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);  },  orgList() {    const orgs = Org.find(this.findOrgsOptions.get(), {      fields: { _id: true },    });    this.numberOrgs.set(org.count(false));    return orgs;  },  teamList() {    const teams = Team.find(this.findTeamsOptions.get(), {      fields: { _id: true },    });    this.numberTeams.set(team.count(false));    return teams;  },  peopleList() {    const users = Users.find(this.findUsersOptions.get(), {      fields: { _id: true },    });    this.numberPeople.set(users.count(false));    return users;  },  orgNumber() {    return this.numberOrgs.get();  },  teamNumber() {    return this.numberTeams.get();  },  peopleNumber() {    return this.numberPeople.get();  },  switchMenu(event) {    const target = $(event.target);    if (!target.hasClass('active')) {      $('.side-menu li.active').removeClass('active');      target.parent().addClass('active');      const targetID = target.data('id');      this.orgSetting.set('org-setting' === targetID);      this.teamSetting.set('team-setting' === targetID);      this.peopleSetting.set('people-setting' === targetID);    }  },}).register('people');Template.orgRow.helpers({  orgData() {    const orgCollection = this.esSearch ? ESSearchResults : Org;    return orgCollection.findOne(this.orgId);  },});Template.teamRow.helpers({  teamData() {    const teamCollection = this.esSearch ? ESSearchResults : Team;    return teamCollection.findOne(this.teamId);  },});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.editOrgPopup.helpers({  org() {    return Org.findOne(this.orgId);  },  errorMessage() {    return Template.instance().errorMessage.get();  },});Template.editTeamPopup.helpers({  team() {    return Team.findOne(this.teamId);  },  errorMessage() {    return Template.instance().errorMessage.get();  },});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();  },});Template.newOrgPopup.onCreated(function() {  this.errorMessage = new ReactiveVar('');});Template.newTeamPopup.onCreated(function() {  this.errorMessage = new ReactiveVar('');});Template.newUserPopup.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.newOrgPopup.helpers({  org() {    return Org.findOne(this.orgId);  },  errorMessage() {    return Template.instance().errorMessage.get();  },});Template.newTeamPopup.helpers({  team() {    return Team.findOne(this.teamId);  },  errorMessage() {    return Template.instance().errorMessage.get();  },});Template.newUserPopup.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() {},  org() {    return Org.findOne(this.orgId);  },  events() {    return [      {        'click a.edit-org': Popup.open('editOrg'),        'click a.more-settings-org': Popup.open('settingsOrg'),      },    ];  },}).register('orgRow');BlazeComponent.extendComponent({  onCreated() {},  team() {    return Team.findOne(this.teamId);  },  events() {    return [      {        'click a.edit-team': Popup.open('editTeam'),        'click a.more-settings-team': Popup.open('settingsTeam'),      },    ];  },}).register('teamRow');BlazeComponent.extendComponent({  onCreated() {},  user() {    return Users.findOne(this.userId);  },  events() {    return [      {        'click a.edit-user': Popup.open('editUser'),        'click a.more-settings-user': Popup.open('settingsUser'),      },    ];  },}).register('peopleRow');BlazeComponent.extendComponent({  events() {    return [      {        'click a.new-org': Popup.open('newOrg'),      },    ];  },}).register('newOrgRow');BlazeComponent.extendComponent({  events() {    return [      {        'click a.new-team': Popup.open('newTeam'),      },    ];  },}).register('newTeamRow');BlazeComponent.extendComponent({  events() {    return [      {        'click a.new-user': Popup.open('newUser'),      },    ];  },}).register('newUserRow');Template.editUserPopup.events({  submit(event, templateInstance) {    event.preventDefault();    const user = Users.findOne(this.userId);    const username = templateInstance.find('.js-profile-username').value.trim();    const fullname = templateInstance.find('.js-profile-fullname').value.trim();    const initials = templateInstance.find('.js-profile-initials').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 verified = templateInstance      .find('.js-profile-email-verified')      .value.trim();    const authentication = templateInstance      .find('.js-authenticationMethod')      .value.trim();    const isChangePassword = password.length > 0;    const isChangeUserName = username !== user.username;    const isChangeInitials = initials.length > 0;    const isChangeEmailVerified = verified !== user.emails[0].verified;    // If previously email address has not been set, it is undefined,    // check for undefined, and allow adding email address.    const isChangeEmail =      email.toLowerCase() !==      (typeof user.emails !== 'undefined'        ? user.emails[0].address.toLowerCase()        : false);    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 (isChangeEmailVerified) {      Meteor.call('setEmailVerified', email, verified === 'true', this.userId);    }    if (isChangeInitials) {      Meteor.call('setInitials', initials, 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();  },});Template.newOrgPopup.events({  submit(event, templateInstance) {    event.preventDefault();    const displayName = templateInstance.find('.js-displayName').value.trim();    const desc = templateInstance.find('.js-desc').value.trim();    const name = templateInstance.find('.js-name').value.trim();    const teams = templateInstance.find('.js-teams').value.trim();    const website = templateInstance.find('.js-website').value.trim();    const isActive = templateInstance.find('.js-profile-isactive').value.trim();    Meteor.call(      'setCreateOrg',      displayName,      desc,      name,      teams,      website,      isActive,      email.toLowerCase(),      function(error) {        const nameMessageElement = templateInstance.$('.name-taken');        if (error) {          const errorElement = error.error;          if (errorElement === 'name-already-taken') {            nameMessageElement.show();            emailMessageElement.hide();          } else if (errorElement === 'email-already-taken') {            usernameMessageElement.hide();            emailMessageElement.show();          }        } else {          usernameMessageElement.hide();          emailMessageElement.hide();          Popup.close();        }      },    );    Popup.close();  },});Template.newUserPopup.events({  submit(event, templateInstance) {    event.preventDefault();    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();    Meteor.call(      'setCreateUser',      fullname,      username,      password,      isAdmin,      isActive,      email.toLowerCase(),      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();        }      },    );    Popup.close();  },});Template.settingsUserPopup.events({  'click .impersonate-user'(event) {    event.preventDefault();    Meteor.call('impersonate', this.userId, err => {      if (!err) {        FlowRouter.go('/');        Meteor.connection.setUserId(this.userId);      }    });  },  'click #deleteButton'(event) {    event.preventDefault();    /*    // Delete is not enabled yet, because it does leave empty user avatars    // to boards: boards members, card members and assignees have    // empty users. See:    // - wekan/client/components/settings/peopleBody.jade deleteButton    // - wekan/client/components/settings/peopleBody.js deleteButton    // - wekan/client/components/sidebar/sidebar.js Popup.afterConfirm('removeMember'    //   that does now remove member from board, card members and assignees correctly,    //   but that should be used to remove user from all boards similarly    // - wekan/models/users.js Delete is not enabled    //    //console.log('user id: ' + this.userId);    //Popup.afterConfirm('userDelete', function(event) {    //Boards.find({ members: this.userId }).forEach(board => {    //  console.log('board id: ' + board._id);      //Cards.find({ boardId: board._id, members: this.userId }).forEach(card => {      //  card.unassignMember(this.userId);      //});      //Cards.find({ boardId: board._id, members: this.userId }).forEach(card => {      //  card.unassignMember(this.userId);      //});      //Cards.find({ boardId: board._id, assignees: this.userId }).forEach(card => {      //  card.unassignAssignee(this.userId);      //});      //Boards.findOne({ boardId: board._id }).removeMember(this.userId);    //});    //Users.remove(this.userId);    */    Popup.close();  },});Template.settingsUserPopup.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();  },});
 |