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,310 +1,310 @@
1
- import Module from '../../core/Module.js';
2
-
3
- class ResizeColumns extends Module{
4
-
5
- constructor(table){
6
- super(table);
7
-
8
- this.startColumn = false;
9
- this.startX = false;
10
- this.startWidth = false;
11
- this.latestX = false;
12
- this.handle = null;
13
- this.initialNextColumn = null;
14
- this.nextColumn = null;
15
-
16
- this.initialized = false;
17
- this.registerColumnOption("resizable", true);
18
- this.registerTableOption("resizableColumnFit", false);
19
- }
20
-
21
- initialize(){
22
- this.subscribe("column-rendered", this.layoutColumnHeader.bind(this));
23
- }
24
-
25
- initializeEventWatchers(){
26
- if(!this.initialized){
27
-
28
- this.subscribe("cell-rendered", this.layoutCellHandles.bind(this));
29
- this.subscribe("cell-delete", this.deInitializeComponent.bind(this));
30
-
31
- this.subscribe("cell-height", this.resizeHandle.bind(this));
32
- this.subscribe("column-moved", this.columnLayoutUpdated.bind(this));
33
-
34
- this.subscribe("column-hide", this.deInitializeColumn.bind(this));
35
- this.subscribe("column-show", this.columnLayoutUpdated.bind(this));
36
- this.subscribe("column-width", this.columnWidthUpdated.bind(this));
37
-
38
- this.subscribe("column-delete", this.deInitializeComponent.bind(this));
39
- this.subscribe("column-height", this.resizeHandle.bind(this));
40
-
41
- this.initialized = true;
42
- }
43
- }
44
-
45
-
46
- layoutCellHandles(cell){
47
- if(cell.row.type === "row"){
48
- this.deInitializeComponent(cell);
49
- this.initializeColumn("cell", cell, cell.column, cell.element);
50
- }
51
- }
52
-
53
- layoutColumnHeader(column){
54
- if(column.definition.resizable){
55
- this.initializeEventWatchers();
56
- this.deInitializeComponent(column);
57
- this.initializeColumn("header", column, column, column.element);
58
- }
59
- }
60
-
61
- columnLayoutUpdated(column){
62
- var prev = column.prevColumn();
63
-
64
- this.reinitializeColumn(column);
65
-
66
- if(prev){
67
- this.reinitializeColumn(prev);
68
- }
69
- }
70
-
71
- columnWidthUpdated(column){
72
- if(column.modules.frozen){
73
- if(this.table.modules.frozenColumns.leftColumns.includes(column)){
74
- this.table.modules.frozenColumns.leftColumns.forEach((col) => {
75
- this.reinitializeColumn(col);
76
- });
77
- }else if(this.table.modules.frozenColumns.rightColumns.includes(column)){
78
- this.table.modules.frozenColumns.rightColumns.forEach((col) => {
79
- this.reinitializeColumn(col);
80
- });
81
- }
82
- }
83
- }
84
-
85
- frozenColumnOffset(column){
86
- var offset = false;
87
-
88
- if(column.modules.frozen){
89
- offset = column.modules.frozen.marginValue;
90
-
91
- if(column.modules.frozen.position === "left"){
92
- offset += column.getWidth() - 3;
93
- }else{
94
- if(offset){
95
- offset -= 3;
96
- }
97
- }
98
- }
99
-
100
- return offset !== false ? offset + "px" : false;
101
- }
102
-
103
- reinitializeColumn(column){
104
- var frozenOffset = this.frozenColumnOffset(column);
105
-
106
- column.cells.forEach((cell) => {
107
- if(cell.modules.resize && cell.modules.resize.handleEl){
108
- if(frozenOffset){
109
- cell.modules.resize.handleEl.style[column.modules.frozen.position] = frozenOffset;
110
- }
111
-
112
- cell.element.after(cell.modules.resize.handleEl);
113
- }
114
- });
115
-
116
- if(column.modules.resize && column.modules.resize.handleEl){
117
- if(frozenOffset){
118
- column.modules.resize.handleEl.style[column.modules.frozen.position] = frozenOffset;
119
- }
120
-
121
- column.element.after(column.modules.resize.handleEl);
122
- }
123
- }
124
-
125
- initializeColumn(type, component, column, element){
126
- var self = this,
127
- variableHeight = false,
128
- mode = column.definition.resizable,
129
- config = {},
130
- nearestColumn = column.getLastColumn();
131
-
132
- //set column resize mode
133
- if(type === "header"){
134
- variableHeight = column.definition.formatter == "textarea" || column.definition.variableHeight;
135
- config = {variableHeight:variableHeight};
136
- }
137
-
138
- if((mode === true || mode == type) && this._checkResizability(nearestColumn)){
139
-
140
- var handle = document.createElement('span');
141
- handle.className = "tabulator-col-resize-handle";
142
-
143
- handle.addEventListener("click", function(e){
144
- e.stopPropagation();
145
- });
146
-
147
- var handleDown = function(e){
148
- self.startColumn = column;
149
- self.initialNextColumn = self.nextColumn = nearestColumn.nextColumn();
150
- self._mouseDown(e, nearestColumn, handle);
151
- };
152
-
153
- handle.addEventListener("mousedown", handleDown);
154
- handle.addEventListener("touchstart", handleDown, {passive: true});
155
-
156
- //resize column on double click
157
- handle.addEventListener("dblclick", (e) => {
158
- var oldWidth = nearestColumn.getWidth();
159
-
160
- e.stopPropagation();
161
- nearestColumn.reinitializeWidth(true);
162
-
163
- if(oldWidth !== nearestColumn.getWidth()){
164
- self.dispatch("column-resized", nearestColumn);
165
- self.table.externalEvents.dispatch("columnResized", nearestColumn.getComponent());
166
- }
167
- });
168
-
169
- if(column.modules.frozen){
170
- handle.style.position = "sticky";
171
- handle.style[column.modules.frozen.position] = this.frozenColumnOffset(column);
172
- }
173
-
174
- config.handleEl = handle;
175
-
176
- if(element.parentNode && column.visible){
177
- element.after(handle);
178
- }
179
- }
180
-
181
- component.modules.resize = config;
182
- }
183
-
184
- deInitializeColumn(column){
185
- this.deInitializeComponent(column);
186
-
187
- column.cells.forEach((cell) => {
188
- this.deInitializeComponent(cell);
189
- });
190
- }
191
-
192
- deInitializeComponent(component){
193
- var handleEl;
194
-
195
- if(component.modules.resize){
196
- handleEl = component.modules.resize.handleEl;
197
-
198
- if(handleEl && handleEl.parentElement){
199
- handleEl.parentElement.removeChild(handleEl);
200
- }
201
- }
202
- }
203
-
204
- resizeHandle(component, height){
205
- if(component.modules.resize && component.modules.resize.handleEl){
206
- component.modules.resize.handleEl.style.height = height;
207
- }
208
- }
209
-
210
- _checkResizability(column){
211
- return column.definition.resizable;
212
- }
213
-
214
- _mouseDown(e, column, handle){
215
- var self = this;
216
-
217
- self.table.element.classList.add("tabulator-block-select");
218
-
219
- function mouseMove(e){
220
- var x = typeof e.screenX === "undefined" ? e.touches[0].screenX : e.screenX,
221
- startDiff = x - self.startX,
222
- moveDiff = x - self.latestX,
223
- blockedBefore, blockedAfter;
224
-
225
- self.latestX = x;
226
-
227
- if(self.table.rtl){
228
- startDiff = -startDiff;
229
- moveDiff = -moveDiff;
230
- }
231
-
232
- blockedBefore = column.width == column.minWidth || column.width == column.maxWidth;
233
-
234
- column.setWidth(self.startWidth + startDiff);
235
-
236
- blockedAfter = column.width == column.minWidth || column.width == column.maxWidth;
237
-
238
- if(moveDiff < 0){
239
- self.nextColumn = self.initialNextColumn;
240
- }
241
-
242
- if(self.table.options.resizableColumnFit && self.nextColumn && !(blockedBefore && blockedAfter)){
243
- let colWidth = self.nextColumn.getWidth();
244
-
245
- if(moveDiff > 0){
246
- if(colWidth <= self.nextColumn.minWidth){
247
- self.nextColumn = self.nextColumn.nextColumn();
248
- }
249
- }
250
-
251
- if(self.nextColumn){
252
- self.nextColumn.setWidth(self.nextColumn.getWidth() - moveDiff);
253
- }
254
- }
255
-
256
- self.table.columnManager.rerenderColumns(true);
257
-
258
- if(!self.table.browserSlow && column.modules.resize && column.modules.resize.variableHeight){
259
- column.checkCellHeights();
260
- }
261
- }
262
-
263
- function mouseUp(e){
264
-
265
- //block editor from taking action while resizing is taking place
266
- if(self.startColumn.modules.edit){
267
- self.startColumn.modules.edit.blocked = false;
268
- }
269
-
270
- if(self.table.browserSlow && column.modules.resize && column.modules.resize.variableHeight){
271
- column.checkCellHeights();
272
- }
273
-
274
- document.body.removeEventListener("mouseup", mouseUp);
275
- document.body.removeEventListener("mousemove", mouseMove);
276
-
277
- handle.removeEventListener("touchmove", mouseMove);
278
- handle.removeEventListener("touchend", mouseUp);
279
-
280
- self.table.element.classList.remove("tabulator-block-select");
281
-
282
- if(self.startWidth !== column.getWidth()){
283
- self.table.columnManager.verticalAlignHeaders();
284
-
285
- self.dispatch("column-resized", column);
286
- self.table.externalEvents.dispatch("columnResized", column.getComponent());
287
- }
288
- }
289
-
290
- e.stopPropagation(); //prevent resize from interfering with movable columns
291
-
292
- //block editor from taking action while resizing is taking place
293
- if(self.startColumn.modules.edit){
294
- self.startColumn.modules.edit.blocked = true;
295
- }
296
-
297
- self.startX = typeof e.screenX === "undefined" ? e.touches[0].screenX : e.screenX;
298
- self.latestX = self.startX;
299
- self.startWidth = column.getWidth();
300
-
301
- document.body.addEventListener("mousemove", mouseMove);
302
- document.body.addEventListener("mouseup", mouseUp);
303
- handle.addEventListener("touchmove", mouseMove, {passive: true});
304
- handle.addEventListener("touchend", mouseUp);
305
- }
306
- }
307
-
308
- ResizeColumns.moduleName = "resizeColumns";
309
-
1
+ import Module from '../../core/Module.js';
2
+
3
+ class ResizeColumns extends Module{
4
+
5
+ constructor(table){
6
+ super(table);
7
+
8
+ this.startColumn = false;
9
+ this.startX = false;
10
+ this.startWidth = false;
11
+ this.latestX = false;
12
+ this.handle = null;
13
+ this.initialNextColumn = null;
14
+ this.nextColumn = null;
15
+
16
+ this.initialized = false;
17
+ this.registerColumnOption("resizable", true);
18
+ this.registerTableOption("resizableColumnFit", false);
19
+ }
20
+
21
+ initialize(){
22
+ this.subscribe("column-rendered", this.layoutColumnHeader.bind(this));
23
+ }
24
+
25
+ initializeEventWatchers(){
26
+ if(!this.initialized){
27
+
28
+ this.subscribe("cell-rendered", this.layoutCellHandles.bind(this));
29
+ this.subscribe("cell-delete", this.deInitializeComponent.bind(this));
30
+
31
+ this.subscribe("cell-height", this.resizeHandle.bind(this));
32
+ this.subscribe("column-moved", this.columnLayoutUpdated.bind(this));
33
+
34
+ this.subscribe("column-hide", this.deInitializeColumn.bind(this));
35
+ this.subscribe("column-show", this.columnLayoutUpdated.bind(this));
36
+ this.subscribe("column-width", this.columnWidthUpdated.bind(this));
37
+
38
+ this.subscribe("column-delete", this.deInitializeComponent.bind(this));
39
+ this.subscribe("column-height", this.resizeHandle.bind(this));
40
+
41
+ this.initialized = true;
42
+ }
43
+ }
44
+
45
+
46
+ layoutCellHandles(cell){
47
+ if(cell.row.type === "row"){
48
+ this.deInitializeComponent(cell);
49
+ this.initializeColumn("cell", cell, cell.column, cell.element);
50
+ }
51
+ }
52
+
53
+ layoutColumnHeader(column){
54
+ if(column.definition.resizable){
55
+ this.initializeEventWatchers();
56
+ this.deInitializeComponent(column);
57
+ this.initializeColumn("header", column, column, column.element);
58
+ }
59
+ }
60
+
61
+ columnLayoutUpdated(column){
62
+ var prev = column.prevColumn();
63
+
64
+ this.reinitializeColumn(column);
65
+
66
+ if(prev){
67
+ this.reinitializeColumn(prev);
68
+ }
69
+ }
70
+
71
+ columnWidthUpdated(column){
72
+ if(column.modules.frozen){
73
+ if(this.table.modules.frozenColumns.leftColumns.includes(column)){
74
+ this.table.modules.frozenColumns.leftColumns.forEach((col) => {
75
+ this.reinitializeColumn(col);
76
+ });
77
+ }else if(this.table.modules.frozenColumns.rightColumns.includes(column)){
78
+ this.table.modules.frozenColumns.rightColumns.forEach((col) => {
79
+ this.reinitializeColumn(col);
80
+ });
81
+ }
82
+ }
83
+ }
84
+
85
+ frozenColumnOffset(column){
86
+ var offset = false;
87
+
88
+ if(column.modules.frozen){
89
+ offset = column.modules.frozen.marginValue;
90
+
91
+ if(column.modules.frozen.position === "left"){
92
+ offset += column.getWidth() - 3;
93
+ }else{
94
+ if(offset){
95
+ offset -= 3;
96
+ }
97
+ }
98
+ }
99
+
100
+ return offset !== false ? offset + "px" : false;
101
+ }
102
+
103
+ reinitializeColumn(column){
104
+ var frozenOffset = this.frozenColumnOffset(column);
105
+
106
+ column.cells.forEach((cell) => {
107
+ if(cell.modules.resize && cell.modules.resize.handleEl){
108
+ if(frozenOffset){
109
+ cell.modules.resize.handleEl.style[column.modules.frozen.position] = frozenOffset;
110
+ }
111
+
112
+ cell.element.after(cell.modules.resize.handleEl);
113
+ }
114
+ });
115
+
116
+ if(column.modules.resize && column.modules.resize.handleEl){
117
+ if(frozenOffset){
118
+ column.modules.resize.handleEl.style[column.modules.frozen.position] = frozenOffset;
119
+ }
120
+
121
+ column.element.after(column.modules.resize.handleEl);
122
+ }
123
+ }
124
+
125
+ initializeColumn(type, component, column, element){
126
+ var self = this,
127
+ variableHeight = false,
128
+ mode = column.definition.resizable,
129
+ config = {},
130
+ nearestColumn = column.getLastColumn();
131
+
132
+ //set column resize mode
133
+ if(type === "header"){
134
+ variableHeight = column.definition.formatter == "textarea" || column.definition.variableHeight;
135
+ config = {variableHeight:variableHeight};
136
+ }
137
+
138
+ if((mode === true || mode == type) && this._checkResizability(nearestColumn)){
139
+
140
+ var handle = document.createElement('span');
141
+ handle.className = "tabulator-col-resize-handle";
142
+
143
+ handle.addEventListener("click", function(e){
144
+ e.stopPropagation();
145
+ });
146
+
147
+ var handleDown = function(e){
148
+ self.startColumn = column;
149
+ self.initialNextColumn = self.nextColumn = nearestColumn.nextColumn();
150
+ self._mouseDown(e, nearestColumn, handle);
151
+ };
152
+
153
+ handle.addEventListener("mousedown", handleDown);
154
+ handle.addEventListener("touchstart", handleDown, {passive: true});
155
+
156
+ //resize column on double click
157
+ handle.addEventListener("dblclick", (e) => {
158
+ var oldWidth = nearestColumn.getWidth();
159
+
160
+ e.stopPropagation();
161
+ nearestColumn.reinitializeWidth(true);
162
+
163
+ if(oldWidth !== nearestColumn.getWidth()){
164
+ self.dispatch("column-resized", nearestColumn);
165
+ self.table.externalEvents.dispatch("columnResized", nearestColumn.getComponent());
166
+ }
167
+ });
168
+
169
+ if(column.modules.frozen){
170
+ handle.style.position = "sticky";
171
+ handle.style[column.modules.frozen.position] = this.frozenColumnOffset(column);
172
+ }
173
+
174
+ config.handleEl = handle;
175
+
176
+ if(element.parentNode && column.visible){
177
+ element.after(handle);
178
+ }
179
+ }
180
+
181
+ component.modules.resize = config;
182
+ }
183
+
184
+ deInitializeColumn(column){
185
+ this.deInitializeComponent(column);
186
+
187
+ column.cells.forEach((cell) => {
188
+ this.deInitializeComponent(cell);
189
+ });
190
+ }
191
+
192
+ deInitializeComponent(component){
193
+ var handleEl;
194
+
195
+ if(component.modules.resize){
196
+ handleEl = component.modules.resize.handleEl;
197
+
198
+ if(handleEl && handleEl.parentElement){
199
+ handleEl.parentElement.removeChild(handleEl);
200
+ }
201
+ }
202
+ }
203
+
204
+ resizeHandle(component, height){
205
+ if(component.modules.resize && component.modules.resize.handleEl){
206
+ component.modules.resize.handleEl.style.height = height;
207
+ }
208
+ }
209
+
210
+ _checkResizability(column){
211
+ return column.definition.resizable;
212
+ }
213
+
214
+ _mouseDown(e, column, handle){
215
+ var self = this;
216
+
217
+ self.table.element.classList.add("tabulator-block-select");
218
+
219
+ function mouseMove(e){
220
+ var x = typeof e.screenX === "undefined" ? e.touches[0].screenX : e.screenX,
221
+ startDiff = x - self.startX,
222
+ moveDiff = x - self.latestX,
223
+ blockedBefore, blockedAfter;
224
+
225
+ self.latestX = x;
226
+
227
+ if(self.table.rtl){
228
+ startDiff = -startDiff;
229
+ moveDiff = -moveDiff;
230
+ }
231
+
232
+ blockedBefore = column.width == column.minWidth || column.width == column.maxWidth;
233
+
234
+ column.setWidth(self.startWidth + startDiff);
235
+
236
+ blockedAfter = column.width == column.minWidth || column.width == column.maxWidth;
237
+
238
+ if(moveDiff < 0){
239
+ self.nextColumn = self.initialNextColumn;
240
+ }
241
+
242
+ if(self.table.options.resizableColumnFit && self.nextColumn && !(blockedBefore && blockedAfter)){
243
+ let colWidth = self.nextColumn.getWidth();
244
+
245
+ if(moveDiff > 0){
246
+ if(colWidth <= self.nextColumn.minWidth){
247
+ self.nextColumn = self.nextColumn.nextColumn();
248
+ }
249
+ }
250
+
251
+ if(self.nextColumn){
252
+ self.nextColumn.setWidth(self.nextColumn.getWidth() - moveDiff);
253
+ }
254
+ }
255
+
256
+ self.table.columnManager.rerenderColumns(true);
257
+
258
+ if(!self.table.browserSlow && column.modules.resize && column.modules.resize.variableHeight){
259
+ column.checkCellHeights();
260
+ }
261
+ }
262
+
263
+ function mouseUp(e){
264
+
265
+ //block editor from taking action while resizing is taking place
266
+ if(self.startColumn.modules.edit){
267
+ self.startColumn.modules.edit.blocked = false;
268
+ }
269
+
270
+ if(self.table.browserSlow && column.modules.resize && column.modules.resize.variableHeight){
271
+ column.checkCellHeights();
272
+ }
273
+
274
+ document.body.removeEventListener("mouseup", mouseUp);
275
+ document.body.removeEventListener("mousemove", mouseMove);
276
+
277
+ handle.removeEventListener("touchmove", mouseMove);
278
+ handle.removeEventListener("touchend", mouseUp);
279
+
280
+ self.table.element.classList.remove("tabulator-block-select");
281
+
282
+ if(self.startWidth !== column.getWidth()){
283
+ self.table.columnManager.verticalAlignHeaders();
284
+
285
+ self.dispatch("column-resized", column);
286
+ self.table.externalEvents.dispatch("columnResized", column.getComponent());
287
+ }
288
+ }
289
+
290
+ e.stopPropagation(); //prevent resize from interfering with movable columns
291
+
292
+ //block editor from taking action while resizing is taking place
293
+ if(self.startColumn.modules.edit){
294
+ self.startColumn.modules.edit.blocked = true;
295
+ }
296
+
297
+ self.startX = typeof e.screenX === "undefined" ? e.touches[0].screenX : e.screenX;
298
+ self.latestX = self.startX;
299
+ self.startWidth = column.getWidth();
300
+
301
+ document.body.addEventListener("mousemove", mouseMove);
302
+ document.body.addEventListener("mouseup", mouseUp);
303
+ handle.addEventListener("touchmove", mouseMove, {passive: true});
304
+ handle.addEventListener("touchend", mouseUp);
305
+ }
306
+ }
307
+
308
+ ResizeColumns.moduleName = "resizeColumns";
309
+
310
310
  export default ResizeColumns;