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
|
BlazeComponent.extendComponent({
template: function() {
return 'filterSidebar';
},
events: function() {
return [{
'click .js-toggle-label-filter': function(event) {
Filter.labelIds.toogle(this._id);
Filter.resetExceptions();
event.preventDefault();
},
'click .js-toogle-member-filter': function(event) {
Filter.members.toogle(this._id);
Filter.resetExceptions();
event.preventDefault();
},
'click .js-clear-all': function(event) {
Filter.reset();
event.preventDefault();
}
}];
}
}).register('filterSidebar');
var updateSelectedCards = function(query) {
Cards.find(MultiSelection.getMongoSelector()).forEach(function(card) {
Cards.update(card._id, query);
});
};
BlazeComponent.extendComponent({
template: function() {
return 'multiselectionSidebar';
},
mapSelection: function(kind, _id) {
return Cards.find(MultiSelection.getMongoSelector()).map(function(card) {
var methodName = kind === 'label' ? 'hasLabel' : 'isAssigned';
return card[methodName](_id);
});
},
allSelectedElementHave: function(kind, _id) {
if (MultiSelection.isEmpty())
return false;
else
return _.every(this.mapSelection(kind, _id));
},
someSelectedElementHave: function(kind, _id) {
if (MultiSelection.isEmpty())
return false;
else
return _.some(this.mapSelection(kind, _id));
},
events: function() {
return [{
'click .js-toggle-label-multiselection': function(evt, tpl) {
var labelId = this.currentData()._id;
var mappedSelection = this.mapSelection('label', labelId);
var operation;
if (_.every(mappedSelection))
operation = '$pull';
else if (_.every(mappedSelection, function(bool) { return ! bool; }))
operation = '$addToSet';
else {
var popup = Popup.open('disambiguateMultiLabel');
// XXX We need to have a better integration between the popup and the
// UI components systems.
return popup.call(this.currentData(), evt, tpl);
}
var query = {};
query[operation] = {
labelIds: labelId
};
updateSelectedCards(query);
}
}];
}
}).register('multiselectionSidebar');
Template.disambiguateMultiLabelPopup.events({
'click .js-remove-label': function() {
updateSelectedCards({$pull: {labelIds: this._id}});
Popup.close();
},
'click .js-add-label': function() {
updateSelectedCards({$addToSet: {labelIds: this._id}});
Popup.close();
}
});
|