UNPKG

@atlaskit/editor-plugin-decorations

Version:

Decorations plugin for @atlaskit/editor-core

115 lines (111 loc) 4.79 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.removeDecorationCommand = exports.hoverDecorationCommand = void 0; var _selection = require("@atlaskit/editor-common/selection"); var _state = require("@atlaskit/editor-prosemirror/state"); var _view = require("@atlaskit/editor-prosemirror/view"); var _editorTables = require("@atlaskit/editor-tables"); var _utils = require("@atlaskit/editor-tables/utils"); var _platformFeatureFlags = require("@atlaskit/platform-feature-flags"); var _experiments = require("@atlaskit/tmp-editor-statsig/experiments"); var _main = require("./main"); var hoverDecorationCommand = exports.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 = ((0, _platformFeatureFlags.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 = (0, _utils.findTableClosestToPos)(pos); if (!table) { return tr; } var tableNode = table.node; var tablePos = table.pos; decorations.push(_view.Decoration.node(tablePos, tablePos + tableNode.nodeSize, { class: className }, { key: "decorationNode-table-".concat(tablePos) })); var map = _editorTables.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(_view.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(_view.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 = (0, _selection.getSourceNodesFromSelectionRange)(tr, _state.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 _editorTables.CellSelection) { handleTableSelection(); } // multiselect: TextSelection if (selection instanceof _state.TextSelection) { handleNodesSelection(selection.$from, selection.$to); } if (selection instanceof _state.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(_main.decorationStateKey, { action: add ? _main.ACTIONS.DECORATION_ADD : _main.ACTIONS.DECORATION_REMOVE, data: _view.DecorationSet.create(tr.doc, decorations), hasDangerDecorations: (0, _experiments.editorExperiment)('platform_editor_block_menu', true) && hasDangerDecorations }).setMeta('addToHistory', false); return tr; }; }; var removeDecorationCommand = exports.removeDecorationCommand = function removeDecorationCommand() { return function (_ref3) { var tr = _ref3.tr; return tr.setMeta(_main.decorationStateKey, { action: _main.ACTIONS.DECORATION_REMOVE }); }; };