tabulator-tables 5.3.4 → 5.4.0

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 (82) hide show
  1. package/bower.json +1 -1
  2. package/build/Bundler.js +64 -38
  3. package/dist/css/tabulator.css +69 -19
  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 +69 -19
  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 +69 -19
  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 +69 -19
  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 +69 -19
  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 +69 -19
  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 +69 -19
  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 +69 -19
  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 +69 -19
  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 +69 -19
  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 +69 -19
  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/tabulator.js +25819 -27494
  48. package/dist/js/tabulator.js.map +1 -1
  49. package/dist/js/tabulator.min.js +2 -2
  50. package/dist/js/tabulator.min.js.map +1 -1
  51. package/dist/js/tabulator_esm.js +696 -498
  52. package/dist/js/tabulator_esm.js.map +1 -1
  53. package/dist/js/tabulator_esm.min.js +2 -2
  54. package/dist/js/tabulator_esm.min.js.map +1 -1
  55. package/package.json +3 -6
  56. package/src/js/core/ColumnManager.js +30 -15
  57. package/src/js/core/RowManager.js +26 -0
  58. package/src/js/core/column/Column.js +4 -0
  59. package/src/js/core/column/defaults/options.js +1 -0
  60. package/src/js/core/rendering/renderers/VirtualDomHorizontal.js +76 -77
  61. package/src/js/core/row/Row.js +1 -1
  62. package/src/js/core/tools/InteractionMonitor.js +2 -0
  63. package/src/js/core/tools/Popup.js +98 -76
  64. package/src/js/modules/ColumnCalcs/ColumnCalcs.js +185 -146
  65. package/src/js/modules/Download/defaults/downloaders/xlsx.js +2 -1
  66. package/src/js/modules/Edit/Edit.js +13 -2
  67. package/src/js/modules/Format/Format.js +46 -40
  68. package/src/js/modules/Format/defaults/formatters/responsiveCollapse.js +9 -1
  69. package/src/js/modules/FrozenColumns/FrozenColumns.js +24 -57
  70. package/src/js/modules/FrozenRows/FrozenRows.js +1 -1
  71. package/src/js/modules/GroupRows/Group.js +20 -28
  72. package/src/js/modules/GroupRows/GroupComponent.js +1 -1
  73. package/src/js/modules/Interaction/Interaction.js +12 -0
  74. package/src/js/modules/Menu/Menu.js +31 -7
  75. package/src/js/modules/MoveColumns/MoveColumns.js +3 -3
  76. package/src/js/modules/Persistence/Persistence.js +1 -0
  77. package/src/js/modules/Popup/Popup.js +42 -4
  78. package/src/js/modules/ResizeColumns/ResizeColumns.js +25 -6
  79. package/src/js/modules/ResizeTable/ResizeTable.js +7 -8
  80. package/src/js/modules/ResponsiveLayout/ResponsiveLayout.js +21 -21
  81. package/src/js/modules/Sort/Sort.js +14 -2
  82. package/src/scss/tabulator.scss +92 -31
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "tabulator-tables",
3
- "version": "5.3.4",
3
+ "version": "5.4.0",
4
4
  "description": "Interactive table generation JavaScript library",
5
5
  "style": "dist/css/tabulator.css",
6
6
  "main": "dist/js/tabulator.js",
@@ -10,7 +10,8 @@
10
10
  "**/*.scss"
11
11
  ],
12
12
  "scripts": {
13
- "lint": "eslint src",
13
+ "lint": "eslint src --fix",
14
+ "prebuild": "eslint src --fix",
14
15
  "build": "rollup -c build/rollup.js",
15
16
  "dev": "rollup -c build/rollup.js -w --environment TARGET:dev",
16
17
  "dev:css": "rollup -c build/rollup.js -w --environment TARGET:css",
@@ -47,10 +48,6 @@
47
48
  },
48
49
  "homepage": "http://tabulator.info/",
49
50
  "devDependencies": {
50
- "@babel/core": "^7.12.10",
51
- "@babel/plugin-proposal-class-properties": "^7.12.1",
52
- "@babel/preset-env": "^7.12.11",
53
- "@rollup/plugin-babel": "^5.2.2",
54
51
  "@rollup/plugin-node-resolve": "^11.0.1",
55
52
  "eslint": "^8.10.0",
56
53
  "eslint-plugin-only-warn": "^1.0.3",
@@ -16,6 +16,7 @@ export default class ColumnManager extends CoreFeature {
16
16
 
17
17
  this.blockHozScrollEvent = false;
18
18
  this.headersElement = null;
19
+ this.contentsElement = null;
19
20
  this.element = null ; //containing element
20
21
  this.columns = []; // column definition object
21
22
  this.columnsByIndex = []; //columns by index
@@ -35,11 +36,22 @@ export default class ColumnManager extends CoreFeature {
35
36
  this.initializeRenderer();
36
37
 
37
38
  this.headersElement = this.createHeadersElement();
39
+ this.contentsElement = this.createHeaderContentsElement();
38
40
  this.element = this.createHeaderElement();
39
41
 
40
- this.element.insertBefore(this.headersElement, this.element.firstChild);
42
+ this.contentsElement.insertBefore(this.headersElement, this.contentsElement.firstChild);
43
+ this.element.insertBefore(this.contentsElement, this.element.firstChild);
41
44
 
42
45
  this.subscribe("scroll-horizontal", this.scrollHorizontal.bind(this));
46
+ this.subscribe("scrollbar-vertical", this.padVerticalScrollbar.bind(this));
47
+ }
48
+
49
+ padVerticalScrollbar(width){
50
+ if(this.table.rtl){
51
+ this.headersElement.style.marginLeft = width + "px";
52
+ }else{
53
+ this.headersElement.style.marginRight = width + "px";
54
+ }
43
55
  }
44
56
 
45
57
  initializeRenderer(){
@@ -73,6 +85,15 @@ export default class ColumnManager extends CoreFeature {
73
85
 
74
86
  return el;
75
87
  }
88
+
89
+ createHeaderContentsElement (){
90
+ var el = document.createElement("div");
91
+
92
+ el.classList.add("tabulator-header-contents");
93
+ el.setAttribute("role", "rowgroup");
94
+
95
+ return el;
96
+ }
76
97
 
77
98
  createHeaderElement (){
78
99
  var el = document.createElement("div");
@@ -91,6 +112,12 @@ export default class ColumnManager extends CoreFeature {
91
112
  getElement(){
92
113
  return this.element;
93
114
  }
115
+
116
+ //return containing contents element
117
+ getContentsElement(){
118
+ return this.contentsElement;
119
+ }
120
+
94
121
 
95
122
  //return header containing element
96
123
  getHeadersElement(){
@@ -99,20 +126,8 @@ export default class ColumnManager extends CoreFeature {
99
126
 
100
127
  //scroll horizontally to match table body
101
128
  scrollHorizontal(left){
102
- var hozAdjust = 0,
103
- scrollWidth = this.element.scrollWidth - this.table.element.clientWidth;
104
-
105
- // this.tempScrollBlock();
106
- this.element.scrollLeft = left;
107
-
108
- //adjust for vertical scrollbar moving table when present
109
- if(left > scrollWidth){
110
- hozAdjust = left - scrollWidth;
111
- this.element.style.marginLeft = (-(hozAdjust)) + "px";
112
- }else{
113
- this.element.style.marginLeft = 0;
114
- }
115
-
129
+ this.contentsElement.scrollLeft = left;
130
+
116
131
  this.scrollLeft = left;
117
132
 
118
133
  this.renderer.scrollColumns(left);
@@ -38,6 +38,8 @@ export default class RowManager extends CoreFeature{
38
38
 
39
39
  this.dataPipeline = []; //hold data pipeline tasks
40
40
  this.displayPipeline = []; //hold data display pipeline tasks
41
+
42
+ this.scrollbarWidth = 0;
41
43
 
42
44
  this.renderer = null;
43
45
  }
@@ -720,6 +722,10 @@ export default class RowManager extends CoreFeature{
720
722
  //case to handle scenario when trying to skip past end stage
721
723
  this.regenerateRowPositions();
722
724
  }
725
+
726
+ if(this.getDisplayRows().length){
727
+ this._clearPlaceholder();
728
+ }
723
729
  }
724
730
 
725
731
  //regenerate row positions
@@ -826,10 +832,26 @@ export default class RowManager extends CoreFeature{
826
832
  if(!this.fixedHeight){
827
833
  this.adjustTableSize();
828
834
  }
835
+
836
+ this.scrollBarCheck();
829
837
 
830
838
  this.dispatchExternal("renderComplete");
831
839
  }
832
840
  }
841
+
842
+ scrollBarCheck(){
843
+ var scrollbarWidth = 0;
844
+
845
+ //adjust for vertical scrollbar moving table when present
846
+ if(this.element.scrollHeight > this.element.clientHeight){
847
+ scrollbarWidth = this.element.offsetWidth - this.element.clientWidth;
848
+ }
849
+
850
+ if(scrollbarWidth !== this.scrollbarWidth){
851
+ this.scrollbarWidth = scrollbarWidth;
852
+ this.dispatch("scrollbar-vertical", scrollbarWidth);
853
+ }
854
+ }
833
855
 
834
856
  initializeRenderer(){
835
857
  var renderClass;
@@ -892,6 +914,8 @@ export default class RowManager extends CoreFeature{
892
914
  if(!this.displayRowsCount){
893
915
  this._showPlaceholder();
894
916
  }
917
+
918
+ this.scrollBarCheck();
895
919
 
896
920
  this.dispatchExternal("renderComplete");
897
921
  }
@@ -990,6 +1014,8 @@ export default class RowManager extends CoreFeature{
990
1014
  this.redraw();
991
1015
  }
992
1016
  }
1017
+
1018
+ this.scrollBarCheck();
993
1019
  }
994
1020
 
995
1021
  this._positionPlaceholder();
@@ -243,6 +243,10 @@ class Column extends CoreFeature{
243
243
 
244
244
  var titleHolderElement = document.createElement("div");
245
245
  titleHolderElement.classList.add("tabulator-col-title");
246
+
247
+ if(def.headerWordWrap){
248
+ titleHolderElement.classList.add("tabulator-col-title-wrap");
249
+ }
246
250
 
247
251
  if(def.editableTitle){
248
252
  var titleElement = document.createElement("input");
@@ -13,5 +13,6 @@ export default {
13
13
  "variableHeight": undefined,
14
14
  "headerVertical": undefined,
15
15
  "headerHozAlign": undefined,
16
+ "headerWordWrap": false,
16
17
  "editableTitle": undefined,
17
18
  };
@@ -19,7 +19,7 @@ export default class VirtualDomHorizontal extends Renderer{
19
19
  this.windowBuffer = 200; //pixel margin to make column visible before it is shown on screen
20
20
 
21
21
  this.visibleRows = null;
22
-
22
+
23
23
  this.initialized = false;
24
24
  this.isFitData = false;
25
25
 
@@ -32,53 +32,29 @@ export default class VirtualDomHorizontal extends Renderer{
32
32
  this.vertScrollListen();
33
33
  }
34
34
 
35
- compatibilityCheck(){
36
- var columns = this.options("columns"),
37
- frozen = false,
38
- ok = true;
39
-
35
+ compatibilityCheck(){
40
36
  if(this.options("layout") == "fitDataTable"){
41
37
  console.warn("Horizontal Virtual DOM is not compatible with fitDataTable layout mode");
42
- ok = false;
43
38
  }
44
39
 
45
40
  if(this.options("responsiveLayout")){
46
41
  console.warn("Horizontal Virtual DOM is not compatible with responsive columns");
47
- ok = false;
48
42
  }
49
43
 
50
44
  if(this.options("rtl")){
51
45
  console.warn("Horizontal Virtual DOM is not currently compatible with RTL text direction");
52
- ok = false;
53
46
  }
54
-
55
- if(columns){
56
- frozen = columns.find((col) => {
57
- return col.frozen;
58
- });
59
-
60
- if(frozen){
61
- console.warn("Horizontal Virtual DOM is not compatible with frozen columns");
62
- ok = false;
63
- }
64
- }
65
-
66
- // if(!ok){
67
- // options.virtualDomHoz = false;
68
- // }
69
-
70
- return ok;
71
47
  }
72
48
 
73
49
  layoutCheck(){
74
50
  this.isFitData = this.options("layout").startsWith('fitData');
75
51
  }
76
-
52
+
77
53
  vertScrollListen(){
78
54
  this.subscribe("scroll-vertical", this.clearVisRowCache.bind(this));
79
55
  this.subscribe("data-refreshed", this.clearVisRowCache.bind(this));
80
56
  }
81
-
57
+
82
58
  clearVisRowCache(){
83
59
  this.visibleRows = null;
84
60
  }
@@ -90,7 +66,7 @@ export default class VirtualDomHorizontal extends Renderer{
90
66
  renderColumns(row, force){
91
67
  this.dataChange();
92
68
  }
93
-
69
+
94
70
 
95
71
  scrollColumns(left, dir){
96
72
  if(this.scrollLeft != left){
@@ -124,7 +100,6 @@ export default class VirtualDomHorizontal extends Renderer{
124
100
  },
125
101
  colPos = 0;
126
102
 
127
-
128
103
  if(update && !this.initialized){
129
104
  return;
130
105
  }
@@ -139,41 +114,44 @@ export default class VirtualDomHorizontal extends Renderer{
139
114
  this.vDomScrollPosRight = this.scrollLeft + this.elementVertical.clientWidth + this.windowBuffer;
140
115
 
141
116
  this.table.columnManager.columnsByIndex.forEach((column) => {
142
- var config = {};
117
+ var config = {},
118
+ width;
143
119
 
144
120
  if(column.visible){
145
- var width = column.getWidth();
146
-
147
- config.leftPos = colPos;
148
- config.rightPos = colPos + width;
149
-
150
- config.width = width;
151
-
152
- if (this.isFitData) {
153
- config.fitDataCheck = column.modules.vdomHoz ? column.modules.vdomHoz.fitDataCheck : true;
154
- }
155
-
156
- if((colPos + width > this.vDomScrollPosLeft) && (colPos < this.vDomScrollPosRight)){
157
- //column is visible
121
+ if(!column.modules.frozen){
122
+ width = column.getWidth();
123
+
124
+ config.leftPos = colPos;
125
+ config.rightPos = colPos + width;
126
+
127
+ config.width = width;
158
128
 
159
- if(this.leftCol == -1){
160
- this.leftCol = this.columns.length;
161
- this.vDomPadLeft = colPos;
129
+ if (this.isFitData) {
130
+ config.fitDataCheck = column.modules.vdomHoz ? column.modules.vdomHoz.fitDataCheck : true;
162
131
  }
163
132
 
164
- this.rightCol = this.columns.length;
165
- }else{
166
- // column is hidden
167
- if(this.leftCol !== -1){
168
- this.vDomPadRight += width;
133
+ if((colPos + width > this.vDomScrollPosLeft) && (colPos < this.vDomScrollPosRight)){
134
+ //column is visible
135
+
136
+ if(this.leftCol == -1){
137
+ this.leftCol = this.columns.length;
138
+ this.vDomPadLeft = colPos;
139
+ }
140
+
141
+ this.rightCol = this.columns.length;
142
+ }else{
143
+ // column is hidden
144
+ if(this.leftCol !== -1){
145
+ this.vDomPadRight += width;
146
+ }
169
147
  }
148
+
149
+ this.columns.push(column);
150
+
151
+ column.modules.vdomHoz = config;
152
+
153
+ colPos += width;
170
154
  }
171
-
172
- this.columns.push(column);
173
-
174
- column.modules.vdomHoz = config;
175
-
176
- colPos += width;
177
155
  }
178
156
  });
179
157
 
@@ -265,7 +243,7 @@ export default class VirtualDomHorizontal extends Renderer{
265
243
  }
266
244
 
267
245
  rowEl.parentNode.removeChild(rowEl);
268
-
246
+
269
247
  this.rerenderColumns(false, true);
270
248
  }
271
249
  }
@@ -294,24 +272,30 @@ export default class VirtualDomHorizontal extends Renderer{
294
272
  }
295
273
 
296
274
  reinitializeRows(){
297
- var rows = this.getVisibleRows();
298
- rows.forEach((row) => {
275
+ var visibleRows = this.getVisibleRows(),
276
+ otherRows = this.table.rowManager.getRows().filter(row => !visibleRows.includes(row));
277
+
278
+ visibleRows.forEach((row) => {
299
279
  this.reinitializeRow(row, true);
300
280
  });
281
+
282
+ otherRows.forEach((row) =>{
283
+ row.deinitialize();
284
+ });
301
285
  }
302
286
 
303
287
  getVisibleRows(){
304
288
  if (!this.visibleRows){
305
289
  this.visibleRows = this.table.rowManager.getVisibleRows();
306
290
  }
307
-
291
+
308
292
  return this.visibleRows;
309
293
  }
310
294
 
311
295
  scroll(diff){
312
296
  this.vDomScrollPosLeft += diff;
313
297
  this.vDomScrollPosRight += diff;
314
-
298
+
315
299
  if(Math.abs(diff) > (this.windowBuffer / 2)){
316
300
  this.rerenderColumns();
317
301
  }else{
@@ -341,7 +325,7 @@ export default class VirtualDomHorizontal extends Renderer{
341
325
  working = true;
342
326
 
343
327
  while(working){
344
-
328
+
345
329
  let column = this.columns[this.rightCol + 1];
346
330
 
347
331
  if(column){
@@ -351,7 +335,7 @@ export default class VirtualDomHorizontal extends Renderer{
351
335
  this.getVisibleRows().forEach((row) => {
352
336
  if(row.type !== "group"){
353
337
  var cell = row.getCell(column);
354
- row.getElement().appendChild(cell.getElement());
338
+ row.getElement().insertBefore(cell.getElement(), row.getCell(this.columns[this.rightCol]).getElement().nextSibling);
355
339
  cell.cellRendered();
356
340
  }
357
341
  });
@@ -392,7 +376,7 @@ export default class VirtualDomHorizontal extends Renderer{
392
376
  this.getVisibleRows().forEach((row) => {
393
377
  if(row.type !== "group"){
394
378
  var cell = row.getCell(column);
395
- row.getElement().prepend(cell.getElement());
379
+ row.getElement().insertBefore(cell.getElement(), row.getCell(this.columns[this.leftCol]).getElement());
396
380
  cell.cellRendered();
397
381
  }
398
382
  });
@@ -466,7 +450,7 @@ export default class VirtualDomHorizontal extends Renderer{
466
450
  removeColLeft(){
467
451
  var changes = false,
468
452
  working = true;
469
-
453
+
470
454
  while(working){
471
455
  let column = this.columns[this.leftCol];
472
456
 
@@ -528,26 +512,41 @@ export default class VirtualDomHorizontal extends Renderer{
528
512
  leftCol:this.leftCol,
529
513
  rightCol:this.rightCol,
530
514
  };
531
-
515
+
516
+ if(this.table.modules.frozenColumns){
517
+ this.table.modules.frozenColumns.leftColumns.forEach((column) => {
518
+ this.appendCell(row, column);
519
+ });
520
+ }
521
+
532
522
  for(let i = this.leftCol; i <= this.rightCol; i++){
533
- let column = this.columns[i];
534
-
535
- if(column && column.visible){
536
- let cell = row.getCell(column);
537
-
538
- row.getElement().appendChild(cell.getElement());
539
- cell.cellRendered();
540
- }
523
+ this.appendCell(row, this.columns[i]);
524
+ }
525
+
526
+ if(this.table.modules.frozenColumns){
527
+ this.table.modules.frozenColumns.rightColumns.forEach((column) => {
528
+ this.appendCell(row, column);
529
+ });
541
530
  }
542
531
  }
543
532
  }
544
533
 
534
+ appendCell(row, column){
535
+ if(column && column.visible){
536
+ let cell = row.getCell(column);
537
+
538
+ row.getElement().appendChild(cell.getElement());
539
+ cell.cellRendered();
540
+ }
541
+ }
542
+
545
543
  reinitializeRow(row, force){
546
544
  if(row.type !== "group"){
547
545
  if(force || !row.modules.vdomHoz || row.modules.vdomHoz.leftCol !== this.leftCol || row.modules.vdomHoz.rightCol !== this.rightCol){
546
+
548
547
  var rowEl = row.getElement();
549
548
  while(rowEl.firstChild) rowEl.removeChild(rowEl.firstChild);
550
-
549
+
551
550
  this.initializeRow(row);
552
551
  }
553
552
  }
@@ -264,7 +264,7 @@ export default class Row extends CoreFeature{
264
264
 
265
265
  if(cell){
266
266
  let value = column.getFieldValue(newRowData);
267
- if(cell.getValue() != value){
267
+ if(cell.getValue() !== value){
268
268
  cell.setValueProcessData(value);
269
269
 
270
270
  if(visible){
@@ -21,6 +21,8 @@ export default class InteractionManager extends CoreFeature {
21
21
  "mouseover",
22
22
  "mouseout",
23
23
  "mousemove",
24
+ "mouseup",
25
+ "mousedown",
24
26
  "touchstart",
25
27
  "touchend",
26
28
  ];