UNPKG

@atlaskit/editor-plugin-local-id

Version:

LocalId plugin for @atlaskit/editor-core

64 lines (63 loc) 2.65 kB
import _slicedToArray from "@babel/runtime/helpers/slicedToArray"; import { BatchAttrsStep } from '@atlaskit/adf-schema/steps/batch-attrs-step'; import { tintDirtyTransaction } from '@atlaskit/editor-common/collab'; import { generateShortUUID, generatedShortUUIDs } from './generateShortUUID'; export var localIdNotEmpty = function localIdNotEmpty(localId) { return typeof localId === 'string' && localId.trim().length > 0; }; export var addMissingLocalIdsToDocument = function addMissingLocalIdsToDocument(tr) { var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}, onRepaired = _ref.onRepaired; var missingLocalIdPositions = []; var _tr$doc$type$schema$n = tr.doc.type.schema.nodes, text = _tr$doc$type$schema$n.text, hardBreak = _tr$doc$type$schema$n.hardBreak, mediaGroup = _tr$doc$type$schema$n.mediaGroup; var ignoredNodeTypes = [text === null || text === void 0 ? void 0 : text.name, hardBreak === null || hardBreak === void 0 ? void 0 : hardBreak.name, mediaGroup === null || mediaGroup === void 0 ? void 0 : mediaGroup.name]; tr.doc.descendants(function (node, pos) { var _node$type$spec$attrs; if (localIdNotEmpty(node.attrs.localId)) { generatedShortUUIDs.add(node.attrs.localId); } else if (!ignoredNodeTypes.includes(node.type.name) && !!((_node$type$spec$attrs = node.type.spec.attrs) !== null && _node$type$spec$attrs !== void 0 && _node$type$spec$attrs.localId)) { missingLocalIdPositions.push(pos); } return true; }); var nodesToUpdate = new Map(missingLocalIdPositions.map(function (pos) { return [pos, generateShortUUID()]; })); if (nodesToUpdate.size === 0) { return false; } batchAddLocalIdToNodes(nodesToUpdate, tr); tintDirtyTransaction(tr); onRepaired === null || onRepaired === void 0 || onRepaired({ repairedNodeCount: nodesToUpdate.size }); return true; }; /** * Batch adds local IDs to nodes using a BatchAttrsStep * @param nodesToUpdate Map of position -> localId for nodes that need updates * @param tr */ export var batchAddLocalIdToNodes = function batchAddLocalIdToNodes(nodesToUpdate, tr) { var batchData = Array.from(nodesToUpdate.entries()).map(function (_ref2) { var _ref3 = _slicedToArray(_ref2, 2), pos = _ref3[0], localId = _ref3[1]; var node = tr.doc.nodeAt(pos); if (!node) { throw new Error("Node does not exist at position ".concat(pos)); } return { position: pos, attrs: { localId: localId }, nodeType: node.type.name }; }); tr.step(new BatchAttrsStep(batchData)); tr.setMeta('addToHistory', false); };