tabulator-tables 5.1.0 → 5.1.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (76) hide show
  1. package/bower.json +1 -1
  2. package/build/rollup.js +2 -1
  3. package/dist/css/tabulator.css +15 -8
  4. package/dist/css/tabulator.css.map +1 -1
  5. package/dist/css/tabulator.min.css +1 -1
  6. package/dist/css/tabulator.min.css.map +1 -1
  7. package/dist/css/tabulator_bootstrap3.css +15 -8
  8. package/dist/css/tabulator_bootstrap3.css.map +1 -1
  9. package/dist/css/tabulator_bootstrap3.min.css +1 -1
  10. package/dist/css/tabulator_bootstrap3.min.css.map +1 -1
  11. package/dist/css/tabulator_bootstrap4.css +15 -8
  12. package/dist/css/tabulator_bootstrap4.css.map +1 -1
  13. package/dist/css/tabulator_bootstrap4.min.css +1 -1
  14. package/dist/css/tabulator_bootstrap4.min.css.map +1 -1
  15. package/dist/css/tabulator_bulma.css +15 -8
  16. package/dist/css/tabulator_bulma.css.map +1 -1
  17. package/dist/css/tabulator_bulma.min.css +1 -1
  18. package/dist/css/tabulator_bulma.min.css.map +1 -1
  19. package/dist/css/tabulator_materialize.css +15 -8
  20. package/dist/css/tabulator_materialize.css.map +1 -1
  21. package/dist/css/tabulator_materialize.min.css +1 -1
  22. package/dist/css/tabulator_materialize.min.css.map +1 -1
  23. package/dist/css/tabulator_midnight.css +15 -8
  24. package/dist/css/tabulator_midnight.css.map +1 -1
  25. package/dist/css/tabulator_midnight.min.css +1 -1
  26. package/dist/css/tabulator_midnight.min.css.map +1 -1
  27. package/dist/css/tabulator_modern.css +15 -8
  28. package/dist/css/tabulator_modern.css.map +1 -1
  29. package/dist/css/tabulator_modern.min.css +1 -1
  30. package/dist/css/tabulator_modern.min.css.map +1 -1
  31. package/dist/css/tabulator_semanticui.css +15 -8
  32. package/dist/css/tabulator_semanticui.css.map +1 -1
  33. package/dist/css/tabulator_semanticui.min.css +1 -1
  34. package/dist/css/tabulator_semanticui.min.css.map +1 -1
  35. package/dist/css/tabulator_simple.css +15 -8
  36. package/dist/css/tabulator_simple.css.map +1 -1
  37. package/dist/css/tabulator_simple.min.css +1 -1
  38. package/dist/css/tabulator_simple.min.css.map +1 -1
  39. package/dist/css/tabulator_site.css +15 -8
  40. package/dist/css/tabulator_site.css.map +1 -1
  41. package/dist/css/tabulator_site.min.css +1 -1
  42. package/dist/css/tabulator_site.min.css.map +1 -1
  43. package/dist/js/tabulator.js +301 -181
  44. package/dist/js/tabulator.js.map +1 -1
  45. package/dist/js/tabulator.min.js +2 -2
  46. package/dist/js/tabulator.min.js.map +1 -1
  47. package/dist/js/tabulator_esm.js +820 -721
  48. package/dist/js/tabulator_esm.js.map +1 -1
  49. package/dist/js/tabulator_esm.min.js +2 -2
  50. package/dist/js/tabulator_esm.min.js.map +1 -1
  51. package/package.json +5 -2
  52. package/src/js/core/FooterManager.js +15 -5
  53. package/src/js/core/RowManager.js +311 -284
  54. package/src/js/core/Tabulator.js +12 -29
  55. package/src/js/core/column/ColumnComponent.js +2 -0
  56. package/src/js/core/tools/InteractionMonitor.js +31 -23
  57. package/src/js/core/tools/ModuleBinder.js +15 -3
  58. package/src/js/modules/ColumnCalcs/ColumnCalcs.js +11 -6
  59. package/src/js/modules/DataTree/DataTree.js +0 -1
  60. package/src/js/modules/Edit/Edit.js +2 -2
  61. package/src/js/modules/Export/Export.js +2 -1
  62. package/src/js/modules/Filter/Filter.js +1 -2
  63. package/src/js/modules/Format/defaults/formatters/rowSelection.js +18 -1
  64. package/src/js/modules/Format/defaults/formatters/rownum.js +1 -1
  65. package/src/js/modules/FrozenColumns/FrozenColumns.js +17 -3
  66. package/src/js/modules/GroupRows/Group.js +144 -142
  67. package/src/js/modules/GroupRows/GroupComponent.js +1 -1
  68. package/src/js/modules/Import/Import.js +1 -3
  69. package/src/js/modules/Layout/Layout.js +1 -0
  70. package/src/js/modules/Page/Page.js +9 -4
  71. package/src/js/modules/Persistence/Persistence.js +6 -4
  72. package/src/js/modules/Persistence/defaults/readers.js +3 -3
  73. package/src/js/modules/ResizeColumns/ResizeColumns.js +61 -51
  74. package/src/js/modules/ResponsiveLayout/ResponsiveLayout.js +5 -5
  75. package/src/js/modules/SelectRow/SelectRow.js +130 -128
  76. package/src/scss/tabulator.scss +17 -12
@@ -1,179 +1,130 @@
1
1
  import Module from '../../core/Module.js';
2
2
 
3
3
  class SelectRow extends Module{
4
-
4
+
5
5
  constructor(table){
6
6
  super(table);
7
-
7
+
8
8
  this.selecting = false; //flag selecting in progress
9
9
  this.lastClickedRow = false; //last clicked row
10
10
  this.selectPrev = []; //hold previously selected element for drag drop selection
11
11
  this.selectedRows = []; //hold selected rows
12
12
  this.headerCheckboxElement = null; // hold header select element
13
-
13
+
14
14
  this.registerTableOption("selectable", "highlight"); //highlight rows on hover
15
15
  this.registerTableOption("selectableRangeMode", "drag"); //highlight rows on hover
16
16
  this.registerTableOption("selectableRollingSelection", true); //roll selection once maximum number of selectable rows is reached
17
17
  this.registerTableOption("selectablePersistence", true); // maintain selection when table view is updated
18
18
  this.registerTableOption("selectableCheck", function(data, row){return true;}); //check wheather row is selectable
19
-
19
+
20
20
  this.registerTableFunction("selectRow", this.selectRows.bind(this));
21
21
  this.registerTableFunction("deselectRow", this.deselectRows.bind(this));
22
22
  this.registerTableFunction("toggleSelectRow", this.toggleRow.bind(this));
23
23
  this.registerTableFunction("getSelectedRows", this.getSelectedRows.bind(this));
24
24
  this.registerTableFunction("getSelectedData", this.getSelectedData.bind(this));
25
-
25
+
26
26
  //register component functions
27
27
  this.registerComponentFunction("row", "select", this.selectRows.bind(this));
28
28
  this.registerComponentFunction("row", "deselect", this.deselectRows.bind(this));
29
29
  this.registerComponentFunction("row", "toggleSelect", this.toggleRow.bind(this));
30
30
  this.registerComponentFunction("row", "isSelected", this.isRowSelected.bind(this));
31
31
  }
32
-
32
+
33
33
  initialize(){
34
34
  if(this.table.options.selectable !== false){
35
35
  this.subscribe("row-init", this.initializeRow.bind(this));
36
36
  this.subscribe("row-deleting", this.rowDeleted.bind(this));
37
37
  this.subscribe("rows-wipe", this.clearSelectionData.bind(this));
38
38
  this.subscribe("rows-retrieve", this.rowRetrieve.bind(this));
39
-
39
+
40
40
  if(this.table.options.selectable && !this.table.options.selectablePersistence){
41
- this.subscribe("data-refeshing", this.deselectRows.bind(this));
41
+ this.subscribe("data-refreshing", this.deselectRows.bind(this));
42
42
  }
43
43
  }
44
44
  }
45
-
45
+
46
46
  rowRetrieve(type, prevValue){
47
47
  return type === "selected" ? this.selectedRows : prevValue;
48
48
  }
49
-
49
+
50
50
  rowDeleted(row){
51
51
  this._deselectRow(row, true);
52
52
  }
53
-
53
+
54
54
  clearSelectionData(silent){
55
55
  this.selecting = false;
56
56
  this.lastClickedRow = false;
57
57
  this.selectPrev = [];
58
58
  this.selectedRows = [];
59
-
59
+
60
60
  if(silent !== true){
61
61
  this._rowSelectionChanged();
62
62
  }
63
63
  }
64
-
64
+
65
65
  initializeRow(row){
66
66
  var self = this,
67
67
  element = row.getElement();
68
-
68
+
69
69
  // trigger end of row selection
70
70
  var endSelect = function(){
71
-
71
+
72
72
  setTimeout(function(){
73
73
  self.selecting = false;
74
74
  }, 50);
75
-
75
+
76
76
  document.body.removeEventListener("mouseup", endSelect);
77
77
  };
78
-
78
+
79
79
  row.modules.select = {selected:false};
80
-
80
+
81
81
  //set row selection class
82
82
  if(self.table.options.selectableCheck.call(this.table, row.getComponent())){
83
83
  element.classList.add("tabulator-selectable");
84
84
  element.classList.remove("tabulator-unselectable");
85
-
85
+
86
86
  if(self.table.options.selectable && self.table.options.selectable != "highlight"){
87
87
  if(self.table.options.selectableRangeMode === "click"){
88
- element.addEventListener("click", function(e){
89
- if(e.shiftKey){
90
- self.table._clearSelection();
91
- self.lastClickedRow = self.lastClickedRow || row;
92
-
93
- var lastClickedRowIdx = self.table.rowManager.getDisplayRowIndex(self.lastClickedRow);
94
- var rowIdx = self.table.rowManager.getDisplayRowIndex(row);
95
-
96
- var fromRowIdx = lastClickedRowIdx <= rowIdx ? lastClickedRowIdx : rowIdx;
97
- var toRowIdx = lastClickedRowIdx >= rowIdx ? lastClickedRowIdx : rowIdx;
98
-
99
- var rows = self.table.rowManager.getDisplayRows().slice(0);
100
- var toggledRows = rows.splice(fromRowIdx, toRowIdx - fromRowIdx + 1);
101
-
102
- if(e.ctrlKey || e.metaKey){
103
- toggledRows.forEach(function(toggledRow){
104
- if(toggledRow !== self.lastClickedRow){
105
-
106
- if(self.table.options.selectable !== true && !self.isRowSelected(row)){
107
- if(self.selectedRows.length < self.table.options.selectable){
108
- self.toggleRow(toggledRow);
109
- }
110
- }else{
111
- self.toggleRow(toggledRow);
112
- }
113
- }
114
- });
115
- self.lastClickedRow = row;
116
- }else{
117
- self.deselectRows(undefined, true);
118
-
119
- if(self.table.options.selectable !== true){
120
- if(toggledRows.length > self.table.options.selectable){
121
- toggledRows = toggledRows.slice(0, self.table.options.selectable)
122
- }
123
- }
124
-
125
- self.selectRows(toggledRows);
126
- }
127
- self.table._clearSelection();
128
- }
129
- else if(e.ctrlKey || e.metaKey){
130
- self.toggleRow(row);
131
- self.lastClickedRow = row;
132
- }else{
133
- self.deselectRows(undefined, true);
134
- self.selectRows(row);
135
- self.lastClickedRow = row;
136
- }
137
- });
88
+ element.addEventListener("click", this.handleComplexRowClick.bind(this, row));
138
89
  }else{
139
90
  element.addEventListener("click", function(e){
140
91
  if(!self.table.modExists("edit") || !self.table.modules.edit.getCurrentCell()){
141
92
  self.table._clearSelection();
142
93
  }
143
-
94
+
144
95
  if(!self.selecting){
145
96
  self.toggleRow(row);
146
97
  }
147
98
  });
148
-
99
+
149
100
  element.addEventListener("mousedown", function(e){
150
101
  if(e.shiftKey){
151
102
  self.table._clearSelection();
152
-
103
+
153
104
  self.selecting = true;
154
-
105
+
155
106
  self.selectPrev = [];
156
-
107
+
157
108
  document.body.addEventListener("mouseup", endSelect);
158
109
  document.body.addEventListener("keyup", endSelect);
159
-
110
+
160
111
  self.toggleRow(row);
161
-
112
+
162
113
  return false;
163
114
  }
164
115
  });
165
-
116
+
166
117
  element.addEventListener("mouseenter", function(e){
167
118
  if(self.selecting){
168
119
  self.table._clearSelection();
169
120
  self.toggleRow(row);
170
-
121
+
171
122
  if(self.selectPrev[1] == row){
172
123
  self.toggleRow(self.selectPrev[0]);
173
124
  }
174
125
  }
175
126
  });
176
-
127
+
177
128
  element.addEventListener("mouseout", function(e){
178
129
  if(self.selecting){
179
130
  self.table._clearSelection();
@@ -182,13 +133,64 @@ class SelectRow extends Module{
182
133
  });
183
134
  }
184
135
  }
185
-
136
+
186
137
  }else{
187
138
  element.classList.add("tabulator-unselectable");
188
139
  element.classList.remove("tabulator-selectable");
189
140
  }
190
141
  }
191
-
142
+
143
+ handleComplexRowClick(row, e){
144
+ if(e.shiftKey){
145
+ this.table._clearSelection();
146
+ this.lastClickedRow = this.lastClickedRow || row;
147
+
148
+ var lastClickedRowIdx = this.table.rowManager.getDisplayRowIndex(this.lastClickedRow);
149
+ var rowIdx = this.table.rowManager.getDisplayRowIndex(row);
150
+
151
+ var fromRowIdx = lastClickedRowIdx <= rowIdx ? lastClickedRowIdx : rowIdx;
152
+ var toRowIdx = lastClickedRowIdx >= rowIdx ? lastClickedRowIdx : rowIdx;
153
+
154
+ var rows = this.table.rowManager.getDisplayRows().slice(0);
155
+ var toggledRows = rows.splice(fromRowIdx, toRowIdx - fromRowIdx + 1);
156
+
157
+ if(e.ctrlKey || e.metaKey){
158
+ toggledRows.forEach((toggledRow)=>{
159
+ if(toggledRow !== this.lastClickedRow){
160
+
161
+ if(this.table.options.selectable !== true && !this.isRowSelected(row)){
162
+ if(this.selectedRows.length < this.table.options.selectable){
163
+ this.toggleRow(toggledRow);
164
+ }
165
+ }else{
166
+ this.toggleRow(toggledRow);
167
+ }
168
+ }
169
+ });
170
+ this.lastClickedRow = row;
171
+ }else{
172
+ this.deselectRows(undefined, true);
173
+
174
+ if(this.table.options.selectable !== true){
175
+ if(toggledRows.length > this.table.options.selectable){
176
+ toggledRows = toggledRows.slice(0, this.table.options.selectable)
177
+ }
178
+ }
179
+
180
+ this.selectRows(toggledRows);
181
+ }
182
+ this.table._clearSelection();
183
+ }
184
+ else if(e.ctrlKey || e.metaKey){
185
+ this.toggleRow(row);
186
+ this.lastClickedRow = row;
187
+ }else{
188
+ this.deselectRows(undefined, true);
189
+ this.selectRows(row);
190
+ this.lastClickedRow = row;
191
+ }
192
+ }
193
+
192
194
  //toggle row selection
193
195
  toggleRow(row){
194
196
  if(this.table.options.selectableCheck.call(this.table, row.getComponent())){
@@ -199,24 +201,24 @@ class SelectRow extends Module{
199
201
  }
200
202
  }
201
203
  }
202
-
204
+
203
205
  //select a number of rows
204
206
  selectRows(rows){
205
207
  var rowMatch;
206
-
208
+
207
209
  switch(typeof rows){
208
210
  case "undefined":
209
211
  this.table.rowManager.rows.forEach((row) => {
210
212
  this._selectRow(row, true, true);
211
213
  });
212
-
214
+
213
215
  this._rowSelectionChanged();
214
216
  break;
215
-
217
+
216
218
  case "string":
217
-
219
+
218
220
  rowMatch = this.table.rowManager.findRow(rows);
219
-
221
+
220
222
  if(rowMatch){
221
223
  this._selectRow(rowMatch, true, true);
222
224
  }else{
@@ -224,16 +226,16 @@ class SelectRow extends Module{
224
226
  this._selectRow(row, true, true);
225
227
  });
226
228
  }
227
-
229
+
228
230
  this._rowSelectionChanged();
229
231
  break;
230
-
232
+
231
233
  default:
232
234
  if(Array.isArray(rows)){
233
235
  rows.forEach((row) => {
234
236
  this._selectRow(row, true, true);
235
237
  });
236
-
238
+
237
239
  this._rowSelectionChanged();
238
240
  }else{
239
241
  this._selectRow(rows, false, true);
@@ -241,11 +243,11 @@ class SelectRow extends Module{
241
243
  break;
242
244
  }
243
245
  }
244
-
246
+
245
247
  //select an individual row
246
248
  _selectRow(rowInfo, silent, force){
247
249
  var index;
248
-
250
+
249
251
  //handle max row count
250
252
  if(!isNaN(this.table.options.selectable) && this.table.options.selectable !== true && !force){
251
253
  if(this.selectedRows.length >= this.table.options.selectable){
@@ -256,29 +258,29 @@ class SelectRow extends Module{
256
258
  }
257
259
  }
258
260
  }
259
-
261
+
260
262
  var row = this.table.rowManager.findRow(rowInfo);
261
-
263
+
262
264
  if(row){
263
265
  if(this.selectedRows.indexOf(row) == -1){
264
266
  row.getElement().classList.add("tabulator-selected");
265
267
  if(!row.modules.select){
266
268
  row.modules.select = {};
267
269
  }
268
-
270
+
269
271
  row.modules.select.selected = true;
270
272
  if(row.modules.select.checkboxEl){
271
273
  row.modules.select.checkboxEl.checked = true;
272
274
  }
273
-
275
+
274
276
  this.selectedRows.push(row);
275
-
277
+
276
278
  if(this.table.options.dataTreeSelectPropagate){
277
279
  this.childRowSelection(row, true);
278
280
  }
279
-
281
+
280
282
  this.dispatchExternal("rowSelected", row.getComponent());
281
-
283
+
282
284
  this._rowSelectionChanged(silent);
283
285
  }
284
286
  }else{
@@ -287,69 +289,69 @@ class SelectRow extends Module{
287
289
  }
288
290
  }
289
291
  }
290
-
292
+
291
293
  isRowSelected(row){
292
294
  return this.selectedRows.indexOf(row) !== -1;
293
295
  }
294
-
296
+
295
297
  //deselect a number of rows
296
298
  deselectRows(rows, silent){
297
299
  var self = this,
298
300
  rowCount;
299
301
 
300
302
  if(typeof rows == "undefined"){
301
-
303
+
302
304
  rowCount = self.selectedRows.length;
303
-
305
+
304
306
  for(let i = 0; i < rowCount; i++){
305
307
  self._deselectRow(self.selectedRows[0], true);
306
308
  }
307
-
309
+
308
310
  self._rowSelectionChanged(silent);
309
-
311
+
310
312
  }else{
311
313
  if(Array.isArray(rows)){
312
314
  rows.forEach(function(row){
313
315
  self._deselectRow(row, true);
314
316
  });
315
-
317
+
316
318
  self._rowSelectionChanged(silent);
317
319
  }else{
318
320
  self._deselectRow(rows, silent);
319
321
  }
320
322
  }
321
323
  }
322
-
324
+
323
325
  //deselect an individual row
324
326
  _deselectRow(rowInfo, silent){
325
327
  var self = this,
326
328
  row = self.table.rowManager.findRow(rowInfo),
327
329
  index;
328
-
330
+
329
331
  if(row){
330
332
  index = self.selectedRows.findIndex(function(selectedRow){
331
333
  return selectedRow == row;
332
334
  });
333
-
335
+
334
336
  if(index > -1){
335
-
337
+
336
338
  row.getElement().classList.remove("tabulator-selected");
337
339
  if(!row.modules.select){
338
340
  row.modules.select = {};
339
341
  }
340
-
342
+
341
343
  row.modules.select.selected = false;
342
344
  if(row.modules.select.checkboxEl){
343
345
  row.modules.select.checkboxEl.checked = false;
344
346
  }
345
347
  self.selectedRows.splice(index, 1);
346
-
348
+
347
349
  if(this.table.options.dataTreeSelectPropagate){
348
350
  this.childRowSelection(row, false);
349
351
  }
350
-
352
+
351
353
  this.dispatchExternal("rowDeselected", row.getComponent());
352
-
354
+
353
355
  self._rowSelectionChanged(silent);
354
356
  }
355
357
  }else{
@@ -358,28 +360,28 @@ class SelectRow extends Module{
358
360
  }
359
361
  }
360
362
  }
361
-
363
+
362
364
  getSelectedData(){
363
365
  var data = [];
364
-
366
+
365
367
  this.selectedRows.forEach(function(row){
366
368
  data.push(row.getData());
367
369
  });
368
-
370
+
369
371
  return data;
370
372
  }
371
-
373
+
372
374
  getSelectedRows(){
373
-
375
+
374
376
  var rows = [];
375
-
377
+
376
378
  this.selectedRows.forEach(function(row){
377
379
  rows.push(row.getComponent());
378
380
  });
379
-
381
+
380
382
  return rows;
381
383
  }
382
-
384
+
383
385
  _rowSelectionChanged(silent){
384
386
  if(this.headerCheckboxElement){
385
387
  if(this.selectedRows.length === 0){
@@ -393,27 +395,27 @@ class SelectRow extends Module{
393
395
  this.headerCheckboxElement.checked = false;
394
396
  }
395
397
  }
396
-
398
+
397
399
  if(!silent){
398
400
  this.dispatchExternal("rowSelectionChanged", this.getSelectedData(), this.getSelectedRows());
399
401
  }
400
402
  }
401
-
403
+
402
404
  registerRowSelectCheckbox (row, element) {
403
405
  if(!row._row.modules.select){
404
406
  row._row.modules.select = {};
405
407
  }
406
-
408
+
407
409
  row._row.modules.select.checkboxEl = element;
408
410
  }
409
-
411
+
410
412
  registerHeaderSelectCheckbox (element) {
411
413
  this.headerCheckboxElement = element;
412
414
  }
413
-
415
+
414
416
  childRowSelection(row, select){
415
417
  var children = this.table.modules.dataTree.getChildren(row, true);
416
-
418
+
417
419
  if(select){
418
420
  for(let child of children){
419
421
  this._selectRow(child, true);
@@ -392,15 +392,17 @@ $footerActiveColor:#d00 !default; //footer bottom active text color
392
392
 
393
393
  width:100%;
394
394
 
395
- span{
395
+ .tabulator-placeholder-contents {
396
396
  display: inline-block;
397
+ text-align: center;
397
398
 
398
- margin:0 auto;
399
399
  padding:10px;
400
400
 
401
401
  color:#ccc;
402
402
  font-weight: bold;
403
403
  font-size: 20px;
404
+
405
+ white-space: normal;
404
406
  }
405
407
  }
406
408
 
@@ -432,17 +434,8 @@ $footerActiveColor:#d00 !default; //footer bottom active text color
432
434
  }
433
435
  }
434
436
 
435
-
436
-
437
437
  //footer element
438
438
  .tabulator-footer{
439
- display: flex;
440
- flex-direction: row;
441
- align-items: center;
442
- justify-content: space-between;
443
-
444
- padding:5px 10px;
445
-
446
439
  border-top:1px solid $footerSeperatorColor;
447
440
  background-color: $footerBackgroundColor;
448
441
 
@@ -456,10 +449,22 @@ $footerActiveColor:#d00 !default; //footer bottom active text color
456
449
  -webkit-user-select: none;
457
450
  -o-user-select: none;
458
451
 
452
+ .tabulator-footer-contents {
453
+ display: flex;
454
+ flex-direction: row;
455
+ align-items: center;
456
+ justify-content: space-between;
457
+
458
+ padding:5px 10px;
459
+
460
+ &:empty{
461
+ display: none;
462
+ }
463
+ }
464
+
459
465
  .tabulator-calcs-holder{
460
466
  box-sizing:border-box;
461
467
  width:calc(100% + 20px);
462
- margin:-5px -10px 5px -10px;
463
468
 
464
469
  text-align: left;
465
470