Path: blob/master/webroot/rsrc/js/application/maniphest/behavior-batch-selector.js
12242 views
/**1* @provides javelin-behavior-maniphest-batch-selector2* @requires javelin-behavior3* javelin-dom4* javelin-stratcom5* javelin-util6*/78JX.behavior('maniphest-batch-selector', function(config) {910var selected = {};1112// Test if a task node is selected.1314var get_id = function(task) {15return JX.Stratcom.getData(task).taskID;16};1718var is_selected = function(task) {19return (get_id(task) in selected);20};2122// Change the selected state of a task.2324var change = function(task, to) {25if (to === undefined) {26to = !is_selected(task);27}2829if (to) {30selected[get_id(task)] = true;31} else {32delete selected[get_id(task)];33}3435JX.DOM.alterClass(36task,37'phui-oi-selected',38is_selected(task));3940update();41};4243// Change all tasks to some state (used by "select all" / "clear selection"44// buttons).4546var changeall = function(to) {47var inputs = JX.DOM.scry(document.body, 'li', 'maniphest-task');48for (var ii = 0; ii < inputs.length; ii++) {49change(inputs[ii], to);50}51};5253// Clear any document text selection after toggling a task via shift click,54// since errant clicks tend to start selecting various ranges otherwise.5556var clear_selection = function() {57if (window.getSelection) {58if (window.getSelection().empty) {59window.getSelection().empty();60} else if (window.getSelection().removeAllRanges) {61window.getSelection().removeAllRanges();62}63} else if (document.selection) {64document.selection.empty();65}66};6768// Update the status text showing how many tasks are selected, and the button69// state.7071var update = function() {72var count = JX.keys(selected).length;73var status;74if (count === 0) {75status = 'Shift-Click to Select Tasks';76} else if (status == 1) {77status = '1 Selected Task';78} else {79status = count + ' Selected Tasks';80}81JX.DOM.setContent(JX.$(config.status), status);8283var submit = JX.$(config.submit);84var disable = (count === 0);85submit.disabled = disable;86JX.DOM.alterClass(submit, 'disabled', disable);87};8889// When he user shift-clicks the task, update the rest of the application90// state.9192JX.Stratcom.listen(93'click',94'maniphest-task',95function(e) {96var raw = e.getRawEvent();97if (!raw.shiftKey) {98return;99}100101if (raw.ctrlKey || raw.altKey || raw.metaKey || e.isRightButton()) {102return;103}104105if (JX.Stratcom.pass(e)) {106return;107}108109e.kill();110change(e.getNode('maniphest-task'));111112clear_selection();113});114115116// When the user clicks "Select All", select all tasks.117118JX.DOM.listen(119JX.$(config.selectNone),120'click',121null,122function(e) {123changeall(false);124e.kill();125});126127128// When the user clicks "Clear Selection", clear the selection.129130JX.DOM.listen(131JX.$(config.selectAll),132'click',133null,134function(e) {135changeall(true);136e.kill();137});138139// When the user submits the form, dump selected state into it.140141JX.DOM.listen(142JX.$(config.formID),143'submit',144null,145function() {146var ids = [];147for (var k in selected) {148ids.push(k);149}150ids = ids.join(',');151152var input = JX.$N('input', {type: 'hidden', name: 'ids', value: ids});153154JX.DOM.setContent(JX.$(config.idContainer), input);155});156157update();158159});160161162