{"version":3,"file":"gridstack-all.js","mappings":"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","sources":["webpack://GridStack/webpack/universalModuleDefinition","webpack://GridStack/./src/dd-base-impl.ts","webpack://GridStack/./src/dd-draggable.ts","webpack://GridStack/./src/dd-droppable.ts","webpack://GridStack/./src/dd-element.ts","webpack://GridStack/./src/dd-gridstack.ts","webpack://GridStack/./src/dd-manager.ts","webpack://GridStack/./src/dd-resizable-handle.ts","webpack://GridStack/./src/dd-resizable.ts","webpack://GridStack/./src/dd-touch.ts","webpack://GridStack/./src/gridstack-engine.ts","webpack://GridStack/./src/gridstack.ts","webpack://GridStack/./src/types.ts","webpack://GridStack/./src/utils.ts","webpack://GridStack/webpack/bootstrap","webpack://GridStack/webpack/startup"],"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 ","/**\n * dd-base-impl.ts 8.3.0\n * Copyright (c) 2021-2022 Alain Dumesny - see GridStack root license\n */\n\nexport type EventCallback = (event: Event) => boolean|void;\nexport abstract class DDBaseImplement {\n /** returns the enable state, but you have to call enable()/disable() to change (as other things need to happen) */\n public get disabled(): boolean { return this._disabled; }\n\n /** @internal */\n protected _disabled: boolean; // initial state to differentiate from false\n /** @internal */\n protected _eventRegister: {\n [eventName: string]: EventCallback;\n } = {};\n\n public on(event: string, callback: EventCallback): void {\n this._eventRegister[event] = callback;\n }\n\n public off(event: string): void {\n delete this._eventRegister[event];\n }\n\n public enable(): void {\n this._disabled = false;\n }\n\n public disable(): void {\n this._disabled = true;\n }\n\n public destroy(): void {\n delete this._eventRegister;\n }\n\n public triggerEvent(eventName: string, event: Event): boolean|void {\n if (!this.disabled && this._eventRegister && this._eventRegister[eventName])\n return this._eventRegister[eventName](event);\n }\n}\n\nexport interface HTMLElementExtendOpt {\n el: HTMLElement;\n option: T;\n updateOption(T): DDBaseImplement;\n}\n","/**\n * dd-draggable.ts 8.3.0\n * Copyright (c) 2021-2022 Alain Dumesny - see GridStack root license\n */\n\nimport { DDManager } from './dd-manager';\nimport { Utils } from './utils';\nimport { DDBaseImplement, HTMLElementExtendOpt } from './dd-base-impl';\nimport { GridItemHTMLElement, DDUIData } from './types';\nimport { DDElementHost } from './dd-element';\nimport { isTouch, touchend, touchmove, touchstart, pointerdown } from './dd-touch';\n\n// TODO: merge with DDDragOpt ?\nexport interface DDDraggableOpt {\n appendTo?: string | HTMLElement;\n handle?: string;\n helper?: 'clone' | HTMLElement | ((event: Event) => HTMLElement);\n cancel?: string;\n // containment?: string | HTMLElement; // TODO: not implemented yet\n // revert?: string | boolean | unknown; // TODO: not implemented yet\n // scroll?: boolean;\n start?: (event: Event, ui: DDUIData) => void;\n stop?: (event: Event) => void;\n drag?: (event: Event, ui: DDUIData) => void;\n}\n\ninterface DragOffset {\n left: number;\n top: number;\n width: number;\n height: number;\n offsetLeft: number;\n offsetTop: number;\n}\n\ntype DDDragEvent = 'drag' | 'dragstart' | 'dragstop';\n\n// make sure we are not clicking on known object that handles mouseDown\nconst skipMouseDown = 'input,textarea,button,select,option,[contenteditable=\"true\"],.ui-resizable-handle';\n\n// let count = 0; // TEST\n\nexport class DDDraggable extends DDBaseImplement implements HTMLElementExtendOpt {\n public el: HTMLElement;\n public option: DDDraggableOpt;\n public helper: HTMLElement; // used by GridStackDDNative\n\n /** @internal */\n protected mouseDownEvent: MouseEvent;\n /** @internal */\n protected dragOffset: DragOffset;\n /** @internal */\n protected dragElementOriginStyle: Array;\n /** @internal */\n protected dragEl: HTMLElement;\n /** @internal true while we are dragging an item around */\n protected dragging: boolean;\n /** @internal */\n protected parentOriginStylePosition: string;\n /** @internal */\n protected helperContainment: HTMLElement;\n /** @internal properties we change during dragging, and restore back */\n protected static originStyleProp = ['transition', 'pointerEvents', 'position', 'left', 'top', 'minWidth', 'willChange'];\n /** @internal pause before we call the actual drag hit collision code */\n protected dragTimeout: number;\n\n constructor(el: HTMLElement, option: DDDraggableOpt = {}) {\n super();\n this.el = el;\n this.option = option;\n\n // get the element that is actually supposed to be dragged by\n let handleName = option.handle.substring(1);\n this.dragEl = el.classList.contains(handleName) ? el : el.querySelector(option.handle) || el;\n // create var event binding so we can easily remove and still look like TS methods (unlike anonymous functions)\n this._mouseDown = this._mouseDown.bind(this);\n this._mouseMove = this._mouseMove.bind(this);\n this._mouseUp = this._mouseUp.bind(this);\n this.enable();\n }\n\n public on(event: DDDragEvent, callback: (event: DragEvent) => void): void {\n super.on(event, callback);\n }\n\n public off(event: DDDragEvent): void {\n super.off(event);\n }\n\n public enable(): void {\n if (this.disabled === false) return;\n super.enable();\n this.dragEl.addEventListener('mousedown', this._mouseDown);\n if (isTouch) {\n this.dragEl.addEventListener('touchstart', touchstart);\n this.dragEl.addEventListener('pointerdown', pointerdown);\n // this.dragEl.style.touchAction = 'none'; // not needed unlike pointerdown doc comment\n }\n this.el.classList.remove('ui-draggable-disabled');\n }\n\n public disable(forDestroy = false): void {\n if (this.disabled === true) return;\n super.disable();\n this.dragEl.removeEventListener('mousedown', this._mouseDown);\n if (isTouch) {\n this.dragEl.removeEventListener('touchstart', touchstart);\n this.dragEl.removeEventListener('pointerdown', pointerdown);\n }\n if (!forDestroy) this.el.classList.add('ui-draggable-disabled');\n }\n\n public destroy(): void {\n if (this.dragTimeout) window.clearTimeout(this.dragTimeout);\n delete this.dragTimeout;\n if (this.dragging) this._mouseUp(this.mouseDownEvent);\n this.disable(true);\n delete this.el;\n delete this.helper;\n delete this.option;\n super.destroy();\n }\n\n public updateOption(opts: DDDraggableOpt): DDDraggable {\n Object.keys(opts).forEach(key => this.option[key] = opts[key]);\n return this;\n }\n\n /** @internal call when mouse goes down before a dragstart happens */\n protected _mouseDown(e: MouseEvent): boolean {\n // don't let more than one widget handle mouseStart\n if (DDManager.mouseHandled) return;\n if (e.button !== 0) return true; // only left click\n\n // make sure we are not clicking on known object that handles mouseDown, or ones supplied by the user\n if ((e.target as HTMLElement).closest(skipMouseDown)) return true;\n if (this.option.cancel) {\n if ((e.target as HTMLElement).closest(this.option.cancel)) return true;\n }\n\n // REMOVE: why would we get the event if it wasn't for us or child ?\n // make sure we are clicking on a drag handle or child of it...\n // Note: we don't need to check that's handle is an immediate child, as mouseHandled will prevent parents from also handling it (lowest wins)\n // let className = this.option.handle.substring(1);\n // let el = e.target as HTMLElement;\n // while (el && !el.classList.contains(className)) { el = el.parentElement; }\n // if (!el) return;\n\n this.mouseDownEvent = e;\n delete this.dragging;\n delete DDManager.dragElement;\n delete DDManager.dropElement;\n // document handler so we can continue receiving moves as the item is 'fixed' position, and capture=true so WE get a first crack\n document.addEventListener('mousemove', this._mouseMove, true); // true=capture, not bubble\n document.addEventListener('mouseup', this._mouseUp, true);\n if (isTouch) {\n this.dragEl.addEventListener('touchmove', touchmove);\n this.dragEl.addEventListener('touchend', touchend);\n }\n\n e.preventDefault();\n // preventDefault() prevents blur event which occurs just after mousedown event.\n // if an editable content has focus, then blur must be call\n if (document.activeElement) (document.activeElement as HTMLElement).blur();\n\n DDManager.mouseHandled = true;\n return true;\n }\n\n /** @internal method to call actual drag event */\n protected _callDrag(e: DragEvent): void {\n if (!this.dragging) return;\n const ev = Utils.initEvent(e, { target: this.el, type: 'drag' });\n if (this.option.drag) {\n this.option.drag(ev, this.ui());\n }\n this.triggerEvent('drag', ev);\n }\n\n /** @internal called when the main page (after successful mousedown) receives a move event to drag the item around the screen */\n protected _mouseMove(e: DragEvent): boolean {\n // console.log(`${count++} move ${e.x},${e.y}`)\n let s = this.mouseDownEvent;\n\n if (this.dragging) {\n this._dragFollow(e);\n // delay actual grid handling drag until we pause for a while if set\n if (DDManager.pauseDrag) {\n const pause = Number.isInteger(DDManager.pauseDrag) ? DDManager.pauseDrag as number : 100;\n if (this.dragTimeout) window.clearTimeout(this.dragTimeout);\n this.dragTimeout = window.setTimeout(() => this._callDrag(e), pause);\n } else {\n this._callDrag(e);\n }\n } else if (Math.abs(e.x - s.x) + Math.abs(e.y - s.y) > 3) {\n /**\n * don't start unless we've moved at least 3 pixels\n */\n this.dragging = true;\n DDManager.dragElement = this;\n // if we're dragging an actual grid item, set the current drop as the grid (to detect enter/leave)\n let grid = (this.el as GridItemHTMLElement).gridstackNode?.grid;\n if (grid) {\n DDManager.dropElement = (grid.el as DDElementHost).ddElement.ddDroppable;\n } else {\n delete DDManager.dropElement;\n }\n this.helper = this._createHelper(e);\n this._setupHelperContainmentStyle();\n this.dragOffset = this._getDragOffset(e, this.el, this.helperContainment);\n const ev = Utils.initEvent(e, { target: this.el, type: 'dragstart' });\n\n this._setupHelperStyle(e);\n if (this.option.start) {\n this.option.start(ev, this.ui());\n }\n this.triggerEvent('dragstart', ev);\n }\n e.preventDefault(); // needed otherwise we get text sweep text selection as we drag around\n return true;\n }\n\n /** @internal call when the mouse gets released to drop the item at current location */\n protected _mouseUp(e: MouseEvent): void {\n document.removeEventListener('mousemove', this._mouseMove, true);\n document.removeEventListener('mouseup', this._mouseUp, true);\n if (isTouch) {\n this.dragEl.removeEventListener('touchmove', touchmove, true);\n this.dragEl.removeEventListener('touchend', touchend, true);\n }\n if (this.dragging) {\n delete this.dragging;\n\n // reset the drop target if dragging over ourself (already parented, just moving during stop callback below)\n if (DDManager.dropElement?.el === this.el.parentElement) {\n delete DDManager.dropElement;\n }\n\n this.helperContainment.style.position = this.parentOriginStylePosition || null;\n if (this.helper === this.el) {\n this._removeHelperStyle();\n } else {\n this.helper.remove();\n }\n const ev = Utils.initEvent(e, { target: this.el, type: 'dragstop' });\n if (this.option.stop) {\n this.option.stop(ev); // NOTE: destroy() will be called when removing item, so expect NULL ptr after!\n }\n this.triggerEvent('dragstop', ev);\n\n // call the droppable method to receive the item\n if (DDManager.dropElement) {\n DDManager.dropElement.drop(e);\n }\n }\n delete this.helper;\n delete this.mouseDownEvent;\n delete DDManager.dragElement;\n delete DDManager.dropElement;\n delete DDManager.mouseHandled;\n e.preventDefault();\n }\n\n /** @internal create a clone copy (or user defined method) of the original drag item if set */\n protected _createHelper(event: DragEvent): HTMLElement {\n let helper = this.el;\n if (typeof this.option.helper === 'function') {\n helper = this.option.helper(event);\n } else if (this.option.helper === 'clone') {\n helper = Utils.cloneNode(this.el);\n }\n if (!document.body.contains(helper)) {\n Utils.appendTo(helper, this.option.appendTo === 'parent' ? this.el.parentElement : this.option.appendTo);\n }\n if (helper === this.el) {\n this.dragElementOriginStyle = DDDraggable.originStyleProp.map(prop => this.el.style[prop]);\n }\n return helper;\n }\n\n /** @internal set the fix position of the dragged item */\n protected _setupHelperStyle(e: DragEvent): DDDraggable {\n this.helper.classList.add('ui-draggable-dragging');\n // TODO: set all at once with style.cssText += ... ? https://stackoverflow.com/questions/3968593\n const style = this.helper.style;\n style.pointerEvents = 'none'; // needed for over items to get enter/leave\n // style.cursor = 'move'; // TODO: can't set with pointerEvents=none ! (done in CSS as well)\n style.width = this.dragOffset.width + 'px';\n style.height = this.dragOffset.height + 'px';\n style.willChange = 'left, top';\n style.position = 'fixed'; // let us drag between grids by not clipping as parent .grid-stack is position: 'relative'\n this._dragFollow(e); // now position it\n style.transition = 'none'; // show up instantly\n setTimeout(() => {\n if (this.helper) {\n style.transition = null; // recover animation\n }\n }, 0);\n return this;\n }\n\n /** @internal restore back the original style before dragging */\n protected _removeHelperStyle(): DDDraggable {\n this.helper.classList.remove('ui-draggable-dragging');\n let node = (this.helper as GridItemHTMLElement)?.gridstackNode;\n // don't bother restoring styles if we're gonna remove anyway...\n if (!node?._isAboutToRemove && this.dragElementOriginStyle) {\n let helper = this.helper;\n // don't animate, otherwise we animate offseted when switching back to 'absolute' from 'fixed'.\n // TODO: this also removes resizing animation which doesn't have this issue, but others.\n // Ideally both would animate ('move' would immediately restore 'absolute' and adjust coordinate to match,\n // then trigger a delay (repaint) to restore to final dest with animate) but then we need to make sure 'resizestop'\n // is called AFTER 'transitionend' event is received (see https://github.com/gridstack/gridstack.js/issues/2033)\n let transition = this.dragElementOriginStyle['transition'] || null;\n helper.style.transition = this.dragElementOriginStyle['transition'] = 'none'; // can't be NULL #1973\n DDDraggable.originStyleProp.forEach(prop => helper.style[prop] = this.dragElementOriginStyle[prop] || null);\n setTimeout(() => helper.style.transition = transition, 50); // recover animation from saved vars after a pause (0 isn't enough #1973)\n }\n delete this.dragElementOriginStyle;\n return this;\n }\n\n /** @internal updates the top/left position to follow the mouse */\n protected _dragFollow(e: DragEvent): void {\n let containmentRect = { left: 0, top: 0 };\n // if (this.helper.style.position === 'absolute') { // we use 'fixed'\n // const { left, top } = this.helperContainment.getBoundingClientRect();\n // containmentRect = { left, top };\n // }\n const style = this.helper.style;\n const offset = this.dragOffset;\n style.left = e.clientX + offset.offsetLeft - containmentRect.left + 'px';\n style.top = e.clientY + offset.offsetTop - containmentRect.top + 'px';\n }\n\n /** @internal */\n protected _setupHelperContainmentStyle(): DDDraggable {\n this.helperContainment = this.helper.parentElement;\n if (this.helper.style.position !== 'fixed') {\n this.parentOriginStylePosition = this.helperContainment.style.position;\n if (window.getComputedStyle(this.helperContainment).position.match(/static/)) {\n this.helperContainment.style.position = 'relative';\n }\n }\n return this;\n }\n\n /** @internal */\n protected _getDragOffset(event: DragEvent, el: HTMLElement, parent: HTMLElement): DragOffset {\n\n // in case ancestor has transform/perspective css properties that change the viewpoint\n let xformOffsetX = 0;\n let xformOffsetY = 0;\n if (parent) {\n const testEl = document.createElement('div');\n Utils.addElStyles(testEl, {\n opacity: '0',\n position: 'fixed',\n top: 0 + 'px',\n left: 0 + 'px',\n width: '1px',\n height: '1px',\n zIndex: '-999999',\n });\n parent.appendChild(testEl);\n const testElPosition = testEl.getBoundingClientRect();\n parent.removeChild(testEl);\n xformOffsetX = testElPosition.left;\n xformOffsetY = testElPosition.top;\n // TODO: scale ?\n }\n\n const targetOffset = el.getBoundingClientRect();\n return {\n left: targetOffset.left,\n top: targetOffset.top,\n offsetLeft: - event.clientX + targetOffset.left - xformOffsetX,\n offsetTop: - event.clientY + targetOffset.top - xformOffsetY,\n width: targetOffset.width,\n height: targetOffset.height\n };\n }\n\n /** @internal TODO: set to public as called by DDDroppable! */\n public ui(): DDUIData {\n const containmentEl = this.el.parentElement;\n const containmentRect = containmentEl.getBoundingClientRect();\n const offset = this.helper.getBoundingClientRect();\n return {\n position: { //Current CSS position of the helper as { top, left } object\n top: offset.top - containmentRect.top,\n left: offset.left - containmentRect.left\n }\n /* not used by GridStack for now...\n helper: [this.helper], //The object arr representing the helper that's being dragged.\n offset: { top: offset.top, left: offset.left } // Current offset position of the helper as { top, left } object.\n */\n };\n }\n}\n","/**\n * dd-droppable.ts 8.3.0\n * Copyright (c) 2021-2022 Alain Dumesny - see GridStack root license\n */\n\nimport { DDDraggable } from './dd-draggable';\nimport { DDManager } from './dd-manager';\nimport { DDBaseImplement, HTMLElementExtendOpt } from './dd-base-impl';\nimport { Utils } from './utils';\nimport { DDElementHost } from './dd-element';\nimport { isTouch, pointerenter, pointerleave } from './dd-touch';\nimport { DDUIData } from './types';\n\nexport interface DDDroppableOpt {\n accept?: string | ((el: HTMLElement) => boolean);\n drop?: (event: DragEvent, ui: DDUIData) => void;\n over?: (event: DragEvent, ui: DDUIData) => void;\n out?: (event: DragEvent, ui: DDUIData) => void;\n}\n\n// let count = 0; // TEST\n\nexport class DDDroppable extends DDBaseImplement implements HTMLElementExtendOpt {\n\n public accept: (el: HTMLElement) => boolean;\n public el: HTMLElement;\n public option: DDDroppableOpt;\n\n constructor(el: HTMLElement, opts: DDDroppableOpt = {}) {\n super();\n this.el = el;\n this.option = opts;\n // create var event binding so we can easily remove and still look like TS methods (unlike anonymous functions)\n this._mouseEnter = this._mouseEnter.bind(this);\n this._mouseLeave = this._mouseLeave.bind(this);\n this.enable();\n this._setupAccept();\n }\n\n public on(event: 'drop' | 'dropover' | 'dropout', callback: (event: DragEvent) => void): void {\n super.on(event, callback);\n }\n\n public off(event: 'drop' | 'dropover' | 'dropout'): void {\n super.off(event);\n }\n\n public enable(): void {\n if (this.disabled === false) return;\n super.enable();\n this.el.classList.add('ui-droppable');\n this.el.classList.remove('ui-droppable-disabled');\n this.el.addEventListener('mouseenter', this._mouseEnter);\n this.el.addEventListener('mouseleave', this._mouseLeave);\n if (isTouch) {\n this.el.addEventListener('pointerenter', pointerenter);\n this.el.addEventListener('pointerleave', pointerleave);\n }\n }\n\n public disable(forDestroy = false): void {\n if (this.disabled === true) return;\n super.disable();\n this.el.classList.remove('ui-droppable');\n if (!forDestroy) this.el.classList.add('ui-droppable-disabled');\n this.el.removeEventListener('mouseenter', this._mouseEnter);\n this.el.removeEventListener('mouseleave', this._mouseLeave);\n if (isTouch) {\n this.el.removeEventListener('pointerenter', pointerenter);\n this.el.removeEventListener('pointerleave', pointerleave);\n }\n }\n\n public destroy(): void {\n this.disable(true);\n this.el.classList.remove('ui-droppable');\n this.el.classList.remove('ui-droppable-disabled');\n super.destroy();\n }\n\n public updateOption(opts: DDDroppableOpt): DDDroppable {\n Object.keys(opts).forEach(key => this.option[key] = opts[key]);\n this._setupAccept();\n return this;\n }\n\n /** @internal called when the cursor enters our area - prepare for a possible drop and track leaving */\n protected _mouseEnter(e: MouseEvent): void {\n // console.log(`${count++} Enter ${this.el.id || (this.el as GridHTMLElement).gridstack.opts.id}`); // TEST\n if (!DDManager.dragElement) return;\n if (!this._canDrop(DDManager.dragElement.el)) return;\n e.preventDefault();\n e.stopPropagation();\n\n // make sure when we enter this, that the last one gets a leave FIRST to correctly cleanup as we don't always do\n if (DDManager.dropElement && DDManager.dropElement !== this) {\n DDManager.dropElement._mouseLeave(e as DragEvent);\n }\n DDManager.dropElement = this;\n\n const ev = Utils.initEvent(e, { target: this.el, type: 'dropover' });\n if (this.option.over) {\n this.option.over(ev, this._ui(DDManager.dragElement))\n }\n this.triggerEvent('dropover', ev);\n this.el.classList.add('ui-droppable-over');\n // console.log('tracking'); // TEST\n }\n\n /** @internal called when the item is leaving our area, stop tracking if we had moving item */\n protected _mouseLeave(e: MouseEvent): void {\n // console.log(`${count++} Leave ${this.el.id || (this.el as GridHTMLElement).gridstack.opts.id}`); // TEST\n if (!DDManager.dragElement || DDManager.dropElement !== this) return;\n e.preventDefault();\n e.stopPropagation();\n\n const ev = Utils.initEvent(e, { target: this.el, type: 'dropout' });\n if (this.option.out) {\n this.option.out(ev, this._ui(DDManager.dragElement))\n }\n this.triggerEvent('dropout', ev);\n\n if (DDManager.dropElement === this) {\n delete DDManager.dropElement;\n // console.log('not tracking'); // TEST\n\n // if we're still over a parent droppable, send it an enter as we don't get one from leaving nested children\n let parentDrop: DDDroppable;\n let parent: DDElementHost = this.el.parentElement;\n while (!parentDrop && parent) {\n parentDrop = parent.ddElement?.ddDroppable;\n parent = parent.parentElement;\n }\n if (parentDrop) {\n parentDrop._mouseEnter(e);\n }\n }\n }\n\n /** item is being dropped on us - called by the drag mouseup handler - this calls the client drop event */\n public drop(e: MouseEvent): void {\n e.preventDefault();\n const ev = Utils.initEvent(e, { target: this.el, type: 'drop' });\n if (this.option.drop) {\n this.option.drop(ev, this._ui(DDManager.dragElement))\n }\n this.triggerEvent('drop', ev);\n }\n\n /** @internal true if element matches the string/method accept option */\n protected _canDrop(el: HTMLElement): boolean {\n return el && (!this.accept || this.accept(el));\n }\n\n /** @internal */\n protected _setupAccept(): DDDroppable {\n if (!this.option.accept) return this;\n if (typeof this.option.accept === 'string') {\n this.accept = (el: HTMLElement) => el.matches(this.option.accept as string);\n } else {\n this.accept = this.option.accept;\n }\n return this;\n }\n\n /** @internal */\n protected _ui(drag: DDDraggable): DDUIData {\n return {\n draggable: drag.el,\n ...drag.ui()\n };\n }\n}\n\n","/**\n * dd-elements.ts 8.3.0\n * Copyright (c) 2021 Alain Dumesny - see GridStack root license\n */\n\nimport { DDResizable, DDResizableOpt } from './dd-resizable';\nimport { GridItemHTMLElement } from './types';\nimport { DDDraggable, DDDraggableOpt } from './dd-draggable';\nimport { DDDroppable, DDDroppableOpt } from './dd-droppable';\n\nexport interface DDElementHost extends GridItemHTMLElement {\n ddElement?: DDElement;\n}\n\nexport class DDElement {\n\n static init(el: DDElementHost): DDElement {\n if (!el.ddElement) { el.ddElement = new DDElement(el); }\n return el.ddElement;\n }\n\n public el: DDElementHost;\n public ddDraggable?: DDDraggable;\n public ddDroppable?: DDDroppable;\n public ddResizable?: DDResizable;\n\n constructor(el: DDElementHost) {\n this.el = el;\n }\n\n public on(eventName: string, callback: (event: MouseEvent) => void): DDElement {\n if (this.ddDraggable && ['drag', 'dragstart', 'dragstop'].indexOf(eventName) > -1) {\n this.ddDraggable.on(eventName as 'drag' | 'dragstart' | 'dragstop', callback);\n } else if (this.ddDroppable && ['drop', 'dropover', 'dropout'].indexOf(eventName) > -1) {\n this.ddDroppable.on(eventName as 'drop' | 'dropover' | 'dropout', callback);\n } else if (this.ddResizable && ['resizestart', 'resize', 'resizestop'].indexOf(eventName) > -1) {\n this.ddResizable.on(eventName as 'resizestart' | 'resize' | 'resizestop', callback);\n }\n return this;\n }\n\n public off(eventName: string): DDElement {\n if (this.ddDraggable && ['drag', 'dragstart', 'dragstop'].indexOf(eventName) > -1) {\n this.ddDraggable.off(eventName as 'drag' | 'dragstart' | 'dragstop');\n } else if (this.ddDroppable && ['drop', 'dropover', 'dropout'].indexOf(eventName) > -1) {\n this.ddDroppable.off(eventName as 'drop' | 'dropover' | 'dropout');\n } else if (this.ddResizable && ['resizestart', 'resize', 'resizestop'].indexOf(eventName) > -1) {\n this.ddResizable.off(eventName as 'resizestart' | 'resize' | 'resizestop');\n }\n return this;\n }\n\n public setupDraggable(opts: DDDraggableOpt): DDElement {\n if (!this.ddDraggable) {\n this.ddDraggable = new DDDraggable(this.el, opts);\n } else {\n this.ddDraggable.updateOption(opts);\n }\n return this;\n }\n\n public cleanDraggable(): DDElement {\n if (this.ddDraggable) {\n this.ddDraggable.destroy();\n delete this.ddDraggable;\n }\n return this;\n }\n\n public setupResizable(opts: DDResizableOpt): DDElement {\n if (!this.ddResizable) {\n this.ddResizable = new DDResizable(this.el, opts);\n } else {\n this.ddResizable.updateOption(opts);\n }\n return this;\n }\n\n public cleanResizable(): DDElement {\n if (this.ddResizable) {\n this.ddResizable.destroy();\n delete this.ddResizable;\n }\n return this;\n }\n\n public setupDroppable(opts: DDDroppableOpt): DDElement {\n if (!this.ddDroppable) {\n this.ddDroppable = new DDDroppable(this.el, opts);\n } else {\n this.ddDroppable.updateOption(opts);\n }\n return this;\n }\n\n public cleanDroppable(): DDElement {\n if (this.ddDroppable) {\n this.ddDroppable.destroy();\n delete this.ddDroppable;\n }\n return this;\n }\n}\n","/**\r\n * dd-gridstack.ts 8.3.0\r\n * Copyright (c) 2021 Alain Dumesny - see GridStack root license\r\n */\r\n\r\n/* eslint-disable @typescript-eslint/no-unused-vars */\r\nimport { GridItemHTMLElement, GridStackElement, DDDragInOpt } from './types';\r\nimport { Utils } from './utils';\r\nimport { DDManager } from './dd-manager';\r\nimport { DDElement, DDElementHost } from './dd-element';\r\n\r\n/** Drag&Drop drop options */\r\nexport type DDDropOpt = {\r\n /** function or class type that this grid will accept as dropped items (see GridStackOptions.acceptWidgets) */\r\n accept?: (el: GridItemHTMLElement) => boolean;\r\n}\r\n\r\n/** drag&drop options currently called from the main code, but others can be passed in grid options */\r\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\r\nexport type DDOpts = 'enable' | 'disable' | 'destroy' | 'option' | string | any;\r\nexport type DDKey = 'minWidth' | 'minHeight' | 'maxWidth' | 'maxHeight';\r\nexport type DDValue = number | string;\r\n\r\n/** drag&drop events callbacks */\r\nexport type DDCallback = (event: Event, arg2: GridItemHTMLElement, helper?: GridItemHTMLElement) => void;\r\n\r\n// let count = 0; // TEST\r\n\r\n/**\r\n * HTML Native Mouse and Touch Events Drag and Drop functionality.\r\n */\r\nexport class DDGridStack {\r\n\r\n public resizable(el: GridItemHTMLElement, opts: DDOpts, key?: DDKey, value?: DDValue): DDGridStack {\r\n this._getDDElements(el).forEach(dEl => {\r\n if (opts === 'disable' || opts === 'enable') {\r\n dEl.ddResizable && dEl.ddResizable[opts](); // can't create DD as it requires options for setupResizable()\r\n } else if (opts === 'destroy') {\r\n dEl.ddResizable && dEl.cleanResizable();\r\n } else if (opts === 'option') {\r\n dEl.setupResizable({ [key]: value });\r\n } else {\r\n const grid = dEl.el.gridstackNode.grid;\r\n let handles = dEl.el.getAttribute('gs-resize-handles') ? dEl.el.getAttribute('gs-resize-handles') : grid.opts.resizable.handles;\r\n let autoHide = !grid.opts.alwaysShowResizeHandle;\r\n dEl.setupResizable({\r\n ...grid.opts.resizable,\r\n ...{ handles, autoHide },\r\n ...{\r\n start: opts.start,\r\n stop: opts.stop,\r\n resize: opts.resize\r\n }\r\n });\r\n }\r\n });\r\n return this;\r\n }\r\n\r\n public draggable(el: GridItemHTMLElement, opts: DDOpts, key?: DDKey, value?: DDValue): DDGridStack {\r\n this._getDDElements(el).forEach(dEl => {\r\n if (opts === 'disable' || opts === 'enable') {\r\n dEl.ddDraggable && dEl.ddDraggable[opts](); // can't create DD as it requires options for setupDraggable()\r\n } else if (opts === 'destroy') {\r\n dEl.ddDraggable && dEl.cleanDraggable();\r\n } else if (opts === 'option') {\r\n dEl.setupDraggable({ [key]: value });\r\n } else {\r\n const grid = dEl.el.gridstackNode.grid;\r\n dEl.setupDraggable({\r\n ...grid.opts.draggable,\r\n ...{\r\n // containment: (grid.parentGridItem && !grid.opts.dragOut) ? grid.el.parentElement : (grid.opts.draggable.containment || null),\r\n start: opts.start,\r\n stop: opts.stop,\r\n drag: opts.drag\r\n }\r\n });\r\n }\r\n });\r\n return this;\r\n }\r\n\r\n public dragIn(el: GridStackElement, opts: DDDragInOpt): DDGridStack {\r\n this._getDDElements(el).forEach(dEl => dEl.setupDraggable(opts));\r\n return this;\r\n }\r\n\r\n public droppable(el: GridItemHTMLElement, opts: DDOpts | DDDropOpt, key?: DDKey, value?: DDValue): DDGridStack {\r\n if (typeof opts.accept === 'function' && !opts._accept) {\r\n opts._accept = opts.accept;\r\n opts.accept = (el) => opts._accept(el);\r\n }\r\n this._getDDElements(el).forEach(dEl => {\r\n if (opts === 'disable' || opts === 'enable') {\r\n dEl.ddDroppable && dEl.ddDroppable[opts]();\r\n } else if (opts === 'destroy') {\r\n if (dEl.ddDroppable) { // error to call destroy if not there\r\n dEl.cleanDroppable();\r\n }\r\n } else if (opts === 'option') {\r\n dEl.setupDroppable({ [key]: value });\r\n } else {\r\n dEl.setupDroppable(opts);\r\n }\r\n });\r\n return this;\r\n }\r\n\r\n /** true if element is droppable */\r\n public isDroppable(el: DDElementHost): boolean {\r\n return !!(el && el.ddElement && el.ddElement.ddDroppable && !el.ddElement.ddDroppable.disabled);\r\n }\r\n\r\n /** true if element is draggable */\r\n public isDraggable(el: DDElementHost): boolean {\r\n return !!(el && el.ddElement && el.ddElement.ddDraggable && !el.ddElement.ddDraggable.disabled);\r\n }\r\n\r\n /** true if element is draggable */\r\n public isResizable(el: DDElementHost): boolean {\r\n return !!(el && el.ddElement && el.ddElement.ddResizable && !el.ddElement.ddResizable.disabled);\r\n }\r\n\r\n public on(el: GridItemHTMLElement, name: string, callback: DDCallback): DDGridStack {\r\n this._getDDElements(el).forEach(dEl =>\r\n dEl.on(name, (event: Event) => {\r\n callback(\r\n event,\r\n DDManager.dragElement ? DDManager.dragElement.el : event.target as GridItemHTMLElement,\r\n DDManager.dragElement ? DDManager.dragElement.helper : null)\r\n })\r\n );\r\n return this;\r\n }\r\n\r\n public off(el: GridItemHTMLElement, name: string): DDGridStack {\r\n this._getDDElements(el).forEach(dEl => dEl.off(name));\r\n return this;\r\n }\r\n\r\n /** @internal returns a list of DD elements, creating them on the fly by default */\r\n protected _getDDElements(els: GridStackElement, create = true): DDElement[] {\r\n let hosts = Utils.getElements(els) as DDElementHost[];\r\n if (!hosts.length) return [];\r\n let list = hosts.map(e => e.ddElement || (create ? DDElement.init(e) : null));\r\n if (!create) { list.filter(d => d); } // remove nulls\r\n return list;\r\n }\r\n}\r\n","/**\n * dd-manager.ts 8.3.0\n * Copyright (c) 2021 Alain Dumesny - see GridStack root license\n */\n\nimport { DDDraggable } from './dd-draggable';\nimport { DDDroppable } from './dd-droppable';\nimport { DDResizable } from './dd-resizable';\n\n/**\n * globals that are shared across Drag & Drop instances\n */\nexport class DDManager {\n /** if set (true | in msec), dragging placement (collision) will only happen after a pause by the user*/\n public static pauseDrag: boolean | number;\n\n /** true if a mouse down event was handled */\n public static mouseHandled: boolean;\n\n /** item being dragged */\n public static dragElement: DDDraggable;\n\n /** item we are currently over as drop target */\n public static dropElement: DDDroppable;\n\n /** current item we're over for resizing purpose (ignore nested grid resize handles) */\n public static overResizeElement: DDResizable;\n\n}\n","/**\n * dd-resizable-handle.ts 8.3.0\n * Copyright (c) 2021-2022 Alain Dumesny - see GridStack root license\n */\n\nimport { isTouch, pointerdown, touchend, touchmove, touchstart } from './dd-touch';\n\nexport interface DDResizableHandleOpt {\n start?: (event) => void;\n move?: (event) => void;\n stop?: (event) => void;\n}\n\nexport class DDResizableHandle {\n /** @internal */\n protected el: HTMLElement;\n /** @internal */\n protected host: HTMLElement;\n /** @internal */\n protected option: DDResizableHandleOpt;\n /** @internal */\n protected dir: string;\n /** @internal true after we've moved enough pixels to start a resize */\n protected moving = false;\n /** @internal */\n protected mouseDownEvent: MouseEvent;\n /** @internal */\n protected static prefix = 'ui-resizable-';\n\n constructor(host: HTMLElement, direction: string, option: DDResizableHandleOpt) {\n this.host = host;\n this.dir = direction;\n this.option = option;\n // create var event binding so we can easily remove and still look like TS methods (unlike anonymous functions)\n this._mouseDown = this._mouseDown.bind(this);\n this._mouseMove = this._mouseMove.bind(this);\n this._mouseUp = this._mouseUp.bind(this);\n\n this._init();\n }\n\n /** @internal */\n protected _init(): DDResizableHandle {\n const el = document.createElement('div');\n el.classList.add('ui-resizable-handle');\n el.classList.add(`${DDResizableHandle.prefix}${this.dir}`);\n el.style.zIndex = '100';\n el.style.userSelect = 'none';\n this.el = el;\n this.host.appendChild(this.el);\n this.el.addEventListener('mousedown', this._mouseDown);\n if (isTouch) {\n this.el.addEventListener('touchstart', touchstart);\n this.el.addEventListener('pointerdown', pointerdown);\n // this.el.style.touchAction = 'none'; // not needed unlike pointerdown doc comment\n }\n return this;\n }\n\n /** call this when resize handle needs to be removed and cleaned up */\n public destroy(): DDResizableHandle {\n if (this.moving) this._mouseUp(this.mouseDownEvent);\n this.el.removeEventListener('mousedown', this._mouseDown);\n if (isTouch) {\n this.el.removeEventListener('touchstart', touchstart);\n this.el.removeEventListener('pointerdown', pointerdown);\n }\n this.host.removeChild(this.el);\n delete this.el;\n delete this.host;\n return this;\n }\n\n /** @internal called on mouse down on us: capture move on the entire document (mouse might not stay on us) until we release the mouse */\n protected _mouseDown(e: MouseEvent): void {\n this.mouseDownEvent = e;\n document.addEventListener('mousemove', this._mouseMove, true); // capture, not bubble\n document.addEventListener('mouseup', this._mouseUp, true);\n if (isTouch) {\n this.el.addEventListener('touchmove', touchmove);\n this.el.addEventListener('touchend', touchend);\n }\n e.stopPropagation();\n e.preventDefault();\n }\n\n /** @internal */\n protected _mouseMove(e: MouseEvent): void {\n let s = this.mouseDownEvent;\n if (this.moving) {\n this._triggerEvent('move', e);\n } else if (Math.abs(e.x - s.x) + Math.abs(e.y - s.y) > 2) {\n // don't start unless we've moved at least 3 pixels\n this.moving = true;\n this._triggerEvent('start', this.mouseDownEvent);\n this._triggerEvent('move', e);\n }\n e.stopPropagation();\n e.preventDefault();\n }\n\n /** @internal */\n protected _mouseUp(e: MouseEvent): void {\n if (this.moving) {\n this._triggerEvent('stop', e);\n }\n document.removeEventListener('mousemove', this._mouseMove, true);\n document.removeEventListener('mouseup', this._mouseUp, true);\n if (isTouch) {\n this.el.removeEventListener('touchmove', touchmove);\n this.el.removeEventListener('touchend', touchend);\n }\n delete this.moving;\n delete this.mouseDownEvent;\n e.stopPropagation();\n e.preventDefault();\n }\n\n /** @internal */\n protected _triggerEvent(name: string, event: MouseEvent): DDResizableHandle {\n if (this.option[name]) this.option[name](event);\n return this;\n }\n}\n","/**\n * dd-resizable.ts 8.3.0\n * Copyright (c) 2021-2022 Alain Dumesny - see GridStack root license\n */\n\nimport { DDResizableHandle } from './dd-resizable-handle';\nimport { DDBaseImplement, HTMLElementExtendOpt } from './dd-base-impl';\nimport { Utils } from './utils';\nimport { DDUIData, Rect, Size } from './types';\nimport { DDManager } from './dd-manager';\n\n// import { GridItemHTMLElement } from './types'; let count = 0; // TEST\n\n// TODO: merge with DDDragOpt\nexport interface DDResizableOpt {\n autoHide?: boolean;\n handles?: string;\n maxHeight?: number;\n maxWidth?: number;\n minHeight?: number;\n minWidth?: number;\n start?: (event: Event, ui: DDUIData) => void;\n stop?: (event: Event) => void;\n resize?: (event: Event, ui: DDUIData) => void;\n}\n\nexport class DDResizable extends DDBaseImplement implements HTMLElementExtendOpt {\n\n // have to be public else complains for HTMLElementExtendOpt ?\n public el: HTMLElement;\n public option: DDResizableOpt;\n\n /** @internal */\n protected handlers: DDResizableHandle[];\n /** @internal */\n protected originalRect: Rect;\n /** @internal */\n protected temporalRect: Rect;\n /** @internal */\n protected scrollY: number;\n /** @internal */\n protected scrolled: number;\n /** @internal */\n protected scrollEl: HTMLElement;\n /** @internal */\n protected startEvent: MouseEvent;\n /** @internal value saved in the same order as _originStyleProp[] */\n protected elOriginStyleVal: string[];\n /** @internal */\n protected parentOriginStylePosition: string;\n /** @internal */\n protected static _originStyleProp = ['width', 'height', 'position', 'left', 'top', 'opacity', 'zIndex'];\n\n constructor(el: HTMLElement, opts: DDResizableOpt = {}) {\n super();\n this.el = el;\n this.option = opts;\n // create var event binding so we can easily remove and still look like TS methods (unlike anonymous functions)\n this._mouseOver = this._mouseOver.bind(this);\n this._mouseOut = this._mouseOut.bind(this);\n this.enable();\n this._setupAutoHide(this.option.autoHide);\n this._setupHandlers();\n }\n\n public on(event: 'resizestart' | 'resize' | 'resizestop', callback: (event: DragEvent) => void): void {\n super.on(event, callback);\n }\n\n public off(event: 'resizestart' | 'resize' | 'resizestop'): void {\n super.off(event);\n }\n\n public enable(): void {\n super.enable();\n this.el.classList.remove('ui-resizable-disabled');\n this._setupAutoHide(this.option.autoHide);\n }\n\n public disable(): void {\n super.disable();\n this.el.classList.add('ui-resizable-disabled');\n this._setupAutoHide(false);\n }\n\n public destroy(): void {\n this._removeHandlers();\n this._setupAutoHide(false);\n delete this.el;\n super.destroy();\n }\n\n public updateOption(opts: DDResizableOpt): DDResizable {\n let updateHandles = (opts.handles && opts.handles !== this.option.handles);\n let updateAutoHide = (opts.autoHide && opts.autoHide !== this.option.autoHide);\n Object.keys(opts).forEach(key => this.option[key] = opts[key]);\n if (updateHandles) {\n this._removeHandlers();\n this._setupHandlers();\n }\n if (updateAutoHide) {\n this._setupAutoHide(this.option.autoHide);\n }\n return this;\n }\n\n /** @internal turns auto hide on/off */\n protected _setupAutoHide(auto: boolean): DDResizable {\n if (auto) {\n this.el.classList.add('ui-resizable-autohide');\n // use mouseover and not mouseenter to get better performance and track for nested cases\n this.el.addEventListener('mouseover', this._mouseOver);\n this.el.addEventListener('mouseout', this._mouseOut);\n } else {\n this.el.classList.remove('ui-resizable-autohide');\n this.el.removeEventListener('mouseover', this._mouseOver);\n this.el.removeEventListener('mouseout', this._mouseOut);\n if (DDManager.overResizeElement === this) {\n delete DDManager.overResizeElement;\n }\n }\n return this;\n }\n\n /** @internal */\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n protected _mouseOver(e: Event): void {\n // console.log(`${count++} pre-enter ${(this.el as GridItemHTMLElement).gridstackNode._id}`)\n // already over a child, ignore. Ideally we just call e.stopPropagation() but see https://github.com/gridstack/gridstack.js/issues/2018\n if (DDManager.overResizeElement || DDManager.dragElement) return;\n DDManager.overResizeElement = this;\n // console.log(`${count++} enter ${(this.el as GridItemHTMLElement).gridstackNode._id}`)\n this.el.classList.remove('ui-resizable-autohide');\n }\n\n /** @internal */\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n protected _mouseOut(e: Event): void {\n // console.log(`${count++} pre-leave ${(this.el as GridItemHTMLElement).gridstackNode._id}`)\n if (DDManager.overResizeElement !== this) return;\n delete DDManager.overResizeElement;\n // console.log(`${count++} leave ${(this.el as GridItemHTMLElement).gridstackNode._id}`)\n this.el.classList.add('ui-resizable-autohide');\n }\n\n /** @internal */\n protected _setupHandlers(): DDResizable {\n let handlerDirection = this.option.handles || 'e,s,se';\n if (handlerDirection === 'all') {\n handlerDirection = 'n,e,s,w,se,sw,ne,nw';\n }\n this.handlers = handlerDirection.split(',')\n .map(dir => dir.trim())\n .map(dir => new DDResizableHandle(this.el, dir, {\n start: (event: MouseEvent) => {\n this._resizeStart(event);\n },\n stop: (event: MouseEvent) => {\n this._resizeStop(event);\n },\n move: (event: MouseEvent) => {\n this._resizing(event, dir);\n }\n }));\n return this;\n }\n\n /** @internal */\n protected _resizeStart(event: MouseEvent): DDResizable {\n this.originalRect = this.el.getBoundingClientRect();\n this.scrollEl = Utils.getScrollElement(this.el);\n this.scrollY = this.scrollEl.scrollTop;\n this.scrolled = 0;\n this.startEvent = event;\n this._setupHelper();\n this._applyChange();\n const ev = Utils.initEvent(event, { type: 'resizestart', target: this.el });\n if (this.option.start) {\n this.option.start(ev, this._ui());\n }\n this.el.classList.add('ui-resizable-resizing');\n this.triggerEvent('resizestart', ev);\n return this;\n }\n\n /** @internal */\n protected _resizing(event: MouseEvent, dir: string): DDResizable {\n this.scrolled = this.scrollEl.scrollTop - this.scrollY;\n this.temporalRect = this._getChange(event, dir);\n this._applyChange();\n const ev = Utils.initEvent(event, { type: 'resize', target: this.el });\n if (this.option.resize) {\n this.option.resize(ev, this._ui());\n }\n this.triggerEvent('resize', ev);\n return this;\n }\n\n /** @internal */\n protected _resizeStop(event: MouseEvent): DDResizable {\n const ev = Utils.initEvent(event, { type: 'resizestop', target: this.el });\n if (this.option.stop) {\n this.option.stop(ev); // Note: ui() not used by gridstack so don't pass\n }\n this.el.classList.remove('ui-resizable-resizing');\n this.triggerEvent('resizestop', ev);\n this._cleanHelper();\n delete this.startEvent;\n delete this.originalRect;\n delete this.temporalRect;\n delete this.scrollY;\n delete this.scrolled;\n return this;\n }\n\n /** @internal */\n protected _setupHelper(): DDResizable {\n this.elOriginStyleVal = DDResizable._originStyleProp.map(prop => this.el.style[prop]);\n this.parentOriginStylePosition = this.el.parentElement.style.position;\n if (window.getComputedStyle(this.el.parentElement).position.match(/static/)) {\n this.el.parentElement.style.position = 'relative';\n }\n this.el.style.position = 'absolute';\n this.el.style.opacity = '0.8';\n return this;\n }\n\n /** @internal */\n protected _cleanHelper(): DDResizable {\n DDResizable._originStyleProp.forEach((prop, i) => {\n this.el.style[prop] = this.elOriginStyleVal[i] || null;\n });\n this.el.parentElement.style.position = this.parentOriginStylePosition || null;\n return this;\n }\n\n /** @internal */\n protected _getChange(event: MouseEvent, dir: string): Rect {\n const oEvent = this.startEvent;\n const newRect = { // Note: originalRect is a complex object, not a simple Rect, so copy out.\n width: this.originalRect.width,\n height: this.originalRect.height + this.scrolled,\n left: this.originalRect.left,\n top: this.originalRect.top - this.scrolled\n };\n\n const offsetX = event.clientX - oEvent.clientX;\n const offsetY = event.clientY - oEvent.clientY;\n\n if (dir.indexOf('e') > -1) {\n newRect.width += offsetX;\n } else if (dir.indexOf('w') > -1) {\n newRect.width -= offsetX;\n newRect.left += offsetX;\n }\n if (dir.indexOf('s') > -1) {\n newRect.height += offsetY;\n } else if (dir.indexOf('n') > -1) {\n newRect.height -= offsetY;\n newRect.top += offsetY\n }\n const constrain = this._constrainSize(newRect.width, newRect.height);\n if (Math.round(newRect.width) !== Math.round(constrain.width)) { // round to ignore slight round-off errors\n if (dir.indexOf('w') > -1) {\n newRect.left += newRect.width - constrain.width;\n }\n newRect.width = constrain.width;\n }\n if (Math.round(newRect.height) !== Math.round(constrain.height)) {\n if (dir.indexOf('n') > -1) {\n newRect.top += newRect.height - constrain.height;\n }\n newRect.height = constrain.height;\n }\n return newRect;\n }\n\n /** @internal constrain the size to the set min/max values */\n protected _constrainSize(oWidth: number, oHeight: number): Size {\n const maxWidth = this.option.maxWidth || Number.MAX_SAFE_INTEGER;\n const minWidth = this.option.minWidth || oWidth;\n const maxHeight = this.option.maxHeight || Number.MAX_SAFE_INTEGER;\n const minHeight = this.option.minHeight || oHeight;\n const width = Math.min(maxWidth, Math.max(minWidth, oWidth));\n const height = Math.min(maxHeight, Math.max(minHeight, oHeight));\n return { width, height };\n }\n\n /** @internal */\n protected _applyChange(): DDResizable {\n let containmentRect = { left: 0, top: 0, width: 0, height: 0 };\n if (this.el.style.position === 'absolute') {\n const containmentEl = this.el.parentElement;\n const { left, top } = containmentEl.getBoundingClientRect();\n containmentRect = { left, top, width: 0, height: 0 };\n }\n if (!this.temporalRect) return this;\n Object.keys(this.temporalRect).forEach(key => {\n const value = this.temporalRect[key];\n this.el.style[key] = value - containmentRect[key] + 'px';\n });\n return this;\n }\n\n /** @internal */\n protected _removeHandlers(): DDResizable {\n this.handlers.forEach(handle => handle.destroy());\n delete this.handlers;\n return this;\n }\n\n /** @internal */\n protected _ui = (): DDUIData => {\n const containmentEl = this.el.parentElement;\n const containmentRect = containmentEl.getBoundingClientRect();\n const newRect = { // Note: originalRect is a complex object, not a simple Rect, so copy out.\n width: this.originalRect.width,\n height: this.originalRect.height + this.scrolled,\n left: this.originalRect.left,\n top: this.originalRect.top - this.scrolled\n };\n const rect = this.temporalRect || newRect;\n return {\n position: {\n left: rect.left - containmentRect.left,\n top: rect.top - containmentRect.top\n },\n size: {\n width: rect.width,\n height: rect.height\n }\n /* Gridstack ONLY needs position set above... keep around in case.\n element: [this.el], // The object representing the element to be resized\n helper: [], // TODO: not support yet - The object representing the helper that's being resized\n originalElement: [this.el],// we don't wrap here, so simplify as this.el //The object representing the original element before it is wrapped\n originalPosition: { // The position represented as { left, top } before the resizable is resized\n left: this.originalRect.left - containmentRect.left,\n top: this.originalRect.top - containmentRect.top\n },\n originalSize: { // The size represented as { width, height } before the resizable is resized\n width: this.originalRect.width,\n height: this.originalRect.height\n }\n */\n };\n }\n}\n","/**\n * touch.ts 8.3.0\n * Copyright (c) 2021 Alain Dumesny - see GridStack root license\n */\n\nimport { DDManager } from './dd-manager';\n\n/**\n * Detect touch support - Windows Surface devices and other touch devices\n * should we use this instead ? (what we had for always showing resize handles)\n * /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent)\n */\nexport const isTouch: boolean = typeof window !== 'undefined' && typeof document !== 'undefined' &&\n( 'ontouchstart' in document\n || 'ontouchstart' in window\n // || !!window.TouchEvent // true on Windows 10 Chrome desktop so don't use this\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n || ((window as any).DocumentTouch && document instanceof (window as any).DocumentTouch)\n || navigator.maxTouchPoints > 0\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n || (navigator as any).msMaxTouchPoints > 0\n);\n\n// interface TouchCoord {x: number, y: number};\n\nclass DDTouch {\n public static touchHandled: boolean;\n public static pointerLeaveTimeout: number;\n}\n\n/**\n* Get the x,y position of a touch event\n*/\n// function getTouchCoords(e: TouchEvent): TouchCoord {\n// return {\n// x: e.changedTouches[0].pageX,\n// y: e.changedTouches[0].pageY\n// };\n// }\n\n/**\n * Simulate a mouse event based on a corresponding touch event\n * @param {Object} e A touch event\n * @param {String} simulatedType The corresponding mouse event\n */\nfunction simulateMouseEvent(e: TouchEvent, simulatedType: string) {\n\n // Ignore multi-touch events\n if (e.touches.length > 1) return;\n\n // Prevent \"Ignored attempt to cancel a touchmove event with cancelable=false\" errors\n if (e.cancelable) e.preventDefault();\n\n const touch = e.changedTouches[0], simulatedEvent = document.createEvent('MouseEvents');\n\n // Initialize the simulated mouse event using the touch event's coordinates\n simulatedEvent.initMouseEvent(\n simulatedType, // type\n true, // bubbles\n true, // cancelable\n window, // view\n 1, // detail\n touch.screenX, // screenX\n touch.screenY, // screenY\n touch.clientX, // clientX\n touch.clientY, // clientY\n false, // ctrlKey\n false, // altKey\n false, // shiftKey\n false, // metaKey\n 0, // button\n null // relatedTarget\n );\n\n // Dispatch the simulated event to the target element\n e.target.dispatchEvent(simulatedEvent);\n}\n\n/**\n * Simulate a mouse event based on a corresponding Pointer event\n * @param {Object} e A pointer event\n * @param {String} simulatedType The corresponding mouse event\n */\nfunction simulatePointerMouseEvent(e: PointerEvent, simulatedType: string) {\n\n // Prevent \"Ignored attempt to cancel a touchmove event with cancelable=false\" errors\n if (e.cancelable) e.preventDefault();\n\n const simulatedEvent = document.createEvent('MouseEvents');\n\n // Initialize the simulated mouse event using the touch event's coordinates\n simulatedEvent.initMouseEvent(\n simulatedType, // type\n true, // bubbles\n true, // cancelable\n window, // view\n 1, // detail\n e.screenX, // screenX\n e.screenY, // screenY\n e.clientX, // clientX\n e.clientY, // clientY\n false, // ctrlKey\n false, // altKey\n false, // shiftKey\n false, // metaKey\n 0, // button\n null // relatedTarget\n );\n\n // Dispatch the simulated event to the target element\n e.target.dispatchEvent(simulatedEvent);\n}\n\n\n/**\n * Handle the touchstart events\n * @param {Object} e The widget element's touchstart event\n */\nexport function touchstart(e: TouchEvent): void {\n // Ignore the event if another widget is already being handled\n if (DDTouch.touchHandled) return;\n DDTouch.touchHandled = true;\n\n // Simulate the mouse events\n // simulateMouseEvent(e, 'mouseover');\n // simulateMouseEvent(e, 'mousemove');\n simulateMouseEvent(e, 'mousedown');\n}\n\n/**\n * Handle the touchmove events\n * @param {Object} e The document's touchmove event\n */\nexport function touchmove(e: TouchEvent): void {\n // Ignore event if not handled by us\n if (!DDTouch.touchHandled) return;\n\n simulateMouseEvent(e, 'mousemove');\n}\n\n/**\n * Handle the touchend events\n * @param {Object} e The document's touchend event\n */\nexport function touchend(e: TouchEvent): void {\n\n // Ignore event if not handled\n if (!DDTouch.touchHandled) return;\n\n // cancel delayed leave event when we release on ourself which happens BEFORE we get this!\n if (DDTouch.pointerLeaveTimeout) {\n window.clearTimeout(DDTouch.pointerLeaveTimeout);\n delete DDTouch.pointerLeaveTimeout;\n }\n\n const wasDragging = !!DDManager.dragElement;\n\n // Simulate the mouseup event\n simulateMouseEvent(e, 'mouseup');\n // simulateMouseEvent(event, 'mouseout');\n\n // If the touch interaction did not move, it should trigger a click\n if (!wasDragging) {\n simulateMouseEvent(e, 'click');\n }\n\n // Unset the flag to allow other widgets to inherit the touch event\n DDTouch.touchHandled = false;\n}\n\n/**\n * Note we don't get touchenter/touchleave (which are deprecated)\n * see https://stackoverflow.com/questions/27908339/js-touch-equivalent-for-mouseenter\n * so instead of PointerEvent to still get enter/leave and send the matching mouse event.\n */\nexport function pointerdown(e: PointerEvent): void {\n // console.log(\"pointer down\")\n (e.target as HTMLElement).releasePointerCapture(e.pointerId) // <- Important!\n}\n\nexport function pointerenter(e: PointerEvent): void {\n // ignore the initial one we get on pointerdown on ourself\n if (!DDManager.dragElement) {\n // console.log('pointerenter ignored');\n return;\n }\n // console.log('pointerenter');\n simulatePointerMouseEvent(e, 'mouseenter');\n}\n\nexport function pointerleave(e: PointerEvent): void {\n // ignore the leave on ourself we get before releasing the mouse over ourself\n // by delaying sending the event and having the up event cancel us\n if (!DDManager.dragElement) {\n // console.log('pointerleave ignored');\n return;\n }\n DDTouch.pointerLeaveTimeout = window.setTimeout(() => {\n delete DDTouch.pointerLeaveTimeout;\n // console.log('pointerleave delayed');\n simulatePointerMouseEvent(e, 'mouseleave');\n }, 10);\n}\n\n","/**\n * gridstack-engine.ts 8.3.0\n * Copyright (c) 2021-2022 Alain Dumesny - see GridStack root license\n */\n\nimport { Utils } from './utils';\nimport { GridStackNode, ColumnOptions, GridStackPosition, GridStackMoveOpts, SaveFcn, CompactOptions } from './types';\n\n/** callback to update the DOM attributes since this class is generic (no HTML or other info) for items that changed - see _notify() */\ntype OnChangeCB = (nodes: GridStackNode[]) => void;\n\n/** options used during creation - similar to GridStackOptions */\nexport interface GridStackEngineOptions {\n column?: number;\n maxRow?: number;\n float?: boolean;\n nodes?: GridStackNode[];\n onChange?: OnChangeCB;\n}\n\n/**\n * Defines the GridStack engine that does most no DOM grid manipulation.\n * See GridStack methods and vars for descriptions.\n *\n * NOTE: values should not be modified directly - call the main GridStack API instead\n */\nexport class GridStackEngine {\n public column: number;\n public maxRow: number;\n public nodes: GridStackNode[];\n public addedNodes: GridStackNode[] = [];\n public removedNodes: GridStackNode[] = [];\n public batchMode: boolean;\n /** @internal callback to update the DOM attributes */\n protected onChange: OnChangeCB;\n /** @internal */\n protected _float: boolean;\n /** @internal */\n protected _prevFloat: boolean;\n /** @internal cached layouts of difference column count so we can restore back (eg 12 -> 1 -> 12) */\n protected _layouts?: GridStackNode[][]; // maps column # to array of values nodes\n /** @internal true while we are resizing widgets during column resize to skip certain parts */\n protected _inColumnResize: boolean;\n /** @internal true if we have some items locked */\n protected _hasLocked: boolean;\n /** @internal unique global internal _id counter */\n public static _idSeq = 0;\n\n public constructor(opts: GridStackEngineOptions = {}) {\n this.column = opts.column || 12;\n this.maxRow = opts.maxRow;\n this._float = opts.float;\n this.nodes = opts.nodes || [];\n this.onChange = opts.onChange;\n }\n\n public batchUpdate(flag = true, doPack = true): GridStackEngine {\n if (!!this.batchMode === flag) return this;\n this.batchMode = flag;\n if (flag) {\n this._prevFloat = this._float;\n this._float = true; // let things go anywhere for now... will restore and possibly reposition later\n this.saveInitial(); // since begin update (which is called multiple times) won't do this\n } else {\n this._float = this._prevFloat;\n delete this._prevFloat;\n if (doPack) this._packNodes();\n this._notify();\n }\n return this;\n }\n\n // use entire row for hitting area (will use bottom reverse sorted first) if we not actively moving DOWN and didn't already skip\n protected _useEntireRowArea(node: GridStackNode, nn: GridStackPosition): boolean {\n return (!this.float || this.batchMode && !this._prevFloat) && !this._hasLocked && (!node._moving || node._skipDown || nn.y <= node.y);\n }\n\n /** @internal fix collision on given 'node', going to given new location 'nn', with optional 'collide' node already found.\n * return true if we moved. */\n protected _fixCollisions(node: GridStackNode, nn = node, collide?: GridStackNode, opt: GridStackMoveOpts = {}): boolean {\n this.sortNodes(-1); // from last to first, so recursive collision move items in the right order\n\n collide = collide || this.collide(node, nn); // REAL area collide for swap and skip if none...\n if (!collide) return false;\n\n // swap check: if we're actively moving in gravity mode, see if we collide with an object the same size\n if (node._moving && !opt.nested && !this.float) {\n if (this.swap(node, collide)) return true;\n }\n\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)\n let area = nn;\n if (this._useEntireRowArea(node, nn)) {\n area = {x: 0, w: this.column, y: nn.y, h: nn.h};\n collide = this.collide(node, area, opt.skip); // force new hit\n }\n\n let didMove = false;\n let newOpt: GridStackMoveOpts = {nested: true, pack: false};\n while (collide = collide || this.collide(node, area, opt.skip)) { // could collide with more than 1 item... so repeat for each\n let moved: boolean;\n // if colliding with a locked item OR moving down with top gravity (and collide could move up) -> skip past the collide,\n // but remember that skip down so we only do this once (and push others otherwise).\n if (collide.locked || node._moving && !node._skipDown && nn.y > node.y && !this.float &&\n // can take space we had, or before where we're going\n (!this.collide(collide, {...collide, y: node.y}, node) || !this.collide(collide, {...collide, y: nn.y - collide.h}, node))) {\n node._skipDown = (node._skipDown || nn.y > node.y);\n moved = this.moveNode(node, {...nn, y: collide.y + collide.h, ...newOpt});\n if (collide.locked && moved) {\n Utils.copyPos(nn, node); // moving after lock become our new desired location\n } else if (!collide.locked && moved && opt.pack) {\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\n this._packNodes();\n nn.y = collide.y + collide.h;\n Utils.copyPos(node, nn);\n }\n didMove = didMove || moved;\n } else {\n // move collide down *after* where we will be, ignoring where we are now (don't collide with us)\n moved = this.moveNode(collide, {...collide, y: nn.y + nn.h, skip: node, ...newOpt});\n }\n if (!moved) { return didMove; } // break inf loop if we couldn't move after all (ex: maxRow, fixed)\n collide = undefined;\n }\n return didMove;\n }\n\n /** return the nodes that intercept the given node. Optionally a different area can be used, as well as a second node to skip */\n public collide(skip: GridStackNode, area = skip, skip2?: GridStackNode): GridStackNode {\n const skipId = skip._id;\n const skip2Id = skip2?._id;\n return this.nodes.find(n => n._id !== skipId && n._id !== skip2Id && Utils.isIntercepted(n, area));\n }\n public collideAll(skip: GridStackNode, area = skip, skip2?: GridStackNode): GridStackNode[] {\n const skipId = skip._id;\n const skip2Id = skip2?._id;\n return this.nodes.filter(n => n._id !== skipId && n._id !== skip2Id && Utils.isIntercepted(n, area));\n }\n\n /** does a pixel coverage collision based on where we started, returning the node that has the most coverage that is >50% mid line */\n protected directionCollideCoverage(node: GridStackNode, o: GridStackMoveOpts, collides: GridStackNode[]): GridStackNode {\n if (!o.rect || !node._rect) return;\n let r0 = node._rect; // where started\n let r = {...o.rect}; // where we are\n\n // update dragged rect to show where it's coming from (above or below, etc...)\n if (r.y > r0.y) {\n r.h += r.y - r0.y;\n r.y = r0.y;\n } else {\n r.h += r0.y - r.y;\n }\n if (r.x > r0.x) {\n r.w += r.x - r0.x;\n r.x = r0.x;\n } else {\n r.w += r0.x - r.x;\n }\n\n let collide: GridStackNode;\n collides.forEach(n => {\n if (n.locked || !n._rect) return;\n let r2 = n._rect; // overlapping target\n let yOver = Number.MAX_VALUE, xOver = Number.MAX_VALUE, overMax = 0.5; // need >50%\n // depending on which side we started from, compute the overlap % of coverage\n // (ex: from above/below we only compute the max horizontal line coverage)\n if (r0.y < r2.y) { // from above\n yOver = ((r.y + r.h) - r2.y) / r2.h;\n } else if (r0.y+r0.h > r2.y+r2.h) { // from below\n yOver = ((r2.y + r2.h) - r.y) / r2.h;\n }\n if (r0.x < r2.x) { // from the left\n xOver = ((r.x + r.w) - r2.x) / r2.w;\n } else if (r0.x+r0.w > r2.x+r2.w) { // from the right\n xOver = ((r2.x + r2.w) - r.x) / r2.w;\n }\n let over = Math.min(xOver, yOver);\n if (over > overMax) {\n overMax = over;\n collide = n;\n }\n });\n o.collide = collide; // save it so we don't have to find it again\n return collide;\n }\n\n /** does a pixel coverage returning the node that has the most coverage by area */\n /*\n protected collideCoverage(r: GridStackPosition, collides: GridStackNode[]): {collide: GridStackNode, over: number} {\n let collide: GridStackNode;\n let overMax = 0;\n collides.forEach(n => {\n if (n.locked || !n._rect) return;\n let over = Utils.areaIntercept(r, n._rect);\n if (over > overMax) {\n overMax = over;\n collide = n;\n }\n });\n return {collide, over: overMax};\n }\n */\n\n /** called to cache the nodes pixel rectangles used for collision detection during drag */\n public cacheRects(w: number, h: number, top: number, right: number, bottom: number, left: number): GridStackEngine\n {\n this.nodes.forEach(n =>\n n._rect = {\n y: n.y * h + top,\n x: n.x * w + left,\n w: n.w * w - left - right,\n h: n.h * h - top - bottom\n }\n );\n return this;\n }\n\n /** called to possibly swap between 2 nodes (same size or column, not locked, touching), returning true if successful */\n public swap(a: GridStackNode, b: GridStackNode): boolean {\n if (!b || b.locked || !a || a.locked) return false;\n\n function _doSwap(): true { // assumes a is before b IFF they have different height (put after rather than exact swap)\n let x = b.x, y = b.y;\n b.x = a.x; b.y = a.y; // b -> a position\n if (a.h != b.h) {\n a.x = x; a.y = b.y + b.h; // a -> goes after b\n } else if (a.w != b.w) {\n a.x = b.x + b.w; a.y = y; // a -> goes after b\n } else {\n a.x = x; a.y = y; // a -> old b position\n }\n a._dirty = b._dirty = true;\n return true;\n }\n let touching: boolean; // remember if we called it (vs undefined)\n\n // same size and same row or column, and touching\n if (a.w === b.w && a.h === b.h && (a.x === b.x || a.y === b.y) && (touching = Utils.isTouching(a, b)))\n return _doSwap();\n if (touching === false) return; // IFF ran test and fail, bail out\n\n // check for taking same columns (but different height) and touching\n if (a.w === b.w && a.x === b.x && (touching || (touching = Utils.isTouching(a, b)))) {\n if (b.y < a.y) { let t = a; a = b; b = t; } // swap a <-> b vars so a is first\n return _doSwap();\n }\n if (touching === false) return;\n\n // check if taking same row (but different width) and touching\n if (a.h === b.h && a.y === b.y && (touching || (touching = Utils.isTouching(a, b)))) {\n if (b.x < a.x) { let t = a; a = b; b = t; } // swap a <-> b vars so a is first\n return _doSwap();\n }\n return false;\n }\n\n public isAreaEmpty(x: number, y: number, w: number, h: number): boolean {\n let nn: GridStackNode = {x: x || 0, y: y || 0, w: w || 1, h: h || 1};\n return !this.collide(nn);\n }\n\n /** re-layout grid items to reclaim any empty space - optionally keeping the sort order exactly the same ('list' mode) vs truly finding an empty spaces */\n public compact(layout: CompactOptions = 'compact', doSort = true): GridStackEngine {\n if (this.nodes.length === 0) return this;\n if (doSort) this.sortNodes();\n const wasBatch = this.batchMode;\n if (!wasBatch) this.batchUpdate();\n const wasColumnResize = this._inColumnResize;\n if (!wasColumnResize) this._inColumnResize = true; // faster addNode()\n let copyNodes = this.nodes;\n this.nodes = []; // pretend we have no nodes to conflict layout to start with...\n copyNodes.forEach((n, index, list) => {\n let after: GridStackNode;\n if (!n.locked) {\n n.autoPosition = true;\n if (layout === 'list' && index) after = list[index - 1];\n }\n this.addNode(n, false, after); // 'false' for add event trigger\n });\n if (!wasColumnResize) delete this._inColumnResize;\n if (!wasBatch) this.batchUpdate(false);\n return this;\n }\n\n /** enable/disable floating widgets (default: `false`) See [example](http://gridstackjs.com/demo/float.html) */\n public set float(val: boolean) {\n if (this._float === val) return;\n this._float = val || false;\n if (!val) {\n this._packNodes()._notify();\n }\n }\n\n /** float getter method */\n public get float(): boolean { return this._float || false; }\n\n /** sort the nodes array from first to last, or reverse. Called during collision/placement to force an order */\n public sortNodes(dir: 1 | -1 = 1, column = this.column): GridStackEngine {\n this.nodes = Utils.sort(this.nodes, dir, column);\n return this;\n }\n\n /** @internal called to top gravity pack the items back OR revert back to original Y positions when floating */\n protected _packNodes(): GridStackEngine {\n if (this.batchMode) { return this; }\n this.sortNodes(); // first to last\n\n if (this.float) {\n // restore original Y pos\n this.nodes.forEach(n => {\n if (n._updating || n._orig === undefined || n.y === n._orig.y) return;\n let newY = n.y;\n while (newY > n._orig.y) {\n --newY;\n let collide = this.collide(n, {x: n.x, y: newY, w: n.w, h: n.h});\n if (!collide) {\n n._dirty = true;\n n.y = newY;\n }\n }\n });\n } else {\n // top gravity pack\n this.nodes.forEach((n, i) => {\n if (n.locked) return;\n while (n.y > 0) {\n let newY = i === 0 ? 0 : n.y - 1;\n let canBeMoved = i === 0 || !this.collide(n, {x: n.x, y: newY, w: n.w, h: n.h});\n if (!canBeMoved) break;\n // Note: must be dirty (from last position) for GridStack::OnChange CB to update positions\n // and move items back. The user 'change' CB should detect changes from the original\n // starting position instead.\n n._dirty = (n.y !== newY);\n n.y = newY;\n }\n });\n }\n return this;\n }\n\n /**\n * given a random node, makes sure it's coordinates/values are valid in the current grid\n * @param node to adjust\n * @param resizing if out of bound, resize down or move into the grid to fit ?\n */\n public prepareNode(node: GridStackNode, resizing?: boolean): GridStackNode {\n node = node || {};\n node._id = node._id ?? GridStackEngine._idSeq++;\n\n // if we're missing position, have the grid position us automatically (before we set them to 0,0)\n if (node.x === undefined || node.y === undefined || node.x === null || node.y === null) {\n node.autoPosition = true;\n }\n\n // assign defaults for missing required fields\n let defaults: GridStackNode = { x: 0, y: 0, w: 1, h: 1};\n Utils.defaults(node, defaults);\n\n if (!node.autoPosition) { delete node.autoPosition; }\n if (!node.noResize) { delete node.noResize; }\n if (!node.noMove) { delete node.noMove; }\n Utils.sanitizeMinMax(node);\n\n // check for NaN (in case messed up strings were passed. can't do parseInt() || defaults.x above as 0 is valid #)\n if (typeof node.x == 'string') { node.x = Number(node.x); }\n if (typeof node.y == 'string') { node.y = Number(node.y); }\n if (typeof node.w == 'string') { node.w = Number(node.w); }\n if (typeof node.h == 'string') { node.h = Number(node.h); }\n if (isNaN(node.x)) { node.x = defaults.x; node.autoPosition = true; }\n if (isNaN(node.y)) { node.y = defaults.y; node.autoPosition = true; }\n if (isNaN(node.w)) { node.w = defaults.w; }\n if (isNaN(node.h)) { node.h = defaults.h; }\n\n return this.nodeBoundFix(node, resizing);\n }\n\n /** part2 of preparing a node to fit inside our grid - checks for x,y,w from grid dimensions */\n public nodeBoundFix(node: GridStackNode, resizing?: boolean): GridStackNode {\n\n let before = node._orig || Utils.copyPos({}, node);\n\n if (node.maxW) { node.w = Math.min(node.w, node.maxW); }\n if (node.maxH) { node.h = Math.min(node.h, node.maxH); }\n if (node.minW && node.minW <= this.column) { node.w = Math.max(node.w, node.minW); }\n if (node.minH) { node.h = Math.max(node.h, node.minH); }\n\n // if user loaded a larger than allowed widget for current # of columns (or force 1 column mode),\n // remember it's position & width so we can restore back (1 -> 12 column) #1655 #1985\n // IFF we're not in the middle of column resizing!\n const saveOrig = this.column === 1 || node.x + node.w > this.column;\n if (saveOrig && this.column < 12 && !this._inColumnResize && node._id && this.findCacheLayout(node, 12) === -1) {\n let copy = {...node}; // need _id + positions\n if (copy.autoPosition) { delete copy.x; delete copy.y; }\n else copy.x = Math.min(11, copy.x);\n copy.w = Math.min(12, copy.w);\n this.cacheOneLayout(copy, 12);\n }\n\n if (node.w > this.column) {\n node.w = this.column;\n } else if (node.w < 1) {\n node.w = 1;\n }\n\n if (this.maxRow && node.h > this.maxRow) {\n node.h = this.maxRow;\n } else if (node.h < 1) {\n node.h = 1;\n }\n\n if (node.x < 0) {\n node.x = 0;\n }\n if (node.y < 0) {\n node.y = 0;\n }\n\n if (node.x + node.w > this.column) {\n if (resizing) {\n node.w = this.column - node.x;\n } else {\n node.x = this.column - node.w;\n }\n }\n if (this.maxRow && node.y + node.h > this.maxRow) {\n if (resizing) {\n node.h = this.maxRow - node.y;\n } else {\n node.y = this.maxRow - node.h;\n }\n }\n\n if (!Utils.samePos(node, before)) {\n node._dirty = true;\n }\n\n return node;\n }\n\n /** returns a list of modified nodes from their original values */\n public getDirtyNodes(verify?: boolean): GridStackNode[] {\n // compare original x,y,w,h instead as _dirty can be a temporary state\n if (verify) {\n return this.nodes.filter(n => n._dirty && !Utils.samePos(n, n._orig));\n }\n return this.nodes.filter(n => n._dirty);\n }\n\n /** @internal call this to call onChange callback with dirty nodes so DOM can be updated */\n protected _notify(removedNodes?: GridStackNode[]): GridStackEngine {\n if (this.batchMode || !this.onChange) return this;\n let dirtyNodes = (removedNodes || []).concat(this.getDirtyNodes());\n this.onChange(dirtyNodes);\n return this;\n }\n\n /** @internal remove dirty and last tried info */\n public cleanNodes(): GridStackEngine {\n if (this.batchMode) return this;\n this.nodes.forEach(n => {\n delete n._dirty;\n delete n._lastTried;\n });\n return this;\n }\n\n /** @internal called to save initial position/size to track real dirty state.\n * Note: should be called right after we call change event (so next API is can detect changes)\n * as well as right before we start move/resize/enter (so we can restore items to prev values) */\n public saveInitial(): GridStackEngine {\n this.nodes.forEach(n => {\n n._orig = Utils.copyPos({}, n);\n delete n._dirty;\n });\n this._hasLocked = this.nodes.some(n => n.locked);\n return this;\n }\n\n /** @internal restore all the nodes back to initial values (called when we leave) */\n public restoreInitial(): GridStackEngine {\n this.nodes.forEach(n => {\n if (Utils.samePos(n, n._orig)) return;\n Utils.copyPos(n, n._orig);\n n._dirty = true;\n });\n this._notify();\n return this;\n }\n\n /** find the first available empty spot for the given node width/height, updating the x,y attributes. return true if found.\n * optionally you can pass your own existing node list and column count, otherwise defaults to that engine data.\n * Optionally pass a widget to start search AFTER, meaning the order will remain the same but possibly have empty slots we skipped\n */\n public findEmptyPosition(node: GridStackNode, nodeList = this.nodes, column = this.column, after?: GridStackNode): boolean {\n let start = after ? after.y * column + (after.x + after.w) : 0;\n let found = false;\n for (let i = start; !found; ++i) {\n let x = i % column;\n let y = Math.floor(i / column);\n if (x + node.w > column) {\n continue;\n }\n let box = {x, y, w: node.w, h: node.h};\n if (!nodeList.find(n => Utils.isIntercepted(box, n))) {\n if (node.x !== x || node.y !== y) node._dirty = true;\n node.x = x;\n node.y = y;\n delete node.autoPosition;\n found = true;\n }\n }\n return found;\n }\n\n /** call to add the given node to our list, fixing collision and re-packing */\n public addNode(node: GridStackNode, triggerAddEvent = false, after?: GridStackNode): GridStackNode {\n let dup = this.nodes.find(n => n._id === node._id);\n if (dup) return dup; // prevent inserting twice! return it instead.\n\n // skip prepareNode if we're in middle of column resize (not new) but do check for bounds!\n node = this._inColumnResize ? this.nodeBoundFix(node) : this.prepareNode(node);\n delete node._temporaryRemoved;\n delete node._removeDOM;\n\n let skipCollision: boolean;\n if (node.autoPosition && this.findEmptyPosition(node, this.nodes, this.column, after)) {\n delete node.autoPosition; // found our slot\n skipCollision = true;\n }\n\n this.nodes.push(node);\n if (triggerAddEvent) { this.addedNodes.push(node); }\n\n if (!skipCollision) this._fixCollisions(node);\n if (!this.batchMode) { this._packNodes()._notify(); }\n return node;\n }\n\n public removeNode(node: GridStackNode, removeDOM = true, triggerEvent = false): GridStackEngine {\n if (!this.nodes.find(n => n._id === node._id)) {\n // TEST console.log(`Error: GridStackEngine.removeNode() node._id=${node._id} not found!`)\n return this;\n }\n if (triggerEvent) { // we wait until final drop to manually track removed items (rather than during drag)\n this.removedNodes.push(node);\n }\n if (removeDOM) node._removeDOM = true; // let CB remove actual HTML (used to set _id to null, but then we loose layout info)\n // don't use 'faster' .splice(findIndex(),1) in case node isn't in our list, or in multiple times.\n this.nodes = this.nodes.filter(n => n._id !== node._id);\n return this._packNodes()\n ._notify([node]);\n }\n\n public removeAll(removeDOM = true): GridStackEngine {\n delete this._layouts;\n if (!this.nodes.length) return this;\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)\n this.removedNodes = this.nodes;\n this.nodes = [];\n return this._notify(this.removedNodes);\n }\n\n /** checks if item can be moved (layout constrain) vs moveNode(), returning true if was able to move.\n * In more complicated cases (maxRow) it will attempt at moving the item and fixing\n * others in a clone first, then apply those changes if still within specs. */\n public moveNodeCheck(node: GridStackNode, o: GridStackMoveOpts): boolean {\n // if (node.locked) return false;\n if (!this.changedPosConstrain(node, o)) return false;\n o.pack = true;\n\n // simpler case: move item directly...\n if (!this.maxRow) {\n return this.moveNode(node, o);\n }\n\n // complex case: create a clone with NO maxRow (will check for out of bounds at the end)\n let clonedNode: GridStackNode;\n let clone = new GridStackEngine({\n column: this.column,\n float: this.float,\n nodes: this.nodes.map(n => {\n if (n._id === node._id) {\n clonedNode = {...n};\n return clonedNode;\n }\n return {...n};\n })\n });\n if (!clonedNode) return false;\n\n // check if we're covering 50% collision and could move\n let canMove = clone.moveNode(clonedNode, o) && clone.getRow() <= this.maxRow;\n // else check if we can force a swap (float=true, or different shapes) on non-resize\n if (!canMove && !o.resizing && o.collide) {\n let collide = o.collide.el.gridstackNode; // find the source node the clone collided with at 50%\n if (this.swap(node, collide)) { // swaps and mark dirty\n this._notify();\n return true;\n }\n }\n if (!canMove) return false;\n\n // if clone was able to move, copy those mods over to us now instead of caller trying to do this all over!\n // Note: we can't use the list directly as elements and other parts point to actual node, so copy content\n clone.nodes.filter(n => n._dirty).forEach(c => {\n let n = this.nodes.find(a => a._id === c._id);\n if (!n) return;\n Utils.copyPos(n, c);\n n._dirty = true;\n });\n this._notify();\n return true;\n }\n\n /** return true if can fit in grid height constrain only (always true if no maxRow) */\n public willItFit(node: GridStackNode): boolean {\n delete node._willFitPos;\n if (!this.maxRow) return true;\n // create a clone with NO maxRow and check if still within size\n let clone = new GridStackEngine({\n column: this.column,\n float: this.float,\n nodes: this.nodes.map(n => {return {...n}})\n });\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\n this.cleanupNode(n);\n delete n.el; delete n._id; delete n.content; delete n.grid;\n clone.addNode(n);\n if (clone.getRow() <= this.maxRow) {\n node._willFitPos = Utils.copyPos({}, n);\n return true;\n }\n return false;\n }\n\n /** true if x,y or w,h are different after clamping to min/max */\n public changedPosConstrain(node: GridStackNode, p: GridStackPosition): boolean {\n // first make sure w,h are set for caller\n p.w = p.w || node.w;\n p.h = p.h || node.h;\n if (node.x !== p.x || node.y !== p.y) return true;\n // check constrained w,h\n if (node.maxW) { p.w = Math.min(p.w, node.maxW); }\n if (node.maxH) { p.h = Math.min(p.h, node.maxH); }\n if (node.minW) { p.w = Math.max(p.w, node.minW); }\n if (node.minH) { p.h = Math.max(p.h, node.minH); }\n return (node.w !== p.w || node.h !== p.h);\n }\n\n /** return true if the passed in node was actually moved (checks for no-op and locked) */\n public moveNode(node: GridStackNode, o: GridStackMoveOpts): boolean {\n if (!node || /*node.locked ||*/ !o) return false;\n let wasUndefinedPack: boolean;\n if (o.pack === undefined) {\n wasUndefinedPack = o.pack = true;\n }\n\n // constrain the passed in values and check if we're still changing our node\n if (typeof o.x !== 'number') { o.x = node.x; }\n if (typeof o.y !== 'number') { o.y = node.y; }\n if (typeof o.w !== 'number') { o.w = node.w; }\n if (typeof o.h !== 'number') { o.h = node.h; }\n let resizing = (node.w !== o.w || node.h !== o.h);\n let nn: GridStackNode = Utils.copyPos({}, node, true); // get min/max out first, then opt positions next\n Utils.copyPos(nn, o);\n nn = this.nodeBoundFix(nn, resizing);\n Utils.copyPos(o, nn);\n\n if (Utils.samePos(node, o)) return false;\n let prevPos: GridStackPosition = Utils.copyPos({}, node);\n\n // check if we will need to fix collision at our new location\n let collides = this.collideAll(node, nn, o.skip);\n let needToMove = true;\n if (collides.length) {\n let activeDrag = node._moving && !o.nested;\n // check to make sure we actually collided over 50% surface area while dragging\n let collide = activeDrag ? this.directionCollideCoverage(node, o, collides) : collides[0];\n // if we're enabling creation of sub-grids on the fly, see if we're covering 80% of either one, if we didn't already do that\n if (activeDrag && collide && node.grid?.opts?.subGridDynamic && !node.grid._isTemp) {\n let over = Utils.areaIntercept(o.rect, collide._rect);\n let a1 = Utils.area(o.rect);\n let a2 = Utils.area(collide._rect);\n let perc = over / (a1 < a2 ? a1 : a2);\n if (perc > .8) {\n collide.grid.makeSubGrid(collide.el, undefined, node);\n collide = undefined;\n }\n }\n\n if (collide) {\n needToMove = !this._fixCollisions(node, nn, collide, o); // check if already moved...\n } else {\n needToMove = false; // we didn't cover >50% for a move, skip...\n if (wasUndefinedPack) delete o.pack;\n }\n }\n\n // now move (to the original ask vs the collision version which might differ) and repack things\n if (needToMove) {\n node._dirty = true;\n Utils.copyPos(node, nn);\n }\n if (o.pack) {\n this._packNodes()\n ._notify();\n }\n return !Utils.samePos(node, prevPos); // pack might have moved things back\n }\n\n public getRow(): number {\n return this.nodes.reduce((row, n) => Math.max(row, n.y + n.h), 0);\n }\n\n public beginUpdate(node: GridStackNode): GridStackEngine {\n if (!node._updating) {\n node._updating = true;\n delete node._skipDown;\n if (!this.batchMode) this.saveInitial();\n }\n return this;\n }\n\n public endUpdate(): GridStackEngine {\n let n = this.nodes.find(n => n._updating);\n if (n) {\n delete n._updating;\n delete n._skipDown;\n }\n return this;\n }\n\n /** saves a copy of the largest column layout (eg 12 even when rendering oneColumnMode) so we don't loose orig layout,\n * returning a list of widgets for serialization */\n public save(saveElement = true, saveCB?: SaveFcn): GridStackNode[] {\n // use the highest layout for any saved info so we can have full detail on reload #1849\n let len = this._layouts?.length;\n let layout = len && this.column !== (len - 1) ? this._layouts[len - 1] : null;\n let list: GridStackNode[] = [];\n this.sortNodes();\n this.nodes.forEach(n => {\n let wl = layout?.find(l => l._id === n._id);\n let w: GridStackNode = {...n};\n // use layout info instead if set\n if (wl) { w.x = wl.x; w.y = wl.y; w.w = wl.w; }\n Utils.removeInternalForSave(w, !saveElement);\n if (saveCB) saveCB(n, w);\n list.push(w);\n });\n return list;\n }\n\n /** @internal called whenever a node is added or moved - updates the cached layouts */\n public layoutsNodesChange(nodes: GridStackNode[]): GridStackEngine {\n if (!this._layouts || this._inColumnResize) return this;\n // remove smaller layouts - we will re-generate those on the fly... larger ones need to update\n this._layouts.forEach((layout, column) => {\n if (!layout || column === this.column) return this;\n if (column < this.column) {\n this._layouts[column] = undefined;\n }\n else {\n // we save the original x,y,w (h isn't cached) to see what actually changed to propagate better.\n // NOTE: we don't need to check against out of bound scaling/moving as that will be done when using those cache values. #1785\n let ratio = column / this.column;\n nodes.forEach(node => {\n if (!node._orig) return; // didn't change (newly added ?)\n let n = layout.find(l => l._id === node._id);\n if (!n) return; // no cache for new nodes. Will use those values.\n // Y changed, push down same amount\n // TODO: detect doing item 'swaps' will help instead of move (especially in 1 column mode)\n if (node.y !== node._orig.y) {\n n.y += (node.y - node._orig.y);\n }\n // X changed, scale from new position\n if (node.x !== node._orig.x) {\n n.x = Math.round(node.x * ratio);\n }\n // width changed, scale from new width\n if (node.w !== node._orig.w) {\n n.w = Math.round(node.w * ratio);\n }\n // ...height always carries over from cache\n });\n }\n });\n return this;\n }\n\n /**\n * @internal Called to scale the widget width & position up/down based on the column change.\n * Note we store previous layouts (especially original ones) to make it possible to go\n * from say 12 -> 1 -> 12 and get back to where we were.\n *\n * @param prevColumn previous number of columns\n * @param column new column number\n * @param nodes different sorted list (ex: DOM order) instead of current list\n * @param layout specify the type of re-layout that will happen (position, size, etc...).\n * Note: items will never be outside of the current column boundaries. default (moveScale). Ignored for 1 column\n */\n public columnChanged(prevColumn: number, column: number, nodes: GridStackNode[], layout: ColumnOptions = 'moveScale'): GridStackEngine {\n if (!this.nodes.length || !column || prevColumn === column) return this;\n\n // simpler shortcuts layouts\n const doCompact = layout === 'compact' || layout === 'list';\n if (doCompact) {\n this.sortNodes(1, prevColumn); // sort with original layout once and only once (new column will affect order otherwise)\n }\n\n // cache the current layout in case they want to go back (like 12 -> 1 -> 12) as it requires original data IFF we're sizing down (see below)\n if (column < prevColumn) this.cacheLayout(this.nodes, prevColumn);\n this.batchUpdate(); // do this EARLY as it will call saveInitial() so we can detect where we started for _dirty and collision\n let newNodes: GridStackNode[] = [];\n \n // if we're going to 1 column and using DOM order (item passed in) rather than default sorting, then generate that layout\n let domOrder = false;\n if (column === 1 && nodes?.length) {\n domOrder = true;\n let top = 0;\n nodes.forEach(n => {\n n.x = 0;\n n.w = 1;\n n.y = Math.max(n.y, top);\n top = n.y + n.h;\n });\n newNodes = nodes;\n nodes = [];\n } else {\n nodes = doCompact ? this.nodes : Utils.sort(this.nodes, -1, prevColumn); // current column reverse sorting so we can insert last to front (limit collision)\n }\n\n // see if we have cached previous layout IFF we are going up in size (restore) otherwise always\n // generate next size down from where we are (looks more natural as you gradually size down).\n if (column > prevColumn && this._layouts) {\n const cacheNodes = this._layouts[column] || [];\n // ...if not, start with the largest layout (if not already there) as down-scaling is more accurate\n // by pretending we came from that larger column by assigning those values as starting point\n let lastIndex = this._layouts.length - 1;\n if (!cacheNodes.length && prevColumn !== lastIndex && this._layouts[lastIndex]?.length) {\n prevColumn = lastIndex;\n this._layouts[lastIndex].forEach(cacheNode => {\n let n = nodes.find(n => n._id === cacheNode._id);\n if (n) {\n // still current, use cache info positions\n if (!doCompact) {\n n.x = cacheNode.x;\n n.y = cacheNode.y;\n }\n n.w = cacheNode.w;\n }\n });\n }\n\n // if we found cache re-use those nodes that are still current\n cacheNodes.forEach(cacheNode => {\n let j = nodes.findIndex(n => n._id === cacheNode._id);\n if (j !== -1) {\n // still current, use cache info positions\n if (doCompact) {\n nodes[j].w = cacheNode.w; // only w is used, and don't trim the list\n return;\n }\n if (cacheNode.autoPosition || isNaN(cacheNode.x) || isNaN(cacheNode.y)) {\n this.findEmptyPosition(cacheNode, newNodes);\n }\n if (!cacheNode.autoPosition) {\n nodes[j].x = cacheNode.x;\n nodes[j].y = cacheNode.y;\n nodes[j].w = cacheNode.w;\n newNodes.push(nodes[j]);\n }\n nodes.splice(j, 1);\n }\n });\n }\n\n // much simpler layout that just compacts\n if (doCompact) {\n this.compact(layout, false);\n } else {\n // ...and add any extra non-cached ones\n if (nodes.length) {\n if (typeof layout === 'function') {\n layout(column, prevColumn, newNodes, nodes);\n } else if (!domOrder) {\n let ratio = (doCompact || layout === 'none') ? 1 : column / prevColumn;\n let move = (layout === 'move' || layout === 'moveScale');\n let scale = (layout === 'scale' || layout === 'moveScale');\n nodes.forEach(node => {\n // NOTE: x + w could be outside of the grid, but addNode() below will handle that\n node.x = (column === 1 ? 0 : (move ? Math.round(node.x * ratio) : Math.min(node.x, column - 1)));\n node.w = ((column === 1 || prevColumn === 1) ? 1 : scale ? (Math.round(node.w * ratio) || 1) : (Math.min(node.w, column)));\n newNodes.push(node);\n });\n nodes = [];\n }\n }\n\n // finally re-layout them in reverse order (to get correct placement)\n if (!domOrder) newNodes = Utils.sort(newNodes, -1, column);\n this._inColumnResize = true; // prevent cache update\n this.nodes = []; // pretend we have no nodes to start with (add() will use same structures) to simplify layout\n newNodes.forEach(node => {\n this.addNode(node, false); // 'false' for add event trigger\n delete node._orig; // make sure the commit doesn't try to restore things back to original\n });\n }\n \n this.nodes.forEach(n => delete n._orig); // clear _orig before batch=false so it doesn't handle float=true restore\n this.batchUpdate(false, !doCompact);\n delete this._inColumnResize;\n return this;\n }\n\n /**\n * call to cache the given layout internally to the given location so we can restore back when column changes size\n * @param nodes list of nodes\n * @param column corresponding column index to save it under\n * @param clear if true, will force other caches to be removed (default false)\n */\n public cacheLayout(nodes: GridStackNode[], column: number, clear = false): GridStackEngine {\n let copy: GridStackNode[] = [];\n nodes.forEach((n, i) => {\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\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\n });\n this._layouts = clear ? [] : this._layouts || []; // use array to find larger quick\n this._layouts[column] = copy;\n return this;\n }\n\n /**\n * call to cache the given node layout internally to the given location so we can restore back when column changes size\n * @param node single node to cache\n * @param column corresponding column index to save it under\n */\n public cacheOneLayout(n: GridStackNode, column: number): GridStackEngine {\n n._id = n._id ?? GridStackEngine._idSeq++;\n let l: GridStackNode = {x: n.x, y: n.y, w: n.w, _id: n._id}\n if (n.autoPosition) { delete l.x; delete l.y; l.autoPosition = true; }\n this._layouts = this._layouts || [];\n this._layouts[column] = this._layouts[column] || [];\n let index = this.findCacheLayout(n, column);\n if (index === -1)\n this._layouts[column].push(l);\n else\n this._layouts[column][index] = l;\n return this;\n }\n\n protected findCacheLayout(n: GridStackNode, column: number): number {\n return this._layouts?.[column]?.findIndex(l => l._id === n._id) ?? -1;\n }\n\n\n /** called to remove all internal values but the _id */\n public cleanupNode(node: GridStackNode): GridStackEngine {\n for (let prop in node) {\n if (prop[0] === '_' && prop !== '_id') delete node[prop];\n }\n return this;\n }\n}\n","/*!\r\n * GridStack 8.3.0\r\n * https://gridstackjs.com/\r\n *\r\n * Copyright (c) 2021-2022 Alain Dumesny\r\n * see root license https://github.com/gridstack/gridstack.js/tree/master/LICENSE\r\n */\r\nimport { GridStackEngine } from './gridstack-engine';\r\nimport { Utils, HeightData, obsolete } from './utils';\r\nimport { gridDefaults, ColumnOptions, GridItemHTMLElement, GridStackElement, GridStackEventHandlerCallback,\r\n GridStackNode, GridStackWidget, numberOrString, DDUIData, DDDragInOpt, GridStackPosition, GridStackOptions,\r\n dragInDefaultOptions, GridStackEventHandler, GridStackNodesHandler, AddRemoveFcn, SaveFcn, CompactOptions } from './types';\r\n\r\n/*\r\n * and include D&D by default\r\n * TODO: while we could generate a gridstack-static.js at smaller size - saves about 31k (41k -> 72k)\r\n * I don't know how to generate the DD only code at the remaining 31k to delay load as code depends on Gridstack.ts\r\n * also it caused loading issues in prod - see https://github.com/gridstack/gridstack.js/issues/2039\r\n */\r\nimport { DDGridStack } from './dd-gridstack';\r\nimport { isTouch } from './dd-touch';\r\nimport { DDManager } from './dd-manager';\r\nimport { DDElementHost } from './dd-element';\r\n/** global instance */\r\nconst dd = new DDGridStack;\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 './dd-gridstack';\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 _max?: number; // internal tracker of the max # of rows we created\r\n}\r\n\r\n// extend with internal fields we need - TODO: move other items in here\r\ninterface InternalGridStackOptions extends GridStackOptions {\r\n _alwaysShowResizeHandle?: true | false | 'mobile'; // so we can restore for save\r\n}\r\n\r\n/**\r\n * Main gridstack class - you will need to call `GridStack.init()` first to initialize your grid.\r\n * Note: your grid elements MUST have the following classes for the CSS layout to work:\r\n * @example\r\n *
\r\n *
\r\n *
Item 1
\r\n *
\r\n *
\r\n */\r\nexport class GridStack {\r\n\r\n /**\r\n * initializing the HTML element, or selector string, into a grid will return the grid. Calling it again will\r\n * simply return the existing instance (ignore any passed options). There is also an initAll() version that support\r\n * multiple grids initialization at once. Or you can use addGrid() to create the entire grid from JSON.\r\n * @param options grid options (optional)\r\n * @param elOrString element or CSS selector (first one used) to convert to a grid (default to '.grid-stack' class selector)\r\n *\r\n * @example\r\n * let grid = GridStack.init();\r\n *\r\n * Note: the HTMLElement (of type GridHTMLElement) will store a `gridstack: GridStack` value that can be retrieve later\r\n * let grid = document.querySelector('.grid-stack').gridstack;\r\n */\r\n public static init(options: GridStackOptions = {}, elOrString: GridStackElement = '.grid-stack'): GridStack {\r\n let el = GridStack.getGridElement(elOrString);\r\n if (!el) {\r\n if (typeof elOrString === 'string') {\r\n console.error('GridStack.initAll() no grid was found with selector \"' + elOrString + '\" - element missing or wrong selector ?' +\r\n '\\nNote: \".grid-stack\" is required for proper CSS styling and drag/drop, and is the default selector.');\r\n } else {\r\n console.error('GridStack.init() no grid element was passed.');\r\n }\r\n return null;\r\n }\r\n if (!el.gridstack) {\r\n el.gridstack = new GridStack(el, 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 }\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 let el = parent as GridHTMLElement;\r\n if (el.gridstack) {\r\n // already a grid - set option and load data\r\n const grid = el.gridstack;\r\n if (opt) grid.opts = {...grid.opts, ...opt};\r\n if (opt.children !== undefined) grid.load(opt.children);\r\n return grid;\r\n }\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 const parentIsGrid = parent.classList.contains('grid-stack');\r\n if (!parentIsGrid || GridStack.addRemoveCB) {\r\n if (GridStack.addRemoveCB) {\r\n el = GridStack.addRemoveCB(parent, opt, true, true);\r\n } else {\r\n let doc = document.implementation.createHTMLDocument(''); // IE needs a param\r\n doc.body.innerHTML = `
`;\r\n el = doc.body.children[0] as HTMLElement;\r\n parent.appendChild(el);\r\n }\r\n }\r\n\r\n // create grid class and load any children\r\n let grid = GridStack.init(opt, el);\r\n return grid;\r\n }\r\n\r\n /** call this method to register your engine instead of the default one.\r\n * See instead `GridStackOptions.engineClass` if you only need to\r\n * replace just one instance.\r\n */\r\n static registerEngine(engineClass: typeof GridStackEngine): void {\r\n GridStack.engineClass = engineClass;\r\n }\r\n\r\n /**\r\n * callback method use when new items|grids needs to be created or deleted, instead of the default\r\n * item:
w.content
\r\n * grid:
grid content...
\r\n * add = true: the returned DOM element will then be converted to a GridItemHTMLElement using makeWidget()|GridStack:init().\r\n * add = false: the item will be removed from DOM (if not already done)\r\n * grid = true|false for grid vs grid-items\r\n */\r\n public static addRemoveCB?: AddRemoveFcn;\r\n\r\n /**\r\n * callback during saving to application can inject extra data for each widget, on top of the grid layout properties\r\n */\r\n public static saveCB?: SaveFcn;\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 /** point to a parent grid item if we're nested (inside a grid-item in between 2 Grids) */\r\n public parentGridItem?: GridStackNode;\r\n\r\n protected static engineClass: typeof GridStackEngine;\r\n\r\n /** @internal unique class name for our generated CSS style sheet */\r\n protected _styleSheetClass?: string;\r\n /** @internal true if we got created by drag over gesture, so we can removed on drag out (temporary) */\r\n public _isTemp?: boolean;\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 protected _placeholder: HTMLElement;\r\n /** @internal */\r\n protected _prevColumn: number;\r\n /** @internal prevent cached layouts from being updated when loading into small column layouts */\r\n protected _ignoreLayoutsNodeChange: boolean;\r\n /** @internal */\r\n public _gsEventHandler = {};\r\n /** @internal */\r\n protected _styles: GridCSSStyleSheet;\r\n /** @internal flag to keep cells square during resize */\r\n protected _isAutoCellHeight: boolean;\r\n /** @internal track event binding to window resize so we can remove */\r\n protected _windowResizeBind: () => void;\r\n /** @internal limit auto cell resizing method */\r\n protected _cellHeightThrottle: () => void;\r\n /** @internal true when loading items to insert first rather than append */\r\n protected _insertNotAppend: boolean;\r\n /** @internal extra row added when dragging at the bottom of the grid */\r\n protected _extraDragRow = 0;\r\n /** @internal true if nested grid should get column count from our width */\r\n protected _autoColumn?: boolean;\r\n\r\n /**\r\n * Construct a grid item from the given element and options\r\n * @param el\r\n * @param opts\r\n */\r\n public constructor(el: GridHTMLElement, opts: GridStackOptions = {}) {\r\n this.el = el; // exposed HTML element to the user\r\n opts = opts || {}; // handles null/undefined/0\r\n\r\n if (!el.classList.contains('grid-stack')) {\r\n this.el.classList.add('grid-stack');\r\n }\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 // flag only valid in sub-grids (handled by parent, not here)\r\n if (opts.column === 'auto') {\r\n delete opts.column;\r\n }\r\n // save original setting so we can restore on save\r\n if (opts.alwaysShowResizeHandle !== undefined) {\r\n (opts as InternalGridStackOptions)._alwaysShowResizeHandle = opts.alwaysShowResizeHandle;\r\n }\r\n\r\n // elements DOM 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')) || gridDefaults.column,\r\n minRow: rowAttr ? rowAttr : Utils.toNumber(el.getAttribute('gs-min-row')) || gridDefaults.minRow,\r\n maxRow: rowAttr ? rowAttr : Utils.toNumber(el.getAttribute('gs-max-row')) || gridDefaults.maxRow,\r\n staticGrid: Utils.toBool(el.getAttribute('gs-static')) || gridDefaults.staticGrid,\r\n draggable: {\r\n handle: (opts.handleClass ? '.' + opts.handleClass : (opts.handle ? opts.handle : '')) || gridDefaults.draggable.handle,\r\n },\r\n removableOptions: {\r\n accept: opts.itemClass ? '.' + opts.itemClass : gridDefaults.removableOptions.accept,\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.oneColumnSize) {\r\n this._prevColumn = this.getColumn();\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 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 parentGridItem = (Utils.closestUpByClass(this.el, gridDefaults.itemClass) as GridItemHTMLElement)?.gridstackNode;\r\n if (parentGridItem) {\r\n parentGridItem.subGrid = this;\r\n this.parentGridItem = parentGridItem;\r\n this.el.classList.add('grid-stack-nested');\r\n parentGridItem.el.classList.add('grid-stack-sub-grid');\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 // append unit if any are set\r\n if (typeof this.opts.cellHeight == 'number' && this.opts.cellHeightUnit && this.opts.cellHeightUnit !== gridDefaults.cellHeightUnit) {\r\n this.opts.cellHeight = this.opts.cellHeight + this.opts.cellHeightUnit;\r\n delete this.opts.cellHeightUnit;\r\n }\r\n this.cellHeight(this.opts.cellHeight, false);\r\n }\r\n\r\n // see if we need to adjust auto-hide\r\n if (this.opts.alwaysShowResizeHandle === 'mobile') {\r\n this.opts.alwaysShowResizeHandle = isTouch;\r\n }\r\n\r\n this._styleSheetClass = 'gs-id-' + GridStackEngine._idSeq++;\r\n this.el.classList.add(this._styleSheetClass);\r\n\r\n this._setStaticClass();\r\n\r\n let engineClass = this.opts.engineClass || GridStack.engineClass || GridStackEngine;\r\n this.engine = new engineClass({\r\n column: this.getColumn(),\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 (!el) return;\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 this.getGridItems().forEach(el => this._prepareElement(el));\r\n this.batchUpdate(false);\r\n }\r\n\r\n // load any passed in children as well, which overrides any DOM layout done above\r\n if (this.opts.children) {\r\n let children = this.opts.children;\r\n delete this.opts.children;\r\n if (children.length) this.load(children); // don't load empty\r\n }\r\n\r\n this.setAnimation(this.opts.animate);\r\n\r\n this._updateStyles();\r\n this.el.classList.add('gs-' + this.opts.column);\r\n\r\n // dynamic grids require pausing during drag to detect over to nest vs push\r\n if (this.opts.subGridDynamic && !DDManager.pauseDrag) DDManager.pauseDrag = true;\r\n if (this.opts.draggable?.pause !== undefined) DDManager.pauseDrag = this.opts.draggable.pause;\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('
hello
', {w: 3});\r\n *\r\n * @param el GridStackWidget (which can have content string as well), html element, or string definition to add\r\n * @param options widget position/size options (optional, and ignore if first param is already option) - see GridStackWidget\r\n */\r\n public addWidget(els?: GridStackWidget | GridStackElement, options?: GridStackWidget): GridItemHTMLElement {\r\n function isGridStackWidget(w: GridStackNode): w is GridStackNode { // https://medium.com/ovrsea/checking-the-type-of-an-object-in-typescript-the-type-guards-24d98d9119b0\r\n return w.el !== undefined || 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: GridItemHTMLElement;\r\n let node: GridStackNode;\r\n if (typeof els === 'string') {\r\n let doc = document.implementation.createHTMLDocument(''); // IE needs a param\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 node = options = els;\r\n if (node?.el) {\r\n el = node.el; // re-use element stored in the node\r\n } else if (GridStack.addRemoveCB) {\r\n el = GridStack.addRemoveCB(this.el, options, true, false);\r\n } else {\r\n let content = options?.content || '';\r\n let doc = document.implementation.createHTMLDocument(''); // IE needs a param\r\n doc.body.innerHTML = `
${content}
`;\r\n el = doc.body.children[0] as HTMLElement;\r\n }\r\n } else {\r\n el = els as HTMLElement;\r\n }\r\n\r\n if (!el) return;\r\n\r\n // if the caller ended up initializing the widget in addRemoveCB, or we stared with one already, skip the rest\r\n node = el.gridstackNode;\r\n if (node && el.parentElement === this.el && this.engine.nodes.find(n => n._id === node._id)) return el;\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 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 this.makeWidget(el, options);\r\n\r\n return el;\r\n }\r\n\r\n /**\r\n * Convert an existing gridItem element into a sub-grid with the given (optional) options, else inherit them\r\n * from the parent's subGrid options.\r\n * @param el gridItem element to convert\r\n * @param ops (optional) sub-grid options, else default to node, then parent settings, else defaults\r\n * @param nodeToAdd (optional) node to add to the newly created sub grid (used when dragging over existing regular item)\r\n * @returns newly created grid\r\n */\r\n public makeSubGrid(el: GridItemHTMLElement, ops?: GridStackOptions, nodeToAdd?: GridStackNode, saveContent = true): GridStack {\r\n let node = el.gridstackNode;\r\n if (!node) {\r\n node = this.makeWidget(el).gridstackNode;\r\n }\r\n if (node.subGrid?.el) return node.subGrid; // already done\r\n\r\n // find the template subGrid stored on a parent as fallback...\r\n let subGridTemplate: GridStackOptions; // eslint-disable-next-line @typescript-eslint/no-this-alias\r\n let grid: GridStack = this;\r\n while (grid && !subGridTemplate) {\r\n subGridTemplate = grid.opts?.subGridOpts;\r\n grid = grid.parentGridItem?.grid;\r\n }\r\n //... and set the create options\r\n ops = Utils.cloneDeep({...(subGridTemplate || {}), children: undefined, ...(ops || node.subGridOpts)});\r\n node.subGridOpts = ops;\r\n\r\n // if column special case it set, remember that flag and set default\r\n let autoColumn: boolean;\r\n if (ops.column === 'auto') {\r\n autoColumn = true;\r\n ops.column = Math.max(node.w || 1, nodeToAdd?.w || 1);\r\n ops.disableOneColumnMode = true; // driven by parent\r\n }\r\n\r\n // if we're converting an existing full item, move over the content to be the first sub item in the new grid\r\n let content = node.el.querySelector('.grid-stack-item-content') as HTMLElement;\r\n let newItem: HTMLElement;\r\n let newItemOpt: GridStackNode;\r\n if (saveContent) {\r\n this._removeDD(node.el); // remove D&D since it's set on content div\r\n newItemOpt = {...node, x:0, y:0};\r\n Utils.removeInternalForSave(newItemOpt);\r\n delete newItemOpt.subGridOpts;\r\n if (node.content) {\r\n newItemOpt.content = node.content;\r\n delete node.content;\r\n }\r\n if (GridStack.addRemoveCB) {\r\n newItem = GridStack.addRemoveCB(this.el, newItemOpt, true, false);\r\n } else {\r\n let doc = document.implementation.createHTMLDocument(''); // IE needs a param\r\n doc.body.innerHTML = `
`;\r\n newItem = doc.body.children[0] as HTMLElement;\r\n newItem.appendChild(content);\r\n doc.body.innerHTML = `
`;\r\n content = doc.body.children[0] as HTMLElement;\r\n node.el.appendChild(content);\r\n }\r\n this._prepareDragDropByNode(node); // ... and restore original D&D\r\n }\r\n\r\n // if we're adding an additional item, make the container large enough to have them both\r\n if (nodeToAdd) {\r\n let w = autoColumn ? ops.column : node.w;\r\n let h = node.h + nodeToAdd.h;\r\n let style = node.el.style;\r\n style.transition = 'none'; // show up instantly so we don't see scrollbar with nodeToAdd\r\n this.update(node.el, {w, h});\r\n setTimeout(() => style.transition = null); // recover animation\r\n }\r\n\r\n let subGrid = node.subGrid = GridStack.addGrid(content, ops);\r\n if (nodeToAdd?._moving) subGrid._isTemp = true; // prevent re-nesting as we add over\r\n if (autoColumn) subGrid._autoColumn = true;\r\n\r\n // add the original content back as a child of hte newly created grid\r\n if (saveContent) {\r\n subGrid.addWidget(newItem, newItemOpt);\r\n }\r\n\r\n // now add any additional node\r\n if (nodeToAdd) {\r\n if (nodeToAdd._moving) {\r\n // create an artificial event even for the just created grid to receive this item\r\n window.setTimeout(() => Utils.simulateMouseEvent(nodeToAdd._event, 'mouseenter', subGrid.el), 0);\r\n } else {\r\n subGrid.addWidget(node.el, node);\r\n }\r\n }\r\n return subGrid;\r\n }\r\n\r\n /**\r\n * called when an item was converted into a nested grid to accommodate a dragged over item, but then item leaves - return back\r\n * to the original grid-item. Also called to remove empty sub-grids when last item is dragged out (since re-creating is simple)\r\n */\r\n public removeAsSubGrid(nodeThatRemoved?: GridStackNode): void {\r\n let pGrid = this.parentGridItem?.grid;\r\n if (!pGrid) return;\r\n\r\n pGrid.batchUpdate();\r\n pGrid.removeWidget(this.parentGridItem.el, true, true);\r\n this.engine.nodes.forEach(n => {\r\n // migrate any children over and offsetting by our location\r\n n.x += this.parentGridItem.x;\r\n n.y += this.parentGridItem.y;\r\n pGrid.addWidget(n.el, n);\r\n });\r\n pGrid.batchUpdate(false);\r\n if (this.parentGridItem) delete this.parentGridItem.subGrid;\r\n delete this.parentGridItem;\r\n\r\n // create an artificial event for the original grid now that this one is gone (got a leave, but won't get enter)\r\n if (nodeThatRemoved) {\r\n window.setTimeout(() => Utils.simulateMouseEvent(nodeThatRemoved._event, 'mouseenter', pGrid.el), 0);\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 * @param saveCB callback for each node -> widget, so application can insert additional data to be saved into the widget data structure.\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, saveCB = GridStack.saveCB): GridStackWidget[] | GridStackOptions {\r\n // return copied GridStackWidget (with optionally .el) we can modify at will...\r\n let list = this.engine.save(saveContent, saveCB);\r\n\r\n // check for HTML content and nested grids\r\n list.forEach(n => {\r\n if (saveContent && n.el && !n.subGrid && !saveCB) { // 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 && !saveCB) { delete n.content; }\r\n // check for nested grid\r\n if (n.subGrid?.el) {\r\n const listOrOpt = n.subGrid.save(saveContent, saveGridOpt, saveCB);\r\n n.subGridOpts = (saveGridOpt ? listOrOpt : {children: listOrOpt}) as GridStackOptions;\r\n delete n.subGrid;\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: InternalGridStackOptions = 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) {\r\n o.cellHeight = 'auto'\r\n }\r\n if (this._autoColumn) {\r\n o.column = 'auto';\r\n delete o.disableOneColumnMode;\r\n }\r\n const origShow = o._alwaysShowResizeHandle;\r\n delete o._alwaysShowResizeHandle;\r\n if (origShow !== undefined) {\r\n o.alwaysShowResizeHandle = origShow;\r\n } else {\r\n delete o.alwaysShowResizeHandle;\r\n }\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[], addRemove: boolean | AddRemoveFcn = GridStack.addRemoveCB || true): GridStack {\r\n let items = GridStack.Utils.sort([...layout], -1, this._prevColumn || this.getColumn()); // 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 for example 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 as number))) {\r\n this._ignoreLayoutsNodeChange = true; // skip layout update\r\n this.engine.cacheLayout(items, this._prevColumn, true);\r\n }\r\n\r\n // if given a different callback, temporally set it as global option so creating will use it\r\n const prevCB = GridStack.addRemoveCB;\r\n if (typeof(addRemove) === 'function') GridStack.addRemoveCB = addRemove as AddRemoveFcn;\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 (addRemove) {\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 (GridStack.addRemoveCB)\r\n GridStack.addRemoveCB(this.el, n, false, false);\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 // now add/update the widgets\r\n items.forEach(w => {\r\n let item = (w.id !== undefined) ? 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.subGridOpts?.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.subGridOpts.children); // TODO: support updating grid options ?\r\n this._insertNotAppend = true; // got reset by above call\r\n }\r\n }\r\n } else if (addRemove) {\r\n this.addWidget(w);\r\n }\r\n });\r\n\r\n this.engine.removedNodes = removed;\r\n this.batchUpdate(false);\r\n\r\n // after commit, clear that flag\r\n delete this._ignoreLayoutsNodeChange;\r\n delete this._insertNotAppend;\r\n prevCB ? GridStack.addRemoveCB = prevCB : delete GridStack.addRemoveCB;\r\n return this;\r\n }\r\n\r\n /**\r\n * use before calling a bunch of `addWidget()` to prevent un-necessary relayouts in between (more efficient)\r\n * and get a single event callback. You will see no changes until `batchUpdate(false)` is called.\r\n */\r\n public batchUpdate(flag = true): GridStack {\r\n this.engine.batchUpdate(flag);\r\n if (!flag) {\r\n this._triggerRemoveEvent();\r\n this._triggerAddEvent();\r\n this._triggerChangeEvent();\r\n }\r\n return this;\r\n }\r\n\r\n /**\r\n * Gets current cell height.\r\n */\r\n public getCellHeight(forcePixel = false): number {\r\n if (this.opts.cellHeight && this.opts.cellHeight !== 'auto' &&\r\n (!forcePixel || !this.opts.cellHeightUnit || this.opts.cellHeightUnit === 'px')) {\r\n return this.opts.cellHeight as number;\r\n }\r\n // else get first cell height\r\n let el = this.el.querySelector('.' + this.opts.itemClass) as HTMLElement;\r\n if (el) {\r\n let height = Utils.toNumber(el.getAttribute('gs-h')) || 1; // since we don't write 1 anymore\r\n return Math.round(el.offsetHeight / height);\r\n }\r\n // else do entire grid and # of rows (but doesn't work if min-height is the actual constrain)\r\n let rows = parseInt(this.el.getAttribute('gs-current-row'));\r\n return rows ? Math.round(this.el.getBoundingClientRect().height / rows) : this.opts.cellHeight as number;\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); // true = force re-create for current # 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.getColumn();\r\n }\r\n /** return our expected width (or parent) for 1 column check */\r\n protected _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 * re-layout grid items to reclaim any empty space. Options are:\r\n * 'list' keep the widget left->right order the same, even if that means leaving an empty slot if things don't fit\r\n * 'compact' might re-order items to fill any empty space\r\n * \r\n * doSort - 'false' to let you do your own sorting ahead in case you need to control a different order. (default to sort)\r\n **/\r\n public compact(layout: CompactOptions = 'compact', doSort = true): GridStack {\r\n this.engine.compact(layout, doSort);\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 (column < 1 || this.opts.column === column) return this;\r\n let oldColumn = this.getColumn();\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('gs-' + oldColumn);\r\n this.el.classList.add('gs-' + 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.columnChanged(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 as number;\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.offAll();\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._styleSheetClass);\r\n this.el.removeAttribute('gs-current-row');\r\n } else {\r\n this.el.parentNode.removeChild(this.el);\r\n }\r\n this._removeStylesheet();\r\n if (this.parentGridItem) delete this.parentGridItem.subGrid;\r\n delete this.parentGridItem;\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 if (this.opts.float !== val) {\r\n this.opts.float = this.engine.float = val;\r\n this._triggerChangeEvent();\r\n }\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.getColumn());\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 (or have some framework creating DOM), 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 * @param options widget definition to use instead of reading attributes or using default sizing values\r\n *\r\n * @example\r\n * let grid = GridStack.init();\r\n * grid.el.appendChild('
');\r\n * grid.el.appendChild('
');\r\n * grid.makeWidget('1');\r\n * grid.makeWidget('2', {w:2, content: 'hello'});\r\n */\r\n public makeWidget(els: GridStackElement, options?: GridStackWidget): GridItemHTMLElement {\r\n let el = GridStack.getElement(els);\r\n this._prepareElement(el, true, options);\r\n this._updateContainerHeight();\r\n\r\n // see if there is a sub-grid to create\r\n const node = el.gridstackNode;\r\n if (node.subGridOpts) {\r\n this.makeSubGrid(el, node.subGridOpts, undefined, false); // node.subGrid will be used as option in method, no need to pass\r\n }\r\n\r\n // if we're adding an item into 1 column (_prevColumn is set only when going to 1) make sure\r\n // we don't override the larger 12 column layout that was already saved. #1985\r\n if (this._prevColumn && this.opts.column === 1) {\r\n this._ignoreLayoutsNodeChange = true;\r\n }\r\n this._triggerAddEvent();\r\n this._triggerChangeEvent();\r\n delete this._ignoreLayoutsNodeChange;\r\n\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 as GridStackEventHandler)(event);\r\n } else {\r\n this._gsEventHandler[name] = (event: CustomEvent) => (callback as GridStackNodesHandler)(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 /** remove all event handlers */\r\n public offAll(): GridStack {\r\n Object.keys(this._gsEventHandler).forEach(key => this.off(key));\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 && 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 if (GridStack.addRemoveCB) {\r\n GridStack.addRemoveCB(this.el, node, false, false);\r\n }\r\n\r\n // remove our DOM data (circular link) and drag&drop permanently\r\n delete el.gridstackNode;\r\n this._removeDD(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 this._removeDD(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 * @param updateClass true (default) if css class gets updated\r\n * @param recurse true (default) if sub-grids also get updated\r\n */\r\n public setStatic(val: boolean, updateClass = true, recurse = true): GridStack {\r\n if (!!this.opts.staticGrid === val) return this;\r\n val ? this.opts.staticGrid = true : delete this.opts.staticGrid;\r\n this._setupRemoveDrop();\r\n this._setupAcceptWidget();\r\n this.engine.nodes.forEach(n => {\r\n this._prepareDragDropByNode(n); // either delete or init Drag&drop\r\n if (n.subGrid && recurse) n.subGrid.setStatic(val, updateClass, recurse);\r\n });\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(el, {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 Utils.sanitizeMinMax(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 protected _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 protected _triggerAddEvent(): GridStack {\r\n if (this.engine.batchMode) return this;\r\n if (this.engine.addedNodes?.length) {\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?.length) {\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 protected _triggerEvent(type: string, data?: GridStackNode[]): GridStack {\r\n let event = data ? new CustomEvent(type, {bubbles: false, detail: data}) : new Event(type);\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 protected _removeStylesheet(): GridStack {\r\n\r\n if (this._styles) {\r\n Utils.removeStylesheet(this._styleSheetClass);\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 protected _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 if (!maxH) maxH = this.getRow();\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._styleSheetClass} > .${this.opts.itemClass}`;\r\n\r\n // create one as needed\r\n if (!this._styles) {\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(this._styleSheetClass, styleLocation, {\r\n nonce: this.opts.nonce,\r\n });\r\n if (!this._styles) return this;\r\n this._styles._max = 0;\r\n\r\n // these are done once only\r\n Utils.addCSSRule(this._styles, prefix, `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._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 Utils.addCSSRule(this._styles, `${prefix}[gs-y=\"${i}\"]`, `top: ${getHeight(i)}`);\r\n Utils.addCSSRule(this._styles, `${prefix}[gs-h=\"${i+1}\"]`, `height: ${getHeight(i+1)}`); // start at 2\r\n }\r\n this._styles._max = maxH;\r\n }\r\n return this;\r\n }\r\n\r\n /** @internal */\r\n protected _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 // Note: we don't handle %,rem correctly so comment out, beside we don't need need to create un-necessary\r\n // rows as the CSS will make us bigger than our set height if needed... not sure why we had this.\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('min-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.minHeight = row * cellHeight + unit;\r\n return this;\r\n }\r\n\r\n /** @internal */\r\n protected _prepareElement(el: GridItemHTMLElement, triggerAddEvent = false, node?: GridStackNode): GridStack {\r\n el.classList.add(this.opts.itemClass);\r\n node = node || this._readAttr(el);\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 protected _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 n.w > 1 ? el.setAttribute('gs-w', String(n.w)) : el.removeAttribute('gs-w');\r\n n.h > 1 ? el.setAttribute('gs-h', String(n.h)) : el.removeAttribute('gs-h');\r\n return this;\r\n }\r\n\r\n /** @internal call to write any default attributes back to element */\r\n protected _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 noResize: 'gs-no-resize',\r\n noMove: 'gs-no-move',\r\n locked: 'gs-locked',\r\n id: 'gs-id',\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 protected _readAttr(el: HTMLElement, clearDefaultAttr = true): GridStackWidget {\r\n let n: GridStackNode = {};\r\n n.x = Utils.toNumber(el.getAttribute('gs-x'));\r\n n.y = Utils.toNumber(el.getAttribute('gs-y'));\r\n n.w = Utils.toNumber(el.getAttribute('gs-w'));\r\n n.h = Utils.toNumber(el.getAttribute('gs-h'));\r\n n.autoPosition = Utils.toBool(el.getAttribute('gs-auto-position'));\r\n n.noResize = Utils.toBool(el.getAttribute('gs-no-resize'));\r\n n.noMove = Utils.toBool(el.getAttribute('gs-no-move'));\r\n n.locked = Utils.toBool(el.getAttribute('gs-locked'));\r\n n.id = el.getAttribute('gs-id');\r\n\r\n // read but never written out\r\n n.maxW = Utils.toNumber(el.getAttribute('gs-max-w'));\r\n n.minW = Utils.toNumber(el.getAttribute('gs-min-w'));\r\n n.maxH = Utils.toNumber(el.getAttribute('gs-max-h'));\r\n n.minH = Utils.toNumber(el.getAttribute('gs-min-h'));\r\n\r\n // v8.x optimization to reduce un-needed attr that don't render or are default CSS\r\n if (clearDefaultAttr) {\r\n if (n.w === 1) el.removeAttribute('gs-w');\r\n if (n.h === 1) el.removeAttribute('gs-h');\r\n if (n.maxW) el.removeAttribute('gs-max-w');\r\n if (n.minW) el.removeAttribute('gs-min-w');\r\n if (n.maxH) el.removeAttribute('gs-max-h');\r\n if (n.minH) el.removeAttribute('gs-min-h');\r\n }\r\n\r\n // remove any key not found (null or false which is default)\r\n for (const key in n) {\r\n if (!n.hasOwnProperty(key)) return;\r\n if (!n[key] && n[key] !== 0) { // 0 can be valid value (x,y only really)\r\n delete n[key];\r\n }\r\n }\r\n\r\n return n;\r\n }\r\n\r\n /** @internal */\r\n protected _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, or get our count from parent, 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 changedColumn = false;\r\n\r\n // see if we're nested and take our column count from our parent....\r\n if (this._autoColumn && this.parentGridItem) {\r\n if (this.opts.column !== this.parentGridItem.w) {\r\n changedColumn = true;\r\n this.column(this.parentGridItem.w, 'none');\r\n }\r\n } else {\r\n // else check for 1 column in/out behavior\r\n let oneColumn = !this.opts.disableOneColumnMode && this.el.clientWidth <= this.opts.oneColumnSize;\r\n if ((this.opts.column === 1) !== oneColumn) {\r\n changedColumn = 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\r\n // make the cells content square again\r\n if (this._isAutoCellHeight) {\r\n if (!changedColumn && 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 column count 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.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 protected _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.parentGridItem;\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 protected _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 static GDRev = '8.3.0';\r\n\r\n /* ===========================================================================================\r\n * drag&drop methods that used to be stubbed out and implemented in dd-gridstack.ts\r\n * but caused loading issues in prod - see https://github.com/gridstack/gridstack.js/issues/2039\r\n * ===========================================================================================\r\n */\r\n\r\n /** get the global (but static to this code) DD implementation */\r\n public static getDD(): DDGridStack {\r\n return dd;\r\n }\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 used) in case the toolbar\r\n * is dynamically create and needs to be set later.\r\n * @param dragIn string selector (ex: '.sidebar .grid-stack-item') or list of dom elements\r\n * @param dragInOptions options - see DDDragInOpt. (default: {handle: '.grid-stack-item-content', appendTo: 'body'}\r\n * @param root optional root which defaults to document (for shadow dom pas the parent HTMLDocument)\r\n **/\r\n public static setupDragIn(dragIn?: string | HTMLElement[], dragInOptions?: DDDragInOpt, root: HTMLElement | Document = document): void {\r\n if (dragInOptions?.pause !== undefined) {\r\n DDManager.pauseDrag = dragInOptions.pause;\r\n }\r\n\r\n dragInOptions = {...dragInDefaultOptions, ...(dragInOptions || {})};\r\n let els: HTMLElement[] = (typeof dragIn === 'string') ? Utils.getElements(dragIn, root) : dragIn;\r\n if (els.length) els?.forEach(el => {\r\n if (!dd.isDraggable(el)) dd.dragIn(el, dragInOptions);\r\n });\r\n }\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, assuming the parent grid isn't noMove or static.\r\n */\r\n public movable(els: GridStackElement, val: boolean): GridStack {\r\n if (this.opts.staticGrid) return this; // can't move a static grid!\r\n GridStack.getElements(els).forEach(el => {\r\n let n = el.gridstackNode;\r\n if (!n) return;\r\n val ? delete n.noMove : n.noMove = true;\r\n this._prepareDragDropByNode(n); // init DD if need be, and adjust\r\n });\r\n return this;\r\n }\r\n\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, assuming the parent grid isn't noResize or static.\r\n */\r\n public resizable(els: GridStackElement, val: boolean): GridStack {\r\n if (this.opts.staticGrid) return this; // can't resize a static grid!\r\n GridStack.getElements(els).forEach(el => {\r\n let n = el.gridstackNode;\r\n if (!n) return;\r\n val ? delete n.noResize : n.noResize = true;\r\n this._prepareDragDropByNode(n); // init DD if need be, and adjust\r\n });\r\n return this;\r\n }\r\n\r\n /**\r\n * Temporarily disables widgets moving/resizing.\r\n * If you want a more permanent way (which freezes up resources) use `setStatic(true)` instead.\r\n * Note: no-op for static grid\r\n * This is a shortcut for:\r\n * @example\r\n * grid.enableMove(false);\r\n * grid.enableResize(false);\r\n * @param recurse true (default) if sub-grids also get updated\r\n */\r\n public disable(recurse = true): GridStack {\r\n if (this.opts.staticGrid) return;\r\n this.enableMove(false, recurse);\r\n this.enableResize(false, recurse);\r\n this._triggerEvent('disable');\r\n return this;\r\n }\r\n /**\r\n * Re-enables widgets moving/resizing - see disable().\r\n * Note: no-op for static grid.\r\n * This is a shortcut for:\r\n * @example\r\n * grid.enableMove(true);\r\n * grid.enableResize(true);\r\n * @param recurse true (default) if sub-grids also get updated\r\n */\r\n public enable(recurse = true): GridStack {\r\n if (this.opts.staticGrid) return;\r\n this.enableMove(true, recurse);\r\n this.enableResize(true, recurse);\r\n this._triggerEvent('enable');\r\n return this;\r\n }\r\n\r\n /**\r\n * Enables/disables widget moving. No-op for static grids, and locally defined items still overrule\r\n * @param recurse true (default) if sub-grids also get updated\r\n */\r\n public enableMove(doEnable: boolean, recurse = true): GridStack {\r\n if (this.opts.staticGrid) return this; // can't move a static grid!\r\n doEnable ? delete this.opts.disableDrag : this.opts.disableDrag = true; // FIRST before we update children as grid overrides #1658\r\n this.engine.nodes.forEach(n => {\r\n this._prepareDragDropByNode(n);\r\n if (n.subGrid && recurse) n.subGrid.enableMove(doEnable, recurse);\r\n });\r\n return this;\r\n }\r\n\r\n /**\r\n * Enables/disables widget resizing. No-op for static grids.\r\n * @param recurse true (default) if sub-grids also get updated\r\n */\r\n public enableResize(doEnable: boolean, recurse = true): GridStack {\r\n if (this.opts.staticGrid) return this; // can't size a static grid!\r\n doEnable ? delete this.opts.disableResize : this.opts.disableResize = true; // FIRST before we update children as grid overrides #1658\r\n this.engine.nodes.forEach(n => {\r\n this._prepareDragDropByNode(n);\r\n if (n.subGrid && recurse) n.subGrid.enableResize(doEnable, recurse);\r\n });\r\n return this;\r\n }\r\n\r\n /** @internal removes any drag&drop present (called during destroy) */\r\n protected _removeDD(el: DDElementHost): GridStack {\r\n dd.draggable(el, 'destroy').resizable(el, 'destroy');\r\n if (el.gridstackNode) {\r\n delete el.gridstackNode._initDD; // reset our DD init flag\r\n }\r\n delete el.ddElement;\r\n return this;\r\n }\r\n\r\n /** @internal called to add drag over to support widgets being added externally */\r\n protected _setupAcceptWidget(): GridStack {\r\n\r\n // check if we need to disable things\r\n if (this.opts.staticGrid || (!this.opts.acceptWidgets && !this.opts.removable)) {\r\n dd.droppable(this.el, 'destroy');\r\n return this;\r\n }\r\n\r\n // vars shared across all methods\r\n let cellHeight: number, cellWidth: number;\r\n\r\n let onDrag = (event: DragEvent, el: GridItemHTMLElement, helper: GridItemHTMLElement) => {\r\n let node = el.gridstackNode;\r\n if (!node) return;\r\n\r\n helper = helper || el;\r\n let parent = this.el.getBoundingClientRect();\r\n let {top, left} = helper.getBoundingClientRect();\r\n left -= parent.left;\r\n top -= parent.top;\r\n let ui: DDUIData = {position: {top, left}};\r\n\r\n if (node._temporaryRemoved) {\r\n node.x = Math.max(0, Math.round(left / cellWidth));\r\n node.y = Math.max(0, Math.round(top / cellHeight));\r\n delete node.autoPosition;\r\n this.engine.nodeBoundFix(node);\r\n\r\n // don't accept *initial* location if doesn't fit #1419 (locked drop region, or can't grow), but maybe try if it will go somewhere\r\n if (!this.engine.willItFit(node)) {\r\n node.autoPosition = true; // ignore x,y and try for any slot...\r\n if (!this.engine.willItFit(node)) {\r\n dd.off(el, 'drag'); // stop calling us\r\n return; // full grid or can't grow\r\n }\r\n if (node._willFitPos) {\r\n // use the auto position instead #1687\r\n Utils.copyPos(node, node._willFitPos);\r\n delete node._willFitPos;\r\n }\r\n }\r\n\r\n // re-use the existing node dragging method\r\n this._onStartMoving(helper, event, ui, node, cellWidth, cellHeight);\r\n } else {\r\n // re-use the existing node dragging that does so much of the collision detection\r\n this._dragOrResize(helper, event, ui, node, cellWidth, cellHeight);\r\n }\r\n }\r\n\r\n dd.droppable(this.el, {\r\n accept: (el: GridItemHTMLElement) => {\r\n let node: GridStackNode = el.gridstackNode;\r\n // set accept drop to true on ourself (which we ignore) so we don't get \"can't drop\" icon in HTML5 mode while moving\r\n if (node?.grid === this) return true;\r\n if (!this.opts.acceptWidgets) return false;\r\n // check for accept method or class matching\r\n let canAccept = true;\r\n if (typeof this.opts.acceptWidgets === 'function') {\r\n canAccept = this.opts.acceptWidgets(el);\r\n } else {\r\n let selector = (this.opts.acceptWidgets === true ? '.grid-stack-item' : this.opts.acceptWidgets as string);\r\n canAccept = el.matches(selector);\r\n }\r\n // finally check to make sure we actually have space left #1571\r\n if (canAccept && node && this.opts.maxRow) {\r\n let n = {w: node.w, h: node.h, minW: node.minW, minH: node.minH}; // only width/height matters and autoPosition\r\n canAccept = this.engine.willItFit(n);\r\n }\r\n return canAccept;\r\n }\r\n })\r\n /**\r\n * entering our grid area\r\n */\r\n .on(this.el, 'dropover', (event: Event, el: GridItemHTMLElement, helper: GridItemHTMLElement) => {\r\n // console.log(`over ${this.el.gridstack.opts.id} ${count++}`); // TEST\r\n let node = el.gridstackNode;\r\n // ignore drop enter on ourself (unless we temporarily removed) which happens on a simple drag of our item\r\n if (node?.grid === this && !node._temporaryRemoved) {\r\n // delete node._added; // reset this to track placeholder again in case we were over other grid #1484 (dropout doesn't always clear)\r\n return false; // prevent parent from receiving msg (which may be a grid as well)\r\n }\r\n\r\n // fix #1578 when dragging fast, we may not get a leave on the previous grid so force one now\r\n if (node?.grid && node.grid !== this && !node._temporaryRemoved) {\r\n // console.log('dropover without leave'); // TEST\r\n let otherGrid = node.grid;\r\n otherGrid._leave(el, helper);\r\n }\r\n\r\n // cache cell dimensions (which don't change), position can animate if we removed an item in otherGrid that affects us...\r\n cellWidth = this.cellWidth();\r\n cellHeight = this.getCellHeight(true);\r\n\r\n // load any element attributes if we don't have a node\r\n if (!node) {\r\n node = this._readAttr(el, false); // don't wipe external (e.g. drag toolbar) attr #2354\r\n }\r\n if (!node.grid) {\r\n node._isExternal = true;\r\n el.gridstackNode = node;\r\n }\r\n\r\n // calculate the grid size based on element outer size\r\n helper = helper || el;\r\n let w = node.w || Math.round(helper.offsetWidth / cellWidth) || 1;\r\n let h = node.h || Math.round(helper.offsetHeight / cellHeight) || 1;\r\n\r\n // if the item came from another grid, make a copy and save the original info in case we go back there\r\n if (node.grid && node.grid !== this) {\r\n // copy the node original values (min/max/id/etc...) but override width/height/other flags which are this grid specific\r\n // console.log('dropover cloning node'); // TEST\r\n if (!el._gridstackNodeOrig) el._gridstackNodeOrig = node; // shouldn't have multiple nested!\r\n el.gridstackNode = node = {...node, w, h, grid: this};\r\n this.engine.cleanupNode(node)\r\n .nodeBoundFix(node);\r\n // restore some internal fields we need after clearing them all\r\n node._initDD =\r\n node._isExternal = // DOM needs to be re-parented on a drop\r\n node._temporaryRemoved = true; // so it can be inserted onDrag below\r\n } else {\r\n node.w = w; node.h = h;\r\n node._temporaryRemoved = true; // so we can insert it\r\n }\r\n\r\n // clear any marked for complete removal (Note: don't check _isAboutToRemove as that is cleared above - just do it)\r\n this._itemRemoving(node.el, false);\r\n\r\n dd.on(el, 'drag', onDrag);\r\n // make sure this is called at least once when going fast #1578\r\n onDrag(event as DragEvent, el, helper);\r\n return false; // prevent parent from receiving msg (which may be a grid as well)\r\n })\r\n /**\r\n * Leaving our grid area...\r\n */\r\n .on(this.el, 'dropout', (event, el: GridItemHTMLElement, helper: GridItemHTMLElement) => {\r\n // console.log(`out ${this.el.gridstack.opts.id} ${count++}`); // TEST\r\n let node = el.gridstackNode;\r\n if (!node) return false;\r\n // fix #1578 when dragging fast, we might get leave after other grid gets enter (which calls us to clean)\r\n // so skip this one if we're not the active grid really..\r\n if (!node.grid || node.grid === this) {\r\n this._leave(el, helper);\r\n // if we were created as temporary nested grid, go back to before state\r\n if (this._isTemp) {\r\n this.removeAsSubGrid(node);\r\n }\r\n }\r\n return false; // prevent parent from receiving msg (which may be grid as well)\r\n })\r\n /**\r\n * end - releasing the mouse\r\n */\r\n .on(this.el, 'drop', (event, el: GridItemHTMLElement, helper: GridItemHTMLElement) => {\r\n let node = el.gridstackNode;\r\n // ignore drop on ourself from ourself that didn't come from the outside - dragend will handle the simple move instead\r\n if (node?.grid === this && !node._isExternal) return false;\r\n\r\n let wasAdded = !!this.placeholder.parentElement; // skip items not actually added to us because of constrains, but do cleanup #1419\r\n this.placeholder.remove();\r\n\r\n // notify previous grid of removal\r\n // console.log('drop delete _gridstackNodeOrig') // TEST\r\n let origNode = el._gridstackNodeOrig;\r\n delete el._gridstackNodeOrig;\r\n if (wasAdded && origNode?.grid && origNode.grid !== this) {\r\n let oGrid = origNode.grid;\r\n oGrid.engine.removedNodes.push(origNode);\r\n oGrid._triggerRemoveEvent()._triggerChangeEvent();\r\n // if it's an empty sub-grid that got auto-created, nuke it\r\n if (oGrid.parentGridItem && !oGrid.engine.nodes.length && oGrid.opts.subGridDynamic) {\r\n oGrid.removeAsSubGrid();\r\n }\r\n }\r\n\r\n if (!node) return false;\r\n\r\n // use existing placeholder node as it's already in our list with drop location\r\n if (wasAdded) {\r\n this.engine.cleanupNode(node); // removes all internal _xyz values\r\n node.grid = this;\r\n }\r\n dd.off(el, 'drag');\r\n // if we made a copy ('helper' which is temp) of the original node then insert a copy, else we move the original node (#1102)\r\n // as the helper will be nuked by jquery-ui otherwise. TODO: update old code path\r\n if (helper !== el) {\r\n helper.remove();\r\n el.gridstackNode = origNode; // original item (left behind) is re-stored to pre dragging as the node now has drop info\r\n if (wasAdded) {\r\n el = el.cloneNode(true) as GridItemHTMLElement;\r\n }\r\n } else {\r\n el.remove(); // reduce flicker as we change depth here, and size further down\r\n this._removeDD(el);\r\n }\r\n if (!wasAdded) return false;\r\n el.gridstackNode = node;\r\n node.el = el;\r\n let subGrid = node.subGrid?.el?.gridstack; // set when actual sub-grid present\r\n // @ts-ignore\r\n Utils.copyPos(node, this._readAttr(this.placeholder)); // placeholder values as moving VERY fast can throw things off #1578\r\n Utils.removePositioningStyles(el);// @ts-ignore\r\n this._writeAttr(el, node);\r\n el.classList.add(gridDefaults.itemClass, this.opts.itemClass);\r\n this.el.appendChild(el);// @ts-ignore // TODO: now would be ideal time to _removeHelperStyle() overriding floating styles (native only)\r\n if (subGrid) {\r\n subGrid.parentGridItem = node;\r\n if (!subGrid.opts.styleInHead) subGrid._updateStyles(true); // re-create sub-grid styles now that we've moved\r\n }\r\n this._updateContainerHeight();\r\n this.engine.addedNodes.push(node);// @ts-ignore\r\n this._triggerAddEvent();// @ts-ignore\r\n this._triggerChangeEvent();\r\n\r\n this.engine.endUpdate();\r\n if (this._gsEventHandler['dropped']) {\r\n this._gsEventHandler['dropped']({...event, type: 'dropped'}, origNode && origNode.grid ? origNode : undefined, node);\r\n }\r\n\r\n // wait till we return out of the drag callback to set the new drag&resize handler or they may get messed up\r\n window.setTimeout(() => {\r\n // IFF we are still there (some application will use as placeholder and insert their real widget instead and better call makeWidget())\r\n if (node.el && node.el.parentElement) {\r\n this._prepareDragDropByNode(node);\r\n } else {\r\n this.engine.removeNode(node);\r\n }\r\n delete node.grid._isTemp;\r\n });\r\n\r\n return false; // prevent parent from receiving msg (which may be grid as well)\r\n });\r\n return this;\r\n }\r\n\r\n /** @internal mark item for removal */\r\n private _itemRemoving(el: GridItemHTMLElement, remove: boolean) {\r\n let node = el ? el.gridstackNode : undefined;\r\n if (!node || !node.grid) return;\r\n remove ? node._isAboutToRemove = true : delete node._isAboutToRemove;\r\n remove ? el.classList.add('grid-stack-item-removing') : el.classList.remove('grid-stack-item-removing');\r\n }\r\n\r\n /** @internal called to setup a trash drop zone if the user specifies it */\r\n protected _setupRemoveDrop(): GridStack {\r\n if (!this.opts.staticGrid && typeof this.opts.removable === 'string') {\r\n let trashEl = document.querySelector(this.opts.removable) as HTMLElement;\r\n if (!trashEl) return this;\r\n // only register ONE drop-over/dropout callback for the 'trash', and it will\r\n // update the passed in item and parent grid because the 'trash' is a shared resource anyway,\r\n // and Native DD only has 1 event CB (having a list and technically a per grid removableOptions complicates things greatly)\r\n if (!dd.isDroppable(trashEl)) {\r\n dd.droppable(trashEl, this.opts.removableOptions)\r\n .on(trashEl, 'dropover', (event, el) => this._itemRemoving(el, true))\r\n .on(trashEl, 'dropout', (event, el) => this._itemRemoving(el, false));\r\n }\r\n }\r\n return this;\r\n }\r\n\r\n /** @internal prepares the element for drag&drop **/\r\n protected _prepareDragDropByNode(node: GridStackNode): GridStack {\r\n let el = node.el;\r\n const noMove = node.noMove || this.opts.disableDrag;\r\n const noResize = node.noResize || this.opts.disableResize;\r\n\r\n // check for disabled grid first\r\n if (this.opts.staticGrid || (noMove && noResize)) {\r\n if (node._initDD) {\r\n this._removeDD(el); // nukes everything instead of just disable, will add some styles back next\r\n delete node._initDD;\r\n }\r\n el.classList.add('ui-draggable-disabled', 'ui-resizable-disabled'); // add styles one might depend on #1435\r\n return this;\r\n }\r\n\r\n if (!node._initDD) {\r\n // variables used/cashed between the 3 start/move/end methods, in addition to node passed above\r\n let cellWidth: number;\r\n let cellHeight: number;\r\n\r\n /** called when item starts moving/resizing */\r\n let onStartMoving = (event: Event, ui: DDUIData) => {\r\n // trigger any 'dragstart' / 'resizestart' manually\r\n if (this._gsEventHandler[event.type]) {\r\n this._gsEventHandler[event.type](event, event.target);\r\n }\r\n cellWidth = this.cellWidth();\r\n cellHeight = this.getCellHeight(true); // force pixels for calculations\r\n\r\n this._onStartMoving(el, event, ui, node, cellWidth, cellHeight);\r\n }\r\n\r\n /** called when item is being dragged/resized */\r\n let dragOrResize = (event: MouseEvent, ui: DDUIData) => {\r\n this._dragOrResize(el, event, ui, node, cellWidth, cellHeight);\r\n }\r\n\r\n /** called when the item stops moving/resizing */\r\n let onEndMoving = (event: Event) => {\r\n this.placeholder.remove();\r\n delete node._moving;\r\n delete node._event;\r\n delete node._lastTried;\r\n\r\n // if the item has moved to another grid, we're done here\r\n let target: GridItemHTMLElement = event.target as GridItemHTMLElement;\r\n if (!target.gridstackNode || target.gridstackNode.grid !== this) return;\r\n\r\n node.el = target;\r\n\r\n if (node._isAboutToRemove) {\r\n let gridToNotify = el.gridstackNode.grid;\r\n if (gridToNotify._gsEventHandler[event.type]) {\r\n gridToNotify._gsEventHandler[event.type](event, target);\r\n }\r\n this._removeDD(el);\r\n gridToNotify.engine.removedNodes.push(node);\r\n gridToNotify._triggerRemoveEvent();\r\n // break circular links and remove DOM\r\n delete el.gridstackNode;\r\n delete node.el;\r\n el.remove();\r\n } else {\r\n Utils.removePositioningStyles(target);\r\n if (node._temporaryRemoved) {\r\n // got removed - restore item back to before dragging position\r\n Utils.copyPos(node, node._orig);// @ts-ignore\r\n this._writePosAttr(target, node);\r\n this.engine.addNode(node);\r\n } else {\r\n // move to new placeholder location\r\n this._writePosAttr(target, node);\r\n }\r\n if (this._gsEventHandler[event.type]) {\r\n this._gsEventHandler[event.type](event, target);\r\n }\r\n }\r\n // @ts-ignore\r\n this._extraDragRow = 0;// @ts-ignore\r\n this._updateContainerHeight();// @ts-ignore\r\n this._triggerChangeEvent();\r\n\r\n this.engine.endUpdate();\r\n }\r\n\r\n dd.draggable(el, {\r\n start: onStartMoving,\r\n stop: onEndMoving,\r\n drag: dragOrResize\r\n }).resizable(el, {\r\n start: onStartMoving,\r\n stop: onEndMoving,\r\n resize: dragOrResize\r\n });\r\n node._initDD = true; // we've set DD support now\r\n }\r\n\r\n // finally fine tune move vs resize by disabling any part...\r\n dd.draggable(el, noMove ? 'disable' : 'enable')\r\n .resizable(el, noResize ? 'disable' : 'enable');\r\n\r\n return this;\r\n }\r\n\r\n /** @internal handles actual drag/resize start **/\r\n protected _onStartMoving(el: GridItemHTMLElement, event: Event, ui: DDUIData, node: GridStackNode, cellWidth: number, cellHeight: number): void {\r\n this.engine.cleanNodes()\r\n .beginUpdate(node);\r\n // @ts-ignore\r\n this._writePosAttr(this.placeholder, node)\r\n this.el.appendChild(this.placeholder);\r\n // console.log('_onStartMoving placeholder') // TEST\r\n\r\n node.el = this.placeholder;\r\n node._lastUiPosition = ui.position;\r\n node._prevYPix = ui.position.top;\r\n node._moving = (event.type === 'dragstart'); // 'dropover' are not initially moving so they can go exactly where they enter (will push stuff out of the way)\r\n delete node._lastTried;\r\n\r\n if (event.type === 'dropover' && node._temporaryRemoved) {\r\n // console.log('engine.addNode x=' + node.x); // TEST\r\n this.engine.addNode(node); // will add, fix collisions, update attr and clear _temporaryRemoved\r\n node._moving = true; // AFTER, mark as moving object (wanted fix location before)\r\n }\r\n\r\n // set the min/max resize info\r\n this.engine.cacheRects(cellWidth, cellHeight, this.opts.marginTop as number, this.opts.marginRight as number, this.opts.marginBottom as number, this.opts.marginLeft as number);\r\n if (event.type === 'resizestart') {\r\n dd.resizable(el, 'option', 'minWidth', cellWidth * (node.minW || 1))\r\n .resizable(el, 'option', 'minHeight', cellHeight * (node.minH || 1));\r\n if (node.maxW) { dd.resizable(el, 'option', 'maxWidth', cellWidth * node.maxW); }\r\n if (node.maxH) { dd.resizable(el, 'option', 'maxHeight', cellHeight * node.maxH); }\r\n }\r\n }\r\n\r\n /** @internal handles actual drag/resize **/\r\n protected _dragOrResize(el: GridItemHTMLElement, event: MouseEvent, ui: DDUIData, node: GridStackNode, cellWidth: number, cellHeight: number): void {\r\n let p = {...node._orig}; // could be undefined (_isExternal) which is ok (drag only set x,y and w,h will default to node value)\r\n let resizing: boolean;\r\n let mLeft = this.opts.marginLeft as number,\r\n mRight = this.opts.marginRight as number,\r\n mTop = this.opts.marginTop as number,\r\n mBottom = this.opts.marginBottom as number;\r\n\r\n // if margins (which are used to pass mid point by) are large relative to cell height/width, reduce them down #1855\r\n let mHeight = Math.round(cellHeight * 0.1),\r\n mWidth = Math.round(cellWidth * 0.1);\r\n mLeft = Math.min(mLeft, mWidth);\r\n mRight = Math.min(mRight, mWidth);\r\n mTop = Math.min(mTop, mHeight);\r\n mBottom = Math.min(mBottom, mHeight);\r\n\r\n if (event.type === 'drag') {\r\n if (node._temporaryRemoved) return; // handled by dropover\r\n let distance = ui.position.top - node._prevYPix;\r\n node._prevYPix = ui.position.top;\r\n if (this.opts.draggable.scroll !== false) {\r\n Utils.updateScrollPosition(el, ui.position, distance);\r\n }\r\n\r\n // get new position taking into account the margin in the direction we are moving! (need to pass mid point by margin)\r\n let left = ui.position.left + (ui.position.left > node._lastUiPosition.left ? -mRight : mLeft);\r\n let top = ui.position.top + (ui.position.top > node._lastUiPosition.top ? -mBottom : mTop);\r\n p.x = Math.round(left / cellWidth);\r\n p.y = Math.round(top / cellHeight);\r\n\r\n // @ts-ignore// if we're at the bottom hitting something else, grow the grid so cursor doesn't leave when trying to place below others\r\n let prev = this._extraDragRow;\r\n if (this.engine.collide(node, p)) {\r\n let row = this.getRow();\r\n let extra = Math.max(0, (p.y + node.h) - row);\r\n if (this.opts.maxRow && row + extra > this.opts.maxRow) {\r\n extra = Math.max(0, this.opts.maxRow - row);\r\n }// @ts-ignore\r\n this._extraDragRow = extra;// @ts-ignore\r\n } else this._extraDragRow = 0;// @ts-ignore\r\n if (this._extraDragRow !== prev) this._updateContainerHeight();\r\n\r\n if (node.x === p.x && node.y === p.y) return; // skip same\r\n // DON'T skip one we tried as we might have failed because of coverage <50% before\r\n // if (node._lastTried && node._lastTried.x === x && node._lastTried.y === y) return;\r\n } else if (event.type === 'resize') {\r\n if (p.x < 0) return;\r\n // Scrolling page if needed\r\n Utils.updateScrollResize(event, el, cellHeight);\r\n\r\n // get new size\r\n p.w = Math.round((ui.size.width - mLeft) / cellWidth);\r\n p.h = Math.round((ui.size.height - mTop) / cellHeight);\r\n if (node.w === p.w && node.h === p.h) return;\r\n if (node._lastTried && node._lastTried.w === p.w && node._lastTried.h === p.h) return; // skip one we tried (but failed)\r\n\r\n // if we size on left/top side this might move us, so get possible new position as well\r\n let left = ui.position.left + mLeft;\r\n let top = ui.position.top + mTop;\r\n p.x = Math.round(left / cellWidth);\r\n p.y = Math.round(top / cellHeight);\r\n\r\n resizing = true;\r\n }\r\n\r\n node._event = event;\r\n node._lastTried = p; // set as last tried (will nuke if we go there)\r\n let rect: GridStackPosition = { // screen pix of the dragged box\r\n x: ui.position.left + mLeft,\r\n y: ui.position.top + mTop,\r\n w: (ui.size ? ui.size.width : node.w * cellWidth) - mLeft - mRight,\r\n h: (ui.size ? ui.size.height : node.h * cellHeight) - mTop - mBottom\r\n };\r\n if (this.engine.moveNodeCheck(node, {...p, cellWidth, cellHeight, rect, resizing})) {\r\n node._lastUiPosition = ui.position;\r\n this.engine.cacheRects(cellWidth, cellHeight, mTop, mRight, mBottom, mLeft);\r\n delete node._skipDown;\r\n if (resizing && node.subGrid) node.subGrid.onParentResize();\r\n this._extraDragRow = 0;// @ts-ignore\r\n this._updateContainerHeight();\r\n\r\n let target = event.target as GridItemHTMLElement;// @ts-ignore\r\n this._writePosAttr(target, node);\r\n if (this._gsEventHandler[event.type]) {\r\n this._gsEventHandler[event.type](event, target);\r\n }\r\n }\r\n }\r\n\r\n /** @internal called when item leaving our area by either cursor dropout event\r\n * or shape is outside our boundaries. remove it from us, and mark temporary if this was\r\n * our item to start with else restore prev node values from prev grid it came from.\r\n **/\r\n protected _leave(el: GridItemHTMLElement, helper?: GridItemHTMLElement): void {\r\n let node = el.gridstackNode;\r\n if (!node) return;\r\n\r\n dd.off(el, 'drag'); // no need to track while being outside\r\n\r\n // this gets called when cursor leaves and shape is outside, so only do this once\r\n if (node._temporaryRemoved) return;\r\n node._temporaryRemoved = true;\r\n\r\n this.engine.removeNode(node); // remove placeholder as well, otherwise it's a sign node is not in our list, which is a bigger issue\r\n node.el = node._isExternal && helper ? helper : el; // point back to real item being dragged\r\n\r\n if (this.opts.removable === true) { // boolean vs a class string\r\n // item leaving us and we are supposed to remove on leave (no need to drag onto trash) mark it so\r\n this._itemRemoving(el, true);\r\n }\r\n\r\n // finally if item originally came from another grid, but left us, restore things back to prev info\r\n if (el._gridstackNodeOrig) {\r\n // console.log('leave delete _gridstackNodeOrig') // TEST\r\n el.gridstackNode = el._gridstackNodeOrig;\r\n delete el._gridstackNodeOrig;\r\n } else if (node._isExternal) {\r\n // item came from outside (like a toolbar) so nuke any node info\r\n delete node.el;\r\n delete el.gridstackNode;\r\n // and restore all nodes back to original\r\n this.engine.restoreInitial();\r\n }\r\n }\r\n\r\n // legacy method removed\r\n public commit(): GridStack { obsolete(this, this.batchUpdate(false), 'commit', 'batchUpdate', '5.2'); return this; }\r\n}\r\n","/**\r\n * types.ts 8.3.0\r\n * Copyright (c) 2021 Alain Dumesny - see GridStack root license\r\n */\r\n\r\nimport { GridStack } from './gridstack';\r\nimport { GridStackEngine } from './gridstack-engine';\r\n\r\n// default values for grid options - used during init and when saving out\r\nexport const gridDefaults: GridStackOptions = {\r\n alwaysShowResizeHandle: 'mobile',\r\n animate: true,\r\n auto: true,\r\n cellHeight: 'auto',\r\n cellHeightThrottle: 100,\r\n cellHeightUnit: 'px',\r\n column: 12,\r\n draggable: { handle: '.grid-stack-item-content', appendTo: 'body', scroll: true },\r\n handle: '.grid-stack-item-content',\r\n itemClass: 'grid-stack-item',\r\n margin: 10,\r\n marginUnit: 'px',\r\n maxRow: 0,\r\n minRow: 0,\r\n oneColumnSize: 768,\r\n placeholderClass: 'grid-stack-placeholder',\r\n placeholderText: '',\r\n removableOptions: { accept: '.grid-stack-item' },\r\n resizable: { handles: 'se' },\r\n rtl: 'auto',\r\n\r\n // **** same as not being set ****\r\n // disableDrag: false,\r\n // disableOneColumnMode: false,\r\n // disableResize: false,\r\n // float: false,\r\n // handleClass: null,\r\n // oneColumnModeDomSort: false,\r\n // removable: false,\r\n // staticGrid: false,\r\n // styleInHead: false,\r\n};\r\n\r\n/** default dragIn options */\r\nexport const dragInDefaultOptions: DDDragInOpt = {\r\n handle: '.grid-stack-item-content',\r\n appendTo: 'body',\r\n // revert: 'invalid',\r\n // scroll: false,\r\n};\r\n\r\n/** \r\n * different layout options when changing # of columns, including a custom function that takes new/old column count, and array of new/old positions\r\n * Note: new list may be partially already filled if we have a cache of the layout at that size and new items were added later.\r\n * Options are:\r\n * 'list' - treat items as sorted list, keeping items (un-sized unless too big for column count) sequentially reflowing them\r\n * 'compact' - similar to list, but using compact() method which will possibly re-order items if an empty slots are available due to a larger item needing to be pushed to next row\r\n * 'moveScale' - will scale and move items by the ratio new newColumnCount / oldColumnCount\r\n * 'move' | 'scale' - will only size or move items\r\n * 'none' will leave items unchanged, unless they don't fit in column count\r\n */\r\nexport type ColumnOptions = 'list' | 'compact' | 'moveScale' | 'move' | 'scale' | 'none' |\r\n ((column: number, oldColumn: number, nodes: GridStackNode[], oldNodes: GridStackNode[]) => void);\r\nexport type CompactOptions = 'list' | 'compact';\r\nexport type numberOrString = number | string;\r\nexport interface GridItemHTMLElement extends HTMLElement {\r\n /** pointer to grid node instance */\r\n gridstackNode?: GridStackNode;\r\n /** @internal */\r\n _gridstackNodeOrig?: GridStackNode;\r\n}\r\n\r\nexport type GridStackElement = string | HTMLElement | GridItemHTMLElement;\r\n\r\n/** specific and general event handlers for the .on() method */\r\nexport type GridStackEventHandler = (event: Event) => void;\r\nexport type GridStackElementHandler = (event: Event, el: GridItemHTMLElement) => void;\r\nexport type GridStackNodesHandler = (event: Event, nodes: GridStackNode[]) => void;\r\nexport type GridStackDroppedHandler = (event: Event, previousNode: GridStackNode, newNode: GridStackNode) => void;\r\nexport type GridStackEventHandlerCallback = GridStackEventHandler | GridStackElementHandler | GridStackNodesHandler | GridStackDroppedHandler;\r\n\r\n/** optional function called during load() to callback the user on new added/remove grid items | grids */\r\nexport type AddRemoveFcn = (parent: HTMLElement, w: GridStackWidget, add: boolean, grid: boolean) => HTMLElement | undefined;\r\n\r\n/** optional function called during save() to let the caller add additional custom data to the GridStackWidget structure that will get returned */\r\nexport type SaveFcn = (node: GridStackNode, w: GridStackWidget) => void;\r\n\r\n\r\n/**\r\n * Defines the options for a Grid\r\n */\r\nexport interface GridStackOptions {\r\n /**\r\n * accept widgets dragged from other grids or from outside (default: `false`). Can be:\r\n * `true` (uses `'.grid-stack-item'` class filter) or `false`,\r\n * string for explicit class name,\r\n * function returning a boolean. See [example](http://gridstack.github.io/gridstack.js/demo/two.html)\r\n */\r\n acceptWidgets?: boolean | string | ((element: Element) => boolean);\r\n\r\n /** possible values (default: `mobile`) - does not apply to non-resizable widgets\r\n * `false` the resizing handles are only shown while hovering over a widget\r\n * `true` the resizing handles are always shown\r\n * 'mobile' if running on a mobile device, default to `true` (since there is no hovering per say), else `false`.\r\n See [example](http://gridstack.github.io/gridstack.js/demo/mobile.html) */\r\n alwaysShowResizeHandle?: true | false | 'mobile';\r\n\r\n /** turns animation on (default?: true) */\r\n animate?: boolean;\r\n\r\n /** if false gridstack will not initialize existing items (default?: true) */\r\n auto?: boolean;\r\n\r\n /**\r\n * one cell height (default?: 'auto'). Can be:\r\n * an integer (px)\r\n * a string (ex: '100px', '10em', '10rem'). Note: % doesn't right - see demo/cell-height.html\r\n * 0, in which case the library will not generate styles for rows. Everything must be defined in your own CSS files.\r\n * 'auto' - height will be calculated for square cells (width / column) and updated live as you resize the window - also see `cellHeightThrottle`\r\n * 'initial' - similar to 'auto' (start at square cells) but stay that size during window resizing.\r\n */\r\n cellHeight?: numberOrString;\r\n\r\n /** throttle time delay (in ms) used when cellHeight='auto' to improve performance vs usability (default?: 100).\r\n * A value of 0 will make it instant at a cost of re-creating the CSS file at ever window resize event!\r\n * */\r\n cellHeightThrottle?: number;\r\n\r\n /** (internal) unit for cellHeight (default? 'px') which is set when a string cellHeight with a unit is passed (ex: '10rem') */\r\n cellHeightUnit?: string;\r\n\r\n /** list of children item to create when calling load() or addGrid() */\r\n children?: GridStackWidget[];\r\n\r\n /** number of columns (default?: 12). Note: IF you change this, CSS also have to change. See https://github.com/gridstack/gridstack.js#change-grid-columns.\r\n * Note: for nested grids, it is recommended to use 'auto' which will always match the container grid-item current width (in column) to keep inside and outside\r\n * items always to same. flag is not supported for regular non-nested grids.\r\n */\r\n column?: number | 'auto';\r\n\r\n /** additional class on top of '.grid-stack' (which is required for our CSS) to differentiate this instance.\r\n Note: only used by addGrid(), else your element should have the needed class */\r\n class?: string;\r\n\r\n /** disallows dragging of widgets (default?: false) */\r\n disableDrag?: boolean;\r\n\r\n /** disables the onColumnMode when the grid width is less than oneColumnSize (default?: false) */\r\n disableOneColumnMode?: boolean;\r\n\r\n /** disallows resizing of widgets (default?: false). */\r\n disableResize?: boolean;\r\n\r\n /** allows to override UI draggable options. (default?: { handle?: '.grid-stack-item-content', appendTo?: 'body' }) */\r\n draggable?: DDDragOpt;\r\n\r\n /** let user drag nested grid items out of a parent or not (default true - not supported yet) */\r\n //dragOut?: boolean;\r\n\r\n /** the type of engine to create (so you can subclass) default to GridStackEngine */\r\n engineClass?: typeof GridStackEngine;\r\n\r\n /** enable floating widgets (default?: false) See example (http://gridstack.github.io/gridstack.js/demo/float.html) */\r\n float?: boolean;\r\n\r\n /** draggable handle selector (default?: '.grid-stack-item-content') */\r\n handle?: string;\r\n\r\n /** draggable handle class (e.g. 'grid-stack-item-content'). If set 'handle' is ignored (default?: null) */\r\n handleClass?: string;\r\n\r\n /** additional widget class (default?: 'grid-stack-item') */\r\n itemClass?: string;\r\n\r\n /**\r\n * gap between grid item and content (default?: 10). This will set all 4 sides and support the CSS formats below\r\n * an integer (px)\r\n * a string with possible units (ex: '2em', '20px', '2rem')\r\n * string with space separated values (ex: '5px 10px 0 20px' for all 4 sides, or '5em 10em' for top/bottom and left/right pairs like CSS).\r\n * Note: all sides must have same units (last one wins, default px)\r\n */\r\n margin?: numberOrString;\r\n\r\n /** OLD way to optionally set each side - use margin: '5px 10px 0 20px' instead. Used internally to store each side. */\r\n marginTop?: numberOrString;\r\n marginRight?: numberOrString;\r\n marginBottom?: numberOrString;\r\n marginLeft?: numberOrString;\r\n\r\n /** (internal) unit for margin (default? 'px') set when `margin` is set as string with unit (ex: 2rem') */\r\n marginUnit?: string;\r\n\r\n /** maximum rows amount. Default? is 0 which means no maximum rows */\r\n maxRow?: number;\r\n\r\n /** minimum rows amount. Default is `0`. You can also do this with `min-height` CSS attribute\r\n * on the grid div in pixels, which will round to the closest row.\r\n */\r\n minRow?: number;\r\n\r\n /** If you are using a nonce-based Content Security Policy, pass your nonce here and\r\n * GridStack will add it to the