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,345 +1,348 @@
1
- import Module from '../../core/Module.js';
2
-
3
- class ResponsiveLayout extends Module{
4
-
5
- constructor(table){
6
- super(table);
7
-
8
- this.columns = [];
9
- this.hiddenColumns = [];
10
- this.mode = "";
11
- this.index = 0;
12
- this.collapseFormatter = [];
13
- this.collapseStartOpen = true;
14
- this.collapseHandleColumn = false;
15
-
16
- this.registerTableOption("responsiveLayout", false); //responsive layout flags
17
- this.registerTableOption("responsiveLayoutCollapseStartOpen", true); //start showing collapsed data
18
- this.registerTableOption("responsiveLayoutCollapseUseFormatters", true); //responsive layout collapse formatter
19
- this.registerTableOption("responsiveLayoutCollapseFormatter", false); //responsive layout collapse formatter
20
-
21
- this.registerColumnOption("responsive");
22
- }
23
-
24
- //generate responsive columns list
25
- initialize(){
26
- if(this.table.options.responsiveLayout){
27
- this.subscribe("column-layout", this.initializeColumn.bind(this));
28
- this.subscribe("column-show", this.updateColumnVisibility.bind(this));
29
- this.subscribe("column-hide", this.updateColumnVisibility.bind(this));
30
- this.subscribe("columns-loaded", this.initializeResponsivity.bind(this));
31
- this.subscribe("column-moved", this.initializeResponsivity.bind(this));
32
- this.subscribe("column-add", this.initializeResponsivity.bind(this));
33
- this.subscribe("column-delete", this.initializeResponsivity.bind(this));
34
-
35
- this.subscribe("table-redrawing", this.tableRedraw.bind(this));
36
-
37
- if(this.table.options.responsiveLayout === "collapse"){
38
- this.subscribe("row-data-changed", this.generateCollapsedRowContent.bind(this));
39
- this.subscribe("row-init", this.initializeRow.bind(this));
40
- this.subscribe("row-layout", this.layoutRow.bind(this));
41
- }
42
- }
43
- }
44
-
45
- tableRedraw(force){
46
- if(["fitColumns", "fitDataStretch"].indexOf(this.layoutMode()) === -1){
47
- if(!force){
48
- this.update();
49
- }
50
- }
51
- }
52
-
53
- initializeResponsivity(){
54
- var columns = [];
55
-
56
- this.mode = this.table.options.responsiveLayout;
57
- this.collapseFormatter = this.table.options.responsiveLayoutCollapseFormatter || this.formatCollapsedData;
58
- this.collapseStartOpen = this.table.options.responsiveLayoutCollapseStartOpen;
59
- this.hiddenColumns = [];
60
-
61
- //determine level of responsivity for each column
62
- this.table.columnManager.columnsByIndex.forEach((column, i) => {
63
- if(column.modules.responsive){
64
- if(column.modules.responsive.order && column.modules.responsive.visible){
65
- column.modules.responsive.index = i;
66
- columns.push(column);
67
-
68
- if(!column.visible && this.mode === "collapse"){
69
- this.hiddenColumns.push(column);
70
- }
71
- }
72
- }
73
- });
74
-
75
- //sort list by responsivity
76
- columns = columns.reverse();
77
- columns = columns.sort((a, b) => {
78
- var diff = b.modules.responsive.order - a.modules.responsive.order;
79
- return diff || (b.modules.responsive.index - a.modules.responsive.index);
80
- });
81
-
82
- this.columns = columns;
83
-
84
- if(this.mode === "collapse"){
85
- this.generateCollapsedContent();
86
- }
87
-
88
- //assign collapse column
89
- for (let col of this.table.columnManager.columnsByIndex){
90
- if(col.definition.formatter == "responsiveCollapse"){
91
- this.collapseHandleColumn = col;
92
- break;
93
- }
94
- }
95
-
96
- if(this.collapseHandleColumn){
97
- if(this.hiddenColumns.length){
98
- this.collapseHandleColumn.show();
99
- }else{
100
- this.collapseHandleColumn.hide();
101
- }
102
- }
103
- }
104
-
105
- //define layout information
106
- initializeColumn(column){
107
- var def = column.getDefinition();
108
-
109
- column.modules.responsive = {order: typeof def.responsive === "undefined" ? 1 : def.responsive, visible:def.visible === false ? false : true};
110
- }
111
-
112
- initializeRow(row){
113
- var el;
114
-
115
- if(row.type !== "calc"){
116
- el = document.createElement("div");
117
- el.classList.add("tabulator-responsive-collapse");
118
-
119
- row.modules.responsiveLayout = {
120
- element:el,
121
- open:this.collapseStartOpen,
122
- };
123
-
124
- if(!this.collapseStartOpen){
125
- el.style.display = 'none';
126
- }
127
- }
128
- }
129
-
130
- layoutRow(row){
131
- var rowEl = row.getElement();
132
-
133
- if(row.modules.responsiveLayout){
134
- rowEl.appendChild(row.modules.responsiveLayout.element);
135
- this.generateCollapsedRowContent(row);
136
- }
137
- }
138
-
139
- //update column visibility
140
- updateColumnVisibility(column, responsiveToggle){
141
- if(!responsiveToggle && column.modules.responsive){
142
- column.modules.responsive.visible = column.visible;
143
- this.initializeResponsivity();
144
- }
145
- }
146
-
147
- hideColumn(column){
148
- var colCount = this.hiddenColumns.length;
149
-
150
- column.hide(false, true);
151
-
152
- if(this.mode === "collapse"){
153
- this.hiddenColumns.unshift(column);
154
- this.generateCollapsedContent();
155
-
156
- if(this.collapseHandleColumn && !colCount){
157
- this.collapseHandleColumn.show();
158
- }
159
- }
160
- }
161
-
162
- showColumn(column){
163
- var index;
164
-
165
- column.show(false, true);
166
- //set column width to prevent calculation loops on uninitialized columns
167
- column.setWidth(column.getWidth());
168
-
169
- if(this.mode === "collapse"){
170
- index = this.hiddenColumns.indexOf(column);
171
-
172
- if(index > -1){
173
- this.hiddenColumns.splice(index, 1);
174
- }
175
-
176
- this.generateCollapsedContent();
177
-
178
- if(this.collapseHandleColumn && !this.hiddenColumns.length){
179
- this.collapseHandleColumn.hide();
180
- }
181
- }
182
- }
183
-
184
- //redraw columns to fit space
185
- update(){
186
- var working = true;
187
-
188
- while(working){
189
-
190
- let width = this.table.modules.layout.getMode() == "fitColumns" ? this.table.columnManager.getFlexBaseWidth() : this.table.columnManager.getWidth();
191
-
192
- let diff = (this.table.options.headerVisible ? this.table.columnManager.element.clientWidth : this.table.element.clientWidth) - width;
193
-
194
- if(diff < 0){
195
- //table is too wide
196
- let column = this.columns[this.index];
197
-
198
- if(column){
199
- this.hideColumn(column);
200
- this.index ++;
201
- }else{
202
- working = false;
203
- }
204
-
205
- }else{
206
-
207
- //table has spare space
208
- let column = this.columns[this.index -1];
209
-
210
- if(column){
211
- if(diff > 0){
212
- if(diff >= column.getWidth()){
213
- this.showColumn(column);
214
- this.index --;
215
- }else{
216
- working = false;
217
- }
218
- }else{
219
- working = false;
220
- }
221
- }else{
222
- working = false;
223
- }
224
- }
225
-
226
- if(!this.table.rowManager.activeRowsCount){
227
- this.table.rowManager.renderEmptyScroll();
228
- }
229
- }
230
- }
231
-
232
- generateCollapsedContent(){
233
- var rows = this.table.rowManager.getDisplayRows();
234
-
235
- rows.forEach((row) => {
236
- this.generateCollapsedRowContent(row);
237
- });
238
- }
239
-
240
- generateCollapsedRowContent(row){
241
- var el, contents;
242
-
243
- if(row.modules.responsiveLayout){
244
- el = row.modules.responsiveLayout.element;
245
-
246
- while(el.firstChild) el.removeChild(el.firstChild);
247
-
248
- contents = this.collapseFormatter(this.generateCollapsedRowData(row));
249
- if(contents){
250
- el.appendChild(contents);
251
- }
252
- }
253
- }
254
-
255
- generateCollapsedRowData(row){
256
- var data = row.getData(),
257
- output = [],
258
- mockCellComponent;
259
-
260
- this.hiddenColumns.forEach((column) => {
261
- var value = column.getFieldValue(data);
262
-
263
- if(column.definition.title && column.field){
264
- if(column.modules.format && this.table.options.responsiveLayoutCollapseUseFormatters){
265
-
266
- mockCellComponent = {
267
- value:false,
268
- data:{},
269
- getValue:function(){
270
- return value;
271
- },
272
- getData:function(){
273
- return data;
274
- },
275
- getElement:function(){
276
- return document.createElement("div");
277
- },
278
- getRow:function(){
279
- return row.getComponent();
280
- },
281
- getColumn:function(){
282
- return column.getComponent();
283
- },
284
- getTable:() => {
285
- return this.table;
286
- },
287
- };
288
-
289
- function onRendered(callback){
290
- callback();
291
- }
292
-
293
- output.push({
294
- field: column.field,
295
- title: column.definition.title,
296
- value: column.modules.format.formatter.call(this.table.modules.format, mockCellComponent, column.modules.format.params, onRendered)
297
- });
298
- }else{
299
- output.push({
300
- field: column.field,
301
- title: column.definition.title,
302
- value: value
303
- });
304
- }
305
- }
306
- });
307
-
308
- return output;
309
- }
310
-
311
- formatCollapsedData(data){
312
- var list = document.createElement("table");
313
-
314
- data.forEach(function(item){
315
- var row = document.createElement("tr");
316
- var titleData = document.createElement("td");
317
- var valueData = document.createElement("td");
318
- var node_content;
319
-
320
- var titleHighlight = document.createElement("strong");
321
- titleData.appendChild(titleHighlight);
322
- this.langBind("columns|" + item.field, function(text){
323
- titleHighlight.innerHTML = text || item.title;
324
- });
325
-
326
- if(item.value instanceof Node){
327
- node_content = document.createElement("div");
328
- node_content.appendChild(item.value);
329
- valueData.appendChild(node_content);
330
- }else{
331
- valueData.innerHTML = item.value;
332
- }
333
-
334
- row.appendChild(titleData);
335
- row.appendChild(valueData);
336
- list.appendChild(row);
337
- }, this);
338
-
339
- return Object.keys(data).length ? list : "";
340
- }
341
- }
342
-
343
- ResponsiveLayout.moduleName = "responsiveLayout";
344
-
345
- export default ResponsiveLayout;
1
+ import Module from '../../core/Module.js';
2
+
3
+ class ResponsiveLayout extends Module{
4
+
5
+ constructor(table){
6
+ super(table);
7
+
8
+ this.columns = [];
9
+ this.hiddenColumns = [];
10
+ this.mode = "";
11
+ this.index = 0;
12
+ this.collapseFormatter = [];
13
+ this.collapseStartOpen = true;
14
+ this.collapseHandleColumn = false;
15
+
16
+ this.registerTableOption("responsiveLayout", false); //responsive layout flags
17
+ this.registerTableOption("responsiveLayoutCollapseStartOpen", true); //start showing collapsed data
18
+ this.registerTableOption("responsiveLayoutCollapseUseFormatters", true); //responsive layout collapse formatter
19
+ this.registerTableOption("responsiveLayoutCollapseFormatter", false); //responsive layout collapse formatter
20
+
21
+ this.registerColumnOption("responsive");
22
+ }
23
+
24
+ //generate responsive columns list
25
+ initialize(){
26
+ if(this.table.options.responsiveLayout){
27
+ this.subscribe("column-layout", this.initializeColumn.bind(this));
28
+ this.subscribe("column-show", this.updateColumnVisibility.bind(this));
29
+ this.subscribe("column-hide", this.updateColumnVisibility.bind(this));
30
+ this.subscribe("columns-loaded", this.initializeResponsivity.bind(this));
31
+ this.subscribe("column-moved", this.initializeResponsivity.bind(this));
32
+ this.subscribe("column-add", this.initializeResponsivity.bind(this));
33
+ this.subscribe("column-delete", this.initializeResponsivity.bind(this));
34
+
35
+ this.subscribe("table-redrawing", this.tableRedraw.bind(this));
36
+
37
+ if(this.table.options.responsiveLayout === "collapse"){
38
+ this.subscribe("row-data-changed", this.generateCollapsedRowContent.bind(this));
39
+ this.subscribe("row-init", this.initializeRow.bind(this));
40
+ this.subscribe("row-layout", this.layoutRow.bind(this));
41
+ }
42
+ }
43
+ }
44
+
45
+ tableRedraw(force){
46
+ if(["fitColumns", "fitDataStretch"].indexOf(this.layoutMode()) === -1){
47
+ if(!force){
48
+ this.update();
49
+ }
50
+ }
51
+ }
52
+
53
+ initializeResponsivity(){
54
+ var columns = [];
55
+
56
+ this.mode = this.table.options.responsiveLayout;
57
+ this.collapseFormatter = this.table.options.responsiveLayoutCollapseFormatter || this.formatCollapsedData;
58
+ this.collapseStartOpen = this.table.options.responsiveLayoutCollapseStartOpen;
59
+ this.hiddenColumns = [];
60
+
61
+ //determine level of responsivity for each column
62
+ this.table.columnManager.columnsByIndex.forEach((column, i) => {
63
+ if(column.modules.responsive){
64
+ if(column.modules.responsive.order && column.modules.responsive.visible){
65
+ column.modules.responsive.index = i;
66
+ columns.push(column);
67
+
68
+ if(!column.visible && this.mode === "collapse"){
69
+ this.hiddenColumns.push(column);
70
+ }
71
+ }
72
+ }
73
+ });
74
+
75
+ //sort list by responsivity
76
+ columns = columns.reverse();
77
+ columns = columns.sort((a, b) => {
78
+ var diff = b.modules.responsive.order - a.modules.responsive.order;
79
+ return diff || (b.modules.responsive.index - a.modules.responsive.index);
80
+ });
81
+
82
+ this.columns = columns;
83
+
84
+ if(this.mode === "collapse"){
85
+ this.generateCollapsedContent();
86
+ }
87
+
88
+ //assign collapse column
89
+ for (let col of this.table.columnManager.columnsByIndex){
90
+ if(col.definition.formatter == "responsiveCollapse"){
91
+ this.collapseHandleColumn = col;
92
+ break;
93
+ }
94
+ }
95
+
96
+ if(this.collapseHandleColumn){
97
+ if(this.hiddenColumns.length){
98
+ this.collapseHandleColumn.show();
99
+ }else{
100
+ this.collapseHandleColumn.hide();
101
+ }
102
+ }
103
+ }
104
+
105
+ //define layout information
106
+ initializeColumn(column){
107
+ var def = column.getDefinition();
108
+
109
+ column.modules.responsive = {order: typeof def.responsive === "undefined" ? 1 : def.responsive, visible:def.visible === false ? false : true};
110
+ }
111
+
112
+ initializeRow(row){
113
+ var el;
114
+
115
+ if(row.type !== "calc"){
116
+ el = document.createElement("div");
117
+ el.classList.add("tabulator-responsive-collapse");
118
+
119
+ row.modules.responsiveLayout = {
120
+ element:el,
121
+ open:this.collapseStartOpen,
122
+ };
123
+
124
+ if(!this.collapseStartOpen){
125
+ el.style.display = 'none';
126
+ }
127
+ }
128
+ }
129
+
130
+ layoutRow(row){
131
+ var rowEl = row.getElement();
132
+
133
+ if(row.modules.responsiveLayout){
134
+ rowEl.appendChild(row.modules.responsiveLayout.element);
135
+ this.generateCollapsedRowContent(row);
136
+ }
137
+ }
138
+
139
+ //update column visibility
140
+ updateColumnVisibility(column, responsiveToggle){
141
+ if(!responsiveToggle && column.modules.responsive){
142
+ column.modules.responsive.visible = column.visible;
143
+ this.initializeResponsivity();
144
+ }
145
+ }
146
+
147
+ hideColumn(column){
148
+ var colCount = this.hiddenColumns.length;
149
+
150
+ column.hide(false, true);
151
+
152
+ if(this.mode === "collapse"){
153
+ this.hiddenColumns.unshift(column);
154
+ this.generateCollapsedContent();
155
+
156
+ if(this.collapseHandleColumn && !colCount){
157
+ this.collapseHandleColumn.show();
158
+ }
159
+ }
160
+ }
161
+
162
+ showColumn(column){
163
+ var index;
164
+
165
+ column.show(false, true);
166
+ //set column width to prevent calculation loops on uninitialized columns
167
+ column.setWidth(column.getWidth());
168
+
169
+ if(this.mode === "collapse"){
170
+ index = this.hiddenColumns.indexOf(column);
171
+
172
+ if(index > -1){
173
+ this.hiddenColumns.splice(index, 1);
174
+ }
175
+
176
+ this.generateCollapsedContent();
177
+
178
+ if(this.collapseHandleColumn && !this.hiddenColumns.length){
179
+ this.collapseHandleColumn.hide();
180
+ }
181
+ }
182
+ }
183
+
184
+ //redraw columns to fit space
185
+ update(){
186
+ var working = true;
187
+
188
+ while(working){
189
+
190
+ let width = this.table.modules.layout.getMode() == "fitColumns" ? this.table.columnManager.getFlexBaseWidth() : this.table.columnManager.getWidth();
191
+
192
+ let diff = (this.table.options.headerVisible ? this.table.columnManager.element.clientWidth : this.table.element.clientWidth) - width;
193
+
194
+ if(diff < 0){
195
+ //table is too wide
196
+ let column = this.columns[this.index];
197
+
198
+ if(column){
199
+ this.hideColumn(column);
200
+ this.index ++;
201
+ }else{
202
+ working = false;
203
+ }
204
+
205
+ }else{
206
+
207
+ //table has spare space
208
+ let column = this.columns[this.index -1];
209
+
210
+ if(column){
211
+ if(diff > 0){
212
+ if(diff >= column.getWidth()){
213
+ this.showColumn(column);
214
+ this.index --;
215
+ }else{
216
+ working = false;
217
+ }
218
+ }else{
219
+ working = false;
220
+ }
221
+ }else{
222
+ working = false;
223
+ }
224
+ }
225
+
226
+ if(!this.table.rowManager.activeRowsCount){
227
+ this.table.rowManager.renderEmptyScroll();
228
+ }
229
+ }
230
+ }
231
+
232
+ generateCollapsedContent(){
233
+ var rows = this.table.rowManager.getDisplayRows();
234
+
235
+ rows.forEach((row) => {
236
+ this.generateCollapsedRowContent(row);
237
+ });
238
+ }
239
+
240
+ generateCollapsedRowContent(row){
241
+ var el, contents;
242
+
243
+ if(row.modules.responsiveLayout){
244
+ el = row.modules.responsiveLayout.element;
245
+
246
+ while(el.firstChild) el.removeChild(el.firstChild);
247
+
248
+ contents = this.collapseFormatter(this.generateCollapsedRowData(row));
249
+ if(contents){
250
+ el.appendChild(contents);
251
+ }
252
+ }
253
+ }
254
+
255
+ generateCollapsedRowData(row){
256
+ var data = row.getData(),
257
+ output = [],
258
+ mockCellComponent;
259
+
260
+ this.hiddenColumns.forEach((column) => {
261
+ var value = column.getFieldValue(data);
262
+
263
+ if(column.definition.title && column.field){
264
+ if(column.modules.format && this.table.options.responsiveLayoutCollapseUseFormatters){
265
+
266
+ mockCellComponent = {
267
+ value:false,
268
+ data:{},
269
+ getValue:function(){
270
+ return value;
271
+ },
272
+ getData:function(){
273
+ return data;
274
+ },
275
+ getType:function(){
276
+ return "cell";
277
+ },
278
+ getElement:function(){
279
+ return document.createElement("div");
280
+ },
281
+ getRow:function(){
282
+ return row.getComponent();
283
+ },
284
+ getColumn:function(){
285
+ return column.getComponent();
286
+ },
287
+ getTable:() => {
288
+ return this.table;
289
+ },
290
+ };
291
+
292
+ function onRendered(callback){
293
+ callback();
294
+ }
295
+
296
+ output.push({
297
+ field: column.field,
298
+ title: column.definition.title,
299
+ value: column.modules.format.formatter.call(this.table.modules.format, mockCellComponent, column.modules.format.params, onRendered)
300
+ });
301
+ }else{
302
+ output.push({
303
+ field: column.field,
304
+ title: column.definition.title,
305
+ value: value
306
+ });
307
+ }
308
+ }
309
+ });
310
+
311
+ return output;
312
+ }
313
+
314
+ formatCollapsedData(data){
315
+ var list = document.createElement("table");
316
+
317
+ data.forEach(function(item){
318
+ var row = document.createElement("tr");
319
+ var titleData = document.createElement("td");
320
+ var valueData = document.createElement("td");
321
+ var node_content;
322
+
323
+ var titleHighlight = document.createElement("strong");
324
+ titleData.appendChild(titleHighlight);
325
+ this.langBind("columns|" + item.field, function(text){
326
+ titleHighlight.innerHTML = text || item.title;
327
+ });
328
+
329
+ if(item.value instanceof Node){
330
+ node_content = document.createElement("div");
331
+ node_content.appendChild(item.value);
332
+ valueData.appendChild(node_content);
333
+ }else{
334
+ valueData.innerHTML = item.value;
335
+ }
336
+
337
+ row.appendChild(titleData);
338
+ row.appendChild(valueData);
339
+ list.appendChild(row);
340
+ }, this);
341
+
342
+ return Object.keys(data).length ? list : "";
343
+ }
344
+ }
345
+
346
+ ResponsiveLayout.moduleName = "responsiveLayout";
347
+
348
+ export default ResponsiveLayout;