UNPKG

@atlaskit/editor-plugin-synced-block

Version:

SyncedBlock plugin for @atlaskit/editor-core

65 lines (64 loc) • 3.21 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.createReferenceSelectionView = void 0; var _bindEventListener = require("bind-event-listener"); var _syncBlock = require("@atlaskit/editor-common/styles/sync-block"); var _state = require("@atlaskit/editor-prosemirror/state"); var getSelectedReference = function getSelectedReference(view) { var selection = view.dom.ownerDocument.getSelection(); var anchor = selection === null || selection === void 0 ? void 0 : selection.anchorNode; var anchorElement = anchor instanceof Element ? anchor : anchor === null || anchor === void 0 ? void 0 : anchor.parentElement; var renderer = anchorElement === null || anchorElement === void 0 ? void 0 : anchorElement.closest(".".concat(_syncBlock.SyncBlockSharedCssClassName.renderer)); if (!renderer || !(selection !== null && selection !== void 0 && selection.focusNode) || !renderer.contains(selection.focusNode)) { return null; } var reference = renderer.closest(".".concat(_syncBlock.SyncBlockSharedCssClassName.prefix)); return reference && view.dom.contains(reference) ? reference : null; }; var createReferenceSelectionView = exports.createReferenceSelectionView = function createReferenceSelectionView(view) { var syncReferenceSelection = function syncReferenceSelection(reference) { var _doc$nodeAt; if (!view.editable || !reference) { return; } var pos = view.posAtDOM(reference, 0); var _view$state = view.state, doc = _view$state.doc, schema = _view$state.schema, selection = _view$state.selection; if (((_doc$nodeAt = doc.nodeAt(pos)) === null || _doc$nodeAt === void 0 ? void 0 : _doc$nodeAt.type) !== schema.nodes.syncBlock || selection instanceof _state.NodeSelection && selection.from === pos) { return; } // The selectable renderer owns native focus, so PM's observer ignores its selection. // Track the containing atom without focusing the editor or clearing highlighted text. view.dispatch(view.state.tr.setSelection(_state.NodeSelection.create(doc, pos))); }; var unbind = (0, _bindEventListener.bindAll)(view.dom.ownerDocument, [{ type: 'selectionchange', listener: function listener() { return syncReferenceSelection(getSelectedReference(view)); } }, { type: 'click', listener: function listener(event) { if (event.button !== 0 || !view.editable) { return; } var target = event.target instanceof Element ? event.target : null; var reference = target === null || target === void 0 ? void 0 : target.closest(".".concat(_syncBlock.SyncBlockSharedCssClassName.prefix)); if (!reference || !view.dom.contains(reference)) { return; } // Edge clicks never create a native selection inside the renderer. syncReferenceSelection(reference); if (!(target !== null && target !== void 0 && target.closest(".".concat(_syncBlock.SyncBlockSharedCssClassName.renderer))) && !(target !== null && target !== void 0 && target.closest(".".concat(_syncBlock.SyncBlockLabelSharedCssClassName.labelClassName)))) { view.focus(); } } }]); return { destroy: unbind }; };