tabulator-tables 5.4.2 → 5.4.4

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 +1 -5
  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 +1 -5
  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 +1 -5
  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 +1 -5
  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 +1 -5
  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 +1 -5
  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 +1 -5
  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 +1 -5
  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 +103 -107
  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 +1 -5
  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 +1 -5
  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 +25847 -25653
  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 +25926 -25732
  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 +730 -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 +1112 -1082
  79. package/src/js/core/Tabulator.js +895 -893
  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 +76 -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 +19 -19
  91. package/src/js/core/rendering/renderers/BasicVertical.js +79 -78
  92. package/src/js/core/rendering/renderers/VirtualDomHorizontal.js +577 -577
  93. package/src/js/core/rendering/renderers/VirtualDomVertical.js +579 -579
  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 +85 -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 +98 -98
  130. package/src/js/modules/Download/defaults/downloaders.js +14 -14
  131. package/src/js/modules/Edit/Edit.js +735 -736
  132. package/src/js/modules/Edit/List.js +1037 -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 +623 -617
  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 +892 -889
  152. package/src/js/modules/Filter/defaults/filters.js +107 -107
  153. package/src/js/modules/Format/Format.js +212 -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 +36 -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 -595
  178. package/src/js/modules/GroupRows/GroupComponent.js +66 -66
  179. package/src/js/modules/GroupRows/GroupRows.js +639 -623
  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 +325 -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 -194
  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 +458 -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 -124
  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 +345 -345
  219. package/src/js/modules/SelectRow/SelectRow.js +446 -436
  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 +1464 -1466
  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 +284 -284
  238. package/src/scss/themes/bootstrap/tabulator_bootstrap4.scss +544 -544
  239. package/src/scss/themes/bootstrap/tabulator_bootstrap5.scss +574 -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 +252 -252
  244. package/src/scss/themes/bulma/variables.scss +197 -197
  245. package/src/scss/themes/materialize/tabulator_materialize.scss +265 -265
  246. package/src/scss/themes/materialize/variables.scss +70 -70
  247. package/src/scss/themes/semanticui/tabulator_semanticui.scss +561 -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 +158 -158
  251. package/src/scss/themes/tabulator_modern.scss +231 -231
  252. package/src/scss/themes/tabulator_simple.scss +102 -102
  253. package/src/scss/themes/tabulator_site.scss +189 -189
@@ -1,322 +1,322 @@
1
- import CoreFeature from '../CoreFeature.js';
2
- import Row from '../row/Row.js';
3
-
4
- export default class InteractionManager extends CoreFeature {
5
-
6
- constructor (table){
7
- super(table);
8
-
9
- this.el = null;
10
-
11
- this.abortClasses = ["tabulator-headers", "tabulator-table"];
12
-
13
- this.previousTargets = {};
14
-
15
- this.listeners = [
16
- "click",
17
- "dblclick",
18
- "contextmenu",
19
- "mouseenter",
20
- "mouseleave",
21
- "mouseover",
22
- "mouseout",
23
- "mousemove",
24
- "mouseup",
25
- "mousedown",
26
- "touchstart",
27
- "touchend",
28
- ];
29
-
30
- this.componentMap = {
31
- "tabulator-cell":"cell",
32
- "tabulator-row":"row",
33
- "tabulator-group":"group",
34
- "tabulator-col":"column",
35
- };
36
-
37
- this.pseudoTrackers = {
38
- "row":{
39
- subscriber:null,
40
- target:null,
41
- },
42
- "cell":{
43
- subscriber:null,
44
- target:null,
45
- },
46
- "group":{
47
- subscriber:null,
48
- target:null,
49
- },
50
- "column":{
51
- subscriber:null,
52
- target:null,
53
- },
54
- };
55
-
56
- this.pseudoTracking = false;
57
- }
58
-
59
- initialize(){
60
- this.el = this.table.element;
61
-
62
- this.buildListenerMap();
63
- this.bindSubscriptionWatchers();
64
- }
65
-
66
- buildListenerMap(){
67
- var listenerMap = {};
68
-
69
- this.listeners.forEach((listener) => {
70
- listenerMap[listener] = {
71
- handler:null,
72
- components:[],
73
- };
74
- });
75
-
76
- this.listeners = listenerMap;
77
- }
78
-
79
- bindPseudoEvents(){
80
- Object.keys(this.pseudoTrackers).forEach((key) => {
81
- this.pseudoTrackers[key].subscriber = this.pseudoMouseEnter.bind(this, key);
82
- this.subscribe(key + "-mouseover", this.pseudoTrackers[key].subscriber);
83
- });
84
-
85
- this.pseudoTracking = true;
86
- }
87
-
88
- pseudoMouseEnter(key, e, target){
89
- if(this.pseudoTrackers[key].target !== target){
90
-
91
- if(this.pseudoTrackers[key].target){
92
- this.dispatch(key + "-mouseleave", e, this.pseudoTrackers[key].target);
93
- }
94
-
95
- this.pseudoMouseLeave(key, e);
96
-
97
- this.pseudoTrackers[key].target = target;
98
-
99
- this.dispatch(key + "-mouseenter", e, target);
100
- }
101
- }
102
-
103
- pseudoMouseLeave(key, e){
104
- var leaveList = Object.keys(this.pseudoTrackers),
105
- linkedKeys = {
106
- "row":["cell"],
107
- "cell":["row"],
108
- };
109
-
110
- leaveList = leaveList.filter((item) => {
111
- var links = linkedKeys[key];
112
- return item !== key && (!links || (links && !links.includes(item)));
113
- });
114
-
115
-
116
- leaveList.forEach((key) => {
117
- var target = this.pseudoTrackers[key].target;
118
-
119
- if(this.pseudoTrackers[key].target){
120
- this.dispatch(key + "-mouseleave", e, target);
121
-
122
- this.pseudoTrackers[key].target = null;
123
- }
124
- });
125
- }
126
-
127
-
128
- bindSubscriptionWatchers(){
129
- var listeners = Object.keys(this.listeners),
130
- components = Object.values(this.componentMap);
131
-
132
- for(let comp of components){
133
- for(let listener of listeners){
134
- let key = comp + "-" + listener;
135
-
136
- this.subscriptionChange(key, this.subscriptionChanged.bind(this, comp, listener));
137
- }
138
- }
139
-
140
- this.subscribe("table-destroy", this.clearWatchers.bind(this));
141
- }
142
-
143
- subscriptionChanged(component, key, added){
144
- var listener = this.listeners[key].components,
145
- index = listener.indexOf(component),
146
- changed = false;
147
-
148
- if(added){
149
- if(index === -1){
150
- listener.push(component);
151
- changed = true;
152
- }
153
- }else{
154
- if(!this.subscribed(component + "-" + key)){
155
- if(index > -1){
156
- listener.splice(index, 1);
157
- changed = true;
158
- }
159
- }
160
- }
161
-
162
- if((key === "mouseenter" || key === "mouseleave") && !this.pseudoTracking){
163
- this.bindPseudoEvents();
164
- }
165
-
166
- if(changed){
167
- this.updateEventListeners();
168
- }
169
- }
170
-
171
- updateEventListeners(){
172
- for(let key in this.listeners){
173
- let listener = this.listeners[key];
174
-
175
- if(listener.components.length){
176
- if(!listener.handler){
177
- listener.handler = this.track.bind(this, key);
178
- this.el.addEventListener(key, listener.handler);
179
- // this.el.addEventListener(key, listener.handler, {passive: true})
180
- }
181
- }else{
182
- if(listener.handler){
183
- this.el.removeEventListener(key, listener.handler);
184
- listener.handler = null;
185
- }
186
- }
187
- }
188
- }
189
-
190
- track(type, e){
191
- var path = (e.composedPath && e.composedPath()) || e.path;
192
-
193
- var targets = this.findTargets(path);
194
- targets = this.bindComponents(type, targets);
195
-
196
- this.triggerEvents(type, e, targets);
197
-
198
- if(this.pseudoTracking && (type == "mouseover" || type == "mouseleave") && !Object.keys(targets).length){
199
- this.pseudoMouseLeave("none", e);
200
- }
201
- }
202
-
203
- findTargets(path){
204
- var targets = {};
205
-
206
- let componentMap = Object.keys(this.componentMap);
207
-
208
- for (let el of path) {
209
- let classList = el.classList ? [...el.classList] : [];
210
-
211
- let abort = classList.filter((item) => {
212
- return this.abortClasses.includes(item);
213
- });
214
-
215
- if(abort.length){
216
- break;
217
- }
218
-
219
- let elTargets = classList.filter((item) => {
220
- return componentMap.includes(item);
221
- });
222
-
223
- for (let target of elTargets) {
224
- if(!targets[this.componentMap[target]]){
225
- targets[this.componentMap[target]] = el;
226
- }
227
- }
228
- }
229
-
230
- if(targets.group && targets.group === targets.row){
231
- delete targets.row;
232
- }
233
-
234
- return targets;
235
- }
236
-
237
- bindComponents(type, targets){
238
- //ensure row component is looked up before cell
239
- var keys = Object.keys(targets).reverse(),
240
- listener = this.listeners[type],
241
- matches = {},
242
- targetMatches = {};
243
-
244
- for(let key of keys){
245
- let component,
246
- target = targets[key],
247
- previousTarget = this.previousTargets[key];
248
-
249
- if(previousTarget && previousTarget.target === target){
250
- component = previousTarget.component;
251
- }else{
252
- switch(key){
253
- case "row":
254
- case "group":
255
- if(listener.components.includes("row") || listener.components.includes("cell") || listener.components.includes("group")){
256
- let rows = this.table.rowManager.getVisibleRows(true);
257
-
258
- component = rows.find((row) => {
259
- return row.getElement() === target;
260
- });
261
-
262
- if(targets["row"] && targets["row"].parentNode && targets["row"].parentNode.closest(".tabulator-row")){
263
- targets[key] = false;
264
- }
265
- }
266
- break;
267
-
268
- case "column":
269
- if(listener.components.includes("column")){
270
- component = this.table.columnManager.findColumn(target);
271
- }
272
- break;
273
-
274
- case "cell":
275
- if(listener.components.includes("cell")){
276
- if(matches["row"] instanceof Row){
277
- component = matches["row"].findCell(target);
278
- }else{
279
- if(targets["row"]){
280
- console.warn("Event Target Lookup Error - The row this cell is attached to cannot be found, has the table been reinitialized without being destroyed first?");
281
- }
282
- }
283
- }
284
- break;
285
- }
286
- }
287
-
288
- if(component){
289
- matches[key] = component;
290
- targetMatches[key] = {
291
- target:target,
292
- component:component,
293
- };
294
- }
295
- }
296
-
297
- this.previousTargets = targetMatches;
298
-
299
- return matches;
300
- }
301
-
302
- triggerEvents(type, e, targets){
303
- var listener = this.listeners[type];
304
-
305
- for(let key in targets){
306
- if(targets[key] && listener.components.includes(key)){
307
- this.dispatch(key + "-" + type, e, targets[key]);
308
- }
309
- }
310
- }
311
-
312
- clearWatchers(){
313
- for(let key in this.listeners){
314
- let listener = this.listeners[key];
315
-
316
- if(listener.handler){
317
- this.el.removeEventListener(key, listener.handler);
318
- listener.handler = null;
319
- }
320
- }
321
- }
1
+ import CoreFeature from '../CoreFeature.js';
2
+ import Row from '../row/Row.js';
3
+
4
+ export default class InteractionManager extends CoreFeature {
5
+
6
+ constructor (table){
7
+ super(table);
8
+
9
+ this.el = null;
10
+
11
+ this.abortClasses = ["tabulator-headers", "tabulator-table"];
12
+
13
+ this.previousTargets = {};
14
+
15
+ this.listeners = [
16
+ "click",
17
+ "dblclick",
18
+ "contextmenu",
19
+ "mouseenter",
20
+ "mouseleave",
21
+ "mouseover",
22
+ "mouseout",
23
+ "mousemove",
24
+ "mouseup",
25
+ "mousedown",
26
+ "touchstart",
27
+ "touchend",
28
+ ];
29
+
30
+ this.componentMap = {
31
+ "tabulator-cell":"cell",
32
+ "tabulator-row":"row",
33
+ "tabulator-group":"group",
34
+ "tabulator-col":"column",
35
+ };
36
+
37
+ this.pseudoTrackers = {
38
+ "row":{
39
+ subscriber:null,
40
+ target:null,
41
+ },
42
+ "cell":{
43
+ subscriber:null,
44
+ target:null,
45
+ },
46
+ "group":{
47
+ subscriber:null,
48
+ target:null,
49
+ },
50
+ "column":{
51
+ subscriber:null,
52
+ target:null,
53
+ },
54
+ };
55
+
56
+ this.pseudoTracking = false;
57
+ }
58
+
59
+ initialize(){
60
+ this.el = this.table.element;
61
+
62
+ this.buildListenerMap();
63
+ this.bindSubscriptionWatchers();
64
+ }
65
+
66
+ buildListenerMap(){
67
+ var listenerMap = {};
68
+
69
+ this.listeners.forEach((listener) => {
70
+ listenerMap[listener] = {
71
+ handler:null,
72
+ components:[],
73
+ };
74
+ });
75
+
76
+ this.listeners = listenerMap;
77
+ }
78
+
79
+ bindPseudoEvents(){
80
+ Object.keys(this.pseudoTrackers).forEach((key) => {
81
+ this.pseudoTrackers[key].subscriber = this.pseudoMouseEnter.bind(this, key);
82
+ this.subscribe(key + "-mouseover", this.pseudoTrackers[key].subscriber);
83
+ });
84
+
85
+ this.pseudoTracking = true;
86
+ }
87
+
88
+ pseudoMouseEnter(key, e, target){
89
+ if(this.pseudoTrackers[key].target !== target){
90
+
91
+ if(this.pseudoTrackers[key].target){
92
+ this.dispatch(key + "-mouseleave", e, this.pseudoTrackers[key].target);
93
+ }
94
+
95
+ this.pseudoMouseLeave(key, e);
96
+
97
+ this.pseudoTrackers[key].target = target;
98
+
99
+ this.dispatch(key + "-mouseenter", e, target);
100
+ }
101
+ }
102
+
103
+ pseudoMouseLeave(key, e){
104
+ var leaveList = Object.keys(this.pseudoTrackers),
105
+ linkedKeys = {
106
+ "row":["cell"],
107
+ "cell":["row"],
108
+ };
109
+
110
+ leaveList = leaveList.filter((item) => {
111
+ var links = linkedKeys[key];
112
+ return item !== key && (!links || (links && !links.includes(item)));
113
+ });
114
+
115
+
116
+ leaveList.forEach((key) => {
117
+ var target = this.pseudoTrackers[key].target;
118
+
119
+ if(this.pseudoTrackers[key].target){
120
+ this.dispatch(key + "-mouseleave", e, target);
121
+
122
+ this.pseudoTrackers[key].target = null;
123
+ }
124
+ });
125
+ }
126
+
127
+
128
+ bindSubscriptionWatchers(){
129
+ var listeners = Object.keys(this.listeners),
130
+ components = Object.values(this.componentMap);
131
+
132
+ for(let comp of components){
133
+ for(let listener of listeners){
134
+ let key = comp + "-" + listener;
135
+
136
+ this.subscriptionChange(key, this.subscriptionChanged.bind(this, comp, listener));
137
+ }
138
+ }
139
+
140
+ this.subscribe("table-destroy", this.clearWatchers.bind(this));
141
+ }
142
+
143
+ subscriptionChanged(component, key, added){
144
+ var listener = this.listeners[key].components,
145
+ index = listener.indexOf(component),
146
+ changed = false;
147
+
148
+ if(added){
149
+ if(index === -1){
150
+ listener.push(component);
151
+ changed = true;
152
+ }
153
+ }else{
154
+ if(!this.subscribed(component + "-" + key)){
155
+ if(index > -1){
156
+ listener.splice(index, 1);
157
+ changed = true;
158
+ }
159
+ }
160
+ }
161
+
162
+ if((key === "mouseenter" || key === "mouseleave") && !this.pseudoTracking){
163
+ this.bindPseudoEvents();
164
+ }
165
+
166
+ if(changed){
167
+ this.updateEventListeners();
168
+ }
169
+ }
170
+
171
+ updateEventListeners(){
172
+ for(let key in this.listeners){
173
+ let listener = this.listeners[key];
174
+
175
+ if(listener.components.length){
176
+ if(!listener.handler){
177
+ listener.handler = this.track.bind(this, key);
178
+ this.el.addEventListener(key, listener.handler);
179
+ // this.el.addEventListener(key, listener.handler, {passive: true})
180
+ }
181
+ }else{
182
+ if(listener.handler){
183
+ this.el.removeEventListener(key, listener.handler);
184
+ listener.handler = null;
185
+ }
186
+ }
187
+ }
188
+ }
189
+
190
+ track(type, e){
191
+ var path = (e.composedPath && e.composedPath()) || e.path;
192
+
193
+ var targets = this.findTargets(path);
194
+ targets = this.bindComponents(type, targets);
195
+
196
+ this.triggerEvents(type, e, targets);
197
+
198
+ if(this.pseudoTracking && (type == "mouseover" || type == "mouseleave") && !Object.keys(targets).length){
199
+ this.pseudoMouseLeave("none", e);
200
+ }
201
+ }
202
+
203
+ findTargets(path){
204
+ var targets = {};
205
+
206
+ let componentMap = Object.keys(this.componentMap);
207
+
208
+ for (let el of path) {
209
+ let classList = el.classList ? [...el.classList] : [];
210
+
211
+ let abort = classList.filter((item) => {
212
+ return this.abortClasses.includes(item);
213
+ });
214
+
215
+ if(abort.length){
216
+ break;
217
+ }
218
+
219
+ let elTargets = classList.filter((item) => {
220
+ return componentMap.includes(item);
221
+ });
222
+
223
+ for (let target of elTargets) {
224
+ if(!targets[this.componentMap[target]]){
225
+ targets[this.componentMap[target]] = el;
226
+ }
227
+ }
228
+ }
229
+
230
+ if(targets.group && targets.group === targets.row){
231
+ delete targets.row;
232
+ }
233
+
234
+ return targets;
235
+ }
236
+
237
+ bindComponents(type, targets){
238
+ //ensure row component is looked up before cell
239
+ var keys = Object.keys(targets).reverse(),
240
+ listener = this.listeners[type],
241
+ matches = {},
242
+ targetMatches = {};
243
+
244
+ for(let key of keys){
245
+ let component,
246
+ target = targets[key],
247
+ previousTarget = this.previousTargets[key];
248
+
249
+ if(previousTarget && previousTarget.target === target){
250
+ component = previousTarget.component;
251
+ }else{
252
+ switch(key){
253
+ case "row":
254
+ case "group":
255
+ if(listener.components.includes("row") || listener.components.includes("cell") || listener.components.includes("group")){
256
+ let rows = this.table.rowManager.getVisibleRows(true);
257
+
258
+ component = rows.find((row) => {
259
+ return row.getElement() === target;
260
+ });
261
+
262
+ if(targets["row"] && targets["row"].parentNode && targets["row"].parentNode.closest(".tabulator-row")){
263
+ targets[key] = false;
264
+ }
265
+ }
266
+ break;
267
+
268
+ case "column":
269
+ if(listener.components.includes("column")){
270
+ component = this.table.columnManager.findColumn(target);
271
+ }
272
+ break;
273
+
274
+ case "cell":
275
+ if(listener.components.includes("cell")){
276
+ if(matches["row"] instanceof Row){
277
+ component = matches["row"].findCell(target);
278
+ }else{
279
+ if(targets["row"]){
280
+ console.warn("Event Target Lookup Error - The row this cell is attached to cannot be found, has the table been reinitialized without being destroyed first?");
281
+ }
282
+ }
283
+ }
284
+ break;
285
+ }
286
+ }
287
+
288
+ if(component){
289
+ matches[key] = component;
290
+ targetMatches[key] = {
291
+ target:target,
292
+ component:component,
293
+ };
294
+ }
295
+ }
296
+
297
+ this.previousTargets = targetMatches;
298
+
299
+ return matches;
300
+ }
301
+
302
+ triggerEvents(type, e, targets){
303
+ var listener = this.listeners[type];
304
+
305
+ for(let key in targets){
306
+ if(targets[key] && listener.components.includes(key)){
307
+ this.dispatch(key + "-" + type, e, targets[key]);
308
+ }
309
+ }
310
+ }
311
+
312
+ clearWatchers(){
313
+ for(let key in this.listeners){
314
+ let listener = this.listeners[key];
315
+
316
+ if(listener.handler){
317
+ this.el.removeEventListener(key, listener.handler);
318
+ listener.handler = null;
319
+ }
320
+ }
321
+ }
322
322
  }