tabulator-tables 5.0.5 → 5.0.9

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 (85) 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 +412 -256
  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 +501 -351
  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 +1 -1
  57. package/src/js/core/defaults/options.js +1 -1
  58. package/src/js/core/rendering/Renderer.js +2 -1
  59. package/src/js/core/rendering/renderers/VirtualDomVertical.js +1 -1
  60. package/src/js/core/tools/{ComponentFuctionBinder.js → ComponentFunctionBinder.js} +1 -1
  61. package/src/js/core/tools/DataLoader.js +1 -1
  62. package/src/js/core/tools/InteractionMonitor.js +126 -49
  63. package/src/js/core/tools/OptionsList.js +2 -2
  64. package/src/js/modules/ColumnCalcs/ColumnCalcs.js +14 -1
  65. package/src/js/modules/DataTree/DataTree.js +18 -9
  66. package/src/js/modules/Download/defaults/downloaders/pdf.js +0 -2
  67. package/src/js/modules/Download/defaults/downloaders/xlsx.js +3 -2
  68. package/src/js/modules/Edit/Edit.js +1 -8
  69. package/src/js/modules/Edit/defaults/editors/progress.js +2 -2
  70. package/src/js/modules/Export/Export.js +1 -1
  71. package/src/js/modules/Filter/Filter.js +9 -4
  72. package/src/js/modules/Format/defaults/formatters/datetime.js +2 -2
  73. package/src/js/modules/Format/defaults/formatters/datetimediff.js +1 -1
  74. package/src/js/modules/Format/defaults/formatters/money.js +8 -1
  75. package/src/js/modules/FrozenRows/FrozenRows.js +4 -1
  76. package/src/js/modules/GroupRows/Group.js +16 -6
  77. package/src/js/modules/GroupRows/GroupRows.js +41 -29
  78. package/src/js/modules/History/History.js +3 -1
  79. package/src/js/modules/HtmlTableImport/HtmlTableImport.js +5 -7
  80. package/src/js/modules/MoveColumns/MoveColumns.js +64 -61
  81. package/src/js/modules/Page/Page.js +8 -10
  82. package/src/js/modules/SelectRow/SelectRow.js +5 -10
  83. package/src/js/modules/Sort/Sort.js +1 -1
  84. package/src/js/modules/Sort/defaults/sorters/datetime.js +3 -2
  85. 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,41 +32,101 @@ export default class InteractionManager extends CoreFeature {
32
32
  "tabulator-col":"column",
33
33
  };
34
34
 
35
+ this.pseudoTrackers = {
36
+ "row":null,
37
+ "cell":null,
38
+ "group":null,
39
+ "column":null,
40
+ }
41
+ }
42
+
43
+ initialize(){
44
+ this.el = this.table.element;
35
45
  this.buildListenerMap();
36
46
  this.bindSubscriptionWatchers();
47
+ this.bindPseudoEvents();
37
48
  }
38
-
49
+
39
50
  buildListenerMap(){
40
51
  var listenerMap = {};
41
-
52
+
42
53
  this.listeners.forEach((listener) => {
43
54
  listenerMap[listener] = {
44
55
  handler:null,
45
56
  components:[],
46
57
  }
47
58
  })
48
-
59
+
49
60
  this.listeners = listenerMap;
50
61
  }
51
62
 
63
+ bindPseudoEvents(){
64
+ Object.keys(this.pseudoTrackers).forEach((key) => {
65
+ this.subscribe(key + "-mouseover", this.pseudoMouseEnter.bind(this, key));
66
+ // this.subscribe(key + "-mouseout", this.pseudoMouseLeave.bind(this, key));
67
+ });
68
+ }
69
+
70
+ pseudoMouseEnter(key, e, target){
71
+ if(this.pseudoTrackers[key] !== target){
72
+
73
+ if(this.pseudoTrackers[key]){
74
+ this.dispatch(key + "-mouseleave", e, target);
75
+ }
76
+
77
+ this.pseudoMouseLeave(key, e);
78
+
79
+ this.pseudoTrackers[key] = target;
80
+
81
+ this.dispatch(key + "-mouseenter", e, target);
82
+ }
83
+ }
84
+
85
+ pseudoMouseLeave(key, e){
86
+ var leaveList = Object.keys(this.pseudoTrackers),
87
+ linkedKeys = {
88
+ "row":["cell"],
89
+ "cell":["row"],
90
+ };
91
+
92
+ leaveList = leaveList.filter((item) => {
93
+ var links = linkedKeys[key];
94
+ return item !== key && (!links || (links && !links.includes(item)));
95
+ });
96
+
97
+
98
+ leaveList.forEach((key) => {
99
+ var target = this.pseudoTrackers[key];
100
+
101
+ if(this.pseudoTrackers[key]){
102
+ this.dispatch(key + "-mouseleave", e, target);
103
+
104
+ this.pseudoTrackers[key] = null;
105
+ }
106
+ });
107
+ }
108
+
109
+
52
110
  bindSubscriptionWatchers(){
53
111
  var listeners = Object.keys(this.listeners),
54
112
  components = Object.values(this.componentMap);
55
-
113
+
56
114
  for(let comp of components){
57
115
  for(let listener of listeners){
58
116
  let key = comp + "-" + listener;
59
-
117
+
60
118
  this.subscriptionChange(key, this.subscriptionChanged.bind(this, comp, listener));
61
119
  }
62
120
  }
121
+
122
+ this.subscribe("table-destroy", this.clearWatchers.bind(this))
63
123
  }
64
-
124
+
65
125
  subscriptionChanged(component, key, added){
66
126
  var listener = this.listeners[key].components,
67
127
  index = listener.indexOf(component),
68
128
  changed = false;
69
-
129
+
70
130
  if(added){
71
131
  if(index === -1){
72
132
  listener.push(component);
@@ -80,16 +140,16 @@ export default class InteractionManager extends CoreFeature {
80
140
  }
81
141
  }
82
142
  }
83
-
143
+
84
144
  if(changed){
85
145
  this.updateEventListeners();
86
146
  }
87
147
  }
88
-
148
+
89
149
  updateEventListeners(){
90
150
  for(let key in this.listeners){
91
151
  let listener = this.listeners[key];
92
-
152
+
93
153
  if(listener.components.length){
94
154
  if(!listener.handler){
95
155
  listener.handler = this.track.bind(this, key);
@@ -104,57 +164,63 @@ export default class InteractionManager extends CoreFeature {
104
164
  }
105
165
  }
106
166
  }
107
-
167
+
108
168
  track(type, e){
109
169
  var path = (e.composedPath && e.composedPath()) || e.path;
170
+
110
171
  var targets = this.findTargets(path);
111
172
  targets = this.bindComponents(type, targets);
173
+
112
174
  this.triggerEvents(type, e, targets);
113
- }
114
175
 
176
+ if((type == "mouseover" || type == "mouseleave") && !Object.keys(targets).length){
177
+ this.pseudoMouseLeave("none", e);
178
+ }
179
+ }
180
+
115
181
  findTargets(path){
116
182
  var targets = {};
117
-
183
+
118
184
  let componentMap = Object.keys(this.componentMap);
119
-
185
+
120
186
  for (let el of path) {
121
187
  let classList = el.classList ? [...el.classList] : [];
122
-
188
+
123
189
  let abort = classList.filter((item) => {
124
190
  return this.abortClasses.includes(item);
125
191
  })
126
-
192
+
127
193
  if(abort.length){
128
194
  break;
129
195
  }
130
-
196
+
131
197
  let elTargets = classList.filter((item) => {
132
198
  return componentMap.includes(item);
133
199
  })
134
-
200
+
135
201
  for (let target of elTargets) {
136
202
  targets[this.componentMap[target]] = el;
137
203
  }
138
204
  }
139
-
205
+
140
206
  if(targets.group && targets.group === targets.row){
141
207
  delete targets.row;
142
208
  }
143
-
209
+
144
210
  return targets;
145
211
  }
146
-
212
+
147
213
  bindComponents(type, targets){
148
214
  //ensure row component is looked up before cell
149
215
  var keys = Object.keys(targets).reverse(),
150
216
  listener = this.listeners[type],
151
217
  targetMatches = {};
152
-
218
+
153
219
  for(let key of keys){
154
220
  let component;
155
221
  let target = targets[key];
156
222
  let previousTarget = this.previousTargets[key];
157
-
223
+
158
224
  if(previousTarget && previousTarget.target === target){
159
225
  component = previousTarget.component;
160
226
  }else{
@@ -162,20 +228,20 @@ export default class InteractionManager extends CoreFeature {
162
228
  case "row":
163
229
  case "group":
164
230
  if(listener.components.includes("row") || listener.components.includes("cell")){
165
- let rows = this.table.rowManager.getVisibleRows();
166
-
231
+ let rows = this.table.rowManager.getVisibleRows(true);
232
+
167
233
  component = rows.find((row) => {
168
234
  return row.getElement() === target;
169
235
  });
170
236
  }
171
237
  break;
172
-
238
+
173
239
  case "column":
174
240
  if(listener.components.includes("column")){
175
241
  component = this.table.columnManager.findColumn(target);
176
242
  }
177
243
  break
178
-
244
+
179
245
  case "cell":
180
246
  if(listener.components.includes("cell")){
181
247
  component = targets["row"].findCell(target);
@@ -183,7 +249,7 @@ export default class InteractionManager extends CoreFeature {
183
249
  break;
184
250
  }
185
251
  }
186
-
252
+
187
253
  if(component){
188
254
  targets[key] = component;
189
255
  targetMatches[key] = {
@@ -192,19 +258,30 @@ export default class InteractionManager extends CoreFeature {
192
258
  }
193
259
  }
194
260
  }
195
-
261
+
196
262
  this.previousTargets = targetMatches;
197
-
263
+
198
264
  return targets;
199
265
  }
200
-
266
+
201
267
  triggerEvents(type, e, targets){
202
268
  var listener = this.listeners[type];
203
-
269
+
204
270
  for(let key in targets){
205
271
  if(targets[key] && listener.components.includes(key)){
206
272
  this.dispatch(key + "-" + type, e, targets[key]);
207
273
  }
208
274
  }
209
275
  }
276
+
277
+ clearWatchers(){
278
+ for(let key in this.listeners){
279
+ let listener = this.listeners[key];
280
+
281
+ if(listener.handler){
282
+ this.el.removeEventListener(key, listener.handler)
283
+ listener.handler = null;
284
+ }
285
+ }
286
+ }
210
287
  }
@@ -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
 
@@ -442,6 +442,7 @@ class Edit extends Module{
442
442
  cell.column.definition.cellEditCancelled.call(this.table, component);
443
443
  }
444
444
 
445
+ this.dispatch("edit-cancelled", cell);
445
446
  this.dispatchExternal("cellEditCancelled", component);
446
447
  }
447
448
  }
@@ -572,10 +573,6 @@ class Edit extends Module{
572
573
 
573
574
  cell.setValue(value, true);
574
575
 
575
- if(self.table.options.dataTree && self.table.modExists("dataTree")){
576
- self.table.modules.dataTree.checkForRestyle(cell);
577
- }
578
-
579
576
  if(valid !== true){
580
577
  element.classList.add("tabulator-validation-fail");
581
578
  self.table.externalEvents.dispatch("validationFailed", cell.getComponent(), value, valid);
@@ -600,10 +597,6 @@ class Edit extends Module{
600
597
  function cancel(){
601
598
  if(self.currentCell === cell){
602
599
  self.cancelEdit();
603
-
604
- if(self.table.options.dataTree && self.table.modExists("dataTree")){
605
- self.table.modules.dataTree.checkForRestyle(cell);
606
- }
607
600
  }else{
608
601
  // console.warn("Edit Success Error - cannot call cancel on a cell that is no longer being edited");
609
602
  }
@@ -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){
@@ -1,9 +1,11 @@
1
1
  export default function(cell, formatterParams, onRendered){
2
2
  var floatVal = parseFloat(cell.getValue()),
3
+ sign = "",
3
4
  number, integer, decimal, rgx;
4
5
 
5
6
  var decimalSym = formatterParams.decimal || ".";
6
7
  var thousandSym = formatterParams.thousand || ",";
8
+ var negativeSign = formatterParams.negativeSign || "-";
7
9
  var symbol = formatterParams.symbol || "";
8
10
  var after = !!formatterParams.symbolAfter;
9
11
  var precision = typeof formatterParams.precision !== "undefined" ? formatterParams.precision : 2;
@@ -12,6 +14,11 @@ export default function(cell, formatterParams, onRendered){
12
14
  return this.emptyToSpace(this.sanitizeHTML(cell.getValue()));
13
15
  }
14
16
 
17
+ if(floatVal < 0){
18
+ floatVal = Math.abs(floatVal);
19
+ sign = negativeSign;
20
+ }
21
+
15
22
  number = precision !== false ? floatVal.toFixed(precision) : floatVal;
16
23
  number = String(number).split(".");
17
24
 
@@ -24,5 +31,5 @@ export default function(cell, formatterParams, onRendered){
24
31
  integer = integer.replace(rgx, "$1" + thousandSym + "$2");
25
32
  }
26
33
 
27
- return after ? integer + decimal + symbol : symbol + integer + decimal;
34
+ return after ? sign + integer + decimal + symbol : sign + symbol + integer + decimal;
28
35
  };
@@ -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
  }
@@ -43,10 +43,16 @@ class Group{
43
43
  group.wipe();
44
44
  });
45
45
  }else{
46
- this.element = false;
47
- this.arrowElement = false;
48
- this.elementContents = false;
46
+ this.rows.forEach((row) => {
47
+ if(row.modules){
48
+ delete row.modules.group;
49
+ }
50
+ });
49
51
  }
52
+
53
+ this.element = false;
54
+ this.arrowElement = false;
55
+ this.elementContents = false;
50
56
  }
51
57
 
52
58
  createElements(){
@@ -268,7 +274,7 @@ class Group{
268
274
  }
269
275
 
270
276
  this.generateGroupHeaderContents();
271
-
277
+
272
278
  if(this.groupManager.table.modExists("columnCalcs") && this.groupManager.table.options.columnCalcs != "table"){
273
279
  this.groupManager.table.modules.columnCalcs.recalcGroup(this);
274
280
  }
@@ -448,7 +454,7 @@ class Group{
448
454
 
449
455
  this.element.classList.add("tabulator-group-visible");
450
456
 
451
- var prev = this.getElement();
457
+ var prev = this.generateElement();
452
458
 
453
459
  if(this.groupList.length){
454
460
  this.groupList.forEach((group) => {
@@ -566,7 +572,11 @@ class Group{
566
572
  ////////////// Standard Row Functions //////////////
567
573
 
568
574
  getElement(){
569
- this.addBindingsd = false;
575
+ return this.elementContents ? this.element : this.generateElement();
576
+ }
577
+
578
+ generateElement(){
579
+ this.addBindings = false;
570
580
 
571
581
  this._visSet();
572
582