91 lines
3.1 KiB
JavaScript
91 lines
3.1 KiB
JavaScript
/*global define,Promise*/
|
|
|
|
/**
|
|
* Module defining DropGesture. Created by vwoeltje on 11/17/14.
|
|
*/
|
|
define(
|
|
['./GestureConstants'],
|
|
function (GestureConstants) {
|
|
"use strict";
|
|
|
|
/**
|
|
* A DropGesture adds and maintains event handlers upon an element
|
|
* such that it may act as a drop target for drag-drop composition.
|
|
|
|
* @constructor
|
|
* @param $q Angular's $q, for promise handling
|
|
* @param element the jqLite-wrapped representation element
|
|
* @param {DomainObject} domainObject the domain object whose
|
|
* composition should be modified as a result of the drop.
|
|
*/
|
|
|
|
function DropGesture($q, element, domainObject) {
|
|
|
|
function doPersist() {
|
|
var persistence = domainObject.getCapability("persistence");
|
|
return $q.when(persistence && persistence.persist());
|
|
}
|
|
|
|
function dragOver(e) {
|
|
var event = (e || {}).originalEvent || e;
|
|
|
|
// TODO: Vary this based on modifier keys
|
|
event.dataTransfer.dropEffect = 'move';
|
|
|
|
// Indicate that we will accept the drag
|
|
event.preventDefault(); // Required in Chrome?
|
|
return false;
|
|
}
|
|
|
|
function drop(e) {
|
|
var event = (e || {}).originalEvent || e,
|
|
id = event.dataTransfer.getData(GestureConstants.MCT_DRAG_TYPE);
|
|
|
|
// Handle the drop; add the dropped identifier to the
|
|
// destination domain object's composition, and persist
|
|
// the change.
|
|
if (id) {
|
|
$q.when(domainObject.useCapability(
|
|
'mutation',
|
|
function (model) {
|
|
var composition = model.composition;
|
|
// Don't store the same id more than once
|
|
if (composition && // not-contains
|
|
!(composition.map(function (i) {
|
|
return i === id;
|
|
}).reduce(function (a, b) {
|
|
return a || b;
|
|
}, false))) {
|
|
model.composition.push(id);
|
|
}
|
|
}
|
|
)).then(function (result) {
|
|
// If mutation was successful, persist the change
|
|
return result && doPersist();
|
|
});
|
|
}
|
|
|
|
}
|
|
|
|
// Listen for dragover, to indicate we'll accept a drag
|
|
element.on('dragover', dragOver);
|
|
|
|
// Listen for the drop itself
|
|
element.on('drop', drop);
|
|
|
|
return {
|
|
/**
|
|
* Detach any event handlers associated with this gesture.
|
|
*/
|
|
destroy: function () {
|
|
element.off('dragover', dragOver);
|
|
element.off('drop', drop);
|
|
}
|
|
};
|
|
|
|
}
|
|
|
|
|
|
return DropGesture;
|
|
}
|
|
); |