From 1e9c1077c76b6357907a956e955d635ae22db661 Mon Sep 17 00:00:00 2001 From: Artur Arseniev Date: Sat, 5 Feb 2022 22:53:39 +0100 Subject: [PATCH] Update sorting --- src/dom_components/model/Components.js | 5 +-- src/dom_components/view/ComponentTextView.js | 6 +-- src/utils/Sorter.js | 39 +++++++++----------- 3 files changed, 23 insertions(+), 27 deletions(-) diff --git a/src/dom_components/model/Components.js b/src/dom_components/model/Components.js index fa0660749..c2408d2d2 100644 --- a/src/dom_components/model/Components.js +++ b/src/dom_components/model/Components.js @@ -86,8 +86,7 @@ export default Backbone.Collection.extend({ } const { domc, em } = this; - const allByID = domc ? domc.allById() : {}; - const isTemp = opts.temporary; + const isTemp = opts.temporary || opts.fromUndo; removed.prevColl = this; // This one is required for symbols if (!isTemp) { @@ -96,6 +95,7 @@ export default Backbone.Collection.extend({ const sels = em.get('SelectorManager').getAll(); const rules = em.get('CssComposer').getAll(); const canRemoveStyle = (opts.keepIds || []).indexOf(id) < 0; + const allByID = domc ? domc.allById() : {}; delete allByID[id]; // Remove all component related styles @@ -120,7 +120,6 @@ export default Backbone.Collection.extend({ const inner = removed.components(); inner.forEach(it => this.removeChildren(it, coll, opts)); - // removed.empty(opts); } // Remove stuff registered in DomComponents.handleChanges diff --git a/src/dom_components/view/ComponentTextView.js b/src/dom_components/view/ComponentTextView.js index f360cda50..20c60617b 100644 --- a/src/dom_components/view/ComponentTextView.js +++ b/src/dom_components/view/ComponentTextView.js @@ -136,7 +136,7 @@ export default ComponentView.extend({ } }, - insertComponent(content) { + insertComponent(content, opts = {}) { const { model, el } = this; const doc = el.ownerDocument; const selection = doc.getSelection(); @@ -164,13 +164,13 @@ export default ComponentView.extend({ const result = newCmps.filter(Boolean); const index = result.indexOf(content); - cmps.reset(result); + cmps.reset(result, opts); return cmps.at(index); } } - return model.append(content); + return model.append(content, opts); }, /** diff --git a/src/utils/Sorter.js b/src/utils/Sorter.js index ce96dc98c..212952a02 100644 --- a/src/utils/Sorter.js +++ b/src/utils/Sorter.js @@ -1061,39 +1061,36 @@ export default Backbone.View.extend({ const targetCollection = $(dst).data('collection'); const { trgModel, srcModel, draggable } = validResult; const droppable = trgModel instanceof Backbone.Collection ? 1 : validResult.droppable; - let modelToDrop, modelTemp, created; + let modelToDrop, created; if (targetCollection && droppable && draggable) { - const opts = { at: index, noIncrement: 1 }; + const opts = { at: index, undoContext: 'move-component' }; if (!dropContent) { - // Putting `avoidStore` here will make the UndoManager behave wrong - opts.temporary = 1; - modelTemp = targetCollection.add({}, { ...opts }); + const srcIndex = srcModel.index(); + const sameCollection = targetCollection === srcModel.collection; + const sameIndex = srcIndex === index || srcIndex === index - 1; - if (srcModel.collection) { - modelToDrop = srcModel.collection.remove(srcModel, { temporary: 1 }); + if ((!sameCollection || !sameIndex) && srcModel.collection) { + modelToDrop = srcModel.collection.remove(srcModel, { temporary: true }); } } else { modelToDrop = isFunction(dropContent) ? dropContent() : dropContent; - opts.silent = false; - opts.avoidUpdateStyle = 1; + opts.avoidUpdateStyle = true; + opts.undoContext = 'add-component'; } - if (this.isTextableActive(srcModel, trgModel)) { - created = trgModel.getView().insertComponent(modelToDrop); - } else { - created = targetCollection.add(modelToDrop, opts); - } - - if (!dropContent) { - targetCollection.remove(modelTemp); - } else { - this.dropContent = null; + if (modelToDrop) { + if (this.isTextableActive(srcModel, trgModel)) { + delete opts.at; + created = trgModel.getView().insertComponent(modelToDrop, opts); + } else { + created = targetCollection.add(modelToDrop, opts); + } } - // This will cause to recalculate children dimensions - this.prevTarget = null; + this.dropContent = null; + this.prevTarget = null; // This will recalculate children dimensions } else if (em) { const dropInfo = validResult.dropInfo || trgModel?.get('droppable'); const dragInfo = validResult.dragInfo || srcModel?.get('draggable');