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