diff --git a/demo/index.html b/demo/index.html index d80570be9..e30649bd0 100644 --- a/demo/index.html +++ b/demo/index.html @@ -15,12 +15,14 @@

Demos

  • Nested grids
  • Responsive
  • ReactJS
  • +
  • ReactJS (Hooks)
  • Right-To-Left (RTL)
  • Serialization
  • Static
  • Two grids
  • -
  • Vue2.js
  • Vue3.js
  • +
  • Vue2.js
  • +
  • Web Component
  • diff --git a/demo/nested.html b/demo/nested.html index ff0614229..f43f65d73 100644 --- a/demo/nested.html +++ b/demo/nested.html @@ -4,13 +4,11 @@ - Codestin Search App - + Codestin Search App `; } + } + customElements.define('my-element', MyElement); + + + + + + + \ No newline at end of file diff --git a/node_modules/gridstack/dist/gridstack-extra.css b/node_modules/gridstack/dist/gridstack-extra.css index 58ede739b..01209f4cc 100644 --- a/node_modules/gridstack/dist/gridstack-extra.css +++ b/node_modules/gridstack/dist/gridstack-extra.css @@ -1,5 +1,5 @@ /*! - * gridstack 3.1.4 extra CSS for [2-11] columns (non default) + * gridstack 3.1.5 extra CSS for [2-11] columns (non default) * https://gridstackjs.com/ * (c) 2014-2020 Alain Dumesny, Dylan Weiss, Pavel Reznikov * gridstack.js may be freely distributed under the MIT license. diff --git a/node_modules/gridstack/dist/gridstack-extra.min.css b/node_modules/gridstack/dist/gridstack-extra.min.css index 83e7a347d..113c98210 100644 --- a/node_modules/gridstack/dist/gridstack-extra.min.css +++ b/node_modules/gridstack/dist/gridstack-extra.min.css @@ -1,5 +1,5 @@ /*! - * gridstack 3.1.4 extra CSS for [2-11] columns (non default) + * gridstack 3.1.5 extra CSS for [2-11] columns (non default) * https://gridstackjs.com/ * (c) 2014-2020 Alain Dumesny, Dylan Weiss, Pavel Reznikov * gridstack.js may be freely distributed under the MIT license. diff --git a/node_modules/gridstack/dist/gridstack-h5.js b/node_modules/gridstack/dist/gridstack-h5.js index 14466eeb5..61059f4c1 100644 --- a/node_modules/gridstack/dist/gridstack-h5.js +++ b/node_modules/gridstack/dist/gridstack-h5.js @@ -1,3 +1,3 @@ /*! For license information please see gridstack-h5.js.LICENSE.txt */ -!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.GridStack=t():e.GridStack=t()}(self,(function(){return(()=>{"use strict";var e={21:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0});const s=i(334),r=i(270),o=i(593);class n extends s.GridStackDDI{static get(){return s.GridStackDDI.get()}remove(e){return this.draggable(e,"destroy").resizable(e,"destroy"),e.gridstackNode&&delete e.gridstackNode._initDD,this}}t.GridStackDD=n,r.GridStack.prototype._setupAcceptWidget=function(){if(this.opts.staticGrid)return this;if(!this.opts.acceptWidgets)return n.get().droppable(this.el,{accept:e=>e.gridstackNode&&e.gridstackNode.grid===this}),this;let e=(e,t)=>{let i=t.gridstackNode,s=this.getCellFromPixel({left:e.pageX,top:e.pageY},!0),r=Math.max(0,s.x),o=Math.max(0,s.y);if(i._added)r===i.x&&o===i.y||!this.engine.canMoveNode(i,r,o)||(this.engine.moveNode(i,r,o),this._updateContainerHeight());else{if(i.x=r,i.y=o,delete i.autoPosition,!this.engine.willItFit(i)&&(i.autoPosition=!0,!this.engine.willItFit(i)))return;i._added=!0,i.el=t,this.engine.cleanNodes(),this.engine.beginUpdate(i),this.engine.addNode(i),this._writePosAttr(this.placeholder,i.x,i.y,i.w,i.h),this.el.appendChild(this.placeholder),i.el=this.placeholder,i._beforeDragX=i.x,i._beforeDragY=i.y,this._updateContainerHeight()}};return n.get().droppable(this.el,{accept:e=>{let t=e.gridstackNode;if(t&&t.grid===this)return!0;if("function"==typeof this.opts.acceptWidgets)return this.opts.acceptWidgets(e);let i=!0===this.opts.acceptWidgets?".grid-stack-item":this.opts.acceptWidgets;return e.matches(i)}}).on(this.el,"dropover",((t,i)=>{let s=i.gridstackNode;if(s&&s.grid===this)return delete s._added,!1;s||(s=this._readAttr(i)),s.grid&&s.grid!==this&&(s._added=!0);let r=s.w||Math.round(i.offsetWidth/this.cellWidth())||1,o=s.h||Math.round(i.offsetHeight/this.getCellHeight(!0))||1,l=this.engine.prepareNode(Object.assign(Object.assign({},s),{w:r,h:o,_added:!1,_temporary:!0}));return l._isOutOfGrid=!0,i.gridstackNode=l,i._gridstackNodeOrig=s,n.get().on(i,"drag",e),!1})).on(this.el,"dropout",((e,t)=>{let i=t.gridstackNode;if(i&&(delete i._added,i._isOutOfGrid))return n.get().off(t,"drag"),i.el=null,this.engine.removeNode(i),this.placeholder.parentNode===this.el&&this.placeholder.remove(),this._updateContainerHeight(),t.gridstackNode=t._gridstackNodeOrig,!1})).on(this.el,"drop",((e,t,i)=>{let s=t.gridstackNode,r=!!this.placeholder.parentElement;if(s&&s.grid===this)return!1;this.placeholder.remove();let l=t._gridstackNodeOrig;if(delete t._gridstackNodeOrig,r&&l&&l.grid&&l.grid!==this){let e=l.grid;e.placeholder.remove(),l.el=t,e.engine.removedNodes.push(l),e._triggerRemoveEvent()}if(!s)return!1;if(r){const e=s._id;this.engine.cleanupNode(s),s._id=e,s.grid=this}return n.get().off(t,"drag"),i!==t?(i.remove(),t.gridstackNode=l,r&&(t=t.cloneNode(!0))):(t.remove(),n.get().remove(t)),!!r&&(t.gridstackNode=s,s.el=t,o.Utils.removePositioningStyles(t),this._writeAttr(t,s),this.el.appendChild(t),this._updateContainerHeight(),this.engine.addedNodes.push(s),this._triggerAddEvent(),this._triggerChangeEvent(),this.engine.endUpdate(),this._gsEventHandler.dropped&&this._gsEventHandler.dropped({type:"dropped"},l&&l.grid?l:void 0,s),window.setTimeout((()=>{s.el&&s.el.parentElement&&this._prepareDragDropByNode(s)})),!1)})),this},r.GridStack.prototype._setupRemoveDrop=function(){if(!this.opts.staticGrid&&"string"==typeof this.opts.removable){let e=document.querySelector(this.opts.removable);if(!e)return this;n.get().isDroppable(e)||n.get().droppable(e,this.opts.removableOptions).on(e,"dropover",(function(e,t){let i=t.gridstackNode;i&&i.grid&&(t.dataset.inTrashZone="true",i.grid._setupRemovingTimeout(t))})).on(e,"dropout",(function(e,t){let i=t.gridstackNode;i&&i.grid&&(delete t.dataset.inTrashZone,i.grid._clearRemovingTimeout(t))}))}return this},r.GridStack.prototype._setupRemovingTimeout=function(e){let t=e.gridstackNode;return t&&!t._removeTimeout&&this.opts.removable?(t._removeTimeout=window.setTimeout((()=>{e.classList.add("grid-stack-item-removing"),t._isAboutToRemove=!0}),this.opts.removeTimeout),this):this},r.GridStack.prototype._clearRemovingTimeout=function(e){let t=e.gridstackNode;return t&&t._removeTimeout?(clearTimeout(t._removeTimeout),delete t._removeTimeout,e.classList.remove("grid-stack-item-removing"),delete t._isAboutToRemove,this):this},r.GridStack.prototype._setupDragIn=function(){return this.opts.staticGrid||"string"!=typeof this.opts.dragIn||n.get().isDraggable(this.opts.dragIn)||n.get().dragIn(this.opts.dragIn,this.opts.dragInOptions),this},r.GridStack.prototype._prepareDragDropByNode=function(e){let t,i,s=e.el;if(this.opts.staticGrid||e.locked||(e.noMove||this.opts.disableDrag)&&(e.noResize||this.opts.disableResize))return e._initDD&&(n.get().remove(e.el),delete e._initDD),e.el.classList.add("ui-draggable-disabled","ui-resizable-disabled"),this;if(e._initDD)return(e.noMove||this.opts.disableDrag)&&n.get().draggable(s,"disable"),(e.noResize||this.opts.disableResize)&&n.get().resizable(s,"disable"),this;e.el.classList.remove("ui-draggable-disabled","ui-resizable-disabled");let r=(r,o)=>{let l=r.target;this._gsEventHandler[r.type]&&this._gsEventHandler[r.type](r,l),this.engine.cleanNodes(),this.engine.beginUpdate(e),this._writePosAttr(this.placeholder,e.x,e.y,e.w,e.h),this.el.append(this.placeholder),e.el=this.placeholder,e._beforeDragX=e.x,e._beforeDragY=e.y,e._prevYPix=o.position.top,t=this.cellWidth(),i=this.getCellHeight(!0),n.get().resizable(s,"option","minWidth",t*(e.minW||1)),n.get().resizable(s,"option","minHeight",i*(e.minH||1)),e.maxW&&n.get().resizable(s,"option","maxWidth",t*e.maxW),e.maxH&&n.get().resizable(s,"option","maxHeight",i*e.maxH)},l=(r,n)=>{let l,a,h=Math.round(n.position.left/t),d=Math.floor((n.position.top+i/2)/i);if("drag"===r.type){let t=n.position.top-e._prevYPix;if(e._prevYPix=n.position.top,o.Utils.updateScrollPosition(s,n.position,t),s.dataset.inTrashZone||h<0||h>=this.engine.column||d<0||!this.engine.float&&d>this.engine.getRow()||e._added){if(e._temporaryRemoved)return;!0===this.opts.removable&&this._setupRemovingTimeout(s),h=e._beforeDragX,d=e._beforeDragY,this.placeholder.parentNode===this.el&&this.placeholder.remove(),this.engine.removeNode(e),this._updateContainerHeight(),e._temporaryRemoved=!0,delete e._added}else this._clearRemovingTimeout(s),e._temporaryRemoved&&(this.engine.addNode(e),this._writePosAttr(this.placeholder,h,d,l,a),this.el.appendChild(this.placeholder),e.el=this.placeholder,delete e._temporaryRemoved);if(e._lastTriedX===h&&e._lastTriedY===d)return}else if("resize"===r.type){if(h<0)return;if(o.Utils.updateScrollResize(r,s,i),l=Math.round(n.size.width/t),a=Math.round(n.size.height/i),l===e.w&&a===e.h)return}this.engine.canMoveNode(e,h,d,l,a)&&(e._lastTriedX=h,e._lastTriedY=d,e._lastTriedW=l,e._lastTriedH=a,this.engine.moveNode(e,h,d,l,a),this._updateContainerHeight())},a=t=>{this.placeholder.parentNode===this.el&&this.placeholder.remove();let i=t.target;if(i.gridstackNode&&i.gridstackNode.grid===this){if(e.el=i,e._isAboutToRemove){let r=s.gridstackNode.grid;r._gsEventHandler[t.type]&&r._gsEventHandler[t.type](t,i),r.engine.removedNodes.push(e),n.get().remove(s),delete s.gridstackNode,r._triggerRemoveEvent(),s.parentElement&&s.remove()}else this._clearRemovingTimeout(s),e._temporaryRemoved?(o.Utils.removePositioningStyles(i),this._writePosAttr(i,e._beforeDragX,e._beforeDragY,e.w,e.h),e.x=e._beforeDragX,e.y=e._beforeDragY,delete e._temporaryRemoved,this.engine.addNode(e)):(o.Utils.removePositioningStyles(i),this._writePosAttr(i,e.x,e.y,e.w,e.h)),this._gsEventHandler[t.type]&&this._gsEventHandler[t.type](t,i);this._updateContainerHeight(),this._triggerChangeEvent(),this.engine.endUpdate(),"resizestop"===t.type&&this._resizeNestedGrids(i)}};return n.get().draggable(s,{start:r,stop:a,drag:l}).resizable(s,{start:r,stop:a,resize:l}),e._initDD=!0,(e.noMove||this.opts.disableDrag)&&n.get().draggable(s,"disable"),(e.noResize||this.opts.disableResize)&&n.get().resizable(s,"disable"),this},r.GridStack.prototype.movable=function(e,t){return this.opts.staticGrid||r.GridStack.getElements(e).forEach((e=>{let i=e.gridstackNode;i&&!i.locked&&(i.noMove=!t,i.noMove?(n.get().draggable(e,"disable"),e.classList.remove("ui-draggable-handle")):(this._prepareDragDropByNode(i),n.get().draggable(e,"enable"),e.classList.remove("ui-draggable-handle")))})),this},r.GridStack.prototype.resizable=function(e,t){return this.opts.staticGrid||r.GridStack.getElements(e).forEach((e=>{let i=e.gridstackNode;i&&!i.locked&&(i.noResize=!t,i.noResize?n.get().resizable(e,"disable"):(this._prepareDragDropByNode(i),n.get().resizable(e,"enable")))})),this}},334:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0});class i{static registerPlugin(e){return i.ddi=new e,i.ddi}static get(){return i.ddi||i.registerPlugin(i)}remove(e){return this}}t.GridStackDDI=i},62:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0});const s=i(593);class r{constructor(e={}){this.addedNodes=[],this.removedNodes=[],this.getGridHeight=s.obsolete(this,r.prototype.getRow,"getGridHeight","getRow","v1.0.0"),this.column=e.column||12,this.onChange=e.onChange,this._float=e.float,this.maxRow=e.maxRow,this.nodes=e.nodes||[]}batchUpdate(){return this.batchMode||(this.batchMode=!0,this._prevFloat=this._float,this._float=!0),this}commit(){return this.batchMode?(this.batchMode=!1,this._float=this._prevFloat,delete this._prevFloat,this._packNodes(),this._notify(),this):this}_fixCollisions(e){this._sortNodes(-1);let t=e,i=Boolean(this.nodes.find((e=>e.locked)));for(this.float||i||(t={x:0,y:e.y,w:this.column,h:e.h});;){let i,r=this.nodes.find((i=>i!==e&&s.Utils.isIntercepted(i,t)),{node:e,nn:t});if(!r)return this;if(i=r.locked?this.moveNode(e,e.x,r.y+r.h,e.w,e.h,!0):this.moveNode(r,r.x,e.y+e.h,r.w,r.h,!0),!i)return this}}isAreaEmpty(e,t,i,r){let o={x:e||0,y:t||0,w:i||1,h:r||1};return!this.nodes.find((e=>s.Utils.isIntercepted(e,o)))}compact(){if(0===this.nodes.length)return this;this.batchUpdate(),this._sortNodes();let e=this.nodes;return this.nodes=[],e.forEach((e=>{e.noMove||e.locked||(e.autoPosition=!0),this.addNode(e,!1),e._dirty=!0})),this.commit(),this}set float(e){this._float!==e&&(this._float=e||!1,e||(this._packNodes(),this._notify()))}get float(){return this._float||!1}_sortNodes(e){return this.nodes=s.Utils.sort(this.nodes,e,this.column),this}_packNodes(){return this._sortNodes(),this.float?this.nodes.forEach(((e,t)=>{if(e._updating||void 0===e._packY||e.y===e._packY)return this;let i=e.y;for(;i>=e._packY;){let r={x:e.x,y:i,w:e.w,h:e.h};this.nodes.slice(0,t).find((e=>s.Utils.isIntercepted(r,e)),{n:e,newY:i})||(e._dirty=!0,e.y=i),--i}})):this.nodes.forEach(((e,t)=>{if(e.locked)return this;for(;e.y>0;){let i=e.y-1,r=0===t,o={x:e.x,y:i,w:e.w,h:e.h};if(t>0&&(r=void 0===this.nodes.slice(0,t).find((e=>s.Utils.isIntercepted(o,e)),{n:e,newY:i})),!r)break;e._dirty=e.y!==i,e.y=i}})),this}prepareNode(e,t){(e=e||{})._id=e._id||r._idSeq++,void 0!==e.x&&void 0!==e.y&&null!==e.x&&null!==e.y||(e.autoPosition=!0);let i={x:0,y:0,w:1,h:1};return s.Utils.defaults(e,i),e.autoPosition||delete e.autoPosition,e.noResize||delete e.noResize,e.noMove||delete e.noMove,"string"==typeof e.x&&(e.x=Number(e.x)),"string"==typeof e.y&&(e.y=Number(e.y)),"string"==typeof e.w&&(e.w=Number(e.w)),"string"==typeof e.h&&(e.h=Number(e.h)),isNaN(e.x)&&(e.x=i.x,e.autoPosition=!0),isNaN(e.y)&&(e.y=i.y,e.autoPosition=!0),isNaN(e.w)&&(e.w=i.w),isNaN(e.h)&&(e.h=i.h),e.maxW&&(e.w=Math.min(e.w,e.maxW)),e.maxH&&(e.h=Math.min(e.h,e.maxH)),e.minW&&(e.w=Math.max(e.w,e.minW)),e.minH&&(e.h=Math.max(e.h,e.minH)),e.w>this.column?e.w=this.column:e.w<1&&(e.w=1),this.maxRow&&e.h>this.maxRow?e.h=this.maxRow:e.h<1&&(e.h=1),e.x<0&&(e.x=0),e.y<0&&(e.y=0),e.x+e.w>this.column&&(t?e.w=this.column-e.x:e.x=this.column-e.w),this.maxRow&&e.y+e.h>this.maxRow&&(t?e.h=this.maxRow-e.y:e.y=this.maxRow-e.h),e}getDirtyNodes(e){if(e){let e=[];return this.nodes.forEach((t=>{t._dirty&&(t.y===t._origY&&t.x===t._origX&&t.w===t._origW&&t.h===t._origH?delete t._dirty:e.push(t))})),e}return this.nodes.filter((e=>e._dirty))}_notify(e,t=!0){if(this.batchMode)return this;let i=(e=void 0===e?[]:Array.isArray(e)?e:[e]).concat(this.getDirtyNodes());return this.onChange&&this.onChange(i,t),this}cleanNodes(){return this.batchMode||this.nodes.forEach((e=>{delete e._dirty})),this}addNode(e,t=!1){if((e=this.prepareNode(e)).autoPosition){this._sortNodes();for(let t=0;;++t){let i=t%this.column,r=Math.floor(t/this.column);if(i+e.w>this.column)continue;let o={x:i,y:r,w:e.w,h:e.h};if(!this.nodes.find((e=>s.Utils.isIntercepted(o,e)),{x:i,y:r,node:e})){e.x=i,e.y=r,delete e.autoPosition;break}}}return this.nodes.push(e),t&&this.addedNodes.push(e),this._fixCollisions(e),this._packNodes(),this._notify(),e}removeNode(e,t=!0,i=!1){return i&&this.removedNodes.push(e),e._id=null,this.nodes=this.nodes.filter((t=>t!==e)),this.float||this._packNodes(),this._notify(e,t),this}removeAll(e=!0){return delete this._layouts,0===this.nodes.length||(e&&this.nodes.forEach((e=>{e._id=null})),this.removedNodes=this.nodes,this.nodes=[],this._notify(this.removedNodes,e)),this}canMoveNode(e,t,i,s,o){if(!this.isNodeChangedPosition(e,t,i,s,o))return!1;let n,l=this.nodes.some((e=>e.locked));if(!this.maxRow&&!l)return!0;let a=new r({column:this.column,float:this.float,nodes:this.nodes.map((t=>t===e?(n=Object.assign({},t),n):Object.assign({},t)))});if(!n)return!0;a.moveNode(n,t,i,s,o);let h=!0;return l&&(h=!a.nodes.some((e=>e.locked&&e._dirty&&e!==n))),this.maxRow&&h&&(h=a.getRow()<=this.maxRow),h}willItFit(e){if(!this.maxRow)return!0;let t=new r({column:this.column,float:this.float,nodes:this.nodes.map((e=>Object.assign({},e)))});return t.addNode(e),t.getRow()<=this.maxRow}isNodeChangedPosition(e,t,i,s,r){return"number"!=typeof t&&(t=e.x),"number"!=typeof i&&(i=e.y),"number"!=typeof s&&(s=e.w),"number"!=typeof r&&(r=e.h),e.maxW&&(s=Math.min(s,e.maxW)),e.maxH&&(r=Math.min(r,e.maxH)),e.minW&&(s=Math.max(s,e.minW)),e.minH&&(r=Math.max(r,e.minH)),e.x!==t||e.y!==i||e.w!==s||e.h!==r}moveNode(e,t,i,s,r,o){if(e.locked)return null;"number"!=typeof t&&(t=e.x),"number"!=typeof i&&(i=e.y),"number"!=typeof s&&(s=e.w),"number"!=typeof r&&(r=e.h);let n=e.w!==s||e.h!==r,l={x:t,y:i,w:s,h:r,maxW:e.maxW,maxH:e.maxH,minW:e.minW,minH:e.minH};return l=this.prepareNode(l,n),e.x===l.x&&e.y===l.y&&e.w===l.w&&e.h===l.h?null:(e._dirty=!0,e.x=e._lastTriedX=l.x,e.y=e._lastTriedY=l.y,e.w=e._lastTriedW=l.w,e.h=e._lastTriedH=l.h,this._fixCollisions(e),o||(this._packNodes(),this._notify()),e)}getRow(){return this.nodes.reduce(((e,t)=>Math.max(e,t.y+t.h)),0)}beginUpdate(e){return e._updating||(e._updating=!0,this.nodes.forEach((e=>{e._packY=e.y}))),this}endUpdate(){let e=this.nodes.find((e=>e._updating));return e&&(delete e._updating,this.nodes.forEach((e=>{delete e._packY}))),this}save(e=!0){let t=[];return s.Utils.sort(this.nodes),this.nodes.forEach((i=>{let s={};for(let e in i)"_"!==e[0]&&null!==i[e]&&void 0!==i[e]&&(s[e]=i[e]);e||delete s.el,delete s.grid,s.autoPosition||delete s.autoPosition,s.noResize||delete s.noResize,s.noMove||delete s.noMove,s.locked||delete s.locked,t.push(s)})),t}layoutsNodesChange(e){return!this._layouts||this._ignoreLayoutsNodeChange||this._layouts.forEach(((t,i)=>{if(!t||i===this.column)return this;i{let s=t.find((t=>t._id===e._id));if(!s)return this;let r=i/this.column;e.y!==e._origY&&(s.y+=e.y-e._origY),e.x!==e._origX&&(s.x=Math.round(e.x*r)),e.w!==e._origW&&(s.w=Math.round(e.w*r))}))})),this}updateNodeWidths(e,t,i,r="moveScale"){if(!this.nodes.length||e===t)return this;if(this.cacheLayout(this.nodes,e),1===t&&i&&i.length){let e=0;i.forEach((t=>{t.x=0,t.w=1,t.y=Math.max(t.y,e),e=t.y+t.h}))}else i=s.Utils.sort(this.nodes,-1,e);let o=this._layouts[t]||[],n=this._layouts.length-1;0===o.length&&t>e&&t{let t=i.findIndex((t=>t._id===e._id));-1!==t&&(i[t].x=e.x,i[t].y=e.y,i[t].w=e.w)})),o=[]));let l=[];if(o.forEach((e=>{let t=i.findIndex((t=>t._id===e._id));-1!==t&&(i[t].x=e.x,i[t].y=e.y,i[t].w=e.w,l.push(i[t]),i.splice(t,1))})),i.length)if("function"==typeof r)r(t,e,l,i);else{let s=t/e,o="move"===r||"moveScale"===r,n="scale"===r||"moveScale"===r;i.forEach((i=>{i.x=1===t?0:o?Math.round(i.x*s):Math.min(i.x,t-1),i.w=1===t||1===e?1:n?Math.round(i.w*s)||1:Math.min(i.w,t),l.push(i)})),i=[]}return l=s.Utils.sort(l,-1,t),this._ignoreLayoutsNodeChange=!0,this.batchUpdate(),this.nodes=[],l.forEach((e=>{this.addNode(e,!1),e._dirty=!0}),this),this.commit(),delete this._ignoreLayoutsNodeChange,this}saveInitial(){return this.nodes.forEach((e=>{e._origX=e.x,e._origY=e.y,e._origW=e.w,e._origH=e.h,delete e._dirty})),this}cacheLayout(e,t,i=!1){let s=[];return e.forEach(((e,t)=>{e._id=e._id||r._idSeq++,s[t]={x:e.x,y:e.y,w:e.w,_id:e._id}})),this._layouts=i?[]:this._layouts||[],this._layouts[t]=s,this}cleanupNode(e){for(let t in e)"_"===t[0]&&delete e[t];return this}}t.GridStackEngine=r,r._idSeq=1},270:(e,t,i)=>{function s(e){for(var i in e)t.hasOwnProperty(i)||(t[i]=e[i])}Object.defineProperty(t,"__esModule",{value:!0});const r=i(62),o=i(593),n=i(334);s(i(593)),s(i(62)),s(i(334));const l={column:12,minRow:0,maxRow:0,itemClass:"grid-stack-item",placeholderClass:"grid-stack-placeholder",placeholderText:"",handle:".grid-stack-item-content",handleClass:null,styleInHead:!1,cellHeight:"auto",margin:10,auto:!0,minWidth:768,float:!1,staticGrid:!1,animate:!0,alwaysShowResizeHandle:!1,resizable:{autoHide:!0,handles:"se"},draggable:{handle:".grid-stack-item-content",scroll:!1,appendTo:"body"},dragIn:void 0,dragInOptions:{revert:"invalid",handle:".grid-stack-item-content",scroll:!1,appendTo:"body"},disableDrag:!1,disableResize:!1,rtl:"auto",removable:!1,removableOptions:{accept:".grid-stack-item"},removeTimeout:2e3,marginUnit:"px",cellHeightUnit:"px",disableOneColumnMode:!1,oneColumnModeDomSort:!1};class a{constructor(e,t={}){this._gsEventHandler={},this.el=e,t=t||{},o.obsoleteOpts(t,"verticalMargin","margin","v2.0"),o.obsoleteAttr(this.el,"data-gs-current-height","gs-current-row","v1.0.0"),t.row&&(t.minRow=t.maxRow=t.row,delete t.row);let i=o.Utils.toNumber(e.getAttribute("gs-row")),s=Object.assign(Object.assign({},l),{column:o.Utils.toNumber(e.getAttribute("gs-column"))||12,minRow:i||o.Utils.toNumber(e.getAttribute("gs-min-row"))||0,maxRow:i||o.Utils.toNumber(e.getAttribute("gs-max-row"))||0,staticGrid:o.Utils.toBool(e.getAttribute("gs-static"))||!1,_styleSheetClass:"grid-stack-instance-"+(1e4*Math.random()).toFixed(0),alwaysShowResizeHandle:t.alwaysShowResizeHandle||!1,resizable:{autoHide:!t.alwaysShowResizeHandle,handles:"se"},draggable:{handle:(t.handleClass?"."+t.handleClass:t.handle?t.handle:"")||".grid-stack-item-content",scroll:!1,appendTo:"body"},removableOptions:{accept:"."+(t.itemClass||"grid-stack-item")}});e.getAttribute("gs-animate")&&(s.animate=o.Utils.toBool(e.getAttribute("gs-animate"))),this.opts=o.Utils.defaults(t,s),t=null,this.initMargin(),"auto"===this.opts.rtl&&(this.opts.rtl="rtl"===e.style.direction),this.opts.rtl&&this.el.classList.add("grid-stack-rtl");let n=o.Utils.closestByClass(this.el,l.itemClass);if(n&&n.gridstackNode&&(this.opts._isNested=n.gridstackNode,this.opts._isNested.subGrid=this,this.el.classList.add("grid-stack-nested")),this._isAutoCellHeight="auto"===this.opts.cellHeight,this._isAutoCellHeight){let e=-this.opts.marginRight-this.opts.marginLeft+this.opts.marginTop+this.opts.marginBottom;this.cellHeight(this.cellWidth()+e,!1)}else this.cellHeight(this.opts.cellHeight,!1);if(this.el.classList.add(this.opts._styleSheetClass),this._setStaticClass(),this.engine=new r.GridStackEngine({column:this.opts.column,float:this.opts.float,maxRow:this.opts.maxRow,onChange:(e,t=!0)=>{let i=0;this.engine.nodes.forEach((e=>{i=Math.max(i,e.y+e.h)})),e.forEach((e=>{let i=e.el;t&&null===e._id?i&&i.parentNode&&i.parentNode.removeChild(i):this._writePosAttr(i,e.x,e.y,e.w,e.h)})),this._updateStyles(!1,i)}}),this.opts.auto){this.batchUpdate();let e=[];this.getGridItems().forEach((t=>{let i=parseInt(t.getAttribute("gs-x")),s=parseInt(t.getAttribute("gs-y"));e.push({el:t,i:(Number.isNaN(i)?1e3:i)+(Number.isNaN(s)?1e3:s)*this.opts.column})})),e.sort((e=>e.i)).forEach((e=>this._prepareElement(e.el))),this.commit()}this.engine.saveInitial(),this.setAnimation(this.opts.animate);let a=document.createElement("div");a.className="placeholder-content",a.innerHTML=this.opts.placeholderText,this.placeholder=document.createElement("div"),this.placeholder.classList.add(this.opts.placeholderClass,s.itemClass,this.opts.itemClass),this.placeholder.appendChild(a),this._updateStyles(),this._setupDragIn(),this._setupRemoveDrop(),this._setupAcceptWidget(),this._updateWindowResizeEvent()}static init(e={},t=".grid-stack"){let i=a.getGridElement(t);return i?(i.gridstack||(i.gridstack=new a(i,Object.assign({},e))),i.gridstack):("string"==typeof t?console.error('GridStack.initAll() no grid was found with selector "'+t+'" - element missing or wrong selector ?\nNote: ".grid-stack" is required for proper CSS styling and drag/drop, and is the default selector.'):console.error("GridStack.init() no grid element was passed."),null)}static initAll(e={},t=".grid-stack"){let i=[];return a.getGridElements(t).forEach((t=>{t.gridstack||(t.gridstack=new a(t,Object.assign({},e))),i.push(t.gridstack)})),0===i.length&&console.error('GridStack.initAll() no grid was found with selector "'+t+'" - element missing or wrong selector ?\nNote: ".grid-stack" is required for proper CSS styling and drag/drop, and is the default selector.'),i}static addGrid(e,t={}){if(!e)return null;let i=document.implementation.createHTMLDocument();i.body.innerHTML=`
    `;let s=i.body.children[0];e.append(s);let r=a.init(t,s);return t.children&&r.load(t.children),r}addWidget(e,t){if(arguments.length>2){console.warn("gridstack.ts: `addWidget(el, x, y, width...)` is deprecated. Use `addWidget({x, y, w, content, ...})`. It will be removed soon");let t=arguments,i=1,s={x:t[i++],y:t[i++],w:t[i++],h:t[i++],autoPosition:t[i++],minW:t[i++],maxW:t[i++],minH:t[i++],maxH:t[i++],id:t[i++]};return this.addWidget(e,s)}let i;if("string"==typeof e){let t=document.implementation.createHTMLDocument();t.body.innerHTML=e,i=t.body.children[0]}else if(0===arguments.length||1===arguments.length&&(void 0!==(s=e).x||void 0!==s.y||void 0!==s.w||void 0!==s.h||void 0!==s.content)){let s=e&&e.content||"";t=e;let r=document.implementation.createHTMLDocument();r.body.innerHTML=`
    ${s}
    `,i=r.body.children[0]}else i=e;var s;let r=this._readAttr(i);return t=Object.assign({},t||{}),o.Utils.defaults(t,r),this.engine.prepareNode(t),this._writeAttr(i,t),this._insertNotAppend?this.el.prepend(i):this.el.appendChild(i),this._prepareElement(i,!0,t),this._updateContainerHeight(),this._triggerAddEvent(),this._triggerChangeEvent(),i}save(e=!0,t=!1){let i=this.engine.save(e);if(e&&i.forEach((e=>{if(e.el&&!e.subGrid){let t=e.el.querySelector(".grid-stack-item-content");e.content=t?t.innerHTML:void 0,e.content||delete e.content,delete e.el}})),t){i.forEach((i=>{i.subGrid&&(i.subGrid=i.subGrid.save(e,t))}));let s=Object.assign({},this.opts);return s.marginBottom===s.marginTop&&s.marginRight===s.marginLeft&&s.marginTop===s.marginRight&&(s.margin=s.marginTop,delete s.marginTop,delete s.marginRight,delete s.marginBottom,delete s.marginLeft),s.rtl===("rtl"===this.el.style.direction)&&(s.rtl="auto"),this._isAutoCellHeight&&(s.cellHeight="auto"),o.Utils.removeInternalAndSame(s,l),s.children=i,s}return i}load(e,t=!0){let i=a.Utils.sort(e,-1,this._prevColumn||this.opts.column);this._insertNotAppend=!0,this._prevColumn&&this._prevColumn!==this.opts.column&&i.some((e=>e.x+e.w>this.opts.column))&&(this._ignoreLayoutsNodeChange=!0,this.engine.cacheLayout(i,this._prevColumn,!0));let s=[];return this.batchUpdate(),t&&[...this.engine.nodes].forEach((e=>{i.find((t=>e.id===t.id))||("function"==typeof t?t(this,e,!1):(s.push(e),this.removeWidget(e.el,!0,!1)))})),i.forEach((e=>{let i=e.id||0===e.id?this.engine.nodes.find((t=>t.id===e.id)):void 0;if(i){if(this.update(i.el,e),e.subGrid&&e.subGrid.children){let t=i.el.querySelector(".grid-stack");t&&t.gridstack&&(t.gridstack.load(e.subGrid.children),this._insertNotAppend=!0)}}else if(t&&(e="function"==typeof t?t(this,e,!0).gridstackNode:this.addWidget(e).gridstackNode).subGrid){let t=e.el.querySelector(".grid-stack-item-content");e.subGrid=a.addGrid(t,e.subGrid)}})),this.engine.removedNodes=s,this.commit(),delete this._ignoreLayoutsNodeChange,delete this._insertNotAppend,this}batchUpdate(){return this.engine.batchUpdate(),this}getCellHeight(e=!1){if(this.opts.cellHeight&&"auto"!==this.opts.cellHeight&&(!e||!this.opts.cellHeightUnit||"px"===this.opts.cellHeightUnit))return this.opts.cellHeight;let t=this.el.querySelector("."+this.opts.itemClass),i=o.Utils.toNumber(t.getAttribute("gs-h"));return Math.round(t.offsetHeight/i)}cellHeight(e,t=!0){let i=o.Utils.parseHeight(e);return this.opts.cellHeightUnit===i.unit&&this.opts.cellHeight===i.h||(this.opts.cellHeightUnit=i.unit,this.opts.cellHeight=i.h,t&&this._updateStyles(!0),this._resizeNestedGrids(this.el)),this}cellWidth(){return(this.el.offsetWidth||this.el.parentElement.offsetWidth||window.innerWidth)/this.opts.column}commit(){return this.engine.commit(),this._triggerRemoveEvent(),this._triggerAddEvent(),this._triggerChangeEvent(),this}compact(){return this.engine.compact(),this._triggerChangeEvent(),this}column(e,t="moveScale"){if(this.opts.column===e)return this;let i,s=this.opts.column;return 1===e?this._prevColumn=s:delete this._prevColumn,this.el.classList.remove("grid-stack-"+s),this.el.classList.add("grid-stack-"+e),this.opts.column=this.engine.column=e,1===e&&this.opts.oneColumnModeDomSort&&(i=[],this.getGridItems().forEach((e=>{e.gridstackNode&&i.push(e.gridstackNode)})),i.length||(i=void 0)),this.engine.updateNodeWidths(s,e,i,t),this._ignoreLayoutsNodeChange=!0,this._triggerChangeEvent(),delete this._ignoreLayoutsNodeChange,this}getColumn(){return this.opts.column}getGridItems(){return Array.from(this.el.children).filter((e=>e.matches("."+this.opts.itemClass)&&!e.matches("."+this.opts.placeholderClass)))}destroy(e=!0){if(this.el)return this._updateWindowResizeEvent(!0),this.setStatic(!0),e?this.el.parentNode.removeChild(this.el):(this.removeAll(e),this.el.classList.remove(this.opts._styleSheetClass)),this._removeStylesheet(),delete this.opts._isNested,delete this.opts,delete this.placeholder,delete this.engine,delete this.el.gridstack,delete this.el,this}disable(){if(!this.opts.staticGrid)return this.enableMove(!1),this.enableResize(!1),this._triggerEvent("disable"),this}enable(){if(!this.opts.staticGrid)return this.enableMove(!0),this.enableResize(!0),this._triggerEvent("enable"),this}enableMove(e,t=!0){return this.opts.staticGrid||(this.getGridItems().forEach((t=>this.movable(t,e))),t&&(this.opts.disableDrag=!e)),this}enableResize(e,t=!0){return this.opts.staticGrid||(this.getGridItems().forEach((t=>this.resizable(t,e))),t&&(this.opts.disableResize=!e)),this}float(e){return this.engine.float=e,this._triggerChangeEvent(),this}getFloat(){return this.engine.float}getCellFromPixel(e,t=!1){let i,s=this.el.getBoundingClientRect();i=t?{top:s.top+document.documentElement.scrollTop,left:s.left}:{top:this.el.offsetTop,left:this.el.offsetLeft};let r=e.left-i.left,o=e.top-i.top,n=s.width/this.opts.column,l=s.height/parseInt(this.el.getAttribute("gs-current-row"));return{x:Math.floor(r/n),y:Math.floor(o/l)}}getRow(){return Math.max(this.engine.getRow(),this.opts.minRow)}isAreaEmpty(e,t,i,s){return this.engine.isAreaEmpty(e,t,i,s)}makeWidget(e){let t=a.getElement(e);return this._prepareElement(t,!0),this._updateContainerHeight(),this._triggerAddEvent(),this._triggerChangeEvent(),t}on(e,t){if(-1!==e.indexOf(" "))return e.split(" ").forEach((e=>this.on(e,t))),this;if("change"===e||"added"===e||"removed"===e||"enable"===e||"disable"===e){let i="enable"===e||"disable"===e;this._gsEventHandler[e]=i?e=>t(e):e=>t(e,e.detail),this.el.addEventListener(e,this._gsEventHandler[e])}else"dragstart"===e||"dragstop"===e||"resizestart"===e||"resizestop"===e||"dropped"===e?this._gsEventHandler[e]=t:console.log("GridStack.on("+e+') event not supported, but you can still use $(".grid-stack").on(...) while jquery-ui is still used internally.');return this}off(e){return-1!==e.indexOf(" ")?(e.split(" ").forEach((e=>this.off(e))),this):("change"!==e&&"added"!==e&&"removed"!==e&&"enable"!==e&&"disable"!==e||this._gsEventHandler[e]&&this.el.removeEventListener(e,this._gsEventHandler[e]),delete this._gsEventHandler[e],this)}removeWidget(e,t=!0,i=!0){return a.getElements(e).forEach((e=>{if(e.parentElement!==this.el)return;let s=e.gridstackNode;s||(s=this.engine.nodes.find((t=>e===t.el))),s&&(delete e.gridstackNode,n.GridStackDDI.get().remove(e),this.engine.removeNode(s,t,i),t&&e.parentElement&&e.remove())})),i&&(this._triggerRemoveEvent(),this._triggerChangeEvent()),this}removeAll(e=!0){return this.engine.nodes.forEach((e=>{delete e.el.gridstackNode,n.GridStackDDI.get().remove(e.el)})),this.engine.removeAll(e),this._triggerRemoveEvent(),this}setAnimation(e){return e?this.el.classList.add("grid-stack-animate"):this.el.classList.remove("grid-stack-animate"),this}setStatic(e){return this.opts.staticGrid===e||(this.opts.staticGrid=e,this.engine.nodes.forEach((e=>this._prepareDragDropByNode(e))),this._setStaticClass()),this}update(e,t){if(arguments.length>2){console.warn("gridstack.ts: `update(el, x, y, w, h)` is deprecated. Use `update({x, w, content, ...})`. It will be removed soon");let i=arguments,s=1;return t={x:i[s++],y:i[s++],w:i[s++],h:i[s++]},this.update(e,t)}return a.getElements(e).forEach((e=>{if(!e||!e.gridstackNode)return;let i=e.gridstackNode,s=Object.assign({},t);delete s.autoPosition;let r,o=["x","y","w","h"];if(o.some((e=>void 0!==s[e]&&s[e]!==i[e]))&&(r={},o.forEach((e=>{r[e]=void 0!==s[e]?s[e]:i[e],delete s[e]}))),!r&&(s.minW||s.minH||s.maxW||s.maxH)&&(r={}),s.content){let t=e.querySelector(".grid-stack-item-content");t&&t.innerHTML!==s.content&&(t.innerHTML=s.content),delete s.content}let n=!1,l=!1;for(const e in s)"_"!==e[0]&&i[e]!==s[e]&&(i[e]=s[e],n=!0,l=l||!this.opts.staticGrid&&("noResize"===e||"noMove"===e||"locked"===e));r&&(this.engine.cleanNodes(),this.engine.beginUpdate(i),this.engine.moveNode(i,r.x,r.y,r.w,r.h),this._updateContainerHeight(),this._triggerChangeEvent(),this.engine.endUpdate()),n&&this._writeAttr(e,i),l&&this._prepareDragDropByNode(i)})),this}margin(e){if(!("string"==typeof e&&e.split(" ").length>1)){let t=o.Utils.parseHeight(e);if(this.opts.marginUnit===t.unit&&this.opts.margin===t.h)return}return this.opts.margin=e,this.opts.marginTop=this.opts.marginBottom=this.opts.marginLeft=this.opts.marginRight=void 0,this.initMargin(),this._updateStyles(!0),this}getMargin(){return this.opts.margin}willItFit(e){if(arguments.length>1){console.warn("gridstack.ts: `willItFit(x,y,w,h,autoPosition)` is deprecated. Use `willItFit({x, y,...})`. It will be removed soon");let e=arguments,t=0,i={x:e[t++],y:e[t++],w:e[t++],h:e[t++],autoPosition:e[t++]};return this.willItFit(i)}return this.engine.willItFit(e)}_triggerChangeEvent(){if(this.engine.batchMode)return this;let e=this.engine.getDirtyNodes(!0);return e&&e.length&&(this._ignoreLayoutsNodeChange||this.engine.layoutsNodesChange(e),this._triggerEvent("change",e)),this.engine.saveInitial(),this}_triggerAddEvent(){return this.engine.batchMode||this.engine.addedNodes&&this.engine.addedNodes.length>0&&(this._ignoreLayoutsNodeChange||this.engine.layoutsNodesChange(this.engine.addedNodes),this.engine.addedNodes.forEach((e=>{delete e._dirty})),this._triggerEvent("added",this.engine.addedNodes),this.engine.addedNodes=[]),this}_triggerRemoveEvent(){return this.engine.batchMode||this.engine.removedNodes&&this.engine.removedNodes.length>0&&(this._triggerEvent("removed",this.engine.removedNodes),this.engine.removedNodes=[]),this}_triggerEvent(e,t){let i=t?new CustomEvent(e,{bubbles:!1,detail:t}):new Event(e);return this.el.dispatchEvent(i),this}_removeStylesheet(){return this._styles&&(o.Utils.removeStylesheet(this._styles._id),delete this._styles),this}_updateStyles(e=!1,t){if(e&&this._removeStylesheet(),this._updateContainerHeight(),0===this.opts.cellHeight)return this;let i=this.opts.cellHeight,s=this.opts.cellHeightUnit,r=`.${this.opts._styleSheetClass} > .${this.opts.itemClass}`;if(!this._styles){let e="gridstack-style-"+(1e5*Math.random()).toFixed(),t=this.opts.styleInHead?void 0:this.el.parentNode;if(this._styles=o.Utils.createStylesheet(e,t),!this._styles)return this;this._styles._id=e,this._styles._max=0,o.Utils.addCSSRule(this._styles,r,`min-height: ${i}${s}`);let n=this.opts.marginTop+this.opts.marginUnit,l=this.opts.marginBottom+this.opts.marginUnit,a=this.opts.marginRight+this.opts.marginUnit,h=this.opts.marginLeft+this.opts.marginUnit,d=`${r} > .grid-stack-item-content`,g=`.${this.opts._styleSheetClass} > .grid-stack-placeholder > .placeholder-content`;o.Utils.addCSSRule(this._styles,d,`top: ${n}; right: ${a}; bottom: ${l}; left: ${h};`),o.Utils.addCSSRule(this._styles,g,`top: ${n}; right: ${a}; bottom: ${l}; left: ${h};`),o.Utils.addCSSRule(this._styles,`${r} > .ui-resizable-ne`,`right: ${a}`),o.Utils.addCSSRule(this._styles,`${r} > .ui-resizable-e`,`right: ${a}`),o.Utils.addCSSRule(this._styles,`${r} > .ui-resizable-se`,`right: ${a}; bottom: ${l}`),o.Utils.addCSSRule(this._styles,`${r} > .ui-resizable-nw`,`left: ${h}`),o.Utils.addCSSRule(this._styles,`${r} > .ui-resizable-w`,`left: ${h}`),o.Utils.addCSSRule(this._styles,`${r} > .ui-resizable-sw`,`left: ${h}; bottom: ${l}`)}if((t=t||this._styles._max)>this._styles._max){let e=e=>i*e+s;for(let i=this._styles._max+1;i<=t;i++){let t=e(i);o.Utils.addCSSRule(this._styles,`${r}[gs-y="${i-1}"]`,`top: ${e(i-1)}`),o.Utils.addCSSRule(this._styles,`${r}[gs-h="${i}"]`,`height: ${t}`),o.Utils.addCSSRule(this._styles,`${r}[gs-min-h="${i}"]`,`min-height: ${t}`),o.Utils.addCSSRule(this._styles,`${r}[gs-max-h="${i}"]`,`max-height: ${t}`)}this._styles._max=t}return this}_updateContainerHeight(){if(!this.engine||this.engine.batchMode)return this;let e=this.getRow(),t=parseInt(getComputedStyle(this.el)["min-height"]);if(t>0){let i=Math.round(t/this.getCellHeight(!0));e{e.gridstack&&e.gridstack.onParentResize()})),this}_prepareElement(e,t=!1,i){i||(e.classList.add(this.opts.itemClass),i=this._readAttr(e)),e.gridstackNode=i,i.el=e,i.grid=this;let s=Object.assign({},i);return i=this.engine.addNode(i,t),o.Utils.same(i,s)||this._writeAttr(e,i),this._prepareDragDropByNode(i),this}_writePosAttr(e,t,i,s,r){return null!=t&&e.setAttribute("gs-x",String(t)),null!=i&&e.setAttribute("gs-y",String(i)),s&&e.setAttribute("gs-w",String(s)),r&&e.setAttribute("gs-h",String(r)),this}_writeAttr(e,t){if(!t)return this;this._writePosAttr(e,t.x,t.y,t.w,t.h);let i={autoPosition:"gs-auto-position",minW:"gs-min-w",minH:"gs-min-h",maxW:"gs-max-w",maxH:"gs-max-h",noResize:"gs-no-resize",noMove:"gs-no-move",locked:"gs-locked",id:"gs-id",resizeHandles:"gs-resize-handles"};for(const s in i)t[s]?e.setAttribute(i[s],String(t[s])):e.removeAttribute(i[s]);return this}_readAttr(e){let t={};t.x=o.Utils.toNumber(e.getAttribute("gs-x")),t.y=o.Utils.toNumber(e.getAttribute("gs-y")),t.w=o.Utils.toNumber(e.getAttribute("gs-w")),t.h=o.Utils.toNumber(e.getAttribute("gs-h")),t.maxW=o.Utils.toNumber(e.getAttribute("gs-max-w")),t.minW=o.Utils.toNumber(e.getAttribute("gs-min-w")),t.maxH=o.Utils.toNumber(e.getAttribute("gs-max-h")),t.minH=o.Utils.toNumber(e.getAttribute("gs-min-h")),t.autoPosition=o.Utils.toBool(e.getAttribute("gs-auto-position")),t.noResize=o.Utils.toBool(e.getAttribute("gs-no-resize")),t.noMove=o.Utils.toBool(e.getAttribute("gs-no-move")),t.locked=o.Utils.toBool(e.getAttribute("gs-locked")),t.resizeHandles=e.getAttribute("gs-resize-handles"),t.id=e.getAttribute("gs-id");for(const e in t){if(!t.hasOwnProperty(e))return;t[e]||0===t[e]||delete t[e]}return t}_setStaticClass(){let e=["grid-stack-static"];return this.opts.staticGrid?(this.el.classList.add(...e),this.el.setAttribute("gs-static","true")):(this.el.classList.remove(...e),this.el.removeAttribute("gs-static")),this}onParentResize(){if(this.el&&this.el.clientWidth){if(this._isAutoCellHeight&&o.Utils.throttle((()=>{let e=-this.opts.marginRight-this.opts.marginLeft+this.opts.marginTop+this.opts.marginBottom;this.cellHeight(this.cellWidth()+e)}),100),!this.opts.disableOneColumnMode&&this.el.clientWidth<=this.opts.minWidth){if(this._oneColumnMode)return this;this._oneColumnMode=!0,this.column(1),this._resizeNestedGrids(this.el)}else{if(!this._oneColumnMode)return this;delete this._oneColumnMode,this.column(this._prevColumn),this._resizeNestedGrids(this.el)}return this}}_updateWindowResizeEvent(e=!1){const t=this._isAutoCellHeight||!this.opts.disableOneColumnMode;return!t||e||this.opts._isNested||this._windowResizeBind?!e&&t||!this._windowResizeBind||(window.removeEventListener("resize",this._windowResizeBind),delete this._windowResizeBind):(this._windowResizeBind=this.onParentResize.bind(this),window.addEventListener("resize",this._windowResizeBind),this.onParentResize()),this}static getElement(e=".grid-stack-item"){return o.Utils.getElement(e)}static getElements(e=".grid-stack-item"){return o.Utils.getElements(e)}static getGridElement(e){return a.getElement(e)}static getGridElements(e){return o.Utils.getElements(e)}initMargin(){let e,t=0,i=[];return"string"==typeof this.opts.margin&&(i=this.opts.margin.split(" ")),2===i.length?(this.opts.marginTop=this.opts.marginBottom=i[0],this.opts.marginLeft=this.opts.marginRight=i[1]):4===i.length?(this.opts.marginTop=i[0],this.opts.marginRight=i[1],this.opts.marginBottom=i[2],this.opts.marginLeft=i[3]):(e=o.Utils.parseHeight(this.opts.margin),this.opts.marginUnit=e.unit,t=this.opts.margin=e.h),void 0===this.opts.marginTop?this.opts.marginTop=t:(e=o.Utils.parseHeight(this.opts.marginTop),this.opts.marginTop=e.h,delete this.opts.margin),void 0===this.opts.marginBottom?this.opts.marginBottom=t:(e=o.Utils.parseHeight(this.opts.marginBottom),this.opts.marginBottom=e.h,delete this.opts.margin),void 0===this.opts.marginRight?this.opts.marginRight=t:(e=o.Utils.parseHeight(this.opts.marginRight),this.opts.marginRight=e.h,delete this.opts.margin),void 0===this.opts.marginLeft?this.opts.marginLeft=t:(e=o.Utils.parseHeight(this.opts.marginLeft),this.opts.marginLeft=e.h,delete this.opts.margin),this.opts.marginUnit=e.unit,this.opts.marginTop===this.opts.marginBottom&&this.opts.marginLeft===this.opts.marginRight&&this.opts.marginTop===this.opts.marginRight&&(this.opts.margin=this.opts.marginTop),this}movable(e,t){return this}resizable(e,t){return this}_setupAcceptWidget(){return this}_setupRemoveDrop(){return this}_setupRemovingTimeout(e){return this}_clearRemovingTimeout(e){return this}_setupDragIn(){return this}_prepareDragDropByNode(e){return this}locked(e,t){return this.update(e,{locked:t})}maxWidth(e,t){return this.update(e,{maxW:t})}minWidth(e,t){return this.update(e,{minW:t})}maxHeight(e,t){return this.update(e,{maxH:t})}minHeight(e,t){return this.update(e,{minH:t})}move(e,t,i){return this.update(e,{x:t,y:i})}resize(e,t,i){return this.update(e,{w:t,h:i})}}t.GridStack=a,a.Utils=o.Utils,a.Engine=r.GridStackEngine},861:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.DDBaseImplement=class{constructor(){this._disabled=!1,this._eventRegister={}}get disabled(){return this._disabled}on(e,t){this._eventRegister[e]=t}off(e){delete this._eventRegister[e]}enable(){this._disabled=!1}disable(){this._disabled=!0}destroy(){delete this._eventRegister}triggerEvent(e,t){if(!this.disabled&&this._eventRegister)return this._eventRegister[e]?this._eventRegister[e](t):void 0}}},311:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0});const s=i(849),r=i(943),o=i(861);class n extends o.DDBaseImplement{constructor(e,t={}){super(),this.dragging=!1,this.ui=()=>{const e=this.el.parentElement.getBoundingClientRect(),t=this.helper.getBoundingClientRect();return{position:{top:t.top-e.top,left:t.left-e.left}}},this.el=e,this.option=t,this._mouseDown=this._mouseDown.bind(this),this._dragStart=this._dragStart.bind(this),this._drag=this._drag.bind(this),this._dragEnd=this._dragEnd.bind(this),this._dragFollow=this._dragFollow.bind(this),this.enable()}on(e,t){super.on(e,t)}off(e){super.off(e)}enable(){super.enable(),this.el.draggable=!0,this.el.classList.remove("ui-draggable-disabled"),this.el.classList.add("ui-draggable"),this.el.addEventListener("mousedown",this._mouseDown),this.el.addEventListener("dragstart",this._dragStart)}disable(e=!1){super.disable(),this.el.removeAttribute("draggable"),this.el.classList.remove("ui-draggable"),e||this.el.classList.add("ui-draggable-disabled"),this.el.removeEventListener("mousedown",this._mouseDown),this.el.removeEventListener("dragstart",this._dragStart)}destroy(){this.dragging&&this._dragEnd({}),this.disable(!0),delete this.el,delete this.helper,delete this.option,super.destroy()}updateOption(e){return Object.keys(e).forEach((t=>this.option[t]=e[t])),this}_mouseDown(e){let t=this.option.handle.substring(1),i=e.target;for(;i&&!i.classList.contains(t);)i=i.parentElement;this.dragEl=i}_dragStart(e){if(!this.dragEl)return void e.preventDefault();s.DDManager.dragElement=this,this.helper=this._createHelper(e),this._setupHelperContainmentStyle(),this.dragOffset=this._getDragOffset(e,this.el,this.helperContainment);const t=r.DDUtils.initEvent(e,{target:this.el,type:"dragstart"});this.helper!==this.el?this._setupDragFollowNodeNotifyStart(t):this.dragFollowTimer=window.setTimeout((()=>{delete this.dragFollowTimer,this._setupDragFollowNodeNotifyStart(t)}),0),this._cancelDragGhost(e)}_setupDragFollowNodeNotifyStart(e){return this._setupHelperStyle(),document.addEventListener("dragover",this._drag,n.dragEventListenerOption),this.el.addEventListener("dragend",this._dragEnd),this.option.start&&this.option.start(e,this.ui()),this.dragging=!0,this.helper.classList.add("ui-draggable-dragging"),this.triggerEvent("dragstart",e),this}_drag(e){e.preventDefault(),this._dragFollow(e);const t=r.DDUtils.initEvent(e,{target:this.el,type:"drag"});this.option.drag&&this.option.drag(t,this.ui()),this.triggerEvent("drag",t)}_dragEnd(e){if(this.dragFollowTimer)return clearTimeout(this.dragFollowTimer),void delete this.dragFollowTimer;this.paintTimer&&cancelAnimationFrame(this.paintTimer),document.removeEventListener("dragover",this._drag,n.dragEventListenerOption),this.el.removeEventListener("dragend",this._dragEnd),this.dragging=!1,this.helper.classList.remove("ui-draggable-dragging"),this.helperContainment.style.position=this.parentOriginStylePosition||null,this.helper===this.el?this._removeHelperStyle():this.helper.remove();const t=r.DDUtils.initEvent(e,{target:this.el,type:"dragstop"});this.option.stop&&this.option.stop(t),this.triggerEvent("dragstop",t),delete s.DDManager.dragElement,delete this.helper,delete this.dragEl}_createHelper(e){let t=this.el;return"function"==typeof this.option.helper?t=this.option.helper.apply(this.el,e):"clone"===this.option.helper&&(t=r.DDUtils.clone(this.el)),document.body.contains(t)||r.DDUtils.appendTo(t,"parent"===this.option.appendTo?this.el.parentNode:this.option.appendTo),t===this.el&&(this.dragElementOriginStyle=n.originStyleProp.map((e=>this.el.style[e]))),t}_setupHelperStyle(){return this.helper.style.pointerEvents="none",this.helper.style.width=this.dragOffset.width+"px",this.helper.style.height=this.dragOffset.height+"px",this.helper.style.willChange="left, top",this.helper.style.transition="none",this.helper.style.position=this.option.basePosition||n.basePosition,this.helper.style.zIndex="1000",setTimeout((()=>{this.helper&&(this.helper.style.transition=null)}),0),this}_removeHelperStyle(){let e=this.helper?this.helper.gridstackNode:void 0;return e&&e._isAboutToRemove||n.originStyleProp.forEach((e=>{this.helper.style[e]=this.dragElementOriginStyle[e]||null})),delete this.dragElementOriginStyle,this}_dragFollow(e){this.paintTimer&&cancelAnimationFrame(this.paintTimer),this.paintTimer=requestAnimationFrame((()=>{delete this.paintTimer;const t=this.dragOffset;let i={left:0,top:0};if("absolute"===this.helper.style.position){const{left:e,top:t}=this.helperContainment.getBoundingClientRect();i={left:e,top:t}}this.helper.style.left=e.clientX+t.offsetLeft-i.left+"px",this.helper.style.top=e.clientY+t.offsetTop-i.top+"px"}))}_setupHelperContainmentStyle(){return this.helperContainment=this.helper.parentElement,"fixed"!==this.option.basePosition&&(this.parentOriginStylePosition=this.helperContainment.style.position,window.getComputedStyle(this.helperContainment).position.match(/static/)&&(this.helperContainment.style.position="relative")),this}_cancelDragGhost(e){let t=document.createElement("div");return t.style.width="1px",t.style.height="1px",document.body.appendChild(t),e.dataTransfer.setDragImage(t,0,0),setTimeout((()=>document.body.removeChild(t))),e.stopPropagation(),this}_getDragOffset(e,t,i){let s=0,o=0;if(i){const e=document.createElement("div");r.DDUtils.addElStyles(e,{opacity:"0",position:"fixed",top:"0px",left:"0px",width:"1px",height:"1px",zIndex:"-999999"}),i.appendChild(e);const t=e.getBoundingClientRect();i.removeChild(e),s=t.left,o=t.top}const n=t.getBoundingClientRect();return{left:n.left,top:n.top,offsetLeft:-e.clientX+n.left-s,offsetTop:-e.clientY+n.top-o,width:n.width,height:n.height}}}t.DDDraggable=n,n.basePosition="absolute",n.dragEventListenerOption=!0,n.originStyleProp=["transition","pointerEvents","position","left","top","opacity","zIndex","width","height","willChange"]},54:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0});const s=i(849),r=i(861),o=i(943);class n extends r.DDBaseImplement{constructor(e,t={}){super(),this.acceptable=null,this.el=e,this.option=t,this._dragEnter=this._dragEnter.bind(this),this._dragOver=this._dragOver.bind(this),this._dragLeave=this._dragLeave.bind(this),this._drop=this._drop.bind(this),this.el.classList.add("ui-droppable"),this.el.addEventListener("dragenter",this._dragEnter),this._setupAccept()}on(e,t){super.on(e,t)}off(e){super.off(e)}enable(){this.disabled&&(super.enable(),this.el.classList.remove("ui-droppable-disabled"),this.el.addEventListener("dragenter",this._dragEnter))}disable(){this.disabled||(super.disable(),this.el.classList.add("ui-droppable-disabled"),this.el.removeEventListener("dragenter",this._dragEnter))}destroy(){this.el.classList.remove("ui-droppable"),this.disabled&&(this.el.classList.remove("ui-droppable-disabled"),this.el.removeEventListener("dragenter",this._dragEnter),this.el.removeEventListener("dragover",this._dragOver),this.el.removeEventListener("drop",this._drop),this.el.removeEventListener("dragleave",this._dragLeave)),super.destroy()}updateOption(e){return Object.keys(e).forEach((t=>this.option[t]=e[t])),this._setupAccept(),this}_dragEnter(e){if(this.el.removeEventListener("dragenter",this._dragEnter),this.acceptable=this._canDrop(),this.acceptable){e.preventDefault();const t=o.DDUtils.initEvent(e,{target:this.el,type:"dropover"});this.option.over&&this.option.over(t,this._ui(s.DDManager.dragElement)),this.triggerEvent("dropover",t),this.el.addEventListener("dragover",this._dragOver),this.el.addEventListener("drop",this._drop)}this.el.classList.add("ui-droppable-over"),this.el.addEventListener("dragleave",this._dragLeave)}_dragOver(e){e.preventDefault(),e.stopPropagation()}_dragLeave(e){if(!this.el.contains(e.relatedTarget)&&(this._removeLeaveCallbacks(),this.acceptable)){e.preventDefault();const t=o.DDUtils.initEvent(e,{target:this.el,type:"dropout"});this.option.out&&this.option.out(t,this._ui(s.DDManager.dragElement)),this.triggerEvent("dropout",t)}}_drop(e){if(!this.acceptable)return;e.preventDefault();const t=o.DDUtils.initEvent(e,{target:this.el,type:"drop"});this.option.drop&&this.option.drop(t,this._ui(s.DDManager.dragElement)),this.triggerEvent("drop",t),this._removeLeaveCallbacks()}_removeLeaveCallbacks(){this.el.removeEventListener("dragleave",this._dragLeave),this.el.classList.remove("ui-droppable-over"),this.acceptable&&(this.el.removeEventListener("dragover",this._dragOver),this.el.removeEventListener("drop",this._drop)),this.el.addEventListener("dragenter",this._dragEnter)}_canDrop(){return s.DDManager.dragElement&&(!this.accept||this.accept(s.DDManager.dragElement.el))}_setupAccept(){return this.option.accept&&"string"==typeof this.option.accept?this.accept=e=>e.matches(this.option.accept):this.accept=this.option.accept,this}_ui(e){return Object.assign({draggable:e.el},e.ui())}}t.DDDroppable=n},485:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0});const s=i(97),r=i(311),o=i(54);class n{constructor(e){this.el=e}static init(e){return e.ddElement||(e.ddElement=new n(e)),e.ddElement}on(e,t){return this.ddDraggable&&["drag","dragstart","dragstop"].indexOf(e)>-1?this.ddDraggable.on(e,t):this.ddDroppable&&["drop","dropover","dropout"].indexOf(e)>-1?this.ddDroppable.on(e,t):this.ddResizable&&["resizestart","resize","resizestop"].indexOf(e)>-1&&this.ddResizable.on(e,t),this}off(e){return this.ddDraggable&&["drag","dragstart","dragstop"].indexOf(e)>-1?this.ddDraggable.off(e):this.ddDroppable&&["drop","dropover","dropout"].indexOf(e)>-1?this.ddDroppable.off(e):this.ddResizable&&["resizestart","resize","resizestop"].indexOf(e)>-1&&this.ddResizable.off(e),this}setupDraggable(e){return this.ddDraggable?this.ddDraggable.updateOption(e):this.ddDraggable=new r.DDDraggable(this.el,e),this}cleanDraggable(){return this.ddDraggable&&(this.ddDraggable.destroy(),delete this.ddDraggable),this}setupResizable(e){return this.ddResizable?this.ddResizable.updateOption(e):this.ddResizable=new s.DDResizable(this.el,e),this}cleanResizable(){return this.ddResizable&&(this.ddResizable.destroy(),delete this.ddResizable),this}setupDroppable(e){return this.ddDroppable?this.ddDroppable.updateOption(e):this.ddDroppable=new o.DDDroppable(this.el,e),this}cleanDroppable(){return this.ddDroppable&&(this.ddDroppable.destroy(),delete this.ddDroppable),this}}t.DDElement=n},849:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.DDManager=class{}},680:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0});class i{constructor(e,t,i){this.moving=!1,this.host=e,this.dir=t,this.option=i,this._mouseDown=this._mouseDown.bind(this),this._mouseMove=this._mouseMove.bind(this),this._mouseUp=this._mouseUp.bind(this),this._init()}_init(){const e=document.createElement("div");return e.classList.add("ui-resizable-handle"),e.classList.add(`${i.prefix}${this.dir}`),e.style.zIndex="100",e.style.userSelect="none",this.el=e,this.host.appendChild(this.el),this.el.addEventListener("mousedown",this._mouseDown),this}destroy(){return this.moving&&this._mouseUp(this.mouseDownEvent),this.el.removeEventListener("mousedown",this._mouseDown),this.host.removeChild(this.el),delete this.el,delete this.host,this}_mouseDown(e){this.mouseDownEvent=e,document.addEventListener("mousemove",this._mouseMove,!0),document.addEventListener("mouseup",this._mouseUp)}_mouseMove(e){let t=this.mouseDownEvent;!this.moving&&Math.abs(e.x-t.x)+Math.abs(e.y-t.y)>2?(this.moving=!0,this._triggerEvent("start",this.mouseDownEvent)):this.moving&&this._triggerEvent("move",e)}_mouseUp(e){this.moving&&this._triggerEvent("stop",e),document.removeEventListener("mousemove",this._mouseMove,!0),document.removeEventListener("mouseup",this._mouseUp),delete this.moving,delete this.mouseDownEvent}_triggerEvent(e,t){return this.option[e]&&this.option[e](t),this}}t.DDResizableHandle=i,i.prefix="ui-resizable-"},97:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0});const s=i(680),r=i(861),o=i(943),n=i(593);class l extends r.DDBaseImplement{constructor(e,t={}){super(),this._showHandlers=()=>{this.el.classList.remove("ui-resizable-autohide")},this._hideHandlers=()=>{this.el.classList.add("ui-resizable-autohide")},this._ui=()=>{const e=this.el.parentElement.getBoundingClientRect(),t={width:this.originalRect.width,height:this.originalRect.height+this.scrolled,left:this.originalRect.left,top:this.originalRect.top-this.scrolled},i=this.temporalRect||t;return{position:{left:i.left-e.left,top:i.top-e.top},size:{width:i.width,height:i.height}}},this.el=e,this.option=t,this.enable(),this._setupAutoHide(),this._setupHandlers()}on(e,t){super.on(e,t)}off(e){super.off(e)}enable(){super.enable(),this.el.classList.add("ui-resizable"),this.el.classList.remove("ui-resizable-disabled")}disable(){super.disable(),this.el.classList.add("ui-resizable-disabled"),this.el.classList.remove("ui-resizable")}destroy(){this._removeHandlers(),this.option.autoHide&&(this.el.removeEventListener("mouseover",this._showHandlers),this.el.removeEventListener("mouseout",this._hideHandlers)),this.el.classList.remove("ui-resizable"),delete this.el,super.destroy()}updateOption(e){let t=e.handles&&e.handles!==this.option.handles,i=e.autoHide&&e.autoHide!==this.option.autoHide;return Object.keys(e).forEach((t=>this.option[t]=e[t])),t&&(this._removeHandlers(),this._setupHandlers()),i&&this._setupAutoHide(),this}_setupAutoHide(){return this.option.autoHide?(this.el.classList.add("ui-resizable-autohide"),this.el.addEventListener("mouseover",this._showHandlers),this.el.addEventListener("mouseout",this._hideHandlers)):(this.el.classList.remove("ui-resizable-autohide"),this.el.removeEventListener("mouseover",this._showHandlers),this.el.removeEventListener("mouseout",this._hideHandlers)),this}_setupHandlers(){let e=this.option.handles||"e,s,se";return"all"===e&&(e="n,e,s,w,se,sw,ne,nw"),this.handlers=e.split(",").map((e=>e.trim())).map((e=>new s.DDResizableHandle(this.el,e,{start:e=>{this._resizeStart(e)},stop:e=>{this._resizeStop(e)},move:t=>{this._resizing(t,e)}}))),this}_resizeStart(e){this.originalRect=this.el.getBoundingClientRect(),this.scrollEl=n.Utils.getScrollParent(this.el),this.scrollY=this.scrollEl.scrollTop,this.startEvent=e,this._setupHelper(),this._applyChange();const t=o.DDUtils.initEvent(e,{type:"resizestart",target:this.el});return this.option.start&&this.option.start(t,this._ui()),this.el.classList.add("ui-resizable-resizing"),this.triggerEvent("resizestart",t),this}_resizing(e,t){this.scrolled=this.scrollEl.scrollTop-this.scrollY,this.temporalRect=this._getChange(e,t),this._applyChange();const i=o.DDUtils.initEvent(e,{type:"resize",target:this.el});return this.option.resize&&this.option.resize(i,this._ui()),this.triggerEvent("resize",i),this}_resizeStop(e){const t=o.DDUtils.initEvent(e,{type:"resizestop",target:this.el});return this.option.stop&&this.option.stop(t),this.el.classList.remove("ui-resizable-resizing"),this.triggerEvent("resizestop",t),this._cleanHelper(),delete this.startEvent,delete this.originalRect,delete this.temporalRect,delete this.scrollY,delete this.scrolled,this}_setupHelper(){return this.elOriginStyleVal=l._originStyleProp.map((e=>this.el.style[e])),this.parentOriginStylePosition=this.el.parentElement.style.position,window.getComputedStyle(this.el.parentElement).position.match(/static/)&&(this.el.parentElement.style.position="relative"),this.el.style.position=this.option.basePosition||"absolute",this.el.style.opacity="0.8",this.el.style.zIndex="1000",this}_cleanHelper(){return l._originStyleProp.forEach(((e,t)=>{this.el.style[e]=this.elOriginStyleVal[t]||null})),this.el.parentElement.style.position=this.parentOriginStylePosition||null,this}_getChange(e,t){const i=this.startEvent,s={width:this.originalRect.width,height:this.originalRect.height+this.scrolled,left:this.originalRect.left,top:this.originalRect.top-this.scrolled},r=e.clientX-i.clientX,o=e.clientY-i.clientY;t.indexOf("e")>-1&&(s.width+=e.clientX-i.clientX),t.indexOf("s")>-1&&(s.height+=e.clientY-i.clientY),t.indexOf("w")>-1&&(s.width-=r,s.left+=r),t.indexOf("n")>-1&&(s.height-=o,s.top+=o);const n=this._getReShapeSize(s.width,s.height);return s.width!==n.width&&(t.indexOf("w")>-1&&(s.left+=s.width-n.width),s.width=n.width),s.height!==n.height&&(t.indexOf("n")>-1&&(s.top+=s.height-n.height),s.height=n.height),s}_getReShapeSize(e,t){const i=this.option.maxWidth||e,s=this.option.minWidth||e,r=this.option.maxHeight||t,o=this.option.minHeight||t;return{width:Math.min(i,Math.max(s,e)),height:Math.min(r,Math.max(o,t))}}_applyChange(){let e={left:0,top:0,width:0,height:0};if("absolute"===this.el.style.position){const t=this.el.parentElement,{left:i,top:s}=t.getBoundingClientRect();e={left:i,top:s,width:0,height:0}}return this.temporalRect?(Object.keys(this.temporalRect).forEach((t=>{const i=this.temporalRect[t];this.el.style[t]=i-e[t]+"px"})),this):this}_removeHandlers(){return this.handlers.forEach((e=>e.destroy())),delete this.handlers,this}}t.DDResizable=l,l._originStyleProp=["width","height","position","left","top","opacity","zIndex"]},943:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0});class i{static clone(e){const t=e.cloneNode(!0);return t.removeAttribute("id"),t}static appendTo(e,t){let i;i="string"==typeof t?document.querySelector(t):t,i&&i.append(e)}static setPositionRelative(e){/^(?:r|a|f)/.test(window.getComputedStyle(e).position)||(e.style.position="relative")}static addElStyles(e,t){if(t instanceof Object)for(const i in t)t.hasOwnProperty(i)&&(Array.isArray(t[i])?t[i].forEach((t=>{e.style[i]=t})):e.style[i]=t[i])}static initEvent(e,t){const i={type:t.type},s={button:0,which:0,buttons:1,bubbles:!0,cancelable:!0,target:t.target?t.target:e.target};return e.dataTransfer&&(i.dataTransfer=e.dataTransfer),["altKey","ctrlKey","metaKey","shiftKey"].forEach((t=>i[t]=e[t])),["pageX","pageY","clientX","clientY","screenX","screenY"].forEach((t=>i[t]=e[t])),Object.assign(Object.assign({},i),s)}}t.DDUtils=i,i.isEventSupportPassiveOption=(()=>{let e=!1,t=()=>{};return document.addEventListener("test",t,{get passive(){return e=!0,!0}}),document.removeEventListener("test",t),e})()},761:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0});const s=i(849),r=i(485),o=i(21),n=i(593);!function(e){for(var i in e)t.hasOwnProperty(i)||(t[i]=e[i])}(i(21));class l extends o.GridStackDD{resizable(e,t,i,s){return this._getDDElements(e).forEach((e=>{if("disable"===t||"enable"===t)e.ddResizable&&e.ddResizable[t]();else if("destroy"===t)e.ddResizable&&e.cleanResizable();else if("option"===t)e.setupResizable({[i]:s});else{const i=e.el.gridstackNode.grid;let s=e.el.getAttribute("gs-resize-handles")?e.el.getAttribute("gs-resize-handles"):i.opts.resizable.handles;e.setupResizable(Object.assign(Object.assign(Object.assign({},i.opts.resizable),{handles:s}),{start:t.start,stop:t.stop,resize:t.resize}))}})),this}draggable(e,t,i,s){return this._getDDElements(e).forEach((e=>{if("disable"===t||"enable"===t)e.ddDraggable&&e.ddDraggable[t]();else if("destroy"===t)e.ddDraggable&&e.cleanDraggable();else if("option"===t)e.setupDraggable({[i]:s});else{const i=e.el.gridstackNode.grid;e.setupDraggable(Object.assign(Object.assign({},i.opts.draggable),{containment:i.opts._isNested&&!i.opts.dragOut?i.el.parentElement:i.opts.draggable.containment||null,start:t.start,stop:t.stop,drag:t.drag}))}})),this}dragIn(e,t){return this._getDDElements(e).forEach((e=>e.setupDraggable(t))),this}droppable(e,t,i,s){return"function"!=typeof t.accept||t._accept||(t._accept=t.accept,t.accept=e=>t._accept(e)),this._getDDElements(e).forEach((e=>{"disable"===t||"enable"===t?e.ddDroppable&&e.ddDroppable[t]():"destroy"===t?e.ddDroppable&&e.cleanDroppable():"option"===t?e.setupDroppable({[i]:s}):e.setupDroppable(t)})),this}isDroppable(e){return e&&e.ddElement&&e.ddElement.ddDroppable&&!e.ddElement.ddDroppable.disabled}isDraggable(e){return e&&e.ddElement&&e.ddElement.ddDraggable&&!e.ddElement.ddDraggable.disabled}isResizable(e){return e&&e.ddElement&&e.ddElement.ddResizable&&!e.ddElement.ddResizable.disabled}on(e,t,i){return this._getDDElements(e).forEach((e=>e.on(t,(e=>{i(e,s.DDManager.dragElement?s.DDManager.dragElement.el:e.target,s.DDManager.dragElement?s.DDManager.dragElement.helper:null)})))),this}off(e,t){return this._getDDElements(e).forEach((e=>e.off(t))),this}_getDDElements(e,t=!0){let i=n.Utils.getElements(e);if(!i.length)return[];let s=i.map((e=>e.ddElement||(t?r.DDElement.init(e):null)));return t||s.filter((e=>e)),s}}t.GridStackDDNative=l,o.GridStackDD.registerPlugin(l)},117:(e,t,i)=>{function s(e){for(var i in e)t.hasOwnProperty(i)||(t[i]=e[i])}Object.defineProperty(t,"__esModule",{value:!0}),s(i(593)),s(i(62)),s(i(334)),s(i(270)),s(i(761))},593:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.obsolete=function(e,t,i,s,r){let o=(...o)=>(console.warn("gridstack.js: Function `"+i+"` is deprecated in "+r+" and has been replaced with `"+s+"`. It will be **completely** removed in v1.0"),t.apply(e,o));return o.prototype=t.prototype,o},t.obsoleteOpts=function(e,t,i,s){void 0!==e[t]&&(e[i]=e[t],console.warn("gridstack.js: Option `"+t+"` is deprecated in "+s+" and has been replaced with `"+i+"`. It will be **completely** removed in v1.0"))},t.obsoleteOptsDel=function(e,t,i,s){void 0!==e[t]&&console.warn("gridstack.js: Option `"+t+"` is deprecated in "+i+s)},t.obsoleteAttr=function(e,t,i,s){let r=e.getAttribute(t);null!==r&&(e.setAttribute(i,r),console.warn("gridstack.js: attribute `"+t+"`="+r+" is deprecated on this object in "+s+" and has been replaced with `"+i+"`. It will be **completely** removed in v1.0"))},t.Utils=class{static getElements(e){if("string"==typeof e){let t=document.querySelectorAll(e);return t.length||"."===e[0]||"#"===e[0]||(t=document.querySelectorAll("."+e),t.length||(t=document.querySelectorAll("#"+e))),Array.from(t)}return[e]}static getElement(e){if("string"==typeof e){if(!e.length)return null;if("#"===e[0])return document.getElementById(e.substring(1));if("."===e[0]||"["===e[0])return document.querySelector(e);if(!isNaN(+e[0]))return document.getElementById(e);let t=document.querySelector(e);return t||(t=document.getElementById(e)),t||(t=document.querySelector("."+e)),t}return e}static isIntercepted(e,t){return!(e.x+e.w<=t.x||t.x+t.w<=e.x||e.y+e.h<=t.y||t.y+t.h<=e.y)}static sort(e,t,i){if(!i){let t=e.map((e=>e.x+e.w));i=Math.max(...t)}return-1===t?e.sort(((e,t)=>t.x+t.y*i-(e.x+e.y*i))):e.sort(((e,t)=>e.x+e.y*i-(t.x+t.y*i)))}static createStylesheet(e,t){let i=document.createElement("style");return i.setAttribute("type","text/css"),i.setAttribute("gs-style-id",e),i.styleSheet?i.styleSheet.cssText="":i.appendChild(document.createTextNode("")),t?t.insertBefore(i,t.firstChild):(t=document.getElementsByTagName("head")[0]).appendChild(i),i.sheet}static removeStylesheet(e){let t=document.querySelector("STYLE[gs-style-id="+e+"]");t&&t.parentNode&&t.parentNode.removeChild(t)}static addCSSRule(e,t,i){"function"==typeof e.addRule?e.addRule(t,i):"function"==typeof e.insertRule&&e.insertRule(`${t}{${i}}`)}static toBool(e){return"boolean"==typeof e?e:"string"==typeof e?!(""===(e=e.toLowerCase())||"no"===e||"false"===e||"0"===e):Boolean(e)}static toNumber(e){return null===e||0===e.length?void 0:Number(e)}static parseHeight(e){let t,i="px";if("string"==typeof e){let s=e.match(/^(-[0-9]+\.[0-9]+|[0-9]*\.[0-9]+|-[0-9]+|[0-9]+)(px|em|rem|vh|vw|%)?$/);if(!s)throw new Error("Invalid height");i=s[2]||"px",t=parseFloat(s[1])}else t=e;return{h:t,unit:i}}static defaults(e,...t){return t.forEach((t=>{for(const i in t){if(!t.hasOwnProperty(i))return;null===e[i]||void 0===e[i]?e[i]=t[i]:"object"==typeof t[i]&&"object"==typeof e[i]&&this.defaults(e[i],t[i])}})),e}static same(e,t){if("object"!=typeof e)return e==t;if(typeof e!=typeof t)return!1;if(Object.keys(e).length!==Object.keys(t).length)return!1;for(const i in e)if(e[i]!==t[i])return!1;return!0}static removeInternalAndSame(e,t){if("object"==typeof e&&"object"==typeof t)for(let i in e){let s=e[i];if(s&&"object"==typeof s){for(let e in s)s[e]!==t[i][e]&&"_"!==e[0]||delete s[e];Object.keys(s).length||delete e[i]}else s!==t[i]&&"_"!==i[0]||delete e[i]}}static closestByClass(e,t){for(;e=e.parentElement;)if(e.classList.contains(t))return e;return null}static throttle(e,t){let i=!1;return(...s)=>{i||(e.apply(this,s),i=!0,setTimeout((()=>i=!1),t))}}static removePositioningStyles(e){let t=e.style;t.position&&t.removeProperty("position"),t.left&&t.removeProperty("left"),t.top&&t.removeProperty("top"),t.width&&t.removeProperty("width"),t.height&&t.removeProperty("height")}static getScrollParent(e){if(null===e)return document.documentElement;const t=getComputedStyle(e);return/(auto|scroll)/.test(t.overflow+t.overflowY)?e:this.getScrollParent(e.parentElement)}static updateScrollPosition(e,t,i){let s=e.getBoundingClientRect(),r=window.innerHeight||document.documentElement.clientHeight;if(s.top<0||s.bottom>r){let o=s.bottom-r,n=s.top,l=this.getScrollParent(e);if(null!==l){let a=l.scrollTop;s.top<0&&i<0?e.offsetHeight>r?l.scrollTop+=i:l.scrollTop+=Math.abs(n)>Math.abs(i)?i:n:i>0&&(e.offsetHeight>r?l.scrollTop+=i:l.scrollTop+=o>i?i:o),t.top+=l.scrollTop-a}}}static updateScrollResize(e,t,i){const s=this.getScrollParent(t),r=s.clientHeight,o=e.clientYr-i;o?s.scrollBy({behavior:"smooth",top:e.clientY-i}):n&&s.scrollBy({behavior:"smooth",top:i-(r-e.clientY)})}}}},t={};return function i(s){if(t[s])return t[s].exports;var r=t[s]={exports:{}};return e[s](r,r.exports,i),r.exports}(117)})().GridStack})); +!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.GridStack=e():t.GridStack=e()}(self,(function(){return(()=>{"use strict";var t={21:(t,e,i)=>{Object.defineProperty(e,"__esModule",{value:!0});const s=i(334),r=i(270),o=i(593);class n extends s.GridStackDDI{static get(){return s.GridStackDDI.get()}remove(t){return this.draggable(t,"destroy").resizable(t,"destroy"),t.gridstackNode&&delete t.gridstackNode._initDD,this}}e.GridStackDD=n,r.GridStack.prototype._setupAcceptWidget=function(){if(this.opts.staticGrid)return this;if(!this.opts.acceptWidgets)return n.get().droppable(this.el,{accept:t=>t.gridstackNode&&t.gridstackNode.grid===this}),this;let t=(t,e)=>{let i=e.gridstackNode,s=this.getCellFromPixel({left:t.pageX,top:t.pageY},!0),r=Math.max(0,s.x),o=Math.max(0,s.y);if(i._added)r===i.x&&o===i.y||!this.engine.canMoveNode(i,r,o)||(this.engine.moveNode(i,r,o),this._updateContainerHeight());else{if(i.x=r,i.y=o,delete i.autoPosition,!this.engine.willItFit(i)&&(i.autoPosition=!0,!this.engine.willItFit(i)))return;i._added=!0,i.el=e,this.engine.cleanNodes(),this.engine.beginUpdate(i),this.engine.addNode(i),this._writePosAttr(this.placeholder,i.x,i.y,i.w,i.h),this.el.appendChild(this.placeholder),i.el=this.placeholder,i._beforeDragX=i.x,i._beforeDragY=i.y,this._updateContainerHeight()}};return n.get().droppable(this.el,{accept:t=>{let e=t.gridstackNode;if(e&&e.grid===this)return!0;let i=!0;if("function"==typeof this.opts.acceptWidgets)i=this.opts.acceptWidgets(t);else{let e=!0===this.opts.acceptWidgets?".grid-stack-item":this.opts.acceptWidgets;i=t.matches(e)}if(i&&e&&this.opts.maxRow){let t={w:e.w,h:e.h,minW:e.minW,minH:e.minH};i=this.engine.willItFit(t)}return i}}).on(this.el,"dropover",((e,i)=>{let s=i.gridstackNode;if(s&&s.grid===this)return delete s._added,!1;s||(s=this._readAttr(i)),s.grid&&s.grid!==this&&(s._added=!0);let r=s.w||Math.round(i.offsetWidth/this.cellWidth())||1,o=s.h||Math.round(i.offsetHeight/this.getCellHeight(!0))||1,l=this.engine.prepareNode(Object.assign(Object.assign({},s),{w:r,h:o,_added:!1,_temporary:!0}));return l._isOutOfGrid=!0,i.gridstackNode=l,i._gridstackNodeOrig=s,n.get().on(i,"drag",t),!1})).on(this.el,"dropout",((t,e)=>{let i=e.gridstackNode;if(i&&(delete i._added,i._isOutOfGrid))return n.get().off(e,"drag"),i.el=null,this.engine.removeNode(i),this.placeholder.parentNode===this.el&&this.placeholder.remove(),this._updateContainerHeight(),e.gridstackNode=e._gridstackNodeOrig,!1})).on(this.el,"drop",((t,e,i)=>{let s=e.gridstackNode,r=!!this.placeholder.parentElement;if(s&&s.grid===this)return!1;this.placeholder.remove();let l=e._gridstackNodeOrig;if(delete e._gridstackNodeOrig,r&&l&&l.grid&&l.grid!==this){let t=l.grid;t.placeholder.remove(),l.el=e,t.engine.removedNodes.push(l),t._triggerRemoveEvent()}if(!s)return!1;if(r){const t=s._id;this.engine.cleanupNode(s),s._id=t,s.grid=this}return n.get().off(e,"drag"),i!==e?(i.remove(),e.gridstackNode=l,r&&(e=e.cloneNode(!0))):(e.remove(),n.get().remove(e)),!!r&&(e.gridstackNode=s,s.el=e,o.Utils.removePositioningStyles(e),this._writeAttr(e,s),this.el.appendChild(e),this._updateContainerHeight(),this.engine.addedNodes.push(s),this._triggerAddEvent(),this._triggerChangeEvent(),this.engine.endUpdate(),this._gsEventHandler.dropped&&this._gsEventHandler.dropped({type:"dropped"},l&&l.grid?l:void 0,s),window.setTimeout((()=>{s.el&&s.el.parentElement&&this._prepareDragDropByNode(s)})),!1)})),this},r.GridStack.prototype._setupRemoveDrop=function(){if(!this.opts.staticGrid&&"string"==typeof this.opts.removable){let t=document.querySelector(this.opts.removable);if(!t)return this;n.get().isDroppable(t)||n.get().droppable(t,this.opts.removableOptions).on(t,"dropover",(function(t,e){let i=e.gridstackNode;i&&i.grid&&(e.dataset.inTrashZone="true",i.grid._setupRemovingTimeout(e))})).on(t,"dropout",(function(t,e){let i=e.gridstackNode;i&&i.grid&&(delete e.dataset.inTrashZone,i.grid._clearRemovingTimeout(e))}))}return this},r.GridStack.prototype._setupRemovingTimeout=function(t){let e=t.gridstackNode;return e&&!e._removeTimeout&&this.opts.removable?(e._removeTimeout=window.setTimeout((()=>{t.classList.add("grid-stack-item-removing"),e._isAboutToRemove=!0}),this.opts.removeTimeout),this):this},r.GridStack.prototype._clearRemovingTimeout=function(t){let e=t.gridstackNode;return e&&e._removeTimeout?(clearTimeout(e._removeTimeout),delete e._removeTimeout,t.classList.remove("grid-stack-item-removing"),delete e._isAboutToRemove,this):this},r.GridStack.prototype._setupDragIn=function(){return this.opts.staticGrid||"string"!=typeof this.opts.dragIn||n.get().isDraggable(this.opts.dragIn)||n.get().dragIn(this.opts.dragIn,this.opts.dragInOptions),this},r.GridStack.prototype._prepareDragDropByNode=function(t){let e,i,s=t.el;if(this.opts.staticGrid||t.locked||(t.noMove||this.opts.disableDrag)&&(t.noResize||this.opts.disableResize))return t._initDD&&(n.get().remove(t.el),delete t._initDD),t.el.classList.add("ui-draggable-disabled","ui-resizable-disabled"),this;if(t._initDD)return(t.noMove||this.opts.disableDrag)&&n.get().draggable(s,"disable"),(t.noResize||this.opts.disableResize)&&n.get().resizable(s,"disable"),this;t.el.classList.remove("ui-draggable-disabled","ui-resizable-disabled");let r=(r,o)=>{let l=r.target;this._gsEventHandler[r.type]&&this._gsEventHandler[r.type](r,l),this.engine.cleanNodes(),this.engine.beginUpdate(t),this._writePosAttr(this.placeholder,t.x,t.y,t.w,t.h),this.el.append(this.placeholder),t.el=this.placeholder,t._beforeDragX=t.x,t._beforeDragY=t.y,t._prevYPix=o.position.top,e=this.cellWidth(),i=this.getCellHeight(!0),n.get().resizable(s,"option","minWidth",e*(t.minW||1)),n.get().resizable(s,"option","minHeight",i*(t.minH||1)),t.maxW&&n.get().resizable(s,"option","maxWidth",e*t.maxW),t.maxH&&n.get().resizable(s,"option","maxHeight",i*t.maxH)},l=(r,n)=>{let l,a,h=Math.round(n.position.left/e),d=Math.round(n.position.top/i);if("drag"===r.type){let e=n.position.top-t._prevYPix;if(t._prevYPix=n.position.top,o.Utils.updateScrollPosition(s,n.position,e),s.dataset.inTrashZone||t._added||this.engine.isOutside(h,d,t)){if(t._temporaryRemoved)return;!0===this.opts.removable&&this._setupRemovingTimeout(s),h=t._beforeDragX,d=t._beforeDragY,this.placeholder.parentNode===this.el&&this.placeholder.remove(),this.engine.removeNode(t),this._updateContainerHeight(),t._temporaryRemoved=!0,delete t._added}else this._clearRemovingTimeout(s),t._temporaryRemoved&&(this.engine.addNode(t),this._writePosAttr(this.placeholder,h,d,l,a),this.el.appendChild(this.placeholder),t.el=this.placeholder,delete t._temporaryRemoved);if(t._lastTriedX===h&&t._lastTriedY===d)return}else if("resize"===r.type){if(h<0)return;if(o.Utils.updateScrollResize(r,s,i),l=Math.round(n.size.width/e),a=Math.round(n.size.height/i),l===t.w&&a===t.h)return}this.engine.canMoveNode(t,h,d,l,a)&&(t._lastTriedX=h,t._lastTriedY=d,t._lastTriedW=l,t._lastTriedH=a,this.engine.moveNode(t,h,d,l,a),this._updateContainerHeight())},a=e=>{this.placeholder.parentNode===this.el&&this.placeholder.remove();let i=e.target;if(i.gridstackNode&&i.gridstackNode.grid===this){if(t.el=i,t._isAboutToRemove){let r=s.gridstackNode.grid;r._gsEventHandler[e.type]&&r._gsEventHandler[e.type](e,i),r.engine.removedNodes.push(t),n.get().remove(s),delete s.gridstackNode,r._triggerRemoveEvent(),s.parentElement&&s.remove()}else this._clearRemovingTimeout(s),t._temporaryRemoved?(o.Utils.removePositioningStyles(i),this._writePosAttr(i,t._beforeDragX,t._beforeDragY,t.w,t.h),t.x=t._beforeDragX,t.y=t._beforeDragY,delete t._temporaryRemoved,this.engine.addNode(t)):(o.Utils.removePositioningStyles(i),this._writePosAttr(i,t.x,t.y,t.w,t.h)),this._gsEventHandler[e.type]&&this._gsEventHandler[e.type](e,i);this._updateContainerHeight(),this._triggerChangeEvent(),this.engine.endUpdate(),"resizestop"===e.type&&this._resizeNestedGrids(i)}};return n.get().draggable(s,{start:r,stop:a,drag:l}).resizable(s,{start:r,stop:a,resize:l}),t._initDD=!0,(t.noMove||this.opts.disableDrag)&&n.get().draggable(s,"disable"),(t.noResize||this.opts.disableResize)&&n.get().resizable(s,"disable"),this},r.GridStack.prototype.movable=function(t,e){return this.opts.staticGrid||r.GridStack.getElements(t).forEach((t=>{let i=t.gridstackNode;i&&!i.locked&&(i.noMove=!e,i.noMove?(n.get().draggable(t,"disable"),t.classList.remove("ui-draggable-handle")):(this._prepareDragDropByNode(i),n.get().draggable(t,"enable"),t.classList.remove("ui-draggable-handle")))})),this},r.GridStack.prototype.resizable=function(t,e){return this.opts.staticGrid||r.GridStack.getElements(t).forEach((t=>{let i=t.gridstackNode;i&&!i.locked&&(i.noResize=!e,i.noResize?n.get().resizable(t,"disable"):(this._prepareDragDropByNode(i),n.get().resizable(t,"enable")))})),this}},334:(t,e)=>{Object.defineProperty(e,"__esModule",{value:!0});class i{static registerPlugin(t){return i.ddi=new t,i.ddi}static get(){return i.ddi||i.registerPlugin(i)}remove(t){return this}}e.GridStackDDI=i},62:(t,e,i)=>{Object.defineProperty(e,"__esModule",{value:!0});const s=i(593);class r{constructor(t={}){this.addedNodes=[],this.removedNodes=[],this.getGridHeight=s.obsolete(this,r.prototype.getRow,"getGridHeight","getRow","v1.0.0"),this.column=t.column||12,this.onChange=t.onChange,this._float=t.float,this.maxRow=t.maxRow,this.nodes=t.nodes||[]}batchUpdate(){return this.batchMode||(this.batchMode=!0,this._prevFloat=this._float,this._float=!0),this}commit(){return this.batchMode?(this.batchMode=!1,this._float=this._prevFloat,delete this._prevFloat,this._packNodes(),this._notify(),this):this}_fixCollisions(t){this._sortNodes(-1);let e=t,i=Boolean(this.nodes.find((t=>t.locked)));for(this.float||i||(e={x:0,y:t.y,w:this.column,h:t.h});;){let i,s=this.collide(t,e);if(!s)return this;if(i=s.locked?this.moveNode(t,t.x,s.y+s.h,t.w,t.h,!0):this.moveNode(s,s.x,t.y+t.h,s.w,s.h,!0),!i)return this}}collide(t,e=t){return this.nodes.find((i=>i!==t&&s.Utils.isIntercepted(i,e)))}isAreaEmpty(t,e,i,s){let r={x:t||0,y:e||0,w:i||1,h:s||1};return!this.collide(r)}compact(){if(0===this.nodes.length)return this;this.batchUpdate(),this._sortNodes();let t=this.nodes;return this.nodes=[],t.forEach((t=>{t.noMove||t.locked||(t.autoPosition=!0),this.addNode(t,!1),t._dirty=!0})),this.commit(),this}set float(t){this._float!==t&&(this._float=t||!1,t||(this._packNodes(),this._notify()))}get float(){return this._float||!1}_sortNodes(t){return this.nodes=s.Utils.sort(this.nodes,t,this.column),this}_packNodes(){return this._sortNodes(),this.float?this.nodes.forEach(((t,e)=>{if(t._updating||void 0===t._packY||t.y===t._packY)return this;let i=t.y;for(;i>=t._packY;){let r={x:t.x,y:i,w:t.w,h:t.h};this.nodes.slice(0,e).find((t=>s.Utils.isIntercepted(r,t)))||(t._dirty=!0,t.y=i),--i}})):this.nodes.forEach(((t,e)=>{if(t.locked)return this;for(;t.y>0;){let i=t.y-1,r=0===e,o={x:t.x,y:i,w:t.w,h:t.h};if(e>0&&(r=!this.nodes.slice(0,e).find((t=>s.Utils.isIntercepted(o,t)))),!r)break;t._dirty=t.y!==i,t.y=i}})),this}prepareNode(t,e){(t=t||{})._id=t._id||r._idSeq++,void 0!==t.x&&void 0!==t.y&&null!==t.x&&null!==t.y||(t.autoPosition=!0);let i={x:0,y:0,w:1,h:1};return s.Utils.defaults(t,i),t.autoPosition||delete t.autoPosition,t.noResize||delete t.noResize,t.noMove||delete t.noMove,"string"==typeof t.x&&(t.x=Number(t.x)),"string"==typeof t.y&&(t.y=Number(t.y)),"string"==typeof t.w&&(t.w=Number(t.w)),"string"==typeof t.h&&(t.h=Number(t.h)),isNaN(t.x)&&(t.x=i.x,t.autoPosition=!0),isNaN(t.y)&&(t.y=i.y,t.autoPosition=!0),isNaN(t.w)&&(t.w=i.w),isNaN(t.h)&&(t.h=i.h),t.maxW&&(t.w=Math.min(t.w,t.maxW)),t.maxH&&(t.h=Math.min(t.h,t.maxH)),t.minW&&(t.w=Math.max(t.w,t.minW)),t.minH&&(t.h=Math.max(t.h,t.minH)),t.w>this.column?t.w=this.column:t.w<1&&(t.w=1),this.maxRow&&t.h>this.maxRow?t.h=this.maxRow:t.h<1&&(t.h=1),t.x<0&&(t.x=0),t.y<0&&(t.y=0),t.x+t.w>this.column&&(e?t.w=this.column-t.x:t.x=this.column-t.w),this.maxRow&&t.y+t.h>this.maxRow&&(e?t.h=this.maxRow-t.y:t.y=this.maxRow-t.h),t}getDirtyNodes(t){if(t){let t=[];return this.nodes.forEach((e=>{e._dirty&&(e.y===e._origY&&e.x===e._origX&&e.w===e._origW&&e.h===e._origH?delete e._dirty:t.push(e))})),t}return this.nodes.filter((t=>t._dirty))}_notify(t,e=!0){if(this.batchMode)return this;let i=(t=void 0===t?[]:Array.isArray(t)?t:[t]).concat(this.getDirtyNodes());return this.onChange&&this.onChange(i,e),this}cleanNodes(){return this.batchMode||this.nodes.forEach((t=>{delete t._dirty})),this}addNode(t,e=!1){if((t=this.prepareNode(t)).autoPosition){this._sortNodes();for(let e=0;;++e){let i=e%this.column,r=Math.floor(e/this.column);if(i+t.w>this.column)continue;let o={x:i,y:r,w:t.w,h:t.h};if(!this.nodes.find((t=>s.Utils.isIntercepted(o,t)))){t.x=i,t.y=r,delete t.autoPosition;break}}}return this.nodes.push(t),e&&this.addedNodes.push(t),this._fixCollisions(t),this._packNodes(),this._notify(),t}removeNode(t,e=!0,i=!1){return i&&this.removedNodes.push(t),t._id=null,this.nodes=this.nodes.filter((e=>e!==t)),this.float||this._packNodes(),this._notify(t,e),this}removeAll(t=!0){return delete this._layouts,0===this.nodes.length||(t&&this.nodes.forEach((t=>{t._id=null})),this.removedNodes=this.nodes,this.nodes=[],this._notify(this.removedNodes,t)),this}canMoveNode(t,e,i,s,o){if(!this.isNodeChangedPosition(t,e,i,s,o))return!1;let n,l=this.nodes.some((t=>t.locked));if(!this.maxRow&&!l)return!0;let a=new r({column:this.column,float:this.float,nodes:this.nodes.map((e=>e===t?(n=Object.assign({},e),n):Object.assign({},e)))});if(!n)return!0;a.moveNode(n,e,i,s,o);let h=!0;return l&&(h=!a.nodes.some((t=>t.locked&&t._dirty&&t!==n))),this.maxRow&&h&&(h=a.getRow()<=this.maxRow),h}willItFit(t){if(!this.maxRow)return!0;let e=new r({column:this.column,float:this.float,nodes:this.nodes.map((t=>Object.assign({},t)))});return e.addNode(t),e.getRow()<=this.maxRow}isOutside(t,e,i){if(t<0||t>=this.column||e<0)return!0;if(this.maxRow)return e>=this.maxRow;if(this.float)return!1;let s=this.getRow();if(es)return!0;if(!i._temporaryRemoved){let s=new r({column:this.column,float:this.float,nodes:this.nodes.filter((t=>t!==i)).map((t=>Object.assign({},t)))}),o=Object.assign(Object.assign({},i),{x:t,y:e});return s.addNode(o),o.y===i.y&&o.x===i.x}return i._temporaryRemoved}isNodeChangedPosition(t,e,i,s,r){return"number"!=typeof e&&(e=t.x),"number"!=typeof i&&(i=t.y),"number"!=typeof s&&(s=t.w),"number"!=typeof r&&(r=t.h),t.maxW&&(s=Math.min(s,t.maxW)),t.maxH&&(r=Math.min(r,t.maxH)),t.minW&&(s=Math.max(s,t.minW)),t.minH&&(r=Math.max(r,t.minH)),t.x!==e||t.y!==i||t.w!==s||t.h!==r}moveNode(t,e,i,s,r,o){if(t.locked)return null;"number"!=typeof e&&(e=t.x),"number"!=typeof i&&(i=t.y),"number"!=typeof s&&(s=t.w),"number"!=typeof r&&(r=t.h);let n=t.w!==s||t.h!==r,l={x:e,y:i,w:s,h:r,maxW:t.maxW,maxH:t.maxH,minW:t.minW,minH:t.minH};return l=this.prepareNode(l,n),t.x===l.x&&t.y===l.y&&t.w===l.w&&t.h===l.h?null:(t._dirty=!0,t.x=t._lastTriedX=l.x,t.y=t._lastTriedY=l.y,t.w=t._lastTriedW=l.w,t.h=t._lastTriedH=l.h,this._fixCollisions(t),o||(this._packNodes(),this._notify()),t)}getRow(){return this.nodes.reduce(((t,e)=>Math.max(t,e.y+e.h)),0)}beginUpdate(t){return t._updating||(t._updating=!0,this.nodes.forEach((t=>{t._packY=t.y}))),this}endUpdate(){let t=this.nodes.find((t=>t._updating));return t&&(delete t._updating,this.nodes.forEach((t=>{delete t._packY}))),this}save(t=!0){let e=[];return s.Utils.sort(this.nodes),this.nodes.forEach((i=>{let s={};for(let t in i)"_"!==t[0]&&null!==i[t]&&void 0!==i[t]&&(s[t]=i[t]);t||delete s.el,delete s.grid,s.autoPosition||delete s.autoPosition,s.noResize||delete s.noResize,s.noMove||delete s.noMove,s.locked||delete s.locked,e.push(s)})),e}layoutsNodesChange(t){return!this._layouts||this._ignoreLayoutsNodeChange||this._layouts.forEach(((e,i)=>{if(!e||i===this.column)return this;i{let s=e.find((e=>e._id===t._id));if(!s)return this;let r=i/this.column;t.y!==t._origY&&(s.y+=t.y-t._origY),t.x!==t._origX&&(s.x=Math.round(t.x*r)),t.w!==t._origW&&(s.w=Math.round(t.w*r))}))})),this}updateNodeWidths(t,e,i,r="moveScale"){if(!this.nodes.length||t===e)return this;if(this.cacheLayout(this.nodes,t),1===e&&i&&i.length){let t=0;i.forEach((e=>{e.x=0,e.w=1,e.y=Math.max(e.y,t),t=e.y+e.h}))}else i=s.Utils.sort(this.nodes,-1,t);let o=this._layouts[e]||[],n=this._layouts.length-1;0===o.length&&e>t&&e{let e=i.findIndex((e=>e._id===t._id));-1!==e&&(i[e].x=t.x,i[e].y=t.y,i[e].w=t.w)})),o=[]));let l=[];if(o.forEach((t=>{let e=i.findIndex((e=>e._id===t._id));-1!==e&&(i[e].x=t.x,i[e].y=t.y,i[e].w=t.w,l.push(i[e]),i.splice(e,1))})),i.length)if("function"==typeof r)r(e,t,l,i);else{let s=e/t,o="move"===r||"moveScale"===r,n="scale"===r||"moveScale"===r;i.forEach((i=>{i.x=1===e?0:o?Math.round(i.x*s):Math.min(i.x,e-1),i.w=1===e||1===t?1:n?Math.round(i.w*s)||1:Math.min(i.w,e),l.push(i)})),i=[]}return l=s.Utils.sort(l,-1,e),this._ignoreLayoutsNodeChange=!0,this.batchUpdate(),this.nodes=[],l.forEach((t=>{this.addNode(t,!1),t._dirty=!0}),this),this.commit(),delete this._ignoreLayoutsNodeChange,this}saveInitial(){return this.nodes.forEach((t=>{t._origX=t.x,t._origY=t.y,t._origW=t.w,t._origH=t.h,delete t._dirty})),this}cacheLayout(t,e,i=!1){let s=[];return t.forEach(((t,e)=>{t._id=t._id||r._idSeq++,s[e]={x:t.x,y:t.y,w:t.w,_id:t._id}})),this._layouts=i?[]:this._layouts||[],this._layouts[e]=s,this}cleanupNode(t){for(let e in t)"_"===e[0]&&delete t[e];return this}}e.GridStackEngine=r,r._idSeq=1},270:(t,e,i)=>{function s(t){for(var i in t)e.hasOwnProperty(i)||(e[i]=t[i])}Object.defineProperty(e,"__esModule",{value:!0});const r=i(62),o=i(593),n=i(334);s(i(593)),s(i(62)),s(i(334));const l={column:12,minRow:0,maxRow:0,itemClass:"grid-stack-item",placeholderClass:"grid-stack-placeholder",placeholderText:"",handle:".grid-stack-item-content",handleClass:null,styleInHead:!1,cellHeight:"auto",margin:10,auto:!0,minWidth:768,float:!1,staticGrid:!1,animate:!0,alwaysShowResizeHandle:!1,resizable:{autoHide:!0,handles:"se"},draggable:{handle:".grid-stack-item-content",scroll:!1,appendTo:"body"},dragIn:void 0,dragInOptions:{revert:"invalid",handle:".grid-stack-item-content",scroll:!1,appendTo:"body"},disableDrag:!1,disableResize:!1,rtl:"auto",removable:!1,removableOptions:{accept:".grid-stack-item"},removeTimeout:2e3,marginUnit:"px",cellHeightUnit:"px",disableOneColumnMode:!1,oneColumnModeDomSort:!1};class a{constructor(t,e={}){this._gsEventHandler={},this.el=t,e=e||{},o.obsoleteOpts(e,"verticalMargin","margin","v2.0"),o.obsoleteAttr(this.el,"data-gs-current-height","gs-current-row","v1.0.0"),e.row&&(e.minRow=e.maxRow=e.row,delete e.row);let i=o.Utils.toNumber(t.getAttribute("gs-row")),s=Object.assign(Object.assign({},l),{column:o.Utils.toNumber(t.getAttribute("gs-column"))||12,minRow:i||o.Utils.toNumber(t.getAttribute("gs-min-row"))||0,maxRow:i||o.Utils.toNumber(t.getAttribute("gs-max-row"))||0,staticGrid:o.Utils.toBool(t.getAttribute("gs-static"))||!1,_styleSheetClass:"grid-stack-instance-"+(1e4*Math.random()).toFixed(0),alwaysShowResizeHandle:e.alwaysShowResizeHandle||!1,resizable:{autoHide:!e.alwaysShowResizeHandle,handles:"se"},draggable:{handle:(e.handleClass?"."+e.handleClass:e.handle?e.handle:"")||".grid-stack-item-content",scroll:!1,appendTo:"body"},removableOptions:{accept:"."+(e.itemClass||"grid-stack-item")}});t.getAttribute("gs-animate")&&(s.animate=o.Utils.toBool(t.getAttribute("gs-animate"))),this.opts=o.Utils.defaults(e,s),e=null,this.initMargin(),"auto"===this.opts.rtl&&(this.opts.rtl="rtl"===t.style.direction),this.opts.rtl&&this.el.classList.add("grid-stack-rtl");let n=o.Utils.closestByClass(this.el,l.itemClass);if(n&&n.gridstackNode&&(this.opts._isNested=n.gridstackNode,this.opts._isNested.subGrid=this,this.el.classList.add("grid-stack-nested")),this._isAutoCellHeight="auto"===this.opts.cellHeight,this._isAutoCellHeight){let t=-this.opts.marginRight-this.opts.marginLeft+this.opts.marginTop+this.opts.marginBottom;this.cellHeight(this.cellWidth()+t,!1)}else this.cellHeight(this.opts.cellHeight,!1);if(this.el.classList.add(this.opts._styleSheetClass),this._setStaticClass(),this.engine=new r.GridStackEngine({column:this.opts.column,float:this.opts.float,maxRow:this.opts.maxRow,onChange:(t,e=!0)=>{let i=0;this.engine.nodes.forEach((t=>{i=Math.max(i,t.y+t.h)})),t.forEach((t=>{let i=t.el;e&&null===t._id?i&&i.parentNode&&i.parentNode.removeChild(i):this._writePosAttr(i,t.x,t.y,t.w,t.h)})),this._updateStyles(!1,i)}}),this.opts.auto){this.batchUpdate();let t=[];this.getGridItems().forEach((e=>{let i=parseInt(e.getAttribute("gs-x")),s=parseInt(e.getAttribute("gs-y"));t.push({el:e,i:(Number.isNaN(i)?1e3:i)+(Number.isNaN(s)?1e3:s)*this.opts.column})})),t.sort((t=>t.i)).forEach((t=>this._prepareElement(t.el))),this.commit()}this.engine.saveInitial(),this.setAnimation(this.opts.animate);let a=document.createElement("div");a.className="placeholder-content",a.innerHTML=this.opts.placeholderText,this.placeholder=document.createElement("div"),this.placeholder.classList.add(this.opts.placeholderClass,s.itemClass,this.opts.itemClass),this.placeholder.appendChild(a),this._updateStyles(),12!=this.opts.column&&this.el.classList.add("grid-stack-"+this.opts.column),this._setupDragIn(),this._setupRemoveDrop(),this._setupAcceptWidget(),this._updateWindowResizeEvent()}static init(t={},e=".grid-stack"){let i=a.getGridElement(e);return i?(i.gridstack||(i.gridstack=new a(i,Object.assign({},t))),i.gridstack):("string"==typeof e?console.error('GridStack.initAll() no grid was found with selector "'+e+'" - element missing or wrong selector ?\nNote: ".grid-stack" is required for proper CSS styling and drag/drop, and is the default selector.'):console.error("GridStack.init() no grid element was passed."),null)}static initAll(t={},e=".grid-stack"){let i=[];return a.getGridElements(e).forEach((e=>{e.gridstack||(e.gridstack=new a(e,Object.assign({},t))),i.push(e.gridstack)})),0===i.length&&console.error('GridStack.initAll() no grid was found with selector "'+e+'" - element missing or wrong selector ?\nNote: ".grid-stack" is required for proper CSS styling and drag/drop, and is the default selector.'),i}static addGrid(t,e={}){if(!t)return null;let i=document.implementation.createHTMLDocument();i.body.innerHTML=`
    `;let s=i.body.children[0];t.append(s);let r=a.init(e,s);return e.children&&r.load(e.children),r}addWidget(t,e){if(arguments.length>2){console.warn("gridstack.ts: `addWidget(el, x, y, width...)` is deprecated. Use `addWidget({x, y, w, content, ...})`. It will be removed soon");let e=arguments,i=1,s={x:e[i++],y:e[i++],w:e[i++],h:e[i++],autoPosition:e[i++],minW:e[i++],maxW:e[i++],minH:e[i++],maxH:e[i++],id:e[i++]};return this.addWidget(t,s)}let i;if("string"==typeof t){let e=document.implementation.createHTMLDocument();e.body.innerHTML=t,i=e.body.children[0]}else if(0===arguments.length||1===arguments.length&&(void 0!==(s=t).x||void 0!==s.y||void 0!==s.w||void 0!==s.h||void 0!==s.content)){let s=t&&t.content||"";e=t;let r=document.implementation.createHTMLDocument();r.body.innerHTML=`
    ${s}
    `,i=r.body.children[0]}else i=t;var s;let r=this._readAttr(i);return e=Object.assign({},e||{}),o.Utils.defaults(e,r),this.engine.prepareNode(e),this._writeAttr(i,e),this._insertNotAppend?this.el.prepend(i):this.el.appendChild(i),this._prepareElement(i,!0,e),this._updateContainerHeight(),this._triggerAddEvent(),this._triggerChangeEvent(),i}save(t=!0,e=!1){let i=this.engine.save(t);if(t&&i.forEach((t=>{if(t.el&&!t.subGrid){let e=t.el.querySelector(".grid-stack-item-content");t.content=e?e.innerHTML:void 0,t.content||delete t.content,delete t.el}})),e){i.forEach((i=>{i.subGrid&&(i.subGrid=i.subGrid.save(t,e))}));let s=Object.assign({},this.opts);return s.marginBottom===s.marginTop&&s.marginRight===s.marginLeft&&s.marginTop===s.marginRight&&(s.margin=s.marginTop,delete s.marginTop,delete s.marginRight,delete s.marginBottom,delete s.marginLeft),s.rtl===("rtl"===this.el.style.direction)&&(s.rtl="auto"),this._isAutoCellHeight&&(s.cellHeight="auto"),o.Utils.removeInternalAndSame(s,l),s.children=i,s}return i}load(t,e=!0){let i=a.Utils.sort(t,-1,this._prevColumn||this.opts.column);this._insertNotAppend=!0,this._prevColumn&&this._prevColumn!==this.opts.column&&i.some((t=>t.x+t.w>this.opts.column))&&(this._ignoreLayoutsNodeChange=!0,this.engine.cacheLayout(i,this._prevColumn,!0));let s=[];return this.batchUpdate(),e&&[...this.engine.nodes].forEach((t=>{i.find((e=>t.id===e.id))||("function"==typeof e?e(this,t,!1):(s.push(t),this.removeWidget(t.el,!0,!1)))})),i.forEach((t=>{let i=t.id||0===t.id?this.engine.nodes.find((e=>e.id===t.id)):void 0;if(i){if(this.update(i.el,t),t.subGrid&&t.subGrid.children){let e=i.el.querySelector(".grid-stack");e&&e.gridstack&&(e.gridstack.load(t.subGrid.children),this._insertNotAppend=!0)}}else if(e&&(t="function"==typeof e?e(this,t,!0).gridstackNode:this.addWidget(t).gridstackNode).subGrid){let e=t.el.querySelector(".grid-stack-item-content");t.subGrid=a.addGrid(e,t.subGrid)}})),this.engine.removedNodes=s,this.commit(),delete this._ignoreLayoutsNodeChange,delete this._insertNotAppend,this}batchUpdate(){return this.engine.batchUpdate(),this}getCellHeight(t=!1){if(this.opts.cellHeight&&"auto"!==this.opts.cellHeight&&(!t||!this.opts.cellHeightUnit||"px"===this.opts.cellHeightUnit))return this.opts.cellHeight;let e=this.el.querySelector("."+this.opts.itemClass),i=o.Utils.toNumber(e.getAttribute("gs-h"));return Math.round(e.offsetHeight/i)}cellHeight(t,e=!0){let i=o.Utils.parseHeight(t);return this.opts.cellHeightUnit===i.unit&&this.opts.cellHeight===i.h||(this.opts.cellHeightUnit=i.unit,this.opts.cellHeight=i.h,e&&this._updateStyles(!0,this.getRow()),this._resizeNestedGrids(this.el)),this}cellWidth(){return(this.el.offsetWidth||this.el.parentElement.offsetWidth||window.innerWidth)/this.opts.column}commit(){return this.engine.commit(),this._triggerRemoveEvent(),this._triggerAddEvent(),this._triggerChangeEvent(),this}compact(){return this.engine.compact(),this._triggerChangeEvent(),this}column(t,e="moveScale"){if(this.opts.column===t)return this;let i,s=this.opts.column;return 1===t?this._prevColumn=s:delete this._prevColumn,this.el.classList.remove("grid-stack-"+s),this.el.classList.add("grid-stack-"+t),this.opts.column=this.engine.column=t,1===t&&this.opts.oneColumnModeDomSort&&(i=[],this.getGridItems().forEach((t=>{t.gridstackNode&&i.push(t.gridstackNode)})),i.length||(i=void 0)),this.engine.updateNodeWidths(s,t,i,e),this._ignoreLayoutsNodeChange=!0,this._triggerChangeEvent(),delete this._ignoreLayoutsNodeChange,this}getColumn(){return this.opts.column}getGridItems(){return Array.from(this.el.children).filter((t=>t.matches("."+this.opts.itemClass)&&!t.matches("."+this.opts.placeholderClass)))}destroy(t=!0){if(this.el)return this._updateWindowResizeEvent(!0),this.setStatic(!0),t?this.el.parentNode.removeChild(this.el):(this.removeAll(t),this.el.classList.remove(this.opts._styleSheetClass)),this._removeStylesheet(),delete this.opts._isNested,delete this.opts,delete this.placeholder,delete this.engine,delete this.el.gridstack,delete this.el,this}disable(){if(!this.opts.staticGrid)return this.enableMove(!1),this.enableResize(!1),this._triggerEvent("disable"),this}enable(){if(!this.opts.staticGrid)return this.enableMove(!0),this.enableResize(!0),this._triggerEvent("enable"),this}enableMove(t,e=!0){return this.opts.staticGrid||(this.getGridItems().forEach((e=>this.movable(e,t))),e&&(this.opts.disableDrag=!t)),this}enableResize(t,e=!0){return this.opts.staticGrid||(this.getGridItems().forEach((e=>this.resizable(e,t))),e&&(this.opts.disableResize=!t)),this}float(t){return this.engine.float=t,this._triggerChangeEvent(),this}getFloat(){return this.engine.float}getCellFromPixel(t,e=!1){let i,s=this.el.getBoundingClientRect();i=e?{top:s.top+document.documentElement.scrollTop,left:s.left}:{top:this.el.offsetTop,left:this.el.offsetLeft};let r=t.left-i.left,o=t.top-i.top,n=s.width/this.opts.column,l=s.height/parseInt(this.el.getAttribute("gs-current-row"));return{x:Math.floor(r/n),y:Math.floor(o/l)}}getRow(){return Math.max(this.engine.getRow(),this.opts.minRow)}isAreaEmpty(t,e,i,s){return this.engine.isAreaEmpty(t,e,i,s)}makeWidget(t){let e=a.getElement(t);return this._prepareElement(e,!0),this._updateContainerHeight(),this._triggerAddEvent(),this._triggerChangeEvent(),e}on(t,e){if(-1!==t.indexOf(" "))return t.split(" ").forEach((t=>this.on(t,e))),this;if("change"===t||"added"===t||"removed"===t||"enable"===t||"disable"===t){let i="enable"===t||"disable"===t;this._gsEventHandler[t]=i?t=>e(t):t=>e(t,t.detail),this.el.addEventListener(t,this._gsEventHandler[t])}else"dragstart"===t||"dragstop"===t||"resizestart"===t||"resizestop"===t||"dropped"===t?this._gsEventHandler[t]=e:console.log("GridStack.on("+t+') event not supported, but you can still use $(".grid-stack").on(...) while jquery-ui is still used internally.');return this}off(t){return-1!==t.indexOf(" ")?(t.split(" ").forEach((t=>this.off(t))),this):("change"!==t&&"added"!==t&&"removed"!==t&&"enable"!==t&&"disable"!==t||this._gsEventHandler[t]&&this.el.removeEventListener(t,this._gsEventHandler[t]),delete this._gsEventHandler[t],this)}removeWidget(t,e=!0,i=!0){return a.getElements(t).forEach((t=>{if(t.parentElement!==this.el)return;let s=t.gridstackNode;s||(s=this.engine.nodes.find((e=>t===e.el))),s&&(delete t.gridstackNode,n.GridStackDDI.get().remove(t),this.engine.removeNode(s,e,i),e&&t.parentElement&&t.remove())})),i&&(this._triggerRemoveEvent(),this._triggerChangeEvent()),this}removeAll(t=!0){return this.engine.nodes.forEach((t=>{delete t.el.gridstackNode,n.GridStackDDI.get().remove(t.el)})),this.engine.removeAll(t),this._triggerRemoveEvent(),this}setAnimation(t){return t?this.el.classList.add("grid-stack-animate"):this.el.classList.remove("grid-stack-animate"),this}setStatic(t){return this.opts.staticGrid===t||(this.opts.staticGrid=t,this.engine.nodes.forEach((t=>this._prepareDragDropByNode(t))),this._setStaticClass()),this}update(t,e){if(arguments.length>2){console.warn("gridstack.ts: `update(el, x, y, w, h)` is deprecated. Use `update({x, w, content, ...})`. It will be removed soon");let i=arguments,s=1;return e={x:i[s++],y:i[s++],w:i[s++],h:i[s++]},this.update(t,e)}return a.getElements(t).forEach((t=>{if(!t||!t.gridstackNode)return;let i=t.gridstackNode,s=Object.assign({},e);delete s.autoPosition;let r,o=["x","y","w","h"];if(o.some((t=>void 0!==s[t]&&s[t]!==i[t]))&&(r={},o.forEach((t=>{r[t]=void 0!==s[t]?s[t]:i[t],delete s[t]}))),!r&&(s.minW||s.minH||s.maxW||s.maxH)&&(r={}),s.content){let e=t.querySelector(".grid-stack-item-content");e&&e.innerHTML!==s.content&&(e.innerHTML=s.content),delete s.content}let n=!1,l=!1;for(const t in s)"_"!==t[0]&&i[t]!==s[t]&&(i[t]=s[t],n=!0,l=l||!this.opts.staticGrid&&("noResize"===t||"noMove"===t||"locked"===t));r&&(this.engine.cleanNodes(),this.engine.beginUpdate(i),this.engine.moveNode(i,r.x,r.y,r.w,r.h),this._updateContainerHeight(),this._triggerChangeEvent(),this.engine.endUpdate()),n&&this._writeAttr(t,i),l&&this._prepareDragDropByNode(i)})),this}margin(t){if(!("string"==typeof t&&t.split(" ").length>1)){let e=o.Utils.parseHeight(t);if(this.opts.marginUnit===e.unit&&this.opts.margin===e.h)return}return this.opts.margin=t,this.opts.marginTop=this.opts.marginBottom=this.opts.marginLeft=this.opts.marginRight=void 0,this.initMargin(),this._updateStyles(!0),this}getMargin(){return this.opts.margin}willItFit(t){if(arguments.length>1){console.warn("gridstack.ts: `willItFit(x,y,w,h,autoPosition)` is deprecated. Use `willItFit({x, y,...})`. It will be removed soon");let t=arguments,e=0,i={x:t[e++],y:t[e++],w:t[e++],h:t[e++],autoPosition:t[e++]};return this.willItFit(i)}return this.engine.willItFit(t)}_triggerChangeEvent(){if(this.engine.batchMode)return this;let t=this.engine.getDirtyNodes(!0);return t&&t.length&&(this._ignoreLayoutsNodeChange||this.engine.layoutsNodesChange(t),this._triggerEvent("change",t)),this.engine.saveInitial(),this}_triggerAddEvent(){return this.engine.batchMode||this.engine.addedNodes&&this.engine.addedNodes.length>0&&(this._ignoreLayoutsNodeChange||this.engine.layoutsNodesChange(this.engine.addedNodes),this.engine.addedNodes.forEach((t=>{delete t._dirty})),this._triggerEvent("added",this.engine.addedNodes),this.engine.addedNodes=[]),this}_triggerRemoveEvent(){return this.engine.batchMode||this.engine.removedNodes&&this.engine.removedNodes.length>0&&(this._triggerEvent("removed",this.engine.removedNodes),this.engine.removedNodes=[]),this}_triggerEvent(t,e){let i=e?new CustomEvent(t,{bubbles:!1,detail:e}):new Event(t);return this.el.dispatchEvent(i),this}_removeStylesheet(){return this._styles&&(o.Utils.removeStylesheet(this._styles._id),delete this._styles),this}_updateStyles(t=!1,e){if(t&&this._removeStylesheet(),this._updateContainerHeight(),0===this.opts.cellHeight)return this;let i=this.opts.cellHeight,s=this.opts.cellHeightUnit,r=`.${this.opts._styleSheetClass} > .${this.opts.itemClass}`;if(!this._styles){let t="gridstack-style-"+(1e5*Math.random()).toFixed(),e=this.opts.styleInHead?void 0:this.el.parentNode;if(this._styles=o.Utils.createStylesheet(t,e),!this._styles)return this;this._styles._id=t,this._styles._max=0,o.Utils.addCSSRule(this._styles,r,`min-height: ${i}${s}`);let n=this.opts.marginTop+this.opts.marginUnit,l=this.opts.marginBottom+this.opts.marginUnit,a=this.opts.marginRight+this.opts.marginUnit,h=this.opts.marginLeft+this.opts.marginUnit,d=`${r} > .grid-stack-item-content`,g=`.${this.opts._styleSheetClass} > .grid-stack-placeholder > .placeholder-content`;o.Utils.addCSSRule(this._styles,d,`top: ${n}; right: ${a}; bottom: ${l}; left: ${h};`),o.Utils.addCSSRule(this._styles,g,`top: ${n}; right: ${a}; bottom: ${l}; left: ${h};`),o.Utils.addCSSRule(this._styles,`${r} > .ui-resizable-ne`,`right: ${a}`),o.Utils.addCSSRule(this._styles,`${r} > .ui-resizable-e`,`right: ${a}`),o.Utils.addCSSRule(this._styles,`${r} > .ui-resizable-se`,`right: ${a}; bottom: ${l}`),o.Utils.addCSSRule(this._styles,`${r} > .ui-resizable-nw`,`left: ${h}`),o.Utils.addCSSRule(this._styles,`${r} > .ui-resizable-w`,`left: ${h}`),o.Utils.addCSSRule(this._styles,`${r} > .ui-resizable-sw`,`left: ${h}; bottom: ${l}`)}if((e=e||this._styles._max)>this._styles._max){let t=t=>i*t+s;for(let i=this._styles._max+1;i<=e;i++){let e=t(i);o.Utils.addCSSRule(this._styles,`${r}[gs-y="${i-1}"]`,`top: ${t(i-1)}`),o.Utils.addCSSRule(this._styles,`${r}[gs-h="${i}"]`,`height: ${e}`),o.Utils.addCSSRule(this._styles,`${r}[gs-min-h="${i}"]`,`min-height: ${e}`),o.Utils.addCSSRule(this._styles,`${r}[gs-max-h="${i}"]`,`max-height: ${e}`)}this._styles._max=e}return this}_updateContainerHeight(){if(!this.engine||this.engine.batchMode)return this;let t=this.getRow(),e=parseInt(getComputedStyle(this.el)["min-height"]);if(e>0){let i=Math.round(e/this.getCellHeight(!0));t{t.gridstack&&t.gridstack.onParentResize()})),this}_prepareElement(t,e=!1,i){i||(t.classList.add(this.opts.itemClass),i=this._readAttr(t)),t.gridstackNode=i,i.el=t,i.grid=this;let s=Object.assign({},i);return i=this.engine.addNode(i,e),o.Utils.same(i,s)||this._writeAttr(t,i),this._prepareDragDropByNode(i),this}_writePosAttr(t,e,i,s,r){return null!=e&&t.setAttribute("gs-x",String(e)),null!=i&&t.setAttribute("gs-y",String(i)),s&&t.setAttribute("gs-w",String(s)),r&&t.setAttribute("gs-h",String(r)),this}_writeAttr(t,e){if(!e)return this;this._writePosAttr(t,e.x,e.y,e.w,e.h);let i={autoPosition:"gs-auto-position",minW:"gs-min-w",minH:"gs-min-h",maxW:"gs-max-w",maxH:"gs-max-h",noResize:"gs-no-resize",noMove:"gs-no-move",locked:"gs-locked",id:"gs-id",resizeHandles:"gs-resize-handles"};for(const s in i)e[s]?t.setAttribute(i[s],String(e[s])):t.removeAttribute(i[s]);return this}_readAttr(t){let e={};e.x=o.Utils.toNumber(t.getAttribute("gs-x")),e.y=o.Utils.toNumber(t.getAttribute("gs-y")),e.w=o.Utils.toNumber(t.getAttribute("gs-w")),e.h=o.Utils.toNumber(t.getAttribute("gs-h")),e.maxW=o.Utils.toNumber(t.getAttribute("gs-max-w")),e.minW=o.Utils.toNumber(t.getAttribute("gs-min-w")),e.maxH=o.Utils.toNumber(t.getAttribute("gs-max-h")),e.minH=o.Utils.toNumber(t.getAttribute("gs-min-h")),e.autoPosition=o.Utils.toBool(t.getAttribute("gs-auto-position")),e.noResize=o.Utils.toBool(t.getAttribute("gs-no-resize")),e.noMove=o.Utils.toBool(t.getAttribute("gs-no-move")),e.locked=o.Utils.toBool(t.getAttribute("gs-locked")),e.resizeHandles=t.getAttribute("gs-resize-handles"),e.id=t.getAttribute("gs-id");for(const t in e){if(!e.hasOwnProperty(t))return;e[t]||0===e[t]||delete e[t]}return e}_setStaticClass(){let t=["grid-stack-static"];return this.opts.staticGrid?(this.el.classList.add(...t),this.el.setAttribute("gs-static","true")):(this.el.classList.remove(...t),this.el.removeAttribute("gs-static")),this}onParentResize(){if(this.el&&this.el.clientWidth){if(this._isAutoCellHeight&&o.Utils.throttle((()=>{let t=-this.opts.marginRight-this.opts.marginLeft+this.opts.marginTop+this.opts.marginBottom;this.cellHeight(this.cellWidth()+t)}),100),!this.opts.disableOneColumnMode&&this.el.clientWidth<=this.opts.minWidth){if(this._oneColumnMode)return this;this._oneColumnMode=!0,this.column(1),this._resizeNestedGrids(this.el)}else{if(!this._oneColumnMode)return this;delete this._oneColumnMode,this.column(this._prevColumn),this._resizeNestedGrids(this.el)}return this}}_updateWindowResizeEvent(t=!1){const e=this._isAutoCellHeight||!this.opts.disableOneColumnMode;return!e||t||this.opts._isNested||this._windowResizeBind?!t&&e||!this._windowResizeBind||(window.removeEventListener("resize",this._windowResizeBind),delete this._windowResizeBind):(this._windowResizeBind=this.onParentResize.bind(this),window.addEventListener("resize",this._windowResizeBind),this.onParentResize()),this}static getElement(t=".grid-stack-item"){return o.Utils.getElement(t)}static getElements(t=".grid-stack-item"){return o.Utils.getElements(t)}static getGridElement(t){return a.getElement(t)}static getGridElements(t){return o.Utils.getElements(t)}initMargin(){let t,e=0,i=[];return"string"==typeof this.opts.margin&&(i=this.opts.margin.split(" ")),2===i.length?(this.opts.marginTop=this.opts.marginBottom=i[0],this.opts.marginLeft=this.opts.marginRight=i[1]):4===i.length?(this.opts.marginTop=i[0],this.opts.marginRight=i[1],this.opts.marginBottom=i[2],this.opts.marginLeft=i[3]):(t=o.Utils.parseHeight(this.opts.margin),this.opts.marginUnit=t.unit,e=this.opts.margin=t.h),void 0===this.opts.marginTop?this.opts.marginTop=e:(t=o.Utils.parseHeight(this.opts.marginTop),this.opts.marginTop=t.h,delete this.opts.margin),void 0===this.opts.marginBottom?this.opts.marginBottom=e:(t=o.Utils.parseHeight(this.opts.marginBottom),this.opts.marginBottom=t.h,delete this.opts.margin),void 0===this.opts.marginRight?this.opts.marginRight=e:(t=o.Utils.parseHeight(this.opts.marginRight),this.opts.marginRight=t.h,delete this.opts.margin),void 0===this.opts.marginLeft?this.opts.marginLeft=e:(t=o.Utils.parseHeight(this.opts.marginLeft),this.opts.marginLeft=t.h,delete this.opts.margin),this.opts.marginUnit=t.unit,this.opts.marginTop===this.opts.marginBottom&&this.opts.marginLeft===this.opts.marginRight&&this.opts.marginTop===this.opts.marginRight&&(this.opts.margin=this.opts.marginTop),this}movable(t,e){return this}resizable(t,e){return this}_setupAcceptWidget(){return this}_setupRemoveDrop(){return this}_setupRemovingTimeout(t){return this}_clearRemovingTimeout(t){return this}_setupDragIn(){return this}_prepareDragDropByNode(t){return this}locked(t,e){return this.update(t,{locked:e})}maxWidth(t,e){return this.update(t,{maxW:e})}minWidth(t,e){return this.update(t,{minW:e})}maxHeight(t,e){return this.update(t,{maxH:e})}minHeight(t,e){return this.update(t,{minH:e})}move(t,e,i){return this.update(t,{x:e,y:i})}resize(t,e,i){return this.update(t,{w:e,h:i})}}e.GridStack=a,a.Utils=o.Utils,a.Engine=r.GridStackEngine},861:(t,e)=>{Object.defineProperty(e,"__esModule",{value:!0}),e.DDBaseImplement=class{constructor(){this._disabled=!1,this._eventRegister={}}get disabled(){return this._disabled}on(t,e){this._eventRegister[t]=e}off(t){delete this._eventRegister[t]}enable(){this._disabled=!1}disable(){this._disabled=!0}destroy(){delete this._eventRegister}triggerEvent(t,e){if(!this.disabled&&this._eventRegister)return this._eventRegister[t]?this._eventRegister[t](e):void 0}}},311:(t,e,i)=>{Object.defineProperty(e,"__esModule",{value:!0});const s=i(849),r=i(943),o=i(861);class n extends o.DDBaseImplement{constructor(t,e={}){super(),this.dragging=!1,this.ui=()=>{const t=this.el.parentElement.getBoundingClientRect(),e=this.helper.getBoundingClientRect();return{position:{top:e.top-t.top,left:e.left-t.left}}},this.el=t,this.option=e;let i=e.handle.substring(1);this.dragEl=t.classList.contains(i)?t:t.querySelector(e.handle)||t,this._dragStart=this._dragStart.bind(this),this._drag=this._drag.bind(this),this._dragEnd=this._dragEnd.bind(this),this._dragFollow=this._dragFollow.bind(this),this.enable()}on(t,e){super.on(t,e)}off(t){super.off(t)}enable(){super.enable(),this.dragEl.draggable=!0,this.dragEl.addEventListener("dragstart",this._dragStart),this.el.classList.remove("ui-draggable-disabled"),this.el.classList.add("ui-draggable")}disable(t=!1){super.disable(),this.dragEl.removeAttribute("draggable"),this.dragEl.removeEventListener("dragstart",this._dragStart),this.el.classList.remove("ui-draggable"),t||this.el.classList.add("ui-draggable-disabled")}destroy(){this.dragging&&this._dragEnd({}),this.disable(!0),delete this.el,delete this.helper,delete this.option,super.destroy()}updateOption(t){return Object.keys(t).forEach((e=>this.option[e]=t[e])),this}_dragStart(t){s.DDManager.dragElement=this,this.helper=this._createHelper(t),this._setupHelperContainmentStyle(),this.dragOffset=this._getDragOffset(t,this.el,this.helperContainment);const e=r.DDUtils.initEvent(t,{target:this.el,type:"dragstart"});this.helper!==this.el?this._setupDragFollowNodeNotifyStart(e):this.dragFollowTimer=window.setTimeout((()=>{delete this.dragFollowTimer,this._setupDragFollowNodeNotifyStart(e)}),0),this._cancelDragGhost(t)}_setupDragFollowNodeNotifyStart(t){return this._setupHelperStyle(),document.addEventListener("dragover",this._drag,n.dragEventListenerOption),this.dragEl.addEventListener("dragend",this._dragEnd),this.option.start&&this.option.start(t,this.ui()),this.dragging=!0,this.helper.classList.add("ui-draggable-dragging"),this.triggerEvent("dragstart",t),this}_drag(t){t.preventDefault(),this._dragFollow(t);const e=r.DDUtils.initEvent(t,{target:this.el,type:"drag"});this.option.drag&&this.option.drag(e,this.ui()),this.triggerEvent("drag",e)}_dragEnd(t){if(this.dragFollowTimer)return clearTimeout(this.dragFollowTimer),void delete this.dragFollowTimer;this.paintTimer&&cancelAnimationFrame(this.paintTimer),document.removeEventListener("dragover",this._drag,n.dragEventListenerOption),this.dragEl.removeEventListener("dragend",this._dragEnd),this.dragging=!1,this.helper.classList.remove("ui-draggable-dragging"),this.helperContainment.style.position=this.parentOriginStylePosition||null,this.helper===this.el?this._removeHelperStyle():this.helper.remove();const e=r.DDUtils.initEvent(t,{target:this.el,type:"dragstop"});this.option.stop&&this.option.stop(e),this.triggerEvent("dragstop",e),delete s.DDManager.dragElement,delete this.helper}_createHelper(t){let e=this.el;return"function"==typeof this.option.helper?e=this.option.helper.apply(this.el,t):"clone"===this.option.helper&&(e=r.DDUtils.clone(this.el)),document.body.contains(e)||r.DDUtils.appendTo(e,"parent"===this.option.appendTo?this.el.parentNode:this.option.appendTo),e===this.el&&(this.dragElementOriginStyle=n.originStyleProp.map((t=>this.el.style[t]))),e}_setupHelperStyle(){return this.helper.style.pointerEvents="none",this.helper.style.width=this.dragOffset.width+"px",this.helper.style.height=this.dragOffset.height+"px",this.helper.style.willChange="left, top",this.helper.style.transition="none",this.helper.style.position=this.option.basePosition||n.basePosition,this.helper.style.zIndex="1000",setTimeout((()=>{this.helper&&(this.helper.style.transition=null)}),0),this}_removeHelperStyle(){let t=this.helper?this.helper.gridstackNode:void 0;return t&&t._isAboutToRemove||n.originStyleProp.forEach((t=>{this.helper.style[t]=this.dragElementOriginStyle[t]||null})),delete this.dragElementOriginStyle,this}_dragFollow(t){this.paintTimer&&cancelAnimationFrame(this.paintTimer),this.paintTimer=requestAnimationFrame((()=>{delete this.paintTimer;const e=this.dragOffset;let i={left:0,top:0};if("absolute"===this.helper.style.position){const{left:t,top:e}=this.helperContainment.getBoundingClientRect();i={left:t,top:e}}this.helper.style.left=t.clientX+e.offsetLeft-i.left+"px",this.helper.style.top=t.clientY+e.offsetTop-i.top+"px"}))}_setupHelperContainmentStyle(){return this.helperContainment=this.helper.parentElement,"fixed"!==this.option.basePosition&&(this.parentOriginStylePosition=this.helperContainment.style.position,window.getComputedStyle(this.helperContainment).position.match(/static/)&&(this.helperContainment.style.position="relative")),this}_cancelDragGhost(t){let e=document.createElement("div");return e.style.width="1px",e.style.height="1px",document.body.appendChild(e),t.dataTransfer.setDragImage(e,0,0),setTimeout((()=>document.body.removeChild(e))),t.stopPropagation(),this}_getDragOffset(t,e,i){let s=0,o=0;if(i){const t=document.createElement("div");r.DDUtils.addElStyles(t,{opacity:"0",position:"fixed",top:"0px",left:"0px",width:"1px",height:"1px",zIndex:"-999999"}),i.appendChild(t);const e=t.getBoundingClientRect();i.removeChild(t),s=e.left,o=e.top}const n=e.getBoundingClientRect();return{left:n.left,top:n.top,offsetLeft:-t.clientX+n.left-s,offsetTop:-t.clientY+n.top-o,width:n.width,height:n.height}}}e.DDDraggable=n,n.basePosition="absolute",n.dragEventListenerOption=!0,n.originStyleProp=["transition","pointerEvents","position","left","top","opacity","zIndex","width","height","willChange"]},54:(t,e,i)=>{Object.defineProperty(e,"__esModule",{value:!0});const s=i(849),r=i(861),o=i(943);class n extends r.DDBaseImplement{constructor(t,e={}){super(),this.el=t,this.option=e,this._dragEnter=this._dragEnter.bind(this),this._dragOver=this._dragOver.bind(this),this._dragLeave=this._dragLeave.bind(this),this._drop=this._drop.bind(this),this.el.classList.add("ui-droppable"),this.el.addEventListener("dragenter",this._dragEnter),this._setupAccept()}on(t,e){super.on(t,e)}off(t){super.off(t)}enable(){this.disabled&&(super.enable(),this.el.classList.remove("ui-droppable-disabled"),this.el.addEventListener("dragenter",this._dragEnter))}disable(t=!1){this.disabled||(super.disable(),t||this.el.classList.add("ui-droppable-disabled"),this.el.removeEventListener("dragenter",this._dragEnter))}destroy(){this.moving&&this._removeLeaveCallbacks(),this.disable(!0),this.el.classList.remove("ui-droppable"),this.el.classList.remove("ui-droppable-disabled"),delete this.moving,super.destroy()}updateOption(t){return Object.keys(t).forEach((e=>this.option[e]=t[e])),this._setupAccept(),this}_dragEnter(t){if(!this._canDrop())return;this.moving=!0,t.preventDefault();const e=o.DDUtils.initEvent(t,{target:this.el,type:"dropover"});this.option.over&&this.option.over(e,this._ui(s.DDManager.dragElement)),this.triggerEvent("dropover",e),this.el.addEventListener("dragover",this._dragOver),this.el.addEventListener("drop",this._drop),this.el.addEventListener("dragleave",this._dragLeave),this.el.classList.add("ui-droppable-over")}_dragOver(t){t.preventDefault(),t.stopPropagation()}_dragLeave(t){if(!this.el.contains(t.relatedTarget)&&(this._removeLeaveCallbacks(),this.moving)){t.preventDefault();const e=o.DDUtils.initEvent(t,{target:this.el,type:"dropout"});this.option.out&&this.option.out(e,this._ui(s.DDManager.dragElement)),this.triggerEvent("dropout",e)}}_drop(t){if(!this.moving)return;t.preventDefault();const e=o.DDUtils.initEvent(t,{target:this.el,type:"drop"});this.option.drop&&this.option.drop(e,this._ui(s.DDManager.dragElement)),this.triggerEvent("drop",e),this._removeLeaveCallbacks()}_removeLeaveCallbacks(){this.el.removeEventListener("dragleave",this._dragLeave),this.el.classList.remove("ui-droppable-over"),this.moving&&(this.el.removeEventListener("dragover",this._dragOver),this.el.removeEventListener("drop",this._drop))}_canDrop(){return s.DDManager.dragElement&&(!this.accept||this.accept(s.DDManager.dragElement.el))}_setupAccept(){return this.option.accept&&"string"==typeof this.option.accept?this.accept=t=>t.matches(this.option.accept):this.accept=this.option.accept,this}_ui(t){return Object.assign({draggable:t.el},t.ui())}}e.DDDroppable=n},485:(t,e,i)=>{Object.defineProperty(e,"__esModule",{value:!0});const s=i(97),r=i(311),o=i(54);class n{constructor(t){this.el=t}static init(t){return t.ddElement||(t.ddElement=new n(t)),t.ddElement}on(t,e){return this.ddDraggable&&["drag","dragstart","dragstop"].indexOf(t)>-1?this.ddDraggable.on(t,e):this.ddDroppable&&["drop","dropover","dropout"].indexOf(t)>-1?this.ddDroppable.on(t,e):this.ddResizable&&["resizestart","resize","resizestop"].indexOf(t)>-1&&this.ddResizable.on(t,e),this}off(t){return this.ddDraggable&&["drag","dragstart","dragstop"].indexOf(t)>-1?this.ddDraggable.off(t):this.ddDroppable&&["drop","dropover","dropout"].indexOf(t)>-1?this.ddDroppable.off(t):this.ddResizable&&["resizestart","resize","resizestop"].indexOf(t)>-1&&this.ddResizable.off(t),this}setupDraggable(t){return this.ddDraggable?this.ddDraggable.updateOption(t):this.ddDraggable=new r.DDDraggable(this.el,t),this}cleanDraggable(){return this.ddDraggable&&(this.ddDraggable.destroy(),delete this.ddDraggable),this}setupResizable(t){return this.ddResizable?this.ddResizable.updateOption(t):this.ddResizable=new s.DDResizable(this.el,t),this}cleanResizable(){return this.ddResizable&&(this.ddResizable.destroy(),delete this.ddResizable),this}setupDroppable(t){return this.ddDroppable?this.ddDroppable.updateOption(t):this.ddDroppable=new o.DDDroppable(this.el,t),this}cleanDroppable(){return this.ddDroppable&&(this.ddDroppable.destroy(),delete this.ddDroppable),this}}e.DDElement=n},849:(t,e)=>{Object.defineProperty(e,"__esModule",{value:!0}),e.DDManager=class{}},680:(t,e)=>{Object.defineProperty(e,"__esModule",{value:!0});class i{constructor(t,e,i){this.moving=!1,this.host=t,this.dir=e,this.option=i,this._mouseDown=this._mouseDown.bind(this),this._mouseMove=this._mouseMove.bind(this),this._mouseUp=this._mouseUp.bind(this),this._init()}_init(){const t=document.createElement("div");return t.classList.add("ui-resizable-handle"),t.classList.add(`${i.prefix}${this.dir}`),t.style.zIndex="100",t.style.userSelect="none",this.el=t,this.host.appendChild(this.el),this.el.addEventListener("mousedown",this._mouseDown),this}destroy(){return this.moving&&this._mouseUp(this.mouseDownEvent),this.el.removeEventListener("mousedown",this._mouseDown),this.host.removeChild(this.el),delete this.el,delete this.host,this}_mouseDown(t){this.mouseDownEvent=t,document.addEventListener("mousemove",this._mouseMove,!0),document.addEventListener("mouseup",this._mouseUp)}_mouseMove(t){let e=this.mouseDownEvent;!this.moving&&Math.abs(t.x-e.x)+Math.abs(t.y-e.y)>2?(this.moving=!0,this._triggerEvent("start",this.mouseDownEvent)):this.moving&&this._triggerEvent("move",t)}_mouseUp(t){this.moving&&this._triggerEvent("stop",t),document.removeEventListener("mousemove",this._mouseMove,!0),document.removeEventListener("mouseup",this._mouseUp),delete this.moving,delete this.mouseDownEvent}_triggerEvent(t,e){return this.option[t]&&this.option[t](e),this}}e.DDResizableHandle=i,i.prefix="ui-resizable-"},97:(t,e,i)=>{Object.defineProperty(e,"__esModule",{value:!0});const s=i(680),r=i(861),o=i(943),n=i(593);class l extends r.DDBaseImplement{constructor(t,e={}){super(),this._showHandlers=()=>{this.el.classList.remove("ui-resizable-autohide")},this._hideHandlers=()=>{this.el.classList.add("ui-resizable-autohide")},this._ui=()=>{const t=this.el.parentElement.getBoundingClientRect(),e={width:this.originalRect.width,height:this.originalRect.height+this.scrolled,left:this.originalRect.left,top:this.originalRect.top-this.scrolled},i=this.temporalRect||e;return{position:{left:i.left-t.left,top:i.top-t.top},size:{width:i.width,height:i.height}}},this.el=t,this.option=e,this.enable(),this._setupAutoHide(),this._setupHandlers()}on(t,e){super.on(t,e)}off(t){super.off(t)}enable(){super.enable(),this.el.classList.add("ui-resizable"),this.el.classList.remove("ui-resizable-disabled")}disable(){super.disable(),this.el.classList.add("ui-resizable-disabled"),this.el.classList.remove("ui-resizable")}destroy(){this._removeHandlers(),this.option.autoHide&&(this.el.removeEventListener("mouseover",this._showHandlers),this.el.removeEventListener("mouseout",this._hideHandlers)),this.el.classList.remove("ui-resizable"),delete this.el,super.destroy()}updateOption(t){let e=t.handles&&t.handles!==this.option.handles,i=t.autoHide&&t.autoHide!==this.option.autoHide;return Object.keys(t).forEach((e=>this.option[e]=t[e])),e&&(this._removeHandlers(),this._setupHandlers()),i&&this._setupAutoHide(),this}_setupAutoHide(){return this.option.autoHide?(this.el.classList.add("ui-resizable-autohide"),this.el.addEventListener("mouseover",this._showHandlers),this.el.addEventListener("mouseout",this._hideHandlers)):(this.el.classList.remove("ui-resizable-autohide"),this.el.removeEventListener("mouseover",this._showHandlers),this.el.removeEventListener("mouseout",this._hideHandlers)),this}_setupHandlers(){let t=this.option.handles||"e,s,se";return"all"===t&&(t="n,e,s,w,se,sw,ne,nw"),this.handlers=t.split(",").map((t=>t.trim())).map((t=>new s.DDResizableHandle(this.el,t,{start:t=>{this._resizeStart(t)},stop:t=>{this._resizeStop(t)},move:e=>{this._resizing(e,t)}}))),this}_resizeStart(t){this.originalRect=this.el.getBoundingClientRect(),this.scrollEl=n.Utils.getScrollParent(this.el),this.scrollY=this.scrollEl.scrollTop,this.startEvent=t,this._setupHelper(),this._applyChange();const e=o.DDUtils.initEvent(t,{type:"resizestart",target:this.el});return this.option.start&&this.option.start(e,this._ui()),this.el.classList.add("ui-resizable-resizing"),this.triggerEvent("resizestart",e),this}_resizing(t,e){this.scrolled=this.scrollEl.scrollTop-this.scrollY,this.temporalRect=this._getChange(t,e),this._applyChange();const i=o.DDUtils.initEvent(t,{type:"resize",target:this.el});return this.option.resize&&this.option.resize(i,this._ui()),this.triggerEvent("resize",i),this}_resizeStop(t){const e=o.DDUtils.initEvent(t,{type:"resizestop",target:this.el});return this.option.stop&&this.option.stop(e),this.el.classList.remove("ui-resizable-resizing"),this.triggerEvent("resizestop",e),this._cleanHelper(),delete this.startEvent,delete this.originalRect,delete this.temporalRect,delete this.scrollY,delete this.scrolled,this}_setupHelper(){return this.elOriginStyleVal=l._originStyleProp.map((t=>this.el.style[t])),this.parentOriginStylePosition=this.el.parentElement.style.position,window.getComputedStyle(this.el.parentElement).position.match(/static/)&&(this.el.parentElement.style.position="relative"),this.el.style.position=this.option.basePosition||"absolute",this.el.style.opacity="0.8",this.el.style.zIndex="1000",this}_cleanHelper(){return l._originStyleProp.forEach(((t,e)=>{this.el.style[t]=this.elOriginStyleVal[e]||null})),this.el.parentElement.style.position=this.parentOriginStylePosition||null,this}_getChange(t,e){const i=this.startEvent,s={width:this.originalRect.width,height:this.originalRect.height+this.scrolled,left:this.originalRect.left,top:this.originalRect.top-this.scrolled},r=t.clientX-i.clientX,o=t.clientY-i.clientY;e.indexOf("e")>-1&&(s.width+=t.clientX-i.clientX),e.indexOf("s")>-1&&(s.height+=t.clientY-i.clientY),e.indexOf("w")>-1&&(s.width-=r,s.left+=r),e.indexOf("n")>-1&&(s.height-=o,s.top+=o);const n=this._getReShapeSize(s.width,s.height);return s.width!==n.width&&(e.indexOf("w")>-1&&(s.left+=s.width-n.width),s.width=n.width),s.height!==n.height&&(e.indexOf("n")>-1&&(s.top+=s.height-n.height),s.height=n.height),s}_getReShapeSize(t,e){const i=this.option.maxWidth||t,s=this.option.minWidth||t,r=this.option.maxHeight||e,o=this.option.minHeight||e;return{width:Math.min(i,Math.max(s,t)),height:Math.min(r,Math.max(o,e))}}_applyChange(){let t={left:0,top:0,width:0,height:0};if("absolute"===this.el.style.position){const e=this.el.parentElement,{left:i,top:s}=e.getBoundingClientRect();t={left:i,top:s,width:0,height:0}}return this.temporalRect?(Object.keys(this.temporalRect).forEach((e=>{const i=this.temporalRect[e];this.el.style[e]=i-t[e]+"px"})),this):this}_removeHandlers(){return this.handlers.forEach((t=>t.destroy())),delete this.handlers,this}}e.DDResizable=l,l._originStyleProp=["width","height","position","left","top","opacity","zIndex"]},943:(t,e)=>{Object.defineProperty(e,"__esModule",{value:!0});class i{static clone(t){const e=t.cloneNode(!0);return e.removeAttribute("id"),e}static appendTo(t,e){let i;i="string"==typeof e?document.querySelector(e):e,i&&i.append(t)}static setPositionRelative(t){/^(?:r|a|f)/.test(window.getComputedStyle(t).position)||(t.style.position="relative")}static addElStyles(t,e){if(e instanceof Object)for(const i in e)e.hasOwnProperty(i)&&(Array.isArray(e[i])?e[i].forEach((e=>{t.style[i]=e})):t.style[i]=e[i])}static initEvent(t,e){const i={type:e.type},s={button:0,which:0,buttons:1,bubbles:!0,cancelable:!0,target:e.target?e.target:t.target};return t.dataTransfer&&(i.dataTransfer=t.dataTransfer),["altKey","ctrlKey","metaKey","shiftKey"].forEach((e=>i[e]=t[e])),["pageX","pageY","clientX","clientY","screenX","screenY"].forEach((e=>i[e]=t[e])),Object.assign(Object.assign({},i),s)}}e.DDUtils=i,i.isEventSupportPassiveOption=(()=>{let t=!1,e=()=>{};return document.addEventListener("test",e,{get passive(){return t=!0,!0}}),document.removeEventListener("test",e),t})()},761:(t,e,i)=>{Object.defineProperty(e,"__esModule",{value:!0});const s=i(849),r=i(485),o=i(21),n=i(593);!function(t){for(var i in t)e.hasOwnProperty(i)||(e[i]=t[i])}(i(21));class l extends o.GridStackDD{resizable(t,e,i,s){return this._getDDElements(t).forEach((t=>{if("disable"===e||"enable"===e)t.ddResizable&&t.ddResizable[e]();else if("destroy"===e)t.ddResizable&&t.cleanResizable();else if("option"===e)t.setupResizable({[i]:s});else{const i=t.el.gridstackNode.grid;let s=t.el.getAttribute("gs-resize-handles")?t.el.getAttribute("gs-resize-handles"):i.opts.resizable.handles;t.setupResizable(Object.assign(Object.assign(Object.assign({},i.opts.resizable),{handles:s}),{start:e.start,stop:e.stop,resize:e.resize}))}})),this}draggable(t,e,i,s){return this._getDDElements(t).forEach((t=>{if("disable"===e||"enable"===e)t.ddDraggable&&t.ddDraggable[e]();else if("destroy"===e)t.ddDraggable&&t.cleanDraggable();else if("option"===e)t.setupDraggable({[i]:s});else{const i=t.el.gridstackNode.grid;t.setupDraggable(Object.assign(Object.assign({},i.opts.draggable),{containment:i.opts._isNested&&!i.opts.dragOut?i.el.parentElement:i.opts.draggable.containment||null,start:e.start,stop:e.stop,drag:e.drag}))}})),this}dragIn(t,e){return this._getDDElements(t).forEach((t=>t.setupDraggable(e))),this}droppable(t,e,i,s){return"function"!=typeof e.accept||e._accept||(e._accept=e.accept,e.accept=t=>e._accept(t)),this._getDDElements(t).forEach((t=>{"disable"===e||"enable"===e?t.ddDroppable&&t.ddDroppable[e]():"destroy"===e?t.ddDroppable&&t.cleanDroppable():"option"===e?t.setupDroppable({[i]:s}):t.setupDroppable(e)})),this}isDroppable(t){return t&&t.ddElement&&t.ddElement.ddDroppable&&!t.ddElement.ddDroppable.disabled}isDraggable(t){return t&&t.ddElement&&t.ddElement.ddDraggable&&!t.ddElement.ddDraggable.disabled}isResizable(t){return t&&t.ddElement&&t.ddElement.ddResizable&&!t.ddElement.ddResizable.disabled}on(t,e,i){return this._getDDElements(t).forEach((t=>t.on(e,(t=>{i(t,s.DDManager.dragElement?s.DDManager.dragElement.el:t.target,s.DDManager.dragElement?s.DDManager.dragElement.helper:null)})))),this}off(t,e){return this._getDDElements(t).forEach((t=>t.off(e))),this}_getDDElements(t,e=!0){let i=n.Utils.getElements(t);if(!i.length)return[];let s=i.map((t=>t.ddElement||(e?r.DDElement.init(t):null)));return e||s.filter((t=>t)),s}}e.GridStackDDNative=l,o.GridStackDD.registerPlugin(l)},117:(t,e,i)=>{function s(t){for(var i in t)e.hasOwnProperty(i)||(e[i]=t[i])}Object.defineProperty(e,"__esModule",{value:!0}),s(i(593)),s(i(62)),s(i(334)),s(i(270)),s(i(761))},593:(t,e)=>{Object.defineProperty(e,"__esModule",{value:!0}),e.obsolete=function(t,e,i,s,r){let o=(...o)=>(console.warn("gridstack.js: Function `"+i+"` is deprecated in "+r+" and has been replaced with `"+s+"`. It will be **completely** removed in v1.0"),e.apply(t,o));return o.prototype=e.prototype,o},e.obsoleteOpts=function(t,e,i,s){void 0!==t[e]&&(t[i]=t[e],console.warn("gridstack.js: Option `"+e+"` is deprecated in "+s+" and has been replaced with `"+i+"`. It will be **completely** removed in v1.0"))},e.obsoleteOptsDel=function(t,e,i,s){void 0!==t[e]&&console.warn("gridstack.js: Option `"+e+"` is deprecated in "+i+s)},e.obsoleteAttr=function(t,e,i,s){let r=t.getAttribute(e);null!==r&&(t.setAttribute(i,r),console.warn("gridstack.js: attribute `"+e+"`="+r+" is deprecated on this object in "+s+" and has been replaced with `"+i+"`. It will be **completely** removed in v1.0"))},e.Utils=class{static getElements(t){if("string"==typeof t){let e=document.querySelectorAll(t);return e.length||"."===t[0]||"#"===t[0]||(e=document.querySelectorAll("."+t),e.length||(e=document.querySelectorAll("#"+t))),Array.from(e)}return[t]}static getElement(t){if("string"==typeof t){if(!t.length)return null;if("#"===t[0])return document.getElementById(t.substring(1));if("."===t[0]||"["===t[0])return document.querySelector(t);if(!isNaN(+t[0]))return document.getElementById(t);let e=document.querySelector(t);return e||(e=document.getElementById(t)),e||(e=document.querySelector("."+t)),e}return t}static isIntercepted(t,e){return!(t.x+t.w<=e.x||e.x+e.w<=t.x||t.y+t.h<=e.y||e.y+e.h<=t.y)}static sort(t,e,i){if(!i){let e=t.map((t=>t.x+t.w));i=Math.max(...e)}return-1===e?t.sort(((t,e)=>e.x+e.y*i-(t.x+t.y*i))):t.sort(((t,e)=>t.x+t.y*i-(e.x+e.y*i)))}static createStylesheet(t,e){let i=document.createElement("style");return i.setAttribute("type","text/css"),i.setAttribute("gs-style-id",t),i.styleSheet?i.styleSheet.cssText="":i.appendChild(document.createTextNode("")),e?e.insertBefore(i,e.firstChild):(e=document.getElementsByTagName("head")[0]).appendChild(i),i.sheet}static removeStylesheet(t){let e=document.querySelector("STYLE[gs-style-id="+t+"]");e&&e.parentNode&&e.remove()}static addCSSRule(t,e,i){"function"==typeof t.addRule?t.addRule(e,i):"function"==typeof t.insertRule&&t.insertRule(`${e}{${i}}`)}static toBool(t){return"boolean"==typeof t?t:"string"==typeof t?!(""===(t=t.toLowerCase())||"no"===t||"false"===t||"0"===t):Boolean(t)}static toNumber(t){return null===t||0===t.length?void 0:Number(t)}static parseHeight(t){let e,i="px";if("string"==typeof t){let s=t.match(/^(-[0-9]+\.[0-9]+|[0-9]*\.[0-9]+|-[0-9]+|[0-9]+)(px|em|rem|vh|vw|%)?$/);if(!s)throw new Error("Invalid height");i=s[2]||"px",e=parseFloat(s[1])}else e=t;return{h:e,unit:i}}static defaults(t,...e){return e.forEach((e=>{for(const i in e){if(!e.hasOwnProperty(i))return;null===t[i]||void 0===t[i]?t[i]=e[i]:"object"==typeof e[i]&&"object"==typeof t[i]&&this.defaults(t[i],e[i])}})),t}static same(t,e){if("object"!=typeof t)return t==e;if(typeof t!=typeof e)return!1;if(Object.keys(t).length!==Object.keys(e).length)return!1;for(const i in t)if(t[i]!==e[i])return!1;return!0}static removeInternalAndSame(t,e){if("object"==typeof t&&"object"==typeof e)for(let i in t){let s=t[i];if(s&&"object"==typeof s){for(let t in s)s[t]!==e[i][t]&&"_"!==t[0]||delete s[t];Object.keys(s).length||delete t[i]}else s!==e[i]&&"_"!==i[0]||delete t[i]}}static closestByClass(t,e){for(;t=t.parentElement;)if(t.classList.contains(e))return t;return null}static throttle(t,e){let i=!1;return(...s)=>{i||(t.apply(this,s),i=!0,setTimeout((()=>i=!1),e))}}static removePositioningStyles(t){let e=t.style;e.position&&e.removeProperty("position"),e.left&&e.removeProperty("left"),e.top&&e.removeProperty("top"),e.width&&e.removeProperty("width"),e.height&&e.removeProperty("height")}static getScrollParent(t){if(null===t)return document.documentElement;const e=getComputedStyle(t);return/(auto|scroll)/.test(e.overflow+e.overflowY)?t:this.getScrollParent(t.parentElement)}static updateScrollPosition(t,e,i){let s=t.getBoundingClientRect(),r=window.innerHeight||document.documentElement.clientHeight;if(s.top<0||s.bottom>r){let o=s.bottom-r,n=s.top,l=this.getScrollParent(t);if(null!==l){let a=l.scrollTop;s.top<0&&i<0?t.offsetHeight>r?l.scrollTop+=i:l.scrollTop+=Math.abs(n)>Math.abs(i)?i:n:i>0&&(t.offsetHeight>r?l.scrollTop+=i:l.scrollTop+=o>i?i:o),e.top+=l.scrollTop-a}}}static updateScrollResize(t,e,i){const s=this.getScrollParent(e),r=s.clientHeight,o=t.clientYr-i;o?s.scrollBy({behavior:"smooth",top:t.clientY-i}):n&&s.scrollBy({behavior:"smooth",top:i-(r-t.clientY)})}}}},e={};return function i(s){if(e[s])return e[s].exports;var r=e[s]={exports:{}};return t[s](r,r.exports,i),r.exports}(117)})().GridStack})); //# sourceMappingURL=gridstack-h5.js.map \ No newline at end of file diff --git a/node_modules/gridstack/dist/gridstack-h5.js.map b/node_modules/gridstack/dist/gridstack-h5.js.map index d2d11bda7..e3ba45c26 100644 --- a/node_modules/gridstack/dist/gridstack-h5.js.map +++ b/node_modules/gridstack/dist/gridstack-h5.js.map @@ -1 +1 @@ -{"version":3,"sources":["webpack://GridStack/webpack/universalModuleDefinition","webpack://GridStack/./src/gridstack-dd.ts","webpack://GridStack/./src/gridstack-ddi.ts","webpack://GridStack/./src/gridstack-engine.ts","webpack://GridStack/./src/gridstack.ts","webpack://GridStack/./src/h5/dd-base-impl.ts","webpack://GridStack/./src/h5/dd-draggable.ts","webpack://GridStack/./src/h5/dd-droppable.ts","webpack://GridStack/./src/h5/dd-element.ts","webpack://GridStack/./src/h5/dd-manager.ts","webpack://GridStack/./src/h5/dd-resizable-handle.ts","webpack://GridStack/./src/h5/dd-resizable.ts","webpack://GridStack/./src/h5/dd-utils.ts","webpack://GridStack/./src/h5/gridstack-dd-native.ts","webpack://GridStack/./src/index-h5.ts","webpack://GridStack/./src/utils.ts","webpack://GridStack/webpack/bootstrap","webpack://GridStack/webpack/startup"],"names":["root","factory","exports","module","define","amd","self","GridStackDD","GridStackDDI","get","el","this","draggable","resizable","gridstackNode","_initDD","GridStack","prototype","_setupAcceptWidget","opts","staticGrid","acceptWidgets","droppable","accept","grid","onDrag","event","node","pos","getCellFromPixel","left","pageX","top","pageY","x","Math","max","y","_added","engine","canMoveNode","moveNode","_updateContainerHeight","autoPosition","willItFit","cleanNodes","beginUpdate","addNode","_writePosAttr","placeholder","w","h","appendChild","_beforeDragX","_beforeDragY","selector","matches","on","_readAttr","round","offsetWidth","cellWidth","offsetHeight","getCellHeight","newNode","prepareNode","_temporary","_isOutOfGrid","_gridstackNodeOrig","off","removeNode","parentNode","remove","helper","wasAdded","parentElement","origNode","oGrid","removedNodes","push","_triggerRemoveEvent","_id","cleanupNode","cloneNode","Utils","removePositioningStyles","_writeAttr","addedNodes","_triggerAddEvent","_triggerChangeEvent","endUpdate","_gsEventHandler","type","undefined","window","setTimeout","_prepareDragDropByNode","_setupRemoveDrop","removable","trashEl","document","querySelector","isDroppable","removableOptions","dataset","inTrashZone","_setupRemovingTimeout","_clearRemovingTimeout","_removeTimeout","classList","add","_isAboutToRemove","removeTimeout","clearTimeout","_setupDragIn","dragIn","isDraggable","dragInOptions","cellHeight","locked","noMove","disableDrag","noResize","disableResize","onStartMoving","ui","target","append","_prevYPix","position","minW","minH","maxW","maxH","dragOrResize","floor","distance","updateScrollPosition","column","float","getRow","_temporaryRemoved","_lastTriedX","_lastTriedY","updateScrollResize","size","width","height","_lastTriedW","_lastTriedH","onEndMoving","gridToNotify","_resizeNestedGrids","start","stop","drag","resize","movable","els","val","getElements","forEach","pluginClass","ddi","registerPlugin","GridStackEngine","getGridHeight","obsolete","onChange","_float","maxRow","nodes","batchMode","_prevFloat","_packNodes","_notify","_sortNodes","nn","hasLocked","Boolean","find","n","moved","collisionNode","isIntercepted","length","batchUpdate","copyNodes","_dirty","commit","dir","sort","i","_updating","_packY","newY","box","slice","bn","canBeMoved","resizing","_idSeq","defaults","Number","isNaN","min","verify","dirtNodes","_origY","_origX","_origW","_origH","filter","removeDOM","dirtyNodes","Array","isArray","concat","getDirtyNodes","triggerAddEvent","_fixCollisions","triggerEvent","_layouts","isNodeChangedPosition","clonedNode","some","clone","map","canMove","noPack","reduce","memo","saveElement","widgets","key","_ignoreLayoutsNodeChange","layout","l","ratio","oldColumn","cacheLayout","cacheNodes","lastIndex","cacheNode","j","findIndex","newNodes","splice","move","scale","clear","copy","prop","GridDefaults","minRow","itemClass","placeholderClass","placeholderText","handle","handleClass","styleInHead","margin","auto","minWidth","animate","alwaysShowResizeHandle","autoHide","handles","scroll","appendTo","revert","rtl","marginUnit","cellHeightUnit","disableOneColumnMode","oneColumnModeDomSort","obsoleteOpts","obsoleteAttr","row","rowAttr","toNumber","getAttribute","toBool","_styleSheetClass","random","toFixed","initMargin","style","direction","parentGridItemEl","closestByClass","_isNested","subGrid","_isAutoCellHeight","marginDiff","marginRight","marginLeft","marginTop","marginBottom","_setStaticClass","cbNodes","removeChild","_updateStyles","elements","getGridItems","parseInt","e","_prepareElement","saveInitial","setAnimation","placeholderChild","createElement","className","innerHTML","_updateWindowResizeEvent","options","elOrString","getGridElement","gridstack","console","error","grids","getGridElements","parent","opt","doc","implementation","createHTMLDocument","body","class","children","init","load","arguments","warn","a","id","addWidget","content","domAttr","_insertNotAppend","prepend","saveContent","saveGridOpt","list","save","sub","o","removeInternalAndSame","addAndRemove","items","_prevColumn","removed","removeWidget","item","update","addGrid","forcePixel","data","parseHeight","unit","innerWidth","compact","domNodes","updateNodeWidths","from","setStatic","removeAll","_removeStylesheet","enableMove","enableResize","_triggerEvent","doEnable","includeNewWidgets","useDocRelative","containerPos","getBoundingClientRect","documentElement","scrollTop","offsetTop","offsetLeft","relativeLeft","relativeTop","columnWidth","rowHeight","isAreaEmpty","getElement","name","callback","indexOf","split","noData","detail","addEventListener","log","removeEventListener","doAnimate","m","keys","k","changed","ddChanged","value","layoutsNodesChange","CustomEvent","bubbles","Event","dispatchEvent","_styles","removeStylesheet","forceUpdate","prefix","styleLocation","createStylesheet","_max","addCSSRule","bottom","right","getHeight","rows","cssMinHeight","getComputedStyle","setAttribute","String","removeProperty","querySelectorAll","onParentResize","same","attrs","resizeHandles","removeAttribute","hasOwnProperty","classes","clientWidth","throttle","_oneColumnMode","forceRemove","workTodo","_windowResizeBind","bind","margins","Engine","_disabled","_eventRegister","eventName","disabled","DDDraggable","DDBaseImplement","option","super","dragging","containmentRect","offset","_mouseDown","_dragStart","_drag","_dragEnd","_dragFollow","enable","forDestroy","disable","destroy","Object","substring","contains","dragEl","preventDefault","DDManager","dragElement","_createHelper","_setupHelperContainmentStyle","dragOffset","_getDragOffset","helperContainment","ev","DDUtils","initEvent","_setupDragFollowNodeNotifyStart","dragFollowTimer","_cancelDragGhost","_setupHelperStyle","dragEventListenerOption","paintTimer","cancelAnimationFrame","parentOriginStylePosition","_removeHelperStyle","apply","dragElementOriginStyle","originStyleProp","pointerEvents","willChange","transition","basePosition","zIndex","requestAnimationFrame","clientX","clientY","match","img","dataTransfer","setDragImage","stopPropagation","xformOffsetX","xformOffsetY","testEl","addElStyles","opacity","testElPosition","targetOffset","DDDroppable","acceptable","_dragEnter","_dragOver","_dragLeave","_drop","_setupAccept","_canDrop","over","_ui","relatedTarget","_removeLeaveCallbacks","out","drop","DDElement","ddElement","ddDraggable","ddDroppable","ddResizable","updateOption","DDResizable","DDResizableHandle","host","moving","_mouseMove","_mouseUp","_init","userSelect","mouseDownEvent","s","abs","_showHandlers","_hideHandlers","newRect","originalRect","scrolled","rect","temporalRect","_setupAutoHide","_setupHandlers","_removeHandlers","updateHandles","updateAutoHide","handlerDirection","handlers","trim","_resizeStart","_resizeStop","_resizing","scrollEl","getScrollParent","scrollY","startEvent","_setupHelper","_applyChange","_getChange","_cleanHelper","elOriginStyleVal","_originStyleProp","oEvent","offsetH","offsetV","reshape","_getReShapeSize","oWidth","oHeight","maxWidth","maxHeight","minHeight","containmentEl","test","styles","info","evt","obj","button","which","buttons","cancelable","p","isEventSupportPassiveOption","supportsPassive","passiveTest","GridStackDDNative","_getDDElements","dEl","cleanResizable","setupResizable","cleanDraggable","setupDraggable","containment","dragOut","_accept","cleanDroppable","setupDroppable","create","hosts","d","f","oldName","newName","rev","wrapper","args","oldAttr","getElementById","b","widths","styleSheet","cssText","createTextNode","insertBefore","firstChild","getElementsByTagName","sheet","rules","addRule","insertRule","v","toLowerCase","Error","parseFloat","sources","source","delay","isWaiting","overflow","overflowY","innerHeightOrClientHeight","innerHeight","clientHeight","offsetDiffDown","offsetDiffUp","prevScroll","scrollBy","behavior","__webpack_module_cache__","__webpack_require__","moduleId","__webpack_modules__"],"mappings":"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","file":"gridstack-h5.js","sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"GridStack\"] = factory();\n\telse\n\t\troot[\"GridStack\"] = factory();\n})(self, function() {\nreturn ","// gridstack-GridStackDD.get().ts 3.1.4 @preserve\r\n\r\n/**\r\n * https://gridstackjs.com/\r\n * (c) 2014-2020 Alain Dumesny, Dylan Weiss, Pavel Reznikov\r\n * gridstack.js may be freely distributed under the MIT license.\r\n*/\r\n/* eslint-disable @typescript-eslint/no-unused-vars */\r\n\r\nimport { GridStackDDI } from './gridstack-ddi';\r\nimport { GridItemHTMLElement, GridStackNode, GridStackElement, DDUIData, DDDragInOpt } from './types';\r\nimport { GridStack } from './gridstack';\r\nimport { Utils } from './utils';\r\n\r\n/** Drag&Drop drop options */\r\nexport type DDDropOpt = {\r\n /** function or class type that this grid will accept as dropped items (see GridStackOptions.acceptWidgets) */\r\n accept?: (el: GridItemHTMLElement) => boolean;\r\n}\r\n\r\n/** drag&drop options currently called from the main code, but others can be passed in grid options */\r\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\r\nexport type DDOpts = 'enable' | 'disable' | 'destroy' | 'option' | string | any;\r\nexport type DDKey = 'minWidth' | 'minHeight' | 'maxWidth' | 'maxHeight';\r\nexport type DDValue = number | string;\r\n\r\n/** drag&drop events callbacks */\r\nexport type DDCallback = (event: Event, arg2: GridItemHTMLElement, helper?: GridItemHTMLElement) => void;\r\n\r\n/**\r\n * Base class implementing common Grid drag'n'drop functionality, with domain specific subclass (h5 vs jq subclasses)\r\n */\r\nexport abstract class GridStackDD extends GridStackDDI {\r\n\r\n /** override to cast to correct type */\r\n static get(): GridStackDD {\r\n return GridStackDDI.get() as GridStackDD;\r\n }\r\n\r\n /** removes any drag&drop present (called during destroy) */\r\n public remove(el: GridItemHTMLElement): GridStackDD {\r\n this.draggable(el, 'destroy').resizable(el, 'destroy');\r\n if (el.gridstackNode) {\r\n delete el.gridstackNode._initDD; // reset our DD init flag\r\n }\r\n return this;\r\n }\r\n\r\n // APIs that must be implemented by subclasses to do actual darg/drop/resize called by GridStack code below\r\n\r\n public abstract resizable(el: GridItemHTMLElement, opts: DDOpts, key?: DDKey, value?: DDValue): GridStackDD;\r\n\r\n public abstract isResizable(el: HTMLElement): boolean;\r\n\r\n public abstract draggable(el: GridItemHTMLElement, opts: DDOpts, key?: DDKey, value?: DDValue): GridStackDD;\r\n\r\n public abstract dragIn(el: GridStackElement, opts: DDDragInOpt): GridStackDD;\r\n\r\n public abstract isDraggable(el: HTMLElement): boolean;\r\n\r\n public abstract droppable(el: GridItemHTMLElement, opts: DDOpts | DDDropOpt, key?: DDKey, value?: DDValue): GridStackDD;\r\n\r\n public abstract isDroppable(el: HTMLElement): boolean;\r\n\r\n public abstract on(el: GridItemHTMLElement, eventName: string, callback: DDCallback): GridStackDD;\r\n\r\n public abstract off(el: GridItemHTMLElement, eventName: string): GridStackDD;\r\n}\r\n\r\n/********************************************************************************\r\n * GridStack code that is doing drag&drop extracted here so main class is smaller\r\n * for static grid that don't do any of this work anyway. Saves about 10k.\r\n * TODO: no code hint in code below as this is so look at alternatives ?\r\n * https://www.typescriptlang.org/docs/handbook/declaration-merging.html\r\n * https://www.typescriptlang.org/docs/handbook/mixins.html\r\n ********************************************************************************/\r\n\r\n/** @internal called to add drag over support to support widgets */\r\nGridStack.prototype._setupAcceptWidget = function(): GridStack {\r\n if (this.opts.staticGrid) return this;\r\n\r\n // if we don't accept external widgets (default) we still need to accept dragging within our\r\n // list of items (else we get a no-drop icon on windows)\r\n if (!this.opts.acceptWidgets) {\r\n GridStackDD.get().droppable(this.el, {\r\n accept: (el: GridItemHTMLElement) => el.gridstackNode && el.gridstackNode.grid === this\r\n })\r\n return this;\r\n }\r\n\r\n let onDrag = (event, el: GridItemHTMLElement) => {\r\n let node = el.gridstackNode;\r\n let pos = this.getCellFromPixel({left: event.pageX, top: event.pageY}, true);\r\n let x = Math.max(0, pos.x);\r\n let y = Math.max(0, pos.y);\r\n if (!node._added) {\r\n node.x = x;\r\n node.y = y;\r\n delete node.autoPosition;\r\n\r\n // 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\r\n if (!this.engine.willItFit(node)) {\r\n node.autoPosition = true; // ignore x,y and try for any slot...\r\n if (!this.engine.willItFit(node)) return; // full grid or can't grow\r\n }\r\n node._added = true;\r\n\r\n node.el = el;\r\n this.engine.cleanNodes();\r\n this.engine.beginUpdate(node);\r\n this.engine.addNode(node);\r\n\r\n this._writePosAttr(this.placeholder, node.x, node.y, node.w, node.h);\r\n this.el.appendChild(this.placeholder);\r\n node.el = this.placeholder; // dom we update while dragging...\r\n node._beforeDragX = node.x;\r\n node._beforeDragY = node.y;\r\n\r\n this._updateContainerHeight();\r\n } else if ((x !== node.x || y !== node.y) && this.engine.canMoveNode(node, x, y)) {\r\n this.engine.moveNode(node, x, y);\r\n this._updateContainerHeight();\r\n }\r\n };\r\n\r\n GridStackDD.get()\r\n .droppable(this.el, {\r\n accept: (el: GridItemHTMLElement) => {\r\n let node: GridStackNode = el.gridstackNode;\r\n if (node && node.grid === this) {\r\n return true; // set accept drop to true on ourself (which we ignore) so we don't get \"can't drop\" icon in HTML5 mode while moving\r\n }\r\n if (typeof this.opts.acceptWidgets === 'function') {\r\n return this.opts.acceptWidgets(el);\r\n }\r\n let selector = (this.opts.acceptWidgets === true ? '.grid-stack-item' : this.opts.acceptWidgets as string);\r\n return el.matches(selector);\r\n }\r\n })\r\n .on(this.el, 'dropover', (event, el: GridItemHTMLElement) => {\r\n // ignore drop enter on ourself, and prevent parent from receiving event\r\n let node = el.gridstackNode;\r\n if (node && node.grid === this) {\r\n delete node._added; // reset this to track placeholder again in case we were over other grid #1484 (dropout doesn't always clear)\r\n return false;\r\n }\r\n\r\n // load any element attributes if we don't have a node\r\n if (!node) {\r\n node = this._readAttr(el);\r\n }\r\n\r\n // if the item came from another grid, let it know it was added here to removed duplicate shadow #393\r\n if (node.grid && node.grid !== this) {\r\n node._added = true;\r\n }\r\n\r\n // if not calculate the grid size based on element outer size\r\n let w = node.w || Math.round(el.offsetWidth / this.cellWidth()) || 1;\r\n let h = node.h || Math.round(el.offsetHeight / this.getCellHeight(true)) || 1;\r\n\r\n // copy the node original values (min/max/id/etc...) but override width/height/other flags which are this grid specific\r\n let newNode = this.engine.prepareNode({...node, ...{w, h, _added: false, _temporary: true}});\r\n newNode._isOutOfGrid = true;\r\n el.gridstackNode = newNode;\r\n el._gridstackNodeOrig = node;\r\n\r\n GridStackDD.get().on(el, 'drag', onDrag);\r\n return false; // prevent parent from receiving msg (which may be grid as well)\r\n })\r\n .on(this.el, 'dropout', (event, el: GridItemHTMLElement) => {\r\n let node = el.gridstackNode;\r\n if (!node) { return; }\r\n\r\n // clear any added flag now that we are leaving #1484\r\n delete node._added;\r\n\r\n // jquery-ui bug. Must verify widget is being dropped out\r\n // check node variable that gets set when widget is out of grid\r\n if (!node._isOutOfGrid) {\r\n return;\r\n }\r\n\r\n GridStackDD.get().off(el, 'drag');\r\n node.el = null;\r\n this.engine.removeNode(node);\r\n if (this.placeholder.parentNode === this.el) {\r\n this.placeholder.remove();\r\n }\r\n this._updateContainerHeight();\r\n el.gridstackNode = el._gridstackNodeOrig;\r\n return false; // prevent parent from receiving msg (which may be grid as well)\r\n })\r\n .on(this.el, 'drop', (event, el: GridItemHTMLElement, helper: GridItemHTMLElement) => {\r\n let node = el.gridstackNode;\r\n let wasAdded = !!this.placeholder.parentElement; // skip items not actually added to us because of constrains, but do cleanup #1419\r\n // ignore drop on ourself from ourself - dragend will handle the simple move instead\r\n if (node && node.grid === this) { return false; }\r\n\r\n this.placeholder.remove();\r\n\r\n // notify previous grid of removal\r\n let origNode = el._gridstackNodeOrig;\r\n delete el._gridstackNodeOrig;\r\n if (wasAdded && origNode && origNode.grid && origNode.grid !== this) {\r\n let oGrid = origNode.grid;\r\n oGrid.placeholder.remove();\r\n origNode.el = el; // was using placeholder, have it point to node we've moved instead\r\n oGrid.engine.removedNodes.push(origNode);\r\n oGrid._triggerRemoveEvent();\r\n }\r\n\r\n if (!node) { return false; }\r\n\r\n // use existing placeholder node as it's already in our list with drop location\r\n if (wasAdded) {\r\n const _id = node._id;\r\n this.engine.cleanupNode(node); // removes all internal _xyz values (including the _id so add that back)\r\n node._id = _id;\r\n node.grid = this;\r\n }\r\n GridStackDD.get().off(el, 'drag');\r\n // if we made a copy ('helper' which is temp) of the original node then insert a copy, else we move the original node (#1102)\r\n // as the helper will be nuked by jqueryui otherwise\r\n if (helper !== el) {\r\n helper.remove();\r\n el.gridstackNode = origNode; // original item (left behind) is re-stored to pre dragging as the node now has drop info\r\n if (wasAdded) {\r\n el = el.cloneNode(true) as GridItemHTMLElement;\r\n }\r\n } else {\r\n el.remove(); // reduce flicker as we change depth here, and size further down\r\n GridStackDD.get().remove(el);\r\n }\r\n if (!wasAdded) return false;\r\n el.gridstackNode = node;\r\n node.el = el;\r\n\r\n Utils.removePositioningStyles(el);\r\n this._writeAttr(el, node);\r\n this.el.appendChild(el);\r\n this._updateContainerHeight();\r\n this.engine.addedNodes.push(node);\r\n this._triggerAddEvent();\r\n this._triggerChangeEvent();\r\n\r\n this.engine.endUpdate();\r\n if (this._gsEventHandler['dropped']) {\r\n this._gsEventHandler['dropped']({type: 'dropped'}, origNode && origNode.grid ? origNode : undefined, node);\r\n }\r\n\r\n // wait till we return out of the drag callback to set the new drag&resize handler or they may get messed up\r\n // IFF we are still there (some application will use as placeholder and insert their real widget instead)\r\n window.setTimeout(() => {\r\n if (node.el && node.el.parentElement) this._prepareDragDropByNode(node);\r\n });\r\n\r\n return false; // prevent parent from receiving msg (which may be grid as well)\r\n });\r\n return this;\r\n}\r\n\r\n/** @internal called to setup a trash drop zone if the user specifies it */\r\nGridStack.prototype._setupRemoveDrop = function(): GridStack {\r\n if (!this.opts.staticGrid && typeof this.opts.removable === 'string') {\r\n let trashEl = document.querySelector(this.opts.removable) as HTMLElement;\r\n if (!trashEl) return this;\r\n // only register ONE dropover/dropout callback for the 'trash', and it will\r\n // update the passed in item and parent grid because the 'trash' is a shared resource anyway,\r\n // and Native DD only has 1 event CB (having a list and technically a per grid removableOptions complicates things greatly)\r\n if (!GridStackDD.get().isDroppable(trashEl)) {\r\n GridStackDD.get().droppable(trashEl, this.opts.removableOptions)\r\n .on(trashEl, 'dropover', function(event, el) { // don't use => notation to avoid using 'this' as grid by mistake...\r\n let node = el.gridstackNode;\r\n if (!node || !node.grid) return;\r\n el.dataset.inTrashZone = 'true';\r\n node.grid._setupRemovingTimeout(el);\r\n })\r\n .on(trashEl, 'dropout', function(event, el) { // same\r\n let node = el.gridstackNode;\r\n if (!node || !node.grid) return;\r\n delete el.dataset.inTrashZone;\r\n node.grid._clearRemovingTimeout(el);\r\n });\r\n }\r\n }\r\n return this;\r\n}\r\n\r\n/** @internal */\r\nGridStack.prototype._setupRemovingTimeout = function(el: GridItemHTMLElement): GridStack {\r\n let node = el.gridstackNode;\r\n if (!node || node._removeTimeout || !this.opts.removable) return this;\r\n node._removeTimeout = window.setTimeout(() => {\r\n el.classList.add('grid-stack-item-removing');\r\n node._isAboutToRemove = true;\r\n }, this.opts.removeTimeout);\r\n return this;\r\n}\r\n\r\n/** @internal */\r\nGridStack.prototype._clearRemovingTimeout = function(el: GridItemHTMLElement): GridStack {\r\n let node = el.gridstackNode;\r\n if (!node || !node._removeTimeout) return this;\r\n clearTimeout(node._removeTimeout);\r\n delete node._removeTimeout;\r\n el.classList.remove('grid-stack-item-removing');\r\n delete node._isAboutToRemove;\r\n return this;\r\n}\r\n\r\n/** @internal call to setup dragging in from the outside (say toolbar), with options */\r\nGridStack.prototype._setupDragIn = function(): GridStack {\r\n if (!this.opts.staticGrid && typeof this.opts.dragIn === 'string') {\r\n if (!GridStackDD.get().isDraggable(this.opts.dragIn)) {\r\n GridStackDD.get().dragIn(this.opts.dragIn, this.opts.dragInOptions);\r\n }\r\n }\r\n return this;\r\n}\r\n\r\n/** @internal prepares the element for drag&drop **/\r\nGridStack.prototype._prepareDragDropByNode = function(node: GridStackNode): GridStack {\r\n let el = node.el;\r\n\r\n // check for disabled grid first\r\n if (this.opts.staticGrid || node.locked ||\r\n ((node.noMove || this.opts.disableDrag) && (node.noResize || this.opts.disableResize))) {\r\n if (node._initDD) {\r\n GridStackDD.get().remove(node.el); // nukes everything instead of just disable, will add some styles back next\r\n delete node._initDD;\r\n }\r\n node.el.classList.add('ui-draggable-disabled', 'ui-resizable-disabled'); // add styles one might depend on #1435\r\n return this;\r\n }\r\n // check if init already done\r\n if (node._initDD) {\r\n // fine tune drag vs move by disabling any part...\r\n if (node.noMove || this.opts.disableDrag) {\r\n GridStackDD.get().draggable(el, 'disable');\r\n }\r\n if (node.noResize || this.opts.disableResize) {\r\n GridStackDD.get().resizable(el, 'disable');\r\n }\r\n return this;\r\n }\r\n\r\n // remove our style that look like D&D\r\n node.el.classList.remove('ui-draggable-disabled', 'ui-resizable-disabled');\r\n\r\n // variables used/cashed between the 3 start/move/end methods, in addition to node passed above\r\n let cellWidth: number;\r\n let cellHeight: number;\r\n\r\n /** called when item starts moving/resizing */\r\n let onStartMoving = (event: Event, ui: DDUIData): void => {\r\n let target = event.target as HTMLElement;\r\n\r\n // trigger any 'dragstart' / 'resizestart' manually\r\n if (this._gsEventHandler[event.type]) {\r\n this._gsEventHandler[event.type](event, target);\r\n }\r\n\r\n this.engine.cleanNodes();\r\n this.engine.beginUpdate(node);\r\n\r\n this._writePosAttr(this.placeholder, node.x, node.y, node.w, node.h)\r\n this.el.append(this.placeholder);\r\n\r\n node.el = this.placeholder;\r\n node._beforeDragX = node.x;\r\n node._beforeDragY = node.y;\r\n node._prevYPix = ui.position.top;\r\n\r\n // set the min/max resize info\r\n cellWidth = this.cellWidth();\r\n cellHeight = this.getCellHeight(true); // force pixels for calculations\r\n GridStackDD.get().resizable(el, 'option', 'minWidth', cellWidth * (node.minW || 1));\r\n GridStackDD.get().resizable(el, 'option', 'minHeight', cellHeight * (node.minH || 1));\r\n if (node.maxW) { GridStackDD.get().resizable(el, 'option', 'maxWidth', cellWidth * node.maxW); }\r\n if (node.maxH) { GridStackDD.get().resizable(el, 'option', 'maxHeight', cellHeight * node.maxH); }\r\n }\r\n\r\n /** called when item is being dragged/resized */\r\n let dragOrResize = (event: Event, ui: DDUIData): void => {\r\n let x = Math.round(ui.position.left / cellWidth);\r\n let y = Math.floor((ui.position.top + cellHeight / 2) / cellHeight);\r\n let w: number;\r\n let h: number;\r\n\r\n if (event.type === 'drag') {\r\n let distance = ui.position.top - node._prevYPix;\r\n node._prevYPix = ui.position.top;\r\n Utils.updateScrollPosition(el, ui.position, distance);\r\n // if inTrash, outside of the bounds or added to another grid (#393) temporarily remove it from us\r\n if (el.dataset.inTrashZone || x < 0 || x >= this.engine.column || y < 0 || (!this.engine.float && y > this.engine.getRow()) || node._added) {\r\n if (node._temporaryRemoved) return;\r\n if (this.opts.removable === true) {\r\n this._setupRemovingTimeout(el);\r\n }\r\n\r\n x = node._beforeDragX;\r\n y = node._beforeDragY;\r\n\r\n if (this.placeholder.parentNode === this.el) {\r\n this.placeholder.remove();\r\n }\r\n this.engine.removeNode(node);\r\n this._updateContainerHeight();\r\n\r\n node._temporaryRemoved = true;\r\n delete node._added; // no need for this now\r\n } else {\r\n this._clearRemovingTimeout(el);\r\n\r\n if (node._temporaryRemoved) {\r\n this.engine.addNode(node);\r\n this._writePosAttr(this.placeholder, x, y, w, h);\r\n this.el.appendChild(this.placeholder);\r\n node.el = this.placeholder;\r\n delete node._temporaryRemoved;\r\n }\r\n }\r\n if (node._lastTriedX === x && node._lastTriedY === y) return;\r\n } else if (event.type === 'resize') {\r\n if (x < 0) return;\r\n // Scrolling page if needed\r\n Utils.updateScrollResize(event as MouseEvent, el, cellHeight);\r\n w = Math.round(ui.size.width / cellWidth);\r\n h = Math.round(ui.size.height / cellHeight);\r\n if (w === node.w && h === node.h) return;\r\n }\r\n\r\n if (!this.engine.canMoveNode(node, x, y, w, h)) return;\r\n node._lastTriedX = x;\r\n node._lastTriedY = y;\r\n node._lastTriedW = w;\r\n node._lastTriedH = h;\r\n this.engine.moveNode(node, x, y, w, h);\r\n this._updateContainerHeight();\r\n }\r\n\r\n /** called when the item stops moving/resizing */\r\n let onEndMoving = (event: Event): void => {\r\n if (this.placeholder.parentNode === this.el) {\r\n this.placeholder.remove();\r\n }\r\n\r\n // if the item has moved to another grid, we're done here\r\n let target: GridItemHTMLElement = event.target as GridItemHTMLElement;\r\n if (!target.gridstackNode || target.gridstackNode.grid !== this) return;\r\n\r\n node.el = target;\r\n\r\n if (node._isAboutToRemove) {\r\n let gridToNotify = el.gridstackNode.grid;\r\n if (gridToNotify._gsEventHandler[event.type]) {\r\n gridToNotify._gsEventHandler[event.type](event, target);\r\n }\r\n gridToNotify.engine.removedNodes.push(node);\r\n GridStackDD.get().remove(el);\r\n delete el.gridstackNode; // hint we're removing it next and break circular link\r\n gridToNotify._triggerRemoveEvent();\r\n if (el.parentElement) {\r\n el.remove(); // finally remove it\r\n }\r\n } else {\r\n this._clearRemovingTimeout(el);\r\n if (!node._temporaryRemoved) {\r\n Utils.removePositioningStyles(target);\r\n this._writePosAttr(target, node.x, node.y, node.w, node.h);\r\n } else {\r\n Utils.removePositioningStyles(target);\r\n this._writePosAttr(target, node._beforeDragX, node._beforeDragY, node.w, node.h);\r\n node.x = node._beforeDragX;\r\n node.y = node._beforeDragY;\r\n delete node._temporaryRemoved;\r\n this.engine.addNode(node);\r\n }\r\n if (this._gsEventHandler[event.type]) {\r\n this._gsEventHandler[event.type](event, target);\r\n }\r\n }\r\n\r\n this._updateContainerHeight();\r\n this._triggerChangeEvent();\r\n\r\n this.engine.endUpdate();\r\n\r\n // if we re-sized a nested grid item, let the children resize as well\r\n if (event.type === 'resizestop') {\r\n this._resizeNestedGrids(target);\r\n }\r\n }\r\n\r\n GridStackDD.get()\r\n .draggable(el, {\r\n start: onStartMoving,\r\n stop: onEndMoving,\r\n drag: dragOrResize\r\n })\r\n .resizable(el, {\r\n start: onStartMoving,\r\n stop: onEndMoving,\r\n resize: dragOrResize\r\n });\r\n node._initDD = true; // we've set DD support now\r\n\r\n // finally fine tune drag vs move by disabling any part...\r\n if (node.noMove || this.opts.disableDrag) {\r\n GridStackDD.get().draggable(el, 'disable');\r\n }\r\n if (node.noResize || this.opts.disableResize) {\r\n GridStackDD.get().resizable(el, 'disable');\r\n }\r\n return this;\r\n}\r\n\r\n/**\r\n * Enables/Disables moving.\r\n * @param els widget or selector to modify.\r\n * @param val if true widget will be draggable.\r\n */\r\nGridStack.prototype.movable = function(els: GridStackElement, val: boolean): GridStack {\r\n if (this.opts.staticGrid) { return this; } // can't move a static grid!\r\n GridStack.getElements(els).forEach(el => {\r\n let node = el.gridstackNode;\r\n if (!node || node.locked) { return }\r\n node.noMove = !(val || false);\r\n if (node.noMove) {\r\n GridStackDD.get().draggable(el, 'disable');\r\n el.classList.remove('ui-draggable-handle');\r\n } else {\r\n this._prepareDragDropByNode(node); // init DD if need be\r\n GridStackDD.get().draggable(el, 'enable');\r\n el.classList.remove('ui-draggable-handle');\r\n }\r\n });\r\n return this;\r\n}\r\n\r\n/**\r\n * Enables/Disables resizing.\r\n * @param els widget or selector to modify\r\n * @param val if true widget will be resizable.\r\n */\r\nGridStack.prototype.resizable = function(els: GridStackElement, val: boolean): GridStack {\r\n if (this.opts.staticGrid) { return this; } // can't resize a static grid!\r\n GridStack.getElements(els).forEach(el => {\r\n let node = el.gridstackNode;\r\n if (!node || node.locked) { return; }\r\n node.noResize = !(val || false);\r\n if (node.noResize) {\r\n GridStackDD.get().resizable(el, 'disable');\r\n } else {\r\n this._prepareDragDropByNode(node); // init DD if need be\r\n GridStackDD.get().resizable(el, 'enable');\r\n }\r\n });\r\n return this;\r\n}\r\n","// gridstack-ddi.ts 3.1.4 @preserve\r\n\r\n/**\r\n * https://gridstackjs.com/\r\n * (c) 2014-2020 Alain Dumesny, Dylan Weiss, Pavel Reznikov\r\n * gridstack.js may be freely distributed under the MIT license.\r\n*/\r\n/* eslint-disable @typescript-eslint/no-unused-vars */\r\n\r\nimport { GridItemHTMLElement } from './types';\r\n\r\n/**\r\n * Abstract Partial Interface API for drag'n'drop plugin - look at GridStackDD and HTML5 / Jquery implementation versions\r\n */\r\nexport class GridStackDDI {\r\n\r\n protected static ddi: GridStackDDI;\r\n\r\n /** call this method to register your plugin instead of the default no-op one */\r\n static registerPlugin(pluginClass: typeof GridStackDDI): GridStackDDI {\r\n GridStackDDI.ddi = new pluginClass();\r\n return GridStackDDI.ddi;\r\n }\r\n\r\n /** get the current registered plugin to use */\r\n static get(): GridStackDDI {\r\n return GridStackDDI.ddi || GridStackDDI.registerPlugin(GridStackDDI);\r\n }\r\n\r\n /** removes any drag&drop present (called during destroy) */\r\n public remove(el: GridItemHTMLElement): GridStackDDI {\r\n return this; // no-op for static grids\r\n }\r\n}\r\n","// gridstack-engine.ts 3.1.4 @preserve\r\n\r\n/**\r\n * https://gridstackjs.com/\r\n * (c) 2014-2020 Alain Dumesny, Dylan Weiss, Pavel Reznikov\r\n * gridstack.js may be freely distributed under the MIT license.\r\n*/\r\n\r\nimport { Utils, obsolete } from './utils';\r\nimport { GridStackNode, ColumnOptions, GridStackWidget } from './types';\r\n\r\nexport type onChangeCB = (nodes: GridStackNode[], removeDOM?: boolean) => void;\r\n\r\n/** options used for creations - similar to GridStackOptions */\r\nexport interface GridStackEngineOptions {\r\n column?: number;\r\n maxRow?: number;\r\n float?: boolean;\r\n nodes?: GridStackNode[];\r\n onChange?: onChangeCB;\r\n}\r\n\r\n/**\r\n * Defines the GridStack engine that does most no DOM grid manipulation.\r\n * See GridStack methods and vars for descriptions.\r\n *\r\n * NOTE: values should not be modified directly - call the main GridStack API instead\r\n */\r\nexport class GridStackEngine {\r\n public column: number;\r\n public maxRow: number;\r\n public nodes: GridStackNode[];\r\n public onChange: onChangeCB;\r\n public addedNodes: GridStackNode[] = [];\r\n public removedNodes: GridStackNode[] = [];\r\n public batchMode: boolean;\r\n /** @internal */\r\n private _float: boolean;\r\n /** @internal */\r\n private _prevFloat: boolean;\r\n /** @internal */\r\n private _layouts?: Layout[][]; // maps column # to array of values nodes\r\n /** @internal */\r\n private _ignoreLayoutsNodeChange: boolean;\r\n /** @internal */\r\n private static _idSeq = 1;\r\n\r\n public constructor(opts: GridStackEngineOptions = {}) {\r\n this.column = opts.column || 12;\r\n this.onChange = opts.onChange;\r\n this._float = opts.float;\r\n this.maxRow = opts.maxRow;\r\n this.nodes = opts.nodes || [];\r\n }\r\n\r\n public batchUpdate(): GridStackEngine {\r\n if (this.batchMode) return this;\r\n this.batchMode = true;\r\n this._prevFloat = this._float;\r\n this._float = true; // let things go anywhere for now... commit() will restore and possibly reposition\r\n return this;\r\n }\r\n\r\n public commit(): GridStackEngine {\r\n if (!this.batchMode) return this;\r\n this.batchMode = false;\r\n this._float = this._prevFloat;\r\n delete this._prevFloat;\r\n this._packNodes();\r\n this._notify();\r\n return this;\r\n }\r\n\r\n /** @internal */\r\n private _fixCollisions(node: GridStackNode): GridStackEngine {\r\n this._sortNodes(-1);\r\n\r\n let nn = node;\r\n let hasLocked = Boolean(this.nodes.find(n => n.locked));\r\n if (!this.float && !hasLocked) {\r\n nn = {x: 0, y: node.y, w: this.column, h: node.h};\r\n }\r\n while (true) {\r\n let collisionNode = this.nodes.find( n => n !== node && Utils.isIntercepted(n, nn), {node: node, nn: nn});\r\n if (!collisionNode) { return this }\r\n let moved;\r\n if (collisionNode.locked) {\r\n // if colliding with a locked item, move ourself instead\r\n moved = this.moveNode(node, node.x, collisionNode.y + collisionNode.h,\r\n node.w, node.h, true);\r\n } else {\r\n moved = this.moveNode(collisionNode, collisionNode.x, node.y + node.h,\r\n collisionNode.w, collisionNode.h, true);\r\n }\r\n if (!moved) { return this } // break inf loop if we couldn't move after all (ex: maxRow, fixed)\r\n }\r\n }\r\n\r\n public isAreaEmpty(x: number, y: number, w: number, h: number): boolean {\r\n let nn: GridStackNode = {x: x || 0, y: y || 0, w: w || 1, h: h || 1};\r\n let collisionNode = this.nodes.find(n => {\r\n return Utils.isIntercepted(n, nn);\r\n });\r\n return !collisionNode;\r\n }\r\n\r\n /** re-layout grid items to reclaim any empty space */\r\n public compact(): GridStackEngine {\r\n if (this.nodes.length === 0) { return this }\r\n this.batchUpdate();\r\n this._sortNodes();\r\n let copyNodes = this.nodes;\r\n this.nodes = []; // pretend we have no nodes to conflict layout to start with...\r\n copyNodes.forEach(node => {\r\n if (!node.noMove && !node.locked) {\r\n node.autoPosition = true;\r\n }\r\n this.addNode(node, false); // 'false' for add event trigger\r\n node._dirty = true; // force attr update\r\n });\r\n this.commit();\r\n return this;\r\n }\r\n\r\n /** enable/disable floating widgets (default: `false`) See [example](http://gridstackjs.com/demo/float.html) */\r\n public set float(val: boolean) {\r\n if (this._float === val) { return; }\r\n this._float = val || false;\r\n if (!val) {\r\n this._packNodes();\r\n this._notify();\r\n }\r\n }\r\n\r\n /** float getter method */\r\n public get float(): boolean { return this._float || false; }\r\n\r\n /** @internal */\r\n private _sortNodes(dir?: -1 | 1): GridStackEngine {\r\n this.nodes = Utils.sort(this.nodes, dir, this.column);\r\n return this;\r\n }\r\n\r\n /** @internal */\r\n private _packNodes(): GridStackEngine {\r\n this._sortNodes();\r\n\r\n if (this.float) {\r\n this.nodes.forEach((n, i) => {\r\n if (n._updating || n._packY === undefined || n.y === n._packY) {\r\n return this;\r\n }\r\n let newY = n.y;\r\n while (newY >= n._packY) {\r\n let box: GridStackWidget = {x: n.x, y: newY, w: n.w, h: n.h};\r\n let collisionNode = this.nodes\r\n .slice(0, i)\r\n .find(bn => Utils.isIntercepted(box, bn), {n: n, newY: newY});\r\n if (!collisionNode) {\r\n n._dirty = true;\r\n n.y = newY;\r\n }\r\n --newY;\r\n }\r\n });\r\n } else {\r\n this.nodes.forEach((n, i) => {\r\n if (n.locked) { return this }\r\n while (n.y > 0) {\r\n let newY = n.y - 1;\r\n let canBeMoved = i === 0;\r\n let box: GridStackWidget = {x: n.x, y: newY, w: n.w, h: n.h};\r\n if (i > 0) {\r\n let collisionNode = this.nodes\r\n .slice(0, i)\r\n .find(bn => Utils.isIntercepted(box, bn), {n: n, newY: newY});\r\n canBeMoved = collisionNode === undefined;\r\n }\r\n\r\n if (!canBeMoved) { break; }\r\n // Note: must be dirty (from last position) for GridStack::OnChange CB to update positions\r\n // and move items back. The user 'change' CB should detect changes from the original\r\n // starting position instead.\r\n n._dirty = (n.y !== newY);\r\n n.y = newY;\r\n }\r\n });\r\n }\r\n return this;\r\n }\r\n\r\n /**\r\n * given a random node, makes sure it's coordinates/values are valid in the current grid\r\n * @param node to adjust\r\n * @param resizing if out of bound, resize down or move into the grid to fit ?\r\n */\r\n public prepareNode(node: GridStackNode, resizing?: boolean): GridStackNode {\r\n node = node || {};\r\n node._id = node._id || GridStackEngine._idSeq++;\r\n\r\n // if we're missing position, have the grid position us automatically (before we set them to 0,0)\r\n if (node.x === undefined || node.y === undefined || node.x === null || node.y === null) {\r\n node.autoPosition = true;\r\n }\r\n\r\n // assign defaults for missing required fields\r\n let defaults: GridStackNode = { x: 0, y: 0, w: 1, h: 1};\r\n Utils.defaults(node, defaults);\r\n\r\n if (!node.autoPosition) { delete node.autoPosition; }\r\n if (!node.noResize) { delete node.noResize; }\r\n if (!node.noMove) { delete node.noMove; }\r\n\r\n // check for NaN (in case messed up strings were passed. can't do parseInt() || defaults.x above as 0 is valid #)\r\n if (typeof node.x == 'string') { node.x = Number(node.x); }\r\n if (typeof node.y == 'string') { node.y = Number(node.y); }\r\n if (typeof node.w == 'string') { node.w = Number(node.w); }\r\n if (typeof node.h == 'string') { node.h = Number(node.h); }\r\n if (isNaN(node.x)) { node.x = defaults.x; node.autoPosition = true; }\r\n if (isNaN(node.y)) { node.y = defaults.y; node.autoPosition = true; }\r\n if (isNaN(node.w)) { node.w = defaults.w; }\r\n if (isNaN(node.h)) { node.h = defaults.h; }\r\n\r\n if (node.maxW) { node.w = Math.min(node.w, node.maxW); }\r\n if (node.maxH) { node.h = Math.min(node.h, node.maxH); }\r\n if (node.minW) { node.w = Math.max(node.w, node.minW); }\r\n if (node.minH) { node.h = Math.max(node.h, node.minH); }\r\n\r\n if (node.w > this.column) {\r\n node.w = this.column;\r\n } else if (node.w < 1) {\r\n node.w = 1;\r\n }\r\n\r\n if (this.maxRow && node.h > this.maxRow) {\r\n node.h = this.maxRow;\r\n } else if (node.h < 1) {\r\n node.h = 1;\r\n }\r\n\r\n if (node.x < 0) {\r\n node.x = 0;\r\n }\r\n if (node.y < 0) {\r\n node.y = 0;\r\n }\r\n\r\n if (node.x + node.w > this.column) {\r\n if (resizing) {\r\n node.w = this.column - node.x;\r\n } else {\r\n node.x = this.column - node.w;\r\n }\r\n }\r\n if (this.maxRow && node.y + node.h > this.maxRow) {\r\n if (resizing) {\r\n node.h = this.maxRow - node.y;\r\n } else {\r\n node.y = this.maxRow - node.h;\r\n }\r\n }\r\n\r\n return node;\r\n }\r\n\r\n public getDirtyNodes(verify?: boolean): GridStackNode[] {\r\n // compare original X,Y,W,H (or entire node?) instead as _dirty can be a temporary state\r\n if (verify) {\r\n let dirtNodes: GridStackNode[] = [];\r\n this.nodes.forEach(n => {\r\n if (n._dirty) {\r\n if (n.y === n._origY && n.x === n._origX && n.w === n._origW && n.h === n._origH) {\r\n delete n._dirty;\r\n } else {\r\n dirtNodes.push(n);\r\n }\r\n }\r\n });\r\n return dirtNodes;\r\n }\r\n\r\n return this.nodes.filter(n => n._dirty);\r\n }\r\n\r\n /** @internal */\r\n private _notify(nodes?: GridStackNode | GridStackNode[], removeDOM = true): GridStackEngine {\r\n if (this.batchMode) { return this }\r\n nodes = (nodes === undefined ? [] : (Array.isArray(nodes) ? nodes : [nodes]) );\r\n let dirtyNodes = nodes.concat(this.getDirtyNodes());\r\n if (this.onChange) {\r\n this.onChange(dirtyNodes, removeDOM);\r\n }\r\n return this;\r\n }\r\n\r\n public cleanNodes(): GridStackEngine {\r\n if (this.batchMode) { return this }\r\n this.nodes.forEach(n => { delete n._dirty; });\r\n return this;\r\n }\r\n\r\n public addNode(node: GridStackNode, triggerAddEvent = false): GridStackNode {\r\n node = this.prepareNode(node);\r\n\r\n if (node.autoPosition) {\r\n this._sortNodes();\r\n\r\n for (let i = 0;; ++i) {\r\n let x = i % this.column;\r\n let y = Math.floor(i / this.column);\r\n if (x + node.w > this.column) {\r\n continue;\r\n }\r\n let box = {x, y, w: node.w, h: node.h};\r\n if (!this.nodes.find(n => Utils.isIntercepted(box, n), {x, y, node})) {\r\n node.x = x;\r\n node.y = y;\r\n delete node.autoPosition; // found our slot\r\n break;\r\n }\r\n }\r\n }\r\n\r\n this.nodes.push(node);\r\n if (triggerAddEvent) {\r\n this.addedNodes.push(node);\r\n }\r\n\r\n this._fixCollisions(node);\r\n this._packNodes();\r\n this._notify();\r\n return node;\r\n }\r\n\r\n public removeNode(node: GridStackNode, removeDOM = true, triggerEvent = false): GridStackEngine {\r\n if (triggerEvent) { // we wait until final drop to manually track removed items (rather than during drag)\r\n this.removedNodes.push(node);\r\n }\r\n node._id = null; // hint that node is being removed\r\n // don't use 'faster' .splice(findIndex(),1) in case node isn't in our list, or in multiple times.\r\n this.nodes = this.nodes.filter(n => n !== node);\r\n if (!this.float) {\r\n this._packNodes();\r\n }\r\n this._notify(node, removeDOM);\r\n return this;\r\n }\r\n\r\n public removeAll(removeDOM = true): GridStackEngine {\r\n delete this._layouts;\r\n if (this.nodes.length === 0) { return this }\r\n if (removeDOM) {\r\n this.nodes.forEach(n => { n._id = null; }); // hint that node is being removed\r\n }\r\n this.removedNodes = this.nodes;\r\n this.nodes = [];\r\n this._notify(this.removedNodes, removeDOM);\r\n return this;\r\n }\r\n\r\n public canMoveNode(node: GridStackNode, x: number, y: number, w?: number, h?: number): boolean {\r\n if (!this.isNodeChangedPosition(node, x, y, w, h)) {\r\n return false;\r\n }\r\n let hasLocked = this.nodes.some(n => n.locked);\r\n\r\n if (!this.maxRow && !hasLocked) {\r\n return true;\r\n }\r\n\r\n let clonedNode: GridStackNode;\r\n let clone = new GridStackEngine({\r\n column: this.column,\r\n float: this.float,\r\n nodes: this.nodes.map(n => {\r\n if (n === node) {\r\n clonedNode = {...n};\r\n return clonedNode;\r\n }\r\n return {...n};\r\n })\r\n });\r\n\r\n if (!clonedNode) return true;\r\n\r\n clone.moveNode(clonedNode, x, y, w, h);\r\n\r\n let canMove = true;\r\n if (hasLocked) {\r\n canMove = !clone.nodes.some(n => n.locked && n._dirty && n !== clonedNode);\r\n }\r\n if (this.maxRow && canMove) {\r\n canMove = (clone.getRow() <= this.maxRow);\r\n }\r\n\r\n return canMove;\r\n }\r\n\r\n /** return true if can fit in grid height constrain only (always true if no maxRow) */\r\n public willItFit(node: GridStackNode): boolean {\r\n if (!this.maxRow) return true;\r\n\r\n let clone = new GridStackEngine({\r\n column: this.column,\r\n float: this.float,\r\n nodes: this.nodes.map(n => {return {...n}})\r\n });\r\n clone.addNode(node);\r\n return clone.getRow() <= this.maxRow;\r\n }\r\n\r\n public isNodeChangedPosition(node: GridStackNode, x: number, y: number, w?: number, h?: number): boolean {\r\n if (typeof x !== 'number') { x = node.x; }\r\n if (typeof y !== 'number') { y = node.y; }\r\n if (typeof w !== 'number') { w = node.w; }\r\n if (typeof h !== 'number') { h = node.h; }\r\n\r\n if (node.maxW) { w = Math.min(w, node.maxW); }\r\n if (node.maxH) { h = Math.min(h, node.maxH); }\r\n if (node.minW) { w = Math.max(w, node.minW); }\r\n if (node.minH) { h = Math.max(h, node.minH); }\r\n\r\n if (node.x === x && node.y === y && node.w === w && node.h === h) {\r\n return false;\r\n }\r\n return true;\r\n }\r\n\r\n public moveNode(node: GridStackNode, x: number, y: number, w?: number, h?: number, noPack?: boolean): GridStackNode {\r\n if (node.locked) { return null; }\r\n if (typeof x !== 'number') { x = node.x; }\r\n if (typeof y !== 'number') { y = node.y; }\r\n if (typeof w !== 'number') { w = node.w; }\r\n if (typeof h !== 'number') { h = node.h; }\r\n\r\n // constrain the passed in values and check if we're still changing our node\r\n let resizing = (node.w !== w || node.h !== h);\r\n let nn: GridStackNode = { x, y, w, h, maxW: node.maxW, maxH: node.maxH, minW: node.minW, minH: node.minH};\r\n nn = this.prepareNode(nn, resizing);\r\n if (node.x === nn.x && node.y === nn.y && node.w === nn.w && node.h === nn.h) {\r\n return null;\r\n }\r\n\r\n node._dirty = true;\r\n\r\n node.x = node._lastTriedX = nn.x;\r\n node.y = node._lastTriedY = nn.y;\r\n node.w = node._lastTriedW = nn.w;\r\n node.h = node._lastTriedH = nn.h;\r\n\r\n this._fixCollisions(node);\r\n if (!noPack) {\r\n this._packNodes();\r\n this._notify();\r\n }\r\n return node;\r\n }\r\n\r\n public getRow(): number {\r\n return this.nodes.reduce((memo, n) => Math.max(memo, n.y + n.h), 0);\r\n }\r\n\r\n public beginUpdate(node: GridStackNode): GridStackEngine {\r\n if (node._updating) return this;\r\n node._updating = true;\r\n this.nodes.forEach(n => { n._packY = n.y; });\r\n return this;\r\n }\r\n\r\n public endUpdate(): GridStackEngine {\r\n let n = this.nodes.find(n => n._updating);\r\n if (n) {\r\n delete n._updating;\r\n this.nodes.forEach(n => { delete n._packY; });\r\n }\r\n return this;\r\n }\r\n\r\n /** saves the current layout returning a list of widgets for serialization */\r\n public save(saveElement = true): GridStackNode[] {\r\n let widgets: GridStackNode[] = [];\r\n Utils.sort(this.nodes);\r\n this.nodes.forEach(n => {\r\n let w: GridStackNode = {};\r\n for (let key in n) { if (key[0] !== '_' && n[key] !== null && n[key] !== undefined ) w[key] = n[key]; }\r\n // delete other internals\r\n if (!saveElement) delete w.el;\r\n delete w.grid;\r\n // delete default values (will be re-created on read)\r\n if (!w.autoPosition) delete w.autoPosition;\r\n if (!w.noResize) delete w.noResize;\r\n if (!w.noMove) delete w.noMove;\r\n if (!w.locked) delete w.locked;\r\n widgets.push(w);\r\n });\r\n return widgets;\r\n }\r\n\r\n /** @internal called whenever a node is added or moved - updates the cached layouts */\r\n public layoutsNodesChange(nodes: GridStackNode[]): GridStackEngine {\r\n if (!this._layouts || this._ignoreLayoutsNodeChange) return this;\r\n // remove smaller layouts - we will re-generate those on the fly... larger ones need to update\r\n this._layouts.forEach((layout, column) => {\r\n if (!layout || column === this.column) return this;\r\n if (column < this.column) {\r\n this._layouts[column] = undefined;\r\n }\r\n else {\r\n // we save the original x,y,w (h isn't cached) to see what actually changed to propagate better.\r\n // Note: we don't need to check against out of bound scaling/moving as that will be done when using those cache values.\r\n nodes.forEach(node => {\r\n let n = layout.find(l => l._id === node._id);\r\n if (!n) return this; // no cache for new nodes. Will use those values.\r\n let ratio = column / this.column;\r\n // Y changed, push down same amount\r\n // TODO: detect doing item 'swaps' will help instead of move (especially in 1 column mode)\r\n if (node.y !== node._origY) {\r\n n.y += (node.y - node._origY);\r\n }\r\n // X changed, scale from new position\r\n if (node.x !== node._origX) {\r\n n.x = Math.round(node.x * ratio);\r\n }\r\n // width changed, scale from new width\r\n if (node.w !== node._origW) {\r\n n.w = Math.round(node.w * ratio);\r\n }\r\n // ...height always carries over from cache\r\n });\r\n }\r\n });\r\n return this;\r\n }\r\n\r\n /**\r\n * @internal Called to scale the widget width & position up/down based on the column change.\r\n * Note we store previous layouts (especially original ones) to make it possible to go\r\n * from say 12 -> 1 -> 12 and get back to where we were.\r\n *\r\n * @param oldColumn previous number of columns\r\n * @param column new column number\r\n * @param nodes different sorted list (ex: DOM order) instead of current list\r\n * @param layout specify the type of re-layout that will happen (position, size, etc...).\r\n * Note: items will never be outside of the current column boundaries. default (moveScale). Ignored for 1 column\r\n */\r\n public updateNodeWidths(oldColumn: number, column: number, nodes: GridStackNode[], layout: ColumnOptions = 'moveScale'): GridStackEngine {\r\n if (!this.nodes.length || oldColumn === column) { return this }\r\n\r\n // cache the current layout in case they want to go back (like 12 -> 1 -> 12) as it requires original data\r\n this.cacheLayout(this.nodes, oldColumn);\r\n\r\n // if we're going to 1 column and using DOM order rather than default sorting, then generate that layout\r\n if (column === 1 && nodes && nodes.length) {\r\n let top = 0;\r\n nodes.forEach(n => {\r\n n.x = 0;\r\n n.w = 1;\r\n n.y = Math.max(n.y, top);\r\n top = n.y + n.h;\r\n });\r\n } else {\r\n nodes = Utils.sort(this.nodes, -1, oldColumn); // current column reverse sorting so we can insert last to front (limit collision)\r\n }\r\n\r\n // see if we have cached previous layout.\r\n let cacheNodes = this._layouts[column] || [];\r\n // if not AND we are going up in size start with the largest layout as down-scaling is more accurate\r\n let lastIndex = this._layouts.length - 1;\r\n if (cacheNodes.length === 0 && column > oldColumn && column < lastIndex) {\r\n cacheNodes = this._layouts[lastIndex] || [];\r\n if (cacheNodes.length) {\r\n // pretend we came from that larger column by assigning those values as starting point\r\n oldColumn = lastIndex;\r\n cacheNodes.forEach(cacheNode => {\r\n let j = nodes.findIndex(n => n._id === cacheNode._id);\r\n if (j !== -1) {\r\n // still current, use cache info positions\r\n nodes[j].x = cacheNode.x;\r\n nodes[j].y = cacheNode.y;\r\n nodes[j].w = cacheNode.w;\r\n }\r\n });\r\n cacheNodes = []; // we still don't have new column cached data... will generate from larger one.\r\n }\r\n }\r\n\r\n // if we found cache re-use those nodes that are still current\r\n let newNodes: GridStackNode[] = [];\r\n cacheNodes.forEach(cacheNode => {\r\n let j = nodes.findIndex(n => n._id === cacheNode._id);\r\n if (j !== -1) {\r\n // still current, use cache info positions\r\n nodes[j].x = cacheNode.x;\r\n nodes[j].y = cacheNode.y;\r\n nodes[j].w = cacheNode.w;\r\n newNodes.push(nodes[j]);\r\n nodes.splice(j, 1);\r\n }\r\n });\r\n // ...and add any extra non-cached ones\r\n if (nodes.length) {\r\n if (typeof layout === 'function') {\r\n layout(column, oldColumn, newNodes, nodes);\r\n } else {\r\n let ratio = column / oldColumn;\r\n let move = (layout === 'move' || layout === 'moveScale');\r\n let scale = (layout === 'scale' || layout === 'moveScale');\r\n nodes.forEach(node => {\r\n node.x = (column === 1 ? 0 : (move ? Math.round(node.x * ratio) : Math.min(node.x, column - 1)));\r\n node.w = ((column === 1 || oldColumn === 1) ? 1 :\r\n scale ? (Math.round(node.w * ratio) || 1) : (Math.min(node.w, column)));\r\n newNodes.push(node);\r\n });\r\n nodes = [];\r\n }\r\n }\r\n\r\n // finally re-layout them in reverse order (to get correct placement)\r\n newNodes = Utils.sort(newNodes, -1, column);\r\n this._ignoreLayoutsNodeChange = true;\r\n this.batchUpdate();\r\n this.nodes = []; // pretend we have no nodes to start with (we use same structures) to simplify layout\r\n newNodes.forEach(node => {\r\n this.addNode(node, false); // 'false' for add event trigger\r\n node._dirty = true; // force attr update\r\n }, this);\r\n this.commit();\r\n delete this._ignoreLayoutsNodeChange;\r\n return this;\r\n }\r\n\r\n /** @internal called to save initial position/size */\r\n public saveInitial(): GridStackEngine {\r\n this.nodes.forEach(n => {\r\n n._origX = n.x;\r\n n._origY = n.y;\r\n n._origW = n.w;\r\n n._origH = n.h;\r\n delete n._dirty;\r\n });\r\n return this;\r\n }\r\n\r\n /**\r\n * call to cache the given layout internally to the given location so we can restore back when column changes size\r\n * @param nodes list of nodes\r\n * @param column corresponding column index to save it under\r\n * @param clear if true, will force other caches to be removed (default false)\r\n */\r\n public cacheLayout(nodes: GridStackNode[], column: number, clear = false): GridStackEngine {\r\n let copy: Layout[] = [];\r\n nodes.forEach((n, i) => {\r\n n._id = n._id || GridStackEngine._idSeq++; // make sure we have an id in case this is new layout, else re-use id already set\r\n copy[i] = {x: n.x, y: n.y, w: n.w, _id: n._id} // only thing we change is x,y,w and id to find it back\r\n });\r\n this._layouts = clear ? [] : this._layouts || []; // use array to find larger quick\r\n this._layouts[column] = copy;\r\n return this;\r\n }\r\n\r\n\r\n /** called to remove all internal values */\r\n public cleanupNode(node: GridStackNode): GridStackEngine {\r\n for (let prop in node) {\r\n if (prop[0] === '_') delete node[prop];\r\n }\r\n return this;\r\n }\r\n\r\n /** @internal legacy method renames */\r\n private getGridHeight = obsolete(this, GridStackEngine.prototype.getRow, 'getGridHeight', 'getRow', 'v1.0.0');\r\n}\r\n\r\n/** @internal class to store per column layout bare minimal info (subset of GridStackWidget) */\r\ninterface Layout {\r\n x: number;\r\n y: number;\r\n w: number;\r\n _id: number; // so we can find full node back\r\n}\r\n","// gridstack.ts 3.1.4 @preserve\r\n\r\n/**\r\n * https://gridstackjs.com/\r\n * (c) 2014-2020 Alain Dumesny, Dylan Weiss, Pavel Reznikov\r\n * gridstack.js may be freely distributed under the MIT license.\r\n*/\r\n\r\nimport { GridStackEngine } from './gridstack-engine';\r\nimport { obsoleteOpts, obsoleteAttr, Utils, HeightData } from './utils';\r\nimport { GridStackElement, GridItemHTMLElement, GridStackWidget, GridStackNode, GridStackOptions, numberOrString, ColumnOptions } from './types';\r\nimport { GridStackDDI } from './gridstack-ddi';\r\n\r\n// export all dependent file as well to make it easier for users to just import the main file\r\nexport * from './types';\r\nexport * from './utils';\r\nexport * from './gridstack-engine';\r\nexport * from './gridstack-ddi';\r\n\r\nexport interface GridHTMLElement extends HTMLElement {\r\n gridstack?: GridStack; // grid's parent DOM element points back to grid class\r\n}\r\nexport type GridStackEvent = 'added' | 'change' | 'disable' | 'dragstart' | 'dragstop' | 'dropped' |\r\n 'enable' | 'removed' | 'resizestart' | 'resizestop';\r\n\r\n/** Defines the coordinates of an object */\r\nexport interface MousePosition {\r\n top: number;\r\n left: number;\r\n}\r\n\r\n/** Defines the position of a cell inside the grid*/\r\nexport interface CellPosition {\r\n x: number;\r\n y: number;\r\n}\r\n\r\ninterface GridCSSStyleSheet extends CSSStyleSheet {\r\n _id?: string; // random id we will use to style us\r\n _max?: number; // internal tracker of the max # of rows we created\\\r\n}\r\n\r\n// default values for grid options - used during init and when saving out\r\nconst GridDefaults: GridStackOptions = {\r\n column: 12,\r\n minRow: 0,\r\n maxRow: 0,\r\n itemClass: 'grid-stack-item',\r\n placeholderClass: 'grid-stack-placeholder',\r\n placeholderText: '',\r\n handle: '.grid-stack-item-content',\r\n handleClass: null,\r\n styleInHead: false,\r\n cellHeight: 'auto',\r\n margin: 10,\r\n auto: true,\r\n minWidth: 768,\r\n float: false,\r\n staticGrid: false,\r\n animate: true,\r\n alwaysShowResizeHandle: false,\r\n resizable: {\r\n autoHide: true,\r\n handles: 'se'\r\n },\r\n draggable: {\r\n handle: '.grid-stack-item-content',\r\n scroll: false,\r\n appendTo: 'body'\r\n },\r\n dragIn: undefined,\r\n dragInOptions : {\r\n revert: 'invalid',\r\n handle: '.grid-stack-item-content',\r\n scroll: false,\r\n appendTo: 'body'\r\n },\r\n disableDrag: false,\r\n disableResize: false,\r\n rtl: 'auto',\r\n removable: false,\r\n removableOptions: {\r\n accept: '.grid-stack-item'\r\n },\r\n removeTimeout: 2000,\r\n marginUnit: 'px',\r\n cellHeightUnit: 'px',\r\n disableOneColumnMode: false,\r\n oneColumnModeDomSort: false\r\n};\r\n\r\n/**\r\n * Main gridstack class - you will need to call `GridStack.init()` first to initialize your grid.\r\n * Note: your grid elements MUST have the following classes for the CSS layout to work:\r\n * @example\r\n *
    \r\n *
    \r\n *
    Item 1
    \r\n *
    \r\n *
    \r\n */\r\nexport class GridStack {\r\n\r\n /**\r\n * initializing the HTML element, or selector string, into a grid will return the grid. Calling it again will\r\n * simply return the existing instance (ignore any passed options). There is also an initAll() version that support\r\n * multiple grids initialization at once. Or you can use addGrid() to create the entire grid from JSON.\r\n * @param options grid options (optional)\r\n * @param elOrString element or CSS selector (first one used) to convert to a grid (default to '.grid-stack' class selector)\r\n *\r\n * @example\r\n * let grid = GridStack.init();\r\n *\r\n * Note: the HTMLElement (of type GridHTMLElement) will store a `gridstack: GridStack` value that can be retrieve later\r\n * let grid = document.querySelector('.grid-stack').gridstack;\r\n */\r\n public static init(options: GridStackOptions = {}, elOrString: GridStackElement = '.grid-stack'): GridStack {\r\n let el = GridStack.getGridElement(elOrString);\r\n if (!el) {\r\n if (typeof elOrString === 'string') {\r\n console.error('GridStack.initAll() no grid was found with selector \"' + elOrString + '\" - element missing or wrong selector ?' +\r\n '\\nNote: \".grid-stack\" is required for proper CSS styling and drag/drop, and is the default selector.');\r\n } else {\r\n console.error('GridStack.init() no grid element was passed.');\r\n }\r\n return null;\r\n }\r\n if (!el.gridstack) {\r\n el.gridstack = new GridStack(el, {...options});\r\n }\r\n return el.gridstack\r\n }\r\n\r\n /**\r\n * Will initialize a list of elements (given a selector) and return an array of grids.\r\n * @param options grid options (optional)\r\n * @param selector elements selector to convert to grids (default to '.grid-stack' class selector)\r\n *\r\n * @example\r\n * let grids = GridStack.initAll();\r\n * grids.forEach(...)\r\n */\r\n public static initAll(options: GridStackOptions = {}, selector = '.grid-stack'): GridStack[] {\r\n let grids: GridStack[] = [];\r\n GridStack.getGridElements(selector).forEach(el => {\r\n if (!el.gridstack) {\r\n el.gridstack = new GridStack(el, {...options});\r\n }\r\n grids.push(el.gridstack);\r\n });\r\n if (grids.length === 0) {\r\n console.error('GridStack.initAll() no grid was found with selector \"' + selector + '\" - element missing or wrong selector ?' +\r\n '\\nNote: \".grid-stack\" is required for proper CSS styling and drag/drop, and is the default selector.');\r\n }\r\n return grids;\r\n }\r\n\r\n /**\r\n * call to create a grid with the given options, including loading any children from JSON structure. This will call GridStack.init(), then\r\n * grid.load() on any passed children (recursively). Great alternative to calling init() if you want entire grid to come from\r\n * JSON serialized data, including options.\r\n * @param parent HTML element parent to the grid\r\n * @param opt grids options used to initialize the grid, and list of children\r\n */\r\n public static addGrid(parent: HTMLElement, opt: GridStackOptions = {}): GridStack {\r\n if (!parent) { return null; }\r\n\r\n // create the grid element\r\n let doc = document.implementation.createHTMLDocument();\r\n doc.body.innerHTML = `
    `;\r\n let el = doc.body.children[0] as HTMLElement;\r\n parent.append(el);\r\n\r\n // create grid class and load any children\r\n let grid = GridStack.init(opt, el);\r\n if (opt.children) {\r\n grid.load(opt.children);\r\n }\r\n return grid;\r\n }\r\n\r\n /** scoping so users can call GridStack.Utils.sort() for example */\r\n public static Utils = Utils;\r\n\r\n /** scoping so users can call new GridStack.Engine(12) for example */\r\n public static Engine = GridStackEngine;\r\n\r\n /** the HTML element tied to this grid after it's been initialized */\r\n public el: GridHTMLElement;\r\n\r\n /** engine used to implement non DOM grid functionality */\r\n public engine: GridStackEngine;\r\n\r\n /** grid options - public for classes to access, but use methods to modify! */\r\n public opts: GridStackOptions;\r\n\r\n /** @internal */\r\n public placeholder: HTMLElement;\r\n /** @internal */\r\n private _oneColumnMode: boolean;\r\n /** @internal */\r\n private _prevColumn: number;\r\n /** @internal */\r\n private _ignoreLayoutsNodeChange: boolean;\r\n /** @internal */\r\n public _gsEventHandler = {};\r\n /** @internal */\r\n private _styles: GridCSSStyleSheet;\r\n /** @internal flag to keep cells square during resize */\r\n private _isAutoCellHeight: boolean;\r\n /** @internal track event binding to window resize so we can remove */\r\n private _windowResizeBind: () => GridStack;\r\n /** @internal true when loading items to insert first rather than append */\r\n private _insertNotAppend: boolean;\r\n\r\n /**\r\n * Construct a grid item from the given element and options\r\n * @param el\r\n * @param opts\r\n */\r\n public constructor(el: GridHTMLElement, opts: GridStackOptions = {}) {\r\n this.el = el; // exposed HTML element to the user\r\n opts = opts || {}; // handles null/undefined/0\r\n\r\n obsoleteOpts(opts, 'verticalMargin', 'margin', 'v2.0');\r\n\r\n obsoleteAttr(this.el, 'data-gs-current-height', 'gs-current-row', 'v1.0.0');\r\n\r\n // if row property exists, replace minRow and maxRow instead\r\n if (opts.row) {\r\n opts.minRow = opts.maxRow = opts.row;\r\n delete opts.row;\r\n }\r\n let rowAttr = Utils.toNumber(el.getAttribute('gs-row'));\r\n\r\n // elements attributes override any passed options (like CSS style) - merge the two together\r\n let defaults: GridStackOptions = {...GridDefaults,\r\n column: Utils.toNumber(el.getAttribute('gs-column')) || 12,\r\n minRow: rowAttr ? rowAttr : Utils.toNumber(el.getAttribute('gs-min-row')) || 0,\r\n maxRow: rowAttr ? rowAttr : Utils.toNumber(el.getAttribute('gs-max-row')) || 0,\r\n staticGrid: Utils.toBool(el.getAttribute('gs-static')) || false,\r\n _styleSheetClass: 'grid-stack-instance-' + (Math.random() * 10000).toFixed(0),\r\n alwaysShowResizeHandle: opts.alwaysShowResizeHandle || false,\r\n resizable: {\r\n autoHide: !(opts.alwaysShowResizeHandle || false),\r\n handles: 'se'\r\n },\r\n draggable: {\r\n handle: (opts.handleClass ? '.' + opts.handleClass : (opts.handle ? opts.handle : '')) || '.grid-stack-item-content',\r\n scroll: false,\r\n appendTo: 'body'\r\n },\r\n removableOptions: {\r\n accept: '.' + (opts.itemClass || 'grid-stack-item')\r\n },\r\n };\r\n if (el.getAttribute('gs-animate')) { // default to true, but if set to false use that instead\r\n defaults.animate = Utils.toBool(el.getAttribute('gs-animate'))\r\n }\r\n\r\n this.opts = Utils.defaults(opts, defaults);\r\n opts = null; // make sure we use this.opts instead\r\n this.initMargin();\r\n\r\n if (this.opts.rtl === 'auto') {\r\n this.opts.rtl = el.style.direction === 'rtl';\r\n }\r\n\r\n if (this.opts.rtl) {\r\n this.el.classList.add('grid-stack-rtl');\r\n }\r\n\r\n // check if we're been nested, and if so update our style and keep pointer around (used during save)\r\n let parentGridItemEl = Utils.closestByClass(this.el, GridDefaults.itemClass) as GridItemHTMLElement;\r\n if (parentGridItemEl && parentGridItemEl.gridstackNode) {\r\n this.opts._isNested = parentGridItemEl.gridstackNode;\r\n this.opts._isNested.subGrid = this;\r\n this.el.classList.add('grid-stack-nested');\r\n }\r\n\r\n this._isAutoCellHeight = (this.opts.cellHeight === 'auto');\r\n if (this._isAutoCellHeight) {\r\n // make the cell content square initially (will use resize event to keep it square)\r\n let marginDiff = - (this.opts.marginRight as number) - (this.opts.marginLeft as number)\r\n + (this.opts.marginTop as number) + (this.opts.marginBottom as number);\r\n this.cellHeight(this.cellWidth() + marginDiff, false);\r\n } else {\r\n this.cellHeight(this.opts.cellHeight, false);\r\n }\r\n\r\n this.el.classList.add(this.opts._styleSheetClass);\r\n\r\n this._setStaticClass();\r\n\r\n this.engine = new GridStackEngine({\r\n column: this.opts.column,\r\n float: this.opts.float,\r\n maxRow: this.opts.maxRow,\r\n onChange: (cbNodes, removeDOM = true) => {\r\n let maxH = 0;\r\n this.engine.nodes.forEach(n => { maxH = Math.max(maxH, n.y + n.h) });\r\n cbNodes.forEach(n => {\r\n let el = n.el;\r\n if (removeDOM && n._id === null) {\r\n if (el && el.parentNode) { el.parentNode.removeChild(el) }\r\n } else {\r\n this._writePosAttr(el, n.x, n.y, n.w, n.h);\r\n }\r\n });\r\n this._updateStyles(false, maxH); // false = don't recreate, just append if need be\r\n }\r\n });\r\n\r\n if (this.opts.auto) {\r\n this.batchUpdate(); // prevent in between re-layout #1535 TODO: this only set float=true, need to prevent collision check...\r\n let elements: {el: HTMLElement; i: number}[] = [];\r\n this.getGridItems().forEach(el => {\r\n let x = parseInt(el.getAttribute('gs-x'));\r\n let y = parseInt(el.getAttribute('gs-y'));\r\n elements.push({\r\n el,\r\n // if x,y are missing (autoPosition) add them to end of list - but keep their respective DOM order\r\n i: (Number.isNaN(x) ? 1000 : x) + (Number.isNaN(y) ? 1000 : y) * this.opts.column\r\n });\r\n });\r\n elements.sort(e => e.i).forEach(e => this._prepareElement(e.el));\r\n this.commit();\r\n }\r\n this.engine.saveInitial(); // initial start of items\r\n\r\n this.setAnimation(this.opts.animate);\r\n\r\n let placeholderChild = document.createElement('div');\r\n placeholderChild.className = 'placeholder-content';\r\n placeholderChild.innerHTML = this.opts.placeholderText;\r\n this.placeholder = document.createElement('div');\r\n this.placeholder.classList.add(this.opts.placeholderClass, defaults.itemClass, this.opts.itemClass);\r\n this.placeholder.appendChild(placeholderChild);\r\n\r\n this._updateStyles();\r\n\r\n this._setupDragIn();\r\n this._setupRemoveDrop();\r\n this._setupAcceptWidget();\r\n this._updateWindowResizeEvent(); // finally this may size us down to 1 column\r\n }\r\n\r\n /**\r\n * add a new widget and returns it.\r\n *\r\n * Widget will be always placed even if result height is more than actual grid height.\r\n * You need to use `willItFit()` before calling addWidget for additional check.\r\n * See also `makeWidget()`.\r\n *\r\n * @example\r\n * let grid = GridStack.init();\r\n * grid.addWidget({w: 3, content: 'hello'});\r\n * grid.addWidget('
    hello
    ', {w: 3});\r\n *\r\n * @param el GridStackWidget (which can have content string as well), html element, or string definition to add\r\n * @param options widget position/size options (optional, and ignore if first param is already option) - see GridStackWidget\r\n */\r\n public addWidget(els?: GridStackWidget | GridStackElement, options?: GridStackWidget): GridItemHTMLElement {\r\n\r\n // support legacy call for now ?\r\n if (arguments.length > 2) {\r\n console.warn('gridstack.ts: `addWidget(el, x, y, width...)` is deprecated. Use `addWidget({x, y, w, content, ...})`. It will be removed soon');\r\n // eslint-disable-next-line prefer-rest-params\r\n let a = arguments, i = 1,\r\n opt: GridStackWidget = { x:a[i++], y:a[i++], w:a[i++], h:a[i++], autoPosition:a[i++],\r\n minW:a[i++], maxW:a[i++], minH:a[i++], maxH:a[i++], id:a[i++] };\r\n return this.addWidget(els, opt);\r\n }\r\n\r\n function isGridStackWidget(w: GridStackWidget): w is GridStackWidget { // https://medium.com/ovrsea/checking-the-type-of-an-object-in-typescript-the-type-guards-24d98d9119b0\r\n return w.x !== undefined || w.y !== undefined || w.w !== undefined || w.h !== undefined || w.content !== undefined ? true : false;\r\n }\r\n\r\n let el: HTMLElement;\r\n if (typeof els === 'string') {\r\n let doc = document.implementation.createHTMLDocument();\r\n doc.body.innerHTML = els;\r\n el = doc.body.children[0] as HTMLElement;\r\n } else if (arguments.length === 0 || arguments.length === 1 && isGridStackWidget(els)) {\r\n let content = els ? (els as GridStackWidget).content || '' : '';\r\n options = els;\r\n let doc = document.implementation.createHTMLDocument();\r\n doc.body.innerHTML = `
    ${content}
    `;\r\n el = doc.body.children[0] as HTMLElement;\r\n } else {\r\n el = els as HTMLElement;\r\n }\r\n\r\n // Tempting to initialize the passed in opt with default and valid values, but this break knockout demos\r\n // as the actual value are filled in when _prepareElement() calls el.getAttribute('gs-xyz) before adding the node.\r\n // So make sure we load any DOM attributes that are not specified in passed in options (which override)\r\n let domAttr = this._readAttr(el);\r\n options = {...(options || {})}; // make a copy before we modify in case caller re-uses it\r\n Utils.defaults(options, domAttr);\r\n this.engine.prepareNode(options);\r\n this._writeAttr(el, options);\r\n\r\n if (this._insertNotAppend) {\r\n this.el.prepend(el);\r\n } else {\r\n this.el.appendChild(el);\r\n }\r\n\r\n // similar to makeWidget() that doesn't read attr again and worse re-create a new node and loose any _id\r\n this._prepareElement(el, true, options);\r\n this._updateContainerHeight();\r\n this._triggerAddEvent();\r\n this._triggerChangeEvent();\r\n\r\n return el;\r\n }\r\n\r\n /**\r\n * saves the current layout returning a list of widgets for serialization (with default to save content), which might include any nested grids.\r\n * Optionally you can also save the grid with options itself, so you can call the new GridStack.addGrid()\r\n * to recreate everything from scratch. GridStackOptions.children would then contain the widget list.\r\n */\r\n public save(saveContent = true, saveGridOpt = false): GridStackWidget[] | GridStackOptions {\r\n // return copied nodes we can modify at will...\r\n let list = this.engine.save(saveContent);\r\n\r\n // check for HTML content as well\r\n if (saveContent) {\r\n list.forEach(n => {\r\n if (n.el && !n.subGrid) { // sub-grid are saved differently, not plain content\r\n let sub = n.el.querySelector('.grid-stack-item-content');\r\n n.content = sub ? sub.innerHTML : undefined;\r\n if (!n.content) delete n.content;\r\n delete n.el;\r\n }\r\n });\r\n }\r\n\r\n // check if save entire grid options (needed for recursive) + children...\r\n if (saveGridOpt) {\r\n\r\n // check for nested grid\r\n list.forEach(n => {\r\n if (n.subGrid) {\r\n n.subGrid = (n.subGrid as GridStack).save(saveContent, saveGridOpt) as GridStackOptions;\r\n }\r\n })\r\n\r\n let o: GridStackOptions = {...this.opts};\r\n // delete default values that will be recreated on launch\r\n if (o.marginBottom === o.marginTop && o.marginRight === o.marginLeft && o.marginTop === o.marginRight) {\r\n o.margin = o.marginTop;\r\n delete o.marginTop; delete o.marginRight; delete o.marginBottom; delete o.marginLeft;\r\n }\r\n if (o.rtl === (this.el.style.direction === 'rtl')) { o.rtl = 'auto' }\r\n if (this._isAutoCellHeight) { o.cellHeight = 'auto' }\r\n Utils.removeInternalAndSame(o, GridDefaults);\r\n o.children = list;\r\n return o;\r\n }\r\n\r\n return list;\r\n }\r\n\r\n /**\r\n * load the widgets from a list. This will call update() on each (matching by id) or add/remove widgets that are not there.\r\n *\r\n * @param layout list of widgets definition to update/create\r\n * @param addAndRemove boolean (default true) or callback method can be passed to control if and how missing widgets can be added/removed, giving\r\n * the user control of insertion.\r\n *\r\n * @example\r\n * see http://gridstackjs.com/demo/serialization.html\r\n **/\r\n public load(layout: GridStackWidget[], addAndRemove: boolean | ((g: GridStack, w: GridStackWidget, add: boolean) => GridItemHTMLElement) = true): GridStack {\r\n let items = GridStack.Utils.sort(layout, -1, this._prevColumn || this.opts.column);\r\n this._insertNotAppend = true; // since create in reverse order...\r\n\r\n // if we're loading a layout into 1 column (_prevColumn is set only when going to 1) and items don't fit, make sure to save\r\n // the original wanted layout so we can scale back up correctly #1471\r\n if (this._prevColumn && this._prevColumn !== this.opts.column && items.some(n => (n.x + n.w) > this.opts.column)) {\r\n this._ignoreLayoutsNodeChange = true; // skip layout update\r\n this.engine.cacheLayout(items, this._prevColumn, true);\r\n }\r\n\r\n let removed: GridStackNode[] = [];\r\n this.batchUpdate();\r\n\r\n // see if any items are missing from new layout and need to be removed first\r\n if (addAndRemove) {\r\n let copyNodes = [...this.engine.nodes]; // don't loop through array you modify\r\n copyNodes.forEach(n => {\r\n let item = items.find(w => n.id === w.id);\r\n if (!item) {\r\n if (typeof(addAndRemove) === 'function') {\r\n addAndRemove(this, n, false);\r\n } else {\r\n removed.push(n); // batch keep track\r\n this.removeWidget(n.el, true, false);\r\n }\r\n }\r\n });\r\n }\r\n\r\n // now add/update the widgets\r\n items.forEach(w => {\r\n let item = (w.id || w.id === 0) ? this.engine.nodes.find(n => n.id === w.id) : undefined;\r\n if (item) {\r\n this.update(item.el, w);\r\n if (w.subGrid && (w.subGrid as GridStackOptions).children) { // update any sub grid as well\r\n let sub = item.el.querySelector('.grid-stack') as GridHTMLElement;\r\n if (sub && sub.gridstack) {\r\n sub.gridstack.load((w.subGrid as GridStackOptions).children); // TODO: support updating grid options ?\r\n this._insertNotAppend = true; // got reset by above call\r\n }\r\n }\r\n } else if (addAndRemove) {\r\n if (typeof(addAndRemove) === 'function') {\r\n w = addAndRemove(this, w, true).gridstackNode;\r\n } else {\r\n w = this.addWidget(w).gridstackNode;\r\n }\r\n if (w.subGrid) { // see if there is a sub-grid to create too\r\n let content = w.el.querySelector('.grid-stack-item-content') as HTMLElement;\r\n w.subGrid = GridStack.addGrid(content, w.subGrid as GridStackOptions);\r\n }\r\n }\r\n });\r\n\r\n this.engine.removedNodes = removed;\r\n this.commit();\r\n\r\n // after commit, clear that flag\r\n delete this._ignoreLayoutsNodeChange;\r\n delete this._insertNotAppend;\r\n return this;\r\n }\r\n\r\n /**\r\n * Initializes batch updates. You will see no changes until `commit()` method is called.\r\n */\r\n public batchUpdate(): GridStack {\r\n this.engine.batchUpdate();\r\n return this;\r\n }\r\n\r\n /**\r\n * Gets current cell height.\r\n */\r\n public getCellHeight(forcePixel = false): number {\r\n if (this.opts.cellHeight && this.opts.cellHeight !== 'auto' &&\r\n (!forcePixel || !this.opts.cellHeightUnit || this.opts.cellHeightUnit === 'px')) {\r\n return this.opts.cellHeight as number;\r\n }\r\n // else get first cell height\r\n // or do entire grid and # of rows ? (this.el.getBoundingClientRect().height) / parseInt(this.el.getAttribute('gs-current-row'))\r\n let el = this.el.querySelector('.' + this.opts.itemClass) as HTMLElement;\r\n let height = Utils.toNumber(el.getAttribute('gs-h'));\r\n return Math.round(el.offsetHeight / height);\r\n }\r\n\r\n /**\r\n * Update current cell height - see `GridStackOptions.cellHeight` for format.\r\n * This method rebuilds an internal CSS style sheet.\r\n * Note: You can expect performance issues if call this method too often.\r\n *\r\n * @param val the cell height\r\n * @param update (Optional) if false, styles will not be updated\r\n *\r\n * @example\r\n * grid.cellHeight(grid.cellWidth() * 1.2);\r\n */\r\n public cellHeight(val: numberOrString, update = true): GridStack {\r\n let data = Utils.parseHeight(val);\r\n if (this.opts.cellHeightUnit === data.unit && this.opts.cellHeight === data.h) {\r\n return this;\r\n }\r\n this.opts.cellHeightUnit = data.unit;\r\n this.opts.cellHeight = data.h;\r\n\r\n if (update) {\r\n this._updateStyles(true); // true = force re-create\r\n }\r\n this._resizeNestedGrids(this.el);\r\n return this;\r\n }\r\n\r\n /**\r\n * Gets current cell width.\r\n */\r\n public cellWidth(): number {\r\n // use parent width if we're 0 (no size yet)\r\n return (this.el.offsetWidth || this.el.parentElement.offsetWidth || window.innerWidth) / this.opts.column;\r\n }\r\n\r\n /**\r\n * Finishes batch updates. Updates DOM nodes. You must call it after batchUpdate.\r\n */\r\n public commit(): GridStack {\r\n this.engine.commit();\r\n this._triggerRemoveEvent();\r\n this._triggerAddEvent();\r\n this._triggerChangeEvent();\r\n return this;\r\n }\r\n\r\n /** re-layout grid items to reclaim any empty space */\r\n public compact(): GridStack {\r\n this.engine.compact();\r\n this._triggerChangeEvent();\r\n return this;\r\n }\r\n\r\n /**\r\n * set the number of columns in the grid. Will update existing widgets to conform to new number of columns,\r\n * as well as cache the original layout so you can revert back to previous positions without loss.\r\n * Requires `gridstack-extra.css` or `gridstack-extra.min.css` for [2-11],\r\n * else you will need to generate correct CSS (see https://github.com/gridstack/gridstack.js#change-grid-columns)\r\n * @param column - Integer > 0 (default 12).\r\n * @param layout specify the type of re-layout that will happen (position, size, etc...).\r\n * Note: items will never be outside of the current column boundaries. default (moveScale). Ignored for 1 column\r\n */\r\n public column(column: number, layout: ColumnOptions = 'moveScale'): GridStack {\r\n if (this.opts.column === column) { return this; }\r\n let oldColumn = this.opts.column;\r\n\r\n // if we go into 1 column mode (which happens if we're sized less than minW unless disableOneColumnMode is on)\r\n // then remember the original columns so we can restore.\r\n if (column === 1) {\r\n this._prevColumn = oldColumn;\r\n } else {\r\n delete this._prevColumn;\r\n }\r\n\r\n this.el.classList.remove('grid-stack-' + oldColumn);\r\n this.el.classList.add('grid-stack-' + column);\r\n this.opts.column = this.engine.column = column;\r\n\r\n // update the items now - see if the dom order nodes should be passed instead (else default to current list)\r\n let domNodes: GridStackNode[];\r\n if (column === 1 && this.opts.oneColumnModeDomSort) {\r\n domNodes = [];\r\n this.getGridItems().forEach(el => {\r\n if (el.gridstackNode) { domNodes.push(el.gridstackNode); }\r\n });\r\n if (!domNodes.length) { domNodes = undefined; }\r\n }\r\n this.engine.updateNodeWidths(oldColumn, column, domNodes, layout);\r\n\r\n // and trigger our event last...\r\n this._ignoreLayoutsNodeChange = true; // skip layout update\r\n this._triggerChangeEvent();\r\n delete this._ignoreLayoutsNodeChange;\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * get the number of columns in the grid (default 12)\r\n */\r\n public getColumn(): number {\r\n return this.opts.column;\r\n }\r\n\r\n /** returns an array of grid HTML elements (no placeholder) - used to iterate through our children */\r\n public getGridItems(): GridItemHTMLElement[] {\r\n return Array.from(this.el.children)\r\n .filter((el: HTMLElement) => el.matches('.' + this.opts.itemClass) && !el.matches('.' + this.opts.placeholderClass)) as GridItemHTMLElement[];\r\n }\r\n\r\n /**\r\n * Destroys a grid instance. DO NOT CALL any methods or access any vars after this as it will free up members.\r\n * @param removeDOM if `false` grid and items HTML elements will not be removed from the DOM (Optional. Default `true`).\r\n */\r\n public destroy(removeDOM = true): GridStack {\r\n if (!this.el) { return; } // prevent multiple calls\r\n this._updateWindowResizeEvent(true);\r\n this.setStatic(true); // permanently removes DD\r\n if (!removeDOM) {\r\n this.removeAll(removeDOM);\r\n this.el.classList.remove(this.opts._styleSheetClass);\r\n } else {\r\n this.el.parentNode.removeChild(this.el);\r\n }\r\n this._removeStylesheet();\r\n delete this.opts._isNested;\r\n delete this.opts;\r\n delete this.placeholder;\r\n delete this.engine;\r\n delete this.el.gridstack; // remove circular dependency that would prevent a freeing\r\n delete this.el;\r\n return this;\r\n }\r\n\r\n /**\r\n * Temporarily disables widgets moving/resizing.\r\n * If you want a more permanent way (which freezes up resources) use `setStatic(true)` instead.\r\n * Note: no-op for static grid\r\n * This is a shortcut for:\r\n * @example\r\n * grid.enableMove(false);\r\n * grid.enableResize(false);\r\n */\r\n public disable(): GridStack {\r\n if (this.opts.staticGrid) { return; }\r\n this.enableMove(false);\r\n this.enableResize(false);\r\n this._triggerEvent('disable');\r\n return this;\r\n }\r\n\r\n /**\r\n * Re-enables widgets moving/resizing - see disable().\r\n * Note: no-op for static grid.\r\n * This is a shortcut for:\r\n * @example\r\n * grid.enableMove(true);\r\n * grid.enableResize(true);\r\n */\r\n public enable(): GridStack {\r\n if (this.opts.staticGrid) { return; }\r\n this.enableMove(true);\r\n this.enableResize(true);\r\n this._triggerEvent('enable');\r\n return this;\r\n }\r\n\r\n /**\r\n * Enables/disables widget moving. No-op for static grids.\r\n *\r\n * @param doEnable\r\n * @param includeNewWidgets will force new widgets to be draggable as per\r\n * doEnable`s value by changing the disableDrag grid option (default: true).\r\n */\r\n public enableMove(doEnable: boolean, includeNewWidgets = true): GridStack {\r\n if (this.opts.staticGrid) { return this; } // can't move a static grid!\r\n this.getGridItems().forEach(el => this.movable(el, doEnable));\r\n if (includeNewWidgets) {\r\n this.opts.disableDrag = !doEnable;\r\n }\r\n return this;\r\n }\r\n\r\n /**\r\n * Enables/disables widget resizing. No-op for static grids.\r\n * @param doEnable\r\n * @param includeNewWidgets will force new widgets to be draggable as per\r\n * doEnable`s value by changing the disableResize grid option (default: true).\r\n */\r\n public enableResize(doEnable: boolean, includeNewWidgets = true): GridStack {\r\n if (this.opts.staticGrid) { return this; } // can't size a static grid!\r\n this.getGridItems().forEach(el => this.resizable(el, doEnable));\r\n if (includeNewWidgets) {\r\n this.opts.disableResize = !doEnable;\r\n }\r\n return this;\r\n }\r\n\r\n /**\r\n * enable/disable floating widgets (default: `false`) See [example](http://gridstackjs.com/demo/float.html)\r\n */\r\n public float(val: boolean): GridStack {\r\n /*\r\n if (val === undefined) {\r\n // TODO: should we support and/or change signature ? figure this soon...\r\n console.warn('gridstack.ts: getter `float()` is deprecated in 2.x and has been replaced by `getFloat()`. It will be **completely** removed soon');\r\n return this.getFloat();\r\n }\r\n */\r\n this.engine.float = val;\r\n this._triggerChangeEvent();\r\n return this;\r\n }\r\n\r\n /**\r\n * get the current float mode\r\n */\r\n public getFloat(): boolean {\r\n return this.engine.float;\r\n }\r\n\r\n /**\r\n * Get the position of the cell under a pixel on screen.\r\n * @param position the position of the pixel to resolve in\r\n * absolute coordinates, as an object with top and left properties\r\n * @param useDocRelative if true, value will be based on document position vs parent position (Optional. Default false).\r\n * Useful when grid is within `position: relative` element\r\n *\r\n * Returns an object with properties `x` and `y` i.e. the column and row in the grid.\r\n */\r\n public getCellFromPixel(position: MousePosition, useDocRelative = false): CellPosition {\r\n let box = this.el.getBoundingClientRect();\r\n // console.log(`getBoundingClientRect left: ${box.left} top: ${box.top} w: ${box.w} h: ${box.h}`)\r\n let containerPos;\r\n if (useDocRelative) {\r\n containerPos = {top: box.top + document.documentElement.scrollTop, left: box.left};\r\n // console.log(`getCellFromPixel scrollTop: ${document.documentElement.scrollTop}`)\r\n } else {\r\n containerPos = {top: this.el.offsetTop, left: this.el.offsetLeft}\r\n // console.log(`getCellFromPixel offsetTop: ${containerPos.left} offsetLeft: ${containerPos.top}`)\r\n }\r\n let relativeLeft = position.left - containerPos.left;\r\n let relativeTop = position.top - containerPos.top;\r\n\r\n let columnWidth = (box.width / this.opts.column);\r\n let rowHeight = (box.height / parseInt(this.el.getAttribute('gs-current-row')));\r\n\r\n return {x: Math.floor(relativeLeft / columnWidth), y: Math.floor(relativeTop / rowHeight)};\r\n }\r\n\r\n /** returns the current number of rows, which will be at least `minRow` if set */\r\n public getRow(): number {\r\n return Math.max(this.engine.getRow(), this.opts.minRow);\r\n }\r\n\r\n /**\r\n * Checks if specified area is empty.\r\n * @param x the position x.\r\n * @param y the position y.\r\n * @param w the width of to check\r\n * @param h the height of to check\r\n */\r\n public isAreaEmpty(x: number, y: number, w: number, h: number): boolean {\r\n return this.engine.isAreaEmpty(x, y, w, h);\r\n }\r\n\r\n /**\r\n * If you add elements to your grid by hand, you have to tell gridstack afterwards to make them widgets.\r\n * If you want gridstack to add the elements for you, use `addWidget()` instead.\r\n * Makes the given element a widget and returns it.\r\n * @param els widget or single selector to convert.\r\n *\r\n * @example\r\n * let grid = GridStack.init();\r\n * grid.el.appendChild('
    ');\r\n * grid.makeWidget('#gsi-1');\r\n */\r\n public makeWidget(els: GridStackElement): GridItemHTMLElement {\r\n let el = GridStack.getElement(els);\r\n this._prepareElement(el, true);\r\n this._updateContainerHeight();\r\n this._triggerAddEvent();\r\n this._triggerChangeEvent();\r\n return el;\r\n }\r\n\r\n /**\r\n * Event handler that extracts our CustomEvent data out automatically for receiving custom\r\n * notifications (see doc for supported events)\r\n * @param name of the event (see possible values) or list of names space separated\r\n * @param callback function called with event and optional second/third param\r\n * (see README documentation for each signature).\r\n *\r\n * @example\r\n * grid.on('added', function(e, items) { log('added ', items)} );\r\n * or\r\n * grid.on('added removed change', function(e, items) { log(e.type, items)} );\r\n *\r\n * Note: in some cases it is the same as calling native handler and parsing the event.\r\n * grid.el.addEventListener('added', function(event) { log('added ', event.detail)} );\r\n *\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n public on(name: GridStackEvent, callback: (event: Event, arg2?: GridItemHTMLElement | GridStackNode[]) => void): GridStack {\r\n // check for array of names being passed instead\r\n if (name.indexOf(' ') !== -1) {\r\n let names = name.split(' ') as GridStackEvent[];\r\n names.forEach(name => this.on(name, callback));\r\n return this;\r\n }\r\n\r\n if (name === 'change' || name === 'added' || name === 'removed' || name === 'enable' || name === 'disable') {\r\n // native CustomEvent handlers - cash the generic handlers so we can easily remove\r\n let noData = (name === 'enable' || name === 'disable');\r\n if (noData) {\r\n this._gsEventHandler[name] = (event: Event) => callback(event);\r\n } else {\r\n this._gsEventHandler[name] = (event: CustomEvent) => callback(event, event.detail);\r\n }\r\n this.el.addEventListener(name, this._gsEventHandler[name]);\r\n } else if (name === 'dragstart' || name === 'dragstop' || name === 'resizestart' || name === 'resizestop' || name === 'dropped') {\r\n // drag&drop stop events NEED to be call them AFTER we update node attributes so handle them ourself.\r\n // do same for start event to make it easier...\r\n this._gsEventHandler[name] = callback;\r\n } else {\r\n console.log('GridStack.on(' + name + ') event not supported, but you can still use $(\".grid-stack\").on(...) while jquery-ui is still used internally.');\r\n }\r\n return this;\r\n }\r\n\r\n /**\r\n * unsubscribe from the 'on' event below\r\n * @param name of the event (see possible values)\r\n */\r\n public off(name: GridStackEvent): GridStack {\r\n // check for array of names being passed instead\r\n if (name.indexOf(' ') !== -1) {\r\n let names = name.split(' ') as GridStackEvent[];\r\n names.forEach(name => this.off(name));\r\n return this;\r\n }\r\n\r\n if (name === 'change' || name === 'added' || name === 'removed' || name === 'enable' || name === 'disable') {\r\n // remove native CustomEvent handlers\r\n if (this._gsEventHandler[name]) {\r\n this.el.removeEventListener(name, this._gsEventHandler[name]);\r\n }\r\n }\r\n delete this._gsEventHandler[name];\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Removes widget from the grid.\r\n * @param el widget or selector to modify\r\n * @param removeDOM if `false` DOM element won't be removed from the tree (Default? true).\r\n * @param triggerEvent if `false` (quiet mode) element will not be added to removed list and no 'removed' callbacks will be called (Default? true).\r\n */\r\n public removeWidget(els: GridStackElement, removeDOM = true, triggerEvent = true): GridStack {\r\n GridStack.getElements(els).forEach(el => {\r\n if (el.parentElement !== this.el) return; // not our child!\r\n let node = el.gridstackNode;\r\n // For Meteor support: https://github.com/gridstack/gridstack.js/pull/272\r\n if (!node) {\r\n node = this.engine.nodes.find(n => el === n.el);\r\n }\r\n if (!node) return;\r\n\r\n // remove our DOM data (circular link) and drag&drop permanently\r\n delete el.gridstackNode;\r\n GridStackDDI.get().remove(el);\r\n\r\n this.engine.removeNode(node, removeDOM, triggerEvent);\r\n\r\n if (removeDOM && el.parentElement) {\r\n el.remove(); // in batch mode engine.removeNode doesn't call back to remove DOM\r\n }\r\n });\r\n if (triggerEvent) {\r\n this._triggerRemoveEvent();\r\n this._triggerChangeEvent();\r\n }\r\n return this;\r\n }\r\n\r\n /**\r\n * Removes all widgets from the grid.\r\n * @param removeDOM if `false` DOM elements won't be removed from the tree (Default? `true`).\r\n */\r\n public removeAll(removeDOM = true): GridStack {\r\n // always remove our DOM data (circular link) before list gets emptied and drag&drop permanently\r\n this.engine.nodes.forEach(n => {\r\n delete n.el.gridstackNode;\r\n GridStackDDI.get().remove(n.el);\r\n });\r\n this.engine.removeAll(removeDOM);\r\n this._triggerRemoveEvent();\r\n return this;\r\n }\r\n\r\n /**\r\n * Toggle the grid animation state. Toggles the `grid-stack-animate` class.\r\n * @param doAnimate if true the grid will animate.\r\n */\r\n public setAnimation(doAnimate: boolean): GridStack {\r\n if (doAnimate) {\r\n this.el.classList.add('grid-stack-animate');\r\n } else {\r\n this.el.classList.remove('grid-stack-animate');\r\n }\r\n return this;\r\n }\r\n\r\n /**\r\n * Toggle the grid static state, which permanently removes/add Drag&Drop support, unlike disable()/enable() that just turns it off/on.\r\n * Also toggle the grid-stack-static class.\r\n * @param val if true the grid become static.\r\n */\r\n public setStatic(val: boolean): GridStack {\r\n if (this.opts.staticGrid === val) { return this; }\r\n this.opts.staticGrid = val;\r\n this.engine.nodes.forEach(n => this._prepareDragDropByNode(n)); // either delete Drag&drop or initialize it\r\n this._setStaticClass();\r\n return this;\r\n }\r\n\r\n /**\r\n * Updates widget position/size and other info. Note: if you need to call this on all nodes, use load() instead which will update what changed.\r\n * @param els widget or selector of objects to modify (note: setting the same x,y for multiple items will be indeterministic and likely unwanted)\r\n * @param opt new widget options (x,y,w,h, etc..). Only those set will be updated.\r\n */\r\n public update(els: GridStackElement, opt: GridStackWidget): GridStack {\r\n\r\n // support legacy call for now ?\r\n if (arguments.length > 2) {\r\n console.warn('gridstack.ts: `update(el, x, y, w, h)` is deprecated. Use `update({x, w, content, ...})`. It will be removed soon');\r\n // eslint-disable-next-line prefer-rest-params\r\n let a = arguments, i = 1;\r\n opt = { x:a[i++], y:a[i++], w:a[i++], h:a[i++] };\r\n return this.update(els, opt);\r\n }\r\n\r\n GridStack.getElements(els).forEach(el => {\r\n if (!el || !el.gridstackNode) { return; }\r\n let n = el.gridstackNode;\r\n let w = {...opt}; // make a copy we can modify in case they re-use it or multiple items\r\n delete w.autoPosition;\r\n\r\n // move/resize widget if anything changed\r\n let keys = ['x', 'y', 'w', 'h'];\r\n let m: GridStackWidget;\r\n if (keys.some(k => w[k] !== undefined && w[k] !== n[k])) {\r\n m = {};\r\n keys.forEach(k => {\r\n m[k] = (w[k] !== undefined) ? w[k] : n[k];\r\n delete w[k];\r\n });\r\n }\r\n // for a move as well IFF there is any min/max fields set\r\n if (!m && (w.minW || w.minH || w.maxW || w.maxH)) {\r\n m = {}; // will use node position but validate values\r\n }\r\n\r\n // check for content changing\r\n if (w.content) {\r\n let sub = el.querySelector('.grid-stack-item-content');\r\n if (sub && sub.innerHTML !== w.content) {\r\n sub.innerHTML = w.content;\r\n }\r\n delete w.content;\r\n }\r\n\r\n // any remaining fields are assigned, but check for dragging changes, resize constrain\r\n let changed = false;\r\n let ddChanged = false;\r\n for (const key in w) {\r\n if (key[0] !== '_' && n[key] !== w[key]) {\r\n n[key] = w[key];\r\n changed = true;\r\n ddChanged = ddChanged || (!this.opts.staticGrid && (key === 'noResize' || key === 'noMove' || key === 'locked'));\r\n }\r\n }\r\n\r\n // finally move the widget\r\n if (m) {\r\n this.engine.cleanNodes();\r\n this.engine.beginUpdate(n);\r\n this.engine.moveNode(n, m.x, m.y, m.w, m.h);\r\n this._updateContainerHeight();\r\n this._triggerChangeEvent();\r\n this.engine.endUpdate();\r\n }\r\n if (changed) { // move will only update x,y,w,h so update the rest too\r\n this._writeAttr(el, n);\r\n }\r\n if (ddChanged) {\r\n this._prepareDragDropByNode(n);\r\n }\r\n });\r\n return this;\r\n }\r\n\r\n /**\r\n * 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).\r\n * @param value margin value\r\n */\r\n public margin(value: numberOrString): GridStack {\r\n let isMultiValue = (typeof value === 'string' && value.split(' ').length > 1);\r\n // check if we can skip re-creating our CSS file... won't check if multi values (too much hassle)\r\n if (!isMultiValue) {\r\n let data = Utils.parseHeight(value);\r\n if (this.opts.marginUnit === data.unit && this.opts.margin === data.h) return;\r\n }\r\n // re-use existing margin handling\r\n this.opts.margin = value;\r\n this.opts.marginTop = this.opts.marginBottom = this.opts.marginLeft = this.opts.marginRight = undefined;\r\n this.initMargin();\r\n\r\n this._updateStyles(true); // true = force re-create\r\n\r\n return this;\r\n }\r\n\r\n /** returns current margin number value (undefined if 4 sides don't match) */\r\n public getMargin(): number { return this.opts.margin as number; }\r\n\r\n /**\r\n * Returns true if the height of the grid will be less than the vertical\r\n * constraint. Always returns true if grid doesn't have height constraint.\r\n * @param node contains x,y,w,h,auto-position options\r\n *\r\n * @example\r\n * if (grid.willItFit(newWidget)) {\r\n * grid.addWidget(newWidget);\r\n * } else {\r\n * alert('Not enough free space to place the widget');\r\n * }\r\n */\r\n public willItFit(node: GridStackWidget): boolean {\r\n // support legacy call for now\r\n if (arguments.length > 1) {\r\n console.warn('gridstack.ts: `willItFit(x,y,w,h,autoPosition)` is deprecated. Use `willItFit({x, y,...})`. It will be removed soon');\r\n // eslint-disable-next-line prefer-rest-params\r\n let a = arguments, i = 0,\r\n w: GridStackWidget = { x:a[i++], y:a[i++], w:a[i++], h:a[i++], autoPosition:a[i++] };\r\n return this.willItFit(w);\r\n }\r\n return this.engine.willItFit(node);\r\n }\r\n\r\n /** @internal */\r\n private _triggerChangeEvent(): GridStack {\r\n if (this.engine.batchMode) { return this; }\r\n let elements = this.engine.getDirtyNodes(true); // verify they really changed\r\n if (elements && elements.length) {\r\n if (!this._ignoreLayoutsNodeChange) {\r\n this.engine.layoutsNodesChange(elements);\r\n }\r\n this._triggerEvent('change', elements);\r\n }\r\n this.engine.saveInitial(); // we called, now reset initial values & dirty flags\r\n return this;\r\n }\r\n\r\n /** @internal */\r\n private _triggerAddEvent(): GridStack {\r\n if (this.engine.batchMode) { return this }\r\n if (this.engine.addedNodes && this.engine.addedNodes.length > 0) {\r\n if (!this._ignoreLayoutsNodeChange) {\r\n this.engine.layoutsNodesChange(this.engine.addedNodes);\r\n }\r\n // prevent added nodes from also triggering 'change' event (which is called next)\r\n this.engine.addedNodes.forEach(n => { delete n._dirty; });\r\n this._triggerEvent('added', this.engine.addedNodes);\r\n this.engine.addedNodes = [];\r\n }\r\n return this;\r\n }\r\n\r\n /** @internal */\r\n public _triggerRemoveEvent(): GridStack {\r\n if (this.engine.batchMode) { return this; }\r\n if (this.engine.removedNodes && this.engine.removedNodes.length > 0) {\r\n this._triggerEvent('removed', this.engine.removedNodes);\r\n this.engine.removedNodes = [];\r\n }\r\n return this;\r\n }\r\n\r\n /** @internal */\r\n private _triggerEvent(name: string, data?: GridStackNode[]): GridStack {\r\n let event = data ? new CustomEvent(name, {bubbles: false, detail: data}) : new Event(name);\r\n this.el.dispatchEvent(event);\r\n return this;\r\n }\r\n\r\n /** @internal called to delete the current dynamic style sheet used for our layout */\r\n private _removeStylesheet(): GridStack {\r\n\r\n if (this._styles) {\r\n Utils.removeStylesheet(this._styles._id);\r\n delete this._styles;\r\n }\r\n return this;\r\n }\r\n\r\n /** @internal updated/create the CSS styles for row based layout and initial margin setting */\r\n private _updateStyles(forceUpdate = false, maxH?: number): GridStack {\r\n // call to delete existing one if we change cellHeight / margin\r\n if (forceUpdate) {\r\n this._removeStylesheet();\r\n }\r\n\r\n this._updateContainerHeight();\r\n\r\n // if user is telling us they will handle the CSS themselves by setting heights to 0. Do we need this opts really ??\r\n if (this.opts.cellHeight === 0) {\r\n return this;\r\n }\r\n\r\n let cellHeight = this.opts.cellHeight as number;\r\n let cellHeightUnit = this.opts.cellHeightUnit;\r\n let prefix = `.${this.opts._styleSheetClass} > .${this.opts.itemClass}`;\r\n\r\n // create one as needed\r\n if (!this._styles) {\r\n let id = 'gridstack-style-' + (Math.random() * 100000).toFixed();\r\n // insert style to parent (instead of 'head' by default) to support WebComponent\r\n let styleLocation = this.opts.styleInHead ? undefined : this.el.parentNode as HTMLElement;\r\n this._styles = Utils.createStylesheet(id, styleLocation);\r\n if (!this._styles) { return this; }\r\n this._styles._id = id;\r\n this._styles._max = 0;\r\n\r\n // these are done once only\r\n Utils.addCSSRule(this._styles, prefix, `min-height: ${cellHeight}${cellHeightUnit}`);\r\n // content margins\r\n let top: string = this.opts.marginTop + this.opts.marginUnit;\r\n let bottom: string = this.opts.marginBottom + this.opts.marginUnit;\r\n let right: string = this.opts.marginRight + this.opts.marginUnit;\r\n let left: string = this.opts.marginLeft + this.opts.marginUnit;\r\n let content = `${prefix} > .grid-stack-item-content`;\r\n let placeholder = `.${this.opts._styleSheetClass} > .grid-stack-placeholder > .placeholder-content`;\r\n Utils.addCSSRule(this._styles, content, `top: ${top}; right: ${right}; bottom: ${bottom}; left: ${left};`);\r\n Utils.addCSSRule(this._styles, placeholder, `top: ${top}; right: ${right}; bottom: ${bottom}; left: ${left};`);\r\n // resize handles offset (to match margin)\r\n Utils.addCSSRule(this._styles, `${prefix} > .ui-resizable-ne`, `right: ${right}`);\r\n Utils.addCSSRule(this._styles, `${prefix} > .ui-resizable-e`, `right: ${right}`);\r\n Utils.addCSSRule(this._styles, `${prefix} > .ui-resizable-se`, `right: ${right}; bottom: ${bottom}`);\r\n Utils.addCSSRule(this._styles, `${prefix} > .ui-resizable-nw`, `left: ${left}`);\r\n Utils.addCSSRule(this._styles, `${prefix} > .ui-resizable-w`, `left: ${left}`);\r\n Utils.addCSSRule(this._styles, `${prefix} > .ui-resizable-sw`, `left: ${left}; bottom: ${bottom}`);\r\n }\r\n\r\n // now update the height specific fields\r\n maxH = maxH || this._styles._max;\r\n if (maxH > this._styles._max) {\r\n let getHeight = (rows: number): string => (cellHeight * rows) + cellHeightUnit;\r\n for (let i = this._styles._max + 1; i <= maxH; i++) { // start at 1\r\n let h: string = getHeight(i);\r\n Utils.addCSSRule(this._styles, `${prefix}[gs-y=\"${i-1}\"]`, `top: ${getHeight(i-1)}`); // start at 0\r\n Utils.addCSSRule(this._styles, `${prefix}[gs-h=\"${i}\"]`, `height: ${h}`);\r\n Utils.addCSSRule(this._styles, `${prefix}[gs-min-h=\"${i}\"]`, `min-height: ${h}`);\r\n Utils.addCSSRule(this._styles, `${prefix}[gs-max-h=\"${i}\"]`, `max-height: ${h}`);\r\n }\r\n this._styles._max = maxH;\r\n }\r\n return this;\r\n }\r\n\r\n /** @internal */\r\n private _updateContainerHeight(): GridStack {\r\n if (!this.engine || this.engine.batchMode) { return this; }\r\n let row = this.getRow(); // checks for minRow already\r\n // check for css min height\r\n let cssMinHeight = parseInt(getComputedStyle(this.el)['min-height']);\r\n if (cssMinHeight > 0) {\r\n let minRow = Math.round(cssMinHeight / this.getCellHeight(true));\r\n if (row < minRow) {\r\n row = minRow;\r\n }\r\n }\r\n this.el.setAttribute('gs-current-row', String(row));\r\n if (row === 0) {\r\n this.el.style.removeProperty('height');\r\n return this;\r\n }\r\n let cellHeight = this.opts.cellHeight as number;\r\n let unit = this.opts.cellHeightUnit;\r\n if (!cellHeight) { return this }\r\n this.el.style.height = row * cellHeight + unit;\r\n return this;\r\n }\r\n\r\n /** called to resize children nested grids when we/item resizes */\r\n private _resizeNestedGrids(target: HTMLElement): GridStack {\r\n target.querySelectorAll('.grid-stack').forEach((el: GridHTMLElement) => {\r\n if (el.gridstack) {\r\n el.gridstack.onParentResize();\r\n }});\r\n return this;\r\n }\r\n\r\n\r\n /** @internal */\r\n private _prepareElement(el: GridItemHTMLElement, triggerAddEvent = false, node?: GridStackNode): GridStack {\r\n if (!node) {\r\n el.classList.add(this.opts.itemClass);\r\n node = this._readAttr(el);\r\n }\r\n el.gridstackNode = node;\r\n node.el = el;\r\n node.grid = this;\r\n let copy = {...node};\r\n node = this.engine.addNode(node, triggerAddEvent);\r\n // write node attr back in case there was collision or we have to fix bad values during addNode()\r\n if (!Utils.same(node, copy)) {\r\n this._writeAttr(el, node);\r\n }\r\n this._prepareDragDropByNode(node);\r\n return this;\r\n }\r\n\r\n /** @internal call to write x,y,w,h attributes back to element */\r\n private _writePosAttr(el: HTMLElement, x?: number, y?: number, w?: number, h?: number): GridStack {\r\n if (x !== undefined && x !== null) { el.setAttribute('gs-x', String(x)); }\r\n if (y !== undefined && y !== null) { el.setAttribute('gs-y', String(y)); }\r\n if (w) { el.setAttribute('gs-w', String(w)); }\r\n if (h) { el.setAttribute('gs-h', String(h)); }\r\n return this;\r\n }\r\n\r\n /** @internal call to write any default attributes back to element */\r\n private _writeAttr(el: HTMLElement, node: GridStackWidget): GridStack {\r\n if (!node) return this;\r\n this._writePosAttr(el, node.x, node.y, node.w, node.h);\r\n\r\n let attrs /*: GridStackWidget but strings */ = { // remaining attributes\r\n autoPosition: 'gs-auto-position',\r\n minW: 'gs-min-w',\r\n minH: 'gs-min-h',\r\n maxW: 'gs-max-w',\r\n maxH: 'gs-max-h',\r\n noResize: 'gs-no-resize',\r\n noMove: 'gs-no-move',\r\n locked: 'gs-locked',\r\n id: 'gs-id',\r\n resizeHandles: 'gs-resize-handles'\r\n };\r\n for (const key in attrs) {\r\n if (node[key]) { // 0 is valid for x,y only but done above already and not in list anyway\r\n el.setAttribute(attrs[key], String(node[key]));\r\n } else {\r\n el.removeAttribute(attrs[key]);\r\n }\r\n }\r\n return this;\r\n }\r\n\r\n /** @internal call to read any default attributes from element */\r\n private _readAttr(el: HTMLElement): GridStackWidget {\r\n let node: GridStackNode = {};\r\n node.x = Utils.toNumber(el.getAttribute('gs-x'));\r\n node.y = Utils.toNumber(el.getAttribute('gs-y'));\r\n node.w = Utils.toNumber(el.getAttribute('gs-w'));\r\n node.h = Utils.toNumber(el.getAttribute('gs-h'));\r\n node.maxW = Utils.toNumber(el.getAttribute('gs-max-w'));\r\n node.minW = Utils.toNumber(el.getAttribute('gs-min-w'));\r\n node.maxH = Utils.toNumber(el.getAttribute('gs-max-h'));\r\n node.minH = Utils.toNumber(el.getAttribute('gs-min-h'));\r\n node.autoPosition = Utils.toBool(el.getAttribute('gs-auto-position'));\r\n node.noResize = Utils.toBool(el.getAttribute('gs-no-resize'));\r\n node.noMove = Utils.toBool(el.getAttribute('gs-no-move'));\r\n node.locked = Utils.toBool(el.getAttribute('gs-locked'));\r\n node.resizeHandles = el.getAttribute('gs-resize-handles');\r\n node.id = el.getAttribute('gs-id');\r\n\r\n // remove any key not found (null or false which is default)\r\n for (const key in node) {\r\n if (!node.hasOwnProperty(key)) { return; }\r\n if (!node[key] && node[key] !== 0) { // 0 can be valid value (x,y only really)\r\n delete node[key];\r\n }\r\n }\r\n\r\n return node;\r\n }\r\n\r\n /** @internal */\r\n private _setStaticClass(): GridStack {\r\n let classes = ['grid-stack-static'];\r\n\r\n if (this.opts.staticGrid) {\r\n this.el.classList.add(...classes);\r\n this.el.setAttribute('gs-static', 'true');\r\n } else {\r\n this.el.classList.remove(...classes);\r\n this.el.removeAttribute('gs-static');\r\n\r\n }\r\n return this;\r\n }\r\n\r\n /**\r\n * called when we are being resized by the window - check if the one Column Mode needs to be turned on/off\r\n * and remember the prev columns we used, as well as check for auto cell height (square)\r\n */\r\n public onParentResize(): GridStack {\r\n if (!this.el || !this.el.clientWidth) return; // return if we're gone or no size yet (will get called again)\r\n\r\n // make the cells content (minus margin) square again\r\n if (this._isAutoCellHeight) {\r\n Utils.throttle(() => {\r\n let marginDiff = - (this.opts.marginRight as number) - (this.opts.marginLeft as number)\r\n + (this.opts.marginTop as number) + (this.opts.marginBottom as number);\r\n this.cellHeight(this.cellWidth() + marginDiff);\r\n }, 100);\r\n }\r\n\r\n if (!this.opts.disableOneColumnMode && this.el.clientWidth <= this.opts.minWidth) {\r\n if (this._oneColumnMode) { return this }\r\n this._oneColumnMode = true;\r\n this.column(1);\r\n this._resizeNestedGrids(this.el);\r\n } else {\r\n if (!this._oneColumnMode) { return this }\r\n delete this._oneColumnMode;\r\n this.column(this._prevColumn);\r\n this._resizeNestedGrids(this.el);\r\n }\r\n\r\n return this;\r\n }\r\n\r\n /** add or remove the window size event handler */\r\n private _updateWindowResizeEvent(forceRemove = false): GridStack {\r\n const workTodo = (this._isAutoCellHeight || !this.opts.disableOneColumnMode);\r\n\r\n // 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)\r\n if (workTodo && !forceRemove && !this.opts._isNested && !this._windowResizeBind) {\r\n this._windowResizeBind = this.onParentResize.bind(this); // so we can properly remove later\r\n window.addEventListener('resize', this._windowResizeBind);\r\n this.onParentResize(); // initially call it once...\r\n } else if ((forceRemove || !workTodo) && this._windowResizeBind) {\r\n window.removeEventListener('resize', this._windowResizeBind);\r\n delete this._windowResizeBind; // remove link to us so we can free\r\n }\r\n\r\n return this;\r\n }\r\n\r\n /** @internal convert a potential selector into actual element */\r\n public static getElement(els: GridStackElement = '.grid-stack-item'): GridItemHTMLElement { return Utils.getElement(els) }\r\n /** @internal */\r\n public static getElements(els: GridStackElement = '.grid-stack-item'): GridItemHTMLElement[] { return Utils.getElements(els) }\r\n /** @internal */\r\n public static getGridElement(els: GridStackElement): GridHTMLElement { return GridStack.getElement(els) }\r\n /** @internal */\r\n public static getGridElements(els: string): GridHTMLElement[] { return Utils.getElements(els) }\r\n\r\n /** @internal initialize margin top/bottom/left/right and units */\r\n private initMargin(): GridStack {\r\n\r\n let data: HeightData;\r\n let margin = 0;\r\n\r\n // support passing multiple values like CSS (ex: '5px 10px 0 20px')\r\n let margins: string[] = [];\r\n if (typeof this.opts.margin === 'string') {\r\n margins = this.opts.margin.split(' ')\r\n }\r\n if (margins.length === 2) { // top/bot, left/right like CSS\r\n this.opts.marginTop = this.opts.marginBottom = margins[0];\r\n this.opts.marginLeft = this.opts.marginRight = margins[1];\r\n } else if (margins.length === 4) { // Clockwise like CSS\r\n this.opts.marginTop = margins[0];\r\n this.opts.marginRight = margins[1];\r\n this.opts.marginBottom = margins[2];\r\n this.opts.marginLeft = margins[3];\r\n } else {\r\n data = Utils.parseHeight(this.opts.margin);\r\n this.opts.marginUnit = data.unit;\r\n margin = this.opts.margin = data.h;\r\n }\r\n\r\n // see if top/bottom/left/right need to be set as well\r\n if (this.opts.marginTop === undefined) {\r\n this.opts.marginTop = margin;\r\n } else {\r\n data = Utils.parseHeight(this.opts.marginTop);\r\n this.opts.marginTop = data.h;\r\n delete this.opts.margin;\r\n }\r\n\r\n if (this.opts.marginBottom === undefined) {\r\n this.opts.marginBottom = margin;\r\n } else {\r\n data = Utils.parseHeight(this.opts.marginBottom);\r\n this.opts.marginBottom = data.h;\r\n delete this.opts.margin;\r\n }\r\n\r\n if (this.opts.marginRight === undefined) {\r\n this.opts.marginRight = margin;\r\n } else {\r\n data = Utils.parseHeight(this.opts.marginRight);\r\n this.opts.marginRight = data.h;\r\n delete this.opts.margin;\r\n }\r\n\r\n if (this.opts.marginLeft === undefined) {\r\n this.opts.marginLeft = margin;\r\n } else {\r\n data = Utils.parseHeight(this.opts.marginLeft);\r\n this.opts.marginLeft = data.h;\r\n delete this.opts.margin;\r\n }\r\n this.opts.marginUnit = data.unit; // in case side were spelled out, use those units instead...\r\n if (this.opts.marginTop === this.opts.marginBottom && this.opts.marginLeft === this.opts.marginRight && this.opts.marginTop === this.opts.marginRight) {\r\n this.opts.margin = this.opts.marginTop; // makes it easier to check for no-ops in setMargin()\r\n }\r\n return this;\r\n }\r\n\r\n /*\r\n * drag&drop empty stubs that will be implemented in gridstack-dd.ts for non static grid\r\n * so we don't incur the load unless needed.\r\n * NOTE: had to make those methods public in order to define them else as\r\n * GridStack.prototype._setupAcceptWidget = function()\r\n * maybe there is a better way....\r\n */\r\n /* eslint-disable @typescript-eslint/no-unused-vars */\r\n\r\n /**\r\n * Enables/Disables moving. No-op for static grids.\r\n * @param els widget or selector to modify.\r\n * @param val if true widget will be draggable.\r\n */\r\n public movable(els: GridStackElement, val: boolean): GridStack { return this; }\r\n /**\r\n * Enables/Disables resizing. No-op for static grids.\r\n * @param els widget or selector to modify\r\n * @param val if true widget will be resizable.\r\n */\r\n public resizable(els: GridStackElement, val: boolean): GridStack { return this; }\r\n /** @internal called to add drag over support to support widgets */\r\n public _setupAcceptWidget(): GridStack { return this; }\r\n /** @internal called to setup a trash drop zone if the user specifies it */\r\n public _setupRemoveDrop(): GridStack { return this; }\r\n /** @internal */\r\n public _setupRemovingTimeout(el: GridItemHTMLElement): GridStack { return this; }\r\n /** @internal */\r\n public _clearRemovingTimeout(el: GridItemHTMLElement): GridStack { return this; }\r\n /** @internal call to setup dragging in from the outside (say toolbar), with options */\r\n public _setupDragIn(): GridStack {return this; }\r\n /** @internal prepares the element for drag&drop **/\r\n public _prepareDragDropByNode(node: GridStackNode): GridStack { return this; }\r\n\r\n // 2.x API that just calls the new and better update() - keep those around for backward compat only...\r\n /** @internal */\r\n public locked(els: GridStackElement, locked: boolean): GridStack { return this.update(els, {locked}) }\r\n /** @internal */\r\n public maxWidth(els: GridStackElement, maxW: number): GridStack { return this.update(els, {maxW}) }\r\n /** @internal */\r\n public minWidth(els: GridStackElement, minW: number): GridStack { return this.update(els, {minW}) }\r\n /** @internal */\r\n public maxHeight(els: GridStackElement, maxH: number): GridStack { return this.update(els, {maxH}) }\r\n /** @internal */\r\n public minHeight(els: GridStackElement, minH: number): GridStack { return this.update(els, {minH}) }\r\n /** @internal */\r\n public move(els: GridStackElement, x?: number, y?: number): GridStack { return this.update(els, {x, y}) }\r\n /** @internal */\r\n public resize(els: GridStackElement, w?: number, h?: number): GridStack { return this.update(els, {w, h}) }\r\n}\r\n","// dd-base-impl.ts 3.1.4 @preserve\n\n/**\n * https://gridstackjs.com/\n * (c) 2020 rhlin, Alain Dumesny\n * gridstack.js may be freely distributed under the MIT license.\n*/\nexport type EventCallback = (event: Event) => boolean|void;\nexport abstract class DDBaseImplement {\n /** returns the enable state, but you have to call enable()/disable() to change (as other things need to happen) */\n public get disabled(): boolean { return this._disabled; }\n\n /** @internal */\n private _disabled = false;\n /** @internal */\n private _eventRegister: {\n [eventName: string]: EventCallback;\n } = {};\n\n public on(event: string, callback: EventCallback): void {\n this._eventRegister[event] = callback;\n }\n\n public off(event: string): void {\n delete this._eventRegister[event];\n }\n\n public enable(): void {\n this._disabled = false;\n }\n\n public disable(): void {\n this._disabled = true;\n }\n\n public destroy(): void {\n delete this._eventRegister;\n }\n\n public triggerEvent(eventName: string, event: Event): boolean|void {\n if (this.disabled) { return; }\n if (!this._eventRegister) {return; } // used when destroy before triggerEvent fire\n if (this._eventRegister[eventName]) {\n return this._eventRegister[eventName](event);\n }\n }\n}\n\nexport interface HTMLElementExtendOpt {\n el: HTMLElement;\n option: T;\n updateOption(T): DDBaseImplement;\n}\n","// dd-draggable.ts 3.1.4 @preserve\n\n/**\n * https://gridstackjs.com/\n * (c) 2020 rhlin, Alain Dumesny\n * gridstack.js may be freely distributed under the MIT license.\n*/\nimport { DDManager } from './dd-manager';\nimport { DDUtils } from './dd-utils';\nimport { DDBaseImplement, HTMLElementExtendOpt } from './dd-base-impl';\nimport { GridItemHTMLElement, DDUIData } from '../types';\n\n// TODO: merge with DDDragOpt ?\nexport interface DDDraggableOpt {\n appendTo?: string | HTMLElement;\n containment?: string | HTMLElement; // TODO: not implemented yet\n handle?: string;\n revert?: string | boolean | unknown; // TODO: not implemented yet\n scroll?: boolean; // nature support by HTML5 drag drop, can't be switch to off actually\n helper?: string | HTMLElement | ((event: Event) => HTMLElement);\n basePosition?: 'fixed' | 'absolute';\n start?: (event: Event, ui: DDUIData) => void;\n stop?: (event: Event) => void;\n drag?: (event: Event, ui: DDUIData) => void;\n}\n\ninterface DragOffset {\n left: number;\n top: number;\n width: number;\n height: number;\n offsetLeft: number;\n offsetTop: number;\n}\n\nexport class DDDraggable extends DDBaseImplement implements HTMLElementExtendOpt {\n public el: HTMLElement;\n public option: DDDraggableOpt;\n public helper: HTMLElement; // used by GridStackDDNative\n\n /** @internal */\n private dragOffset: DragOffset;\n /** @internal */\n private dragElementOriginStyle: Array;\n /** @internal */\n private dragFollowTimer: number;\n /** @internal */\n private dragEl: HTMLElement;\n /** @internal */\n private dragging = false;\n /** @internal */\n private paintTimer: number;\n /** @internal */\n private parentOriginStylePosition: string;\n /** @internal */\n private helperContainment: HTMLElement;\n /** @internal */\n private static basePosition: 'fixed' | 'absolute' = 'absolute';\n /** @internal #1541 can't have {passive: true} on Safari as otherwise it reverts animate back to old location on drop */\n private static dragEventListenerOption = true; // DDUtils.isEventSupportPassiveOption ? { capture: true, passive: true } : true;\n /** @internal */\n private static originStyleProp = ['transition', 'pointerEvents', 'position',\n 'left', 'top', 'opacity', 'zIndex', 'width', 'height', 'willChange'];\n\n constructor(el: HTMLElement, option: DDDraggableOpt = {}) {\n super();\n this.el = el;\n this.option = option;\n // create var event binding so we can easily remove and still look like TS methods (unlike anonymous functions)\n this._mouseDown = this._mouseDown.bind(this);\n this._dragStart = this._dragStart.bind(this);\n this._drag = this._drag.bind(this);\n this._dragEnd = this._dragEnd.bind(this);\n this._dragFollow = this._dragFollow.bind(this);\n this.enable();\n }\n\n public on(event: 'drag' | 'dragstart' | 'dragstop', callback: (event: DragEvent) => void): void {\n super.on(event, callback);\n }\n\n public off(event: 'drag' | 'dragstart' | 'dragstop'): void {\n super.off(event);\n }\n\n public enable(): void {\n super.enable();\n this.el.draggable = true;\n this.el.classList.remove('ui-draggable-disabled');\n this.el.classList.add('ui-draggable');\n this.el.addEventListener('mousedown', this._mouseDown);\n this.el.addEventListener('dragstart', this._dragStart);\n }\n\n public disable(forDestroy = false): void {\n super.disable();\n this.el.removeAttribute('draggable');\n this.el.classList.remove('ui-draggable');\n if (!forDestroy) this.el.classList.add('ui-draggable-disabled');\n this.el.removeEventListener('mousedown', this._mouseDown);\n this.el.removeEventListener('dragstart', this._dragStart);\n }\n\n public destroy(): void {\n if (this.dragging) {\n // Destroy while dragging should remove dragend listener and manually trigger\n // dragend, otherwise dragEnd can't perform dragstop because eventRegistry is\n // destroyed.\n this._dragEnd({} as DragEvent);\n }\n this.disable(true);\n delete this.el;\n delete this.helper;\n delete this.option;\n super.destroy();\n }\n\n public updateOption(opts: DDDraggableOpt): DDDraggable {\n Object.keys(opts).forEach(key => this.option[key] = opts[key]);\n return this;\n }\n\n /** @internal call when mouse goes down before a dragstart happens */\n private _mouseDown(event: MouseEvent): void {\n // make sure we are clicking on a drag handle or child of it...\n let className = this.option.handle.substring(1);\n let el = event.target as HTMLElement;\n while (el && !el.classList.contains(className)) { el = el.parentElement; }\n this.dragEl = el;\n }\n\n /** @internal */\n private _dragStart(event: DragEvent): void {\n if (!this.dragEl) { event.preventDefault(); return; }\n DDManager.dragElement = this;\n this.helper = this._createHelper(event);\n this._setupHelperContainmentStyle();\n this.dragOffset = this._getDragOffset(event, this.el, this.helperContainment);\n const ev = DDUtils.initEvent(event, { target: this.el, type: 'dragstart' });\n if (this.helper !== this.el) {\n this._setupDragFollowNodeNotifyStart(ev);\n } else {\n this.dragFollowTimer = window.setTimeout(() => {\n delete this.dragFollowTimer;\n this._setupDragFollowNodeNotifyStart(ev);\n }, 0);\n }\n this._cancelDragGhost(event);\n }\n\n /** @internal */\n private _setupDragFollowNodeNotifyStart(ev: Event): DDDraggable {\n this._setupHelperStyle();\n document.addEventListener('dragover', this._drag, DDDraggable.dragEventListenerOption);\n this.el.addEventListener('dragend', this._dragEnd);\n if (this.option.start) {\n this.option.start(ev, this.ui());\n }\n this.dragging = true;\n this.helper.classList.add('ui-draggable-dragging');\n this.triggerEvent('dragstart', ev);\n return this;\n }\n\n /** @internal */\n private _drag(event: DragEvent): void {\n // Safari: prevent default to allow drop to happen instead of reverting back (with animation) and delaying dragend #1541\n // https://stackoverflow.com/questions/61760755/how-to-fire-dragend-event-immediately\n event.preventDefault();\n this._dragFollow(event);\n const ev = DDUtils.initEvent(event, { target: this.el, type: 'drag' });\n if (this.option.drag) {\n this.option.drag(ev, this.ui());\n }\n this.triggerEvent('drag', ev);\n }\n\n /** @internal */\n private _dragEnd(event: DragEvent): void {\n if (this.dragFollowTimer) {\n clearTimeout(this.dragFollowTimer);\n delete this.dragFollowTimer;\n return;\n } else {\n if (this.paintTimer) {\n cancelAnimationFrame(this.paintTimer);\n }\n document.removeEventListener('dragover', this._drag, DDDraggable.dragEventListenerOption);\n this.el.removeEventListener('dragend', this._dragEnd);\n }\n this.dragging = false;\n this.helper.classList.remove('ui-draggable-dragging');\n this.helperContainment.style.position = this.parentOriginStylePosition || null;\n if (this.helper === this.el) {\n this._removeHelperStyle();\n } else {\n this.helper.remove();\n }\n const ev = DDUtils.initEvent(event, { target: this.el, type: 'dragstop' });\n if (this.option.stop) {\n this.option.stop(ev); // Note: ui() not used by gridstack so don't pass\n }\n this.triggerEvent('dragstop', ev);\n delete DDManager.dragElement;\n delete this.helper;\n delete this.dragEl;\n }\n\n /** @internal create a clone copy (or user defined method) of the original drag item if set */\n private _createHelper(event: DragEvent): HTMLElement {\n let helper = this.el;\n if (typeof this.option.helper === 'function') {\n helper = this.option.helper.apply(this.el, event);\n } else if (this.option.helper === 'clone') {\n helper = DDUtils.clone(this.el);\n }\n if (!document.body.contains(helper)) {\n DDUtils.appendTo(helper, this.option.appendTo === 'parent' ? this.el.parentNode : this.option.appendTo);\n }\n if (helper === this.el) {\n this.dragElementOriginStyle = DDDraggable.originStyleProp.map(prop => this.el.style[prop]);\n }\n return helper;\n }\n\n /** @internal */\n private _setupHelperStyle(): DDDraggable {\n this.helper.style.pointerEvents = 'none';\n this.helper.style.width = this.dragOffset.width + 'px';\n this.helper.style.height = this.dragOffset.height + 'px';\n this.helper.style.willChange = 'left, top';\n this.helper.style.transition = 'none'; // show up instantly\n this.helper.style.position = this.option.basePosition || DDDraggable.basePosition;\n this.helper.style.zIndex = '1000';\n setTimeout(() => {\n if (this.helper) {\n this.helper.style.transition = null; // recover animation\n }\n }, 0);\n return this;\n }\n\n /** @internal */\n private _removeHelperStyle(): DDDraggable {\n // don't bother restoring styles if we're gonna remove anyway...\n let node = this.helper ? (this.helper as GridItemHTMLElement).gridstackNode : undefined;\n if (!node || !node._isAboutToRemove) {\n DDDraggable.originStyleProp.forEach(prop => {\n this.helper.style[prop] = this.dragElementOriginStyle[prop] || null;\n });\n }\n delete this.dragElementOriginStyle;\n return this;\n }\n\n /** @internal */\n private _dragFollow(event: DragEvent): void {\n if (this.paintTimer) {\n cancelAnimationFrame(this.paintTimer);\n }\n this.paintTimer = requestAnimationFrame(() => {\n delete this.paintTimer;\n const offset = this.dragOffset;\n let containmentRect = { left: 0, top: 0 };\n if (this.helper.style.position === 'absolute') {\n const { left, top } = this.helperContainment.getBoundingClientRect();\n containmentRect = { left, top };\n }\n this.helper.style.left = event.clientX + offset.offsetLeft - containmentRect.left + 'px';\n this.helper.style.top = event.clientY + offset.offsetTop - containmentRect.top + 'px';\n });\n }\n\n /** @internal */\n private _setupHelperContainmentStyle(): DDDraggable {\n this.helperContainment = this.helper.parentElement;\n if (this.option.basePosition !== 'fixed') {\n this.parentOriginStylePosition = this.helperContainment.style.position;\n if (window.getComputedStyle(this.helperContainment).position.match(/static/)) {\n this.helperContainment.style.position = 'relative';\n }\n }\n return this;\n }\n\n /** @internal prevent the default gost image to be created (which has wrongas we move the helper/element instead\n * (legacy jquery UI code updates the top/left of the item).\n * TODO: maybe use mouse event instead of HTML5 drag as we have to work around it anyway, or change code to not update\n * the actual grid-item but move the gost image around (and special case jq version) ?\n **/\n private _cancelDragGhost(e: DragEvent): DDDraggable {\n /* doesn't seem to do anything...\n let t = e.dataTransfer;\n t.effectAllowed = 'none';\n t.dropEffect = 'none';\n t.setData('text', '');\n */\n\n // NOTE: according to spec (and required by Safari see #1540) the image has to be visible in the browser (in dom and not hidden) so make it a 1px div\n let img = document.createElement('div');\n img.style.width = '1px';\n img.style.height = '1px';\n document.body.appendChild(img);\n e.dataTransfer.setDragImage(img, 0, 0);\n setTimeout(() => document.body.removeChild(img)); // nuke once drag had a chance to grab this 'image'\n\n e.stopPropagation();\n return this;\n }\n\n /** @internal */\n private _getDragOffset(event: DragEvent, el: HTMLElement, parent: HTMLElement): DragOffset {\n\n // in case ancestor has transform/perspective css properties that change the viewpoint\n let xformOffsetX = 0;\n let xformOffsetY = 0;\n if (parent) {\n const testEl = document.createElement('div');\n DDUtils.addElStyles(testEl, {\n opacity: '0',\n position: 'fixed',\n top: 0 + 'px',\n left: 0 + 'px',\n width: '1px',\n height: '1px',\n zIndex: '-999999',\n });\n parent.appendChild(testEl);\n const testElPosition = testEl.getBoundingClientRect();\n parent.removeChild(testEl);\n xformOffsetX = testElPosition.left;\n xformOffsetY = testElPosition.top;\n // TODO: scale ?\n }\n\n const targetOffset = el.getBoundingClientRect();\n return {\n left: targetOffset.left,\n top: targetOffset.top,\n offsetLeft: - event.clientX + targetOffset.left - xformOffsetX,\n offsetTop: - event.clientY + targetOffset.top - xformOffsetY,\n width: targetOffset.width,\n height: targetOffset.height\n };\n }\n\n /** @internal TODO: set to public as called by DDDroppable! */\n public ui = (): DDUIData => {\n const containmentEl = this.el.parentElement;\n const containmentRect = containmentEl.getBoundingClientRect();\n const offset = this.helper.getBoundingClientRect();\n return {\n position: { //Current CSS position of the helper as { top, left } object\n top: offset.top - containmentRect.top,\n left: offset.left - containmentRect.left\n }\n /* not used by GridStack for now...\n helper: [this.helper], //The object arr representing the helper that's being dragged.\n offset: { top: offset.top, left: offset.left } // Current offset position of the helper as { top, left } object.\n */\n };\n }\n}\n\n\n","// dd-droppable.ts 3.1.4 @preserve\n\n/**\n * https://gridstackjs.com/\n * (c) 2020 rhlin, Alain Dumesny\n * gridstack.js may be freely distributed under the MIT license.\n*/\nimport { DDDraggable } from './dd-draggable';\nimport { DDManager } from './dd-manager';\nimport { DDBaseImplement, HTMLElementExtendOpt } from './dd-base-impl';\nimport { DDUtils } from './dd-utils';\n\nexport interface DDDroppableOpt {\n accept?: string | ((el: HTMLElement) => boolean);\n drop?: (event: DragEvent, ui) => void;\n over?: (event: DragEvent, ui) => void;\n out?: (event: DragEvent, ui) => void;\n}\n\nexport class DDDroppable extends DDBaseImplement implements HTMLElementExtendOpt {\n\n public accept: (el: HTMLElement) => boolean;\n public el: HTMLElement;\n public option: DDDroppableOpt;\n\n /** @internal */\n private acceptable: boolean = null;\n\n constructor(el: HTMLElement, opts: DDDroppableOpt = {}) {\n super();\n this.el = el;\n this.option = opts;\n // create var event binding so we can easily remove and still look like TS methods (unlike anonymous functions)\n this._dragEnter = this._dragEnter.bind(this);\n this._dragOver = this._dragOver.bind(this);\n this._dragLeave = this._dragLeave.bind(this);\n this._drop = this._drop.bind(this);\n\n this.el.classList.add('ui-droppable');\n this.el.addEventListener('dragenter', this._dragEnter);\n this._setupAccept();\n }\n\n public on(event: 'drop' | 'dropover' | 'dropout', callback: (event: DragEvent) => void): void {\n super.on(event, callback);\n }\n\n public off(event: 'drop' | 'dropover' | 'dropout'): void {\n super.off(event);\n }\n\n public enable(): void {\n if (!this.disabled) { return; }\n super.enable();\n this.el.classList.remove('ui-droppable-disabled');\n this.el.addEventListener('dragenter', this._dragEnter);\n }\n\n public disable(): void {\n if (this.disabled) { return; }\n super.disable();\n this.el.classList.add('ui-droppable-disabled');\n this.el.removeEventListener('dragenter', this._dragEnter);\n }\n\n public destroy(): void {\n this.el.classList.remove('ui-droppable');\n if (this.disabled) {\n this.el.classList.remove('ui-droppable-disabled');\n this.el.removeEventListener('dragenter', this._dragEnter);\n this.el.removeEventListener('dragover', this._dragOver);\n this.el.removeEventListener('drop', this._drop);\n this.el.removeEventListener('dragleave', this._dragLeave);\n }\n super.destroy();\n }\n\n public updateOption(opts: DDDroppableOpt): DDDroppable {\n Object.keys(opts).forEach(key => this.option[key] = opts[key]);\n this._setupAccept();\n return this;\n }\n\n /** @internal called when the cursor enters our area - prepare for a possible drop and track leaving */\n private _dragEnter(event: DragEvent): void {\n this.el.removeEventListener('dragenter', this._dragEnter);\n this.acceptable = this._canDrop();\n if (this.acceptable) {\n event.preventDefault();\n const ev = DDUtils.initEvent(event, { target: this.el, type: 'dropover' });\n if (this.option.over) {\n this.option.over(ev, this._ui(DDManager.dragElement))\n }\n this.triggerEvent('dropover', ev);\n this.el.addEventListener('dragover', this._dragOver);\n this.el.addEventListener('drop', this._drop);\n }\n this.el.classList.add('ui-droppable-over');\n this.el.addEventListener('dragleave', this._dragLeave);\n }\n\n /** @internal called when an acceptable to drop item is being dragged over - do nothing but eat the event */\n private _dragOver(event: DragEvent): void {\n event.preventDefault();\n event.stopPropagation();\n }\n\n /** @internal called when the item is leaving our area, stop tracking if we had acceptable item */\n private _dragLeave(event: DragEvent): void {\n if (this.el.contains(event.relatedTarget as HTMLElement)) { return; }\n this._removeLeaveCallbacks();\n if (this.acceptable) {\n event.preventDefault();\n const ev = DDUtils.initEvent(event, { target: this.el, type: 'dropout' });\n if (this.option.out) {\n this.option.out(ev, this._ui(DDManager.dragElement))\n }\n this.triggerEvent('dropout', ev);\n }\n }\n\n /** @internal item is being dropped on us - call the client drop event */\n private _drop(event: DragEvent): void {\n if (!this.acceptable) { return; } // should not have received event...\n event.preventDefault();\n const ev = DDUtils.initEvent(event, { target: this.el, type: 'drop' });\n if (this.option.drop) {\n this.option.drop(ev, this._ui(DDManager.dragElement))\n }\n this.triggerEvent('drop', ev);\n this._removeLeaveCallbacks();\n }\n\n /** @internal called to remove callbacks when leaving or dropping */\n private _removeLeaveCallbacks() {\n this.el.removeEventListener('dragleave', this._dragLeave);\n this.el.classList.remove('ui-droppable-over');\n if (this.acceptable) {\n this.el.removeEventListener('dragover', this._dragOver);\n this.el.removeEventListener('drop', this._drop);\n }\n this.el.addEventListener('dragenter', this._dragEnter);\n }\n\n /** @internal */\n private _canDrop(): boolean {\n return DDManager.dragElement && (!this.accept || this.accept(DDManager.dragElement.el));\n }\n\n /** @internal */\n private _setupAccept(): DDDroppable {\n if (this.option.accept && typeof this.option.accept === 'string') {\n this.accept = (el: HTMLElement) => {\n return el.matches(this.option.accept as string)\n }\n } else {\n this.accept = this.option.accept as ((el: HTMLElement) => boolean);\n }\n return this;\n }\n\n /** @internal */\n private _ui(drag: DDDraggable) {\n return {\n draggable: drag.el,\n ...drag.ui()\n };\n }\n}\n\n","// dd-elements.ts 3.1.4 @preserve\n\n/**\n * https://gridstackjs.com/\n * (c) 2020 rhlin, Alain Dumesny\n * gridstack.js may be freely distributed under the MIT license.\n*/\nimport { DDResizable, DDResizableOpt } from './dd-resizable';\nimport { GridItemHTMLElement } from './../types';\nimport { DDDraggable, DDDraggableOpt } from './dd-draggable';\nimport { DDDroppable, DDDroppableOpt } from './dd-droppable';\n\nexport interface DDElementHost extends GridItemHTMLElement {\n ddElement?: DDElement;\n}\n\nexport class DDElement {\n\n static init(el: DDElementHost): DDElement {\n if (!el.ddElement) { el.ddElement = new DDElement(el); }\n return el.ddElement;\n }\n\n public el: DDElementHost;\n public ddDraggable?: DDDraggable;\n public ddDroppable?: DDDroppable;\n public ddResizable?: DDResizable;\n\n constructor(el: DDElementHost) {\n this.el = el;\n }\n\n public on(eventName: string, callback: (event: MouseEvent) => void): DDElement {\n if (this.ddDraggable && ['drag', 'dragstart', 'dragstop'].indexOf(eventName) > -1) {\n this.ddDraggable.on(eventName as 'drag' | 'dragstart' | 'dragstop', callback);\n } else if (this.ddDroppable && ['drop', 'dropover', 'dropout'].indexOf(eventName) > -1) {\n this.ddDroppable.on(eventName as 'drop' | 'dropover' | 'dropout', callback);\n } else if (this.ddResizable && ['resizestart', 'resize', 'resizestop'].indexOf(eventName) > -1) {\n this.ddResizable.on(eventName as 'resizestart' | 'resize' | 'resizestop', callback);\n }\n return this;\n }\n\n public off(eventName: string): DDElement {\n if (this.ddDraggable && ['drag', 'dragstart', 'dragstop'].indexOf(eventName) > -1) {\n this.ddDraggable.off(eventName as 'drag' | 'dragstart' | 'dragstop');\n } else if (this.ddDroppable && ['drop', 'dropover', 'dropout'].indexOf(eventName) > -1) {\n this.ddDroppable.off(eventName as 'drop' | 'dropover' | 'dropout');\n } else if (this.ddResizable && ['resizestart', 'resize', 'resizestop'].indexOf(eventName) > -1) {\n this.ddResizable.off(eventName as 'resizestart' | 'resize' | 'resizestop');\n }\n return this;\n }\n\n public setupDraggable(opts: DDDraggableOpt): DDElement {\n if (!this.ddDraggable) {\n this.ddDraggable = new DDDraggable(this.el, opts);\n } else {\n this.ddDraggable.updateOption(opts);\n }\n return this;\n }\n\n public cleanDraggable(): DDElement {\n if (this.ddDraggable) {\n this.ddDraggable.destroy();\n delete this.ddDraggable;\n }\n return this;\n }\n\n public setupResizable(opts: DDResizableOpt): DDElement {\n if (!this.ddResizable) {\n this.ddResizable = new DDResizable(this.el, opts);\n } else {\n this.ddResizable.updateOption(opts);\n }\n return this;\n }\n\n public cleanResizable(): DDElement {\n if (this.ddResizable) {\n this.ddResizable.destroy();\n delete this.ddResizable;\n }\n return this;\n }\n\n public setupDroppable(opts: DDDroppableOpt): DDElement {\n if (!this.ddDroppable) {\n this.ddDroppable = new DDDroppable(this.el, opts);\n } else {\n this.ddDroppable.updateOption(opts);\n }\n return this;\n }\n\n public cleanDroppable(): DDElement {\n if (this.ddDroppable) {\n this.ddDroppable.destroy();\n delete this.ddDroppable;\n }\n return this;\n }\n}\n","// dd-manager.ts 3.1.4 @preserve\n\n/**\n * https://gridstackjs.com/\n * (c) 2020 rhlin, Alain Dumesny\n * gridstack.js may be freely distributed under the MIT license.\n*/\nimport { DDDraggable } from './dd-draggable';\n\nexport class DDManager {\n static dragElement: DDDraggable;\n}\n","// dd-resizable-handle.ts 3.1.4 @preserve\n\n/**\n * https://gridstackjs.com/\n * (c) 2020 rhlin, Alain Dumesny\n * gridstack.js may be freely distributed under the MIT license.\n*/\nexport interface DDResizableHandleOpt {\n start?: (event) => void;\n move?: (event) => void;\n stop?: (event) => void;\n}\n\nexport class DDResizableHandle {\n /** @internal */\n private el: HTMLElement;\n /** @internal */\n private host: HTMLElement;\n /** @internal */\n private option: DDResizableHandleOpt;\n /** @internal */\n private dir: string;\n /** @internal true after we've moved enough pixels to start a resize */\n private moving = false;\n /** @internal */\n private mouseDownEvent: MouseEvent;\n /** @internal */\n private static prefix = 'ui-resizable-';\n\n constructor(host: HTMLElement, direction: string, option: DDResizableHandleOpt) {\n this.host = host;\n this.dir = direction;\n this.option = option;\n // create var event binding so we can easily remove and still look like TS methods (unlike anonymous functions)\n this._mouseDown = this._mouseDown.bind(this);\n this._mouseMove = this._mouseMove.bind(this);\n this._mouseUp = this._mouseUp.bind(this);\n\n this._init();\n }\n\n /** @internal */\n private _init(): DDResizableHandle {\n const el = document.createElement('div');\n el.classList.add('ui-resizable-handle');\n el.classList.add(`${DDResizableHandle.prefix}${this.dir}`);\n el.style.zIndex = '100';\n el.style.userSelect = 'none';\n this.el = el;\n this.host.appendChild(this.el);\n this.el.addEventListener('mousedown', this._mouseDown);\n return this;\n }\n\n /** call this when resize handle needs to be removed and cleaned up */\n public destroy(): DDResizableHandle {\n if (this.moving) this._mouseUp(this.mouseDownEvent);\n this.el.removeEventListener('mousedown', this._mouseDown);\n this.host.removeChild(this.el);\n delete this.el;\n delete this.host;\n return this;\n }\n\n /** @internal called on mouse down on us: capture move on the entire document (mouse might not stay on us) until we release the mouse */\n private _mouseDown(e: MouseEvent): void {\n this.mouseDownEvent = e;\n document.addEventListener('mousemove', this._mouseMove, true); // capture, not bubble\n document.addEventListener('mouseup', this._mouseUp);\n }\n\n /** @internal */\n private _mouseMove(e: MouseEvent): void {\n let s = this.mouseDownEvent;\n // don't start unless we've moved at least 3 pixels\n if (!this.moving && Math.abs(e.x - s.x) + Math.abs(e.y - s.y) > 2) {\n this.moving = true;\n this._triggerEvent('start', this.mouseDownEvent);\n } else if (this.moving) {\n this._triggerEvent('move', e);\n }\n }\n\n /** @internal */\n private _mouseUp(e: MouseEvent): void {\n if (this.moving) {\n this._triggerEvent('stop', e);\n }\n document.removeEventListener('mousemove', this._mouseMove, true);\n document.removeEventListener('mouseup', this._mouseUp);\n delete this.moving;\n delete this.mouseDownEvent;\n }\n\n /** @internal */\n private _triggerEvent(name: string, event: MouseEvent): DDResizableHandle {\n if (this.option[name]) this.option[name](event);\n return this;\n }\n}\n","// dd-resizable.ts 3.1.4 @preserve\n\n/**\n * https://gridstackjs.com/\n * (c) 2020 rhlin, Alain Dumesny\n * gridstack.js may be freely distributed under the MIT license.\n*/\nimport { DDResizableHandle } from './dd-resizable-handle';\nimport { DDBaseImplement, HTMLElementExtendOpt } from './dd-base-impl';\nimport { DDUtils } from './dd-utils';\nimport { Utils } from '../utils';\nimport { DDUIData, Rect, Size } from '../types';\n\n// TODO: merge with DDDragOpt\nexport interface DDResizableOpt {\n autoHide?: boolean;\n handles?: string;\n maxHeight?: number;\n maxWidth?: number;\n minHeight?: number;\n minWidth?: number;\n basePosition?: 'fixed' | 'absolute';\n start?: (event: Event, ui: DDUIData) => void;\n stop?: (event: Event) => void;\n resize?: (event: Event, ui: DDUIData) => void;\n}\n\nexport class DDResizable extends DDBaseImplement implements HTMLElementExtendOpt {\n\n // have to be public else complains for HTMLElementExtendOpt ?\n public el: HTMLElement;\n public option: DDResizableOpt;\n\n /** @internal */\n private handlers: DDResizableHandle[];\n /** @internal */\n private originalRect: Rect;\n /** @internal */\n private temporalRect: Rect;\n /** @internal */\n private scrollY: number;\n /** @internal */\n private scrolled: number;\n /** @internal */\n private scrollEl: HTMLElement;\n /** @internal */\n private startEvent: MouseEvent;\n /** @internal value saved in the same order as _originStyleProp[] */\n private elOriginStyleVal: string[];\n /** @internal */\n private parentOriginStylePosition: string;\n /** @internal */\n private static _originStyleProp = ['width', 'height', 'position', 'left', 'top', 'opacity', 'zIndex'];\n\n constructor(el: HTMLElement, opts: DDResizableOpt = {}) {\n super();\n this.el = el;\n this.option = opts;\n this.enable();\n this._setupAutoHide();\n this._setupHandlers();\n }\n\n public on(event: 'resizestart' | 'resize' | 'resizestop', callback: (event: DragEvent) => void): void {\n super.on(event, callback);\n }\n\n public off(event: 'resizestart' | 'resize' | 'resizestop'): void {\n super.off(event);\n }\n\n public enable(): void {\n super.enable();\n this.el.classList.add('ui-resizable');\n this.el.classList.remove('ui-resizable-disabled');\n }\n\n public disable(): void {\n super.disable();\n this.el.classList.add('ui-resizable-disabled');\n this.el.classList.remove('ui-resizable');\n }\n\n public destroy(): void {\n this._removeHandlers();\n if (this.option.autoHide) {\n this.el.removeEventListener('mouseover', this._showHandlers);\n this.el.removeEventListener('mouseout', this._hideHandlers);\n }\n this.el.classList.remove('ui-resizable');\n delete this.el;\n super.destroy();\n }\n\n public updateOption(opts: DDResizableOpt): DDResizable {\n let updateHandles = (opts.handles && opts.handles !== this.option.handles);\n let updateAutoHide = (opts.autoHide && opts.autoHide !== this.option.autoHide);\n Object.keys(opts).forEach(key => this.option[key] = opts[key]);\n if (updateHandles) {\n this._removeHandlers();\n this._setupHandlers();\n }\n if (updateAutoHide) {\n this._setupAutoHide();\n }\n return this;\n }\n\n /** @internal */\n private _setupAutoHide(): DDResizable {\n if (this.option.autoHide) {\n this.el.classList.add('ui-resizable-autohide');\n // use mouseover/mouseout instead of mouseenter/mouseleave to get better performance;\n this.el.addEventListener('mouseover', this._showHandlers);\n this.el.addEventListener('mouseout', this._hideHandlers);\n } else {\n this.el.classList.remove('ui-resizable-autohide');\n this.el.removeEventListener('mouseover', this._showHandlers);\n this.el.removeEventListener('mouseout', this._hideHandlers);\n }\n return this;\n }\n\n /** @internal */\n private _showHandlers = () => {\n this.el.classList.remove('ui-resizable-autohide');\n }\n\n /** @internal */\n private _hideHandlers = () => {\n this.el.classList.add('ui-resizable-autohide');\n }\n\n /** @internal */\n private _setupHandlers(): DDResizable {\n let handlerDirection = this.option.handles || 'e,s,se';\n if (handlerDirection === 'all') {\n handlerDirection = 'n,e,s,w,se,sw,ne,nw';\n }\n this.handlers = handlerDirection.split(',')\n .map(dir => dir.trim())\n .map(dir => new DDResizableHandle(this.el, dir, {\n start: (event: MouseEvent) => {\n this._resizeStart(event);\n },\n stop: (event: MouseEvent) => {\n this._resizeStop(event);\n },\n move: (event: MouseEvent) => {\n this._resizing(event, dir);\n }\n }));\n return this;\n }\n\n /** @internal */\n private _resizeStart(event: MouseEvent): DDResizable {\n this.originalRect = this.el.getBoundingClientRect();\n this.scrollEl = Utils.getScrollParent(this.el);\n this.scrollY = this.scrollEl.scrollTop;\n this.startEvent = event;\n this._setupHelper();\n this._applyChange();\n const ev = DDUtils.initEvent(event, { type: 'resizestart', target: this.el });\n if (this.option.start) {\n this.option.start(ev, this._ui());\n }\n this.el.classList.add('ui-resizable-resizing');\n this.triggerEvent('resizestart', ev);\n return this;\n }\n\n /** @internal */\n private _resizing(event: MouseEvent, dir: string): DDResizable {\n this.scrolled = this.scrollEl.scrollTop - this.scrollY;\n this.temporalRect = this._getChange(event, dir);\n this._applyChange();\n const ev = DDUtils.initEvent(event, { type: 'resize', target: this.el });\n if (this.option.resize) {\n this.option.resize(ev, this._ui());\n }\n this.triggerEvent('resize', ev);\n return this;\n }\n\n /** @internal */\n private _resizeStop(event: MouseEvent): DDResizable {\n const ev = DDUtils.initEvent(event, { type: 'resizestop', target: this.el });\n if (this.option.stop) {\n this.option.stop(ev); // Note: ui() not used by gridstack so don't pass\n }\n this.el.classList.remove('ui-resizable-resizing');\n this.triggerEvent('resizestop', ev);\n this._cleanHelper();\n delete this.startEvent;\n delete this.originalRect;\n delete this.temporalRect;\n delete this.scrollY;\n delete this.scrolled;\n return this;\n }\n\n /** @internal */\n private _setupHelper(): DDResizable {\n this.elOriginStyleVal = DDResizable._originStyleProp.map(prop => this.el.style[prop]);\n this.parentOriginStylePosition = this.el.parentElement.style.position;\n if (window.getComputedStyle(this.el.parentElement).position.match(/static/)) {\n this.el.parentElement.style.position = 'relative';\n }\n this.el.style.position = this.option.basePosition || 'absolute'; // or 'fixed'\n this.el.style.opacity = '0.8';\n this.el.style.zIndex = '1000';\n return this;\n }\n\n /** @internal */\n private _cleanHelper(): DDResizable {\n DDResizable._originStyleProp.forEach((prop, i) => {\n this.el.style[prop] = this.elOriginStyleVal[i] || null;\n });\n this.el.parentElement.style.position = this.parentOriginStylePosition || null;\n return this;\n }\n\n /** @internal */\n private _getChange(event: MouseEvent, dir: string): Rect {\n const oEvent = this.startEvent;\n const newRect = { // Note: originalRect is a complex object, not a simple Rect, so copy out.\n width: this.originalRect.width,\n height: this.originalRect.height + this.scrolled,\n left: this.originalRect.left,\n top: this.originalRect.top - this.scrolled\n };\n \n const offsetH = event.clientX - oEvent.clientX;\n const offsetV = event.clientY - oEvent.clientY;\n\n if (dir.indexOf('e') > -1) {\n newRect.width += event.clientX - oEvent.clientX;\n }\n if (dir.indexOf('s') > -1) {\n newRect.height += event.clientY - oEvent.clientY;\n }\n if (dir.indexOf('w') > -1) {\n newRect.width -= offsetH;\n newRect.left += offsetH;\n }\n if (dir.indexOf('n') > -1) {\n newRect.height -= offsetV;\n newRect.top += offsetV\n }\n const reshape = this._getReShapeSize(newRect.width, newRect.height);\n if (newRect.width !== reshape.width) {\n if (dir.indexOf('w') > -1) {\n newRect.left += newRect.width - reshape.width;\n }\n newRect.width = reshape.width;\n }\n if (newRect.height !== reshape.height) {\n if (dir.indexOf('n') > -1) {\n newRect.top += newRect.height - reshape.height;\n }\n newRect.height = reshape.height;\n }\n return newRect;\n }\n\n /** @internal */\n private _getReShapeSize(oWidth: number, oHeight: number): Size {\n const maxWidth = this.option.maxWidth || oWidth;\n const minWidth = this.option.minWidth || oWidth;\n const maxHeight = this.option.maxHeight || oHeight;\n const minHeight = this.option.minHeight || oHeight;\n const width = Math.min(maxWidth, Math.max(minWidth, oWidth));\n const height = Math.min(maxHeight, Math.max(minHeight, oHeight));\n return { width, height };\n }\n\n /** @internal */\n private _applyChange(): DDResizable {\n let containmentRect = { left: 0, top: 0, width: 0, height: 0 };\n if (this.el.style.position === 'absolute') {\n const containmentEl = this.el.parentElement;\n const { left, top } = containmentEl.getBoundingClientRect();\n containmentRect = { left, top, width: 0, height: 0 };\n }\n if (!this.temporalRect) return this;\n Object.keys(this.temporalRect).forEach(key => {\n const value = this.temporalRect[key];\n this.el.style[key] = value - containmentRect[key] + 'px';\n });\n return this;\n }\n\n /** @internal */\n private _removeHandlers(): DDResizable {\n this.handlers.forEach(handle => handle.destroy());\n delete this.handlers;\n return this;\n }\n\n /** @internal */\n private _ui = (): DDUIData => {\n const containmentEl = this.el.parentElement;\n const containmentRect = containmentEl.getBoundingClientRect();\n const newRect = { // Note: originalRect is a complex object, not a simple Rect, so copy out.\n width: this.originalRect.width,\n height: this.originalRect.height + this.scrolled,\n left: this.originalRect.left,\n top: this.originalRect.top - this.scrolled\n };\n const rect = this.temporalRect || newRect;\n return {\n position: {\n left: rect.left - containmentRect.left,\n top: rect.top - containmentRect.top\n },\n size: {\n width: rect.width,\n height: rect.height\n }\n /* Gridstack ONLY needs position set above... keep around in case.\n element: [this.el], // The object representing the element to be resized\n helper: [], // TODO: not support yet - The object representing the helper that's being resized\n originalElement: [this.el],// we don't wrap here, so simplify as this.el //The object representing the original element before it is wrapped\n originalPosition: { // The position represented as { left, top } before the resizable is resized\n left: this.originalRect.left - containmentRect.left,\n top: this.originalRect.top - containmentRect.top\n },\n originalSize: { // The size represented as { width, height } before the resizable is resized\n width: this.originalRect.width,\n height: this.originalRect.height\n }\n */\n };\n }\n}\n","// dd-utils.ts 3.1.4 @preserve\n\n/**\n * https://gridstackjs.com/\n * (c) 2020 rhlin, Alain Dumesny\n * gridstack.js may be freely distributed under the MIT license.\n*/\n\nexport class DDUtils {\n\n public static isEventSupportPassiveOption = ((() => {\n let supportsPassive = false;\n let passiveTest = () => {\n // do nothing\n };\n document.addEventListener('test', passiveTest, {\n get passive() {\n supportsPassive = true;\n return true;\n }\n });\n document.removeEventListener('test', passiveTest);\n return supportsPassive;\n })());\n\n public static clone(el: HTMLElement): HTMLElement {\n const node = el.cloneNode(true) as HTMLElement;\n node.removeAttribute('id');\n return node;\n }\n\n public static appendTo(el: HTMLElement, parent: string | HTMLElement | Node): void {\n let parentNode: HTMLElement;\n if (typeof parent === 'string') {\n parentNode = document.querySelector(parent as string);\n } else {\n parentNode = parent as HTMLElement;\n }\n if (parentNode) {\n parentNode.append(el);\n }\n }\n\n public static setPositionRelative(el: HTMLElement): void {\n if (!(/^(?:r|a|f)/).test(window.getComputedStyle(el).position)) {\n el.style.position = \"relative\";\n }\n }\n\n public static addElStyles(el: HTMLElement, styles: { [prop: string]: string | string[] }): void {\n if (styles instanceof Object) {\n for (const s in styles) {\n if (styles.hasOwnProperty(s)) {\n if (Array.isArray(styles[s])) {\n // support fallback value\n (styles[s] as string[]).forEach(val => {\n el.style[s] = val;\n });\n } else {\n el.style[s] = styles[s];\n }\n }\n }\n }\n }\n\n public static initEvent(e: DragEvent | MouseEvent, info: { type: string; target?: EventTarget }): T {\n const evt = { type: info.type };\n const obj = {\n button: 0,\n which: 0,\n buttons: 1,\n bubbles: true,\n cancelable: true,\n target: info.target ? info.target : e.target\n };\n // don't check for `instanceof DragEvent` as Safari use MouseEvent #1540\n if ((e as DragEvent).dataTransfer) {\n evt['dataTransfer'] = (e as DragEvent).dataTransfer; // workaround 'readonly' field.\n }\n ['altKey','ctrlKey','metaKey','shiftKey'].forEach(p => evt[p] = e[p]); // keys\n ['pageX','pageY','clientX','clientY','screenX','screenY'].forEach(p => evt[p] = e[p]); // point info\n return {...evt, ...obj} as unknown as T;\n }\n}","// gridstack-dd-native.ts 3.1.4 @preserve\n\n/**\n * https://gridstackjs.com/\n * (c) 2020 rhlin, Alain Dumesny\n * gridstack.js may be freely distributed under the MIT license.\n*/\nimport { DDManager } from './dd-manager';\nimport { DDElement, DDElementHost } from './dd-element';\n\nimport { GridStackElement } from '../gridstack';\nimport { GridStackDD, DDOpts, DDKey, DDDropOpt, DDCallback, DDValue } from '../gridstack-dd';\nimport { GridItemHTMLElement, DDDragInOpt } from '../types';\nimport { Utils } from '../utils';\n\n// export our base class (what user should use) and all associated types\nexport * from '../gridstack-dd';\n\n/**\n * HTML 5 Native DragDrop based drag'n'drop plugin.\n */\nexport class GridStackDDNative extends GridStackDD {\n\n public resizable(el: GridItemHTMLElement, opts: DDOpts, key?: DDKey, value?: DDValue): GridStackDDNative {\n this._getDDElements(el).forEach(dEl => {\n if (opts === 'disable' || opts === 'enable') {\n dEl.ddResizable && dEl.ddResizable[opts](); // can't create DD as it requires options for setupResizable()\n } else if (opts === 'destroy') {\n dEl.ddResizable && dEl.cleanResizable();\n } else if (opts === 'option') {\n dEl.setupResizable({ [key]: value });\n } else {\n const grid = dEl.el.gridstackNode.grid;\n let handles = dEl.el.getAttribute('gs-resize-handles') ? dEl.el.getAttribute('gs-resize-handles') : grid.opts.resizable.handles;\n dEl.setupResizable({\n ...grid.opts.resizable,\n ...{ handles: handles },\n ...{\n start: opts.start,\n stop: opts.stop,\n resize: opts.resize\n }\n });\n }\n });\n return this;\n }\n\n public draggable(el: GridItemHTMLElement, opts: DDOpts, key?: DDKey, value?: DDValue): GridStackDDNative {\n this._getDDElements(el).forEach(dEl => {\n if (opts === 'disable' || opts === 'enable') {\n dEl.ddDraggable && dEl.ddDraggable[opts](); // can't create DD as it requires options for setupDraggable()\n } else if (opts === 'destroy') {\n dEl.ddDraggable && dEl.cleanDraggable();\n } else if (opts === 'option') {\n dEl.setupDraggable({ [key]: value });\n } else {\n const grid = dEl.el.gridstackNode.grid;\n dEl.setupDraggable({\n ...grid.opts.draggable,\n ...{\n containment: (grid.opts._isNested && !grid.opts.dragOut)\n ? grid.el.parentElement\n : (grid.opts.draggable.containment || null),\n start: opts.start,\n stop: opts.stop,\n drag: opts.drag\n }\n });\n }\n });\n return this;\n }\n\n public dragIn(el: GridStackElement, opts: DDDragInOpt): GridStackDDNative {\n this._getDDElements(el).forEach(dEl => dEl.setupDraggable(opts));\n return this;\n }\n\n public droppable(el: GridItemHTMLElement, opts: DDOpts | DDDropOpt, key?: DDKey, value?: DDValue): GridStackDDNative {\n if (typeof opts.accept === 'function' && !opts._accept) {\n opts._accept = opts.accept;\n opts.accept = (el) => opts._accept(el);\n }\n this._getDDElements(el).forEach(dEl => {\n if (opts === 'disable' || opts === 'enable') {\n dEl.ddDroppable && dEl.ddDroppable[opts]();\n } else if (opts === 'destroy') {\n if (dEl.ddDroppable) { // error to call destroy if not there\n dEl.cleanDroppable();\n }\n } else if (opts === 'option') {\n dEl.setupDroppable({ [key]: value });\n } else {\n dEl.setupDroppable(opts);\n }\n });\n return this;\n }\n\n /** true if element is droppable */\n public isDroppable(el: DDElementHost): boolean {\n return el && el.ddElement && el.ddElement.ddDroppable && !el.ddElement.ddDroppable.disabled;\n }\n\n /** true if element is draggable */\n public isDraggable(el: DDElementHost): boolean {\n return el && el.ddElement && el.ddElement.ddDraggable && !el.ddElement.ddDraggable.disabled;\n }\n\n /** true if element is draggable */\n public isResizable(el: DDElementHost): boolean {\n return el && el.ddElement && el.ddElement.ddResizable && !el.ddElement.ddResizable.disabled;\n }\n\n public on(el: GridItemHTMLElement, name: string, callback: DDCallback): GridStackDDNative {\n this._getDDElements(el).forEach(dEl =>\n dEl.on(name, (event: Event) => {\n callback(\n event,\n DDManager.dragElement ? DDManager.dragElement.el : event.target as GridItemHTMLElement,\n DDManager.dragElement ? DDManager.dragElement.helper : null)\n })\n );\n return this;\n }\n\n public off(el: GridItemHTMLElement, name: string): GridStackDD {\n this._getDDElements(el).forEach(dEl => dEl.off(name));\n return this;\n }\n\n /** @internal returns a list of DD elements, creating them on the fly by default */\n private _getDDElements(els: GridStackElement, create = true): DDElement[] {\n let hosts = Utils.getElements(els) as DDElementHost[];\n if (!hosts.length) { return []; }\n let list = hosts.map(e => e.ddElement || (create ? DDElement.init(e) : null));\n if (!create) { list.filter(d => d); } // remove nulls\n return list;\n }\n}\n\n// finally register ourself\nGridStackDD.registerPlugin(GridStackDDNative);\n","// index.html5.ts 3.1.4 - everything you need for a Grid that uses HTML5 native drag&drop (work in progress) @preserve\r\n\r\n// import './gridstack-poly.js';\r\n\r\nexport * from './types';\r\nexport * from './utils';\r\nexport * from './gridstack-engine';\r\nexport * from './gridstack-ddi';\r\nexport * from './gridstack';\r\n\r\nexport * from './h5/gridstack-dd-native';\r\n\r\n// declare module 'gridstack'; for umd ?\r\n","// utils.ts 3.1.4 @preserve\r\n\r\n/**\r\n * https://gridstackjs.com/\r\n * (c) 2014-2020 Alain Dumesny, Dylan Weiss, Pavel Reznikov\r\n * gridstack.js may be freely distributed under the MIT license.\r\n*/\r\n\r\nimport { GridStackElement, GridStackWidget, GridStackNode, GridStackOptions, numberOrString } from './types';\r\n\r\nexport interface HeightData {\r\n h: number;\r\n unit: string;\r\n}\r\n\r\n/** checks for obsolete method names */\r\n// eslint-disable-next-line\r\nexport function obsolete(self, f, oldName: string, newName: string, rev: string): (...args: any[]) => any {\r\n let wrapper = (...args) => {\r\n console.warn('gridstack.js: Function `' + oldName + '` is deprecated in ' + rev + ' and has been replaced ' +\r\n 'with `' + newName + '`. It will be **completely** removed in v1.0');\r\n return f.apply(self, args);\r\n }\r\n wrapper.prototype = f.prototype;\r\n return wrapper;\r\n}\r\n\r\n/** checks for obsolete grid options (can be used for any fields, but msg is about options) */\r\nexport function obsoleteOpts(opts: GridStackOptions, oldName: string, newName: string, rev: string): void {\r\n if (opts[oldName] !== undefined) {\r\n opts[newName] = opts[oldName];\r\n console.warn('gridstack.js: Option `' + oldName + '` is deprecated in ' + rev + ' and has been replaced with `' +\r\n newName + '`. It will be **completely** removed in v1.0');\r\n }\r\n}\r\n\r\n/** checks for obsolete grid options which are gone */\r\nexport function obsoleteOptsDel(opts: GridStackOptions, oldName: string, rev: string, info: string): void {\r\n if (opts[oldName] !== undefined) {\r\n console.warn('gridstack.js: Option `' + oldName + '` is deprecated in ' + rev + info);\r\n }\r\n}\r\n\r\n/** checks for obsolete Jquery element attributes */\r\nexport function obsoleteAttr(el: HTMLElement, oldName: string, newName: string, rev: string): void {\r\n let oldAttr = el.getAttribute(oldName);\r\n if (oldAttr !== null) {\r\n el.setAttribute(newName, oldAttr);\r\n console.warn('gridstack.js: attribute `' + oldName + '`=' + oldAttr + ' is deprecated on this object in ' + rev + ' and has been replaced with `' +\r\n newName + '`. It will be **completely** removed in v1.0');\r\n }\r\n}\r\n\r\n/**\r\n * Utility methods\r\n */\r\nexport class Utils {\r\n\r\n /** convert a potential selector into actual list of html elements */\r\n static getElements(els: GridStackElement): HTMLElement[] {\r\n if (typeof els === 'string') {\r\n let list = document.querySelectorAll(els);\r\n if (!list.length && els[0] !== '.' && els[0] !== '#') {\r\n list = document.querySelectorAll('.' + els);\r\n if (!list.length) { list = document.querySelectorAll('#' + els) }\r\n }\r\n return Array.from(list) as HTMLElement[];\r\n }\r\n return [els];\r\n }\r\n\r\n /** convert a potential selector into actual single element */\r\n static getElement(els: GridStackElement): HTMLElement {\r\n if (typeof els === 'string') {\r\n if (!els.length) { return null}\r\n if (els[0] === '#') {\r\n return document.getElementById(els.substring(1));\r\n }\r\n if (els[0] === '.' || els[0] === '[') {\r\n return document.querySelector(els);\r\n }\r\n\r\n // if we start with a digit, assume it's an id (error calling querySelector('#1')) as class are not valid CSS\r\n if(!isNaN(+els[0])) { // start with digit\r\n return document.getElementById(els);\r\n }\r\n\r\n // finally try string, then id then class\r\n let el = document.querySelector(els);\r\n if (!el) { el = document.getElementById(els) }\r\n if (!el) { el = document.querySelector('.' + els) }\r\n return el as HTMLElement;\r\n }\r\n return els;\r\n }\r\n\r\n /** returns true if a and b overlap */\r\n static isIntercepted(a: GridStackWidget, b: GridStackWidget): boolean {\r\n return !(a.x + a.w <= b.x || b.x + b.w <= a.x || a.y + a.h <= b.y || b.y + b.h <= a.y);\r\n }\r\n\r\n /**\r\n * Sorts array of nodes\r\n * @param nodes array to sort\r\n * @param dir 1 for asc, -1 for desc (optional)\r\n * @param width width of the grid. If undefined the width will be calculated automatically (optional).\r\n **/\r\n static sort(nodes: GridStackNode[], dir?: -1 | 1, column?: number): GridStackNode[] {\r\n if (!column) {\r\n let widths = nodes.map(n => n.x + n.w);\r\n column = Math.max(...widths);\r\n }\r\n\r\n if (dir === -1)\r\n return nodes.sort((a, b) => (b.x + b.y * column)-(a.x + a.y * column));\r\n else\r\n return nodes.sort((b, a) => (b.x + b.y * column)-(a.x + a.y * column));\r\n }\r\n\r\n /**\r\n * creates a style sheet with style id under given parent\r\n * @param id will set the 'gs-style-id' attribute to that id\r\n * @param parent to insert the stylesheet as first child,\r\n * if none supplied it will be appended to the document head instead.\r\n */\r\n static createStylesheet(id: string, parent?: HTMLElement): CSSStyleSheet {\r\n let style: HTMLStyleElement = document.createElement('style');\r\n style.setAttribute('type', 'text/css');\r\n style.setAttribute('gs-style-id', id);\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n if ((style as any).styleSheet) { // TODO: only CSSImportRule have that and different beast ??\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n (style as any).styleSheet.cssText = '';\r\n } else {\r\n style.appendChild(document.createTextNode('')); // WebKit hack\r\n }\r\n if (!parent) {\r\n // default to head\r\n parent = document.getElementsByTagName('head')[0];\r\n parent.appendChild(style);\r\n } else {\r\n parent.insertBefore(style, parent.firstChild);\r\n }\r\n return style.sheet as CSSStyleSheet;\r\n }\r\n\r\n /** removed the given stylesheet id */\r\n static removeStylesheet(id: string): void {\r\n let el = document.querySelector('STYLE[gs-style-id=' + id + ']');\r\n if (!el || !el.parentNode) return;\r\n el.parentNode.removeChild(el);\r\n }\r\n\r\n /** inserts a CSS rule */\r\n static addCSSRule(sheet: CSSStyleSheet, selector: string, rules: string): void {\r\n if (typeof sheet.addRule === 'function') {\r\n sheet.addRule(selector, rules);\r\n } else if (typeof sheet.insertRule === 'function') {\r\n sheet.insertRule(`${selector}{${rules}}`);\r\n }\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n static toBool(v: unknown): boolean {\r\n if (typeof v === 'boolean') {\r\n return v;\r\n }\r\n if (typeof v === 'string') {\r\n v = v.toLowerCase();\r\n return !(v === '' || v === 'no' || v === 'false' || v === '0');\r\n }\r\n return Boolean(v);\r\n }\r\n\r\n static toNumber(value: null | string): number {\r\n return (value === null || value.length === 0) ? undefined : Number(value);\r\n }\r\n\r\n static parseHeight(val: numberOrString): HeightData {\r\n let h: number;\r\n let unit = 'px';\r\n if (typeof val === 'string') {\r\n let match = val.match(/^(-[0-9]+\\.[0-9]+|[0-9]*\\.[0-9]+|-[0-9]+|[0-9]+)(px|em|rem|vh|vw|%)?$/);\r\n if (!match) {\r\n throw new Error('Invalid height');\r\n }\r\n unit = match[2] || 'px';\r\n h = parseFloat(match[1]);\r\n } else {\r\n h = val;\r\n }\r\n return { h, unit };\r\n }\r\n\r\n /** copies unset fields in target to use the given default sources values */\r\n // eslint-disable-next-line\r\n static defaults(target, ...sources): {} {\r\n\r\n sources.forEach(source => {\r\n for (const key in source) {\r\n if (!source.hasOwnProperty(key)) { return; }\r\n if (target[key] === null || target[key] === undefined) {\r\n target[key] = source[key];\r\n } else if (typeof source[key] === 'object' && typeof target[key] === 'object') {\r\n // property is an object, recursively add it's field over... #1373\r\n this.defaults(target[key], source[key]);\r\n }\r\n }\r\n });\r\n\r\n return target;\r\n }\r\n\r\n /** given 2 objects return true if they have the same values. Checks for Object {} having same fields and values (just 1 level down) */\r\n static same(a: unknown, b: unknown): boolean {\r\n if (typeof a !== 'object') { return a == b; }\r\n if (typeof a !== typeof b) { return false; }\r\n // else we have object, check just 1 level deep for being same things...\r\n if (Object.keys(a).length !== Object.keys(b).length) { return false; }\r\n for (const key in a) {\r\n if (a[key] !== b[key]) { return false; }\r\n }\r\n return true;\r\n }\r\n\r\n /** removes field from the first object if same as the second objects (like diffing) and internal '_' for saving */\r\n static removeInternalAndSame(a: unknown, b: unknown):void {\r\n if (typeof a !== 'object' || typeof b !== 'object') return;\r\n for (let key in a) {\r\n let val = a[key];\r\n if (val && typeof val === 'object') {\r\n for (let i in val) {\r\n if (val[i] === b[key][i] || i[0] === '_') { delete val[i] }\r\n }\r\n if (!Object.keys(val).length) { delete a[key] }\r\n } else if (val === b[key] || key[0] === '_') { delete a[key] }\r\n }\r\n }\r\n\r\n /** return the closest parent matching the given class */\r\n static closestByClass(el: HTMLElement, name: string): HTMLElement {\r\n\r\n while(el = el.parentElement) {\r\n if (el.classList.contains(name)) return el;\r\n }\r\n return null;\r\n }\r\n\r\n /** delay calling the given function by certain amount of time */\r\n static throttle(callback: () => void, delay: number): () => void {\r\n let isWaiting = false;\r\n\r\n return (...args) => {\r\n if (!isWaiting) {\r\n callback.apply(this, args);\r\n isWaiting = true;\r\n setTimeout(() => isWaiting = false, delay);\r\n }\r\n }\r\n }\r\n\r\n static removePositioningStyles(el: HTMLElement): void {\r\n let style = el.style;\r\n if (style.position) {\r\n style.removeProperty('position');\r\n }\r\n if (style.left) {\r\n style.removeProperty('left');\r\n }\r\n if (style.top) {\r\n style.removeProperty('top');\r\n }\r\n if (style.width) {\r\n style.removeProperty('width');\r\n }\r\n if (style.height) {\r\n style.removeProperty('height');\r\n }\r\n }\r\n\r\n /** @internal */\r\n static getScrollParent(el: HTMLElement): HTMLElement {\r\n if (el === null) return document.documentElement;\r\n const style = getComputedStyle(el);\r\n const overflowRegex = /(auto|scroll)/;\r\n\r\n if (overflowRegex.test(style.overflow + style.overflowY)) {\r\n return el;\r\n } else {\r\n return this.getScrollParent(el.parentElement);\r\n }\r\n }\r\n\r\n /** @internal */\r\n static updateScrollPosition(el: HTMLElement, position: {top: number}, distance: number): void {\r\n // is widget in view?\r\n let rect = el.getBoundingClientRect();\r\n let innerHeightOrClientHeight = (window.innerHeight || document.documentElement.clientHeight);\r\n if (rect.top < 0 ||\r\n rect.bottom > innerHeightOrClientHeight\r\n ) {\r\n // set scrollTop of first parent that scrolls\r\n // if parent is larger than el, set as low as possible\r\n // to get entire widget on screen\r\n let offsetDiffDown = rect.bottom - innerHeightOrClientHeight;\r\n let offsetDiffUp = rect.top;\r\n let scrollEl = this.getScrollParent(el);\r\n if (scrollEl !== null) {\r\n let prevScroll = scrollEl.scrollTop;\r\n if (rect.top < 0 && distance < 0) {\r\n // moving up\r\n if (el.offsetHeight > innerHeightOrClientHeight) {\r\n scrollEl.scrollTop += distance;\r\n } else {\r\n scrollEl.scrollTop += Math.abs(offsetDiffUp) > Math.abs(distance) ? distance : offsetDiffUp;\r\n }\r\n } else if (distance > 0) {\r\n // moving down\r\n if (el.offsetHeight > innerHeightOrClientHeight) {\r\n scrollEl.scrollTop += distance;\r\n } else {\r\n scrollEl.scrollTop += offsetDiffDown > distance ? distance : offsetDiffDown;\r\n }\r\n }\r\n // move widget y by amount scrolled\r\n position.top += scrollEl.scrollTop - prevScroll;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * @internal Function used to scroll the page.\r\n *\r\n * @param event `MouseEvent` that triggers the resize\r\n * @param el `HTMLElement` that's being resized\r\n * @param distance Distance from the V edges to start scrolling\r\n */\r\n static updateScrollResize(event: MouseEvent, el: HTMLElement, distance: number): void {\r\n const scrollEl = this.getScrollParent(el);\r\n const height = scrollEl.clientHeight;\r\n\r\n const top = event.clientY < distance;\r\n const bottom = event.clientY > height - distance;\r\n\r\n if (top) {\r\n // This also can be done with a timeout to keep scrolling while the mouse is\r\n // in the scrolling zone. (will have smoother behavior)\r\n scrollEl.scrollBy({ behavior: 'smooth', top: event.clientY - distance});\r\n } else if (bottom) {\r\n scrollEl.scrollBy({ behavior: 'smooth', top: distance - (height - event.clientY)});\r\n }\r\n }\r\n}\r\n\r\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tif(__webpack_module_cache__[moduleId]) {\n\t\treturn __webpack_module_cache__[moduleId].exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// module exports must be returned from runtime so entry inlining is disabled\n// startup\n// Load entry module and return exports\nreturn __webpack_require__(117);\n"],"sourceRoot":""} \ No newline at end of file +{"version":3,"sources":["webpack://GridStack/webpack/universalModuleDefinition","webpack://GridStack/./src/gridstack-dd.ts","webpack://GridStack/./src/gridstack-ddi.ts","webpack://GridStack/./src/gridstack-engine.ts","webpack://GridStack/./src/gridstack.ts","webpack://GridStack/./src/h5/dd-base-impl.ts","webpack://GridStack/./src/h5/dd-draggable.ts","webpack://GridStack/./src/h5/dd-droppable.ts","webpack://GridStack/./src/h5/dd-element.ts","webpack://GridStack/./src/h5/dd-manager.ts","webpack://GridStack/./src/h5/dd-resizable-handle.ts","webpack://GridStack/./src/h5/dd-resizable.ts","webpack://GridStack/./src/h5/dd-utils.ts","webpack://GridStack/./src/h5/gridstack-dd-native.ts","webpack://GridStack/./src/index-h5.ts","webpack://GridStack/./src/utils.ts","webpack://GridStack/webpack/bootstrap","webpack://GridStack/webpack/startup"],"names":["root","factory","exports","module","define","amd","self","GridStackDD","GridStackDDI","get","el","this","draggable","resizable","gridstackNode","_initDD","GridStack","prototype","_setupAcceptWidget","opts","staticGrid","acceptWidgets","droppable","accept","grid","onDrag","event","node","pos","getCellFromPixel","left","pageX","top","pageY","x","Math","max","y","_added","engine","canMoveNode","moveNode","_updateContainerHeight","autoPosition","willItFit","cleanNodes","beginUpdate","addNode","_writePosAttr","placeholder","w","h","appendChild","_beforeDragX","_beforeDragY","canAccept","selector","matches","maxRow","n","minW","minH","on","_readAttr","round","offsetWidth","cellWidth","offsetHeight","getCellHeight","newNode","prepareNode","_temporary","_isOutOfGrid","_gridstackNodeOrig","off","removeNode","parentNode","remove","helper","wasAdded","parentElement","origNode","oGrid","removedNodes","push","_triggerRemoveEvent","_id","cleanupNode","cloneNode","Utils","removePositioningStyles","_writeAttr","addedNodes","_triggerAddEvent","_triggerChangeEvent","endUpdate","_gsEventHandler","type","undefined","window","setTimeout","_prepareDragDropByNode","_setupRemoveDrop","removable","trashEl","document","querySelector","isDroppable","removableOptions","dataset","inTrashZone","_setupRemovingTimeout","_clearRemovingTimeout","_removeTimeout","classList","add","_isAboutToRemove","removeTimeout","clearTimeout","_setupDragIn","dragIn","isDraggable","dragInOptions","cellHeight","locked","noMove","disableDrag","noResize","disableResize","onStartMoving","ui","target","append","_prevYPix","position","maxW","maxH","dragOrResize","distance","updateScrollPosition","isOutside","_temporaryRemoved","_lastTriedX","_lastTriedY","updateScrollResize","size","width","height","_lastTriedW","_lastTriedH","onEndMoving","gridToNotify","_resizeNestedGrids","start","stop","drag","resize","movable","els","val","getElements","forEach","pluginClass","ddi","registerPlugin","GridStackEngine","getGridHeight","obsolete","getRow","column","onChange","_float","float","nodes","batchMode","_prevFloat","_packNodes","_notify","_sortNodes","nn","hasLocked","Boolean","find","moved","collisionNode","collide","area","isIntercepted","length","batchUpdate","copyNodes","_dirty","commit","dir","sort","i","_updating","_packY","newY","box","slice","bn","canBeMoved","resizing","_idSeq","defaults","Number","isNaN","min","verify","dirtNodes","_origY","_origX","_origW","_origH","filter","removeDOM","dirtyNodes","Array","isArray","concat","getDirtyNodes","triggerAddEvent","floor","_fixCollisions","triggerEvent","_layouts","isNodeChangedPosition","clonedNode","some","clone","map","canMove","row","noPack","reduce","memo","saveElement","widgets","key","_ignoreLayoutsNodeChange","layout","l","ratio","oldColumn","cacheLayout","cacheNodes","lastIndex","cacheNode","j","findIndex","newNodes","splice","move","scale","clear","copy","prop","GridDefaults","minRow","itemClass","placeholderClass","placeholderText","handle","handleClass","styleInHead","margin","auto","minWidth","animate","alwaysShowResizeHandle","autoHide","handles","scroll","appendTo","revert","rtl","marginUnit","cellHeightUnit","disableOneColumnMode","oneColumnModeDomSort","obsoleteOpts","obsoleteAttr","rowAttr","toNumber","getAttribute","toBool","_styleSheetClass","random","toFixed","initMargin","style","direction","parentGridItemEl","closestByClass","_isNested","subGrid","_isAutoCellHeight","marginDiff","marginRight","marginLeft","marginTop","marginBottom","_setStaticClass","cbNodes","removeChild","_updateStyles","elements","getGridItems","parseInt","e","_prepareElement","saveInitial","setAnimation","placeholderChild","createElement","className","innerHTML","_updateWindowResizeEvent","options","elOrString","getGridElement","gridstack","console","error","grids","getGridElements","parent","opt","doc","implementation","createHTMLDocument","body","class","children","init","load","arguments","warn","a","id","addWidget","content","domAttr","_insertNotAppend","prepend","saveContent","saveGridOpt","list","save","sub","o","removeInternalAndSame","addAndRemove","items","_prevColumn","removed","removeWidget","item","update","addGrid","forcePixel","data","parseHeight","unit","innerWidth","compact","domNodes","updateNodeWidths","from","setStatic","removeAll","_removeStylesheet","enableMove","enableResize","_triggerEvent","doEnable","includeNewWidgets","useDocRelative","containerPos","getBoundingClientRect","documentElement","scrollTop","offsetTop","offsetLeft","relativeLeft","relativeTop","columnWidth","rowHeight","isAreaEmpty","getElement","name","callback","indexOf","split","noData","detail","addEventListener","log","removeEventListener","doAnimate","m","keys","k","changed","ddChanged","value","layoutsNodesChange","CustomEvent","bubbles","Event","dispatchEvent","_styles","removeStylesheet","forceUpdate","prefix","styleLocation","createStylesheet","_max","addCSSRule","bottom","right","getHeight","rows","cssMinHeight","getComputedStyle","setAttribute","String","removeProperty","querySelectorAll","onParentResize","same","attrs","resizeHandles","removeAttribute","hasOwnProperty","classes","clientWidth","throttle","_oneColumnMode","forceRemove","workTodo","_windowResizeBind","bind","margins","Engine","_disabled","_eventRegister","eventName","disabled","DDDraggable","DDBaseImplement","option","super","dragging","containmentRect","offset","substring","dragEl","contains","_dragStart","_drag","_dragEnd","_dragFollow","enable","forDestroy","disable","destroy","Object","DDManager","dragElement","_createHelper","_setupHelperContainmentStyle","dragOffset","_getDragOffset","helperContainment","ev","DDUtils","initEvent","_setupDragFollowNodeNotifyStart","dragFollowTimer","_cancelDragGhost","_setupHelperStyle","dragEventListenerOption","preventDefault","paintTimer","cancelAnimationFrame","parentOriginStylePosition","_removeHelperStyle","apply","dragElementOriginStyle","originStyleProp","pointerEvents","willChange","transition","basePosition","zIndex","requestAnimationFrame","clientX","clientY","match","img","dataTransfer","setDragImage","stopPropagation","xformOffsetX","xformOffsetY","testEl","addElStyles","opacity","testElPosition","targetOffset","DDDroppable","_dragEnter","_dragOver","_dragLeave","_drop","_setupAccept","moving","_removeLeaveCallbacks","_canDrop","over","_ui","relatedTarget","out","drop","DDElement","ddElement","ddDraggable","ddDroppable","ddResizable","updateOption","DDResizable","DDResizableHandle","host","_mouseDown","_mouseMove","_mouseUp","_init","userSelect","mouseDownEvent","s","abs","_showHandlers","_hideHandlers","newRect","originalRect","scrolled","rect","temporalRect","_setupAutoHide","_setupHandlers","_removeHandlers","updateHandles","updateAutoHide","handlerDirection","handlers","trim","_resizeStart","_resizeStop","_resizing","scrollEl","getScrollParent","scrollY","startEvent","_setupHelper","_applyChange","_getChange","_cleanHelper","elOriginStyleVal","_originStyleProp","oEvent","offsetH","offsetV","reshape","_getReShapeSize","oWidth","oHeight","maxWidth","maxHeight","minHeight","containmentEl","test","styles","info","evt","obj","button","which","buttons","cancelable","p","isEventSupportPassiveOption","supportsPassive","passiveTest","GridStackDDNative","_getDDElements","dEl","cleanResizable","setupResizable","cleanDraggable","setupDraggable","containment","dragOut","_accept","cleanDroppable","setupDroppable","create","hosts","d","f","oldName","newName","rev","wrapper","args","oldAttr","getElementById","b","widths","styleSheet","cssText","createTextNode","insertBefore","firstChild","getElementsByTagName","sheet","rules","addRule","insertRule","v","toLowerCase","Error","parseFloat","sources","source","delay","isWaiting","overflow","overflowY","innerHeightOrClientHeight","innerHeight","clientHeight","offsetDiffDown","offsetDiffUp","prevScroll","scrollBy","behavior","__webpack_module_cache__","__webpack_require__","moduleId","__webpack_modules__"],"mappings":"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","file":"gridstack-h5.js","sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"GridStack\"] = factory();\n\telse\n\t\troot[\"GridStack\"] = factory();\n})(self, function() {\nreturn ","// gridstack-GridStackDD.get().ts 3.1.5 @preserve\r\n\r\n/**\r\n * https://gridstackjs.com/\r\n * (c) 2014-2020 Alain Dumesny, Dylan Weiss, Pavel Reznikov\r\n * gridstack.js may be freely distributed under the MIT license.\r\n*/\r\n/* eslint-disable @typescript-eslint/no-unused-vars */\r\n\r\nimport { GridStackDDI } from './gridstack-ddi';\r\nimport { GridItemHTMLElement, GridStackNode, GridStackElement, DDUIData, DDDragInOpt } from './types';\r\nimport { GridStack } from './gridstack';\r\nimport { Utils } from './utils';\r\n\r\n/** Drag&Drop drop options */\r\nexport type DDDropOpt = {\r\n /** function or class type that this grid will accept as dropped items (see GridStackOptions.acceptWidgets) */\r\n accept?: (el: GridItemHTMLElement) => boolean;\r\n}\r\n\r\n/** drag&drop options currently called from the main code, but others can be passed in grid options */\r\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\r\nexport type DDOpts = 'enable' | 'disable' | 'destroy' | 'option' | string | any;\r\nexport type DDKey = 'minWidth' | 'minHeight' | 'maxWidth' | 'maxHeight';\r\nexport type DDValue = number | string;\r\n\r\n/** drag&drop events callbacks */\r\nexport type DDCallback = (event: Event, arg2: GridItemHTMLElement, helper?: GridItemHTMLElement) => void;\r\n\r\n/**\r\n * Base class implementing common Grid drag'n'drop functionality, with domain specific subclass (h5 vs jq subclasses)\r\n */\r\nexport abstract class GridStackDD extends GridStackDDI {\r\n\r\n /** override to cast to correct type */\r\n static get(): GridStackDD {\r\n return GridStackDDI.get() as GridStackDD;\r\n }\r\n\r\n /** removes any drag&drop present (called during destroy) */\r\n public remove(el: GridItemHTMLElement): GridStackDD {\r\n this.draggable(el, 'destroy').resizable(el, 'destroy');\r\n if (el.gridstackNode) {\r\n delete el.gridstackNode._initDD; // reset our DD init flag\r\n }\r\n return this;\r\n }\r\n\r\n // APIs that must be implemented by subclasses to do actual darg/drop/resize called by GridStack code below\r\n\r\n public abstract resizable(el: GridItemHTMLElement, opts: DDOpts, key?: DDKey, value?: DDValue): GridStackDD;\r\n\r\n public abstract isResizable(el: HTMLElement): boolean;\r\n\r\n public abstract draggable(el: GridItemHTMLElement, opts: DDOpts, key?: DDKey, value?: DDValue): GridStackDD;\r\n\r\n public abstract dragIn(el: GridStackElement, opts: DDDragInOpt): GridStackDD;\r\n\r\n public abstract isDraggable(el: HTMLElement): boolean;\r\n\r\n public abstract droppable(el: GridItemHTMLElement, opts: DDOpts | DDDropOpt, key?: DDKey, value?: DDValue): GridStackDD;\r\n\r\n public abstract isDroppable(el: HTMLElement): boolean;\r\n\r\n public abstract on(el: GridItemHTMLElement, eventName: string, callback: DDCallback): GridStackDD;\r\n\r\n public abstract off(el: GridItemHTMLElement, eventName: string): GridStackDD;\r\n}\r\n\r\n/********************************************************************************\r\n * GridStack code that is doing drag&drop extracted here so main class is smaller\r\n * for static grid that don't do any of this work anyway. Saves about 10k.\r\n * TODO: no code hint in code below as this is so look at alternatives ?\r\n * https://www.typescriptlang.org/docs/handbook/declaration-merging.html\r\n * https://www.typescriptlang.org/docs/handbook/mixins.html\r\n ********************************************************************************/\r\n\r\n/** @internal called to add drag over support to support widgets */\r\nGridStack.prototype._setupAcceptWidget = function(): GridStack {\r\n if (this.opts.staticGrid) return this;\r\n\r\n // if we don't accept external widgets (default) we still need to accept dragging within our\r\n // list of items (else we get a no-drop icon on windows)\r\n if (!this.opts.acceptWidgets) {\r\n GridStackDD.get().droppable(this.el, {\r\n accept: (el: GridItemHTMLElement) => el.gridstackNode && el.gridstackNode.grid === this\r\n })\r\n return this;\r\n }\r\n\r\n let onDrag = (event, el: GridItemHTMLElement) => {\r\n let node = el.gridstackNode;\r\n let pos = this.getCellFromPixel({left: event.pageX, top: event.pageY}, true);\r\n let x = Math.max(0, pos.x);\r\n let y = Math.max(0, pos.y);\r\n if (!node._added) {\r\n node.x = x;\r\n node.y = y;\r\n delete node.autoPosition;\r\n\r\n // 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\r\n if (!this.engine.willItFit(node)) {\r\n node.autoPosition = true; // ignore x,y and try for any slot...\r\n if (!this.engine.willItFit(node)) return; // full grid or can't grow\r\n }\r\n node._added = true;\r\n\r\n node.el = el;\r\n this.engine.cleanNodes();\r\n this.engine.beginUpdate(node);\r\n this.engine.addNode(node);\r\n\r\n this._writePosAttr(this.placeholder, node.x, node.y, node.w, node.h);\r\n this.el.appendChild(this.placeholder);\r\n node.el = this.placeholder; // dom we update while dragging...\r\n node._beforeDragX = node.x;\r\n node._beforeDragY = node.y;\r\n\r\n this._updateContainerHeight();\r\n } else if ((x !== node.x || y !== node.y) && this.engine.canMoveNode(node, x, y)) {\r\n this.engine.moveNode(node, x, y);\r\n this._updateContainerHeight();\r\n }\r\n };\r\n\r\n GridStackDD.get()\r\n .droppable(this.el, {\r\n accept: (el: GridItemHTMLElement) => {\r\n let node: GridStackNode = el.gridstackNode;\r\n // set accept drop to true on ourself (which we ignore) so we don't get \"can't drop\" icon in HTML5 mode while moving\r\n if (node && node.grid === this) return true;\r\n // check for accept method or class matching\r\n let canAccept = true;\r\n if (typeof this.opts.acceptWidgets === 'function') {\r\n canAccept = this.opts.acceptWidgets(el);\r\n } else {\r\n let selector = (this.opts.acceptWidgets === true ? '.grid-stack-item' : this.opts.acceptWidgets as string);\r\n canAccept = el.matches(selector);\r\n }\r\n // finally check to make sure we actually have space left #1571\r\n if (canAccept && node && this.opts.maxRow) {\r\n let n = {w: node.w, h: node.h, minW: node.minW, minH: node.minH}; // only width/height matters\r\n canAccept = this.engine.willItFit(n);\r\n }\r\n return canAccept;\r\n }\r\n })\r\n .on(this.el, 'dropover', (event, el: GridItemHTMLElement) => {\r\n // ignore drop enter on ourself, and prevent parent from receiving event\r\n let node = el.gridstackNode;\r\n if (node && node.grid === this) {\r\n delete node._added; // reset this to track placeholder again in case we were over other grid #1484 (dropout doesn't always clear)\r\n return false;\r\n }\r\n\r\n // load any element attributes if we don't have a node\r\n if (!node) {\r\n node = this._readAttr(el);\r\n }\r\n\r\n // if the item came from another grid, let it know it was added here to removed duplicate shadow #393\r\n if (node.grid && node.grid !== this) {\r\n node._added = true;\r\n }\r\n\r\n // if not calculate the grid size based on element outer size\r\n let w = node.w || Math.round(el.offsetWidth / this.cellWidth()) || 1;\r\n let h = node.h || Math.round(el.offsetHeight / this.getCellHeight(true)) || 1;\r\n\r\n // copy the node original values (min/max/id/etc...) but override width/height/other flags which are this grid specific\r\n let newNode = this.engine.prepareNode({...node, ...{w, h, _added: false, _temporary: true}});\r\n newNode._isOutOfGrid = true;\r\n el.gridstackNode = newNode;\r\n el._gridstackNodeOrig = node;\r\n\r\n GridStackDD.get().on(el, 'drag', onDrag);\r\n return false; // prevent parent from receiving msg (which may be grid as well)\r\n })\r\n .on(this.el, 'dropout', (event, el: GridItemHTMLElement) => {\r\n let node = el.gridstackNode;\r\n if (!node) return;\r\n\r\n // clear any added flag now that we are leaving #1484\r\n delete node._added;\r\n\r\n // jquery-ui bug. Must verify widget is being dropped out\r\n // check node variable that gets set when widget is out of grid\r\n if (!node._isOutOfGrid) {\r\n return;\r\n }\r\n\r\n GridStackDD.get().off(el, 'drag');\r\n node.el = null;\r\n this.engine.removeNode(node);\r\n if (this.placeholder.parentNode === this.el) {\r\n this.placeholder.remove();\r\n }\r\n this._updateContainerHeight();\r\n el.gridstackNode = el._gridstackNodeOrig;\r\n return false; // prevent parent from receiving msg (which may be grid as well)\r\n })\r\n .on(this.el, 'drop', (event, el: GridItemHTMLElement, helper: GridItemHTMLElement) => {\r\n let node = el.gridstackNode;\r\n let wasAdded = !!this.placeholder.parentElement; // skip items not actually added to us because of constrains, but do cleanup #1419\r\n // ignore drop on ourself from ourself - dragend will handle the simple move instead\r\n if (node && node.grid === this) return false;\r\n\r\n this.placeholder.remove();\r\n\r\n // notify previous grid of removal\r\n let origNode = el._gridstackNodeOrig;\r\n delete el._gridstackNodeOrig;\r\n if (wasAdded && origNode && origNode.grid && origNode.grid !== this) {\r\n let oGrid = origNode.grid;\r\n oGrid.placeholder.remove();\r\n origNode.el = el; // was using placeholder, have it point to node we've moved instead\r\n oGrid.engine.removedNodes.push(origNode);\r\n oGrid._triggerRemoveEvent();\r\n }\r\n\r\n if (!node) return false;\r\n\r\n // use existing placeholder node as it's already in our list with drop location\r\n if (wasAdded) {\r\n const _id = node._id;\r\n this.engine.cleanupNode(node); // removes all internal _xyz values (including the _id so add that back)\r\n node._id = _id;\r\n node.grid = this;\r\n }\r\n GridStackDD.get().off(el, 'drag');\r\n // if we made a copy ('helper' which is temp) of the original node then insert a copy, else we move the original node (#1102)\r\n // as the helper will be nuked by jqueryui otherwise\r\n if (helper !== el) {\r\n helper.remove();\r\n el.gridstackNode = origNode; // original item (left behind) is re-stored to pre dragging as the node now has drop info\r\n if (wasAdded) {\r\n el = el.cloneNode(true) as GridItemHTMLElement;\r\n }\r\n } else {\r\n el.remove(); // reduce flicker as we change depth here, and size further down\r\n GridStackDD.get().remove(el);\r\n }\r\n if (!wasAdded) return false;\r\n el.gridstackNode = node;\r\n node.el = el;\r\n\r\n Utils.removePositioningStyles(el);\r\n this._writeAttr(el, node);\r\n this.el.appendChild(el);\r\n this._updateContainerHeight();\r\n this.engine.addedNodes.push(node);\r\n this._triggerAddEvent();\r\n this._triggerChangeEvent();\r\n\r\n this.engine.endUpdate();\r\n if (this._gsEventHandler['dropped']) {\r\n this._gsEventHandler['dropped']({type: 'dropped'}, origNode && origNode.grid ? origNode : undefined, node);\r\n }\r\n\r\n // wait till we return out of the drag callback to set the new drag&resize handler or they may get messed up\r\n // IFF we are still there (some application will use as placeholder and insert their real widget instead)\r\n window.setTimeout(() => {\r\n if (node.el && node.el.parentElement) this._prepareDragDropByNode(node);\r\n });\r\n\r\n return false; // prevent parent from receiving msg (which may be grid as well)\r\n });\r\n return this;\r\n}\r\n\r\n/** @internal called to setup a trash drop zone if the user specifies it */\r\nGridStack.prototype._setupRemoveDrop = function(): GridStack {\r\n if (!this.opts.staticGrid && typeof this.opts.removable === 'string') {\r\n let trashEl = document.querySelector(this.opts.removable) as HTMLElement;\r\n if (!trashEl) return this;\r\n // only register ONE dropover/dropout callback for the 'trash', and it will\r\n // update the passed in item and parent grid because the 'trash' is a shared resource anyway,\r\n // and Native DD only has 1 event CB (having a list and technically a per grid removableOptions complicates things greatly)\r\n if (!GridStackDD.get().isDroppable(trashEl)) {\r\n GridStackDD.get().droppable(trashEl, this.opts.removableOptions)\r\n .on(trashEl, 'dropover', function(event, el) { // don't use => notation to avoid using 'this' as grid by mistake...\r\n let node = el.gridstackNode;\r\n if (!node || !node.grid) return;\r\n el.dataset.inTrashZone = 'true';\r\n node.grid._setupRemovingTimeout(el);\r\n })\r\n .on(trashEl, 'dropout', function(event, el) { // same\r\n let node = el.gridstackNode;\r\n if (!node || !node.grid) return;\r\n delete el.dataset.inTrashZone;\r\n node.grid._clearRemovingTimeout(el);\r\n });\r\n }\r\n }\r\n return this;\r\n}\r\n\r\n/** @internal */\r\nGridStack.prototype._setupRemovingTimeout = function(el: GridItemHTMLElement): GridStack {\r\n let node = el.gridstackNode;\r\n if (!node || node._removeTimeout || !this.opts.removable) return this;\r\n node._removeTimeout = window.setTimeout(() => {\r\n el.classList.add('grid-stack-item-removing');\r\n node._isAboutToRemove = true;\r\n }, this.opts.removeTimeout);\r\n return this;\r\n}\r\n\r\n/** @internal */\r\nGridStack.prototype._clearRemovingTimeout = function(el: GridItemHTMLElement): GridStack {\r\n let node = el.gridstackNode;\r\n if (!node || !node._removeTimeout) return this;\r\n clearTimeout(node._removeTimeout);\r\n delete node._removeTimeout;\r\n el.classList.remove('grid-stack-item-removing');\r\n delete node._isAboutToRemove;\r\n return this;\r\n}\r\n\r\n/** @internal call to setup dragging in from the outside (say toolbar), with options */\r\nGridStack.prototype._setupDragIn = function(): GridStack {\r\n if (!this.opts.staticGrid && typeof this.opts.dragIn === 'string') {\r\n if (!GridStackDD.get().isDraggable(this.opts.dragIn)) {\r\n GridStackDD.get().dragIn(this.opts.dragIn, this.opts.dragInOptions);\r\n }\r\n }\r\n return this;\r\n}\r\n\r\n/** @internal prepares the element for drag&drop **/\r\nGridStack.prototype._prepareDragDropByNode = function(node: GridStackNode): GridStack {\r\n let el = node.el;\r\n\r\n // check for disabled grid first\r\n if (this.opts.staticGrid || node.locked ||\r\n ((node.noMove || this.opts.disableDrag) && (node.noResize || this.opts.disableResize))) {\r\n if (node._initDD) {\r\n GridStackDD.get().remove(node.el); // nukes everything instead of just disable, will add some styles back next\r\n delete node._initDD;\r\n }\r\n node.el.classList.add('ui-draggable-disabled', 'ui-resizable-disabled'); // add styles one might depend on #1435\r\n return this;\r\n }\r\n // check if init already done\r\n if (node._initDD) {\r\n // fine tune drag vs move by disabling any part...\r\n if (node.noMove || this.opts.disableDrag) {\r\n GridStackDD.get().draggable(el, 'disable');\r\n }\r\n if (node.noResize || this.opts.disableResize) {\r\n GridStackDD.get().resizable(el, 'disable');\r\n }\r\n return this;\r\n }\r\n\r\n // remove our style that look like D&D\r\n node.el.classList.remove('ui-draggable-disabled', 'ui-resizable-disabled');\r\n\r\n // variables used/cashed between the 3 start/move/end methods, in addition to node passed above\r\n let cellWidth: number;\r\n let cellHeight: number;\r\n\r\n /** called when item starts moving/resizing */\r\n let onStartMoving = (event: Event, ui: DDUIData): void => {\r\n let target = event.target as HTMLElement;\r\n\r\n // trigger any 'dragstart' / 'resizestart' manually\r\n if (this._gsEventHandler[event.type]) {\r\n this._gsEventHandler[event.type](event, target);\r\n }\r\n\r\n this.engine.cleanNodes();\r\n this.engine.beginUpdate(node);\r\n\r\n this._writePosAttr(this.placeholder, node.x, node.y, node.w, node.h)\r\n this.el.append(this.placeholder);\r\n\r\n node.el = this.placeholder;\r\n node._beforeDragX = node.x;\r\n node._beforeDragY = node.y;\r\n node._prevYPix = ui.position.top;\r\n\r\n // set the min/max resize info\r\n cellWidth = this.cellWidth();\r\n cellHeight = this.getCellHeight(true); // force pixels for calculations\r\n GridStackDD.get().resizable(el, 'option', 'minWidth', cellWidth * (node.minW || 1));\r\n GridStackDD.get().resizable(el, 'option', 'minHeight', cellHeight * (node.minH || 1));\r\n if (node.maxW) { GridStackDD.get().resizable(el, 'option', 'maxWidth', cellWidth * node.maxW); }\r\n if (node.maxH) { GridStackDD.get().resizable(el, 'option', 'maxHeight', cellHeight * node.maxH); }\r\n }\r\n\r\n /** called when item is being dragged/resized */\r\n let dragOrResize = (event: Event, ui: DDUIData): void => {\r\n let x = Math.round(ui.position.left / cellWidth);\r\n let y = Math.round(ui.position.top / cellHeight);\r\n let w: number;\r\n let h: number;\r\n\r\n if (event.type === 'drag') {\r\n let distance = ui.position.top - node._prevYPix;\r\n node._prevYPix = ui.position.top;\r\n Utils.updateScrollPosition(el, ui.position, distance);\r\n // if inTrash, outside of the bounds or added to another grid (#393) temporarily remove it from us\r\n if (el.dataset.inTrashZone || node._added || this.engine.isOutside(x, y, node)) {\r\n if (node._temporaryRemoved) return;\r\n if (this.opts.removable === true) {\r\n this._setupRemovingTimeout(el);\r\n }\r\n\r\n x = node._beforeDragX;\r\n y = node._beforeDragY;\r\n\r\n if (this.placeholder.parentNode === this.el) {\r\n this.placeholder.remove();\r\n }\r\n this.engine.removeNode(node);\r\n this._updateContainerHeight();\r\n\r\n node._temporaryRemoved = true;\r\n delete node._added; // no need for this now\r\n } else {\r\n this._clearRemovingTimeout(el);\r\n\r\n if (node._temporaryRemoved) {\r\n this.engine.addNode(node);\r\n this._writePosAttr(this.placeholder, x, y, w, h);\r\n this.el.appendChild(this.placeholder);\r\n node.el = this.placeholder;\r\n delete node._temporaryRemoved;\r\n }\r\n }\r\n if (node._lastTriedX === x && node._lastTriedY === y) return;\r\n } else if (event.type === 'resize') {\r\n if (x < 0) return;\r\n // Scrolling page if needed\r\n Utils.updateScrollResize(event as MouseEvent, el, cellHeight);\r\n w = Math.round(ui.size.width / cellWidth);\r\n h = Math.round(ui.size.height / cellHeight);\r\n if (w === node.w && h === node.h) return;\r\n }\r\n\r\n if (!this.engine.canMoveNode(node, x, y, w, h)) return;\r\n node._lastTriedX = x;\r\n node._lastTriedY = y;\r\n node._lastTriedW = w;\r\n node._lastTriedH = h;\r\n this.engine.moveNode(node, x, y, w, h);\r\n this._updateContainerHeight();\r\n }\r\n\r\n /** called when the item stops moving/resizing */\r\n let onEndMoving = (event: Event): void => {\r\n if (this.placeholder.parentNode === this.el) {\r\n this.placeholder.remove();\r\n }\r\n\r\n // if the item has moved to another grid, we're done here\r\n let target: GridItemHTMLElement = event.target as GridItemHTMLElement;\r\n if (!target.gridstackNode || target.gridstackNode.grid !== this) return;\r\n\r\n node.el = target;\r\n\r\n if (node._isAboutToRemove) {\r\n let gridToNotify = el.gridstackNode.grid;\r\n if (gridToNotify._gsEventHandler[event.type]) {\r\n gridToNotify._gsEventHandler[event.type](event, target);\r\n }\r\n gridToNotify.engine.removedNodes.push(node);\r\n GridStackDD.get().remove(el);\r\n delete el.gridstackNode; // hint we're removing it next and break circular link\r\n gridToNotify._triggerRemoveEvent();\r\n if (el.parentElement) {\r\n el.remove(); // finally remove it\r\n }\r\n } else {\r\n this._clearRemovingTimeout(el);\r\n if (!node._temporaryRemoved) {\r\n Utils.removePositioningStyles(target);\r\n this._writePosAttr(target, node.x, node.y, node.w, node.h);\r\n } else {\r\n Utils.removePositioningStyles(target);\r\n this._writePosAttr(target, node._beforeDragX, node._beforeDragY, node.w, node.h);\r\n node.x = node._beforeDragX;\r\n node.y = node._beforeDragY;\r\n delete node._temporaryRemoved;\r\n this.engine.addNode(node);\r\n }\r\n if (this._gsEventHandler[event.type]) {\r\n this._gsEventHandler[event.type](event, target);\r\n }\r\n }\r\n\r\n this._updateContainerHeight();\r\n this._triggerChangeEvent();\r\n\r\n this.engine.endUpdate();\r\n\r\n // if we re-sized a nested grid item, let the children resize as well\r\n if (event.type === 'resizestop') {\r\n this._resizeNestedGrids(target);\r\n }\r\n }\r\n\r\n GridStackDD.get()\r\n .draggable(el, {\r\n start: onStartMoving,\r\n stop: onEndMoving,\r\n drag: dragOrResize\r\n })\r\n .resizable(el, {\r\n start: onStartMoving,\r\n stop: onEndMoving,\r\n resize: dragOrResize\r\n });\r\n node._initDD = true; // we've set DD support now\r\n\r\n // finally fine tune drag vs move by disabling any part...\r\n if (node.noMove || this.opts.disableDrag) {\r\n GridStackDD.get().draggable(el, 'disable');\r\n }\r\n if (node.noResize || this.opts.disableResize) {\r\n GridStackDD.get().resizable(el, 'disable');\r\n }\r\n return this;\r\n}\r\n\r\n/**\r\n * Enables/Disables moving.\r\n * @param els widget or selector to modify.\r\n * @param val if true widget will be draggable.\r\n */\r\nGridStack.prototype.movable = function(els: GridStackElement, val: boolean): GridStack {\r\n if (this.opts.staticGrid) return this; // can't move a static grid!\r\n GridStack.getElements(els).forEach(el => {\r\n let node = el.gridstackNode;\r\n if (!node || node.locked) return;\r\n node.noMove = !(val || false);\r\n if (node.noMove) {\r\n GridStackDD.get().draggable(el, 'disable');\r\n el.classList.remove('ui-draggable-handle');\r\n } else {\r\n this._prepareDragDropByNode(node); // init DD if need be\r\n GridStackDD.get().draggable(el, 'enable');\r\n el.classList.remove('ui-draggable-handle');\r\n }\r\n });\r\n return this;\r\n}\r\n\r\n/**\r\n * Enables/Disables resizing.\r\n * @param els widget or selector to modify\r\n * @param val if true widget will be resizable.\r\n */\r\nGridStack.prototype.resizable = function(els: GridStackElement, val: boolean): GridStack {\r\n if (this.opts.staticGrid) return this; // can't resize a static grid!\r\n GridStack.getElements(els).forEach(el => {\r\n let node = el.gridstackNode;\r\n if (!node || node.locked) return;\r\n node.noResize = !(val || false);\r\n if (node.noResize) {\r\n GridStackDD.get().resizable(el, 'disable');\r\n } else {\r\n this._prepareDragDropByNode(node); // init DD if need be\r\n GridStackDD.get().resizable(el, 'enable');\r\n }\r\n });\r\n return this;\r\n}\r\n","// gridstack-ddi.ts 3.1.5 @preserve\r\n\r\n/**\r\n * https://gridstackjs.com/\r\n * (c) 2014-2020 Alain Dumesny, Dylan Weiss, Pavel Reznikov\r\n * gridstack.js may be freely distributed under the MIT license.\r\n*/\r\n/* eslint-disable @typescript-eslint/no-unused-vars */\r\n\r\nimport { GridItemHTMLElement } from './types';\r\n\r\n/**\r\n * Abstract Partial Interface API for drag'n'drop plugin - look at GridStackDD and HTML5 / Jquery implementation versions\r\n */\r\nexport class GridStackDDI {\r\n\r\n protected static ddi: GridStackDDI;\r\n\r\n /** call this method to register your plugin instead of the default no-op one */\r\n static registerPlugin(pluginClass: typeof GridStackDDI): GridStackDDI {\r\n GridStackDDI.ddi = new pluginClass();\r\n return GridStackDDI.ddi;\r\n }\r\n\r\n /** get the current registered plugin to use */\r\n static get(): GridStackDDI {\r\n return GridStackDDI.ddi || GridStackDDI.registerPlugin(GridStackDDI);\r\n }\r\n\r\n /** removes any drag&drop present (called during destroy) */\r\n public remove(el: GridItemHTMLElement): GridStackDDI {\r\n return this; // no-op for static grids\r\n }\r\n}\r\n","// gridstack-engine.ts 3.1.5 @preserve\r\n\r\n/**\r\n * https://gridstackjs.com/\r\n * (c) 2014-2020 Alain Dumesny, Dylan Weiss, Pavel Reznikov\r\n * gridstack.js may be freely distributed under the MIT license.\r\n*/\r\n\r\nimport { Utils, obsolete } from './utils';\r\nimport { GridStackNode, ColumnOptions, GridStackWidget } from './types';\r\n\r\nexport type onChangeCB = (nodes: GridStackNode[], removeDOM?: boolean) => void;\r\n\r\n/** options used for creations - similar to GridStackOptions */\r\nexport interface GridStackEngineOptions {\r\n column?: number;\r\n maxRow?: number;\r\n float?: boolean;\r\n nodes?: GridStackNode[];\r\n onChange?: onChangeCB;\r\n}\r\n\r\n/**\r\n * Defines the GridStack engine that does most no DOM grid manipulation.\r\n * See GridStack methods and vars for descriptions.\r\n *\r\n * NOTE: values should not be modified directly - call the main GridStack API instead\r\n */\r\nexport class GridStackEngine {\r\n public column: number;\r\n public maxRow: number;\r\n public nodes: GridStackNode[];\r\n public onChange: onChangeCB;\r\n public addedNodes: GridStackNode[] = [];\r\n public removedNodes: GridStackNode[] = [];\r\n public batchMode: boolean;\r\n /** @internal */\r\n private _float: boolean;\r\n /** @internal */\r\n private _prevFloat: boolean;\r\n /** @internal */\r\n private _layouts?: Layout[][]; // maps column # to array of values nodes\r\n /** @internal */\r\n private _ignoreLayoutsNodeChange: boolean;\r\n /** @internal */\r\n private static _idSeq = 1;\r\n\r\n public constructor(opts: GridStackEngineOptions = {}) {\r\n this.column = opts.column || 12;\r\n this.onChange = opts.onChange;\r\n this._float = opts.float;\r\n this.maxRow = opts.maxRow;\r\n this.nodes = opts.nodes || [];\r\n }\r\n\r\n public batchUpdate(): GridStackEngine {\r\n if (this.batchMode) return this;\r\n this.batchMode = true;\r\n this._prevFloat = this._float;\r\n this._float = true; // let things go anywhere for now... commit() will restore and possibly reposition\r\n return this;\r\n }\r\n\r\n public commit(): GridStackEngine {\r\n if (!this.batchMode) return this;\r\n this.batchMode = false;\r\n this._float = this._prevFloat;\r\n delete this._prevFloat;\r\n this._packNodes();\r\n this._notify();\r\n return this;\r\n }\r\n\r\n /** @internal */\r\n private _fixCollisions(node: GridStackNode): GridStackEngine {\r\n this._sortNodes(-1);\r\n\r\n let nn = node;\r\n let hasLocked = Boolean(this.nodes.find(n => n.locked));\r\n if (!this.float && !hasLocked) {\r\n nn = {x: 0, y: node.y, w: this.column, h: node.h};\r\n }\r\n while (true) {\r\n let collisionNode = this.collide(node, nn);\r\n if (!collisionNode) return this;\r\n let moved;\r\n if (collisionNode.locked) {\r\n // if colliding with a locked item, move ourself instead\r\n moved = this.moveNode(node, node.x, collisionNode.y + collisionNode.h,\r\n node.w, node.h, true);\r\n } else {\r\n moved = this.moveNode(collisionNode, collisionNode.x, node.y + node.h,\r\n collisionNode.w, collisionNode.h, true);\r\n }\r\n if (!moved) return this; // break inf loop if we couldn't move after all (ex: maxRow, fixed)\r\n }\r\n }\r\n\r\n /** return any intercepted node with the given area, skipping the passed in node (usually self) */\r\n public collide(node: GridStackNode, area: GridStackNode = node): GridStackNode {\r\n return this.nodes.find(n => n !== node && Utils.isIntercepted(n, area));\r\n }\r\n\r\n public isAreaEmpty(x: number, y: number, w: number, h: number): boolean {\r\n let nn: GridStackNode = {x: x || 0, y: y || 0, w: w || 1, h: h || 1};\r\n return !this.collide(nn);\r\n }\r\n\r\n /** re-layout grid items to reclaim any empty space */\r\n public compact(): GridStackEngine {\r\n if (this.nodes.length === 0) return this;\r\n this.batchUpdate();\r\n this._sortNodes();\r\n let copyNodes = this.nodes;\r\n this.nodes = []; // pretend we have no nodes to conflict layout to start with...\r\n copyNodes.forEach(node => {\r\n if (!node.noMove && !node.locked) {\r\n node.autoPosition = true;\r\n }\r\n this.addNode(node, false); // 'false' for add event trigger\r\n node._dirty = true; // force attr update\r\n });\r\n this.commit();\r\n return this;\r\n }\r\n\r\n /** enable/disable floating widgets (default: `false`) See [example](http://gridstackjs.com/demo/float.html) */\r\n public set float(val: boolean) {\r\n if (this._float === val) return;\r\n this._float = val || false;\r\n if (!val) {\r\n this._packNodes();\r\n this._notify();\r\n }\r\n }\r\n\r\n /** float getter method */\r\n public get float(): boolean { return this._float || false; }\r\n\r\n /** @internal */\r\n private _sortNodes(dir?: -1 | 1): GridStackEngine {\r\n this.nodes = Utils.sort(this.nodes, dir, this.column);\r\n return this;\r\n }\r\n\r\n /** @internal */\r\n private _packNodes(): GridStackEngine {\r\n this._sortNodes();\r\n\r\n if (this.float) {\r\n this.nodes.forEach((n, i) => {\r\n if (n._updating || n._packY === undefined || n.y === n._packY) {\r\n return this;\r\n }\r\n let newY = n.y;\r\n while (newY >= n._packY) {\r\n let box: GridStackWidget = {x: n.x, y: newY, w: n.w, h: n.h};\r\n let collisionNode = this.nodes.slice(0, i).find(bn => Utils.isIntercepted(box, bn));\r\n if (!collisionNode) {\r\n n._dirty = true;\r\n n.y = newY;\r\n }\r\n --newY;\r\n }\r\n });\r\n } else {\r\n this.nodes.forEach((n, i) => {\r\n if (n.locked) return this;\r\n while (n.y > 0) {\r\n let newY = n.y - 1;\r\n let canBeMoved = i === 0;\r\n let box: GridStackWidget = {x: n.x, y: newY, w: n.w, h: n.h};\r\n if (i > 0) {\r\n let collisionNode = this.nodes.slice(0, i).find(bn => Utils.isIntercepted(box, bn));\r\n canBeMoved = !collisionNode;\r\n }\r\n\r\n if (!canBeMoved) { break; }\r\n // Note: must be dirty (from last position) for GridStack::OnChange CB to update positions\r\n // and move items back. The user 'change' CB should detect changes from the original\r\n // starting position instead.\r\n n._dirty = (n.y !== newY);\r\n n.y = newY;\r\n }\r\n });\r\n }\r\n return this;\r\n }\r\n\r\n /**\r\n * given a random node, makes sure it's coordinates/values are valid in the current grid\r\n * @param node to adjust\r\n * @param resizing if out of bound, resize down or move into the grid to fit ?\r\n */\r\n public prepareNode(node: GridStackNode, resizing?: boolean): GridStackNode {\r\n node = node || {};\r\n node._id = node._id || GridStackEngine._idSeq++;\r\n\r\n // if we're missing position, have the grid position us automatically (before we set them to 0,0)\r\n if (node.x === undefined || node.y === undefined || node.x === null || node.y === null) {\r\n node.autoPosition = true;\r\n }\r\n\r\n // assign defaults for missing required fields\r\n let defaults: GridStackNode = { x: 0, y: 0, w: 1, h: 1};\r\n Utils.defaults(node, defaults);\r\n\r\n if (!node.autoPosition) { delete node.autoPosition; }\r\n if (!node.noResize) { delete node.noResize; }\r\n if (!node.noMove) { delete node.noMove; }\r\n\r\n // check for NaN (in case messed up strings were passed. can't do parseInt() || defaults.x above as 0 is valid #)\r\n if (typeof node.x == 'string') { node.x = Number(node.x); }\r\n if (typeof node.y == 'string') { node.y = Number(node.y); }\r\n if (typeof node.w == 'string') { node.w = Number(node.w); }\r\n if (typeof node.h == 'string') { node.h = Number(node.h); }\r\n if (isNaN(node.x)) { node.x = defaults.x; node.autoPosition = true; }\r\n if (isNaN(node.y)) { node.y = defaults.y; node.autoPosition = true; }\r\n if (isNaN(node.w)) { node.w = defaults.w; }\r\n if (isNaN(node.h)) { node.h = defaults.h; }\r\n\r\n if (node.maxW) { node.w = Math.min(node.w, node.maxW); }\r\n if (node.maxH) { node.h = Math.min(node.h, node.maxH); }\r\n if (node.minW) { node.w = Math.max(node.w, node.minW); }\r\n if (node.minH) { node.h = Math.max(node.h, node.minH); }\r\n\r\n if (node.w > this.column) {\r\n node.w = this.column;\r\n } else if (node.w < 1) {\r\n node.w = 1;\r\n }\r\n\r\n if (this.maxRow && node.h > this.maxRow) {\r\n node.h = this.maxRow;\r\n } else if (node.h < 1) {\r\n node.h = 1;\r\n }\r\n\r\n if (node.x < 0) {\r\n node.x = 0;\r\n }\r\n if (node.y < 0) {\r\n node.y = 0;\r\n }\r\n\r\n if (node.x + node.w > this.column) {\r\n if (resizing) {\r\n node.w = this.column - node.x;\r\n } else {\r\n node.x = this.column - node.w;\r\n }\r\n }\r\n if (this.maxRow && node.y + node.h > this.maxRow) {\r\n if (resizing) {\r\n node.h = this.maxRow - node.y;\r\n } else {\r\n node.y = this.maxRow - node.h;\r\n }\r\n }\r\n\r\n return node;\r\n }\r\n\r\n public getDirtyNodes(verify?: boolean): GridStackNode[] {\r\n // compare original X,Y,W,H (or entire node?) instead as _dirty can be a temporary state\r\n if (verify) {\r\n let dirtNodes: GridStackNode[] = [];\r\n this.nodes.forEach(n => {\r\n if (n._dirty) {\r\n if (n.y === n._origY && n.x === n._origX && n.w === n._origW && n.h === n._origH) {\r\n delete n._dirty;\r\n } else {\r\n dirtNodes.push(n);\r\n }\r\n }\r\n });\r\n return dirtNodes;\r\n }\r\n\r\n return this.nodes.filter(n => n._dirty);\r\n }\r\n\r\n /** @internal */\r\n private _notify(nodes?: GridStackNode | GridStackNode[], removeDOM = true): GridStackEngine {\r\n if (this.batchMode) return this;\r\n nodes = (nodes === undefined ? [] : (Array.isArray(nodes) ? nodes : [nodes]) );\r\n let dirtyNodes = nodes.concat(this.getDirtyNodes());\r\n if (this.onChange) {\r\n this.onChange(dirtyNodes, removeDOM);\r\n }\r\n return this;\r\n }\r\n\r\n public cleanNodes(): GridStackEngine {\r\n if (this.batchMode) return this;\r\n this.nodes.forEach(n => { delete n._dirty; });\r\n return this;\r\n }\r\n\r\n public addNode(node: GridStackNode, triggerAddEvent = false): GridStackNode {\r\n node = this.prepareNode(node);\r\n\r\n if (node.autoPosition) {\r\n this._sortNodes();\r\n\r\n for (let i = 0;; ++i) {\r\n let x = i % this.column;\r\n let y = Math.floor(i / this.column);\r\n if (x + node.w > this.column) {\r\n continue;\r\n }\r\n let box = {x, y, w: node.w, h: node.h};\r\n if (!this.nodes.find(n => Utils.isIntercepted(box, n))) {\r\n node.x = x;\r\n node.y = y;\r\n delete node.autoPosition; // found our slot\r\n break;\r\n }\r\n }\r\n }\r\n\r\n this.nodes.push(node);\r\n if (triggerAddEvent) {\r\n this.addedNodes.push(node);\r\n }\r\n\r\n this._fixCollisions(node);\r\n this._packNodes();\r\n this._notify();\r\n return node;\r\n }\r\n\r\n public removeNode(node: GridStackNode, removeDOM = true, triggerEvent = false): GridStackEngine {\r\n if (triggerEvent) { // we wait until final drop to manually track removed items (rather than during drag)\r\n this.removedNodes.push(node);\r\n }\r\n node._id = null; // hint that node is being removed\r\n // don't use 'faster' .splice(findIndex(),1) in case node isn't in our list, or in multiple times.\r\n this.nodes = this.nodes.filter(n => n !== node);\r\n if (!this.float) {\r\n this._packNodes();\r\n }\r\n this._notify(node, removeDOM);\r\n return this;\r\n }\r\n\r\n public removeAll(removeDOM = true): GridStackEngine {\r\n delete this._layouts;\r\n if (this.nodes.length === 0) return this;\r\n if (removeDOM) {\r\n this.nodes.forEach(n => { n._id = null; }); // hint that node is being removed\r\n }\r\n this.removedNodes = this.nodes;\r\n this.nodes = [];\r\n this._notify(this.removedNodes, removeDOM);\r\n return this;\r\n }\r\n\r\n public canMoveNode(node: GridStackNode, x: number, y: number, w?: number, h?: number): boolean {\r\n if (!this.isNodeChangedPosition(node, x, y, w, h)) {\r\n return false;\r\n }\r\n let hasLocked = this.nodes.some(n => n.locked);\r\n\r\n if (!this.maxRow && !hasLocked) {\r\n return true;\r\n }\r\n\r\n let clonedNode: GridStackNode;\r\n let clone = new GridStackEngine({\r\n column: this.column,\r\n float: this.float,\r\n nodes: this.nodes.map(n => {\r\n if (n === node) {\r\n clonedNode = {...n};\r\n return clonedNode;\r\n }\r\n return {...n};\r\n })\r\n });\r\n\r\n if (!clonedNode) return true;\r\n\r\n clone.moveNode(clonedNode, x, y, w, h);\r\n\r\n let canMove = true;\r\n if (hasLocked) {\r\n canMove = !clone.nodes.some(n => n.locked && n._dirty && n !== clonedNode);\r\n }\r\n if (this.maxRow && canMove) {\r\n canMove = (clone.getRow() <= this.maxRow);\r\n }\r\n\r\n return canMove;\r\n }\r\n\r\n /** return true if can fit in grid height constrain only (always true if no maxRow) */\r\n public willItFit(node: GridStackNode): boolean {\r\n if (!this.maxRow) return true;\r\n\r\n let clone = new GridStackEngine({\r\n column: this.column,\r\n float: this.float,\r\n nodes: this.nodes.map(n => {return {...n}})\r\n });\r\n clone.addNode(node);\r\n return clone.getRow() <= this.maxRow;\r\n }\r\n\r\n /** return true if the passed in node (x,y) is being dragged outside of the grid, and not added to bottom */\r\n public isOutside(x: number, y: number, node: GridStackNode): boolean {\r\n // simple outside boundaries\r\n if (x < 0 || x >= this.column || y < 0) return true;\r\n if (this.maxRow) return (y >= this.maxRow);\r\n else if (this.float) return false; // infinite grow with no maxRow\r\n\r\n // see if dragging PAST bottom (row+1)\r\n let row = this.getRow();\r\n if (y < row || y === 0) return false;\r\n if (y > row) return true;\r\n // else check to see if we can add that item to the bottom... (y == row)\r\n if (!node._temporaryRemoved) {\r\n let clone = new GridStackEngine({\r\n column: this.column,\r\n float: this.float,\r\n nodes: this.nodes.filter(n => n !== node).map(n => {return {...n}})\r\n });\r\n let nn = {...node, x, y};\r\n clone.addNode(nn);\r\n return nn.y === node.y && nn.x === node.x; // didn't actually move, so last row was a drag out and not a new place...\r\n }\r\n return node._temporaryRemoved; // if still outside so we don't flicker back & forth\r\n }\r\n\r\n public isNodeChangedPosition(node: GridStackNode, x: number, y: number, w?: number, h?: number): boolean {\r\n if (typeof x !== 'number') { x = node.x; }\r\n if (typeof y !== 'number') { y = node.y; }\r\n if (typeof w !== 'number') { w = node.w; }\r\n if (typeof h !== 'number') { h = node.h; }\r\n\r\n if (node.maxW) { w = Math.min(w, node.maxW); }\r\n if (node.maxH) { h = Math.min(h, node.maxH); }\r\n if (node.minW) { w = Math.max(w, node.minW); }\r\n if (node.minH) { h = Math.max(h, node.minH); }\r\n\r\n if (node.x === x && node.y === y && node.w === w && node.h === h) {\r\n return false;\r\n }\r\n return true;\r\n }\r\n\r\n public moveNode(node: GridStackNode, x: number, y: number, w?: number, h?: number, noPack?: boolean): GridStackNode {\r\n if (node.locked) return null;\r\n if (typeof x !== 'number') { x = node.x; }\r\n if (typeof y !== 'number') { y = node.y; }\r\n if (typeof w !== 'number') { w = node.w; }\r\n if (typeof h !== 'number') { h = node.h; }\r\n\r\n // constrain the passed in values and check if we're still changing our node\r\n let resizing = (node.w !== w || node.h !== h);\r\n let nn: GridStackNode = { x, y, w, h, maxW: node.maxW, maxH: node.maxH, minW: node.minW, minH: node.minH};\r\n nn = this.prepareNode(nn, resizing);\r\n if (node.x === nn.x && node.y === nn.y && node.w === nn.w && node.h === nn.h) {\r\n return null;\r\n }\r\n\r\n node._dirty = true;\r\n\r\n node.x = node._lastTriedX = nn.x;\r\n node.y = node._lastTriedY = nn.y;\r\n node.w = node._lastTriedW = nn.w;\r\n node.h = node._lastTriedH = nn.h;\r\n\r\n this._fixCollisions(node);\r\n if (!noPack) {\r\n this._packNodes();\r\n this._notify();\r\n }\r\n return node;\r\n }\r\n\r\n public getRow(): number {\r\n return this.nodes.reduce((memo, n) => Math.max(memo, n.y + n.h), 0);\r\n }\r\n\r\n public beginUpdate(node: GridStackNode): GridStackEngine {\r\n if (node._updating) return this;\r\n node._updating = true;\r\n this.nodes.forEach(n => { n._packY = n.y; });\r\n return this;\r\n }\r\n\r\n public endUpdate(): GridStackEngine {\r\n let n = this.nodes.find(n => n._updating);\r\n if (n) {\r\n delete n._updating;\r\n this.nodes.forEach(n => { delete n._packY; });\r\n }\r\n return this;\r\n }\r\n\r\n /** saves the current layout returning a list of widgets for serialization */\r\n public save(saveElement = true): GridStackNode[] {\r\n let widgets: GridStackNode[] = [];\r\n Utils.sort(this.nodes);\r\n this.nodes.forEach(n => {\r\n let w: GridStackNode = {};\r\n for (let key in n) { if (key[0] !== '_' && n[key] !== null && n[key] !== undefined ) w[key] = n[key]; }\r\n // delete other internals\r\n if (!saveElement) delete w.el;\r\n delete w.grid;\r\n // delete default values (will be re-created on read)\r\n if (!w.autoPosition) delete w.autoPosition;\r\n if (!w.noResize) delete w.noResize;\r\n if (!w.noMove) delete w.noMove;\r\n if (!w.locked) delete w.locked;\r\n widgets.push(w);\r\n });\r\n return widgets;\r\n }\r\n\r\n /** @internal called whenever a node is added or moved - updates the cached layouts */\r\n public layoutsNodesChange(nodes: GridStackNode[]): GridStackEngine {\r\n if (!this._layouts || this._ignoreLayoutsNodeChange) return this;\r\n // remove smaller layouts - we will re-generate those on the fly... larger ones need to update\r\n this._layouts.forEach((layout, column) => {\r\n if (!layout || column === this.column) return this;\r\n if (column < this.column) {\r\n this._layouts[column] = undefined;\r\n }\r\n else {\r\n // we save the original x,y,w (h isn't cached) to see what actually changed to propagate better.\r\n // Note: we don't need to check against out of bound scaling/moving as that will be done when using those cache values.\r\n nodes.forEach(node => {\r\n let n = layout.find(l => l._id === node._id);\r\n if (!n) return this; // no cache for new nodes. Will use those values.\r\n let ratio = column / this.column;\r\n // Y changed, push down same amount\r\n // TODO: detect doing item 'swaps' will help instead of move (especially in 1 column mode)\r\n if (node.y !== node._origY) {\r\n n.y += (node.y - node._origY);\r\n }\r\n // X changed, scale from new position\r\n if (node.x !== node._origX) {\r\n n.x = Math.round(node.x * ratio);\r\n }\r\n // width changed, scale from new width\r\n if (node.w !== node._origW) {\r\n n.w = Math.round(node.w * ratio);\r\n }\r\n // ...height always carries over from cache\r\n });\r\n }\r\n });\r\n return this;\r\n }\r\n\r\n /**\r\n * @internal Called to scale the widget width & position up/down based on the column change.\r\n * Note we store previous layouts (especially original ones) to make it possible to go\r\n * from say 12 -> 1 -> 12 and get back to where we were.\r\n *\r\n * @param oldColumn previous number of columns\r\n * @param column new column number\r\n * @param nodes different sorted list (ex: DOM order) instead of current list\r\n * @param layout specify the type of re-layout that will happen (position, size, etc...).\r\n * Note: items will never be outside of the current column boundaries. default (moveScale). Ignored for 1 column\r\n */\r\n public updateNodeWidths(oldColumn: number, column: number, nodes: GridStackNode[], layout: ColumnOptions = 'moveScale'): GridStackEngine {\r\n if (!this.nodes.length || oldColumn === column) return this;\r\n\r\n // cache the current layout in case they want to go back (like 12 -> 1 -> 12) as it requires original data\r\n this.cacheLayout(this.nodes, oldColumn);\r\n\r\n // if we're going to 1 column and using DOM order rather than default sorting, then generate that layout\r\n if (column === 1 && nodes && nodes.length) {\r\n let top = 0;\r\n nodes.forEach(n => {\r\n n.x = 0;\r\n n.w = 1;\r\n n.y = Math.max(n.y, top);\r\n top = n.y + n.h;\r\n });\r\n } else {\r\n nodes = Utils.sort(this.nodes, -1, oldColumn); // current column reverse sorting so we can insert last to front (limit collision)\r\n }\r\n\r\n // see if we have cached previous layout.\r\n let cacheNodes = this._layouts[column] || [];\r\n // if not AND we are going up in size start with the largest layout as down-scaling is more accurate\r\n let lastIndex = this._layouts.length - 1;\r\n if (cacheNodes.length === 0 && column > oldColumn && column < lastIndex) {\r\n cacheNodes = this._layouts[lastIndex] || [];\r\n if (cacheNodes.length) {\r\n // pretend we came from that larger column by assigning those values as starting point\r\n oldColumn = lastIndex;\r\n cacheNodes.forEach(cacheNode => {\r\n let j = nodes.findIndex(n => n._id === cacheNode._id);\r\n if (j !== -1) {\r\n // still current, use cache info positions\r\n nodes[j].x = cacheNode.x;\r\n nodes[j].y = cacheNode.y;\r\n nodes[j].w = cacheNode.w;\r\n }\r\n });\r\n cacheNodes = []; // we still don't have new column cached data... will generate from larger one.\r\n }\r\n }\r\n\r\n // if we found cache re-use those nodes that are still current\r\n let newNodes: GridStackNode[] = [];\r\n cacheNodes.forEach(cacheNode => {\r\n let j = nodes.findIndex(n => n._id === cacheNode._id);\r\n if (j !== -1) {\r\n // still current, use cache info positions\r\n nodes[j].x = cacheNode.x;\r\n nodes[j].y = cacheNode.y;\r\n nodes[j].w = cacheNode.w;\r\n newNodes.push(nodes[j]);\r\n nodes.splice(j, 1);\r\n }\r\n });\r\n // ...and add any extra non-cached ones\r\n if (nodes.length) {\r\n if (typeof layout === 'function') {\r\n layout(column, oldColumn, newNodes, nodes);\r\n } else {\r\n let ratio = column / oldColumn;\r\n let move = (layout === 'move' || layout === 'moveScale');\r\n let scale = (layout === 'scale' || layout === 'moveScale');\r\n nodes.forEach(node => {\r\n node.x = (column === 1 ? 0 : (move ? Math.round(node.x * ratio) : Math.min(node.x, column - 1)));\r\n node.w = ((column === 1 || oldColumn === 1) ? 1 :\r\n scale ? (Math.round(node.w * ratio) || 1) : (Math.min(node.w, column)));\r\n newNodes.push(node);\r\n });\r\n nodes = [];\r\n }\r\n }\r\n\r\n // finally re-layout them in reverse order (to get correct placement)\r\n newNodes = Utils.sort(newNodes, -1, column);\r\n this._ignoreLayoutsNodeChange = true;\r\n this.batchUpdate();\r\n this.nodes = []; // pretend we have no nodes to start with (we use same structures) to simplify layout\r\n newNodes.forEach(node => {\r\n this.addNode(node, false); // 'false' for add event trigger\r\n node._dirty = true; // force attr update\r\n }, this);\r\n this.commit();\r\n delete this._ignoreLayoutsNodeChange;\r\n return this;\r\n }\r\n\r\n /** @internal called to save initial position/size */\r\n public saveInitial(): GridStackEngine {\r\n this.nodes.forEach(n => {\r\n n._origX = n.x;\r\n n._origY = n.y;\r\n n._origW = n.w;\r\n n._origH = n.h;\r\n delete n._dirty;\r\n });\r\n return this;\r\n }\r\n\r\n /**\r\n * call to cache the given layout internally to the given location so we can restore back when column changes size\r\n * @param nodes list of nodes\r\n * @param column corresponding column index to save it under\r\n * @param clear if true, will force other caches to be removed (default false)\r\n */\r\n public cacheLayout(nodes: GridStackNode[], column: number, clear = false): GridStackEngine {\r\n let copy: Layout[] = [];\r\n nodes.forEach((n, i) => {\r\n n._id = n._id || GridStackEngine._idSeq++; // make sure we have an id in case this is new layout, else re-use id already set\r\n copy[i] = {x: n.x, y: n.y, w: n.w, _id: n._id} // only thing we change is x,y,w and id to find it back\r\n });\r\n this._layouts = clear ? [] : this._layouts || []; // use array to find larger quick\r\n this._layouts[column] = copy;\r\n return this;\r\n }\r\n\r\n\r\n /** called to remove all internal values */\r\n public cleanupNode(node: GridStackNode): GridStackEngine {\r\n for (let prop in node) {\r\n if (prop[0] === '_') delete node[prop];\r\n }\r\n return this;\r\n }\r\n\r\n /** @internal legacy method renames */\r\n private getGridHeight = obsolete(this, GridStackEngine.prototype.getRow, 'getGridHeight', 'getRow', 'v1.0.0');\r\n}\r\n\r\n/** @internal class to store per column layout bare minimal info (subset of GridStackWidget) */\r\ninterface Layout {\r\n x: number;\r\n y: number;\r\n w: number;\r\n _id: number; // so we can find full node back\r\n}\r\n","// gridstack.ts 3.1.5 @preserve\r\n\r\n/**\r\n * https://gridstackjs.com/\r\n * (c) 2014-2020 Alain Dumesny, Dylan Weiss, Pavel Reznikov\r\n * gridstack.js may be freely distributed under the MIT license.\r\n*/\r\n\r\nimport { GridStackEngine } from './gridstack-engine';\r\nimport { obsoleteOpts, obsoleteAttr, Utils, HeightData } from './utils';\r\nimport { GridStackElement, GridItemHTMLElement, GridStackWidget, GridStackNode, GridStackOptions, numberOrString, ColumnOptions } from './types';\r\nimport { GridStackDDI } from './gridstack-ddi';\r\n\r\n// export all dependent file as well to make it easier for users to just import the main file\r\nexport * from './types';\r\nexport * from './utils';\r\nexport * from './gridstack-engine';\r\nexport * from './gridstack-ddi';\r\n\r\nexport interface GridHTMLElement extends HTMLElement {\r\n gridstack?: GridStack; // grid's parent DOM element points back to grid class\r\n}\r\nexport type GridStackEvent = 'added' | 'change' | 'disable' | 'dragstart' | 'dragstop' | 'dropped' |\r\n 'enable' | 'removed' | 'resizestart' | 'resizestop';\r\n\r\n/** Defines the coordinates of an object */\r\nexport interface MousePosition {\r\n top: number;\r\n left: number;\r\n}\r\n\r\n/** Defines the position of a cell inside the grid*/\r\nexport interface CellPosition {\r\n x: number;\r\n y: number;\r\n}\r\n\r\ninterface GridCSSStyleSheet extends CSSStyleSheet {\r\n _id?: string; // random id we will use to style us\r\n _max?: number; // internal tracker of the max # of rows we created\\\r\n}\r\n\r\n// default values for grid options - used during init and when saving out\r\nconst GridDefaults: GridStackOptions = {\r\n column: 12,\r\n minRow: 0,\r\n maxRow: 0,\r\n itemClass: 'grid-stack-item',\r\n placeholderClass: 'grid-stack-placeholder',\r\n placeholderText: '',\r\n handle: '.grid-stack-item-content',\r\n handleClass: null,\r\n styleInHead: false,\r\n cellHeight: 'auto',\r\n margin: 10,\r\n auto: true,\r\n minWidth: 768,\r\n float: false,\r\n staticGrid: false,\r\n animate: true,\r\n alwaysShowResizeHandle: false,\r\n resizable: {\r\n autoHide: true,\r\n handles: 'se'\r\n },\r\n draggable: {\r\n handle: '.grid-stack-item-content',\r\n scroll: false,\r\n appendTo: 'body'\r\n },\r\n dragIn: undefined,\r\n dragInOptions : {\r\n revert: 'invalid',\r\n handle: '.grid-stack-item-content',\r\n scroll: false,\r\n appendTo: 'body'\r\n },\r\n disableDrag: false,\r\n disableResize: false,\r\n rtl: 'auto',\r\n removable: false,\r\n removableOptions: {\r\n accept: '.grid-stack-item'\r\n },\r\n removeTimeout: 2000,\r\n marginUnit: 'px',\r\n cellHeightUnit: 'px',\r\n disableOneColumnMode: false,\r\n oneColumnModeDomSort: false\r\n};\r\n\r\n/**\r\n * Main gridstack class - you will need to call `GridStack.init()` first to initialize your grid.\r\n * Note: your grid elements MUST have the following classes for the CSS layout to work:\r\n * @example\r\n *
    \r\n *
    \r\n *
    Item 1
    \r\n *
    \r\n *
    \r\n */\r\nexport class GridStack {\r\n\r\n /**\r\n * initializing the HTML element, or selector string, into a grid will return the grid. Calling it again will\r\n * simply return the existing instance (ignore any passed options). There is also an initAll() version that support\r\n * multiple grids initialization at once. Or you can use addGrid() to create the entire grid from JSON.\r\n * @param options grid options (optional)\r\n * @param elOrString element or CSS selector (first one used) to convert to a grid (default to '.grid-stack' class selector)\r\n *\r\n * @example\r\n * let grid = GridStack.init();\r\n *\r\n * Note: the HTMLElement (of type GridHTMLElement) will store a `gridstack: GridStack` value that can be retrieve later\r\n * let grid = document.querySelector('.grid-stack').gridstack;\r\n */\r\n public static init(options: GridStackOptions = {}, elOrString: GridStackElement = '.grid-stack'): GridStack {\r\n let el = GridStack.getGridElement(elOrString);\r\n if (!el) {\r\n if (typeof elOrString === 'string') {\r\n console.error('GridStack.initAll() no grid was found with selector \"' + elOrString + '\" - element missing or wrong selector ?' +\r\n '\\nNote: \".grid-stack\" is required for proper CSS styling and drag/drop, and is the default selector.');\r\n } else {\r\n console.error('GridStack.init() no grid element was passed.');\r\n }\r\n return null;\r\n }\r\n if (!el.gridstack) {\r\n el.gridstack = new GridStack(el, {...options});\r\n }\r\n return el.gridstack\r\n }\r\n\r\n /**\r\n * Will initialize a list of elements (given a selector) and return an array of grids.\r\n * @param options grid options (optional)\r\n * @param selector elements selector to convert to grids (default to '.grid-stack' class selector)\r\n *\r\n * @example\r\n * let grids = GridStack.initAll();\r\n * grids.forEach(...)\r\n */\r\n public static initAll(options: GridStackOptions = {}, selector = '.grid-stack'): GridStack[] {\r\n let grids: GridStack[] = [];\r\n GridStack.getGridElements(selector).forEach(el => {\r\n if (!el.gridstack) {\r\n el.gridstack = new GridStack(el, {...options});\r\n }\r\n grids.push(el.gridstack);\r\n });\r\n if (grids.length === 0) {\r\n console.error('GridStack.initAll() no grid was found with selector \"' + selector + '\" - element missing or wrong selector ?' +\r\n '\\nNote: \".grid-stack\" is required for proper CSS styling and drag/drop, and is the default selector.');\r\n }\r\n return grids;\r\n }\r\n\r\n /**\r\n * call to create a grid with the given options, including loading any children from JSON structure. This will call GridStack.init(), then\r\n * grid.load() on any passed children (recursively). Great alternative to calling init() if you want entire grid to come from\r\n * JSON serialized data, including options.\r\n * @param parent HTML element parent to the grid\r\n * @param opt grids options used to initialize the grid, and list of children\r\n */\r\n public static addGrid(parent: HTMLElement, opt: GridStackOptions = {}): GridStack {\r\n if (!parent) return null;\r\n\r\n // create the grid element\r\n let doc = document.implementation.createHTMLDocument();\r\n doc.body.innerHTML = `
    `;\r\n let el = doc.body.children[0] as HTMLElement;\r\n parent.append(el);\r\n\r\n // create grid class and load any children\r\n let grid = GridStack.init(opt, el);\r\n if (opt.children) {\r\n grid.load(opt.children);\r\n }\r\n return grid;\r\n }\r\n\r\n /** scoping so users can call GridStack.Utils.sort() for example */\r\n public static Utils = Utils;\r\n\r\n /** scoping so users can call new GridStack.Engine(12) for example */\r\n public static Engine = GridStackEngine;\r\n\r\n /** the HTML element tied to this grid after it's been initialized */\r\n public el: GridHTMLElement;\r\n\r\n /** engine used to implement non DOM grid functionality */\r\n public engine: GridStackEngine;\r\n\r\n /** grid options - public for classes to access, but use methods to modify! */\r\n public opts: GridStackOptions;\r\n\r\n /** @internal */\r\n public placeholder: HTMLElement;\r\n /** @internal */\r\n private _oneColumnMode: boolean;\r\n /** @internal */\r\n private _prevColumn: number;\r\n /** @internal */\r\n private _ignoreLayoutsNodeChange: boolean;\r\n /** @internal */\r\n public _gsEventHandler = {};\r\n /** @internal */\r\n private _styles: GridCSSStyleSheet;\r\n /** @internal flag to keep cells square during resize */\r\n private _isAutoCellHeight: boolean;\r\n /** @internal track event binding to window resize so we can remove */\r\n private _windowResizeBind: () => GridStack;\r\n /** @internal true when loading items to insert first rather than append */\r\n private _insertNotAppend: boolean;\r\n\r\n /**\r\n * Construct a grid item from the given element and options\r\n * @param el\r\n * @param opts\r\n */\r\n public constructor(el: GridHTMLElement, opts: GridStackOptions = {}) {\r\n this.el = el; // exposed HTML element to the user\r\n opts = opts || {}; // handles null/undefined/0\r\n\r\n obsoleteOpts(opts, 'verticalMargin', 'margin', 'v2.0');\r\n\r\n obsoleteAttr(this.el, 'data-gs-current-height', 'gs-current-row', 'v1.0.0');\r\n\r\n // if row property exists, replace minRow and maxRow instead\r\n if (opts.row) {\r\n opts.minRow = opts.maxRow = opts.row;\r\n delete opts.row;\r\n }\r\n let rowAttr = Utils.toNumber(el.getAttribute('gs-row'));\r\n\r\n // elements attributes override any passed options (like CSS style) - merge the two together\r\n let defaults: GridStackOptions = {...GridDefaults,\r\n column: Utils.toNumber(el.getAttribute('gs-column')) || 12,\r\n minRow: rowAttr ? rowAttr : Utils.toNumber(el.getAttribute('gs-min-row')) || 0,\r\n maxRow: rowAttr ? rowAttr : Utils.toNumber(el.getAttribute('gs-max-row')) || 0,\r\n staticGrid: Utils.toBool(el.getAttribute('gs-static')) || false,\r\n _styleSheetClass: 'grid-stack-instance-' + (Math.random() * 10000).toFixed(0),\r\n alwaysShowResizeHandle: opts.alwaysShowResizeHandle || false,\r\n resizable: {\r\n autoHide: !(opts.alwaysShowResizeHandle || false),\r\n handles: 'se'\r\n },\r\n draggable: {\r\n handle: (opts.handleClass ? '.' + opts.handleClass : (opts.handle ? opts.handle : '')) || '.grid-stack-item-content',\r\n scroll: false,\r\n appendTo: 'body'\r\n },\r\n removableOptions: {\r\n accept: '.' + (opts.itemClass || 'grid-stack-item')\r\n },\r\n };\r\n if (el.getAttribute('gs-animate')) { // default to true, but if set to false use that instead\r\n defaults.animate = Utils.toBool(el.getAttribute('gs-animate'))\r\n }\r\n\r\n this.opts = Utils.defaults(opts, defaults);\r\n opts = null; // make sure we use this.opts instead\r\n this.initMargin();\r\n\r\n if (this.opts.rtl === 'auto') {\r\n this.opts.rtl = el.style.direction === 'rtl';\r\n }\r\n\r\n if (this.opts.rtl) {\r\n this.el.classList.add('grid-stack-rtl');\r\n }\r\n\r\n // check if we're been nested, and if so update our style and keep pointer around (used during save)\r\n let parentGridItemEl = Utils.closestByClass(this.el, GridDefaults.itemClass) as GridItemHTMLElement;\r\n if (parentGridItemEl && parentGridItemEl.gridstackNode) {\r\n this.opts._isNested = parentGridItemEl.gridstackNode;\r\n this.opts._isNested.subGrid = this;\r\n this.el.classList.add('grid-stack-nested');\r\n }\r\n\r\n this._isAutoCellHeight = (this.opts.cellHeight === 'auto');\r\n if (this._isAutoCellHeight) {\r\n // make the cell content square initially (will use resize event to keep it square)\r\n let marginDiff = - (this.opts.marginRight as number) - (this.opts.marginLeft as number)\r\n + (this.opts.marginTop as number) + (this.opts.marginBottom as number);\r\n this.cellHeight(this.cellWidth() + marginDiff, false);\r\n } else {\r\n this.cellHeight(this.opts.cellHeight, false);\r\n }\r\n\r\n this.el.classList.add(this.opts._styleSheetClass);\r\n\r\n this._setStaticClass();\r\n\r\n this.engine = new GridStackEngine({\r\n column: this.opts.column,\r\n float: this.opts.float,\r\n maxRow: this.opts.maxRow,\r\n onChange: (cbNodes, removeDOM = true) => {\r\n let maxH = 0;\r\n this.engine.nodes.forEach(n => { maxH = Math.max(maxH, n.y + n.h) });\r\n cbNodes.forEach(n => {\r\n let el = n.el;\r\n if (removeDOM && n._id === null) {\r\n if (el && el.parentNode) { el.parentNode.removeChild(el) }\r\n } else {\r\n this._writePosAttr(el, n.x, n.y, n.w, n.h);\r\n }\r\n });\r\n this._updateStyles(false, maxH); // false = don't recreate, just append if need be\r\n }\r\n });\r\n\r\n if (this.opts.auto) {\r\n this.batchUpdate(); // prevent in between re-layout #1535 TODO: this only set float=true, need to prevent collision check...\r\n let elements: {el: HTMLElement; i: number}[] = [];\r\n this.getGridItems().forEach(el => {\r\n let x = parseInt(el.getAttribute('gs-x'));\r\n let y = parseInt(el.getAttribute('gs-y'));\r\n elements.push({\r\n el,\r\n // if x,y are missing (autoPosition) add them to end of list - but keep their respective DOM order\r\n i: (Number.isNaN(x) ? 1000 : x) + (Number.isNaN(y) ? 1000 : y) * this.opts.column\r\n });\r\n });\r\n elements.sort(e => e.i).forEach(e => this._prepareElement(e.el));\r\n this.commit();\r\n }\r\n this.engine.saveInitial(); // initial start of items\r\n\r\n this.setAnimation(this.opts.animate);\r\n\r\n let placeholderChild = document.createElement('div');\r\n placeholderChild.className = 'placeholder-content';\r\n placeholderChild.innerHTML = this.opts.placeholderText;\r\n this.placeholder = document.createElement('div');\r\n this.placeholder.classList.add(this.opts.placeholderClass, defaults.itemClass, this.opts.itemClass);\r\n this.placeholder.appendChild(placeholderChild);\r\n\r\n this._updateStyles();\r\n if (this.opts.column != 12) {\r\n this.el.classList.add('grid-stack-' + this.opts.column);\r\n }\r\n\r\n this._setupDragIn();\r\n this._setupRemoveDrop();\r\n this._setupAcceptWidget();\r\n this._updateWindowResizeEvent(); // finally this may size us down to 1 column\r\n }\r\n\r\n /**\r\n * add a new widget and returns it.\r\n *\r\n * Widget will be always placed even if result height is more than actual grid height.\r\n * You need to use `willItFit()` before calling addWidget for additional check.\r\n * See also `makeWidget()`.\r\n *\r\n * @example\r\n * let grid = GridStack.init();\r\n * grid.addWidget({w: 3, content: 'hello'});\r\n * grid.addWidget('
    hello
    ', {w: 3});\r\n *\r\n * @param el GridStackWidget (which can have content string as well), html element, or string definition to add\r\n * @param options widget position/size options (optional, and ignore if first param is already option) - see GridStackWidget\r\n */\r\n public addWidget(els?: GridStackWidget | GridStackElement, options?: GridStackWidget): GridItemHTMLElement {\r\n\r\n // support legacy call for now ?\r\n if (arguments.length > 2) {\r\n console.warn('gridstack.ts: `addWidget(el, x, y, width...)` is deprecated. Use `addWidget({x, y, w, content, ...})`. It will be removed soon');\r\n // eslint-disable-next-line prefer-rest-params\r\n let a = arguments, i = 1,\r\n opt: GridStackWidget = { x:a[i++], y:a[i++], w:a[i++], h:a[i++], autoPosition:a[i++],\r\n minW:a[i++], maxW:a[i++], minH:a[i++], maxH:a[i++], id:a[i++] };\r\n return this.addWidget(els, opt);\r\n }\r\n\r\n function isGridStackWidget(w: GridStackWidget): w is GridStackWidget { // https://medium.com/ovrsea/checking-the-type-of-an-object-in-typescript-the-type-guards-24d98d9119b0\r\n return w.x !== undefined || w.y !== undefined || w.w !== undefined || w.h !== undefined || w.content !== undefined ? true : false;\r\n }\r\n\r\n let el: HTMLElement;\r\n if (typeof els === 'string') {\r\n let doc = document.implementation.createHTMLDocument();\r\n doc.body.innerHTML = els;\r\n el = doc.body.children[0] as HTMLElement;\r\n } else if (arguments.length === 0 || arguments.length === 1 && isGridStackWidget(els)) {\r\n let content = els ? (els as GridStackWidget).content || '' : '';\r\n options = els;\r\n let doc = document.implementation.createHTMLDocument();\r\n doc.body.innerHTML = `
    ${content}
    `;\r\n el = doc.body.children[0] as HTMLElement;\r\n } else {\r\n el = els as HTMLElement;\r\n }\r\n\r\n // Tempting to initialize the passed in opt with default and valid values, but this break knockout demos\r\n // as the actual value are filled in when _prepareElement() calls el.getAttribute('gs-xyz) before adding the node.\r\n // So make sure we load any DOM attributes that are not specified in passed in options (which override)\r\n let domAttr = this._readAttr(el);\r\n options = {...(options || {})}; // make a copy before we modify in case caller re-uses it\r\n Utils.defaults(options, domAttr);\r\n this.engine.prepareNode(options);\r\n this._writeAttr(el, options);\r\n\r\n if (this._insertNotAppend) {\r\n this.el.prepend(el);\r\n } else {\r\n this.el.appendChild(el);\r\n }\r\n\r\n // similar to makeWidget() that doesn't read attr again and worse re-create a new node and loose any _id\r\n this._prepareElement(el, true, options);\r\n this._updateContainerHeight();\r\n this._triggerAddEvent();\r\n this._triggerChangeEvent();\r\n\r\n return el;\r\n }\r\n\r\n /**\r\n * saves the current layout returning a list of widgets for serialization (with default to save content), which might include any nested grids.\r\n * Optionally you can also save the grid with options itself, so you can call the new GridStack.addGrid()\r\n * to recreate everything from scratch. GridStackOptions.children would then contain the widget list.\r\n */\r\n public save(saveContent = true, saveGridOpt = false): GridStackWidget[] | GridStackOptions {\r\n // return copied nodes we can modify at will...\r\n let list = this.engine.save(saveContent);\r\n\r\n // check for HTML content as well\r\n if (saveContent) {\r\n list.forEach(n => {\r\n if (n.el && !n.subGrid) { // sub-grid are saved differently, not plain content\r\n let sub = n.el.querySelector('.grid-stack-item-content');\r\n n.content = sub ? sub.innerHTML : undefined;\r\n if (!n.content) delete n.content;\r\n delete n.el;\r\n }\r\n });\r\n }\r\n\r\n // check if save entire grid options (needed for recursive) + children...\r\n if (saveGridOpt) {\r\n\r\n // check for nested grid\r\n list.forEach(n => {\r\n if (n.subGrid) {\r\n n.subGrid = (n.subGrid as GridStack).save(saveContent, saveGridOpt) as GridStackOptions;\r\n }\r\n })\r\n\r\n let o: GridStackOptions = {...this.opts};\r\n // delete default values that will be recreated on launch\r\n if (o.marginBottom === o.marginTop && o.marginRight === o.marginLeft && o.marginTop === o.marginRight) {\r\n o.margin = o.marginTop;\r\n delete o.marginTop; delete o.marginRight; delete o.marginBottom; delete o.marginLeft;\r\n }\r\n if (o.rtl === (this.el.style.direction === 'rtl')) { o.rtl = 'auto' }\r\n if (this._isAutoCellHeight) { o.cellHeight = 'auto' }\r\n Utils.removeInternalAndSame(o, GridDefaults);\r\n o.children = list;\r\n return o;\r\n }\r\n\r\n return list;\r\n }\r\n\r\n /**\r\n * load the widgets from a list. This will call update() on each (matching by id) or add/remove widgets that are not there.\r\n *\r\n * @param layout list of widgets definition to update/create\r\n * @param addAndRemove boolean (default true) or callback method can be passed to control if and how missing widgets can be added/removed, giving\r\n * the user control of insertion.\r\n *\r\n * @example\r\n * see http://gridstackjs.com/demo/serialization.html\r\n **/\r\n public load(layout: GridStackWidget[], addAndRemove: boolean | ((g: GridStack, w: GridStackWidget, add: boolean) => GridItemHTMLElement) = true): GridStack {\r\n let items = GridStack.Utils.sort(layout, -1, this._prevColumn || this.opts.column);\r\n this._insertNotAppend = true; // since create in reverse order...\r\n\r\n // if we're loading a layout into 1 column (_prevColumn is set only when going to 1) and items don't fit, make sure to save\r\n // the original wanted layout so we can scale back up correctly #1471\r\n if (this._prevColumn && this._prevColumn !== this.opts.column && items.some(n => (n.x + n.w) > this.opts.column)) {\r\n this._ignoreLayoutsNodeChange = true; // skip layout update\r\n this.engine.cacheLayout(items, this._prevColumn, true);\r\n }\r\n\r\n let removed: GridStackNode[] = [];\r\n this.batchUpdate();\r\n\r\n // see if any items are missing from new layout and need to be removed first\r\n if (addAndRemove) {\r\n let copyNodes = [...this.engine.nodes]; // don't loop through array you modify\r\n copyNodes.forEach(n => {\r\n let item = items.find(w => n.id === w.id);\r\n if (!item) {\r\n if (typeof(addAndRemove) === 'function') {\r\n addAndRemove(this, n, false);\r\n } else {\r\n removed.push(n); // batch keep track\r\n this.removeWidget(n.el, true, false);\r\n }\r\n }\r\n });\r\n }\r\n\r\n // now add/update the widgets\r\n items.forEach(w => {\r\n let item = (w.id || w.id === 0) ? this.engine.nodes.find(n => n.id === w.id) : undefined;\r\n if (item) {\r\n this.update(item.el, w);\r\n if (w.subGrid && (w.subGrid as GridStackOptions).children) { // update any sub grid as well\r\n let sub = item.el.querySelector('.grid-stack') as GridHTMLElement;\r\n if (sub && sub.gridstack) {\r\n sub.gridstack.load((w.subGrid as GridStackOptions).children); // TODO: support updating grid options ?\r\n this._insertNotAppend = true; // got reset by above call\r\n }\r\n }\r\n } else if (addAndRemove) {\r\n if (typeof(addAndRemove) === 'function') {\r\n w = addAndRemove(this, w, true).gridstackNode;\r\n } else {\r\n w = this.addWidget(w).gridstackNode;\r\n }\r\n if (w.subGrid) { // see if there is a sub-grid to create too\r\n let content = w.el.querySelector('.grid-stack-item-content') as HTMLElement;\r\n w.subGrid = GridStack.addGrid(content, w.subGrid as GridStackOptions);\r\n }\r\n }\r\n });\r\n\r\n this.engine.removedNodes = removed;\r\n this.commit();\r\n\r\n // after commit, clear that flag\r\n delete this._ignoreLayoutsNodeChange;\r\n delete this._insertNotAppend;\r\n return this;\r\n }\r\n\r\n /**\r\n * Initializes batch updates. You will see no changes until `commit()` method is called.\r\n */\r\n public batchUpdate(): GridStack {\r\n this.engine.batchUpdate();\r\n return this;\r\n }\r\n\r\n /**\r\n * Gets current cell height.\r\n */\r\n public getCellHeight(forcePixel = false): number {\r\n if (this.opts.cellHeight && this.opts.cellHeight !== 'auto' &&\r\n (!forcePixel || !this.opts.cellHeightUnit || this.opts.cellHeightUnit === 'px')) {\r\n return this.opts.cellHeight as number;\r\n }\r\n // else get first cell height\r\n // or do entire grid and # of rows ? (this.el.getBoundingClientRect().height) / parseInt(this.el.getAttribute('gs-current-row'))\r\n let el = this.el.querySelector('.' + this.opts.itemClass) as HTMLElement;\r\n let height = Utils.toNumber(el.getAttribute('gs-h'));\r\n return Math.round(el.offsetHeight / height);\r\n }\r\n\r\n /**\r\n * Update current cell height - see `GridStackOptions.cellHeight` for format.\r\n * This method rebuilds an internal CSS style sheet.\r\n * Note: You can expect performance issues if call this method too often.\r\n *\r\n * @param val the cell height\r\n * @param update (Optional) if false, styles will not be updated\r\n *\r\n * @example\r\n * grid.cellHeight(grid.cellWidth() * 1.2);\r\n */\r\n public cellHeight(val: numberOrString, update = true): GridStack {\r\n let data = Utils.parseHeight(val);\r\n if (this.opts.cellHeightUnit === data.unit && this.opts.cellHeight === data.h) {\r\n return this;\r\n }\r\n this.opts.cellHeightUnit = data.unit;\r\n this.opts.cellHeight = data.h;\r\n\r\n if (update) {\r\n this._updateStyles(true, this.getRow()); // true = force re-create, for that # of rows\r\n }\r\n this._resizeNestedGrids(this.el);\r\n return this;\r\n }\r\n\r\n /**\r\n * Gets current cell width.\r\n */\r\n public cellWidth(): number {\r\n // use parent width if we're 0 (no size yet)\r\n return (this.el.offsetWidth || this.el.parentElement.offsetWidth || window.innerWidth) / this.opts.column;\r\n }\r\n\r\n /**\r\n * Finishes batch updates. Updates DOM nodes. You must call it after batchUpdate.\r\n */\r\n public commit(): GridStack {\r\n this.engine.commit();\r\n this._triggerRemoveEvent();\r\n this._triggerAddEvent();\r\n this._triggerChangeEvent();\r\n return this;\r\n }\r\n\r\n /** re-layout grid items to reclaim any empty space */\r\n public compact(): GridStack {\r\n this.engine.compact();\r\n this._triggerChangeEvent();\r\n return this;\r\n }\r\n\r\n /**\r\n * set the number of columns in the grid. Will update existing widgets to conform to new number of columns,\r\n * as well as cache the original layout so you can revert back to previous positions without loss.\r\n * Requires `gridstack-extra.css` or `gridstack-extra.min.css` for [2-11],\r\n * else you will need to generate correct CSS (see https://github.com/gridstack/gridstack.js#change-grid-columns)\r\n * @param column - Integer > 0 (default 12).\r\n * @param layout specify the type of re-layout that will happen (position, size, etc...).\r\n * Note: items will never be outside of the current column boundaries. default (moveScale). Ignored for 1 column\r\n */\r\n public column(column: number, layout: ColumnOptions = 'moveScale'): GridStack {\r\n if (this.opts.column === column) return this;\r\n let oldColumn = this.opts.column;\r\n\r\n // if we go into 1 column mode (which happens if we're sized less than minW unless disableOneColumnMode is on)\r\n // then remember the original columns so we can restore.\r\n if (column === 1) {\r\n this._prevColumn = oldColumn;\r\n } else {\r\n delete this._prevColumn;\r\n }\r\n\r\n this.el.classList.remove('grid-stack-' + oldColumn);\r\n this.el.classList.add('grid-stack-' + column);\r\n this.opts.column = this.engine.column = column;\r\n\r\n // update the items now - see if the dom order nodes should be passed instead (else default to current list)\r\n let domNodes: GridStackNode[];\r\n if (column === 1 && this.opts.oneColumnModeDomSort) {\r\n domNodes = [];\r\n this.getGridItems().forEach(el => {\r\n if (el.gridstackNode) { domNodes.push(el.gridstackNode); }\r\n });\r\n if (!domNodes.length) { domNodes = undefined; }\r\n }\r\n this.engine.updateNodeWidths(oldColumn, column, domNodes, layout);\r\n\r\n // and trigger our event last...\r\n this._ignoreLayoutsNodeChange = true; // skip layout update\r\n this._triggerChangeEvent();\r\n delete this._ignoreLayoutsNodeChange;\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * get the number of columns in the grid (default 12)\r\n */\r\n public getColumn(): number {\r\n return this.opts.column;\r\n }\r\n\r\n /** returns an array of grid HTML elements (no placeholder) - used to iterate through our children */\r\n public getGridItems(): GridItemHTMLElement[] {\r\n return Array.from(this.el.children)\r\n .filter((el: HTMLElement) => el.matches('.' + this.opts.itemClass) && !el.matches('.' + this.opts.placeholderClass)) as GridItemHTMLElement[];\r\n }\r\n\r\n /**\r\n * Destroys a grid instance. DO NOT CALL any methods or access any vars after this as it will free up members.\r\n * @param removeDOM if `false` grid and items HTML elements will not be removed from the DOM (Optional. Default `true`).\r\n */\r\n public destroy(removeDOM = true): GridStack {\r\n if (!this.el) return; // prevent multiple calls\r\n this._updateWindowResizeEvent(true);\r\n this.setStatic(true); // permanently removes DD\r\n if (!removeDOM) {\r\n this.removeAll(removeDOM);\r\n this.el.classList.remove(this.opts._styleSheetClass);\r\n } else {\r\n this.el.parentNode.removeChild(this.el);\r\n }\r\n this._removeStylesheet();\r\n delete this.opts._isNested;\r\n delete this.opts;\r\n delete this.placeholder;\r\n delete this.engine;\r\n delete this.el.gridstack; // remove circular dependency that would prevent a freeing\r\n delete this.el;\r\n return this;\r\n }\r\n\r\n /**\r\n * Temporarily disables widgets moving/resizing.\r\n * If you want a more permanent way (which freezes up resources) use `setStatic(true)` instead.\r\n * Note: no-op for static grid\r\n * This is a shortcut for:\r\n * @example\r\n * grid.enableMove(false);\r\n * grid.enableResize(false);\r\n */\r\n public disable(): GridStack {\r\n if (this.opts.staticGrid) return;\r\n this.enableMove(false);\r\n this.enableResize(false);\r\n this._triggerEvent('disable');\r\n return this;\r\n }\r\n\r\n /**\r\n * Re-enables widgets moving/resizing - see disable().\r\n * Note: no-op for static grid.\r\n * This is a shortcut for:\r\n * @example\r\n * grid.enableMove(true);\r\n * grid.enableResize(true);\r\n */\r\n public enable(): GridStack {\r\n if (this.opts.staticGrid) return;\r\n this.enableMove(true);\r\n this.enableResize(true);\r\n this._triggerEvent('enable');\r\n return this;\r\n }\r\n\r\n /**\r\n * Enables/disables widget moving. No-op for static grids.\r\n *\r\n * @param doEnable\r\n * @param includeNewWidgets will force new widgets to be draggable as per\r\n * doEnable`s value by changing the disableDrag grid option (default: true).\r\n */\r\n public enableMove(doEnable: boolean, includeNewWidgets = true): GridStack {\r\n if (this.opts.staticGrid) return this; // can't move a static grid!\r\n this.getGridItems().forEach(el => this.movable(el, doEnable));\r\n if (includeNewWidgets) {\r\n this.opts.disableDrag = !doEnable;\r\n }\r\n return this;\r\n }\r\n\r\n /**\r\n * Enables/disables widget resizing. No-op for static grids.\r\n * @param doEnable\r\n * @param includeNewWidgets will force new widgets to be draggable as per\r\n * doEnable`s value by changing the disableResize grid option (default: true).\r\n */\r\n public enableResize(doEnable: boolean, includeNewWidgets = true): GridStack {\r\n if (this.opts.staticGrid) return this; // can't size a static grid!\r\n this.getGridItems().forEach(el => this.resizable(el, doEnable));\r\n if (includeNewWidgets) {\r\n this.opts.disableResize = !doEnable;\r\n }\r\n return this;\r\n }\r\n\r\n /**\r\n * enable/disable floating widgets (default: `false`) See [example](http://gridstackjs.com/demo/float.html)\r\n */\r\n public float(val: boolean): GridStack {\r\n /*\r\n if (val === undefined) {\r\n // TODO: should we support and/or change signature ? figure this soon...\r\n console.warn('gridstack.ts: getter `float()` is deprecated in 2.x and has been replaced by `getFloat()`. It will be **completely** removed soon');\r\n return this.getFloat();\r\n }\r\n */\r\n this.engine.float = val;\r\n this._triggerChangeEvent();\r\n return this;\r\n }\r\n\r\n /**\r\n * get the current float mode\r\n */\r\n public getFloat(): boolean {\r\n return this.engine.float;\r\n }\r\n\r\n /**\r\n * Get the position of the cell under a pixel on screen.\r\n * @param position the position of the pixel to resolve in\r\n * absolute coordinates, as an object with top and left properties\r\n * @param useDocRelative if true, value will be based on document position vs parent position (Optional. Default false).\r\n * Useful when grid is within `position: relative` element\r\n *\r\n * Returns an object with properties `x` and `y` i.e. the column and row in the grid.\r\n */\r\n public getCellFromPixel(position: MousePosition, useDocRelative = false): CellPosition {\r\n let box = this.el.getBoundingClientRect();\r\n // console.log(`getBoundingClientRect left: ${box.left} top: ${box.top} w: ${box.w} h: ${box.h}`)\r\n let containerPos;\r\n if (useDocRelative) {\r\n containerPos = {top: box.top + document.documentElement.scrollTop, left: box.left};\r\n // console.log(`getCellFromPixel scrollTop: ${document.documentElement.scrollTop}`)\r\n } else {\r\n containerPos = {top: this.el.offsetTop, left: this.el.offsetLeft}\r\n // console.log(`getCellFromPixel offsetTop: ${containerPos.left} offsetLeft: ${containerPos.top}`)\r\n }\r\n let relativeLeft = position.left - containerPos.left;\r\n let relativeTop = position.top - containerPos.top;\r\n\r\n let columnWidth = (box.width / this.opts.column);\r\n let rowHeight = (box.height / parseInt(this.el.getAttribute('gs-current-row')));\r\n\r\n return {x: Math.floor(relativeLeft / columnWidth), y: Math.floor(relativeTop / rowHeight)};\r\n }\r\n\r\n /** returns the current number of rows, which will be at least `minRow` if set */\r\n public getRow(): number {\r\n return Math.max(this.engine.getRow(), this.opts.minRow);\r\n }\r\n\r\n /**\r\n * Checks if specified area is empty.\r\n * @param x the position x.\r\n * @param y the position y.\r\n * @param w the width of to check\r\n * @param h the height of to check\r\n */\r\n public isAreaEmpty(x: number, y: number, w: number, h: number): boolean {\r\n return this.engine.isAreaEmpty(x, y, w, h);\r\n }\r\n\r\n /**\r\n * If you add elements to your grid by hand, you have to tell gridstack afterwards to make them widgets.\r\n * If you want gridstack to add the elements for you, use `addWidget()` instead.\r\n * Makes the given element a widget and returns it.\r\n * @param els widget or single selector to convert.\r\n *\r\n * @example\r\n * let grid = GridStack.init();\r\n * grid.el.appendChild('
    ');\r\n * grid.makeWidget('#gsi-1');\r\n */\r\n public makeWidget(els: GridStackElement): GridItemHTMLElement {\r\n let el = GridStack.getElement(els);\r\n this._prepareElement(el, true);\r\n this._updateContainerHeight();\r\n this._triggerAddEvent();\r\n this._triggerChangeEvent();\r\n return el;\r\n }\r\n\r\n /**\r\n * Event handler that extracts our CustomEvent data out automatically for receiving custom\r\n * notifications (see doc for supported events)\r\n * @param name of the event (see possible values) or list of names space separated\r\n * @param callback function called with event and optional second/third param\r\n * (see README documentation for each signature).\r\n *\r\n * @example\r\n * grid.on('added', function(e, items) { log('added ', items)} );\r\n * or\r\n * grid.on('added removed change', function(e, items) { log(e.type, items)} );\r\n *\r\n * Note: in some cases it is the same as calling native handler and parsing the event.\r\n * grid.el.addEventListener('added', function(event) { log('added ', event.detail)} );\r\n *\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n public on(name: GridStackEvent, callback: (event: Event, arg2?: GridItemHTMLElement | GridStackNode[]) => void): GridStack {\r\n // check for array of names being passed instead\r\n if (name.indexOf(' ') !== -1) {\r\n let names = name.split(' ') as GridStackEvent[];\r\n names.forEach(name => this.on(name, callback));\r\n return this;\r\n }\r\n\r\n if (name === 'change' || name === 'added' || name === 'removed' || name === 'enable' || name === 'disable') {\r\n // native CustomEvent handlers - cash the generic handlers so we can easily remove\r\n let noData = (name === 'enable' || name === 'disable');\r\n if (noData) {\r\n this._gsEventHandler[name] = (event: Event) => callback(event);\r\n } else {\r\n this._gsEventHandler[name] = (event: CustomEvent) => callback(event, event.detail);\r\n }\r\n this.el.addEventListener(name, this._gsEventHandler[name]);\r\n } else if (name === 'dragstart' || name === 'dragstop' || name === 'resizestart' || name === 'resizestop' || name === 'dropped') {\r\n // drag&drop stop events NEED to be call them AFTER we update node attributes so handle them ourself.\r\n // do same for start event to make it easier...\r\n this._gsEventHandler[name] = callback;\r\n } else {\r\n console.log('GridStack.on(' + name + ') event not supported, but you can still use $(\".grid-stack\").on(...) while jquery-ui is still used internally.');\r\n }\r\n return this;\r\n }\r\n\r\n /**\r\n * unsubscribe from the 'on' event below\r\n * @param name of the event (see possible values)\r\n */\r\n public off(name: GridStackEvent): GridStack {\r\n // check for array of names being passed instead\r\n if (name.indexOf(' ') !== -1) {\r\n let names = name.split(' ') as GridStackEvent[];\r\n names.forEach(name => this.off(name));\r\n return this;\r\n }\r\n\r\n if (name === 'change' || name === 'added' || name === 'removed' || name === 'enable' || name === 'disable') {\r\n // remove native CustomEvent handlers\r\n if (this._gsEventHandler[name]) {\r\n this.el.removeEventListener(name, this._gsEventHandler[name]);\r\n }\r\n }\r\n delete this._gsEventHandler[name];\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Removes widget from the grid.\r\n * @param el widget or selector to modify\r\n * @param removeDOM if `false` DOM element won't be removed from the tree (Default? true).\r\n * @param triggerEvent if `false` (quiet mode) element will not be added to removed list and no 'removed' callbacks will be called (Default? true).\r\n */\r\n public removeWidget(els: GridStackElement, removeDOM = true, triggerEvent = true): GridStack {\r\n GridStack.getElements(els).forEach(el => {\r\n if (el.parentElement !== this.el) return; // not our child!\r\n let node = el.gridstackNode;\r\n // For Meteor support: https://github.com/gridstack/gridstack.js/pull/272\r\n if (!node) {\r\n node = this.engine.nodes.find(n => el === n.el);\r\n }\r\n if (!node) return;\r\n\r\n // remove our DOM data (circular link) and drag&drop permanently\r\n delete el.gridstackNode;\r\n GridStackDDI.get().remove(el);\r\n\r\n this.engine.removeNode(node, removeDOM, triggerEvent);\r\n\r\n if (removeDOM && el.parentElement) {\r\n el.remove(); // in batch mode engine.removeNode doesn't call back to remove DOM\r\n }\r\n });\r\n if (triggerEvent) {\r\n this._triggerRemoveEvent();\r\n this._triggerChangeEvent();\r\n }\r\n return this;\r\n }\r\n\r\n /**\r\n * Removes all widgets from the grid.\r\n * @param removeDOM if `false` DOM elements won't be removed from the tree (Default? `true`).\r\n */\r\n public removeAll(removeDOM = true): GridStack {\r\n // always remove our DOM data (circular link) before list gets emptied and drag&drop permanently\r\n this.engine.nodes.forEach(n => {\r\n delete n.el.gridstackNode;\r\n GridStackDDI.get().remove(n.el);\r\n });\r\n this.engine.removeAll(removeDOM);\r\n this._triggerRemoveEvent();\r\n return this;\r\n }\r\n\r\n /**\r\n * Toggle the grid animation state. Toggles the `grid-stack-animate` class.\r\n * @param doAnimate if true the grid will animate.\r\n */\r\n public setAnimation(doAnimate: boolean): GridStack {\r\n if (doAnimate) {\r\n this.el.classList.add('grid-stack-animate');\r\n } else {\r\n this.el.classList.remove('grid-stack-animate');\r\n }\r\n return this;\r\n }\r\n\r\n /**\r\n * Toggle the grid static state, which permanently removes/add Drag&Drop support, unlike disable()/enable() that just turns it off/on.\r\n * Also toggle the grid-stack-static class.\r\n * @param val if true the grid become static.\r\n */\r\n public setStatic(val: boolean): GridStack {\r\n if (this.opts.staticGrid === val) return this;\r\n this.opts.staticGrid = val;\r\n this.engine.nodes.forEach(n => this._prepareDragDropByNode(n)); // either delete Drag&drop or initialize it\r\n this._setStaticClass();\r\n return this;\r\n }\r\n\r\n /**\r\n * Updates widget position/size and other info. Note: if you need to call this on all nodes, use load() instead which will update what changed.\r\n * @param els widget or selector of objects to modify (note: setting the same x,y for multiple items will be indeterministic and likely unwanted)\r\n * @param opt new widget options (x,y,w,h, etc..). Only those set will be updated.\r\n */\r\n public update(els: GridStackElement, opt: GridStackWidget): GridStack {\r\n\r\n // support legacy call for now ?\r\n if (arguments.length > 2) {\r\n console.warn('gridstack.ts: `update(el, x, y, w, h)` is deprecated. Use `update({x, w, content, ...})`. It will be removed soon');\r\n // eslint-disable-next-line prefer-rest-params\r\n let a = arguments, i = 1;\r\n opt = { x:a[i++], y:a[i++], w:a[i++], h:a[i++] };\r\n return this.update(els, opt);\r\n }\r\n\r\n GridStack.getElements(els).forEach(el => {\r\n if (!el || !el.gridstackNode) return;\r\n let n = el.gridstackNode;\r\n let w = {...opt}; // make a copy we can modify in case they re-use it or multiple items\r\n delete w.autoPosition;\r\n\r\n // move/resize widget if anything changed\r\n let keys = ['x', 'y', 'w', 'h'];\r\n let m: GridStackWidget;\r\n if (keys.some(k => w[k] !== undefined && w[k] !== n[k])) {\r\n m = {};\r\n keys.forEach(k => {\r\n m[k] = (w[k] !== undefined) ? w[k] : n[k];\r\n delete w[k];\r\n });\r\n }\r\n // for a move as well IFF there is any min/max fields set\r\n if (!m && (w.minW || w.minH || w.maxW || w.maxH)) {\r\n m = {}; // will use node position but validate values\r\n }\r\n\r\n // check for content changing\r\n if (w.content) {\r\n let sub = el.querySelector('.grid-stack-item-content');\r\n if (sub && sub.innerHTML !== w.content) {\r\n sub.innerHTML = w.content;\r\n }\r\n delete w.content;\r\n }\r\n\r\n // any remaining fields are assigned, but check for dragging changes, resize constrain\r\n let changed = false;\r\n let ddChanged = false;\r\n for (const key in w) {\r\n if (key[0] !== '_' && n[key] !== w[key]) {\r\n n[key] = w[key];\r\n changed = true;\r\n ddChanged = ddChanged || (!this.opts.staticGrid && (key === 'noResize' || key === 'noMove' || key === 'locked'));\r\n }\r\n }\r\n\r\n // finally move the widget\r\n if (m) {\r\n this.engine.cleanNodes();\r\n this.engine.beginUpdate(n);\r\n this.engine.moveNode(n, m.x, m.y, m.w, m.h);\r\n this._updateContainerHeight();\r\n this._triggerChangeEvent();\r\n this.engine.endUpdate();\r\n }\r\n if (changed) { // move will only update x,y,w,h so update the rest too\r\n this._writeAttr(el, n);\r\n }\r\n if (ddChanged) {\r\n this._prepareDragDropByNode(n);\r\n }\r\n });\r\n return this;\r\n }\r\n\r\n /**\r\n * 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).\r\n * @param value margin value\r\n */\r\n public margin(value: numberOrString): GridStack {\r\n let isMultiValue = (typeof value === 'string' && value.split(' ').length > 1);\r\n // check if we can skip re-creating our CSS file... won't check if multi values (too much hassle)\r\n if (!isMultiValue) {\r\n let data = Utils.parseHeight(value);\r\n if (this.opts.marginUnit === data.unit && this.opts.margin === data.h) return;\r\n }\r\n // re-use existing margin handling\r\n this.opts.margin = value;\r\n this.opts.marginTop = this.opts.marginBottom = this.opts.marginLeft = this.opts.marginRight = undefined;\r\n this.initMargin();\r\n\r\n this._updateStyles(true); // true = force re-create\r\n\r\n return this;\r\n }\r\n\r\n /** returns current margin number value (undefined if 4 sides don't match) */\r\n public getMargin(): number { return this.opts.margin as number; }\r\n\r\n /**\r\n * Returns true if the height of the grid will be less than the vertical\r\n * constraint. Always returns true if grid doesn't have height constraint.\r\n * @param node contains x,y,w,h,auto-position options\r\n *\r\n * @example\r\n * if (grid.willItFit(newWidget)) {\r\n * grid.addWidget(newWidget);\r\n * } else {\r\n * alert('Not enough free space to place the widget');\r\n * }\r\n */\r\n public willItFit(node: GridStackWidget): boolean {\r\n // support legacy call for now\r\n if (arguments.length > 1) {\r\n console.warn('gridstack.ts: `willItFit(x,y,w,h,autoPosition)` is deprecated. Use `willItFit({x, y,...})`. It will be removed soon');\r\n // eslint-disable-next-line prefer-rest-params\r\n let a = arguments, i = 0,\r\n w: GridStackWidget = { x:a[i++], y:a[i++], w:a[i++], h:a[i++], autoPosition:a[i++] };\r\n return this.willItFit(w);\r\n }\r\n return this.engine.willItFit(node);\r\n }\r\n\r\n /** @internal */\r\n private _triggerChangeEvent(): GridStack {\r\n if (this.engine.batchMode) return this;\r\n let elements = this.engine.getDirtyNodes(true); // verify they really changed\r\n if (elements && elements.length) {\r\n if (!this._ignoreLayoutsNodeChange) {\r\n this.engine.layoutsNodesChange(elements);\r\n }\r\n this._triggerEvent('change', elements);\r\n }\r\n this.engine.saveInitial(); // we called, now reset initial values & dirty flags\r\n return this;\r\n }\r\n\r\n /** @internal */\r\n private _triggerAddEvent(): GridStack {\r\n if (this.engine.batchMode) return this;\r\n if (this.engine.addedNodes && this.engine.addedNodes.length > 0) {\r\n if (!this._ignoreLayoutsNodeChange) {\r\n this.engine.layoutsNodesChange(this.engine.addedNodes);\r\n }\r\n // prevent added nodes from also triggering 'change' event (which is called next)\r\n this.engine.addedNodes.forEach(n => { delete n._dirty; });\r\n this._triggerEvent('added', this.engine.addedNodes);\r\n this.engine.addedNodes = [];\r\n }\r\n return this;\r\n }\r\n\r\n /** @internal */\r\n public _triggerRemoveEvent(): GridStack {\r\n if (this.engine.batchMode) return this;\r\n if (this.engine.removedNodes && this.engine.removedNodes.length > 0) {\r\n this._triggerEvent('removed', this.engine.removedNodes);\r\n this.engine.removedNodes = [];\r\n }\r\n return this;\r\n }\r\n\r\n /** @internal */\r\n private _triggerEvent(name: string, data?: GridStackNode[]): GridStack {\r\n let event = data ? new CustomEvent(name, {bubbles: false, detail: data}) : new Event(name);\r\n this.el.dispatchEvent(event);\r\n return this;\r\n }\r\n\r\n /** @internal called to delete the current dynamic style sheet used for our layout */\r\n private _removeStylesheet(): GridStack {\r\n\r\n if (this._styles) {\r\n Utils.removeStylesheet(this._styles._id);\r\n delete this._styles;\r\n }\r\n return this;\r\n }\r\n\r\n /** @internal updated/create the CSS styles for row based layout and initial margin setting */\r\n private _updateStyles(forceUpdate = false, maxH?: number): GridStack {\r\n // call to delete existing one if we change cellHeight / margin\r\n if (forceUpdate) {\r\n this._removeStylesheet();\r\n }\r\n\r\n this._updateContainerHeight();\r\n\r\n // if user is telling us they will handle the CSS themselves by setting heights to 0. Do we need this opts really ??\r\n if (this.opts.cellHeight === 0) {\r\n return this;\r\n }\r\n\r\n let cellHeight = this.opts.cellHeight as number;\r\n let cellHeightUnit = this.opts.cellHeightUnit;\r\n let prefix = `.${this.opts._styleSheetClass} > .${this.opts.itemClass}`;\r\n\r\n // create one as needed\r\n if (!this._styles) {\r\n let id = 'gridstack-style-' + (Math.random() * 100000).toFixed();\r\n // insert style to parent (instead of 'head' by default) to support WebComponent\r\n let styleLocation = this.opts.styleInHead ? undefined : this.el.parentNode as HTMLElement;\r\n this._styles = Utils.createStylesheet(id, styleLocation);\r\n if (!this._styles) return this;\r\n this._styles._id = id;\r\n this._styles._max = 0;\r\n\r\n // these are done once only\r\n Utils.addCSSRule(this._styles, prefix, `min-height: ${cellHeight}${cellHeightUnit}`);\r\n // content margins\r\n let top: string = this.opts.marginTop + this.opts.marginUnit;\r\n let bottom: string = this.opts.marginBottom + this.opts.marginUnit;\r\n let right: string = this.opts.marginRight + this.opts.marginUnit;\r\n let left: string = this.opts.marginLeft + this.opts.marginUnit;\r\n let content = `${prefix} > .grid-stack-item-content`;\r\n let placeholder = `.${this.opts._styleSheetClass} > .grid-stack-placeholder > .placeholder-content`;\r\n Utils.addCSSRule(this._styles, content, `top: ${top}; right: ${right}; bottom: ${bottom}; left: ${left};`);\r\n Utils.addCSSRule(this._styles, placeholder, `top: ${top}; right: ${right}; bottom: ${bottom}; left: ${left};`);\r\n // resize handles offset (to match margin)\r\n Utils.addCSSRule(this._styles, `${prefix} > .ui-resizable-ne`, `right: ${right}`);\r\n Utils.addCSSRule(this._styles, `${prefix} > .ui-resizable-e`, `right: ${right}`);\r\n Utils.addCSSRule(this._styles, `${prefix} > .ui-resizable-se`, `right: ${right}; bottom: ${bottom}`);\r\n Utils.addCSSRule(this._styles, `${prefix} > .ui-resizable-nw`, `left: ${left}`);\r\n Utils.addCSSRule(this._styles, `${prefix} > .ui-resizable-w`, `left: ${left}`);\r\n Utils.addCSSRule(this._styles, `${prefix} > .ui-resizable-sw`, `left: ${left}; bottom: ${bottom}`);\r\n }\r\n\r\n // now update the height specific fields\r\n maxH = maxH || this._styles._max;\r\n if (maxH > this._styles._max) {\r\n let getHeight = (rows: number): string => (cellHeight * rows) + cellHeightUnit;\r\n for (let i = this._styles._max + 1; i <= maxH; i++) { // start at 1\r\n let h: string = getHeight(i);\r\n Utils.addCSSRule(this._styles, `${prefix}[gs-y=\"${i-1}\"]`, `top: ${getHeight(i-1)}`); // start at 0\r\n Utils.addCSSRule(this._styles, `${prefix}[gs-h=\"${i}\"]`, `height: ${h}`);\r\n Utils.addCSSRule(this._styles, `${prefix}[gs-min-h=\"${i}\"]`, `min-height: ${h}`);\r\n Utils.addCSSRule(this._styles, `${prefix}[gs-max-h=\"${i}\"]`, `max-height: ${h}`);\r\n }\r\n this._styles._max = maxH;\r\n }\r\n return this;\r\n }\r\n\r\n /** @internal */\r\n private _updateContainerHeight(): GridStack {\r\n if (!this.engine || this.engine.batchMode) return this;\r\n let row = this.getRow(); // checks for minRow already\r\n // check for css min height\r\n let cssMinHeight = parseInt(getComputedStyle(this.el)['min-height']);\r\n if (cssMinHeight > 0) {\r\n let minRow = Math.round(cssMinHeight / this.getCellHeight(true));\r\n if (row < minRow) {\r\n row = minRow;\r\n }\r\n }\r\n this.el.setAttribute('gs-current-row', String(row));\r\n if (row === 0) {\r\n this.el.style.removeProperty('height');\r\n return this;\r\n }\r\n let cellHeight = this.opts.cellHeight as number;\r\n let unit = this.opts.cellHeightUnit;\r\n if (!cellHeight) return this;\r\n this.el.style.height = row * cellHeight + unit;\r\n return this;\r\n }\r\n\r\n /** called to resize children nested grids when we/item resizes */\r\n private _resizeNestedGrids(target: HTMLElement): GridStack {\r\n target.querySelectorAll('.grid-stack').forEach((el: GridHTMLElement) => {\r\n if (el.gridstack) {\r\n el.gridstack.onParentResize();\r\n }});\r\n return this;\r\n }\r\n\r\n\r\n /** @internal */\r\n private _prepareElement(el: GridItemHTMLElement, triggerAddEvent = false, node?: GridStackNode): GridStack {\r\n if (!node) {\r\n el.classList.add(this.opts.itemClass);\r\n node = this._readAttr(el);\r\n }\r\n el.gridstackNode = node;\r\n node.el = el;\r\n node.grid = this;\r\n let copy = {...node};\r\n node = this.engine.addNode(node, triggerAddEvent);\r\n // write node attr back in case there was collision or we have to fix bad values during addNode()\r\n if (!Utils.same(node, copy)) {\r\n this._writeAttr(el, node);\r\n }\r\n this._prepareDragDropByNode(node);\r\n return this;\r\n }\r\n\r\n /** @internal call to write x,y,w,h attributes back to element */\r\n private _writePosAttr(el: HTMLElement, x?: number, y?: number, w?: number, h?: number): GridStack {\r\n if (x !== undefined && x !== null) { el.setAttribute('gs-x', String(x)); }\r\n if (y !== undefined && y !== null) { el.setAttribute('gs-y', String(y)); }\r\n if (w) { el.setAttribute('gs-w', String(w)); }\r\n if (h) { el.setAttribute('gs-h', String(h)); }\r\n return this;\r\n }\r\n\r\n /** @internal call to write any default attributes back to element */\r\n private _writeAttr(el: HTMLElement, node: GridStackWidget): GridStack {\r\n if (!node) return this;\r\n this._writePosAttr(el, node.x, node.y, node.w, node.h);\r\n\r\n let attrs /*: GridStackWidget but strings */ = { // remaining attributes\r\n autoPosition: 'gs-auto-position',\r\n minW: 'gs-min-w',\r\n minH: 'gs-min-h',\r\n maxW: 'gs-max-w',\r\n maxH: 'gs-max-h',\r\n noResize: 'gs-no-resize',\r\n noMove: 'gs-no-move',\r\n locked: 'gs-locked',\r\n id: 'gs-id',\r\n resizeHandles: 'gs-resize-handles'\r\n };\r\n for (const key in attrs) {\r\n if (node[key]) { // 0 is valid for x,y only but done above already and not in list anyway\r\n el.setAttribute(attrs[key], String(node[key]));\r\n } else {\r\n el.removeAttribute(attrs[key]);\r\n }\r\n }\r\n return this;\r\n }\r\n\r\n /** @internal call to read any default attributes from element */\r\n private _readAttr(el: HTMLElement): GridStackWidget {\r\n let node: GridStackNode = {};\r\n node.x = Utils.toNumber(el.getAttribute('gs-x'));\r\n node.y = Utils.toNumber(el.getAttribute('gs-y'));\r\n node.w = Utils.toNumber(el.getAttribute('gs-w'));\r\n node.h = Utils.toNumber(el.getAttribute('gs-h'));\r\n node.maxW = Utils.toNumber(el.getAttribute('gs-max-w'));\r\n node.minW = Utils.toNumber(el.getAttribute('gs-min-w'));\r\n node.maxH = Utils.toNumber(el.getAttribute('gs-max-h'));\r\n node.minH = Utils.toNumber(el.getAttribute('gs-min-h'));\r\n node.autoPosition = Utils.toBool(el.getAttribute('gs-auto-position'));\r\n node.noResize = Utils.toBool(el.getAttribute('gs-no-resize'));\r\n node.noMove = Utils.toBool(el.getAttribute('gs-no-move'));\r\n node.locked = Utils.toBool(el.getAttribute('gs-locked'));\r\n node.resizeHandles = el.getAttribute('gs-resize-handles');\r\n node.id = el.getAttribute('gs-id');\r\n\r\n // remove any key not found (null or false which is default)\r\n for (const key in node) {\r\n if (!node.hasOwnProperty(key)) return;\r\n if (!node[key] && node[key] !== 0) { // 0 can be valid value (x,y only really)\r\n delete node[key];\r\n }\r\n }\r\n\r\n return node;\r\n }\r\n\r\n /** @internal */\r\n private _setStaticClass(): GridStack {\r\n let classes = ['grid-stack-static'];\r\n\r\n if (this.opts.staticGrid) {\r\n this.el.classList.add(...classes);\r\n this.el.setAttribute('gs-static', 'true');\r\n } else {\r\n this.el.classList.remove(...classes);\r\n this.el.removeAttribute('gs-static');\r\n\r\n }\r\n return this;\r\n }\r\n\r\n /**\r\n * called when we are being resized by the window - check if the one Column Mode needs to be turned on/off\r\n * and remember the prev columns we used, as well as check for auto cell height (square)\r\n */\r\n public onParentResize(): GridStack {\r\n if (!this.el || !this.el.clientWidth) return; // return if we're gone or no size yet (will get called again)\r\n\r\n // make the cells content (minus margin) square again\r\n if (this._isAutoCellHeight) {\r\n Utils.throttle(() => {\r\n let marginDiff = - (this.opts.marginRight as number) - (this.opts.marginLeft as number)\r\n + (this.opts.marginTop as number) + (this.opts.marginBottom as number);\r\n this.cellHeight(this.cellWidth() + marginDiff);\r\n }, 100);\r\n }\r\n\r\n if (!this.opts.disableOneColumnMode && this.el.clientWidth <= this.opts.minWidth) {\r\n if (this._oneColumnMode) return this;\r\n this._oneColumnMode = true;\r\n this.column(1);\r\n this._resizeNestedGrids(this.el);\r\n } else {\r\n if (!this._oneColumnMode) return this;\r\n delete this._oneColumnMode;\r\n this.column(this._prevColumn);\r\n this._resizeNestedGrids(this.el);\r\n }\r\n\r\n return this;\r\n }\r\n\r\n /** add or remove the window size event handler */\r\n private _updateWindowResizeEvent(forceRemove = false): GridStack {\r\n const workTodo = (this._isAutoCellHeight || !this.opts.disableOneColumnMode);\r\n\r\n // 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)\r\n if (workTodo && !forceRemove && !this.opts._isNested && !this._windowResizeBind) {\r\n this._windowResizeBind = this.onParentResize.bind(this); // so we can properly remove later\r\n window.addEventListener('resize', this._windowResizeBind);\r\n this.onParentResize(); // initially call it once...\r\n } else if ((forceRemove || !workTodo) && this._windowResizeBind) {\r\n window.removeEventListener('resize', this._windowResizeBind);\r\n delete this._windowResizeBind; // remove link to us so we can free\r\n }\r\n\r\n return this;\r\n }\r\n\r\n /** @internal convert a potential selector into actual element */\r\n public static getElement(els: GridStackElement = '.grid-stack-item'): GridItemHTMLElement { return Utils.getElement(els) }\r\n /** @internal */\r\n public static getElements(els: GridStackElement = '.grid-stack-item'): GridItemHTMLElement[] { return Utils.getElements(els) }\r\n /** @internal */\r\n public static getGridElement(els: GridStackElement): GridHTMLElement { return GridStack.getElement(els) }\r\n /** @internal */\r\n public static getGridElements(els: string): GridHTMLElement[] { return Utils.getElements(els) }\r\n\r\n /** @internal initialize margin top/bottom/left/right and units */\r\n private initMargin(): GridStack {\r\n\r\n let data: HeightData;\r\n let margin = 0;\r\n\r\n // support passing multiple values like CSS (ex: '5px 10px 0 20px')\r\n let margins: string[] = [];\r\n if (typeof this.opts.margin === 'string') {\r\n margins = this.opts.margin.split(' ')\r\n }\r\n if (margins.length === 2) { // top/bot, left/right like CSS\r\n this.opts.marginTop = this.opts.marginBottom = margins[0];\r\n this.opts.marginLeft = this.opts.marginRight = margins[1];\r\n } else if (margins.length === 4) { // Clockwise like CSS\r\n this.opts.marginTop = margins[0];\r\n this.opts.marginRight = margins[1];\r\n this.opts.marginBottom = margins[2];\r\n this.opts.marginLeft = margins[3];\r\n } else {\r\n data = Utils.parseHeight(this.opts.margin);\r\n this.opts.marginUnit = data.unit;\r\n margin = this.opts.margin = data.h;\r\n }\r\n\r\n // see if top/bottom/left/right need to be set as well\r\n if (this.opts.marginTop === undefined) {\r\n this.opts.marginTop = margin;\r\n } else {\r\n data = Utils.parseHeight(this.opts.marginTop);\r\n this.opts.marginTop = data.h;\r\n delete this.opts.margin;\r\n }\r\n\r\n if (this.opts.marginBottom === undefined) {\r\n this.opts.marginBottom = margin;\r\n } else {\r\n data = Utils.parseHeight(this.opts.marginBottom);\r\n this.opts.marginBottom = data.h;\r\n delete this.opts.margin;\r\n }\r\n\r\n if (this.opts.marginRight === undefined) {\r\n this.opts.marginRight = margin;\r\n } else {\r\n data = Utils.parseHeight(this.opts.marginRight);\r\n this.opts.marginRight = data.h;\r\n delete this.opts.margin;\r\n }\r\n\r\n if (this.opts.marginLeft === undefined) {\r\n this.opts.marginLeft = margin;\r\n } else {\r\n data = Utils.parseHeight(this.opts.marginLeft);\r\n this.opts.marginLeft = data.h;\r\n delete this.opts.margin;\r\n }\r\n this.opts.marginUnit = data.unit; // in case side were spelled out, use those units instead...\r\n if (this.opts.marginTop === this.opts.marginBottom && this.opts.marginLeft === this.opts.marginRight && this.opts.marginTop === this.opts.marginRight) {\r\n this.opts.margin = this.opts.marginTop; // makes it easier to check for no-ops in setMargin()\r\n }\r\n return this;\r\n }\r\n\r\n /*\r\n * drag&drop empty stubs that will be implemented in gridstack-dd.ts for non static grid\r\n * so we don't incur the load unless needed.\r\n * NOTE: had to make those methods public in order to define them else as\r\n * GridStack.prototype._setupAcceptWidget = function()\r\n * maybe there is a better way....\r\n */\r\n /* eslint-disable @typescript-eslint/no-unused-vars */\r\n\r\n /**\r\n * Enables/Disables moving. No-op for static grids.\r\n * @param els widget or selector to modify.\r\n * @param val if true widget will be draggable.\r\n */\r\n public movable(els: GridStackElement, val: boolean): GridStack { return this }\r\n /**\r\n * Enables/Disables resizing. No-op for static grids.\r\n * @param els widget or selector to modify\r\n * @param val if true widget will be resizable.\r\n */\r\n public resizable(els: GridStackElement, val: boolean): GridStack { return this }\r\n /** @internal called to add drag over support to support widgets */\r\n public _setupAcceptWidget(): GridStack { return this }\r\n /** @internal called to setup a trash drop zone if the user specifies it */\r\n public _setupRemoveDrop(): GridStack { return this }\r\n /** @internal */\r\n public _setupRemovingTimeout(el: GridItemHTMLElement): GridStack { return this }\r\n /** @internal */\r\n public _clearRemovingTimeout(el: GridItemHTMLElement): GridStack { return this }\r\n /** @internal call to setup dragging in from the outside (say toolbar), with options */\r\n public _setupDragIn(): GridStack {return this; }\r\n /** @internal prepares the element for drag&drop **/\r\n public _prepareDragDropByNode(node: GridStackNode): GridStack { return this }\r\n\r\n // 2.x API that just calls the new and better update() - keep those around for backward compat only...\r\n /** @internal */\r\n public locked(els: GridStackElement, locked: boolean): GridStack { return this.update(els, {locked}) }\r\n /** @internal */\r\n public maxWidth(els: GridStackElement, maxW: number): GridStack { return this.update(els, {maxW}) }\r\n /** @internal */\r\n public minWidth(els: GridStackElement, minW: number): GridStack { return this.update(els, {minW}) }\r\n /** @internal */\r\n public maxHeight(els: GridStackElement, maxH: number): GridStack { return this.update(els, {maxH}) }\r\n /** @internal */\r\n public minHeight(els: GridStackElement, minH: number): GridStack { return this.update(els, {minH}) }\r\n /** @internal */\r\n public move(els: GridStackElement, x?: number, y?: number): GridStack { return this.update(els, {x, y}) }\r\n /** @internal */\r\n public resize(els: GridStackElement, w?: number, h?: number): GridStack { return this.update(els, {w, h}) }\r\n}\r\n","// dd-base-impl.ts 3.1.5 @preserve\n\n/**\n * https://gridstackjs.com/\n * (c) 2020 rhlin, Alain Dumesny\n * gridstack.js may be freely distributed under the MIT license.\n*/\nexport type EventCallback = (event: Event) => boolean|void;\nexport abstract class DDBaseImplement {\n /** returns the enable state, but you have to call enable()/disable() to change (as other things need to happen) */\n public get disabled(): boolean { return this._disabled; }\n\n /** @internal */\n private _disabled = false;\n /** @internal */\n private _eventRegister: {\n [eventName: string]: EventCallback;\n } = {};\n\n public on(event: string, callback: EventCallback): void {\n this._eventRegister[event] = callback;\n }\n\n public off(event: string): void {\n delete this._eventRegister[event];\n }\n\n public enable(): void {\n this._disabled = false;\n }\n\n public disable(): void {\n this._disabled = true;\n }\n\n public destroy(): void {\n delete this._eventRegister;\n }\n\n public triggerEvent(eventName: string, event: Event): boolean|void {\n if (this.disabled) return;\n if (!this._eventRegister) {return; } // used when destroy before triggerEvent fire\n if (this._eventRegister[eventName]) {\n return this._eventRegister[eventName](event);\n }\n }\n}\n\nexport interface HTMLElementExtendOpt {\n el: HTMLElement;\n option: T;\n updateOption(T): DDBaseImplement;\n}\n","// dd-draggable.ts 3.1.5 @preserve\n\n/**\n * https://gridstackjs.com/\n * (c) 2020 rhlin, Alain Dumesny\n * gridstack.js may be freely distributed under the MIT license.\n*/\nimport { DDManager } from './dd-manager';\nimport { DDUtils } from './dd-utils';\nimport { DDBaseImplement, HTMLElementExtendOpt } from './dd-base-impl';\nimport { GridItemHTMLElement, DDUIData } from '../types';\n\n// TODO: merge with DDDragOpt ?\nexport interface DDDraggableOpt {\n appendTo?: string | HTMLElement;\n containment?: string | HTMLElement; // TODO: not implemented yet\n handle?: string;\n revert?: string | boolean | unknown; // TODO: not implemented yet\n scroll?: boolean; // nature support by HTML5 drag drop, can't be switch to off actually\n helper?: string | HTMLElement | ((event: Event) => HTMLElement);\n basePosition?: 'fixed' | 'absolute';\n start?: (event: Event, ui: DDUIData) => void;\n stop?: (event: Event) => void;\n drag?: (event: Event, ui: DDUIData) => void;\n}\n\ninterface DragOffset {\n left: number;\n top: number;\n width: number;\n height: number;\n offsetLeft: number;\n offsetTop: number;\n}\n\nexport class DDDraggable extends DDBaseImplement implements HTMLElementExtendOpt {\n public el: HTMLElement;\n public option: DDDraggableOpt;\n public helper: HTMLElement; // used by GridStackDDNative\n\n /** @internal */\n private dragOffset: DragOffset;\n /** @internal */\n private dragElementOriginStyle: Array;\n /** @internal */\n private dragFollowTimer: number;\n /** @internal */\n private dragEl: HTMLElement;\n /** @internal */\n private dragging = false;\n /** @internal */\n private paintTimer: number;\n /** @internal */\n private parentOriginStylePosition: string;\n /** @internal */\n private helperContainment: HTMLElement;\n /** @internal */\n private static basePosition: 'fixed' | 'absolute' = 'absolute';\n /** @internal #1541 can't have {passive: true} on Safari as otherwise it reverts animate back to old location on drop */\n private static dragEventListenerOption = true; // DDUtils.isEventSupportPassiveOption ? { capture: true, passive: true } : true;\n /** @internal */\n private static originStyleProp = ['transition', 'pointerEvents', 'position',\n 'left', 'top', 'opacity', 'zIndex', 'width', 'height', 'willChange'];\n\n constructor(el: HTMLElement, option: DDDraggableOpt = {}) {\n super();\n this.el = el;\n this.option = option;\n // get the element that is actually supposed to be dragged by\n let className = option.handle.substring(1);\n this.dragEl = el.classList.contains(className) ? el : el.querySelector(option.handle) || el;\n // create var event binding so we can easily remove and still look like TS methods (unlike anonymous functions)\n this._dragStart = this._dragStart.bind(this);\n this._drag = this._drag.bind(this);\n this._dragEnd = this._dragEnd.bind(this);\n this._dragFollow = this._dragFollow.bind(this);\n this.enable();\n }\n\n public on(event: 'drag' | 'dragstart' | 'dragstop', callback: (event: DragEvent) => void): void {\n super.on(event, callback);\n }\n\n public off(event: 'drag' | 'dragstart' | 'dragstop'): void {\n super.off(event);\n }\n\n public enable(): void {\n super.enable();\n this.dragEl.draggable = true;\n this.dragEl.addEventListener('dragstart', this._dragStart);\n this.el.classList.remove('ui-draggable-disabled');\n this.el.classList.add('ui-draggable');\n }\n\n public disable(forDestroy = false): void {\n super.disable();\n this.dragEl.removeAttribute('draggable');\n this.dragEl.removeEventListener('dragstart', this._dragStart);\n this.el.classList.remove('ui-draggable');\n if (!forDestroy) this.el.classList.add('ui-draggable-disabled');\n }\n\n public destroy(): void {\n if (this.dragging) {\n // Destroy while dragging should remove dragend listener and manually trigger\n // dragend, otherwise dragEnd can't perform dragstop because eventRegistry is\n // destroyed.\n this._dragEnd({} as DragEvent);\n }\n this.disable(true);\n delete this.el;\n delete this.helper;\n delete this.option;\n super.destroy();\n }\n\n public updateOption(opts: DDDraggableOpt): DDDraggable {\n Object.keys(opts).forEach(key => this.option[key] = opts[key]);\n return this;\n }\n\n /** @internal */\n private _dragStart(event: DragEvent): void {\n DDManager.dragElement = this;\n this.helper = this._createHelper(event);\n this._setupHelperContainmentStyle();\n this.dragOffset = this._getDragOffset(event, this.el, this.helperContainment);\n const ev = DDUtils.initEvent(event, { target: this.el, type: 'dragstart' });\n if (this.helper !== this.el) {\n this._setupDragFollowNodeNotifyStart(ev);\n } else {\n this.dragFollowTimer = window.setTimeout(() => {\n delete this.dragFollowTimer;\n this._setupDragFollowNodeNotifyStart(ev);\n }, 0);\n }\n this._cancelDragGhost(event);\n }\n\n /** @internal */\n private _setupDragFollowNodeNotifyStart(ev: Event): DDDraggable {\n this._setupHelperStyle();\n document.addEventListener('dragover', this._drag, DDDraggable.dragEventListenerOption);\n this.dragEl.addEventListener('dragend', this._dragEnd);\n if (this.option.start) {\n this.option.start(ev, this.ui());\n }\n this.dragging = true;\n this.helper.classList.add('ui-draggable-dragging');\n this.triggerEvent('dragstart', ev);\n return this;\n }\n\n /** @internal */\n private _drag(event: DragEvent): void {\n // Safari: prevent default to allow drop to happen instead of reverting back (with animation) and delaying dragend #1541\n // https://stackoverflow.com/questions/61760755/how-to-fire-dragend-event-immediately\n event.preventDefault();\n this._dragFollow(event);\n const ev = DDUtils.initEvent(event, { target: this.el, type: 'drag' });\n if (this.option.drag) {\n this.option.drag(ev, this.ui());\n }\n this.triggerEvent('drag', ev);\n }\n\n /** @internal */\n private _dragEnd(event: DragEvent): void {\n if (this.dragFollowTimer) {\n clearTimeout(this.dragFollowTimer);\n delete this.dragFollowTimer;\n return;\n } else {\n if (this.paintTimer) {\n cancelAnimationFrame(this.paintTimer);\n }\n document.removeEventListener('dragover', this._drag, DDDraggable.dragEventListenerOption);\n this.dragEl.removeEventListener('dragend', this._dragEnd);\n }\n this.dragging = false;\n this.helper.classList.remove('ui-draggable-dragging');\n this.helperContainment.style.position = this.parentOriginStylePosition || null;\n if (this.helper === this.el) {\n this._removeHelperStyle();\n } else {\n this.helper.remove();\n }\n const ev = DDUtils.initEvent(event, { target: this.el, type: 'dragstop' });\n if (this.option.stop) {\n this.option.stop(ev); // Note: ui() not used by gridstack so don't pass\n }\n this.triggerEvent('dragstop', ev);\n delete DDManager.dragElement;\n delete this.helper;\n }\n\n /** @internal create a clone copy (or user defined method) of the original drag item if set */\n private _createHelper(event: DragEvent): HTMLElement {\n let helper = this.el;\n if (typeof this.option.helper === 'function') {\n helper = this.option.helper.apply(this.el, event);\n } else if (this.option.helper === 'clone') {\n helper = DDUtils.clone(this.el);\n }\n if (!document.body.contains(helper)) {\n DDUtils.appendTo(helper, this.option.appendTo === 'parent' ? this.el.parentNode : this.option.appendTo);\n }\n if (helper === this.el) {\n this.dragElementOriginStyle = DDDraggable.originStyleProp.map(prop => this.el.style[prop]);\n }\n return helper;\n }\n\n /** @internal */\n private _setupHelperStyle(): DDDraggable {\n this.helper.style.pointerEvents = 'none';\n this.helper.style.width = this.dragOffset.width + 'px';\n this.helper.style.height = this.dragOffset.height + 'px';\n this.helper.style.willChange = 'left, top';\n this.helper.style.transition = 'none'; // show up instantly\n this.helper.style.position = this.option.basePosition || DDDraggable.basePosition;\n this.helper.style.zIndex = '1000';\n setTimeout(() => {\n if (this.helper) {\n this.helper.style.transition = null; // recover animation\n }\n }, 0);\n return this;\n }\n\n /** @internal */\n private _removeHelperStyle(): DDDraggable {\n // don't bother restoring styles if we're gonna remove anyway...\n let node = this.helper ? (this.helper as GridItemHTMLElement).gridstackNode : undefined;\n if (!node || !node._isAboutToRemove) {\n DDDraggable.originStyleProp.forEach(prop => {\n this.helper.style[prop] = this.dragElementOriginStyle[prop] || null;\n });\n }\n delete this.dragElementOriginStyle;\n return this;\n }\n\n /** @internal */\n private _dragFollow(event: DragEvent): void {\n if (this.paintTimer) {\n cancelAnimationFrame(this.paintTimer);\n }\n this.paintTimer = requestAnimationFrame(() => {\n delete this.paintTimer;\n const offset = this.dragOffset;\n let containmentRect = { left: 0, top: 0 };\n if (this.helper.style.position === 'absolute') {\n const { left, top } = this.helperContainment.getBoundingClientRect();\n containmentRect = { left, top };\n }\n this.helper.style.left = event.clientX + offset.offsetLeft - containmentRect.left + 'px';\n this.helper.style.top = event.clientY + offset.offsetTop - containmentRect.top + 'px';\n });\n }\n\n /** @internal */\n private _setupHelperContainmentStyle(): DDDraggable {\n this.helperContainment = this.helper.parentElement;\n if (this.option.basePosition !== 'fixed') {\n this.parentOriginStylePosition = this.helperContainment.style.position;\n if (window.getComputedStyle(this.helperContainment).position.match(/static/)) {\n this.helperContainment.style.position = 'relative';\n }\n }\n return this;\n }\n\n /** @internal prevent the default gost image to be created (which has wrongas we move the helper/element instead\n * (legacy jquery UI code updates the top/left of the item).\n * TODO: maybe use mouse event instead of HTML5 drag as we have to work around it anyway, or change code to not update\n * the actual grid-item but move the gost image around (and special case jq version) ?\n **/\n private _cancelDragGhost(e: DragEvent): DDDraggable {\n /* doesn't seem to do anything...\n let t = e.dataTransfer;\n t.effectAllowed = 'none';\n t.dropEffect = 'none';\n t.setData('text', '');\n */\n\n // NOTE: according to spec (and required by Safari see #1540) the image has to be visible in the browser (in dom and not hidden) so make it a 1px div\n let img = document.createElement('div');\n img.style.width = '1px';\n img.style.height = '1px';\n document.body.appendChild(img);\n e.dataTransfer.setDragImage(img, 0, 0);\n setTimeout(() => document.body.removeChild(img)); // nuke once drag had a chance to grab this 'image'\n\n e.stopPropagation();\n return this;\n }\n\n /** @internal */\n private _getDragOffset(event: DragEvent, el: HTMLElement, parent: HTMLElement): DragOffset {\n\n // in case ancestor has transform/perspective css properties that change the viewpoint\n let xformOffsetX = 0;\n let xformOffsetY = 0;\n if (parent) {\n const testEl = document.createElement('div');\n DDUtils.addElStyles(testEl, {\n opacity: '0',\n position: 'fixed',\n top: 0 + 'px',\n left: 0 + 'px',\n width: '1px',\n height: '1px',\n zIndex: '-999999',\n });\n parent.appendChild(testEl);\n const testElPosition = testEl.getBoundingClientRect();\n parent.removeChild(testEl);\n xformOffsetX = testElPosition.left;\n xformOffsetY = testElPosition.top;\n // TODO: scale ?\n }\n\n const targetOffset = el.getBoundingClientRect();\n return {\n left: targetOffset.left,\n top: targetOffset.top,\n offsetLeft: - event.clientX + targetOffset.left - xformOffsetX,\n offsetTop: - event.clientY + targetOffset.top - xformOffsetY,\n width: targetOffset.width,\n height: targetOffset.height\n };\n }\n\n /** @internal TODO: set to public as called by DDDroppable! */\n public ui = (): DDUIData => {\n const containmentEl = this.el.parentElement;\n const containmentRect = containmentEl.getBoundingClientRect();\n const offset = this.helper.getBoundingClientRect();\n return {\n position: { //Current CSS position of the helper as { top, left } object\n top: offset.top - containmentRect.top,\n left: offset.left - containmentRect.left\n }\n /* not used by GridStack for now...\n helper: [this.helper], //The object arr representing the helper that's being dragged.\n offset: { top: offset.top, left: offset.left } // Current offset position of the helper as { top, left } object.\n */\n };\n }\n}\n\n\n","// dd-droppable.ts 3.1.5 @preserve\n\n/**\n * https://gridstackjs.com/\n * (c) 2020 rhlin, Alain Dumesny\n * gridstack.js may be freely distributed under the MIT license.\n*/\nimport { DDDraggable } from './dd-draggable';\nimport { DDManager } from './dd-manager';\nimport { DDBaseImplement, HTMLElementExtendOpt } from './dd-base-impl';\nimport { DDUtils } from './dd-utils';\n\nexport interface DDDroppableOpt {\n accept?: string | ((el: HTMLElement) => boolean);\n drop?: (event: DragEvent, ui) => void;\n over?: (event: DragEvent, ui) => void;\n out?: (event: DragEvent, ui) => void;\n}\n\nexport class DDDroppable extends DDBaseImplement implements HTMLElementExtendOpt {\n\n public accept: (el: HTMLElement) => boolean;\n public el: HTMLElement;\n public option: DDDroppableOpt;\n\n /** @internal */\n private moving: boolean;\n\n constructor(el: HTMLElement, opts: DDDroppableOpt = {}) {\n super();\n this.el = el;\n this.option = opts;\n // create var event binding so we can easily remove and still look like TS methods (unlike anonymous functions)\n this._dragEnter = this._dragEnter.bind(this);\n this._dragOver = this._dragOver.bind(this);\n this._dragLeave = this._dragLeave.bind(this);\n this._drop = this._drop.bind(this);\n\n this.el.classList.add('ui-droppable');\n this.el.addEventListener('dragenter', this._dragEnter);\n this._setupAccept();\n }\n\n public on(event: 'drop' | 'dropover' | 'dropout', callback: (event: DragEvent) => void): void {\n super.on(event, callback);\n }\n\n public off(event: 'drop' | 'dropover' | 'dropout'): void {\n super.off(event);\n }\n\n public enable(): void {\n if (!this.disabled) return;\n super.enable();\n this.el.classList.remove('ui-droppable-disabled');\n this.el.addEventListener('dragenter', this._dragEnter);\n }\n\n public disable(forDestroy=false): void {\n if (this.disabled) return;\n super.disable();\n if (!forDestroy) this.el.classList.add('ui-droppable-disabled');\n this.el.removeEventListener('dragenter', this._dragEnter);\n }\n\n public destroy(): void {\n if (this.moving) {\n this._removeLeaveCallbacks();\n } \n this.disable(true);\n this.el.classList.remove('ui-droppable');\n this.el.classList.remove('ui-droppable-disabled');\n delete this.moving;\n super.destroy();\n }\n\n public updateOption(opts: DDDroppableOpt): DDDroppable {\n Object.keys(opts).forEach(key => this.option[key] = opts[key]);\n this._setupAccept();\n return this;\n }\n\n /** @internal called when the cursor enters our area - prepare for a possible drop and track leaving */\n private _dragEnter(event: DragEvent): void {\n if (!this._canDrop()) return;\n this.moving = true;\n\n event.preventDefault();\n const ev = DDUtils.initEvent(event, { target: this.el, type: 'dropover' });\n if (this.option.over) {\n this.option.over(ev, this._ui(DDManager.dragElement))\n }\n this.triggerEvent('dropover', ev);\n this.el.addEventListener('dragover', this._dragOver);\n this.el.addEventListener('drop', this._drop);\n this.el.addEventListener('dragleave', this._dragLeave);\n this.el.classList.add('ui-droppable-over');\n }\n\n /** @internal called when an moving to drop item is being dragged over - do nothing but eat the event */\n private _dragOver(event: DragEvent): void {\n event.preventDefault();\n event.stopPropagation();\n }\n\n /** @internal called when the item is leaving our area, stop tracking if we had moving item */\n private _dragLeave(event: DragEvent): void {\n if (this.el.contains(event.relatedTarget as HTMLElement)) return;\n this._removeLeaveCallbacks();\n if (this.moving) {\n event.preventDefault();\n const ev = DDUtils.initEvent(event, { target: this.el, type: 'dropout' });\n if (this.option.out) {\n this.option.out(ev, this._ui(DDManager.dragElement))\n }\n this.triggerEvent('dropout', ev);\n }\n }\n\n /** @internal item is being dropped on us - call the client drop event */\n private _drop(event: DragEvent): void {\n if (!this.moving) return; // should not have received event...\n event.preventDefault();\n const ev = DDUtils.initEvent(event, { target: this.el, type: 'drop' });\n if (this.option.drop) {\n this.option.drop(ev, this._ui(DDManager.dragElement))\n }\n this.triggerEvent('drop', ev);\n this._removeLeaveCallbacks();\n }\n\n /** @internal called to remove callbacks when leaving or dropping */\n private _removeLeaveCallbacks() {\n this.el.removeEventListener('dragleave', this._dragLeave);\n this.el.classList.remove('ui-droppable-over');\n if (this.moving) {\n this.el.removeEventListener('dragover', this._dragOver);\n this.el.removeEventListener('drop', this._drop);\n }\n }\n\n /** @internal */\n private _canDrop(): boolean {\n return DDManager.dragElement && (!this.accept || this.accept(DDManager.dragElement.el));\n }\n\n /** @internal */\n private _setupAccept(): DDDroppable {\n if (this.option.accept && typeof this.option.accept === 'string') {\n this.accept = (el: HTMLElement) => {\n return el.matches(this.option.accept as string)\n }\n } else {\n this.accept = this.option.accept as ((el: HTMLElement) => boolean);\n }\n return this;\n }\n\n /** @internal */\n private _ui(drag: DDDraggable) {\n return {\n draggable: drag.el,\n ...drag.ui()\n };\n }\n}\n\n","// dd-elements.ts 3.1.5 @preserve\n\n/**\n * https://gridstackjs.com/\n * (c) 2020 rhlin, Alain Dumesny\n * gridstack.js may be freely distributed under the MIT license.\n*/\nimport { DDResizable, DDResizableOpt } from './dd-resizable';\nimport { GridItemHTMLElement } from './../types';\nimport { DDDraggable, DDDraggableOpt } from './dd-draggable';\nimport { DDDroppable, DDDroppableOpt } from './dd-droppable';\n\nexport interface DDElementHost extends GridItemHTMLElement {\n ddElement?: DDElement;\n}\n\nexport class DDElement {\n\n static init(el: DDElementHost): DDElement {\n if (!el.ddElement) { el.ddElement = new DDElement(el); }\n return el.ddElement;\n }\n\n public el: DDElementHost;\n public ddDraggable?: DDDraggable;\n public ddDroppable?: DDDroppable;\n public ddResizable?: DDResizable;\n\n constructor(el: DDElementHost) {\n this.el = el;\n }\n\n public on(eventName: string, callback: (event: MouseEvent) => void): DDElement {\n if (this.ddDraggable && ['drag', 'dragstart', 'dragstop'].indexOf(eventName) > -1) {\n this.ddDraggable.on(eventName as 'drag' | 'dragstart' | 'dragstop', callback);\n } else if (this.ddDroppable && ['drop', 'dropover', 'dropout'].indexOf(eventName) > -1) {\n this.ddDroppable.on(eventName as 'drop' | 'dropover' | 'dropout', callback);\n } else if (this.ddResizable && ['resizestart', 'resize', 'resizestop'].indexOf(eventName) > -1) {\n this.ddResizable.on(eventName as 'resizestart' | 'resize' | 'resizestop', callback);\n }\n return this;\n }\n\n public off(eventName: string): DDElement {\n if (this.ddDraggable && ['drag', 'dragstart', 'dragstop'].indexOf(eventName) > -1) {\n this.ddDraggable.off(eventName as 'drag' | 'dragstart' | 'dragstop');\n } else if (this.ddDroppable && ['drop', 'dropover', 'dropout'].indexOf(eventName) > -1) {\n this.ddDroppable.off(eventName as 'drop' | 'dropover' | 'dropout');\n } else if (this.ddResizable && ['resizestart', 'resize', 'resizestop'].indexOf(eventName) > -1) {\n this.ddResizable.off(eventName as 'resizestart' | 'resize' | 'resizestop');\n }\n return this;\n }\n\n public setupDraggable(opts: DDDraggableOpt): DDElement {\n if (!this.ddDraggable) {\n this.ddDraggable = new DDDraggable(this.el, opts);\n } else {\n this.ddDraggable.updateOption(opts);\n }\n return this;\n }\n\n public cleanDraggable(): DDElement {\n if (this.ddDraggable) {\n this.ddDraggable.destroy();\n delete this.ddDraggable;\n }\n return this;\n }\n\n public setupResizable(opts: DDResizableOpt): DDElement {\n if (!this.ddResizable) {\n this.ddResizable = new DDResizable(this.el, opts);\n } else {\n this.ddResizable.updateOption(opts);\n }\n return this;\n }\n\n public cleanResizable(): DDElement {\n if (this.ddResizable) {\n this.ddResizable.destroy();\n delete this.ddResizable;\n }\n return this;\n }\n\n public setupDroppable(opts: DDDroppableOpt): DDElement {\n if (!this.ddDroppable) {\n this.ddDroppable = new DDDroppable(this.el, opts);\n } else {\n this.ddDroppable.updateOption(opts);\n }\n return this;\n }\n\n public cleanDroppable(): DDElement {\n if (this.ddDroppable) {\n this.ddDroppable.destroy();\n delete this.ddDroppable;\n }\n return this;\n }\n}\n","// dd-manager.ts 3.1.5 @preserve\n\n/**\n * https://gridstackjs.com/\n * (c) 2020 rhlin, Alain Dumesny\n * gridstack.js may be freely distributed under the MIT license.\n*/\nimport { DDDraggable } from './dd-draggable';\n\nexport class DDManager {\n static dragElement: DDDraggable;\n}\n","// dd-resizable-handle.ts 3.1.5 @preserve\n\n/**\n * https://gridstackjs.com/\n * (c) 2020 rhlin, Alain Dumesny\n * gridstack.js may be freely distributed under the MIT license.\n*/\nexport interface DDResizableHandleOpt {\n start?: (event) => void;\n move?: (event) => void;\n stop?: (event) => void;\n}\n\nexport class DDResizableHandle {\n /** @internal */\n private el: HTMLElement;\n /** @internal */\n private host: HTMLElement;\n /** @internal */\n private option: DDResizableHandleOpt;\n /** @internal */\n private dir: string;\n /** @internal true after we've moved enough pixels to start a resize */\n private moving = false;\n /** @internal */\n private mouseDownEvent: MouseEvent;\n /** @internal */\n private static prefix = 'ui-resizable-';\n\n constructor(host: HTMLElement, direction: string, option: DDResizableHandleOpt) {\n this.host = host;\n this.dir = direction;\n this.option = option;\n // create var event binding so we can easily remove and still look like TS methods (unlike anonymous functions)\n this._mouseDown = this._mouseDown.bind(this);\n this._mouseMove = this._mouseMove.bind(this);\n this._mouseUp = this._mouseUp.bind(this);\n\n this._init();\n }\n\n /** @internal */\n private _init(): DDResizableHandle {\n const el = document.createElement('div');\n el.classList.add('ui-resizable-handle');\n el.classList.add(`${DDResizableHandle.prefix}${this.dir}`);\n el.style.zIndex = '100';\n el.style.userSelect = 'none';\n this.el = el;\n this.host.appendChild(this.el);\n this.el.addEventListener('mousedown', this._mouseDown);\n return this;\n }\n\n /** call this when resize handle needs to be removed and cleaned up */\n public destroy(): DDResizableHandle {\n if (this.moving) this._mouseUp(this.mouseDownEvent);\n this.el.removeEventListener('mousedown', this._mouseDown);\n this.host.removeChild(this.el);\n delete this.el;\n delete this.host;\n return this;\n }\n\n /** @internal called on mouse down on us: capture move on the entire document (mouse might not stay on us) until we release the mouse */\n private _mouseDown(e: MouseEvent): void {\n this.mouseDownEvent = e;\n document.addEventListener('mousemove', this._mouseMove, true); // capture, not bubble\n document.addEventListener('mouseup', this._mouseUp);\n }\n\n /** @internal */\n private _mouseMove(e: MouseEvent): void {\n let s = this.mouseDownEvent;\n // don't start unless we've moved at least 3 pixels\n if (!this.moving && Math.abs(e.x - s.x) + Math.abs(e.y - s.y) > 2) {\n this.moving = true;\n this._triggerEvent('start', this.mouseDownEvent);\n } else if (this.moving) {\n this._triggerEvent('move', e);\n }\n }\n\n /** @internal */\n private _mouseUp(e: MouseEvent): void {\n if (this.moving) {\n this._triggerEvent('stop', e);\n }\n document.removeEventListener('mousemove', this._mouseMove, true);\n document.removeEventListener('mouseup', this._mouseUp);\n delete this.moving;\n delete this.mouseDownEvent;\n }\n\n /** @internal */\n private _triggerEvent(name: string, event: MouseEvent): DDResizableHandle {\n if (this.option[name]) this.option[name](event);\n return this;\n }\n}\n","// dd-resizable.ts 3.1.5 @preserve\n\n/**\n * https://gridstackjs.com/\n * (c) 2020 rhlin, Alain Dumesny\n * gridstack.js may be freely distributed under the MIT license.\n*/\nimport { DDResizableHandle } from './dd-resizable-handle';\nimport { DDBaseImplement, HTMLElementExtendOpt } from './dd-base-impl';\nimport { DDUtils } from './dd-utils';\nimport { Utils } from '../utils';\nimport { DDUIData, Rect, Size } from '../types';\n\n// TODO: merge with DDDragOpt\nexport interface DDResizableOpt {\n autoHide?: boolean;\n handles?: string;\n maxHeight?: number;\n maxWidth?: number;\n minHeight?: number;\n minWidth?: number;\n basePosition?: 'fixed' | 'absolute';\n start?: (event: Event, ui: DDUIData) => void;\n stop?: (event: Event) => void;\n resize?: (event: Event, ui: DDUIData) => void;\n}\n\nexport class DDResizable extends DDBaseImplement implements HTMLElementExtendOpt {\n\n // have to be public else complains for HTMLElementExtendOpt ?\n public el: HTMLElement;\n public option: DDResizableOpt;\n\n /** @internal */\n private handlers: DDResizableHandle[];\n /** @internal */\n private originalRect: Rect;\n /** @internal */\n private temporalRect: Rect;\n /** @internal */\n private scrollY: number;\n /** @internal */\n private scrolled: number;\n /** @internal */\n private scrollEl: HTMLElement;\n /** @internal */\n private startEvent: MouseEvent;\n /** @internal value saved in the same order as _originStyleProp[] */\n private elOriginStyleVal: string[];\n /** @internal */\n private parentOriginStylePosition: string;\n /** @internal */\n private static _originStyleProp = ['width', 'height', 'position', 'left', 'top', 'opacity', 'zIndex'];\n\n constructor(el: HTMLElement, opts: DDResizableOpt = {}) {\n super();\n this.el = el;\n this.option = opts;\n this.enable();\n this._setupAutoHide();\n this._setupHandlers();\n }\n\n public on(event: 'resizestart' | 'resize' | 'resizestop', callback: (event: DragEvent) => void): void {\n super.on(event, callback);\n }\n\n public off(event: 'resizestart' | 'resize' | 'resizestop'): void {\n super.off(event);\n }\n\n public enable(): void {\n super.enable();\n this.el.classList.add('ui-resizable');\n this.el.classList.remove('ui-resizable-disabled');\n }\n\n public disable(): void {\n super.disable();\n this.el.classList.add('ui-resizable-disabled');\n this.el.classList.remove('ui-resizable');\n }\n\n public destroy(): void {\n this._removeHandlers();\n if (this.option.autoHide) {\n this.el.removeEventListener('mouseover', this._showHandlers);\n this.el.removeEventListener('mouseout', this._hideHandlers);\n }\n this.el.classList.remove('ui-resizable');\n delete this.el;\n super.destroy();\n }\n\n public updateOption(opts: DDResizableOpt): DDResizable {\n let updateHandles = (opts.handles && opts.handles !== this.option.handles);\n let updateAutoHide = (opts.autoHide && opts.autoHide !== this.option.autoHide);\n Object.keys(opts).forEach(key => this.option[key] = opts[key]);\n if (updateHandles) {\n this._removeHandlers();\n this._setupHandlers();\n }\n if (updateAutoHide) {\n this._setupAutoHide();\n }\n return this;\n }\n\n /** @internal */\n private _setupAutoHide(): DDResizable {\n if (this.option.autoHide) {\n this.el.classList.add('ui-resizable-autohide');\n // use mouseover/mouseout instead of mouseenter/mouseleave to get better performance;\n this.el.addEventListener('mouseover', this._showHandlers);\n this.el.addEventListener('mouseout', this._hideHandlers);\n } else {\n this.el.classList.remove('ui-resizable-autohide');\n this.el.removeEventListener('mouseover', this._showHandlers);\n this.el.removeEventListener('mouseout', this._hideHandlers);\n }\n return this;\n }\n\n /** @internal */\n private _showHandlers = () => {\n this.el.classList.remove('ui-resizable-autohide');\n }\n\n /** @internal */\n private _hideHandlers = () => {\n this.el.classList.add('ui-resizable-autohide');\n }\n\n /** @internal */\n private _setupHandlers(): DDResizable {\n let handlerDirection = this.option.handles || 'e,s,se';\n if (handlerDirection === 'all') {\n handlerDirection = 'n,e,s,w,se,sw,ne,nw';\n }\n this.handlers = handlerDirection.split(',')\n .map(dir => dir.trim())\n .map(dir => new DDResizableHandle(this.el, dir, {\n start: (event: MouseEvent) => {\n this._resizeStart(event);\n },\n stop: (event: MouseEvent) => {\n this._resizeStop(event);\n },\n move: (event: MouseEvent) => {\n this._resizing(event, dir);\n }\n }));\n return this;\n }\n\n /** @internal */\n private _resizeStart(event: MouseEvent): DDResizable {\n this.originalRect = this.el.getBoundingClientRect();\n this.scrollEl = Utils.getScrollParent(this.el);\n this.scrollY = this.scrollEl.scrollTop;\n this.startEvent = event;\n this._setupHelper();\n this._applyChange();\n const ev = DDUtils.initEvent(event, { type: 'resizestart', target: this.el });\n if (this.option.start) {\n this.option.start(ev, this._ui());\n }\n this.el.classList.add('ui-resizable-resizing');\n this.triggerEvent('resizestart', ev);\n return this;\n }\n\n /** @internal */\n private _resizing(event: MouseEvent, dir: string): DDResizable {\n this.scrolled = this.scrollEl.scrollTop - this.scrollY;\n this.temporalRect = this._getChange(event, dir);\n this._applyChange();\n const ev = DDUtils.initEvent(event, { type: 'resize', target: this.el });\n if (this.option.resize) {\n this.option.resize(ev, this._ui());\n }\n this.triggerEvent('resize', ev);\n return this;\n }\n\n /** @internal */\n private _resizeStop(event: MouseEvent): DDResizable {\n const ev = DDUtils.initEvent(event, { type: 'resizestop', target: this.el });\n if (this.option.stop) {\n this.option.stop(ev); // Note: ui() not used by gridstack so don't pass\n }\n this.el.classList.remove('ui-resizable-resizing');\n this.triggerEvent('resizestop', ev);\n this._cleanHelper();\n delete this.startEvent;\n delete this.originalRect;\n delete this.temporalRect;\n delete this.scrollY;\n delete this.scrolled;\n return this;\n }\n\n /** @internal */\n private _setupHelper(): DDResizable {\n this.elOriginStyleVal = DDResizable._originStyleProp.map(prop => this.el.style[prop]);\n this.parentOriginStylePosition = this.el.parentElement.style.position;\n if (window.getComputedStyle(this.el.parentElement).position.match(/static/)) {\n this.el.parentElement.style.position = 'relative';\n }\n this.el.style.position = this.option.basePosition || 'absolute'; // or 'fixed'\n this.el.style.opacity = '0.8';\n this.el.style.zIndex = '1000';\n return this;\n }\n\n /** @internal */\n private _cleanHelper(): DDResizable {\n DDResizable._originStyleProp.forEach((prop, i) => {\n this.el.style[prop] = this.elOriginStyleVal[i] || null;\n });\n this.el.parentElement.style.position = this.parentOriginStylePosition || null;\n return this;\n }\n\n /** @internal */\n private _getChange(event: MouseEvent, dir: string): Rect {\n const oEvent = this.startEvent;\n const newRect = { // Note: originalRect is a complex object, not a simple Rect, so copy out.\n width: this.originalRect.width,\n height: this.originalRect.height + this.scrolled,\n left: this.originalRect.left,\n top: this.originalRect.top - this.scrolled\n };\n \n const offsetH = event.clientX - oEvent.clientX;\n const offsetV = event.clientY - oEvent.clientY;\n\n if (dir.indexOf('e') > -1) {\n newRect.width += event.clientX - oEvent.clientX;\n }\n if (dir.indexOf('s') > -1) {\n newRect.height += event.clientY - oEvent.clientY;\n }\n if (dir.indexOf('w') > -1) {\n newRect.width -= offsetH;\n newRect.left += offsetH;\n }\n if (dir.indexOf('n') > -1) {\n newRect.height -= offsetV;\n newRect.top += offsetV\n }\n const reshape = this._getReShapeSize(newRect.width, newRect.height);\n if (newRect.width !== reshape.width) {\n if (dir.indexOf('w') > -1) {\n newRect.left += newRect.width - reshape.width;\n }\n newRect.width = reshape.width;\n }\n if (newRect.height !== reshape.height) {\n if (dir.indexOf('n') > -1) {\n newRect.top += newRect.height - reshape.height;\n }\n newRect.height = reshape.height;\n }\n return newRect;\n }\n\n /** @internal */\n private _getReShapeSize(oWidth: number, oHeight: number): Size {\n const maxWidth = this.option.maxWidth || oWidth;\n const minWidth = this.option.minWidth || oWidth;\n const maxHeight = this.option.maxHeight || oHeight;\n const minHeight = this.option.minHeight || oHeight;\n const width = Math.min(maxWidth, Math.max(minWidth, oWidth));\n const height = Math.min(maxHeight, Math.max(minHeight, oHeight));\n return { width, height };\n }\n\n /** @internal */\n private _applyChange(): DDResizable {\n let containmentRect = { left: 0, top: 0, width: 0, height: 0 };\n if (this.el.style.position === 'absolute') {\n const containmentEl = this.el.parentElement;\n const { left, top } = containmentEl.getBoundingClientRect();\n containmentRect = { left, top, width: 0, height: 0 };\n }\n if (!this.temporalRect) return this;\n Object.keys(this.temporalRect).forEach(key => {\n const value = this.temporalRect[key];\n this.el.style[key] = value - containmentRect[key] + 'px';\n });\n return this;\n }\n\n /** @internal */\n private _removeHandlers(): DDResizable {\n this.handlers.forEach(handle => handle.destroy());\n delete this.handlers;\n return this;\n }\n\n /** @internal */\n private _ui = (): DDUIData => {\n const containmentEl = this.el.parentElement;\n const containmentRect = containmentEl.getBoundingClientRect();\n const newRect = { // Note: originalRect is a complex object, not a simple Rect, so copy out.\n width: this.originalRect.width,\n height: this.originalRect.height + this.scrolled,\n left: this.originalRect.left,\n top: this.originalRect.top - this.scrolled\n };\n const rect = this.temporalRect || newRect;\n return {\n position: {\n left: rect.left - containmentRect.left,\n top: rect.top - containmentRect.top\n },\n size: {\n width: rect.width,\n height: rect.height\n }\n /* Gridstack ONLY needs position set above... keep around in case.\n element: [this.el], // The object representing the element to be resized\n helper: [], // TODO: not support yet - The object representing the helper that's being resized\n originalElement: [this.el],// we don't wrap here, so simplify as this.el //The object representing the original element before it is wrapped\n originalPosition: { // The position represented as { left, top } before the resizable is resized\n left: this.originalRect.left - containmentRect.left,\n top: this.originalRect.top - containmentRect.top\n },\n originalSize: { // The size represented as { width, height } before the resizable is resized\n width: this.originalRect.width,\n height: this.originalRect.height\n }\n */\n };\n }\n}\n","// dd-utils.ts 3.1.5 @preserve\n\n/**\n * https://gridstackjs.com/\n * (c) 2020 rhlin, Alain Dumesny\n * gridstack.js may be freely distributed under the MIT license.\n*/\n\nexport class DDUtils {\n\n public static isEventSupportPassiveOption = ((() => {\n let supportsPassive = false;\n let passiveTest = () => {\n // do nothing\n };\n document.addEventListener('test', passiveTest, {\n get passive() {\n supportsPassive = true;\n return true;\n }\n });\n document.removeEventListener('test', passiveTest);\n return supportsPassive;\n })());\n\n public static clone(el: HTMLElement): HTMLElement {\n const node = el.cloneNode(true) as HTMLElement;\n node.removeAttribute('id');\n return node;\n }\n\n public static appendTo(el: HTMLElement, parent: string | HTMLElement | Node): void {\n let parentNode: HTMLElement;\n if (typeof parent === 'string') {\n parentNode = document.querySelector(parent as string);\n } else {\n parentNode = parent as HTMLElement;\n }\n if (parentNode) {\n parentNode.append(el);\n }\n }\n\n public static setPositionRelative(el: HTMLElement): void {\n if (!(/^(?:r|a|f)/).test(window.getComputedStyle(el).position)) {\n el.style.position = \"relative\";\n }\n }\n\n public static addElStyles(el: HTMLElement, styles: { [prop: string]: string | string[] }): void {\n if (styles instanceof Object) {\n for (const s in styles) {\n if (styles.hasOwnProperty(s)) {\n if (Array.isArray(styles[s])) {\n // support fallback value\n (styles[s] as string[]).forEach(val => {\n el.style[s] = val;\n });\n } else {\n el.style[s] = styles[s];\n }\n }\n }\n }\n }\n\n public static initEvent(e: DragEvent | MouseEvent, info: { type: string; target?: EventTarget }): T {\n const evt = { type: info.type };\n const obj = {\n button: 0,\n which: 0,\n buttons: 1,\n bubbles: true,\n cancelable: true,\n target: info.target ? info.target : e.target\n };\n // don't check for `instanceof DragEvent` as Safari use MouseEvent #1540\n if ((e as DragEvent).dataTransfer) {\n evt['dataTransfer'] = (e as DragEvent).dataTransfer; // workaround 'readonly' field.\n }\n ['altKey','ctrlKey','metaKey','shiftKey'].forEach(p => evt[p] = e[p]); // keys\n ['pageX','pageY','clientX','clientY','screenX','screenY'].forEach(p => evt[p] = e[p]); // point info\n return {...evt, ...obj} as unknown as T;\n }\n}","// gridstack-dd-native.ts 3.1.5 @preserve\n\n/**\n * https://gridstackjs.com/\n * (c) 2020 rhlin, Alain Dumesny\n * gridstack.js may be freely distributed under the MIT license.\n*/\nimport { DDManager } from './dd-manager';\nimport { DDElement, DDElementHost } from './dd-element';\n\nimport { GridStackElement } from '../gridstack';\nimport { GridStackDD, DDOpts, DDKey, DDDropOpt, DDCallback, DDValue } from '../gridstack-dd';\nimport { GridItemHTMLElement, DDDragInOpt } from '../types';\nimport { Utils } from '../utils';\n\n// export our base class (what user should use) and all associated types\nexport * from '../gridstack-dd';\n\n/**\n * HTML 5 Native DragDrop based drag'n'drop plugin.\n */\nexport class GridStackDDNative extends GridStackDD {\n\n public resizable(el: GridItemHTMLElement, opts: DDOpts, key?: DDKey, value?: DDValue): GridStackDDNative {\n this._getDDElements(el).forEach(dEl => {\n if (opts === 'disable' || opts === 'enable') {\n dEl.ddResizable && dEl.ddResizable[opts](); // can't create DD as it requires options for setupResizable()\n } else if (opts === 'destroy') {\n dEl.ddResizable && dEl.cleanResizable();\n } else if (opts === 'option') {\n dEl.setupResizable({ [key]: value });\n } else {\n const grid = dEl.el.gridstackNode.grid;\n let handles = dEl.el.getAttribute('gs-resize-handles') ? dEl.el.getAttribute('gs-resize-handles') : grid.opts.resizable.handles;\n dEl.setupResizable({\n ...grid.opts.resizable,\n ...{ handles: handles },\n ...{\n start: opts.start,\n stop: opts.stop,\n resize: opts.resize\n }\n });\n }\n });\n return this;\n }\n\n public draggable(el: GridItemHTMLElement, opts: DDOpts, key?: DDKey, value?: DDValue): GridStackDDNative {\n this._getDDElements(el).forEach(dEl => {\n if (opts === 'disable' || opts === 'enable') {\n dEl.ddDraggable && dEl.ddDraggable[opts](); // can't create DD as it requires options for setupDraggable()\n } else if (opts === 'destroy') {\n dEl.ddDraggable && dEl.cleanDraggable();\n } else if (opts === 'option') {\n dEl.setupDraggable({ [key]: value });\n } else {\n const grid = dEl.el.gridstackNode.grid;\n dEl.setupDraggable({\n ...grid.opts.draggable,\n ...{\n containment: (grid.opts._isNested && !grid.opts.dragOut)\n ? grid.el.parentElement\n : (grid.opts.draggable.containment || null),\n start: opts.start,\n stop: opts.stop,\n drag: opts.drag\n }\n });\n }\n });\n return this;\n }\n\n public dragIn(el: GridStackElement, opts: DDDragInOpt): GridStackDDNative {\n this._getDDElements(el).forEach(dEl => dEl.setupDraggable(opts));\n return this;\n }\n\n public droppable(el: GridItemHTMLElement, opts: DDOpts | DDDropOpt, key?: DDKey, value?: DDValue): GridStackDDNative {\n if (typeof opts.accept === 'function' && !opts._accept) {\n opts._accept = opts.accept;\n opts.accept = (el) => opts._accept(el);\n }\n this._getDDElements(el).forEach(dEl => {\n if (opts === 'disable' || opts === 'enable') {\n dEl.ddDroppable && dEl.ddDroppable[opts]();\n } else if (opts === 'destroy') {\n if (dEl.ddDroppable) { // error to call destroy if not there\n dEl.cleanDroppable();\n }\n } else if (opts === 'option') {\n dEl.setupDroppable({ [key]: value });\n } else {\n dEl.setupDroppable(opts);\n }\n });\n return this;\n }\n\n /** true if element is droppable */\n public isDroppable(el: DDElementHost): boolean {\n return el && el.ddElement && el.ddElement.ddDroppable && !el.ddElement.ddDroppable.disabled;\n }\n\n /** true if element is draggable */\n public isDraggable(el: DDElementHost): boolean {\n return el && el.ddElement && el.ddElement.ddDraggable && !el.ddElement.ddDraggable.disabled;\n }\n\n /** true if element is draggable */\n public isResizable(el: DDElementHost): boolean {\n return el && el.ddElement && el.ddElement.ddResizable && !el.ddElement.ddResizable.disabled;\n }\n\n public on(el: GridItemHTMLElement, name: string, callback: DDCallback): GridStackDDNative {\n this._getDDElements(el).forEach(dEl =>\n dEl.on(name, (event: Event) => {\n callback(\n event,\n DDManager.dragElement ? DDManager.dragElement.el : event.target as GridItemHTMLElement,\n DDManager.dragElement ? DDManager.dragElement.helper : null)\n })\n );\n return this;\n }\n\n public off(el: GridItemHTMLElement, name: string): GridStackDD {\n this._getDDElements(el).forEach(dEl => dEl.off(name));\n return this;\n }\n\n /** @internal returns a list of DD elements, creating them on the fly by default */\n private _getDDElements(els: GridStackElement, create = true): DDElement[] {\n let hosts = Utils.getElements(els) as DDElementHost[];\n if (!hosts.length) return [];\n let list = hosts.map(e => e.ddElement || (create ? DDElement.init(e) : null));\n if (!create) { list.filter(d => d); } // remove nulls\n return list;\n }\n}\n\n// finally register ourself\nGridStackDD.registerPlugin(GridStackDDNative);\n","// index.html5.ts 3.1.5 - everything you need for a Grid that uses HTML5 native drag&drop (work in progress) @preserve\r\n\r\n// import './gridstack-poly.js';\r\n\r\nexport * from './types';\r\nexport * from './utils';\r\nexport * from './gridstack-engine';\r\nexport * from './gridstack-ddi';\r\nexport * from './gridstack';\r\n\r\nexport * from './h5/gridstack-dd-native';\r\n\r\n// declare module 'gridstack'; for umd ?\r\n","// utils.ts 3.1.5 @preserve\r\n\r\n/**\r\n * https://gridstackjs.com/\r\n * (c) 2014-2020 Alain Dumesny, Dylan Weiss, Pavel Reznikov\r\n * gridstack.js may be freely distributed under the MIT license.\r\n*/\r\n\r\nimport { GridStackElement, GridStackWidget, GridStackNode, GridStackOptions, numberOrString } from './types';\r\n\r\nexport interface HeightData {\r\n h: number;\r\n unit: string;\r\n}\r\n\r\n/** checks for obsolete method names */\r\n// eslint-disable-next-line\r\nexport function obsolete(self, f, oldName: string, newName: string, rev: string): (...args: any[]) => any {\r\n let wrapper = (...args) => {\r\n console.warn('gridstack.js: Function `' + oldName + '` is deprecated in ' + rev + ' and has been replaced ' +\r\n 'with `' + newName + '`. It will be **completely** removed in v1.0');\r\n return f.apply(self, args);\r\n }\r\n wrapper.prototype = f.prototype;\r\n return wrapper;\r\n}\r\n\r\n/** checks for obsolete grid options (can be used for any fields, but msg is about options) */\r\nexport function obsoleteOpts(opts: GridStackOptions, oldName: string, newName: string, rev: string): void {\r\n if (opts[oldName] !== undefined) {\r\n opts[newName] = opts[oldName];\r\n console.warn('gridstack.js: Option `' + oldName + '` is deprecated in ' + rev + ' and has been replaced with `' +\r\n newName + '`. It will be **completely** removed in v1.0');\r\n }\r\n}\r\n\r\n/** checks for obsolete grid options which are gone */\r\nexport function obsoleteOptsDel(opts: GridStackOptions, oldName: string, rev: string, info: string): void {\r\n if (opts[oldName] !== undefined) {\r\n console.warn('gridstack.js: Option `' + oldName + '` is deprecated in ' + rev + info);\r\n }\r\n}\r\n\r\n/** checks for obsolete Jquery element attributes */\r\nexport function obsoleteAttr(el: HTMLElement, oldName: string, newName: string, rev: string): void {\r\n let oldAttr = el.getAttribute(oldName);\r\n if (oldAttr !== null) {\r\n el.setAttribute(newName, oldAttr);\r\n console.warn('gridstack.js: attribute `' + oldName + '`=' + oldAttr + ' is deprecated on this object in ' + rev + ' and has been replaced with `' +\r\n newName + '`. It will be **completely** removed in v1.0');\r\n }\r\n}\r\n\r\n/**\r\n * Utility methods\r\n */\r\nexport class Utils {\r\n\r\n /** convert a potential selector into actual list of html elements */\r\n static getElements(els: GridStackElement): HTMLElement[] {\r\n if (typeof els === 'string') {\r\n let list = document.querySelectorAll(els);\r\n if (!list.length && els[0] !== '.' && els[0] !== '#') {\r\n list = document.querySelectorAll('.' + els);\r\n if (!list.length) { list = document.querySelectorAll('#' + els) }\r\n }\r\n return Array.from(list) as HTMLElement[];\r\n }\r\n return [els];\r\n }\r\n\r\n /** convert a potential selector into actual single element */\r\n static getElement(els: GridStackElement): HTMLElement {\r\n if (typeof els === 'string') {\r\n if (!els.length) return null;\r\n if (els[0] === '#') {\r\n return document.getElementById(els.substring(1));\r\n }\r\n if (els[0] === '.' || els[0] === '[') {\r\n return document.querySelector(els);\r\n }\r\n\r\n // if we start with a digit, assume it's an id (error calling querySelector('#1')) as class are not valid CSS\r\n if(!isNaN(+els[0])) { // start with digit\r\n return document.getElementById(els);\r\n }\r\n\r\n // finally try string, then id then class\r\n let el = document.querySelector(els);\r\n if (!el) { el = document.getElementById(els) }\r\n if (!el) { el = document.querySelector('.' + els) }\r\n return el as HTMLElement;\r\n }\r\n return els;\r\n }\r\n\r\n /** returns true if a and b overlap */\r\n static isIntercepted(a: GridStackWidget, b: GridStackWidget): boolean {\r\n return !(a.x + a.w <= b.x || b.x + b.w <= a.x || a.y + a.h <= b.y || b.y + b.h <= a.y);\r\n }\r\n\r\n /**\r\n * Sorts array of nodes\r\n * @param nodes array to sort\r\n * @param dir 1 for asc, -1 for desc (optional)\r\n * @param width width of the grid. If undefined the width will be calculated automatically (optional).\r\n **/\r\n static sort(nodes: GridStackNode[], dir?: -1 | 1, column?: number): GridStackNode[] {\r\n if (!column) {\r\n let widths = nodes.map(n => n.x + n.w);\r\n column = Math.max(...widths);\r\n }\r\n\r\n if (dir === -1)\r\n return nodes.sort((a, b) => (b.x + b.y * column)-(a.x + a.y * column));\r\n else\r\n return nodes.sort((b, a) => (b.x + b.y * column)-(a.x + a.y * column));\r\n }\r\n\r\n /**\r\n * creates a style sheet with style id under given parent\r\n * @param id will set the 'gs-style-id' attribute to that id\r\n * @param parent to insert the stylesheet as first child,\r\n * if none supplied it will be appended to the document head instead.\r\n */\r\n static createStylesheet(id: string, parent?: HTMLElement): CSSStyleSheet {\r\n let style: HTMLStyleElement = document.createElement('style');\r\n style.setAttribute('type', 'text/css');\r\n style.setAttribute('gs-style-id', id);\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n if ((style as any).styleSheet) { // TODO: only CSSImportRule have that and different beast ??\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n (style as any).styleSheet.cssText = '';\r\n } else {\r\n style.appendChild(document.createTextNode('')); // WebKit hack\r\n }\r\n if (!parent) {\r\n // default to head\r\n parent = document.getElementsByTagName('head')[0];\r\n parent.appendChild(style);\r\n } else {\r\n parent.insertBefore(style, parent.firstChild);\r\n }\r\n return style.sheet as CSSStyleSheet;\r\n }\r\n\r\n /** removed the given stylesheet id */\r\n static removeStylesheet(id: string): void {\r\n let el = document.querySelector('STYLE[gs-style-id=' + id + ']');\r\n if (el && el.parentNode) el.remove();\r\n }\r\n\r\n /** inserts a CSS rule */\r\n static addCSSRule(sheet: CSSStyleSheet, selector: string, rules: string): void {\r\n if (typeof sheet.addRule === 'function') {\r\n sheet.addRule(selector, rules);\r\n } else if (typeof sheet.insertRule === 'function') {\r\n sheet.insertRule(`${selector}{${rules}}`);\r\n }\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n static toBool(v: unknown): boolean {\r\n if (typeof v === 'boolean') {\r\n return v;\r\n }\r\n if (typeof v === 'string') {\r\n v = v.toLowerCase();\r\n return !(v === '' || v === 'no' || v === 'false' || v === '0');\r\n }\r\n return Boolean(v);\r\n }\r\n\r\n static toNumber(value: null | string): number {\r\n return (value === null || value.length === 0) ? undefined : Number(value);\r\n }\r\n\r\n static parseHeight(val: numberOrString): HeightData {\r\n let h: number;\r\n let unit = 'px';\r\n if (typeof val === 'string') {\r\n let match = val.match(/^(-[0-9]+\\.[0-9]+|[0-9]*\\.[0-9]+|-[0-9]+|[0-9]+)(px|em|rem|vh|vw|%)?$/);\r\n if (!match) {\r\n throw new Error('Invalid height');\r\n }\r\n unit = match[2] || 'px';\r\n h = parseFloat(match[1]);\r\n } else {\r\n h = val;\r\n }\r\n return { h, unit };\r\n }\r\n\r\n /** copies unset fields in target to use the given default sources values */\r\n // eslint-disable-next-line\r\n static defaults(target, ...sources): {} {\r\n\r\n sources.forEach(source => {\r\n for (const key in source) {\r\n if (!source.hasOwnProperty(key)) return;\r\n if (target[key] === null || target[key] === undefined) {\r\n target[key] = source[key];\r\n } else if (typeof source[key] === 'object' && typeof target[key] === 'object') {\r\n // property is an object, recursively add it's field over... #1373\r\n this.defaults(target[key], source[key]);\r\n }\r\n }\r\n });\r\n\r\n return target;\r\n }\r\n\r\n /** given 2 objects return true if they have the same values. Checks for Object {} having same fields and values (just 1 level down) */\r\n static same(a: unknown, b: unknown): boolean {\r\n if (typeof a !== 'object') return a == b;\r\n if (typeof a !== typeof b) return false;\r\n // else we have object, check just 1 level deep for being same things...\r\n if (Object.keys(a).length !== Object.keys(b).length) return false;\r\n for (const key in a) {\r\n if (a[key] !== b[key]) return false;\r\n }\r\n return true;\r\n }\r\n\r\n /** removes field from the first object if same as the second objects (like diffing) and internal '_' for saving */\r\n static removeInternalAndSame(a: unknown, b: unknown):void {\r\n if (typeof a !== 'object' || typeof b !== 'object') return;\r\n for (let key in a) {\r\n let val = a[key];\r\n if (val && typeof val === 'object') {\r\n for (let i in val) {\r\n if (val[i] === b[key][i] || i[0] === '_') { delete val[i] }\r\n }\r\n if (!Object.keys(val).length) { delete a[key] }\r\n } else if (val === b[key] || key[0] === '_') { delete a[key] }\r\n }\r\n }\r\n\r\n /** return the closest parent matching the given class */\r\n static closestByClass(el: HTMLElement, name: string): HTMLElement {\r\n\r\n while(el = el.parentElement) {\r\n if (el.classList.contains(name)) return el;\r\n }\r\n return null;\r\n }\r\n\r\n /** delay calling the given function by certain amount of time */\r\n static throttle(callback: () => void, delay: number): () => void {\r\n let isWaiting = false;\r\n\r\n return (...args) => {\r\n if (!isWaiting) {\r\n callback.apply(this, args);\r\n isWaiting = true;\r\n setTimeout(() => isWaiting = false, delay);\r\n }\r\n }\r\n }\r\n\r\n static removePositioningStyles(el: HTMLElement): void {\r\n let style = el.style;\r\n if (style.position) {\r\n style.removeProperty('position');\r\n }\r\n if (style.left) {\r\n style.removeProperty('left');\r\n }\r\n if (style.top) {\r\n style.removeProperty('top');\r\n }\r\n if (style.width) {\r\n style.removeProperty('width');\r\n }\r\n if (style.height) {\r\n style.removeProperty('height');\r\n }\r\n }\r\n\r\n /** @internal */\r\n static getScrollParent(el: HTMLElement): HTMLElement {\r\n if (el === null) return document.documentElement;\r\n const style = getComputedStyle(el);\r\n const overflowRegex = /(auto|scroll)/;\r\n\r\n if (overflowRegex.test(style.overflow + style.overflowY)) {\r\n return el;\r\n } else {\r\n return this.getScrollParent(el.parentElement);\r\n }\r\n }\r\n\r\n /** @internal */\r\n static updateScrollPosition(el: HTMLElement, position: {top: number}, distance: number): void {\r\n // is widget in view?\r\n let rect = el.getBoundingClientRect();\r\n let innerHeightOrClientHeight = (window.innerHeight || document.documentElement.clientHeight);\r\n if (rect.top < 0 ||\r\n rect.bottom > innerHeightOrClientHeight\r\n ) {\r\n // set scrollTop of first parent that scrolls\r\n // if parent is larger than el, set as low as possible\r\n // to get entire widget on screen\r\n let offsetDiffDown = rect.bottom - innerHeightOrClientHeight;\r\n let offsetDiffUp = rect.top;\r\n let scrollEl = this.getScrollParent(el);\r\n if (scrollEl !== null) {\r\n let prevScroll = scrollEl.scrollTop;\r\n if (rect.top < 0 && distance < 0) {\r\n // moving up\r\n if (el.offsetHeight > innerHeightOrClientHeight) {\r\n scrollEl.scrollTop += distance;\r\n } else {\r\n scrollEl.scrollTop += Math.abs(offsetDiffUp) > Math.abs(distance) ? distance : offsetDiffUp;\r\n }\r\n } else if (distance > 0) {\r\n // moving down\r\n if (el.offsetHeight > innerHeightOrClientHeight) {\r\n scrollEl.scrollTop += distance;\r\n } else {\r\n scrollEl.scrollTop += offsetDiffDown > distance ? distance : offsetDiffDown;\r\n }\r\n }\r\n // move widget y by amount scrolled\r\n position.top += scrollEl.scrollTop - prevScroll;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * @internal Function used to scroll the page.\r\n *\r\n * @param event `MouseEvent` that triggers the resize\r\n * @param el `HTMLElement` that's being resized\r\n * @param distance Distance from the V edges to start scrolling\r\n */\r\n static updateScrollResize(event: MouseEvent, el: HTMLElement, distance: number): void {\r\n const scrollEl = this.getScrollParent(el);\r\n const height = scrollEl.clientHeight;\r\n\r\n const top = event.clientY < distance;\r\n const bottom = event.clientY > height - distance;\r\n\r\n if (top) {\r\n // This also can be done with a timeout to keep scrolling while the mouse is\r\n // in the scrolling zone. (will have smoother behavior)\r\n scrollEl.scrollBy({ behavior: 'smooth', top: event.clientY - distance});\r\n } else if (bottom) {\r\n scrollEl.scrollBy({ behavior: 'smooth', top: distance - (height - event.clientY)});\r\n }\r\n }\r\n}\r\n\r\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tif(__webpack_module_cache__[moduleId]) {\n\t\treturn __webpack_module_cache__[moduleId].exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// module exports must be returned from runtime so entry inlining is disabled\n// startup\n// Load entry module and return exports\nreturn __webpack_require__(117);\n"],"sourceRoot":""} \ No newline at end of file diff --git a/node_modules/gridstack/dist/gridstack.css b/node_modules/gridstack/dist/gridstack.css index dc95cd287..292d25cf4 100644 --- a/node_modules/gridstack/dist/gridstack.css +++ b/node_modules/gridstack/dist/gridstack.css @@ -1,5 +1,5 @@ /*! - * gridstack 3.1.4 required CSS for default 12 and 1 column Mode size. Use gridstack-extra.css for column [2-11], else see https://github.com/gridstack/gridstack.js#custom-columns-css + * gridstack 3.1.5 required CSS for default 12 and 1 column Mode size. Use gridstack-extra.css for column [2-11], else see https://github.com/gridstack/gridstack.js#custom-columns-css * https://gridstackjs.com/ * (c) 2014-2020 Alain Dumesny, Dylan Weiss, Pavel Reznikov * gridstack.js may be freely distributed under the MIT license. diff --git a/node_modules/gridstack/dist/gridstack.min.css b/node_modules/gridstack/dist/gridstack.min.css index 283d0f329..1f0daa47c 100644 --- a/node_modules/gridstack/dist/gridstack.min.css +++ b/node_modules/gridstack/dist/gridstack.min.css @@ -1,5 +1,5 @@ /*! - * gridstack 3.1.4 required CSS for default 12 and 1 column Mode size. Use gridstack-extra.css for column [2-11], else see https://github.com/gridstack/gridstack.js#custom-columns-css + * gridstack 3.1.5 required CSS for default 12 and 1 column Mode size. Use gridstack-extra.css for column [2-11], else see https://github.com/gridstack/gridstack.js#custom-columns-css * https://gridstackjs.com/ * (c) 2014-2020 Alain Dumesny, Dylan Weiss, Pavel Reznikov * gridstack.js may be freely distributed under the MIT license. diff --git a/package.json b/package.json index d81e32ca6..d4512afef 100644 --- a/package.json +++ b/package.json @@ -15,7 +15,7 @@ }, "homepage": "http://gridstack.github.io/gridstack.js/", "dependencies": { - "gridstack": "3.1.4" + "gridstack": "3.1.5" }, "devDependencies": {} } diff --git a/yarn.lock b/yarn.lock index 2cec1e4b5..10e3505fa 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,7 +2,7 @@ # yarn lockfile v1 -gridstack@3.1.4: - version "3.1.4" - resolved "https://registry.yarnpkg.com/gridstack/-/gridstack-3.1.4.tgz#0aa2cc3ee256543dc53386d78dc794e22ac3eafe" - integrity sha512-nIo62xKcfgQs2NBTH6bUsMd+/muE6UzlXAYlFlMbjwLhZ1TNcg5oWLIC/ubpqJpJlGWD2Ou3827M49VNCfcJ8w== +gridstack@3.1.5: + version "3.1.5" + resolved "https://registry.yarnpkg.com/gridstack/-/gridstack-3.1.5.tgz#f4964fec300bc009b2ed2ca464080d26b8f0bf7e" + integrity sha512-VPsBqAqOe7qYti3xwSTvXbN9bv8nEp+cPYTCPolUUbjKPxNOL4EWQy5ZuKZ5JskciVQGLP5FXO6D+7j8rj5s/g==