summaryrefslogtreecommitdiffstats
path: root/client/components/lists/listHeader.js
blob: 94b70f2bb32e204de97419c1a116493912fd3658 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
BlazeComponent.extendComponent({
  editTitle(evt) {
    evt.preventDefault();
    const newTitle = this.childComponents('inlinedForm')[0].getValue().trim();
    const list = this.currentData();
    if (newTitle) {
      list.rename(newTitle.trim());
    }
  },

  isWipLimitEnabled() {
    const limit = this.currentData().wipLimit
    return limit.enabled && limit.value > 0;
  },

  isWatching() {
    const list = this.currentData();
    return list.findWatcher(Meteor.userId());
  },

  limitToShowCardsCount() {
    return Meteor.user().getLimitToShowCardsCount();
  },

  showCardsCountForList(count) {
    return count > this.limitToShowCardsCount();
  },

  events() {
    return [{
      'click .js-open-list-menu': Popup.open('listAction'),
      'click .js-add-card' () {
        const listDom = document.getElementById(`js-list-${this.currentData()._id}`);
        const listComponent = BlazeComponent.getComponentForElement(listDom);
        listComponent.openForm({
          position: 'top',
        });
      },
      submit: this.editTitle,
    }];
  },
}).register('listHeader');

Template.listActionPopup.helpers({
  isWipLimitEnabled() {
    const prevState = Template.parentData(4).stack[0].dataContext.wipEnableState;
    // If user was already inside setWipLimitPopup, return previous state. Popup stack not reacting to database mutations
    if(typeof prevState !== "undefined") {
      return prevState;
    }
    return Template.currentData().wipLimit.enabled;
  },

  isWatching() {
    return this.findWatcher(Meteor.userId());
  },
});

Template.listActionPopup.events({
  'click .js-list-subscribe' () {},
  'click .js-select-cards' () {
    const cardIds = this.allCards().map((card) => card._id);
    MultiSelection.add(cardIds);
    Popup.close();
  },
  'click .js-toggle-watch-list' () {
    const currentList = this;
    const level = currentList.findWatcher(Meteor.userId()) ? null : 'watching';
    Meteor.call('watch', 'list', currentList._id, level, (err, ret) => {
      if (!err && ret) Popup.close();
    });
  },
  'click .js-close-list' (evt) {
    evt.preventDefault();
    this.archive();
    Popup.close();
  },
  'click .js-set-wip-limit': Popup.open('setWipLimit'),
  'click .js-more': Popup.open('listMore'),
});

BlazeComponent.extendComponent({
  onCreated() {
    const prevState = Template.parentData(4).stack[0].dataContext.wipEnableState;
    // Check if the user as already opened this popup before and retrieve previous state
    // This check is necessary due to the fact that database mutations inside popups are not reactive inside the popup stack.
    //The use of ReactiveVar is due to the same reason.
    if(typeof prevState !== "undefined") {
      this.wipEnabled = new ReactiveVar(prevState)
    } else {
      this.wipEnabled = new ReactiveVar(Template.currentData().wipLimit.enabled);
    }
  },

  onDestroyed() {
    // Save current wipEnabled state in the first element of the popup stack to maintain UI coherence if user returns to popup
    Template.parentData(4).stack[0].dataContext.wipEnableState = this.wipEnabled.get();
  },

  applyWipLimit() {
    const list = Template.currentData();
    const limit = Template.instance().$('.wip-limit-value').val();

    if(limit < list.cards().count()){
      Template.instance().$('.wip-limit-error').click();
    } else {
      list.setWipLimit(limit);
    }
  },

  enableWipLimit() {
    const list = Template.currentData();
    // Prevent user from using previously stored wipLimit.value if it is less than the current number of cards in the list
    if(!list.wipLimit.enabled && list.wipLimit.value < list.cards().count()){
      list.setWipLimit(list.cards().count());
    }

    this.wipEnabled.set(!this.wipEnabled.get()); //If wipLimit.enabled is not yet definied, the negation of "undefined" is "true"
    list.toggleWipLimit(this.wipEnabled.get());
  },

  events() {
    return [{
      'click .js-enable-wip-limit': this.enableWipLimit,
      'click .wip-limit-apply': this.applyWipLimit,
      'click .wip-limit-error': Popup.open('wipLimitError'),
    }];
  },
}).register('setWipLimitPopup');

Template.listMorePopup.events({
  'click .js-delete': Popup.afterConfirm('listDelete', function () {
    Popup.close();
    this.allCards().map((card) => Cards.remove(card._id));
    Lists.remove(this._id);
    Utils.goBoardId(this.boardId);
  }),
});