From a626c37e75f1fe68e7698aa0bf5a697082b0da49 Mon Sep 17 00:00:00 2001 From: Artur Arseniev Date: Wed, 9 Feb 2022 18:11:59 +0100 Subject: [PATCH] Activate RTE on current cursor --- src/dom_components/view/ComponentTextView.js | 8 +++--- src/rich_text_editor/index.js | 4 +-- src/rich_text_editor/model/RichTextEditor.js | 26 +++++++++++++++++--- 3 files changed, 28 insertions(+), 10 deletions(-) diff --git a/src/dom_components/view/ComponentTextView.js b/src/dom_components/view/ComponentTextView.js index d3bdb9353..fcefa7448 100644 --- a/src/dom_components/view/ComponentTextView.js +++ b/src/dom_components/view/ComponentTextView.js @@ -54,7 +54,7 @@ export default ComponentView.extend({ * Enable element content editing * @private * */ - async onActive(e) { + async onActive(ev) { const { rte, em } = this; const { result, delegate } = this.canActivate(); @@ -63,17 +63,17 @@ export default ComponentView.extend({ if (!result) { if (delegate) { em.setSelected(delegate); - delegate.trigger('active', e); + delegate.trigger('active', ev); } return; } - e && e.stopPropagation && e.stopPropagation(); + ev?.stopPropagation?.(); this.lastContent = this.getContent(); if (rte) { try { - this.activeRte = await rte.enable(this, this.activeRte); + this.activeRte = await rte.enable(this, this.activeRte, { event: ev }); } catch (err) { em.logError(err); } diff --git a/src/rich_text_editor/index.js b/src/rich_text_editor/index.js index 81f0e5c72..408f03c64 100644 --- a/src/rich_text_editor/index.js +++ b/src/rich_text_editor/index.js @@ -299,14 +299,14 @@ export default () => { * @param {Object} rte The instance of already defined RTE * @private * */ - async enable(view, rte) { + async enable(view, rte, opts) { lastEl = view.el; const { customRte } = this; const em = config.em; const el = view.getChildrenContainer(); toolbar.style.display = ''; - const rteInst = await (customRte ? customRte.enable(el, rte) : this.initRte(el).enable()); + const rteInst = await (customRte ? customRte.enable(el, rte) : this.initRte(el).enable(opts)); if (em) { setTimeout(this.updatePosition.bind(this), 0); diff --git a/src/rich_text_editor/model/RichTextEditor.js b/src/rich_text_editor/model/RichTextEditor.js index bf4c837fc..62d991df4 100644 --- a/src/rich_text_editor/model/RichTextEditor.js +++ b/src/rich_text_editor/model/RichTextEditor.js @@ -2,7 +2,7 @@ // and adapted to the GrapesJS's need import { isString } from 'underscore'; -import { on, off } from 'utils/mixins'; +import { on, off, getPointerEvent } from 'utils/mixins'; const RTE_KEY = '_rte'; @@ -184,16 +184,16 @@ export default class RichTextEditor { }); } - enable() { + enable(opts) { if (this.enabled) return this; - return this.__toggleEffects(true); + return this.__toggleEffects(true, opts); } disable() { return this.__toggleEffects(false); } - __toggleEffects(enable = false) { + __toggleEffects(enable = false, opts = {}) { const method = enable ? on : off; const { el, doc } = this; this.actionbarEl().style.display = enable ? '' : 'none'; @@ -203,8 +203,26 @@ export default class RichTextEditor { this.enabled = enable; if (enable) { + const { event } = opts; this.syncActions(); this.updateActiveActions(); + + if (event) { + let range = null; + + if (doc.caretRangeFromPoint) { + const poiner = getPointerEvent(event); + range = doc.caretRangeFromPoint(poiner.clientX, poiner.clientY); + } else if (event.rangeParent) { + range = doc.createRange(); + range.setStart(event.rangeParent, event.rangeOffset); + } + + const sel = doc.getSelection(); + sel.removeAllRanges(); + range && sel.addRange(range); + } + el.focus(); }