Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/phabricator
Path: blob/master/webroot/rsrc/js/application/maniphest/behavior-batch-selector.js
12242 views
1
/**
2
* @provides javelin-behavior-maniphest-batch-selector
3
* @requires javelin-behavior
4
* javelin-dom
5
* javelin-stratcom
6
* javelin-util
7
*/
8
9
JX.behavior('maniphest-batch-selector', function(config) {
10
11
var selected = {};
12
13
// Test if a task node is selected.
14
15
var get_id = function(task) {
16
return JX.Stratcom.getData(task).taskID;
17
};
18
19
var is_selected = function(task) {
20
return (get_id(task) in selected);
21
};
22
23
// Change the selected state of a task.
24
25
var change = function(task, to) {
26
if (to === undefined) {
27
to = !is_selected(task);
28
}
29
30
if (to) {
31
selected[get_id(task)] = true;
32
} else {
33
delete selected[get_id(task)];
34
}
35
36
JX.DOM.alterClass(
37
task,
38
'phui-oi-selected',
39
is_selected(task));
40
41
update();
42
};
43
44
// Change all tasks to some state (used by "select all" / "clear selection"
45
// buttons).
46
47
var changeall = function(to) {
48
var inputs = JX.DOM.scry(document.body, 'li', 'maniphest-task');
49
for (var ii = 0; ii < inputs.length; ii++) {
50
change(inputs[ii], to);
51
}
52
};
53
54
// Clear any document text selection after toggling a task via shift click,
55
// since errant clicks tend to start selecting various ranges otherwise.
56
57
var clear_selection = function() {
58
if (window.getSelection) {
59
if (window.getSelection().empty) {
60
window.getSelection().empty();
61
} else if (window.getSelection().removeAllRanges) {
62
window.getSelection().removeAllRanges();
63
}
64
} else if (document.selection) {
65
document.selection.empty();
66
}
67
};
68
69
// Update the status text showing how many tasks are selected, and the button
70
// state.
71
72
var update = function() {
73
var count = JX.keys(selected).length;
74
var status;
75
if (count === 0) {
76
status = 'Shift-Click to Select Tasks';
77
} else if (status == 1) {
78
status = '1 Selected Task';
79
} else {
80
status = count + ' Selected Tasks';
81
}
82
JX.DOM.setContent(JX.$(config.status), status);
83
84
var submit = JX.$(config.submit);
85
var disable = (count === 0);
86
submit.disabled = disable;
87
JX.DOM.alterClass(submit, 'disabled', disable);
88
};
89
90
// When he user shift-clicks the task, update the rest of the application
91
// state.
92
93
JX.Stratcom.listen(
94
'click',
95
'maniphest-task',
96
function(e) {
97
var raw = e.getRawEvent();
98
if (!raw.shiftKey) {
99
return;
100
}
101
102
if (raw.ctrlKey || raw.altKey || raw.metaKey || e.isRightButton()) {
103
return;
104
}
105
106
if (JX.Stratcom.pass(e)) {
107
return;
108
}
109
110
e.kill();
111
change(e.getNode('maniphest-task'));
112
113
clear_selection();
114
});
115
116
117
// When the user clicks "Select All", select all tasks.
118
119
JX.DOM.listen(
120
JX.$(config.selectNone),
121
'click',
122
null,
123
function(e) {
124
changeall(false);
125
e.kill();
126
});
127
128
129
// When the user clicks "Clear Selection", clear the selection.
130
131
JX.DOM.listen(
132
JX.$(config.selectAll),
133
'click',
134
null,
135
function(e) {
136
changeall(true);
137
e.kill();
138
});
139
140
// When the user submits the form, dump selected state into it.
141
142
JX.DOM.listen(
143
JX.$(config.formID),
144
'submit',
145
null,
146
function() {
147
var ids = [];
148
for (var k in selected) {
149
ids.push(k);
150
}
151
ids = ids.join(',');
152
153
var input = JX.$N('input', {type: 'hidden', name: 'ids', value: ids});
154
155
JX.DOM.setContent(JX.$(config.idContainer), input);
156
});
157
158
update();
159
160
});
161
162