Skip to content

Commit 7b74820

Browse files
authored
Merge pull request #1464 from adumesny/h5
h5: you can now drag to trash to delete item
2 parents 7d1d081 + f83e509 commit 7b74820

File tree

2 files changed

+30
-22
lines changed

2 files changed

+30
-22
lines changed

src/dragdrop/dd-draggable.ts

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
import { DDManager } from './dd-manager';
99
import { DDUtils } from './dd-utils';
1010
import { DDBaseImplement, HTMLElementExtendOpt } from './dd-base-impl';
11-
import { DDUIData } from '../types';
11+
import { GridItemHTMLElement, DDUIData } from '../types';
1212

1313
export interface DDDraggableOpt {
1414
appendTo?: string | HTMLElement;
@@ -93,6 +93,7 @@ export class DDDraggable extends DDBaseImplement implements HTMLElementExtendOpt
9393
}
9494
this.el.draggable = false;
9595
this.el.classList.remove('ui-draggable');
96+
this.el.removeEventListener('mousedown', this.mouseDown);
9697
this.el.removeEventListener('dragstart', this.dragStart);
9798
delete this.el;
9899
delete this.helper;
@@ -229,9 +230,12 @@ export class DDDraggable extends DDBaseImplement implements HTMLElementExtendOpt
229230
}
230231

231232
private removeHelperStyle(): DDDraggable {
232-
DDDraggable.originStyleProp.forEach(prop => {
233-
this.helper.style[prop] = this.dragElementOriginStyle[prop] || null;
234-
});
233+
// don't bother restoring styles if we're gonna remove anyway...
234+
if (! (this.helper as GridItemHTMLElement)?.gridstackNode?._isAboutToRemove) {
235+
DDDraggable.originStyleProp.forEach(prop => {
236+
this.helper.style[prop] = this.dragElementOriginStyle[prop] || null;
237+
});
238+
}
235239
delete this.dragElementOriginStyle;
236240
return this;
237241
}

src/dragdrop/dd-droppable.ts

Lines changed: 22 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,7 @@ export class DDDroppable extends DDBaseImplement implements HTMLElementExtendOpt
8686
return this;
8787
}
8888

89+
/** called when the cursor enters our area - prepare for a possible drop and track leaving */
8990
protected dragEnter(event: DragEvent): void {
9091
this.el.removeEventListener('dragenter', this.dragEnter);
9192
this.acceptable = this.canDrop();
@@ -103,44 +104,47 @@ export class DDDroppable extends DDBaseImplement implements HTMLElementExtendOpt
103104
this.el.addEventListener('dragleave', this.dragLeave);
104105
}
105106

107+
/** called when an acceptable to drop item is being dragged over - do nothing but eat the event */
106108
private dragOver(event: DragEvent): void {
107109
event.preventDefault();
108110
event.stopPropagation();
109111
}
110112

113+
/** called when the item is leaving our area, stop tracking if we had acceptable item */
111114
private dragLeave(event: DragEvent): void {
112115
if (this.el.contains(event.relatedTarget as HTMLElement)) { return; }
113-
this.el.removeEventListener('dragleave', this.dragLeave);
114-
this.el.classList.remove('ui-droppable-over');
116+
this.removeLeaveCallbacks();
115117
if (this.acceptable) {
116118
event.preventDefault();
117-
this.el.removeEventListener('dragover', this.dragOver);
118-
this.el.removeEventListener('drop', this.drop);
119119
const ev = DDUtils.initEvent<DragEvent>(event, { target: this.el, type: 'dropout' });
120120
if (this.option.out) {
121121
this.option.out(ev, this.ui(DDManager.dragElement))
122122
}
123123
this.triggerEvent('dropout', ev);
124124
}
125-
this.el.addEventListener('dragenter', this.dragEnter);
126125
}
127126

127+
/** item is being dropped on us - call the client drop event */
128128
private drop(event: DragEvent): void {
129+
if (!this.acceptable) { return; } // should not have received event...
130+
event.preventDefault();
131+
const ev = DDUtils.initEvent<DragEvent>(event, { target: this.el, type: 'drop' });
132+
if (this.option.drop) {
133+
this.option.drop(ev, this.ui(DDManager.dragElement))
134+
}
135+
this.triggerEvent('drop', ev);
136+
this.removeLeaveCallbacks();
137+
}
138+
139+
/** called to remove callbacks when leaving or dropping */
140+
private removeLeaveCallbacks() {
141+
this.el.removeEventListener('dragleave', this.dragLeave);
142+
this.el.classList.remove('ui-droppable-over');
129143
if (this.acceptable) {
130-
event.preventDefault();
131-
const ev = DDUtils.initEvent<DragEvent>(event, { target: this.el, type: 'drop' });
132-
if (this.option.drop) {
133-
this.option.drop(ev, this.ui(DDManager.dragElement))
134-
}
135-
this.triggerEvent('drop', ev);
136-
this.dragLeave({
137-
...ev,
138-
relatedTarget: null,
139-
preventDefault: () => {
140-
// do nothing
141-
}
142-
});
144+
this.el.removeEventListener('dragover', this.dragOver);
145+
this.el.removeEventListener('drop', this.drop);
143146
}
147+
this.el.addEventListener('dragenter', this.dragEnter);
144148
}
145149

146150
private canDrop(): boolean {

0 commit comments

Comments
 (0)