UNPKG

@navikt/ds-react

Version:

React components from the Norwegian Labour and Welfare Administration.

127 lines 5.18 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.DescendantsManager = void 0; /** * https://github.com/chakra-ui/chakra-ui/tree/5ec0be610b5a69afba01a9c22365155c1b519136/packages/components/descendant */ const utils_1 = require("./utils"); /** * @internal * * Class to manage descendants and their relative indices in the DOM. * It uses `node.compareDocumentPosition(...)` under the hood */ class DescendantsManager { constructor() { this.descendants = new Map(); this.register = (nodeOrOptions) => { if (nodeOrOptions == null) return; if ((0, utils_1.isElement)(nodeOrOptions)) { return this.registerNode(nodeOrOptions); } return (node) => { this.registerNode(node, nodeOrOptions); }; }; this.unregister = (node) => { this.descendants.delete(node); const sorted = (0, utils_1.sortNodes)(Array.from(this.descendants.keys())); this.assignIndex(sorted); }; this.destroy = () => { this.descendants.clear(); }; this.assignIndex = (descendants) => { this.descendants.forEach((descendant) => { const index = descendants.indexOf(descendant.node); descendant.index = index; descendant.node.dataset.index = descendant.index.toString(); }); }; this.count = () => this.descendants.size; this.enabledCount = () => this.enabledValues().length; this.values = () => { const values = Array.from(this.descendants.values()); return values.sort((a, b) => a.index - b.index); }; this.enabledValues = () => { return this.values().filter((descendant) => !descendant.disabled); }; this.item = (index) => { if (this.count() === 0) return undefined; return this.values()[index]; }; this.enabledItem = (index) => { if (this.enabledCount() === 0) return undefined; return this.enabledValues()[index]; }; this.first = () => this.item(0); this.firstEnabled = () => this.enabledItem(0); this.last = () => this.item(this.descendants.size - 1); this.lastEnabled = () => { const lastIndex = this.enabledValues().length - 1; return this.enabledItem(lastIndex); }; this.indexOf = (node) => { var _a, _b; if (!node) return -1; return (_b = (_a = this.descendants.get(node)) === null || _a === void 0 ? void 0 : _a.index) !== null && _b !== void 0 ? _b : -1; }; this.enabledIndexOf = (node) => { if (node == null) return -1; return this.enabledValues().findIndex((i) => i.node.isSameNode(node)); }; this.next = (index, loop = true) => { const next = (0, utils_1.getNextIndex)(index, this.count(), loop); return this.item(next); }; this.nextEnabled = (index, loop = true) => { const item = this.item(index); if (!item) return; const enabledIndex = this.enabledIndexOf(item.node); const nextEnabledIndex = (0, utils_1.getNextIndex)(enabledIndex, this.enabledCount(), loop); return this.enabledItem(nextEnabledIndex); }; this.prev = (index, loop = true) => { const prev = (0, utils_1.getPrevIndex)(index, this.count() - 1, loop); return this.item(prev); }; this.prevEnabled = (index, loop = true) => { const item = this.item(index); if (!item) return; const enabledIndex = this.enabledIndexOf(item.node); const prevEnabledIndex = (0, utils_1.getPrevIndex)(enabledIndex, this.enabledCount() - 1, loop); return this.enabledItem(prevEnabledIndex); }; this.registerNode = (node, options) => { if (!node) return; /** * While the node is registered, we have to make sure to sync options * This is useful when ex. a node is disabled after it has been registered */ const mapNode = this.descendants.get(node); if (mapNode) { this.descendants.set(node, Object.assign({ index: mapNode.index, node }, options)); return; } const keys = Array.from(this.descendants.keys()).concat(node); const sorted = (0, utils_1.sortNodes)(keys); if (options === null || options === void 0 ? void 0 : options.disabled) { options.disabled = !!options.disabled; } const descendant = Object.assign({ node, index: -1 }, options); this.descendants.set(node, descendant); this.assignIndex(sorted); }; } } exports.DescendantsManager = DescendantsManager; //# sourceMappingURL=descendant.js.map