Browse Source

Refactor move method in Sorter

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

125
src/utils/Sorter.js

@ -432,25 +432,34 @@ module.exports = Backbone.View.extend({
let src = srcModel.view.el;
let trgModel = this.getTargetModel(trg);
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
let droppable = trgModel.get('droppable');
droppable = droppable instanceof Array ? droppable.join(', ') : droppable;
result.dropInfo = 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
let draggable = srcModel.get('draggable');
draggable = draggable instanceof Array ? draggable.join(', ') : draggable;
result.dragInfo = draggable;
draggable = typeof draggable === 'string' ? trg.matches(draggable) : draggable;
console.log('Source draggable', draggable);
result.draggable = 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);
// 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);
}
@ -753,105 +762,63 @@ module.exports = Backbone.View.extend({
* */
move(dst, src, pos) {
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 modelToDrop, modelTemp, created;
var index = pos.index;
var model = $(src).data('model');
var $dst = $(dst);
var targetModel;
while ($dst.length && !targetModel) {
targetModel = $dst.data('model');
dst = $dst.get(0);
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 modelToDrop, modelTemp, created;
var validTarget = this.validTarget(dst);
var targetCollection = $(dst).data('collection');
var model = validTarget.srcModel;
var droppable = validTarget.droppable;
var draggable = validTarget.draggable;
var dropInfo = validTarget.dropInfo;
var dragInfo = validTarget.dragInfo;
var dropContent = this.dropContent;
if (dropContent instanceof Object) {
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
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);
}
console.log('MOVE ', validTarget);
if(targetCollection && droppable && accepted && draggable) {
if (targetCollection && droppable && draggable) {
index = pos.method === 'after' ? index + 1 : index;
var opts = {at: index, noIncrement: 1};
if(!dropContent){
if (!dropContent) {
modelTemp = targetCollection.add({}, opts);
if(model)
modelToDrop = model.collection.remove(model);
}else{
if (model) {
modelToDrop = model.collection.remove(model);
}
} else {
modelToDrop = dropContent;
opts.silent = false;
}
created = targetCollection.add(modelToDrop, opts);
if (!dropContent) {
targetCollection.remove(modelTemp);
}else{
} else {
this.dropContent = null;
}
// This will cause to recalculate children dimensions
this.prevTarget = null;
} else {
if(!targetCollection){
warns.push('target collection not found');
}
if(!droppable){
warns.push('target is not droppable');
if (!targetCollection) {
warns.push('Target collection not found');
}
if(!draggable){
warns.push('component not draggable, accepted only by [' + toDrag + ']');
if (!droppable) {
warns.push(`Target is not droppable, accepts [${dropInfo}]`);
}
if(!accepted){
warns.push('target accepts only [' + toDrop + ']');
if (!draggable) {
warns.push(`Component not draggable, acceptable by [${dragInfo}]`);
}
console.warn('Invalid target position: ' + warns.join(', '));
}
if (em)
em.trigger('component:dragEnd', targetCollection, modelToDrop, warns);
em && em.trigger('component:dragEnd', targetCollection, modelToDrop, warns);
return created;
},

Loading…
Cancel
Save