UNPKG

gridstack

Version:

TypeScript/JS lib for dashboard layout and creation, responsive, mobile support, no external dependencies, with many wrappers (React, Angular, Vue, Ember, knockout...)

138 lines 5.48 kB
/** * dd-gridstack.ts 11.3.0 * Copyright (c) 2021-2024 Alain Dumesny - see GridStack root license */ import { Utils } from './utils'; import { DDManager } from './dd-manager'; import { DDElement } from './dd-element'; // let count = 0; // TEST /** * HTML Native Mouse and Touch Events Drag and Drop functionality. */ export class DDGridStack { resizable(el, opts, key, value) { this._getDDElements(el).forEach(dEl => { if (opts === 'disable' || opts === 'enable') { dEl.ddResizable && dEl.ddResizable[opts](); // can't create DD as it requires options for setupResizable() } else if (opts === 'destroy') { dEl.ddResizable && dEl.cleanResizable(); } else if (opts === 'option') { dEl.setupResizable({ [key]: value }); } else { const n = dEl.el.gridstackNode; const grid = n.grid; let handles = dEl.el.getAttribute('gs-resize-handles') || grid.opts.resizable.handles || 'e,s,se'; if (handles === 'all') handles = 'n,e,s,w,se,sw,ne,nw'; // NOTE: keep the resize handles as e,w don't have enough space (10px) to show resize corners anyway. limit during drag instead // restrict vertical resize if height is done to match content anyway... odd to have it spring back // if (Utils.shouldSizeToContent(n, true)) { // const doE = handles.indexOf('e') !== -1; // const doW = handles.indexOf('w') !== -1; // handles = doE ? (doW ? 'e,w' : 'e') : (doW ? 'w' : ''); // } const autoHide = !grid.opts.alwaysShowResizeHandle; dEl.setupResizable({ ...grid.opts.resizable, ...{ handles, autoHide }, ...{ start: opts.start, stop: opts.stop, resize: opts.resize } }); } }); return this; } draggable(el, opts, key, value) { this._getDDElements(el).forEach(dEl => { if (opts === 'disable' || opts === 'enable') { dEl.ddDraggable && dEl.ddDraggable[opts](); // can't create DD as it requires options for setupDraggable() } else if (opts === 'destroy') { dEl.ddDraggable && dEl.cleanDraggable(); } else if (opts === 'option') { dEl.setupDraggable({ [key]: value }); } else { const grid = dEl.el.gridstackNode.grid; dEl.setupDraggable({ ...grid.opts.draggable, ...{ // containment: (grid.parentGridNode && grid.opts.dragOut === false) ? grid.el.parentElement : (grid.opts.draggable.containment || null), start: opts.start, stop: opts.stop, drag: opts.drag } }); } }); return this; } dragIn(el, opts) { this._getDDElements(el).forEach(dEl => dEl.setupDraggable(opts)); return this; } droppable(el, opts, key, value) { if (typeof opts.accept === 'function' && !opts._accept) { opts._accept = opts.accept; opts.accept = (el) => opts._accept(el); } this._getDDElements(el).forEach(dEl => { if (opts === 'disable' || opts === 'enable') { dEl.ddDroppable && dEl.ddDroppable[opts](); } else if (opts === 'destroy') { if (dEl.ddDroppable) { // error to call destroy if not there dEl.cleanDroppable(); } } else if (opts === 'option') { dEl.setupDroppable({ [key]: value }); } else { dEl.setupDroppable(opts); } }); return this; } /** true if element is droppable */ isDroppable(el) { return !!(el?.ddElement?.ddDroppable && !el.ddElement.ddDroppable.disabled); } /** true if element is draggable */ isDraggable(el) { return !!(el?.ddElement?.ddDraggable && !el.ddElement.ddDraggable.disabled); } /** true if element is draggable */ isResizable(el) { return !!(el?.ddElement?.ddResizable && !el.ddElement.ddResizable.disabled); } on(el, name, callback) { this._getDDElements(el).forEach(dEl => dEl.on(name, (event) => { callback(event, DDManager.dragElement ? DDManager.dragElement.el : event.target, DDManager.dragElement ? DDManager.dragElement.helper : null); })); return this; } off(el, name) { this._getDDElements(el).forEach(dEl => dEl.off(name)); return this; } /** @internal returns a list of DD elements, creating them on the fly by default */ _getDDElements(els, create = true) { const hosts = Utils.getElements(els); if (!hosts.length) return []; const list = hosts.map(e => e.ddElement || (create ? DDElement.init(e) : null)); if (!create) { list.filter(d => d); } // remove nulls return list; } } //# sourceMappingURL=dd-gridstack.js.map