tabulator-tables 5.4.1 → 5.4.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 (71) hide show
  1. package/bower.json +1 -1
  2. package/dist/css/tabulator.css +1 -0
  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 -0
  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 -0
  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 +1 -0
  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 -0
  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 -0
  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 -0
  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 -0
  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 -0
  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 -0
  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 -0
  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 +323 -241
  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 +323 -241
  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 +2 -2
  55. package/src/js/core/ColumnManager.js +3 -5
  56. package/src/js/core/RowManager.js +49 -30
  57. package/src/js/core/Tabulator.js +7 -8
  58. package/src/js/core/column/Column.js +10 -0
  59. package/src/js/core/tools/Popup.js +1 -1
  60. package/src/js/modules/ColumnCalcs/ColumnCalcs.js +10 -0
  61. package/src/js/modules/Edit/List.js +1 -1
  62. package/src/js/modules/Edit/inputMask.js +1 -1
  63. package/src/js/modules/Export/Export.js +151 -145
  64. package/src/js/modules/Filter/Filter.js +11 -8
  65. package/src/js/modules/GroupRows/Group.js +23 -18
  66. package/src/js/modules/GroupRows/GroupRows.js +29 -9
  67. package/src/js/modules/Localize/Localize.js +0 -9
  68. package/src/js/modules/MoveColumns/MoveColumns.js +1 -1
  69. package/src/js/modules/Print/Print.js +15 -2
  70. package/src/js/modules/SelectRow/SelectRow.js +10 -2
  71. package/src/scss/tabulator.scss +1 -0
@@ -182,11 +182,6 @@ class Filter extends Module{
182
182
  var def = column.definition;
183
183
 
184
184
  if(def.headerFilter){
185
-
186
- if(typeof def.headerFilterPlaceholder !== "undefined" && def.field){
187
- this.module("localize").setHeaderFilterColumnPlaceholder(def.field, def.headerFilterPlaceholder);
188
- }
189
-
190
185
  this.initializeColumn(column);
191
186
  }
192
187
  }
@@ -298,13 +293,17 @@ class Filter extends Module{
298
293
  var self = this,
299
294
  success = column.modules.filter.success,
300
295
  field = column.getField(),
301
- filterElement, editor, editorElement, cellWrapper, typingTimer, searchTrigger, params;
296
+ filterElement, editor, editorElement, cellWrapper, typingTimer, searchTrigger, params, onRenderedCallback;
302
297
 
303
298
  column.modules.filter.value = initialValue;
304
299
 
305
300
  //handle aborted edit
306
301
  function cancel(){}
307
302
 
303
+ function onRendered(callback){
304
+ onRenderedCallback = callback;
305
+ }
306
+
308
307
  if(column.modules.filter.headerElement && column.modules.filter.headerElement.parentNode){
309
308
  column.contentElement.removeChild(column.modules.filter.headerElement.parentNode);
310
309
  }
@@ -389,7 +388,7 @@ class Filter extends Module{
389
388
 
390
389
  params = typeof params === "function" ? params.call(self.table, cellWrapper) : params;
391
390
 
392
- editorElement = editor.call(this.table.modules.edit, cellWrapper, function(){}, success, cancel, params);
391
+ editorElement = editor.call(this.table.modules.edit, cellWrapper, onRendered, success, cancel, params);
393
392
 
394
393
  if(!editorElement){
395
394
  console.warn("Filter Error - Cannot add filter to " + field + " column, editor returned a value of false");
@@ -403,7 +402,7 @@ class Filter extends Module{
403
402
 
404
403
  //set Placeholder Text
405
404
  self.langBind("headerFilters|columns|" + column.definition.field, function(value){
406
- editorElement.setAttribute("placeholder", typeof value !== "undefined" && value ? value : self.langText("headerFilters|default"));
405
+ editorElement.setAttribute("placeholder", typeof value !== "undefined" && value ? value : (column.definition.headerFilterPlaceholder || self.langText("headerFilters|default")));
407
406
  });
408
407
 
409
408
  //focus on element on click
@@ -485,6 +484,10 @@ class Filter extends Module{
485
484
  if(!reinitialize){
486
485
  self.headerFilterColumns.push(column);
487
486
  }
487
+
488
+ if(onRenderedCallback){
489
+ onRenderedCallback();
490
+ }
488
491
  }
489
492
  }else{
490
493
  console.warn("Filter Error - Cannot add header filter, column has no field set:", column.definition.title);
@@ -38,17 +38,19 @@ class Group{
38
38
  this.createValueGroups();
39
39
  }
40
40
 
41
- wipe(){
42
- if(this.groupList.length){
43
- this.groupList.forEach(function(group){
44
- group.wipe();
45
- });
46
- }else{
47
- this.rows.forEach((row) => {
48
- if(row.modules){
49
- delete row.modules.group;
50
- }
51
- });
41
+ wipe(elementsOnly){
42
+ if(!elementsOnly){
43
+ if(this.groupList.length){
44
+ this.groupList.forEach(function(group){
45
+ group.wipe();
46
+ });
47
+ }else{
48
+ this.rows.forEach((row) => {
49
+ if(row.modules){
50
+ delete row.modules.group;
51
+ }
52
+ });
53
+ }
52
54
  }
53
55
 
54
56
  this.element = false;
@@ -69,7 +71,7 @@ class Group{
69
71
  this.arrowElement = document.createElement("div");
70
72
  this.arrowElement.classList.add("tabulator-group-toggle");
71
73
  this.arrowElement.appendChild(arrow);
72
-
74
+
73
75
  //setup movable rows
74
76
  if(this.groupManager.table.options.movableRows !== false && this.groupManager.table.modExists("moveRow")){
75
77
  this.groupManager.table.modules.moveRow.initializeGroupHeader(this);
@@ -207,19 +209,22 @@ class Group{
207
209
  this.parent.removeGroup(this);
208
210
  }else{
209
211
  this.groupManager.removeGroup(this);
210
- }
212
+ }
211
213
 
212
214
  this.groupManager.updateGroupRows(true);
215
+
213
216
  }else{
214
217
 
215
218
  if(el.parentNode){
216
219
  el.parentNode.removeChild(el);
217
220
  }
218
-
219
- this.generateGroupHeaderContents();
220
-
221
- if(this.groupManager.table.modExists("columnCalcs") && this.groupManager.table.options.columnCalcs != "table"){
222
- this.groupManager.table.modules.columnCalcs.recalcGroup(this);
221
+
222
+ if(!this.groupManager.blockRedraw){
223
+ this.generateGroupHeaderContents();
224
+
225
+ if(this.groupManager.table.modExists("columnCalcs") && this.groupManager.table.options.columnCalcs != "table"){
226
+ this.groupManager.table.modules.columnCalcs.recalcGroup(this);
227
+ }
223
228
  }
224
229
 
225
230
  }
@@ -15,6 +15,8 @@ class GroupRows extends Module{
15
15
  this.groups = {}; //hold row groups
16
16
 
17
17
  this.displayHandler = this.getRows.bind(this);
18
+
19
+ this.blockRedraw = false;
18
20
 
19
21
  //register table options
20
22
  this.registerTableOption("groupBy", false); //enable table grouping and set field to group by
@@ -43,6 +45,10 @@ class GroupRows extends Module{
43
45
 
44
46
  //initialize group configuration
45
47
  initialize(){
48
+ this.subscribe("table-destroy", this._blockRedrawing.bind(this));
49
+ this.subscribe("rows-wipe", this._blockRedrawing.bind(this));
50
+ this.subscribe("rows-wiped", this._restore_redrawing.bind(this));
51
+
46
52
  if(this.table.options.groupBy){
47
53
  if(this.table.options.groupUpdateOnCellEdit){
48
54
  this.subscribe("cell-value-updated", this.cellUpdated.bind(this));
@@ -69,6 +75,14 @@ class GroupRows extends Module{
69
75
  }
70
76
  }
71
77
 
78
+ _blockRedrawing(){
79
+ this.blockRedraw = true;
80
+ }
81
+
82
+ _restore_redrawing(){
83
+ this.blockRedraw = false;
84
+ }
85
+
72
86
  configureGroupSetup(){
73
87
  if(this.table.options.groupBy){
74
88
  var groupBy = this.table.options.groupBy,
@@ -92,7 +106,7 @@ class GroupRows extends Module{
92
106
 
93
107
  this.groupIDLookups = [];
94
108
 
95
- if(Array.isArray(groupBy)){
109
+ if(groupBy){
96
110
  if(this.table.modExists("columnCalcs") && this.table.options.columnCalcs != "table" && this.table.options.columnCalcs != "both"){
97
111
  this.table.modules.columnCalcs.removeCalcs();
98
112
  }
@@ -233,6 +247,10 @@ class GroupRows extends Module{
233
247
  }
234
248
 
235
249
  this.configureGroupSetup();
250
+
251
+ if(!groups && this.table.modExists("columnCalcs") && this.table.options.columnCalcs === true){
252
+ this.table.modules.columnCalcs.reinitializeCalcs();
253
+ }
236
254
 
237
255
  this.refreshData();
238
256
 
@@ -479,7 +497,7 @@ class GroupRows extends Module{
479
497
  }
480
498
 
481
499
  Object.values(oldGroups).forEach((group) => {
482
- group.wipe();
500
+ group.wipe(true);
483
501
  });
484
502
  }
485
503
 
@@ -551,13 +569,15 @@ class GroupRows extends Module{
551
569
 
552
570
  updateGroupRows(force){
553
571
  var output = [];
554
-
555
- this.groupList.forEach((group) => {
556
- output = output.concat(group.getHeadersAndRows());
557
- });
558
-
559
- if(force){
560
- this.refreshData(true, this.displayHandler);
572
+
573
+ if(!this.blockRedraw){
574
+ this.groupList.forEach((group) => {
575
+ output = output.concat(group.getHeadersAndRows());
576
+ });
577
+
578
+ if(force){
579
+ this.refreshData(true);
580
+ }
561
581
  }
562
582
 
563
583
  return output;
@@ -41,15 +41,6 @@ class Localize extends Module{
41
41
  this.langList.default.headerFilters.default = placeholder;
42
42
  }
43
43
 
44
- //set header filter placeholder by column
45
- setHeaderFilterColumnPlaceholder(column, placeholder){
46
- this.langList.default.headerFilters.columns[column] = placeholder;
47
-
48
- if(this.lang && !this.lang.headerFilters.columns[column]){
49
- this.lang.headerFilters.columns[column] = placeholder;
50
- }
51
- }
52
-
53
44
  //setup a lang description object
54
45
  installLang(locale, lang){
55
46
  if(this.langList[locale]){
@@ -50,7 +50,7 @@ class MoveColumns extends Module{
50
50
 
51
51
  config.mousemove = function(e){
52
52
  if(column.parent === self.moving.parent){
53
- if((((self.touchMove ? e.touches[0].pageX : e.pageX) - Helpers.elOffset(colEl).left) + self.table.columnManager.element.scrollLeft) > (column.getWidth() / 2)){
53
+ if((((self.touchMove ? e.touches[0].pageX : e.pageX) - Helpers.elOffset(colEl).left) + self.table.columnManager.contentsElement.scrollLeft) > (column.getWidth() / 2)){
54
54
  if(self.toCol !== column || !self.toColAfter){
55
55
  colEl.parentNode.insertBefore(self.placeholderElement, colEl.nextSibling);
56
56
  self.moveColumn(column, true);
@@ -7,6 +7,8 @@ class Print extends Module{
7
7
 
8
8
  this.element = false;
9
9
  this.manualBlock = false;
10
+ this.beforeprintEventHandler = null;
11
+ this.afterprintEventHandler = null;
10
12
 
11
13
  this.registerTableOption("printAsHtml", false); //enable print as html
12
14
  this.registerTableOption("printFormatter", false); //printing page formatter
@@ -22,13 +24,24 @@ class Print extends Module{
22
24
 
23
25
  initialize(){
24
26
  if(this.table.options.printAsHtml){
25
- window.addEventListener("beforeprint", this.replaceTable.bind(this));
26
- window.addEventListener("afterprint", this.cleanup.bind(this));
27
+ this.beforeprintEventHandler = this.replaceTable.bind(this);
28
+ this.afterprintEventHandler = this.cleanup.bind(this);
29
+
30
+ window.addEventListener("beforeprint", this.beforeprintEventHandler );
31
+ window.addEventListener("afterprint", this.afterprintEventHandler);
32
+ this.subscribe("table-destroy", this.destroy.bind(this));
27
33
  }
28
34
 
29
35
  this.registerTableFunction("print", this.printFullscreen.bind(this));
30
36
  }
31
37
 
38
+ destroy(){
39
+ if(this.table.options.printAsHtml){
40
+ window.removeEventListener( "beforeprint", this.beforeprintEventHandler );
41
+ window.removeEventListener( "afterprint", this.afterprintEventHandler );
42
+ }
43
+ }
44
+
32
45
  ///////////////////////////////////
33
46
  ///////// Table Functions /////////
34
47
  ///////////////////////////////////
@@ -79,7 +79,7 @@ class SelectRow extends Module{
79
79
  row.modules.select = {selected:false};
80
80
 
81
81
  //set row selection class
82
- if(self.table.options.selectableCheck.call(this.table, row.getComponent())){
82
+ if(self.checkRowSelectability(row)){
83
83
  element.classList.add("tabulator-selectable");
84
84
  element.classList.remove("tabulator-unselectable");
85
85
 
@@ -190,10 +190,18 @@ class SelectRow extends Module{
190
190
  this.lastClickedRow = row;
191
191
  }
192
192
  }
193
+
194
+ checkRowSelectability(row){
195
+ if(row.type === "row"){
196
+ return this.table.options.selectableCheck.call(this.table, row.getComponent());
197
+ }
198
+
199
+ return false;
200
+ }
193
201
 
194
202
  //toggle row selection
195
203
  toggleRow(row){
196
- if(this.table.options.selectableCheck.call(this.table, row.getComponent())){
204
+ if(this.checkRowSelectability(row)){
197
205
  if(row.modules.select && row.modules.select.selected){
198
206
  this._deselectRow(row);
199
207
  }else{
@@ -412,6 +412,7 @@ $footerActiveColor:#d00 !default; //footer bottom active text color
412
412
  box-sizing:border-box;
413
413
  display: flex;
414
414
  align-items:center;
415
+ justify-content: center;
415
416
 
416
417
  &[tabulator-render-mode="virtual"]{
417
418
  min-height:100%;