tabulator-tables 5.2.7 → 5.3.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 (214) hide show
  1. package/.eslintignore +3 -0
  2. package/.eslintrc.js +28 -0
  3. package/.github/workflows/bad-files-check.yml +39 -0
  4. package/.github/workflows/lint-and-test.yml +31 -0
  5. package/README.md +3 -3
  6. package/bower.json +1 -1
  7. package/build/Bundler.js +77 -77
  8. package/dist/css/tabulator.css +12 -7
  9. package/dist/css/tabulator.css.map +1 -1
  10. package/dist/css/tabulator.min.css +1 -1
  11. package/dist/css/tabulator.min.css.map +1 -1
  12. package/dist/css/tabulator_bootstrap3.css +12 -7
  13. package/dist/css/tabulator_bootstrap3.css.map +1 -1
  14. package/dist/css/tabulator_bootstrap3.min.css +1 -1
  15. package/dist/css/tabulator_bootstrap3.min.css.map +1 -1
  16. package/dist/css/tabulator_bootstrap4.css +12 -7
  17. package/dist/css/tabulator_bootstrap4.css.map +1 -1
  18. package/dist/css/tabulator_bootstrap4.min.css +1 -1
  19. package/dist/css/tabulator_bootstrap4.min.css.map +1 -1
  20. package/dist/css/tabulator_bootstrap5.css +12 -7
  21. package/dist/css/tabulator_bootstrap5.css.map +1 -1
  22. package/dist/css/tabulator_bootstrap5.min.css +1 -1
  23. package/dist/css/tabulator_bootstrap5.min.css.map +1 -1
  24. package/dist/css/tabulator_bulma.css +12 -7
  25. package/dist/css/tabulator_bulma.css.map +1 -1
  26. package/dist/css/tabulator_bulma.min.css +1 -1
  27. package/dist/css/tabulator_bulma.min.css.map +1 -1
  28. package/dist/css/tabulator_materialize.css +12 -7
  29. package/dist/css/tabulator_materialize.css.map +1 -1
  30. package/dist/css/tabulator_materialize.min.css +1 -1
  31. package/dist/css/tabulator_materialize.min.css.map +1 -1
  32. package/dist/css/tabulator_midnight.css +12 -7
  33. package/dist/css/tabulator_midnight.css.map +1 -1
  34. package/dist/css/tabulator_midnight.min.css +1 -1
  35. package/dist/css/tabulator_midnight.min.css.map +1 -1
  36. package/dist/css/tabulator_modern.css +12 -7
  37. package/dist/css/tabulator_modern.css.map +1 -1
  38. package/dist/css/tabulator_modern.min.css +1 -1
  39. package/dist/css/tabulator_modern.min.css.map +1 -1
  40. package/dist/css/tabulator_semanticui.css +12 -7
  41. package/dist/css/tabulator_semanticui.css.map +1 -1
  42. package/dist/css/tabulator_semanticui.min.css +1 -1
  43. package/dist/css/tabulator_semanticui.min.css.map +1 -1
  44. package/dist/css/tabulator_simple.css +12 -7
  45. package/dist/css/tabulator_simple.css.map +1 -1
  46. package/dist/css/tabulator_simple.min.css +1 -1
  47. package/dist/css/tabulator_simple.min.css.map +1 -1
  48. package/dist/css/tabulator_site.css +12 -7
  49. package/dist/css/tabulator_site.css.map +1 -1
  50. package/dist/css/tabulator_site.min.css +1 -1
  51. package/dist/css/tabulator_site.min.css.map +1 -1
  52. package/dist/js/jquery_wrapper.js +37 -37
  53. package/dist/js/tabulator.js +1388 -683
  54. package/dist/js/tabulator.js.map +1 -1
  55. package/dist/js/tabulator.min.js +2 -2
  56. package/dist/js/tabulator.min.js.map +1 -1
  57. package/dist/js/tabulator_esm.js +4135 -3470
  58. package/dist/js/tabulator_esm.js.map +1 -1
  59. package/dist/js/tabulator_esm.min.js +2 -2
  60. package/dist/js/tabulator_esm.min.js.map +1 -1
  61. package/package.json +4 -1
  62. package/src/js/builds/jquery_wrapper.js +37 -37
  63. package/src/js/core/ColumnManager.js +259 -231
  64. package/src/js/core/CoreFeature.js +16 -2
  65. package/src/js/core/FooterManager.js +10 -10
  66. package/src/js/core/Module.js +8 -8
  67. package/src/js/core/RowManager.js +79 -88
  68. package/src/js/core/Tabulator.js +86 -72
  69. package/src/js/core/TabulatorFull.js +1 -1
  70. package/src/js/core/cell/Cell.js +15 -16
  71. package/src/js/core/cell/CellComponent.js +2 -2
  72. package/src/js/core/column/Column.js +55 -66
  73. package/src/js/core/column/ColumnComponent.js +4 -4
  74. package/src/js/core/column/defaults/options.js +1 -1
  75. package/src/js/core/defaults/options.js +4 -2
  76. package/src/js/core/rendering/Renderer.js +19 -19
  77. package/src/js/core/rendering/renderers/BasicHorizontal.js +1 -2
  78. package/src/js/core/rendering/renderers/BasicVertical.js +1 -1
  79. package/src/js/core/rendering/renderers/VirtualDomHorizontal.js +42 -58
  80. package/src/js/core/rendering/renderers/VirtualDomVertical.js +31 -22
  81. package/src/js/core/row/Row.js +32 -8
  82. package/src/js/core/row/RowComponent.js +8 -4
  83. package/src/js/core/tools/Alert.js +44 -45
  84. package/src/js/core/tools/ComponentFunctionBinder.js +4 -2
  85. package/src/js/core/tools/DataLoader.js +3 -3
  86. package/src/js/core/tools/DeprecationAdvisor.js +47 -0
  87. package/src/js/core/tools/ExternalEventBus.js +5 -5
  88. package/src/js/core/tools/InteractionMonitor.js +31 -32
  89. package/src/js/core/tools/InternalEventBus.js +5 -5
  90. package/src/js/core/tools/ModuleBinder.js +6 -6
  91. package/src/js/core/tools/OptionsList.js +4 -4
  92. package/src/js/core/tools/Popup.js +211 -202
  93. package/src/js/modules/Accessor/Accessor.js +16 -16
  94. package/src/js/modules/Accessor/defaults/accessors.js +1 -1
  95. package/src/js/modules/Ajax/Ajax.js +7 -7
  96. package/src/js/modules/Ajax/defaults/loaderPromise.js +19 -19
  97. package/src/js/modules/Ajax/defaults/urlGenerator.js +1 -1
  98. package/src/js/modules/Clipboard/Clipboard.js +23 -23
  99. package/src/js/modules/Clipboard/defaults/pasteParsers.js +0 -2
  100. package/src/js/modules/ColumnCalcs/CalcComponent.js +2 -2
  101. package/src/js/modules/ColumnCalcs/ColumnCalcs.js +54 -50
  102. package/src/js/modules/ColumnCalcs/defaults/calculations.js +1 -1
  103. package/src/js/modules/DataTree/DataTree.js +19 -14
  104. package/src/js/modules/Download/Download.js +15 -8
  105. package/src/js/modules/Download/defaults/downloaders/csv.js +28 -28
  106. package/src/js/modules/Download/defaults/downloaders/html.js +2 -2
  107. package/src/js/modules/Download/defaults/downloaders/json.js +14 -14
  108. package/src/js/modules/Download/defaults/downloaders/jsonLines.js +1 -1
  109. package/src/js/modules/Download/defaults/downloaders/pdf.js +17 -19
  110. package/src/js/modules/Download/defaults/downloaders/xlsx.js +2 -2
  111. package/src/js/modules/Edit/Edit.js +219 -201
  112. package/src/js/modules/Edit/List.js +1026 -1006
  113. package/src/js/modules/Edit/defaults/editors/autocomplete.js +3 -3
  114. package/src/js/modules/Edit/defaults/editors/date.js +110 -0
  115. package/src/js/modules/Edit/defaults/editors/datetime.js +97 -0
  116. package/src/js/modules/Edit/defaults/editors/input.js +7 -7
  117. package/src/js/modules/Edit/defaults/editors/list.js +2 -2
  118. package/src/js/modules/Edit/defaults/editors/number.js +12 -12
  119. package/src/js/modules/Edit/defaults/editors/progress.js +11 -11
  120. package/src/js/modules/Edit/defaults/editors/range.js +5 -5
  121. package/src/js/modules/Edit/defaults/editors/select.js +3 -3
  122. package/src/js/modules/Edit/defaults/editors/star.js +9 -9
  123. package/src/js/modules/Edit/defaults/editors/textarea.js +97 -92
  124. package/src/js/modules/Edit/defaults/editors/tickCross.js +1 -3
  125. package/src/js/modules/Edit/defaults/editors/time.js +98 -0
  126. package/src/js/modules/Edit/defaults/editors.js +8 -2
  127. package/src/js/modules/Edit/inputMask.js +19 -26
  128. package/src/js/modules/Export/Export.js +69 -65
  129. package/src/js/modules/Filter/Filter.js +85 -95
  130. package/src/js/modules/Format/Format.js +24 -26
  131. package/src/js/modules/Format/defaults/formatters/buttonCross.js +1 -1
  132. package/src/js/modules/Format/defaults/formatters/buttonTick.js +1 -1
  133. package/src/js/modules/Format/defaults/formatters/color.js +1 -1
  134. package/src/js/modules/Format/defaults/formatters/datetime.js +7 -7
  135. package/src/js/modules/Format/defaults/formatters/datetimediff.js +7 -7
  136. package/src/js/modules/Format/defaults/formatters/handle.js +1 -1
  137. package/src/js/modules/Format/defaults/formatters/html.js +1 -1
  138. package/src/js/modules/Format/defaults/formatters/image.js +9 -9
  139. package/src/js/modules/Format/defaults/formatters/link.js +10 -10
  140. package/src/js/modules/Format/defaults/formatters/lookup.js +1 -1
  141. package/src/js/modules/Format/defaults/formatters/money.js +1 -1
  142. package/src/js/modules/Format/defaults/formatters/plaintext.js +1 -1
  143. package/src/js/modules/Format/defaults/formatters/progress.js +41 -42
  144. package/src/js/modules/Format/defaults/formatters/responsiveCollapse.js +3 -3
  145. package/src/js/modules/Format/defaults/formatters/rowSelection.js +1 -1
  146. package/src/js/modules/Format/defaults/formatters/rownum.js +9 -2
  147. package/src/js/modules/Format/defaults/formatters/star.js +1 -1
  148. package/src/js/modules/Format/defaults/formatters/textarea.js +1 -1
  149. package/src/js/modules/Format/defaults/formatters/tickCross.js +1 -1
  150. package/src/js/modules/Format/defaults/formatters/traffic.js +14 -14
  151. package/src/js/modules/FrozenColumns/FrozenColumns.js +6 -8
  152. package/src/js/modules/FrozenRows/FrozenRows.js +37 -7
  153. package/src/js/modules/GroupRows/Group.js +3 -3
  154. package/src/js/modules/GroupRows/GroupComponent.js +2 -2
  155. package/src/js/modules/GroupRows/GroupRows.js +12 -11
  156. package/src/js/modules/History/History.js +2 -2
  157. package/src/js/modules/HtmlTableImport/HtmlTableImport.js +3 -6
  158. package/src/js/modules/Import/Import.js +158 -159
  159. package/src/js/modules/Import/defaults/importers/array.js +5 -0
  160. package/src/js/modules/Import/defaults/importers/csv.js +49 -49
  161. package/src/js/modules/Import/defaults/importers/json.js +6 -6
  162. package/src/js/modules/Import/defaults/importers.js +2 -0
  163. package/src/js/modules/Interaction/Interaction.js +39 -40
  164. package/src/js/modules/Keybindings/Keybindings.js +14 -14
  165. package/src/js/modules/Keybindings/defaults/actions.js +1 -2
  166. package/src/js/modules/Layout/Layout.js +4 -5
  167. package/src/js/modules/Layout/defaults/modes/fitColumns.js +9 -10
  168. package/src/js/modules/Layout/defaults/modes/fitData.js +6 -4
  169. package/src/js/modules/Layout/defaults/modes/fitDataGeneral.js +2 -2
  170. package/src/js/modules/Layout/defaults/modes/fitDataStretch.js +2 -2
  171. package/src/js/modules/Localize/Localize.js +7 -7
  172. package/src/js/modules/Menu/Menu.js +8 -11
  173. package/src/js/modules/MoveColumns/MoveColumns.js +3 -6
  174. package/src/js/modules/MoveRows/MoveRows.js +30 -36
  175. package/src/js/modules/Mutator/Mutator.js +9 -9
  176. package/src/js/modules/Page/Page.js +73 -80
  177. package/src/js/modules/Page/defaults/pageCounters/pages.js +2 -2
  178. package/src/js/modules/Page/defaults/pageCounters/rows.js +1 -1
  179. package/src/js/modules/Persistence/Persistence.js +40 -44
  180. package/src/js/modules/Persistence/defaults/readers.js +1 -1
  181. package/src/js/modules/Popup/Popup.js +4 -5
  182. package/src/js/modules/Print/Print.js +2 -2
  183. package/src/js/modules/ReactiveData/ReactiveData.js +178 -115
  184. package/src/js/modules/ResizeColumns/ResizeColumns.js +3 -3
  185. package/src/js/modules/ResizeRows/ResizeRows.js +1 -1
  186. package/src/js/modules/ResizeTable/ResizeTable.js +77 -46
  187. package/src/js/modules/ResponsiveLayout/ResponsiveLayout.js +0 -3
  188. package/src/js/modules/SelectRow/SelectRow.js +26 -28
  189. package/src/js/modules/Sort/Sort.js +110 -79
  190. package/src/js/modules/Sort/defaults/sorters/alphanum.js +1 -1
  191. package/src/js/modules/Sort/defaults/sorters/array.js +24 -28
  192. package/src/js/modules/Sort/defaults/sorters/boolean.js +1 -1
  193. package/src/js/modules/Sort/defaults/sorters/date.js +1 -1
  194. package/src/js/modules/Sort/defaults/sorters/datetime.js +13 -13
  195. package/src/js/modules/Sort/defaults/sorters/exists.js +1 -1
  196. package/src/js/modules/Sort/defaults/sorters/number.js +1 -1
  197. package/src/js/modules/Sort/defaults/sorters/string.js +7 -7
  198. package/src/js/modules/Sort/defaults/sorters/time.js +1 -1
  199. package/src/js/modules/Tooltip/Tooltip.js +5 -7
  200. package/src/js/modules/Validate/Validate.js +10 -13
  201. package/src/js/modules/Validate/defaults/validators.js +8 -3
  202. package/src/scss/tabulator.scss +28 -17
  203. package/src/scss/themes/bootstrap/functions4.scss +1 -1
  204. package/src/scss/themes/bootstrap/tabulator_bootstrap3.scss +8 -8
  205. package/src/scss/themes/bootstrap/tabulator_bootstrap4.scss +8 -8
  206. package/src/scss/themes/bootstrap/tabulator_bootstrap5.scss +8 -8
  207. package/src/scss/themes/bulma/tabulator_bulma.scss +7 -7
  208. package/src/scss/themes/materialize/tabulator_materialize.scss +6 -6
  209. package/src/scss/themes/materialize/variables.scss +1 -1
  210. package/src/scss/themes/semanticui/tabulator_semanticui.scss +7 -7
  211. package/src/scss/themes/tabulator_midnight.scss +7 -7
  212. package/src/scss/themes/tabulator_modern.scss +14 -14
  213. package/src/scss/themes/tabulator_simple.scss +8 -8
  214. package/src/scss/themes/tabulator_site.scss +15 -15
@@ -10,10 +10,10 @@ import RendererVirtualDomHorizontal from './rendering/renderers/VirtualDomHorizo
10
10
  import defaultColumnOptions from './column/defaults/options.js';
11
11
 
12
12
  export default class ColumnManager extends CoreFeature {
13
-
13
+
14
14
  constructor (table){
15
15
  super(table);
16
-
16
+
17
17
  this.blockHozScrollEvent = false;
18
18
  this.headersElement = null;
19
19
  this.element = null ; //containing element
@@ -22,86 +22,89 @@ export default class ColumnManager extends CoreFeature {
22
22
  this.columnsByField = {}; //columns by field
23
23
  this.scrollLeft = 0;
24
24
  this.optionsList = new OptionsList(this.table, "column definition", defaultColumnOptions);
25
-
25
+
26
+ this.redrawBlock = false; //prevent redraws to allow multiple data manipulations before continuing
27
+ this.redrawBlockUpdate = null; //store latest redraw update only status
28
+
26
29
  this.renderer = null;
27
30
  }
28
-
31
+
29
32
  ////////////// Setup Functions /////////////////
30
-
33
+
31
34
  initialize(){
32
35
  this.initializeRenderer();
33
-
36
+
34
37
  this.headersElement = this.createHeadersElement();
35
38
  this.element = this.createHeaderElement();
36
-
39
+
37
40
  this.element.insertBefore(this.headersElement, this.element.firstChild);
38
-
41
+
39
42
  this.subscribe("scroll-horizontal", this.scrollHorizontal.bind(this));
40
43
  }
41
-
44
+
42
45
  initializeRenderer(){
43
46
  var renderClass;
44
-
47
+
45
48
  var renderers = {
46
49
  "virtual": RendererVirtualDomHorizontal,
47
50
  "basic": RendererBasicHorizontal,
48
51
  };
49
-
52
+
50
53
  if(typeof this.table.options.renderHorizontal === "string"){
51
54
  renderClass = renderers[this.table.options.renderHorizontal];
52
55
  }else{
53
56
  renderClass = this.table.options.renderHorizontal;
54
57
  }
55
-
58
+
56
59
  if(renderClass){
57
60
  this.renderer = new renderClass(this.table, this.element, this.tableElement);
58
61
  this.renderer.initialize();
59
62
  }else{
60
- console.error("Unable to find matching renderer:", table.options.renderHorizontal);
63
+ console.error("Unable to find matching renderer:", this.table.options.renderHorizontal);
61
64
  }
62
65
  }
63
-
64
-
66
+
67
+
65
68
  createHeadersElement (){
66
69
  var el = document.createElement("div");
67
-
70
+
68
71
  el.classList.add("tabulator-headers");
69
72
  el.setAttribute("role", "row");
70
-
73
+
71
74
  return el;
72
75
  }
73
-
76
+
74
77
  createHeaderElement (){
75
78
  var el = document.createElement("div");
76
-
79
+
77
80
  el.classList.add("tabulator-header");
78
81
  el.setAttribute("role", "rowgroup");
79
-
82
+
80
83
  if(!this.table.options.headerVisible){
81
84
  el.classList.add("tabulator-header-hidden");
82
85
  }
83
-
86
+
84
87
  return el;
85
88
  }
86
-
89
+
87
90
  //return containing element
88
91
  getElement(){
89
92
  return this.element;
90
93
  }
91
-
94
+
92
95
  //return header containing element
93
96
  getHeadersElement(){
94
97
  return this.headersElement;
95
98
  }
96
-
99
+
97
100
  //scroll horizontally to match table body
98
101
  scrollHorizontal(left){
99
102
  var hozAdjust = 0,
100
103
  scrollWidth = this.element.scrollWidth - this.table.element.clientWidth;
101
-
104
+
102
105
  // this.tempScrollBlock();
103
106
  this.element.scrollLeft = left;
104
-
107
+
105
108
  //adjust for vertical scrollbar moving table when present
106
109
  if(left > scrollWidth){
107
110
  hozAdjust = left - scrollWidth;
@@ -109,135 +112,135 @@ export default class ColumnManager extends CoreFeature {
109
112
  }else{
110
113
  this.element.style.marginLeft = 0;
111
114
  }
112
-
115
+
113
116
  this.scrollLeft = left;
114
-
117
+
115
118
  this.renderer.scrollColumns(left);
116
119
  }
117
-
120
+
118
121
  ///////////// Column Setup Functions /////////////
119
122
  generateColumnsFromRowData(data){
120
123
  var cols = [],
121
124
  definitions = this.table.options.autoColumnsDefinitions,
122
125
  row, sorter;
123
-
126
+
124
127
  if(data && data.length){
125
-
128
+
126
129
  row = data[0];
127
-
130
+
128
131
  for(var key in row){
129
132
  let col = {
130
133
  field:key,
131
134
  title:key,
132
135
  };
133
-
136
+
134
137
  let value = row[key];
135
-
138
+
136
139
  switch(typeof value){
137
140
  case "undefined":
138
- sorter = "string";
139
- break;
140
-
141
+ sorter = "string";
142
+ break;
143
+
141
144
  case "boolean":
142
- sorter = "boolean";
143
- break;
144
-
145
+ sorter = "boolean";
146
+ break;
147
+
145
148
  case "object":
146
- if(Array.isArray(value)){
147
- sorter = "array";
148
- }else{
149
- sorter = "string";
150
- }
151
- break;
152
-
153
- default:
154
- if(!isNaN(value) && value !== ""){
155
- sorter = "number";
156
- }else{
157
- if(value.match(/((^[0-9]+[a-z]+)|(^[a-z]+[0-9]+))+$/i)){
158
- sorter = "alphanum";
149
+ if(Array.isArray(value)){
150
+ sorter = "array";
159
151
  }else{
160
152
  sorter = "string";
161
153
  }
162
- }
163
- break;
154
+ break;
155
+
156
+ default:
157
+ if(!isNaN(value) && value !== ""){
158
+ sorter = "number";
159
+ }else{
160
+ if(value.match(/((^[0-9]+[a-z]+)|(^[a-z]+[0-9]+))+$/i)){
161
+ sorter = "alphanum";
162
+ }else{
163
+ sorter = "string";
164
+ }
165
+ }
166
+ break;
164
167
  }
165
-
168
+
166
169
  col.sorter = sorter;
167
-
170
+
168
171
  cols.push(col);
169
172
  }
170
-
173
+
171
174
  if(definitions){
172
-
175
+
173
176
  switch(typeof definitions){
174
177
  case "function":
175
- this.table.options.columns = definitions.call(this.table, cols);
176
- break;
177
-
178
+ this.table.options.columns = definitions.call(this.table, cols);
179
+ break;
180
+
178
181
  case "object":
179
- if(Array.isArray(definitions)){
180
- cols.forEach((col) => {
181
- var match = definitions.find((def) => {
182
- return def.field === col.field;
182
+ if(Array.isArray(definitions)){
183
+ cols.forEach((col) => {
184
+ var match = definitions.find((def) => {
185
+ return def.field === col.field;
186
+ });
187
+
188
+ if(match){
189
+ Object.assign(col, match);
190
+ }
183
191
  });
184
-
185
- if(match){
186
- Object.assign(col, match);
187
- }
188
- });
189
-
190
- }else{
191
- cols.forEach((col) => {
192
- if(definitions[col.field]){
193
- Object.assign(col, definitions[col.field]);
194
- }
195
- });
196
- }
197
-
198
- this.table.options.columns = cols;
199
- break;
192
+
193
+ }else{
194
+ cols.forEach((col) => {
195
+ if(definitions[col.field]){
196
+ Object.assign(col, definitions[col.field]);
197
+ }
198
+ });
199
+ }
200
+
201
+ this.table.options.columns = cols;
202
+ break;
200
203
  }
201
204
  }else{
202
205
  this.table.options.columns = cols;
203
206
  }
204
-
207
+
205
208
  this.setColumns(this.table.options.columns);
206
209
  }
207
210
  }
208
-
211
+
209
212
  setColumns(cols, row){
210
213
  while(this.headersElement.firstChild) this.headersElement.removeChild(this.headersElement.firstChild);
211
-
214
+
212
215
  this.columns = [];
213
216
  this.columnsByIndex = [];
214
217
  this.columnsByField = {};
215
-
218
+
216
219
  this.dispatch("columns-loading");
217
-
220
+
218
221
  cols.forEach((def, i) => {
219
222
  this._addColumn(def);
220
223
  });
221
-
224
+
222
225
  this._reIndexColumns();
223
-
226
+
224
227
  this.dispatch("columns-loaded");
225
-
226
- this.renderer.rerenderColumns(false, true);
227
-
228
+
229
+ this.rerenderColumns(false, true);
230
+
228
231
  this.redraw(true);
229
232
  }
230
-
233
+
231
234
  _addColumn(definition, before, nextToColumn){
232
235
  var column = new Column(definition, this),
233
236
  colEl = column.getElement(),
234
237
  index = nextToColumn ? this.findColumnIndex(nextToColumn) : nextToColumn;
235
-
238
+
236
239
  if(nextToColumn && index > -1){
237
- var topColumn = nextToColumn.getTopColumn()
240
+ var topColumn = nextToColumn.getTopColumn();
238
241
  var parentIndex = this.columns.indexOf(topColumn);
239
242
  var nextEl = topColumn.getElement();
240
-
243
+
241
244
  if(before){
242
245
  this.columns.splice(parentIndex, 0, column);
243
246
  nextEl.parentNode.insertBefore(colEl, nextEl);
@@ -254,57 +257,60 @@ export default class ColumnManager extends CoreFeature {
254
257
  this.headersElement.appendChild(column.getElement());
255
258
  }
256
259
  }
257
-
260
+
258
261
  column.columnRendered();
259
-
262
+
260
263
  return column;
261
264
  }
262
-
265
+
263
266
  registerColumnField(col){
264
267
  if(col.definition.field){
265
268
  this.columnsByField[col.definition.field] = col;
266
269
  }
267
270
  }
268
-
271
+
269
272
  registerColumnPosition(col){
270
273
  this.columnsByIndex.push(col);
271
274
  }
272
-
275
+
273
276
  _reIndexColumns(){
274
277
  this.columnsByIndex = [];
275
-
278
+
276
279
  this.columns.forEach(function(column){
277
280
  column.reRegisterPosition();
278
281
  });
279
282
  }
280
-
283
+
281
284
  //ensure column headers take up the correct amount of space in column groups
282
285
  verticalAlignHeaders(){
283
286
  var minHeight = 0;
284
-
285
- this.columns.forEach((column) => {
286
- var height;
287
-
288
- column.clearVerticalAlign();
289
-
290
- height = column.getHeight();
291
-
292
- if(height > minHeight){
293
- minHeight = height;
294
- }
295
- });
296
-
297
- this.columns.forEach((column) => {
298
- column.verticalAlign(this.table.options.columnHeaderVertAlign, minHeight);
299
- });
300
-
301
- this.table.rowManager.adjustTableSize();
287
+
288
+ if(!this.redrawBlock){
289
+
290
+ this.columns.forEach((column) => {
291
+ column.clearVerticalAlign();
292
+ });
293
+
294
+ this.columns.forEach((column) => {
295
+ var height = column.getHeight();
296
+
297
+ if(height > minHeight){
298
+ minHeight = height;
299
+ }
300
+ });
301
+
302
+ this.columns.forEach((column) => {
303
+ column.verticalAlign(this.table.options.columnHeaderVertAlign, minHeight);
304
+ });
305
+
306
+ this.table.rowManager.adjustTableSize();
307
+ }
302
308
  }
303
-
309
+
304
310
  //////////////// Column Details /////////////////
305
311
  findColumn(subject){
306
312
  if(typeof subject == "object"){
307
-
313
+
308
314
  if(subject instanceof Column){
309
315
  //subject is column element
310
316
  return subject;
@@ -316,275 +322,275 @@ export default class ColumnManager extends CoreFeature {
316
322
  let match = this.columns.find((column) => {
317
323
  return column.element === subject;
318
324
  });
319
-
325
+
320
326
  return match || false;
321
327
  }
322
-
328
+
323
329
  }else{
324
330
  //subject should be treated as the field name of the column
325
331
  return this.columnsByField[subject] || false;
326
332
  }
327
-
333
+
328
334
  //catch all for any other type of input
329
335
  return false;
330
336
  }
331
-
337
+
332
338
  getColumnByField(field){
333
339
  return this.columnsByField[field];
334
340
  }
335
-
341
+
336
342
  getColumnsByFieldRoot(root){
337
343
  var matches = [];
338
-
344
+
339
345
  Object.keys(this.columnsByField).forEach((field) => {
340
346
  var fieldRoot = field.split(".")[0];
341
347
  if(fieldRoot === root){
342
348
  matches.push(this.columnsByField[field]);
343
349
  }
344
350
  });
345
-
351
+
346
352
  return matches;
347
353
  }
348
-
354
+
349
355
  getColumnByIndex(index){
350
356
  return this.columnsByIndex[index];
351
357
  }
352
-
353
- getFirstVisibleColumn(index){
358
+
359
+ getFirstVisibleColumn(){
354
360
  var index = this.columnsByIndex.findIndex((col) => {
355
361
  return col.visible;
356
362
  });
357
-
363
+
358
364
  return index > -1 ? this.columnsByIndex[index] : false;
359
365
  }
360
-
366
+
361
367
  getColumns(){
362
368
  return this.columns;
363
369
  }
364
-
370
+
365
371
  findColumnIndex(column){
366
372
  return this.columnsByIndex.findIndex((col) => {
367
373
  return column === col;
368
374
  });
369
375
  }
370
-
376
+
371
377
  //return all columns that are not groups
372
378
  getRealColumns(){
373
379
  return this.columnsByIndex;
374
380
  }
375
-
376
- //travers across columns and call action
381
+
382
+ //traverse across columns and call action
377
383
  traverse(callback){
378
384
  this.columnsByIndex.forEach((column,i) =>{
379
385
  callback(column, i);
380
386
  });
381
387
  }
382
-
383
- //get defintions of actual columns
388
+
389
+ //get definitions of actual columns
384
390
  getDefinitions(active){
385
391
  var output = [];
386
-
392
+
387
393
  this.columnsByIndex.forEach((column) => {
388
394
  if(!active || (active && column.visible)){
389
395
  output.push(column.getDefinition());
390
396
  }
391
397
  });
392
-
398
+
393
399
  return output;
394
400
  }
395
-
401
+
396
402
  //get full nested definition tree
397
403
  getDefinitionTree(){
398
404
  var output = [];
399
-
405
+
400
406
  this.columns.forEach((column) => {
401
407
  output.push(column.getDefinition(true));
402
408
  });
403
-
409
+
404
410
  return output;
405
411
  }
406
-
412
+
407
413
  getComponents(structured){
408
414
  var output = [],
409
415
  columns = structured ? this.columns : this.columnsByIndex;
410
-
416
+
411
417
  columns.forEach((column) => {
412
418
  output.push(column.getComponent());
413
419
  });
414
-
420
+
415
421
  return output;
416
422
  }
417
-
423
+
418
424
  getWidth(){
419
425
  var width = 0;
420
-
426
+
421
427
  this.columnsByIndex.forEach((column) => {
422
428
  if(column.visible){
423
429
  width += column.getWidth();
424
430
  }
425
431
  });
426
-
432
+
427
433
  return width;
428
434
  }
429
-
435
+
430
436
  moveColumn(from, to, after){
431
437
  this.moveColumnActual(from, to, after);
432
-
438
+
433
439
  to.element.parentNode.insertBefore(from.element, to.element);
434
-
440
+
435
441
  if(after){
436
442
  to.element.parentNode.insertBefore(to.element, from.element);
437
443
  }
438
-
444
+
439
445
  this.verticalAlignHeaders();
440
-
446
+
441
447
  this.table.rowManager.reinitialize();
442
448
  }
443
-
449
+
444
450
  moveColumnActual(from, to, after){
445
451
  if(from.parent.isGroup){
446
452
  this._moveColumnInArray(from.parent.columns, from, to, after);
447
453
  }else{
448
454
  this._moveColumnInArray(this.columns, from, to, after);
449
455
  }
450
-
456
+
451
457
  this._moveColumnInArray(this.columnsByIndex, from, to, after, true);
452
-
453
- this.renderer.rerenderColumns(true);
454
-
458
+
459
+ this.rerenderColumns(true);
460
+
455
461
  this.dispatch("column-moved", from, to, after);
456
-
462
+
457
463
  if(this.subscribedExternal("columnMoved")){
458
464
  this.dispatchExternal("columnMoved", from.getComponent(), this.table.columnManager.getComponents());
459
465
  }
460
466
  }
461
-
467
+
462
468
  _moveColumnInArray(columns, from, to, after, updateRows){
463
469
  var fromIndex = columns.indexOf(from),
464
470
  toIndex, rows = [];
465
-
471
+
466
472
  if (fromIndex > -1) {
467
-
473
+
468
474
  columns.splice(fromIndex, 1);
469
-
475
+
470
476
  toIndex = columns.indexOf(to);
471
-
477
+
472
478
  if (toIndex > -1) {
473
-
479
+
474
480
  if(after){
475
481
  toIndex = toIndex+1;
476
482
  }
477
-
483
+
478
484
  }else{
479
485
  toIndex = fromIndex;
480
486
  }
481
-
487
+
482
488
  columns.splice(toIndex, 0, from);
483
-
489
+
484
490
  if(updateRows){
485
-
491
+
486
492
  rows = this.chain("column-moving-rows", [from, to, after], null, []) || [];
487
-
493
+
488
494
  rows = rows.concat(this.table.rowManager.rows);
489
-
495
+
490
496
  rows.forEach(function(row){
491
497
  if(row.cells.length){
492
498
  var cell = row.cells.splice(fromIndex, 1)[0];
493
499
  row.cells.splice(toIndex, 0, cell);
494
500
  }
495
501
  });
496
-
502
+
497
503
  }
498
504
  }
499
505
  }
500
-
506
+
501
507
  scrollToColumn(column, position, ifVisible){
502
508
  var left = 0,
503
509
  offset = 0,
504
510
  adjust = 0,
505
511
  colEl = column.getElement();
506
-
512
+
507
513
  return new Promise((resolve, reject) => {
508
-
514
+
509
515
  if(typeof position === "undefined"){
510
516
  position = this.table.options.scrollToColumnPosition;
511
517
  }
512
-
518
+
513
519
  if(typeof ifVisible === "undefined"){
514
520
  ifVisible = this.table.options.scrollToColumnIfVisible;
515
521
  }
516
-
522
+
517
523
  if(column.visible){
518
-
524
+
519
525
  //align to correct position
520
526
  switch(position){
521
527
  case "middle":
522
528
  case "center":
523
- adjust = -this.element.clientWidth / 2;
524
- break;
525
-
529
+ adjust = -this.element.clientWidth / 2;
530
+ break;
531
+
526
532
  case "right":
527
- adjust = colEl.clientWidth - this.headersElement.clientWidth;
528
- break;
533
+ adjust = colEl.clientWidth - this.headersElement.clientWidth;
534
+ break;
529
535
  }
530
-
536
+
531
537
  //check column visibility
532
538
  if(!ifVisible){
533
-
539
+
534
540
  offset = colEl.offsetLeft;
535
-
541
+
536
542
  if(offset > 0 && offset + colEl.offsetWidth < this.element.clientWidth){
537
543
  return false;
538
544
  }
539
545
  }
540
-
546
+
541
547
  //calculate scroll position
542
548
  left = colEl.offsetLeft + adjust;
543
-
549
+
544
550
  left = Math.max(Math.min(left, this.table.rowManager.element.scrollWidth - this.table.rowManager.element.clientWidth),0);
545
-
551
+
546
552
  this.table.rowManager.scrollHorizontal(left);
547
553
  this.scrollHorizontal(left);
548
-
554
+
549
555
  resolve();
550
556
  }else{
551
557
  console.warn("Scroll Error - Column not visible");
552
558
  reject("Scroll Error - Column not visible");
553
559
  }
554
-
560
+
555
561
  });
556
562
  }
557
-
563
+
558
564
  //////////////// Cell Management /////////////////
559
565
  generateCells(row){
560
566
  var cells = [];
561
-
567
+
562
568
  this.columnsByIndex.forEach((column) => {
563
569
  cells.push(column.generateCell(row));
564
570
  });
565
-
571
+
566
572
  return cells;
567
573
  }
568
-
574
+
569
575
  //////////////// Column Management /////////////////
570
576
  getFlexBaseWidth(){
571
577
  var totalWidth = this.table.element.clientWidth, //table element width
572
578
  fixedWidth = 0;
573
-
579
+
574
580
  //adjust for vertical scrollbar if present
575
581
  if(this.table.rowManager.element.scrollHeight > this.table.rowManager.element.clientHeight){
576
582
  totalWidth -= this.table.rowManager.element.offsetWidth - this.table.rowManager.element.clientWidth;
577
583
  }
578
-
584
+
579
585
  this.columnsByIndex.forEach(function(column){
580
586
  var width, minWidth, colWidth;
581
-
587
+
582
588
  if(column.visible){
583
-
589
+
584
590
  width = column.definition.width || 0;
585
-
591
+
586
592
  minWidth = parseInt(column.minWidth);
587
-
593
+
588
594
  if(typeof(width) == "string"){
589
595
  if(width.indexOf("%") > -1){
590
596
  colWidth = (totalWidth / 100) * parseInt(width) ;
@@ -594,83 +600,105 @@ export default class ColumnManager extends CoreFeature {
594
600
  }else{
595
601
  colWidth = width;
596
602
  }
597
-
603
+
598
604
  fixedWidth += colWidth > minWidth ? colWidth : minWidth;
599
-
605
+
600
606
  }
601
607
  });
602
-
608
+
603
609
  return fixedWidth;
604
610
  }
605
-
611
+
606
612
  addColumn(definition, before, nextToColumn){
607
613
  return new Promise((resolve, reject) => {
608
614
  var column = this._addColumn(definition, before, nextToColumn);
609
-
615
+
610
616
  this._reIndexColumns();
611
-
617
+
612
618
  this.dispatch("column-add", definition, before, nextToColumn);
613
-
619
+
614
620
  if(this.layoutMode() != "fitColumns"){
615
621
  column.reinitializeWidth();
616
622
  }
617
-
623
+
618
624
  this.redraw(true);
619
-
625
+
620
626
  this.table.rowManager.reinitialize();
621
-
622
- this.renderer.rerenderColumns();
623
-
627
+
628
+ this.rerenderColumns();
629
+
624
630
  resolve(column);
625
631
  });
626
632
  }
627
-
633
+
628
634
  //remove column from system
629
635
  deregisterColumn(column){
630
636
  var field = column.getField(),
631
637
  index;
632
-
638
+
633
639
  //remove from field list
634
640
  if(field){
635
641
  delete this.columnsByField[field];
636
642
  }
637
-
643
+
638
644
  //remove from index list
639
645
  index = this.columnsByIndex.indexOf(column);
640
-
646
+
641
647
  if(index > -1){
642
648
  this.columnsByIndex.splice(index, 1);
643
649
  }
644
-
650
+
645
651
  //remove from column list
646
652
  index = this.columns.indexOf(column);
647
-
653
+
648
654
  if(index > -1){
649
655
  this.columns.splice(index, 1);
650
656
  }
651
-
657
+
652
658
  this.verticalAlignHeaders();
653
-
659
+
654
660
  this.redraw();
655
661
  }
656
-
662
+
663
+ rerenderColumns(update, silent){
664
+ if(!this.redrawBlock){
665
+ this.renderer.rerenderColumns(update, silent);
666
+ }else{
667
+ if(update === false || (update === true && this.redrawBlockUpdate === null)){
668
+ this.redrawBlockUpdate = update;
669
+ }
670
+ }
671
+ }
672
+
673
+ blockRedraw(){
674
+ this.redrawBlock = true;
675
+ this.redrawBlockUpdate = null;
676
+ }
677
+
678
+ restoreRedraw(){
679
+ this.redrawBlock = false;
680
+ this.verticalAlignHeaders();
681
+ this.renderer.rerenderColumns(this.redrawBlockUpdate);
682
+
683
+ }
684
+
657
685
  //redraw columns
658
686
  redraw(force){
659
687
  if(Helpers.elVisible(this.element)){
660
688
  this.verticalAlignHeaders();
661
689
  }
662
-
690
+
663
691
  if(force){
664
692
  this.table.rowManager.resetScroll();
665
693
  this.table.rowManager.reinitialize();
666
694
  }
667
-
695
+
668
696
  if(!this.confirm("table-redrawing", force)){
669
- this.layoutRefresh();
697
+ this.layoutRefresh(force);
670
698
  }
671
-
699
+
672
700
  this.dispatch("table-redraw", force);
673
-
701
+
674
702
  this.table.footerManager.redraw();
675
703
  }
676
704
  }