tabulator-tables 5.4.3 → 5.5.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 (253) hide show
  1. package/.babelrc.json +3 -3
  2. package/.editorconfig +6 -6
  3. package/.eslintignore +3 -3
  4. package/.eslintrc.js +28 -28
  5. package/.github/ISSUE_TEMPLATE/bug_report.md +58 -58
  6. package/.github/ISSUE_TEMPLATE/documentation.md +14 -14
  7. package/.github/ISSUE_TEMPLATE/feature_request.md +24 -24
  8. package/.github/ISSUE_TEMPLATE/question.md +12 -12
  9. package/.github/workflows/bad-files-check.yml +39 -39
  10. package/.github/workflows/lint-and-test.yml +30 -30
  11. package/CODE_OF_CONDUCT.md +46 -46
  12. package/CONTRIBUTING.md +22 -22
  13. package/LICENSE +20 -20
  14. package/README.md +76 -76
  15. package/bower.json +40 -40
  16. package/build/Bundler.js +185 -185
  17. package/build/rollup.js +6 -6
  18. package/dist/css/tabulator.css +80 -53
  19. package/dist/css/tabulator.css.map +1 -1
  20. package/dist/css/tabulator.min.css +1 -1
  21. package/dist/css/tabulator.min.css.map +1 -1
  22. package/dist/css/tabulator_bootstrap3.css +89 -58
  23. package/dist/css/tabulator_bootstrap3.css.map +1 -1
  24. package/dist/css/tabulator_bootstrap3.min.css +1 -1
  25. package/dist/css/tabulator_bootstrap3.min.css.map +1 -1
  26. package/dist/css/tabulator_bootstrap4.css +106 -73
  27. package/dist/css/tabulator_bootstrap4.css.map +1 -1
  28. package/dist/css/tabulator_bootstrap4.min.css +1 -1
  29. package/dist/css/tabulator_bootstrap4.min.css.map +1 -1
  30. package/dist/css/tabulator_bootstrap5.css +110 -75
  31. package/dist/css/tabulator_bootstrap5.css.map +1 -1
  32. package/dist/css/tabulator_bootstrap5.min.css +1 -1
  33. package/dist/css/tabulator_bootstrap5.min.css.map +1 -1
  34. package/dist/css/tabulator_bulma.css +95 -62
  35. package/dist/css/tabulator_bulma.css.map +1 -1
  36. package/dist/css/tabulator_bulma.min.css +1 -1
  37. package/dist/css/tabulator_bulma.min.css.map +1 -1
  38. package/dist/css/tabulator_materialize.css +93 -63
  39. package/dist/css/tabulator_materialize.css.map +1 -1
  40. package/dist/css/tabulator_materialize.min.css +1 -1
  41. package/dist/css/tabulator_materialize.min.css.map +1 -1
  42. package/dist/css/tabulator_midnight.css +90 -59
  43. package/dist/css/tabulator_midnight.css.map +1 -1
  44. package/dist/css/tabulator_midnight.min.css +1 -1
  45. package/dist/css/tabulator_midnight.min.css.map +1 -1
  46. package/dist/css/tabulator_modern.css +96 -62
  47. package/dist/css/tabulator_modern.css.map +1 -1
  48. package/dist/css/tabulator_modern.min.css +1 -1
  49. package/dist/css/tabulator_modern.min.css.map +1 -1
  50. package/dist/css/tabulator_semanticui.css +233 -182
  51. package/dist/css/tabulator_semanticui.css.map +1 -1
  52. package/dist/css/tabulator_semanticui.min.css +1 -1
  53. package/dist/css/tabulator_semanticui.min.css.map +1 -1
  54. package/dist/css/tabulator_simple.css +80 -53
  55. package/dist/css/tabulator_simple.css.map +1 -1
  56. package/dist/css/tabulator_simple.min.css +1 -1
  57. package/dist/css/tabulator_simple.min.css.map +1 -1
  58. package/dist/css/tabulator_site.css +88 -57
  59. package/dist/css/tabulator_site.css.map +1 -1
  60. package/dist/css/tabulator_site.min.css +1 -1
  61. package/dist/css/tabulator_site.min.css.map +1 -1
  62. package/dist/js/jquery_wrapper.js +55 -55
  63. package/dist/js/tabulator.js +26054 -25713
  64. package/dist/js/tabulator.js.map +1 -1
  65. package/dist/js/tabulator.min.js +2 -2
  66. package/dist/js/tabulator.min.js.map +1 -1
  67. package/dist/js/tabulator_esm.js +26131 -25790
  68. package/dist/js/tabulator_esm.js.map +1 -1
  69. package/dist/js/tabulator_esm.min.js +2 -2
  70. package/dist/js/tabulator_esm.min.js.map +1 -1
  71. package/package.json +65 -65
  72. package/src/js/builds/esm.js +14 -14
  73. package/src/js/builds/jquery_wrapper.js +55 -55
  74. package/src/js/core/ColumnManager.js +745 -730
  75. package/src/js/core/CoreFeature.js +138 -138
  76. package/src/js/core/FooterManager.js +101 -101
  77. package/src/js/core/Module.js +141 -141
  78. package/src/js/core/RowManager.js +1128 -1101
  79. package/src/js/core/Tabulator.js +895 -892
  80. package/src/js/core/TabulatorFull.js +10 -10
  81. package/src/js/core/cell/Cell.js +295 -295
  82. package/src/js/core/cell/CellComponent.js +78 -76
  83. package/src/js/core/column/Column.js +949 -949
  84. package/src/js/core/column/ColumnComponent.js +152 -152
  85. package/src/js/core/column/defaults/options.js +17 -17
  86. package/src/js/core/defaults/options.js +65 -65
  87. package/src/js/core/modules/core.js +2 -2
  88. package/src/js/core/modules/optional.js +34 -34
  89. package/src/js/core/rendering/Renderer.js +203 -203
  90. package/src/js/core/rendering/renderers/BasicHorizontal.js +24 -19
  91. package/src/js/core/rendering/renderers/BasicVertical.js +83 -79
  92. package/src/js/core/rendering/renderers/VirtualDomHorizontal.js +582 -577
  93. package/src/js/core/rendering/renderers/VirtualDomVertical.js +634 -580
  94. package/src/js/core/row/PseudoRow.js +44 -44
  95. package/src/js/core/row/Row.js +457 -457
  96. package/src/js/core/row/RowComponent.js +93 -93
  97. package/src/js/core/tools/Alert.js +61 -61
  98. package/src/js/core/tools/ComponentFunctionBinder.js +32 -32
  99. package/src/js/core/tools/DataLoader.js +119 -119
  100. package/src/js/core/tools/DeprecationAdvisor.js +46 -46
  101. package/src/js/core/tools/ExternalEventBus.js +104 -104
  102. package/src/js/core/tools/Helpers.js +46 -46
  103. package/src/js/core/tools/InteractionMonitor.js +321 -321
  104. package/src/js/core/tools/InternalEventBus.js +161 -161
  105. package/src/js/core/tools/ModuleBinder.js +104 -104
  106. package/src/js/core/tools/OptionsList.js +44 -40
  107. package/src/js/core/tools/Popup.js +304 -304
  108. package/src/js/core/tools/TableRegistry.js +61 -61
  109. package/src/js/modules/Accessor/Accessor.js +115 -115
  110. package/src/js/modules/Ajax/Ajax.js +143 -143
  111. package/src/js/modules/Ajax/defaults/config.js +2 -2
  112. package/src/js/modules/Ajax/defaults/contentTypeFormatters.js +44 -44
  113. package/src/js/modules/Ajax/defaults/loaderPromise.js +86 -86
  114. package/src/js/modules/Ajax/defaults/urlGenerator.js +43 -43
  115. package/src/js/modules/Clipboard/Clipboard.js +279 -279
  116. package/src/js/modules/Clipboard/defaults/pasteActions.js +10 -10
  117. package/src/js/modules/Clipboard/defaults/pasteParsers.js +74 -74
  118. package/src/js/modules/ColumnCalcs/CalcComponent.js +47 -47
  119. package/src/js/modules/ColumnCalcs/ColumnCalcs.js +581 -568
  120. package/src/js/modules/ColumnCalcs/defaults/calculations.js +92 -85
  121. package/src/js/modules/Comms/Comms.js +51 -51
  122. package/src/js/modules/DataTree/DataTree.js +603 -603
  123. package/src/js/modules/Download/Download.js +148 -148
  124. package/src/js/modules/Download/defaults/downloaders/csv.js +61 -61
  125. package/src/js/modules/Download/defaults/downloaders/html.js +4 -4
  126. package/src/js/modules/Download/defaults/downloaders/json.js +33 -33
  127. package/src/js/modules/Download/defaults/downloaders/jsonLines.js +31 -31
  128. package/src/js/modules/Download/defaults/downloaders/pdf.js +111 -111
  129. package/src/js/modules/Download/defaults/downloaders/xlsx.js +102 -99
  130. package/src/js/modules/Download/defaults/downloaders.js +14 -14
  131. package/src/js/modules/Edit/Edit.js +734 -736
  132. package/src/js/modules/Edit/List.js +1048 -1033
  133. package/src/js/modules/Edit/defaults/editors/autocomplete.js +11 -11
  134. package/src/js/modules/Edit/defaults/editors/date.js +138 -110
  135. package/src/js/modules/Edit/defaults/editors/datetime.js +125 -97
  136. package/src/js/modules/Edit/defaults/editors/input.js +76 -74
  137. package/src/js/modules/Edit/defaults/editors/list.js +6 -6
  138. package/src/js/modules/Edit/defaults/editors/number.js +109 -107
  139. package/src/js/modules/Edit/defaults/editors/progress.js +126 -126
  140. package/src/js/modules/Edit/defaults/editors/range.js +80 -78
  141. package/src/js/modules/Edit/defaults/editors/select.js +9 -9
  142. package/src/js/modules/Edit/defaults/editors/star.js +145 -145
  143. package/src/js/modules/Edit/defaults/editors/textarea.js +122 -120
  144. package/src/js/modules/Edit/defaults/editors/tickCross.js +94 -96
  145. package/src/js/modules/Edit/defaults/editors/time.js +126 -98
  146. package/src/js/modules/Edit/defaults/editors.js +28 -28
  147. package/src/js/modules/Edit/inputMask.js +73 -73
  148. package/src/js/modules/Export/Export.js +626 -623
  149. package/src/js/modules/Export/ExportColumn.js +10 -10
  150. package/src/js/modules/Export/ExportRow.js +9 -9
  151. package/src/js/modules/Filter/Filter.js +903 -892
  152. package/src/js/modules/Filter/defaults/filters.js +107 -107
  153. package/src/js/modules/Format/Format.js +215 -212
  154. package/src/js/modules/Format/defaults/formatters/buttonCross.js +2 -2
  155. package/src/js/modules/Format/defaults/formatters/buttonTick.js +2 -2
  156. package/src/js/modules/Format/defaults/formatters/color.js +3 -3
  157. package/src/js/modules/Format/defaults/formatters/datetime.js +36 -36
  158. package/src/js/modules/Format/defaults/formatters/datetimediff.js +40 -40
  159. package/src/js/modules/Format/defaults/formatters/handle.js +3 -3
  160. package/src/js/modules/Format/defaults/formatters/html.js +2 -2
  161. package/src/js/modules/Format/defaults/formatters/image.js +39 -39
  162. package/src/js/modules/Format/defaults/formatters/link.js +77 -77
  163. package/src/js/modules/Format/defaults/formatters/lookup.js +9 -9
  164. package/src/js/modules/Format/defaults/formatters/money.js +43 -36
  165. package/src/js/modules/Format/defaults/formatters/plaintext.js +2 -2
  166. package/src/js/modules/Format/defaults/formatters/progress.js +132 -132
  167. package/src/js/modules/Format/defaults/formatters/responsiveCollapse.js +43 -43
  168. package/src/js/modules/Format/defaults/formatters/rowSelection.js +59 -59
  169. package/src/js/modules/Format/defaults/formatters/rownum.js +9 -9
  170. package/src/js/modules/Format/defaults/formatters/star.js +37 -37
  171. package/src/js/modules/Format/defaults/formatters/textarea.js +3 -3
  172. package/src/js/modules/Format/defaults/formatters/tickCross.js +21 -21
  173. package/src/js/modules/Format/defaults/formatters/traffic.js +46 -46
  174. package/src/js/modules/Format/defaults/formatters.js +42 -42
  175. package/src/js/modules/FrozenColumns/FrozenColumns.js +299 -299
  176. package/src/js/modules/FrozenRows/FrozenRows.js +169 -159
  177. package/src/js/modules/GroupRows/Group.js +597 -598
  178. package/src/js/modules/GroupRows/GroupComponent.js +70 -66
  179. package/src/js/modules/GroupRows/GroupRows.js +639 -639
  180. package/src/js/modules/History/History.js +171 -171
  181. package/src/js/modules/History/defaults/redoers.js +24 -24
  182. package/src/js/modules/History/defaults/undoers.js +24 -24
  183. package/src/js/modules/HtmlTableImport/HtmlTableImport.js +181 -181
  184. package/src/js/modules/Import/Import.js +193 -193
  185. package/src/js/modules/Import/defaults/importers/array.js +4 -4
  186. package/src/js/modules/Import/defaults/importers/csv.js +62 -62
  187. package/src/js/modules/Import/defaults/importers/json.js +7 -7
  188. package/src/js/modules/Import/defaults/importers.js +8 -8
  189. package/src/js/modules/Interaction/Interaction.js +337 -325
  190. package/src/js/modules/Keybindings/Keybindings.js +172 -172
  191. package/src/js/modules/Keybindings/defaults/actions.js +118 -118
  192. package/src/js/modules/Keybindings/defaults/bindings.js +12 -12
  193. package/src/js/modules/Layout/Layout.js +49 -49
  194. package/src/js/modules/Layout/defaults/modes/fitColumns.js +171 -171
  195. package/src/js/modules/Layout/defaults/modes/fitData.js +9 -9
  196. package/src/js/modules/Layout/defaults/modes/fitDataGeneral.js +9 -9
  197. package/src/js/modules/Layout/defaults/modes/fitDataStretch.js +39 -39
  198. package/src/js/modules/Layout/defaults/modes.js +11 -11
  199. package/src/js/modules/Localize/Localize.js +185 -185
  200. package/src/js/modules/Localize/defaults/langs.js +36 -36
  201. package/src/js/modules/Menu/Menu.js +302 -302
  202. package/src/js/modules/MoveColumns/MoveColumns.js +299 -299
  203. package/src/js/modules/MoveRows/MoveRows.js +635 -635
  204. package/src/js/modules/Mutator/Mutator.js +161 -161
  205. package/src/js/modules/Page/Page.js +881 -881
  206. package/src/js/modules/Page/defaults/pageCounters/pages.js +32 -32
  207. package/src/js/modules/Page/defaults/pageCounters/rows.js +39 -39
  208. package/src/js/modules/Page/defaults/pageCounters.js +7 -7
  209. package/src/js/modules/Persistence/Persistence.js +472 -458
  210. package/src/js/modules/Persistence/defaults/readers.js +29 -29
  211. package/src/js/modules/Persistence/defaults/writers.js +12 -12
  212. package/src/js/modules/Popup/Popup.js +231 -231
  213. package/src/js/modules/Print/Print.js +137 -137
  214. package/src/js/modules/ReactiveData/ReactiveData.js +408 -408
  215. package/src/js/modules/ResizeColumns/ResizeColumns.js +309 -309
  216. package/src/js/modules/ResizeRows/ResizeRows.js +111 -111
  217. package/src/js/modules/ResizeTable/ResizeTable.js +159 -159
  218. package/src/js/modules/ResponsiveLayout/ResponsiveLayout.js +348 -345
  219. package/src/js/modules/SelectRow/SelectRow.js +474 -444
  220. package/src/js/modules/Sort/Sort.js +470 -470
  221. package/src/js/modules/Sort/defaults/sorters/alphanum.js +43 -43
  222. package/src/js/modules/Sort/defaults/sorters/array.js +53 -53
  223. package/src/js/modules/Sort/defaults/sorters/boolean.js +6 -6
  224. package/src/js/modules/Sort/defaults/sorters/date.js +9 -9
  225. package/src/js/modules/Sort/defaults/sorters/datetime.js +43 -43
  226. package/src/js/modules/Sort/defaults/sorters/exists.js +6 -6
  227. package/src/js/modules/Sort/defaults/sorters/number.js +39 -39
  228. package/src/js/modules/Sort/defaults/sorters/string.js +33 -33
  229. package/src/js/modules/Sort/defaults/sorters/time.js +9 -9
  230. package/src/js/modules/Sort/defaults/sorters.js +20 -20
  231. package/src/js/modules/Tooltip/Tooltip.js +130 -130
  232. package/src/js/modules/Validate/Validate.js +305 -305
  233. package/src/js/modules/Validate/defaults/validators.js +138 -138
  234. package/src/scss/tabulator.scss +1496 -1467
  235. package/src/scss/themes/bootstrap/functions4.scss +118 -118
  236. package/src/scss/themes/bootstrap/functions5.scss +302 -302
  237. package/src/scss/themes/bootstrap/tabulator_bootstrap3.scss +288 -284
  238. package/src/scss/themes/bootstrap/tabulator_bootstrap4.scss +552 -544
  239. package/src/scss/themes/bootstrap/tabulator_bootstrap5.scss +584 -574
  240. package/src/scss/themes/bootstrap/variables3.scss +870 -870
  241. package/src/scss/themes/bootstrap/variables4.scss +930 -930
  242. package/src/scss/themes/bootstrap/variables5.scss +1641 -1641
  243. package/src/scss/themes/bulma/tabulator_bulma.scss +258 -252
  244. package/src/scss/themes/bulma/variables.scss +197 -197
  245. package/src/scss/themes/materialize/tabulator_materialize.scss +269 -265
  246. package/src/scss/themes/materialize/variables.scss +70 -70
  247. package/src/scss/themes/semanticui/tabulator_semanticui.scss +586 -561
  248. package/src/scss/themes/semanticui/variables.scss +839 -839
  249. package/src/scss/themes/semanticui/variables_table.scss +247 -247
  250. package/src/scss/themes/tabulator_midnight.scss +162 -158
  251. package/src/scss/themes/tabulator_modern.scss +239 -231
  252. package/src/scss/themes/tabulator_simple.scss +102 -102
  253. package/src/scss/themes/tabulator_site.scss +193 -189
@@ -1,623 +1,626 @@
1
- import Module from '../../core/Module.js';
2
-
3
- import ExportRow from './ExportRow.js';
4
- import ExportColumn from './ExportColumn.js';
5
-
6
- class Export extends Module{
7
-
8
- constructor(table){
9
- super(table);
10
-
11
- this.config = {};
12
- this.cloneTableStyle = true;
13
- this.colVisProp = "";
14
-
15
- this.registerTableOption("htmlOutputConfig", false); //html output config
16
-
17
- this.registerColumnOption("htmlOutput");
18
- this.registerColumnOption("titleHtmlOutput");
19
- }
20
-
21
- initialize(){
22
- this.registerTableFunction("getHtml", this.getHtml.bind(this));
23
- }
24
-
25
- ///////////////////////////////////
26
- ///////// Table Functions /////////
27
- ///////////////////////////////////
28
-
29
-
30
- ///////////////////////////////////
31
- ///////// Internal Logic //////////
32
- ///////////////////////////////////
33
-
34
- generateExportList(config, style, range, colVisProp){
35
- this.cloneTableStyle = style;
36
- this.config = config || {};
37
- this.colVisProp = colVisProp;
38
-
39
- var headers = this.config.columnHeaders !== false ? this.headersToExportRows(this.generateColumnGroupHeaders()) : [];
40
- var body = this.bodyToExportRows(this.rowLookup(range));
41
-
42
- return headers.concat(body);
43
- }
44
-
45
- generateTable(config, style, range, colVisProp){
46
- var list = this.generateExportList(config, style, range, colVisProp);
47
-
48
- return this.generateTableElement(list);
49
- }
50
-
51
- rowLookup(range){
52
- var rows = [];
53
-
54
- if(typeof range == "function"){
55
- range.call(this.table).forEach((row) =>{
56
- row = this.table.rowManager.findRow(row);
57
-
58
- if(row){
59
- rows.push(row);
60
- }
61
- });
62
- }else{
63
- switch(range){
64
- case true:
65
- case "visible":
66
- rows = this.table.rowManager.getVisibleRows(false, true);
67
- break;
68
-
69
- case "all":
70
- rows = this.table.rowManager.rows;
71
- break;
72
-
73
- case "selected":
74
- rows = this.table.modules.selectRow.selectedRows;
75
- break;
76
-
77
- case "active":
78
- default:
79
- if(this.table.options.pagination){
80
- rows = this.table.rowManager.getDisplayRows(this.table.rowManager.displayRows.length - 2);
81
- }else{
82
- rows = this.table.rowManager.getDisplayRows();
83
- }
84
- }
85
- }
86
-
87
- return Object.assign([], rows);
88
- }
89
-
90
- generateColumnGroupHeaders(){
91
- var output = [];
92
-
93
- var columns = this.config.columnGroups !== false ? this.table.columnManager.columns : this.table.columnManager.columnsByIndex;
94
-
95
- columns.forEach((column) => {
96
- var colData = this.processColumnGroup(column);
97
-
98
- if(colData){
99
- output.push(colData);
100
- }
101
- });
102
-
103
- return output;
104
- }
105
-
106
- processColumnGroup(column){
107
- var subGroups = column.columns,
108
- maxDepth = 0,
109
- title = column.definition["title" + (this.colVisProp.charAt(0).toUpperCase() + this.colVisProp.slice(1))] || column.definition.title;
110
-
111
- var groupData = {
112
- title:title,
113
- column:column,
114
- depth:1,
115
- };
116
-
117
- if(subGroups.length){
118
- groupData.subGroups = [];
119
- groupData.width = 0;
120
-
121
- subGroups.forEach((subGroup) => {
122
- var subGroupData = this.processColumnGroup(subGroup);
123
-
124
- if(subGroupData){
125
- groupData.width += subGroupData.width;
126
- groupData.subGroups.push(subGroupData);
127
-
128
- if(subGroupData.depth > maxDepth){
129
- maxDepth = subGroupData.depth;
130
- }
131
- }
132
- });
133
-
134
- groupData.depth += maxDepth;
135
-
136
- if(!groupData.width){
137
- return false;
138
- }
139
- }else{
140
- if(this.columnVisCheck(column)){
141
- groupData.width = 1;
142
- }else{
143
- return false;
144
- }
145
- }
146
-
147
- return groupData;
148
- }
149
-
150
- columnVisCheck(column){
151
- var visProp = column.definition[this.colVisProp];
152
-
153
- if(typeof visProp === "function"){
154
- visProp = visProp.call(this.table, column.getComponent());
155
- }
156
-
157
- return visProp !== false && (column.visible || (!column.visible && visProp));
158
- }
159
-
160
- headersToExportRows(columns){
161
- var headers = [],
162
- headerDepth = 0,
163
- exportRows = [];
164
-
165
- function parseColumnGroup(column, level){
166
-
167
- var depth = headerDepth - level;
168
-
169
- if(typeof headers[level] === "undefined"){
170
- headers[level] = [];
171
- }
172
-
173
- column.height = column.subGroups ? 1 : (depth - column.depth) + 1;
174
-
175
- headers[level].push(column);
176
-
177
- if(column.height > 1){
178
- for(let i = 1; i < column.height; i ++){
179
-
180
- if(typeof headers[level + i] === "undefined"){
181
- headers[level + i] = [];
182
- }
183
-
184
- headers[level + i].push(false);
185
- }
186
- }
187
-
188
- if(column.width > 1){
189
- for(let i = 1; i < column.width; i ++){
190
- headers[level].push(false);
191
- }
192
- }
193
-
194
- if(column.subGroups){
195
- column.subGroups.forEach(function(subGroup){
196
- parseColumnGroup(subGroup, level+1);
197
- });
198
- }
199
- }
200
-
201
- //calculate maximum header depth
202
- columns.forEach(function(column){
203
- if(column.depth > headerDepth){
204
- headerDepth = column.depth;
205
- }
206
- });
207
-
208
- columns.forEach(function(column){
209
- parseColumnGroup(column,0);
210
- });
211
-
212
- headers.forEach((header) => {
213
- var columns = [];
214
-
215
- header.forEach((col) => {
216
- if(col){
217
- let title = typeof col.title === "undefined" ? "" : col.title;
218
- columns.push(new ExportColumn(title, col.column.getComponent(), col.width, col.height, col.depth));
219
- }else{
220
- columns.push(null);
221
- }
222
- });
223
-
224
- exportRows.push(new ExportRow("header", columns));
225
- });
226
-
227
- return exportRows;
228
- }
229
-
230
- bodyToExportRows(rows){
231
-
232
- var columns = [];
233
- var exportRows = [];
234
-
235
- this.table.columnManager.columnsByIndex.forEach((column) => {
236
- if (this.columnVisCheck(column)) {
237
- columns.push(column.getComponent());
238
- }
239
- });
240
-
241
- if(this.config.columnCalcs !== false && this.table.modExists("columnCalcs")){
242
- if(this.table.modules.columnCalcs.topInitialized){
243
- rows.unshift(this.table.modules.columnCalcs.topRow);
244
- }
245
-
246
- if(this.table.modules.columnCalcs.botInitialized){
247
- rows.push(this.table.modules.columnCalcs.botRow);
248
- }
249
- }
250
-
251
- rows = rows.filter((row) => {
252
- switch(row.type){
253
- case "group":
254
- return this.config.rowGroups !== false;
255
-
256
- case "calc":
257
- return this.config.columnCalcs !== false;
258
-
259
- case "row":
260
- return !(this.table.options.dataTree && this.config.dataTree === false && row.modules.dataTree.parent);
261
- }
262
-
263
- return true;
264
- });
265
-
266
- rows.forEach((row, i) => {
267
- var rowData = row.getData(this.colVisProp);
268
- var exportCols = [];
269
- var indent = 0;
270
-
271
- switch(row.type){
272
- case "group":
273
- indent = row.level;
274
- exportCols.push(new ExportColumn(row.key, row.getComponent(), columns.length, 1));
275
- break;
276
-
277
- case "calc" :
278
- case "row" :
279
- columns.forEach((col) => {
280
- exportCols.push(new ExportColumn(col._column.getFieldValue(rowData), col, 1, 1));
281
- });
282
-
283
- if(this.table.options.dataTree && this.config.dataTree !== false){
284
- indent = row.modules.dataTree.index;
285
- }
286
- break;
287
- }
288
-
289
- exportRows.push(new ExportRow(row.type, exportCols, row.getComponent(), indent));
290
- });
291
-
292
- return exportRows;
293
- }
294
-
295
- generateTableElement(list){
296
- var table = document.createElement("table"),
297
- headerEl = document.createElement("thead"),
298
- bodyEl = document.createElement("tbody"),
299
- styles = this.lookupTableStyles(),
300
- rowFormatter = this.table.options["rowFormatter" + (this.colVisProp.charAt(0).toUpperCase() + this.colVisProp.slice(1))],
301
- setup = {};
302
-
303
- setup.rowFormatter = rowFormatter !== null ? rowFormatter : this.table.options.rowFormatter;
304
-
305
- if(this.table.options.dataTree &&this.config.dataTree !== false && this.table.modExists("columnCalcs")){
306
- setup.treeElementField = this.table.modules.dataTree.elementField;
307
- }
308
-
309
- //assign group header formatter
310
- setup.groupHeader = this.table.options["groupHeader" + (this.colVisProp.charAt(0).toUpperCase() + this.colVisProp.slice(1))];
311
-
312
- if(setup.groupHeader && !Array.isArray(setup.groupHeader)){
313
- setup.groupHeader = [setup.groupHeader];
314
- }
315
-
316
- table.classList.add("tabulator-print-table");
317
-
318
- this.mapElementStyles(this.table.columnManager.getHeadersElement(), headerEl, ["border-top", "border-left", "border-right", "border-bottom", "background-color", "color", "font-weight", "font-family", "font-size"]);
319
-
320
-
321
- if(list.length > 1000){
322
- console.warn("It may take a long time to render an HTML table with more than 1000 rows");
323
- }
324
-
325
- list.forEach((row, i) => {
326
- let rowEl;
327
-
328
- switch(row.type){
329
- case "header":
330
- headerEl.appendChild(this.generateHeaderElement(row, setup, styles));
331
- break;
332
-
333
- case "group":
334
- bodyEl.appendChild(this.generateGroupElement(row, setup, styles));
335
- break;
336
-
337
- case "calc":
338
- bodyEl.appendChild(this.generateCalcElement(row, setup, styles));
339
- break;
340
-
341
- case "row":
342
- rowEl = this.generateRowElement(row, setup, styles);
343
-
344
- this.mapElementStyles(((i % 2) && styles.evenRow) ? styles.evenRow : styles.oddRow, rowEl, ["border-top", "border-left", "border-right", "border-bottom", "color", "font-weight", "font-family", "font-size", "background-color"]);
345
- bodyEl.appendChild(rowEl);
346
- break;
347
- }
348
- });
349
-
350
- if(headerEl.innerHTML){
351
- table.appendChild(headerEl);
352
- }
353
-
354
- table.appendChild(bodyEl);
355
-
356
-
357
- this.mapElementStyles(this.table.element, table, ["border-top", "border-left", "border-right", "border-bottom"]);
358
- return table;
359
- }
360
-
361
- lookupTableStyles(){
362
- var styles = {};
363
-
364
- //lookup row styles
365
- if(this.cloneTableStyle && window.getComputedStyle){
366
- styles.oddRow = this.table.element.querySelector(".tabulator-row-odd:not(.tabulator-group):not(.tabulator-calcs)");
367
- styles.evenRow = this.table.element.querySelector(".tabulator-row-even:not(.tabulator-group):not(.tabulator-calcs)");
368
- styles.calcRow = this.table.element.querySelector(".tabulator-row.tabulator-calcs");
369
- styles.firstRow = this.table.element.querySelector(".tabulator-row:not(.tabulator-group):not(.tabulator-calcs)");
370
- styles.firstGroup = this.table.element.getElementsByClassName("tabulator-group")[0];
371
-
372
- if(styles.firstRow){
373
- styles.styleCells = styles.firstRow.getElementsByClassName("tabulator-cell");
374
- styles.firstCell = styles.styleCells[0];
375
- styles.lastCell = styles.styleCells[styles.styleCells.length - 1];
376
- }
377
- }
378
-
379
- return styles;
380
- }
381
-
382
- generateHeaderElement(row, setup, styles){
383
- var rowEl = document.createElement("tr");
384
-
385
- row.columns.forEach((column) => {
386
- if(column){
387
- var cellEl = document.createElement("th");
388
- var classNames = column.component._column.definition.cssClass ? column.component._column.definition.cssClass.split(" ") : [];
389
-
390
- cellEl.colSpan = column.width;
391
- cellEl.rowSpan = column.height;
392
-
393
- cellEl.innerHTML = column.value;
394
-
395
- if(this.cloneTableStyle){
396
- cellEl.style.boxSizing = "border-box";
397
- }
398
-
399
- classNames.forEach(function(className) {
400
- cellEl.classList.add(className);
401
- });
402
-
403
- this.mapElementStyles(column.component.getElement(), cellEl, ["text-align", "border-top", "border-left", "border-right", "border-bottom", "background-color", "color", "font-weight", "font-family", "font-size"]);
404
- this.mapElementStyles(column.component._column.contentElement, cellEl, ["padding-top", "padding-left", "padding-right", "padding-bottom"]);
405
-
406
- if(column.component._column.visible){
407
- this.mapElementStyles(column.component.getElement(), cellEl, ["width"]);
408
- }else{
409
- if(column.component._column.definition.width){
410
- cellEl.style.width = column.component._column.definition.width + "px";
411
- }
412
- }
413
-
414
- if(column.component._column.parent){
415
- this.mapElementStyles(column.component._column.parent.groupElement, cellEl, ["border-top"]);
416
- }
417
-
418
- rowEl.appendChild(cellEl);
419
- }
420
- });
421
-
422
- return rowEl;
423
- }
424
-
425
- generateGroupElement(row, setup, styles){
426
-
427
- var rowEl = document.createElement("tr"),
428
- cellEl = document.createElement("td"),
429
- group = row.columns[0];
430
-
431
- rowEl.classList.add("tabulator-print-table-row");
432
-
433
- if(setup.groupHeader && setup.groupHeader[row.indent]){
434
- group.value = setup.groupHeader[row.indent](group.value, row.component._group.getRowCount(), row.component._group.getData(), row.component);
435
- }else{
436
- if(setup.groupHeader !== false){
437
- group.value = row.component._group.generator(group.value, row.component._group.getRowCount(), row.component._group.getData(), row.component);
438
- }
439
- }
440
-
441
- cellEl.colSpan = group.width;
442
- cellEl.innerHTML = group.value;
443
-
444
- rowEl.classList.add("tabulator-print-table-group");
445
- rowEl.classList.add("tabulator-group-level-" + row.indent);
446
-
447
- if(group.component.isVisible()){
448
- rowEl.classList.add("tabulator-group-visible");
449
- }
450
-
451
- this.mapElementStyles(styles.firstGroup, rowEl, ["border-top", "border-left", "border-right", "border-bottom", "color", "font-weight", "font-family", "font-size", "background-color"]);
452
- this.mapElementStyles(styles.firstGroup, cellEl, ["padding-top", "padding-left", "padding-right", "padding-bottom"]);
453
-
454
- rowEl.appendChild(cellEl);
455
-
456
- return rowEl;
457
- }
458
-
459
- generateCalcElement(row, setup, styles){
460
- var rowEl = this.generateRowElement(row, setup, styles);
461
-
462
- rowEl.classList.add("tabulator-print-table-calcs");
463
- this.mapElementStyles(styles.calcRow, rowEl, ["border-top", "border-left", "border-right", "border-bottom", "color", "font-weight", "font-family", "font-size", "background-color"]);
464
-
465
- return rowEl;
466
- }
467
-
468
- generateRowElement(row, setup, styles){
469
- var rowEl = document.createElement("tr");
470
-
471
- rowEl.classList.add("tabulator-print-table-row");
472
-
473
- row.columns.forEach((col, i) => {
474
- if(col){
475
- var cellEl = document.createElement("td"),
476
- column = col.component._column,
477
- index = this.table.columnManager.findColumnIndex(column),
478
- value = col.value,
479
- cellStyle;
480
-
481
- var cellWrapper = {
482
- modules:{},
483
- getValue:function(){
484
- return value;
485
- },
486
- getField:function(){
487
- return column.definition.field;
488
- },
489
- getElement:function(){
490
- return cellEl;
491
- },
492
- getColumn:function(){
493
- return column.getComponent();
494
- },
495
- getData:function(){
496
- return row.component.getData();
497
- },
498
- getRow:function(){
499
- return row.component;
500
- },
501
- getComponent:function(){
502
- return cellWrapper;
503
- },
504
- column:column,
505
- };
506
-
507
- var classNames = column.definition.cssClass ? column.definition.cssClass.split(" ") : [];
508
-
509
- classNames.forEach(function(className) {
510
- cellEl.classList.add(className);
511
- });
512
-
513
- if(this.table.modExists("format") && this.config.formatCells !== false){
514
- value = this.table.modules.format.formatExportValue(cellWrapper, this.colVisProp);
515
- }else{
516
- switch(typeof value){
517
- case "object":
518
- value = value !== null ? JSON.stringify(value) : "";
519
- break;
520
-
521
- case "undefined":
522
- value = "";
523
- break;
524
- }
525
- }
526
-
527
- if(value instanceof Node){
528
- cellEl.appendChild(value);
529
- }else{
530
- cellEl.innerHTML = value;
531
- }
532
-
533
- cellStyle = styles.styleCells && styles.styleCells[index] ? styles.styleCells[index] : styles.firstCell;
534
-
535
- if(cellStyle){
536
- this.mapElementStyles(cellStyle, cellEl, ["padding-top", "padding-left", "padding-right", "padding-bottom", "border-top", "border-left", "border-right", "border-bottom", "color", "font-weight", "font-family", "font-size", "text-align"]);
537
-
538
- if(column.definition.align){
539
- cellEl.style.textAlign = column.definition.align;
540
- }
541
- }
542
-
543
- if(this.table.options.dataTree && this.config.dataTree !== false){
544
- if((setup.treeElementField && setup.treeElementField == column.field) || (!setup.treeElementField && i == 0)){
545
- if(row.component._row.modules.dataTree.controlEl){
546
- cellEl.insertBefore(row.component._row.modules.dataTree.controlEl.cloneNode(true), cellEl.firstChild);
547
- }
548
- if(row.component._row.modules.dataTree.branchEl){
549
- cellEl.insertBefore(row.component._row.modules.dataTree.branchEl.cloneNode(true), cellEl.firstChild);
550
- }
551
- }
552
- }
553
-
554
- rowEl.appendChild(cellEl);
555
-
556
- if(cellWrapper.modules.format && cellWrapper.modules.format.renderedCallback){
557
- cellWrapper.modules.format.renderedCallback();
558
- }
559
- }
560
- });
561
-
562
- if(setup.rowFormatter && row.type === "row" && this.config.formatCells !== false){
563
- let formatComponent = Object.assign(row.component);
564
-
565
- formatComponent.getElement = function(){return rowEl;};
566
-
567
- setup.rowFormatter(row.component);
568
- }
569
-
570
- return rowEl;
571
- }
572
-
573
- generateHTMLTable(list){
574
- var holder = document.createElement("div");
575
-
576
- holder.appendChild(this.generateTableElement(list));
577
-
578
- return holder.innerHTML;
579
- }
580
-
581
- getHtml(visible, style, config, colVisProp){
582
- var list = this.generateExportList(config || this.table.options.htmlOutputConfig, style, visible, colVisProp || "htmlOutput");
583
-
584
- return this.generateHTMLTable(list);
585
- }
586
-
587
- mapElementStyles(from, to, props){
588
- if(this.cloneTableStyle && from && to){
589
-
590
- var lookup = {
591
- "background-color" : "backgroundColor",
592
- "color" : "fontColor",
593
- "width" : "width",
594
- "font-weight" : "fontWeight",
595
- "font-family" : "fontFamily",
596
- "font-size" : "fontSize",
597
- "text-align" : "textAlign",
598
- "border-top" : "borderTop",
599
- "border-left" : "borderLeft",
600
- "border-right" : "borderRight",
601
- "border-bottom" : "borderBottom",
602
- "padding-top" : "paddingTop",
603
- "padding-left" : "paddingLeft",
604
- "padding-right" : "paddingRight",
605
- "padding-bottom" : "paddingBottom",
606
- };
607
-
608
- if(window.getComputedStyle){
609
- var fromStyle = window.getComputedStyle(from);
610
-
611
- props.forEach(function(prop){
612
- if(!to.style[lookup[prop]]){
613
- to.style[lookup[prop]] = fromStyle.getPropertyValue(prop);
614
- }
615
- });
616
- }
617
- }
618
- }
619
- }
620
-
621
- Export.moduleName = "export";
622
-
623
- export default Export;
1
+ import Module from '../../core/Module.js';
2
+
3
+ import ExportRow from './ExportRow.js';
4
+ import ExportColumn from './ExportColumn.js';
5
+
6
+ class Export extends Module{
7
+
8
+ constructor(table){
9
+ super(table);
10
+
11
+ this.config = {};
12
+ this.cloneTableStyle = true;
13
+ this.colVisProp = "";
14
+
15
+ this.registerTableOption("htmlOutputConfig", false); //html output config
16
+
17
+ this.registerColumnOption("htmlOutput");
18
+ this.registerColumnOption("titleHtmlOutput");
19
+ }
20
+
21
+ initialize(){
22
+ this.registerTableFunction("getHtml", this.getHtml.bind(this));
23
+ }
24
+
25
+ ///////////////////////////////////
26
+ ///////// Table Functions /////////
27
+ ///////////////////////////////////
28
+
29
+
30
+ ///////////////////////////////////
31
+ ///////// Internal Logic //////////
32
+ ///////////////////////////////////
33
+
34
+ generateExportList(config, style, range, colVisProp){
35
+ this.cloneTableStyle = style;
36
+ this.config = config || {};
37
+ this.colVisProp = colVisProp;
38
+
39
+ var headers = this.config.columnHeaders !== false ? this.headersToExportRows(this.generateColumnGroupHeaders()) : [];
40
+ var body = this.bodyToExportRows(this.rowLookup(range));
41
+
42
+ return headers.concat(body);
43
+ }
44
+
45
+ generateTable(config, style, range, colVisProp){
46
+ var list = this.generateExportList(config, style, range, colVisProp);
47
+
48
+ return this.generateTableElement(list);
49
+ }
50
+
51
+ rowLookup(range){
52
+ var rows = [];
53
+
54
+ if(typeof range == "function"){
55
+ range.call(this.table).forEach((row) =>{
56
+ row = this.table.rowManager.findRow(row);
57
+
58
+ if(row){
59
+ rows.push(row);
60
+ }
61
+ });
62
+ }else{
63
+ switch(range){
64
+ case true:
65
+ case "visible":
66
+ rows = this.table.rowManager.getVisibleRows(false, true);
67
+ break;
68
+
69
+ case "all":
70
+ rows = this.table.rowManager.rows;
71
+ break;
72
+
73
+ case "selected":
74
+ rows = this.table.modules.selectRow.selectedRows;
75
+ break;
76
+
77
+ case "active":
78
+ default:
79
+ if(this.table.options.pagination){
80
+ rows = this.table.rowManager.getDisplayRows(this.table.rowManager.displayRows.length - 2);
81
+ }else{
82
+ rows = this.table.rowManager.getDisplayRows();
83
+ }
84
+ }
85
+ }
86
+
87
+ return Object.assign([], rows);
88
+ }
89
+
90
+ generateColumnGroupHeaders(){
91
+ var output = [];
92
+
93
+ var columns = this.config.columnGroups !== false ? this.table.columnManager.columns : this.table.columnManager.columnsByIndex;
94
+
95
+ columns.forEach((column) => {
96
+ var colData = this.processColumnGroup(column);
97
+
98
+ if(colData){
99
+ output.push(colData);
100
+ }
101
+ });
102
+
103
+ return output;
104
+ }
105
+
106
+ processColumnGroup(column){
107
+ var subGroups = column.columns,
108
+ maxDepth = 0,
109
+ title = column.definition["title" + (this.colVisProp.charAt(0).toUpperCase() + this.colVisProp.slice(1))] || column.definition.title;
110
+
111
+ var groupData = {
112
+ title:title,
113
+ column:column,
114
+ depth:1,
115
+ };
116
+
117
+ if(subGroups.length){
118
+ groupData.subGroups = [];
119
+ groupData.width = 0;
120
+
121
+ subGroups.forEach((subGroup) => {
122
+ var subGroupData = this.processColumnGroup(subGroup);
123
+
124
+ if(subGroupData){
125
+ groupData.width += subGroupData.width;
126
+ groupData.subGroups.push(subGroupData);
127
+
128
+ if(subGroupData.depth > maxDepth){
129
+ maxDepth = subGroupData.depth;
130
+ }
131
+ }
132
+ });
133
+
134
+ groupData.depth += maxDepth;
135
+
136
+ if(!groupData.width){
137
+ return false;
138
+ }
139
+ }else{
140
+ if(this.columnVisCheck(column)){
141
+ groupData.width = 1;
142
+ }else{
143
+ return false;
144
+ }
145
+ }
146
+
147
+ return groupData;
148
+ }
149
+
150
+ columnVisCheck(column){
151
+ var visProp = column.definition[this.colVisProp];
152
+
153
+ if(typeof visProp === "function"){
154
+ visProp = visProp.call(this.table, column.getComponent());
155
+ }
156
+
157
+ return visProp !== false && (column.visible || (!column.visible && visProp));
158
+ }
159
+
160
+ headersToExportRows(columns){
161
+ var headers = [],
162
+ headerDepth = 0,
163
+ exportRows = [];
164
+
165
+ function parseColumnGroup(column, level){
166
+
167
+ var depth = headerDepth - level;
168
+
169
+ if(typeof headers[level] === "undefined"){
170
+ headers[level] = [];
171
+ }
172
+
173
+ column.height = column.subGroups ? 1 : (depth - column.depth) + 1;
174
+
175
+ headers[level].push(column);
176
+
177
+ if(column.height > 1){
178
+ for(let i = 1; i < column.height; i ++){
179
+
180
+ if(typeof headers[level + i] === "undefined"){
181
+ headers[level + i] = [];
182
+ }
183
+
184
+ headers[level + i].push(false);
185
+ }
186
+ }
187
+
188
+ if(column.width > 1){
189
+ for(let i = 1; i < column.width; i ++){
190
+ headers[level].push(false);
191
+ }
192
+ }
193
+
194
+ if(column.subGroups){
195
+ column.subGroups.forEach(function(subGroup){
196
+ parseColumnGroup(subGroup, level+1);
197
+ });
198
+ }
199
+ }
200
+
201
+ //calculate maximum header depth
202
+ columns.forEach(function(column){
203
+ if(column.depth > headerDepth){
204
+ headerDepth = column.depth;
205
+ }
206
+ });
207
+
208
+ columns.forEach(function(column){
209
+ parseColumnGroup(column,0);
210
+ });
211
+
212
+ headers.forEach((header) => {
213
+ var columns = [];
214
+
215
+ header.forEach((col) => {
216
+ if(col){
217
+ let title = typeof col.title === "undefined" ? "" : col.title;
218
+ columns.push(new ExportColumn(title, col.column.getComponent(), col.width, col.height, col.depth));
219
+ }else{
220
+ columns.push(null);
221
+ }
222
+ });
223
+
224
+ exportRows.push(new ExportRow("header", columns));
225
+ });
226
+
227
+ return exportRows;
228
+ }
229
+
230
+ bodyToExportRows(rows){
231
+
232
+ var columns = [];
233
+ var exportRows = [];
234
+
235
+ this.table.columnManager.columnsByIndex.forEach((column) => {
236
+ if (this.columnVisCheck(column)) {
237
+ columns.push(column.getComponent());
238
+ }
239
+ });
240
+
241
+ if(this.config.columnCalcs !== false && this.table.modExists("columnCalcs")){
242
+ if(this.table.modules.columnCalcs.topInitialized){
243
+ rows.unshift(this.table.modules.columnCalcs.topRow);
244
+ }
245
+
246
+ if(this.table.modules.columnCalcs.botInitialized){
247
+ rows.push(this.table.modules.columnCalcs.botRow);
248
+ }
249
+ }
250
+
251
+ rows = rows.filter((row) => {
252
+ switch(row.type){
253
+ case "group":
254
+ return this.config.rowGroups !== false;
255
+
256
+ case "calc":
257
+ return this.config.columnCalcs !== false;
258
+
259
+ case "row":
260
+ return !(this.table.options.dataTree && this.config.dataTree === false && row.modules.dataTree.parent);
261
+ }
262
+
263
+ return true;
264
+ });
265
+
266
+ rows.forEach((row, i) => {
267
+ var rowData = row.getData(this.colVisProp);
268
+ var exportCols = [];
269
+ var indent = 0;
270
+
271
+ switch(row.type){
272
+ case "group":
273
+ indent = row.level;
274
+ exportCols.push(new ExportColumn(row.key, row.getComponent(), columns.length, 1));
275
+ break;
276
+
277
+ case "calc" :
278
+ case "row" :
279
+ columns.forEach((col) => {
280
+ exportCols.push(new ExportColumn(col._column.getFieldValue(rowData), col, 1, 1));
281
+ });
282
+
283
+ if(this.table.options.dataTree && this.config.dataTree !== false){
284
+ indent = row.modules.dataTree.index;
285
+ }
286
+ break;
287
+ }
288
+
289
+ exportRows.push(new ExportRow(row.type, exportCols, row.getComponent(), indent));
290
+ });
291
+
292
+ return exportRows;
293
+ }
294
+
295
+ generateTableElement(list){
296
+ var table = document.createElement("table"),
297
+ headerEl = document.createElement("thead"),
298
+ bodyEl = document.createElement("tbody"),
299
+ styles = this.lookupTableStyles(),
300
+ rowFormatter = this.table.options["rowFormatter" + (this.colVisProp.charAt(0).toUpperCase() + this.colVisProp.slice(1))],
301
+ setup = {};
302
+
303
+ setup.rowFormatter = rowFormatter !== null ? rowFormatter : this.table.options.rowFormatter;
304
+
305
+ if(this.table.options.dataTree &&this.config.dataTree !== false && this.table.modExists("columnCalcs")){
306
+ setup.treeElementField = this.table.modules.dataTree.elementField;
307
+ }
308
+
309
+ //assign group header formatter
310
+ setup.groupHeader = this.table.options["groupHeader" + (this.colVisProp.charAt(0).toUpperCase() + this.colVisProp.slice(1))];
311
+
312
+ if(setup.groupHeader && !Array.isArray(setup.groupHeader)){
313
+ setup.groupHeader = [setup.groupHeader];
314
+ }
315
+
316
+ table.classList.add("tabulator-print-table");
317
+
318
+ this.mapElementStyles(this.table.columnManager.getHeadersElement(), headerEl, ["border-top", "border-left", "border-right", "border-bottom", "background-color", "color", "font-weight", "font-family", "font-size"]);
319
+
320
+
321
+ if(list.length > 1000){
322
+ console.warn("It may take a long time to render an HTML table with more than 1000 rows");
323
+ }
324
+
325
+ list.forEach((row, i) => {
326
+ let rowEl;
327
+
328
+ switch(row.type){
329
+ case "header":
330
+ headerEl.appendChild(this.generateHeaderElement(row, setup, styles));
331
+ break;
332
+
333
+ case "group":
334
+ bodyEl.appendChild(this.generateGroupElement(row, setup, styles));
335
+ break;
336
+
337
+ case "calc":
338
+ bodyEl.appendChild(this.generateCalcElement(row, setup, styles));
339
+ break;
340
+
341
+ case "row":
342
+ rowEl = this.generateRowElement(row, setup, styles);
343
+
344
+ this.mapElementStyles(((i % 2) && styles.evenRow) ? styles.evenRow : styles.oddRow, rowEl, ["border-top", "border-left", "border-right", "border-bottom", "color", "font-weight", "font-family", "font-size", "background-color"]);
345
+ bodyEl.appendChild(rowEl);
346
+ break;
347
+ }
348
+ });
349
+
350
+ if(headerEl.innerHTML){
351
+ table.appendChild(headerEl);
352
+ }
353
+
354
+ table.appendChild(bodyEl);
355
+
356
+
357
+ this.mapElementStyles(this.table.element, table, ["border-top", "border-left", "border-right", "border-bottom"]);
358
+ return table;
359
+ }
360
+
361
+ lookupTableStyles(){
362
+ var styles = {};
363
+
364
+ //lookup row styles
365
+ if(this.cloneTableStyle && window.getComputedStyle){
366
+ styles.oddRow = this.table.element.querySelector(".tabulator-row-odd:not(.tabulator-group):not(.tabulator-calcs)");
367
+ styles.evenRow = this.table.element.querySelector(".tabulator-row-even:not(.tabulator-group):not(.tabulator-calcs)");
368
+ styles.calcRow = this.table.element.querySelector(".tabulator-row.tabulator-calcs");
369
+ styles.firstRow = this.table.element.querySelector(".tabulator-row:not(.tabulator-group):not(.tabulator-calcs)");
370
+ styles.firstGroup = this.table.element.getElementsByClassName("tabulator-group")[0];
371
+
372
+ if(styles.firstRow){
373
+ styles.styleCells = styles.firstRow.getElementsByClassName("tabulator-cell");
374
+ styles.firstCell = styles.styleCells[0];
375
+ styles.lastCell = styles.styleCells[styles.styleCells.length - 1];
376
+ }
377
+ }
378
+
379
+ return styles;
380
+ }
381
+
382
+ generateHeaderElement(row, setup, styles){
383
+ var rowEl = document.createElement("tr");
384
+
385
+ row.columns.forEach((column) => {
386
+ if(column){
387
+ var cellEl = document.createElement("th");
388
+ var classNames = column.component._column.definition.cssClass ? column.component._column.definition.cssClass.split(" ") : [];
389
+
390
+ cellEl.colSpan = column.width;
391
+ cellEl.rowSpan = column.height;
392
+
393
+ cellEl.innerHTML = column.value;
394
+
395
+ if(this.cloneTableStyle){
396
+ cellEl.style.boxSizing = "border-box";
397
+ }
398
+
399
+ classNames.forEach(function(className) {
400
+ cellEl.classList.add(className);
401
+ });
402
+
403
+ this.mapElementStyles(column.component.getElement(), cellEl, ["text-align", "border-top", "border-left", "border-right", "border-bottom", "background-color", "color", "font-weight", "font-family", "font-size"]);
404
+ this.mapElementStyles(column.component._column.contentElement, cellEl, ["padding-top", "padding-left", "padding-right", "padding-bottom"]);
405
+
406
+ if(column.component._column.visible){
407
+ this.mapElementStyles(column.component.getElement(), cellEl, ["width"]);
408
+ }else{
409
+ if(column.component._column.definition.width){
410
+ cellEl.style.width = column.component._column.definition.width + "px";
411
+ }
412
+ }
413
+
414
+ if(column.component._column.parent){
415
+ this.mapElementStyles(column.component._column.parent.groupElement, cellEl, ["border-top"]);
416
+ }
417
+
418
+ rowEl.appendChild(cellEl);
419
+ }
420
+ });
421
+
422
+ return rowEl;
423
+ }
424
+
425
+ generateGroupElement(row, setup, styles){
426
+
427
+ var rowEl = document.createElement("tr"),
428
+ cellEl = document.createElement("td"),
429
+ group = row.columns[0];
430
+
431
+ rowEl.classList.add("tabulator-print-table-row");
432
+
433
+ if(setup.groupHeader && setup.groupHeader[row.indent]){
434
+ group.value = setup.groupHeader[row.indent](group.value, row.component._group.getRowCount(), row.component._group.getData(), row.component);
435
+ }else{
436
+ if(setup.groupHeader !== false){
437
+ group.value = row.component._group.generator(group.value, row.component._group.getRowCount(), row.component._group.getData(), row.component);
438
+ }
439
+ }
440
+
441
+ cellEl.colSpan = group.width;
442
+ cellEl.innerHTML = group.value;
443
+
444
+ rowEl.classList.add("tabulator-print-table-group");
445
+ rowEl.classList.add("tabulator-group-level-" + row.indent);
446
+
447
+ if(group.component.isVisible()){
448
+ rowEl.classList.add("tabulator-group-visible");
449
+ }
450
+
451
+ this.mapElementStyles(styles.firstGroup, rowEl, ["border-top", "border-left", "border-right", "border-bottom", "color", "font-weight", "font-family", "font-size", "background-color"]);
452
+ this.mapElementStyles(styles.firstGroup, cellEl, ["padding-top", "padding-left", "padding-right", "padding-bottom"]);
453
+
454
+ rowEl.appendChild(cellEl);
455
+
456
+ return rowEl;
457
+ }
458
+
459
+ generateCalcElement(row, setup, styles){
460
+ var rowEl = this.generateRowElement(row, setup, styles);
461
+
462
+ rowEl.classList.add("tabulator-print-table-calcs");
463
+ this.mapElementStyles(styles.calcRow, rowEl, ["border-top", "border-left", "border-right", "border-bottom", "color", "font-weight", "font-family", "font-size", "background-color"]);
464
+
465
+ return rowEl;
466
+ }
467
+
468
+ generateRowElement(row, setup, styles){
469
+ var rowEl = document.createElement("tr");
470
+
471
+ rowEl.classList.add("tabulator-print-table-row");
472
+
473
+ row.columns.forEach((col, i) => {
474
+ if(col){
475
+ var cellEl = document.createElement("td"),
476
+ column = col.component._column,
477
+ index = this.table.columnManager.findColumnIndex(column),
478
+ value = col.value,
479
+ cellStyle;
480
+
481
+ var cellWrapper = {
482
+ modules:{},
483
+ getValue:function(){
484
+ return value;
485
+ },
486
+ getField:function(){
487
+ return column.definition.field;
488
+ },
489
+ getElement:function(){
490
+ return cellEl;
491
+ },
492
+ getType:function(){
493
+ return "cell";
494
+ },
495
+ getColumn:function(){
496
+ return column.getComponent();
497
+ },
498
+ getData:function(){
499
+ return row.component.getData();
500
+ },
501
+ getRow:function(){
502
+ return row.component;
503
+ },
504
+ getComponent:function(){
505
+ return cellWrapper;
506
+ },
507
+ column:column,
508
+ };
509
+
510
+ var classNames = column.definition.cssClass ? column.definition.cssClass.split(" ") : [];
511
+
512
+ classNames.forEach(function(className) {
513
+ cellEl.classList.add(className);
514
+ });
515
+
516
+ if(this.table.modExists("format") && this.config.formatCells !== false){
517
+ value = this.table.modules.format.formatExportValue(cellWrapper, this.colVisProp);
518
+ }else{
519
+ switch(typeof value){
520
+ case "object":
521
+ value = value !== null ? JSON.stringify(value) : "";
522
+ break;
523
+
524
+ case "undefined":
525
+ value = "";
526
+ break;
527
+ }
528
+ }
529
+
530
+ if(value instanceof Node){
531
+ cellEl.appendChild(value);
532
+ }else{
533
+ cellEl.innerHTML = value;
534
+ }
535
+
536
+ cellStyle = styles.styleCells && styles.styleCells[index] ? styles.styleCells[index] : styles.firstCell;
537
+
538
+ if(cellStyle){
539
+ this.mapElementStyles(cellStyle, cellEl, ["padding-top", "padding-left", "padding-right", "padding-bottom", "border-top", "border-left", "border-right", "border-bottom", "color", "font-weight", "font-family", "font-size", "text-align"]);
540
+
541
+ if(column.definition.align){
542
+ cellEl.style.textAlign = column.definition.align;
543
+ }
544
+ }
545
+
546
+ if(this.table.options.dataTree && this.config.dataTree !== false){
547
+ if((setup.treeElementField && setup.treeElementField == column.field) || (!setup.treeElementField && i == 0)){
548
+ if(row.component._row.modules.dataTree.controlEl){
549
+ cellEl.insertBefore(row.component._row.modules.dataTree.controlEl.cloneNode(true), cellEl.firstChild);
550
+ }
551
+ if(row.component._row.modules.dataTree.branchEl){
552
+ cellEl.insertBefore(row.component._row.modules.dataTree.branchEl.cloneNode(true), cellEl.firstChild);
553
+ }
554
+ }
555
+ }
556
+
557
+ rowEl.appendChild(cellEl);
558
+
559
+ if(cellWrapper.modules.format && cellWrapper.modules.format.renderedCallback){
560
+ cellWrapper.modules.format.renderedCallback();
561
+ }
562
+ }
563
+ });
564
+
565
+ if(setup.rowFormatter && row.type === "row" && this.config.formatCells !== false){
566
+ let formatComponent = Object.assign(row.component);
567
+
568
+ formatComponent.getElement = function(){return rowEl;};
569
+
570
+ setup.rowFormatter(row.component);
571
+ }
572
+
573
+ return rowEl;
574
+ }
575
+
576
+ generateHTMLTable(list){
577
+ var holder = document.createElement("div");
578
+
579
+ holder.appendChild(this.generateTableElement(list));
580
+
581
+ return holder.innerHTML;
582
+ }
583
+
584
+ getHtml(visible, style, config, colVisProp){
585
+ var list = this.generateExportList(config || this.table.options.htmlOutputConfig, style, visible, colVisProp || "htmlOutput");
586
+
587
+ return this.generateHTMLTable(list);
588
+ }
589
+
590
+ mapElementStyles(from, to, props){
591
+ if(this.cloneTableStyle && from && to){
592
+
593
+ var lookup = {
594
+ "background-color" : "backgroundColor",
595
+ "color" : "fontColor",
596
+ "width" : "width",
597
+ "font-weight" : "fontWeight",
598
+ "font-family" : "fontFamily",
599
+ "font-size" : "fontSize",
600
+ "text-align" : "textAlign",
601
+ "border-top" : "borderTop",
602
+ "border-left" : "borderLeft",
603
+ "border-right" : "borderRight",
604
+ "border-bottom" : "borderBottom",
605
+ "padding-top" : "paddingTop",
606
+ "padding-left" : "paddingLeft",
607
+ "padding-right" : "paddingRight",
608
+ "padding-bottom" : "paddingBottom",
609
+ };
610
+
611
+ if(window.getComputedStyle){
612
+ var fromStyle = window.getComputedStyle(from);
613
+
614
+ props.forEach(function(prop){
615
+ if(!to.style[lookup[prop]]){
616
+ to.style[lookup[prop]] = fromStyle.getPropertyValue(prop);
617
+ }
618
+ });
619
+ }
620
+ }
621
+ }
622
+ }
623
+
624
+ Export.moduleName = "export";
625
+
626
+ export default Export;