@hitachivantara/uikit-react-core
Version:
Core React components for the NEXT Design System.
219 lines (218 loc) • 7.51 kB
JavaScript
;
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;