otsdaq_utilities  v2_05_02_indev
select_row.js
1 var SelectRow = function(table){
2  this.table = table; //hold Tabulator object
3  this.selecting = false; //flag selecting in progress
4  this.lastClickedRow = false; //last clicked row
5  this.selectPrev = []; //hold previously selected element for drag drop selection
6  this.selectedRows = []; //hold selected rows
7  this.headerCheckboxElement = null; // hold header select element
8 };
9 
10 SelectRow.prototype.clearSelectionData = function(silent){
11  this.selecting = false;
12  this.lastClickedRow = false;
13  this.selectPrev = [];
14  this.selectedRows = [];
15 
16  if(!silent){
17  this._rowSelectionChanged();
18  }
19 };
20 
21 SelectRow.prototype.initializeRow = function(row){
22  var self = this,
23  element = row.getElement();
24 
25  // trigger end of row selection
26  var endSelect = function(){
27 
28  setTimeout(function(){
29  self.selecting = false;
30  }, 50);
31 
32  document.body.removeEventListener("mouseup", endSelect);
33  };
34 
35 
36  row.modules.select = {selected:false};
37 
38  //set row selection class
39  if(self.table.options.selectableCheck.call(this.table, row.getComponent())){
40  element.classList.add("tabulator-selectable");
41  element.classList.remove("tabulator-unselectable");
42 
43  if(self.table.options.selectable && self.table.options.selectable != "highlight"){
44  if(self.table.options.selectableRangeMode === "click"){
45  element.addEventListener("click", function(e){
46  if(e.shiftKey){
47  self.table._clearSelection();
48  self.lastClickedRow = self.lastClickedRow || row;
49 
50  var lastClickedRowIdx = self.table.rowManager.getDisplayRowIndex(self.lastClickedRow);
51  var rowIdx = self.table.rowManager.getDisplayRowIndex(row);
52 
53  var fromRowIdx = lastClickedRowIdx <= rowIdx ? lastClickedRowIdx : rowIdx;
54  var toRowIdx = lastClickedRowIdx >= rowIdx ? lastClickedRowIdx : rowIdx;
55 
56  var rows = self.table.rowManager.getDisplayRows().slice(0);
57  var toggledRows = rows.splice(fromRowIdx, toRowIdx - fromRowIdx + 1);
58 
59  if(e.ctrlKey || e.metaKey){
60  toggledRows.forEach(function(toggledRow){
61  if(toggledRow !== self.lastClickedRow){
62 
63  if(self.table.options.selectable !== true && !self.isRowSelected(row)){
64  if(self.selectedRows.length < self.table.options.selectable){
65  self.toggleRow(toggledRow);
66  }
67  }else{
68  self.toggleRow(toggledRow);
69  }
70  }
71  });
72  self.lastClickedRow = row;
73  }else{
74  self.deselectRows();
75 
76  if(self.table.options.selectable !== true){
77  if(toggledRows.length > self.table.options.selectable){
78  toggledRows = toggledRows.slice(0, self.table.options.selectable)
79  }
80  }
81 
82  self.selectRows(toggledRows);
83  }
84  self.table._clearSelection();
85  }
86  else if(e.ctrlKey || e.metaKey){
87  self.toggleRow(row);
88  self.lastClickedRow = row;
89  }else{
90  self.deselectRows();
91  self.selectRows(row);
92  self.lastClickedRow = row;
93  }
94  });
95  }else{
96  element.addEventListener("click", function(e){
97  if(!self.table.modExists("edit") || !self.table.modules.edit.getCurrentCell()){
98  self.table._clearSelection();
99  }
100 
101  if(!self.selecting){
102  self.toggleRow(row);
103  }
104  });
105 
106  element.addEventListener("mousedown", function(e){
107  if(e.shiftKey){
108  self.table._clearSelection();
109 
110  self.selecting = true;
111 
112  self.selectPrev = [];
113 
114  document.body.addEventListener("mouseup", endSelect);
115  document.body.addEventListener("keyup", endSelect);
116 
117  self.toggleRow(row);
118 
119  return false;
120  }
121  });
122 
123  element.addEventListener("mouseenter", function(e){
124  if(self.selecting){
125  self.table._clearSelection();
126  self.toggleRow(row);
127 
128  if(self.selectPrev[1] == row){
129  self.toggleRow(self.selectPrev[0]);
130  }
131  }
132  });
133 
134  element.addEventListener("mouseout", function(e){
135  if(self.selecting){
136  self.table._clearSelection();
137  self.selectPrev.unshift(row);
138  }
139  });
140  }
141  }
142 
143  }else{
144  element.classList.add("tabulator-unselectable");
145  element.classList.remove("tabulator-selectable");
146  }
147 };
148 
149 //toggle row selection
150 SelectRow.prototype.toggleRow = function(row){
151  if(this.table.options.selectableCheck.call(this.table, row.getComponent())){
152  if(row.modules.select && row.modules.select.selected){
153  this._deselectRow(row);
154  }else{
155  this._selectRow(row);
156  }
157  }
158 };
159 
160 //select a number of rows
161 SelectRow.prototype.selectRows = function(rows){
162  var rowMatch;
163 
164  switch(typeof rows){
165  case "undefined":
166  this.table.rowManager.rows.forEach((row) => {
167  this._selectRow(row, true, true);
168  });
169 
170  this._rowSelectionChanged();
171  break;
172 
173  case "string":
174 
175  rowMatch = this.table.rowManager.findRow(rows);
176 
177  if(rowMatch){
178  this._selectRow(rowMatch, true, true);
179  }else{
180  this.table.rowManager.getRows(rows).forEach((row) => {
181  this._selectRow(row, true, true);
182  });
183  }
184 
185  this._rowSelectionChanged();
186  break;
187 
188  default:
189  if(Array.isArray(rows)){
190  rows.forEach((row) => {
191  this._selectRow(row, true, true);
192  });
193 
194  this._rowSelectionChanged();
195  }else{
196  this._selectRow(rows, false, true);
197  }
198  break;
199  }
200 };
201 
202 //select an individual row
203 SelectRow.prototype._selectRow = function(rowInfo, silent, force){
204  var index;
205 
206  //handle max row count
207  if(!isNaN(this.table.options.selectable) && this.table.options.selectable !== true && !force){
208  if(this.selectedRows.length >= this.table.options.selectable){
209  if(this.table.options.selectableRollingSelection){
210  this._deselectRow(this.selectedRows[0]);
211  }else{
212  return false;
213  }
214  }
215  }
216 
217  var row = this.table.rowManager.findRow(rowInfo);
218 
219  if(row){
220  if(this.selectedRows.indexOf(row) == -1){
221  if(!row.modules.select){
222  row.modules.select = {};
223  }
224 
225  row.modules.select.selected = true;
226  if(row.modules.select.checkboxEl){
227  row.modules.select.checkboxEl.checked = true;
228  }
229  row.getElement().classList.add("tabulator-selected");
230 
231  this.selectedRows.push(row);
232 
233 
234  if(!silent){
235  this.table.options.rowSelected.call(this.table, row.getComponent());
236  this._rowSelectionChanged();
237  }
238  }
239  }else{
240  if(!silent){
241  console.warn("Selection Error - No such row found, ignoring selection:" + rowInfo);
242  }
243  }
244 };
245 
246 SelectRow.prototype.isRowSelected = function(row){
247  return this.selectedRows.indexOf(row) !== -1;
248 };
249 
250 //deselect a number of rows
251 SelectRow.prototype.deselectRows = function(rows){
252  var self = this,
253  rowCount;
254 
255  if(typeof rows == "undefined"){
256 
257  rowCount = self.selectedRows.length;
258 
259  for(let i = 0; i < rowCount; i++){
260  self._deselectRow(self.selectedRows[0], true);
261  }
262 
263  self._rowSelectionChanged();
264  }else{
265  if(Array.isArray(rows)){
266  rows.forEach(function(row){
267  self._deselectRow(row, true);
268  });
269 
270  self._rowSelectionChanged();
271  }else{
272  self._deselectRow(rows);
273  }
274  }
275 };
276 
277 //deselect an individual row
278 SelectRow.prototype._deselectRow = function(rowInfo, silent){
279  var self = this,
280  row = self.table.rowManager.findRow(rowInfo),
281  index;
282 
283  if(row){
284  index = self.selectedRows.findIndex(function(selectedRow){
285  return selectedRow == row;
286  });
287 
288  if(index > -1){
289 
290  if(!row.modules.select){
291  row.modules.select = {};
292  }
293 
294  row.modules.select.selected = false;
295  if(row.modules.select.checkboxEl){
296  row.modules.select.checkboxEl.checked = false;
297  }
298  row.getElement().classList.remove("tabulator-selected");
299  self.selectedRows.splice(index, 1);
300 
301  if(!silent){
302  self.table.options.rowDeselected.call(this.table, row.getComponent());
303  self._rowSelectionChanged();
304  }
305  }
306  }else{
307  if(!silent){
308  console.warn("Deselection Error - No such row found, ignoring selection:" + rowInfo);
309  }
310  }
311 };
312 
313 SelectRow.prototype.getSelectedData = function(){
314  var data = [];
315 
316  this.selectedRows.forEach(function(row){
317  data.push(row.getData());
318  });
319 
320  return data;
321 };
322 
323 SelectRow.prototype.getSelectedRows = function(){
324 
325  var rows = [];
326 
327  this.selectedRows.forEach(function(row){
328  rows.push(row.getComponent());
329  });
330 
331  return rows;
332 };
333 
334 SelectRow.prototype._rowSelectionChanged = function(){
335  if(this.headerCheckboxElement){
336  if(this.selectedRows.length === 0){
337  this.headerCheckboxElement.checked = false;
338  this.headerCheckboxElement.indeterminate = false;
339  } else if(this.table.rowManager.rows.length === this.selectedRows.length){
340  this.headerCheckboxElement.checked = true;
341  this.headerCheckboxElement.indeterminate = false;
342  } else {
343  this.headerCheckboxElement.indeterminate = true;
344  this.headerCheckboxElement.checked = false;
345  }
346  }
347 
348  this.table.options.rowSelectionChanged.call(this.table, this.getSelectedData(), this.getSelectedRows());
349 };
350 
351 SelectRow.prototype.registerRowSelectCheckbox = function (row, element) {
352  if(!row._row.modules.select){
353  row._row.modules.select = {};
354  }
355 
356  row._row.modules.select.checkboxEl = element;
357 }
358 
359 SelectRow.prototype.registerHeaderSelectCheckbox = function (element) {
360  this.headerCheckboxElement = element;
361 }
362 
363 Tabulator.prototype.registerModule("selectRow", SelectRow);