tabulator-tables 5.2.1 → 5.2.4

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 (71) hide show
  1. package/bower.json +1 -1
  2. package/dist/css/tabulator.css +1 -1
  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 +1 -1
  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 +1 -1
  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 +17 -1
  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 +1 -1
  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 +1 -1
  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 +1 -1
  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 +1 -1
  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 +1 -1
  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 +1 -1
  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 +1 -1
  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 +137 -80
  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 +110 -63
  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 +2 -0
  57. package/src/js/core/rendering/Renderer.js +2 -0
  58. package/src/js/core/tools/DataLoader.js +3 -3
  59. package/src/js/modules/DataTree/DataTree.js +17 -0
  60. package/src/js/modules/Edit/List.js +3 -3
  61. package/src/js/modules/Filter/Filter.js +1 -1
  62. package/src/js/modules/FrozenColumns/FrozenColumns.js +33 -41
  63. package/src/js/modules/GroupRows/GroupRows.js +4 -0
  64. package/src/js/modules/MoveColumns/MoveColumns.js +1 -1
  65. package/src/js/modules/Persistence/Persistence.js +1 -0
  66. package/src/js/modules/ResizeColumns/ResizeColumns.js +38 -7
  67. package/src/js/modules/Sort/Sort.js +1 -1
  68. package/src/js/modules/Sort/defaults/sorters/datetime.js +1 -1
  69. package/src/js/modules/Validate/Validate.js +3 -3
  70. package/src/scss/tabulator.scss +1 -1
  71. package/src/scss/themes/bootstrap/tabulator_bootstrap5.scss +20 -0
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "tabulator-tables",
3
- "version": "5.2.1",
3
+ "version": "5.2.4",
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
  //////////////////////////////////////////
@@ -848,7 +848,9 @@ export default class RowManager extends CoreFeature{
848
848
  this.redrawBlockRenderInPosition = true;
849
849
  }
850
850
  }else{
851
+ this.dispatchExternal("renderStarted");
851
852
  this.renderer.rerenderRows(callback);
853
+ this.dispatchExternal("renderComplete");
852
854
  }
853
855
  }
854
856
 
@@ -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
+ case "top":
190
+ this.elementVertical.scrollTop = rowEl.offsetTop;
189
191
  break;
190
192
  }
191
193
 
@@ -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
  }
@@ -122,11 +122,24 @@ class DataTree extends Module{
122
122
  this.subscribe("edit-cancelled", this.cellValueChanged.bind(this));
123
123
  this.subscribe("column-moving-rows", this.columnMoving.bind(this));
124
124
  this.subscribe("table-built", this.initializeElementField.bind(this));
125
+ this.subscribe("table-redrawing", this.tableRedrawing.bind(this));
125
126
 
126
127
  this.registerDisplayHandler(this.getRows.bind(this), 30);
127
128
  }
128
129
  }
129
130
 
131
+ tableRedrawing(force){
132
+ var rows;
133
+
134
+ if(force){
135
+ rows = this.table.rowManager.getRows();
136
+
137
+ rows.forEach((row) => {
138
+ this.reinitializeRowChildren(row);
139
+ });
140
+ }
141
+ }
142
+
130
143
  initializeElementField(){
131
144
  var firstCol = this.table.columnManager.getFirstVisibleColumn();
132
145
 
@@ -419,6 +432,10 @@ class DataTree extends Module{
419
432
  return row.modules.dataTree.parent ? row.modules.dataTree.parent.getComponent() : false;
420
433
  }
421
434
 
435
+ getTreeParentRoot(row){
436
+ return row.modules.dataTree.parent ? this.getTreeParentRoot(row.modules.dataTree.parent) : row;
437
+ }
438
+
422
439
  getFilteredTreeChildren(row){
423
440
  var config = row.modules.dataTree,
424
441
  output = [], children;
@@ -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
  }
@@ -990,8 +990,8 @@ export default class Edit{
990
990
  this.actions.success(output);
991
991
 
992
992
  if(this.isFilter){
993
- this.initialValues = output;
993
+ this.initialValues = output && !Array.isArray[output] ? [output] : output;
994
994
  }
995
995
  }
996
996
 
997
- }
997
+ }
@@ -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
  }
@@ -12,7 +12,6 @@ class FrozenColumns extends Module{
12
12
  this.rightPadding = 0;
13
13
  this.initializationMode = "left";
14
14
  this.active = false;
15
- this.scrollEndTimer = false;
16
15
  this.blocked = true;
17
16
 
18
17
  this.registerColumnOption("frozen");
@@ -41,10 +40,10 @@ class FrozenColumns extends Module{
41
40
  this.subscribe("scroll-horizontal", this.scrollHorizontal.bind(this));
42
41
  this.subscribe("scroll-horizontal", this.scrollHorizontal.bind(this));
43
42
  this.subscribe("columns-loading", this.reset.bind(this));
44
-
43
+
45
44
  this.subscribe("column-add", this.reinitializeColumns.bind(this));
46
45
  this.subscribe("column-delete", this.reinitializeColumns.bind(this));
47
-
46
+
48
47
  this.subscribe("table-redraw", this.layout.bind(this));
49
48
  this.subscribe("layout-refreshing", this.blockLayout.bind(this));
50
49
  this.subscribe("layout-refreshed", this.unblockLayout.bind(this));
@@ -61,10 +60,10 @@ class FrozenColumns extends Module{
61
60
  layoutCell(cell){
62
61
  this.layoutElement(cell.element, cell.column)
63
62
  }
64
-
63
+
65
64
  reinitializeColumns(){
66
65
  this.reset();
67
-
66
+
68
67
  this.table.columnManager.columnsByIndex.forEach((column) => {
69
68
  this.initializeColumn(column);
70
69
  });
@@ -111,22 +110,14 @@ class FrozenColumns extends Module{
111
110
  scrollHorizontal(){
112
111
  var rows;
113
112
 
114
- if(this.active){
115
- clearTimeout(this.scrollEndTimer);
116
-
117
- rows = this.table.rowManager.getVisibleRows();
118
-
113
+ if(this.active){
119
114
  this.calcMargins(true);
120
115
 
121
116
  this.layoutColumnPosition();
122
117
 
123
118
  this.layoutCalcRows();
124
119
 
125
- rows.forEach((row) => {
126
- if(row.type === "row"){
127
- this.layoutRow(row);
128
- }
129
- });
120
+ this.reinitializeRows();
130
121
  }
131
122
  }
132
123
 
@@ -138,7 +129,7 @@ class FrozenColumns extends Module{
138
129
  this.rightMargin = this._calcSpace(this.rightColumns, this.rightColumns.length) + "px";
139
130
  this.table.rowManager.tableElement.style.marginRight = this.rightMargin;
140
131
  }
141
-
132
+
142
133
  //calculate right frozen columns
143
134
  this.rightPadding = this.table.rowManager.element.clientWidth + this.table.columnManager.scrollLeft;
144
135
  }
@@ -185,10 +176,11 @@ class FrozenColumns extends Module{
185
176
 
186
177
  this.table.columnManager.headersElement.style.marginLeft = this.leftMargin;
187
178
  this.table.columnManager.element.style.paddingRight = this.rightMargin;
188
-
179
+
189
180
  this.leftColumns.forEach((column, i) => {
190
- column.modules.frozen.margin = (leftMargin + this.table.columnManager.scrollLeft) + "px";
191
-
181
+ column.modules.frozen.marginValue = leftMargin + this.table.columnManager.scrollLeft;
182
+ column.modules.frozen.margin = column.modules.frozen.marginValue + "px";
183
+
192
184
  if(column.visible){
193
185
  leftMargin += column.getWidth();
194
186
  }
@@ -221,12 +213,13 @@ class FrozenColumns extends Module{
221
213
  });
222
214
 
223
215
  this.rightColumns.forEach((column, i) => {
224
-
216
+
225
217
  if(column.visible){
226
218
  rightMargin += column.getWidth();
227
219
  }
228
-
229
- column.modules.frozen.margin = (this.rightPadding - rightMargin) + "px";
220
+
221
+ column.modules.frozen.marginValue = this.rightPadding - rightMargin;
222
+ column.modules.frozen.margin = column.modules.frozen.marginValue + "px";
230
223
 
231
224
  if(i == this.rightColumns.length - 1){
232
225
  column.modules.frozen.edge = true;
@@ -254,36 +247,35 @@ class FrozenColumns extends Module{
254
247
  }
255
248
 
256
249
  //layout columns appropriately
257
- layout(){
258
- var visibleRows = [],
259
- otherRows = [];
260
-
250
+ layout(){
261
251
  if(this.active && !this.blocked){
262
252
  //calculate row padding
263
253
  this.calcMargins();
264
-
254
+
265
255
  //calculate left columns
266
256
  this.layoutColumnPosition();
267
257
 
268
- visibleRows = this.table.rowManager.getVisibleRows();
269
- otherRows = this.table.rowManager.getDisplayRows().filter(row => !visibleRows.includes(row));
270
-
271
- otherRows.forEach((row) =>{
272
- row.deinitialize();
273
- });
274
-
275
- visibleRows.forEach((row) =>{
276
- if(row.type === "row"){
277
- this.layoutRow(row);
278
- }
279
- });
258
+ this.reinitializeRows();
280
259
 
281
260
  this.layoutCalcRows();
282
-
283
-
284
261
  }
285
262
  }
286
263
 
264
+ reinitializeRows(){
265
+ var visibleRows = this.table.rowManager.getVisibleRows();
266
+ var otherRows = this.table.rowManager.getRows().filter(row => !visibleRows.includes(row));
267
+
268
+ otherRows.forEach((row) =>{
269
+ row.deinitialize();
270
+ });
271
+
272
+ visibleRows.forEach((row) =>{
273
+ if(row.type === "row"){
274
+ this.layoutRow(row);
275
+ }
276
+ });
277
+ }
278
+
287
279
  layoutRow(row){
288
280
  // console.trace("row")
289
281
  var rowEl = row.getElement();
@@ -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
 
@@ -45,7 +45,7 @@ class MoveColumns extends Module{
45
45
  config = {},
46
46
  colEl;
47
47
 
48
- if(!column.modules.frozen){
48
+ if(!column.modules.frozen && !column.isGroup){
49
49
  colEl = column.getElement();
50
50
 
51
51
  config.mousemove = function(e){
@@ -421,6 +421,7 @@ class Persistence extends Module{
421
421
  if(this.config.columns === true || this.config.columns == undefined){
422
422
  keys = Object.keys(colDef);
423
423
  keys.push("width");
424
+ keys.push("visible");
424
425
  }else{
425
426
  keys = this.config.columns;
426
427
  }
@@ -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
  }
@@ -94,7 +120,7 @@ class ResizeColumns extends Module{
94
120
 
95
121
  if((mode === true || mode == type) && this._checkResizability(nearestColumn)){
96
122
 
97
- var handle = document.createElement('div');
123
+ var handle = document.createElement('span');
98
124
  handle.className = "tabulator-col-resize-handle";
99
125
 
100
126
  handle.addEventListener("click", function(e){
@@ -123,6 +149,11 @@ 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
159
  if(element.parentNode){
@@ -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
  }
@@ -17,7 +17,7 @@ export default function(a, b, aRow, bRow, column, dir, params){
17
17
  if(DT.isDateTime(b)){
18
18
  b = b;
19
19
  }else if(format === "iso"){
20
- a = DT.fromISO(String(b));
20
+ b = DT.fromISO(String(b));
21
21
  }else{
22
22
  b = DT.fromFormat(String(b), format);
23
23
  }
@@ -89,7 +89,7 @@ class Validate extends Module{
89
89
  var invalid = [];
90
90
 
91
91
  column.cells.forEach((cell) => {
92
- if(!this.cellValidate(cell)){
92
+ if(this.cellValidate(cell) !== true){
93
93
  invalid.push(cell.getComponent());
94
94
  }
95
95
  });
@@ -105,7 +105,7 @@ class Validate extends Module{
105
105
  var invalid = [];
106
106
 
107
107
  row.cells.forEach((cell) => {
108
- if(!this.cellValidate(cell)){
108
+ if(this.cellValidate(cell) !== true){
109
109
  invalid.push(cell.getComponent());
110
110
  }
111
111
  });
@@ -305,4 +305,4 @@ Validate.moduleName = "validate";
305
305
  //load defaults
306
306
  Validate.validators = defaultValidators;
307
307
 
308
- export default Validate;
308
+ export default Validate;
@@ -562,7 +562,7 @@ $footerActiveColor:#d00 !default; //footer bottom active text color
562
562
  cursor:ew-resize;
563
563
  }
564
564
 
565
- &:last-child{
565
+ &:last-of-type{
566
566
  width:3px;
567
567
  margin-right:0;
568
568
  }
@@ -543,4 +543,24 @@ $table-cell-padding-sm: 5px;
543
543
  }
544
544
  }
545
545
  }
546
+ }
547
+
548
+ .tabulator-popup-container{
549
+ background:#fff;
550
+ }
551
+
552
+ .tabulator-edit-list{
553
+ .tabulator-edit-list-item{
554
+ &.active{
555
+ color:#fff;
556
+
557
+ &.focused{
558
+ outline:1px solid rgba(#fff, .5);
559
+ }
560
+ }
561
+
562
+ &:hover{
563
+ color:#fff;
564
+ }
565
+ }
546
566
  }