Browse Source

Refactor move method in Sorter

pull/187/head
Artur Arseniev 9 years ago
parent
commit
f6af7ca12a
  1. 113
      src/utils/Sorter.js

113
src/utils/Sorter.js

@ -432,25 +432,34 @@ module.exports = Backbone.View.extend({
let src = srcModel.view.el; let src = srcModel.view.el;
let trgModel = this.getTargetModel(trg); let trgModel = this.getTargetModel(trg);
trg = trgModel.view.el; trg = trgModel.view.el;
console.log('Sorce', src, 'Target', trgModel, trg); let result = {
result: true,
src,
srcModel,
trg,
trgModel
};
// Check if the target could accept the source // Check if the target could accept the source
let droppable = trgModel.get('droppable'); let droppable = trgModel.get('droppable');
droppable = droppable instanceof Array ? droppable.join(', ') : droppable; droppable = droppable instanceof Array ? droppable.join(', ') : droppable;
result.dropInfo = droppable;
droppable = typeof droppable === 'string' ? src.matches(droppable) : droppable; droppable = typeof droppable === 'string' ? src.matches(droppable) : droppable;
console.log('Target 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;
draggable = typeof draggable === 'string' ? trg.matches(draggable) : draggable; draggable = typeof draggable === 'string' ? trg.matches(draggable) : draggable;
console.log('Source draggable', draggable); result.draggable = draggable;
if (!droppable || !draggable) { if (!droppable || !draggable) {
return false; result.result = false;
} }
return true; console.log(result);
return result;
}, },
/** /**
@ -487,7 +496,7 @@ module.exports = Backbone.View.extend({
this.targetP = this.closest(target, this.containerSel); this.targetP = this.closest(target, this.containerSel);
// Check if the source is valid with the target // Check if the source is valid with the target
if (!this.validTarget(target)) { if (!this.validTarget(target).result) {
return this.dimsFromTarget(this.targetP, rX, rY); return this.dimsFromTarget(this.targetP, rX, rY);
} }
@ -753,105 +762,63 @@ module.exports = Backbone.View.extend({
* */ * */
move(dst, src, pos) { move(dst, src, pos) {
var em = this.em; var em = this.em;
if (em) em.trigger('component:dragEnd:before', dst, src, pos); em && em.trigger('component:dragEnd:before', dst, src, pos);
var warns = []; var warns = [];
var modelToDrop, modelTemp, created;
var index = pos.index; var index = pos.index;
var model = $(src).data('model'); var modelToDrop, modelTemp, created;
var $dst = $(dst); var validTarget = this.validTarget(dst);
var targetModel; var targetCollection = $(dst).data('collection');
var model = validTarget.srcModel;
while ($dst.length && !targetModel) { var droppable = validTarget.droppable;
targetModel = $dst.data('model'); var draggable = validTarget.draggable;
dst = $dst.get(0); var dropInfo = validTarget.dropInfo;
var dragInfo = validTarget.dragInfo;
if (targetModel && targetModel.view)
dst = targetModel.view.el;
if (!targetModel)
$dst = $dst.parent();
}
var targetCollection = $dst.data('collection');
// Check if the elemenet is DRAGGABLE to the target
var drag = model && model.get('draggable');
var draggable = typeof drag !== 'undefined' ? drag : 1;
var toDrag = draggable;
// dropContent is for example the one used inside Blocks content
var dropContent = this.dropContent; var dropContent = this.dropContent;
if (dropContent instanceof Object) { console.log('MOVE ', validTarget);
draggable = dropContent.draggable;
draggable = typeof draggable !== 'undefined' ? draggable : 1;
} else if (typeof dropContent === 'string' && targetCollection) {
var sandboxModel = targetCollection.add(dropContent);
src = sandboxModel.view ? sandboxModel.view.el : src;
draggable = sandboxModel.get && sandboxModel.get('draggable');
draggable = typeof draggable !== 'undefined' ? draggable : 1;
targetCollection.remove(sandboxModel);
}
if (draggable instanceof Array) {
toDrag = draggable.join(', ');
draggable = this.matches(dst, toDrag);
} else if (typeof draggable === 'string') {
toDrag = draggable;
draggable = this.matches(dst, toDrag, 1);
}
// Check if the target could accept the element to be DROPPED inside if (targetCollection && droppable && draggable) {
var accepted = 1;
var droppable = targetModel && targetModel.get ? targetModel.get('droppable') : 1;
var toDrop = draggable;
if (droppable instanceof Array) {
// When I drag blocks src is the HTMLElement of the block
toDrop = droppable.join(', ');
accepted = this.matches(src, toDrop);
} else if (typeof droppable === 'string') {
toDrop = droppable;
accepted = src.matches(toDrop);
}
if(targetCollection && droppable && accepted && draggable) {
index = pos.method === 'after' ? index + 1 : index; index = pos.method === 'after' ? index + 1 : index;
var opts = {at: index, noIncrement: 1}; var opts = {at: index, noIncrement: 1};
if (!dropContent) { if (!dropContent) {
modelTemp = targetCollection.add({}, opts); modelTemp = targetCollection.add({}, opts);
if(model)
modelToDrop = model.collection.remove(model);
if (model) {
modelToDrop = model.collection.remove(model);
}
} else { } else {
modelToDrop = dropContent; modelToDrop = dropContent;
opts.silent = false; opts.silent = false;
} }
created = targetCollection.add(modelToDrop, opts); created = targetCollection.add(modelToDrop, opts);
if (!dropContent) { if (!dropContent) {
targetCollection.remove(modelTemp); targetCollection.remove(modelTemp);
} else { } else {
this.dropContent = null; this.dropContent = null;
} }
// This will cause to recalculate children dimensions // This will cause to recalculate children dimensions
this.prevTarget = null; this.prevTarget = null;
} else { } else {
if (!targetCollection) { if (!targetCollection) {
warns.push('target collection not found'); warns.push('Target collection not found');
} }
if (!droppable) { if (!droppable) {
warns.push('target is not droppable'); warns.push(`Target is not droppable, accepts [${dropInfo}]`);
} }
if (!draggable) { if (!draggable) {
warns.push('component not draggable, accepted only by [' + toDrag + ']'); warns.push(`Component not draggable, acceptable by [${dragInfo}]`);
}
if(!accepted){
warns.push('target accepts only [' + toDrop + ']');
} }
console.warn('Invalid target position: ' + warns.join(', ')); console.warn('Invalid target position: ' + warns.join(', '));
} }
if (em) em && em.trigger('component:dragEnd', targetCollection, modelToDrop, warns);
em.trigger('component:dragEnd', targetCollection, modelToDrop, warns);
return created; return created;
}, },

Loading…
Cancel
Save