@atlaskit/editor-plugin-decorations
Version:
Decorations plugin for @atlaskit/editor-core
109 lines (106 loc) • 4.51 kB
JavaScript
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
});
};
};