tabulator-tables 5.3.4 → 5.4.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 (86) 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 +25853 -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 +738 -506
  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 +100 -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/Edit/List.js +1 -0
  68. package/src/js/modules/Filter/Filter.js +2 -2
  69. package/src/js/modules/Format/Format.js +46 -40
  70. package/src/js/modules/Format/defaults/formatters/responsiveCollapse.js +9 -1
  71. package/src/js/modules/FrozenColumns/FrozenColumns.js +24 -57
  72. package/src/js/modules/FrozenRows/FrozenRows.js +1 -1
  73. package/src/js/modules/GroupRows/Group.js +20 -28
  74. package/src/js/modules/GroupRows/GroupComponent.js +1 -1
  75. package/src/js/modules/GroupRows/GroupRows.js +8 -0
  76. package/src/js/modules/Interaction/Interaction.js +12 -0
  77. package/src/js/modules/Menu/Menu.js +31 -7
  78. package/src/js/modules/MoveColumns/MoveColumns.js +3 -3
  79. package/src/js/modules/Page/Page.js +1 -0
  80. package/src/js/modules/Persistence/Persistence.js +1 -0
  81. package/src/js/modules/Popup/Popup.js +42 -4
  82. package/src/js/modules/ResizeColumns/ResizeColumns.js +25 -6
  83. package/src/js/modules/ResizeTable/ResizeTable.js +7 -8
  84. package/src/js/modules/ResponsiveLayout/ResponsiveLayout.js +21 -21
  85. package/src/js/modules/Sort/Sort.js +14 -2
  86. package/src/scss/tabulator.scss +92 -31
@@ -14,18 +14,22 @@ class Menu extends Module{
14
14
  this.columnSubscribers = {};
15
15
 
16
16
  this.registerTableOption("menuContainer", undefined); //deprecated
17
-
17
+
18
18
  this.registerTableOption("rowContextMenu", false);
19
19
  this.registerTableOption("rowClickMenu", false);
20
+ this.registerTableOption("rowDblClickMenu", false);
20
21
  this.registerTableOption("groupContextMenu", false);
21
22
  this.registerTableOption("groupClickMenu", false);
23
+ this.registerTableOption("groupDblClickMenu", false);
22
24
 
23
25
  this.registerColumnOption("headerContextMenu");
24
26
  this.registerColumnOption("headerClickMenu");
27
+ this.registerColumnOption("headerDblClickMenu");
25
28
  this.registerColumnOption("headerMenu");
26
29
  this.registerColumnOption("headerMenuIcon");
27
30
  this.registerColumnOption("contextMenu");
28
31
  this.registerColumnOption("clickMenu");
32
+ this.registerColumnOption("dblClickMenu");
29
33
 
30
34
  }
31
35
 
@@ -36,7 +40,7 @@ class Menu extends Module{
36
40
 
37
41
  this.subscribe("column-init", this.initializeColumn.bind(this));
38
42
  }
39
-
43
+
40
44
  deprecatedOptionsCheck(){
41
45
  if(!this.deprecationCheck("menuContainer", "popupContainer")){
42
46
  this.table.options.popupContainer = this.table.options.menuContainer;
@@ -52,6 +56,10 @@ class Menu extends Module{
52
56
  if(this.table.options.rowClickMenu){
53
57
  this.subscribe("row-click", this.loadMenuEvent.bind(this, this.table.options.rowClickMenu));
54
58
  }
59
+
60
+ if(this.table.options.rowDblClickMenu){
61
+ this.subscribe("row-dblclick", this.loadMenuEvent.bind(this, this.table.options.rowDblClickMenu));
62
+ }
55
63
  }
56
64
 
57
65
  initializeGroupWatchers(){
@@ -63,6 +71,10 @@ class Menu extends Module{
63
71
  if(this.table.options.groupClickMenu){
64
72
  this.subscribe("group-click", this.loadMenuEvent.bind(this, this.table.options.groupClickMenu));
65
73
  }
74
+
75
+ if(this.table.options.groupDblClickMenu){
76
+ this.subscribe("group-dblclick", this.loadMenuEvent.bind(this, this.table.options.groupDblClickMenu));
77
+ }
66
78
  }
67
79
 
68
80
  initializeColumn(column){
@@ -80,6 +92,11 @@ class Menu extends Module{
80
92
  this.subscribe("column-click", this.columnSubscribers.headerClickMenu);
81
93
  }
82
94
 
95
+ if(def.headerDblClickMenu && !this.columnSubscribers.headerDblClickMenu){
96
+ this.columnSubscribers.headerDblClickMenu = this.loadMenuTableColumnEvent.bind(this, "headerDblClickMenu");
97
+ this.subscribe("column-dblclick", this.columnSubscribers.headerDblClickMenu);
98
+ }
99
+
83
100
  if(def.headerMenu){
84
101
  this.initializeColumnHeaderMenu(column);
85
102
  }
@@ -95,6 +112,11 @@ class Menu extends Module{
95
112
  this.columnSubscribers.clickMenu = this.loadMenuTableCellEvent.bind(this, "clickMenu");
96
113
  this.subscribe("cell-click", this.columnSubscribers.clickMenu);
97
114
  }
115
+
116
+ if(def.dblClickMenu && !this.columnSubscribers.dblClickMenu){
117
+ this.columnSubscribers.dblClickMenu = this.loadMenuTableCellEvent.bind(this, "dblClickMenu");
118
+ this.subscribe("cell-dblclick", this.columnSubscribers.dblClickMenu);
119
+ }
98
120
  }
99
121
 
100
122
  initializeColumnHeaderMenu(column){
@@ -103,12 +125,12 @@ class Menu extends Module{
103
125
 
104
126
  headerMenuEl = document.createElement("span");
105
127
  headerMenuEl.classList.add("tabulator-header-popup-button");
106
-
128
+
107
129
  if(icon){
108
130
  if(typeof icon === "function"){
109
131
  icon = icon(column.getComponent());
110
132
  }
111
-
133
+
112
134
  if(icon instanceof HTMLElement){
113
135
  headerMenuEl.appendChild(icon);
114
136
  }else{
@@ -251,7 +273,9 @@ class Menu extends Module{
251
273
  });
252
274
 
253
275
  menuEl.addEventListener("click", (e) => {
254
- this.rootPopup.hide();
276
+ if(this.rootPopup){
277
+ this.rootPopup.hide();
278
+ }
255
279
  });
256
280
 
257
281
  popup.show(parentEl || e);
@@ -265,9 +289,9 @@ class Menu extends Module{
265
289
  this.currentComponent = null;
266
290
  }
267
291
  });
268
-
292
+
269
293
  this.currentComponent = component;
270
-
294
+
271
295
  this.dispatchExternal("menuOpened", component.getComponent());
272
296
  }
273
297
  }
@@ -164,7 +164,7 @@ class MoveColumns extends Module{
164
164
 
165
165
  startMove(e, column){
166
166
  var element = column.getElement(),
167
- headerElement = this.table.columnManager.getElement(),
167
+ headerElement = this.table.columnManager.getContentsElement(),
168
168
  headersElement = this.table.columnManager.getHeadersElement();
169
169
 
170
170
  this.moving = column;
@@ -183,7 +183,7 @@ class MoveColumns extends Module{
183
183
  this.hoverElement = element.cloneNode(true);
184
184
  this.hoverElement.classList.add("tabulator-moving");
185
185
 
186
- this.table.columnManager.getElement().appendChild(this.hoverElement);
186
+ headerElement.appendChild(this.hoverElement);
187
187
 
188
188
  this.hoverElement.style.left = "0";
189
189
  this.hoverElement.style.bottom = (headerElement.clientHeight - headersElement.offsetHeight) + "px";
@@ -265,7 +265,7 @@ class MoveColumns extends Module{
265
265
  }
266
266
 
267
267
  moveHover(e){
268
- var columnHolder = this.table.columnManager.getElement(),
268
+ var columnHolder = this.table.columnManager.getContentsElement(),
269
269
  scrollLeft = columnHolder.scrollLeft,
270
270
  xPos = ((this.touchMove ? e.touches[0].pageX : e.pageX) - Helpers.elOffset(columnHolder).left) + scrollLeft,
271
271
  scrollPos;
@@ -486,6 +486,7 @@ class Page extends Module{
486
486
  if(!this.initialLoad){
487
487
  if(this.mode == "local" || force){
488
488
  this.page = 1;
489
+ this.trackChanges();
489
490
  }
490
491
  }
491
492
  }
@@ -142,6 +142,7 @@ class Persistence extends Module{
142
142
  this.subscribe("group-changed", this.eventSave.bind(this, "group"));
143
143
  this.subscribe("page-changed", this.eventSave.bind(this, "page"));
144
144
  this.subscribe("column-resized", this.eventSave.bind(this, "columns"));
145
+ this.subscribe("column-width", this.eventSave.bind(this, "columns"));
145
146
  this.subscribe("layout-refreshed", this.eventSave.bind(this, "columns"));
146
147
  }
147
148
 
@@ -9,15 +9,24 @@ class Popup extends Module{
9
9
 
10
10
  this.registerTableOption("rowContextPopup", false);
11
11
  this.registerTableOption("rowClickPopup", false);
12
+ this.registerTableOption("rowDblClickPopup", false);
12
13
  this.registerTableOption("groupContextPopup", false);
13
14
  this.registerTableOption("groupClickPopup", false);
15
+ this.registerTableOption("groupDblClickPopup", false);
14
16
 
15
17
  this.registerColumnOption("headerContextPopup");
16
18
  this.registerColumnOption("headerClickPopup");
19
+ this.registerColumnOption("headerDblClickPopup");
17
20
  this.registerColumnOption("headerPopup");
18
21
  this.registerColumnOption("headerPopupIcon");
19
22
  this.registerColumnOption("contextPopup");
20
23
  this.registerColumnOption("clickPopup");
24
+ this.registerColumnOption("dblClickPopup");
25
+
26
+ this.registerComponentFunction("cell", "popup", this._componentPopupCall.bind(this));
27
+ this.registerComponentFunction("column", "popup", this._componentPopupCall.bind(this));
28
+ this.registerComponentFunction("row", "popup", this._componentPopupCall.bind(this));
29
+ this.registerComponentFunction("group", "popup", this._componentPopupCall.bind(this));
21
30
 
22
31
  }
23
32
 
@@ -27,6 +36,10 @@ class Popup extends Module{
27
36
 
28
37
  this.subscribe("column-init", this.initializeColumn.bind(this));
29
38
  }
39
+
40
+ _componentPopupCall(component, contents, position){
41
+ this.loadPopupEvent(contents, null, component, position);
42
+ }
30
43
 
31
44
  initializeRowWatchers(){
32
45
  if(this.table.options.rowContextPopup){
@@ -37,6 +50,10 @@ class Popup extends Module{
37
50
  if(this.table.options.rowClickPopup){
38
51
  this.subscribe("row-click", this.loadPopupEvent.bind(this, this.table.options.rowClickPopup));
39
52
  }
53
+
54
+ if(this.table.options.rowDblClickPopup){
55
+ this.subscribe("row-dblclick", this.loadPopupEvent.bind(this, this.table.options.rowDblClickPopup));
56
+ }
40
57
  }
41
58
 
42
59
  initializeGroupWatchers(){
@@ -48,6 +65,10 @@ class Popup extends Module{
48
65
  if(this.table.options.groupClickPopup){
49
66
  this.subscribe("group-click", this.loadPopupEvent.bind(this, this.table.options.groupClickPopup));
50
67
  }
68
+
69
+ if(this.table.options.groupDblClickPopup){
70
+ this.subscribe("group-dblclick", this.loadPopupEvent.bind(this, this.table.options.groupDblClickPopup));
71
+ }
51
72
  }
52
73
 
53
74
  initializeColumn(column){
@@ -63,6 +84,11 @@ class Popup extends Module{
63
84
  if(def.headerClickPopup && !this.columnSubscribers.headerClickPopup){
64
85
  this.columnSubscribers.headerClickPopup = this.loadPopupTableColumnEvent.bind(this, "headerClickPopup");
65
86
  this.subscribe("column-click", this.columnSubscribers.headerClickPopup);
87
+
88
+
89
+ }if(def.headerDblClickPopup && !this.columnSubscribers.headerDblClickPopup){
90
+ this.columnSubscribers.headerDblClickPopup = this.loadPopupTableColumnEvent.bind(this, "headerDblClickPopup");
91
+ this.subscribe("column-dblclick", this.columnSubscribers.headerDblClickPopup);
66
92
  }
67
93
 
68
94
  if(def.headerPopup){
@@ -80,6 +106,11 @@ class Popup extends Module{
80
106
  this.columnSubscribers.clickPopup = this.loadPopupTableCellEvent.bind(this, "clickPopup");
81
107
  this.subscribe("cell-click", this.columnSubscribers.clickPopup);
82
108
  }
109
+
110
+ if(def.dblClickPopup && !this.columnSubscribers.dblClickPopup){
111
+ this.columnSubscribers.dblClickPopup = this.loadPopupTableCellEvent.bind(this, "dblClickPopup");
112
+ this.subscribe("cell-click", this.columnSubscribers.dblClickPopup);
113
+ }
83
114
  }
84
115
 
85
116
  initializeColumnHeaderPopup(column){
@@ -133,7 +164,7 @@ class Popup extends Module{
133
164
  }
134
165
  }
135
166
 
136
- loadPopupEvent(contents, e, component){
167
+ loadPopupEvent(contents, e, component, position){
137
168
  var renderedCallback;
138
169
 
139
170
  function onRendered(callback){
@@ -148,10 +179,10 @@ class Popup extends Module{
148
179
 
149
180
  contents = typeof contents == "function" ? contents.call(this.table, e, component.getComponent(), onRendered) : contents;
150
181
 
151
- this.loadPopup(e, component, contents, renderedCallback);
182
+ this.loadPopup(e, component, contents, renderedCallback, position);
152
183
  }
153
184
 
154
- loadPopup(e, component, contents, renderedCallback){
185
+ loadPopup(e, component, contents, renderedCallback, position){
155
186
  var touch = !(e instanceof MouseEvent),
156
187
  contentsEl, popup;
157
188
 
@@ -177,8 +208,15 @@ class Popup extends Module{
177
208
  if(typeof renderedCallback === "function"){
178
209
  popup.renderCallback(renderedCallback);
179
210
  }
211
+
212
+ if(e){
213
+ popup.show(e);
214
+ }else{
215
+ popup.show(component.getElement(), position || "center");
216
+ }
217
+
180
218
 
181
- popup.show(e).hideOnBlur(() => {
219
+ popup.hideOnBlur(() => {
182
220
  this.dispatchExternal("popupClosed", component.getComponent());
183
221
  });
184
222
 
@@ -81,15 +81,32 @@ class ResizeColumns extends Module{
81
81
  }
82
82
  }
83
83
  }
84
+
85
+ frozenColumnOffset(column){
86
+ var offset = false;
87
+
88
+ if(column.modules.frozen){
89
+ offset = column.modules.frozen.marginValue;
90
+
91
+ if(column.modules.frozen.position === "left"){
92
+ offset += column.getWidth() - 3;
93
+ }else{
94
+ if(offset){
95
+ offset -= 3;
96
+ }
97
+ }
98
+ }
99
+
100
+ return offset !== false ? offset + "px" : false;
101
+ }
84
102
 
85
103
  reinitializeColumn(column){
86
- var frozenOffset = column.modules.frozen ? (column.modules.frozen.marginValue + column.getWidth() + "px") : false;
87
-
104
+ var frozenOffset = this.frozenColumnOffset(column);
88
105
 
89
106
  column.cells.forEach((cell) => {
90
107
  if(cell.modules.resize && cell.modules.resize.handleEl){
91
108
  if(frozenOffset){
92
- cell.modules.resize.handleEl.style.left = frozenOffset;
109
+ cell.modules.resize.handleEl.style[column.modules.frozen.position] = frozenOffset;
93
110
  }
94
111
 
95
112
  cell.element.after(cell.modules.resize.handleEl);
@@ -98,7 +115,7 @@ class ResizeColumns extends Module{
98
115
 
99
116
  if(column.modules.resize && column.modules.resize.handleEl){
100
117
  if(frozenOffset){
101
- column.modules.resize.handleEl.style.left = frozenOffset;
118
+ column.modules.resize.handleEl.style[column.modules.frozen.position] = frozenOffset;
102
119
  }
103
120
 
104
121
  column.element.after(column.modules.resize.handleEl);
@@ -150,8 +167,8 @@ class ResizeColumns extends Module{
150
167
  });
151
168
 
152
169
  if(column.modules.frozen){
153
- handle.style.position = "absolute";
154
- handle.style.left = column.modules.frozen.marginValue + column.getWidth() + "px";
170
+ handle.style.position = "sticky";
171
+ handle.style[column.modules.frozen.position] = this.frozenColumnOffset(column);
155
172
  }
156
173
 
157
174
  config.handleEl = handle;
@@ -263,6 +280,8 @@ class ResizeColumns extends Module{
263
280
  self.table.element.classList.remove("tabulator-block-select");
264
281
 
265
282
  if(self.startWidth !== column.getWidth()){
283
+ self.table.columnManager.verticalAlignHeaders();
284
+
266
285
  self.dispatch("column-resized", column);
267
286
  self.table.externalEvents.dispatch("columnResized", column.getComponent());
268
287
  }
@@ -58,7 +58,7 @@ class ResizeTable extends Module{
58
58
  this.containerHeight = table.element.parentNode.clientHeight;
59
59
  this.containerWidth = table.element.parentNode.clientWidth;
60
60
  }
61
-
61
+
62
62
  this.redrawTable();
63
63
  }
64
64
  }
@@ -110,17 +110,16 @@ class ResizeTable extends Module{
110
110
  initializeVisibilityObserver(){
111
111
  this.visibilityObserver = new IntersectionObserver((entries) => {
112
112
  this.visible = entries[0].isIntersecting;
113
-
113
+
114
114
  if(!this.initialized){
115
115
  this.initialized = true;
116
116
  this.initialRedraw = !this.visible;
117
+ }else{
118
+ if(this.visible){
119
+ this.redrawTable(this.initialRedraw);
120
+ this.initialRedraw = false;
121
+ }
117
122
  }
118
-
119
- if(this.visible){
120
- this.redrawTable(this.initialRedraw);
121
- this.initialRedraw = false;
122
- }
123
-
124
123
  });
125
124
 
126
125
  this.visibilityObserver.observe(this.table.element);
@@ -183,22 +183,21 @@ class ResponsiveLayout extends Module{
183
183
 
184
184
  //redraw columns to fit space
185
185
  update(){
186
- var self = this,
187
- working = true;
186
+ var working = true;
188
187
 
189
188
  while(working){
190
189
 
191
- let width = self.table.modules.layout.getMode() == "fitColumns" ? self.table.columnManager.getFlexBaseWidth() : self.table.columnManager.getWidth();
190
+ let width = this.table.modules.layout.getMode() == "fitColumns" ? this.table.columnManager.getFlexBaseWidth() : this.table.columnManager.getWidth();
192
191
 
193
- let diff = (self.table.options.headerVisible ? self.table.columnManager.element.clientWidth : self.table.element.clientWidth) - width;
192
+ let diff = (this.table.options.headerVisible ? this.table.columnManager.element.clientWidth : this.table.element.clientWidth) - width;
194
193
 
195
194
  if(diff < 0){
196
195
  //table is too wide
197
- let column = self.columns[self.index];
196
+ let column = this.columns[this.index];
198
197
 
199
198
  if(column){
200
- self.hideColumn(column);
201
- self.index ++;
199
+ this.hideColumn(column);
200
+ this.index ++;
202
201
  }else{
203
202
  working = false;
204
203
  }
@@ -206,13 +205,13 @@ class ResponsiveLayout extends Module{
206
205
  }else{
207
206
 
208
207
  //table has spare space
209
- let column = self.columns[self.index -1];
208
+ let column = this.columns[this.index -1];
210
209
 
211
210
  if(column){
212
211
  if(diff > 0){
213
212
  if(diff >= column.getWidth()){
214
- self.showColumn(column);
215
- self.index --;
213
+ this.showColumn(column);
214
+ this.index --;
216
215
  }else{
217
216
  working = false;
218
217
  }
@@ -224,18 +223,17 @@ class ResponsiveLayout extends Module{
224
223
  }
225
224
  }
226
225
 
227
- if(!self.table.rowManager.activeRowsCount){
228
- self.table.rowManager.renderEmptyScroll();
226
+ if(!this.table.rowManager.activeRowsCount){
227
+ this.table.rowManager.renderEmptyScroll();
229
228
  }
230
229
  }
231
230
  }
232
231
 
233
232
  generateCollapsedContent(){
234
- var self = this,
235
- rows = this.table.rowManager.getDisplayRows();
233
+ var rows = this.table.rowManager.getDisplayRows();
236
234
 
237
- rows.forEach(function(row){
238
- self.generateCollapsedRowContent(row);
235
+ rows.forEach((row) => {
236
+ this.generateCollapsedRowContent(row);
239
237
  });
240
238
  }
241
239
 
@@ -255,16 +253,15 @@ class ResponsiveLayout extends Module{
255
253
  }
256
254
 
257
255
  generateCollapsedRowData(row){
258
- var self = this,
259
- data = row.getData(),
256
+ var data = row.getData(),
260
257
  output = [],
261
258
  mockCellComponent;
262
259
 
263
- this.hiddenColumns.forEach(function(column){
260
+ this.hiddenColumns.forEach((column) => {
264
261
  var value = column.getFieldValue(data);
265
262
 
266
263
  if(column.definition.title && column.field){
267
- if(column.modules.format && self.table.options.responsiveLayoutCollapseUseFormatters){
264
+ if(column.modules.format && this.table.options.responsiveLayoutCollapseUseFormatters){
268
265
 
269
266
  mockCellComponent = {
270
267
  value:false,
@@ -284,6 +281,9 @@ class ResponsiveLayout extends Module{
284
281
  getColumn:function(){
285
282
  return column.getComponent();
286
283
  },
284
+ getTable:() => {
285
+ return this.table;
286
+ },
287
287
  };
288
288
 
289
289
  function onRendered(callback){
@@ -293,7 +293,7 @@ class ResponsiveLayout extends Module{
293
293
  output.push({
294
294
  field: column.field,
295
295
  title: column.definition.title,
296
- value: column.modules.format.formatter.call(self.table.modules.format, mockCellComponent, column.modules.format.params, onRendered)
296
+ value: column.modules.format.formatter.call(this.table.modules.format, mockCellComponent, column.modules.format.params, onRendered)
297
297
  });
298
298
  }else{
299
299
  output.push({
@@ -16,6 +16,7 @@ class Sort extends Module{
16
16
  this.registerTableOption("columnHeaderSortMulti", true); //multiple or single column sorting
17
17
  this.registerTableOption("sortOrderReverse", false); //reverse internal sort ordering
18
18
  this.registerTableOption("headerSortElement", "<div class='tabulator-arrow'></div>"); //header sort element
19
+ this.registerTableOption("headerSortClickElement", "header"); //element which triggers sort when clicked
19
20
 
20
21
  this.registerColumnOption("sorter");
21
22
  this.registerColumnOption("sorterParams");
@@ -113,10 +114,21 @@ class Sort extends Module{
113
114
 
114
115
  colEl.classList.add("tabulator-sortable");
115
116
 
116
-
117
117
  arrowEl = document.createElement("div");
118
118
  arrowEl.classList.add("tabulator-col-sorter");
119
119
 
120
+ switch(this.table.options.headerSortClickElement){
121
+ case "icon":
122
+ arrowEl.classList.add("tabulator-col-sorter-element");
123
+ break;
124
+ case "header":
125
+ colEl.classList.add("tabulator-col-sorter-element");
126
+ break;
127
+ default:
128
+ colEl.classList.add("tabulator-col-sorter-element");
129
+ break;
130
+ }
131
+
120
132
  switch(this.table.options.headerSortElement){
121
133
  case "function":
122
134
  //do nothing
@@ -138,7 +150,7 @@ class Sort extends Module{
138
150
  this.setColumnHeaderSortIcon(column, "none");
139
151
 
140
152
  //sort on click
141
- colEl.addEventListener("click", (e) => {
153
+ (this.table.options.headerSortClickElement === "icon" ? arrowEl : colEl).addEventListener("click", (e) => {
142
154
  var dir = "",
143
155
  sorters=[],
144
156
  match = false;