@atlaskit/editor-plugin-local-id
Version:
LocalId plugin for @atlaskit/editor-core
64 lines (63 loc) • 2.65 kB
JavaScript
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);
};