tabulator-tables 5.0.6 → 5.0.10

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 (87) hide show
  1. package/bower.json +1 -1
  2. package/build/rollup.js +1 -1
  3. package/dist/css/tabulator.css +4 -0
  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 +4 -0
  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 +4 -0
  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_bulma.css +4 -0
  16. package/dist/css/tabulator_bulma.css.map +1 -1
  17. package/dist/css/tabulator_bulma.min.css +1 -1
  18. package/dist/css/tabulator_bulma.min.css.map +1 -1
  19. package/dist/css/tabulator_materialize.css +4 -0
  20. package/dist/css/tabulator_materialize.css.map +1 -1
  21. package/dist/css/tabulator_materialize.min.css +1 -1
  22. package/dist/css/tabulator_materialize.min.css.map +1 -1
  23. package/dist/css/tabulator_midnight.css +4 -0
  24. package/dist/css/tabulator_midnight.css.map +1 -1
  25. package/dist/css/tabulator_midnight.min.css +1 -1
  26. package/dist/css/tabulator_midnight.min.css.map +1 -1
  27. package/dist/css/tabulator_modern.css +4 -0
  28. package/dist/css/tabulator_modern.css.map +1 -1
  29. package/dist/css/tabulator_modern.min.css +1 -1
  30. package/dist/css/tabulator_modern.min.css.map +1 -1
  31. package/dist/css/tabulator_semanticui.css +4 -0
  32. package/dist/css/tabulator_semanticui.css.map +1 -1
  33. package/dist/css/tabulator_semanticui.min.css +1 -1
  34. package/dist/css/tabulator_semanticui.min.css.map +1 -1
  35. package/dist/css/tabulator_simple.css +4 -0
  36. package/dist/css/tabulator_simple.css.map +1 -1
  37. package/dist/css/tabulator_simple.min.css +1 -1
  38. package/dist/css/tabulator_simple.min.css.map +1 -1
  39. package/dist/css/tabulator_site.css +4 -0
  40. package/dist/css/tabulator_site.css.map +1 -1
  41. package/dist/css/tabulator_site.min.css +1 -1
  42. package/dist/css/tabulator_site.min.css.map +1 -1
  43. package/dist/js/tabulator.js +450 -278
  44. package/dist/js/tabulator.js.map +1 -1
  45. package/dist/js/tabulator.min.js +2 -2
  46. package/dist/js/tabulator.min.js.map +1 -1
  47. package/dist/js/tabulator_esm.js +672 -505
  48. package/dist/js/tabulator_esm.js.map +1 -1
  49. package/dist/js/tabulator_esm.min.js +2 -2
  50. package/dist/js/tabulator_esm.min.js.map +1 -1
  51. package/package.json +1 -1
  52. package/src/js/core/ColumnManager.js +8 -7
  53. package/src/js/core/CoreFeature.js +1 -5
  54. package/src/js/core/RowManager.js +8 -2
  55. package/src/js/core/Tabulator.js +126 -100
  56. package/src/js/core/column/Column.js +2 -2
  57. package/src/js/core/defaults/options.js +1 -1
  58. package/src/js/core/rendering/Renderer.js +3 -2
  59. package/src/js/core/rendering/renderers/VirtualDomHorizontal.js +150 -145
  60. package/src/js/core/rendering/renderers/VirtualDomVertical.js +1 -1
  61. package/src/js/core/tools/{ComponentFuctionBinder.js → ComponentFunctionBinder.js} +1 -1
  62. package/src/js/core/tools/DataLoader.js +2 -2
  63. package/src/js/core/tools/InteractionMonitor.js +143 -48
  64. package/src/js/core/tools/OptionsList.js +2 -2
  65. package/src/js/modules/ColumnCalcs/ColumnCalcs.js +14 -1
  66. package/src/js/modules/DataTree/DataTree.js +18 -9
  67. package/src/js/modules/Download/defaults/downloaders/pdf.js +0 -2
  68. package/src/js/modules/Download/defaults/downloaders/xlsx.js +3 -2
  69. package/src/js/modules/Edit/Edit.js +6 -10
  70. package/src/js/modules/Edit/defaults/editors/progress.js +2 -2
  71. package/src/js/modules/Export/Export.js +1 -1
  72. package/src/js/modules/Filter/Filter.js +9 -4
  73. package/src/js/modules/Format/defaults/formatters/datetime.js +2 -2
  74. package/src/js/modules/Format/defaults/formatters/datetimediff.js +1 -1
  75. package/src/js/modules/FrozenColumns/FrozenColumns.js +1 -1
  76. package/src/js/modules/FrozenRows/FrozenRows.js +4 -1
  77. package/src/js/modules/GroupRows/Group.js +16 -6
  78. package/src/js/modules/GroupRows/GroupRows.js +41 -29
  79. package/src/js/modules/History/History.js +3 -1
  80. package/src/js/modules/HtmlTableImport/HtmlTableImport.js +4 -7
  81. package/src/js/modules/MoveColumns/MoveColumns.js +64 -61
  82. package/src/js/modules/Page/Page.js +8 -10
  83. package/src/js/modules/ResponsiveLayout/ResponsiveLayout.js +3 -5
  84. package/src/js/modules/SelectRow/SelectRow.js +5 -10
  85. package/src/js/modules/Sort/Sort.js +1 -1
  86. package/src/js/modules/Sort/defaults/sorters/datetime.js +3 -2
  87. package/src/scss/tabulator.scss +4 -0
@@ -2,29 +2,29 @@ import CoreFeature from '../CoreFeature.js';
2
2
  import Helpers from './Helpers.js';
3
3
 
4
4
  export default class InteractionManager extends CoreFeature {
5
-
5
+
6
6
  constructor (table){
7
7
  super(table);
8
-
9
- this.el = this.table.element;
10
-
8
+
9
+ this.el = null;
10
+
11
11
  this.abortClasses = ["tabulator-headers", "tabulator-table"];
12
-
12
+
13
13
  this.previousTargets = {};
14
-
14
+
15
15
  this.listeners = [
16
- "click",
17
- "dblclick",
18
- "contextmenu",
19
- "mouseenter",
20
- "mouseleave",
21
- "mouseover",
22
- "mouseout",
23
- "mousemove",
24
- "touchstart",
25
- "touchend",
16
+ "click",
17
+ "dblclick",
18
+ "contextmenu",
19
+ "mouseenter",
20
+ "mouseleave",
21
+ "mouseover",
22
+ "mouseout",
23
+ "mousemove",
24
+ "touchstart",
25
+ "touchend",
26
26
  ];
27
-
27
+
28
28
  this.componentMap = {
29
29
  "tabulator-cell":"cell",
30
30
  "tabulator-row":"row",
@@ -32,36 +32,111 @@ export default class InteractionManager extends CoreFeature {
32
32
  "tabulator-col":"column",
33
33
  };
34
34
 
35
+ this.pseudoTrackers = {
36
+ "row":{
37
+ subscriber:null,
38
+ target:null,
39
+ },
40
+ "cell":{
41
+ subscriber:null,
42
+ target:null,
43
+ },
44
+ "group":{
45
+ subscriber:null,
46
+ target:null,
47
+ },
48
+ "column":{
49
+ subscriber:null,
50
+ target:null,
51
+ },
52
+ }
53
+
54
+ this.pseudoTracking = false;
55
+ }
56
+
57
+ initialize(){
58
+ this.el = this.table.element;
35
59
  this.buildListenerMap();
36
60
  this.bindSubscriptionWatchers();
37
61
  }
38
-
62
+
39
63
  buildListenerMap(){
40
64
  var listenerMap = {};
41
-
65
+
42
66
  this.listeners.forEach((listener) => {
43
67
  listenerMap[listener] = {
44
68
  handler:null,
45
69
  components:[],
46
70
  }
47
71
  })
48
-
72
+
49
73
  this.listeners = listenerMap;
50
74
  }
51
75
 
76
+ bindPseudoEvents(){
77
+ Object.keys(this.pseudoTrackers).forEach((key) => {
78
+ this.pseudoTrackers[key].subscriber = this.pseudoMouseEnter.bind(this, key);
79
+ this.subscribe(key + "-mouseover", this.pseudoTrackers[key].subscriber);
80
+ });
81
+
82
+ this.pseudoTracking = true;
83
+ }
84
+
85
+ pseudoMouseEnter(key, e, target){
86
+ if(this.pseudoTrackers[key].target !== target){
87
+
88
+ if(this.pseudoTrackers[key].target){
89
+ this.dispatch(key + "-mouseleave", e, target);
90
+ }
91
+
92
+ this.pseudoMouseLeave(key, e);
93
+
94
+ this.pseudoTrackers[key].target = target;
95
+
96
+ this.dispatch(key + "-mouseenter", e, target);
97
+ }
98
+ }
99
+
100
+ pseudoMouseLeave(key, e){
101
+ var leaveList = Object.keys(this.pseudoTrackers),
102
+ linkedKeys = {
103
+ "row":["cell"],
104
+ "cell":["row"],
105
+ };
106
+
107
+ leaveList = leaveList.filter((item) => {
108
+ var links = linkedKeys[key];
109
+ return item !== key && (!links || (links && !links.includes(item)));
110
+ });
111
+
112
+
113
+ leaveList.forEach((key) => {
114
+ var target = this.pseudoTrackers[key].target;
115
+
116
+ if(this.pseudoTrackers[key].target){
117
+ this.dispatch(key + "-mouseleave", e, target);
118
+
119
+ this.pseudoTrackers[key].target = null;
120
+ }
121
+ });
122
+ }
123
+
124
+
52
125
  bindSubscriptionWatchers(){
53
126
  var listeners = Object.keys(this.listeners),
54
127
  components = Object.values(this.componentMap);
55
-
128
+
56
129
  for(let comp of components){
57
130
  for(let listener of listeners){
58
131
  let key = comp + "-" + listener;
59
-
132
+
60
133
  this.subscriptionChange(key, this.subscriptionChanged.bind(this, comp, listener));
61
134
  }
62
135
  }
136
+
137
+ this.subscribe("table-destroy", this.clearWatchers.bind(this))
63
138
  }
64
-
139
+
65
140
  subscriptionChanged(component, key, added){
66
141
  var listener = this.listeners[key].components,
67
142
  index = listener.indexOf(component),
@@ -81,20 +156,23 @@ export default class InteractionManager extends CoreFeature {
81
156
  }
82
157
  }
83
158
 
159
+ if((key === "mouseenter" || key === "mouseleave") && !this.pseudoTracking){
160
+ this.bindPseudoEvents();
161
+ }
162
+
84
163
  if(changed){
85
164
  this.updateEventListeners();
86
165
  }
87
166
  }
88
-
167
+
89
168
  updateEventListeners(){
90
169
  for(let key in this.listeners){
91
170
  let listener = this.listeners[key];
92
-
171
+
93
172
  if(listener.components.length){
94
173
  if(!listener.handler){
95
174
  listener.handler = this.track.bind(this, key);
96
175
  this.el.addEventListener(key, listener.handler)
97
- console.log("add", key)
98
176
  // this.el.addEventListener(key, listener.handler, {passive: true})
99
177
  }
100
178
  }else{
@@ -105,57 +183,63 @@ export default class InteractionManager extends CoreFeature {
105
183
  }
106
184
  }
107
185
  }
108
-
186
+
109
187
  track(type, e){
110
188
  var path = (e.composedPath && e.composedPath()) || e.path;
189
+
111
190
  var targets = this.findTargets(path);
112
191
  targets = this.bindComponents(type, targets);
192
+
113
193
  this.triggerEvents(type, e, targets);
114
- }
115
194
 
195
+ if(this.pseudoTracking && (type == "mouseover" || type == "mouseleave") && !Object.keys(targets).length){
196
+ this.pseudoMouseLeave("none", e);
197
+ }
198
+ }
199
+
116
200
  findTargets(path){
117
201
  var targets = {};
118
-
202
+
119
203
  let componentMap = Object.keys(this.componentMap);
120
-
204
+
121
205
  for (let el of path) {
122
206
  let classList = el.classList ? [...el.classList] : [];
123
-
207
+
124
208
  let abort = classList.filter((item) => {
125
209
  return this.abortClasses.includes(item);
126
210
  })
127
-
211
+
128
212
  if(abort.length){
129
213
  break;
130
214
  }
131
-
215
+
132
216
  let elTargets = classList.filter((item) => {
133
217
  return componentMap.includes(item);
134
218
  })
135
-
219
+
136
220
  for (let target of elTargets) {
137
221
  targets[this.componentMap[target]] = el;
138
222
  }
139
223
  }
140
-
224
+
141
225
  if(targets.group && targets.group === targets.row){
142
226
  delete targets.row;
143
227
  }
144
-
228
+
145
229
  return targets;
146
230
  }
147
-
231
+
148
232
  bindComponents(type, targets){
149
233
  //ensure row component is looked up before cell
150
234
  var keys = Object.keys(targets).reverse(),
151
235
  listener = this.listeners[type],
152
236
  targetMatches = {};
153
-
237
+
154
238
  for(let key of keys){
155
239
  let component;
156
240
  let target = targets[key];
157
241
  let previousTarget = this.previousTargets[key];
158
-
242
+
159
243
  if(previousTarget && previousTarget.target === target){
160
244
  component = previousTarget.component;
161
245
  }else{
@@ -163,20 +247,20 @@ export default class InteractionManager extends CoreFeature {
163
247
  case "row":
164
248
  case "group":
165
249
  if(listener.components.includes("row") || listener.components.includes("cell")){
166
- let rows = this.table.rowManager.getVisibleRows();
167
-
250
+ let rows = this.table.rowManager.getVisibleRows(true);
251
+
168
252
  component = rows.find((row) => {
169
253
  return row.getElement() === target;
170
254
  });
171
255
  }
172
256
  break;
173
-
257
+
174
258
  case "column":
175
259
  if(listener.components.includes("column")){
176
260
  component = this.table.columnManager.findColumn(target);
177
261
  }
178
262
  break
179
-
263
+
180
264
  case "cell":
181
265
  if(listener.components.includes("cell")){
182
266
  component = targets["row"].findCell(target);
@@ -184,7 +268,7 @@ export default class InteractionManager extends CoreFeature {
184
268
  break;
185
269
  }
186
270
  }
187
-
271
+
188
272
  if(component){
189
273
  targets[key] = component;
190
274
  targetMatches[key] = {
@@ -193,19 +277,30 @@ export default class InteractionManager extends CoreFeature {
193
277
  }
194
278
  }
195
279
  }
196
-
280
+
197
281
  this.previousTargets = targetMatches;
198
-
282
+
199
283
  return targets;
200
284
  }
201
-
285
+
202
286
  triggerEvents(type, e, targets){
203
287
  var listener = this.listeners[type];
204
-
288
+
205
289
  for(let key in targets){
206
290
  if(targets[key] && listener.components.includes(key)){
207
291
  this.dispatch(key + "-" + type, e, targets[key]);
208
292
  }
209
293
  }
210
294
  }
295
+
296
+ clearWatchers(){
297
+ for(let key in this.listeners){
298
+ let listener = this.listeners[key];
299
+
300
+ if(listener.handler){
301
+ this.el.removeEventListener(key, listener.handler)
302
+ listener.handler = null;
303
+ }
304
+ }
305
+ }
211
306
  }
@@ -1,8 +1,8 @@
1
1
  export default class OptionsList {
2
- constructor(table, msgType){
2
+ constructor(table, msgType, defaults = {}){
3
3
  this.table = table;
4
4
  this.msgType = msgType;
5
- this.registeredDefaults = {};
5
+ this.registeredDefaults = Object.assign({}, defaults)
6
6
  }
7
7
 
8
8
  register(option, value){
@@ -53,6 +53,7 @@ class ColumnCalcs extends Module{
53
53
  this.subscribe("column-add", this.recalcActiveRows.bind(this));
54
54
  this.subscribe("data-refeshed", this.recalcActiveRows.bind(this));
55
55
  this.subscribe("table-redraw", this.tableRedraw.bind(this));
56
+ this.subscribe("rows-visible", this.visibleRows.bind(this));
56
57
 
57
58
  this.registerTableFunction("getCalcResults", this.getResults.bind(this));
58
59
  this.registerTableFunction("recalc", this.userRecalc.bind(this));
@@ -78,6 +79,18 @@ class ColumnCalcs extends Module{
78
79
  ///////// Internal Logic //////////
79
80
  ///////////////////////////////////
80
81
 
82
+ visibleRows(viewable, rows){
83
+ if(this.topRow){
84
+ rows.unshift(this.topRow);
85
+ }
86
+
87
+ if(this.botRow){
88
+ rows.push(this.botRow);
89
+ }
90
+
91
+ return rows;
92
+ }
93
+
81
94
  rowsUpdated(row){
82
95
  if(this.table.options.groupBy){
83
96
  this.recalcRowGroup(this);
@@ -354,7 +367,7 @@ class ColumnCalcs extends Module{
354
367
 
355
368
  row.getComponent = () => {
356
369
  if(!row.component){
357
- row.component = new CalcComponent(this);
370
+ row.component = new CalcComponent(row);
358
371
  }
359
372
 
360
373
  return row.component;
@@ -43,12 +43,10 @@ class DataTree extends Module{
43
43
  initialize(){
44
44
  if(this.table.options.dataTree){
45
45
  var dummyEl = null,
46
- firstCol = this.table.columnManager.getFirstVisibileColumn(),
47
46
  options = this.table.options;
48
47
 
49
48
  this.field = options.dataTreeChildField;
50
49
  this.indent = options.dataTreeChildIndent;
51
- this.elementField = options.dataTreeElementColumn || (firstCol ? firstCol.field : false);
52
50
 
53
51
  if(options.dataTreeBranchElement){
54
52
 
@@ -117,15 +115,23 @@ class DataTree extends Module{
117
115
 
118
116
  this.subscribe("row-init", this.initializeRow.bind(this));
119
117
  this.subscribe("row-layout-after", this.layoutRow.bind(this));
120
- this.subscribe("row-relayout", this.layoutRow.bind(this));
121
118
  this.subscribe("row-deleted", this.rowDelete.bind(this),0);
122
119
  this.subscribe("row-data-changed", this.rowDataChanged.bind(this), 10);
120
+ this.subscribe("cell-value-updated", this.cellValueChanged.bind(this));
121
+ this.subscribe("edit-cancelled", this.cellValueChanged.bind(this));
123
122
  this.subscribe("column-moving-rows", this.columnMoving.bind(this));
123
+ this.subscribe("table-built", this.initializeElementField.bind(this));
124
124
 
125
125
  this.registerDisplayHandler(this.getRows.bind(this), 30);
126
126
  }
127
127
  }
128
128
 
129
+ initializeElementField(){
130
+ var firstCol = this.table.columnManager.getFirstVisibleColumn();
131
+
132
+ this.elementField = this.table.options.dataTreeElementColumn || (firstCol ? firstCol.field : false);
133
+ }
134
+
129
135
  getRowChildren(row){
130
136
  return this.getTreeChildren(row, true);
131
137
  }
@@ -151,6 +157,14 @@ class DataTree extends Module{
151
157
  }
152
158
  }
153
159
 
160
+ cellValueChanged(cell){
161
+ var field = cell.column.getField();
162
+
163
+ if(field === this.elementField){
164
+ this.layoutRow(cell.row);
165
+ }
166
+ }
167
+
154
168
  initializeRow(row){
155
169
  var childArray = row.getData()[this.field];
156
170
  var isArray = Array.isArray(childArray);
@@ -555,17 +569,12 @@ class DataTree extends Module{
555
569
  return output;
556
570
  }
557
571
 
558
- checkForRestyle(cell){
559
- if(!cell.row.cells.indexOf(cell)){
560
- this.layoutRow(cell.row);
561
- }
562
- }
563
-
564
572
  getChildField(){
565
573
  return this.field;
566
574
  }
567
575
 
568
576
  redrawNeeded(data){
577
+ console.log("needed?", data)
569
578
  return (this.field ? typeof data[this.field] !== "undefined" : false) || (this.elementField ? typeof data[this.elementField] !== "undefined" : false);
570
579
  }
571
580
  }
@@ -77,8 +77,6 @@ export default function(list, options, setFileContents){
77
77
  }
78
78
 
79
79
  rowData.push(cell);
80
- }else{
81
- rowData.push("");
82
80
  }
83
81
  });
84
82
 
@@ -26,7 +26,9 @@ export default function(list, options, setFileContents){
26
26
  rowData.push(!(col.value instanceof Date) && typeof col.value === "object" ? JSON.stringify(col.value) : col.value);
27
27
 
28
28
  if(col.width > 1 || col.height > -1){
29
- merges.push({s:{r:i,c:j},e:{r:i + col.height - 1,c:j + col.width - 1}});
29
+ if(col.height > 1 || col.width > 1){
30
+ merges.push({s:{r:i,c:j},e:{r:i + col.height - 1,c:j + col.width - 1}});
31
+ }
30
32
  }
31
33
  }else{
32
34
  rowData.push("");
@@ -36,7 +38,6 @@ export default function(list, options, setFileContents){
36
38
  rows.push(rowData);
37
39
  });
38
40
 
39
-
40
41
  //convert rows to worksheet
41
42
  XLSX.utils.sheet_add_aoa(worksheet, rows);
42
43
 
@@ -405,20 +405,23 @@ class Edit extends Module{
405
405
 
406
406
  this.invalidEdit = false;
407
407
 
408
+ console.log("clear", cancel, cell, cell.validate)
409
+
408
410
  if(cell){
409
411
  this.currentCell = false;
410
412
 
411
413
  cellEl = cell.getElement();
412
414
 
413
415
  if(cancel){
414
- if(cell.validate){
415
- cell.validate();
416
+ if(cell.column.modules.validate && this.table.modExists("validate")){
417
+ this.table.modules.validate.cellValidate(cell);
416
418
  }
417
419
  }else{
418
420
  cellEl.classList.remove("tabulator-validation-fail");
419
421
  }
420
422
 
421
423
  cellEl.classList.remove("tabulator-editing");
424
+
422
425
  while(cellEl.firstChild) cellEl.removeChild(cellEl.firstChild);
423
426
 
424
427
  cell.row.getElement().classList.remove("tabulator-row-editing");
@@ -442,6 +445,7 @@ class Edit extends Module{
442
445
  cell.column.definition.cellEditCancelled.call(this.table, component);
443
446
  }
444
447
 
448
+ this.dispatch("edit-cancelled", cell);
445
449
  this.dispatchExternal("cellEditCancelled", component);
446
450
  }
447
451
  }
@@ -572,10 +576,6 @@ class Edit extends Module{
572
576
 
573
577
  cell.setValue(value, true);
574
578
 
575
- if(self.table.options.dataTree && self.table.modExists("dataTree")){
576
- self.table.modules.dataTree.checkForRestyle(cell);
577
- }
578
-
579
579
  if(valid !== true){
580
580
  element.classList.add("tabulator-validation-fail");
581
581
  self.table.externalEvents.dispatch("validationFailed", cell.getComponent(), value, valid);
@@ -600,10 +600,6 @@ class Edit extends Module{
600
600
  function cancel(){
601
601
  if(self.currentCell === cell){
602
602
  self.cancelEdit();
603
-
604
- if(self.table.options.dataTree && self.table.modExists("dataTree")){
605
- self.table.modules.dataTree.checkForRestyle(cell);
606
- }
607
603
  }else{
608
604
  // console.warn("Edit Success Error - cannot call cancel on a cell that is no longer being edited");
609
605
  }
@@ -1,8 +1,8 @@
1
1
  //draggable progress bar
2
2
  export default function(cell, onRendered, success, cancel, editorParams){
3
3
  var element = cell.getElement(),
4
- max = typeof editorParams.max === "undefined" ? ( element.getElementsByTagName("div")[0]?.getAttribute("max") || 100) : editorParams.max,
5
- min = typeof editorParams.min === "undefined" ? ( element.getElementsByTagName("div")[0]?.getAttribute("min") || 0) : editorParams.min,
4
+ max = typeof editorParams.max === "undefined" ? ((element.getElementsByTagName("div")[0] && element.getElementsByTagName("div")[0].getAttribute("max")) || 100) : editorParams.max,
5
+ min = typeof editorParams.min === "undefined" ? ((element.getElementsByTagName("div")[0] && element.getElementsByTagName("div")[0].getAttribute("min")) || 0) : editorParams.min,
6
6
  percent = (max - min) / 100,
7
7
  value = cell.getValue() || 0,
8
8
  handle = document.createElement("div"),
@@ -63,7 +63,7 @@ class Export extends Module{
63
63
  switch(range){
64
64
  case true:
65
65
  case "visible":
66
- rows = this.table.rowManager.getVisibleRows(true);
66
+ rows = this.table.rowManager.getVisibleRows(false, true);
67
67
  break;
68
68
 
69
69
  case "all":
@@ -15,6 +15,7 @@ class Filter extends Module{
15
15
  this.prevHeaderFilterChangeCheck = "{}";
16
16
 
17
17
  this.changed = false; //has filtering changed since last render
18
+ this.tableInitialized = false;
18
19
 
19
20
  this.registerTableOption("filterMode", "local"); //local or remote filtering
20
21
 
@@ -82,6 +83,8 @@ class Filter extends Module{
82
83
  }
83
84
  });
84
85
  }
86
+
87
+ this.tableInitialized = true;
85
88
  }
86
89
 
87
90
  remoteFilterParams(data, config, silent, params){
@@ -546,10 +549,12 @@ class Filter extends Module{
546
549
  }
547
550
 
548
551
  refreshFilter(){
549
- if(this.table.options.filterMode === "remote"){
550
- this.reloadData();
551
- }else{
552
- this.refreshData();
552
+ if(this.tableInitialized){
553
+ if(this.table.options.filterMode === "remote"){
554
+ this.reloadData();
555
+ }else{
556
+ this.refreshData(true);
557
+ }
553
558
  }
554
559
 
555
560
  //TODO - Persist left position of row manager
@@ -6,7 +6,7 @@ export default function(cell, formatterParams, onRendered){
6
6
  var value = cell.getValue();
7
7
 
8
8
  if(typeof DT != "undefined"){
9
- var newDatetime = (window.DateTime || luxon.DateTime).fromFormat(value, inputFormat);
9
+ var newDatetime = DT.fromFormat(String(value), inputFormat);
10
10
 
11
11
  if(newDatetime.isValid){
12
12
 
@@ -17,7 +17,7 @@ export default function(cell, formatterParams, onRendered){
17
17
  return newDatetime.toFormat(outputFormat);
18
18
  }else{
19
19
 
20
- if(invalid === true){
20
+ if(invalid === true || !value){
21
21
  return value;
22
22
  }else if(typeof invalid === "function"){
23
23
  return invalid(value);
@@ -9,7 +9,7 @@ export default function (cell, formatterParams, onRendered) {
9
9
  var value = cell.getValue();
10
10
 
11
11
  if(typeof DT != "undefined"){
12
- var newDatetime = DT.fromFormat(value, inputFormat);
12
+ var newDatetime = DT.fromFormat(String(value), inputFormat);
13
13
 
14
14
  if (newDatetime.isValid){
15
15
  if(humanize){
@@ -35,7 +35,7 @@ class FrozenColumns extends Module{
35
35
  this.subscribe("cell-layout", this.layoutCell.bind(this));
36
36
  this.subscribe("column-init", this.initializeColumn.bind(this));
37
37
  this.subscribe("column-width", this.layout.bind(this));
38
- this.subscribe("row-layout-before", this.layoutRow.bind(this));
38
+ this.subscribe("row-layout-after", this.layoutRow.bind(this));
39
39
  this.subscribe("table-layout", this.layout.bind(this));
40
40
  this.subscribe("scroll-horizontal", this.scrollHorizontal.bind(this));
41
41
  this.subscribe("columns-loading", this.reset.bind(this));
@@ -99,7 +99,10 @@ class FrozenRows extends Module{
99
99
 
100
100
  if(index > -1){
101
101
  var rowEl = row.getElement();
102
- rowEl.parentNode.removeChild(rowEl);
102
+
103
+ if(rowEl.parentNode){
104
+ rowEl.parentNode.removeChild(rowEl);
105
+ }
103
106
 
104
107
  this.rows.splice(index, 1);
105
108
  }