Browse Source

Activate RTE on current cursor

pull/4141/head
Artur Arseniev 5 years ago
parent
commit
a626c37e75
  1. 8
      src/dom_components/view/ComponentTextView.js
  2. 4
      src/rich_text_editor/index.js
  3. 26
      src/rich_text_editor/model/RichTextEditor.js

8
src/dom_components/view/ComponentTextView.js

@ -54,7 +54,7 @@ export default ComponentView.extend({
* Enable element content editing * Enable element content editing
* @private * @private
* */ * */
async onActive(e) { async onActive(ev) {
const { rte, em } = this; const { rte, em } = this;
const { result, delegate } = this.canActivate(); const { result, delegate } = this.canActivate();
@ -63,17 +63,17 @@ export default ComponentView.extend({
if (!result) { if (!result) {
if (delegate) { if (delegate) {
em.setSelected(delegate); em.setSelected(delegate);
delegate.trigger('active', e); delegate.trigger('active', ev);
} }
return; return;
} }
e && e.stopPropagation && e.stopPropagation(); ev?.stopPropagation?.();
this.lastContent = this.getContent(); this.lastContent = this.getContent();
if (rte) { if (rte) {
try { try {
this.activeRte = await rte.enable(this, this.activeRte); this.activeRte = await rte.enable(this, this.activeRte, { event: ev });
} catch (err) { } catch (err) {
em.logError(err); em.logError(err);
} }

4
src/rich_text_editor/index.js

@ -299,14 +299,14 @@ export default () => {
* @param {Object} rte The instance of already defined RTE * @param {Object} rte The instance of already defined RTE
* @private * @private
* */ * */
async enable(view, rte) { async enable(view, rte, opts) {
lastEl = view.el; lastEl = view.el;
const { customRte } = this; const { customRte } = this;
const em = config.em; const em = config.em;
const el = view.getChildrenContainer(); const el = view.getChildrenContainer();
toolbar.style.display = ''; 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) { if (em) {
setTimeout(this.updatePosition.bind(this), 0); setTimeout(this.updatePosition.bind(this), 0);

26
src/rich_text_editor/model/RichTextEditor.js

@ -2,7 +2,7 @@
// and adapted to the GrapesJS's need // and adapted to the GrapesJS's need
import { isString } from 'underscore'; import { isString } from 'underscore';
import { on, off } from 'utils/mixins'; import { on, off, getPointerEvent } from 'utils/mixins';
const RTE_KEY = '_rte'; const RTE_KEY = '_rte';
@ -184,16 +184,16 @@ export default class RichTextEditor {
}); });
} }
enable() { enable(opts) {
if (this.enabled) return this; if (this.enabled) return this;
return this.__toggleEffects(true); return this.__toggleEffects(true, opts);
} }
disable() { disable() {
return this.__toggleEffects(false); return this.__toggleEffects(false);
} }
__toggleEffects(enable = false) { __toggleEffects(enable = false, opts = {}) {
const method = enable ? on : off; const method = enable ? on : off;
const { el, doc } = this; const { el, doc } = this;
this.actionbarEl().style.display = enable ? '' : 'none'; this.actionbarEl().style.display = enable ? '' : 'none';
@ -203,8 +203,26 @@ export default class RichTextEditor {
this.enabled = enable; this.enabled = enable;
if (enable) { if (enable) {
const { event } = opts;
this.syncActions(); this.syncActions();
this.updateActiveActions(); 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(); el.focus();
} }

Loading…
Cancel
Save