tabulator-tables 6.5.0 → 6.5.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (222) hide show
  1. package/dist/js/tabulator.js +1 -1
  2. package/dist/js/tabulator.min.js +1 -1
  3. package/dist/js/tabulator_esm.js +1 -1
  4. package/dist/js/tabulator_esm.min.js +1 -1
  5. package/dist/js/tabulator_esm.min.mjs +1 -1
  6. package/dist/js/tabulator_esm.mjs +1 -1
  7. package/package.json +2 -1
  8. package/src/js/builds/esm.js +16 -0
  9. package/src/js/builds/jquery_wrapper.js +63 -0
  10. package/src/js/builds/usd.js +1 -0
  11. package/src/js/core/ColumnManager.js +789 -0
  12. package/src/js/core/CoreFeature.js +140 -0
  13. package/src/js/core/FooterManager.js +102 -0
  14. package/src/js/core/Module.js +140 -0
  15. package/src/js/core/RowManager.js +1140 -0
  16. package/src/js/core/Tabulator.js +928 -0
  17. package/src/js/core/TabulatorFull.js +21 -0
  18. package/src/js/core/cell/Cell.js +299 -0
  19. package/src/js/core/cell/CellComponent.js +79 -0
  20. package/src/js/core/column/Column.js +978 -0
  21. package/src/js/core/column/ColumnComponent.js +151 -0
  22. package/src/js/core/column/defaults/options.js +18 -0
  23. package/src/js/core/defaults/options.js +66 -0
  24. package/src/js/core/modules/core.js +3 -0
  25. package/src/js/core/modules/optional.js +37 -0
  26. package/src/js/core/rendering/Renderer.js +204 -0
  27. package/src/js/core/rendering/renderers/BasicHorizontal.js +27 -0
  28. package/src/js/core/rendering/renderers/BasicVertical.js +103 -0
  29. package/src/js/core/rendering/renderers/VirtualDomHorizontal.js +587 -0
  30. package/src/js/core/rendering/renderers/VirtualDomVertical.js +642 -0
  31. package/src/js/core/row/PseudoRow.js +47 -0
  32. package/src/js/core/row/Row.js +487 -0
  33. package/src/js/core/row/RowComponent.js +94 -0
  34. package/src/js/core/tools/Alert.js +66 -0
  35. package/src/js/core/tools/ComponentFunctionBinder.js +32 -0
  36. package/src/js/core/tools/DataLoader.js +128 -0
  37. package/src/js/core/tools/DependencyRegistry.js +82 -0
  38. package/src/js/core/tools/DeprecationAdvisor.js +51 -0
  39. package/src/js/core/tools/ExternalEventBus.js +105 -0
  40. package/src/js/core/tools/Helpers.js +66 -0
  41. package/src/js/core/tools/InteractionMonitor.js +329 -0
  42. package/src/js/core/tools/InternalEventBus.js +162 -0
  43. package/src/js/core/tools/ModuleBinder.js +153 -0
  44. package/src/js/core/tools/OptionsList.js +45 -0
  45. package/src/js/core/tools/Popup.js +317 -0
  46. package/src/js/core/tools/TableRegistry.js +65 -0
  47. package/src/js/modules/Accessor/Accessor.js +115 -0
  48. package/src/js/modules/Accessor/defaults/accessors.js +5 -0
  49. package/src/js/modules/Ajax/Ajax.js +142 -0
  50. package/src/js/modules/Ajax/defaults/config.js +3 -0
  51. package/src/js/modules/Ajax/defaults/contentTypeFormatters.js +45 -0
  52. package/src/js/modules/Ajax/defaults/loaderPromise.js +87 -0
  53. package/src/js/modules/Ajax/defaults/urlGenerator.js +44 -0
  54. package/src/js/modules/Clipboard/Clipboard.js +282 -0
  55. package/src/js/modules/Clipboard/defaults/pasteActions.js +11 -0
  56. package/src/js/modules/Clipboard/defaults/pasteParsers.js +75 -0
  57. package/src/js/modules/Clipboard/extensions/extensions.js +9 -0
  58. package/src/js/modules/Clipboard/extensions/keybindings/actions.js +9 -0
  59. package/src/js/modules/Clipboard/extensions/keybindings/bindings.js +3 -0
  60. package/src/js/modules/ColumnCalcs/CalcComponent.js +46 -0
  61. package/src/js/modules/ColumnCalcs/ColumnCalcs.js +586 -0
  62. package/src/js/modules/ColumnCalcs/defaults/calculations.js +93 -0
  63. package/src/js/modules/Comms/Comms.js +49 -0
  64. package/src/js/modules/DataTree/DataTree.js +620 -0
  65. package/src/js/modules/Download/Download.js +146 -0
  66. package/src/js/modules/Download/defaults/downloaders/csv.js +61 -0
  67. package/src/js/modules/Download/defaults/downloaders/html.js +5 -0
  68. package/src/js/modules/Download/defaults/downloaders/json.js +34 -0
  69. package/src/js/modules/Download/defaults/downloaders/jsonLines.js +32 -0
  70. package/src/js/modules/Download/defaults/downloaders/pdf.js +113 -0
  71. package/src/js/modules/Download/defaults/downloaders/xlsx.js +103 -0
  72. package/src/js/modules/Download/defaults/downloaders.js +15 -0
  73. package/src/js/modules/Edit/Edit.js +845 -0
  74. package/src/js/modules/Edit/List.js +1060 -0
  75. package/src/js/modules/Edit/defaults/editors/adaptable.js +37 -0
  76. package/src/js/modules/Edit/defaults/editors/date.js +144 -0
  77. package/src/js/modules/Edit/defaults/editors/datetime.js +131 -0
  78. package/src/js/modules/Edit/defaults/editors/input.js +77 -0
  79. package/src/js/modules/Edit/defaults/editors/list.js +7 -0
  80. package/src/js/modules/Edit/defaults/editors/number.js +110 -0
  81. package/src/js/modules/Edit/defaults/editors/progress.js +127 -0
  82. package/src/js/modules/Edit/defaults/editors/range.js +81 -0
  83. package/src/js/modules/Edit/defaults/editors/star.js +146 -0
  84. package/src/js/modules/Edit/defaults/editors/textarea.js +123 -0
  85. package/src/js/modules/Edit/defaults/editors/tickCross.js +95 -0
  86. package/src/js/modules/Edit/defaults/editors/time.js +132 -0
  87. package/src/js/modules/Edit/defaults/editors.js +27 -0
  88. package/src/js/modules/Edit/inputMask.js +74 -0
  89. package/src/js/modules/Export/Export.js +654 -0
  90. package/src/js/modules/Export/ExportColumn.js +9 -0
  91. package/src/js/modules/Export/ExportRow.js +8 -0
  92. package/src/js/modules/Export/defaults/columnLookups.js +3 -0
  93. package/src/js/modules/Export/defaults/rowLookups.js +18 -0
  94. package/src/js/modules/Filter/Filter.js +902 -0
  95. package/src/js/modules/Filter/defaults/filters.js +215 -0
  96. package/src/js/modules/Format/Format.js +200 -0
  97. package/src/js/modules/Format/defaults/formatters/adaptable.js +32 -0
  98. package/src/js/modules/Format/defaults/formatters/array.js +30 -0
  99. package/src/js/modules/Format/defaults/formatters/buttonCross.js +3 -0
  100. package/src/js/modules/Format/defaults/formatters/buttonTick.js +3 -0
  101. package/src/js/modules/Format/defaults/formatters/color.js +4 -0
  102. package/src/js/modules/Format/defaults/formatters/datetime.js +39 -0
  103. package/src/js/modules/Format/defaults/formatters/datetimediff.js +43 -0
  104. package/src/js/modules/Format/defaults/formatters/handle.js +4 -0
  105. package/src/js/modules/Format/defaults/formatters/html.js +3 -0
  106. package/src/js/modules/Format/defaults/formatters/image.js +40 -0
  107. package/src/js/modules/Format/defaults/formatters/json.js +12 -0
  108. package/src/js/modules/Format/defaults/formatters/link.js +82 -0
  109. package/src/js/modules/Format/defaults/formatters/lookup.js +10 -0
  110. package/src/js/modules/Format/defaults/formatters/money.js +44 -0
  111. package/src/js/modules/Format/defaults/formatters/plaintext.js +3 -0
  112. package/src/js/modules/Format/defaults/formatters/progress.js +133 -0
  113. package/src/js/modules/Format/defaults/formatters/rownum.js +14 -0
  114. package/src/js/modules/Format/defaults/formatters/star.js +38 -0
  115. package/src/js/modules/Format/defaults/formatters/textarea.js +4 -0
  116. package/src/js/modules/Format/defaults/formatters/tickCross.js +22 -0
  117. package/src/js/modules/Format/defaults/formatters/toggle.js +48 -0
  118. package/src/js/modules/Format/defaults/formatters/traffic.js +47 -0
  119. package/src/js/modules/Format/defaults/formatters.js +47 -0
  120. package/src/js/modules/FrozenColumns/FrozenColumns.js +302 -0
  121. package/src/js/modules/FrozenRows/FrozenRows.js +175 -0
  122. package/src/js/modules/GroupRows/Group.js +615 -0
  123. package/src/js/modules/GroupRows/GroupComponent.js +69 -0
  124. package/src/js/modules/GroupRows/GroupRows.js +636 -0
  125. package/src/js/modules/History/History.js +172 -0
  126. package/src/js/modules/History/defaults/redoers.js +31 -0
  127. package/src/js/modules/History/defaults/undoers.js +33 -0
  128. package/src/js/modules/History/extensions/extensions.js +9 -0
  129. package/src/js/modules/History/extensions/keybindings/actions.js +27 -0
  130. package/src/js/modules/History/extensions/keybindings/bindings.js +4 -0
  131. package/src/js/modules/HtmlTableImport/HtmlTableImport.js +180 -0
  132. package/src/js/modules/Import/Import.js +303 -0
  133. package/src/js/modules/Import/defaults/importers/array.js +3 -0
  134. package/src/js/modules/Import/defaults/importers/csv.js +61 -0
  135. package/src/js/modules/Import/defaults/importers/json.js +8 -0
  136. package/src/js/modules/Import/defaults/importers/xlsx.js +7 -0
  137. package/src/js/modules/Import/defaults/importers.js +11 -0
  138. package/src/js/modules/Interaction/Interaction.js +339 -0
  139. package/src/js/modules/Keybindings/Keybindings.js +198 -0
  140. package/src/js/modules/Keybindings/defaults/actions.js +90 -0
  141. package/src/js/modules/Keybindings/defaults/bindings.js +12 -0
  142. package/src/js/modules/Layout/Layout.js +66 -0
  143. package/src/js/modules/Layout/defaults/modes/fitColumns.js +171 -0
  144. package/src/js/modules/Layout/defaults/modes/fitData.js +10 -0
  145. package/src/js/modules/Layout/defaults/modes/fitDataGeneral.js +10 -0
  146. package/src/js/modules/Layout/defaults/modes/fitDataStretch.js +40 -0
  147. package/src/js/modules/Layout/defaults/modes.js +12 -0
  148. package/src/js/modules/Localize/Localize.js +184 -0
  149. package/src/js/modules/Localize/defaults/langs.js +37 -0
  150. package/src/js/modules/Menu/Menu.js +302 -0
  151. package/src/js/modules/MoveColumns/MoveColumns.js +311 -0
  152. package/src/js/modules/MoveRows/MoveRows.js +604 -0
  153. package/src/js/modules/MoveRows/defaults/receivers.js +30 -0
  154. package/src/js/modules/MoveRows/defaults/senders.js +5 -0
  155. package/src/js/modules/Mutator/Mutator.js +164 -0
  156. package/src/js/modules/Mutator/defaults/mutators.js +1 -0
  157. package/src/js/modules/Page/Page.js +891 -0
  158. package/src/js/modules/Page/defaults/pageCounters/pages.js +33 -0
  159. package/src/js/modules/Page/defaults/pageCounters/rows.js +40 -0
  160. package/src/js/modules/Page/defaults/pageCounters.js +8 -0
  161. package/src/js/modules/Persistence/Persistence.js +473 -0
  162. package/src/js/modules/Persistence/defaults/readers.js +29 -0
  163. package/src/js/modules/Persistence/defaults/writers.js +13 -0
  164. package/src/js/modules/Popup/Popup.js +227 -0
  165. package/src/js/modules/Print/Print.js +136 -0
  166. package/src/js/modules/ReactiveData/ReactiveData.js +416 -0
  167. package/src/js/modules/ResizeColumns/ResizeColumns.js +365 -0
  168. package/src/js/modules/ResizeRows/ResizeRows.js +145 -0
  169. package/src/js/modules/ResizeTable/ResizeTable.js +158 -0
  170. package/src/js/modules/ResponsiveLayout/ResponsiveLayout.js +354 -0
  171. package/src/js/modules/ResponsiveLayout/extensions/extensions.js +9 -0
  172. package/src/js/modules/ResponsiveLayout/extensions/formatters/responsiveCollapse.js +44 -0
  173. package/src/js/modules/SelectRange/Range.js +366 -0
  174. package/src/js/modules/SelectRange/RangeComponent.js +91 -0
  175. package/src/js/modules/SelectRange/SelectRange.js +993 -0
  176. package/src/js/modules/SelectRange/extensions/clipboard/pasteActions.js +45 -0
  177. package/src/js/modules/SelectRange/extensions/clipboard/pasteParsers.js +57 -0
  178. package/src/js/modules/SelectRange/extensions/export/columnLookups.js +11 -0
  179. package/src/js/modules/SelectRange/extensions/export/rowLookups.js +5 -0
  180. package/src/js/modules/SelectRange/extensions/extensions.js +21 -0
  181. package/src/js/modules/SelectRange/extensions/keybindings/actions.js +38 -0
  182. package/src/js/modules/SelectRange/extensions/keybindings/bindings.js +14 -0
  183. package/src/js/modules/SelectRow/SelectRow.js +499 -0
  184. package/src/js/modules/SelectRow/extensions/extensions.js +9 -0
  185. package/src/js/modules/SelectRow/extensions/formatters/rowSelection.js +60 -0
  186. package/src/js/modules/Sort/Sort.js +480 -0
  187. package/src/js/modules/Sort/defaults/sorters/alphanum.js +44 -0
  188. package/src/js/modules/Sort/defaults/sorters/array.js +82 -0
  189. package/src/js/modules/Sort/defaults/sorters/boolean.js +7 -0
  190. package/src/js/modules/Sort/defaults/sorters/date.js +10 -0
  191. package/src/js/modules/Sort/defaults/sorters/datetime.js +48 -0
  192. package/src/js/modules/Sort/defaults/sorters/exists.js +7 -0
  193. package/src/js/modules/Sort/defaults/sorters/number.js +40 -0
  194. package/src/js/modules/Sort/defaults/sorters/string.js +34 -0
  195. package/src/js/modules/Sort/defaults/sorters/time.js +10 -0
  196. package/src/js/modules/Sort/defaults/sorters.js +21 -0
  197. package/src/js/modules/Spreadsheet/GridCalculator.js +64 -0
  198. package/src/js/modules/Spreadsheet/Sheet.js +243 -0
  199. package/src/js/modules/Spreadsheet/SheetComponent.js +59 -0
  200. package/src/js/modules/Spreadsheet/Spreadsheet.js +309 -0
  201. package/src/js/modules/Tooltip/Tooltip.js +128 -0
  202. package/src/js/modules/Validate/Validate.js +303 -0
  203. package/src/js/modules/Validate/defaults/validators.js +150 -0
  204. package/src/scss/tabulator.scss +1693 -0
  205. package/src/scss/themes/bootstrap/tabulator_bootstrap3.scss +302 -0
  206. package/src/scss/themes/bootstrap/tabulator_bootstrap4.scss +589 -0
  207. package/src/scss/themes/bootstrap/tabulator_bootstrap5.scss +979 -0
  208. package/src/scss/themes/bootstrap/variables3.scss +872 -0
  209. package/src/scss/themes/bootstrap/variables4.scss +1059 -0
  210. package/src/scss/themes/bootstrap/variables5.scss +1967 -0
  211. package/src/scss/themes/bulma/tabulator_bulma.scss +316 -0
  212. package/src/scss/themes/bulma/variables.scss +198 -0
  213. package/src/scss/themes/materialize/tabulator_materialize.scss +318 -0
  214. package/src/scss/themes/materialize/variables.scss +71 -0
  215. package/src/scss/themes/semanticui/tabulator_semanticui.scss +623 -0
  216. package/src/scss/themes/semanticui/variables.scss +843 -0
  217. package/src/scss/themes/semanticui/variables_table.scss +248 -0
  218. package/src/scss/themes/tabulator_midnight.scss +235 -0
  219. package/src/scss/themes/tabulator_modern.scss +308 -0
  220. package/src/scss/themes/tabulator_simple.scss +143 -0
  221. package/src/scss/themes/tabulator_site.scss +267 -0
  222. package/src/scss/themes/tabulator_site_dark.scss +496 -0
@@ -0,0 +1,978 @@
1
+ import CoreFeature from '../CoreFeature.js';
2
+ import ColumnComponent from './ColumnComponent.js';
3
+ import defaultOptions from './defaults/options.js';
4
+
5
+ import Cell from '../cell/Cell.js';
6
+
7
+ export default class Column extends CoreFeature{
8
+
9
+ static defaultOptionList = defaultOptions;
10
+
11
+ constructor(def, parent, rowHeader){
12
+ super(parent.table);
13
+
14
+ this.definition = def; //column definition
15
+ this.parent = parent; //hold parent object
16
+ this.type = "column"; //type of element
17
+ this.columns = []; //child columns
18
+ this.cells = []; //cells bound to this column
19
+ this.isGroup = false;
20
+ this.isRowHeader = rowHeader;
21
+ this.element = this.createElement(); //column header element
22
+ this.contentElement = false;
23
+ this.titleHolderElement = false;
24
+ this.titleElement = false;
25
+ this.groupElement = this.createGroupElement(); //column group holder element
26
+ this.hozAlign = ""; //horizontal text alignment
27
+ this.vertAlign = ""; //vert text alignment
28
+
29
+ //multi dimensional filed handling
30
+ this.field ="";
31
+ this.fieldStructure = "";
32
+ this.getFieldValue = "";
33
+ this.setFieldValue = "";
34
+
35
+ this.titleDownload = null;
36
+ this.titleFormatterRendered = false;
37
+
38
+ this.mapDefinitions();
39
+
40
+ this.setField(this.definition.field);
41
+
42
+ this.modules = {}; //hold module variables;
43
+
44
+ this.width = null; //column width
45
+ this.widthStyled = ""; //column width pre-styled to improve render efficiency
46
+ this.maxWidth = null; //column maximum width
47
+ this.maxWidthStyled = ""; //column maximum pre-styled to improve render efficiency
48
+ this.maxInitialWidth = null;
49
+ this.minWidth = null; //column minimum width
50
+ this.minWidthStyled = ""; //column minimum pre-styled to improve render efficiency
51
+ this.widthFixed = false; //user has specified a width for this column
52
+
53
+ this.visible = true; //default visible state
54
+
55
+ this.component = null;
56
+
57
+ //initialize column
58
+ if(this.definition.columns){
59
+
60
+ this.isGroup = true;
61
+
62
+ this.definition.columns.forEach((def, i) => {
63
+ var newCol = new Column(def, this);
64
+ this.attachColumn(newCol);
65
+ });
66
+
67
+ this.checkColumnVisibility();
68
+ }else{
69
+ parent.registerColumnField(this);
70
+ }
71
+
72
+ this._initialize();
73
+ }
74
+
75
+ createElement (){
76
+ var el = document.createElement("div");
77
+
78
+ el.classList.add("tabulator-col");
79
+ el.setAttribute("role", "columnheader");
80
+ el.setAttribute("aria-sort", "none");
81
+
82
+ if(this.isRowHeader){
83
+ el.classList.add("tabulator-row-header");
84
+ }
85
+
86
+ switch(this.table.options.columnHeaderVertAlign){
87
+ case "middle":
88
+ el.style.justifyContent = "center";
89
+ break;
90
+ case "bottom":
91
+ el.style.justifyContent = "flex-end";
92
+ break;
93
+ }
94
+
95
+ return el;
96
+ }
97
+
98
+ createGroupElement (){
99
+ var el = document.createElement("div");
100
+
101
+ el.classList.add("tabulator-col-group-cols");
102
+
103
+ return el;
104
+ }
105
+
106
+ mapDefinitions(){
107
+ var defaults = this.table.options.columnDefaults;
108
+
109
+ //map columnDefaults onto column definitions
110
+ if(defaults){
111
+ for(let key in defaults){
112
+ if(typeof this.definition[key] === "undefined"){
113
+ this.definition[key] = defaults[key];
114
+ }
115
+ }
116
+ }
117
+
118
+ this.definition = this.table.columnManager.optionsList.generate(Column.defaultOptionList, this.definition);
119
+ }
120
+
121
+ checkDefinition(){
122
+ Object.keys(this.definition).forEach((key) => {
123
+ if(Column.defaultOptionList.indexOf(key) === -1){
124
+ console.warn("Invalid column definition option in '" + (this.field || this.definition.title) + "' column:", key);
125
+ }
126
+ });
127
+ }
128
+
129
+ setField(field){
130
+ this.field = field;
131
+ this.fieldStructure = field ? (this.table.options.nestedFieldSeparator ? field.split(this.table.options.nestedFieldSeparator) : [field]) : [];
132
+ this.getFieldValue = this.fieldStructure.length > 1 ? this._getNestedData : this._getFlatData;
133
+ this.setFieldValue = this.fieldStructure.length > 1 ? this._setNestedData : this._setFlatData;
134
+ }
135
+
136
+ //register column position with column manager
137
+ registerColumnPosition(column){
138
+ this.parent.registerColumnPosition(column);
139
+ }
140
+
141
+ //register column position with column manager
142
+ registerColumnField(column){
143
+ this.parent.registerColumnField(column);
144
+ }
145
+
146
+ //trigger position registration
147
+ reRegisterPosition(){
148
+ if(this.isGroup){
149
+ this.columns.forEach(function(column){
150
+ column.reRegisterPosition();
151
+ });
152
+ }else{
153
+ this.registerColumnPosition(this);
154
+ }
155
+ }
156
+
157
+ //build header element
158
+ _initialize(){
159
+ var def = this.definition;
160
+
161
+ while(this.element.firstChild) this.element.removeChild(this.element.firstChild);
162
+
163
+ if(def.headerVertical){
164
+ this.element.classList.add("tabulator-col-vertical");
165
+
166
+ if(def.headerVertical === "flip"){
167
+ this.element.classList.add("tabulator-col-vertical-flip");
168
+ }
169
+ }
170
+
171
+ this.contentElement = this._buildColumnHeaderContent();
172
+
173
+ this.element.appendChild(this.contentElement);
174
+
175
+ if(this.isGroup){
176
+ this._buildGroupHeader();
177
+ }else{
178
+ this._buildColumnHeader();
179
+ }
180
+
181
+ this.dispatch("column-init", this);
182
+ }
183
+
184
+ //build header element for header
185
+ _buildColumnHeader(){
186
+ var def = this.definition;
187
+
188
+ this.dispatch("column-layout", this);
189
+
190
+ //set column visibility
191
+ if(typeof def.visible != "undefined"){
192
+ if(def.visible){
193
+ this.show(true);
194
+ }else{
195
+ this.hide(true);
196
+ }
197
+ }
198
+
199
+ //assign additional css classes to column header
200
+ if(def.cssClass){
201
+ var classNames = def.cssClass.split(" ");
202
+ classNames.forEach((className) => {
203
+ this.element.classList.add(className);
204
+ });
205
+ }
206
+
207
+ if(def.field){
208
+ this.element.setAttribute("tabulator-field", def.field);
209
+ }
210
+
211
+ //set min width if present
212
+ this.setMinWidth(parseInt(def.minWidth));
213
+
214
+ if (def.maxInitialWidth) {
215
+ this.maxInitialWidth = parseInt(def.maxInitialWidth);
216
+ }
217
+
218
+ if(def.maxWidth){
219
+ this.setMaxWidth(parseInt(def.maxWidth));
220
+ }
221
+
222
+ this.reinitializeWidth();
223
+
224
+ //set horizontal text alignment
225
+ this.hozAlign = this.definition.hozAlign;
226
+ this.vertAlign = this.definition.vertAlign;
227
+
228
+ this.titleElement.style.textAlign = this.definition.headerHozAlign;
229
+ }
230
+
231
+ _buildColumnHeaderContent(){
232
+ var contentElement = document.createElement("div");
233
+ contentElement.classList.add("tabulator-col-content");
234
+
235
+ this.titleHolderElement = document.createElement("div");
236
+ this.titleHolderElement.classList.add("tabulator-col-title-holder");
237
+
238
+ contentElement.appendChild(this.titleHolderElement);
239
+
240
+ this.titleElement = this._buildColumnHeaderTitle();
241
+
242
+ this.titleHolderElement.appendChild(this.titleElement);
243
+
244
+ return contentElement;
245
+ }
246
+
247
+ //build title element of column
248
+ _buildColumnHeaderTitle(){
249
+ var def = this.definition;
250
+
251
+ var titleHolderElement = document.createElement("div");
252
+ titleHolderElement.classList.add("tabulator-col-title");
253
+
254
+ if(def.headerWordWrap){
255
+ titleHolderElement.classList.add("tabulator-col-title-wrap");
256
+ }
257
+
258
+ if(def.editableTitle){
259
+ var titleElement = document.createElement("input");
260
+ titleElement.classList.add("tabulator-title-editor");
261
+
262
+ titleElement.addEventListener("click", (e) => {
263
+ e.stopPropagation();
264
+ titleElement.focus();
265
+ });
266
+
267
+ titleElement.addEventListener("mousedown", (e) => {
268
+ e.stopPropagation();
269
+ });
270
+
271
+ titleElement.addEventListener("change", () => {
272
+ def.title = titleElement.value;
273
+ this.dispatchExternal("columnTitleChanged", this.getComponent());
274
+ });
275
+
276
+ titleHolderElement.appendChild(titleElement);
277
+
278
+ if(def.field){
279
+ this.langBind("columns|" + def.field, (text) => {
280
+ titleElement.value = text || (def.title || " ");
281
+ });
282
+ }else{
283
+ titleElement.value = def.title || " ";
284
+ }
285
+
286
+ }else{
287
+ if(def.field){
288
+ this.langBind("columns|" + def.field, (text) => {
289
+ this._formatColumnHeaderTitle(titleHolderElement, text || (def.title || " "));
290
+ });
291
+ }else{
292
+ this._formatColumnHeaderTitle(titleHolderElement, def.title || " ");
293
+ }
294
+ }
295
+
296
+ return titleHolderElement;
297
+ }
298
+
299
+ _formatColumnHeaderTitle(el, title){
300
+ var contents = this.chain("column-format", [this, title, el], null, () => {
301
+ return title;
302
+ });
303
+
304
+ switch(typeof contents){
305
+ case "object":
306
+ if(contents instanceof Node){
307
+ el.appendChild(contents);
308
+ }else{
309
+ el.innerHTML = "";
310
+ console.warn("Format Error - Title formatter has returned a type of object, the only valid formatter object return is an instance of Node, the formatter returned:", contents);
311
+ }
312
+ break;
313
+ case "undefined":
314
+ el.innerHTML = "";
315
+ break;
316
+ default:
317
+ el.innerHTML = contents;
318
+ }
319
+ }
320
+
321
+ //build header element for column group
322
+ _buildGroupHeader(){
323
+ this.element.classList.add("tabulator-col-group");
324
+ this.element.setAttribute("role", "columngroup");
325
+ this.element.setAttribute("aria-title", this.definition.title);
326
+
327
+ //asign additional css classes to column header
328
+ if(this.definition.cssClass){
329
+ var classNames = this.definition.cssClass.split(" ");
330
+ classNames.forEach((className) => {
331
+ this.element.classList.add(className);
332
+ });
333
+ }
334
+
335
+ this.titleElement.style.textAlign = this.definition.headerHozAlign;
336
+
337
+ this.element.appendChild(this.groupElement);
338
+ }
339
+
340
+ //flat field lookup
341
+ _getFlatData(data){
342
+ return data[this.field];
343
+ }
344
+
345
+ //nested field lookup
346
+ _getNestedData(data){
347
+ var dataObj = data,
348
+ structure = this.fieldStructure,
349
+ length = structure.length,
350
+ output;
351
+
352
+ for(let i = 0; i < length; i++){
353
+
354
+ dataObj = dataObj[structure[i]];
355
+
356
+ output = dataObj;
357
+
358
+ if(!dataObj){
359
+ break;
360
+ }
361
+ }
362
+
363
+ return output;
364
+ }
365
+
366
+ //flat field set
367
+ _setFlatData(data, value){
368
+ if(this.field){
369
+ data[this.field] = value;
370
+ }
371
+ }
372
+
373
+ //nested field set
374
+ _setNestedData(data, value){
375
+ var dataObj = data,
376
+ structure = this.fieldStructure,
377
+ length = structure.length;
378
+
379
+ for(let i = 0; i < length; i++){
380
+
381
+ if(i == length -1){
382
+ dataObj[structure[i]] = value;
383
+ }else{
384
+ if(!dataObj[structure[i]]){
385
+ if(typeof value !== "undefined"){
386
+ dataObj[structure[i]] = {};
387
+ }else{
388
+ break;
389
+ }
390
+ }
391
+
392
+ dataObj = dataObj[structure[i]];
393
+ }
394
+ }
395
+ }
396
+
397
+ //attach column to this group
398
+ attachColumn(column){
399
+ if(this.groupElement){
400
+ this.columns.push(column);
401
+ this.groupElement.appendChild(column.getElement());
402
+
403
+ column.columnRendered();
404
+ }else{
405
+ console.warn("Column Warning - Column being attached to another column instead of column group");
406
+ }
407
+ }
408
+
409
+ //vertically align header in column
410
+ verticalAlign(alignment, height){
411
+
412
+ //calculate height of column header and group holder element
413
+ var parentHeight = this.parent.isGroup ? this.parent.getGroupElement().clientHeight : (height || this.parent.getHeadersElement().clientHeight);
414
+ // var parentHeight = this.parent.isGroup ? this.parent.getGroupElement().clientHeight : this.parent.getHeadersElement().clientHeight;
415
+
416
+ this.element.style.height = parentHeight + "px";
417
+
418
+ this.dispatch("column-height", this, this.element.style.height);
419
+
420
+ if(this.isGroup){
421
+ this.groupElement.style.minHeight = (parentHeight - this.contentElement.offsetHeight) + "px";
422
+ }
423
+
424
+ //vertically align cell contents
425
+ // if(!this.isGroup && alignment !== "top"){
426
+ // if(alignment === "bottom"){
427
+ // this.element.style.paddingTop = (this.element.clientHeight - this.contentElement.offsetHeight) + "px";
428
+ // }else{
429
+ // this.element.style.paddingTop = ((this.element.clientHeight - this.contentElement.offsetHeight) / 2) + "px";
430
+ // }
431
+ // }
432
+
433
+ this.columns.forEach(function(column){
434
+ column.verticalAlign(alignment);
435
+ });
436
+ }
437
+
438
+ //clear vertical alignment
439
+ clearVerticalAlign(){
440
+ this.element.style.paddingTop = "";
441
+ this.element.style.height = "";
442
+ this.element.style.minHeight = "";
443
+ this.groupElement.style.minHeight = "";
444
+
445
+ this.columns.forEach(function(column){
446
+ column.clearVerticalAlign();
447
+ });
448
+
449
+ this.dispatch("column-height", this, "");
450
+ }
451
+
452
+ //// Retrieve Column Information ////
453
+ //return column header element
454
+ getElement(){
455
+ return this.element;
456
+ }
457
+
458
+ //return column group element
459
+ getGroupElement(){
460
+ return this.groupElement;
461
+ }
462
+
463
+ //return field name
464
+ getField(){
465
+ return this.field;
466
+ }
467
+
468
+ getTitleDownload() {
469
+ return this.titleDownload;
470
+ }
471
+
472
+ //return the first column in a group
473
+ getFirstColumn(){
474
+ if(!this.isGroup){
475
+ return this;
476
+ }else{
477
+ if(this.columns.length){
478
+ return this.columns[0].getFirstColumn();
479
+ }else{
480
+ return false;
481
+ }
482
+ }
483
+ }
484
+
485
+ //return the last column in a group
486
+ getLastColumn(){
487
+ if(!this.isGroup){
488
+ return this;
489
+ }else{
490
+ if(this.columns.length){
491
+ return this.columns[this.columns.length -1].getLastColumn();
492
+ }else{
493
+ return false;
494
+ }
495
+ }
496
+ }
497
+
498
+ //return all columns in a group
499
+ getColumns(traverse){
500
+ var columns = [];
501
+
502
+ if(traverse){
503
+ this.columns.forEach((column) => {
504
+ columns.push(column);
505
+
506
+ columns = columns.concat(column.getColumns(true));
507
+ });
508
+ }else{
509
+ columns = this.columns;
510
+ }
511
+
512
+ return columns;
513
+ }
514
+
515
+ //return all columns in a group
516
+ getCells(){
517
+ return this.cells;
518
+ }
519
+
520
+ //retrieve the top column in a group of columns
521
+ getTopColumn(){
522
+ if(this.parent.isGroup){
523
+ return this.parent.getTopColumn();
524
+ }else{
525
+ return this;
526
+ }
527
+ }
528
+
529
+ //return column definition object
530
+ getDefinition(updateBranches){
531
+ var colDefs = [];
532
+
533
+ if(this.isGroup && updateBranches){
534
+ this.columns.forEach(function(column){
535
+ colDefs.push(column.getDefinition(true));
536
+ });
537
+
538
+ this.definition.columns = colDefs;
539
+ }
540
+
541
+ return this.definition;
542
+ }
543
+
544
+ //////////////////// Actions ////////////////////
545
+ checkColumnVisibility(){
546
+ var visible = false;
547
+
548
+ this.columns.forEach(function(column){
549
+ if(column.visible){
550
+ visible = true;
551
+ }
552
+ });
553
+
554
+ if(visible){
555
+ this.show();
556
+ this.dispatchExternal("columnVisibilityChanged", this.getComponent(), false);
557
+ }else{
558
+ this.hide();
559
+ }
560
+ }
561
+
562
+ //show column
563
+ show(silent, responsiveToggle){
564
+ if(!this.visible){
565
+ this.visible = true;
566
+
567
+ this.element.style.display = "";
568
+
569
+ if(this.parent.isGroup){
570
+ this.parent.checkColumnVisibility();
571
+ }
572
+
573
+ this.cells.forEach(function(cell){
574
+ cell.show();
575
+ });
576
+
577
+ if(!this.isGroup && this.width === null){
578
+ this.reinitializeWidth();
579
+ }
580
+
581
+ this.table.columnManager.verticalAlignHeaders();
582
+
583
+ this.dispatch("column-show", this, responsiveToggle);
584
+
585
+ if(!silent){
586
+ this.dispatchExternal("columnVisibilityChanged", this.getComponent(), true);
587
+ }
588
+
589
+ if(this.parent.isGroup){
590
+ this.parent.matchChildWidths();
591
+ }
592
+
593
+ if(!this.silent){
594
+ this.table.columnManager.rerenderColumns();
595
+ }
596
+ }
597
+ }
598
+
599
+ //hide column
600
+ hide(silent, responsiveToggle){
601
+ if(this.visible){
602
+ this.visible = false;
603
+
604
+ this.element.style.display = "none";
605
+
606
+ this.table.columnManager.verticalAlignHeaders();
607
+
608
+ if(this.parent.isGroup){
609
+ this.parent.checkColumnVisibility();
610
+ }
611
+
612
+ this.cells.forEach(function(cell){
613
+ cell.hide();
614
+ });
615
+
616
+ this.dispatch("column-hide", this, responsiveToggle);
617
+
618
+ if(!silent){
619
+ this.dispatchExternal("columnVisibilityChanged", this.getComponent(), false);
620
+ }
621
+
622
+ if(this.parent.isGroup){
623
+ this.parent.matchChildWidths();
624
+ }
625
+
626
+ if(!this.silent){
627
+ this.table.columnManager.rerenderColumns();
628
+ }
629
+ }
630
+ }
631
+
632
+ matchChildWidths(){
633
+ var childWidth = 0;
634
+
635
+ if(this.contentElement && this.columns.length){
636
+ this.columns.forEach(function(column){
637
+ if(column.visible){
638
+ childWidth += column.getWidth();
639
+ }
640
+ });
641
+
642
+ this.contentElement.style.maxWidth = (childWidth - 1) + "px";
643
+ if (this.table.initialized) {
644
+ this.element.style.width = childWidth + "px";
645
+ }
646
+
647
+ if(this.parent.isGroup){
648
+ this.parent.matchChildWidths();
649
+ }
650
+ }
651
+ }
652
+
653
+ removeChild(child){
654
+ var index = this.columns.indexOf(child);
655
+
656
+ if(index > -1){
657
+ this.columns.splice(index, 1);
658
+ }
659
+
660
+ if(!this.columns.length){
661
+ this.delete();
662
+ }
663
+ }
664
+
665
+ setWidth(width){
666
+ this.widthFixed = true;
667
+ this.setWidthActual(width);
668
+ }
669
+
670
+ setWidthActual(width){
671
+ if(isNaN(width)){
672
+ width = Math.floor((this.table.element.clientWidth/100) * parseInt(width));
673
+ }
674
+
675
+ width = Math.max(this.minWidth, width);
676
+
677
+ if(this.maxWidth){
678
+ width = Math.min(this.maxWidth, width);
679
+ }
680
+
681
+ this.width = width;
682
+ this.widthStyled = width ? width + "px" : "";
683
+
684
+ this.element.style.width = this.widthStyled;
685
+
686
+ if(!this.isGroup){
687
+ this.cells.forEach(function(cell){
688
+ cell.setWidth();
689
+ });
690
+ }
691
+
692
+ if(this.parent.isGroup){
693
+ this.parent.matchChildWidths();
694
+ }
695
+
696
+ this.dispatch("column-width", this);
697
+
698
+ if(this.subscribedExternal("columnWidth")){
699
+ this.dispatchExternal("columnWidth", this.getComponent());
700
+ }
701
+ }
702
+
703
+ checkCellHeights(){
704
+ var rows = [];
705
+
706
+ this.cells.forEach(function(cell){
707
+ if(cell.row.heightInitialized){
708
+ if(cell.row.getElement().offsetParent !== null){
709
+ rows.push(cell.row);
710
+ cell.row.clearCellHeight();
711
+ }else{
712
+ cell.row.heightInitialized = false;
713
+ }
714
+ }
715
+ });
716
+
717
+ rows.forEach(function(row){
718
+ row.calcHeight();
719
+ });
720
+
721
+ rows.forEach(function(row){
722
+ row.setCellHeight();
723
+ });
724
+ }
725
+
726
+ getWidth(){
727
+ var width = 0;
728
+
729
+ if(this.isGroup){
730
+ this.columns.forEach(function(column){
731
+ if(column.visible){
732
+ width += column.getWidth();
733
+ }
734
+ });
735
+ }else{
736
+ width = this.width;
737
+ }
738
+
739
+ return width;
740
+ }
741
+
742
+ getLeftOffset(){
743
+ var offset = this.element.offsetLeft;
744
+
745
+ if(this.parent.isGroup){
746
+ offset += this.parent.getLeftOffset();
747
+ }
748
+
749
+ return offset;
750
+ }
751
+
752
+ getHeight(){
753
+ return Math.ceil(this.element.getBoundingClientRect().height);
754
+ }
755
+
756
+ setMinWidth(minWidth){
757
+ if(this.maxWidth && minWidth > this.maxWidth){
758
+ minWidth = this.maxWidth;
759
+
760
+ console.warn("the minWidth ("+ minWidth + "px) for column '" + this.field + "' cannot be bigger that its maxWidth ("+ this.maxWidthStyled + ")");
761
+ }
762
+
763
+ this.minWidth = minWidth;
764
+ this.minWidthStyled = minWidth ? minWidth + "px" : "";
765
+
766
+ this.element.style.minWidth = this.minWidthStyled;
767
+
768
+ this.cells.forEach(function(cell){
769
+ cell.setMinWidth();
770
+ });
771
+ }
772
+
773
+ setMaxWidth(maxWidth){
774
+ if(this.minWidth && maxWidth < this.minWidth){
775
+ maxWidth = this.minWidth;
776
+
777
+ console.warn("the maxWidth ("+ maxWidth + "px) for column '" + this.field + "' cannot be smaller that its minWidth ("+ this.minWidthStyled + ")");
778
+ }
779
+
780
+ this.maxWidth = maxWidth;
781
+ this.maxWidthStyled = maxWidth ? maxWidth + "px" : "";
782
+
783
+ this.element.style.maxWidth = this.maxWidthStyled;
784
+
785
+ this.cells.forEach(function(cell){
786
+ cell.setMaxWidth();
787
+ });
788
+ }
789
+
790
+ delete(){
791
+ return new Promise((resolve, reject) => {
792
+ if(this.isGroup){
793
+ this.columns.forEach(function(column){
794
+ column.delete();
795
+ });
796
+ }
797
+
798
+ this.dispatch("column-delete", this);
799
+
800
+ var cellCount = this.cells.length;
801
+
802
+ for(let i = 0; i < cellCount; i++){
803
+ this.cells[0].delete();
804
+ }
805
+
806
+ if(this.element.parentNode){
807
+ this.element.parentNode.removeChild(this.element);
808
+ }
809
+
810
+ this.element = false;
811
+ this.contentElement = false;
812
+ this.titleElement = false;
813
+ this.groupElement = false;
814
+
815
+ if(this.parent.isGroup){
816
+ this.parent.removeChild(this);
817
+ }
818
+
819
+ this.table.columnManager.deregisterColumn(this);
820
+
821
+ this.table.columnManager.rerenderColumns(true);
822
+
823
+ this.dispatch("column-deleted", this);
824
+
825
+ resolve();
826
+ });
827
+ }
828
+
829
+ columnRendered(){
830
+ if(this.titleFormatterRendered){
831
+ this.titleFormatterRendered();
832
+ }
833
+
834
+ this.dispatch("column-rendered", this);
835
+ }
836
+
837
+ //////////////// Cell Management /////////////////
838
+ //generate cell for this column
839
+ generateCell(row){
840
+ var cell = new Cell(this, row);
841
+
842
+ this.cells.push(cell);
843
+
844
+ return cell;
845
+ }
846
+
847
+ nextColumn(){
848
+ var index = this.table.columnManager.findColumnIndex(this);
849
+ return index > -1 ? this._nextVisibleColumn(index + 1) : false;
850
+ }
851
+
852
+ _nextVisibleColumn(index){
853
+ var column = this.table.columnManager.getColumnByIndex(index);
854
+ return !column || column.visible ? column : this._nextVisibleColumn(index + 1);
855
+ }
856
+
857
+ prevColumn(){
858
+ var index = this.table.columnManager.findColumnIndex(this);
859
+ return index > -1 ? this._prevVisibleColumn(index - 1) : false;
860
+ }
861
+
862
+ _prevVisibleColumn(index){
863
+ var column = this.table.columnManager.getColumnByIndex(index);
864
+ return !column || column.visible ? column : this._prevVisibleColumn(index - 1);
865
+ }
866
+
867
+ reinitializeWidth(force){
868
+ this.widthFixed = false;
869
+
870
+ //set width if present
871
+ if(typeof this.definition.width !== "undefined" && !force){
872
+ // maxInitialWidth ignored here as width specified
873
+ this.setWidth(this.definition.width);
874
+ }
875
+
876
+ this.dispatch("column-width-fit-before", this);
877
+
878
+ this.fitToData(force);
879
+
880
+ this.dispatch("column-width-fit-after", this);
881
+ }
882
+
883
+ //set column width to maximum cell width for non group columns
884
+ fitToData(force){
885
+ if(this.isGroup){
886
+ return;
887
+ }
888
+
889
+ if(!this.widthFixed){
890
+ this.element.style.width = "";
891
+
892
+ this.cells.forEach((cell) => {
893
+ cell.clearWidth();
894
+ });
895
+ }
896
+
897
+ var maxWidth = this.element.offsetWidth;
898
+
899
+ if(!this.width || !this.widthFixed){
900
+ this.cells.forEach((cell) => {
901
+ var width = cell.getWidth();
902
+
903
+ if(width > maxWidth){
904
+ maxWidth = width;
905
+ }
906
+ });
907
+
908
+ if(maxWidth){
909
+ var setTo = maxWidth + 1;
910
+
911
+ if(force){
912
+ this.setWidth(setTo);
913
+ }else{
914
+ if (this.maxInitialWidth && !force) {
915
+ setTo = Math.min(setTo, this.maxInitialWidth);
916
+ }
917
+ this.setWidthActual(setTo);
918
+ }
919
+ }
920
+ }
921
+ }
922
+
923
+ updateDefinition(updates){
924
+ var definition;
925
+
926
+ if(!this.isGroup){
927
+ if(!this.parent.isGroup){
928
+ definition = Object.assign({}, this.getDefinition());
929
+ definition = Object.assign(definition, updates);
930
+
931
+ return this.table.columnManager.addColumn(definition, false, this)
932
+ .then((column) => {
933
+
934
+ if(definition.field == this.field){
935
+ this.field = false; //clear field name to prevent deletion of duplicate column from arrays
936
+ }
937
+
938
+ return this.delete()
939
+ .then(() => {
940
+ return column.getComponent();
941
+ });
942
+
943
+ });
944
+ }else{
945
+ console.error("Column Update Error - The updateDefinition function is only available on ungrouped columns");
946
+ return Promise.reject("Column Update Error - The updateDefinition function is only available on columns, not column groups");
947
+ }
948
+ }else{
949
+ console.error("Column Update Error - The updateDefinition function is only available on ungrouped columns");
950
+ return Promise.reject("Column Update Error - The updateDefinition function is only available on columns, not column groups");
951
+ }
952
+ }
953
+
954
+ deleteCell(cell){
955
+ var index = this.cells.indexOf(cell);
956
+
957
+ if(index > -1){
958
+ this.cells.splice(index, 1);
959
+ }
960
+ }
961
+
962
+ //////////////// Object Generation /////////////////
963
+ getComponent(){
964
+ if(!this.component){
965
+ this.component = new ColumnComponent(this);
966
+ }
967
+
968
+ return this.component;
969
+ }
970
+
971
+ getPosition(){
972
+ return this.table.columnManager.getVisibleColumnsByIndex().indexOf(this) + 1;
973
+ }
974
+
975
+ getParentComponent(){
976
+ return this.parent instanceof Column ? this.parent.getComponent() : false;
977
+ }
978
+ }