gridstack 8.0.1 → 8.1.0

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 (193) hide show
  1. package/README.md +13 -11
  2. package/dist/dd-base-impl.d.ts +1 -1
  3. package/dist/dd-base-impl.js +1 -1
  4. package/dist/dd-base-impl.js.map +1 -1
  5. package/dist/dd-draggable.d.ts +3 -2
  6. package/dist/dd-draggable.js +9 -8
  7. package/dist/dd-draggable.js.map +1 -1
  8. package/dist/dd-droppable.d.ts +1 -1
  9. package/dist/dd-droppable.js +1 -1
  10. package/dist/dd-droppable.js.map +1 -1
  11. package/dist/dd-element.d.ts +1 -1
  12. package/dist/dd-element.js +1 -1
  13. package/dist/dd-element.js.map +1 -1
  14. package/dist/dd-gridstack.d.ts +1 -1
  15. package/dist/dd-gridstack.js +1 -1
  16. package/dist/dd-gridstack.js.map +1 -1
  17. package/dist/dd-manager.d.ts +1 -1
  18. package/dist/dd-manager.js +1 -1
  19. package/dist/dd-manager.js.map +1 -1
  20. package/dist/dd-resizable-handle.d.ts +1 -1
  21. package/dist/dd-resizable-handle.js +1 -1
  22. package/dist/dd-resizable-handle.js.map +1 -1
  23. package/dist/dd-resizable.d.ts +1 -1
  24. package/dist/dd-resizable.js +1 -1
  25. package/dist/dd-resizable.js.map +1 -1
  26. package/dist/dd-touch.d.ts +1 -1
  27. package/dist/dd-touch.js +1 -1
  28. package/dist/dd-touch.js.map +1 -1
  29. package/dist/es5/dd-base-impl.d.ts +1 -1
  30. package/dist/es5/dd-base-impl.js +1 -1
  31. package/dist/es5/dd-base-impl.js.map +1 -1
  32. package/dist/es5/dd-draggable.d.ts +3 -2
  33. package/dist/es5/dd-draggable.js +9 -8
  34. package/dist/es5/dd-draggable.js.map +1 -1
  35. package/dist/es5/dd-droppable.d.ts +1 -1
  36. package/dist/es5/dd-droppable.js +1 -1
  37. package/dist/es5/dd-droppable.js.map +1 -1
  38. package/dist/es5/dd-element.d.ts +1 -1
  39. package/dist/es5/dd-element.js +1 -1
  40. package/dist/es5/dd-element.js.map +1 -1
  41. package/dist/es5/dd-gridstack.d.ts +1 -1
  42. package/dist/es5/dd-gridstack.js +1 -1
  43. package/dist/es5/dd-gridstack.js.map +1 -1
  44. package/dist/es5/dd-manager.d.ts +1 -1
  45. package/dist/es5/dd-manager.js +1 -1
  46. package/dist/es5/dd-manager.js.map +1 -1
  47. package/dist/es5/dd-resizable-handle.d.ts +1 -1
  48. package/dist/es5/dd-resizable-handle.js +1 -1
  49. package/dist/es5/dd-resizable-handle.js.map +1 -1
  50. package/dist/es5/dd-resizable.d.ts +1 -1
  51. package/dist/es5/dd-resizable.js +1 -1
  52. package/dist/es5/dd-resizable.js.map +1 -1
  53. package/dist/es5/dd-touch.d.ts +1 -1
  54. package/dist/es5/dd-touch.js +1 -1
  55. package/dist/es5/dd-touch.js.map +1 -1
  56. package/dist/es5/gridstack-all.js +1 -1
  57. package/dist/es5/gridstack-all.js.LICENSE.txt +1 -1
  58. package/dist/es5/gridstack-all.js.map +1 -1
  59. package/dist/es5/gridstack-engine.d.ts +1 -1
  60. package/dist/es5/gridstack-engine.js +1 -1
  61. package/dist/es5/gridstack-engine.js.map +1 -1
  62. package/dist/es5/gridstack-poly.js +1 -1
  63. package/dist/es5/gridstack.d.ts +3 -3
  64. package/dist/es5/gridstack.js +4 -13
  65. package/dist/es5/gridstack.js.map +1 -1
  66. package/dist/es5/types.d.ts +5 -3
  67. package/dist/es5/types.js +1 -1
  68. package/dist/es5/types.js.map +1 -1
  69. package/dist/es5/utils.d.ts +3 -3
  70. package/dist/es5/utils.js +12 -10
  71. package/dist/es5/utils.js.map +1 -1
  72. package/dist/gridstack-all.js +1 -1
  73. package/dist/gridstack-all.js.LICENSE.txt +1 -1
  74. package/dist/gridstack-all.js.map +1 -1
  75. package/dist/gridstack-engine.d.ts +1 -1
  76. package/dist/gridstack-engine.js +1 -1
  77. package/dist/gridstack-engine.js.map +1 -1
  78. package/dist/gridstack-extra.css +180 -240
  79. package/dist/gridstack-extra.min.css +1 -1
  80. package/dist/gridstack.css +95 -118
  81. package/dist/gridstack.d.ts +3 -3
  82. package/dist/gridstack.js +4 -13
  83. package/dist/gridstack.js.map +1 -1
  84. package/dist/gridstack.min.css +1 -1
  85. package/dist/ng/gridstack-item.component.d.ts +1 -1
  86. package/dist/ng/gridstack-item.component.js +1 -1
  87. package/dist/ng/gridstack.component.d.ts +1 -1
  88. package/dist/ng/gridstack.component.js +1 -1
  89. package/dist/src/gridstack-extra.scss +9 -11
  90. package/dist/src/gridstack.scss +108 -97
  91. package/dist/types.d.ts +5 -3
  92. package/dist/types.js +1 -1
  93. package/dist/types.js.map +1 -1
  94. package/dist/utils.d.ts +3 -3
  95. package/dist/utils.js +12 -10
  96. package/dist/utils.js.map +1 -1
  97. package/doc/CHANGES.md +7 -0
  98. package/doc/README.md +5 -4
  99. package/package.json +1 -1
  100. package/dist_save/angular/README.md +0 -94
  101. package/dist_save/angular/gridstack-item.component.ts +0 -72
  102. package/dist_save/angular/gridstack.component.ts +0 -199
  103. package/dist_save/dd-base-impl.d.ts +0 -20
  104. package/dist_save/dd-base-impl.js +0 -36
  105. package/dist_save/dd-base-impl.js.map +0 -1
  106. package/dist_save/dd-draggable.d.ts +0 -28
  107. package/dist_save/dd-draggable.js +0 -343
  108. package/dist_save/dd-draggable.js.map +0 -1
  109. package/dist_save/dd-droppable.d.ts +0 -26
  110. package/dist_save/dd-droppable.js +0 -149
  111. package/dist_save/dd-droppable.js.map +0 -1
  112. package/dist_save/dd-element.d.ts +0 -27
  113. package/dist_save/dd-element.js +0 -95
  114. package/dist_save/dd-element.js.map +0 -1
  115. package/dist_save/dd-gridstack.d.ts +0 -34
  116. package/dist_save/dd-gridstack.js +0 -125
  117. package/dist_save/dd-gridstack.js.map +0 -1
  118. package/dist_save/dd-manager.d.ts +0 -22
  119. package/dist_save/dd-manager.js +0 -14
  120. package/dist_save/dd-manager.js.map +0 -1
  121. package/dist_save/dd-resizable-handle.d.ts +0 -14
  122. package/dist_save/dd-resizable-handle.js +0 -106
  123. package/dist_save/dd-resizable-handle.js.map +0 -1
  124. package/dist_save/dd-resizable.d.ts +0 -28
  125. package/dist_save/dd-resizable.js +0 -294
  126. package/dist_save/dd-resizable.js.map +0 -1
  127. package/dist_save/dd-touch.d.ts +0 -33
  128. package/dist_save/dd-touch.js +0 -183
  129. package/dist_save/dd-touch.js.map +0 -1
  130. package/dist_save/es5/dd-base-impl.d.ts +0 -20
  131. package/dist_save/es5/dd-base-impl.js +0 -41
  132. package/dist_save/es5/dd-base-impl.js.map +0 -1
  133. package/dist_save/es5/dd-draggable.d.ts +0 -28
  134. package/dist_save/es5/dd-draggable.js +0 -366
  135. package/dist_save/es5/dd-draggable.js.map +0 -1
  136. package/dist_save/es5/dd-droppable.d.ts +0 -26
  137. package/dist_save/es5/dd-droppable.js +0 -180
  138. package/dist_save/es5/dd-droppable.js.map +0 -1
  139. package/dist_save/es5/dd-element.d.ts +0 -27
  140. package/dist_save/es5/dd-element.js +0 -96
  141. package/dist_save/es5/dd-element.js.map +0 -1
  142. package/dist_save/es5/dd-gridstack.d.ts +0 -34
  143. package/dist_save/es5/dd-gridstack.js +0 -145
  144. package/dist_save/es5/dd-gridstack.js.map +0 -1
  145. package/dist_save/es5/dd-manager.d.ts +0 -22
  146. package/dist_save/es5/dd-manager.js +0 -17
  147. package/dist_save/es5/dd-manager.js.map +0 -1
  148. package/dist_save/es5/dd-resizable-handle.d.ts +0 -14
  149. package/dist_save/es5/dd-resizable-handle.js +0 -107
  150. package/dist_save/es5/dd-resizable-handle.js.map +0 -1
  151. package/dist_save/es5/dd-resizable.d.ts +0 -28
  152. package/dist_save/es5/dd-resizable.js +0 -316
  153. package/dist_save/es5/dd-resizable.js.map +0 -1
  154. package/dist_save/es5/dd-touch.d.ts +0 -33
  155. package/dist_save/es5/dd-touch.js +0 -186
  156. package/dist_save/es5/dd-touch.js.map +0 -1
  157. package/dist_save/es5/gridstack-all.js +0 -3
  158. package/dist_save/es5/gridstack-all.js.LICENSE.txt +0 -7
  159. package/dist_save/es5/gridstack-all.js.map +0 -1
  160. package/dist_save/es5/gridstack-engine.d.ts +0 -102
  161. package/dist_save/es5/gridstack-engine.js +0 -997
  162. package/dist_save/es5/gridstack-engine.js.map +0 -1
  163. package/dist_save/es5/gridstack-poly.js +0 -356
  164. package/dist_save/es5/gridstack.d.ts +0 -376
  165. package/dist_save/es5/gridstack.js +0 -2238
  166. package/dist_save/es5/gridstack.js.map +0 -1
  167. package/dist_save/es5/types.d.ts +0 -284
  168. package/dist_save/es5/types.js +0 -36
  169. package/dist_save/es5/types.js.map +0 -1
  170. package/dist_save/es5/utils.d.ts +0 -95
  171. package/dist_save/es5/utils.js +0 -590
  172. package/dist_save/es5/utils.js.map +0 -1
  173. package/dist_save/gridstack-all.js +0 -3
  174. package/dist_save/gridstack-all.js.LICENSE.txt +0 -7
  175. package/dist_save/gridstack-all.js.map +0 -1
  176. package/dist_save/gridstack-engine.d.ts +0 -102
  177. package/dist_save/gridstack-engine.js +0 -956
  178. package/dist_save/gridstack-engine.js.map +0 -1
  179. package/dist_save/gridstack-extra.css +0 -433
  180. package/dist_save/gridstack-extra.min.css +0 -1
  181. package/dist_save/gridstack.css +0 -226
  182. package/dist_save/gridstack.d.ts +0 -376
  183. package/dist_save/gridstack.js +0 -2162
  184. package/dist_save/gridstack.js.map +0 -1
  185. package/dist_save/gridstack.min.css +0 -1
  186. package/dist_save/src/gridstack-extra.scss +0 -27
  187. package/dist_save/src/gridstack.scss +0 -131
  188. package/dist_save/types.d.ts +0 -284
  189. package/dist_save/types.js +0 -36
  190. package/dist_save/types.js.map +0 -1
  191. package/dist_save/utils.d.ts +0 -95
  192. package/dist_save/utils.js +0 -548
  193. package/dist_save/utils.js.map +0 -1
@@ -1,548 +0,0 @@
1
- "use strict";
2
- /**
3
- * utils.ts 7.3.0-dev
4
- * Copyright (c) 2021 Alain Dumesny - see GridStack root license
5
- */
6
- Object.defineProperty(exports, "__esModule", { value: true });
7
- exports.Utils = exports.obsoleteAttr = exports.obsoleteOptsDel = exports.obsoleteOpts = exports.obsolete = void 0;
8
- /** checks for obsolete method names */
9
- // eslint-disable-next-line
10
- function obsolete(self, f, oldName, newName, rev) {
11
- let wrapper = (...args) => {
12
- console.warn('gridstack.js: Function `' + oldName + '` is deprecated in ' + rev + ' and has been replaced ' +
13
- 'with `' + newName + '`. It will be **removed** in a future release');
14
- return f.apply(self, args);
15
- };
16
- wrapper.prototype = f.prototype;
17
- return wrapper;
18
- }
19
- exports.obsolete = obsolete;
20
- /** checks for obsolete grid options (can be used for any fields, but msg is about options) */
21
- function obsoleteOpts(opts, oldName, newName, rev) {
22
- if (opts[oldName] !== undefined) {
23
- opts[newName] = opts[oldName];
24
- console.warn('gridstack.js: Option `' + oldName + '` is deprecated in ' + rev + ' and has been replaced with `' +
25
- newName + '`. It will be **removed** in a future release');
26
- }
27
- }
28
- exports.obsoleteOpts = obsoleteOpts;
29
- /** checks for obsolete grid options which are gone */
30
- function obsoleteOptsDel(opts, oldName, rev, info) {
31
- if (opts[oldName] !== undefined) {
32
- console.warn('gridstack.js: Option `' + oldName + '` is deprecated in ' + rev + info);
33
- }
34
- }
35
- exports.obsoleteOptsDel = obsoleteOptsDel;
36
- /** checks for obsolete Jquery element attributes */
37
- function obsoleteAttr(el, oldName, newName, rev) {
38
- let oldAttr = el.getAttribute(oldName);
39
- if (oldAttr !== null) {
40
- el.setAttribute(newName, oldAttr);
41
- console.warn('gridstack.js: attribute `' + oldName + '`=' + oldAttr + ' is deprecated on this object in ' + rev + ' and has been replaced with `' +
42
- newName + '`. It will be **removed** in a future release');
43
- }
44
- }
45
- exports.obsoleteAttr = obsoleteAttr;
46
- /**
47
- * Utility methods
48
- */
49
- class Utils {
50
- /** convert a potential selector into actual list of html elements */
51
- static getElements(els) {
52
- if (typeof els === 'string') {
53
- let list = document.querySelectorAll(els);
54
- if (!list.length && els[0] !== '.' && els[0] !== '#') {
55
- list = document.querySelectorAll('.' + els);
56
- if (!list.length) {
57
- list = document.querySelectorAll('#' + els);
58
- }
59
- }
60
- return Array.from(list);
61
- }
62
- return [els];
63
- }
64
- /** convert a potential selector into actual single element */
65
- static getElement(els) {
66
- if (typeof els === 'string') {
67
- if (!els.length)
68
- return null;
69
- if (els[0] === '#') {
70
- return document.getElementById(els.substring(1));
71
- }
72
- if (els[0] === '.' || els[0] === '[') {
73
- return document.querySelector(els);
74
- }
75
- // if we start with a digit, assume it's an id (error calling querySelector('#1')) as class are not valid CSS
76
- if (!isNaN(+els[0])) { // start with digit
77
- return document.getElementById(els);
78
- }
79
- // finally try string, then id then class
80
- let el = document.querySelector(els);
81
- if (!el) {
82
- el = document.getElementById(els);
83
- }
84
- if (!el) {
85
- el = document.querySelector('.' + els);
86
- }
87
- return el;
88
- }
89
- return els;
90
- }
91
- /** returns true if a and b overlap */
92
- static isIntercepted(a, b) {
93
- return !(a.y >= b.y + b.h || a.y + a.h <= b.y || a.x + a.w <= b.x || a.x >= b.x + b.w);
94
- }
95
- /** returns true if a and b touch edges or corners */
96
- static isTouching(a, b) {
97
- return Utils.isIntercepted(a, { x: b.x - 0.5, y: b.y - 0.5, w: b.w + 1, h: b.h + 1 });
98
- }
99
- /** returns the area a and b overlap */
100
- static areaIntercept(a, b) {
101
- let x0 = (a.x > b.x) ? a.x : b.x;
102
- let x1 = (a.x + a.w < b.x + b.w) ? a.x + a.w : b.x + b.w;
103
- if (x1 <= x0)
104
- return 0; // no overlap
105
- let y0 = (a.y > b.y) ? a.y : b.y;
106
- let y1 = (a.y + a.h < b.y + b.h) ? a.y + a.h : b.y + b.h;
107
- if (y1 <= y0)
108
- return 0; // no overlap
109
- return (x1 - x0) * (y1 - y0);
110
- }
111
- /** returns the area */
112
- static area(a) {
113
- return a.w * a.h;
114
- }
115
- /**
116
- * Sorts array of nodes
117
- * @param nodes array to sort
118
- * @param dir 1 for asc, -1 for desc (optional)
119
- * @param width width of the grid. If undefined the width will be calculated automatically (optional).
120
- **/
121
- static sort(nodes, dir, column) {
122
- column = column || nodes.reduce((col, n) => Math.max(n.x + n.w, col), 0) || 12;
123
- if (dir === -1)
124
- return nodes.sort((a, b) => (b.x + b.y * column) - (a.x + a.y * column));
125
- else
126
- return nodes.sort((b, a) => (b.x + b.y * column) - (a.x + a.y * column));
127
- }
128
- /**
129
- * creates a style sheet with style id under given parent
130
- * @param id will set the 'gs-style-id' attribute to that id
131
- * @param parent to insert the stylesheet as first child,
132
- * if none supplied it will be appended to the document head instead.
133
- */
134
- static createStylesheet(id, parent, options) {
135
- let style = document.createElement('style');
136
- const nonce = options === null || options === void 0 ? void 0 : options.nonce;
137
- if (nonce)
138
- style.nonce = nonce;
139
- style.setAttribute('type', 'text/css');
140
- style.setAttribute('gs-style-id', id);
141
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
142
- if (style.styleSheet) { // TODO: only CSSImportRule have that and different beast ??
143
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
144
- style.styleSheet.cssText = '';
145
- }
146
- else {
147
- style.appendChild(document.createTextNode('')); // WebKit hack
148
- }
149
- if (!parent) {
150
- // default to head
151
- parent = document.getElementsByTagName('head')[0];
152
- parent.appendChild(style);
153
- }
154
- else {
155
- parent.insertBefore(style, parent.firstChild);
156
- }
157
- return style.sheet;
158
- }
159
- /** removed the given stylesheet id */
160
- static removeStylesheet(id) {
161
- let el = document.querySelector('STYLE[gs-style-id=' + id + ']');
162
- if (el && el.parentNode)
163
- el.remove();
164
- }
165
- /** inserts a CSS rule */
166
- static addCSSRule(sheet, selector, rules) {
167
- if (typeof sheet.addRule === 'function') {
168
- sheet.addRule(selector, rules);
169
- }
170
- else if (typeof sheet.insertRule === 'function') {
171
- sheet.insertRule(`${selector}{${rules}}`);
172
- }
173
- }
174
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
175
- static toBool(v) {
176
- if (typeof v === 'boolean') {
177
- return v;
178
- }
179
- if (typeof v === 'string') {
180
- v = v.toLowerCase();
181
- return !(v === '' || v === 'no' || v === 'false' || v === '0');
182
- }
183
- return Boolean(v);
184
- }
185
- static toNumber(value) {
186
- return (value === null || value.length === 0) ? undefined : Number(value);
187
- }
188
- static parseHeight(val) {
189
- let h;
190
- let unit = 'px';
191
- if (typeof val === 'string') {
192
- let match = val.match(/^(-[0-9]+\.[0-9]+|[0-9]*\.[0-9]+|-[0-9]+|[0-9]+)(px|em|rem|vh|vw|%)?$/);
193
- if (!match) {
194
- throw new Error('Invalid height');
195
- }
196
- unit = match[2] || 'px';
197
- h = parseFloat(match[1]);
198
- }
199
- else {
200
- h = val;
201
- }
202
- return { h, unit };
203
- }
204
- /** copies unset fields in target to use the given default sources values */
205
- // eslint-disable-next-line
206
- static defaults(target, ...sources) {
207
- sources.forEach(source => {
208
- for (const key in source) {
209
- if (!source.hasOwnProperty(key))
210
- return;
211
- if (target[key] === null || target[key] === undefined) {
212
- target[key] = source[key];
213
- }
214
- else if (typeof source[key] === 'object' && typeof target[key] === 'object') {
215
- // property is an object, recursively add it's field over... #1373
216
- this.defaults(target[key], source[key]);
217
- }
218
- }
219
- });
220
- return target;
221
- }
222
- /** given 2 objects return true if they have the same values. Checks for Object {} having same fields and values (just 1 level down) */
223
- static same(a, b) {
224
- if (typeof a !== 'object')
225
- return a == b;
226
- if (typeof a !== typeof b)
227
- return false;
228
- // else we have object, check just 1 level deep for being same things...
229
- if (Object.keys(a).length !== Object.keys(b).length)
230
- return false;
231
- for (const key in a) {
232
- if (a[key] !== b[key])
233
- return false;
234
- }
235
- return true;
236
- }
237
- /** copies over b size & position (GridStackPosition), and optionally min/max as well */
238
- static copyPos(a, b, doMinMax = false) {
239
- if (b.x !== undefined)
240
- a.x = b.x;
241
- if (b.y !== undefined)
242
- a.y = b.y;
243
- if (b.w !== undefined)
244
- a.w = b.w;
245
- if (b.h !== undefined)
246
- a.h = b.h;
247
- if (doMinMax) {
248
- if (b.minW)
249
- a.minW = b.minW;
250
- if (b.minH)
251
- a.minH = b.minH;
252
- if (b.maxW)
253
- a.maxW = b.maxW;
254
- if (b.maxH)
255
- a.maxH = b.maxH;
256
- }
257
- return a;
258
- }
259
- /** true if a and b has same size & position */
260
- static samePos(a, b) {
261
- return a && b && a.x === b.x && a.y === b.y && a.w === b.w && a.h === b.h;
262
- }
263
- /** given a node, makes sure it's min/max are valid */
264
- static sanitizeMinMax(node) {
265
- // remove 0, undefine, null
266
- if (!node.minW) {
267
- delete node.minW;
268
- }
269
- if (!node.minH) {
270
- delete node.minH;
271
- }
272
- if (!node.maxW) {
273
- delete node.maxW;
274
- }
275
- if (!node.maxH) {
276
- delete node.maxH;
277
- }
278
- }
279
- /** removes field from the first object if same as the second objects (like diffing) and internal '_' for saving */
280
- static removeInternalAndSame(a, b) {
281
- if (typeof a !== 'object' || typeof b !== 'object')
282
- return;
283
- for (let key in a) {
284
- let val = a[key];
285
- if (key[0] === '_' || val === b[key]) {
286
- delete a[key];
287
- }
288
- else if (val && typeof val === 'object' && b[key] !== undefined) {
289
- for (let i in val) {
290
- if (val[i] === b[key][i] || i[0] === '_') {
291
- delete val[i];
292
- }
293
- }
294
- if (!Object.keys(val).length) {
295
- delete a[key];
296
- }
297
- }
298
- }
299
- }
300
- /** removes internal fields '_' and default values for saving */
301
- static removeInternalForSave(n, removeEl = true) {
302
- for (let key in n) {
303
- if (key[0] === '_' || n[key] === null || n[key] === undefined)
304
- delete n[key];
305
- }
306
- delete n.grid;
307
- if (removeEl)
308
- delete n.el;
309
- // delete default values (will be re-created on read)
310
- if (!n.autoPosition)
311
- delete n.autoPosition;
312
- if (!n.noResize)
313
- delete n.noResize;
314
- if (!n.noMove)
315
- delete n.noMove;
316
- if (!n.locked)
317
- delete n.locked;
318
- if (n.w === 1 || n.w === n.minW)
319
- delete n.w;
320
- if (n.h === 1 || n.h === n.minH)
321
- delete n.h;
322
- }
323
- /** return the closest parent (or itself) matching the given class */
324
- static closestUpByClass(el, name) {
325
- while (el) {
326
- if (el.classList.contains(name))
327
- return el;
328
- el = el.parentElement;
329
- }
330
- return null;
331
- }
332
- /** delay calling the given function for given delay, preventing new calls from happening while waiting */
333
- static throttle(func, delay) {
334
- let isWaiting = false;
335
- return (...args) => {
336
- if (!isWaiting) {
337
- isWaiting = true;
338
- setTimeout(() => { func(...args); isWaiting = false; }, delay);
339
- }
340
- };
341
- }
342
- static removePositioningStyles(el) {
343
- let style = el.style;
344
- if (style.position) {
345
- style.removeProperty('position');
346
- }
347
- if (style.left) {
348
- style.removeProperty('left');
349
- }
350
- if (style.top) {
351
- style.removeProperty('top');
352
- }
353
- if (style.width) {
354
- style.removeProperty('width');
355
- }
356
- if (style.height) {
357
- style.removeProperty('height');
358
- }
359
- }
360
- /** @internal returns the passed element if scrollable, else the closest parent that will, up to the entire document scrolling element */
361
- static getScrollElement(el) {
362
- if (!el)
363
- return document.scrollingElement || document.documentElement; // IE support
364
- const style = getComputedStyle(el);
365
- const overflowRegex = /(auto|scroll)/;
366
- if (overflowRegex.test(style.overflow + style.overflowY)) {
367
- return el;
368
- }
369
- else {
370
- return this.getScrollElement(el.parentElement);
371
- }
372
- }
373
- /** @internal */
374
- static updateScrollPosition(el, position, distance) {
375
- // is widget in view?
376
- let rect = el.getBoundingClientRect();
377
- let innerHeightOrClientHeight = (window.innerHeight || document.documentElement.clientHeight);
378
- if (rect.top < 0 ||
379
- rect.bottom > innerHeightOrClientHeight) {
380
- // set scrollTop of first parent that scrolls
381
- // if parent is larger than el, set as low as possible
382
- // to get entire widget on screen
383
- let offsetDiffDown = rect.bottom - innerHeightOrClientHeight;
384
- let offsetDiffUp = rect.top;
385
- let scrollEl = this.getScrollElement(el);
386
- if (scrollEl !== null) {
387
- let prevScroll = scrollEl.scrollTop;
388
- if (rect.top < 0 && distance < 0) {
389
- // moving up
390
- if (el.offsetHeight > innerHeightOrClientHeight) {
391
- scrollEl.scrollTop += distance;
392
- }
393
- else {
394
- scrollEl.scrollTop += Math.abs(offsetDiffUp) > Math.abs(distance) ? distance : offsetDiffUp;
395
- }
396
- }
397
- else if (distance > 0) {
398
- // moving down
399
- if (el.offsetHeight > innerHeightOrClientHeight) {
400
- scrollEl.scrollTop += distance;
401
- }
402
- else {
403
- scrollEl.scrollTop += offsetDiffDown > distance ? distance : offsetDiffDown;
404
- }
405
- }
406
- // move widget y by amount scrolled
407
- position.top += scrollEl.scrollTop - prevScroll;
408
- }
409
- }
410
- }
411
- /**
412
- * @internal Function used to scroll the page.
413
- *
414
- * @param event `MouseEvent` that triggers the resize
415
- * @param el `HTMLElement` that's being resized
416
- * @param distance Distance from the V edges to start scrolling
417
- */
418
- static updateScrollResize(event, el, distance) {
419
- const scrollEl = this.getScrollElement(el);
420
- const height = scrollEl.clientHeight;
421
- // #1727 event.clientY is relative to viewport, so must compare this against position of scrollEl getBoundingClientRect().top
422
- // #1745 Special situation if scrollEl is document 'html': here browser spec states that
423
- // clientHeight is height of viewport, but getBoundingClientRect() is rectangle of html element;
424
- // this discrepancy arises because in reality scrollbar is attached to viewport, not html element itself.
425
- const offsetTop = (scrollEl === this.getScrollElement()) ? 0 : scrollEl.getBoundingClientRect().top;
426
- const pointerPosY = event.clientY - offsetTop;
427
- const top = pointerPosY < distance;
428
- const bottom = pointerPosY > height - distance;
429
- if (top) {
430
- // This also can be done with a timeout to keep scrolling while the mouse is
431
- // in the scrolling zone. (will have smoother behavior)
432
- scrollEl.scrollBy({ behavior: 'smooth', top: pointerPosY - distance });
433
- }
434
- else if (bottom) {
435
- scrollEl.scrollBy({ behavior: 'smooth', top: distance - (height - pointerPosY) });
436
- }
437
- }
438
- /** single level clone, returning a new object with same top fields. This will share sub objects and arrays */
439
- static clone(obj) {
440
- if (obj === null || obj === undefined || typeof (obj) !== 'object') {
441
- return obj;
442
- }
443
- // return Object.assign({}, obj);
444
- if (obj instanceof Array) {
445
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
446
- return [...obj];
447
- }
448
- return Object.assign({}, obj);
449
- }
450
- /**
451
- * Recursive clone version that returns a full copy, checking for nested objects and arrays ONLY.
452
- * Note: this will use as-is any key starting with double __ (and not copy inside) some lib have circular dependencies.
453
- */
454
- static cloneDeep(obj) {
455
- // list of fields we will skip during cloneDeep (nested objects, other internal)
456
- const skipFields = ['parentGrid', 'el', 'grid', 'subGrid', 'engine'];
457
- // return JSON.parse(JSON.stringify(obj)); // doesn't work with date format ?
458
- const ret = Utils.clone(obj);
459
- for (const key in ret) {
460
- // NOTE: we don't support function/circular dependencies so skip those properties for now...
461
- if (ret.hasOwnProperty(key) && typeof (ret[key]) === 'object' && key.substring(0, 2) !== '__' && !skipFields.find(k => k === key)) {
462
- ret[key] = Utils.cloneDeep(obj[key]);
463
- }
464
- }
465
- return ret;
466
- }
467
- /** deep clone the given HTML node, removing teh unique id field */
468
- static cloneNode(el) {
469
- const node = el.cloneNode(true);
470
- node.removeAttribute('id');
471
- return node;
472
- }
473
- static appendTo(el, parent) {
474
- let parentNode;
475
- if (typeof parent === 'string') {
476
- parentNode = document.querySelector(parent);
477
- }
478
- else {
479
- parentNode = parent;
480
- }
481
- if (parentNode) {
482
- parentNode.appendChild(el);
483
- }
484
- }
485
- // public static setPositionRelative(el: HTMLElement): void {
486
- // if (!(/^(?:r|a|f)/).test(window.getComputedStyle(el).position)) {
487
- // el.style.position = "relative";
488
- // }
489
- // }
490
- static addElStyles(el, styles) {
491
- if (styles instanceof Object) {
492
- for (const s in styles) {
493
- if (styles.hasOwnProperty(s)) {
494
- if (Array.isArray(styles[s])) {
495
- // support fallback value
496
- styles[s].forEach(val => {
497
- el.style[s] = val;
498
- });
499
- }
500
- else {
501
- el.style[s] = styles[s];
502
- }
503
- }
504
- }
505
- }
506
- }
507
- static initEvent(e, info) {
508
- const evt = { type: info.type };
509
- const obj = {
510
- button: 0,
511
- which: 0,
512
- buttons: 1,
513
- bubbles: true,
514
- cancelable: true,
515
- target: info.target ? info.target : e.target
516
- };
517
- // don't check for `instanceof DragEvent` as Safari use MouseEvent #1540
518
- if (e.dataTransfer) {
519
- evt['dataTransfer'] = e.dataTransfer; // workaround 'readonly' field.
520
- }
521
- ['altKey', 'ctrlKey', 'metaKey', 'shiftKey'].forEach(p => evt[p] = e[p]); // keys
522
- ['pageX', 'pageY', 'clientX', 'clientY', 'screenX', 'screenY'].forEach(p => evt[p] = e[p]); // point info
523
- return Object.assign(Object.assign({}, evt), obj);
524
- }
525
- /** copies the MouseEvent properties and sends it as another event to the given target */
526
- static simulateMouseEvent(e, simulatedType, target) {
527
- const simulatedEvent = document.createEvent('MouseEvents');
528
- simulatedEvent.initMouseEvent(simulatedType, // type
529
- true, // bubbles
530
- true, // cancelable
531
- window, // view
532
- 1, // detail
533
- e.screenX, // screenX
534
- e.screenY, // screenY
535
- e.clientX, // clientX
536
- e.clientY, // clientY
537
- e.ctrlKey, // ctrlKey
538
- e.altKey, // altKey
539
- e.shiftKey, // shiftKey
540
- e.metaKey, // metaKey
541
- 0, // button
542
- e.target // relatedTarget
543
- );
544
- (target || e.target).dispatchEvent(simulatedEvent);
545
- }
546
- }
547
- exports.Utils = Utils;
548
- //# sourceMappingURL=utils.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"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","sourcesContent":["/**\r\n * utils.ts 7.3.0-dev\r\n * Copyright (c) 2021 Alain Dumesny - see GridStack root license\r\n */\r\n\r\nimport { GridStackElement, GridStackNode, GridStackOptions, numberOrString, GridStackPosition, GridStackWidget } from './types';\r\n\r\nexport interface HeightData {\r\n h: number;\r\n unit: string;\r\n}\r\n\r\n/** checks for obsolete method names */\r\n// eslint-disable-next-line\r\nexport function obsolete(self, f, oldName: string, newName: string, rev: string): (...args: any[]) => any {\r\n let wrapper = (...args) => {\r\n console.warn('gridstack.js: Function `' + oldName + '` is deprecated in ' + rev + ' and has been replaced ' +\r\n 'with `' + newName + '`. It will be **removed** in a future release');\r\n return f.apply(self, args);\r\n }\r\n wrapper.prototype = f.prototype;\r\n return wrapper;\r\n}\r\n\r\n/** checks for obsolete grid options (can be used for any fields, but msg is about options) */\r\nexport function obsoleteOpts(opts: GridStackOptions, oldName: string, newName: string, rev: string): void {\r\n if (opts[oldName] !== undefined) {\r\n opts[newName] = opts[oldName];\r\n console.warn('gridstack.js: Option `' + oldName + '` is deprecated in ' + rev + ' and has been replaced with `' +\r\n newName + '`. It will be **removed** in a future release');\r\n }\r\n}\r\n\r\n/** checks for obsolete grid options which are gone */\r\nexport function obsoleteOptsDel(opts: GridStackOptions, oldName: string, rev: string, info: string): void {\r\n if (opts[oldName] !== undefined) {\r\n console.warn('gridstack.js: Option `' + oldName + '` is deprecated in ' + rev + info);\r\n }\r\n}\r\n\r\n/** checks for obsolete Jquery element attributes */\r\nexport function obsoleteAttr(el: HTMLElement, oldName: string, newName: string, rev: string): void {\r\n let oldAttr = el.getAttribute(oldName);\r\n if (oldAttr !== null) {\r\n el.setAttribute(newName, oldAttr);\r\n console.warn('gridstack.js: attribute `' + oldName + '`=' + oldAttr + ' is deprecated on this object in ' + rev + ' and has been replaced with `' +\r\n newName + '`. It will be **removed** in a future release');\r\n }\r\n}\r\n\r\n/**\r\n * Utility methods\r\n */\r\nexport class Utils {\r\n\r\n /** convert a potential selector into actual list of html elements */\r\n static getElements(els: GridStackElement): HTMLElement[] {\r\n if (typeof els === 'string') {\r\n let list = document.querySelectorAll(els);\r\n if (!list.length && els[0] !== '.' && els[0] !== '#') {\r\n list = document.querySelectorAll('.' + els);\r\n if (!list.length) { list = document.querySelectorAll('#' + els) }\r\n }\r\n return Array.from(list) as HTMLElement[];\r\n }\r\n return [els];\r\n }\r\n\r\n /** convert a potential selector into actual single element */\r\n static getElement(els: GridStackElement): HTMLElement {\r\n if (typeof els === 'string') {\r\n if (!els.length) return null;\r\n if (els[0] === '#') {\r\n return document.getElementById(els.substring(1));\r\n }\r\n if (els[0] === '.' || els[0] === '[') {\r\n return document.querySelector(els);\r\n }\r\n\r\n // if we start with a digit, assume it's an id (error calling querySelector('#1')) as class are not valid CSS\r\n if(!isNaN(+els[0])) { // start with digit\r\n return document.getElementById(els);\r\n }\r\n\r\n // finally try string, then id then class\r\n let el = document.querySelector(els);\r\n if (!el) { el = document.getElementById(els) }\r\n if (!el) { el = document.querySelector('.' + els) }\r\n return el as HTMLElement;\r\n }\r\n return els;\r\n }\r\n\r\n /** returns true if a and b overlap */\r\n static isIntercepted(a: GridStackPosition, b: GridStackPosition): boolean {\r\n return !(a.y >= b.y + b.h || a.y + a.h <= b.y || a.x + a.w <= b.x || a.x >= b.x + b.w);\r\n }\r\n\r\n /** returns true if a and b touch edges or corners */\r\n static isTouching(a: GridStackPosition, b: GridStackPosition): boolean {\r\n return Utils.isIntercepted(a, {x: b.x-0.5, y: b.y-0.5, w: b.w+1, h: b.h+1})\r\n }\r\n\r\n /** returns the area a and b overlap */\r\n static areaIntercept(a: GridStackPosition, b: GridStackPosition): number {\r\n let x0 = (a.x > b.x) ? a.x : b.x;\r\n let x1 = (a.x+a.w < b.x+b.w) ? a.x+a.w : b.x+b.w;\r\n if (x1 <= x0) return 0; // no overlap\r\n let y0 = (a.y > b.y) ? a.y : b.y;\r\n let y1 = (a.y+a.h < b.y+b.h) ? a.y+a.h : b.y+b.h;\r\n if (y1 <= y0) return 0; // no overlap\r\n return (x1-x0) * (y1-y0);\r\n }\r\n\r\n /** returns the area */\r\n static area(a: GridStackPosition): number {\r\n return a.w * a.h;\r\n }\r\n\r\n /**\r\n * Sorts array of nodes\r\n * @param nodes array to sort\r\n * @param dir 1 for asc, -1 for desc (optional)\r\n * @param width width of the grid. If undefined the width will be calculated automatically (optional).\r\n **/\r\n static sort(nodes: GridStackNode[], dir?: -1 | 1, column?: number): GridStackNode[] {\r\n column = column || nodes.reduce((col, n) => Math.max(n.x + n.w, col), 0) || 12;\r\n if (dir === -1)\r\n return nodes.sort((a, b) => (b.x + b.y * column)-(a.x + a.y * column));\r\n else\r\n return nodes.sort((b, a) => (b.x + b.y * column)-(a.x + a.y * column));\r\n }\r\n\r\n /**\r\n * creates a style sheet with style id under given parent\r\n * @param id will set the 'gs-style-id' attribute to that id\r\n * @param parent to insert the stylesheet as first child,\r\n * if none supplied it will be appended to the document head instead.\r\n */\r\n static createStylesheet(id: string, parent?: HTMLElement, options?: { nonce?: string }): CSSStyleSheet {\r\n let style: HTMLStyleElement = document.createElement('style');\r\n const nonce = options?.nonce\r\n if (nonce) style.nonce = nonce\r\n style.setAttribute('type', 'text/css');\r\n style.setAttribute('gs-style-id', id);\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n if ((style as any).styleSheet) { // TODO: only CSSImportRule have that and different beast ??\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n (style as any).styleSheet.cssText = '';\r\n } else {\r\n style.appendChild(document.createTextNode('')); // WebKit hack\r\n }\r\n if (!parent) {\r\n // default to head\r\n parent = document.getElementsByTagName('head')[0];\r\n parent.appendChild(style);\r\n } else {\r\n parent.insertBefore(style, parent.firstChild);\r\n }\r\n return style.sheet as CSSStyleSheet;\r\n }\r\n\r\n /** removed the given stylesheet id */\r\n static removeStylesheet(id: string): void {\r\n let el = document.querySelector('STYLE[gs-style-id=' + id + ']');\r\n if (el && el.parentNode) el.remove();\r\n }\r\n\r\n /** inserts a CSS rule */\r\n static addCSSRule(sheet: CSSStyleSheet, selector: string, rules: string): void {\r\n if (typeof sheet.addRule === 'function') {\r\n sheet.addRule(selector, rules);\r\n } else if (typeof sheet.insertRule === 'function') {\r\n sheet.insertRule(`${selector}{${rules}}`);\r\n }\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n static toBool(v: unknown): boolean {\r\n if (typeof v === 'boolean') {\r\n return v;\r\n }\r\n if (typeof v === 'string') {\r\n v = v.toLowerCase();\r\n return !(v === '' || v === 'no' || v === 'false' || v === '0');\r\n }\r\n return Boolean(v);\r\n }\r\n\r\n static toNumber(value: null | string): number {\r\n return (value === null || value.length === 0) ? undefined : Number(value);\r\n }\r\n\r\n static parseHeight(val: numberOrString): HeightData {\r\n let h: number;\r\n let unit = 'px';\r\n if (typeof val === 'string') {\r\n let match = val.match(/^(-[0-9]+\\.[0-9]+|[0-9]*\\.[0-9]+|-[0-9]+|[0-9]+)(px|em|rem|vh|vw|%)?$/);\r\n if (!match) {\r\n throw new Error('Invalid height');\r\n }\r\n unit = match[2] || 'px';\r\n h = parseFloat(match[1]);\r\n } else {\r\n h = val;\r\n }\r\n return { h, unit };\r\n }\r\n\r\n /** copies unset fields in target to use the given default sources values */\r\n // eslint-disable-next-line\r\n static defaults(target, ...sources): {} {\r\n\r\n sources.forEach(source => {\r\n for (const key in source) {\r\n if (!source.hasOwnProperty(key)) return;\r\n if (target[key] === null || target[key] === undefined) {\r\n target[key] = source[key];\r\n } else if (typeof source[key] === 'object' && typeof target[key] === 'object') {\r\n // property is an object, recursively add it's field over... #1373\r\n this.defaults(target[key], source[key]);\r\n }\r\n }\r\n });\r\n\r\n return target;\r\n }\r\n\r\n /** given 2 objects return true if they have the same values. Checks for Object {} having same fields and values (just 1 level down) */\r\n static same(a: unknown, b: unknown): boolean {\r\n if (typeof a !== 'object') return a == b;\r\n if (typeof a !== typeof b) return false;\r\n // else we have object, check just 1 level deep for being same things...\r\n if (Object.keys(a).length !== Object.keys(b).length) return false;\r\n for (const key in a) {\r\n if (a[key] !== b[key]) return false;\r\n }\r\n return true;\r\n }\r\n\r\n /** copies over b size & position (GridStackPosition), and optionally min/max as well */\r\n static copyPos(a: GridStackWidget, b: GridStackWidget, doMinMax = false): GridStackWidget {\r\n if (b.x !== undefined) a.x = b.x;\r\n if (b.y !== undefined) a.y = b.y;\r\n if (b.w !== undefined) a.w = b.w;\r\n if (b.h !== undefined) a.h = b.h;\r\n if (doMinMax) {\r\n if (b.minW) a.minW = b.minW;\r\n if (b.minH) a.minH = b.minH;\r\n if (b.maxW) a.maxW = b.maxW;\r\n if (b.maxH) a.maxH = b.maxH;\r\n }\r\n return a;\r\n }\r\n\r\n /** true if a and b has same size & position */\r\n static samePos(a: GridStackPosition, b: GridStackPosition): boolean {\r\n return a && b && a.x === b.x && a.y === b.y && a.w === b.w && a.h === b.h;\r\n }\r\n\r\n /** given a node, makes sure it's min/max are valid */\r\n static sanitizeMinMax(node: GridStackNode) {\r\n // remove 0, undefine, null\r\n if (!node.minW) { delete node.minW; }\r\n if (!node.minH) { delete node.minH; }\r\n if (!node.maxW) { delete node.maxW; }\r\n if (!node.maxH) { delete node.maxH; }\r\n }\r\n\r\n /** removes field from the first object if same as the second objects (like diffing) and internal '_' for saving */\r\n static removeInternalAndSame(a: unknown, b: unknown):void {\r\n if (typeof a !== 'object' || typeof b !== 'object') return;\r\n for (let key in a) {\r\n let val = a[key];\r\n if (key[0] === '_' || val === b[key]) {\r\n delete a[key]\r\n } else if (val && typeof val === 'object' && b[key] !== undefined) {\r\n for (let i in val) {\r\n if (val[i] === b[key][i] || i[0] === '_') { delete val[i] }\r\n }\r\n if (!Object.keys(val).length) { delete a[key] }\r\n }\r\n }\r\n }\r\n\r\n /** removes internal fields '_' and default values for saving */\r\n static removeInternalForSave(n: GridStackNode, removeEl = true): void {\r\n for (let key in n) { if (key[0] === '_' || n[key] === null || n[key] === undefined ) delete n[key]; }\r\n delete n.grid;\r\n if (removeEl) delete n.el;\r\n // delete default values (will be re-created on read)\r\n if (!n.autoPosition) delete n.autoPosition;\r\n if (!n.noResize) delete n.noResize;\r\n if (!n.noMove) delete n.noMove;\r\n if (!n.locked) delete n.locked;\r\n if (n.w === 1 || n.w === n.minW) delete n.w;\r\n if (n.h === 1 || n.h === n.minH) delete n.h;\r\n }\r\n\r\n /** return the closest parent (or itself) matching the given class */\r\n static closestUpByClass(el: HTMLElement, name: string): HTMLElement {\r\n while (el) {\r\n if (el.classList.contains(name)) return el;\r\n el = el.parentElement\r\n }\r\n return null;\r\n }\r\n\r\n /** delay calling the given function for given delay, preventing new calls from happening while waiting */\r\n static throttle(func: () => void, delay: number): () => void {\r\n let isWaiting = false;\r\n return (...args) => {\r\n if (!isWaiting) {\r\n isWaiting = true;\r\n setTimeout(() => { func(...args); isWaiting = false; }, delay);\r\n }\r\n }\r\n }\r\n\r\n static removePositioningStyles(el: HTMLElement): void {\r\n let style = el.style;\r\n if (style.position) {\r\n style.removeProperty('position');\r\n }\r\n if (style.left) {\r\n style.removeProperty('left');\r\n }\r\n if (style.top) {\r\n style.removeProperty('top');\r\n }\r\n if (style.width) {\r\n style.removeProperty('width');\r\n }\r\n if (style.height) {\r\n style.removeProperty('height');\r\n }\r\n }\r\n\r\n /** @internal returns the passed element if scrollable, else the closest parent that will, up to the entire document scrolling element */\r\n static getScrollElement(el?: HTMLElement): HTMLElement {\r\n if (!el) return document.scrollingElement as HTMLElement || document.documentElement; // IE support\r\n const style = getComputedStyle(el);\r\n const overflowRegex = /(auto|scroll)/;\r\n\r\n if (overflowRegex.test(style.overflow + style.overflowY)) {\r\n return el;\r\n } else {\r\n return this.getScrollElement(el.parentElement);\r\n }\r\n }\r\n\r\n /** @internal */\r\n static updateScrollPosition(el: HTMLElement, position: {top: number}, distance: number): void {\r\n // is widget in view?\r\n let rect = el.getBoundingClientRect();\r\n let innerHeightOrClientHeight = (window.innerHeight || document.documentElement.clientHeight);\r\n if (rect.top < 0 ||\r\n rect.bottom > innerHeightOrClientHeight\r\n ) {\r\n // set scrollTop of first parent that scrolls\r\n // if parent is larger than el, set as low as possible\r\n // to get entire widget on screen\r\n let offsetDiffDown = rect.bottom - innerHeightOrClientHeight;\r\n let offsetDiffUp = rect.top;\r\n let scrollEl = this.getScrollElement(el);\r\n if (scrollEl !== null) {\r\n let prevScroll = scrollEl.scrollTop;\r\n if (rect.top < 0 && distance < 0) {\r\n // moving up\r\n if (el.offsetHeight > innerHeightOrClientHeight) {\r\n scrollEl.scrollTop += distance;\r\n } else {\r\n scrollEl.scrollTop += Math.abs(offsetDiffUp) > Math.abs(distance) ? distance : offsetDiffUp;\r\n }\r\n } else if (distance > 0) {\r\n // moving down\r\n if (el.offsetHeight > innerHeightOrClientHeight) {\r\n scrollEl.scrollTop += distance;\r\n } else {\r\n scrollEl.scrollTop += offsetDiffDown > distance ? distance : offsetDiffDown;\r\n }\r\n }\r\n // move widget y by amount scrolled\r\n position.top += scrollEl.scrollTop - prevScroll;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * @internal Function used to scroll the page.\r\n *\r\n * @param event `MouseEvent` that triggers the resize\r\n * @param el `HTMLElement` that's being resized\r\n * @param distance Distance from the V edges to start scrolling\r\n */\r\n static updateScrollResize(event: MouseEvent, el: HTMLElement, distance: number): void {\r\n const scrollEl = this.getScrollElement(el);\r\n const height = scrollEl.clientHeight;\r\n // #1727 event.clientY is relative to viewport, so must compare this against position of scrollEl getBoundingClientRect().top\r\n // #1745 Special situation if scrollEl is document 'html': here browser spec states that\r\n // clientHeight is height of viewport, but getBoundingClientRect() is rectangle of html element;\r\n // this discrepancy arises because in reality scrollbar is attached to viewport, not html element itself.\r\n const offsetTop = (scrollEl === this.getScrollElement()) ? 0 : scrollEl.getBoundingClientRect().top;\r\n const pointerPosY = event.clientY - offsetTop;\r\n const top = pointerPosY < distance;\r\n const bottom = pointerPosY > height - distance;\r\n\r\n if (top) {\r\n // This also can be done with a timeout to keep scrolling while the mouse is\r\n // in the scrolling zone. (will have smoother behavior)\r\n scrollEl.scrollBy({ behavior: 'smooth', top: pointerPosY - distance});\r\n } else if (bottom) {\r\n scrollEl.scrollBy({ behavior: 'smooth', top: distance - (height - pointerPosY)});\r\n }\r\n }\r\n\r\n /** single level clone, returning a new object with same top fields. This will share sub objects and arrays */\r\n static clone<T>(obj: T): T {\r\n if (obj === null || obj === undefined || typeof(obj) !== 'object') {\r\n return obj;\r\n }\r\n // return Object.assign({}, obj);\r\n if (obj instanceof Array) {\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n return [...obj] as any;\r\n }\r\n return {...obj};\r\n }\r\n\r\n /**\r\n * Recursive clone version that returns a full copy, checking for nested objects and arrays ONLY.\r\n * Note: this will use as-is any key starting with double __ (and not copy inside) some lib have circular dependencies.\r\n */\r\n static cloneDeep<T>(obj: T): T {\r\n // list of fields we will skip during cloneDeep (nested objects, other internal)\r\n const skipFields = ['parentGrid', 'el', 'grid', 'subGrid', 'engine'];\r\n // return JSON.parse(JSON.stringify(obj)); // doesn't work with date format ?\r\n const ret = Utils.clone(obj);\r\n for (const key in ret) {\r\n // NOTE: we don't support function/circular dependencies so skip those properties for now...\r\n if (ret.hasOwnProperty(key) && typeof(ret[key]) === 'object' && key.substring(0, 2) !== '__' && !skipFields.find(k => k === key)) {\r\n ret[key] = Utils.cloneDeep(obj[key]);\r\n }\r\n }\r\n return ret;\r\n }\r\n\r\n /** deep clone the given HTML node, removing teh unique id field */\r\n public static cloneNode(el: HTMLElement): HTMLElement {\r\n const node = el.cloneNode(true) as HTMLElement;\r\n node.removeAttribute('id');\r\n return node;\r\n }\r\n\r\n public static appendTo(el: HTMLElement, parent: string | HTMLElement | Node): void {\r\n let parentNode: HTMLElement;\r\n if (typeof parent === 'string') {\r\n parentNode = document.querySelector(parent as string);\r\n } else {\r\n parentNode = parent as HTMLElement;\r\n }\r\n if (parentNode) {\r\n parentNode.appendChild(el);\r\n }\r\n }\r\n\r\n // public static setPositionRelative(el: HTMLElement): void {\r\n // if (!(/^(?:r|a|f)/).test(window.getComputedStyle(el).position)) {\r\n // el.style.position = \"relative\";\r\n // }\r\n // }\r\n\r\n public static addElStyles(el: HTMLElement, styles: { [prop: string]: string | string[] }): void {\r\n if (styles instanceof Object) {\r\n for (const s in styles) {\r\n if (styles.hasOwnProperty(s)) {\r\n if (Array.isArray(styles[s])) {\r\n // support fallback value\r\n (styles[s] as string[]).forEach(val => {\r\n el.style[s] = val;\r\n });\r\n } else {\r\n el.style[s] = styles[s];\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n public static initEvent<T>(e: DragEvent | MouseEvent, info: { type: string; target?: EventTarget }): T {\r\n const evt = { type: info.type };\r\n const obj = {\r\n button: 0,\r\n which: 0,\r\n buttons: 1,\r\n bubbles: true,\r\n cancelable: true,\r\n target: info.target ? info.target : e.target\r\n };\r\n // don't check for `instanceof DragEvent` as Safari use MouseEvent #1540\r\n if ((e as DragEvent).dataTransfer) {\r\n evt['dataTransfer'] = (e as DragEvent).dataTransfer; // workaround 'readonly' field.\r\n }\r\n ['altKey','ctrlKey','metaKey','shiftKey'].forEach(p => evt[p] = e[p]); // keys\r\n ['pageX','pageY','clientX','clientY','screenX','screenY'].forEach(p => evt[p] = e[p]); // point info\r\n return {...evt, ...obj} as unknown as T;\r\n }\r\n\r\n /** copies the MouseEvent properties and sends it as another event to the given target */\r\n public static simulateMouseEvent(e: MouseEvent, simulatedType: string, target?: EventTarget): void {\r\n const simulatedEvent = document.createEvent('MouseEvents');\r\n simulatedEvent.initMouseEvent(\r\n simulatedType, // type\r\n true, // bubbles\r\n true, // cancelable\r\n window, // view\r\n 1, // detail\r\n e.screenX, // screenX\r\n e.screenY, // screenY\r\n e.clientX, // clientX\r\n e.clientY, // clientY\r\n e.ctrlKey, // ctrlKey\r\n e.altKey, // altKey\r\n e.shiftKey, // shiftKey\r\n e.metaKey, // metaKey\r\n 0, // button\r\n e.target // relatedTarget\r\n );\r\n (target || e.target).dispatchEvent(simulatedEvent);\r\n }\r\n\r\n /** returns true if event is inside the given element rectangle */\r\n // Note: Safari Mac has null event.relatedTarget which causes #1684 so check if DragEvent is inside the coordinates instead\r\n // this.el.contains(event.relatedTarget as HTMLElement)\r\n // public static inside(e: MouseEvent, el: HTMLElement): boolean {\r\n // // srcElement, toElement, target: all set to placeholder when leaving simple grid, so we can't use that (Chrome)\r\n // let target: HTMLElement = e.relatedTarget || (e as any).fromElement;\r\n // if (!target) {\r\n // const { bottom, left, right, top } = el.getBoundingClientRect();\r\n // return (e.x < right && e.x > left && e.y < bottom && e.y > top);\r\n // }\r\n // return el.contains(target);\r\n // }\r\n}\r\n"]}