| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365 | Sidebar = null;const defaultView = 'home';const viewTitles = {  filter: 'filter-cards',  search: 'search-cards',  multiselection: 'multi-selection',  customFields: 'custom-fields',  archives: 'archives',};BlazeComponent.extendComponent({  mixins() {    return [Mixins.InfiniteScrolling, Mixins.PerfectScrollbar];  },  onCreated() {    this._isOpen = new ReactiveVar(false);    this._view = new ReactiveVar(defaultView);    Sidebar = this;  },  onDestroyed() {    Sidebar = null;  },  isOpen() {    return this._isOpen.get();  },  open() {    if (!this._isOpen.get()) {      this._isOpen.set(true);      EscapeActions.executeUpTo('detailsPane');    }  },  hide() {    if (this._isOpen.get()) {      this._isOpen.set(false);    }  },  toggle() {    this._isOpen.set(!this._isOpen.get());  },  calculateNextPeak() {    const altitude = this.find('.js-board-sidebar-content').scrollHeight;    this.callFirstWith(this, 'setNextPeak', altitude);  },  reachNextPeak() {    const activitiesComponent = this.childComponents('activities')[0];    activitiesComponent.loadNextPage();  },  isTongueHidden() {    return this.isOpen() && this.getView() !== defaultView;  },  scrollTop() {    this.$('.js-board-sidebar-content').scrollTop(0);  },  getView() {    return this._view.get();  },  setView(view) {    view = _.isString(view) ? view : defaultView;    if (this._view.get() !== view) {      this._view.set(view);      this.scrollTop();      EscapeActions.executeUpTo('detailsPane');    }    this.open();  },  isDefaultView() {    return this.getView() === defaultView;  },  getViewTemplate() {    return `${this.getView()}Sidebar`;  },  getViewTitle() {    return TAPi18n.__(viewTitles[this.getView()]);  },  showTongueTitle() {    if (this.isOpen())      return `${TAPi18n.__('sidebar-close')}`;    else      return `${TAPi18n.__('sidebar-open')}`;  },  events() {    return [{      'click .js-hide-sidebar': this.hide,      'click .js-toggle-sidebar': this.toggle,      'click .js-back-home': this.setView,      'click .js-shortcuts'() {        FlowRouter.go('shortcuts');      },    }];  },}).register('sidebar');Blaze.registerHelper('Sidebar', () => Sidebar);EscapeActions.register('sidebarView',  () => { Sidebar.setView(defaultView); },  () => { return Sidebar && Sidebar.getView() !== defaultView; });Template.memberPopup.helpers({  user() {    return Users.findOne(this.userId);  },  memberType() {    const type = Users.findOne(this.userId).isBoardAdmin() ? 'admin' : 'normal';    if(type === 'normal'){      const currentBoard = Boards.findOne(Session.get('currentBoard'));      const commentOnly = currentBoard.hasCommentOnly(this.userId);      const noComments = currentBoard.hasNoComments(this.userId);      if(commentOnly){        return TAPi18n.__('comment-only').toLowerCase();      } else if(noComments) {        return TAPi18n.__('no-comments').toLowerCase();      } else {        return TAPi18n.__(type).toLowerCase();      }    } else {      return TAPi18n.__(type).toLowerCase();    }  },  isInvited() {    return Users.findOne(this.userId).isInvitedTo(Session.get('currentBoard'));  },});Template.memberPopup.events({  'click .js-filter-member'() {    Filter.members.toggle(this.userId);    Popup.close();  },  'click .js-change-role': Popup.open('changePermissions'),  'click .js-remove-member': Popup.afterConfirm('removeMember', function() {    const boardId = Session.get('currentBoard');    const memberId = this.userId;    Cards.find({ boardId, members: memberId }).forEach((card) => {      card.unassignMember(memberId);    });    Boards.findOne(boardId).removeMember(memberId);    Popup.close();  }),  'click .js-leave-member': Popup.afterConfirm('leaveBoard', () => {    const boardId = Session.get('currentBoard');    Meteor.call('quitBoard', boardId, () => {      Popup.close();      FlowRouter.go('home');    });  }),});Template.removeMemberPopup.helpers({  user() {    return Users.findOne(this.userId);  },  board() {    return Boards.findOne(Session.get('currentBoard'));  },});Template.leaveBoardPopup.helpers({  board() {    return Boards.findOne(Session.get('currentBoard'));  },});Template.membersWidget.helpers({  isInvited() {    const user = Meteor.user();    return user && user.isInvitedTo(Session.get('currentBoard'));  },});Template.membersWidget.events({  'click .js-member': Popup.open('member'),  'click .js-manage-board-members': Popup.open('addMember'),  'click .sandstorm-powerbox-request-identity'() {    window.sandstormRequestIdentity();  },  'click .js-member-invite-accept'() {    const boardId = Session.get('currentBoard');    Meteor.user().removeInvite(boardId);  },  'click .js-member-invite-decline'() {    const boardId = Session.get('currentBoard');    Meteor.call('quitBoard', boardId, (err, ret) => {      if (!err && ret) {        Meteor.user().removeInvite(boardId);        FlowRouter.go('home');      }    });  },});Template.labelsWidget.events({  'click .js-label': Popup.open('editLabel'),  'click .js-add-label': Popup.open('createLabel'),});// Board members can assign people or labels by drag-dropping elements from the// sidebar to the cards on the board. In order to re-initialize the jquery-ui// plugin any time a draggable member or label is modified or removed we use a// autorun function and register a dependency on the both members and labels// fields of the current board document.function draggableMembersLabelsWidgets() {  this.autorun(() => {    const currentBoardId = Tracker.nonreactive(() => {      return Session.get('currentBoard');    });    Boards.findOne(currentBoardId, {      fields: {        members: 1,        labels: 1,      },    });    Tracker.afterFlush(() => {      const $draggables = this.$('.js-member,.js-label');      $draggables.draggable({        appendTo: 'body',        helper: 'clone',        revert: 'invalid',        revertDuration: 150,        snap: false,        snapMode: 'both',        start() {          EscapeActions.executeUpTo('popup-back');        },      });      function userIsMember() {        return Meteor.user() && Meteor.user().isBoardMember();      }      this.autorun(() => {        $draggables.draggable('option', 'disabled', !userIsMember());      });    });  });}Template.membersWidget.onRendered(draggableMembersLabelsWidgets);Template.labelsWidget.onRendered(draggableMembersLabelsWidgets);BlazeComponent.extendComponent({  onCreated() {    this.error = new ReactiveVar('');    this.loading = new ReactiveVar(false);  },  onRendered() {    this.find('.js-search-member input').focus();    this.setLoading(false);  },  isBoardMember() {    const userId = this.currentData()._id;    const user = Users.findOne(userId);    return user && user.isBoardMember();  },  isValidEmail(email) {    return SimpleSchema.RegEx.Email.test(email);  },  setError(error) {    this.error.set(error);  },  setLoading(w) {    this.loading.set(w);  },  isLoading() {    return this.loading.get();  },  inviteUser(idNameEmail) {    const boardId = Session.get('currentBoard');    this.setLoading(true);    const self = this;    Meteor.call('inviteUserToBoard', idNameEmail, boardId, (err, ret) => {      self.setLoading(false);      if (err) self.setError(err.error);      else if (ret.email) self.setError('email-sent');      else Popup.close();    });  },  events() {    return [{      'keyup input'() {        this.setError('');      },      'click .js-select-member'() {        const userId = this.currentData()._id;        const currentBoard = Boards.findOne(Session.get('currentBoard'));        if (!currentBoard.hasMember(userId)) {          this.inviteUser(userId);        }      },      'click .js-email-invite'() {        const idNameEmail = $('.js-search-member input').val();        if (idNameEmail.indexOf('@')<0 || this.isValidEmail(idNameEmail)) {          this.inviteUser(idNameEmail);        } else this.setError('email-invalid');      },    }];  },}).register('addMemberPopup');Template.changePermissionsPopup.events({  'click .js-set-admin, click .js-set-normal, click .js-set-no-comments, click .js-set-comment-only'(event) {    const currentBoard = Boards.findOne(Session.get('currentBoard'));    const memberId = this.userId;    const isAdmin = $(event.currentTarget).hasClass('js-set-admin');    const isCommentOnly = $(event.currentTarget).hasClass('js-set-comment-only');    const isNoComments = $(event.currentTarget).hasClass('js-set-no-comments');    currentBoard.setMemberPermission(memberId, isAdmin, isNoComments, isCommentOnly);    Popup.back(1);  },});Template.changePermissionsPopup.helpers({  isAdmin() {    const currentBoard = Boards.findOne(Session.get('currentBoard'));    return currentBoard.hasAdmin(this.userId);  },  isNormal() {    const currentBoard = Boards.findOne(Session.get('currentBoard'));    return !currentBoard.hasAdmin(this.userId) && !currentBoard.hasNoComments(this.userId) && !currentBoard.hasCommentOnly(this.userId);  },  isNoComments() {    const currentBoard = Boards.findOne(Session.get('currentBoard'));    return !currentBoard.hasAdmin(this.userId) && currentBoard.hasNoComments(this.userId);  },  isCommentOnly() {    const currentBoard = Boards.findOne(Session.get('currentBoard'));    return !currentBoard.hasAdmin(this.userId) && currentBoard.hasCommentOnly(this.userId);  },  isLastAdmin() {    const currentBoard = Boards.findOne(Session.get('currentBoard'));    return currentBoard.hasAdmin(this.userId) && (currentBoard.activeAdmins() === 1);  },});
 |