tabulator-tables 6.5.0 → 6.5.1

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 (222) hide show
  1. package/dist/js/tabulator.js +1 -1
  2. package/dist/js/tabulator.min.js +1 -1
  3. package/dist/js/tabulator_esm.js +1 -1
  4. package/dist/js/tabulator_esm.min.js +1 -1
  5. package/dist/js/tabulator_esm.min.mjs +1 -1
  6. package/dist/js/tabulator_esm.mjs +1 -1
  7. package/package.json +2 -1
  8. package/src/js/builds/esm.js +16 -0
  9. package/src/js/builds/jquery_wrapper.js +63 -0
  10. package/src/js/builds/usd.js +1 -0
  11. package/src/js/core/ColumnManager.js +789 -0
  12. package/src/js/core/CoreFeature.js +140 -0
  13. package/src/js/core/FooterManager.js +102 -0
  14. package/src/js/core/Module.js +140 -0
  15. package/src/js/core/RowManager.js +1140 -0
  16. package/src/js/core/Tabulator.js +928 -0
  17. package/src/js/core/TabulatorFull.js +21 -0
  18. package/src/js/core/cell/Cell.js +299 -0
  19. package/src/js/core/cell/CellComponent.js +79 -0
  20. package/src/js/core/column/Column.js +978 -0
  21. package/src/js/core/column/ColumnComponent.js +151 -0
  22. package/src/js/core/column/defaults/options.js +18 -0
  23. package/src/js/core/defaults/options.js +66 -0
  24. package/src/js/core/modules/core.js +3 -0
  25. package/src/js/core/modules/optional.js +37 -0
  26. package/src/js/core/rendering/Renderer.js +204 -0
  27. package/src/js/core/rendering/renderers/BasicHorizontal.js +27 -0
  28. package/src/js/core/rendering/renderers/BasicVertical.js +103 -0
  29. package/src/js/core/rendering/renderers/VirtualDomHorizontal.js +587 -0
  30. package/src/js/core/rendering/renderers/VirtualDomVertical.js +642 -0
  31. package/src/js/core/row/PseudoRow.js +47 -0
  32. package/src/js/core/row/Row.js +487 -0
  33. package/src/js/core/row/RowComponent.js +94 -0
  34. package/src/js/core/tools/Alert.js +66 -0
  35. package/src/js/core/tools/ComponentFunctionBinder.js +32 -0
  36. package/src/js/core/tools/DataLoader.js +128 -0
  37. package/src/js/core/tools/DependencyRegistry.js +82 -0
  38. package/src/js/core/tools/DeprecationAdvisor.js +51 -0
  39. package/src/js/core/tools/ExternalEventBus.js +105 -0
  40. package/src/js/core/tools/Helpers.js +66 -0
  41. package/src/js/core/tools/InteractionMonitor.js +329 -0
  42. package/src/js/core/tools/InternalEventBus.js +162 -0
  43. package/src/js/core/tools/ModuleBinder.js +153 -0
  44. package/src/js/core/tools/OptionsList.js +45 -0
  45. package/src/js/core/tools/Popup.js +317 -0
  46. package/src/js/core/tools/TableRegistry.js +65 -0
  47. package/src/js/modules/Accessor/Accessor.js +115 -0
  48. package/src/js/modules/Accessor/defaults/accessors.js +5 -0
  49. package/src/js/modules/Ajax/Ajax.js +142 -0
  50. package/src/js/modules/Ajax/defaults/config.js +3 -0
  51. package/src/js/modules/Ajax/defaults/contentTypeFormatters.js +45 -0
  52. package/src/js/modules/Ajax/defaults/loaderPromise.js +87 -0
  53. package/src/js/modules/Ajax/defaults/urlGenerator.js +44 -0
  54. package/src/js/modules/Clipboard/Clipboard.js +282 -0
  55. package/src/js/modules/Clipboard/defaults/pasteActions.js +11 -0
  56. package/src/js/modules/Clipboard/defaults/pasteParsers.js +75 -0
  57. package/src/js/modules/Clipboard/extensions/extensions.js +9 -0
  58. package/src/js/modules/Clipboard/extensions/keybindings/actions.js +9 -0
  59. package/src/js/modules/Clipboard/extensions/keybindings/bindings.js +3 -0
  60. package/src/js/modules/ColumnCalcs/CalcComponent.js +46 -0
  61. package/src/js/modules/ColumnCalcs/ColumnCalcs.js +586 -0
  62. package/src/js/modules/ColumnCalcs/defaults/calculations.js +93 -0
  63. package/src/js/modules/Comms/Comms.js +49 -0
  64. package/src/js/modules/DataTree/DataTree.js +620 -0
  65. package/src/js/modules/Download/Download.js +146 -0
  66. package/src/js/modules/Download/defaults/downloaders/csv.js +61 -0
  67. package/src/js/modules/Download/defaults/downloaders/html.js +5 -0
  68. package/src/js/modules/Download/defaults/downloaders/json.js +34 -0
  69. package/src/js/modules/Download/defaults/downloaders/jsonLines.js +32 -0
  70. package/src/js/modules/Download/defaults/downloaders/pdf.js +113 -0
  71. package/src/js/modules/Download/defaults/downloaders/xlsx.js +103 -0
  72. package/src/js/modules/Download/defaults/downloaders.js +15 -0
  73. package/src/js/modules/Edit/Edit.js +845 -0
  74. package/src/js/modules/Edit/List.js +1060 -0
  75. package/src/js/modules/Edit/defaults/editors/adaptable.js +37 -0
  76. package/src/js/modules/Edit/defaults/editors/date.js +144 -0
  77. package/src/js/modules/Edit/defaults/editors/datetime.js +131 -0
  78. package/src/js/modules/Edit/defaults/editors/input.js +77 -0
  79. package/src/js/modules/Edit/defaults/editors/list.js +7 -0
  80. package/src/js/modules/Edit/defaults/editors/number.js +110 -0
  81. package/src/js/modules/Edit/defaults/editors/progress.js +127 -0
  82. package/src/js/modules/Edit/defaults/editors/range.js +81 -0
  83. package/src/js/modules/Edit/defaults/editors/star.js +146 -0
  84. package/src/js/modules/Edit/defaults/editors/textarea.js +123 -0
  85. package/src/js/modules/Edit/defaults/editors/tickCross.js +95 -0
  86. package/src/js/modules/Edit/defaults/editors/time.js +132 -0
  87. package/src/js/modules/Edit/defaults/editors.js +27 -0
  88. package/src/js/modules/Edit/inputMask.js +74 -0
  89. package/src/js/modules/Export/Export.js +654 -0
  90. package/src/js/modules/Export/ExportColumn.js +9 -0
  91. package/src/js/modules/Export/ExportRow.js +8 -0
  92. package/src/js/modules/Export/defaults/columnLookups.js +3 -0
  93. package/src/js/modules/Export/defaults/rowLookups.js +18 -0
  94. package/src/js/modules/Filter/Filter.js +902 -0
  95. package/src/js/modules/Filter/defaults/filters.js +215 -0
  96. package/src/js/modules/Format/Format.js +200 -0
  97. package/src/js/modules/Format/defaults/formatters/adaptable.js +32 -0
  98. package/src/js/modules/Format/defaults/formatters/array.js +30 -0
  99. package/src/js/modules/Format/defaults/formatters/buttonCross.js +3 -0
  100. package/src/js/modules/Format/defaults/formatters/buttonTick.js +3 -0
  101. package/src/js/modules/Format/defaults/formatters/color.js +4 -0
  102. package/src/js/modules/Format/defaults/formatters/datetime.js +39 -0
  103. package/src/js/modules/Format/defaults/formatters/datetimediff.js +43 -0
  104. package/src/js/modules/Format/defaults/formatters/handle.js +4 -0
  105. package/src/js/modules/Format/defaults/formatters/html.js +3 -0
  106. package/src/js/modules/Format/defaults/formatters/image.js +40 -0
  107. package/src/js/modules/Format/defaults/formatters/json.js +12 -0
  108. package/src/js/modules/Format/defaults/formatters/link.js +82 -0
  109. package/src/js/modules/Format/defaults/formatters/lookup.js +10 -0
  110. package/src/js/modules/Format/defaults/formatters/money.js +44 -0
  111. package/src/js/modules/Format/defaults/formatters/plaintext.js +3 -0
  112. package/src/js/modules/Format/defaults/formatters/progress.js +133 -0
  113. package/src/js/modules/Format/defaults/formatters/rownum.js +14 -0
  114. package/src/js/modules/Format/defaults/formatters/star.js +38 -0
  115. package/src/js/modules/Format/defaults/formatters/textarea.js +4 -0
  116. package/src/js/modules/Format/defaults/formatters/tickCross.js +22 -0
  117. package/src/js/modules/Format/defaults/formatters/toggle.js +48 -0
  118. package/src/js/modules/Format/defaults/formatters/traffic.js +47 -0
  119. package/src/js/modules/Format/defaults/formatters.js +47 -0
  120. package/src/js/modules/FrozenColumns/FrozenColumns.js +302 -0
  121. package/src/js/modules/FrozenRows/FrozenRows.js +175 -0
  122. package/src/js/modules/GroupRows/Group.js +615 -0
  123. package/src/js/modules/GroupRows/GroupComponent.js +69 -0
  124. package/src/js/modules/GroupRows/GroupRows.js +636 -0
  125. package/src/js/modules/History/History.js +172 -0
  126. package/src/js/modules/History/defaults/redoers.js +31 -0
  127. package/src/js/modules/History/defaults/undoers.js +33 -0
  128. package/src/js/modules/History/extensions/extensions.js +9 -0
  129. package/src/js/modules/History/extensions/keybindings/actions.js +27 -0
  130. package/src/js/modules/History/extensions/keybindings/bindings.js +4 -0
  131. package/src/js/modules/HtmlTableImport/HtmlTableImport.js +180 -0
  132. package/src/js/modules/Import/Import.js +303 -0
  133. package/src/js/modules/Import/defaults/importers/array.js +3 -0
  134. package/src/js/modules/Import/defaults/importers/csv.js +61 -0
  135. package/src/js/modules/Import/defaults/importers/json.js +8 -0
  136. package/src/js/modules/Import/defaults/importers/xlsx.js +7 -0
  137. package/src/js/modules/Import/defaults/importers.js +11 -0
  138. package/src/js/modules/Interaction/Interaction.js +339 -0
  139. package/src/js/modules/Keybindings/Keybindings.js +198 -0
  140. package/src/js/modules/Keybindings/defaults/actions.js +90 -0
  141. package/src/js/modules/Keybindings/defaults/bindings.js +12 -0
  142. package/src/js/modules/Layout/Layout.js +66 -0
  143. package/src/js/modules/Layout/defaults/modes/fitColumns.js +171 -0
  144. package/src/js/modules/Layout/defaults/modes/fitData.js +10 -0
  145. package/src/js/modules/Layout/defaults/modes/fitDataGeneral.js +10 -0
  146. package/src/js/modules/Layout/defaults/modes/fitDataStretch.js +40 -0
  147. package/src/js/modules/Layout/defaults/modes.js +12 -0
  148. package/src/js/modules/Localize/Localize.js +184 -0
  149. package/src/js/modules/Localize/defaults/langs.js +37 -0
  150. package/src/js/modules/Menu/Menu.js +302 -0
  151. package/src/js/modules/MoveColumns/MoveColumns.js +311 -0
  152. package/src/js/modules/MoveRows/MoveRows.js +604 -0
  153. package/src/js/modules/MoveRows/defaults/receivers.js +30 -0
  154. package/src/js/modules/MoveRows/defaults/senders.js +5 -0
  155. package/src/js/modules/Mutator/Mutator.js +164 -0
  156. package/src/js/modules/Mutator/defaults/mutators.js +1 -0
  157. package/src/js/modules/Page/Page.js +891 -0
  158. package/src/js/modules/Page/defaults/pageCounters/pages.js +33 -0
  159. package/src/js/modules/Page/defaults/pageCounters/rows.js +40 -0
  160. package/src/js/modules/Page/defaults/pageCounters.js +8 -0
  161. package/src/js/modules/Persistence/Persistence.js +473 -0
  162. package/src/js/modules/Persistence/defaults/readers.js +29 -0
  163. package/src/js/modules/Persistence/defaults/writers.js +13 -0
  164. package/src/js/modules/Popup/Popup.js +227 -0
  165. package/src/js/modules/Print/Print.js +136 -0
  166. package/src/js/modules/ReactiveData/ReactiveData.js +416 -0
  167. package/src/js/modules/ResizeColumns/ResizeColumns.js +365 -0
  168. package/src/js/modules/ResizeRows/ResizeRows.js +145 -0
  169. package/src/js/modules/ResizeTable/ResizeTable.js +158 -0
  170. package/src/js/modules/ResponsiveLayout/ResponsiveLayout.js +354 -0
  171. package/src/js/modules/ResponsiveLayout/extensions/extensions.js +9 -0
  172. package/src/js/modules/ResponsiveLayout/extensions/formatters/responsiveCollapse.js +44 -0
  173. package/src/js/modules/SelectRange/Range.js +366 -0
  174. package/src/js/modules/SelectRange/RangeComponent.js +91 -0
  175. package/src/js/modules/SelectRange/SelectRange.js +993 -0
  176. package/src/js/modules/SelectRange/extensions/clipboard/pasteActions.js +45 -0
  177. package/src/js/modules/SelectRange/extensions/clipboard/pasteParsers.js +57 -0
  178. package/src/js/modules/SelectRange/extensions/export/columnLookups.js +11 -0
  179. package/src/js/modules/SelectRange/extensions/export/rowLookups.js +5 -0
  180. package/src/js/modules/SelectRange/extensions/extensions.js +21 -0
  181. package/src/js/modules/SelectRange/extensions/keybindings/actions.js +38 -0
  182. package/src/js/modules/SelectRange/extensions/keybindings/bindings.js +14 -0
  183. package/src/js/modules/SelectRow/SelectRow.js +499 -0
  184. package/src/js/modules/SelectRow/extensions/extensions.js +9 -0
  185. package/src/js/modules/SelectRow/extensions/formatters/rowSelection.js +60 -0
  186. package/src/js/modules/Sort/Sort.js +480 -0
  187. package/src/js/modules/Sort/defaults/sorters/alphanum.js +44 -0
  188. package/src/js/modules/Sort/defaults/sorters/array.js +82 -0
  189. package/src/js/modules/Sort/defaults/sorters/boolean.js +7 -0
  190. package/src/js/modules/Sort/defaults/sorters/date.js +10 -0
  191. package/src/js/modules/Sort/defaults/sorters/datetime.js +48 -0
  192. package/src/js/modules/Sort/defaults/sorters/exists.js +7 -0
  193. package/src/js/modules/Sort/defaults/sorters/number.js +40 -0
  194. package/src/js/modules/Sort/defaults/sorters/string.js +34 -0
  195. package/src/js/modules/Sort/defaults/sorters/time.js +10 -0
  196. package/src/js/modules/Sort/defaults/sorters.js +21 -0
  197. package/src/js/modules/Spreadsheet/GridCalculator.js +64 -0
  198. package/src/js/modules/Spreadsheet/Sheet.js +243 -0
  199. package/src/js/modules/Spreadsheet/SheetComponent.js +59 -0
  200. package/src/js/modules/Spreadsheet/Spreadsheet.js +309 -0
  201. package/src/js/modules/Tooltip/Tooltip.js +128 -0
  202. package/src/js/modules/Validate/Validate.js +303 -0
  203. package/src/js/modules/Validate/defaults/validators.js +150 -0
  204. package/src/scss/tabulator.scss +1693 -0
  205. package/src/scss/themes/bootstrap/tabulator_bootstrap3.scss +302 -0
  206. package/src/scss/themes/bootstrap/tabulator_bootstrap4.scss +589 -0
  207. package/src/scss/themes/bootstrap/tabulator_bootstrap5.scss +979 -0
  208. package/src/scss/themes/bootstrap/variables3.scss +872 -0
  209. package/src/scss/themes/bootstrap/variables4.scss +1059 -0
  210. package/src/scss/themes/bootstrap/variables5.scss +1967 -0
  211. package/src/scss/themes/bulma/tabulator_bulma.scss +316 -0
  212. package/src/scss/themes/bulma/variables.scss +198 -0
  213. package/src/scss/themes/materialize/tabulator_materialize.scss +318 -0
  214. package/src/scss/themes/materialize/variables.scss +71 -0
  215. package/src/scss/themes/semanticui/tabulator_semanticui.scss +623 -0
  216. package/src/scss/themes/semanticui/variables.scss +843 -0
  217. package/src/scss/themes/semanticui/variables_table.scss +248 -0
  218. package/src/scss/themes/tabulator_midnight.scss +235 -0
  219. package/src/scss/themes/tabulator_modern.scss +308 -0
  220. package/src/scss/themes/tabulator_simple.scss +143 -0
  221. package/src/scss/themes/tabulator_site.scss +267 -0
  222. package/src/scss/themes/tabulator_site_dark.scss +496 -0
@@ -0,0 +1,302 @@
1
+ import Module from '../../core/Module.js';
2
+
3
+ export default class Menu extends Module{
4
+
5
+ static moduleName = "menu";
6
+
7
+ constructor(table){
8
+ super(table);
9
+
10
+ this.menuContainer = null;
11
+ this.nestedMenuBlock = false;
12
+
13
+ this.currentComponent = null;
14
+ this.rootPopup = null;
15
+
16
+ this.columnSubscribers = {};
17
+
18
+ // this.registerTableOption("menuContainer", undefined); //deprecated
19
+
20
+ this.registerTableOption("rowContextMenu", false);
21
+ this.registerTableOption("rowClickMenu", false);
22
+ this.registerTableOption("rowDblClickMenu", false);
23
+ this.registerTableOption("groupContextMenu", false);
24
+ this.registerTableOption("groupClickMenu", false);
25
+ this.registerTableOption("groupDblClickMenu", false);
26
+
27
+ this.registerColumnOption("headerContextMenu");
28
+ this.registerColumnOption("headerClickMenu");
29
+ this.registerColumnOption("headerDblClickMenu");
30
+ this.registerColumnOption("headerMenu");
31
+ this.registerColumnOption("headerMenuIcon");
32
+ this.registerColumnOption("contextMenu");
33
+ this.registerColumnOption("clickMenu");
34
+ this.registerColumnOption("dblClickMenu");
35
+
36
+ }
37
+
38
+ initialize(){
39
+ this.deprecatedOptionsCheck();
40
+ this.initializeRowWatchers();
41
+ this.initializeGroupWatchers();
42
+
43
+ this.subscribe("column-init", this.initializeColumn.bind(this));
44
+ }
45
+
46
+ deprecatedOptionsCheck(){
47
+ // if(!this.deprecationCheck("menuContainer", "popupContainer")){
48
+ // this.table.options.popupContainer = this.table.options.menuContainer;
49
+ // }
50
+ }
51
+
52
+ initializeRowWatchers(){
53
+ if(this.table.options.rowContextMenu){
54
+ this.subscribe("row-contextmenu", this.loadMenuEvent.bind(this, this.table.options.rowContextMenu));
55
+ this.table.on("rowTapHold", this.loadMenuEvent.bind(this, this.table.options.rowContextMenu));
56
+ }
57
+
58
+ if(this.table.options.rowClickMenu){
59
+ this.subscribe("row-click", this.loadMenuEvent.bind(this, this.table.options.rowClickMenu));
60
+ }
61
+
62
+ if(this.table.options.rowDblClickMenu){
63
+ this.subscribe("row-dblclick", this.loadMenuEvent.bind(this, this.table.options.rowDblClickMenu));
64
+ }
65
+ }
66
+
67
+ initializeGroupWatchers(){
68
+ if(this.table.options.groupContextMenu){
69
+ this.subscribe("group-contextmenu", this.loadMenuEvent.bind(this, this.table.options.groupContextMenu));
70
+ this.table.on("groupTapHold", this.loadMenuEvent.bind(this, this.table.options.groupContextMenu));
71
+ }
72
+
73
+ if(this.table.options.groupClickMenu){
74
+ this.subscribe("group-click", this.loadMenuEvent.bind(this, this.table.options.groupClickMenu));
75
+ }
76
+
77
+ if(this.table.options.groupDblClickMenu){
78
+ this.subscribe("group-dblclick", this.loadMenuEvent.bind(this, this.table.options.groupDblClickMenu));
79
+ }
80
+ }
81
+
82
+ initializeColumn(column){
83
+ var def = column.definition;
84
+
85
+ //handle column events
86
+ if(def.headerContextMenu && !this.columnSubscribers.headerContextMenu){
87
+ this.columnSubscribers.headerContextMenu = this.loadMenuTableColumnEvent.bind(this, "headerContextMenu");
88
+ this.subscribe("column-contextmenu", this.columnSubscribers.headerContextMenu);
89
+ this.table.on("headerTapHold", this.loadMenuTableColumnEvent.bind(this, "headerContextMenu"));
90
+ }
91
+
92
+ if(def.headerClickMenu && !this.columnSubscribers.headerClickMenu){
93
+ this.columnSubscribers.headerClickMenu = this.loadMenuTableColumnEvent.bind(this, "headerClickMenu");
94
+ this.subscribe("column-click", this.columnSubscribers.headerClickMenu);
95
+ }
96
+
97
+ if(def.headerDblClickMenu && !this.columnSubscribers.headerDblClickMenu){
98
+ this.columnSubscribers.headerDblClickMenu = this.loadMenuTableColumnEvent.bind(this, "headerDblClickMenu");
99
+ this.subscribe("column-dblclick", this.columnSubscribers.headerDblClickMenu);
100
+ }
101
+
102
+ if(def.headerMenu){
103
+ this.initializeColumnHeaderMenu(column);
104
+ }
105
+
106
+ //handle cell events
107
+ if(def.contextMenu && !this.columnSubscribers.contextMenu){
108
+ this.columnSubscribers.contextMenu = this.loadMenuTableCellEvent.bind(this, "contextMenu");
109
+ this.subscribe("cell-contextmenu", this.columnSubscribers.contextMenu);
110
+ this.table.on("cellTapHold", this.loadMenuTableCellEvent.bind(this, "contextMenu"));
111
+ }
112
+
113
+ if(def.clickMenu && !this.columnSubscribers.clickMenu){
114
+ this.columnSubscribers.clickMenu = this.loadMenuTableCellEvent.bind(this, "clickMenu");
115
+ this.subscribe("cell-click", this.columnSubscribers.clickMenu);
116
+ }
117
+
118
+ if(def.dblClickMenu && !this.columnSubscribers.dblClickMenu){
119
+ this.columnSubscribers.dblClickMenu = this.loadMenuTableCellEvent.bind(this, "dblClickMenu");
120
+ this.subscribe("cell-dblclick", this.columnSubscribers.dblClickMenu);
121
+ }
122
+ }
123
+
124
+ initializeColumnHeaderMenu(column){
125
+ var icon = column.definition.headerMenuIcon,
126
+ headerMenuEl;
127
+
128
+ headerMenuEl = document.createElement("span");
129
+ headerMenuEl.classList.add("tabulator-header-popup-button");
130
+
131
+ if(icon){
132
+ if(typeof icon === "function"){
133
+ icon = icon(column.getComponent());
134
+ }
135
+
136
+ if(icon instanceof HTMLElement){
137
+ headerMenuEl.appendChild(icon);
138
+ }else{
139
+ headerMenuEl.innerHTML = icon;
140
+ }
141
+ }else{
142
+ headerMenuEl.innerHTML = "⋮";
143
+ }
144
+
145
+ headerMenuEl.addEventListener("click", (e) => {
146
+ e.stopPropagation();
147
+ e.preventDefault();
148
+
149
+ this.loadMenuEvent(column.definition.headerMenu, e, column);
150
+ });
151
+
152
+ column.titleElement.insertBefore(headerMenuEl, column.titleElement.firstChild);
153
+ }
154
+
155
+ loadMenuTableCellEvent(option, e, cell){
156
+ if(cell._cell){
157
+ cell = cell._cell;
158
+ }
159
+
160
+ if(cell.column.definition[option]){
161
+ this.loadMenuEvent(cell.column.definition[option], e, cell);
162
+ }
163
+ }
164
+
165
+ loadMenuTableColumnEvent(option, e, column){
166
+ if(column._column){
167
+ column = column._column;
168
+ }
169
+
170
+ if(column.definition[option]){
171
+ this.loadMenuEvent(column.definition[option], e, column);
172
+ }
173
+ }
174
+
175
+ loadMenuEvent(menu, e, component){
176
+ if(component._group){
177
+ component = component._group;
178
+ }else if(component._row){
179
+ component = component._row;
180
+ }
181
+
182
+ menu = typeof menu == "function" ? menu.call(this.table, e, component.getComponent()) : menu;
183
+
184
+ this.loadMenu(e, component, menu);
185
+ }
186
+
187
+ loadMenu(e, component, menu, parentEl, parentPopup){
188
+ var touch = !(e instanceof MouseEvent),
189
+ menuEl = document.createElement("div"),
190
+ popup;
191
+
192
+ menuEl.classList.add("tabulator-menu");
193
+
194
+ if(!touch){
195
+ e.preventDefault();
196
+ }
197
+
198
+ //abort if no menu set
199
+ if(!menu || !menu.length){
200
+ return;
201
+ }
202
+
203
+ if(!parentEl){
204
+ if(this.nestedMenuBlock){
205
+ //abort if child menu already open
206
+ if(this.rootPopup){
207
+ return;
208
+ }
209
+ }else{
210
+ this.nestedMenuBlock = setTimeout(() => {
211
+ this.nestedMenuBlock = false;
212
+ }, 100);
213
+ }
214
+
215
+ if(this.rootPopup){
216
+ this.rootPopup.hide();
217
+ }
218
+
219
+ this.rootPopup = popup = this.popup(menuEl);
220
+
221
+ }else{
222
+ popup = parentPopup.child(menuEl);
223
+ }
224
+
225
+ menu.forEach((item) => {
226
+ var itemEl = document.createElement("div"),
227
+ label = item.label,
228
+ disabled = item.disabled;
229
+
230
+ if(item.separator){
231
+ itemEl.classList.add("tabulator-menu-separator");
232
+ }else{
233
+ itemEl.classList.add("tabulator-menu-item");
234
+
235
+ if(typeof label == "function"){
236
+ label = label.call(this.table, component.getComponent());
237
+ }
238
+
239
+ if(label instanceof Node){
240
+ itemEl.appendChild(label);
241
+ }else{
242
+ itemEl.innerHTML = label;
243
+ }
244
+
245
+ if(typeof disabled == "function"){
246
+ disabled = disabled.call(this.table, component.getComponent());
247
+ }
248
+
249
+ if(disabled){
250
+ itemEl.classList.add("tabulator-menu-item-disabled");
251
+ itemEl.addEventListener("click", (e) => {
252
+ e.stopPropagation();
253
+ });
254
+ }else{
255
+ if(item.menu && item.menu.length){
256
+ itemEl.addEventListener("click", (e) => {
257
+ e.stopPropagation();
258
+ this.loadMenu(e, component, item.menu, itemEl, popup);
259
+ });
260
+ }else{
261
+ if(item.action){
262
+ itemEl.addEventListener("click", (e) => {
263
+ item.action(e, component.getComponent());
264
+ });
265
+ }
266
+ }
267
+ }
268
+
269
+ if(item.menu && item.menu.length){
270
+ itemEl.classList.add("tabulator-menu-item-submenu");
271
+ }
272
+ }
273
+
274
+ menuEl.appendChild(itemEl);
275
+ });
276
+
277
+ menuEl.addEventListener("click", (e) => {
278
+ if(this.rootPopup){
279
+ this.rootPopup.hide();
280
+ }
281
+ });
282
+
283
+ popup.show(parentEl || e);
284
+
285
+ if(popup === this.rootPopup){
286
+ this.rootPopup.hideOnBlur(() => {
287
+ this.rootPopup = null;
288
+
289
+ if(this.currentComponent){
290
+ this.dispatch("menu-closed", menu, popup);
291
+ this.dispatchExternal("menuClosed", this.currentComponent.getComponent());
292
+ this.currentComponent = null;
293
+ }
294
+ });
295
+
296
+ this.currentComponent = component;
297
+
298
+ this.dispatch("menu-opened", menu, popup);
299
+ this.dispatchExternal("menuOpened", component.getComponent());
300
+ }
301
+ }
302
+ }
@@ -0,0 +1,311 @@
1
+ import Module from '../../core/Module.js';
2
+ import Helpers from '../../core/tools/Helpers.js';
3
+
4
+ export default class MoveColumns extends Module{
5
+
6
+ static moduleName = "moveColumn";
7
+
8
+ constructor(table){
9
+ super(table);
10
+
11
+ this.placeholderElement = this.createPlaceholderElement();
12
+ this.hoverElement = false; //floating column header element
13
+ this.checkTimeout = false; //click check timeout holder
14
+ this.checkPeriod = 250; //period to wait on mousedown to consider this a move and not a click
15
+ this.moving = false; //currently moving column
16
+ this.toCol = false; //destination column
17
+ this.toColAfter = false; //position of moving column relative to the destination column
18
+ this.startX = 0; //starting position within header element
19
+ this.autoScrollMargin = 40; //auto scroll on edge when within margin
20
+ this.autoScrollStep = 5; //auto scroll distance in pixels
21
+ this.autoScrollTimeout = false; //auto scroll timeout
22
+ this.touchMove = false;
23
+
24
+ this.moveHover = this.moveHover.bind(this);
25
+ this.endMove = this.endMove.bind(this);
26
+
27
+ this.registerTableOption("movableColumns", false); //enable movable columns
28
+ }
29
+
30
+ createPlaceholderElement(){
31
+ var el = document.createElement("div");
32
+
33
+ el.classList.add("tabulator-col");
34
+ el.classList.add("tabulator-col-placeholder");
35
+
36
+ return el;
37
+ }
38
+
39
+ initialize(){
40
+ if(this.table.options.movableColumns){
41
+ this.subscribe("column-init", this.initializeColumn.bind(this));
42
+ this.subscribe("alert-show", this.abortMove.bind(this));
43
+ }
44
+ }
45
+
46
+ abortMove(){
47
+ clearTimeout(this.checkTimeout);
48
+ }
49
+
50
+ initializeColumn(column){
51
+ var self = this,
52
+ config = {},
53
+ colEl;
54
+
55
+ if(!column.modules.frozen && !column.isGroup && !column.isRowHeader){
56
+ colEl = column.getElement();
57
+
58
+ config.mousemove = function(e){
59
+ if(column.parent === self.moving.parent){
60
+ if((((self.touchMove ? e.touches[0].pageX : e.pageX) - Helpers.elOffset(colEl).left) + self.table.columnManager.contentsElement.scrollLeft) > (column.getWidth() / 2)){
61
+ if(self.toCol !== column || !self.toColAfter){
62
+ colEl.parentNode.insertBefore(self.placeholderElement, colEl.nextSibling);
63
+ self.moveColumn(column, true);
64
+ }
65
+ }else{
66
+ if(self.toCol !== column || self.toColAfter){
67
+ colEl.parentNode.insertBefore(self.placeholderElement, colEl);
68
+ self.moveColumn(column, false);
69
+ }
70
+ }
71
+ }
72
+ }.bind(self);
73
+
74
+ colEl.addEventListener("mousedown", function(e){
75
+ self.touchMove = false;
76
+ if(e.which === 1){
77
+ self.checkTimeout = setTimeout(function(){
78
+ self.startMove(e, column);
79
+ }, self.checkPeriod);
80
+ }
81
+ });
82
+
83
+ colEl.addEventListener("mouseup", function(e){
84
+ if(e.which === 1){
85
+ if(self.checkTimeout){
86
+ clearTimeout(self.checkTimeout);
87
+ }
88
+ }
89
+ });
90
+
91
+ self.bindTouchEvents(column);
92
+ }
93
+
94
+ column.modules.moveColumn = config;
95
+ }
96
+
97
+ bindTouchEvents(column){
98
+ var colEl = column.getElement(),
99
+ startXMove = false, //shifting center position of the cell
100
+ nextCol, prevCol, nextColWidth, prevColWidth, nextColWidthLast, prevColWidthLast;
101
+
102
+ colEl.addEventListener("touchstart", (e) => {
103
+ this.checkTimeout = setTimeout(() => {
104
+ this.touchMove = true;
105
+ nextCol = column.nextColumn();
106
+ nextColWidth = nextCol ? nextCol.getWidth()/2 : 0;
107
+ prevCol = column.prevColumn();
108
+ prevColWidth = prevCol ? prevCol.getWidth()/2 : 0;
109
+ nextColWidthLast = 0;
110
+ prevColWidthLast = 0;
111
+ startXMove = false;
112
+
113
+ this.startMove(e, column);
114
+ }, this.checkPeriod);
115
+ }, {passive: true});
116
+
117
+ colEl.addEventListener("touchmove", (e) => {
118
+ var diff, moveToCol;
119
+
120
+ if(this.moving){
121
+ this.moveHover(e);
122
+
123
+ if(!startXMove){
124
+ startXMove = e.touches[0].pageX;
125
+ }
126
+
127
+ diff = e.touches[0].pageX - startXMove;
128
+
129
+ if(diff > 0){
130
+ if(nextCol && diff - nextColWidthLast > nextColWidth){
131
+ moveToCol = nextCol;
132
+
133
+ if(moveToCol !== column){
134
+ startXMove = e.touches[0].pageX;
135
+ moveToCol.getElement().parentNode.insertBefore(this.placeholderElement, moveToCol.getElement().nextSibling);
136
+ this.moveColumn(moveToCol, true);
137
+ }
138
+ }
139
+ }else{
140
+ if(prevCol && -diff - prevColWidthLast > prevColWidth){
141
+ moveToCol = prevCol;
142
+
143
+ if(moveToCol !== column){
144
+ startXMove = e.touches[0].pageX;
145
+ moveToCol.getElement().parentNode.insertBefore(this.placeholderElement, moveToCol.getElement());
146
+ this.moveColumn(moveToCol, false);
147
+ }
148
+ }
149
+ }
150
+
151
+ if(moveToCol){
152
+ nextCol = moveToCol.nextColumn();
153
+ nextColWidthLast = nextColWidth;
154
+ nextColWidth = nextCol ? nextCol.getWidth() / 2 : 0;
155
+ prevCol = moveToCol.prevColumn();
156
+ prevColWidthLast = prevColWidth;
157
+ prevColWidth = prevCol ? prevCol.getWidth() / 2 : 0;
158
+ }
159
+ }
160
+ }, {passive: true});
161
+
162
+ colEl.addEventListener("touchend", (e) => {
163
+ if(this.checkTimeout){
164
+ clearTimeout(this.checkTimeout);
165
+ }
166
+ if(this.moving){
167
+ this.endMove(e);
168
+ }
169
+ });
170
+ }
171
+
172
+ startMove(e, column){
173
+ var element = column.getElement(),
174
+ headerElement = this.table.columnManager.getContentsElement(),
175
+ headersElement = this.table.columnManager.getHeadersElement();
176
+
177
+ //Prevent moving columns when range selection is active
178
+ if(this.table.modules.selectRange && this.table.modules.selectRange.columnSelection){
179
+ if(this.table.modules.selectRange.mousedown && this.table.modules.selectRange.selecting === "column"){
180
+ return;
181
+ }
182
+ }
183
+
184
+ this.moving = column;
185
+ this.startX = (this.touchMove ? e.touches[0].pageX : e.pageX) - Helpers.elOffset(element).left;
186
+
187
+ this.table.element.classList.add("tabulator-block-select");
188
+
189
+ //create placeholder
190
+ this.placeholderElement.style.width = column.getWidth() + "px";
191
+ this.placeholderElement.style.height = column.getHeight() + "px";
192
+
193
+ element.parentNode.insertBefore(this.placeholderElement, element);
194
+ element.parentNode.removeChild(element);
195
+
196
+ //create hover element
197
+ this.hoverElement = element.cloneNode(true);
198
+ this.hoverElement.classList.add("tabulator-moving");
199
+
200
+ headerElement.appendChild(this.hoverElement);
201
+
202
+ this.hoverElement.style.left = "0";
203
+ this.hoverElement.style.bottom = (headerElement.clientHeight - headersElement.offsetHeight) + "px";
204
+
205
+ if(!this.touchMove){
206
+ this._bindMouseMove();
207
+
208
+ document.body.addEventListener("mousemove", this.moveHover);
209
+ document.body.addEventListener("mouseup", this.endMove);
210
+ }
211
+
212
+ this.moveHover(e);
213
+
214
+ this.dispatch("column-moving", e, this.moving);
215
+ }
216
+
217
+ _bindMouseMove(){
218
+ this.table.columnManager.columnsByIndex.forEach(function(column){
219
+ if(column.modules.moveColumn.mousemove){
220
+ column.getElement().addEventListener("mousemove", column.modules.moveColumn.mousemove);
221
+ }
222
+ });
223
+ }
224
+
225
+ _unbindMouseMove(){
226
+ this.table.columnManager.columnsByIndex.forEach(function(column){
227
+ if(column.modules.moveColumn.mousemove){
228
+ column.getElement().removeEventListener("mousemove", column.modules.moveColumn.mousemove);
229
+ }
230
+ });
231
+ }
232
+
233
+ moveColumn(column, after){
234
+ var movingCells = this.moving.getCells();
235
+
236
+ this.toCol = column;
237
+ this.toColAfter = after;
238
+
239
+ if(after){
240
+ column.getCells().forEach(function(cell, i){
241
+ var cellEl = cell.getElement(true);
242
+
243
+ if(cellEl.parentNode && movingCells[i]){
244
+ cellEl.parentNode.insertBefore(movingCells[i].getElement(), cellEl.nextSibling);
245
+ }
246
+ });
247
+ }else{
248
+ column.getCells().forEach(function(cell, i){
249
+ var cellEl = cell.getElement(true);
250
+
251
+ if(cellEl.parentNode && movingCells[i]){
252
+ cellEl.parentNode.insertBefore(movingCells[i].getElement(), cellEl);
253
+ }
254
+ });
255
+ }
256
+ }
257
+
258
+ endMove(e){
259
+ if(e.which === 1 || this.touchMove){
260
+ this._unbindMouseMove();
261
+
262
+ this.placeholderElement.parentNode.insertBefore(this.moving.getElement(), this.placeholderElement.nextSibling);
263
+ this.placeholderElement.parentNode.removeChild(this.placeholderElement);
264
+ this.hoverElement.parentNode.removeChild(this.hoverElement);
265
+
266
+ this.table.element.classList.remove("tabulator-block-select");
267
+
268
+ if(this.toCol){
269
+ this.table.columnManager.moveColumnActual(this.moving, this.toCol, this.toColAfter);
270
+ }
271
+
272
+ this.moving = false;
273
+ this.toCol = false;
274
+ this.toColAfter = false;
275
+
276
+ if(!this.touchMove){
277
+ document.body.removeEventListener("mousemove", this.moveHover);
278
+ document.body.removeEventListener("mouseup", this.endMove);
279
+ }
280
+ }
281
+ }
282
+
283
+ moveHover(e){
284
+ var columnHolder = this.table.columnManager.getContentsElement(),
285
+ scrollLeft = columnHolder.scrollLeft,
286
+ xPos = ((this.touchMove ? e.touches[0].pageX : e.pageX) - Helpers.elOffset(columnHolder).left) + scrollLeft,
287
+ scrollPos;
288
+
289
+ this.hoverElement.style.left = (xPos - this.startX) + "px";
290
+
291
+ if(xPos - scrollLeft < this.autoScrollMargin){
292
+ if(!this.autoScrollTimeout){
293
+ this.autoScrollTimeout = setTimeout(() => {
294
+ scrollPos = Math.max(0,scrollLeft-5);
295
+ this.table.rowManager.getElement().scrollLeft = scrollPos;
296
+ this.autoScrollTimeout = false;
297
+ }, 1);
298
+ }
299
+ }
300
+
301
+ if(scrollLeft + columnHolder.clientWidth - xPos < this.autoScrollMargin){
302
+ if(!this.autoScrollTimeout){
303
+ this.autoScrollTimeout = setTimeout(() => {
304
+ scrollPos = Math.min(columnHolder.clientWidth, scrollLeft+5);
305
+ this.table.rowManager.getElement().scrollLeft = scrollPos;
306
+ this.autoScrollTimeout = false;
307
+ }, 1);
308
+ }
309
+ }
310
+ }
311
+ }