tabulator-tables 5.2.3 → 5.2.6

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/dist/css/tabulator.css +4 -4
  3. package/dist/css/tabulator.css.map +1 -1
  4. package/dist/css/tabulator.min.css +1 -1
  5. package/dist/css/tabulator.min.css.map +1 -1
  6. package/dist/css/tabulator_bootstrap3.css +4 -4
  7. package/dist/css/tabulator_bootstrap3.css.map +1 -1
  8. package/dist/css/tabulator_bootstrap3.min.css +1 -1
  9. package/dist/css/tabulator_bootstrap3.min.css.map +1 -1
  10. package/dist/css/tabulator_bootstrap4.css +4 -4
  11. package/dist/css/tabulator_bootstrap4.css.map +1 -1
  12. package/dist/css/tabulator_bootstrap4.min.css +1 -1
  13. package/dist/css/tabulator_bootstrap4.min.css.map +1 -1
  14. package/dist/css/tabulator_bootstrap5.css +45 -36
  15. package/dist/css/tabulator_bootstrap5.css.map +1 -1
  16. package/dist/css/tabulator_bootstrap5.min.css +1 -1
  17. package/dist/css/tabulator_bootstrap5.min.css.map +1 -1
  18. package/dist/css/tabulator_bulma.css +16 -4
  19. package/dist/css/tabulator_bulma.css.map +1 -1
  20. package/dist/css/tabulator_bulma.min.css +1 -1
  21. package/dist/css/tabulator_bulma.min.css.map +1 -1
  22. package/dist/css/tabulator_materialize.css +4 -4
  23. package/dist/css/tabulator_materialize.css.map +1 -1
  24. package/dist/css/tabulator_materialize.min.css +1 -1
  25. package/dist/css/tabulator_materialize.min.css.map +1 -1
  26. package/dist/css/tabulator_midnight.css +4 -4
  27. package/dist/css/tabulator_midnight.css.map +1 -1
  28. package/dist/css/tabulator_midnight.min.css +1 -1
  29. package/dist/css/tabulator_midnight.min.css.map +1 -1
  30. package/dist/css/tabulator_modern.css +4 -4
  31. package/dist/css/tabulator_modern.css.map +1 -1
  32. package/dist/css/tabulator_modern.min.css +1 -1
  33. package/dist/css/tabulator_modern.min.css.map +1 -1
  34. package/dist/css/tabulator_semanticui.css +4 -4
  35. package/dist/css/tabulator_semanticui.css.map +1 -1
  36. package/dist/css/tabulator_semanticui.min.css +1 -1
  37. package/dist/css/tabulator_semanticui.min.css.map +1 -1
  38. package/dist/css/tabulator_simple.css +4 -4
  39. package/dist/css/tabulator_simple.css.map +1 -1
  40. package/dist/css/tabulator_simple.min.css +1 -1
  41. package/dist/css/tabulator_simple.min.css.map +1 -1
  42. package/dist/css/tabulator_site.css +4 -4
  43. package/dist/css/tabulator_site.css.map +1 -1
  44. package/dist/css/tabulator_site.min.css +1 -1
  45. package/dist/css/tabulator_site.min.css.map +1 -1
  46. package/dist/js/tabulator.js +99 -135
  47. package/dist/js/tabulator.js.map +1 -1
  48. package/dist/js/tabulator.min.js +2 -2
  49. package/dist/js/tabulator.min.js.map +1 -1
  50. package/dist/js/tabulator_esm.js +72 -109
  51. package/dist/js/tabulator_esm.js.map +1 -1
  52. package/dist/js/tabulator_esm.min.js +2 -2
  53. package/dist/js/tabulator_esm.min.js.map +1 -1
  54. package/package.json +1 -1
  55. package/src/js/core/CoreFeature.js +2 -2
  56. package/src/js/core/RowManager.js +1 -1
  57. package/src/js/core/cell/Cell.js +1 -2
  58. package/src/js/core/column/Column.js +1 -81
  59. package/src/js/core/rendering/Renderer.js +2 -0
  60. package/src/js/core/tools/DataLoader.js +3 -3
  61. package/src/js/core/tools/Popup.js +6 -0
  62. package/src/js/modules/DataTree/DataTree.js +4 -0
  63. package/src/js/modules/Download/defaults/downloaders/csv.js +2 -3
  64. package/src/js/modules/Download/defaults/downloaders/pdf.js +2 -3
  65. package/src/js/modules/Edit/List.js +3 -3
  66. package/src/js/modules/Export/Export.js +1 -2
  67. package/src/js/modules/Filter/Filter.js +1 -1
  68. package/src/js/modules/FrozenColumns/FrozenColumns.js +4 -2
  69. package/src/js/modules/GroupRows/GroupRows.js +4 -0
  70. package/src/js/modules/Interaction/Interaction.js +3 -3
  71. package/src/js/modules/Page/Page.js +1 -2
  72. package/src/js/modules/ResizeColumns/ResizeColumns.js +38 -7
  73. package/src/js/modules/Sort/Sort.js +2 -2
  74. package/src/scss/tabulator.scss +2 -2
  75. package/src/scss/themes/bootstrap/tabulator_bootstrap5.scss +41 -32
  76. package/src/scss/themes/bulma/tabulator_bulma.scss +47 -32
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "tabulator-tables",
3
- "version": "5.2.3",
3
+ "version": "5.2.6",
4
4
  "description": "Interactive table generation JavaScript library",
5
5
  "style": "dist/css/tabulator.css",
6
6
  "main": "dist/js/tabulator.js",
@@ -8,8 +8,8 @@ export default class CoreFeature{
8
8
  /////////////// DataLoad /////////////////
9
9
  //////////////////////////////////////////
10
10
 
11
- reloadData(data, silent){
12
- return this.table.dataLoader.load(data, undefined, undefined, undefined, silent);
11
+ reloadData(data, silent, columnsChanged){
12
+ return this.table.dataLoader.load(data, undefined, undefined, undefined, silent, columnsChanged);
13
13
  }
14
14
 
15
15
  //////////////////////////////////////////
@@ -51,7 +51,7 @@ export default class RowManager extends CoreFeature{
51
51
 
52
52
  el.classList.add("tabulator-tableholder");
53
53
  el.setAttribute("tabindex", 0);
54
- el.setAttribute("role", "rowgroup");
54
+ // el.setAttribute("role", "rowgroup");
55
55
 
56
56
  return el;
57
57
  }
@@ -118,7 +118,6 @@ export default class Cell extends CoreFeature{
118
118
  }
119
119
  break;
120
120
  case "undefined":
121
- case "null":
122
121
  this.element.innerHTML = "";
123
122
  break;
124
123
  default:
@@ -294,4 +293,4 @@ export default class Cell extends CoreFeature{
294
293
 
295
294
  return this.component;
296
295
  }
297
- }
296
+ }
@@ -158,8 +158,6 @@ class Column extends CoreFeature{
158
158
  }
159
159
  }
160
160
 
161
- this.contentElement = this._bindEvents();
162
-
163
161
  this.contentElement = this._buildColumnHeaderContent();
164
162
 
165
163
  this.element.appendChild(this.contentElement);
@@ -173,83 +171,6 @@ class Column extends CoreFeature{
173
171
  this.dispatch("column-init", this);
174
172
  }
175
173
 
176
- _bindEvents(){
177
- var def = this.definition,
178
- dblTap, tapHold, tap;
179
-
180
- //setup header click event bindings
181
- if(typeof(def.headerClick) == "function"){
182
- this.element.addEventListener("click", (e) => {def.headerClick(e, this.getComponent());});
183
- }
184
-
185
- if(typeof(def.headerDblClick) == "function"){
186
- this.element.addEventListener("dblclick", (e) => {def.headerDblClick(e, this.getComponent());});
187
- }
188
-
189
- if(typeof(def.headerContext) == "function"){
190
- this.element.addEventListener("contextmenu", (e) => {def.headerContext(e, this.getComponent());});
191
- }
192
-
193
- //setup header tap event bindings
194
- if(typeof(def.headerTap) == "function"){
195
- tap = false;
196
-
197
- this.element.addEventListener("touchstart", (e) => {
198
- tap = true;
199
- }, {passive: true});
200
-
201
- this.element.addEventListener("touchend", (e) => {
202
- if(tap){
203
- def.headerTap(e, this.getComponent());
204
- }
205
-
206
- tap = false;
207
- });
208
- }
209
-
210
- if(typeof(def.headerDblTap) == "function"){
211
- dblTap = null;
212
-
213
- this.element.addEventListener("touchend", (e) => {
214
-
215
- if(dblTap){
216
- clearTimeout(dblTap);
217
- dblTap = null;
218
-
219
- def.headerDblTap(e, this.getComponent());
220
- }else{
221
-
222
- dblTap = setTimeout(() => {
223
- clearTimeout(dblTap);
224
- dblTap = null;
225
- }, 300);
226
- }
227
-
228
- });
229
- }
230
-
231
- if(typeof(def.headerTapHold) == "function"){
232
- tapHold = null;
233
-
234
- this.element.addEventListener("touchstart", (e) => {
235
- clearTimeout(tapHold);
236
-
237
- tapHold = setTimeout(function(){
238
- clearTimeout(tapHold);
239
- tapHold = null;
240
- tap = false;
241
- def.headerTapHold(e, this.getComponent());
242
- }, 1000);
243
-
244
- }, {passive: true});
245
-
246
- this.element.addEventListener("touchend", (e) => {
247
- clearTimeout(tapHold);
248
- tapHold = null;
249
- });
250
- }
251
- }
252
-
253
174
  //build header element for header
254
175
  _buildColumnHeader(){
255
176
  var def = this.definition,
@@ -377,7 +298,6 @@ class Column extends CoreFeature{
377
298
  }
378
299
  break;
379
300
  case "undefined":
380
- case "null":
381
301
  el.innerHTML = "";
382
302
  break;
383
303
  default:
@@ -999,4 +919,4 @@ class Column extends CoreFeature{
999
919
 
1000
920
  Column.defaultOptionList = defaultOptions;
1001
921
 
1002
- export default Column;
922
+ export default Column;
@@ -186,6 +186,8 @@ export default class Renderer extends CoreFeature{
186
186
  this.elementVertical.scrollTop = this.elementVertical.scrollTop - this.elementVertical.clientHeight + rowEl.offsetHeight;
187
187
  }
188
188
 
189
+ break;
190
+
189
191
  case "top":
190
192
  this.elementVertical.scrollTop = rowEl.offsetTop;
191
193
  break;
@@ -10,7 +10,7 @@ export default class DataLoader extends CoreFeature{
10
10
 
11
11
  initialize(){}
12
12
 
13
- load(data, params, config, replace, silent){
13
+ load(data, params, config, replace, silent, columnsChanged){
14
14
  var requestNo = ++this.requestOrder;
15
15
 
16
16
  this.dispatchExternal("dataLoading", data);
@@ -46,7 +46,7 @@ export default class DataLoader extends CoreFeature{
46
46
 
47
47
  if(rowData !== false){
48
48
  this.dispatchExternal("dataLoaded", rowData);
49
- this.table.rowManager.setData(rowData, replace, !replace);
49
+ this.table.rowManager.setData(rowData, replace, typeof columnsChanged === "undefined" ? !replace : columnsChanged);
50
50
  }
51
51
  }else{
52
52
  console.warn("Data Load Response Blocked - An active data load request was blocked by an attempt to change table data while the request was being made");
@@ -73,7 +73,7 @@ export default class DataLoader extends CoreFeature{
73
73
  data = [];
74
74
  }
75
75
 
76
- this.table.rowManager.setData(data, replace, !replace);
76
+ this.table.rowManager.setData(data, replace, typeof columnsChanged === "undefined" ? !replace : columnsChanged);
77
77
  return Promise.resolve();
78
78
  }
79
79
  }
@@ -22,6 +22,8 @@ export default class Popup extends CoreFeature{
22
22
 
23
23
  this.blurEvent = this.hide.bind(this, false);
24
24
  this.escEvent = this._escapeCheck.bind(this);
25
+
26
+ this.destroyBinding = this.hide.bind(this, true);
25
27
  }
26
28
 
27
29
  _lookupContainer(){
@@ -139,6 +141,8 @@ export default class Popup extends CoreFeature{
139
141
  this._fitToScreen(x, y, parentEl, parentOffset, position);
140
142
 
141
143
  this.visible = true;
144
+
145
+ this.subscribe("table-destroy", this.destroyBinding);
142
146
 
143
147
  return this;
144
148
  }
@@ -234,6 +238,8 @@ export default class Popup extends CoreFeature{
234
238
  if(this.blurCallback && !silent){
235
239
  this.blurCallback();
236
240
  }
241
+
242
+ this.unsubscribe("table-destroy", this.destroyBinding);
237
243
  }
238
244
 
239
245
  return this;
@@ -432,6 +432,10 @@ class DataTree extends Module{
432
432
  return row.modules.dataTree.parent ? row.modules.dataTree.parent.getComponent() : false;
433
433
  }
434
434
 
435
+ getTreeParentRoot(row){
436
+ return row.modules.dataTree.parent ? this.getTreeParentRoot(row.modules.dataTree.parent) : row;
437
+ }
438
+
435
439
  getFilteredTreeChildren(row){
436
440
  var config = row.modules.dataTree,
437
441
  output = [], children;
@@ -30,11 +30,10 @@ export default function(list, options, setFileContents){
30
30
 
31
31
  switch(typeof col.value){
32
32
  case "object":
33
- col.value = JSON.stringify(col.value);
33
+ col.value = col.value !== null ? JSON.stringify(col.value) : "";
34
34
  break;
35
35
 
36
36
  case "undefined":
37
- case "null":
38
37
  col.value = "";
39
38
  break;
40
39
  }
@@ -59,4 +58,4 @@ export default function(list, options, setFileContents){
59
58
  }
60
59
 
61
60
  setFileContents(fileContents, "text/csv");
62
- };
61
+ };
@@ -57,11 +57,10 @@ export default function(list, options, setFileContents){
57
57
  if(col){
58
58
  switch(typeof col.value){
59
59
  case "object":
60
- col.value = JSON.stringify(col.value);
60
+ col.value = col.value !== null ? JSON.stringify(col.value) : "";
61
61
  break;
62
62
 
63
63
  case "undefined":
64
- case "null":
65
64
  col.value = "";
66
65
  break;
67
66
  }
@@ -111,4 +110,4 @@ export default function(list, options, setFileContents){
111
110
  }
112
111
 
113
112
  setFileContents(doc.output("arraybuffer"), "application/pdf");
114
- };
113
+ };
@@ -70,7 +70,7 @@ export default class Edit{
70
70
  this.initialValues = this.params.multiselect ? initialValue : [initialValue];
71
71
 
72
72
  if(this.isFilter){
73
- this.input.value = this.initialValues.join(",");
73
+ this.input.value = this.initialValues ? this.initialValues.join(",") : "";
74
74
  this.headerFilterInitialListGen();
75
75
  }
76
76
  }
@@ -475,7 +475,7 @@ export default class Edit{
475
475
  values = this._ajaxRequest(this.params.valuesURL, this.input.value);
476
476
  }else{
477
477
  if(typeof this.params.valuesLookup === "function"){
478
- values = this.params.valuesLookup(cell, this.input.value);
478
+ values = this.params.valuesLookup(this.cell, this.input.value);
479
479
  }else if(this.params.valuesLookup){
480
480
  values = this._uniqueColumnValues(this.params.valuesLookupField);
481
481
  }
@@ -994,4 +994,4 @@ export default class Edit{
994
994
  }
995
995
  }
996
996
 
997
- }
997
+ }
@@ -510,11 +510,10 @@ class Export extends Module{
510
510
  }else{
511
511
  switch(typeof value){
512
512
  case "object":
513
- value = JSON.stringify(value);
513
+ value = value !== null ? JSON.stringify(value) : "";
514
514
  break;
515
515
 
516
516
  case "undefined":
517
- case "null":
518
517
  value = "";
519
518
  break;
520
519
 
@@ -556,7 +556,7 @@ class Filter extends Module{
556
556
  refreshFilter(){
557
557
  if(this.tableInitialized){
558
558
  if(this.table.options.filterMode === "remote"){
559
- this.reloadData();
559
+ this.reloadData(null, false, false);
560
560
  }else{
561
561
  this.refreshData(true);
562
562
  }
@@ -178,7 +178,8 @@ class FrozenColumns extends Module{
178
178
  this.table.columnManager.element.style.paddingRight = this.rightMargin;
179
179
 
180
180
  this.leftColumns.forEach((column, i) => {
181
- column.modules.frozen.margin = (leftMargin + this.table.columnManager.scrollLeft) + "px";
181
+ column.modules.frozen.marginValue = leftMargin + this.table.columnManager.scrollLeft;
182
+ column.modules.frozen.margin = column.modules.frozen.marginValue + "px";
182
183
 
183
184
  if(column.visible){
184
185
  leftMargin += column.getWidth();
@@ -217,7 +218,8 @@ class FrozenColumns extends Module{
217
218
  rightMargin += column.getWidth();
218
219
  }
219
220
 
220
- column.modules.frozen.margin = (this.rightPadding - rightMargin) + "px";
221
+ column.modules.frozen.marginValue = this.rightPadding - rightMargin;
222
+ column.modules.frozen.margin = column.modules.frozen.marginValue + "px";
221
223
 
222
224
  if(i == this.rightColumns.length - 1){
223
225
  column.modules.frozen.edge = true;
@@ -436,6 +436,10 @@ class GroupRows extends Module{
436
436
  getRowGroup(row){
437
437
  var match = false;
438
438
 
439
+ if(this.options("dataTree")){
440
+ row = this.table.modules.dataTree.getTreeParentRoot(row);
441
+ }
442
+
439
443
  this.groupList.forEach((group) => {
440
444
  var result = group.getRowGroup(row);
441
445
 
@@ -1,8 +1,8 @@
1
1
  import Module from '../../core/Module.js';
2
2
  import Helpers from '../../core/tools/Helpers.js';
3
3
 
4
- import Cell from '../../core/cell/Cell';
5
- import Column from '../../core/column/Column';
4
+ import Cell from '../../core/cell/Cell.js';
5
+ import Column from '../../core/column/Column.js';
6
6
 
7
7
  class Interaction extends Module{
8
8
 
@@ -311,4 +311,4 @@ class Interaction extends Module{
311
311
 
312
312
  Interaction.moduleName = "interaction";
313
313
 
314
- export default Interaction;
314
+ export default Interaction;
@@ -609,7 +609,6 @@ class Page extends Module{
609
609
  }
610
610
  break;
611
611
  case "undefined":
612
- case "null":
613
612
  this.pageCounterElement.innerHTML = "";
614
613
  break;
615
614
  default:
@@ -895,4 +894,4 @@ Page.moduleName = "page";
895
894
  //load defaults
896
895
  Page.pageCounters = defaultPageCounters;
897
896
 
898
- export default Page;
897
+ export default Page;
@@ -33,6 +33,7 @@ class ResizeColumns extends Module{
33
33
 
34
34
  this.subscribe("column-hide", this.deInitializeColumn.bind(this));
35
35
  this.subscribe("column-show", this.columnLayoutUpdated.bind(this));
36
+ this.subscribe("column-width", this.columnWidthUpdated.bind(this));
36
37
 
37
38
  this.subscribe("column-delete", this.deInitializeComponent.bind(this));
38
39
  this.subscribe("column-height", this.resizeHandle.bind(this));
@@ -67,14 +68,39 @@ class ResizeColumns extends Module{
67
68
  }
68
69
  }
69
70
 
71
+ columnWidthUpdated(column){
72
+ if(column.modules.frozen){
73
+ if(this.table.modules.frozenColumns.leftColumns.includes(column)){
74
+ this.table.modules.frozenColumns.leftColumns.forEach((col) => {
75
+ this.reinitializeColumn(col);
76
+ });
77
+ }else if(this.table.modules.frozenColumns.rightColumns.includes(column)){
78
+ this.table.modules.frozenColumns.rightColumns.forEach((col) => {
79
+ this.reinitializeColumn(col);
80
+ });
81
+ }
82
+ }
83
+ }
84
+
70
85
  reinitializeColumn(column){
86
+ var frozenOffset = column.modules.frozen ? (column.modules.frozen.marginValue + column.getWidth() + "px") : false;
87
+ ;
88
+
71
89
  column.cells.forEach((cell) => {
72
90
  if(cell.modules.resize && cell.modules.resize.handleEl){
91
+ if(frozenOffset){
92
+ cell.modules.resize.handleEl.style.left = frozenOffset;
93
+ }
94
+
73
95
  cell.element.after(cell.modules.resize.handleEl);
74
96
  }
75
97
  });
76
98
 
77
99
  if(column.modules.resize && column.modules.resize.handleEl){
100
+ if(frozenOffset){
101
+ column.modules.resize.handleEl.style.left = frozenOffset;
102
+ }
103
+
78
104
  column.element.after(column.modules.resize.handleEl);
79
105
  }
80
106
  }
@@ -123,9 +149,14 @@ class ResizeColumns extends Module{
123
149
  }
124
150
  });
125
151
 
152
+ if(column.modules.frozen){
153
+ handle.style.position = "absolute";
154
+ handle.style.left = column.modules.frozen.marginValue + column.getWidth() + "px";
155
+ }
156
+
126
157
  config.handleEl = handle;
127
158
 
128
- if(element.parentNode){
159
+ if(element.parentNode && column.visible){
129
160
  element.after(handle);
130
161
  }
131
162
  }
@@ -173,27 +204,27 @@ class ResizeColumns extends Module{
173
204
  startDiff = x - self.startX,
174
205
  moveDiff = x - self.latestX,
175
206
  blockedBefore, blockedAfter;
176
-
207
+
177
208
  self.latestX = x;
178
209
 
179
210
  if(self.table.rtl){
180
211
  startDiff = -startDiff;
181
212
  moveDiff = -moveDiff;
182
213
  }
183
-
214
+
184
215
  blockedBefore = column.width == column.minWidth || column.width == column.maxWidth;
185
-
216
+
186
217
  column.setWidth(self.startWidth + startDiff);
187
-
218
+
188
219
  blockedAfter = column.width == column.minWidth || column.width == column.maxWidth;
189
-
220
+
190
221
  if(moveDiff < 0){
191
222
  self.nextColumn = self.initialNextColumn;
192
223
  }
193
224
 
194
225
  if(self.table.options.resizableColumnFit && self.nextColumn && !(blockedBefore && blockedAfter)){
195
226
  let colWidth = self.nextColumn.getWidth();
196
-
227
+
197
228
  if(moveDiff > 0){
198
229
  if(colWidth <= self.nextColumn.minWidth){
199
230
  self.nextColumn = self.nextColumn.nextColumn();
@@ -204,7 +204,7 @@ class Sort extends Module{
204
204
 
205
205
  refreshSort(){
206
206
  if(this.table.options.sortMode === "remote"){
207
- this.reloadData();
207
+ this.reloadData(null, false, false);
208
208
  }else{
209
209
  this.refreshData(true);
210
210
  }
@@ -378,7 +378,7 @@ class Sort extends Module{
378
378
  //set the column header sort direction
379
379
  setColumnHeader(column, dir){
380
380
  column.modules.sort.dir = dir;
381
- column.getElement().setAttribute("aria-sort", dir);
381
+ column.getElement().setAttribute("aria-sort", dir === "asc" ? "ascending" : "descending");
382
382
  }
383
383
 
384
384
  //sort each item in sort list
@@ -244,7 +244,7 @@ $footerActiveColor:#d00 !default; //footer bottom active text color
244
244
  }
245
245
  }
246
246
 
247
- &[aria-sort="asc"]{
247
+ &[aria-sort="ascending"]{
248
248
  .tabulator-col-content .tabulator-col-sorter{
249
249
  color: $sortArrowActive;
250
250
 
@@ -256,7 +256,7 @@ $footerActiveColor:#d00 !default; //footer bottom active text color
256
256
  }
257
257
  }
258
258
 
259
- &[aria-sort="desc"]{
259
+ &[aria-sort="descending"]{
260
260
  .tabulator-col-content .tabulator-col-sorter{
261
261
  color: $sortArrowActive;
262
262