|
|
@ -1,4 +1,5 @@ |
|
|
import {on, off} from 'utils/mixins'; |
|
|
import { isString } from 'underscore'; |
|
|
|
|
|
import { on, off, matches } from 'utils/mixins'; |
|
|
const $ = Backbone.$; |
|
|
const $ = Backbone.$; |
|
|
|
|
|
|
|
|
module.exports = Backbone.View.extend({ |
|
|
module.exports = Backbone.View.extend({ |
|
|
@ -175,13 +176,7 @@ module.exports = Backbone.View.extend({ |
|
|
* @return {Boolean} |
|
|
* @return {Boolean} |
|
|
*/ |
|
|
*/ |
|
|
matches(el, selector, useBody) { |
|
|
matches(el, selector, useBody) { |
|
|
var startEl = el.parentNode || document.body; |
|
|
return matches.call(el, selector); |
|
|
//startEl = useBody ? startEl.ownerDocument.body : startEl;
|
|
|
|
|
|
var els = startEl.querySelectorAll(selector); |
|
|
|
|
|
var i = 0; |
|
|
|
|
|
while (els[i] && els[i] !== el) |
|
|
|
|
|
++i; |
|
|
|
|
|
return !!els[i]; |
|
|
|
|
|
}, |
|
|
}, |
|
|
|
|
|
|
|
|
/** |
|
|
/** |
|
|
@ -242,6 +237,7 @@ module.exports = Backbone.View.extend({ |
|
|
const container = this.getContainerEl(); |
|
|
const container = this.getContainerEl(); |
|
|
const docs = this.getDocuments(); |
|
|
const docs = this.getDocuments(); |
|
|
const onStart = this.onStart; |
|
|
const onStart = this.onStart; |
|
|
|
|
|
let srcModel; |
|
|
let plh = this.plh; |
|
|
let plh = this.plh; |
|
|
this.dropModel = null; |
|
|
this.dropModel = null; |
|
|
this.moved = 0; |
|
|
this.moved = 0; |
|
|
@ -262,7 +258,7 @@ module.exports = Backbone.View.extend({ |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
if (src) { |
|
|
if (src) { |
|
|
const srcModel = this.getSourceModel(src); |
|
|
srcModel = this.getSourceModel(src); |
|
|
srcModel && srcModel.set && srcModel.set('status', 'freezed'); |
|
|
srcModel && srcModel.set && srcModel.set('status', 'freezed'); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
@ -274,6 +270,8 @@ module.exports = Backbone.View.extend({ |
|
|
// Avoid strange effects on dragging
|
|
|
// Avoid strange effects on dragging
|
|
|
em && em.clearSelection(); |
|
|
em && em.clearSelection(); |
|
|
this.toggleSortCursor(1); |
|
|
this.toggleSortCursor(1); |
|
|
|
|
|
|
|
|
|
|
|
em && em.trigger('component:drag-start', src, srcModel); |
|
|
}, |
|
|
}, |
|
|
|
|
|
|
|
|
/** |
|
|
/** |
|
|
@ -285,6 +283,7 @@ module.exports = Backbone.View.extend({ |
|
|
return $(elem).data('model'); |
|
|
return $(elem).data('model'); |
|
|
}, |
|
|
}, |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
/** |
|
|
* Get the model of the current source element (element to drag) |
|
|
* Get the model of the current source element (element to drag) |
|
|
* @return {Model} |
|
|
* @return {Model} |
|
|
@ -310,6 +309,7 @@ module.exports = Backbone.View.extend({ |
|
|
} |
|
|
} |
|
|
}, |
|
|
}, |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
/** |
|
|
* Highlight target |
|
|
* Highlight target |
|
|
* @param {Model|null} model |
|
|
* @param {Model|null} model |
|
|
@ -335,11 +335,13 @@ module.exports = Backbone.View.extend({ |
|
|
* @param {Event} e |
|
|
* @param {Event} e |
|
|
* */ |
|
|
* */ |
|
|
onMove(e) { |
|
|
onMove(e) { |
|
|
|
|
|
const em = this.em; |
|
|
this.moved = 1; |
|
|
this.moved = 1; |
|
|
|
|
|
|
|
|
// Turn placeholder visibile
|
|
|
// Turn placeholder visibile
|
|
|
var plh = this.plh; |
|
|
var plh = this.plh; |
|
|
var dsp = plh.style.display; |
|
|
var dsp = plh.style.display; |
|
|
if(!dsp || dsp === 'none') |
|
|
if (!dsp || dsp === 'none') |
|
|
plh.style.display = 'block'; |
|
|
plh.style.display = 'block'; |
|
|
|
|
|
|
|
|
// Cache all necessary positions
|
|
|
// Cache all necessary positions
|
|
|
@ -349,8 +351,8 @@ module.exports = Backbone.View.extend({ |
|
|
var rY = (e.pageY - this.elT) + this.el.scrollTop; |
|
|
var rY = (e.pageY - this.elT) + this.el.scrollTop; |
|
|
var rX = (e.pageX - this.elL) + this.el.scrollLeft; |
|
|
var rX = (e.pageX - this.elL) + this.el.scrollLeft; |
|
|
|
|
|
|
|
|
if (this.canvasRelative && this.em) { |
|
|
if (this.canvasRelative && em) { |
|
|
var mousePos = this.em.get('Canvas').getMouseRelativeCanvas(e); |
|
|
var mousePos = em.get('Canvas').getMouseRelativeCanvas(e); |
|
|
rX = mousePos.x; |
|
|
rX = mousePos.x; |
|
|
rY = mousePos.y; |
|
|
rY = mousePos.y; |
|
|
} |
|
|
} |
|
|
@ -359,9 +361,10 @@ module.exports = Backbone.View.extend({ |
|
|
this.rY = rY; |
|
|
this.rY = rY; |
|
|
this.eventMove = e; |
|
|
this.eventMove = e; |
|
|
|
|
|
|
|
|
//var target = this.getTargetFromEl(e.target);
|
|
|
//var targetNew = this.getTargetFromEl(e.target);
|
|
|
var dims = this.dimsFromTarget(e.target, rX, rY); |
|
|
const dims = this.dimsFromTarget(e.target, rX, rY); |
|
|
let targetModel = this.getTargetModel(this.target); |
|
|
const target = this.target; |
|
|
|
|
|
const targetModel = this.getTargetModel(target); |
|
|
this.selectTargetModel(targetModel); |
|
|
this.selectTargetModel(targetModel); |
|
|
|
|
|
|
|
|
this.lastDims = dims; |
|
|
this.lastDims = dims; |
|
|
@ -387,6 +390,15 @@ module.exports = Backbone.View.extend({ |
|
|
|
|
|
|
|
|
if(typeof this.onMoveClb === 'function') |
|
|
if(typeof this.onMoveClb === 'function') |
|
|
this.onMoveClb(e); |
|
|
this.onMoveClb(e); |
|
|
|
|
|
|
|
|
|
|
|
em && em.trigger('component:drag', { |
|
|
|
|
|
target, |
|
|
|
|
|
targetModel, |
|
|
|
|
|
dims, |
|
|
|
|
|
pos, |
|
|
|
|
|
x: rX, |
|
|
|
|
|
y: rY, |
|
|
|
|
|
}); |
|
|
}, |
|
|
}, |
|
|
|
|
|
|
|
|
/** |
|
|
/** |
|
|
@ -475,14 +487,14 @@ module.exports = Backbone.View.extend({ |
|
|
droppable = droppable instanceof Backbone.Collection ? 1 : droppable; |
|
|
droppable = droppable instanceof Backbone.Collection ? 1 : droppable; |
|
|
droppable = droppable instanceof Array ? droppable.join(', ') : droppable; |
|
|
droppable = droppable instanceof Array ? droppable.join(', ') : droppable; |
|
|
result.dropInfo = droppable; |
|
|
result.dropInfo = droppable; |
|
|
droppable = typeof droppable === 'string' ? this.matches(src, droppable) : droppable; |
|
|
droppable = isString(droppable) ? this.matches(src, droppable) : droppable; |
|
|
result.droppable = droppable; |
|
|
result.droppable = droppable; |
|
|
|
|
|
|
|
|
// check if the source is draggable in target
|
|
|
// check if the source is draggable in target
|
|
|
let draggable = srcModel.get('draggable'); |
|
|
let draggable = srcModel.get('draggable'); |
|
|
draggable = draggable instanceof Array ? draggable.join(', ') : draggable; |
|
|
draggable = draggable instanceof Array ? draggable.join(', ') : draggable; |
|
|
result.dragInfo = draggable; |
|
|
result.dragInfo = draggable; |
|
|
draggable = typeof draggable === 'string' ? this.matches(trg, draggable) : draggable; |
|
|
draggable = isString(draggable) ? this.matches(trg, draggable) : draggable; |
|
|
result.draggable = draggable; |
|
|
result.draggable = draggable; |
|
|
|
|
|
|
|
|
if (!droppable || !draggable) { |
|
|
if (!droppable || !draggable) { |
|
|
@ -500,6 +512,7 @@ module.exports = Backbone.View.extend({ |
|
|
* @return {Array<Array>} |
|
|
* @return {Array<Array>} |
|
|
*/ |
|
|
*/ |
|
|
dimsFromTarget(target, rX, rY) { |
|
|
dimsFromTarget(target, rX, rY) { |
|
|
|
|
|
const em = this.em; |
|
|
var dims = []; |
|
|
var dims = []; |
|
|
|
|
|
|
|
|
if (!target) { |
|
|
if (!target) { |
|
|
@ -531,6 +544,8 @@ module.exports = Backbone.View.extend({ |
|
|
|
|
|
|
|
|
// Check if the source is valid with the target
|
|
|
// Check if the source is valid with the target
|
|
|
let validResult = this.validTarget(target); |
|
|
let validResult = this.validTarget(target); |
|
|
|
|
|
em && em.trigger('component:drag-validation', validResult); |
|
|
|
|
|
|
|
|
if (!validResult.valid && this.targetP) { |
|
|
if (!validResult.valid && this.targetP) { |
|
|
return this.dimsFromTarget(this.targetP, rX, rY); |
|
|
return this.dimsFromTarget(this.targetP, rX, rY); |
|
|
} |
|
|
} |
|
|
@ -575,11 +590,13 @@ module.exports = Backbone.View.extend({ |
|
|
let target = el; |
|
|
let target = el; |
|
|
let targetParent; |
|
|
let targetParent; |
|
|
let targetPrev = this.targetPrev; |
|
|
let targetPrev = this.targetPrev; |
|
|
|
|
|
const em = this.em; |
|
|
const containerSel = this.containerSel; |
|
|
const containerSel = this.containerSel; |
|
|
|
|
|
const itemSel = this.itemSel; |
|
|
|
|
|
|
|
|
// Select the first valuable target
|
|
|
// Select the first valuable target
|
|
|
if (!this.matches(target, `${this.itemSel}, ${containerSel}`)) { |
|
|
if (!this.matches(target, `${itemSel}, ${containerSel}`)) { |
|
|
target = this.closest(target, this.itemSel); |
|
|
target = this.closest(target, itemSel); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
// If draggable is an array the target will be one of those
|
|
|
// If draggable is an array the target will be one of those
|
|
|
@ -599,7 +616,10 @@ module.exports = Backbone.View.extend({ |
|
|
|
|
|
|
|
|
// If the current target is not valid (src/trg reasons) try with
|
|
|
// If the current target is not valid (src/trg reasons) try with
|
|
|
// the parent one (if exists)
|
|
|
// the parent one (if exists)
|
|
|
if (!this.validTarget(target).valid && targetParent) { |
|
|
const validResult = this.validTarget(target); |
|
|
|
|
|
em && em.trigger('component:drag-validation', validResult); |
|
|
|
|
|
|
|
|
|
|
|
if (!validResult.valid && targetParent) { |
|
|
return this.getTargetFromEl(targetParent); |
|
|
return this.getTargetFromEl(targetParent); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|