gridstack 8.3.0 → 9.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 (116) hide show
  1. package/README.md +9 -2
  2. package/angular/projects/demo/src/app/app.component.html +32 -0
  3. package/angular/projects/demo/src/app/app.component.ts +20 -5
  4. package/angular/projects/demo/src/styles.css +37 -0
  5. package/angular/projects/lib/package.json +1 -1
  6. package/angular/projects/lib/src/lib/base-widget.ts +1 -1
  7. package/angular/projects/lib/src/lib/gridstack-item.component.ts +1 -1
  8. package/angular/projects/lib/src/lib/gridstack.component.ts +1 -1
  9. package/angular/projects/lib/src/lib/gridstack.module.ts +1 -1
  10. package/dist/angular/esm2020/lib/base-widget.mjs +2 -2
  11. package/dist/angular/esm2020/lib/gridstack-item.component.mjs +2 -2
  12. package/dist/angular/esm2020/lib/gridstack.component.mjs +2 -2
  13. package/dist/angular/esm2020/lib/gridstack.module.mjs +2 -2
  14. package/dist/angular/fesm2015/gridstack-angular.mjs +4 -4
  15. package/dist/angular/fesm2015/gridstack-angular.mjs.map +1 -1
  16. package/dist/angular/fesm2020/gridstack-angular.mjs +4 -4
  17. package/dist/angular/fesm2020/gridstack-angular.mjs.map +1 -1
  18. package/dist/angular/lib/gridstack-item.component.d.ts +1 -1
  19. package/dist/angular/lib/gridstack.component.d.ts +1 -1
  20. package/dist/angular/package.json +1 -1
  21. package/dist/angular/src/base-widget.ts +1 -1
  22. package/dist/angular/src/gridstack-item.component.ts +1 -1
  23. package/dist/angular/src/gridstack.component.ts +1 -1
  24. package/dist/angular/src/gridstack.module.ts +1 -1
  25. package/dist/dd-base-impl.d.ts +1 -1
  26. package/dist/dd-base-impl.js +1 -1
  27. package/dist/dd-base-impl.js.map +1 -1
  28. package/dist/dd-draggable.d.ts +1 -1
  29. package/dist/dd-draggable.js +1 -1
  30. package/dist/dd-draggable.js.map +1 -1
  31. package/dist/dd-droppable.d.ts +1 -1
  32. package/dist/dd-droppable.js +2 -2
  33. package/dist/dd-droppable.js.map +1 -1
  34. package/dist/dd-element.d.ts +1 -1
  35. package/dist/dd-element.js +1 -1
  36. package/dist/dd-element.js.map +1 -1
  37. package/dist/dd-gridstack.d.ts +1 -1
  38. package/dist/dd-gridstack.js +1 -1
  39. package/dist/dd-gridstack.js.map +1 -1
  40. package/dist/dd-manager.d.ts +1 -1
  41. package/dist/dd-manager.js +1 -1
  42. package/dist/dd-manager.js.map +1 -1
  43. package/dist/dd-resizable-handle.d.ts +1 -1
  44. package/dist/dd-resizable-handle.js +1 -1
  45. package/dist/dd-resizable-handle.js.map +1 -1
  46. package/dist/dd-resizable.d.ts +1 -1
  47. package/dist/dd-resizable.js +1 -1
  48. package/dist/dd-resizable.js.map +1 -1
  49. package/dist/dd-touch.d.ts +1 -1
  50. package/dist/dd-touch.js +1 -1
  51. package/dist/dd-touch.js.map +1 -1
  52. package/dist/es5/dd-base-impl.d.ts +1 -1
  53. package/dist/es5/dd-base-impl.js +1 -1
  54. package/dist/es5/dd-base-impl.js.map +1 -1
  55. package/dist/es5/dd-draggable.d.ts +1 -1
  56. package/dist/es5/dd-draggable.js +1 -1
  57. package/dist/es5/dd-draggable.js.map +1 -1
  58. package/dist/es5/dd-droppable.d.ts +1 -1
  59. package/dist/es5/dd-droppable.js +2 -2
  60. package/dist/es5/dd-droppable.js.map +1 -1
  61. package/dist/es5/dd-element.d.ts +1 -1
  62. package/dist/es5/dd-element.js +1 -1
  63. package/dist/es5/dd-element.js.map +1 -1
  64. package/dist/es5/dd-gridstack.d.ts +1 -1
  65. package/dist/es5/dd-gridstack.js +1 -1
  66. package/dist/es5/dd-gridstack.js.map +1 -1
  67. package/dist/es5/dd-manager.d.ts +1 -1
  68. package/dist/es5/dd-manager.js +1 -1
  69. package/dist/es5/dd-manager.js.map +1 -1
  70. package/dist/es5/dd-resizable-handle.d.ts +1 -1
  71. package/dist/es5/dd-resizable-handle.js +1 -1
  72. package/dist/es5/dd-resizable-handle.js.map +1 -1
  73. package/dist/es5/dd-resizable.d.ts +1 -1
  74. package/dist/es5/dd-resizable.js +1 -1
  75. package/dist/es5/dd-resizable.js.map +1 -1
  76. package/dist/es5/dd-touch.d.ts +1 -1
  77. package/dist/es5/dd-touch.js +1 -1
  78. package/dist/es5/dd-touch.js.map +1 -1
  79. package/dist/es5/gridstack-all.js +1 -1
  80. package/dist/es5/gridstack-all.js.LICENSE.txt +1 -1
  81. package/dist/es5/gridstack-all.js.map +1 -1
  82. package/dist/es5/gridstack-engine.d.ts +1 -1
  83. package/dist/es5/gridstack-engine.js +23 -15
  84. package/dist/es5/gridstack-engine.js.map +1 -1
  85. package/dist/es5/gridstack-poly.js +1 -1
  86. package/dist/es5/gridstack.d.ts +21 -8
  87. package/dist/es5/gridstack.js +167 -80
  88. package/dist/es5/gridstack.js.map +1 -1
  89. package/dist/es5/types.d.ts +10 -2
  90. package/dist/es5/types.js +3 -2
  91. package/dist/es5/types.js.map +1 -1
  92. package/dist/es5/utils.d.ts +3 -1
  93. package/dist/es5/utils.js +7 -3
  94. package/dist/es5/utils.js.map +1 -1
  95. package/dist/gridstack-all.js +1 -1
  96. package/dist/gridstack-all.js.LICENSE.txt +1 -1
  97. package/dist/gridstack-all.js.map +1 -1
  98. package/dist/gridstack-engine.d.ts +1 -1
  99. package/dist/gridstack-engine.js +21 -15
  100. package/dist/gridstack-engine.js.map +1 -1
  101. package/dist/gridstack.css +4 -1
  102. package/dist/gridstack.d.ts +21 -8
  103. package/dist/gridstack.js +157 -77
  104. package/dist/gridstack.js.map +1 -1
  105. package/dist/gridstack.min.css +1 -1
  106. package/dist/src/gridstack.scss +4 -1
  107. package/dist/types.d.ts +10 -2
  108. package/dist/types.js +3 -2
  109. package/dist/types.js.map +1 -1
  110. package/dist/utils.d.ts +3 -1
  111. package/dist/utils.js +7 -3
  112. package/dist/utils.js.map +1 -1
  113. package/doc/CHANGES.md +12 -0
  114. package/doc/README.md +3 -1
  115. package/package.json +1 -1
  116. package/angular/projects/demo/src/environments/environment.prod.ts +0 -3
@@ -36,7 +36,7 @@ var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
36
36
  Object.defineProperty(exports, "__esModule", { value: true });
37
37
  exports.GridStack = void 0;
38
38
  /*!
39
- * GridStack 8.3.0
39
+ * GridStack 9.0.0
40
40
  * https://gridstackjs.com/
41
41
  *
42
42
  * Copyright (c) 2021-2022 Alain Dumesny
@@ -108,7 +108,8 @@ var GridStack = exports.GridStack = /** @class */ (function () {
108
108
  var defaults = __assign(__assign({}, utils_1.Utils.cloneDeep(types_1.gridDefaults)), { column: utils_1.Utils.toNumber(el.getAttribute('gs-column')) || types_1.gridDefaults.column, minRow: rowAttr ? rowAttr : utils_1.Utils.toNumber(el.getAttribute('gs-min-row')) || types_1.gridDefaults.minRow, maxRow: rowAttr ? rowAttr : utils_1.Utils.toNumber(el.getAttribute('gs-max-row')) || types_1.gridDefaults.maxRow, staticGrid: utils_1.Utils.toBool(el.getAttribute('gs-static')) || types_1.gridDefaults.staticGrid, draggable: {
109
109
  handle: (opts.handleClass ? '.' + opts.handleClass : (opts.handle ? opts.handle : '')) || types_1.gridDefaults.draggable.handle,
110
110
  }, removableOptions: {
111
- accept: opts.itemClass ? '.' + opts.itemClass : types_1.gridDefaults.removableOptions.accept,
111
+ accept: opts.itemClass || types_1.gridDefaults.removableOptions.accept,
112
+ decline: types_1.gridDefaults.removableOptions.decline
112
113
  } });
113
114
  if (el.getAttribute('gs-animate')) { // default to true, but if set to false use that instead
114
115
  defaults.animate = utils_1.Utils.toBool(el.getAttribute('gs-animate'));
@@ -201,7 +202,7 @@ var GridStack = exports.GridStack = /** @class */ (function () {
201
202
  dd_manager_1.DDManager.pauseDrag = this.opts.draggable.pause;
202
203
  this._setupRemoveDrop();
203
204
  this._setupAcceptWidget();
204
- this._updateWindowResizeEvent();
205
+ this._updateResizeEvent();
205
206
  }
206
207
  /**
207
208
  * initializing the HTML element, or selector string, into a grid will return the grid. Calling it again will
@@ -593,11 +594,13 @@ var GridStack = exports.GridStack = /** @class */ (function () {
593
594
  GridStack.prototype.load = function (layout, addRemove) {
594
595
  var _this = this;
595
596
  if (addRemove === void 0) { addRemove = GridStack.addRemoveCB || true; }
596
- var items = GridStack.Utils.sort(__spreadArray([], layout, true), -1, this._prevColumn || this.getColumn()); // make copy before we mod/sort
597
- this._insertNotAppend = true; // since create in reverse order...
597
+ // if passed list has coordinates, use them (insert from end to beginning for conflict resolution) else force widget same order
598
+ var haveCoord = layout.some(function (w) { return w.x !== undefined || w.y !== undefined; });
599
+ var items = haveCoord ? utils_1.Utils.sort(layout, -1, this._prevColumn || this.getColumn()) : layout;
600
+ this._insertNotAppend = haveCoord; // if we create in reverse order...
598
601
  // if we're loading a layout into for example 1 column (_prevColumn is set only when going to 1) and items don't fit, make sure to save
599
602
  // the original wanted layout so we can scale back up correctly #1471
600
- if (this._prevColumn && this._prevColumn !== this.opts.column && items.some(function (n) { return (n.x + n.w) > _this.opts.column; })) {
603
+ if (this._prevColumn && this._prevColumn !== this.opts.column && items.some(function (n) { return ((n.x || 0) + n.w) > _this.opts.column; })) {
601
604
  this._ignoreLayoutsNodeChange = true; // skip layout update
602
605
  this.engine.cacheLayout(items, this._prevColumn, true);
603
606
  }
@@ -609,8 +612,8 @@ var GridStack = exports.GridStack = /** @class */ (function () {
609
612
  this.batchUpdate();
610
613
  // see if any items are missing from new layout and need to be removed first
611
614
  if (addRemove) {
612
- var copyNodes = __spreadArray([], this.engine.nodes, true); // don't loop through array you modify
613
- copyNodes.forEach(function (n) {
615
+ var copyNodes_1 = __spreadArray([], this.engine.nodes, true); // don't loop through array you modify
616
+ copyNodes_1.forEach(function (n) {
614
617
  var item = items.find(function (w) { return n.id === w.id; });
615
618
  if (!item) {
616
619
  if (GridStack.addRemoveCB)
@@ -620,11 +623,20 @@ var GridStack = exports.GridStack = /** @class */ (function () {
620
623
  }
621
624
  });
622
625
  }
623
- // now add/update the widgets
626
+ // now add/update the widgets - starting with an empty list to reduce collision and add no-coord ones at next available spot
627
+ var copyNodes = this.engine.nodes;
628
+ this.engine.nodes = [];
624
629
  items.forEach(function (w) {
625
630
  var _a;
626
- var item = (w.id !== undefined) ? _this.engine.nodes.find(function (n) { return n.id === w.id; }) : undefined;
631
+ var item = (w.id !== undefined) ? copyNodes.find(function (n) { return n.id === w.id; }) : undefined;
627
632
  if (item) {
633
+ // check if missing coord, in which case find next empty slot with new (or old if missing) sizes
634
+ if (w.autoPosition || w.x === undefined || w.y === undefined) {
635
+ w.w = w.w || item.w;
636
+ w.h = w.h || item.h;
637
+ _this.engine.findEmptyPosition(w);
638
+ }
639
+ _this.engine.nodes.push(item); // now back to current list...
628
640
  _this.update(item.el, w);
629
641
  if ((_a = w.subGridOpts) === null || _a === void 0 ? void 0 : _a.children) { // update any sub grid as well
630
642
  var sub = item.el.querySelector('.grid-stack');
@@ -654,6 +666,7 @@ var GridStack = exports.GridStack = /** @class */ (function () {
654
666
  if (flag === void 0) { flag = true; }
655
667
  this.engine.batchUpdate(flag);
656
668
  if (!flag) {
669
+ this._updateContainerHeight();
657
670
  this._triggerRemoveEvent();
658
671
  this._triggerAddEvent();
659
672
  this._triggerChangeEvent();
@@ -699,7 +712,7 @@ var GridStack = exports.GridStack = /** @class */ (function () {
699
712
  if (update && val !== undefined) {
700
713
  if (this._isAutoCellHeight !== (val === 'auto')) {
701
714
  this._isAutoCellHeight = (val === 'auto');
702
- this._updateWindowResizeEvent();
715
+ this._updateResizeEvent();
703
716
  }
704
717
  }
705
718
  if (val === 'initial' || val === 'auto') {
@@ -757,7 +770,7 @@ var GridStack = exports.GridStack = /** @class */ (function () {
757
770
  */
758
771
  GridStack.prototype.column = function (column, layout) {
759
772
  if (layout === void 0) { layout = 'moveScale'; }
760
- if (column < 1 || this.opts.column === column)
773
+ if (!column || column < 1 || this.opts.column === column)
761
774
  return this;
762
775
  var oldColumn = this.getColumn();
763
776
  // if we go into 1 column mode (which happens if we're sized less than minW unless disableOneColumnMode is on)
@@ -787,6 +800,7 @@ var GridStack = exports.GridStack = /** @class */ (function () {
787
800
  this.engine.columnChanged(oldColumn, column, domNodes, layout);
788
801
  if (this._isAutoCellHeight)
789
802
  this.cellHeight();
803
+ this.doContentResize();
790
804
  // and trigger our event last...
791
805
  this._ignoreLayoutsNodeChange = true; // skip layout update
792
806
  this._triggerChangeEvent();
@@ -814,7 +828,7 @@ var GridStack = exports.GridStack = /** @class */ (function () {
814
828
  if (!this.el)
815
829
  return; // prevent multiple calls
816
830
  this.offAll();
817
- this._updateWindowResizeEvent(true);
831
+ this._updateResizeEvent(true);
818
832
  this.setStatic(true, false); // permanently removes DD but don't set CSS class (we're going away)
819
833
  this.setAnimation(false);
820
834
  if (!removeDOM) {
@@ -962,7 +976,8 @@ var GridStack = exports.GridStack = /** @class */ (function () {
962
976
  }
963
977
  this.el.addEventListener(name, this._gsEventHandler[name]);
964
978
  }
965
- else if (name === 'drag' || name === 'dragstart' || name === 'dragstop' || name === 'resizestart' || name === 'resize' || name === 'resizestop' || name === 'dropped') {
979
+ else if (name === 'drag' || name === 'dragstart' || name === 'dragstop' || name === 'resizestart' || name === 'resize'
980
+ || name === 'resizestop' || name === 'dropped' || name === 'resizecontent') {
966
981
  // drag&drop stop events NEED to be call them AFTER we update node attributes so handle them ourself.
967
982
  // do same for start event to make it easier...
968
983
  this._gsEventHandler[name] = callback;
@@ -1107,9 +1122,10 @@ var GridStack = exports.GridStack = /** @class */ (function () {
1107
1122
  return this.update(els, opt);
1108
1123
  }
1109
1124
  GridStack.getElements(els).forEach(function (el) {
1110
- if (!el || !el.gridstackNode)
1125
+ var _a;
1126
+ var n = el === null || el === void 0 ? void 0 : el.gridstackNode;
1127
+ if (!n)
1111
1128
  return;
1112
- var n = el.gridstackNode;
1113
1129
  var w = utils_1.Utils.cloneDeep(opt); // make a copy we can modify in case they re-use it or multiple items
1114
1130
  delete w.autoPosition;
1115
1131
  // move/resize widget if anything changed
@@ -1127,10 +1143,16 @@ var GridStack = exports.GridStack = /** @class */ (function () {
1127
1143
  m = {}; // will use node position but validate values
1128
1144
  }
1129
1145
  // check for content changing
1130
- if (w.content) {
1131
- var sub = el.querySelector('.grid-stack-item-content');
1132
- if (sub && sub.innerHTML !== w.content) {
1133
- sub.innerHTML = w.content;
1146
+ if (w.content !== undefined) {
1147
+ var itemContent = el.querySelector('.grid-stack-item-content');
1148
+ if (!itemContent || itemContent.innerHTML === w.content)
1149
+ return;
1150
+ itemContent.innerHTML = w.content;
1151
+ // restore any sub-grid back
1152
+ if ((_a = n.subGrid) === null || _a === void 0 ? void 0 : _a.el) {
1153
+ itemContent.appendChild(n.subGrid.el);
1154
+ if (!n.subGrid.opts.styleInHead)
1155
+ n.subGrid._updateStyles(true); // force create
1134
1156
  }
1135
1157
  delete w.content;
1136
1158
  }
@@ -1146,14 +1168,8 @@ var GridStack = exports.GridStack = /** @class */ (function () {
1146
1168
  }
1147
1169
  utils_1.Utils.sanitizeMinMax(n);
1148
1170
  // finally move the widget
1149
- if (m) {
1150
- _this.engine.cleanNodes()
1151
- .beginUpdate(n)
1152
- .moveNode(n, m);
1153
- _this._updateContainerHeight();
1154
- _this._triggerChangeEvent();
1155
- _this.engine.endUpdate();
1156
- }
1171
+ if (m)
1172
+ _this.moveNode(n, m);
1157
1173
  if (changed) { // move will only update x,y,w,h so update the rest too
1158
1174
  _this._writeAttr(el, n);
1159
1175
  }
@@ -1163,6 +1179,56 @@ var GridStack = exports.GridStack = /** @class */ (function () {
1163
1179
  });
1164
1180
  return this;
1165
1181
  };
1182
+ GridStack.prototype.moveNode = function (n, m) {
1183
+ this.engine.cleanNodes()
1184
+ .beginUpdate(n)
1185
+ .moveNode(n, m);
1186
+ this._updateContainerHeight();
1187
+ this._triggerChangeEvent();
1188
+ this.engine.endUpdate();
1189
+ };
1190
+ /** Updates widget height to match the content height to avoid v-scrollbar or dead space.
1191
+ Note: this assumes only 1 child under '.grid-stack-item-content' (sized to gridItem minus padding) that is at the entire content size wanted */
1192
+ GridStack.prototype.resizeToContent = function (els) {
1193
+ var _this = this;
1194
+ GridStack.getElements(els).forEach(function (el) {
1195
+ var _a;
1196
+ var n = el === null || el === void 0 ? void 0 : el.gridstackNode;
1197
+ if (!n)
1198
+ return;
1199
+ if (el.parentElement !== n.grid.el)
1200
+ return; // skip if we are not inside a grid
1201
+ var height = el.clientHeight; // getBoundingClientRect().height seem to flicker back and forth
1202
+ if (!height)
1203
+ return; // 0 when hidden, skip
1204
+ var item = el.querySelector(GridStack.resizeToContentParent);
1205
+ if (!item)
1206
+ return;
1207
+ var itemH = item.clientHeight; // available height to our child (minus border, padding...)
1208
+ var wantedH = ((_a = item.firstChild) === null || _a === void 0 ? void 0 : _a.getBoundingClientRect().height) || itemH; // NOTE: clientHeight & getBoundingClientRect() is undefined for text and other leaf nodes. use <div> container!
1209
+ if (itemH === wantedH)
1210
+ return;
1211
+ height += wantedH - itemH;
1212
+ var cell = _this.getCellHeight();
1213
+ if (!cell)
1214
+ return;
1215
+ var h = Math.ceil(height / cell);
1216
+ if (n.maxH && h > n.maxH)
1217
+ h = n.maxH;
1218
+ if (h !== n.h) {
1219
+ _this._ignoreLayoutsNodeChange = true;
1220
+ _this.moveNode(n, { h: h });
1221
+ delete _this._ignoreLayoutsNodeChange;
1222
+ }
1223
+ });
1224
+ };
1225
+ /** call the user resize (so we can do extra work) else our build in version */
1226
+ GridStack.prototype.resizeToContentCheck = function (el) {
1227
+ if (GridStack.resizeToContentCB)
1228
+ GridStack.resizeToContentCB(el);
1229
+ else
1230
+ this.resizeToContent(el);
1231
+ };
1166
1232
  /**
1167
1233
  * Updates the margins which will set all 4 sides at once - see `GridStackOptions.margin` for format options (CSS string format of 1,2,4 values or single number).
1168
1234
  * @param value margin value
@@ -1360,6 +1426,8 @@ var GridStack = exports.GridStack = /** @class */ (function () {
1360
1426
  if (!utils_1.Utils.same(node, copy)) {
1361
1427
  this._writeAttr(el, node);
1362
1428
  }
1429
+ if (utils_1.Utils.shouldFitToContent(node))
1430
+ el.classList.add('fit-to-content');
1363
1431
  this._prepareDragDropByNode(node);
1364
1432
  return this;
1365
1433
  };
@@ -1455,67 +1523,87 @@ var GridStack = exports.GridStack = /** @class */ (function () {
1455
1523
  return this;
1456
1524
  };
1457
1525
  /**
1458
- * called when we are being resized by the window - check if the one Column Mode needs to be turned on/off
1459
- * and remember the prev columns we used, or get our count from parent, as well as check for auto cell height (square)
1526
+ * called when we are being resized - check if the one Column Mode needs to be turned on/off
1527
+ * and remember the prev columns we used, or get our count from parent, as well as check for cellHeight==='auto' (square)
1528
+ * or `fitToContent` gridItem options.
1460
1529
  */
1461
- GridStack.prototype.onParentResize = function () {
1462
- var _this = this;
1463
- if (!this.el || !this.el.clientWidth)
1530
+ GridStack.prototype.onResize = function () {
1531
+ var _a;
1532
+ if (!((_a = this.el) === null || _a === void 0 ? void 0 : _a.clientWidth))
1464
1533
  return; // return if we're gone or no size yet (will get called again)
1465
- var changedColumn = false;
1534
+ if (this.prevWidth === this.el.clientWidth)
1535
+ return; // no-op
1536
+ this.prevWidth = this.el.clientWidth;
1537
+ // console.log('onResize ', this.el.clientWidth);
1538
+ this.batchUpdate();
1466
1539
  // see if we're nested and take our column count from our parent....
1540
+ var columnChanged = false;
1467
1541
  if (this._autoColumn && this.parentGridItem) {
1468
1542
  if (this.opts.column !== this.parentGridItem.w) {
1469
- changedColumn = true;
1470
1543
  this.column(this.parentGridItem.w, 'none');
1544
+ columnChanged = true;
1471
1545
  }
1472
1546
  }
1473
1547
  else {
1474
1548
  // else check for 1 column in/out behavior
1475
- var oneColumn = !this.opts.disableOneColumnMode && this.el.clientWidth <= this.opts.oneColumnSize;
1549
+ var oneColumn = !this.opts.disableOneColumnMode && this.el.clientWidth <= this.opts.oneColumnSize ||
1550
+ (this.opts.column === 1 && !this._prevColumn);
1476
1551
  if ((this.opts.column === 1) !== oneColumn) {
1477
- changedColumn = true;
1478
- if (this.opts.animate) {
1479
- this.setAnimation(false);
1480
- } // 1 <-> 12 is too radical, turn off animation
1552
+ // if (this.opts.animate) this.setAnimation(false); // 1 <-> 12 is too radical, turn off animation and we need it for fitToContent
1481
1553
  this.column(oneColumn ? 1 : this._prevColumn);
1482
- if (this.opts.animate) {
1483
- this.setAnimation(true);
1484
- }
1554
+ // if (this.opts.animate) setTimeout(() => this.setAnimation(true));
1555
+ columnChanged = true;
1485
1556
  }
1486
1557
  }
1487
1558
  // make the cells content square again
1488
- if (this._isAutoCellHeight) {
1489
- if (!changedColumn && this.opts.cellHeightThrottle) {
1490
- if (!this._cellHeightThrottle) {
1491
- this._cellHeightThrottle = utils_1.Utils.throttle(function () { return _this.cellHeight(); }, this.opts.cellHeightThrottle);
1492
- }
1493
- this._cellHeightThrottle();
1494
- }
1495
- else {
1496
- // immediate update if we've changed column count or have no threshold
1497
- this.cellHeight();
1498
- }
1499
- }
1500
- // finally update any nested grids
1559
+ if (this._isAutoCellHeight)
1560
+ this.cellHeight();
1561
+ // update any nested grids, or items size
1501
1562
  this.engine.nodes.forEach(function (n) {
1502
1563
  if (n.subGrid)
1503
- n.subGrid.onParentResize();
1564
+ n.subGrid.onResize();
1504
1565
  });
1566
+ this.doContentResize(columnChanged);
1567
+ this.batchUpdate(false);
1505
1568
  return this;
1506
1569
  };
1507
- /** add or remove the window size event handler */
1508
- GridStack.prototype._updateWindowResizeEvent = function (forceRemove) {
1570
+ GridStack.prototype.doContentResize = function (delay, n) {
1571
+ var _this = this;
1572
+ if (delay === void 0) { delay = true; }
1573
+ if (n === void 0) { n = undefined; }
1574
+ // update any gridItem height with fitToContent, but wait for DOM $animation_speed to settle if we changed column count
1575
+ // TODO: is there a way to know what the final (post animation) size of the content will be so we can animate the column width and height together rather than sequentially ?
1576
+ setTimeout(function () {
1577
+ if (n) {
1578
+ if (utils_1.Utils.shouldFitToContent(n))
1579
+ _this.resizeToContentCheck(n.el);
1580
+ }
1581
+ else {
1582
+ _this.engine.nodes.forEach(function (n) {
1583
+ if (utils_1.Utils.shouldFitToContent(n))
1584
+ _this.resizeToContentCheck(n.el);
1585
+ });
1586
+ }
1587
+ if (_this._gsEventHandler['resizeContent'])
1588
+ _this._gsEventHandler['resizeContent'](null, n ? [n] : _this.engine.nodes);
1589
+ }, delay ? 300 + 10 : 0);
1590
+ };
1591
+ /** add or remove the grid element size event handler */
1592
+ GridStack.prototype._updateResizeEvent = function (forceRemove) {
1593
+ var _this = this;
1509
1594
  if (forceRemove === void 0) { forceRemove = false; }
1510
1595
  // only add event if we're not nested (parent will call us) and we're auto sizing cells or supporting oneColumn (i.e. doing work)
1511
- var workTodo = (this._isAutoCellHeight || !this.opts.disableOneColumnMode) && !this.parentGridItem;
1512
- if (!forceRemove && workTodo && !this._windowResizeBind) {
1513
- this._windowResizeBind = this.onParentResize.bind(this); // so we can properly remove later
1514
- window.addEventListener('resize', this._windowResizeBind);
1515
- }
1516
- else if ((forceRemove || !workTodo) && this._windowResizeBind) {
1517
- window.removeEventListener('resize', this._windowResizeBind);
1518
- delete this._windowResizeBind; // remove link to us so we can free
1596
+ // or supporting new fitToContent option.
1597
+ var trackSize = !this.parentGridItem && (this._isAutoCellHeight || this.opts.fitToContent || !this.opts.disableOneColumnMode || this.engine.nodes.find(function (n) { return n.fitToContent; }));
1598
+ if (!forceRemove && trackSize && !this.resizeObserver) {
1599
+ this._sizeThrottle = utils_1.Utils.throttle(function () { return _this.onResize(); }, this.opts.cellHeightThrottle);
1600
+ this.resizeObserver = new ResizeObserver(function (entries) { return _this._sizeThrottle(); });
1601
+ this.resizeObserver.observe(this.el);
1602
+ }
1603
+ else if ((forceRemove || !trackSize) && this.resizeObserver) {
1604
+ this.resizeObserver.disconnect();
1605
+ delete this.resizeObserver;
1606
+ delete this._sizeThrottle;
1519
1607
  }
1520
1608
  return this;
1521
1609
  };
@@ -1979,7 +2067,7 @@ var GridStack = exports.GridStack = /** @class */ (function () {
1979
2067
  /** @internal mark item for removal */
1980
2068
  GridStack.prototype._itemRemoving = function (el, remove) {
1981
2069
  var node = el ? el.gridstackNode : undefined;
1982
- if (!node || !node.grid)
2070
+ if (!node || !node.grid || el.classList.contains(this.opts.removableOptions.decline))
1983
2071
  return;
1984
2072
  remove ? node._isAboutToRemove = true : delete node._isAboutToRemove;
1985
2073
  remove ? el.classList.add('grid-stack-item-removing') : el.classList.remove('grid-stack-item-removing');
@@ -2047,17 +2135,12 @@ var GridStack = exports.GridStack = /** @class */ (function () {
2047
2135
  return;
2048
2136
  node.el = target;
2049
2137
  if (node._isAboutToRemove) {
2050
- var gridToNotify = el.gridstackNode.grid;
2051
- if (gridToNotify._gsEventHandler[event.type]) {
2052
- gridToNotify._gsEventHandler[event.type](event, target);
2138
+ var grid = el.gridstackNode.grid;
2139
+ if (grid._gsEventHandler[event.type]) {
2140
+ grid._gsEventHandler[event.type](event, target);
2053
2141
  }
2054
- _this._removeDD(el);
2055
- gridToNotify.engine.removedNodes.push(node);
2056
- gridToNotify._triggerRemoveEvent();
2057
- // break circular links and remove DOM
2058
- delete el.gridstackNode;
2059
- delete node.el;
2060
- el.remove();
2142
+ grid.engine.nodes.push(node); // temp add it back so we can proper remove it next
2143
+ grid.removeWidget(el, true, true);
2061
2144
  }
2062
2145
  else {
2063
2146
  utils_1.Utils.removePositioningStyles(target);
@@ -2080,6 +2163,8 @@ var GridStack = exports.GridStack = /** @class */ (function () {
2080
2163
  _this._updateContainerHeight(); // @ts-ignore
2081
2164
  _this._triggerChangeEvent();
2082
2165
  _this.engine.endUpdate();
2166
+ if (event.type === 'resizestop')
2167
+ _this.doContentResize(false, node);
2083
2168
  };
2084
2169
  dd.draggable(el, {
2085
2170
  start: onStartMoving,
@@ -2203,7 +2288,7 @@ var GridStack = exports.GridStack = /** @class */ (function () {
2203
2288
  this.engine.cacheRects(cellWidth, cellHeight, mTop, mRight, mBottom, mLeft);
2204
2289
  delete node._skipDown;
2205
2290
  if (resizing && node.subGrid)
2206
- node.subGrid.onParentResize();
2291
+ node.subGrid.onResize();
2207
2292
  this._extraDragRow = 0; // @ts-ignore
2208
2293
  this._updateContainerHeight();
2209
2294
  var target = event.target; // @ts-ignore
@@ -2248,11 +2333,13 @@ var GridStack = exports.GridStack = /** @class */ (function () {
2248
2333
  };
2249
2334
  // legacy method removed
2250
2335
  GridStack.prototype.commit = function () { (0, utils_1.obsolete)(this, this.batchUpdate(false), 'commit', 'batchUpdate', '5.2'); return this; };
2336
+ /** parent class for sizing content. defaults to '.grid-stack-item-content' */
2337
+ GridStack.resizeToContentParent = '.grid-stack-item-content';
2251
2338
  /** scoping so users can call GridStack.Utils.sort() for example */
2252
2339
  GridStack.Utils = utils_1.Utils;
2253
2340
  /** scoping so users can call new GridStack.Engine(12) for example */
2254
2341
  GridStack.Engine = gridstack_engine_1.GridStackEngine;
2255
- GridStack.GDRev = '8.3.0';
2342
+ GridStack.GDRev = '9.0.0';
2256
2343
  return GridStack;
2257
2344
  }());
2258
2345
  //# sourceMappingURL=gridstack.js.map