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,305 +1,305 @@
1
- import CoreFeature from '../CoreFeature.js';
2
- import Helpers from './Helpers.js';
3
-
4
- export default class Popup extends CoreFeature{
5
- constructor(table, element, parent){
6
- super(table);
7
-
8
- this.element = element;
9
- this.container = this._lookupContainer();
10
-
11
- this.parent = parent;
12
-
13
- this.reversedX = false;
14
- this.childPopup = null;
15
- this.blurable = false;
16
- this.blurCallback = null;
17
- this.blurEventsBound = false;
18
- this.renderedCallback = null;
19
-
20
- this.visible = false;
21
- this.hideable = true;
22
-
23
- this.element.classList.add("tabulator-popup-container");
24
-
25
- this.blurEvent = this.hide.bind(this, false);
26
- this.escEvent = this._escapeCheck.bind(this);
27
-
28
- this.destroyBinding = this.tableDestroyed.bind(this);
29
- this.destroyed = false;
30
- }
31
-
32
- tableDestroyed(){
33
- this.destroyed = true;
34
- this.hide(true);
35
- }
36
-
37
- _lookupContainer(){
38
- var container = this.table.options.popupContainer;
39
-
40
- if(typeof container === "string"){
41
- container = document.querySelector(container);
42
-
43
- if(!container){
44
- console.warn("Menu Error - no container element found matching selector:", this.table.options.popupContainer , "(defaulting to document body)");
45
- }
46
- }else if (container === true){
47
- container = this.table.element;
48
- }
49
-
50
- if(container && !this._checkContainerIsParent(container)){
51
- container = false;
52
- console.warn("Menu Error - container element does not contain this table:", this.table.options.popupContainer , "(defaulting to document body)");
53
- }
54
-
55
- if(!container){
56
- container = document.body;
57
- }
58
-
59
- return container;
60
- }
61
-
62
- _checkContainerIsParent(container, element = this.table.element){
63
- if(container === element){
64
- return true;
65
- }else{
66
- return element.parentNode ? this._checkContainerIsParent(container, element.parentNode) : false;
67
- }
68
- }
69
-
70
- renderCallback(callback){
71
- this.renderedCallback = callback;
72
- }
73
-
74
- containerEventCoords(e){
75
- var touch = !(e instanceof MouseEvent);
76
-
77
- var x = touch ? e.touches[0].pageX : e.pageX;
78
- var y = touch ? e.touches[0].pageY : e.pageY;
79
-
80
- if(this.container !== document.body){
81
- let parentOffset = Helpers.elOffset(this.container);
82
-
83
- x -= parentOffset.left;
84
- y -= parentOffset.top;
85
- }
86
-
87
- return {x, y};
88
- }
89
-
90
- elementPositionCoords(element, position = "right"){
91
- var offset = Helpers.elOffset(element),
92
- containerOffset, x, y;
93
-
94
- if(this.container !== document.body){
95
- containerOffset = Helpers.elOffset(this.container);
96
-
97
- offset.left -= containerOffset.left;
98
- offset.top -= containerOffset.top;
99
- }
100
-
101
- switch(position){
102
- case "right":
103
- x = offset.left + element.offsetWidth;
104
- y = offset.top - 1;
105
- break;
106
-
107
- case "bottom":
108
- x = offset.left;
109
- y = offset.top + element.offsetHeight;
110
- break;
111
-
112
- case "left":
113
- x = offset.left;
114
- y = offset.top - 1;
115
- break;
116
-
117
- case "top":
118
- x = offset.left;
119
- y = offset.top;
120
- break;
121
-
122
- case "center":
123
- x = offset.left + (element.offsetWidth / 2);
124
- y = offset.top + (element.offsetHeight / 2);
125
- break;
126
-
127
- }
128
-
129
- return {x, y, offset};
130
- }
131
-
132
- show(origin, position){
133
- var x, y, parentEl, parentOffset, coords;
134
-
135
- if(this.destroyed || this.table.destroyed){
136
- return this;
137
- }
138
-
139
- if(origin instanceof HTMLElement){
140
- parentEl = origin;
141
- coords = this.elementPositionCoords(origin, position);
142
-
143
- parentOffset = coords.offset;
144
- x = coords.x;
145
- y = coords.y;
146
-
147
- }else if(typeof origin === "number"){
148
- parentOffset = {top:0, left:0};
149
- x = origin;
150
- y = position;
151
- }else{
152
- coords = this.containerEventCoords(origin);
153
-
154
- x = coords.x;
155
- y = coords.y;
156
-
157
- this.reversedX = false;
158
- }
159
-
160
- this.element.style.top = y + "px";
161
- this.element.style.left = x + "px";
162
-
163
- this.container.appendChild(this.element);
164
-
165
- if(typeof this.renderedCallback === "function"){
166
- this.renderedCallback();
167
- }
168
-
169
- this._fitToScreen(x, y, parentEl, parentOffset, position);
170
-
171
- this.visible = true;
172
-
173
- this.subscribe("table-destroy", this.destroyBinding);
174
-
175
- this.element.addEventListener("mousedown", (e) => {
176
- e.stopPropagation();
177
- });
178
-
179
- return this;
180
- }
181
-
182
- _fitToScreen(x, y, parentEl, parentOffset, position){
183
- var scrollTop = this.container === document.body ? document.documentElement.scrollTop : this.container.scrollTop;
184
-
185
- //move menu to start on right edge if it is too close to the edge of the screen
186
- if((x + this.element.offsetWidth) >= this.container.offsetWidth || this.reversedX){
187
- this.element.style.left = "";
188
-
189
- if(parentEl){
190
- this.element.style.right = (this.container.offsetWidth - parentOffset.left) + "px";
191
- }else{
192
- this.element.style.right = (this.container.offsetWidth - x) + "px";
193
- }
194
-
195
- this.reversedX = true;
196
- }
197
-
198
- //move menu to start on bottom edge if it is too close to the edge of the screen
199
- if((y + this.element.offsetHeight) > Math.max(this.container.offsetHeight, scrollTop ? this.container.scrollHeight : 0)) {
200
- if(parentEl){
201
- switch(position){
202
- case "bottom":
203
- this.element.style.top = (parseInt(this.element.style.top) - this.element.offsetHeight - parentEl.offsetHeight - 1) + "px";
204
- break;
205
-
206
- default:
207
- this.element.style.top = (parseInt(this.element.style.top) - this.element.offsetHeight + parentEl.offsetHeight + 1) + "px";
208
- }
209
-
210
- }else{
211
- this.element.style.top = (parseInt(this.element.style.top) - this.element.offsetHeight) + "px";
212
- }
213
- }
214
- }
215
-
216
- isVisible(){
217
- return this.visible;
218
- }
219
-
220
- hideOnBlur(callback){
221
- this.blurable = true;
222
-
223
- if(this.visible){
224
- setTimeout(() => {
225
- if(this.visible){
226
- this.table.rowManager.element.addEventListener("scroll", this.blurEvent);
227
- this.subscribe("cell-editing", this.blurEvent);
228
- document.body.addEventListener("click", this.blurEvent);
229
- document.body.addEventListener("contextmenu", this.blurEvent);
230
- document.body.addEventListener("mousedown", this.blurEvent);
231
- window.addEventListener("resize", this.blurEvent);
232
- document.body.addEventListener("keydown", this.escEvent);
233
-
234
- this.blurEventsBound = true;
235
- }
236
- }, 100);
237
-
238
- this.blurCallback = callback;
239
- }
240
-
241
- return this;
242
- }
243
-
244
- _escapeCheck(e){
245
- if(e.keyCode == 27){
246
- this.hide();
247
- }
248
- }
249
-
250
- blockHide(){
251
- this.hideable = false;
252
- }
253
-
254
- restoreHide(){
255
- this.hideable = true;
256
- }
257
-
258
- hide(silent = false){
259
- if(this.visible && this.hideable){
260
- if(this.blurable && this.blurEventsBound){
261
- document.body.removeEventListener("keydown", this.escEvent);
262
- document.body.removeEventListener("click", this.blurEvent);
263
- document.body.removeEventListener("contextmenu", this.blurEvent);
264
- document.body.removeEventListener("mousedown", this.blurEvent);
265
- window.removeEventListener("resize", this.blurEvent);
266
- this.table.rowManager.element.removeEventListener("scroll", this.blurEvent);
267
- this.unsubscribe("cell-editing", this.blurEvent);
268
-
269
- this.blurEventsBound = false;
270
- }
271
-
272
- if(this.childPopup){
273
- this.childPopup.hide();
274
- }
275
-
276
- if(this.parent){
277
- this.parent.childPopup = null;
278
- }
279
-
280
- if(this.element.parentNode){
281
- this.element.parentNode.removeChild(this.element);
282
- }
283
-
284
- this.visible = false;
285
-
286
- if(this.blurCallback && !silent){
287
- this.blurCallback();
288
- }
289
-
290
- this.unsubscribe("table-destroy", this.destroyBinding);
291
- }
292
-
293
- return this;
294
- }
295
-
296
- child(element){
297
- if(this.childPopup){
298
- this.childPopup.hide();
299
- }
300
-
301
- this.childPopup = new Popup(this.table, element, this);
302
-
303
- return this.childPopup;
304
- }
1
+ import CoreFeature from '../CoreFeature.js';
2
+ import Helpers from './Helpers.js';
3
+
4
+ export default class Popup extends CoreFeature{
5
+ constructor(table, element, parent){
6
+ super(table);
7
+
8
+ this.element = element;
9
+ this.container = this._lookupContainer();
10
+
11
+ this.parent = parent;
12
+
13
+ this.reversedX = false;
14
+ this.childPopup = null;
15
+ this.blurable = false;
16
+ this.blurCallback = null;
17
+ this.blurEventsBound = false;
18
+ this.renderedCallback = null;
19
+
20
+ this.visible = false;
21
+ this.hideable = true;
22
+
23
+ this.element.classList.add("tabulator-popup-container");
24
+
25
+ this.blurEvent = this.hide.bind(this, false);
26
+ this.escEvent = this._escapeCheck.bind(this);
27
+
28
+ this.destroyBinding = this.tableDestroyed.bind(this);
29
+ this.destroyed = false;
30
+ }
31
+
32
+ tableDestroyed(){
33
+ this.destroyed = true;
34
+ this.hide(true);
35
+ }
36
+
37
+ _lookupContainer(){
38
+ var container = this.table.options.popupContainer;
39
+
40
+ if(typeof container === "string"){
41
+ container = document.querySelector(container);
42
+
43
+ if(!container){
44
+ console.warn("Menu Error - no container element found matching selector:", this.table.options.popupContainer , "(defaulting to document body)");
45
+ }
46
+ }else if (container === true){
47
+ container = this.table.element;
48
+ }
49
+
50
+ if(container && !this._checkContainerIsParent(container)){
51
+ container = false;
52
+ console.warn("Menu Error - container element does not contain this table:", this.table.options.popupContainer , "(defaulting to document body)");
53
+ }
54
+
55
+ if(!container){
56
+ container = document.body;
57
+ }
58
+
59
+ return container;
60
+ }
61
+
62
+ _checkContainerIsParent(container, element = this.table.element){
63
+ if(container === element){
64
+ return true;
65
+ }else{
66
+ return element.parentNode ? this._checkContainerIsParent(container, element.parentNode) : false;
67
+ }
68
+ }
69
+
70
+ renderCallback(callback){
71
+ this.renderedCallback = callback;
72
+ }
73
+
74
+ containerEventCoords(e){
75
+ var touch = !(e instanceof MouseEvent);
76
+
77
+ var x = touch ? e.touches[0].pageX : e.pageX;
78
+ var y = touch ? e.touches[0].pageY : e.pageY;
79
+
80
+ if(this.container !== document.body){
81
+ let parentOffset = Helpers.elOffset(this.container);
82
+
83
+ x -= parentOffset.left;
84
+ y -= parentOffset.top;
85
+ }
86
+
87
+ return {x, y};
88
+ }
89
+
90
+ elementPositionCoords(element, position = "right"){
91
+ var offset = Helpers.elOffset(element),
92
+ containerOffset, x, y;
93
+
94
+ if(this.container !== document.body){
95
+ containerOffset = Helpers.elOffset(this.container);
96
+
97
+ offset.left -= containerOffset.left;
98
+ offset.top -= containerOffset.top;
99
+ }
100
+
101
+ switch(position){
102
+ case "right":
103
+ x = offset.left + element.offsetWidth;
104
+ y = offset.top - 1;
105
+ break;
106
+
107
+ case "bottom":
108
+ x = offset.left;
109
+ y = offset.top + element.offsetHeight;
110
+ break;
111
+
112
+ case "left":
113
+ x = offset.left;
114
+ y = offset.top - 1;
115
+ break;
116
+
117
+ case "top":
118
+ x = offset.left;
119
+ y = offset.top;
120
+ break;
121
+
122
+ case "center":
123
+ x = offset.left + (element.offsetWidth / 2);
124
+ y = offset.top + (element.offsetHeight / 2);
125
+ break;
126
+
127
+ }
128
+
129
+ return {x, y, offset};
130
+ }
131
+
132
+ show(origin, position){
133
+ var x, y, parentEl, parentOffset, coords;
134
+
135
+ if(this.destroyed || this.table.destroyed){
136
+ return this;
137
+ }
138
+
139
+ if(origin instanceof HTMLElement){
140
+ parentEl = origin;
141
+ coords = this.elementPositionCoords(origin, position);
142
+
143
+ parentOffset = coords.offset;
144
+ x = coords.x;
145
+ y = coords.y;
146
+
147
+ }else if(typeof origin === "number"){
148
+ parentOffset = {top:0, left:0};
149
+ x = origin;
150
+ y = position;
151
+ }else{
152
+ coords = this.containerEventCoords(origin);
153
+
154
+ x = coords.x;
155
+ y = coords.y;
156
+
157
+ this.reversedX = false;
158
+ }
159
+
160
+ this.element.style.top = y + "px";
161
+ this.element.style.left = x + "px";
162
+
163
+ this.container.appendChild(this.element);
164
+
165
+ if(typeof this.renderedCallback === "function"){
166
+ this.renderedCallback();
167
+ }
168
+
169
+ this._fitToScreen(x, y, parentEl, parentOffset, position);
170
+
171
+ this.visible = true;
172
+
173
+ this.subscribe("table-destroy", this.destroyBinding);
174
+
175
+ this.element.addEventListener("mousedown", (e) => {
176
+ e.stopPropagation();
177
+ });
178
+
179
+ return this;
180
+ }
181
+
182
+ _fitToScreen(x, y, parentEl, parentOffset, position){
183
+ var scrollTop = this.container === document.body ? document.documentElement.scrollTop : this.container.scrollTop;
184
+
185
+ //move menu to start on right edge if it is too close to the edge of the screen
186
+ if((x + this.element.offsetWidth) >= this.container.offsetWidth || this.reversedX){
187
+ this.element.style.left = "";
188
+
189
+ if(parentEl){
190
+ this.element.style.right = (this.container.offsetWidth - parentOffset.left) + "px";
191
+ }else{
192
+ this.element.style.right = (this.container.offsetWidth - x) + "px";
193
+ }
194
+
195
+ this.reversedX = true;
196
+ }
197
+
198
+ //move menu to start on bottom edge if it is too close to the edge of the screen
199
+ if((y + this.element.offsetHeight) > Math.max(this.container.offsetHeight, scrollTop ? this.container.scrollHeight : 0)) {
200
+ if(parentEl){
201
+ switch(position){
202
+ case "bottom":
203
+ this.element.style.top = (parseInt(this.element.style.top) - this.element.offsetHeight - parentEl.offsetHeight - 1) + "px";
204
+ break;
205
+
206
+ default:
207
+ this.element.style.top = (parseInt(this.element.style.top) - this.element.offsetHeight + parentEl.offsetHeight + 1) + "px";
208
+ }
209
+
210
+ }else{
211
+ this.element.style.top = (parseInt(this.element.style.top) - this.element.offsetHeight) + "px";
212
+ }
213
+ }
214
+ }
215
+
216
+ isVisible(){
217
+ return this.visible;
218
+ }
219
+
220
+ hideOnBlur(callback){
221
+ this.blurable = true;
222
+
223
+ if(this.visible){
224
+ setTimeout(() => {
225
+ if(this.visible){
226
+ this.table.rowManager.element.addEventListener("scroll", this.blurEvent);
227
+ this.subscribe("cell-editing", this.blurEvent);
228
+ document.body.addEventListener("click", this.blurEvent);
229
+ document.body.addEventListener("contextmenu", this.blurEvent);
230
+ document.body.addEventListener("mousedown", this.blurEvent);
231
+ window.addEventListener("resize", this.blurEvent);
232
+ document.body.addEventListener("keydown", this.escEvent);
233
+
234
+ this.blurEventsBound = true;
235
+ }
236
+ }, 100);
237
+
238
+ this.blurCallback = callback;
239
+ }
240
+
241
+ return this;
242
+ }
243
+
244
+ _escapeCheck(e){
245
+ if(e.keyCode == 27){
246
+ this.hide();
247
+ }
248
+ }
249
+
250
+ blockHide(){
251
+ this.hideable = false;
252
+ }
253
+
254
+ restoreHide(){
255
+ this.hideable = true;
256
+ }
257
+
258
+ hide(silent = false){
259
+ if(this.visible && this.hideable){
260
+ if(this.blurable && this.blurEventsBound){
261
+ document.body.removeEventListener("keydown", this.escEvent);
262
+ document.body.removeEventListener("click", this.blurEvent);
263
+ document.body.removeEventListener("contextmenu", this.blurEvent);
264
+ document.body.removeEventListener("mousedown", this.blurEvent);
265
+ window.removeEventListener("resize", this.blurEvent);
266
+ this.table.rowManager.element.removeEventListener("scroll", this.blurEvent);
267
+ this.unsubscribe("cell-editing", this.blurEvent);
268
+
269
+ this.blurEventsBound = false;
270
+ }
271
+
272
+ if(this.childPopup){
273
+ this.childPopup.hide();
274
+ }
275
+
276
+ if(this.parent){
277
+ this.parent.childPopup = null;
278
+ }
279
+
280
+ if(this.element.parentNode){
281
+ this.element.parentNode.removeChild(this.element);
282
+ }
283
+
284
+ this.visible = false;
285
+
286
+ if(this.blurCallback && !silent){
287
+ this.blurCallback();
288
+ }
289
+
290
+ this.unsubscribe("table-destroy", this.destroyBinding);
291
+ }
292
+
293
+ return this;
294
+ }
295
+
296
+ child(element){
297
+ if(this.childPopup){
298
+ this.childPopup.hide();
299
+ }
300
+
301
+ this.childPopup = new Popup(this.table, element, this);
302
+
303
+ return this.childPopup;
304
+ }
305
305
  }