UNPKG

@hitachivantara/uikit-react-core

Version:

Core React components for the NEXT Design System.

219 lines (218 loc) 7.51 kB
"use strict"; Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" }); const React = require("react"); const utils = require("../utils.cjs"); function _interopNamespace(e) { if (e && e.__esModule) return e; const n = Object.create(null, { [Symbol.toStringTag]: { value: "Module" } }); if (e) { for (const k in e) { if (k !== "default") { const d = Object.getOwnPropertyDescriptor(e, k); Object.defineProperty(n, k, d.get ? d : { enumerable: true, get: () => e[k] }); } } } n.default = e; return Object.freeze(n); } const React__namespace = /* @__PURE__ */ _interopNamespace(React); const findOrderInTremauxTree = (instance, nodeAId, nodeBId) => { if (nodeAId === nodeBId) { return [nodeAId, nodeBId]; } const nodeA = instance.getNode(nodeAId); const nodeB = instance.getNode(nodeBId); if (nodeA.parentId === nodeB.id || nodeB.parentId === nodeA.id) { return nodeB.parentId === nodeA.id ? [nodeA.id, nodeB.id] : [nodeB.id, nodeA.id]; } const aFamily = [nodeA.id]; const bFamily = [nodeB.id]; let aAncestor = nodeA.parentId; let bAncestor = nodeB.parentId; let aAncestorIsCommon = bFamily.indexOf(aAncestor) !== -1; let bAncestorIsCommon = aFamily.indexOf(bAncestor) !== -1; let continueA = true; let continueB = true; while (!bAncestorIsCommon && !aAncestorIsCommon) { if (continueA) { aFamily.push(aAncestor); aAncestorIsCommon = bFamily.indexOf(aAncestor) !== -1; continueA = aAncestor !== null; if (!aAncestorIsCommon && continueA) { aAncestor = instance.getNode(aAncestor).parentId; } } if (continueB && !aAncestorIsCommon) { bFamily.push(bAncestor); bAncestorIsCommon = aFamily.indexOf(bAncestor) !== -1; continueB = bAncestor !== null; if (!bAncestorIsCommon && continueB) { bAncestor = instance.getNode(bAncestor).parentId; } } } const commonAncestor = aAncestorIsCommon ? aAncestor : bAncestor; const ancestorFamily = instance.getChildrenIds(commonAncestor); const aSide = aFamily[aFamily.indexOf(commonAncestor) - 1]; const bSide = bFamily[bFamily.indexOf(commonAncestor) - 1]; return ancestorFamily.indexOf(aSide) < ancestorFamily.indexOf(bSide) ? [nodeAId, nodeBId] : [nodeBId, nodeAId]; }; const useTreeViewSelection = ({ instance, params, models }) => { const lastSelectedNode = React__namespace.useRef(null); const lastSelectionWasRange = React__namespace.useRef(false); const currentRangeSelection = React__namespace.useRef([]); const isNodeSelected = (nodeId) => Array.isArray(models.selected.value) ? models.selected.value.indexOf(nodeId) !== -1 : models.selected.value === nodeId; const selectNode = (event, nodeId, multiple = false) => { if (params.disableSelection) { return; } if (multiple) { if (Array.isArray(models.selected.value)) { let newSelected; if (models.selected.value.indexOf(nodeId) !== -1) { newSelected = models.selected.value.filter((id) => id !== nodeId); } else { newSelected = [nodeId].concat(models.selected.value); } if (params.onNodeSelect) { params.onNodeSelect( event, newSelected ); } models.selected.setValue(newSelected); } } else { const newSelected = params.multiSelect ? [nodeId] : nodeId; if (params.onNodeSelect) { params.onNodeSelect(event, newSelected); } models.selected.setValue(newSelected); } lastSelectedNode.current = nodeId; lastSelectionWasRange.current = false; currentRangeSelection.current = []; }; const getNodesInRange = (nodeAId, nodeBId) => { const [first, last] = findOrderInTremauxTree(instance, nodeAId, nodeBId); const nodes = [first]; let current = first; while (current !== last) { current = utils.getNextNode(instance, current); nodes.push(current); } return nodes; }; const handleRangeArrowSelect = (event, nodes) => { let base = models.selected.value.slice(); const { start, next, current } = nodes; if (!next || !current) { return; } if (currentRangeSelection.current.indexOf(current) === -1) { currentRangeSelection.current = []; } if (lastSelectionWasRange.current) { if (currentRangeSelection.current.indexOf(next) !== -1) { base = base.filter((id) => id === start || id !== current); currentRangeSelection.current = currentRangeSelection.current.filter( (id) => id === start || id !== current ); } else { base.push(next); currentRangeSelection.current.push(next); } } else { base.push(next); currentRangeSelection.current.push(current, next); } if (params.onNodeSelect) { params.onNodeSelect( event, base ); } models.selected.setValue(base); }; const handleRangeSelect = (event, nodes) => { let base = models.selected.value.slice(); const { start, end } = nodes; if (lastSelectionWasRange.current) { base = base.filter( (id) => currentRangeSelection.current.indexOf(id) === -1 ); } let range = getNodesInRange(start, end); range = range.filter((node) => !instance.isNodeDisabled(node)); currentRangeSelection.current = range; let newSelected = base.concat(range); newSelected = newSelected.filter((id, i) => newSelected.indexOf(id) === i); if (params.onNodeSelect) { params.onNodeSelect( event, newSelected ); } models.selected.setValue(newSelected); }; const selectRange = (event, nodes, stacked = false) => { if (params.disableSelection) { return; } const { start = lastSelectedNode.current, end, current } = nodes; if (stacked) { handleRangeArrowSelect(event, { start, next: end, current }); } else if (start != null && end != null) { handleRangeSelect(event, { start, end }); } lastSelectionWasRange.current = true; }; const rangeSelectToFirst = (event, nodeId) => { if (!lastSelectedNode.current) { lastSelectedNode.current = nodeId; } const start = lastSelectionWasRange.current ? lastSelectedNode.current : nodeId; instance.selectRange(event, { start, end: utils.getFirstNode(instance) }); }; const rangeSelectToLast = (event, nodeId) => { if (!lastSelectedNode.current) { lastSelectedNode.current = nodeId; } const start = lastSelectionWasRange.current ? lastSelectedNode.current : nodeId; instance.selectRange(event, { start, end: utils.getLastNode(instance) }); }; utils.populateInstance(instance, { isNodeSelected, selectNode, selectRange, rangeSelectToLast, rangeSelectToFirst }); return { getRootProps: () => ({ "aria-multiselectable": params.multiSelect }) }; }; useTreeViewSelection.models = { selected: { controlledProp: "selected", defaultProp: "defaultSelected" } }; const DEFAULT_SELECTED = []; useTreeViewSelection.getDefaultizedParams = (params) => ({ ...params, disableSelection: params.disableSelection ?? false, multiSelect: params.multiSelect ?? false, defaultSelected: params.defaultSelected ?? (params.multiSelect ? DEFAULT_SELECTED : null) }); exports.findOrderInTremauxTree = findOrderInTremauxTree; exports.useTreeViewSelection = useTreeViewSelection;