gridstack 10.3.1 → 11.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (121) hide show
  1. package/README.md +37 -3
  2. package/dist/angular/README.md +47 -25
  3. package/dist/angular/{esm2020 → esm2022}/gridstack-angular.mjs +5 -5
  4. package/dist/angular/esm2022/index.mjs +8 -0
  5. package/dist/angular/esm2022/lib/base-widget.mjs +34 -0
  6. package/dist/angular/esm2022/lib/gridstack-item.component.mjs +72 -0
  7. package/dist/angular/esm2022/lib/gridstack.component.mjs +300 -0
  8. package/dist/angular/esm2022/lib/gridstack.module.mjs +39 -0
  9. package/dist/angular/{fesm2020 → fesm2022}/gridstack-angular.mjs +400 -369
  10. package/dist/angular/fesm2022/gridstack-angular.mjs.map +1 -0
  11. package/dist/angular/index.d.ts +4 -5
  12. package/dist/angular/lib/base-widget.d.ts +18 -16
  13. package/dist/angular/lib/gridstack-item.component.d.ts +37 -37
  14. package/dist/angular/lib/gridstack.component.d.ts +135 -129
  15. package/dist/angular/lib/gridstack.module.d.ts +10 -10
  16. package/dist/angular/package.json +7 -13
  17. package/dist/angular/src/base-widget.ts +10 -2
  18. package/dist/angular/src/gridstack-item.component.ts +11 -7
  19. package/dist/angular/src/gridstack.component.ts +67 -44
  20. package/dist/angular/src/gridstack.module.ts +2 -2
  21. package/dist/dd-base-impl.d.ts +2 -2
  22. package/dist/dd-base-impl.js +2 -2
  23. package/dist/dd-base-impl.js.map +1 -1
  24. package/dist/dd-draggable.d.ts +7 -16
  25. package/dist/dd-draggable.js +22 -34
  26. package/dist/dd-draggable.js.map +1 -1
  27. package/dist/dd-droppable.d.ts +2 -2
  28. package/dist/dd-droppable.js +2 -2
  29. package/dist/dd-droppable.js.map +1 -1
  30. package/dist/dd-element.d.ts +5 -5
  31. package/dist/dd-element.js +2 -2
  32. package/dist/dd-element.js.map +1 -1
  33. package/dist/dd-gridstack.d.ts +4 -4
  34. package/dist/dd-gridstack.js +8 -8
  35. package/dist/dd-gridstack.js.map +1 -1
  36. package/dist/dd-manager.d.ts +2 -2
  37. package/dist/dd-manager.js +2 -2
  38. package/dist/dd-manager.js.map +1 -1
  39. package/dist/dd-resizable-handle.d.ts +2 -2
  40. package/dist/dd-resizable-handle.js +3 -3
  41. package/dist/dd-resizable-handle.js.map +1 -1
  42. package/dist/dd-resizable.d.ts +2 -2
  43. package/dist/dd-resizable.js +4 -4
  44. package/dist/dd-resizable.js.map +1 -1
  45. package/dist/dd-touch.d.ts +2 -2
  46. package/dist/dd-touch.js +2 -2
  47. package/dist/dd-touch.js.map +1 -1
  48. package/dist/es5/dd-base-impl.d.ts +2 -2
  49. package/dist/es5/dd-base-impl.js +2 -2
  50. package/dist/es5/dd-base-impl.js.map +1 -1
  51. package/dist/es5/dd-draggable.d.ts +7 -16
  52. package/dist/es5/dd-draggable.js +19 -29
  53. package/dist/es5/dd-draggable.js.map +1 -1
  54. package/dist/es5/dd-droppable.d.ts +2 -2
  55. package/dist/es5/dd-droppable.js +2 -2
  56. package/dist/es5/dd-droppable.js.map +1 -1
  57. package/dist/es5/dd-element.d.ts +5 -5
  58. package/dist/es5/dd-element.js +2 -2
  59. package/dist/es5/dd-element.js.map +1 -1
  60. package/dist/es5/dd-gridstack.d.ts +4 -4
  61. package/dist/es5/dd-gridstack.js +9 -6
  62. package/dist/es5/dd-gridstack.js.map +1 -1
  63. package/dist/es5/dd-manager.d.ts +2 -2
  64. package/dist/es5/dd-manager.js +2 -2
  65. package/dist/es5/dd-manager.js.map +1 -1
  66. package/dist/es5/dd-resizable-handle.d.ts +2 -2
  67. package/dist/es5/dd-resizable-handle.js +2 -2
  68. package/dist/es5/dd-resizable-handle.js.map +1 -1
  69. package/dist/es5/dd-resizable.d.ts +2 -2
  70. package/dist/es5/dd-resizable.js +2 -2
  71. package/dist/es5/dd-resizable.js.map +1 -1
  72. package/dist/es5/dd-touch.d.ts +2 -2
  73. package/dist/es5/dd-touch.js +2 -2
  74. package/dist/es5/dd-touch.js.map +1 -1
  75. package/dist/es5/gridstack-all.js +1 -1
  76. package/dist/es5/gridstack-all.js.LICENSE.txt +2 -2
  77. package/dist/es5/gridstack-all.js.map +1 -1
  78. package/dist/es5/gridstack-engine.d.ts +2 -2
  79. package/dist/es5/gridstack-engine.js +13 -5
  80. package/dist/es5/gridstack-engine.js.map +1 -1
  81. package/dist/es5/gridstack-poly.js +2 -2
  82. package/dist/es5/gridstack.d.ts +22 -17
  83. package/dist/es5/gridstack.js +158 -141
  84. package/dist/es5/gridstack.js.map +1 -1
  85. package/dist/es5/types.d.ts +16 -8
  86. package/dist/es5/types.js +3 -10
  87. package/dist/es5/types.js.map +1 -1
  88. package/dist/es5/utils.d.ts +6 -2
  89. package/dist/es5/utils.js +36 -3
  90. package/dist/es5/utils.js.map +1 -1
  91. package/dist/gridstack-all.js +1 -1
  92. package/dist/gridstack-all.js.LICENSE.txt +2 -2
  93. package/dist/gridstack-all.js.map +1 -1
  94. package/dist/gridstack-engine.d.ts +2 -2
  95. package/dist/gridstack-engine.js +69 -61
  96. package/dist/gridstack-engine.js.map +1 -1
  97. package/dist/gridstack-extra.css +1 -1
  98. package/dist/gridstack.css +2 -2
  99. package/dist/gridstack.d.ts +22 -17
  100. package/dist/gridstack.js +244 -226
  101. package/dist/gridstack.js.map +1 -1
  102. package/dist/src/gridstack-extra.scss +1 -1
  103. package/dist/src/gridstack.scss +2 -2
  104. package/dist/types.d.ts +16 -8
  105. package/dist/types.js +2 -9
  106. package/dist/types.js.map +1 -1
  107. package/dist/utils.d.ts +6 -2
  108. package/dist/utils.js +50 -20
  109. package/dist/utils.js.map +1 -1
  110. package/doc/CHANGES.md +13 -0
  111. package/doc/README.md +18 -23
  112. package/package.json +2 -2
  113. package/dist/angular/esm2020/lib/base-widget.mjs +0 -30
  114. package/dist/angular/esm2020/lib/gridstack-item.component.mjs +0 -68
  115. package/dist/angular/esm2020/lib/gridstack.component.mjs +0 -280
  116. package/dist/angular/esm2020/lib/gridstack.module.mjs +0 -39
  117. package/dist/angular/esm2020/public-api.mjs +0 -8
  118. package/dist/angular/fesm2015/gridstack-angular.mjs +0 -420
  119. package/dist/angular/fesm2015/gridstack-angular.mjs.map +0 -1
  120. package/dist/angular/fesm2020/gridstack-angular.mjs.map +0 -1
  121. package/dist/angular/public-api.d.ts +0 -4
@@ -1,6 +1,6 @@
1
1
  /**
2
- * gridstack-engine.ts 10.3.1
3
- * Copyright (c) 2021-2022 Alain Dumesny - see GridStack root license
2
+ * gridstack-engine.ts 11.0.1
3
+ * Copyright (c) 2021-2024 Alain Dumesny - see GridStack root license
4
4
  */
5
5
  import { GridStackNode, GridStackPosition, GridStackMoveOpts, SaveFcn, CompactOptions } from './types';
6
6
  /** callback to update the DOM attributes since this class is generic (no HTML or other info) for items that changed - see _notify() */
@@ -1,6 +1,6 @@
1
1
  /**
2
- * gridstack-engine.ts 10.3.1
3
- * Copyright (c) 2021-2022 Alain Dumesny - see GridStack root license
2
+ * gridstack-engine.ts 11.0.1
3
+ * Copyright (c) 2021-2024 Alain Dumesny - see GridStack root license
4
4
  */
5
5
  import { Utils } from './utils';
6
6
  /**
@@ -61,7 +61,7 @@ class GridStackEngine {
61
61
  collide = this.collide(node, area, opt.skip); // force new hit
62
62
  }
63
63
  let didMove = false;
64
- let newOpt = { nested: true, pack: false };
64
+ const newOpt = { nested: true, pack: false };
65
65
  while (collide = collide || this.collide(node, area, opt.skip)) { // could collide with more than 1 item... so repeat for each
66
66
  let moved;
67
67
  // if colliding with a locked item OR loading (move after) OR moving down with top gravity (and collide could move up) -> skip past the collide,
@@ -108,8 +108,8 @@ class GridStackEngine {
108
108
  directionCollideCoverage(node, o, collides) {
109
109
  if (!o.rect || !node._rect)
110
110
  return;
111
- let r0 = node._rect; // where started
112
- let r = { ...o.rect }; // where we are
111
+ const r0 = node._rect; // where started
112
+ const r = { ...o.rect }; // where we are
113
113
  // update dragged rect to show where it's coming from (above or below, etc...)
114
114
  if (r.y > r0.y) {
115
115
  r.h += r.y - r0.y;
@@ -131,7 +131,7 @@ class GridStackEngine {
131
131
  if (n.locked || !n._rect) {
132
132
  break;
133
133
  }
134
- let r2 = n._rect; // overlapping target
134
+ const r2 = n._rect; // overlapping target
135
135
  let yOver = Number.MAX_VALUE, xOver = Number.MAX_VALUE;
136
136
  // depending on which side we started from, compute the overlap % of coverage
137
137
  // (ex: from above/below we only compute the max horizontal line coverage)
@@ -147,7 +147,7 @@ class GridStackEngine {
147
147
  else if (r0.x + r0.w > r2.x + r2.w) { // from the right
148
148
  xOver = ((r2.x + r2.w) - r.x) / r2.w;
149
149
  }
150
- let over = Math.min(xOver, yOver);
150
+ const over = Math.min(xOver, yOver);
151
151
  if (over > overMax) {
152
152
  overMax = over;
153
153
  collide = n;
@@ -159,11 +159,11 @@ class GridStackEngine {
159
159
  /** does a pixel coverage returning the node that has the most coverage by area */
160
160
  /*
161
161
  protected collideCoverage(r: GridStackPosition, collides: GridStackNode[]): {collide: GridStackNode, over: number} {
162
- let collide: GridStackNode;
163
- let overMax = 0;
162
+ const collide: GridStackNode;
163
+ const overMax = 0;
164
164
  collides.forEach(n => {
165
165
  if (n.locked || !n._rect) return;
166
- let over = Utils.areaIntercept(r, n._rect);
166
+ const over = Utils.areaIntercept(r, n._rect);
167
167
  if (over > overMax) {
168
168
  overMax = over;
169
169
  collide = n;
@@ -187,7 +187,7 @@ class GridStackEngine {
187
187
  if (!b || b.locked || !a || a.locked)
188
188
  return false;
189
189
  function _doSwap() {
190
- let x = b.x, y = b.y;
190
+ const x = b.x, y = b.y;
191
191
  b.x = a.x;
192
192
  b.y = a.y; // b -> a position
193
193
  if (a.h != b.h) {
@@ -214,7 +214,7 @@ class GridStackEngine {
214
214
  // check for taking same columns (but different height) and touching
215
215
  if (a.w === b.w && a.x === b.x && (touching || (touching = Utils.isTouching(a, b)))) {
216
216
  if (b.y < a.y) {
217
- let t = a;
217
+ const t = a;
218
218
  a = b;
219
219
  b = t;
220
220
  } // swap a <-> b vars so a is first
@@ -225,7 +225,7 @@ class GridStackEngine {
225
225
  // check if taking same row (but different width) and touching
226
226
  if (a.h === b.h && a.y === b.y && (touching || (touching = Utils.isTouching(a, b)))) {
227
227
  if (b.x < a.x) {
228
- let t = a;
228
+ const t = a;
229
229
  a = b;
230
230
  b = t;
231
231
  } // swap a <-> b vars so a is first
@@ -234,7 +234,7 @@ class GridStackEngine {
234
234
  return false;
235
235
  }
236
236
  isAreaEmpty(x, y, w, h) {
237
- let nn = { x: x || 0, y: y || 0, w: w || 1, h: h || 1 };
237
+ const nn = { x: x || 0, y: y || 0, w: w || 1, h: h || 1 };
238
238
  return !this.collide(nn);
239
239
  }
240
240
  /** re-layout grid items to reclaim any empty space - optionally keeping the sort order exactly the same ('list' mode) vs truly finding an empty spaces */
@@ -249,7 +249,7 @@ class GridStackEngine {
249
249
  const wasColumnResize = this._inColumnResize;
250
250
  if (!wasColumnResize)
251
251
  this._inColumnResize = true; // faster addNode()
252
- let copyNodes = this.nodes;
252
+ const copyNodes = this.nodes;
253
253
  this.nodes = []; // pretend we have no nodes to conflict layout to start with...
254
254
  copyNodes.forEach((n, index, list) => {
255
255
  let after;
@@ -296,7 +296,7 @@ class GridStackEngine {
296
296
  let newY = n.y;
297
297
  while (newY > n._orig.y) {
298
298
  --newY;
299
- let collide = this.collide(n, { x: n.x, y: newY, w: n.w, h: n.h });
299
+ const collide = this.collide(n, { x: n.x, y: newY, w: n.w, h: n.h });
300
300
  if (!collide) {
301
301
  n._dirty = true;
302
302
  n.y = newY;
@@ -310,8 +310,8 @@ class GridStackEngine {
310
310
  if (n.locked)
311
311
  return;
312
312
  while (n.y > 0) {
313
- let newY = i === 0 ? 0 : n.y - 1;
314
- let canBeMoved = i === 0 || !this.collide(n, { x: n.x, y: newY, w: n.w, h: n.h });
313
+ const newY = i === 0 ? 0 : n.y - 1;
314
+ const canBeMoved = i === 0 || !this.collide(n, { x: n.x, y: newY, w: n.w, h: n.h });
315
315
  if (!canBeMoved)
316
316
  break;
317
317
  // Note: must be dirty (from last position) for GridStack::OnChange CB to update positions
@@ -331,12 +331,20 @@ class GridStackEngine {
331
331
  */
332
332
  prepareNode(node, resizing) {
333
333
  node._id = node._id ?? GridStackEngine._idSeq++;
334
+ // make sure USER supplied id are unique in our list, else assign a new one as it will create issues during load/update/etc...
335
+ const id = node.id;
336
+ if (id) {
337
+ let count = 1; // append nice _n rather than some random number
338
+ while (this.nodes.find(n => n.id === node.id && n !== node)) {
339
+ node.id = id + '_' + (count++);
340
+ }
341
+ }
334
342
  // if we're missing position, have the grid position us automatically (before we set them to 0,0)
335
343
  if (node.x === undefined || node.y === undefined || node.x === null || node.y === null) {
336
344
  node.autoPosition = true;
337
345
  }
338
346
  // assign defaults for missing required fields
339
- let defaults = { x: 0, y: 0, w: 1, h: 1 };
347
+ const defaults = { x: 0, y: 0, w: 1, h: 1 };
340
348
  Utils.defaults(node, defaults);
341
349
  if (!node.autoPosition) {
342
350
  delete node.autoPosition;
@@ -380,7 +388,7 @@ class GridStackEngine {
380
388
  }
381
389
  /** part2 of preparing a node to fit inside our grid - checks for x,y,w from grid dimensions */
382
390
  nodeBoundFix(node, resizing) {
383
- let before = node._orig || Utils.copyPos({}, node);
391
+ const before = node._orig || Utils.copyPos({}, node);
384
392
  if (node.maxW) {
385
393
  node.w = Math.min(node.w, node.maxW);
386
394
  }
@@ -398,7 +406,7 @@ class GridStackEngine {
398
406
  // IFF we're not in the middle of column resizing!
399
407
  const saveOrig = (node.x || 0) + (node.w || 1) > this.column;
400
408
  if (saveOrig && this.column < 12 && !this._inColumnResize && node._id && this.findCacheLayout(node, 12) === -1) {
401
- let copy = { ...node }; // need _id + positions
409
+ const copy = { ...node }; // need _id + positions
402
410
  if (copy.autoPosition || copy.x === undefined) {
403
411
  delete copy.x;
404
412
  delete copy.y;
@@ -459,7 +467,7 @@ class GridStackEngine {
459
467
  _notify(removedNodes) {
460
468
  if (this.batchMode || !this.onChange)
461
469
  return this;
462
- let dirtyNodes = (removedNodes || []).concat(this.getDirtyNodes());
470
+ const dirtyNodes = (removedNodes || []).concat(this.getDirtyNodes());
463
471
  this.onChange(dirtyNodes);
464
472
  return this;
465
473
  }
@@ -500,15 +508,15 @@ class GridStackEngine {
500
508
  * Optionally pass a widget to start search AFTER, meaning the order will remain the same but possibly have empty slots we skipped
501
509
  */
502
510
  findEmptyPosition(node, nodeList = this.nodes, column = this.column, after) {
503
- let start = after ? after.y * column + (after.x + after.w) : 0;
511
+ const start = after ? after.y * column + (after.x + after.w) : 0;
504
512
  let found = false;
505
513
  for (let i = start; !found; ++i) {
506
- let x = i % column;
507
- let y = Math.floor(i / column);
514
+ const x = i % column;
515
+ const y = Math.floor(i / column);
508
516
  if (x + node.w > column) {
509
517
  continue;
510
518
  }
511
- let box = { x, y, w: node.w, h: node.h };
519
+ const box = { x, y, w: node.w, h: node.h };
512
520
  if (!nodeList.find(n => Utils.isIntercepted(box, n))) {
513
521
  if (node.x !== x || node.y !== y)
514
522
  node._dirty = true;
@@ -522,7 +530,7 @@ class GridStackEngine {
522
530
  }
523
531
  /** call to add the given node to our list, fixing collision and re-packing */
524
532
  addNode(node, triggerAddEvent = false, after) {
525
- let dup = this.nodes.find(n => n._id === node._id);
533
+ const dup = this.nodes.find(n => n._id === node._id);
526
534
  if (dup)
527
535
  return dup; // prevent inserting twice! return it instead.
528
536
  // skip prepareNode if we're in middle of column resize (not new) but do check for bounds!
@@ -586,7 +594,7 @@ class GridStackEngine {
586
594
  }
587
595
  // complex case: create a clone with NO maxRow (will check for out of bounds at the end)
588
596
  let clonedNode;
589
- let clone = new GridStackEngine({
597
+ const clone = new GridStackEngine({
590
598
  column: this.column,
591
599
  float: this.float,
592
600
  nodes: this.nodes.map(n => {
@@ -601,10 +609,10 @@ class GridStackEngine {
601
609
  return false;
602
610
  // check if we're covering 50% collision and could move, while still being under maxRow or at least not making it worse
603
611
  // (case where widget was somehow added past our max #2449)
604
- let canMove = clone.moveNode(clonedNode, o) && clone.getRow() <= Math.max(this.getRow(), this.maxRow);
612
+ const canMove = clone.moveNode(clonedNode, o) && clone.getRow() <= Math.max(this.getRow(), this.maxRow);
605
613
  // else check if we can force a swap (float=true, or different shapes) on non-resize
606
614
  if (!canMove && !o.resizing && o.collide) {
607
- let collide = o.collide.el.gridstackNode; // find the source node the clone collided with at 50%
615
+ const collide = o.collide.el.gridstackNode; // find the source node the clone collided with at 50%
608
616
  if (this.swap(node, collide)) { // swaps and mark dirty
609
617
  this._notify();
610
618
  return true;
@@ -615,7 +623,7 @@ class GridStackEngine {
615
623
  // if clone was able to move, copy those mods over to us now instead of caller trying to do this all over!
616
624
  // Note: we can't use the list directly as elements and other parts point to actual node, so copy content
617
625
  clone.nodes.filter(n => n._dirty).forEach(c => {
618
- let n = this.nodes.find(a => a._id === c._id);
626
+ const n = this.nodes.find(a => a._id === c._id);
619
627
  if (!n)
620
628
  return;
621
629
  Utils.copyPos(n, c);
@@ -630,12 +638,12 @@ class GridStackEngine {
630
638
  if (!this.maxRow)
631
639
  return true;
632
640
  // create a clone with NO maxRow and check if still within size
633
- let clone = new GridStackEngine({
641
+ const clone = new GridStackEngine({
634
642
  column: this.column,
635
643
  float: this.float,
636
644
  nodes: this.nodes.map(n => { return { ...n }; })
637
645
  });
638
- let n = { ...node }; // clone node so we don't mod any settings on it but have full autoPosition and min/max as well! #1687
646
+ const n = { ...node }; // clone node so we don't mod any settings on it but have full autoPosition and min/max as well! #1687
639
647
  this.cleanupNode(n);
640
648
  delete n.el;
641
649
  delete n._id;
@@ -691,27 +699,27 @@ class GridStackEngine {
691
699
  if (typeof o.h !== 'number') {
692
700
  o.h = node.h;
693
701
  }
694
- let resizing = (node.w !== o.w || node.h !== o.h);
695
- let nn = Utils.copyPos({}, node, true); // get min/max out first, then opt positions next
702
+ const resizing = (node.w !== o.w || node.h !== o.h);
703
+ const nn = Utils.copyPos({}, node, true); // get min/max out first, then opt positions next
696
704
  Utils.copyPos(nn, o);
697
705
  this.nodeBoundFix(nn, resizing);
698
706
  Utils.copyPos(o, nn);
699
707
  if (!o.forceCollide && Utils.samePos(node, o))
700
708
  return false;
701
- let prevPos = Utils.copyPos({}, node);
709
+ const prevPos = Utils.copyPos({}, node);
702
710
  // check if we will need to fix collision at our new location
703
- let collides = this.collideAll(node, nn, o.skip);
711
+ const collides = this.collideAll(node, nn, o.skip);
704
712
  let needToMove = true;
705
713
  if (collides.length) {
706
- let activeDrag = node._moving && !o.nested;
714
+ const activeDrag = node._moving && !o.nested;
707
715
  // check to make sure we actually collided over 50% surface area while dragging
708
716
  let collide = activeDrag ? this.directionCollideCoverage(node, o, collides) : collides[0];
709
717
  // if we're enabling creation of sub-grids on the fly, see if we're covering 80% of either one, if we didn't already do that
710
718
  if (activeDrag && collide && node.grid?.opts?.subGridDynamic && !node.grid._isTemp) {
711
- let over = Utils.areaIntercept(o.rect, collide._rect);
712
- let a1 = Utils.area(o.rect);
713
- let a2 = Utils.area(collide._rect);
714
- let perc = over / (a1 < a2 ? a1 : a2);
719
+ const over = Utils.areaIntercept(o.rect, collide._rect);
720
+ const a1 = Utils.area(o.rect);
721
+ const a2 = Utils.area(collide._rect);
722
+ const perc = over / (a1 < a2 ? a1 : a2);
715
723
  if (perc > .8) {
716
724
  collide.grid.makeSubGrid(collide.el, undefined, node);
717
725
  collide = undefined;
@@ -750,7 +758,7 @@ class GridStackEngine {
750
758
  return this;
751
759
  }
752
760
  endUpdate() {
753
- let n = this.nodes.find(n => n._updating);
761
+ const n = this.nodes.find(n => n._updating);
754
762
  if (n) {
755
763
  delete n._updating;
756
764
  delete n._skipDown;
@@ -761,14 +769,14 @@ class GridStackEngine {
761
769
  * returning a list of widgets for serialization */
762
770
  save(saveElement = true, saveCB) {
763
771
  // use the highest layout for any saved info so we can have full detail on reload #1849
764
- let len = this._layouts?.length;
765
- let layout = len && this.column !== (len - 1) ? this._layouts[len - 1] : null;
766
- let list = [];
772
+ const len = this._layouts?.length;
773
+ const layout = len && this.column !== (len - 1) ? this._layouts[len - 1] : null;
774
+ const list = [];
767
775
  this.sortNodes();
768
776
  this.nodes.forEach(n => {
769
- let wl = layout?.find(l => l._id === n._id);
777
+ const wl = layout?.find(l => l._id === n._id);
770
778
  // use layout info fields instead if set
771
- let w = { ...n, ...(wl || {}) };
779
+ const w = { ...n, ...(wl || {}) };
772
780
  Utils.removeInternalForSave(w, !saveElement);
773
781
  if (saveCB)
774
782
  saveCB(n, w);
@@ -790,11 +798,11 @@ class GridStackEngine {
790
798
  else {
791
799
  // we save the original x,y,w (h isn't cached) to see what actually changed to propagate better.
792
800
  // NOTE: we don't need to check against out of bound scaling/moving as that will be done when using those cache values. #1785
793
- let ratio = column / this.column;
801
+ const ratio = column / this.column;
794
802
  nodes.forEach(node => {
795
803
  if (!node._orig)
796
804
  return; // didn't change (newly added ?)
797
- let n = layout.find(l => l._id === node._id);
805
+ const n = layout.find(l => l._id === node._id);
798
806
  if (!n)
799
807
  return; // no cache for new nodes. Will use those values.
800
808
  // Y changed, push down same amount
@@ -849,11 +857,11 @@ class GridStackEngine {
849
857
  const cacheNodes = this._layouts[column] || [];
850
858
  // ...if not, start with the largest layout (if not already there) as down-scaling is more accurate
851
859
  // by pretending we came from that larger column by assigning those values as starting point
852
- let lastIndex = this._layouts.length - 1;
860
+ const lastIndex = this._layouts.length - 1;
853
861
  if (!cacheNodes.length && prevColumn !== lastIndex && this._layouts[lastIndex]?.length) {
854
862
  prevColumn = lastIndex;
855
863
  this._layouts[lastIndex].forEach(cacheNode => {
856
- let n = nodes.find(n => n._id === cacheNode._id);
864
+ const n = nodes.find(n => n._id === cacheNode._id);
857
865
  if (n) {
858
866
  // still current, use cache info positions
859
867
  if (!doCompact && !cacheNode.autoPosition) {
@@ -868,7 +876,7 @@ class GridStackEngine {
868
876
  }
869
877
  // if we found cache re-use those nodes that are still current
870
878
  cacheNodes.forEach(cacheNode => {
871
- let j = nodes.findIndex(n => n._id === cacheNode._id);
879
+ const j = nodes.findIndex(n => n._id === cacheNode._id);
872
880
  if (j !== -1) {
873
881
  const n = nodes[j];
874
882
  // still current, use cache info positions
@@ -900,9 +908,9 @@ class GridStackEngine {
900
908
  layout(column, prevColumn, newNodes, nodes);
901
909
  }
902
910
  else {
903
- let ratio = doCompact ? 1 : column / prevColumn;
904
- let move = (layout === 'move' || layout === 'moveScale');
905
- let scale = (layout === 'scale' || layout === 'moveScale');
911
+ const ratio = doCompact ? 1 : column / prevColumn;
912
+ const move = (layout === 'move' || layout === 'moveScale');
913
+ const scale = (layout === 'scale' || layout === 'moveScale');
906
914
  nodes.forEach(node => {
907
915
  // NOTE: x + w could be outside of the grid, but addNode() below will handle that
908
916
  node.x = (column === 1 ? 0 : (move ? Math.round(node.x * ratio) : Math.min(node.x, column - 1)));
@@ -933,7 +941,7 @@ class GridStackEngine {
933
941
  * @param clear if true, will force other caches to be removed (default false)
934
942
  */
935
943
  cacheLayout(nodes, column, clear = false) {
936
- let copy = [];
944
+ const copy = [];
937
945
  nodes.forEach((n, i) => {
938
946
  // make sure we have an id in case this is new layout, else re-use id already set
939
947
  if (n._id === undefined) {
@@ -953,7 +961,7 @@ class GridStackEngine {
953
961
  */
954
962
  cacheOneLayout(n, column) {
955
963
  n._id = n._id ?? GridStackEngine._idSeq++;
956
- let l = { x: n.x, y: n.y, w: n.w, _id: n._id };
964
+ const l = { x: n.x, y: n.y, w: n.w, _id: n._id };
957
965
  if (n.autoPosition || n.x === undefined) {
958
966
  delete l.x;
959
967
  delete l.y;
@@ -962,7 +970,7 @@ class GridStackEngine {
962
970
  }
963
971
  this._layouts = this._layouts || [];
964
972
  this._layouts[column] = this._layouts[column] || [];
965
- let index = this.findCacheLayout(n, column);
973
+ const index = this.findCacheLayout(n, column);
966
974
  if (index === -1)
967
975
  this._layouts[column].push(l);
968
976
  else
@@ -977,7 +985,7 @@ class GridStackEngine {
977
985
  return;
978
986
  }
979
987
  for (let i = 0; i < this._layouts.length; i++) {
980
- let index = this.findCacheLayout(n, i);
988
+ const index = this.findCacheLayout(n, i);
981
989
  if (index !== -1) {
982
990
  this._layouts[i].splice(index, 1);
983
991
  }
@@ -985,7 +993,7 @@ class GridStackEngine {
985
993
  }
986
994
  /** called to remove all internal values but the _id */
987
995
  cleanupNode(node) {
988
- for (let prop in node) {
996
+ for (const prop in node) {
989
997
  if (prop[0] === '_' && prop !== '_id')
990
998
  delete node[prop];
991
999
  }