tabulator-tables 5.2.7 → 5.3.2

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 +1551 -793
  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 +4300 -3581
  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 +270 -232
  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 +139 -156
  68. package/src/js/core/Tabulator.js +88 -74
  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 +81 -68
  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 +41 -39
  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 +55 -51
  102. package/src/js/modules/ColumnCalcs/defaults/calculations.js +1 -1
  103. package/src/js/modules/DataTree/DataTree.js +24 -15
  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 +88 -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 +7 -7
  154. package/src/js/modules/GroupRows/GroupComponent.js +2 -2
  155. package/src/js/modules/GroupRows/GroupRows.js +34 -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 +42 -43
  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 +13 -16
  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 +3 -5
  188. package/src/js/modules/SelectRow/SelectRow.js +26 -28
  189. package/src/js/modules/Sort/Sort.js +113 -85
  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,62 @@ 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
- if(typeof subject == "object"){
312
+ var columns;
307
313
 
314
+ if(typeof subject == "object"){
315
+
308
316
  if(subject instanceof Column){
309
317
  //subject is column element
310
318
  return subject;
@@ -312,279 +320,287 @@ export default class ColumnManager extends CoreFeature {
312
320
  //subject is public column component
313
321
  return subject._getSelf() || false;
314
322
  }else if(typeof HTMLElement !== "undefined" && subject instanceof HTMLElement){
323
+
324
+ columns = [];
325
+
326
+ this.columns.forEach((column) => {
327
+ columns.push(column);
328
+ columns = columns.concat(column.getColumns(true));
329
+ });
330
+
315
331
  //subject is a HTML element of the column header
316
- let match = this.columns.find((column) => {
332
+ let match = columns.find((column) => {
317
333
  return column.element === subject;
318
334
  });
319
-
335
+
320
336
  return match || false;
321
337
  }
322
-
338
+
323
339
  }else{
324
340
  //subject should be treated as the field name of the column
325
341
  return this.columnsByField[subject] || false;
326
342
  }
327
-
343
+
328
344
  //catch all for any other type of input
329
345
  return false;
330
346
  }
331
-
347
+
332
348
  getColumnByField(field){
333
349
  return this.columnsByField[field];
334
350
  }
335
-
351
+
336
352
  getColumnsByFieldRoot(root){
337
353
  var matches = [];
338
-
354
+
339
355
  Object.keys(this.columnsByField).forEach((field) => {
340
356
  var fieldRoot = field.split(".")[0];
341
357
  if(fieldRoot === root){
342
358
  matches.push(this.columnsByField[field]);
343
359
  }
344
360
  });
345
-
361
+
346
362
  return matches;
347
363
  }
348
-
364
+
349
365
  getColumnByIndex(index){
350
366
  return this.columnsByIndex[index];
351
367
  }
352
-
353
- getFirstVisibleColumn(index){
368
+
369
+ getFirstVisibleColumn(){
354
370
  var index = this.columnsByIndex.findIndex((col) => {
355
371
  return col.visible;
356
372
  });
357
-
373
+
358
374
  return index > -1 ? this.columnsByIndex[index] : false;
359
375
  }
360
-
376
+
361
377
  getColumns(){
362
378
  return this.columns;
363
379
  }
364
-
380
+
365
381
  findColumnIndex(column){
366
382
  return this.columnsByIndex.findIndex((col) => {
367
383
  return column === col;
368
384
  });
369
385
  }
370
-
386
+
371
387
  //return all columns that are not groups
372
388
  getRealColumns(){
373
389
  return this.columnsByIndex;
374
390
  }
375
-
376
- //travers across columns and call action
391
+
392
+ //traverse across columns and call action
377
393
  traverse(callback){
378
394
  this.columnsByIndex.forEach((column,i) =>{
379
395
  callback(column, i);
380
396
  });
381
397
  }
382
-
383
- //get defintions of actual columns
398
+
399
+ //get definitions of actual columns
384
400
  getDefinitions(active){
385
401
  var output = [];
386
-
402
+
387
403
  this.columnsByIndex.forEach((column) => {
388
404
  if(!active || (active && column.visible)){
389
405
  output.push(column.getDefinition());
390
406
  }
391
407
  });
392
-
408
+
393
409
  return output;
394
410
  }
395
-
411
+
396
412
  //get full nested definition tree
397
413
  getDefinitionTree(){
398
414
  var output = [];
399
-
415
+
400
416
  this.columns.forEach((column) => {
401
417
  output.push(column.getDefinition(true));
402
418
  });
403
-
419
+
404
420
  return output;
405
421
  }
406
-
422
+
407
423
  getComponents(structured){
408
424
  var output = [],
409
425
  columns = structured ? this.columns : this.columnsByIndex;
410
-
426
+
411
427
  columns.forEach((column) => {
412
428
  output.push(column.getComponent());
413
429
  });
414
-
430
+
415
431
  return output;
416
432
  }
417
-
433
+
418
434
  getWidth(){
419
435
  var width = 0;
420
-
436
+
421
437
  this.columnsByIndex.forEach((column) => {
422
438
  if(column.visible){
423
439
  width += column.getWidth();
424
440
  }
425
441
  });
426
-
442
+
427
443
  return width;
428
444
  }
429
-
445
+
430
446
  moveColumn(from, to, after){
431
- this.moveColumnActual(from, to, after);
432
-
433
447
  to.element.parentNode.insertBefore(from.element, to.element);
434
-
448
+
435
449
  if(after){
436
450
  to.element.parentNode.insertBefore(to.element, from.element);
437
451
  }
452
+
453
+ this.moveColumnActual(from, to, after);
438
454
 
439
455
  this.verticalAlignHeaders();
440
-
456
+
441
457
  this.table.rowManager.reinitialize();
442
458
  }
443
-
459
+
444
460
  moveColumnActual(from, to, after){
445
461
  if(from.parent.isGroup){
446
462
  this._moveColumnInArray(from.parent.columns, from, to, after);
447
463
  }else{
448
464
  this._moveColumnInArray(this.columns, from, to, after);
449
465
  }
450
-
466
+
451
467
  this._moveColumnInArray(this.columnsByIndex, from, to, after, true);
452
-
453
- this.renderer.rerenderColumns(true);
454
-
468
+
469
+ this.rerenderColumns(true);
470
+
455
471
  this.dispatch("column-moved", from, to, after);
456
-
472
+
457
473
  if(this.subscribedExternal("columnMoved")){
458
474
  this.dispatchExternal("columnMoved", from.getComponent(), this.table.columnManager.getComponents());
459
475
  }
460
476
  }
461
-
477
+
462
478
  _moveColumnInArray(columns, from, to, after, updateRows){
463
479
  var fromIndex = columns.indexOf(from),
464
480
  toIndex, rows = [];
465
-
481
+
466
482
  if (fromIndex > -1) {
467
-
483
+
468
484
  columns.splice(fromIndex, 1);
469
-
485
+
470
486
  toIndex = columns.indexOf(to);
471
-
487
+
472
488
  if (toIndex > -1) {
473
-
489
+
474
490
  if(after){
475
491
  toIndex = toIndex+1;
476
492
  }
477
-
493
+
478
494
  }else{
479
495
  toIndex = fromIndex;
480
496
  }
481
-
497
+
482
498
  columns.splice(toIndex, 0, from);
483
-
499
+
484
500
  if(updateRows){
485
-
501
+
486
502
  rows = this.chain("column-moving-rows", [from, to, after], null, []) || [];
487
-
503
+
488
504
  rows = rows.concat(this.table.rowManager.rows);
489
-
505
+
490
506
  rows.forEach(function(row){
491
507
  if(row.cells.length){
492
508
  var cell = row.cells.splice(fromIndex, 1)[0];
493
509
  row.cells.splice(toIndex, 0, cell);
494
510
  }
495
511
  });
496
-
512
+
497
513
  }
498
514
  }
499
515
  }
500
-
516
+
501
517
  scrollToColumn(column, position, ifVisible){
502
518
  var left = 0,
503
519
  offset = 0,
504
520
  adjust = 0,
505
521
  colEl = column.getElement();
506
-
522
+
507
523
  return new Promise((resolve, reject) => {
508
-
524
+
509
525
  if(typeof position === "undefined"){
510
526
  position = this.table.options.scrollToColumnPosition;
511
527
  }
512
-
528
+
513
529
  if(typeof ifVisible === "undefined"){
514
530
  ifVisible = this.table.options.scrollToColumnIfVisible;
515
531
  }
516
-
532
+
517
533
  if(column.visible){
518
-
534
+
519
535
  //align to correct position
520
536
  switch(position){
521
537
  case "middle":
522
538
  case "center":
523
- adjust = -this.element.clientWidth / 2;
524
- break;
525
-
539
+ adjust = -this.element.clientWidth / 2;
540
+ break;
541
+
526
542
  case "right":
527
- adjust = colEl.clientWidth - this.headersElement.clientWidth;
528
- break;
543
+ adjust = colEl.clientWidth - this.headersElement.clientWidth;
544
+ break;
529
545
  }
530
-
546
+
531
547
  //check column visibility
532
548
  if(!ifVisible){
533
-
549
+
534
550
  offset = colEl.offsetLeft;
535
-
551
+
536
552
  if(offset > 0 && offset + colEl.offsetWidth < this.element.clientWidth){
537
553
  return false;
538
554
  }
539
555
  }
540
-
556
+
541
557
  //calculate scroll position
542
558
  left = colEl.offsetLeft + adjust;
543
-
559
+
544
560
  left = Math.max(Math.min(left, this.table.rowManager.element.scrollWidth - this.table.rowManager.element.clientWidth),0);
545
-
561
+
546
562
  this.table.rowManager.scrollHorizontal(left);
547
563
  this.scrollHorizontal(left);
548
-
564
+
549
565
  resolve();
550
566
  }else{
551
567
  console.warn("Scroll Error - Column not visible");
552
568
  reject("Scroll Error - Column not visible");
553
569
  }
554
-
570
+
555
571
  });
556
572
  }
557
-
573
+
558
574
  //////////////// Cell Management /////////////////
559
575
  generateCells(row){
560
576
  var cells = [];
561
-
577
+
562
578
  this.columnsByIndex.forEach((column) => {
563
579
  cells.push(column.generateCell(row));
564
580
  });
565
-
581
+
566
582
  return cells;
567
583
  }
568
-
584
+
569
585
  //////////////// Column Management /////////////////
570
586
  getFlexBaseWidth(){
571
587
  var totalWidth = this.table.element.clientWidth, //table element width
572
588
  fixedWidth = 0;
573
-
589
+
574
590
  //adjust for vertical scrollbar if present
575
591
  if(this.table.rowManager.element.scrollHeight > this.table.rowManager.element.clientHeight){
576
592
  totalWidth -= this.table.rowManager.element.offsetWidth - this.table.rowManager.element.clientWidth;
577
593
  }
578
-
594
+
579
595
  this.columnsByIndex.forEach(function(column){
580
596
  var width, minWidth, colWidth;
581
-
597
+
582
598
  if(column.visible){
583
-
599
+
584
600
  width = column.definition.width || 0;
585
-
601
+
586
602
  minWidth = parseInt(column.minWidth);
587
-
603
+
588
604
  if(typeof(width) == "string"){
589
605
  if(width.indexOf("%") > -1){
590
606
  colWidth = (totalWidth / 100) * parseInt(width) ;
@@ -594,83 +610,105 @@ export default class ColumnManager extends CoreFeature {
594
610
  }else{
595
611
  colWidth = width;
596
612
  }
597
-
613
+
598
614
  fixedWidth += colWidth > minWidth ? colWidth : minWidth;
599
-
615
+
600
616
  }
601
617
  });
602
-
618
+
603
619
  return fixedWidth;
604
620
  }
605
-
621
+
606
622
  addColumn(definition, before, nextToColumn){
607
623
  return new Promise((resolve, reject) => {
608
624
  var column = this._addColumn(definition, before, nextToColumn);
609
-
625
+
610
626
  this._reIndexColumns();
611
-
627
+
612
628
  this.dispatch("column-add", definition, before, nextToColumn);
613
-
629
+
614
630
  if(this.layoutMode() != "fitColumns"){
615
631
  column.reinitializeWidth();
616
632
  }
617
-
633
+
618
634
  this.redraw(true);
619
-
635
+
620
636
  this.table.rowManager.reinitialize();
621
-
622
- this.renderer.rerenderColumns();
623
-
637
+
638
+ this.rerenderColumns();
639
+
624
640
  resolve(column);
625
641
  });
626
642
  }
627
-
643
+
628
644
  //remove column from system
629
645
  deregisterColumn(column){
630
646
  var field = column.getField(),
631
647
  index;
632
-
648
+
633
649
  //remove from field list
634
650
  if(field){
635
651
  delete this.columnsByField[field];
636
652
  }
637
-
653
+
638
654
  //remove from index list
639
655
  index = this.columnsByIndex.indexOf(column);
640
-
656
+
641
657
  if(index > -1){
642
658
  this.columnsByIndex.splice(index, 1);
643
659
  }
644
-
660
+
645
661
  //remove from column list
646
662
  index = this.columns.indexOf(column);
647
-
663
+
648
664
  if(index > -1){
649
665
  this.columns.splice(index, 1);
650
666
  }
651
-
667
+
652
668
  this.verticalAlignHeaders();
653
-
669
+
654
670
  this.redraw();
655
671
  }
656
-
672
+
673
+ rerenderColumns(update, silent){
674
+ if(!this.redrawBlock){
675
+ this.renderer.rerenderColumns(update, silent);
676
+ }else{
677
+ if(update === false || (update === true && this.redrawBlockUpdate === null)){
678
+ this.redrawBlockUpdate = update;
679
+ }
680
+ }
681
+ }
682
+
683
+ blockRedraw(){
684
+ this.redrawBlock = true;
685
+ this.redrawBlockUpdate = null;
686
+ }
687
+
688
+ restoreRedraw(){
689
+ this.redrawBlock = false;
690
+ this.verticalAlignHeaders();
691
+ this.renderer.rerenderColumns(this.redrawBlockUpdate);
692
+
693
+ }
694
+
657
695
  //redraw columns
658
696
  redraw(force){
659
697
  if(Helpers.elVisible(this.element)){
660
698
  this.verticalAlignHeaders();
661
699
  }
662
-
700
+
663
701
  if(force){
664
702
  this.table.rowManager.resetScroll();
665
703
  this.table.rowManager.reinitialize();
666
704
  }
667
-
705
+
668
706
  if(!this.confirm("table-redrawing", force)){
669
- this.layoutRefresh();
707
+ this.layoutRefresh(force);
670
708
  }
671
-
709
+
672
710
  this.dispatch("table-redraw", force);
673
-
711
+
674
712
  this.table.footerManager.redraw();
675
713
  }
676
714
  }