|
6 | 6 | * gridstack.js may be freely distributed under the MIT license. |
7 | 7 | */ |
8 | 8 | import { DDManager } from './dd-manager'; |
9 | | -import { DDElement } from './dd-element'; |
| 9 | +import { DDElement, DDElementHost } from './dd-element'; |
10 | 10 |
|
11 | 11 | import { GridStackElement } from '../gridstack'; |
12 | 12 | import { GridStackDD, DDOpts, DDKey, DDDropOpt, DDCallback, DDValue } from '../gridstack-dd'; |
13 | 13 | import { GridItemHTMLElement, DDDragInOpt } from '../types'; |
| 14 | +import { Utils } from '../utils'; |
14 | 15 |
|
15 | 16 | /** |
16 | 17 | * HTML 5 Native DragDrop based drag'n'drop plugin. |
17 | 18 | */ |
18 | 19 | export class GridStackDDNative extends GridStackDD { |
19 | 20 |
|
20 | 21 | public resizable(el: GridItemHTMLElement, opts: DDOpts, key?: DDKey, value?: DDValue): GridStackDDNative { |
21 | | - let dEl = this.getGridStackDDElement(el); |
22 | | - if (opts === 'disable' || opts === 'enable') { |
23 | | - dEl.ddResizable[opts](); |
24 | | - } else if (opts === 'destroy') { |
25 | | - if (dEl.ddResizable) { |
26 | | - dEl.cleanResizable(); |
27 | | - } |
28 | | - } else if (opts === 'option') { |
29 | | - dEl.setupResizable({ [key]: value }); |
30 | | - } else { |
31 | | - const grid = el.gridstackNode.grid; |
32 | | - let handles = dEl.el.getAttribute('gs-resize-handles') ? dEl.el.getAttribute('gs-resize-handles') : grid.opts.resizable.handles; |
33 | | - dEl.setupResizable({ |
34 | | - ...grid.opts.resizable, |
35 | | - ...{ handles: handles }, |
36 | | - ...{ |
37 | | - start: opts.start, |
38 | | - stop: opts.stop, |
39 | | - resize: opts.resize |
| 22 | + this.getDDElements(el).forEach(dEl => { |
| 23 | + if (opts === 'disable' || opts === 'enable') { |
| 24 | + dEl.ddResizable[opts](); |
| 25 | + } else if (opts === 'destroy') { |
| 26 | + if (dEl.ddResizable) { |
| 27 | + dEl.cleanResizable(); |
40 | 28 | } |
41 | | - }); |
42 | | - } |
| 29 | + } else if (opts === 'option') { |
| 30 | + dEl.setupResizable({ [key]: value }); |
| 31 | + } else { |
| 32 | + const grid = dEl.el.gridstackNode.grid; |
| 33 | + let handles = dEl.el.getAttribute('gs-resize-handles') ? dEl.el.getAttribute('gs-resize-handles') : grid.opts.resizable.handles; |
| 34 | + dEl.setupResizable({ |
| 35 | + ...grid.opts.resizable, |
| 36 | + ...{ handles: handles }, |
| 37 | + ...{ |
| 38 | + start: opts.start, |
| 39 | + stop: opts.stop, |
| 40 | + resize: opts.resize |
| 41 | + } |
| 42 | + }); |
| 43 | + } |
| 44 | + }); |
43 | 45 | return this; |
44 | 46 | } |
45 | 47 |
|
46 | 48 | public draggable(el: GridItemHTMLElement, opts: DDOpts, key?: DDKey, value?: DDValue): GridStackDDNative { |
47 | | - const dEl = this.getGridStackDDElement(el); |
48 | | - if (opts === 'disable' || opts === 'enable') { |
49 | | - dEl.ddDraggable && dEl.ddDraggable[opts](); |
50 | | - } else if (opts === 'destroy') { |
51 | | - if (dEl.ddDraggable) { // error to call destroy if not there |
52 | | - dEl.cleanDraggable(); |
53 | | - } |
54 | | - } else if (opts === 'option') { |
55 | | - dEl.setupDraggable({ [key]: value }); |
56 | | - } else { |
57 | | - const grid = el.gridstackNode.grid; |
58 | | - dEl.setupDraggable({ |
59 | | - ...grid.opts.draggable, |
60 | | - ...{ |
61 | | - containment: (grid.opts._isNested && !grid.opts.dragOut) |
62 | | - ? grid.el.parentElement |
63 | | - : (grid.opts.draggable.containment || null), |
64 | | - start: opts.start, |
65 | | - stop: opts.stop, |
66 | | - drag: opts.drag |
| 49 | + this.getDDElements(el).forEach(dEl => { |
| 50 | + if (opts === 'disable' || opts === 'enable') { |
| 51 | + dEl.ddDraggable && dEl.ddDraggable[opts](); |
| 52 | + } else if (opts === 'destroy') { |
| 53 | + if (dEl.ddDraggable) { // error to call destroy if not there |
| 54 | + dEl.cleanDraggable(); |
67 | 55 | } |
68 | | - }); |
69 | | - } |
| 56 | + } else if (opts === 'option') { |
| 57 | + dEl.setupDraggable({ [key]: value }); |
| 58 | + } else { |
| 59 | + const grid = dEl.el.gridstackNode.grid; |
| 60 | + dEl.setupDraggable({ |
| 61 | + ...grid.opts.draggable, |
| 62 | + ...{ |
| 63 | + containment: (grid.opts._isNested && !grid.opts.dragOut) |
| 64 | + ? grid.el.parentElement |
| 65 | + : (grid.opts.draggable.containment || null), |
| 66 | + start: opts.start, |
| 67 | + stop: opts.stop, |
| 68 | + drag: opts.drag |
| 69 | + } |
| 70 | + }); |
| 71 | + } |
| 72 | + }); |
70 | 73 | return this; |
71 | 74 | } |
72 | 75 |
|
73 | 76 | public dragIn(el: GridStackElement, opts: DDDragInOpt): GridStackDDNative { |
74 | | - let dEl = this.getGridStackDDElement(el); |
75 | | - dEl.setupDraggable(opts); |
| 77 | + this.getDDElements(el).forEach(dEl => dEl.setupDraggable(opts)); |
76 | 78 | return this; |
77 | 79 | } |
78 | 80 |
|
79 | 81 | public droppable(el: GridItemHTMLElement, opts: DDOpts | DDDropOpt, key?: DDKey, value?: DDValue): GridStackDDNative { |
80 | | - let dEl = this.getGridStackDDElement(el); |
81 | 82 | if (typeof opts.accept === 'function' && !opts._accept) { |
82 | 83 | opts._accept = opts.accept; |
83 | 84 | opts.accept = (el) => opts._accept(el); |
84 | 85 | } |
85 | | - if (opts === 'disable' || opts === 'enable') { |
86 | | - dEl.ddDroppable && dEl.ddDroppable[opts](); |
87 | | - } else if (opts === 'destroy') { |
88 | | - if (dEl.ddDroppable) { // error to call destroy if not there |
89 | | - dEl.cleanDroppable(); |
| 86 | + this.getDDElements(el).forEach(dEl => { |
| 87 | + if (opts === 'disable' || opts === 'enable') { |
| 88 | + dEl.ddDroppable && dEl.ddDroppable[opts](); |
| 89 | + } else if (opts === 'destroy') { |
| 90 | + if (dEl.ddDroppable) { // error to call destroy if not there |
| 91 | + dEl.cleanDroppable(); |
| 92 | + } |
| 93 | + } else if (opts === 'option') { |
| 94 | + dEl.setupDroppable({ [key]: value }); |
| 95 | + } else { |
| 96 | + dEl.setupDroppable(opts); |
90 | 97 | } |
91 | | - } else if (opts === 'option') { |
92 | | - dEl.setupDroppable({ [key]: value }); |
93 | | - } else { |
94 | | - dEl.setupDroppable(opts); |
95 | | - } |
| 98 | + }); |
96 | 99 | return this; |
97 | 100 | } |
98 | 101 |
|
| 102 | + /** true if at least one of them is droppable */ |
99 | 103 | public isDroppable(el: GridItemHTMLElement): boolean { |
100 | | - const dEl = this.getGridStackDDElement(el); |
101 | | - return !!(dEl.ddDroppable); |
| 104 | + return this.getDDElements(el).some(dEl => !!(dEl.ddDroppable)); |
102 | 105 | } |
103 | 106 |
|
| 107 | + /** true if at least one of them is draggable */ |
104 | 108 | public isDraggable(el: GridStackElement): boolean { |
105 | | - const dEl = this.getGridStackDDElement(el); |
106 | | - return !!(dEl.ddDraggable); |
| 109 | + return this.getDDElements(el).some(dEl => !!(dEl.ddDraggable)); |
107 | 110 | } |
108 | 111 |
|
109 | 112 | public on(el: GridItemHTMLElement, name: string, callback: DDCallback): GridStackDDNative { |
110 | | - let dEl = this.getGridStackDDElement(el); |
111 | | - dEl.on(name, (event: Event) => { |
112 | | - callback( |
113 | | - event, |
114 | | - DDManager.dragElement ? DDManager.dragElement.el : event.target as GridItemHTMLElement, |
115 | | - DDManager.dragElement ? DDManager.dragElement.helper : null) |
116 | | - }); |
| 113 | + this.getDDElements(el).forEach(dEl => |
| 114 | + dEl.on(name, (event: Event) => { |
| 115 | + callback( |
| 116 | + event, |
| 117 | + DDManager.dragElement ? DDManager.dragElement.el : event.target as GridItemHTMLElement, |
| 118 | + DDManager.dragElement ? DDManager.dragElement.helper : null) |
| 119 | + }) |
| 120 | + ); |
117 | 121 | return this; |
118 | 122 | } |
119 | 123 |
|
120 | 124 | public off(el: GridItemHTMLElement, name: string): GridStackDD { |
121 | | - let dEl = this.getGridStackDDElement(el); |
122 | | - dEl.off(name); |
| 125 | + this.getDDElements(el).forEach(dEl => dEl.off(name)); |
123 | 126 | return this; |
124 | 127 | } |
125 | 128 |
|
126 | | - private getGridStackDDElement(el: GridStackElement): DDElement { |
127 | | - let dEl; |
128 | | - if (typeof el === 'string') { |
129 | | - dEl = document.querySelector(el as string); |
130 | | - } else { |
131 | | - dEl = el; |
132 | | - } |
133 | | - return dEl.ddElement ? dEl.ddElement: DDElement.init(dEl); |
| 129 | + private getDDElements(els: GridStackElement): DDElement[] { |
| 130 | + let list = Utils.getElements(els) as DDElementHost[]; |
| 131 | + if (!list.length) { return []; } |
| 132 | + return list.map(e => e.ddElement || DDElement.init(e)); |
134 | 133 | } |
135 | 134 | } |
136 | 135 |
|
|
0 commit comments