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