From 46a69dee6587ad02dd0bcfc4da9d5211224de4ce Mon Sep 17 00:00:00 2001 From: Artur Arseniev Date: Fri, 4 Feb 2022 17:47:41 +0100 Subject: [PATCH] Refactor textable creation --- src/dom_components/view/ComponentTextView.js | 37 +++++++++++++++++++- src/utils/Sorter.js | 12 +------ src/utils/mixins.js | 6 +++- 3 files changed, 42 insertions(+), 13 deletions(-) diff --git a/src/dom_components/view/ComponentTextView.js b/src/dom_components/view/ComponentTextView.js index e3cc6fbdd..7a014a8e3 100644 --- a/src/dom_components/view/ComponentTextView.js +++ b/src/dom_components/view/ComponentTextView.js @@ -1,4 +1,4 @@ -import { on, off } from 'utils/mixins'; +import { on, off, getModel } from 'utils/mixins'; import ComponentView from './ComponentView'; import { bindAll } from 'underscore'; @@ -136,6 +136,41 @@ export default ComponentView.extend({ } }, + insertAtCursor(content) { + const { model, el } = this; + const doc = el.ownerDocument; + const selection = doc.getSelection(); + + if (selection?.rangeCount) { + const range = selection.getRangeAt(0); + const textNode = range.startContainer; + const offset = range.startOffset; + const textModel = getModel(textNode); + const cmps = model.components(); + const newCmps = []; + + model.components().forEach(cmp => { + if (cmp === textModel) { + const cnt = cmp.get('content'); + newCmps.push(cnt.slice(0, offset)); + newCmps.push(content); + newCmps.push(cnt.slice(offset)); + } else { + newCmps.push(cmp); + } + }); + + const result = newCmps.filter(Boolean); + const index = result.indexOf(content); + console.log({ newCmps, index, content }); + cmps.reset(result); + + return cmps.at(index); + } + + return null; + }, + /** * Callback on input event * @param {Event} e diff --git a/src/utils/Sorter.js b/src/utils/Sorter.js index 70bbc2f26..847081264 100644 --- a/src/utils/Sorter.js +++ b/src/utils/Sorter.js @@ -1079,17 +1079,7 @@ export default Backbone.View.extend({ } if (this.isTextableActive(srcModel, trgModel)) { - trgModel.trigger('active'); - const modelEl = srcModel.getEl(); - delete srcModel.opt.temporary; - srcModel.getView().render(); - modelEl.setAttribute('data-gjs-textable', 'true'); - trgModel.once('rte:enable', () => { - const trgView = trgModel.getView(); - trgView.activeRte?.insertHTML(modelEl); - trgView.disableEditing({ keepIds: getComponentIds(srcModel) }); - }); - created = srcModel; + created = trgModel.getView().insertAtCursor(modelToDrop); } else { created = targetCollection.add(modelToDrop, opts); } diff --git a/src/utils/mixins.js b/src/utils/mixins.js index ee9ebb120..3adbf83ab 100644 --- a/src/utils/mixins.js +++ b/src/utils/mixins.js @@ -187,7 +187,11 @@ export const escape = (str = '') => { */ const getModel = (el, $) => { let model = el; - isElement(el) && (model = $(el).data('model')); + if (!$ && el.__cashData) { + model = el.__cashData.model; + } else if (isElement(el)) { + model = $(el).data('model'); + } return model; };