| 
									
										
										
										
											2012-02-24 13:00:48 -08:00
										 |  |  | /** | 
					
						
							|  |  |  |  * @provides javelin-behavior-maniphest-batch-selector | 
					
						
							|  |  |  |  * @requires javelin-behavior | 
					
						
							|  |  |  |  *           javelin-dom | 
					
						
							|  |  |  |  *           javelin-stratcom | 
					
						
							| 
									
										
										
										
											2013-03-23 14:38:01 -07:00
										 |  |  |  *           javelin-util | 
					
						
							| 
									
										
										
										
											2012-02-24 13:00:48 -08:00
										 |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | JX.behavior('maniphest-batch-selector', function(config) { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-03-23 14:38:01 -07:00
										 |  |  |   var selected = {}; | 
					
						
							| 
									
										
										
										
											2012-02-24 13:00:48 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-03-23 14:38:01 -07:00
										 |  |  |   // Test if a task node is selected.
 | 
					
						
							| 
									
										
										
										
											2012-02-24 13:00:48 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-03-23 14:38:01 -07:00
										 |  |  |   var get_id = function(task) { | 
					
						
							|  |  |  |     return JX.Stratcom.getData(task).taskID; | 
					
						
							| 
									
										
										
										
											2013-05-18 17:04:22 -07:00
										 |  |  |   }; | 
					
						
							| 
									
										
										
										
											2012-02-24 13:00:48 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-03-23 14:38:01 -07:00
										 |  |  |   var is_selected = function(task) { | 
					
						
							|  |  |  |     return (get_id(task) in selected); | 
					
						
							| 
									
										
										
										
											2013-05-18 17:04:22 -07:00
										 |  |  |   }; | 
					
						
							| 
									
										
										
										
											2012-02-24 13:00:48 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  |   // Change the selected state of a task.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   var change = function(task, to) { | 
					
						
							|  |  |  |     if (to === undefined) { | 
					
						
							| 
									
										
										
										
											2013-03-23 14:38:01 -07:00
										 |  |  |       to = !is_selected(task); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (to) { | 
					
						
							|  |  |  |       selected[get_id(task)] = true; | 
					
						
							| 
									
										
										
										
											2012-02-24 13:00:48 -08:00
										 |  |  |     } else { | 
					
						
							| 
									
										
										
										
											2013-03-23 14:38:01 -07:00
										 |  |  |       delete selected[get_id(task)]; | 
					
						
							| 
									
										
										
										
											2012-02-24 13:00:48 -08:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2013-03-23 14:38:01 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |     JX.DOM.alterClass( | 
					
						
							|  |  |  |       task, | 
					
						
							| 
									
										
										
										
											2016-12-14 11:35:51 -08:00
										 |  |  |       'phui-oi-selected', | 
					
						
							| 
									
										
										
										
											2013-03-23 14:38:01 -07:00
										 |  |  |       is_selected(task)); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     update(); | 
					
						
							| 
									
										
										
										
											2012-02-24 13:00:48 -08:00
										 |  |  |   }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-11-11 16:08:23 -08:00
										 |  |  |   var redraw = function (task) { | 
					
						
							|  |  |  |     var selected = is_selected(task); | 
					
						
							|  |  |  |     change(task, selected); | 
					
						
							|  |  |  |   }; | 
					
						
							|  |  |  |   JX.Stratcom.listen( | 
					
						
							|  |  |  |     'subpriority-changed', | 
					
						
							|  |  |  |     null, | 
					
						
							|  |  |  |     function (e) { | 
					
						
							|  |  |  |       e.kill(); | 
					
						
							|  |  |  |       var data = e.getData(); | 
					
						
							|  |  |  |       redraw(data.task); | 
					
						
							|  |  |  |     }); | 
					
						
							| 
									
										
										
										
											2012-02-24 13:00:48 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  |   // Change all tasks to some state (used by "select all" / "clear selection"
 | 
					
						
							|  |  |  |   // buttons).
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   var changeall = function(to) { | 
					
						
							| 
									
										
										
										
											2013-03-23 14:38:01 -07:00
										 |  |  |     var inputs = JX.DOM.scry(document.body, 'li', 'maniphest-task'); | 
					
						
							| 
									
										
										
										
											2012-02-24 13:00:48 -08:00
										 |  |  |     for (var ii = 0; ii < inputs.length; ii++) { | 
					
						
							|  |  |  |       change(inputs[ii], to); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2013-05-18 17:04:22 -07:00
										 |  |  |   }; | 
					
						
							| 
									
										
										
										
											2012-02-24 13:00:48 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-03-23 14:38:01 -07:00
										 |  |  |   // Clear any document text selection after toggling a task via shift click,
 | 
					
						
							|  |  |  |   // since errant clicks tend to start selecting various ranges otherwise.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   var clear_selection = function() { | 
					
						
							|  |  |  |     if (window.getSelection) { | 
					
						
							|  |  |  |       if (window.getSelection().empty) { | 
					
						
							|  |  |  |         window.getSelection().empty(); | 
					
						
							|  |  |  |       } else if (window.getSelection().removeAllRanges) { | 
					
						
							|  |  |  |         window.getSelection().removeAllRanges(); | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |     } else if (document.selection) { | 
					
						
							|  |  |  |       document.selection.empty(); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2013-05-18 17:04:22 -07:00
										 |  |  |   }; | 
					
						
							| 
									
										
										
										
											2012-02-24 13:00:48 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  |   // Update the status text showing how many tasks are selected, and the button
 | 
					
						
							|  |  |  |   // state.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   var update = function() { | 
					
						
							| 
									
										
										
										
											2013-03-23 14:38:01 -07:00
										 |  |  |     var count = JX.keys(selected).length; | 
					
						
							|  |  |  |     var status; | 
					
						
							| 
									
										
										
										
											2013-05-18 17:04:22 -07:00
										 |  |  |     if (count === 0) { | 
					
						
							| 
									
										
										
										
											2013-03-23 14:38:01 -07:00
										 |  |  |       status = 'Shift-Click to Select Tasks'; | 
					
						
							|  |  |  |     } else if (status == 1) { | 
					
						
							|  |  |  |       status = '1 Selected Task'; | 
					
						
							|  |  |  |     } else { | 
					
						
							|  |  |  |       status = count + ' Selected Tasks'; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2012-02-24 13:00:48 -08:00
										 |  |  |     JX.DOM.setContent(JX.$(config.status), status); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     var submit = JX.$(config.submit); | 
					
						
							| 
									
										
										
										
											2013-05-18 17:04:22 -07:00
										 |  |  |     var disable = (count === 0); | 
					
						
							| 
									
										
										
										
											2012-02-24 13:00:48 -08:00
										 |  |  |     submit.disabled = disable; | 
					
						
							|  |  |  |     JX.DOM.alterClass(submit, 'disabled', disable); | 
					
						
							|  |  |  |   }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-03-23 14:38:01 -07:00
										 |  |  |   // When he user shift-clicks the task, update the rest of the application
 | 
					
						
							|  |  |  |   // state.
 | 
					
						
							| 
									
										
										
										
											2012-02-24 13:00:48 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  |   JX.Stratcom.listen( | 
					
						
							|  |  |  |     'click', | 
					
						
							|  |  |  |     'maniphest-task', | 
					
						
							|  |  |  |     function(e) { | 
					
						
							| 
									
										
										
										
											2013-03-23 14:38:01 -07:00
										 |  |  |       var raw = e.getRawEvent(); | 
					
						
							|  |  |  |       if (!raw.shiftKey) { | 
					
						
							| 
									
										
										
										
											2012-02-24 13:00:48 -08:00
										 |  |  |         return; | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-03-23 14:38:01 -07:00
										 |  |  |       if (raw.ctrlKey || raw.altKey || raw.metaKey || e.isRightButton()) { | 
					
						
							| 
									
										
										
										
											2012-02-24 13:00:48 -08:00
										 |  |  |         return; | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-03-23 14:38:01 -07:00
										 |  |  |       if (JX.Stratcom.pass(e)) { | 
					
						
							|  |  |  |         return; | 
					
						
							|  |  |  |       } | 
					
						
							| 
									
										
										
										
											2012-02-24 13:00:48 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-03-23 14:38:01 -07:00
										 |  |  |       e.kill(); | 
					
						
							|  |  |  |       change(e.getNode('maniphest-task')); | 
					
						
							| 
									
										
										
										
											2012-02-24 13:00:48 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-03-23 14:38:01 -07:00
										 |  |  |       clear_selection(); | 
					
						
							| 
									
										
										
										
											2012-02-24 13:00:48 -08:00
										 |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   // When the user clicks "Select All", select all tasks.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   JX.DOM.listen( | 
					
						
							|  |  |  |     JX.$(config.selectNone), | 
					
						
							|  |  |  |     'click', | 
					
						
							|  |  |  |     null, | 
					
						
							|  |  |  |     function(e) { | 
					
						
							|  |  |  |       changeall(false); | 
					
						
							|  |  |  |       e.kill(); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   // When the user clicks "Clear Selection", clear the selection.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   JX.DOM.listen( | 
					
						
							|  |  |  |     JX.$(config.selectAll), | 
					
						
							|  |  |  |     'click', | 
					
						
							|  |  |  |     null, | 
					
						
							|  |  |  |     function(e) { | 
					
						
							|  |  |  |       changeall(true); | 
					
						
							|  |  |  |       e.kill(); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-03-23 14:38:01 -07:00
										 |  |  |   // When the user submits the form, dump selected state into it.
 | 
					
						
							| 
									
										
										
										
											2012-02-24 13:00:48 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-03-23 14:38:01 -07:00
										 |  |  |   JX.DOM.listen( | 
					
						
							|  |  |  |     JX.$(config.formID), | 
					
						
							|  |  |  |     'submit', | 
					
						
							| 
									
										
										
										
											2012-02-24 13:00:48 -08:00
										 |  |  |     null, | 
					
						
							| 
									
										
										
										
											2014-06-24 03:27:47 +10:00
										 |  |  |     function() { | 
					
						
							| 
									
										
										
										
											2013-03-23 14:38:01 -07:00
										 |  |  |       var inputs = []; | 
					
						
							|  |  |  |       for (var k in selected) { | 
					
						
							|  |  |  |         inputs.push( | 
					
						
							|  |  |  |           JX.$N('input', {type: 'hidden', name: 'batch[]', value: k})); | 
					
						
							| 
									
										
										
										
											2012-02-24 13:00:48 -08:00
										 |  |  |       } | 
					
						
							| 
									
										
										
										
											2013-03-23 14:38:01 -07:00
										 |  |  |       JX.DOM.setContent(JX.$(config.idContainer), inputs); | 
					
						
							| 
									
										
										
										
											2012-02-24 13:00:48 -08:00
										 |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-03-23 14:38:01 -07:00
										 |  |  |   update(); | 
					
						
							| 
									
										
										
										
											2012-02-24 13:00:48 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  | }); |