@mantine/core
Version:
React components library focused on usability, accessibility and developer experience
103 lines (102 loc) • 4.01 kB
JavaScript
"use client";
require("../../_virtual/_rolldown/runtime.cjs");
const require_find_element_ancestor = require("../../core/utils/find-element-ancestor/find-element-ancestor.cjs");
const require_Tree_module = require("./Tree.module.cjs");
let react = require("react");
let react_jsx_runtime = require("react/jsx-runtime");
//#region packages/@mantine/core/src/components/Tree/FlatTreeNode.tsx
const FlatTreeNode = (0, react.memo)(function FlatTreeNode({ node, level, parent, hasChildren, expanded, tree, expandOnClick = true, selectOnClick, expandOnSpace = true, checkOnSpace, renderNode, style, tabIndex = -1 }) {
const ref = (0, react.useRef)(null);
const isLoading = tree.isNodeLoading(node.value);
const loadError = tree.getNodeLoadError(node.value);
const selected = tree.selectedState.includes(node.value);
const handleClick = (event) => {
event.stopPropagation();
if (expandOnClick && hasChildren) tree.toggleExpanded(node.value);
if (selectOnClick) tree.select(node.value);
ref.current?.focus();
};
const handleKeyDown = (event) => {
if (event.nativeEvent.code === "ArrowRight") {
event.stopPropagation();
event.preventDefault();
if (expanded && hasChildren) {
const root = require_find_element_ancestor.findElementAncestor(event.currentTarget, "[data-tree-root]");
const nodes = root ? Array.from(root.querySelectorAll("[role=treeitem]")).filter((treeNode) => treeNode.style.display !== "none") : [];
const index = nodes.indexOf(event.currentTarget);
if (index !== -1) nodes[index + 1]?.focus();
} else if (hasChildren) tree.expand(node.value);
}
if (event.nativeEvent.code === "ArrowLeft") {
event.stopPropagation();
event.preventDefault();
if (expanded && hasChildren) tree.collapse(node.value);
else if (parent) (require_find_element_ancestor.findElementAncestor(event.currentTarget, "[data-tree-root]")?.querySelector(`[role=treeitem][data-value="${CSS.escape(parent)}"]`))?.focus();
}
if (event.nativeEvent.code === "ArrowDown" || event.nativeEvent.code === "ArrowUp") {
const root = require_find_element_ancestor.findElementAncestor(event.currentTarget, "[data-tree-root]");
if (!root) return;
event.stopPropagation();
event.preventDefault();
const nodes = Array.from(root.querySelectorAll("[role=treeitem]")).filter((treeNode) => treeNode.style.display !== "none");
const index = nodes.indexOf(event.currentTarget);
if (index === -1) return;
nodes[event.nativeEvent.code === "ArrowDown" ? index + 1 : index - 1]?.focus();
}
if (event.nativeEvent.code === "Space") {
if (expandOnSpace) {
event.stopPropagation();
event.preventDefault();
tree.toggleExpanded(node.value);
}
if (checkOnSpace) {
event.stopPropagation();
event.preventDefault();
if (tree.isNodeChecked(node.value)) tree.uncheckNode(node.value);
else tree.checkNode(node.value);
}
}
};
const elementProps = {
className: require_Tree_module.default.label,
style: {},
onClick: handleClick,
"data-selected": selected || void 0,
"data-value": node.value
};
return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
ref,
className: require_Tree_module.default.node,
style: {
"--label-offset": `calc(var(--level-offset, var(--mantine-spacing-lg)) * ${level - 1})`,
...style
},
role: "treeitem",
"aria-selected": selected,
"aria-expanded": hasChildren ? expanded : void 0,
"data-value": node.value,
"data-selected": selected || void 0,
"data-level": level,
tabIndex,
onKeyDown: handleKeyDown,
children: typeof renderNode === "function" ? renderNode({
node,
level,
selected,
tree,
expanded,
hasChildren,
isLoading,
loadError,
elementProps,
dragHandleProps: void 0
}) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
...elementProps,
children: node.label
})
});
});
FlatTreeNode.displayName = "@mantine/core/FlatTreeNode";
//#endregion
exports.FlatTreeNode = FlatTreeNode;
//# sourceMappingURL=FlatTreeNode.cjs.map