UNPKG

@atlaskit/editor-plugin-decorations

Version:

Decorations plugin for @atlaskit/editor-core

109 lines (106 loc) 4.51 kB
import { getSourceNodesFromSelectionRange } from '@atlaskit/editor-common/selection'; import { NodeSelection, TextSelection } from '@atlaskit/editor-prosemirror/state'; import { Decoration, DecorationSet } from '@atlaskit/editor-prosemirror/view'; import { CellSelection, TableMap } from '@atlaskit/editor-tables'; import { findTableClosestToPos } from '@atlaskit/editor-tables/utils'; import { fg } from '@atlaskit/platform-feature-flags'; import { editorExperiment } from '@atlaskit/tmp-editor-statsig/experiments'; import { ACTIONS, decorationStateKey } from './main'; export var hoverDecorationCommand = function hoverDecorationCommand(_ref) { var add = _ref.add, _ref$className = _ref.className, className = _ref$className === void 0 ? 'danger selected' : _ref$className, providedSelection = _ref.selection; return function (_ref2) { var tr = _ref2.tr; // [FEATURE FLAG: platform_editor_block_menu_jira_patch_1] // Use the provided selection (e.g., preservedSelection) or fall back to tr.selection. // To clean up: always use providedSelection || tr.selection, remove the feature flag check. var selection = (fg('platform_editor_block_menu_jira_patch_1') ? providedSelection : undefined) || tr.selection; var decorations = []; var handleTableSelection = function handleTableSelection() { var pos = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : selection.$from; var table = findTableClosestToPos(pos); if (!table) { return tr; } var tableNode = table.node; var tablePos = table.pos; decorations.push(Decoration.node(tablePos, tablePos + tableNode.nodeSize, { class: className }, { key: "decorationNode-table-".concat(tablePos) })); var map = TableMap.get(tableNode); var cellPositions = new Set(map.map); cellPositions.forEach(function (cellPos) { var docPos = tablePos + cellPos + 1; var cell = tableNode.nodeAt(cellPos); if (cell) { decorations.push(Decoration.node(docPos, docPos + cell.nodeSize, { class: className }, { key: "decorationNode-cell-".concat(docPos) })); } }); }; var handleNodeSelection = function handleNodeSelection(node, pos) { var from = pos; var to = from + node.nodeSize; decorations.push(Decoration.node(from, to, { class: className }, { key: 'decorationNode' })); if (node.type.name === 'layoutSection' || node.type.name === 'layoutColumn') { var startOfInsideOfContainer = tr.doc.resolve(from + 1); var endOfInsideOfContainer = tr.doc.resolve(to - 1); handleNodesSelection(startOfInsideOfContainer, endOfInsideOfContainer); } }; var handleNodesSelection = function handleNodesSelection($from, $to) { var currentPos = $from.pos; var sourceNodes = getSourceNodesFromSelectionRange(tr, TextSelection.create(tr.doc, currentPos, $to.pos)); sourceNodes.forEach(function (sourceNode) { if (sourceNode.type.name === 'table') { var startPosOfTable = tr.doc.resolve(currentPos + 3); handleTableSelection(startPosOfTable); } else { handleNodeSelection(sourceNode, currentPos); } currentPos += sourceNode.nodeSize; }); }; // Selecting a table directly: CellSelection if (selection instanceof CellSelection) { handleTableSelection(); } // multiselect: TextSelection if (selection instanceof TextSelection) { handleNodesSelection(selection.$from, selection.$to); } if (selection instanceof NodeSelection) { handleNodeSelection(selection.node, selection.from); } // If no decorations were created, return early if (decorations.length === 0) { return tr; } var hasDangerDecorations = className.split(' ').includes('danger'); tr.setMeta(decorationStateKey, { action: add ? ACTIONS.DECORATION_ADD : ACTIONS.DECORATION_REMOVE, data: DecorationSet.create(tr.doc, decorations), hasDangerDecorations: editorExperiment('platform_editor_block_menu', true) && hasDangerDecorations }).setMeta('addToHistory', false); return tr; }; }; export var removeDecorationCommand = function removeDecorationCommand() { return function (_ref3) { var tr = _ref3.tr; return tr.setMeta(decorationStateKey, { action: ACTIONS.DECORATION_REMOVE }); }; };