Browse Source

Make the Droppable end more reliable

symbols-2
Artur Arseniev 5 years ago
parent
commit
cd68e62a9e
  1. 21
      src/utils/Droppable.js

21
src/utils/Droppable.js

@ -41,9 +41,7 @@ export default class Droppable {
endDrop(cancel, ev) { endDrop(cancel, ev) {
const { em, dragStop } = this; const { em, dragStop } = this;
this.counter = 0; this.counter = 0;
this.over = 0;
dragStop && dragStop(cancel); dragStop && dragStop(cancel);
em.runDefault({ preserveSelected: 1 });
em.trigger('canvas:dragend', ev); em.trigger('canvas:dragend', ev);
} }
@ -72,6 +70,7 @@ export default class Droppable {
let dragStop, dragContent; let dragStop, dragContent;
em.stopDefault(); em.stopDefault();
// Select the right drag provider
if (em.inAbsoluteMode()) { if (em.inAbsoluteMode()) {
const wrapper = em.get('DomComponents').getWrapper(); const wrapper = em.get('DomComponents').getWrapper();
const target = wrapper.append({})[0]; const target = wrapper.append({})[0];
@ -81,12 +80,13 @@ export default class Droppable {
center: 1, center: 1,
target, target,
onEnd: (ev, dragger, { cancelled }) => { onEnd: (ev, dragger, { cancelled }) => {
let comp;
if (!cancelled) { if (!cancelled) {
const comp = wrapper.append(content)[0]; comp = wrapper.append(content)[0];
const { left, top, position } = target.getStyle(); const { left, top, position } = target.getStyle();
comp.addStyle({ left, top, position }); comp.addStyle({ left, top, position });
this.handleDragEnd(comp, dt);
} }
this.handleDragEnd(comp, dt);
target.remove(); target.remove();
} }
}); });
@ -123,10 +123,13 @@ export default class Droppable {
} }
handleDragEnd(model, dt) { handleDragEnd(model, dt) {
if (!model) return;
const { em } = this; const { em } = this;
em.set('dragResult', model); this.over = 0;
em.trigger('canvas:drop', dt, model); if (model) {
em.set('dragResult', model);
em.trigger('canvas:drop', dt, model);
}
em.runDefault({ preserveSelected: 1 });
} }
/** /**
@ -138,6 +141,10 @@ export default class Droppable {
this.em.trigger('canvas:dragover', ev); this.em.trigger('canvas:dragover', ev);
} }
/**
* WARNING: This function might fail to run on drop, for example, when the
* drop, accidentally, happens on some external element (DOM not inside the iframe)
*/
handleDrop(ev) { handleDrop(ev) {
ev.preventDefault(); ev.preventDefault();
const { dragContent } = this; const { dragContent } = this;

Loading…
Cancel
Save