gridstack 4.3.0 → 5.0.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 (126) hide show
  1. package/README.md +22 -5
  2. package/dist/es5/gridstack-dd.d.ts +35 -0
  3. package/dist/es5/gridstack-dd.js +686 -0
  4. package/dist/es5/gridstack-dd.js.map +1 -0
  5. package/dist/es5/gridstack-ddi.d.ts +17 -0
  6. package/dist/es5/gridstack-ddi.js +31 -0
  7. package/dist/es5/gridstack-ddi.js.map +1 -0
  8. package/dist/es5/gridstack-engine.d.ts +93 -0
  9. package/dist/es5/gridstack-engine.js +955 -0
  10. package/dist/es5/gridstack-engine.js.map +1 -0
  11. package/dist/es5/gridstack-h5.d.ts +10 -0
  12. package/dist/es5/gridstack-h5.js +3 -0
  13. package/dist/es5/gridstack-h5.js.LICENSE.txt +7 -0
  14. package/dist/es5/gridstack-h5.js.map +1 -0
  15. package/dist/es5/gridstack-jq.d.ts +10 -0
  16. package/dist/es5/gridstack-jq.js +3 -0
  17. package/dist/es5/gridstack-jq.js.LICENSE.txt +99 -0
  18. package/dist/es5/gridstack-jq.js.map +1 -0
  19. package/dist/{gridstack-poly.js → es5/gridstack-poly.js} +154 -3
  20. package/dist/es5/gridstack-static.d.ts +9 -0
  21. package/dist/es5/gridstack-static.js +3 -0
  22. package/dist/es5/gridstack-static.js.LICENSE.txt +7 -0
  23. package/dist/es5/gridstack-static.js.map +1 -0
  24. package/dist/es5/gridstack.d.ts +346 -0
  25. package/dist/es5/gridstack.js +1517 -0
  26. package/dist/es5/gridstack.js.map +1 -0
  27. package/dist/es5/h5/dd-base-impl.d.ts +20 -0
  28. package/dist/es5/h5/dd-base-impl.js +43 -0
  29. package/dist/es5/h5/dd-base-impl.js.map +1 -0
  30. package/dist/es5/h5/dd-draggable.d.ts +29 -0
  31. package/dist/es5/h5/dd-draggable.js +329 -0
  32. package/dist/es5/h5/dd-draggable.js.map +1 -0
  33. package/dist/es5/h5/dd-droppable.d.ts +24 -0
  34. package/dist/es5/h5/dd-droppable.js +199 -0
  35. package/dist/es5/h5/dd-droppable.js.map +1 -0
  36. package/dist/es5/h5/dd-element.d.ts +27 -0
  37. package/dist/es5/h5/dd-element.js +96 -0
  38. package/dist/es5/h5/dd-element.js.map +1 -0
  39. package/dist/es5/h5/dd-manager.d.ts +8 -0
  40. package/dist/es5/h5/dd-manager.js +14 -0
  41. package/dist/es5/h5/dd-manager.js.map +1 -0
  42. package/dist/es5/h5/dd-resizable-handle.d.ts +14 -0
  43. package/dist/es5/h5/dd-resizable-handle.js +83 -0
  44. package/dist/es5/h5/dd-resizable-handle.js.map +1 -0
  45. package/dist/es5/h5/dd-resizable.d.ts +28 -0
  46. package/dist/es5/h5/dd-resizable.js +301 -0
  47. package/dist/es5/h5/dd-resizable.js.map +1 -0
  48. package/dist/es5/h5/dd-utils.d.ts +19 -0
  49. package/dist/es5/h5/dd-utils.js +111 -0
  50. package/dist/es5/h5/dd-utils.js.map +1 -0
  51. package/dist/es5/h5/gridstack-dd-native.d.ts +26 -0
  52. package/dist/es5/h5/gridstack-dd-native.js +175 -0
  53. package/dist/es5/h5/gridstack-dd-native.js.map +1 -0
  54. package/dist/es5/jq/gridstack-dd-jqueryui.d.ts +22 -0
  55. package/dist/es5/jq/gridstack-dd-jqueryui.js +162 -0
  56. package/dist/es5/jq/gridstack-dd-jqueryui.js.map +1 -0
  57. package/dist/es5/types.d.ts +263 -0
  58. package/dist/es5/types.js +7 -0
  59. package/dist/es5/types.js.map +1 -0
  60. package/dist/es5/utils.d.ts +73 -0
  61. package/dist/es5/utils.js +445 -0
  62. package/dist/es5/utils.js.map +1 -0
  63. package/dist/gridstack-dd.d.ts +1 -1
  64. package/dist/gridstack-dd.js +27 -16
  65. package/dist/gridstack-dd.js.map +1 -1
  66. package/dist/gridstack-ddi.d.ts +1 -1
  67. package/dist/gridstack-ddi.js +1 -1
  68. package/dist/gridstack-ddi.js.map +1 -1
  69. package/dist/gridstack-engine.d.ts +3 -2
  70. package/dist/gridstack-engine.js +83 -53
  71. package/dist/gridstack-engine.js.map +1 -1
  72. package/dist/gridstack-h5.d.ts +1 -1
  73. package/dist/gridstack-h5.js +1 -1
  74. package/dist/gridstack-h5.js.LICENSE.txt +1 -1
  75. package/dist/gridstack-h5.js.map +1 -1
  76. package/dist/gridstack-jq.d.ts +1 -1
  77. package/dist/gridstack-jq.js +1 -1
  78. package/dist/gridstack-jq.js.LICENSE.txt +1 -1
  79. package/dist/gridstack-jq.js.map +1 -1
  80. package/dist/gridstack-static.d.ts +1 -1
  81. package/dist/gridstack-static.js +1 -1
  82. package/dist/gridstack-static.js.LICENSE.txt +1 -1
  83. package/dist/gridstack-static.js.map +1 -1
  84. package/dist/gridstack.css +1 -5
  85. package/dist/gridstack.d.ts +2 -2
  86. package/dist/gridstack.js +81 -44
  87. package/dist/gridstack.js.map +1 -1
  88. package/dist/gridstack.min.css +1 -1
  89. package/dist/h5/dd-base-impl.d.ts +1 -1
  90. package/dist/h5/dd-base-impl.js +1 -1
  91. package/dist/h5/dd-base-impl.js.map +1 -1
  92. package/dist/h5/dd-draggable.d.ts +1 -2
  93. package/dist/h5/dd-draggable.js +26 -16
  94. package/dist/h5/dd-draggable.js.map +1 -1
  95. package/dist/h5/dd-droppable.d.ts +2 -1
  96. package/dist/h5/dd-droppable.js +42 -25
  97. package/dist/h5/dd-droppable.js.map +1 -1
  98. package/dist/h5/dd-element.d.ts +1 -1
  99. package/dist/h5/dd-element.js +1 -1
  100. package/dist/h5/dd-element.js.map +1 -1
  101. package/dist/h5/dd-manager.d.ts +1 -1
  102. package/dist/h5/dd-manager.js +1 -1
  103. package/dist/h5/dd-manager.js.map +1 -1
  104. package/dist/h5/dd-resizable-handle.d.ts +1 -1
  105. package/dist/h5/dd-resizable-handle.js +1 -1
  106. package/dist/h5/dd-resizable-handle.js.map +1 -1
  107. package/dist/h5/dd-resizable.d.ts +1 -2
  108. package/dist/h5/dd-resizable.js +3 -3
  109. package/dist/h5/dd-resizable.js.map +1 -1
  110. package/dist/h5/dd-utils.d.ts +3 -1
  111. package/dist/h5/dd-utils.js +13 -1
  112. package/dist/h5/dd-utils.js.map +1 -1
  113. package/dist/h5/gridstack-dd-native.d.ts +1 -1
  114. package/dist/h5/gridstack-dd-native.js +1 -1
  115. package/dist/h5/gridstack-dd-native.js.map +1 -1
  116. package/dist/jq/gridstack-dd-jqueryui.js.map +1 -1
  117. package/dist/src/gridstack.scss +6 -5
  118. package/dist/types.d.ts +12 -4
  119. package/dist/types.js +1 -1
  120. package/dist/types.js.map +1 -1
  121. package/dist/utils.d.ts +4 -2
  122. package/dist/utils.js +7 -6
  123. package/dist/utils.js.map +1 -1
  124. package/doc/CHANGES.md +24 -0
  125. package/doc/README.md +10 -5
  126. package/package.json +5 -3
@@ -0,0 +1,445 @@
1
+ "use strict";
2
+ /**
3
+ * utils.ts 5.0
4
+ * Copyright (c) 2021 Alain Dumesny - see GridStack root license
5
+ */
6
+ var __assign = (this && this.__assign) || function () {
7
+ __assign = Object.assign || function(t) {
8
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
9
+ s = arguments[i];
10
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
11
+ t[p] = s[p];
12
+ }
13
+ return t;
14
+ };
15
+ return __assign.apply(this, arguments);
16
+ };
17
+ var __spreadArrays = (this && this.__spreadArrays) || function () {
18
+ for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;
19
+ for (var r = Array(s), k = 0, i = 0; i < il; i++)
20
+ for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)
21
+ r[k] = a[j];
22
+ return r;
23
+ };
24
+ Object.defineProperty(exports, "__esModule", { value: true });
25
+ exports.Utils = exports.obsoleteAttr = exports.obsoleteOptsDel = exports.obsoleteOpts = exports.obsolete = void 0;
26
+ /** checks for obsolete method names */
27
+ // eslint-disable-next-line
28
+ function obsolete(self, f, oldName, newName, rev) {
29
+ var wrapper = function () {
30
+ var args = [];
31
+ for (var _i = 0; _i < arguments.length; _i++) {
32
+ args[_i] = arguments[_i];
33
+ }
34
+ console.warn('gridstack.js: Function `' + oldName + '` is deprecated in ' + rev + ' and has been replaced ' +
35
+ 'with `' + newName + '`. It will be **completely** removed in v1.0');
36
+ return f.apply(self, args);
37
+ };
38
+ wrapper.prototype = f.prototype;
39
+ return wrapper;
40
+ }
41
+ exports.obsolete = obsolete;
42
+ /** checks for obsolete grid options (can be used for any fields, but msg is about options) */
43
+ function obsoleteOpts(opts, oldName, newName, rev) {
44
+ if (opts[oldName] !== undefined) {
45
+ opts[newName] = opts[oldName];
46
+ console.warn('gridstack.js: Option `' + oldName + '` is deprecated in ' + rev + ' and has been replaced with `' +
47
+ newName + '`. It will be **completely** removed in v1.0');
48
+ }
49
+ }
50
+ exports.obsoleteOpts = obsoleteOpts;
51
+ /** checks for obsolete grid options which are gone */
52
+ function obsoleteOptsDel(opts, oldName, rev, info) {
53
+ if (opts[oldName] !== undefined) {
54
+ console.warn('gridstack.js: Option `' + oldName + '` is deprecated in ' + rev + info);
55
+ }
56
+ }
57
+ exports.obsoleteOptsDel = obsoleteOptsDel;
58
+ /** checks for obsolete Jquery element attributes */
59
+ function obsoleteAttr(el, oldName, newName, rev) {
60
+ var oldAttr = el.getAttribute(oldName);
61
+ if (oldAttr !== null) {
62
+ el.setAttribute(newName, oldAttr);
63
+ console.warn('gridstack.js: attribute `' + oldName + '`=' + oldAttr + ' is deprecated on this object in ' + rev + ' and has been replaced with `' +
64
+ newName + '`. It will be **completely** removed in v1.0');
65
+ }
66
+ }
67
+ exports.obsoleteAttr = obsoleteAttr;
68
+ /**
69
+ * Utility methods
70
+ */
71
+ var Utils = /** @class */ (function () {
72
+ function Utils() {
73
+ }
74
+ /** convert a potential selector into actual list of html elements */
75
+ Utils.getElements = function (els) {
76
+ if (typeof els === 'string') {
77
+ var list = document.querySelectorAll(els);
78
+ if (!list.length && els[0] !== '.' && els[0] !== '#') {
79
+ list = document.querySelectorAll('.' + els);
80
+ if (!list.length) {
81
+ list = document.querySelectorAll('#' + els);
82
+ }
83
+ }
84
+ return Array.from(list);
85
+ }
86
+ return [els];
87
+ };
88
+ /** convert a potential selector into actual single element */
89
+ Utils.getElement = function (els) {
90
+ if (typeof els === 'string') {
91
+ if (!els.length)
92
+ return null;
93
+ if (els[0] === '#') {
94
+ return document.getElementById(els.substring(1));
95
+ }
96
+ if (els[0] === '.' || els[0] === '[') {
97
+ return document.querySelector(els);
98
+ }
99
+ // if we start with a digit, assume it's an id (error calling querySelector('#1')) as class are not valid CSS
100
+ if (!isNaN(+els[0])) { // start with digit
101
+ return document.getElementById(els);
102
+ }
103
+ // finally try string, then id then class
104
+ var el = document.querySelector(els);
105
+ if (!el) {
106
+ el = document.getElementById(els);
107
+ }
108
+ if (!el) {
109
+ el = document.querySelector('.' + els);
110
+ }
111
+ return el;
112
+ }
113
+ return els;
114
+ };
115
+ /** returns true if a and b overlap */
116
+ Utils.isIntercepted = function (a, b) {
117
+ 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);
118
+ };
119
+ /** returns true if a and b touch edges or corners */
120
+ Utils.isTouching = function (a, b) {
121
+ return Utils.isIntercepted(a, { x: b.x - 0.5, y: b.y - 0.5, w: b.w + 1, h: b.h + 1 });
122
+ };
123
+ /**
124
+ * Sorts array of nodes
125
+ * @param nodes array to sort
126
+ * @param dir 1 for asc, -1 for desc (optional)
127
+ * @param width width of the grid. If undefined the width will be calculated automatically (optional).
128
+ **/
129
+ Utils.sort = function (nodes, dir, column) {
130
+ column = column || nodes.reduce(function (col, n) { return Math.max(n.x + n.w, col); }, 0) || 12;
131
+ if (dir === -1)
132
+ return nodes.sort(function (a, b) { return (b.x + b.y * column) - (a.x + a.y * column); });
133
+ else
134
+ return nodes.sort(function (b, a) { return (b.x + b.y * column) - (a.x + a.y * column); });
135
+ };
136
+ /**
137
+ * creates a style sheet with style id under given parent
138
+ * @param id will set the 'gs-style-id' attribute to that id
139
+ * @param parent to insert the stylesheet as first child,
140
+ * if none supplied it will be appended to the document head instead.
141
+ */
142
+ Utils.createStylesheet = function (id, parent) {
143
+ var style = document.createElement('style');
144
+ style.setAttribute('type', 'text/css');
145
+ style.setAttribute('gs-style-id', id);
146
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
147
+ if (style.styleSheet) { // TODO: only CSSImportRule have that and different beast ??
148
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
149
+ style.styleSheet.cssText = '';
150
+ }
151
+ else {
152
+ style.appendChild(document.createTextNode('')); // WebKit hack
153
+ }
154
+ if (!parent) {
155
+ // default to head
156
+ parent = document.getElementsByTagName('head')[0];
157
+ parent.appendChild(style);
158
+ }
159
+ else {
160
+ parent.insertBefore(style, parent.firstChild);
161
+ }
162
+ return style.sheet;
163
+ };
164
+ /** removed the given stylesheet id */
165
+ Utils.removeStylesheet = function (id) {
166
+ var el = document.querySelector('STYLE[gs-style-id=' + id + ']');
167
+ if (el && el.parentNode)
168
+ el.remove();
169
+ };
170
+ /** inserts a CSS rule */
171
+ Utils.addCSSRule = function (sheet, selector, rules) {
172
+ if (typeof sheet.addRule === 'function') {
173
+ sheet.addRule(selector, rules);
174
+ }
175
+ else if (typeof sheet.insertRule === 'function') {
176
+ sheet.insertRule(selector + "{" + rules + "}");
177
+ }
178
+ };
179
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
180
+ Utils.toBool = function (v) {
181
+ if (typeof v === 'boolean') {
182
+ return v;
183
+ }
184
+ if (typeof v === 'string') {
185
+ v = v.toLowerCase();
186
+ return !(v === '' || v === 'no' || v === 'false' || v === '0');
187
+ }
188
+ return Boolean(v);
189
+ };
190
+ Utils.toNumber = function (value) {
191
+ return (value === null || value.length === 0) ? undefined : Number(value);
192
+ };
193
+ Utils.parseHeight = function (val) {
194
+ var h;
195
+ var unit = 'px';
196
+ if (typeof val === 'string') {
197
+ var match = val.match(/^(-[0-9]+\.[0-9]+|[0-9]*\.[0-9]+|-[0-9]+|[0-9]+)(px|em|rem|vh|vw|%)?$/);
198
+ if (!match) {
199
+ throw new Error('Invalid height');
200
+ }
201
+ unit = match[2] || 'px';
202
+ h = parseFloat(match[1]);
203
+ }
204
+ else {
205
+ h = val;
206
+ }
207
+ return { h: h, unit: unit };
208
+ };
209
+ /** copies unset fields in target to use the given default sources values */
210
+ // eslint-disable-next-line
211
+ Utils.defaults = function (target) {
212
+ var _this = this;
213
+ var sources = [];
214
+ for (var _i = 1; _i < arguments.length; _i++) {
215
+ sources[_i - 1] = arguments[_i];
216
+ }
217
+ sources.forEach(function (source) {
218
+ for (var key in source) {
219
+ if (!source.hasOwnProperty(key))
220
+ return;
221
+ if (target[key] === null || target[key] === undefined) {
222
+ target[key] = source[key];
223
+ }
224
+ else if (typeof source[key] === 'object' && typeof target[key] === 'object') {
225
+ // property is an object, recursively add it's field over... #1373
226
+ _this.defaults(target[key], source[key]);
227
+ }
228
+ }
229
+ });
230
+ return target;
231
+ };
232
+ /** given 2 objects return true if they have the same values. Checks for Object {} having same fields and values (just 1 level down) */
233
+ Utils.same = function (a, b) {
234
+ if (typeof a !== 'object')
235
+ return a == b;
236
+ if (typeof a !== typeof b)
237
+ return false;
238
+ // else we have object, check just 1 level deep for being same things...
239
+ if (Object.keys(a).length !== Object.keys(b).length)
240
+ return false;
241
+ for (var key in a) {
242
+ if (a[key] !== b[key])
243
+ return false;
244
+ }
245
+ return true;
246
+ };
247
+ /** copies over b size & position (GridStackPosition), and possibly min/max as well */
248
+ Utils.copyPos = function (a, b, minMax) {
249
+ if (minMax === void 0) { minMax = false; }
250
+ a.x = b.x;
251
+ a.y = b.y;
252
+ a.w = b.w;
253
+ a.h = b.h;
254
+ if (!minMax)
255
+ return a;
256
+ if (b.minW)
257
+ a.minW = b.minW;
258
+ if (b.minH)
259
+ a.minH = b.minH;
260
+ if (b.maxW)
261
+ a.maxW = b.maxW;
262
+ if (b.maxH)
263
+ a.maxH = b.maxH;
264
+ return a;
265
+ };
266
+ /** true if a and b has same size & position */
267
+ Utils.samePos = function (a, b) {
268
+ return a && b && a.x === b.x && a.y === b.y && a.w === b.w && a.h === b.h;
269
+ };
270
+ /** removes field from the first object if same as the second objects (like diffing) and internal '_' for saving */
271
+ Utils.removeInternalAndSame = function (a, b) {
272
+ if (typeof a !== 'object' || typeof b !== 'object')
273
+ return;
274
+ for (var key in a) {
275
+ var val = a[key];
276
+ if (key[0] === '_' || val === b[key]) {
277
+ delete a[key];
278
+ }
279
+ else if (val && typeof val === 'object' && b[key] !== undefined) {
280
+ for (var i in val) {
281
+ if (val[i] === b[key][i] || i[0] === '_') {
282
+ delete val[i];
283
+ }
284
+ }
285
+ if (!Object.keys(val).length) {
286
+ delete a[key];
287
+ }
288
+ }
289
+ }
290
+ };
291
+ /** return the closest parent (or itself) matching the given class */
292
+ Utils.closestByClass = function (el, name) {
293
+ while (el) {
294
+ if (el.classList.contains(name))
295
+ return el;
296
+ el = el.parentElement;
297
+ }
298
+ return null;
299
+ };
300
+ /** delay calling the given function for given delay, preventing new calls from happening while waiting */
301
+ Utils.throttle = function (func, delay) {
302
+ var isWaiting = false;
303
+ return function () {
304
+ var args = [];
305
+ for (var _i = 0; _i < arguments.length; _i++) {
306
+ args[_i] = arguments[_i];
307
+ }
308
+ if (!isWaiting) {
309
+ isWaiting = true;
310
+ setTimeout(function () { func.apply(void 0, args); isWaiting = false; }, delay);
311
+ }
312
+ };
313
+ };
314
+ Utils.removePositioningStyles = function (el) {
315
+ var style = el.style;
316
+ if (style.position) {
317
+ style.removeProperty('position');
318
+ }
319
+ if (style.left) {
320
+ style.removeProperty('left');
321
+ }
322
+ if (style.top) {
323
+ style.removeProperty('top');
324
+ }
325
+ if (style.width) {
326
+ style.removeProperty('width');
327
+ }
328
+ if (style.height) {
329
+ style.removeProperty('height');
330
+ }
331
+ };
332
+ /** @internal returns the passed element if scrollable, else the closest parent that will, up to the entire document scrolling element */
333
+ Utils.getScrollElement = function (el) {
334
+ if (!el)
335
+ return document.scrollingElement || document.documentElement; // IE support
336
+ var style = getComputedStyle(el);
337
+ var overflowRegex = /(auto|scroll)/;
338
+ if (overflowRegex.test(style.overflow + style.overflowY)) {
339
+ return el;
340
+ }
341
+ else {
342
+ return this.getScrollElement(el.parentElement);
343
+ }
344
+ };
345
+ /** @internal */
346
+ Utils.updateScrollPosition = function (el, position, distance) {
347
+ // is widget in view?
348
+ var rect = el.getBoundingClientRect();
349
+ var innerHeightOrClientHeight = (window.innerHeight || document.documentElement.clientHeight);
350
+ if (rect.top < 0 ||
351
+ rect.bottom > innerHeightOrClientHeight) {
352
+ // set scrollTop of first parent that scrolls
353
+ // if parent is larger than el, set as low as possible
354
+ // to get entire widget on screen
355
+ var offsetDiffDown = rect.bottom - innerHeightOrClientHeight;
356
+ var offsetDiffUp = rect.top;
357
+ var scrollEl = this.getScrollElement(el);
358
+ if (scrollEl !== null) {
359
+ var prevScroll = scrollEl.scrollTop;
360
+ if (rect.top < 0 && distance < 0) {
361
+ // moving up
362
+ if (el.offsetHeight > innerHeightOrClientHeight) {
363
+ scrollEl.scrollTop += distance;
364
+ }
365
+ else {
366
+ scrollEl.scrollTop += Math.abs(offsetDiffUp) > Math.abs(distance) ? distance : offsetDiffUp;
367
+ }
368
+ }
369
+ else if (distance > 0) {
370
+ // moving down
371
+ if (el.offsetHeight > innerHeightOrClientHeight) {
372
+ scrollEl.scrollTop += distance;
373
+ }
374
+ else {
375
+ scrollEl.scrollTop += offsetDiffDown > distance ? distance : offsetDiffDown;
376
+ }
377
+ }
378
+ // move widget y by amount scrolled
379
+ position.top += scrollEl.scrollTop - prevScroll;
380
+ }
381
+ }
382
+ };
383
+ /**
384
+ * @internal Function used to scroll the page.
385
+ *
386
+ * @param event `MouseEvent` that triggers the resize
387
+ * @param el `HTMLElement` that's being resized
388
+ * @param distance Distance from the V edges to start scrolling
389
+ */
390
+ Utils.updateScrollResize = function (event, el, distance) {
391
+ var scrollEl = this.getScrollElement(el);
392
+ var height = scrollEl.clientHeight;
393
+ // #1727 event.clientY is relative to viewport, so must compare this against position of scrollEl getBoundingClientRect().top
394
+ // #1745 Special situation if scrollEl is document 'html': here browser spec states that
395
+ // clientHeight is height of viewport, but getBoundingClientRect() is rectangle of html element;
396
+ // this discrepancy arises because in reality scrollbar is attached to viewport, not html element itself.
397
+ var offsetTop = (scrollEl === this.getScrollElement()) ? 0 : scrollEl.getBoundingClientRect().top;
398
+ var pointerPosY = event.clientY - offsetTop;
399
+ var top = pointerPosY < distance;
400
+ var bottom = pointerPosY > height - distance;
401
+ if (top) {
402
+ // This also can be done with a timeout to keep scrolling while the mouse is
403
+ // in the scrolling zone. (will have smoother behavior)
404
+ scrollEl.scrollBy({ behavior: 'smooth', top: pointerPosY - distance });
405
+ }
406
+ else if (bottom) {
407
+ scrollEl.scrollBy({ behavior: 'smooth', top: distance - (height - pointerPosY) });
408
+ }
409
+ };
410
+ /** single level clone, returning a new object with same top fields. This will share sub objects and arrays */
411
+ Utils.clone = function (obj) {
412
+ if (obj === null || obj === undefined || typeof (obj) !== 'object') {
413
+ return obj;
414
+ }
415
+ // return Object.assign({}, obj);
416
+ if (obj instanceof Array) {
417
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
418
+ return __spreadArrays(obj);
419
+ }
420
+ return __assign({}, obj);
421
+ };
422
+ /**
423
+ * Recursive clone version that returns a full copy, checking for nested objects and arrays ONLY.
424
+ * Note: this will use as-is any key starting with double __ (and not copy inside) some lib have circular dependencies.
425
+ */
426
+ Utils.cloneDeep = function (obj) {
427
+ // return JSON.parse(JSON.stringify(obj)); // doesn't work with date format ?
428
+ var ret = Utils.clone(obj);
429
+ var _loop_1 = function (key) {
430
+ // NOTE: we don't support function/circular dependencies so skip those properties for now...
431
+ if (ret.hasOwnProperty(key) && typeof (ret[key]) === 'object' && key.substring(0, 2) !== '__' && !skipFields.find(function (k) { return k === key; })) {
432
+ ret[key] = Utils.cloneDeep(obj[key]);
433
+ }
434
+ };
435
+ for (var key in ret) {
436
+ _loop_1(key);
437
+ }
438
+ return ret;
439
+ };
440
+ return Utils;
441
+ }());
442
+ exports.Utils = Utils;
443
+ // list of fields we will skip during cloneDeep (nested objects, other internal)
444
+ var skipFields = ['_isNested', 'el', 'grid', 'subGrid', 'engine'];
445
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/utils.ts"],"names":[],"mappings":"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","sourcesContent":["/**\r\n * utils.ts 5.0\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 **completely** removed in v1.0');\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 **completely** removed in v1.0');\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 **completely** removed in v1.0');\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 * 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): CSSStyleSheet {\r\n let style: HTMLStyleElement = document.createElement('style');\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 possibly min/max as well */\r\n static copyPos(a: GridStackWidget, b: GridStackWidget, minMax = false): GridStackWidget {\r\n a.x = b.x;\r\n a.y = b.y;\r\n a.w = b.w;\r\n a.h = b.h;\r\n if (!minMax) return a;\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 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 /** 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 /** return the closest parent (or itself) matching the given class */\r\n static closestByClass(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 // 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\r\n// list of fields we will skip during cloneDeep (nested objects, other internal)\r\nconst skipFields = ['_isNested', 'el', 'grid', 'subGrid', 'engine'];\r\n"]}
@@ -1,5 +1,5 @@
1
1
  /**
2
- * gridstack-dd.ts 4.3.0
2
+ * gridstack-dd.ts 5.0
3
3
  * Copyright (c) 2021 Alain Dumesny - see GridStack root license
4
4
  */
5
5
  import { GridStackDDI } from './gridstack-ddi';
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  /**
3
- * gridstack-dd.ts 4.3.0
3
+ * gridstack-dd.ts 5.0
4
4
  * Copyright (c) 2021 Alain Dumesny - see GridStack root license
5
5
  */
6
6
  Object.defineProperty(exports, "__esModule", { value: true });
@@ -9,6 +9,7 @@ exports.GridStackDD = void 0;
9
9
  const gridstack_ddi_1 = require("./gridstack-ddi");
10
10
  const gridstack_1 = require("./gridstack");
11
11
  const utils_1 = require("./utils");
12
+ // TEST let count = 0;
12
13
  /**
13
14
  * Base class implementing common Grid drag'n'drop functionality, with domain specific subclass (h5 vs jq subclasses)
14
15
  */
@@ -30,7 +31,6 @@ exports.GridStackDD = GridStackDD;
30
31
  /********************************************************************************
31
32
  * GridStack code that is doing drag&drop extracted here so main class is smaller
32
33
  * for static grid that don't do any of this work anyway. Saves about 10k.
33
- * TODO: no code hint in code below as this is <any> so look at alternatives ?
34
34
  * https://www.typescriptlang.org/docs/handbook/declaration-merging.html
35
35
  * https://www.typescriptlang.org/docs/handbook/mixins.html
36
36
  ********************************************************************************/
@@ -42,16 +42,16 @@ gridstack_1.GridStack.prototype._setupAcceptWidget = function () {
42
42
  return this;
43
43
  }
44
44
  // vars shared across all methods
45
- let gridPos;
46
45
  let cellHeight, cellWidth;
47
46
  let onDrag = (event, el, helper) => {
48
47
  let node = el.gridstackNode;
49
48
  if (!node)
50
49
  return;
51
50
  helper = helper || el;
52
- let rec = helper.getBoundingClientRect();
53
- let left = rec.left - gridPos.left;
54
- let top = rec.top - gridPos.top;
51
+ let parent = this.el.getBoundingClientRect();
52
+ let { top, left } = helper.getBoundingClientRect();
53
+ left -= parent.left;
54
+ top -= parent.top;
55
55
  let ui = { position: { top, left } };
56
56
  if (node._temporaryRemoved) {
57
57
  node.x = Math.max(0, Math.round(left / cellWidth));
@@ -84,10 +84,13 @@ gridstack_1.GridStack.prototype._setupAcceptWidget = function () {
84
84
  accept: (el) => {
85
85
  let node = el.gridstackNode;
86
86
  // set accept drop to true on ourself (which we ignore) so we don't get "can't drop" icon in HTML5 mode while moving
87
- if (node && node.grid === this)
87
+ if ((node === null || node === void 0 ? void 0 : node.grid) === this)
88
88
  return true;
89
89
  if (!this.opts.acceptWidgets)
90
90
  return false;
91
+ // prevent deeper nesting until rest of 992 can be fixed
92
+ if (node === null || node === void 0 ? void 0 : node.subGrid)
93
+ return false;
91
94
  // check for accept method or class matching
92
95
  let canAccept = true;
93
96
  if (typeof this.opts.acceptWidgets === 'function') {
@@ -109,25 +112,24 @@ gridstack_1.GridStack.prototype._setupAcceptWidget = function () {
109
112
  * entering our grid area
110
113
  */
111
114
  .on(this.el, 'dropover', (event, el, helper) => {
115
+ // TEST console.log(`over ${this.el.gridstack.opts.id} ${count++}`);
112
116
  let node = el.gridstackNode;
113
117
  // ignore drop enter on ourself (unless we temporarily removed) which happens on a simple drag of our item
114
- if (node && node.grid === this && !node._temporaryRemoved) {
118
+ if ((node === null || node === void 0 ? void 0 : node.grid) === this && !node._temporaryRemoved) {
115
119
  // delete node._added; // reset this to track placeholder again in case we were over other grid #1484 (dropout doesn't always clear)
116
120
  return false; // prevent parent from receiving msg (which may be a grid as well)
117
121
  }
118
122
  // fix #1578 when dragging fast, we may not get a leave on the previous grid so force one now
119
- if (node && node.grid && node.grid !== this && !node._temporaryRemoved) {
123
+ if ((node === null || node === void 0 ? void 0 : node.grid) && node.grid !== this && !node._temporaryRemoved) {
120
124
  // TEST console.log('dropover without leave');
121
125
  let otherGrid = node.grid;
122
126
  otherGrid._leave(el, helper);
123
127
  }
124
- // get grid screen coordinates and cell dimensions
125
- let box = this.el.getBoundingClientRect();
126
- gridPos = { top: box.top, left: box.left };
128
+ // cache cell dimensions (which don't change), position can animate if we removed an item in otherGrid that affects us...
127
129
  cellWidth = this.cellWidth();
128
130
  cellHeight = this.getCellHeight(true);
129
131
  // load any element attributes if we don't have a node
130
- if (!node) { // @ts-ignore
132
+ if (!node) { // @ts-ignore private read only on ourself
131
133
  node = this._readAttr(el);
132
134
  }
133
135
  if (!node.grid) {
@@ -168,7 +170,10 @@ gridstack_1.GridStack.prototype._setupAcceptWidget = function () {
168
170
  * Leaving our grid area...
169
171
  */
170
172
  .on(this.el, 'dropout', (event, el, helper) => {
173
+ // TEST console.log(`out ${this.el.gridstack.opts.id} ${count++}`);
171
174
  let node = el.gridstackNode;
175
+ if (!node)
176
+ return false;
172
177
  // fix #1578 when dragging fast, we might get leave after other grid gets enter (which calls us to clean)
173
178
  // so skip this one if we're not the active grid really..
174
179
  if (!node.grid || node.grid === this) {
@@ -182,7 +187,7 @@ gridstack_1.GridStack.prototype._setupAcceptWidget = function () {
182
187
  .on(this.el, 'drop', (event, el, helper) => {
183
188
  let node = el.gridstackNode;
184
189
  // ignore drop on ourself from ourself that didn't come from the outside - dragend will handle the simple move instead
185
- if (node && node.grid === this && !node._isExternal)
190
+ if ((node === null || node === void 0 ? void 0 : node.grid) === this && !node._isExternal)
186
191
  return false;
187
192
  let wasAdded = !!this.placeholder.parentElement; // skip items not actually added to us because of constrains, but do cleanup #1419
188
193
  this.placeholder.remove();
@@ -475,7 +480,13 @@ gridstack_1.GridStack.prototype._leave = function (el, helper) {
475
480
  gridstack_1.GridStack.prototype._dragOrResize = function (el, event, ui, node, cellWidth, cellHeight) {
476
481
  let p = Object.assign({}, node._orig); // could be undefined (_isExternal) which is ok (drag only set x,y and w,h will default to node value)
477
482
  let resizing;
478
- const mLeft = this.opts.marginLeft, mRight = this.opts.marginRight, mTop = this.opts.marginTop, mBottom = this.opts.marginBottom;
483
+ let mLeft = this.opts.marginLeft, mRight = this.opts.marginRight, mTop = this.opts.marginTop, mBottom = this.opts.marginBottom;
484
+ // if margins (which are used to pass mid point by) are large relative to cell height/width, reduce them down #1855
485
+ let mHeight = Math.round(cellHeight * 0.1), mWidth = Math.round(cellWidth * 0.1);
486
+ mLeft = Math.min(mLeft, mWidth);
487
+ mRight = Math.min(mRight, mWidth);
488
+ mTop = Math.min(mTop, mHeight);
489
+ mBottom = Math.min(mBottom, mHeight);
479
490
  if (event.type === 'drag') {
480
491
  if (node._temporaryRemoved)
481
492
  return; // handled by dropover
@@ -532,7 +543,7 @@ gridstack_1.GridStack.prototype._dragOrResize = function (el, event, ui, node, c
532
543
  w: (ui.size ? ui.size.width : node.w * cellWidth) - mLeft - mRight,
533
544
  h: (ui.size ? ui.size.height : node.h * cellHeight) - mTop - mBottom
534
545
  };
535
- if (this.engine.moveNodeCheck(node, Object.assign(Object.assign({}, p), { cellWidth, cellHeight, rect }))) {
546
+ if (this.engine.moveNodeCheck(node, Object.assign(Object.assign({}, p), { cellWidth, cellHeight, rect, resizing }))) {
536
547
  node._lastUiPosition = ui.position;
537
548
  this.engine.cacheRects(cellWidth, cellHeight, mTop, mRight, mBottom, mLeft);
538
549
  delete node._skipDown;