gridstack 7.1.1 → 7.1.2

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 (94) hide show
  1. package/README.md +3 -2
  2. package/dist/angular/README.md +57 -0
  3. package/dist/angular/gridstack-item.component.ts +61 -0
  4. package/dist/angular/gridstack.component.ts +165 -0
  5. package/dist/dd-base-impl.d.ts +1 -1
  6. package/dist/dd-base-impl.js +1 -1
  7. package/dist/dd-base-impl.js.map +1 -1
  8. package/dist/dd-draggable.d.ts +1 -1
  9. package/dist/dd-draggable.js +1 -1
  10. package/dist/dd-draggable.js.map +1 -1
  11. package/dist/dd-droppable.d.ts +1 -1
  12. package/dist/dd-droppable.js +1 -1
  13. package/dist/dd-droppable.js.map +1 -1
  14. package/dist/dd-element.d.ts +1 -1
  15. package/dist/dd-element.js +1 -1
  16. package/dist/dd-element.js.map +1 -1
  17. package/dist/dd-gridstack.d.ts +1 -3
  18. package/dist/dd-gridstack.js +1 -628
  19. package/dist/dd-gridstack.js.map +1 -1
  20. package/dist/dd-manager.d.ts +1 -1
  21. package/dist/dd-manager.js +1 -1
  22. package/dist/dd-manager.js.map +1 -1
  23. package/dist/dd-resizable-handle.d.ts +1 -1
  24. package/dist/dd-resizable-handle.js +1 -1
  25. package/dist/dd-resizable-handle.js.map +1 -1
  26. package/dist/dd-resizable.d.ts +1 -1
  27. package/dist/dd-resizable.js +1 -1
  28. package/dist/dd-resizable.js.map +1 -1
  29. package/dist/dd-touch.d.ts +1 -1
  30. package/dist/dd-touch.js +1 -1
  31. package/dist/dd-touch.js.map +1 -1
  32. package/dist/es5/dd-base-impl.d.ts +1 -1
  33. package/dist/es5/dd-base-impl.js +1 -1
  34. package/dist/es5/dd-base-impl.js.map +1 -1
  35. package/dist/es5/dd-draggable.d.ts +1 -1
  36. package/dist/es5/dd-draggable.js +1 -1
  37. package/dist/es5/dd-draggable.js.map +1 -1
  38. package/dist/es5/dd-droppable.d.ts +1 -1
  39. package/dist/es5/dd-droppable.js +1 -1
  40. package/dist/es5/dd-droppable.js.map +1 -1
  41. package/dist/es5/dd-element.d.ts +1 -1
  42. package/dist/es5/dd-element.js +1 -1
  43. package/dist/es5/dd-element.js.map +1 -1
  44. package/dist/es5/dd-gridstack.d.ts +1 -3
  45. package/dist/es5/dd-gridstack.js +1 -634
  46. package/dist/es5/dd-gridstack.js.map +1 -1
  47. package/dist/es5/dd-manager.d.ts +1 -1
  48. package/dist/es5/dd-manager.js +1 -1
  49. package/dist/es5/dd-manager.js.map +1 -1
  50. package/dist/es5/dd-resizable-handle.d.ts +1 -1
  51. package/dist/es5/dd-resizable-handle.js +1 -1
  52. package/dist/es5/dd-resizable-handle.js.map +1 -1
  53. package/dist/es5/dd-resizable.d.ts +1 -1
  54. package/dist/es5/dd-resizable.js +1 -1
  55. package/dist/es5/dd-resizable.js.map +1 -1
  56. package/dist/es5/dd-touch.d.ts +1 -1
  57. package/dist/es5/dd-touch.js +1 -1
  58. package/dist/es5/dd-touch.js.map +1 -1
  59. package/dist/es5/gridstack-all.js +1 -1
  60. package/dist/es5/gridstack-all.js.LICENSE.txt +1 -1
  61. package/dist/es5/gridstack-all.js.map +1 -1
  62. package/dist/es5/gridstack-engine.d.ts +1 -1
  63. package/dist/es5/gridstack-engine.js +1 -1
  64. package/dist/es5/gridstack-engine.js.map +1 -1
  65. package/dist/es5/gridstack-poly.js +1 -1
  66. package/dist/es5/gridstack.d.ts +16 -7
  67. package/dist/es5/gridstack.js +646 -42
  68. package/dist/es5/gridstack.js.map +1 -1
  69. package/dist/es5/types.d.ts +7 -4
  70. package/dist/es5/types.js +1 -1
  71. package/dist/es5/types.js.map +1 -1
  72. package/dist/es5/utils.d.ts +1 -1
  73. package/dist/es5/utils.js +1 -1
  74. package/dist/es5/utils.js.map +1 -1
  75. package/dist/gridstack-all.js +1 -1
  76. package/dist/gridstack-all.js.LICENSE.txt +1 -1
  77. package/dist/gridstack-all.js.map +1 -1
  78. package/dist/gridstack-engine.d.ts +1 -1
  79. package/dist/gridstack-engine.js +1 -1
  80. package/dist/gridstack-engine.js.map +1 -1
  81. package/dist/gridstack.css +1 -1
  82. package/dist/gridstack.d.ts +16 -7
  83. package/dist/gridstack.js +634 -42
  84. package/dist/gridstack.js.map +1 -1
  85. package/dist/src/gridstack.scss +1 -1
  86. package/dist/types.d.ts +7 -4
  87. package/dist/types.js +1 -1
  88. package/dist/types.js.map +1 -1
  89. package/dist/utils.d.ts +1 -1
  90. package/dist/utils.js +1 -1
  91. package/dist/utils.js.map +1 -1
  92. package/doc/CHANGES.md +12 -5
  93. package/doc/README.md +0 -2
  94. package/package.json +2 -2
package/dist/gridstack.js CHANGED
@@ -12,7 +12,7 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
12
12
  Object.defineProperty(exports, "__esModule", { value: true });
13
13
  exports.GridStack = void 0;
14
14
  /*!
15
- * GridStack 7.1.1
15
+ * GridStack 7.1.2
16
16
  * https://gridstackjs.com/
17
17
  *
18
18
  * Copyright (c) 2021-2022 Alain Dumesny
@@ -21,10 +21,22 @@ exports.GridStack = void 0;
21
21
  const gridstack_engine_1 = require("./gridstack-engine");
22
22
  const utils_1 = require("./utils");
23
23
  const types_1 = require("./types");
24
+ /*
25
+ * and include D&D by default
26
+ * TODO: while we could generate a gridstack-static.js at smaller size - saves about 31k (41k -> 72k)
27
+ * I don't know how to generate the DD only code at the remaining 31k to delay load as code depends on Gridstack.ts
28
+ * also it caused loading issues in prod - see https://github.com/gridstack/gridstack.js/issues/2039
29
+ */
30
+ const dd_gridstack_1 = require("./dd-gridstack");
31
+ const dd_touch_1 = require("./dd-touch");
32
+ const dd_manager_1 = require("./dd-manager");
33
+ /** global instance */
34
+ const dd = new dd_gridstack_1.DDGridStack;
24
35
  // export all dependent file as well to make it easier for users to just import the main file
25
36
  __exportStar(require("./types"), exports);
26
37
  __exportStar(require("./utils"), exports);
27
38
  __exportStar(require("./gridstack-engine"), exports);
39
+ __exportStar(require("./dd-gridstack"), exports);
28
40
  /**
29
41
  * Main gridstack class - you will need to call `GridStack.init()` first to initialize your grid.
30
42
  * Note: your grid elements MUST have the following classes for the CSS layout to work:
@@ -49,6 +61,9 @@ class GridStack {
49
61
  this._extraDragRow = 0;
50
62
  this.el = el; // exposed HTML element to the user
51
63
  opts = opts || {}; // handles null/undefined/0
64
+ if (!el.classList.contains('grid-stack')) {
65
+ this.el.classList.add('grid-stack');
66
+ }
52
67
  // if row property exists, replace minRow and maxRow instead
53
68
  if (opts.row) {
54
69
  opts.minRow = opts.maxRow = opts.row;
@@ -305,28 +320,34 @@ class GridStack {
305
320
  return w.x !== undefined || w.y !== undefined || w.w !== undefined || w.h !== undefined || w.content !== undefined ? true : false;
306
321
  }
307
322
  let el;
323
+ let node;
308
324
  if (typeof els === 'string') {
309
325
  let doc = document.implementation.createHTMLDocument(''); // IE needs a param
310
326
  doc.body.innerHTML = els;
311
327
  el = doc.body.children[0];
312
328
  }
313
329
  else if (arguments.length === 0 || arguments.length === 1 && isGridStackWidget(els)) {
314
- let content = els ? els.content || '' : '';
315
- options = els;
316
- let doc = document.implementation.createHTMLDocument(''); // IE needs a param
317
- doc.body.innerHTML = `<div class="grid-stack-item ${this.opts.itemClass || ''}"><div class="grid-stack-item-content">${content}</div></div>`;
318
- el = doc.body.children[0];
330
+ node = options = els;
331
+ if (node === null || node === void 0 ? void 0 : node.el) {
332
+ el = node.el; // re-use element stored in the node
333
+ }
334
+ else {
335
+ let content = (options === null || options === void 0 ? void 0 : options.content) || '';
336
+ let doc = document.implementation.createHTMLDocument(''); // IE needs a param
337
+ doc.body.innerHTML = `<div class="grid-stack-item ${this.opts.itemClass || ''}"><div class="grid-stack-item-content">${content}</div></div>`;
338
+ el = doc.body.children[0];
339
+ }
319
340
  }
320
341
  else {
321
342
  el = els;
322
343
  }
323
344
  // Tempting to initialize the passed in opt with default and valid values, but this break knockout demos
324
- // as the actual value are filled in when _prepareElement() calls el.getAttribute('gs-xyz) before adding the node.
345
+ // as the actual value are filled in when _prepareElement() calls el.getAttribute('gs-xyz') before adding the node.
325
346
  // So make sure we load any DOM attributes that are not specified in passed in options (which override)
326
347
  let domAttr = this._readAttr(el);
327
348
  options = utils_1.Utils.cloneDeep(options) || {}; // make a copy before we modify in case caller re-uses it
328
349
  utils_1.Utils.defaults(options, domAttr);
329
- let node = this.engine.prepareNode(options);
350
+ node = this.engine.prepareNode(options);
330
351
  this._writeAttr(el, options);
331
352
  if (this._insertNotAppend) {
332
353
  this.el.prepend(el);
@@ -574,7 +595,7 @@ class GridStack {
574
595
  w = addAndRemove(this, w, true).gridstackNode;
575
596
  }
576
597
  else {
577
- w = this.addWidget(w).gridstackNode;
598
+ w = (w.el ? this.addWidget(w.el, w) : this.addWidget(w)).gridstackNode;
578
599
  }
579
600
  }
580
601
  });
@@ -960,14 +981,20 @@ class GridStack {
960
981
  * Toggle the grid static state, which permanently removes/add Drag&Drop support, unlike disable()/enable() that just turns it off/on.
961
982
  * Also toggle the grid-stack-static class.
962
983
  * @param val if true the grid become static.
984
+ * @param updateClass true (default) if css class gets updated
985
+ * @param recurse true (default) if sub-grids also get updated
963
986
  */
964
- setStatic(val, updateClass = true) {
987
+ setStatic(val, updateClass = true, recurse = true) {
965
988
  if (this.opts.staticGrid === val)
966
989
  return this;
967
990
  this.opts.staticGrid = val;
968
991
  this._setupRemoveDrop();
969
992
  this._setupAcceptWidget();
970
- this.engine.nodes.forEach(n => this._prepareDragDropByNode(n)); // either delete or init Drag&drop
993
+ this.engine.nodes.forEach(n => {
994
+ this._prepareDragDropByNode(n); // either delete or init Drag&drop
995
+ if (n.subGrid && recurse)
996
+ n.subGrid.setStatic(val, updateClass, recurse);
997
+ });
971
998
  if (updateClass) {
972
999
  this._setStaticClass();
973
1000
  }
@@ -1226,10 +1253,8 @@ class GridStack {
1226
1253
  }
1227
1254
  /** @internal */
1228
1255
  _prepareElement(el, triggerAddEvent = false, node) {
1229
- if (!node) {
1230
- el.classList.add(this.opts.itemClass);
1231
- node = this._readAttr(el);
1232
- }
1256
+ el.classList.add(this.opts.itemClass);
1257
+ node = node || this._readAttr(el);
1233
1258
  el.gridstackNode = node;
1234
1259
  node.el = el;
1235
1260
  node.grid = this;
@@ -1460,14 +1485,15 @@ class GridStack {
1460
1485
  }
1461
1486
  return this;
1462
1487
  }
1463
- /*
1464
- * drag&drop empty stubs that will be implemented in dd-gridstack.ts for non static grid
1465
- * so we don't incur the load unless needed.
1466
- * NOTE: had to make those methods public in order to define them else as
1467
- * GridStack.prototype._setupAcceptWidget = function()
1468
- * maybe there is a better way ????
1488
+ /* ===========================================================================================
1489
+ * drag&drop methods that used to be stubbed out and implemented in dd-gridstack.ts
1490
+ * but caused loading issues in prod - see https://github.com/gridstack/gridstack.js/issues/2039
1491
+ * ===========================================================================================
1469
1492
  */
1470
- /* eslint-disable @typescript-eslint/no-unused-vars */
1493
+ /** get the global (but static to this code) DD implementation */
1494
+ static getDD() {
1495
+ return dd;
1496
+ }
1471
1497
  /**
1472
1498
  * call to setup dragging in from the outside (say toolbar), by specifying the class selection and options.
1473
1499
  * Called during GridStack.init() as options, but can also be called directly (last param are used) in case the toolbar
@@ -1475,20 +1501,59 @@ class GridStack {
1475
1501
  * @param dragIn string selector (ex: '.sidebar .grid-stack-item')
1476
1502
  * @param dragInOptions options - see DDDragInOpt. (default: {handle: '.grid-stack-item-content', appendTo: 'body'}
1477
1503
  **/
1478
- static setupDragIn(dragIn, dragInOptions) { }
1504
+ static setupDragIn(dragIn, dragInOptions) {
1505
+ if ((dragInOptions === null || dragInOptions === void 0 ? void 0 : dragInOptions.pause) !== undefined) {
1506
+ dd_manager_1.DDManager.pauseDrag = dragInOptions.pause;
1507
+ }
1508
+ if (typeof dragIn === 'string') {
1509
+ dragInOptions = Object.assign(Object.assign({}, types_1.dragInDefaultOptions), (dragInOptions || {}));
1510
+ utils_1.Utils.getElements(dragIn).forEach(el => {
1511
+ if (!dd.isDraggable(el))
1512
+ dd.dragIn(el, dragInOptions);
1513
+ });
1514
+ }
1515
+ }
1479
1516
  /**
1480
1517
  * Enables/Disables dragging by the user of specific grid element. If you want all items, and have it affect future items, use enableMove() instead. No-op for static grids.
1481
1518
  * IF you are looking to prevent an item from moving (due to being pushed around by another during collision) use locked property instead.
1482
1519
  * @param els widget or selector to modify.
1483
1520
  * @param val if true widget will be draggable.
1484
1521
  */
1485
- movable(els, val) { return this; }
1522
+ movable(els, val) {
1523
+ if (this.opts.staticGrid)
1524
+ return this; // can't move a static grid!
1525
+ GridStack.getElements(els).forEach(el => {
1526
+ let node = el.gridstackNode;
1527
+ if (!node)
1528
+ return;
1529
+ if (val)
1530
+ delete node.noMove;
1531
+ else
1532
+ node.noMove = true;
1533
+ this._prepareDragDropByNode(node); // init DD if need be, and adjust
1534
+ });
1535
+ return this;
1536
+ }
1486
1537
  /**
1487
1538
  * Enables/Disables user resizing of specific grid element. If you want all items, and have it affect future items, use enableResize() instead. No-op for static grids.
1488
1539
  * @param els widget or selector to modify
1489
1540
  * @param val if true widget will be resizable.
1490
1541
  */
1491
- resizable(els, val) { return this; }
1542
+ resizable(els, val) {
1543
+ if (this.opts.staticGrid)
1544
+ return this; // can't resize a static grid!
1545
+ GridStack.getElements(els).forEach(el => {
1546
+ let node = el.gridstackNode;
1547
+ if (!node)
1548
+ return;
1549
+ if (val)
1550
+ delete node.noResize;
1551
+ else
1552
+ node.noResize = true;
1553
+ this._prepareDragDropByNode(node); // init DD if need be, and adjust
1554
+ });
1555
+ return this;
1556
+ }
1492
1557
  /**
1493
1558
  * Temporarily disables widgets moving/resizing.
1494
1559
  * If you want a more permanent way (which freezes up resources) use `setStatic(true)` instead.
@@ -1497,8 +1562,16 @@ class GridStack {
1497
1562
  * @example
1498
1563
  * grid.enableMove(false);
1499
1564
  * grid.enableResize(false);
1565
+ * @param recurse true (default) if sub-grids also get updated
1500
1566
  */
1501
- disable() { return this; }
1567
+ disable(recurse = true) {
1568
+ if (this.opts.staticGrid)
1569
+ return;
1570
+ this.enableMove(false, recurse);
1571
+ this.enableResize(false, recurse); // @ts-ignore
1572
+ this._triggerEvent('disable');
1573
+ return this;
1574
+ }
1502
1575
  /**
1503
1576
  * Re-enables widgets moving/resizing - see disable().
1504
1577
  * Note: no-op for static grid.
@@ -1506,30 +1579,552 @@ class GridStack {
1506
1579
  * @example
1507
1580
  * grid.enableMove(true);
1508
1581
  * grid.enableResize(true);
1582
+ * @param recurse true (default) if sub-grids also get updated
1509
1583
  */
1510
- enable() { return this; }
1584
+ enable(recurse = true) {
1585
+ if (this.opts.staticGrid)
1586
+ return;
1587
+ this.enableMove(true, recurse);
1588
+ this.enableResize(true, recurse); // @ts-ignore
1589
+ this._triggerEvent('enable');
1590
+ return this;
1591
+ }
1511
1592
  /**
1512
1593
  * Enables/disables widget moving. No-op for static grids.
1594
+ * @param recurse true (default) if sub-grids also get updated
1513
1595
  */
1514
- enableMove(doEnable) { return this; }
1596
+ enableMove(doEnable, recurse = true) {
1597
+ if (this.opts.staticGrid)
1598
+ return this; // can't move a static grid!
1599
+ this.opts.disableDrag = !doEnable; // FIRST before we update children as grid overrides #1658
1600
+ this.engine.nodes.forEach(n => {
1601
+ this.movable(n.el, doEnable);
1602
+ if (n.subGrid && recurse)
1603
+ n.subGrid.enableMove(doEnable, recurse);
1604
+ });
1605
+ return this;
1606
+ }
1515
1607
  /**
1516
1608
  * Enables/disables widget resizing. No-op for static grids.
1609
+ * @param recurse true (default) if sub-grids also get updated
1517
1610
  */
1518
- enableResize(doEnable) { return this; }
1611
+ enableResize(doEnable, recurse = true) {
1612
+ if (this.opts.staticGrid)
1613
+ return this; // can't size a static grid!
1614
+ this.opts.disableResize = !doEnable; // FIRST before we update children as grid overrides #1658
1615
+ this.engine.nodes.forEach(n => {
1616
+ this.resizable(n.el, doEnable);
1617
+ if (n.subGrid && recurse)
1618
+ n.subGrid.enableResize(doEnable, recurse);
1619
+ });
1620
+ return this;
1621
+ }
1519
1622
  /** @internal removes any drag&drop present (called during destroy) */
1520
- _removeDD(el) { return this; }
1521
- /** @internal called to add drag over support to support widgets */
1522
- _setupAcceptWidget() { return this; }
1623
+ _removeDD(el) {
1624
+ dd.draggable(el, 'destroy').resizable(el, 'destroy');
1625
+ if (el.gridstackNode) {
1626
+ delete el.gridstackNode._initDD; // reset our DD init flag
1627
+ }
1628
+ delete el.ddElement;
1629
+ return this;
1630
+ }
1631
+ /** @internal called to add drag over to support widgets being added externally */
1632
+ _setupAcceptWidget() {
1633
+ // check if we need to disable things
1634
+ if (this.opts.staticGrid || (!this.opts.acceptWidgets && !this.opts.removable)) {
1635
+ dd.droppable(this.el, 'destroy');
1636
+ return this;
1637
+ }
1638
+ // vars shared across all methods
1639
+ let cellHeight, cellWidth;
1640
+ let onDrag = (event, el, helper) => {
1641
+ let node = el.gridstackNode;
1642
+ if (!node)
1643
+ return;
1644
+ helper = helper || el;
1645
+ let parent = this.el.getBoundingClientRect();
1646
+ let { top, left } = helper.getBoundingClientRect();
1647
+ left -= parent.left;
1648
+ top -= parent.top;
1649
+ let ui = { position: { top, left } };
1650
+ if (node._temporaryRemoved) {
1651
+ node.x = Math.max(0, Math.round(left / cellWidth));
1652
+ node.y = Math.max(0, Math.round(top / cellHeight));
1653
+ delete node.autoPosition;
1654
+ this.engine.nodeBoundFix(node);
1655
+ // don't accept *initial* location if doesn't fit #1419 (locked drop region, or can't grow), but maybe try if it will go somewhere
1656
+ if (!this.engine.willItFit(node)) {
1657
+ node.autoPosition = true; // ignore x,y and try for any slot...
1658
+ if (!this.engine.willItFit(node)) {
1659
+ dd.off(el, 'drag'); // stop calling us
1660
+ return; // full grid or can't grow
1661
+ }
1662
+ if (node._willFitPos) {
1663
+ // use the auto position instead #1687
1664
+ utils_1.Utils.copyPos(node, node._willFitPos);
1665
+ delete node._willFitPos;
1666
+ }
1667
+ }
1668
+ // re-use the existing node dragging method
1669
+ this._onStartMoving(helper, event, ui, node, cellWidth, cellHeight);
1670
+ }
1671
+ else {
1672
+ // re-use the existing node dragging that does so much of the collision detection
1673
+ this._dragOrResize(helper, event, ui, node, cellWidth, cellHeight);
1674
+ }
1675
+ };
1676
+ dd.droppable(this.el, {
1677
+ accept: (el) => {
1678
+ let node = el.gridstackNode;
1679
+ // set accept drop to true on ourself (which we ignore) so we don't get "can't drop" icon in HTML5 mode while moving
1680
+ if ((node === null || node === void 0 ? void 0 : node.grid) === this)
1681
+ return true;
1682
+ if (!this.opts.acceptWidgets)
1683
+ return false;
1684
+ // check for accept method or class matching
1685
+ let canAccept = true;
1686
+ if (typeof this.opts.acceptWidgets === 'function') {
1687
+ canAccept = this.opts.acceptWidgets(el);
1688
+ }
1689
+ else {
1690
+ let selector = (this.opts.acceptWidgets === true ? '.grid-stack-item' : this.opts.acceptWidgets);
1691
+ canAccept = el.matches(selector);
1692
+ }
1693
+ // finally check to make sure we actually have space left #1571
1694
+ if (canAccept && node && this.opts.maxRow) {
1695
+ let n = { w: node.w, h: node.h, minW: node.minW, minH: node.minH }; // only width/height matters and autoPosition
1696
+ canAccept = this.engine.willItFit(n);
1697
+ }
1698
+ return canAccept;
1699
+ }
1700
+ })
1701
+ /**
1702
+ * entering our grid area
1703
+ */
1704
+ .on(this.el, 'dropover', (event, el, helper) => {
1705
+ // console.log(`over ${this.el.gridstack.opts.id} ${count++}`); // TEST
1706
+ let node = el.gridstackNode;
1707
+ // ignore drop enter on ourself (unless we temporarily removed) which happens on a simple drag of our item
1708
+ if ((node === null || node === void 0 ? void 0 : node.grid) === this && !node._temporaryRemoved) {
1709
+ // delete node._added; // reset this to track placeholder again in case we were over other grid #1484 (dropout doesn't always clear)
1710
+ return false; // prevent parent from receiving msg (which may be a grid as well)
1711
+ }
1712
+ // fix #1578 when dragging fast, we may not get a leave on the previous grid so force one now
1713
+ if ((node === null || node === void 0 ? void 0 : node.grid) && node.grid !== this && !node._temporaryRemoved) {
1714
+ // console.log('dropover without leave'); // TEST
1715
+ let otherGrid = node.grid;
1716
+ otherGrid._leave(el, helper);
1717
+ }
1718
+ // cache cell dimensions (which don't change), position can animate if we removed an item in otherGrid that affects us...
1719
+ cellWidth = this.cellWidth();
1720
+ cellHeight = this.getCellHeight(true);
1721
+ // load any element attributes if we don't have a node
1722
+ if (!node) { // @ts-ignore private read only on ourself
1723
+ node = this._readAttr(el);
1724
+ }
1725
+ if (!node.grid) {
1726
+ node._isExternal = true;
1727
+ el.gridstackNode = node;
1728
+ }
1729
+ // calculate the grid size based on element outer size
1730
+ helper = helper || el;
1731
+ let w = node.w || Math.round(helper.offsetWidth / cellWidth) || 1;
1732
+ let h = node.h || Math.round(helper.offsetHeight / cellHeight) || 1;
1733
+ // if the item came from another grid, make a copy and save the original info in case we go back there
1734
+ if (node.grid && node.grid !== this) {
1735
+ // copy the node original values (min/max/id/etc...) but override width/height/other flags which are this grid specific
1736
+ // console.log('dropover cloning node'); // TEST
1737
+ if (!el._gridstackNodeOrig)
1738
+ el._gridstackNodeOrig = node; // shouldn't have multiple nested!
1739
+ el.gridstackNode = node = Object.assign(Object.assign({}, node), { w, h, grid: this });
1740
+ this.engine.cleanupNode(node)
1741
+ .nodeBoundFix(node);
1742
+ // restore some internal fields we need after clearing them all
1743
+ node._initDD =
1744
+ node._isExternal = // DOM needs to be re-parented on a drop
1745
+ node._temporaryRemoved = true; // so it can be inserted onDrag below
1746
+ }
1747
+ else {
1748
+ node.w = w;
1749
+ node.h = h;
1750
+ node._temporaryRemoved = true; // so we can insert it
1751
+ }
1752
+ // clear any marked for complete removal (Note: don't check _isAboutToRemove as that is cleared above - just do it)
1753
+ this._itemRemoving(node.el, false);
1754
+ dd.on(el, 'drag', onDrag);
1755
+ // make sure this is called at least once when going fast #1578
1756
+ onDrag(event, el, helper);
1757
+ return false; // prevent parent from receiving msg (which may be a grid as well)
1758
+ })
1759
+ /**
1760
+ * Leaving our grid area...
1761
+ */
1762
+ .on(this.el, 'dropout', (event, el, helper) => {
1763
+ // console.log(`out ${this.el.gridstack.opts.id} ${count++}`); // TEST
1764
+ let node = el.gridstackNode;
1765
+ if (!node)
1766
+ return false;
1767
+ // fix #1578 when dragging fast, we might get leave after other grid gets enter (which calls us to clean)
1768
+ // so skip this one if we're not the active grid really..
1769
+ if (!node.grid || node.grid === this) {
1770
+ this._leave(el, helper);
1771
+ // if we were created as temporary nested grid, go back to before state
1772
+ if (this._isTemp) {
1773
+ this.removeAsSubGrid(node);
1774
+ }
1775
+ }
1776
+ return false; // prevent parent from receiving msg (which may be grid as well)
1777
+ })
1778
+ /**
1779
+ * end - releasing the mouse
1780
+ */
1781
+ .on(this.el, 'drop', (event, el, helper) => {
1782
+ var _a, _b;
1783
+ let node = el.gridstackNode;
1784
+ // ignore drop on ourself from ourself that didn't come from the outside - dragend will handle the simple move instead
1785
+ if ((node === null || node === void 0 ? void 0 : node.grid) === this && !node._isExternal)
1786
+ return false;
1787
+ let wasAdded = !!this.placeholder.parentElement; // skip items not actually added to us because of constrains, but do cleanup #1419
1788
+ this.placeholder.remove();
1789
+ // notify previous grid of removal
1790
+ // console.log('drop delete _gridstackNodeOrig') // TEST
1791
+ let origNode = el._gridstackNodeOrig;
1792
+ delete el._gridstackNodeOrig;
1793
+ if (wasAdded && (origNode === null || origNode === void 0 ? void 0 : origNode.grid) && origNode.grid !== this) {
1794
+ let oGrid = origNode.grid;
1795
+ oGrid.engine.removedNodes.push(origNode);
1796
+ oGrid._triggerRemoveEvent();
1797
+ // if it's an empty sub-grid, to get auto-created, nuke it
1798
+ if (oGrid.parentGridItem && !oGrid.engine.nodes.length && oGrid.opts.subGridDynamic) {
1799
+ oGrid.removeAsSubGrid();
1800
+ }
1801
+ }
1802
+ if (!node)
1803
+ return false;
1804
+ // use existing placeholder node as it's already in our list with drop location
1805
+ if (wasAdded) {
1806
+ this.engine.cleanupNode(node); // removes all internal _xyz values
1807
+ node.grid = this;
1808
+ }
1809
+ dd.off(el, 'drag');
1810
+ // if we made a copy ('helper' which is temp) of the original node then insert a copy, else we move the original node (#1102)
1811
+ // as the helper will be nuked by jquery-ui otherwise
1812
+ if (helper !== el) {
1813
+ helper.remove();
1814
+ el.gridstackNode = origNode; // original item (left behind) is re-stored to pre dragging as the node now has drop info
1815
+ if (wasAdded) {
1816
+ el = el.cloneNode(true);
1817
+ }
1818
+ }
1819
+ else {
1820
+ el.remove(); // reduce flicker as we change depth here, and size further down
1821
+ this._removeDD(el);
1822
+ }
1823
+ if (!wasAdded)
1824
+ return false;
1825
+ el.gridstackNode = node;
1826
+ node.el = el;
1827
+ let subGrid = (_b = (_a = node.subGrid) === null || _a === void 0 ? void 0 : _a.el) === null || _b === void 0 ? void 0 : _b.gridstack; // set when actual sub-grid present
1828
+ // @ts-ignore
1829
+ utils_1.Utils.copyPos(node, this._readAttr(this.placeholder)); // placeholder values as moving VERY fast can throw things off #1578
1830
+ utils_1.Utils.removePositioningStyles(el); // @ts-ignore
1831
+ this._writeAttr(el, node);
1832
+ this.el.appendChild(el); // @ts-ignore // TODO: now would be ideal time to _removeHelperStyle() overriding floating styles (native only)
1833
+ if (subGrid) {
1834
+ subGrid.parentGridItem = node;
1835
+ if (!subGrid.opts.styleInHead)
1836
+ subGrid._updateStyles(true); // re-create sub-grid styles now that we've moved
1837
+ }
1838
+ this._updateContainerHeight();
1839
+ this.engine.addedNodes.push(node); // @ts-ignore
1840
+ this._triggerAddEvent(); // @ts-ignore
1841
+ this._triggerChangeEvent();
1842
+ this.engine.endUpdate();
1843
+ if (this._gsEventHandler['dropped']) {
1844
+ this._gsEventHandler['dropped'](Object.assign(Object.assign({}, event), { type: 'dropped' }), origNode && origNode.grid ? origNode : undefined, node);
1845
+ }
1846
+ // wait till we return out of the drag callback to set the new drag&resize handler or they may get messed up
1847
+ window.setTimeout(() => {
1848
+ // IFF we are still there (some application will use as placeholder and insert their real widget instead and better call makeWidget())
1849
+ if (node.el && node.el.parentElement) {
1850
+ this._prepareDragDropByNode(node);
1851
+ }
1852
+ else {
1853
+ this.engine.removeNode(node);
1854
+ }
1855
+ delete node.grid._isTemp;
1856
+ });
1857
+ return false; // prevent parent from receiving msg (which may be grid as well)
1858
+ });
1859
+ return this;
1860
+ }
1861
+ /** @internal mark item for removal */
1862
+ _itemRemoving(el, remove) {
1863
+ let node = el ? el.gridstackNode : undefined;
1864
+ if (!node || !node.grid)
1865
+ return;
1866
+ remove ? node._isAboutToRemove = true : delete node._isAboutToRemove;
1867
+ remove ? el.classList.add('grid-stack-item-removing') : el.classList.remove('grid-stack-item-removing');
1868
+ }
1523
1869
  /** @internal called to setup a trash drop zone if the user specifies it */
1524
- _setupRemoveDrop() { return this; }
1870
+ _setupRemoveDrop() {
1871
+ if (!this.opts.staticGrid && typeof this.opts.removable === 'string') {
1872
+ let trashEl = document.querySelector(this.opts.removable);
1873
+ if (!trashEl)
1874
+ return this;
1875
+ // only register ONE drop-over/dropout callback for the 'trash', and it will
1876
+ // update the passed in item and parent grid because the 'trash' is a shared resource anyway,
1877
+ // and Native DD only has 1 event CB (having a list and technically a per grid removableOptions complicates things greatly)
1878
+ if (!dd.isDroppable(trashEl)) {
1879
+ dd.droppable(trashEl, this.opts.removableOptions)
1880
+ .on(trashEl, 'dropover', (event, el) => this._itemRemoving(el, true))
1881
+ .on(trashEl, 'dropout', (event, el) => this._itemRemoving(el, false));
1882
+ }
1883
+ }
1884
+ return this;
1885
+ }
1525
1886
  /** @internal prepares the element for drag&drop **/
1526
- _prepareDragDropByNode(node) { return this; }
1887
+ _prepareDragDropByNode(node) {
1888
+ let el = node.el;
1889
+ const noMove = node.noMove || this.opts.disableDrag;
1890
+ const noResize = node.noResize || this.opts.disableResize;
1891
+ // check for disabled grid first
1892
+ if (this.opts.staticGrid || (noMove && noResize)) {
1893
+ if (node._initDD) {
1894
+ this._removeDD(el); // nukes everything instead of just disable, will add some styles back next
1895
+ delete node._initDD;
1896
+ }
1897
+ el.classList.add('ui-draggable-disabled', 'ui-resizable-disabled'); // add styles one might depend on #1435
1898
+ return this;
1899
+ }
1900
+ if (!node._initDD) {
1901
+ // variables used/cashed between the 3 start/move/end methods, in addition to node passed above
1902
+ let cellWidth;
1903
+ let cellHeight;
1904
+ /** called when item starts moving/resizing */
1905
+ let onStartMoving = (event, ui) => {
1906
+ // trigger any 'dragstart' / 'resizestart' manually
1907
+ if (this._gsEventHandler[event.type]) {
1908
+ this._gsEventHandler[event.type](event, event.target);
1909
+ }
1910
+ cellWidth = this.cellWidth();
1911
+ cellHeight = this.getCellHeight(true); // force pixels for calculations
1912
+ this._onStartMoving(el, event, ui, node, cellWidth, cellHeight);
1913
+ };
1914
+ /** called when item is being dragged/resized */
1915
+ let dragOrResize = (event, ui) => {
1916
+ this._dragOrResize(el, event, ui, node, cellWidth, cellHeight);
1917
+ };
1918
+ /** called when the item stops moving/resizing */
1919
+ let onEndMoving = (event) => {
1920
+ this.placeholder.remove();
1921
+ delete node._moving;
1922
+ delete node._event;
1923
+ delete node._lastTried;
1924
+ // if the item has moved to another grid, we're done here
1925
+ let target = event.target;
1926
+ if (!target.gridstackNode || target.gridstackNode.grid !== this)
1927
+ return;
1928
+ node.el = target;
1929
+ if (node._isAboutToRemove) {
1930
+ let gridToNotify = el.gridstackNode.grid;
1931
+ if (gridToNotify._gsEventHandler[event.type]) {
1932
+ gridToNotify._gsEventHandler[event.type](event, target);
1933
+ }
1934
+ this._removeDD(el);
1935
+ gridToNotify.engine.removedNodes.push(node);
1936
+ gridToNotify._triggerRemoveEvent();
1937
+ // break circular links and remove DOM
1938
+ delete el.gridstackNode;
1939
+ delete node.el;
1940
+ el.remove();
1941
+ }
1942
+ else {
1943
+ utils_1.Utils.removePositioningStyles(target);
1944
+ if (node._temporaryRemoved) {
1945
+ // got removed - restore item back to before dragging position
1946
+ utils_1.Utils.copyPos(node, node._orig); // @ts-ignore
1947
+ this._writePosAttr(target, node);
1948
+ this.engine.addNode(node);
1949
+ }
1950
+ else {
1951
+ // move to new placeholder location
1952
+ this._writePosAttr(target, node);
1953
+ }
1954
+ if (this._gsEventHandler[event.type]) {
1955
+ this._gsEventHandler[event.type](event, target);
1956
+ }
1957
+ }
1958
+ // @ts-ignore
1959
+ this._extraDragRow = 0; // @ts-ignore
1960
+ this._updateContainerHeight(); // @ts-ignore
1961
+ this._triggerChangeEvent();
1962
+ this.engine.endUpdate();
1963
+ };
1964
+ dd.draggable(el, {
1965
+ start: onStartMoving,
1966
+ stop: onEndMoving,
1967
+ drag: dragOrResize
1968
+ }).resizable(el, {
1969
+ start: onStartMoving,
1970
+ stop: onEndMoving,
1971
+ resize: dragOrResize
1972
+ });
1973
+ node._initDD = true; // we've set DD support now
1974
+ }
1975
+ // finally fine tune move vs resize by disabling any part...
1976
+ dd.draggable(el, noMove ? 'disable' : 'enable')
1977
+ .resizable(el, noResize ? 'disable' : 'enable');
1978
+ return this;
1979
+ }
1527
1980
  /** @internal handles actual drag/resize start **/
1528
- _onStartMoving(el, event, ui, node, cellWidth, cellHeight) { return; }
1981
+ _onStartMoving(el, event, ui, node, cellWidth, cellHeight) {
1982
+ this.engine.cleanNodes()
1983
+ .beginUpdate(node);
1984
+ // @ts-ignore
1985
+ this._writePosAttr(this.placeholder, node);
1986
+ this.el.appendChild(this.placeholder);
1987
+ // console.log('_onStartMoving placeholder') // TEST
1988
+ node.el = this.placeholder;
1989
+ node._lastUiPosition = ui.position;
1990
+ node._prevYPix = ui.position.top;
1991
+ node._moving = (event.type === 'dragstart'); // 'dropover' are not initially moving so they can go exactly where they enter (will push stuff out of the way)
1992
+ delete node._lastTried;
1993
+ if (event.type === 'dropover' && node._temporaryRemoved) {
1994
+ // console.log('engine.addNode x=' + node.x); // TEST
1995
+ this.engine.addNode(node); // will add, fix collisions, update attr and clear _temporaryRemoved
1996
+ node._moving = true; // AFTER, mark as moving object (wanted fix location before)
1997
+ }
1998
+ // set the min/max resize info
1999
+ this.engine.cacheRects(cellWidth, cellHeight, this.opts.marginTop, this.opts.marginRight, this.opts.marginBottom, this.opts.marginLeft);
2000
+ if (event.type === 'resizestart') {
2001
+ dd.resizable(el, 'option', 'minWidth', cellWidth * (node.minW || 1))
2002
+ .resizable(el, 'option', 'minHeight', cellHeight * (node.minH || 1));
2003
+ if (node.maxW) {
2004
+ dd.resizable(el, 'option', 'maxWidth', cellWidth * node.maxW);
2005
+ }
2006
+ if (node.maxH) {
2007
+ dd.resizable(el, 'option', 'maxHeight', cellHeight * node.maxH);
2008
+ }
2009
+ }
2010
+ }
1529
2011
  /** @internal handles actual drag/resize **/
1530
- _dragOrResize(el, event, ui, node, cellWidth, cellHeight) { return; }
1531
- /** @internal called when a node leaves our area (mouse out or shape outside) **/
1532
- _leave(el, helper) { return; }
2012
+ _dragOrResize(el, event, ui, node, cellWidth, cellHeight) {
2013
+ 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)
2014
+ let resizing;
2015
+ let mLeft = this.opts.marginLeft, mRight = this.opts.marginRight, mTop = this.opts.marginTop, mBottom = this.opts.marginBottom;
2016
+ // if margins (which are used to pass mid point by) are large relative to cell height/width, reduce them down #1855
2017
+ let mHeight = Math.round(cellHeight * 0.1), mWidth = Math.round(cellWidth * 0.1);
2018
+ mLeft = Math.min(mLeft, mWidth);
2019
+ mRight = Math.min(mRight, mWidth);
2020
+ mTop = Math.min(mTop, mHeight);
2021
+ mBottom = Math.min(mBottom, mHeight);
2022
+ if (event.type === 'drag') {
2023
+ if (node._temporaryRemoved)
2024
+ return; // handled by dropover
2025
+ let distance = ui.position.top - node._prevYPix;
2026
+ node._prevYPix = ui.position.top;
2027
+ utils_1.Utils.updateScrollPosition(el, ui.position, distance);
2028
+ // get new position taking into account the margin in the direction we are moving! (need to pass mid point by margin)
2029
+ let left = ui.position.left + (ui.position.left > node._lastUiPosition.left ? -mRight : mLeft);
2030
+ let top = ui.position.top + (ui.position.top > node._lastUiPosition.top ? -mBottom : mTop);
2031
+ p.x = Math.round(left / cellWidth);
2032
+ p.y = Math.round(top / cellHeight);
2033
+ // @ts-ignore// if we're at the bottom hitting something else, grow the grid so cursor doesn't leave when trying to place below others
2034
+ let prev = this._extraDragRow;
2035
+ if (this.engine.collide(node, p)) {
2036
+ let row = this.getRow();
2037
+ let extra = Math.max(0, (p.y + node.h) - row);
2038
+ if (this.opts.maxRow && row + extra > this.opts.maxRow) {
2039
+ extra = Math.max(0, this.opts.maxRow - row);
2040
+ } // @ts-ignore
2041
+ this._extraDragRow = extra; // @ts-ignore
2042
+ }
2043
+ else
2044
+ this._extraDragRow = 0; // @ts-ignore
2045
+ if (this._extraDragRow !== prev)
2046
+ this._updateContainerHeight();
2047
+ if (node.x === p.x && node.y === p.y)
2048
+ return; // skip same
2049
+ // DON'T skip one we tried as we might have failed because of coverage <50% before
2050
+ // if (node._lastTried && node._lastTried.x === x && node._lastTried.y === y) return;
2051
+ }
2052
+ else if (event.type === 'resize') {
2053
+ if (p.x < 0)
2054
+ return;
2055
+ // Scrolling page if needed
2056
+ utils_1.Utils.updateScrollResize(event, el, cellHeight);
2057
+ // get new size
2058
+ p.w = Math.round((ui.size.width - mLeft) / cellWidth);
2059
+ p.h = Math.round((ui.size.height - mTop) / cellHeight);
2060
+ if (node.w === p.w && node.h === p.h)
2061
+ return;
2062
+ if (node._lastTried && node._lastTried.w === p.w && node._lastTried.h === p.h)
2063
+ return; // skip one we tried (but failed)
2064
+ // if we size on left/top side this might move us, so get possible new position as well
2065
+ let left = ui.position.left + mLeft;
2066
+ let top = ui.position.top + mTop;
2067
+ p.x = Math.round(left / cellWidth);
2068
+ p.y = Math.round(top / cellHeight);
2069
+ resizing = true;
2070
+ }
2071
+ node._event = event;
2072
+ node._lastTried = p; // set as last tried (will nuke if we go there)
2073
+ let rect = {
2074
+ x: ui.position.left + mLeft,
2075
+ y: ui.position.top + mTop,
2076
+ w: (ui.size ? ui.size.width : node.w * cellWidth) - mLeft - mRight,
2077
+ h: (ui.size ? ui.size.height : node.h * cellHeight) - mTop - mBottom
2078
+ };
2079
+ if (this.engine.moveNodeCheck(node, Object.assign(Object.assign({}, p), { cellWidth, cellHeight, rect, resizing }))) {
2080
+ node._lastUiPosition = ui.position;
2081
+ this.engine.cacheRects(cellWidth, cellHeight, mTop, mRight, mBottom, mLeft);
2082
+ delete node._skipDown;
2083
+ if (resizing && node.subGrid) {
2084
+ node.subGrid.onParentResize();
2085
+ } // @ts-ignore
2086
+ this._extraDragRow = 0; // @ts-ignore
2087
+ this._updateContainerHeight();
2088
+ let target = event.target; // @ts-ignore
2089
+ this._writePosAttr(target, node);
2090
+ if (this._gsEventHandler[event.type]) {
2091
+ this._gsEventHandler[event.type](event, target);
2092
+ }
2093
+ }
2094
+ }
2095
+ /** @internal called when item leaving our area by either cursor dropout event
2096
+ * or shape is outside our boundaries. remove it from us, and mark temporary if this was
2097
+ * our item to start with else restore prev node values from prev grid it came from.
2098
+ **/
2099
+ _leave(el, helper) {
2100
+ let node = el.gridstackNode;
2101
+ if (!node)
2102
+ return;
2103
+ dd.off(el, 'drag'); // no need to track while being outside
2104
+ // this gets called when cursor leaves and shape is outside, so only do this once
2105
+ if (node._temporaryRemoved)
2106
+ return;
2107
+ node._temporaryRemoved = true;
2108
+ this.engine.removeNode(node); // remove placeholder as well, otherwise it's a sign node is not in our list, which is a bigger issue
2109
+ node.el = node._isExternal && helper ? helper : el; // point back to real item being dragged
2110
+ if (this.opts.removable === true) { // boolean vs a class string
2111
+ // item leaving us and we are supposed to remove on leave (no need to drag onto trash) mark it so
2112
+ this._itemRemoving(el, true);
2113
+ }
2114
+ // finally if item originally came from another grid, but left us, restore things back to prev info
2115
+ if (el._gridstackNodeOrig) {
2116
+ // console.log('leave delete _gridstackNodeOrig') // TEST
2117
+ el.gridstackNode = el._gridstackNodeOrig;
2118
+ delete el._gridstackNodeOrig;
2119
+ }
2120
+ else if (node._isExternal) {
2121
+ // item came from outside (like a toolbar) so nuke any node info
2122
+ delete node.el;
2123
+ delete el.gridstackNode;
2124
+ // and restore all nodes back to original
2125
+ this.engine.restoreInitial();
2126
+ }
2127
+ }
1533
2128
  // legacy method removed
1534
2129
  commit() { utils_1.obsolete(this, this.batchUpdate(false), 'commit', 'batchUpdate', '5.2'); return this; }
1535
2130
  }
@@ -1538,8 +2133,5 @@ exports.GridStack = GridStack;
1538
2133
  GridStack.Utils = utils_1.Utils;
1539
2134
  /** scoping so users can call new GridStack.Engine(12) for example */
1540
2135
  GridStack.Engine = gridstack_engine_1.GridStackEngine;
1541
- GridStack.GDRev = '7.1.1';
1542
- const dd_touch_1 = require("./dd-touch");
1543
- const dd_manager_1 = require("./dd-manager");
1544
- __exportStar(require("./dd-gridstack"), exports);
2136
+ GridStack.GDRev = '7.1.2';
1545
2137
  //# sourceMappingURL=gridstack.js.map