This repository has been archived by the owner on Aug 13, 2022. It is now read-only.
/
gridstack-static.js.map
1 lines (1 loc) · 167 KB
/
gridstack-static.js.map
1
{"version":3,"sources":["webpack://GridStack/webpack/universalModuleDefinition","webpack://GridStack/./src/gridstack-ddi.ts","webpack://GridStack/./src/gridstack-engine.ts","webpack://GridStack/./src/gridstack-static.ts","webpack://GridStack/./src/gridstack.ts","webpack://GridStack/./src/utils.ts","webpack://GridStack/webpack/bootstrap","webpack://GridStack/webpack/startup"],"names":["root","factory","exports","module","define","amd","self","GridStackDDI","pluginClass","ddi","registerPlugin","el","this","GridStackEngine","opts","addedNodes","removedNodes","column","onChange","_float","float","maxRow","nodes","batchMode","_prevFloat","saveInitial","_packNodes","_notify","node","nn","_hasLocked","_moving","_skipDown","y","collide","opt","_sortNodes","nested","swap","area","_useEntireRowArea","x","w","h","skip","didMove","newOpt","pack","moved","locked","moveNode","Utils","copyPos","undefined","skip2","find","n","isIntercepted","filter","o","collides","rect","_rect","r0","r","forEach","r2","yOver","Number","MAX_VALUE","xOver","overMax","over","Math","min","top","right","bottom","left","a","b","_doSwap","_dirty","touching","isTouching","t","length","batchUpdate","copyNodes","autoPosition","addNode","commit","val","dir","sort","_updating","_orig","newY","i","resizing","_id","_idSeq","defaults","noResize","noMove","isNaN","nodeBoundFix","maxW","maxH","minW","max","minH","cacheOneLayout","verify","samePos","removeDOM","dirtyNodes","Array","isArray","concat","getDirtyNodes","_lastTried","some","triggerAddEvent","dup","prepareNode","_temporaryRemoved","_removeDOM","floor","box","push","_fixCollisions","triggerEvent","_layouts","changedPosConstrain","clonedNode","clone","map","canMove","getRow","c","_willFitPos","cleanupNode","content","grid","p","prevPos","collideAll","needToMove","collideCoverage","reduce","row","saveElement","list","key","_ignoreLayoutsNodeChange","layout","l","ratio","round","oldColumn","cacheLayout","cacheNodes","lastIndex","cacheNode","j","findIndex","newNodes","splice","move","scale","clear","copy","index","prop","GridDefaults","minRow","itemClass","placeholderClass","placeholderText","handle","handleClass","styleInHead","cellHeight","cellHeightThrottle","margin","auto","minWidth","staticGrid","animate","alwaysShowResizeHandle","resizable","autoHide","handles","draggable","scroll","appendTo","disableDrag","disableResize","rtl","removable","removableOptions","accept","marginUnit","cellHeightUnit","disableOneColumnMode","oneColumnModeDomSort","GridStack","_gsEventHandler","_extraDragRow","rowAttr","toNumber","getAttribute","cloneDeep","toBool","_styleSheetClass","random","toFixed","initMargin","_widthOrContainer","_prevColumn","style","direction","classList","add","parentGridItemEl","closestByClass","gridstackNode","_isNested","subGrid","_isAutoCellHeight","_setStaticClass","engine","cbNodes","remove","_writePosAttr","_updateStyles","elements","getGridItems","parseInt","e","_prepareElement","setAnimation","dragIn","setupDragIn","dragInOptions","_setupRemoveDrop","_setupAcceptWidget","_updateWindowResizeEvent","options","elOrString","getGridElement","gridstack","console","error","selector","grids","getGridElements","parent","contains","doc","document","implementation","createHTMLDocument","body","innerHTML","class","children","appendChild","init","load","_placeholder","placeholderChild","createElement","className","placeholder","els","arguments","warn","id","addWidget","domAttr","_readAttr","_writeAttr","_insertNotAppend","prepend","_updateContainerHeight","querySelector","addGrid","_triggerAddEvent","_triggerChangeEvent","saveContent","saveGridOpt","save","sub","marginBottom","marginTop","marginRight","marginLeft","removeInternalAndSame","addAndRemove","items","removed","removeWidget","item","update","forcePixel","getBoundingClientRect","height","marginDiff","cellWidth","data","parseHeight","unit","clientWidth","parentElement","window","innerWidth","_triggerRemoveEvent","compact","domNodes","updateNodeWidths","from","matches","setStatic","parentNode","removeChild","removeAll","_removeStylesheet","removeAttribute","position","useDocRelative","containerPos","documentElement","scrollTop","offsetTop","offsetLeft","relativeLeft","relativeTop","columnWidth","width","rowHeight","isAreaEmpty","getElement","name","callback","indexOf","split","on","noData","event","detail","addEventListener","log","off","removeEventListener","getElements","get","removeNode","doAnimate","updateClass","_prepareDragDropByNode","m","keys","k","changed","ddChanged","cleanNodes","beginUpdate","endUpdate","value","willItFit","layoutsNodesChange","_triggerEvent","CustomEvent","bubbles","Event","dispatchEvent","_styles","removeStylesheet","forceUpdate","prefix","styleLocation","createStylesheet","_max","addCSSRule","getHeight","rows","cssMinHeight","getComputedStyle","getCellHeight","setAttribute","String","removeProperty","same","attrs","resizeHandles","hasOwnProperty","classes","oneColumn","changedOneColumn","_cellHeightThrottle","throttle","onParentResize","forceRemove","workTodo","_windowResizeBind","bind","margins","doEnable","ui","helper","Engine","f","oldName","newName","rev","wrapper","args","apply","prototype","info","oldAttr","querySelectorAll","getElementById","substring","col","styleSheet","cssText","createTextNode","insertBefore","firstChild","getElementsByTagName","sheet","rules","addRule","insertRule","v","toLowerCase","Boolean","match","Error","parseFloat","target","sources","source","Object","minMax","func","delay","isWaiting","setTimeout","scrollingElement","test","overflow","overflowY","getScrollElement","distance","innerHeightOrClientHeight","innerHeight","clientHeight","offsetDiffDown","offsetDiffUp","scrollEl","prevScroll","offsetHeight","abs","pointerPosY","clientY","scrollBy","behavior","obj","ret","__webpack_module_cache__","__webpack_exports__","__webpack_require__","moduleId","cachedModule","__webpack_modules__","call"],"mappings":"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","file":"gridstack-static.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 ","/**\r\n * gridstack-ddi.ts 4.2.6\r\n * Copyright (c) 2021 Alain Dumesny - see GridStack root license\r\n */\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 /* eslint-disable-next-line @typescript-eslint/no-unused-vars */\r\n public remove(el: GridItemHTMLElement): GridStackDDI {\r\n return this; // no-op for static grids\r\n }\r\n}\r\n","/**\r\n * gridstack-engine.ts 4.2.6\r\n * Copyright (c) 2021 Alain Dumesny - see GridStack root license\r\n */\r\n\r\nimport { Utils } from './utils';\r\nimport { GridStackNode, ColumnOptions, GridStackPosition, GridStackMoveOpts } from './types';\r\n\r\nexport type onChangeCB = (nodes: GridStackNode[], removeDOM?: boolean) => void;\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 true if we have some items locked */\r\n private _hasLocked: boolean;\r\n /** @internal unique global internal _id counter NOT starting at 0 */\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 this.saveInitial(); // since begin update (which is called multiple times) won't do this\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 return this._packNodes()\r\n ._notify();\r\n }\r\n\r\n // use entire row for hitting area (will use bottom reverse sorted first) if we not actively moving DOWN and didn't already skip\r\n private _useEntireRowArea(node: GridStackNode, nn: GridStackPosition): boolean {\r\n return !this.float && !this._hasLocked && (!node._moving || node._skipDown || nn.y <= node.y);\r\n }\r\n\r\n /** @internal fix collision on given 'node', going to given new location 'nn', with optional 'collide' node already found.\r\n * return true if we moved. */\r\n private _fixCollisions(node: GridStackNode, nn = node, collide?: GridStackNode, opt: GridStackMoveOpts = {}): boolean {\r\n this._sortNodes(-1); // from last to first, so recursive collision move items in the right order\r\n\r\n collide = collide || this.collide(node, nn); // REAL area collide for swap and skip if none...\r\n if (!collide) return false;\r\n\r\n // swap check: if we're actively moving in gravity mode, see if we collide with an object the same size\r\n if (node._moving && !opt.nested && !this.float) {\r\n if (this.swap(node, collide)) return true;\r\n }\r\n\r\n // during while() collisions MAKE SURE to check entire row so larger items don't leap frog small ones (push them all down starting last in grid)\r\n let area = nn;\r\n if (this._useEntireRowArea(node, nn)) {\r\n area = {x: 0, w: this.column, y: nn.y, h: nn.h};\r\n collide = this.collide(node, area, opt.skip); // force new hit\r\n }\r\n\r\n let didMove = false;\r\n let newOpt: GridStackMoveOpts = {nested: true, pack: false};\r\n while (collide = collide || this.collide(node, area, opt.skip)) { // could collide with more than 1 item... so repeat for each\r\n let moved: boolean;\r\n // if colliding with a locked item OR moving down with top gravity (and collide could move up) -> skip past the collide,\r\n // but remember that skip down so we only do this once (and push others otherwise).\r\n if (collide.locked || node._moving && !node._skipDown && nn.y > node.y && !this.float &&\r\n // can take space we had, or before where we're going\r\n (!this.collide(collide, {...collide, y: node.y}, node) || !this.collide(collide, {...collide, y: nn.y - collide.h}, node))) {\r\n node._skipDown = (node._skipDown || nn.y > node.y);\r\n moved = this.moveNode(node, {...nn, y: collide.y + collide.h, ...newOpt});\r\n if (collide.locked && moved) {\r\n Utils.copyPos(nn, node); // moving after lock become our new desired location\r\n } else if (!collide.locked && moved && opt.pack) {\r\n // we moved after and will pack: do it now and keep the original drop location, but past the old collide to see what else we might push way\r\n this._packNodes();\r\n nn.y = collide.y + collide.h;\r\n Utils.copyPos(node, nn);\r\n }\r\n didMove = didMove || moved;\r\n } else {\r\n // move collide down *after* where we will be, ignoring where we are now (don't collide with us)\r\n moved = this.moveNode(collide, {...collide, y: nn.y + nn.h, skip: node, ...newOpt});\r\n }\r\n if (!moved) { return didMove; } // break inf loop if we couldn't move after all (ex: maxRow, fixed)\r\n collide = undefined;\r\n }\r\n return didMove;\r\n }\r\n\r\n /** return the nodes that intercept the given node. Optionally a different area can be used, as well as a second node to skip */\r\n public collide(skip: GridStackNode, area = skip, skip2?: GridStackNode): GridStackNode {\r\n return this.nodes.find(n => n !== skip && n !== skip2 && Utils.isIntercepted(n, area));\r\n }\r\n public collideAll(skip: GridStackNode, area = skip, skip2?: GridStackNode): GridStackNode[] {\r\n return this.nodes.filter(n => n !== skip && n !== skip2 && Utils.isIntercepted(n, area));\r\n }\r\n\r\n /** does a pixel coverage collision, returning the node that has the most coverage that is >50% mid line */\r\n public collideCoverage(node: GridStackNode, o: GridStackMoveOpts, collides: GridStackNode[]): GridStackNode {\r\n if (!o.rect || !node._rect) return;\r\n let r0 = node._rect; // where started\r\n let r = {...o.rect}; // where we are\r\n\r\n // update dragged rect to show where it's coming from (above or below, etc...)\r\n if (r.y > r0.y) {\r\n r.h += r.y - r0.y;\r\n r.y = r0.y;\r\n } else {\r\n r.h += r0.y - r.y;\r\n }\r\n if (r.x > r0.x) {\r\n r.w += r.x - r0.x;\r\n r.x = r0.x;\r\n } else {\r\n r.w += r0.x - r.x;\r\n }\r\n\r\n let collide: GridStackNode;\r\n collides.forEach(n => {\r\n if (n.locked || !n._rect) return;\r\n let r2 = n._rect; // overlapping target\r\n let yOver = Number.MAX_VALUE, xOver = Number.MAX_VALUE, overMax = 0.5; // need >50%\r\n // depending on which side we started from, compute the overlap % of coverage\r\n // (ex: from above/below we only compute the max horizontal line coverage)\r\n if (r0.y < r2.y) { // from above\r\n yOver = ((r.y + r.h) - r2.y) / r2.h;\r\n } else if (r0.y+r0.h > r2.y+r2.h) { // from below\r\n yOver = ((r2.y + r2.h) - r.y) / r2.h;\r\n }\r\n if (r0.x < r2.x) { // from the left\r\n xOver = ((r.x + r.w) - r2.x) / r2.w;\r\n } else if (r0.x+r0.w > r2.x+r2.w) { // from the right\r\n xOver = ((r2.x + r2.w) - r.x) / r2.w;\r\n }\r\n let over = Math.min(xOver, yOver);\r\n if (over > overMax) {\r\n overMax = over;\r\n collide = n;\r\n }\r\n });\r\n return collide;\r\n }\r\n\r\n /** called to cache the nodes pixel rectangles used for collision detection during drag */\r\n public cacheRects(w: number, h: number, top: number, right: number, bottom: number, left: number): GridStackEngine\r\n {\r\n this.nodes.forEach(n =>\r\n n._rect = {\r\n y: n.y * h + top,\r\n x: n.x * w + left,\r\n w: n.w * w - left - right,\r\n h: n.h * h - top - bottom\r\n }\r\n );\r\n return this;\r\n }\r\n\r\n /** called to possibly swap between 2 nodes (same size or column, not locked, touching), returning true if successful */\r\n public swap(a: GridStackNode, b: GridStackNode): boolean {\r\n if (!b || b.locked || !a || a.locked) return false;\r\n\r\n function _doSwap(): true { // assumes a is before b IFF they have different height (put after rather than exact swap)\r\n let x = b.x, y = b.y;\r\n b.x = a.x; b.y = a.y; // b -> a position\r\n if (a.h != b.h) {\r\n a.x = x; a.y = b.y + b.h; // a -> goes after b\r\n } else {\r\n a.x = x; a.y = y; // a -> old b position\r\n }\r\n a._dirty = b._dirty = true;\r\n return true;\r\n }\r\n let touching: boolean; // remember if we called it (vs undefined)\r\n\r\n // same size and same row or column, and touching\r\n if (a.w === b.w && a.h === b.h && (a.x === b.x || a.y === b.y) && (touching = Utils.isTouching(a, b)))\r\n return _doSwap();\r\n if (touching === false) return; // ran test and fail, bail out\r\n\r\n // check for taking same columns (but different height) and touching\r\n if (a.w === b.w && a.x === b.x && (touching || Utils.isTouching(a, b))) {\r\n if (b.y < a.y) { let t = a; a = b; b = t; } // swap a <-> b vars so a is first\r\n return _doSwap();\r\n }\r\n\r\n /* different X will be weird (expect vertical swap) and different height overlap, so too complex. user regular layout instead\r\n // else check if swapping would not collide with anything else (requiring a re-layout)\r\n if (!this.collide(a, {x: a.x, y: a.y, w: b.w, h: b.h}, b) &&\r\n !this.collide(a, {x: b.x, y: b.y, w: a.w, h: a.h}, b))\r\n return _doSwap(); */\r\n return false;\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 ._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.locked) {\r\n node.autoPosition = true;\r\n }\r\n this.addNode(node, false); // 'false' for add event trigger\r\n node._dirty = true; // will force attr update\r\n });\r\n return this.commit();\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()._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 called to top gravity pack the items back OR revert back to original Y positions when floating */\r\n private _packNodes(): GridStackEngine {\r\n this._sortNodes(); // first to last\r\n\r\n if (this.float) {\r\n // restore original Y pos\r\n this.nodes.forEach(n => {\r\n if (n._updating || n._orig === undefined || n.y === n._orig.y) return;\r\n let newY = n.y;\r\n while (newY > n._orig.y) {\r\n --newY;\r\n let collide = this.collide(n, {x: n.x, y: newY, w: n.w, h: n.h});\r\n if (!collide) {\r\n n._dirty = true;\r\n n.y = newY;\r\n }\r\n }\r\n });\r\n } else {\r\n // top gravity pack\r\n this.nodes.forEach((n, i) => {\r\n if (n.locked) return;\r\n while (n.y > 0) {\r\n let newY = i === 0 ? 0 : n.y - 1;\r\n let canBeMoved = i === 0 || !this.collide(n, {x: n.x, y: newY, w: n.w, h: n.h});\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 return this.nodeBoundFix(node, resizing);\r\n }\r\n\r\n /** part2 of preparing a node to fit inside our grid - checks for x,y from grid dimensions */\r\n public nodeBoundFix(node: GridStackNode, resizing?: boolean): GridStackNode {\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 // if user loaded a larger than allowed widget for current # of columns,\r\n // remember it's full width so we can restore back (1 -> 12 column) #1655\r\n if (this.column < 12) {\r\n node.w = Math.min(12, node.w);\r\n this.cacheOneLayout(node, 12);\r\n }\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 instead as _dirty can be a temporary state\r\n if (verify) {\r\n return this.nodes.filter(n => n._dirty && !Utils.samePos(n, n._orig));\r\n }\r\n return this.nodes.filter(n => n._dirty);\r\n }\r\n\r\n /** @internal call this to call onChange CB with dirty nodes */\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 this.onChange && this.onChange(dirtyNodes, removeDOM);\r\n return this;\r\n }\r\n\r\n /** @internal remove dirty and last tried info */\r\n public cleanNodes(): GridStackEngine {\r\n if (this.batchMode) return this;\r\n this.nodes.forEach(n => {\r\n delete n._dirty;\r\n delete n._lastTried;\r\n });\r\n return this;\r\n }\r\n\r\n /** @internal called to save initial position/size to track real dirty state.\r\n * Note: should be called right after we call change event (so next API is can detect changes)\r\n * as well as right before we start move/resize/enter (so we can restore items to prev values) */\r\n public saveInitial(): GridStackEngine {\r\n this.nodes.forEach(n => {\r\n n._orig = Utils.copyPos({}, n);\r\n delete n._dirty;\r\n });\r\n this._hasLocked = this.nodes.some(n => n.locked);\r\n return this;\r\n }\r\n\r\n /** @internal restore all the nodes back to initial values (called when we leave) */\r\n public restoreInitial(): GridStackEngine {\r\n this.nodes.forEach(n => {\r\n if (Utils.samePos(n, n._orig)) return;\r\n Utils.copyPos(n, n._orig);\r\n n._dirty = true;\r\n });\r\n this._notify();\r\n return this;\r\n }\r\n\r\n /** call to add the given node to our list, fixing collision and re-packing */\r\n public addNode(node: GridStackNode, triggerAddEvent = false): GridStackNode {\r\n let dup: GridStackNode;\r\n if (dup = this.nodes.find(n => n._id === node._id)) return dup; // prevent inserting twice! return it instead.\r\n\r\n node = this.prepareNode(node);\r\n delete node._temporaryRemoved;\r\n delete node._removeDOM;\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 triggerAddEvent && this.addedNodes.push(node);\r\n\r\n this._fixCollisions(node);\r\n this._packNodes()\r\n ._notify();\r\n return node;\r\n }\r\n\r\n public removeNode(node: GridStackNode, removeDOM = true, triggerEvent = false): GridStackEngine {\r\n if (!this.nodes.find(n => n === node)) {\r\n // TEST console.log(`Error: GridStackEngine.removeNode() node._id=${node._id} not found!`)\r\n return this;\r\n }\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 if (removeDOM) node._removeDOM = true; // let CB remove actual HTML (used to set _id to null, but then we loose layout info)\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 return this._packNodes()\r\n ._notify(node);\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 removeDOM && this.nodes.forEach(n => n._removeDOM = true); // let CB remove actual HTML (used to set _id to null, but then we loose layout info)\r\n this.removedNodes = this.nodes;\r\n this.nodes = [];\r\n return this._notify(this.removedNodes);\r\n }\r\n\r\n /** checks if item can be moved (layout constrain) vs moveNode(), returning true if was able to move.\r\n * In more complicated cases (maxRow) it will attempt at moving the item and fixing\r\n * others in a clone first, then apply those changes if still within specs. */\r\n public moveNodeCheck(node: GridStackNode, o: GridStackMoveOpts): boolean {\r\n // if (node.locked) return false;\r\n if (!this.changedPosConstrain(node, o)) return false;\r\n o.pack = true;\r\n\r\n // simpler case: move item directly...\r\n if (!this.maxRow/* && !this._hasLocked*/) {\r\n return this.moveNode(node, o);\r\n }\r\n\r\n // complex case: create a clone with NO maxRow (will check for out of bounds at the end)\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 if (!clonedNode) return false;\r\n\r\n let canMove = clone.moveNode(clonedNode, o);\r\n // if maxRow make sure we are still valid size\r\n if (this.maxRow && canMove) {\r\n canMove = (clone.getRow() <= this.maxRow);\r\n // turns out we can't grow, then see if we can swap instead (ex: full grid)\r\n if (!canMove) {\r\n let collide = this.collide(node, o);\r\n if (collide && this.swap(node, collide)) {\r\n this._notify();\r\n return true;\r\n }\r\n }\r\n }\r\n if (!canMove) return false;\r\n\r\n // if clone was able to move, copy those mods over to us now instead of caller trying to do this all over!\r\n // Note: we can't use the list directly as elements and other parts point to actual node, so copy content\r\n clone.nodes.filter(n => n._dirty).forEach(c => {\r\n let n = this.nodes.find(a => a._id === c._id);\r\n if (!n) return;\r\n Utils.copyPos(n, c);\r\n n._dirty = true;\r\n });\r\n this._notify();\r\n return true;\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 delete node._willFitPos;\r\n if (!this.maxRow) return true;\r\n // create a clone with NO maxRow and check if still within size\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 let n = {...node}; // clone node so we don't mod any settings on it but have full autoPosition and min/max as well! #1687\r\n this.cleanupNode(n);\r\n delete n.el; delete n._id; delete n.content; delete n.grid;\r\n clone.addNode(n);\r\n if (clone.getRow() <= this.maxRow) {\r\n node._willFitPos = Utils.copyPos({}, n);\r\n return true;\r\n }\r\n return false;\r\n }\r\n\r\n /** true if x,y or w,h are different after clamping to min/max */\r\n public changedPosConstrain(node: GridStackNode, p: GridStackPosition): boolean {\r\n // make sure w,h are set\r\n p.w = p.w || node.w;\r\n p.h = p.h || node.h;\r\n if (node.x !== p.x || node.y !== p.y) return true;\r\n // check constrained w,h\r\n if (node.maxW) { p.w = Math.min(p.w, node.maxW); }\r\n if (node.maxH) { p.h = Math.min(p.h, node.maxH); }\r\n if (node.minW) { p.w = Math.max(p.w, node.minW); }\r\n if (node.minH) { p.h = Math.max(p.h, node.minH); }\r\n return (node.w !== p.w || node.h !== p.h);\r\n }\r\n\r\n /** return true if the passed in node was actually moved (checks for no-op and locked) */\r\n public moveNode(node: GridStackNode, o: GridStackMoveOpts): boolean {\r\n if (!node || /*node.locked ||*/ !o) return false;\r\n if (o.pack === undefined) o.pack = true;\r\n\r\n // constrain the passed in values and check if we're still changing our node\r\n if (typeof o.x !== 'number') { o.x = node.x; }\r\n if (typeof o.y !== 'number') { o.y = node.y; }\r\n if (typeof o.w !== 'number') { o.w = node.w; }\r\n if (typeof o.h !== 'number') { o.h = node.h; }\r\n let resizing = (node.w !== o.w || node.h !== o.h);\r\n let nn: GridStackNode = Utils.copyPos({}, node, true); // get min/max out first, then opt positions next\r\n Utils.copyPos(nn, o);\r\n nn = this.nodeBoundFix(nn, resizing);\r\n Utils.copyPos(o, nn);\r\n\r\n if (Utils.samePos(node, o)) return false;\r\n let prevPos: GridStackPosition = Utils.copyPos({}, node);\r\n\r\n // during while() collisions make sure to check entire row so larger items don't leap frog small ones (push them all down)\r\n let area = nn;\r\n // if (this._useEntireRowArea(node, nn)) {\r\n // area = {x: 0, w: this.column, y: nn.y, h: nn.h};\r\n // }\r\n\r\n // check if we will need to fix collision at our new location\r\n let collides = this.collideAll(node, area, o.skip);\r\n let needToMove = true;\r\n if (collides.length) {\r\n // now check to make sure we actually collided over 50% surface area while dragging\r\n let collide = node._moving && !o.nested ? this.collideCoverage(node, o, collides) : collides[0];\r\n if (collide) {\r\n needToMove = !this._fixCollisions(node, nn, collide, o); // check if already moved...\r\n } else {\r\n needToMove = false; // we didn't cover >50% for a move, skip...\r\n }\r\n }\r\n\r\n // now move (to the original ask vs the collision version which might differ) and repack things\r\n if (needToMove) {\r\n node._dirty = true;\r\n Utils.copyPos(node, nn);\r\n }\r\n if (o.pack) {\r\n this._packNodes()\r\n ._notify();\r\n }\r\n return !Utils.samePos(node, prevPos); // pack might have moved things back\r\n }\r\n\r\n public getRow(): number {\r\n return this.nodes.reduce((row, n) => Math.max(row, n.y + n.h), 0);\r\n }\r\n\r\n public beginUpdate(node: GridStackNode): GridStackEngine {\r\n if (!node._updating) {\r\n node._updating = true;\r\n delete node._skipDown;\r\n if (!this.batchMode) this.saveInitial();\r\n }\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 delete n._skipDown;\r\n }\r\n return this;\r\n }\r\n\r\n /** saves a copy of the current layout returning a list of widgets for serialization */\r\n public save(saveElement = true): GridStackNode[] {\r\n let list: GridStackNode[] = [];\r\n this._sortNodes();\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 delete w.grid;\r\n if (!saveElement) delete w.el;\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 list.push(w);\r\n });\r\n return list;\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 if (!node._orig) return; // didn't change (newly added ?)\r\n let n = layout.find(l => l._id === node._id);\r\n if (!n) return; // 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._orig.y) {\r\n n.y += (node.y - node._orig.y);\r\n }\r\n // X changed, scale from new position\r\n if (node.x !== node._orig.x) {\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._orig.w) {\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 /**\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 * call to cache the given node layout internally to the given location so we can restore back when column changes size\r\n * @param node single node to cache\r\n * @param column corresponding column index to save it under\r\n */\r\n public cacheOneLayout(n: GridStackNode, column: number): GridStackEngine {\r\n n._id = n._id || GridStackEngine._idSeq++;\r\n let layout: Layout = {x: n.x, y: n.y, w: n.w, _id: n._id}\r\n this._layouts = this._layouts || [];\r\n this._layouts[column] = this._layouts[column] || [];\r\n let index = this._layouts[column].findIndex(l => l._id === n._id);\r\n index === -1 ? this._layouts[column].push(layout) : this._layouts[column][index] = layout;\r\n return this;\r\n }\r\n\r\n\r\n /** called to remove all internal values but the _id */\r\n public cleanupNode(node: GridStackNode): GridStackEngine {\r\n for (let prop in node) {\r\n if (prop[0] === '_' && prop !== '_id') delete node[prop];\r\n }\r\n return this;\r\n }\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","/**\r\n * index-static.ts 4.2.6 - much smaller, everything you need for a static Grid (non draggable, API driven)\r\n * Copyright (c) 2021 Alain Dumesny - see GridStack root license\r\n */\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\n// declare module 'gridstack'; for umd ?\r\n","/*!\r\n * GridStack 4.2.6\r\n * https://gridstackjs.com/\r\n *\r\n * Copyright (c) 2021 Alain Dumesny\r\n * see root license https://github.com/gridstack/gridstack.js/tree/master/LICENSE\r\n */\r\n\r\nimport { GridStackEngine } from './gridstack-engine';\r\nimport { Utils, HeightData } from './utils';\r\nimport { ColumnOptions, GridItemHTMLElement, GridStackElement, GridStackEventHandlerCallback,\r\n GridStackNode, GridStackOptions, GridStackWidget, numberOrString, DDUIData, DDDragInOpt, GridStackPosition } 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\n/** list of possible events, or space separated list of them */\r\nexport type GridStackEvent = 'added' | 'change' | 'disable' | 'drag' | 'dragstart' | 'dragstop' | 'dropped' |\r\n 'enable' | 'removed' | 'resize' | 'resizestart' | 'resizestop' | string;\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 cellHeightThrottle: 100,\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 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 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 * <div class=\"grid-stack\">\r\n * <div class=\"grid-stack-item\">\r\n * <div class=\"grid-stack-item-content\">Item 1</div>\r\n * </div>\r\n * </div>\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, Utils.cloneDeep(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, Utils.cloneDeep(options));\r\n delete options.dragIn; delete options.dragInOptions; // only need to be done once (really a static global thing, not per grid)\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, but check if the passed 'parent' already has grid styling and should be used instead\r\n let el = parent;\r\n if (!parent.classList.contains('grid-stack')) {\r\n let doc = document.implementation.createHTMLDocument();\r\n doc.body.innerHTML = `<div class=\"grid-stack ${opt.class || ''}\"></div>`;\r\n el = doc.body.children[0] as HTMLElement;\r\n parent.appendChild(el);\r\n }\r\n\r\n // create grid class and load any children\r\n let grid = GridStack.init(opt, el);\r\n if (grid.opts.children) {\r\n let children = grid.opts.children;\r\n delete grid.opts.children;\r\n grid.load(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 create placeholder DIV as needed */\r\n public get placeholder(): HTMLElement {\r\n if (!this._placeholder) {\r\n let placeholderChild = document.createElement('div'); // child so padding match item-content\r\n placeholderChild.className = 'placeholder-content';\r\n if (this.opts.placeholderText) {\r\n placeholderChild.innerHTML = this.opts.placeholderText;\r\n }\r\n this._placeholder = document.createElement('div');\r\n this._placeholder.classList.add(this.opts.placeholderClass, GridDefaults.itemClass, this.opts.itemClass);\r\n this.placeholder.appendChild(placeholderChild);\r\n }\r\n return this._placeholder;\r\n }\r\n /** @internal */\r\n private _placeholder: HTMLElement;\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: () => void;\r\n /** @internal limit auto cell resizing method */\r\n private _cellHeightThrottle: () => void;\r\n /** @internal true when loading items to insert first rather than append */\r\n private _insertNotAppend: boolean;\r\n /** @internal extra row added when dragging at the bottom of the grid */\r\n private _extraDragRow = 0;\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 // 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 = {...Utils.cloneDeep(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(); // part of settings defaults...\r\n\r\n // Now check if we're loading into 1 column mode FIRST so we don't do un-necessary work (like cellHeight = width / 12 then go 1 column)\r\n if (this.opts.column !== 1 && !this.opts.disableOneColumnMode && this._widthOrContainer() <= this.opts.minWidth) {\r\n this._prevColumn = this.opts.column;\r\n this.opts.column = 1;\r\n }\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 || this.opts.cellHeight === 'initial') {\r\n // make the cell content square initially (will use resize/column event to keep it square)\r\n this.cellHeight(undefined, 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) => {\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 (n._removeDOM) {\r\n if (el) el.remove();\r\n delete n._removeDOM;\r\n } else {\r\n this._writePosAttr(el, n);\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 => { // get dom elements (not nodes yet)\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((a, b) => a.i - b.i).forEach(e => this._prepareElement(e.el));\r\n this.commit();\r\n }\r\n\r\n this.setAnimation(this.opts.animate);\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 // legacy support to appear 'per grid` options when really global.\r\n if (this.opts.dragIn) GridStack.setupDragIn(this.opts.dragIn, this.opts.dragInOptions);\r\n delete this.opts.dragIn;\r\n delete this.opts.dragInOptions;\r\n\r\n this._setupRemoveDrop();\r\n this._setupAcceptWidget();\r\n this._updateWindowResizeEvent();\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('<div class=\"grid-stack-item\"><div class=\"grid-stack-item-content\">hello</div></div>', {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 = `<div class=\"grid-stack-item ${this.opts.itemClass || ''}\"><div class=\"grid-stack-item-content\">${content}</div></div>`;\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 = Utils.cloneDeep(options) || {}; // make a copy before we modify in case caller re-uses it\r\n Utils.defaults(options, domAttr);\r\n let node = 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\r\n // check if nested grid definition is present\r\n if (node.subGrid && !(node.subGrid as GridStack).el) { // see if there is a sub-grid to create too\r\n let content = node.el.querySelector('.grid-stack-item-content') as HTMLElement;\r\n node.subGrid = GridStack.addGrid(content, node.subGrid as GridStackOptions);\r\n }\r\n\r\n this._triggerAddEvent();\r\n this._triggerChangeEvent();\r\n\r\n return el;\r\n }\r\n\r\n /**\r\n /**\r\n * saves the current layout returning a list of widgets for serialization which might include any nested grids.\r\n * @param saveContent if true (default) the latest html inside .grid-stack-content will be saved to GridStackWidget.content field, else it will\r\n * be removed.\r\n * @param saveGridOpt if true (default false), save the grid 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 instead.\r\n * @returns list of widgets or full grid option, including .children list of widgets\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 and nested grids\r\n list.forEach(n => {\r\n if (saveContent && 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 } else {\r\n if (!saveContent) { delete n.content; }\r\n // check for nested grid\r\n if (n.subGrid) {\r\n n.subGrid = (n.subGrid as GridStack).save(saveContent, true) as GridStackOptions;\r\n }\r\n }\r\n delete n.el;\r\n });\r\n\r\n // check if save entire grid options (needed for recursive) + children...\r\n if (saveGridOpt) {\r\n let o: GridStackOptions = Utils.cloneDeep(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); // make copy before we mod/sort\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 }\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 do entire grid and # of rows\r\n // or get first cell height ?\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 return Math.round(this.el.getBoundingClientRect().height) / parseInt(this.el.getAttribute('gs-current-row'));\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. If not passed (undefined), cells content will be made square (match width minus margin),\r\n * if pass 0 the CSS will be generated by the application instead.\r\n * @param update (Optional) if false, styles will not be updated\r\n *\r\n * @example\r\n * grid.cellHeight(100); // same as 100px\r\n * grid.cellHeight('70px');\r\n * grid.cellHeight(grid.cellWidth() * 1.2);\r\n */\r\n public cellHeight(val?: numberOrString, update = true): GridStack {\r\n\r\n // if not called internally, check if we're changing mode\r\n if (update && val !== undefined) {\r\n if (this._isAutoCellHeight !== (val === 'auto')) {\r\n this._isAutoCellHeight = (val === 'auto');\r\n this._updateWindowResizeEvent();\r\n }\r\n }\r\n if (val === 'initial' || val === 'auto') { val = undefined; }\r\n\r\n // make item content be square\r\n if (val === undefined) {\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 val = this.cellWidth() + marginDiff;\r\n }\r\n\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 return this;\r\n }\r\n\r\n /** Gets current cell width. */\r\n public cellWidth(): number {\r\n return this._widthOrContainer() / this.opts.column;\r\n }\r\n /** return our expected width (or parent) for 1 column check */\r\n private _widthOrContainer(): number {\r\n // use `offsetWidth` or `clientWidth` (no scrollbar) ?\r\n // https://stackoverflow.com/questions/21064101/understanding-offsetwidth-clientwidth-scrollwidth-and-height-respectively\r\n return (this.el.clientWidth || this.el.parentElement.clientWidth || window.innerWidth);\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 => { // get dom elements in order\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 if (this._isAutoCellHeight) this.cellHeight();\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 in DOM order */\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, false); // permanently removes DD but don't set CSS class (we're going away)\r\n this.setAnimation(false);\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 this.el.removeAttribute('gs-current-row');\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 * 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 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: {top: number, left: number};\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('<div id=\"gsi-1\" gs-w=\"3\"></div>');\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 public on(name: GridStackEvent, callback: GridStackEventHandlerCallback): 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 === 'drag' || name === 'dragstart' || name === 'dragstop' || name === 'resizestart' || name === 'resize' || 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, updateClass = true): GridStack {\r\n if (this.opts.staticGrid === val) return this;\r\n this.opts.staticGrid = val;\r\n this._setupRemoveDrop();\r\n this._setupAcceptWidget();\r\n this.engine.nodes.forEach(n => this._prepareDragDropByNode(n)); // either delete or init Drag&drop\r\n if (updateClass) { 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 = Utils.cloneDeep(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 .beginUpdate(n)\r\n .moveNode(n, m);\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() + this._extraDragRow; // 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 /** @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 position x,y,w,h attributes back to element */\r\n private _writePosAttr(el: HTMLElement, n: GridStackPosition): GridStack {\r\n if (n.x !== undefined && n.x !== null) { el.setAttribute('gs-x', String(n.x)); }\r\n if (n.y !== undefined && n.y !== null) { el.setAttribute('gs-y', String(n.y)); }\r\n if (n.w) { el.setAttribute('gs-w', String(n.w)); }\r\n if (n.h) { el.setAttribute('gs-h', String(n.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);\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 let oneColumn = !this.opts.disableOneColumnMode && this.el.clientWidth <= this.opts.minWidth;\r\n let changedOneColumn = false;\r\n\r\n if ((this.opts.column === 1) !== oneColumn) {\r\n changedOneColumn = true;\r\n if (this.opts.animate) { this.setAnimation(false); } // 1 <-> 12 is too radical, turn off animation\r\n this.column(oneColumn ? 1 : this._prevColumn);\r\n if (this.opts.animate) { this.setAnimation(true); }\r\n }\r\n\r\n // make the cells content square again\r\n if (this._isAutoCellHeight) {\r\n if (!changedOneColumn && this.opts.cellHeightThrottle) {\r\n if (!this._cellHeightThrottle) {\r\n this._cellHeightThrottle = Utils.throttle(() => this.cellHeight(), this.opts.cellHeightThrottle);\r\n }\r\n this._cellHeightThrottle();\r\n } else {\r\n // immediate update if we've changed to/from oneColumn or have no threshold\r\n this.cellHeight();\r\n }\r\n }\r\n\r\n // finally update any nested grids\r\n this.engine.nodes.forEach(n => {\r\n if (n.subGrid) {(n.subGrid as GridStack).onParentResize()}\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 // 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 const workTodo = (this._isAutoCellHeight || !this.opts.disableOneColumnMode) && !this.opts._isNested;\r\n\r\n if (!forceRemove && workTodo && !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 } 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 * call to setup dragging in from the outside (say toolbar), by specifying the class selection and options.\r\n * Called during GridStack.init() as options, but can also be called directly (last param are cached) in case the toolbar\r\n * is dynamically create and needs to change later.\r\n * @param dragIn string selector (ex: '.sidebar .grid-stack-item')\r\n * @param dragInOptions options - see DDDragInOpt. (default: {revert: 'invalid', handle: '.grid-stack-item-content', scroll: false, appendTo: 'body'}\r\n **/\r\n public static setupDragIn(dragIn?: string, dragInOptions?: DDDragInOpt): void { /* implemented in gridstack-dd.ts */ }\r\n\r\n /**\r\n * Enables/Disables dragging by the user of specific grid element. If you want all items, and have it affect future items, use enableMove() instead. No-op for static grids.\r\n * IF you are looking to prevent an item from moving (due to being pushed around by another during collision) use locked property instead.\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 user resizing of specific grid element. If you want all items, and have it affect future items, use enableResize() instead. No-op for static grids.\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 /**\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 { return this }\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 { return this }\r\n /**\r\n * Enables/disables widget moving. No-op for static grids.\r\n */\r\n public enableMove(doEnable: boolean): GridStack { return this }\r\n /**\r\n * Enables/disables widget resizing. No-op for static grids.\r\n */\r\n public enableResize(doEnable: boolean): GridStack { return this }\r\n\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 prepares the element for drag&drop **/\r\n public _prepareDragDropByNode(node: GridStackNode): GridStack { return this }\r\n /** @internal handles actual drag/resize start **/\r\n public _onStartMoving(el: GridItemHTMLElement, event: Event, ui: DDUIData, node: GridStackNode, cellWidth: number, cellHeight: number): void { return }\r\n /** @internal handles actual drag/resize **/\r\n public _dragOrResize(el: GridItemHTMLElement, event: Event, ui: DDUIData, node: GridStackNode, cellWidth: number, cellHeight: number): void { return }\r\n /** @internal called when a node leaves our area (mouse out or shape outside) **/\r\n public _leave(el: GridItemHTMLElement, helper?: GridItemHTMLElement): void { return }\r\n}\r\n","/**\r\n * utils.ts 4.2.6\r\n * Copyright (c) 2021 Alain Dumesny - see GridStack root license\r\n */\r\n\r\nimport { GridStackElement, GridStackNode, GridStackOptions, numberOrString, GridStackPosition, GridStackWidget } from './types';\r\n\r\nexport interface HeightData {\r\n h: number;\r\n unit: string;\r\n}\r\n\r\n/** checks for obsolete method names */\r\n// eslint-disable-next-line\r\nexport function obsolete(self, f, oldName: string, newName: string, rev: string): (...args: any[]) => any {\r\n let wrapper = (...args) => {\r\n console.warn('gridstack.js: Function `' + oldName + '` is deprecated in ' + rev + ' and has been replaced ' +\r\n 'with `' + newName + '`. It will be **completely** removed in v1.0');\r\n return f.apply(self, args);\r\n }\r\n wrapper.prototype = f.prototype;\r\n return wrapper;\r\n}\r\n\r\n/** checks for obsolete grid options (can be used for any fields, but msg is about options) */\r\nexport function obsoleteOpts(opts: GridStackOptions, oldName: string, newName: string, rev: string): void {\r\n if (opts[oldName] !== undefined) {\r\n opts[newName] = opts[oldName];\r\n console.warn('gridstack.js: Option `' + oldName + '` is deprecated in ' + rev + ' and has been replaced with `' +\r\n newName + '`. It will be **completely** removed in v1.0');\r\n }\r\n}\r\n\r\n/** checks for obsolete grid options which are gone */\r\nexport function obsoleteOptsDel(opts: GridStackOptions, oldName: string, rev: string, info: string): void {\r\n if (opts[oldName] !== undefined) {\r\n console.warn('gridstack.js: Option `' + oldName + '` is deprecated in ' + rev + info);\r\n }\r\n}\r\n\r\n/** checks for obsolete Jquery element attributes */\r\nexport function obsoleteAttr(el: HTMLElement, oldName: string, newName: string, rev: string): void {\r\n let oldAttr = el.getAttribute(oldName);\r\n if (oldAttr !== null) {\r\n el.setAttribute(newName, oldAttr);\r\n console.warn('gridstack.js: attribute `' + oldName + '`=' + oldAttr + ' is deprecated on this object in ' + rev + ' and has been replaced with `' +\r\n newName + '`. It will be **completely** removed in v1.0');\r\n }\r\n}\r\n\r\n/**\r\n * Utility methods\r\n */\r\nexport class Utils {\r\n\r\n /** convert a potential selector into actual list of html elements */\r\n static getElements(els: GridStackElement): HTMLElement[] {\r\n if (typeof els === 'string') {\r\n let list = document.querySelectorAll(els);\r\n if (!list.length && els[0] !== '.' && els[0] !== '#') {\r\n list = document.querySelectorAll('.' + els);\r\n if (!list.length) { list = document.querySelectorAll('#' + els) }\r\n }\r\n return Array.from(list) as HTMLElement[];\r\n }\r\n return [els];\r\n }\r\n\r\n /** convert a potential selector into actual single element */\r\n static getElement(els: GridStackElement): HTMLElement {\r\n if (typeof els === 'string') {\r\n if (!els.length) return null;\r\n if (els[0] === '#') {\r\n return document.getElementById(els.substring(1));\r\n }\r\n if (els[0] === '.' || els[0] === '[') {\r\n return document.querySelector(els);\r\n }\r\n\r\n // if we start with a digit, assume it's an id (error calling querySelector('#1')) as class are not valid CSS\r\n if(!isNaN(+els[0])) { // start with digit\r\n return document.getElementById(els);\r\n }\r\n\r\n // finally try string, then id then class\r\n let el = document.querySelector(els);\r\n if (!el) { el = document.getElementById(els) }\r\n if (!el) { el = document.querySelector('.' + els) }\r\n return el as HTMLElement;\r\n }\r\n return els;\r\n }\r\n\r\n /** returns true if a and b overlap */\r\n static isIntercepted(a: GridStackPosition, b: GridStackPosition): boolean {\r\n return !(a.y >= b.y + b.h || a.y + a.h <= b.y || a.x + a.w <= b.x || a.x >= b.x + b.w);\r\n }\r\n\r\n /** returns true if a and b touch edges or corners */\r\n static isTouching(a: GridStackPosition, b: GridStackPosition): boolean {\r\n return Utils.isIntercepted(a, {x: b.x-0.5, y: b.y-0.5, w: b.w+1, h: b.h+1})\r\n }\r\n /**\r\n * Sorts array of nodes\r\n * @param nodes array to sort\r\n * @param dir 1 for asc, -1 for desc (optional)\r\n * @param width width of the grid. If undefined the width will be calculated automatically (optional).\r\n **/\r\n static sort(nodes: GridStackNode[], dir?: -1 | 1, column?: number): GridStackNode[] {\r\n column = column || nodes.reduce((col, n) => Math.max(n.x + n.w, col), 0) || 12;\r\n if (dir === -1)\r\n return nodes.sort((a, b) => (b.x + b.y * column)-(a.x + a.y * column));\r\n else\r\n return nodes.sort((b, a) => (b.x + b.y * column)-(a.x + a.y * column));\r\n }\r\n\r\n /**\r\n * creates a style sheet with style id under given parent\r\n * @param id will set the 'gs-style-id' attribute to that id\r\n * @param parent to insert the stylesheet as first child,\r\n * if none supplied it will be appended to the document head instead.\r\n */\r\n static createStylesheet(id: string, parent?: HTMLElement): CSSStyleSheet {\r\n let style: HTMLStyleElement = document.createElement('style');\r\n style.setAttribute('type', 'text/css');\r\n style.setAttribute('gs-style-id', id);\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n if ((style as any).styleSheet) { // TODO: only CSSImportRule have that and different beast ??\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n (style as any).styleSheet.cssText = '';\r\n } else {\r\n style.appendChild(document.createTextNode('')); // WebKit hack\r\n }\r\n if (!parent) {\r\n // default to head\r\n parent = document.getElementsByTagName('head')[0];\r\n parent.appendChild(style);\r\n } else {\r\n parent.insertBefore(style, parent.firstChild);\r\n }\r\n return style.sheet as CSSStyleSheet;\r\n }\r\n\r\n /** removed the given stylesheet id */\r\n static removeStylesheet(id: string): void {\r\n let el = document.querySelector('STYLE[gs-style-id=' + id + ']');\r\n if (el && el.parentNode) el.remove();\r\n }\r\n\r\n /** inserts a CSS rule */\r\n static addCSSRule(sheet: CSSStyleSheet, selector: string, rules: string): void {\r\n if (typeof sheet.addRule === 'function') {\r\n sheet.addRule(selector, rules);\r\n } else if (typeof sheet.insertRule === 'function') {\r\n sheet.insertRule(`${selector}{${rules}}`);\r\n }\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n static toBool(v: unknown): boolean {\r\n if (typeof v === 'boolean') {\r\n return v;\r\n }\r\n if (typeof v === 'string') {\r\n v = v.toLowerCase();\r\n return !(v === '' || v === 'no' || v === 'false' || v === '0');\r\n }\r\n return Boolean(v);\r\n }\r\n\r\n static toNumber(value: null | string): number {\r\n return (value === null || value.length === 0) ? undefined : Number(value);\r\n }\r\n\r\n static parseHeight(val: numberOrString): HeightData {\r\n let h: number;\r\n let unit = 'px';\r\n if (typeof val === 'string') {\r\n let match = val.match(/^(-[0-9]+\\.[0-9]+|[0-9]*\\.[0-9]+|-[0-9]+|[0-9]+)(px|em|rem|vh|vw|%)?$/);\r\n if (!match) {\r\n throw new Error('Invalid height');\r\n }\r\n unit = match[2] || 'px';\r\n h = parseFloat(match[1]);\r\n } else {\r\n h = val;\r\n }\r\n return { h, unit };\r\n }\r\n\r\n /** copies unset fields in target to use the given default sources values */\r\n // eslint-disable-next-line\r\n static defaults(target, ...sources): {} {\r\n\r\n sources.forEach(source => {\r\n for (const key in source) {\r\n if (!source.hasOwnProperty(key)) return;\r\n if (target[key] === null || target[key] === undefined) {\r\n target[key] = source[key];\r\n } else if (typeof source[key] === 'object' && typeof target[key] === 'object') {\r\n // property is an object, recursively add it's field over... #1373\r\n this.defaults(target[key], source[key]);\r\n }\r\n }\r\n });\r\n\r\n return target;\r\n }\r\n\r\n /** given 2 objects return true if they have the same values. Checks for Object {} having same fields and values (just 1 level down) */\r\n static same(a: unknown, b: unknown): boolean {\r\n if (typeof a !== 'object') return a == b;\r\n if (typeof a !== typeof b) return false;\r\n // else we have object, check just 1 level deep for being same things...\r\n if (Object.keys(a).length !== Object.keys(b).length) return false;\r\n for (const key in a) {\r\n if (a[key] !== b[key]) return false;\r\n }\r\n return true;\r\n }\r\n\r\n /* copies over b size & position (GridStackPosition), and possibly min/max as well */\r\n static copyPos(a: GridStackWidget, b: GridStackWidget, minMax = false): GridStackWidget {\r\n a.x = b.x;\r\n a.y = b.y;\r\n a.w = b.w;\r\n a.h = b.h;\r\n if (!minMax) return a;\r\n if (b.minW) a.minW = b.minW;\r\n if (b.minH) a.minH = b.minH;\r\n if (b.maxW) a.maxW = b.maxW;\r\n if (b.maxH) a.maxH = b.maxH;\r\n return a;\r\n }\r\n\r\n /* true if a and b has same size & position */\r\n static samePos(a: GridStackPosition, b: GridStackPosition): boolean {\r\n return a && b && a.x === b.x && a.y === b.y && a.w === b.w && a.h === b.h;\r\n }\r\n\r\n /** removes field from the first object if same as the second objects (like diffing) and internal '_' for saving */\r\n static removeInternalAndSame(a: unknown, b: unknown):void {\r\n if (typeof a !== 'object' || typeof b !== 'object') return;\r\n for (let key in a) {\r\n let val = a[key];\r\n if (key[0] === '_' || val === b[key]) {\r\n delete a[key]\r\n } else if (val && typeof val === 'object' && b[key] !== undefined) {\r\n for (let i in val) {\r\n if (val[i] === b[key][i] || i[0] === '_') { delete val[i] }\r\n }\r\n if (!Object.keys(val).length) { delete a[key] }\r\n }\r\n }\r\n }\r\n\r\n /** return the closest parent 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 for given delay, preventing new calls from happening while waiting */\r\n static throttle(func: () => void, delay: number): () => void {\r\n let isWaiting = false;\r\n return (...args) => {\r\n if (!isWaiting) {\r\n isWaiting = true;\r\n setTimeout(() => { func(...args); isWaiting = false; }, delay);\r\n }\r\n }\r\n }\r\n\r\n static removePositioningStyles(el: HTMLElement): void {\r\n let style = el.style;\r\n if (style.position) {\r\n style.removeProperty('position');\r\n }\r\n if (style.left) {\r\n style.removeProperty('left');\r\n }\r\n if (style.top) {\r\n style.removeProperty('top');\r\n }\r\n if (style.width) {\r\n style.removeProperty('width');\r\n }\r\n if (style.height) {\r\n style.removeProperty('height');\r\n }\r\n }\r\n\r\n /** @internal returns the passed element if scrollable, else the closest parent that will, up to the entire document scrolling element */\r\n static getScrollElement(el?: HTMLElement): HTMLElement {\r\n if (!el) return document.scrollingElement as HTMLElement;\r\n const style = getComputedStyle(el);\r\n const overflowRegex = /(auto|scroll)/;\r\n\r\n if (overflowRegex.test(style.overflow + style.overflowY)) {\r\n return el;\r\n } else {\r\n return this.getScrollElement(el.parentElement);\r\n }\r\n }\r\n\r\n /** @internal */\r\n static updateScrollPosition(el: HTMLElement, position: {top: number}, distance: number): void {\r\n // is widget in view?\r\n let rect = el.getBoundingClientRect();\r\n let innerHeightOrClientHeight = (window.innerHeight || document.documentElement.clientHeight);\r\n if (rect.top < 0 ||\r\n rect.bottom > innerHeightOrClientHeight\r\n ) {\r\n // set scrollTop of first parent that scrolls\r\n // if parent is larger than el, set as low as possible\r\n // to get entire widget on screen\r\n let offsetDiffDown = rect.bottom - innerHeightOrClientHeight;\r\n let offsetDiffUp = rect.top;\r\n let scrollEl = this.getScrollElement(el);\r\n if (scrollEl !== null) {\r\n let prevScroll = scrollEl.scrollTop;\r\n if (rect.top < 0 && distance < 0) {\r\n // moving up\r\n if (el.offsetHeight > innerHeightOrClientHeight) {\r\n scrollEl.scrollTop += distance;\r\n } else {\r\n scrollEl.scrollTop += Math.abs(offsetDiffUp) > Math.abs(distance) ? distance : offsetDiffUp;\r\n }\r\n } else if (distance > 0) {\r\n // moving down\r\n if (el.offsetHeight > innerHeightOrClientHeight) {\r\n scrollEl.scrollTop += distance;\r\n } else {\r\n scrollEl.scrollTop += offsetDiffDown > distance ? distance : offsetDiffDown;\r\n }\r\n }\r\n // move widget y by amount scrolled\r\n position.top += scrollEl.scrollTop - prevScroll;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * @internal Function used to scroll the page.\r\n *\r\n * @param event `MouseEvent` that triggers the resize\r\n * @param el `HTMLElement` that's being resized\r\n * @param distance Distance from the V edges to start scrolling\r\n */\r\n static updateScrollResize(event: MouseEvent, el: HTMLElement, distance: number): void {\r\n const scrollEl = this.getScrollElement(el);\r\n const height = scrollEl.clientHeight;\r\n // #1727 event.clientY is relative to viewport, so must compare this against position of scrollEl getBoundingClientRect().top\r\n // #1745 Special situation if scrollEl is document 'html': here browser spec states that\r\n // clientHeight is height of viewport, but getBoundingClientRect() is rectangle of html element;\r\n // this discrepancy arises because in reality scrollbar is attached to viewport, not html element itself.\r\n const offsetTop = (scrollEl === this.getScrollElement()) ? 0 : scrollEl.getBoundingClientRect().top;\r\n const pointerPosY = event.clientY - offsetTop;\r\n const top = pointerPosY < distance;\r\n const bottom = pointerPosY > height - distance;\r\n\r\n if (top) {\r\n // This also can be done with a timeout to keep scrolling while the mouse is\r\n // in the scrolling zone. (will have smoother behavior)\r\n scrollEl.scrollBy({ behavior: 'smooth', top: pointerPosY - distance});\r\n } else if (bottom) {\r\n scrollEl.scrollBy({ behavior: 'smooth', top: distance - (height - pointerPosY)});\r\n }\r\n }\r\n\r\n /** single level clone, returning a new object with same top fields. This will share sub objects and arrays */\r\n static clone<T>(obj: T): T {\r\n if (obj === null || obj === undefined || typeof(obj) !== 'object') {\r\n return obj;\r\n }\r\n // return Object.assign({}, obj);\r\n if (obj instanceof Array) {\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n return [...obj] as any;\r\n }\r\n return {...obj};\r\n }\r\n\r\n /**\r\n * Recursive clone version that returns a full copy, checking for nested objects and arrays ONLY.\r\n * Note: this will use as-is any key starting with double __ (and not copy inside) some lib have circular dependencies.\r\n */\r\n static cloneDeep<T>(obj: T): T {\r\n // return JSON.parse(JSON.stringify(obj)); // doesn't work with date format ?\r\n const ret = Utils.clone(obj);\r\n for (const key in ret) {\r\n // NOTE: we don't support function/circular dependencies so skip those properties for now...\r\n if (ret.hasOwnProperty(key) && typeof(ret[key]) === 'object' && key.substring(0, 2) !== '__') {\r\n ret[key] = Utils.cloneDeep(obj[key]);\r\n }\r\n }\r\n return ret;\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\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.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].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// startup\n// Load entry module and return exports\n// This entry module is referenced by other modules so it can't be inlined\nvar __webpack_exports__ = __webpack_require__(105);\n"],"sourceRoot":""}