tabulator-tables 5.4.4 → 5.5.1

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 (106) hide show
  1. package/bower.json +1 -1
  2. package/build/Bundler.js +7 -3
  3. package/dist/css/tabulator.css +85 -48
  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 +94 -53
  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 +111 -68
  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_bootstrap5.css +115 -70
  16. package/dist/css/tabulator_bootstrap5.css.map +1 -1
  17. package/dist/css/tabulator_bootstrap5.min.css +1 -1
  18. package/dist/css/tabulator_bootstrap5.min.css.map +1 -1
  19. package/dist/css/tabulator_bulma.css +100 -57
  20. package/dist/css/tabulator_bulma.css.map +1 -1
  21. package/dist/css/tabulator_bulma.min.css +1 -1
  22. package/dist/css/tabulator_bulma.min.css.map +1 -1
  23. package/dist/css/tabulator_materialize.css +109 -69
  24. package/dist/css/tabulator_materialize.css.map +1 -1
  25. package/dist/css/tabulator_materialize.min.css +1 -1
  26. package/dist/css/tabulator_materialize.min.css.map +1 -1
  27. package/dist/css/tabulator_midnight.css +95 -54
  28. package/dist/css/tabulator_midnight.css.map +1 -1
  29. package/dist/css/tabulator_midnight.min.css +1 -1
  30. package/dist/css/tabulator_midnight.min.css.map +1 -1
  31. package/dist/css/tabulator_modern.css +101 -57
  32. package/dist/css/tabulator_modern.css.map +1 -1
  33. package/dist/css/tabulator_modern.min.css +1 -1
  34. package/dist/css/tabulator_modern.min.css.map +1 -1
  35. package/dist/css/tabulator_semanticui.css +138 -77
  36. package/dist/css/tabulator_semanticui.css.map +1 -1
  37. package/dist/css/tabulator_semanticui.min.css +1 -1
  38. package/dist/css/tabulator_semanticui.min.css.map +1 -1
  39. package/dist/css/tabulator_simple.css +85 -48
  40. package/dist/css/tabulator_simple.css.map +1 -1
  41. package/dist/css/tabulator_simple.min.css +1 -1
  42. package/dist/css/tabulator_simple.min.css.map +1 -1
  43. package/dist/css/tabulator_site.css +93 -52
  44. package/dist/css/tabulator_site.css.map +1 -1
  45. package/dist/css/tabulator_site.min.css +1 -1
  46. package/dist/css/tabulator_site.min.css.map +1 -1
  47. package/dist/js/jquery_wrapper.js +10 -2
  48. package/dist/js/tabulator.js +507 -237
  49. package/dist/js/tabulator.js.map +1 -1
  50. package/dist/js/tabulator.min.js +2 -2
  51. package/dist/js/tabulator.min.js.map +1 -1
  52. package/dist/js/tabulator_esm.js +507 -237
  53. package/dist/js/tabulator_esm.js.map +1 -1
  54. package/dist/js/tabulator_esm.min.js +2 -2
  55. package/dist/js/tabulator_esm.min.js.map +1 -1
  56. package/package.json +3 -2
  57. package/src/js/builds/jquery_wrapper.js +10 -2
  58. package/src/js/core/ColumnManager.js +15 -0
  59. package/src/js/core/RowManager.js +59 -41
  60. package/src/js/core/cell/CellComponent.js +5 -3
  61. package/src/js/core/column/ColumnComponent.js +2 -2
  62. package/src/js/core/rendering/renderers/BasicHorizontal.js +12 -5
  63. package/src/js/core/rendering/renderers/BasicVertical.js +49 -28
  64. package/src/js/core/rendering/renderers/VirtualDomHorizontal.js +6 -1
  65. package/src/js/core/rendering/renderers/VirtualDomVertical.js +87 -30
  66. package/src/js/core/row/Row.js +9 -3
  67. package/src/js/core/row/RowComponent.js +2 -2
  68. package/src/js/core/tools/DataLoader.js +44 -36
  69. package/src/js/modules/ColumnCalcs/defaults/calculations.js +7 -0
  70. package/src/js/modules/DataTree/DataTree.js +5 -2
  71. package/src/js/modules/Download/defaults/downloaders/xlsx.js +5 -2
  72. package/src/js/modules/Edit/Edit.js +2 -3
  73. package/src/js/modules/Edit/List.js +14 -3
  74. package/src/js/modules/Edit/defaults/editors/date.js +1 -1
  75. package/src/js/modules/Edit/defaults/editors/datetime.js +1 -1
  76. package/src/js/modules/Edit/defaults/editors/input.js +1 -1
  77. package/src/js/modules/Edit/defaults/editors/number.js +1 -1
  78. package/src/js/modules/Edit/defaults/editors/range.js +1 -1
  79. package/src/js/modules/Edit/defaults/editors/textarea.js +1 -1
  80. package/src/js/modules/Edit/defaults/editors/tickCross.js +1 -1
  81. package/src/js/modules/Edit/defaults/editors/time.js +1 -1
  82. package/src/js/modules/Export/Export.js +3 -0
  83. package/src/js/modules/Filter/Filter.js +11 -0
  84. package/src/js/modules/Format/Format.js +3 -0
  85. package/src/js/modules/Format/defaults/formatters/money.js +9 -2
  86. package/src/js/modules/FrozenColumns/FrozenColumns.js +1 -1
  87. package/src/js/modules/GroupRows/Group.js +27 -10
  88. package/src/js/modules/GroupRows/GroupComponent.js +4 -0
  89. package/src/js/modules/History/defaults/redoers.js +4 -2
  90. package/src/js/modules/History/defaults/undoers.js +6 -2
  91. package/src/js/modules/Interaction/Interaction.js +12 -0
  92. package/src/js/modules/Persistence/Persistence.js +15 -1
  93. package/src/js/modules/ResponsiveLayout/ResponsiveLayout.js +3 -0
  94. package/src/js/modules/SelectRow/SelectRow.js +82 -54
  95. package/src/scss/tabulator.scss +87 -50
  96. package/src/scss/themes/bootstrap/tabulator_bootstrap3.scss +9 -5
  97. package/src/scss/themes/bootstrap/tabulator_bootstrap4.scss +27 -19
  98. package/src/scss/themes/bootstrap/tabulator_bootstrap5.scss +29 -19
  99. package/src/scss/themes/bulma/tabulator_bulma.scss +15 -9
  100. package/src/scss/themes/materialize/tabulator_materialize.scss +15 -11
  101. package/src/scss/themes/materialize/variables.scss +1 -1
  102. package/src/scss/themes/semanticui/tabulator_semanticui.scss +53 -28
  103. package/src/scss/themes/semanticui/variables_table.scss +1 -1
  104. package/src/scss/themes/tabulator_midnight.scss +10 -6
  105. package/src/scss/themes/tabulator_modern.scss +16 -8
  106. package/src/scss/themes/tabulator_site.scss +8 -4
@@ -1,7 +1,7 @@
1
1
  export default function(cell, formatterParams, onRendered){
2
2
  var floatVal = parseFloat(cell.getValue()),
3
3
  sign = "",
4
- number, integer, decimal, rgx;
4
+ number, integer, decimal, rgx, value;
5
5
 
6
6
  var decimalSym = formatterParams.decimal || ".";
7
7
  var thousandSym = formatterParams.thousand || ",";
@@ -33,5 +33,12 @@ export default function(cell, formatterParams, onRendered){
33
33
  }
34
34
  }
35
35
 
36
- return after ? sign + integer + decimal + symbol : sign + symbol + integer + decimal;
36
+ value = integer + decimal;
37
+
38
+ if(sign === true){
39
+ value = "(" + value + ")";
40
+ return after ? value + symbol : symbol + value;
41
+ }else{
42
+ return after ? sign + value + symbol : sign + symbol + value;
43
+ }
37
44
  }
@@ -257,7 +257,7 @@ class FrozenColumns extends Module{
257
257
  layoutElement(element, column){
258
258
  var position;
259
259
 
260
- if(column.modules.frozen){
260
+ if(column.modules.frozen && element){
261
261
  element.style.position = "sticky";
262
262
 
263
263
  if(this.table.rtl){
@@ -71,7 +71,7 @@ class Group{
71
71
  this.arrowElement = document.createElement("div");
72
72
  this.arrowElement.classList.add("tabulator-group-toggle");
73
73
  this.arrowElement.appendChild(arrow);
74
-
74
+
75
75
  //setup movable rows
76
76
  if(this.groupManager.table.options.movableRows !== false && this.groupManager.table.modExists("moveRow")){
77
77
  this.groupManager.table.modules.moveRow.initializeGroupHeader(this);
@@ -94,9 +94,15 @@ class Group{
94
94
  toggleElement = this.groupManager.table.options.groupToggleElement == "arrow" ? this.arrowElement : this.element;
95
95
 
96
96
  toggleElement.addEventListener("click", (e) => {
97
- e.stopPropagation();
98
- e.stopImmediatePropagation();
99
- this.toggleVisibility();
97
+ if(this.groupManager.table.options.groupToggleElement === "arrow"){
98
+ e.stopPropagation();
99
+ e.stopImmediatePropagation();
100
+ }
101
+
102
+ //allow click event to propagate before toggling visibility
103
+ setTimeout(() => {
104
+ this.toggleVisibility();
105
+ });
100
106
  });
101
107
  }
102
108
  }
@@ -217,7 +223,7 @@ class Group{
217
223
  if(el.parentNode){
218
224
  el.parentNode.removeChild(el);
219
225
  }
220
-
226
+
221
227
  if(!this.groupManager.blockRedraw){
222
228
  this.generateGroupHeaderContents();
223
229
 
@@ -342,6 +348,7 @@ class Group{
342
348
  }
343
349
  return count;
344
350
  }
351
+
345
352
 
346
353
  toggleVisibility(){
347
354
  if(this.visible){
@@ -466,12 +473,18 @@ class Group{
466
473
  return output;
467
474
  }
468
475
 
469
- getRows(component){
476
+ getRows(component, includeChildren){
470
477
  var output = [];
471
478
 
472
- this.rows.forEach(function(row){
473
- output.push(component ? row.getComponent() : row);
474
- });
479
+ if(includeChildren && this.groupList.length){
480
+ this.groupList.forEach((group) => {
481
+ output = output.concat(group.getRows(component, includeChildren));
482
+ });
483
+ }else{
484
+ this.rows.forEach(function(row){
485
+ output.push(component ? row.getComponent() : row);
486
+ });
487
+ }
475
488
 
476
489
  return output;
477
490
  }
@@ -479,7 +492,9 @@ class Group{
479
492
  generateGroupHeaderContents(){
480
493
  var data = [];
481
494
 
482
- this.rows.forEach(function(row){
495
+ var rows = this.getRows(false, true);
496
+
497
+ rows.forEach(function(row){
483
498
  data.push(row.getData());
484
499
  });
485
500
 
@@ -584,6 +599,8 @@ class Group{
584
599
  clearCellHeight(){}
585
600
 
586
601
  deinitializeHeight(){}
602
+
603
+ rendered(){}
587
604
 
588
605
  //////////////// Object Generation /////////////////
589
606
  getComponent(){
@@ -55,6 +55,10 @@ class GroupComponent {
55
55
  this._group.toggleVisibility();
56
56
  }
57
57
 
58
+ scrollTo(position, ifVisible){
59
+ return this._group.groupManager.table.rowManager.scrollToRow(this._group, position, ifVisible);
60
+ }
61
+
58
62
  _getSelf(){
59
63
  return this._group;
60
64
  }
@@ -19,7 +19,9 @@ export default {
19
19
  },
20
20
 
21
21
  rowMove: function(action){
22
- this.table.rowManager.moveRowActual(action.component, this.table.rowManager.rows[action.data.posTo], action.data.after);
23
- this.table.rowManager.redraw();
22
+ this.table.rowManager.moveRowActual(action.component, this.table.rowManager.getRowFromPosition(action.data.posTo), action.data.after);
23
+
24
+ this.table.rowManager.regenerateRowPositions();
25
+ this.table.rowManager.reRenderInPosition();
24
26
  },
25
27
  };
@@ -19,7 +19,11 @@ export default {
19
19
  },
20
20
 
21
21
  rowMove: function(action){
22
- this.table.rowManager.moveRowActual(action.component, this.table.rowManager.rows[action.data.posFrom], !action.data.after);
23
- this.table.rowManager.redraw();
22
+ var after = (action.data.posFrom - action.data.posTo) > 0;
23
+
24
+ this.table.rowManager.moveRowActual(action.component, this.table.rowManager.getRowFromPosition(action.data.posFrom), after);
25
+
26
+ this.table.rowManager.regenerateRowPositions();
27
+ this.table.rowManager.reRenderInPosition();
24
28
  },
25
29
  };
@@ -134,8 +134,20 @@ class Interaction extends Module{
134
134
 
135
135
  this.subscribe("column-init", this.initializeColumn.bind(this));
136
136
  this.subscribe("cell-dblclick", this.cellContentsSelectionFixer.bind(this));
137
+ this.subscribe("scroll-horizontal", this.clearTouchWatchers.bind(this));
138
+ this.subscribe("scroll-vertical", this.clearTouchWatchers.bind(this));
137
139
  }
138
140
 
141
+ clearTouchWatchers(){
142
+ var types = Object.values(this.touchWatchers);
143
+
144
+ types.forEach((type) => {
145
+ for(let key in type){
146
+ type[key] = null;
147
+ }
148
+ });
149
+ }
150
+
139
151
  cellContentsSelectionFixer(e, cell){
140
152
  var range;
141
153
 
@@ -88,6 +88,7 @@ class Persistence extends Module{
88
88
  this.config = {
89
89
  sort:this.table.options.persistence === true || this.table.options.persistence.sort,
90
90
  filter:this.table.options.persistence === true || this.table.options.persistence.filter,
91
+ headerFilter:this.table.options.persistence === true || this.table.options.persistence.headerFilter,
91
92
  group:this.table.options.persistence === true || this.table.options.persistence.group,
92
93
  page:this.table.options.persistence === true || this.table.options.persistence.page,
93
94
  columns:this.table.options.persistence === true ? ["title", "width", "visible"] : this.table.options.persistence.columns,
@@ -138,6 +139,7 @@ class Persistence extends Module{
138
139
  this.subscribe("table-redraw", this.tableRedraw.bind(this));
139
140
 
140
141
  this.subscribe("filter-changed", this.eventSave.bind(this, "filter"));
142
+ this.subscribe("filter-changed", this.eventSave.bind(this, "headerFilter"));
141
143
  this.subscribe("sort-changed", this.eventSave.bind(this, "sort"));
142
144
  this.subscribe("group-changed", this.eventSave.bind(this, "group"));
143
145
  this.subscribe("page-changed", this.eventSave.bind(this, "page"));
@@ -157,7 +159,7 @@ class Persistence extends Module{
157
159
  }
158
160
 
159
161
  tableBuilt(){
160
- var sorters, filters;
162
+ var sorters, filters, headerFilters;
161
163
 
162
164
  if(this.config.sort){
163
165
  sorters = this.load("sort");
@@ -174,6 +176,14 @@ class Persistence extends Module{
174
176
  this.table.options.initialFilter = filters;
175
177
  }
176
178
  }
179
+ if(this.config.headerFilter){
180
+ headerFilters = this.load("headerFilter");
181
+
182
+ if(!headerFilters === false){
183
+ this.table.options.initialHeaderFilter = headerFilters;
184
+ }
185
+ }
186
+
177
187
  }
178
188
 
179
189
  tableRedraw(force){
@@ -334,6 +344,10 @@ class Persistence extends Module{
334
344
  data = this.table.modules.filter.getFilters();
335
345
  break;
336
346
 
347
+ case "headerFilter":
348
+ data = this.table.modules.filter.getHeaderFilters();
349
+ break;
350
+
337
351
  case "sort":
338
352
  data = this.validateSorters(this.table.modules.sort.getSort());
339
353
  break;
@@ -272,6 +272,9 @@ class ResponsiveLayout extends Module{
272
272
  getData:function(){
273
273
  return data;
274
274
  },
275
+ getType:function(){
276
+ return "cell";
277
+ },
275
278
  getElement:function(){
276
279
  return document.createElement("div");
277
280
  },
@@ -194,7 +194,7 @@ class SelectRow extends Module{
194
194
  }
195
195
 
196
196
  checkRowSelectability(row){
197
- if(row.type === "row"){
197
+ if(row && row.type === "row"){
198
198
  return this.table.options.selectableCheck.call(this.table, row.getComponent());
199
199
  }
200
200
 
@@ -214,48 +214,44 @@ class SelectRow extends Module{
214
214
 
215
215
  //select a number of rows
216
216
  selectRows(rows){
217
- var rowMatch;
217
+ var changes = [],
218
+ rowMatch, change;
218
219
 
219
220
  switch(typeof rows){
220
221
  case "undefined":
221
- this.table.rowManager.rows.forEach((row) => {
222
- this._selectRow(row, true, true);
223
- });
224
-
225
- this._rowSelectionChanged();
222
+ rowMatch = this.table.rowManager.rows;
226
223
  break;
227
224
 
228
225
  case "string":
229
226
  rowMatch = this.table.rowManager.findRow(rows);
230
227
 
231
- if(rowMatch){
232
- this._selectRow(rowMatch, true, true);
233
- this._rowSelectionChanged();
234
- }else{
228
+ if(!rowMatch){
235
229
  rowMatch = this.table.rowManager.getRows(rows);
236
-
237
- rowMatch.forEach((row) => {
238
- this._selectRow(row, true, true);
239
- });
240
-
241
- if(rowMatch.length){
242
- this._rowSelectionChanged();
243
- }
244
230
  }
245
231
  break;
246
232
 
247
233
  default:
248
- if(Array.isArray(rows)){
249
- rows.forEach((row) => {
250
- this._selectRow(row, true, true);
251
- });
252
-
253
- this._rowSelectionChanged();
254
- }else{
255
- this._selectRow(rows, false, true);
256
- }
234
+ rowMatch = rows;
257
235
  break;
258
236
  }
237
+
238
+ if(Array.isArray(rowMatch)){
239
+ if(rowMatch.length){
240
+ rowMatch.forEach((row) => {
241
+ change = this._selectRow(row, true, true);
242
+
243
+ if(change){
244
+ changes.push(change);
245
+ }
246
+ });
247
+
248
+ this._rowSelectionChanged(false, changes);
249
+ }
250
+ }else{
251
+ if(rowMatch){
252
+ this._selectRow(rowMatch, false, true);
253
+ }
254
+ }
259
255
  }
260
256
 
261
257
  //select an individual row
@@ -293,7 +289,9 @@ class SelectRow extends Module{
293
289
 
294
290
  this.dispatchExternal("rowSelected", row.getComponent());
295
291
 
296
- this._rowSelectionChanged(silent);
292
+ this._rowSelectionChanged(silent, row);
293
+
294
+ return row;
297
295
  }
298
296
  }else{
299
297
  if(!silent){
@@ -308,39 +306,51 @@ class SelectRow extends Module{
308
306
 
309
307
  //deselect a number of rows
310
308
  deselectRows(rows, silent){
311
- var self = this,
312
- rowCount;
309
+ var changes = [],
310
+ rowMatch, change;
313
311
 
314
- if(typeof rows == "undefined"){
312
+ switch(typeof rows){
313
+ case "undefined":
314
+ rowMatch = Object.assign([], this.selectedRows);
315
+ break;
315
316
 
316
- rowCount = self.selectedRows.length;
317
+ case "string":
318
+ rowMatch = this.table.rowManager.findRow(rows);
317
319
 
318
- for(let i = 0; i < rowCount; i++){
319
- self._deselectRow(self.selectedRows[0], true);
320
- }
320
+ if(!rowMatch){
321
+ rowMatch = this.table.rowManager.getRows(rows);
322
+ }
323
+ break;
321
324
 
322
- if(rowCount){
323
- self._rowSelectionChanged(silent);
325
+ default:
326
+ rowMatch = rows;
327
+ break;
328
+ }
329
+
330
+ if(Array.isArray(rowMatch)){
331
+ if(rowMatch.length){
332
+ rowMatch.forEach((row) => {
333
+ change = this._deselectRow(row, true, true);
334
+
335
+ if(change){
336
+ changes.push(change);
337
+ }
338
+ });
339
+
340
+ this._rowSelectionChanged(silent, [], changes);
324
341
  }
325
-
326
342
  }else{
327
- if(Array.isArray(rows)){
328
- rows.forEach(function(row){
329
- self._deselectRow(row, true);
330
- });
331
-
332
- self._rowSelectionChanged(silent);
333
- }else{
334
- self._deselectRow(rows, silent);
343
+ if(rowMatch){
344
+ this._deselectRow(rowMatch, silent, true);
335
345
  }
336
- }
346
+ }
337
347
  }
338
348
 
339
349
  //deselect an individual row
340
350
  _deselectRow(rowInfo, silent){
341
351
  var self = this,
342
352
  row = self.table.rowManager.findRow(rowInfo),
343
- index;
353
+ index, element;
344
354
 
345
355
  if(row){
346
356
  index = self.selectedRows.findIndex(function(selectedRow){
@@ -348,8 +358,13 @@ class SelectRow extends Module{
348
358
  });
349
359
 
350
360
  if(index > -1){
361
+
362
+ element = row.getElement();
363
+
364
+ if(element){
365
+ element.classList.remove("tabulator-selected");
366
+ }
351
367
 
352
- row.getElement().classList.remove("tabulator-selected");
353
368
  if(!row.modules.select){
354
369
  row.modules.select = {};
355
370
  }
@@ -366,7 +381,9 @@ class SelectRow extends Module{
366
381
 
367
382
  this.dispatchExternal("rowDeselected", row.getComponent());
368
383
 
369
- self._rowSelectionChanged(silent);
384
+ self._rowSelectionChanged(silent, undefined, row);
385
+
386
+ return row;
370
387
  }
371
388
  }else{
372
389
  if(!silent){
@@ -386,7 +403,6 @@ class SelectRow extends Module{
386
403
  }
387
404
 
388
405
  getSelectedRows(){
389
-
390
406
  var rows = [];
391
407
 
392
408
  this.selectedRows.forEach(function(row){
@@ -396,7 +412,7 @@ class SelectRow extends Module{
396
412
  return rows;
397
413
  }
398
414
 
399
- _rowSelectionChanged(silent){
415
+ _rowSelectionChanged(silent, selected = [], deselected = []){
400
416
  if(this.headerCheckboxElement){
401
417
  if(this.selectedRows.length === 0){
402
418
  this.headerCheckboxElement.checked = false;
@@ -411,7 +427,19 @@ class SelectRow extends Module{
411
427
  }
412
428
 
413
429
  if(!silent){
414
- this.dispatchExternal("rowSelectionChanged", this.getSelectedData(), this.getSelectedRows());
430
+ if(!Array.isArray(selected)){
431
+ selected = [selected];
432
+ }
433
+
434
+ selected = selected.map(row => row.getComponent());
435
+
436
+ if(!Array.isArray(deselected)){
437
+ deselected = [deselected];
438
+ }
439
+
440
+ deselected = deselected.map(row => row.getComponent());
441
+
442
+ this.dispatchExternal("rowSelectionChanged", this.getSelectedData(), this.getSelectedRows(), selected, deselected);
415
443
  }
416
444
  }
417
445