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,636 +1,636 @@
1
- import Module from '../../core/Module.js';
2
- import Helpers from '../../core/tools/Helpers.js';
3
-
4
- class MoveRows extends Module{
5
-
6
- constructor(table){
7
- super(table);
8
-
9
- this.placeholderElement = this.createPlaceholderElement();
10
- this.hoverElement = false; //floating row header element
11
- this.checkTimeout = false; //click check timeout holder
12
- this.checkPeriod = 150; //period to wait on mousedown to consider this a move and not a click
13
- this.moving = false; //currently moving row
14
- this.toRow = false; //destination row
15
- this.toRowAfter = false; //position of moving row relative to the destination row
16
- this.hasHandle = false; //row has handle instead of fully movable row
17
- this.startY = 0; //starting Y position within header element
18
- this.startX = 0; //starting X position within header element
19
-
20
- this.moveHover = this.moveHover.bind(this);
21
- this.endMove = this.endMove.bind(this);
22
- this.tableRowDropEvent = false;
23
-
24
- this.touchMove = false;
25
-
26
- this.connection = false;
27
- this.connectionSelectorsTables = false;
28
- this.connectionSelectorsElements = false;
29
- this.connectionElements = [];
30
- this.connections = [];
31
-
32
- this.connectedTable = false;
33
- this.connectedRow = false;
34
-
35
- this.registerTableOption("movableRows", false); //enable movable rows
36
- this.registerTableOption("movableRowsConnectedTables", false); //tables for movable rows to be connected to
37
- this.registerTableOption("movableRowsConnectedElements", false); //other elements for movable rows to be connected to
38
- this.registerTableOption("movableRowsSender", false);
39
- this.registerTableOption("movableRowsReceiver", "insert");
40
-
41
- this.registerColumnOption("rowHandle");
42
- }
43
-
44
- createPlaceholderElement(){
45
- var el = document.createElement("div");
46
-
47
- el.classList.add("tabulator-row");
48
- el.classList.add("tabulator-row-placeholder");
49
-
50
- return el;
51
- }
52
-
53
- initialize(){
54
- if(this.table.options.movableRows){
55
- this.connectionSelectorsTables = this.table.options.movableRowsConnectedTables;
56
- this.connectionSelectorsElements = this.table.options.movableRowsConnectedElements;
57
-
58
- this.connection = this.connectionSelectorsTables || this.connectionSelectorsElements;
59
-
60
- this.subscribe("cell-init", this.initializeCell.bind(this));
61
- this.subscribe("column-init", this.initializeColumn.bind(this));
62
- this.subscribe("row-init", this.initializeRow.bind(this));
63
- }
64
- }
65
-
66
- initializeGroupHeader(group){
67
- var self = this,
68
- config = {};
69
-
70
- //inter table drag drop
71
- config.mouseup = function(e){
72
- self.tableRowDrop(e, group);
73
- }.bind(self);
74
-
75
- //same table drag drop
76
- config.mousemove = function(e){
77
- var rowEl;
78
-
79
- if(((e.pageY - Helpers.elOffset(group.element).top) + self.table.rowManager.element.scrollTop) > (group.getHeight() / 2)){
80
- if(self.toRow !== group || !self.toRowAfter){
81
- rowEl = group.getElement();
82
- rowEl.parentNode.insertBefore(self.placeholderElement, rowEl.nextSibling);
83
- self.moveRow(group, true);
84
- }
85
- }else{
86
- if(self.toRow !== group || self.toRowAfter){
87
- rowEl = group.getElement();
88
- if(rowEl.previousSibling){
89
- rowEl.parentNode.insertBefore(self.placeholderElement, rowEl);
90
- self.moveRow(group, false);
91
- }
92
- }
93
- }
94
- }.bind(self);
95
-
96
- group.modules.moveRow = config;
97
- }
98
-
99
- initializeRow(row){
100
- var self = this,
101
- config = {},
102
- rowEl;
103
-
104
- //inter table drag drop
105
- config.mouseup = function(e){
106
- self.tableRowDrop(e, row);
107
- }.bind(self);
108
-
109
- //same table drag drop
110
- config.mousemove = function(e){
111
- var rowEl = row.getElement();
112
-
113
- if(((e.pageY - Helpers.elOffset(rowEl).top) + self.table.rowManager.element.scrollTop) > (row.getHeight() / 2)){
114
- if(self.toRow !== row || !self.toRowAfter){
115
- rowEl.parentNode.insertBefore(self.placeholderElement, rowEl.nextSibling);
116
- self.moveRow(row, true);
117
- }
118
- }else{
119
- if(self.toRow !== row || self.toRowAfter){
120
- rowEl.parentNode.insertBefore(self.placeholderElement, rowEl);
121
- self.moveRow(row, false);
122
- }
123
- }
124
- }.bind(self);
125
-
126
-
127
- if(!this.hasHandle){
128
-
129
- rowEl = row.getElement();
130
-
131
- rowEl.addEventListener("mousedown", function(e){
132
- if(e.which === 1){
133
- self.checkTimeout = setTimeout(function(){
134
- self.startMove(e, row);
135
- }, self.checkPeriod);
136
- }
137
- });
138
-
139
- rowEl.addEventListener("mouseup", function(e){
140
- if(e.which === 1){
141
- if(self.checkTimeout){
142
- clearTimeout(self.checkTimeout);
143
- }
144
- }
145
- });
146
-
147
- this.bindTouchEvents(row, row.getElement());
148
- }
149
-
150
- row.modules.moveRow = config;
151
- }
152
-
153
- initializeColumn(column){
154
- if(column.definition.rowHandle && this.table.options.movableRows !== false){
155
- this.hasHandle = true;
156
- }
157
- }
158
-
159
- initializeCell(cell){
160
- if(cell.column.definition.rowHandle && this.table.options.movableRows !== false){
161
- var self = this,
162
- cellEl = cell.getElement(true);
163
-
164
- cellEl.addEventListener("mousedown", function(e){
165
- if(e.which === 1){
166
- self.checkTimeout = setTimeout(function(){
167
- self.startMove(e, cell.row);
168
- }, self.checkPeriod);
169
- }
170
- });
171
-
172
- cellEl.addEventListener("mouseup", function(e){
173
- if(e.which === 1){
174
- if(self.checkTimeout){
175
- clearTimeout(self.checkTimeout);
176
- }
177
- }
178
- });
179
-
180
- this.bindTouchEvents(cell.row, cellEl);
181
- }
182
- }
183
-
184
- bindTouchEvents(row, element){
185
- var startYMove = false, //shifting center position of the cell
186
- nextRow, prevRow, nextRowHeight, prevRowHeight, nextRowHeightLast, prevRowHeightLast;
187
-
188
- element.addEventListener("touchstart", (e) => {
189
- this.checkTimeout = setTimeout(() => {
190
- this.touchMove = true;
191
- nextRow = row.nextRow();
192
- nextRowHeight = nextRow ? nextRow.getHeight()/2 : 0;
193
- prevRow = row.prevRow();
194
- prevRowHeight = prevRow ? prevRow.getHeight()/2 : 0;
195
- nextRowHeightLast = 0;
196
- prevRowHeightLast = 0;
197
- startYMove = false;
198
-
199
- this.startMove(e, row);
200
- }, this.checkPeriod);
201
- }, {passive: true});
202
- this.moving, this.toRow, this.toRowAfter;
203
- element.addEventListener("touchmove", (e) => {
204
-
205
- var diff, moveToRow;
206
-
207
- if(this.moving){
208
- e.preventDefault();
209
-
210
- this.moveHover(e);
211
-
212
- if(!startYMove){
213
- startYMove = e.touches[0].pageY;
214
- }
215
-
216
- diff = e.touches[0].pageY - startYMove;
217
-
218
- if(diff > 0){
219
- if(nextRow && diff - nextRowHeightLast > nextRowHeight){
220
- moveToRow = nextRow;
221
-
222
- if(moveToRow !== row){
223
- startYMove = e.touches[0].pageY;
224
- moveToRow.getElement().parentNode.insertBefore(this.placeholderElement, moveToRow.getElement().nextSibling);
225
- this.moveRow(moveToRow, true);
226
- }
227
- }
228
- }else{
229
- if(prevRow && -diff - prevRowHeightLast > prevRowHeight){
230
- moveToRow = prevRow;
231
-
232
- if(moveToRow !== row){
233
- startYMove = e.touches[0].pageY;
234
- moveToRow.getElement().parentNode.insertBefore(this.placeholderElement, moveToRow.getElement());
235
- this.moveRow(moveToRow, false);
236
- }
237
- }
238
- }
239
-
240
- if(moveToRow){
241
- nextRow = moveToRow.nextRow();
242
- nextRowHeightLast = nextRowHeight;
243
- nextRowHeight = nextRow ? nextRow.getHeight() / 2 : 0;
244
- prevRow = moveToRow.prevRow();
245
- prevRowHeightLast = prevRowHeight;
246
- prevRowHeight = prevRow ? prevRow.getHeight() / 2 : 0;
247
- }
248
- }
249
- });
250
-
251
- element.addEventListener("touchend", (e) => {
252
- if(this.checkTimeout){
253
- clearTimeout(this.checkTimeout);
254
- }
255
- if(this.moving){
256
- this.endMove(e);
257
- this.touchMove = false;
258
- }
259
- });
260
- }
261
-
262
- _bindMouseMove(){
263
- this.table.rowManager.getDisplayRows().forEach((row) => {
264
- if((row.type === "row" || row.type === "group") && row.modules.moveRow && row.modules.moveRow.mousemove){
265
- row.getElement().addEventListener("mousemove", row.modules.moveRow.mousemove);
266
- }
267
- });
268
- }
269
-
270
- _unbindMouseMove(){
271
- this.table.rowManager.getDisplayRows().forEach((row) => {
272
- if((row.type === "row" || row.type === "group") && row.modules.moveRow && row.modules.moveRow.mousemove){
273
- row.getElement().removeEventListener("mousemove", row.modules.moveRow.mousemove);
274
- }
275
- });
276
- }
277
-
278
- startMove(e, row){
279
- var element = row.getElement();
280
-
281
- this.setStartPosition(e, row);
282
-
283
- this.moving = row;
284
-
285
- this.table.element.classList.add("tabulator-block-select");
286
-
287
- //create placeholder
288
- this.placeholderElement.style.width = row.getWidth() + "px";
289
- this.placeholderElement.style.height = row.getHeight() + "px";
290
-
291
- if(!this.connection){
292
- element.parentNode.insertBefore(this.placeholderElement, element);
293
- element.parentNode.removeChild(element);
294
- }else{
295
- this.table.element.classList.add("tabulator-movingrow-sending");
296
- this.connectToTables(row);
297
- }
298
-
299
- //create hover element
300
- this.hoverElement = element.cloneNode(true);
301
- this.hoverElement.classList.add("tabulator-moving");
302
-
303
- if(this.connection){
304
- document.body.appendChild(this.hoverElement);
305
- this.hoverElement.style.left = "0";
306
- this.hoverElement.style.top = "0";
307
- this.hoverElement.style.width = this.table.element.clientWidth + "px";
308
- this.hoverElement.style.whiteSpace = "nowrap";
309
- this.hoverElement.style.overflow = "hidden";
310
- this.hoverElement.style.pointerEvents = "none";
311
- }else{
312
- this.table.rowManager.getTableElement().appendChild(this.hoverElement);
313
-
314
- this.hoverElement.style.left = "0";
315
- this.hoverElement.style.top = "0";
316
-
317
- this._bindMouseMove();
318
- }
319
-
320
- document.body.addEventListener("mousemove", this.moveHover);
321
- document.body.addEventListener("mouseup", this.endMove);
322
-
323
- this.dispatchExternal("rowMoving", row.getComponent());
324
-
325
- this.moveHover(e);
326
- }
327
-
328
- setStartPosition(e, row){
329
- var pageX = this.touchMove ? e.touches[0].pageX : e.pageX,
330
- pageY = this.touchMove ? e.touches[0].pageY : e.pageY,
331
- element, position;
332
-
333
- element = row.getElement();
334
- if(this.connection){
335
- position = element.getBoundingClientRect();
336
-
337
- this.startX = position.left - pageX + window.pageXOffset;
338
- this.startY = position.top - pageY + window.pageYOffset;
339
- }else{
340
- this.startY = (pageY - element.getBoundingClientRect().top);
341
- }
342
- }
343
-
344
- endMove(e){
345
- if(!e || e.which === 1 || this.touchMove){
346
- this._unbindMouseMove();
347
-
348
- if(!this.connection){
349
- this.placeholderElement.parentNode.insertBefore(this.moving.getElement(), this.placeholderElement.nextSibling);
350
- this.placeholderElement.parentNode.removeChild(this.placeholderElement);
351
- }
352
-
353
- this.hoverElement.parentNode.removeChild(this.hoverElement);
354
-
355
- this.table.element.classList.remove("tabulator-block-select");
356
-
357
- if(this.toRow){
358
- this.table.rowManager.moveRow(this.moving, this.toRow, this.toRowAfter);
359
- }else{
360
- this.dispatchExternal("rowMoveCancelled", this.moving.getComponent());
361
- }
362
-
363
- this.moving = false;
364
- this.toRow = false;
365
- this.toRowAfter = false;
366
-
367
- document.body.removeEventListener("mousemove", this.moveHover);
368
- document.body.removeEventListener("mouseup", this.endMove);
369
-
370
- if(this.connection){
371
- this.table.element.classList.remove("tabulator-movingrow-sending");
372
- this.disconnectFromTables();
373
- }
374
- }
375
- }
376
-
377
- moveRow(row, after){
378
- this.toRow = row;
379
- this.toRowAfter = after;
380
- }
381
-
382
- moveHover(e){
383
- if(this.connection){
384
- this.moveHoverConnections.call(this, e);
385
- }else{
386
- this.moveHoverTable.call(this, e);
387
- }
388
- }
389
-
390
- moveHoverTable(e){
391
- var rowHolder = this.table.rowManager.getElement(),
392
- scrollTop = rowHolder.scrollTop,
393
- yPos = ((this.touchMove ? e.touches[0].pageY : e.pageY) - rowHolder.getBoundingClientRect().top) + scrollTop;
394
-
395
- this.hoverElement.style.top = Math.min(yPos - this.startY, this.table.rowManager.element.scrollHeight - this.hoverElement.offsetHeight) + "px";
396
- }
397
-
398
- moveHoverConnections(e){
399
- this.hoverElement.style.left = (this.startX + (this.touchMove ? e.touches[0].pageX : e.pageX)) + "px";
400
- this.hoverElement.style.top = (this.startY + (this.touchMove ? e.touches[0].pageY : e.pageY)) + "px";
401
- }
402
-
403
- elementRowDrop(e, element, row){
404
- this.dispatchExternal("movableRowsElementDrop", e, element, row ? row.getComponent() : false);
405
- }
406
-
407
- //establish connection with other tables
408
- connectToTables(row){
409
- var connectionTables;
410
-
411
- if(this.connectionSelectorsTables){
412
- connectionTables = this.commsConnections(this.connectionSelectorsTables);
413
-
414
- this.dispatchExternal("movableRowsSendingStart", connectionTables);
415
-
416
- this.commsSend(this.connectionSelectorsTables, "moveRow", "connect", {
417
- row:row,
418
- });
419
- }
420
-
421
- if(this.connectionSelectorsElements){
422
-
423
- this.connectionElements = [];
424
-
425
- if(!Array.isArray(this.connectionSelectorsElements)){
426
- this.connectionSelectorsElements = [this.connectionSelectorsElements];
427
- }
428
-
429
- this.connectionSelectorsElements.forEach((query) => {
430
- if(typeof query === "string"){
431
- this.connectionElements = this.connectionElements.concat(Array.prototype.slice.call(document.querySelectorAll(query)));
432
- }else{
433
- this.connectionElements.push(query);
434
- }
435
- });
436
-
437
- this.connectionElements.forEach((element) => {
438
- var dropEvent = (e) => {
439
- this.elementRowDrop(e, element, this.moving);
440
- };
441
-
442
- element.addEventListener("mouseup", dropEvent);
443
- element.tabulatorElementDropEvent = dropEvent;
444
-
445
- element.classList.add("tabulator-movingrow-receiving");
446
- });
447
- }
448
- }
449
-
450
- //disconnect from other tables
451
- disconnectFromTables(){
452
- var connectionTables;
453
-
454
- if(this.connectionSelectorsTables){
455
- connectionTables = this.commsConnections(this.connectionSelectorsTables);
456
-
457
- this.dispatchExternal("movableRowsSendingStop", connectionTables);
458
-
459
- this.commsSend(this.connectionSelectorsTables, "moveRow", "disconnect");
460
- }
461
-
462
- this.connectionElements.forEach((element) => {
463
- element.classList.remove("tabulator-movingrow-receiving");
464
- element.removeEventListener("mouseup", element.tabulatorElementDropEvent);
465
- delete element.tabulatorElementDropEvent;
466
- });
467
- }
468
-
469
- //accept incomming connection
470
- connect(table, row){
471
- if(!this.connectedTable){
472
- this.connectedTable = table;
473
- this.connectedRow = row;
474
-
475
- this.table.element.classList.add("tabulator-movingrow-receiving");
476
-
477
- this.table.rowManager.getDisplayRows().forEach((row) => {
478
- if(row.type === "row" && row.modules.moveRow && row.modules.moveRow.mouseup){
479
- row.getElement().addEventListener("mouseup", row.modules.moveRow.mouseup);
480
- }
481
- });
482
-
483
- this.tableRowDropEvent = this.tableRowDrop.bind(this);
484
-
485
- this.table.element.addEventListener("mouseup", this.tableRowDropEvent);
486
-
487
- this.dispatchExternal("movableRowsReceivingStart", row, table);
488
-
489
- return true;
490
- }else{
491
- console.warn("Move Row Error - Table cannot accept connection, already connected to table:", this.connectedTable);
492
- return false;
493
- }
494
- }
495
-
496
- //close incoming connection
497
- disconnect(table){
498
- if(table === this.connectedTable){
499
- this.connectedTable = false;
500
- this.connectedRow = false;
501
-
502
- this.table.element.classList.remove("tabulator-movingrow-receiving");
503
-
504
- this.table.rowManager.getDisplayRows().forEach((row) =>{
505
- if(row.type === "row" && row.modules.moveRow && row.modules.moveRow.mouseup){
506
- row.getElement().removeEventListener("mouseup", row.modules.moveRow.mouseup);
507
- }
508
- });
509
-
510
- this.table.element.removeEventListener("mouseup", this.tableRowDropEvent);
511
-
512
- this.dispatchExternal("movableRowsReceivingStop", table);
513
- }else{
514
- console.warn("Move Row Error - trying to disconnect from non connected table");
515
- }
516
- }
517
-
518
- dropComplete(table, row, success){
519
- var sender = false;
520
-
521
- if(success){
522
-
523
- switch(typeof this.table.options.movableRowsSender){
524
- case "string":
525
- sender = this.senders[this.table.options.movableRowsSender];
526
- break;
527
-
528
- case "function":
529
- sender = this.table.options.movableRowsSender;
530
- break;
531
- }
532
-
533
- if(sender){
534
- sender.call(this, this.moving ? this.moving.getComponent() : undefined, row ? row.getComponent() : undefined, table);
535
- }else{
536
- if(this.table.options.movableRowsSender){
537
- console.warn("Mover Row Error - no matching sender found:", this.table.options.movableRowsSender);
538
- }
539
- }
540
-
541
- this.dispatchExternal("movableRowsSent", this.moving.getComponent(), row ? row.getComponent() : undefined, table);
542
- }else{
543
- this.dispatchExternal("movableRowsSentFailed", this.moving.getComponent(), row ? row.getComponent() : undefined, table);
544
- }
545
-
546
- this.endMove();
547
- }
548
-
549
- tableRowDrop(e, row){
550
- var receiver = false,
551
- success = false;
552
-
553
- e.stopImmediatePropagation();
554
-
555
- switch(typeof this.table.options.movableRowsReceiver){
556
- case "string":
557
- receiver = this.receivers[this.table.options.movableRowsReceiver];
558
- break;
559
-
560
- case "function":
561
- receiver = this.table.options.movableRowsReceiver;
562
- break;
563
- }
564
-
565
- if(receiver){
566
- success = receiver.call(this, this.connectedRow.getComponent(), row ? row.getComponent() : undefined, this.connectedTable);
567
- }else{
568
- console.warn("Mover Row Error - no matching receiver found:", this.table.options.movableRowsReceiver);
569
- }
570
-
571
- if(success){
572
- this.dispatchExternal("movableRowsReceived", this.connectedRow.getComponent(), row ? row.getComponent() : undefined, this.connectedTable);
573
- }else{
574
- this.dispatchExternal("movableRowsReceivedFailed", this.connectedRow.getComponent(), row ? row.getComponent() : undefined, this.connectedTable);
575
- }
576
-
577
- this.commsSend(this.connectedTable, "moveRow", "dropcomplete", {
578
- row:row,
579
- success:success,
580
- });
581
- }
582
-
583
- commsReceived(table, action, data){
584
- switch(action){
585
- case "connect":
586
- return this.connect(table, data.row);
587
-
588
- case "disconnect":
589
- return this.disconnect(table);
590
-
591
- case "dropcomplete":
592
- return this.dropComplete(table, data.row, data.success);
593
- }
594
- }
595
- }
596
-
597
- MoveRows.prototype.receivers = {
598
- insert:function(fromRow, toRow, fromTable){
599
- this.table.addRow(fromRow.getData(), undefined, toRow);
600
- return true;
601
- },
602
-
603
- add:function(fromRow, toRow, fromTable){
604
- this.table.addRow(fromRow.getData());
605
- return true;
606
- },
607
-
608
- update:function(fromRow, toRow, fromTable){
609
- if(toRow){
610
- toRow.update(fromRow.getData());
611
- return true;
612
- }
613
-
614
- return false;
615
- },
616
-
617
- replace:function(fromRow, toRow, fromTable){
618
- if(toRow){
619
- this.table.addRow(fromRow.getData(), undefined, toRow);
620
- toRow.delete();
621
- return true;
622
- }
623
-
624
- return false;
625
- },
626
- };
627
-
628
- MoveRows.prototype.senders = {
629
- delete:function(fromRow, toRow, toTable){
630
- fromRow.delete();
631
- }
632
- };
633
-
634
- MoveRows.moduleName = "moveRow";
635
-
1
+ import Module from '../../core/Module.js';
2
+ import Helpers from '../../core/tools/Helpers.js';
3
+
4
+ class MoveRows extends Module{
5
+
6
+ constructor(table){
7
+ super(table);
8
+
9
+ this.placeholderElement = this.createPlaceholderElement();
10
+ this.hoverElement = false; //floating row header element
11
+ this.checkTimeout = false; //click check timeout holder
12
+ this.checkPeriod = 150; //period to wait on mousedown to consider this a move and not a click
13
+ this.moving = false; //currently moving row
14
+ this.toRow = false; //destination row
15
+ this.toRowAfter = false; //position of moving row relative to the destination row
16
+ this.hasHandle = false; //row has handle instead of fully movable row
17
+ this.startY = 0; //starting Y position within header element
18
+ this.startX = 0; //starting X position within header element
19
+
20
+ this.moveHover = this.moveHover.bind(this);
21
+ this.endMove = this.endMove.bind(this);
22
+ this.tableRowDropEvent = false;
23
+
24
+ this.touchMove = false;
25
+
26
+ this.connection = false;
27
+ this.connectionSelectorsTables = false;
28
+ this.connectionSelectorsElements = false;
29
+ this.connectionElements = [];
30
+ this.connections = [];
31
+
32
+ this.connectedTable = false;
33
+ this.connectedRow = false;
34
+
35
+ this.registerTableOption("movableRows", false); //enable movable rows
36
+ this.registerTableOption("movableRowsConnectedTables", false); //tables for movable rows to be connected to
37
+ this.registerTableOption("movableRowsConnectedElements", false); //other elements for movable rows to be connected to
38
+ this.registerTableOption("movableRowsSender", false);
39
+ this.registerTableOption("movableRowsReceiver", "insert");
40
+
41
+ this.registerColumnOption("rowHandle");
42
+ }
43
+
44
+ createPlaceholderElement(){
45
+ var el = document.createElement("div");
46
+
47
+ el.classList.add("tabulator-row");
48
+ el.classList.add("tabulator-row-placeholder");
49
+
50
+ return el;
51
+ }
52
+
53
+ initialize(){
54
+ if(this.table.options.movableRows){
55
+ this.connectionSelectorsTables = this.table.options.movableRowsConnectedTables;
56
+ this.connectionSelectorsElements = this.table.options.movableRowsConnectedElements;
57
+
58
+ this.connection = this.connectionSelectorsTables || this.connectionSelectorsElements;
59
+
60
+ this.subscribe("cell-init", this.initializeCell.bind(this));
61
+ this.subscribe("column-init", this.initializeColumn.bind(this));
62
+ this.subscribe("row-init", this.initializeRow.bind(this));
63
+ }
64
+ }
65
+
66
+ initializeGroupHeader(group){
67
+ var self = this,
68
+ config = {};
69
+
70
+ //inter table drag drop
71
+ config.mouseup = function(e){
72
+ self.tableRowDrop(e, group);
73
+ }.bind(self);
74
+
75
+ //same table drag drop
76
+ config.mousemove = function(e){
77
+ var rowEl;
78
+
79
+ if(((e.pageY - Helpers.elOffset(group.element).top) + self.table.rowManager.element.scrollTop) > (group.getHeight() / 2)){
80
+ if(self.toRow !== group || !self.toRowAfter){
81
+ rowEl = group.getElement();
82
+ rowEl.parentNode.insertBefore(self.placeholderElement, rowEl.nextSibling);
83
+ self.moveRow(group, true);
84
+ }
85
+ }else{
86
+ if(self.toRow !== group || self.toRowAfter){
87
+ rowEl = group.getElement();
88
+ if(rowEl.previousSibling){
89
+ rowEl.parentNode.insertBefore(self.placeholderElement, rowEl);
90
+ self.moveRow(group, false);
91
+ }
92
+ }
93
+ }
94
+ }.bind(self);
95
+
96
+ group.modules.moveRow = config;
97
+ }
98
+
99
+ initializeRow(row){
100
+ var self = this,
101
+ config = {},
102
+ rowEl;
103
+
104
+ //inter table drag drop
105
+ config.mouseup = function(e){
106
+ self.tableRowDrop(e, row);
107
+ }.bind(self);
108
+
109
+ //same table drag drop
110
+ config.mousemove = function(e){
111
+ var rowEl = row.getElement();
112
+
113
+ if(((e.pageY - Helpers.elOffset(rowEl).top) + self.table.rowManager.element.scrollTop) > (row.getHeight() / 2)){
114
+ if(self.toRow !== row || !self.toRowAfter){
115
+ rowEl.parentNode.insertBefore(self.placeholderElement, rowEl.nextSibling);
116
+ self.moveRow(row, true);
117
+ }
118
+ }else{
119
+ if(self.toRow !== row || self.toRowAfter){
120
+ rowEl.parentNode.insertBefore(self.placeholderElement, rowEl);
121
+ self.moveRow(row, false);
122
+ }
123
+ }
124
+ }.bind(self);
125
+
126
+
127
+ if(!this.hasHandle){
128
+
129
+ rowEl = row.getElement();
130
+
131
+ rowEl.addEventListener("mousedown", function(e){
132
+ if(e.which === 1){
133
+ self.checkTimeout = setTimeout(function(){
134
+ self.startMove(e, row);
135
+ }, self.checkPeriod);
136
+ }
137
+ });
138
+
139
+ rowEl.addEventListener("mouseup", function(e){
140
+ if(e.which === 1){
141
+ if(self.checkTimeout){
142
+ clearTimeout(self.checkTimeout);
143
+ }
144
+ }
145
+ });
146
+
147
+ this.bindTouchEvents(row, row.getElement());
148
+ }
149
+
150
+ row.modules.moveRow = config;
151
+ }
152
+
153
+ initializeColumn(column){
154
+ if(column.definition.rowHandle && this.table.options.movableRows !== false){
155
+ this.hasHandle = true;
156
+ }
157
+ }
158
+
159
+ initializeCell(cell){
160
+ if(cell.column.definition.rowHandle && this.table.options.movableRows !== false){
161
+ var self = this,
162
+ cellEl = cell.getElement(true);
163
+
164
+ cellEl.addEventListener("mousedown", function(e){
165
+ if(e.which === 1){
166
+ self.checkTimeout = setTimeout(function(){
167
+ self.startMove(e, cell.row);
168
+ }, self.checkPeriod);
169
+ }
170
+ });
171
+
172
+ cellEl.addEventListener("mouseup", function(e){
173
+ if(e.which === 1){
174
+ if(self.checkTimeout){
175
+ clearTimeout(self.checkTimeout);
176
+ }
177
+ }
178
+ });
179
+
180
+ this.bindTouchEvents(cell.row, cellEl);
181
+ }
182
+ }
183
+
184
+ bindTouchEvents(row, element){
185
+ var startYMove = false, //shifting center position of the cell
186
+ nextRow, prevRow, nextRowHeight, prevRowHeight, nextRowHeightLast, prevRowHeightLast;
187
+
188
+ element.addEventListener("touchstart", (e) => {
189
+ this.checkTimeout = setTimeout(() => {
190
+ this.touchMove = true;
191
+ nextRow = row.nextRow();
192
+ nextRowHeight = nextRow ? nextRow.getHeight()/2 : 0;
193
+ prevRow = row.prevRow();
194
+ prevRowHeight = prevRow ? prevRow.getHeight()/2 : 0;
195
+ nextRowHeightLast = 0;
196
+ prevRowHeightLast = 0;
197
+ startYMove = false;
198
+
199
+ this.startMove(e, row);
200
+ }, this.checkPeriod);
201
+ }, {passive: true});
202
+ this.moving, this.toRow, this.toRowAfter;
203
+ element.addEventListener("touchmove", (e) => {
204
+
205
+ var diff, moveToRow;
206
+
207
+ if(this.moving){
208
+ e.preventDefault();
209
+
210
+ this.moveHover(e);
211
+
212
+ if(!startYMove){
213
+ startYMove = e.touches[0].pageY;
214
+ }
215
+
216
+ diff = e.touches[0].pageY - startYMove;
217
+
218
+ if(diff > 0){
219
+ if(nextRow && diff - nextRowHeightLast > nextRowHeight){
220
+ moveToRow = nextRow;
221
+
222
+ if(moveToRow !== row){
223
+ startYMove = e.touches[0].pageY;
224
+ moveToRow.getElement().parentNode.insertBefore(this.placeholderElement, moveToRow.getElement().nextSibling);
225
+ this.moveRow(moveToRow, true);
226
+ }
227
+ }
228
+ }else{
229
+ if(prevRow && -diff - prevRowHeightLast > prevRowHeight){
230
+ moveToRow = prevRow;
231
+
232
+ if(moveToRow !== row){
233
+ startYMove = e.touches[0].pageY;
234
+ moveToRow.getElement().parentNode.insertBefore(this.placeholderElement, moveToRow.getElement());
235
+ this.moveRow(moveToRow, false);
236
+ }
237
+ }
238
+ }
239
+
240
+ if(moveToRow){
241
+ nextRow = moveToRow.nextRow();
242
+ nextRowHeightLast = nextRowHeight;
243
+ nextRowHeight = nextRow ? nextRow.getHeight() / 2 : 0;
244
+ prevRow = moveToRow.prevRow();
245
+ prevRowHeightLast = prevRowHeight;
246
+ prevRowHeight = prevRow ? prevRow.getHeight() / 2 : 0;
247
+ }
248
+ }
249
+ });
250
+
251
+ element.addEventListener("touchend", (e) => {
252
+ if(this.checkTimeout){
253
+ clearTimeout(this.checkTimeout);
254
+ }
255
+ if(this.moving){
256
+ this.endMove(e);
257
+ this.touchMove = false;
258
+ }
259
+ });
260
+ }
261
+
262
+ _bindMouseMove(){
263
+ this.table.rowManager.getDisplayRows().forEach((row) => {
264
+ if((row.type === "row" || row.type === "group") && row.modules.moveRow && row.modules.moveRow.mousemove){
265
+ row.getElement().addEventListener("mousemove", row.modules.moveRow.mousemove);
266
+ }
267
+ });
268
+ }
269
+
270
+ _unbindMouseMove(){
271
+ this.table.rowManager.getDisplayRows().forEach((row) => {
272
+ if((row.type === "row" || row.type === "group") && row.modules.moveRow && row.modules.moveRow.mousemove){
273
+ row.getElement().removeEventListener("mousemove", row.modules.moveRow.mousemove);
274
+ }
275
+ });
276
+ }
277
+
278
+ startMove(e, row){
279
+ var element = row.getElement();
280
+
281
+ this.setStartPosition(e, row);
282
+
283
+ this.moving = row;
284
+
285
+ this.table.element.classList.add("tabulator-block-select");
286
+
287
+ //create placeholder
288
+ this.placeholderElement.style.width = row.getWidth() + "px";
289
+ this.placeholderElement.style.height = row.getHeight() + "px";
290
+
291
+ if(!this.connection){
292
+ element.parentNode.insertBefore(this.placeholderElement, element);
293
+ element.parentNode.removeChild(element);
294
+ }else{
295
+ this.table.element.classList.add("tabulator-movingrow-sending");
296
+ this.connectToTables(row);
297
+ }
298
+
299
+ //create hover element
300
+ this.hoverElement = element.cloneNode(true);
301
+ this.hoverElement.classList.add("tabulator-moving");
302
+
303
+ if(this.connection){
304
+ document.body.appendChild(this.hoverElement);
305
+ this.hoverElement.style.left = "0";
306
+ this.hoverElement.style.top = "0";
307
+ this.hoverElement.style.width = this.table.element.clientWidth + "px";
308
+ this.hoverElement.style.whiteSpace = "nowrap";
309
+ this.hoverElement.style.overflow = "hidden";
310
+ this.hoverElement.style.pointerEvents = "none";
311
+ }else{
312
+ this.table.rowManager.getTableElement().appendChild(this.hoverElement);
313
+
314
+ this.hoverElement.style.left = "0";
315
+ this.hoverElement.style.top = "0";
316
+
317
+ this._bindMouseMove();
318
+ }
319
+
320
+ document.body.addEventListener("mousemove", this.moveHover);
321
+ document.body.addEventListener("mouseup", this.endMove);
322
+
323
+ this.dispatchExternal("rowMoving", row.getComponent());
324
+
325
+ this.moveHover(e);
326
+ }
327
+
328
+ setStartPosition(e, row){
329
+ var pageX = this.touchMove ? e.touches[0].pageX : e.pageX,
330
+ pageY = this.touchMove ? e.touches[0].pageY : e.pageY,
331
+ element, position;
332
+
333
+ element = row.getElement();
334
+ if(this.connection){
335
+ position = element.getBoundingClientRect();
336
+
337
+ this.startX = position.left - pageX + window.pageXOffset;
338
+ this.startY = position.top - pageY + window.pageYOffset;
339
+ }else{
340
+ this.startY = (pageY - element.getBoundingClientRect().top);
341
+ }
342
+ }
343
+
344
+ endMove(e){
345
+ if(!e || e.which === 1 || this.touchMove){
346
+ this._unbindMouseMove();
347
+
348
+ if(!this.connection){
349
+ this.placeholderElement.parentNode.insertBefore(this.moving.getElement(), this.placeholderElement.nextSibling);
350
+ this.placeholderElement.parentNode.removeChild(this.placeholderElement);
351
+ }
352
+
353
+ this.hoverElement.parentNode.removeChild(this.hoverElement);
354
+
355
+ this.table.element.classList.remove("tabulator-block-select");
356
+
357
+ if(this.toRow){
358
+ this.table.rowManager.moveRow(this.moving, this.toRow, this.toRowAfter);
359
+ }else{
360
+ this.dispatchExternal("rowMoveCancelled", this.moving.getComponent());
361
+ }
362
+
363
+ this.moving = false;
364
+ this.toRow = false;
365
+ this.toRowAfter = false;
366
+
367
+ document.body.removeEventListener("mousemove", this.moveHover);
368
+ document.body.removeEventListener("mouseup", this.endMove);
369
+
370
+ if(this.connection){
371
+ this.table.element.classList.remove("tabulator-movingrow-sending");
372
+ this.disconnectFromTables();
373
+ }
374
+ }
375
+ }
376
+
377
+ moveRow(row, after){
378
+ this.toRow = row;
379
+ this.toRowAfter = after;
380
+ }
381
+
382
+ moveHover(e){
383
+ if(this.connection){
384
+ this.moveHoverConnections.call(this, e);
385
+ }else{
386
+ this.moveHoverTable.call(this, e);
387
+ }
388
+ }
389
+
390
+ moveHoverTable(e){
391
+ var rowHolder = this.table.rowManager.getElement(),
392
+ scrollTop = rowHolder.scrollTop,
393
+ yPos = ((this.touchMove ? e.touches[0].pageY : e.pageY) - rowHolder.getBoundingClientRect().top) + scrollTop;
394
+
395
+ this.hoverElement.style.top = Math.min(yPos - this.startY, this.table.rowManager.element.scrollHeight - this.hoverElement.offsetHeight) + "px";
396
+ }
397
+
398
+ moveHoverConnections(e){
399
+ this.hoverElement.style.left = (this.startX + (this.touchMove ? e.touches[0].pageX : e.pageX)) + "px";
400
+ this.hoverElement.style.top = (this.startY + (this.touchMove ? e.touches[0].pageY : e.pageY)) + "px";
401
+ }
402
+
403
+ elementRowDrop(e, element, row){
404
+ this.dispatchExternal("movableRowsElementDrop", e, element, row ? row.getComponent() : false);
405
+ }
406
+
407
+ //establish connection with other tables
408
+ connectToTables(row){
409
+ var connectionTables;
410
+
411
+ if(this.connectionSelectorsTables){
412
+ connectionTables = this.commsConnections(this.connectionSelectorsTables);
413
+
414
+ this.dispatchExternal("movableRowsSendingStart", connectionTables);
415
+
416
+ this.commsSend(this.connectionSelectorsTables, "moveRow", "connect", {
417
+ row:row,
418
+ });
419
+ }
420
+
421
+ if(this.connectionSelectorsElements){
422
+
423
+ this.connectionElements = [];
424
+
425
+ if(!Array.isArray(this.connectionSelectorsElements)){
426
+ this.connectionSelectorsElements = [this.connectionSelectorsElements];
427
+ }
428
+
429
+ this.connectionSelectorsElements.forEach((query) => {
430
+ if(typeof query === "string"){
431
+ this.connectionElements = this.connectionElements.concat(Array.prototype.slice.call(document.querySelectorAll(query)));
432
+ }else{
433
+ this.connectionElements.push(query);
434
+ }
435
+ });
436
+
437
+ this.connectionElements.forEach((element) => {
438
+ var dropEvent = (e) => {
439
+ this.elementRowDrop(e, element, this.moving);
440
+ };
441
+
442
+ element.addEventListener("mouseup", dropEvent);
443
+ element.tabulatorElementDropEvent = dropEvent;
444
+
445
+ element.classList.add("tabulator-movingrow-receiving");
446
+ });
447
+ }
448
+ }
449
+
450
+ //disconnect from other tables
451
+ disconnectFromTables(){
452
+ var connectionTables;
453
+
454
+ if(this.connectionSelectorsTables){
455
+ connectionTables = this.commsConnections(this.connectionSelectorsTables);
456
+
457
+ this.dispatchExternal("movableRowsSendingStop", connectionTables);
458
+
459
+ this.commsSend(this.connectionSelectorsTables, "moveRow", "disconnect");
460
+ }
461
+
462
+ this.connectionElements.forEach((element) => {
463
+ element.classList.remove("tabulator-movingrow-receiving");
464
+ element.removeEventListener("mouseup", element.tabulatorElementDropEvent);
465
+ delete element.tabulatorElementDropEvent;
466
+ });
467
+ }
468
+
469
+ //accept incomming connection
470
+ connect(table, row){
471
+ if(!this.connectedTable){
472
+ this.connectedTable = table;
473
+ this.connectedRow = row;
474
+
475
+ this.table.element.classList.add("tabulator-movingrow-receiving");
476
+
477
+ this.table.rowManager.getDisplayRows().forEach((row) => {
478
+ if(row.type === "row" && row.modules.moveRow && row.modules.moveRow.mouseup){
479
+ row.getElement().addEventListener("mouseup", row.modules.moveRow.mouseup);
480
+ }
481
+ });
482
+
483
+ this.tableRowDropEvent = this.tableRowDrop.bind(this);
484
+
485
+ this.table.element.addEventListener("mouseup", this.tableRowDropEvent);
486
+
487
+ this.dispatchExternal("movableRowsReceivingStart", row, table);
488
+
489
+ return true;
490
+ }else{
491
+ console.warn("Move Row Error - Table cannot accept connection, already connected to table:", this.connectedTable);
492
+ return false;
493
+ }
494
+ }
495
+
496
+ //close incoming connection
497
+ disconnect(table){
498
+ if(table === this.connectedTable){
499
+ this.connectedTable = false;
500
+ this.connectedRow = false;
501
+
502
+ this.table.element.classList.remove("tabulator-movingrow-receiving");
503
+
504
+ this.table.rowManager.getDisplayRows().forEach((row) =>{
505
+ if(row.type === "row" && row.modules.moveRow && row.modules.moveRow.mouseup){
506
+ row.getElement().removeEventListener("mouseup", row.modules.moveRow.mouseup);
507
+ }
508
+ });
509
+
510
+ this.table.element.removeEventListener("mouseup", this.tableRowDropEvent);
511
+
512
+ this.dispatchExternal("movableRowsReceivingStop", table);
513
+ }else{
514
+ console.warn("Move Row Error - trying to disconnect from non connected table");
515
+ }
516
+ }
517
+
518
+ dropComplete(table, row, success){
519
+ var sender = false;
520
+
521
+ if(success){
522
+
523
+ switch(typeof this.table.options.movableRowsSender){
524
+ case "string":
525
+ sender = this.senders[this.table.options.movableRowsSender];
526
+ break;
527
+
528
+ case "function":
529
+ sender = this.table.options.movableRowsSender;
530
+ break;
531
+ }
532
+
533
+ if(sender){
534
+ sender.call(this, this.moving ? this.moving.getComponent() : undefined, row ? row.getComponent() : undefined, table);
535
+ }else{
536
+ if(this.table.options.movableRowsSender){
537
+ console.warn("Mover Row Error - no matching sender found:", this.table.options.movableRowsSender);
538
+ }
539
+ }
540
+
541
+ this.dispatchExternal("movableRowsSent", this.moving.getComponent(), row ? row.getComponent() : undefined, table);
542
+ }else{
543
+ this.dispatchExternal("movableRowsSentFailed", this.moving.getComponent(), row ? row.getComponent() : undefined, table);
544
+ }
545
+
546
+ this.endMove();
547
+ }
548
+
549
+ tableRowDrop(e, row){
550
+ var receiver = false,
551
+ success = false;
552
+
553
+ e.stopImmediatePropagation();
554
+
555
+ switch(typeof this.table.options.movableRowsReceiver){
556
+ case "string":
557
+ receiver = this.receivers[this.table.options.movableRowsReceiver];
558
+ break;
559
+
560
+ case "function":
561
+ receiver = this.table.options.movableRowsReceiver;
562
+ break;
563
+ }
564
+
565
+ if(receiver){
566
+ success = receiver.call(this, this.connectedRow.getComponent(), row ? row.getComponent() : undefined, this.connectedTable);
567
+ }else{
568
+ console.warn("Mover Row Error - no matching receiver found:", this.table.options.movableRowsReceiver);
569
+ }
570
+
571
+ if(success){
572
+ this.dispatchExternal("movableRowsReceived", this.connectedRow.getComponent(), row ? row.getComponent() : undefined, this.connectedTable);
573
+ }else{
574
+ this.dispatchExternal("movableRowsReceivedFailed", this.connectedRow.getComponent(), row ? row.getComponent() : undefined, this.connectedTable);
575
+ }
576
+
577
+ this.commsSend(this.connectedTable, "moveRow", "dropcomplete", {
578
+ row:row,
579
+ success:success,
580
+ });
581
+ }
582
+
583
+ commsReceived(table, action, data){
584
+ switch(action){
585
+ case "connect":
586
+ return this.connect(table, data.row);
587
+
588
+ case "disconnect":
589
+ return this.disconnect(table);
590
+
591
+ case "dropcomplete":
592
+ return this.dropComplete(table, data.row, data.success);
593
+ }
594
+ }
595
+ }
596
+
597
+ MoveRows.prototype.receivers = {
598
+ insert:function(fromRow, toRow, fromTable){
599
+ this.table.addRow(fromRow.getData(), undefined, toRow);
600
+ return true;
601
+ },
602
+
603
+ add:function(fromRow, toRow, fromTable){
604
+ this.table.addRow(fromRow.getData());
605
+ return true;
606
+ },
607
+
608
+ update:function(fromRow, toRow, fromTable){
609
+ if(toRow){
610
+ toRow.update(fromRow.getData());
611
+ return true;
612
+ }
613
+
614
+ return false;
615
+ },
616
+
617
+ replace:function(fromRow, toRow, fromTable){
618
+ if(toRow){
619
+ this.table.addRow(fromRow.getData(), undefined, toRow);
620
+ toRow.delete();
621
+ return true;
622
+ }
623
+
624
+ return false;
625
+ },
626
+ };
627
+
628
+ MoveRows.prototype.senders = {
629
+ delete:function(fromRow, toRow, toTable){
630
+ fromRow.delete();
631
+ }
632
+ };
633
+
634
+ MoveRows.moduleName = "moveRow";
635
+
636
636
  export default MoveRows;