tabulator-tables 5.4.3 → 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 +0 -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 +0 -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 +0 -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 +0 -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 +0 -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 +0 -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 +0 -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 +0 -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 +102 -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 +0 -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 +0 -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 -25711
  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 -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 +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 -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 +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 -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 +892 -892
  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 -598
  178. package/src/js/modules/GroupRows/GroupComponent.js +66 -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 +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 -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 +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 -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 +345 -345
  219. package/src/js/modules/SelectRow/SelectRow.js +446 -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 +1464 -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 +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,302 +1,302 @@
1
- import Module from '../../core/Module.js';
2
-
3
- class Menu extends Module{
4
-
5
- constructor(table){
6
- super(table);
7
-
8
- this.menuContainer = null;
9
- this.nestedMenuBlock = false;
10
-
11
- this.currentComponent = null;
12
- this.rootPopup = null;
13
-
14
- this.columnSubscribers = {};
15
-
16
- this.registerTableOption("menuContainer", undefined); //deprecated
17
-
18
- this.registerTableOption("rowContextMenu", false);
19
- this.registerTableOption("rowClickMenu", false);
20
- this.registerTableOption("rowDblClickMenu", false);
21
- this.registerTableOption("groupContextMenu", false);
22
- this.registerTableOption("groupClickMenu", false);
23
- this.registerTableOption("groupDblClickMenu", false);
24
-
25
- this.registerColumnOption("headerContextMenu");
26
- this.registerColumnOption("headerClickMenu");
27
- this.registerColumnOption("headerDblClickMenu");
28
- this.registerColumnOption("headerMenu");
29
- this.registerColumnOption("headerMenuIcon");
30
- this.registerColumnOption("contextMenu");
31
- this.registerColumnOption("clickMenu");
32
- this.registerColumnOption("dblClickMenu");
33
-
34
- }
35
-
36
- initialize(){
37
- this.deprecatedOptionsCheck();
38
- this.initializeRowWatchers();
39
- this.initializeGroupWatchers();
40
-
41
- this.subscribe("column-init", this.initializeColumn.bind(this));
42
- }
43
-
44
- deprecatedOptionsCheck(){
45
- if(!this.deprecationCheck("menuContainer", "popupContainer")){
46
- this.table.options.popupContainer = this.table.options.menuContainer;
47
- }
48
- }
49
-
50
- initializeRowWatchers(){
51
- if(this.table.options.rowContextMenu){
52
- this.subscribe("row-contextmenu", this.loadMenuEvent.bind(this, this.table.options.rowContextMenu));
53
- this.table.on("rowTapHold", this.loadMenuEvent.bind(this, this.table.options.rowContextMenu));
54
- }
55
-
56
- if(this.table.options.rowClickMenu){
57
- this.subscribe("row-click", this.loadMenuEvent.bind(this, this.table.options.rowClickMenu));
58
- }
59
-
60
- if(this.table.options.rowDblClickMenu){
61
- this.subscribe("row-dblclick", this.loadMenuEvent.bind(this, this.table.options.rowDblClickMenu));
62
- }
63
- }
64
-
65
- initializeGroupWatchers(){
66
- if(this.table.options.groupContextMenu){
67
- this.subscribe("group-contextmenu", this.loadMenuEvent.bind(this, this.table.options.groupContextMenu));
68
- this.table.on("groupTapHold", this.loadMenuEvent.bind(this, this.table.options.groupContextMenu));
69
- }
70
-
71
- if(this.table.options.groupClickMenu){
72
- this.subscribe("group-click", this.loadMenuEvent.bind(this, this.table.options.groupClickMenu));
73
- }
74
-
75
- if(this.table.options.groupDblClickMenu){
76
- this.subscribe("group-dblclick", this.loadMenuEvent.bind(this, this.table.options.groupDblClickMenu));
77
- }
78
- }
79
-
80
- initializeColumn(column){
81
- var def = column.definition;
82
-
83
- //handle column events
84
- if(def.headerContextMenu && !this.columnSubscribers.headerContextMenu){
85
- this.columnSubscribers.headerContextMenu = this.loadMenuTableColumnEvent.bind(this, "headerContextMenu");
86
- this.subscribe("column-contextmenu", this.columnSubscribers.headerContextMenu);
87
- this.table.on("headerTapHold", this.loadMenuTableColumnEvent.bind(this, "headerContextMenu"));
88
- }
89
-
90
- if(def.headerClickMenu && !this.columnSubscribers.headerClickMenu){
91
- this.columnSubscribers.headerClickMenu = this.loadMenuTableColumnEvent.bind(this, "headerClickMenu");
92
- this.subscribe("column-click", this.columnSubscribers.headerClickMenu);
93
- }
94
-
95
- if(def.headerDblClickMenu && !this.columnSubscribers.headerDblClickMenu){
96
- this.columnSubscribers.headerDblClickMenu = this.loadMenuTableColumnEvent.bind(this, "headerDblClickMenu");
97
- this.subscribe("column-dblclick", this.columnSubscribers.headerDblClickMenu);
98
- }
99
-
100
- if(def.headerMenu){
101
- this.initializeColumnHeaderMenu(column);
102
- }
103
-
104
- //handle cell events
105
- if(def.contextMenu && !this.columnSubscribers.contextMenu){
106
- this.columnSubscribers.contextMenu = this.loadMenuTableCellEvent.bind(this, "contextMenu");
107
- this.subscribe("cell-contextmenu", this.columnSubscribers.contextMenu);
108
- this.table.on("cellTapHold", this.loadMenuTableCellEvent.bind(this, "contextMenu"));
109
- }
110
-
111
- if(def.clickMenu && !this.columnSubscribers.clickMenu){
112
- this.columnSubscribers.clickMenu = this.loadMenuTableCellEvent.bind(this, "clickMenu");
113
- this.subscribe("cell-click", this.columnSubscribers.clickMenu);
114
- }
115
-
116
- if(def.dblClickMenu && !this.columnSubscribers.dblClickMenu){
117
- this.columnSubscribers.dblClickMenu = this.loadMenuTableCellEvent.bind(this, "dblClickMenu");
118
- this.subscribe("cell-dblclick", this.columnSubscribers.dblClickMenu);
119
- }
120
- }
121
-
122
- initializeColumnHeaderMenu(column){
123
- var icon = column.definition.headerMenuIcon,
124
- headerMenuEl;
125
-
126
- headerMenuEl = document.createElement("span");
127
- headerMenuEl.classList.add("tabulator-header-popup-button");
128
-
129
- if(icon){
130
- if(typeof icon === "function"){
131
- icon = icon(column.getComponent());
132
- }
133
-
134
- if(icon instanceof HTMLElement){
135
- headerMenuEl.appendChild(icon);
136
- }else{
137
- headerMenuEl.innerHTML = icon;
138
- }
139
- }else{
140
- headerMenuEl.innerHTML = "⋮";
141
- }
142
-
143
- headerMenuEl.addEventListener("click", (e) => {
144
- e.stopPropagation();
145
- e.preventDefault();
146
-
147
- this.loadMenuEvent(column.definition.headerMenu, e, column);
148
- });
149
-
150
- column.titleElement.insertBefore(headerMenuEl, column.titleElement.firstChild);
151
- }
152
-
153
- loadMenuTableCellEvent(option, e, cell){
154
- if(cell._cell){
155
- cell = cell._cell;
156
- }
157
-
158
- if(cell.column.definition[option]){
159
- this.loadMenuEvent(cell.column.definition[option], e, cell);
160
- }
161
- }
162
-
163
- loadMenuTableColumnEvent(option, e, column){
164
- if(column._column){
165
- column = column._column;
166
- }
167
-
168
- if(column.definition[option]){
169
- this.loadMenuEvent(column.definition[option], e, column);
170
- }
171
- }
172
-
173
- loadMenuEvent(menu, e, component){
174
- if(component._group){
175
- component = component._group;
176
- }else if(component._row){
177
- component = component._row;
178
- }
179
-
180
- menu = typeof menu == "function" ? menu.call(this.table, e, component.getComponent()) : menu;
181
-
182
- this.loadMenu(e, component, menu);
183
- }
184
-
185
- loadMenu(e, component, menu, parentEl, parentPopup){
186
- var touch = !(e instanceof MouseEvent),
187
- menuEl = document.createElement("div"),
188
- popup;
189
-
190
- menuEl.classList.add("tabulator-menu");
191
-
192
- if(!touch){
193
- e.preventDefault();
194
- }
195
-
196
- //abort if no menu set
197
- if(!menu || !menu.length){
198
- return;
199
- }
200
-
201
- if(!parentEl){
202
- if(this.nestedMenuBlock){
203
- //abort if child menu already open
204
- if(this.rootPopup){
205
- return;
206
- }
207
- }else{
208
- this.nestedMenuBlock = setTimeout(() => {
209
- this.nestedMenuBlock = false;
210
- }, 100);
211
- }
212
-
213
- if(this.rootPopup){
214
- this.rootPopup.hide();
215
- }
216
-
217
- this.rootPopup = popup = this.popup(menuEl);
218
-
219
- }else{
220
- popup = parentPopup.child(menuEl);
221
- }
222
-
223
- menu.forEach((item) => {
224
- var itemEl = document.createElement("div"),
225
- label = item.label,
226
- disabled = item.disabled;
227
-
228
- if(item.separator){
229
- itemEl.classList.add("tabulator-menu-separator");
230
- }else{
231
- itemEl.classList.add("tabulator-menu-item");
232
-
233
- if(typeof label == "function"){
234
- label = label.call(this.table, component.getComponent());
235
- }
236
-
237
- if(label instanceof Node){
238
- itemEl.appendChild(label);
239
- }else{
240
- itemEl.innerHTML = label;
241
- }
242
-
243
- if(typeof disabled == "function"){
244
- disabled = disabled.call(this.table, component.getComponent());
245
- }
246
-
247
- if(disabled){
248
- itemEl.classList.add("tabulator-menu-item-disabled");
249
- itemEl.addEventListener("click", (e) => {
250
- e.stopPropagation();
251
- });
252
- }else{
253
- if(item.menu && item.menu.length){
254
- itemEl.addEventListener("click", (e) => {
255
- e.stopPropagation();
256
- this.loadMenu(e, component, item.menu, itemEl, popup);
257
- });
258
- }else{
259
- if(item.action){
260
- itemEl.addEventListener("click", (e) => {
261
- item.action(e, component.getComponent());
262
- });
263
- }
264
- }
265
- }
266
-
267
- if(item.menu && item.menu.length){
268
- itemEl.classList.add("tabulator-menu-item-submenu");
269
- }
270
- }
271
-
272
- menuEl.appendChild(itemEl);
273
- });
274
-
275
- menuEl.addEventListener("click", (e) => {
276
- if(this.rootPopup){
277
- this.rootPopup.hide();
278
- }
279
- });
280
-
281
- popup.show(parentEl || e);
282
-
283
- if(popup === this.rootPopup){
284
- this.rootPopup.hideOnBlur(() => {
285
- this.rootPopup = null;
286
-
287
- if(this.currentComponent){
288
- this.dispatchExternal("menuClosed", this.currentComponent.getComponent());
289
- this.currentComponent = null;
290
- }
291
- });
292
-
293
- this.currentComponent = component;
294
-
295
- this.dispatchExternal("menuOpened", component.getComponent());
296
- }
297
- }
298
- }
299
-
300
- Menu.moduleName = "menu";
301
-
302
- export default Menu;
1
+ import Module from '../../core/Module.js';
2
+
3
+ class Menu extends Module{
4
+
5
+ constructor(table){
6
+ super(table);
7
+
8
+ this.menuContainer = null;
9
+ this.nestedMenuBlock = false;
10
+
11
+ this.currentComponent = null;
12
+ this.rootPopup = null;
13
+
14
+ this.columnSubscribers = {};
15
+
16
+ this.registerTableOption("menuContainer", undefined); //deprecated
17
+
18
+ this.registerTableOption("rowContextMenu", false);
19
+ this.registerTableOption("rowClickMenu", false);
20
+ this.registerTableOption("rowDblClickMenu", false);
21
+ this.registerTableOption("groupContextMenu", false);
22
+ this.registerTableOption("groupClickMenu", false);
23
+ this.registerTableOption("groupDblClickMenu", false);
24
+
25
+ this.registerColumnOption("headerContextMenu");
26
+ this.registerColumnOption("headerClickMenu");
27
+ this.registerColumnOption("headerDblClickMenu");
28
+ this.registerColumnOption("headerMenu");
29
+ this.registerColumnOption("headerMenuIcon");
30
+ this.registerColumnOption("contextMenu");
31
+ this.registerColumnOption("clickMenu");
32
+ this.registerColumnOption("dblClickMenu");
33
+
34
+ }
35
+
36
+ initialize(){
37
+ this.deprecatedOptionsCheck();
38
+ this.initializeRowWatchers();
39
+ this.initializeGroupWatchers();
40
+
41
+ this.subscribe("column-init", this.initializeColumn.bind(this));
42
+ }
43
+
44
+ deprecatedOptionsCheck(){
45
+ if(!this.deprecationCheck("menuContainer", "popupContainer")){
46
+ this.table.options.popupContainer = this.table.options.menuContainer;
47
+ }
48
+ }
49
+
50
+ initializeRowWatchers(){
51
+ if(this.table.options.rowContextMenu){
52
+ this.subscribe("row-contextmenu", this.loadMenuEvent.bind(this, this.table.options.rowContextMenu));
53
+ this.table.on("rowTapHold", this.loadMenuEvent.bind(this, this.table.options.rowContextMenu));
54
+ }
55
+
56
+ if(this.table.options.rowClickMenu){
57
+ this.subscribe("row-click", this.loadMenuEvent.bind(this, this.table.options.rowClickMenu));
58
+ }
59
+
60
+ if(this.table.options.rowDblClickMenu){
61
+ this.subscribe("row-dblclick", this.loadMenuEvent.bind(this, this.table.options.rowDblClickMenu));
62
+ }
63
+ }
64
+
65
+ initializeGroupWatchers(){
66
+ if(this.table.options.groupContextMenu){
67
+ this.subscribe("group-contextmenu", this.loadMenuEvent.bind(this, this.table.options.groupContextMenu));
68
+ this.table.on("groupTapHold", this.loadMenuEvent.bind(this, this.table.options.groupContextMenu));
69
+ }
70
+
71
+ if(this.table.options.groupClickMenu){
72
+ this.subscribe("group-click", this.loadMenuEvent.bind(this, this.table.options.groupClickMenu));
73
+ }
74
+
75
+ if(this.table.options.groupDblClickMenu){
76
+ this.subscribe("group-dblclick", this.loadMenuEvent.bind(this, this.table.options.groupDblClickMenu));
77
+ }
78
+ }
79
+
80
+ initializeColumn(column){
81
+ var def = column.definition;
82
+
83
+ //handle column events
84
+ if(def.headerContextMenu && !this.columnSubscribers.headerContextMenu){
85
+ this.columnSubscribers.headerContextMenu = this.loadMenuTableColumnEvent.bind(this, "headerContextMenu");
86
+ this.subscribe("column-contextmenu", this.columnSubscribers.headerContextMenu);
87
+ this.table.on("headerTapHold", this.loadMenuTableColumnEvent.bind(this, "headerContextMenu"));
88
+ }
89
+
90
+ if(def.headerClickMenu && !this.columnSubscribers.headerClickMenu){
91
+ this.columnSubscribers.headerClickMenu = this.loadMenuTableColumnEvent.bind(this, "headerClickMenu");
92
+ this.subscribe("column-click", this.columnSubscribers.headerClickMenu);
93
+ }
94
+
95
+ if(def.headerDblClickMenu && !this.columnSubscribers.headerDblClickMenu){
96
+ this.columnSubscribers.headerDblClickMenu = this.loadMenuTableColumnEvent.bind(this, "headerDblClickMenu");
97
+ this.subscribe("column-dblclick", this.columnSubscribers.headerDblClickMenu);
98
+ }
99
+
100
+ if(def.headerMenu){
101
+ this.initializeColumnHeaderMenu(column);
102
+ }
103
+
104
+ //handle cell events
105
+ if(def.contextMenu && !this.columnSubscribers.contextMenu){
106
+ this.columnSubscribers.contextMenu = this.loadMenuTableCellEvent.bind(this, "contextMenu");
107
+ this.subscribe("cell-contextmenu", this.columnSubscribers.contextMenu);
108
+ this.table.on("cellTapHold", this.loadMenuTableCellEvent.bind(this, "contextMenu"));
109
+ }
110
+
111
+ if(def.clickMenu && !this.columnSubscribers.clickMenu){
112
+ this.columnSubscribers.clickMenu = this.loadMenuTableCellEvent.bind(this, "clickMenu");
113
+ this.subscribe("cell-click", this.columnSubscribers.clickMenu);
114
+ }
115
+
116
+ if(def.dblClickMenu && !this.columnSubscribers.dblClickMenu){
117
+ this.columnSubscribers.dblClickMenu = this.loadMenuTableCellEvent.bind(this, "dblClickMenu");
118
+ this.subscribe("cell-dblclick", this.columnSubscribers.dblClickMenu);
119
+ }
120
+ }
121
+
122
+ initializeColumnHeaderMenu(column){
123
+ var icon = column.definition.headerMenuIcon,
124
+ headerMenuEl;
125
+
126
+ headerMenuEl = document.createElement("span");
127
+ headerMenuEl.classList.add("tabulator-header-popup-button");
128
+
129
+ if(icon){
130
+ if(typeof icon === "function"){
131
+ icon = icon(column.getComponent());
132
+ }
133
+
134
+ if(icon instanceof HTMLElement){
135
+ headerMenuEl.appendChild(icon);
136
+ }else{
137
+ headerMenuEl.innerHTML = icon;
138
+ }
139
+ }else{
140
+ headerMenuEl.innerHTML = "⋮";
141
+ }
142
+
143
+ headerMenuEl.addEventListener("click", (e) => {
144
+ e.stopPropagation();
145
+ e.preventDefault();
146
+
147
+ this.loadMenuEvent(column.definition.headerMenu, e, column);
148
+ });
149
+
150
+ column.titleElement.insertBefore(headerMenuEl, column.titleElement.firstChild);
151
+ }
152
+
153
+ loadMenuTableCellEvent(option, e, cell){
154
+ if(cell._cell){
155
+ cell = cell._cell;
156
+ }
157
+
158
+ if(cell.column.definition[option]){
159
+ this.loadMenuEvent(cell.column.definition[option], e, cell);
160
+ }
161
+ }
162
+
163
+ loadMenuTableColumnEvent(option, e, column){
164
+ if(column._column){
165
+ column = column._column;
166
+ }
167
+
168
+ if(column.definition[option]){
169
+ this.loadMenuEvent(column.definition[option], e, column);
170
+ }
171
+ }
172
+
173
+ loadMenuEvent(menu, e, component){
174
+ if(component._group){
175
+ component = component._group;
176
+ }else if(component._row){
177
+ component = component._row;
178
+ }
179
+
180
+ menu = typeof menu == "function" ? menu.call(this.table, e, component.getComponent()) : menu;
181
+
182
+ this.loadMenu(e, component, menu);
183
+ }
184
+
185
+ loadMenu(e, component, menu, parentEl, parentPopup){
186
+ var touch = !(e instanceof MouseEvent),
187
+ menuEl = document.createElement("div"),
188
+ popup;
189
+
190
+ menuEl.classList.add("tabulator-menu");
191
+
192
+ if(!touch){
193
+ e.preventDefault();
194
+ }
195
+
196
+ //abort if no menu set
197
+ if(!menu || !menu.length){
198
+ return;
199
+ }
200
+
201
+ if(!parentEl){
202
+ if(this.nestedMenuBlock){
203
+ //abort if child menu already open
204
+ if(this.rootPopup){
205
+ return;
206
+ }
207
+ }else{
208
+ this.nestedMenuBlock = setTimeout(() => {
209
+ this.nestedMenuBlock = false;
210
+ }, 100);
211
+ }
212
+
213
+ if(this.rootPopup){
214
+ this.rootPopup.hide();
215
+ }
216
+
217
+ this.rootPopup = popup = this.popup(menuEl);
218
+
219
+ }else{
220
+ popup = parentPopup.child(menuEl);
221
+ }
222
+
223
+ menu.forEach((item) => {
224
+ var itemEl = document.createElement("div"),
225
+ label = item.label,
226
+ disabled = item.disabled;
227
+
228
+ if(item.separator){
229
+ itemEl.classList.add("tabulator-menu-separator");
230
+ }else{
231
+ itemEl.classList.add("tabulator-menu-item");
232
+
233
+ if(typeof label == "function"){
234
+ label = label.call(this.table, component.getComponent());
235
+ }
236
+
237
+ if(label instanceof Node){
238
+ itemEl.appendChild(label);
239
+ }else{
240
+ itemEl.innerHTML = label;
241
+ }
242
+
243
+ if(typeof disabled == "function"){
244
+ disabled = disabled.call(this.table, component.getComponent());
245
+ }
246
+
247
+ if(disabled){
248
+ itemEl.classList.add("tabulator-menu-item-disabled");
249
+ itemEl.addEventListener("click", (e) => {
250
+ e.stopPropagation();
251
+ });
252
+ }else{
253
+ if(item.menu && item.menu.length){
254
+ itemEl.addEventListener("click", (e) => {
255
+ e.stopPropagation();
256
+ this.loadMenu(e, component, item.menu, itemEl, popup);
257
+ });
258
+ }else{
259
+ if(item.action){
260
+ itemEl.addEventListener("click", (e) => {
261
+ item.action(e, component.getComponent());
262
+ });
263
+ }
264
+ }
265
+ }
266
+
267
+ if(item.menu && item.menu.length){
268
+ itemEl.classList.add("tabulator-menu-item-submenu");
269
+ }
270
+ }
271
+
272
+ menuEl.appendChild(itemEl);
273
+ });
274
+
275
+ menuEl.addEventListener("click", (e) => {
276
+ if(this.rootPopup){
277
+ this.rootPopup.hide();
278
+ }
279
+ });
280
+
281
+ popup.show(parentEl || e);
282
+
283
+ if(popup === this.rootPopup){
284
+ this.rootPopup.hideOnBlur(() => {
285
+ this.rootPopup = null;
286
+
287
+ if(this.currentComponent){
288
+ this.dispatchExternal("menuClosed", this.currentComponent.getComponent());
289
+ this.currentComponent = null;
290
+ }
291
+ });
292
+
293
+ this.currentComponent = component;
294
+
295
+ this.dispatchExternal("menuOpened", component.getComponent());
296
+ }
297
+ }
298
+ }
299
+
300
+ Menu.moduleName = "menu";
301
+
302
+ export default Menu;