@hitachivantara/uikit-react-core 5.66.6 → 5.66.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/BaseDropdown/BaseDropdown.cjs +259 -241
- package/dist/cjs/BaseDropdown/BaseDropdownContext/BaseDropdownContext.cjs +6 -3
- package/dist/cjs/Button/Button.cjs +10 -2
- package/dist/cjs/Button/Button.styles.cjs +1 -1
- package/dist/cjs/Calendar/SingleCalendar/SingleCalendar.styles.cjs +0 -1
- package/dist/cjs/ColorPicker/ColorPicker.styles.cjs +2 -1
- package/dist/cjs/DropDownMenu/DropDownMenu.cjs +22 -5
- package/dist/cjs/DropDownMenu/DropDownMenu.styles.cjs +3 -1
- package/dist/cjs/Dropdown/List/List.cjs +2 -2
- package/dist/cjs/InlineEditor/InlineEditor.cjs +1 -1
- package/dist/cjs/MultiButton/MultiButton.styles.cjs +1 -6
- package/dist/cjs/TagsInput/TagsInput.cjs +1 -1
- package/dist/cjs/TimePicker/TimePicker.styles.cjs +0 -1
- package/dist/cjs/TreeView/TreeItem/TreeItem.cjs +2 -2
- package/dist/cjs/TreeView/TreeItem/TreeItem.styles.cjs +5 -3
- package/dist/cjs/TreeView/TreeItem/useHvTreeItem.cjs +23 -0
- package/dist/cjs/TreeView/internals/DescendantProvider.cjs +12 -16
- package/dist/cjs/VerticalNavigation/TreeView/TreeView.cjs +17 -24
- package/dist/cjs/VerticalNavigation/TreeView/TreeViewItem.cjs +4 -4
- package/dist/esm/BaseDropdown/BaseDropdown.js +261 -243
- package/dist/esm/BaseDropdown/BaseDropdown.js.map +1 -1
- package/dist/esm/BaseDropdown/BaseDropdownContext/BaseDropdownContext.js +8 -3
- package/dist/esm/BaseDropdown/BaseDropdownContext/BaseDropdownContext.js.map +1 -1
- package/dist/esm/Button/Button.js +11 -3
- package/dist/esm/Button/Button.js.map +1 -1
- package/dist/esm/Button/Button.styles.js +1 -1
- package/dist/esm/Button/Button.styles.js.map +1 -1
- package/dist/esm/Calendar/SingleCalendar/SingleCalendar.styles.js +0 -1
- package/dist/esm/Calendar/SingleCalendar/SingleCalendar.styles.js.map +1 -1
- package/dist/esm/CheckBox/CheckBox.js.map +1 -1
- package/dist/esm/CheckBoxGroup/CheckBoxGroup.js.map +1 -1
- package/dist/esm/ColorPicker/ColorPicker.styles.js +2 -1
- package/dist/esm/ColorPicker/ColorPicker.styles.js.map +1 -1
- package/dist/esm/DatePicker/DatePicker.js.map +1 -1
- package/dist/esm/DropDownMenu/DropDownMenu.js +23 -6
- package/dist/esm/DropDownMenu/DropDownMenu.js.map +1 -1
- package/dist/esm/DropDownMenu/DropDownMenu.styles.js +3 -1
- package/dist/esm/DropDownMenu/DropDownMenu.styles.js.map +1 -1
- package/dist/esm/Dropdown/Dropdown.js.map +1 -1
- package/dist/esm/Dropdown/List/List.js +3 -3
- package/dist/esm/Dropdown/List/List.js.map +1 -1
- package/dist/esm/InlineEditor/InlineEditor.js +1 -1
- package/dist/esm/InlineEditor/InlineEditor.js.map +1 -1
- package/dist/esm/MultiButton/MultiButton.styles.js +1 -6
- package/dist/esm/MultiButton/MultiButton.styles.js.map +1 -1
- package/dist/esm/SelectionList/SelectionList.js.map +1 -1
- package/dist/esm/Switch/Switch.js.map +1 -1
- package/dist/esm/TagsInput/TagsInput.js +1 -1
- package/dist/esm/TagsInput/TagsInput.js.map +1 -1
- package/dist/esm/TimePicker/TimePicker.js.map +1 -1
- package/dist/esm/TimePicker/TimePicker.styles.js +0 -1
- package/dist/esm/TimePicker/TimePicker.styles.js.map +1 -1
- package/dist/esm/TreeView/TreeItem/TreeItem.js +2 -2
- package/dist/esm/TreeView/TreeItem/TreeItem.js.map +1 -1
- package/dist/esm/TreeView/TreeItem/TreeItem.styles.js +5 -3
- package/dist/esm/TreeView/TreeItem/TreeItem.styles.js.map +1 -1
- package/dist/esm/TreeView/TreeItem/useHvTreeItem.js +4 -0
- package/dist/esm/TreeView/TreeItem/useHvTreeItem.js.map +1 -1
- package/dist/esm/TreeView/internals/DescendantProvider.js +12 -16
- package/dist/esm/TreeView/internals/DescendantProvider.js.map +1 -1
- package/dist/esm/VerticalNavigation/TreeView/TreeView.js +16 -23
- package/dist/esm/VerticalNavigation/TreeView/TreeView.js.map +1 -1
- package/dist/esm/VerticalNavigation/TreeView/TreeViewItem.js +2 -2
- package/dist/esm/VerticalNavigation/TreeView/TreeViewItem.js.map +1 -1
- package/dist/esm/hooks/useControlled.js.map +1 -1
- package/dist/types/index.d.ts +15 -11
- package/package.json +5 -5
- package/dist/cjs/VerticalNavigation/TreeView/descendants.cjs +0 -125
- package/dist/esm/VerticalNavigation/TreeView/descendants.js +0 -125
- package/dist/esm/VerticalNavigation/TreeView/descendants.js.map +0 -1
|
@@ -3,7 +3,7 @@ import { forwardRef, useRef, useState, useCallback, useMemo } from "react";
|
|
|
3
3
|
import { useControlled } from "../../hooks/useControlled.js";
|
|
4
4
|
import { useForkRef } from "../../hooks/useForkRef.js";
|
|
5
5
|
import { useUniqueId } from "../../hooks/useUniqueId.js";
|
|
6
|
-
import { DescendantProvider } from "
|
|
6
|
+
import { DescendantProvider } from "../../TreeView/internals/DescendantProvider.js";
|
|
7
7
|
import { useClasses } from "./TreeView.styles.js";
|
|
8
8
|
import { staticClasses } from "./TreeView.styles.js";
|
|
9
9
|
import { TreeViewControlContext, TreeViewStateContext } from "./TreeViewContext.js";
|
|
@@ -11,12 +11,7 @@ function isPrintableCharacter(string) {
|
|
|
11
11
|
return string && string.length === 1 && string.match(/\S/);
|
|
12
12
|
}
|
|
13
13
|
function findNextFirstChar(firstChars, startIndex, char) {
|
|
14
|
-
|
|
15
|
-
if (char === firstChars[i]) {
|
|
16
|
-
return i;
|
|
17
|
-
}
|
|
18
|
-
}
|
|
19
|
-
return -1;
|
|
14
|
+
return firstChars.slice(startIndex).findIndex((c) => c === char);
|
|
20
15
|
}
|
|
21
16
|
function noopSelection() {
|
|
22
17
|
return false;
|
|
@@ -100,7 +95,9 @@ const HvVerticalNavigationTreeView = forwardRef(
|
|
|
100
95
|
const isChildSelected = useCallback(
|
|
101
96
|
// the second part of the condition is to ensure that the id we're
|
|
102
97
|
// looking at is actually of a child (ie, there's at least one "-")
|
|
103
|
-
(id) =>
|
|
98
|
+
(id) => {
|
|
99
|
+
return Array().concat(selected).some((s) => s.startsWith(id) && s.includes("-"));
|
|
100
|
+
},
|
|
104
101
|
[selected]
|
|
105
102
|
);
|
|
106
103
|
const getChildrenIds = (id) => Object.keys(nodeMap.current).map((key) => {
|
|
@@ -258,12 +255,9 @@ const HvVerticalNavigationTreeView = forwardRef(
|
|
|
258
255
|
};
|
|
259
256
|
const toggleExpansion = useCallback(
|
|
260
257
|
(event, value = focusedNodeId) => {
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
} else {
|
|
265
|
-
newExpanded = [value].concat(expanded);
|
|
266
|
-
}
|
|
258
|
+
if (!value)
|
|
259
|
+
return;
|
|
260
|
+
const newExpanded = expanded.includes(value) ? expanded.filter((id) => id !== value) : [value].concat(expanded);
|
|
267
261
|
if (onToggle) {
|
|
268
262
|
onToggle(event, newExpanded);
|
|
269
263
|
}
|
|
@@ -293,7 +287,7 @@ const HvVerticalNavigationTreeView = forwardRef(
|
|
|
293
287
|
};
|
|
294
288
|
const handleRangeArrowSelect = useCallback(
|
|
295
289
|
(event, nodes) => {
|
|
296
|
-
let base =
|
|
290
|
+
let base = Array().concat(selected);
|
|
297
291
|
const { start, next, current } = nodes;
|
|
298
292
|
if (!next || !current) {
|
|
299
293
|
return;
|
|
@@ -328,11 +322,11 @@ const HvVerticalNavigationTreeView = forwardRef(
|
|
|
328
322
|
);
|
|
329
323
|
const handleRangeSelect = useCallback(
|
|
330
324
|
(event, nodes) => {
|
|
331
|
-
let base =
|
|
325
|
+
let base = Array().concat(selected);
|
|
332
326
|
const { start, end } = nodes;
|
|
333
327
|
if (lastSelectionWasRange.current) {
|
|
334
328
|
base = base.filter(
|
|
335
|
-
(id) => currentRangeSelection.current.
|
|
329
|
+
(id) => !currentRangeSelection.current.includes(id)
|
|
336
330
|
);
|
|
337
331
|
}
|
|
338
332
|
let range = getNodesInRange(start, end);
|
|
@@ -355,12 +349,7 @@ const HvVerticalNavigationTreeView = forwardRef(
|
|
|
355
349
|
);
|
|
356
350
|
const handleMultipleSelect = useCallback(
|
|
357
351
|
(event, value) => {
|
|
358
|
-
|
|
359
|
-
if (selected.indexOf(value) !== -1) {
|
|
360
|
-
newSelected = selected.filter((id) => id !== value);
|
|
361
|
-
} else {
|
|
362
|
-
newSelected = [value].concat(selected);
|
|
363
|
-
}
|
|
352
|
+
const newSelected = selected.includes(value) ? selected.filter((id) => id !== value) : [value].concat(selected);
|
|
364
353
|
if (onChange) {
|
|
365
354
|
onChange(
|
|
366
355
|
event,
|
|
@@ -503,6 +492,8 @@ const HvVerticalNavigationTreeView = forwardRef(
|
|
|
503
492
|
firstCharMap.current = newMap;
|
|
504
493
|
}, []);
|
|
505
494
|
const handleNextArrow = (event) => {
|
|
495
|
+
if (!focusedNodeId)
|
|
496
|
+
return false;
|
|
506
497
|
if (isExpandable(focusedNodeId)) {
|
|
507
498
|
if (isExpanded(focusedNodeId)) {
|
|
508
499
|
focusNextNode(event, focusedNodeId);
|
|
@@ -513,6 +504,8 @@ const HvVerticalNavigationTreeView = forwardRef(
|
|
|
513
504
|
return true;
|
|
514
505
|
};
|
|
515
506
|
const handlePreviousArrow = (event) => {
|
|
507
|
+
if (!focusedNodeId)
|
|
508
|
+
return false;
|
|
516
509
|
if (isExpanded(focusedNodeId) && !isDisabled(focusedNodeId)) {
|
|
517
510
|
toggleExpansion(event, focusedNodeId);
|
|
518
511
|
return true;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TreeView.js","sources":["../../../../src/VerticalNavigation/TreeView/TreeView.tsx"],"sourcesContent":["import { forwardRef, useCallback, useMemo, useRef, useState } from \"react\";\n\nimport { useControlled } from \"../../hooks/useControlled\";\nimport { useForkRef } from \"../../hooks/useForkRef\";\nimport { useUniqueId } from \"../../hooks/useUniqueId\";\nimport { ExtractNames } from \"../../utils/classes\";\nimport { DescendantProvider } from \"./descendants\";\nimport { staticClasses, useClasses } from \"./TreeView.styles\";\nimport {\n NavigationMode,\n TreeViewControlContext,\n TreeViewStateContext,\n} from \"./TreeViewContext\";\n\nexport { staticClasses as treeViewClasses };\n\nexport type HvVerticalNavigationTreeViewClasses = ExtractNames<\n typeof useClasses\n>;\n\nexport interface HvVerticalNavigationTreeViewProps {\n /**\n * Id to be applied to the root node.\n */\n id?: string;\n /**\n * Class names to be applied.\n */\n className?: string;\n /**\n * A Jss Object used to override or extend the styles applied to the component.\n */\n classes?: HvVerticalNavigationTreeViewClasses;\n /**\n * Modus operandi (role) of the widget instance.\n */\n mode?: NavigationMode;\n /**\n * Enables selection.\n * @default false\n */\n selectable?: boolean;\n /**\n * Enables the simultaneous selection of multiple items.\n * @default false\n */\n multiSelect?: boolean;\n /**\n * The selected nodes' ids.\n *\n * When `multiSelect` is true this takes an array of strings; when false (default) a string.\n */\n selected?: string[] | string;\n /**\n * When uncontrolled, defines the initial selected nodes' ids.\n *\n * When `multiSelect` is true this takes an array of strings; when false (default) a string.\n * @default []\n */\n defaultSelected?: string[] | string;\n /**\n * Can non-leaf nodes be collapsed / expanded.\n */\n collapsible?: boolean;\n /**\n * Callback fired when a tree item is selected.\n *\n * @param {object} event The event source of the callback.\n * @param {string} nodeId The id of the selected node.\n */\n onChange?: any;\n /**\n * Expanded nodes' ids.\n */\n expanded?: string[];\n /**\n * When uncontrolled, defines the initial expanded nodes' ids.\n * @default []\n */\n defaultExpanded?: string[];\n /**\n * Callback fired when tree items are expanded/collapsed.\n *\n * @param {object} event The event source of the callback.\n * @param {array} nodeIds The ids of the expanded nodes (old and new).\n */\n onToggle?: (event, nodeIds) => void;\n /**\n * If `true`, will allow focus on disabled items.\n * @default false\n */\n disabledItemsFocusable?: boolean;\n /**\n * @ignore\n */\n onFocus?: (event: React.FocusEvent<any>) => void;\n /**\n * @ignore\n */\n onBlur?: (event: any) => void;\n /**\n * @ignore\n */\n onKeyDown?: (event: KeyboardEvent) => void;\n /**\n * The content of the component.\n */\n children?: React.ReactNode;\n}\n\nfunction isPrintableCharacter(string) {\n return string && string.length === 1 && string.match(/\\S/);\n}\n\nfunction findNextFirstChar(firstChars, startIndex, char) {\n for (let i = startIndex; i < firstChars.length; i += 1) {\n if (char === firstChars[i]) {\n return i;\n }\n }\n return -1;\n}\n\nfunction noopSelection() {\n return false;\n}\n\nexport const HvVerticalNavigationTreeView = forwardRef(\n (props: HvVerticalNavigationTreeViewProps, ref) => {\n const {\n id: idProp,\n className,\n classes: classesProp,\n\n mode = \"treeview\",\n\n collapsible = false,\n expanded: expandedProp,\n defaultExpanded = [],\n onToggle,\n\n selectable = false,\n multiSelect: multiSelectProp = false,\n selected: selectedProp,\n defaultSelected = [],\n onChange,\n\n disabledItemsFocusable = false,\n\n onFocus,\n onBlur,\n onKeyDown,\n\n children,\n\n ...others\n } = props;\n\n const { classes, cx } = useClasses(classesProp);\n\n const treeviewMode = mode === \"treeview\";\n const multiSelect = selectable && multiSelectProp;\n\n const treeId = useUniqueId(idProp);\n const treeRef = useRef<HTMLDivElement>(null);\n const handleRef = useForkRef(treeRef, ref);\n\n const [expanded, setExpandedState] = useControlled(\n expandedProp,\n defaultExpanded,\n );\n\n const [selected, setSelectedState] = useControlled(\n selectedProp,\n defaultSelected,\n );\n\n const [focusedNodeId, setFocusedNodeId] = useState<string | null>(null);\n\n const nodeMap = useRef({});\n\n const firstCharMap = useRef({});\n\n /*\n * Status Helpers\n */\n const isExpanded = useCallback(\n (id) =>\n !collapsible ||\n (Array.isArray(expanded) ? expanded.indexOf(id) !== -1 : false),\n [collapsible, expanded],\n );\n\n const isExpandable = useCallback(\n (id) =>\n collapsible && nodeMap.current[id] && nodeMap.current[id].expandable,\n [collapsible],\n );\n\n const isSelected = useCallback(\n (id) =>\n selectable &&\n (Array.isArray(selected)\n ? selected.indexOf(id) !== -1\n : selected === id),\n [selectable, selected],\n );\n\n const isSelectable = useCallback(\n (id) =>\n selectable && nodeMap.current[id] && nodeMap.current[id].selectable,\n [selectable],\n );\n\n const isDisabled = useCallback((id) => {\n let node = nodeMap.current[id];\n\n // This can be called before the node has been added to the node map.\n if (!node) {\n return false;\n }\n\n if (node.disabled) {\n return true;\n }\n\n while (node.parentId != null) {\n node = nodeMap.current[node.parentId];\n if (node.disabled) {\n return true;\n }\n }\n\n return false;\n }, []);\n\n const isFocused = useCallback(\n (id) => focusedNodeId === id,\n [focusedNodeId],\n );\n\n const isChildSelected = useCallback(\n // the second part of the condition is to ensure that the id we're\n // looking at is actually of a child (ie, there's at least one \"-\")\n (id) => selected.startsWith(id) && selected.includes(\"-\"),\n [selected],\n );\n\n /*\n * Child Helpers\n */\n const getChildrenIds = (id: string | null) =>\n Object.keys(nodeMap.current)\n .map((key) => {\n return nodeMap.current[key];\n })\n .filter((node) => node.parentId === id)\n .sort((a, b) => a.index - b.index)\n .map((child) => child.id);\n\n const getNavigableChildrenIds = useCallback(\n (id: string | null) => {\n let childrenIds = getChildrenIds(id);\n\n if (!disabledItemsFocusable) {\n childrenIds = childrenIds.filter((node) => !isDisabled(node));\n }\n return childrenIds;\n },\n [disabledItemsFocusable, isDisabled],\n );\n\n /*\n * Node Helpers\n */\n const getNextNode = useCallback(\n (id: string) => {\n // If expanded get first child\n if (isExpanded(id) && getNavigableChildrenIds(id).length > 0) {\n return getNavigableChildrenIds(id)[0];\n }\n\n let node = nodeMap.current[id];\n while (node != null) {\n // Try to get next sibling\n const siblings = getNavigableChildrenIds(node.parentId);\n const nextSibling = siblings[siblings.indexOf(node.id) + 1];\n\n if (nextSibling) {\n return nextSibling;\n }\n\n // If the sibling does not exist, go up a level to the parent and try again.\n node = nodeMap.current[node.parentId];\n }\n\n return null;\n },\n [getNavigableChildrenIds, isExpanded],\n );\n\n const getPreviousNode = (id: string) => {\n const node = nodeMap.current[id];\n const siblings = getNavigableChildrenIds(node.parentId);\n const nodeIndex = siblings.indexOf(id);\n\n if (nodeIndex === 0) {\n return node.parentId;\n }\n\n let currentNode = siblings[nodeIndex - 1];\n while (\n isExpanded(currentNode) &&\n getNavigableChildrenIds(currentNode).length > 0\n ) {\n currentNode = getNavigableChildrenIds(currentNode).pop();\n }\n\n return currentNode;\n };\n\n const getLastNode = () => {\n let lastNode = getNavigableChildrenIds(null).pop();\n\n while (isExpanded(lastNode)) {\n lastNode = getNavigableChildrenIds(lastNode).pop();\n }\n return lastNode;\n };\n const getFirstNode = () => getNavigableChildrenIds(null)[0];\n const getParent = (id) => nodeMap.current[id].parentId;\n\n /**\n * This is used to determine the start and end of a selection range so\n * we can get the nodes between the two border nodes.\n *\n * It finds the nodes' common ancestor using\n * a naive implementation of a lowest common ancestor algorithm\n * (https://en.wikipedia.org/wiki/Lowest_common_ancestor).\n * Then compares the ancestor's 2 children that are ancestors of nodeA and NodeB\n * so we can compare their indexes to work out which node comes first in a depth first search.\n * (https://en.wikipedia.org/wiki/Depth-first_search)\n *\n * Another way to put it is which node is shallower in a trémaux tree\n * https://en.wikipedia.org/wiki/Tr%C3%A9maux_tree\n */\n const findOrderInTremauxTree = useCallback(\n (nodeAId: string, nodeBId: string) => {\n if (nodeAId === nodeBId) {\n return [nodeAId, nodeBId];\n }\n\n const nodeA = nodeMap.current[nodeAId];\n const nodeB = nodeMap.current[nodeBId];\n\n if (nodeA.parentId === nodeB.id || nodeB.parentId === nodeA.id) {\n return nodeB.parentId === nodeA.id\n ? [nodeA.id, nodeB.id]\n : [nodeB.id, nodeA.id];\n }\n\n const aFamily = [nodeA.id];\n const bFamily = [nodeB.id];\n\n let aAncestor = nodeA.parentId;\n let bAncestor = nodeB.parentId;\n\n let aAncestorIsCommon = bFamily.indexOf(aAncestor) !== -1;\n let bAncestorIsCommon = aFamily.indexOf(bAncestor) !== -1;\n\n let continueA = true;\n let continueB = true;\n\n while (!bAncestorIsCommon && !aAncestorIsCommon) {\n if (continueA) {\n aFamily.push(aAncestor);\n aAncestorIsCommon = bFamily.indexOf(aAncestor) !== -1;\n continueA = aAncestor !== null;\n if (!aAncestorIsCommon && continueA) {\n aAncestor = nodeMap.current[aAncestor].parentId;\n }\n }\n\n if (continueB && !aAncestorIsCommon) {\n bFamily.push(bAncestor);\n bAncestorIsCommon = aFamily.indexOf(bAncestor) !== -1;\n continueB = bAncestor !== null;\n if (!bAncestorIsCommon && continueB) {\n bAncestor = nodeMap.current[bAncestor].parentId;\n }\n }\n }\n\n const commonAncestor = aAncestorIsCommon ? aAncestor : bAncestor;\n const ancestorFamily = getChildrenIds(commonAncestor);\n\n const aSide = aFamily[aFamily.indexOf(commonAncestor) - 1];\n const bSide = bFamily[bFamily.indexOf(commonAncestor) - 1];\n\n return ancestorFamily.indexOf(aSide) < ancestorFamily.indexOf(bSide)\n ? [nodeAId, nodeBId]\n : [nodeBId, nodeAId];\n },\n [],\n );\n\n const getNodesInRange = useCallback(\n (nodeA, nodeB) => {\n if (nodeA && nodeB) {\n const [first, last] = findOrderInTremauxTree(nodeA, nodeB);\n const nodes = [first];\n\n let current = first;\n\n while (current !== last) {\n current = getNextNode(current);\n nodes.push(current);\n }\n\n return nodes;\n }\n return [];\n },\n [findOrderInTremauxTree, getNextNode],\n );\n\n /*\n * Focus Helpers\n */\n const focus = (event, id) => {\n if (id) {\n setFocusedNodeId(id);\n\n if (nodeMap.current[id]?.onFocus) {\n nodeMap.current[id].onFocus(event);\n }\n }\n };\n\n const focusNextNode = (event, id) => focus(event, getNextNode(id));\n const focusPreviousNode = (event, id) => focus(event, getPreviousNode(id));\n const focusFirstNode = (event) => focus(event, getFirstNode());\n const focusLastNode = (event) => focus(event, getLastNode());\n\n const focusByFirstCharacter = (event, id, char) => {\n let start;\n let index;\n const lowercaseChar = char.toLowerCase();\n\n const firstCharIds: string[] = [];\n const firstChars: string[] = [];\n // This really only works since the ids are strings\n Object.keys(firstCharMap.current).forEach((nodeId) => {\n const firstChar = firstCharMap.current[nodeId];\n const map = nodeMap.current[nodeId];\n const visible = map.parentId ? isExpanded(map.parentId) : true;\n const shouldBeSkipped = disabledItemsFocusable\n ? false\n : isDisabled(nodeId);\n\n if (visible && !shouldBeSkipped) {\n firstCharIds.push(nodeId);\n firstChars.push(firstChar);\n }\n });\n\n // Get start index for search based on position of currentItem\n start = firstCharIds.indexOf(id) + 1;\n if (start >= firstCharIds.length) {\n start = 0;\n }\n\n // Check remaining slots in the menu\n index = findNextFirstChar(firstChars, start, lowercaseChar);\n\n // If not found in remaining slots, check from beginning\n if (index === -1) {\n index = findNextFirstChar(firstChars, 0, lowercaseChar);\n }\n\n // If match was found...\n if (index > -1) {\n focus(event, firstCharIds[index]);\n }\n };\n\n /*\n * Expansion Helpers\n */\n const toggleExpansion = useCallback(\n (event, value = focusedNodeId) => {\n let newExpanded;\n\n if (expanded.indexOf(value) !== -1) {\n newExpanded = expanded.filter((id) => id !== value);\n } else {\n newExpanded = [value].concat(expanded);\n }\n\n if (onToggle) {\n onToggle(event, newExpanded);\n }\n\n setExpandedState(newExpanded);\n },\n [expanded, focusedNodeId, onToggle, setExpandedState],\n );\n\n const expandAllSiblings = (event, id) => {\n const map = nodeMap.current[id];\n const siblings = getChildrenIds(map.parentId);\n\n const diff = siblings.filter(\n (child) => isExpandable(child) && !isExpanded(child),\n );\n\n const newExpanded = expanded.concat(diff);\n\n if (diff.length > 0) {\n setExpandedState(newExpanded);\n\n if (onToggle) {\n onToggle(event, newExpanded);\n }\n }\n };\n\n /*\n * Selection Helpers\n */\n const lastSelectedNode = useRef<HTMLDivElement | null>(null);\n const lastSelectionWasRange = useRef(false);\n const currentRangeSelection = useRef<HTMLDivElement[]>([]);\n\n const isDivElement = (element): element is HTMLDivElement => {\n return (element as HTMLDivElement).nodeType === 1;\n };\n\n const handleRangeArrowSelect = useCallback(\n (event, nodes: { start?; next?; current? }) => {\n let base = selected.slice();\n const { start, next, current } = nodes;\n\n if (!next || !current) {\n return;\n }\n\n if (\n isDivElement(current) &&\n currentRangeSelection.current.indexOf(current) === -1\n ) {\n currentRangeSelection.current = [];\n }\n\n if (lastSelectionWasRange.current) {\n if (\n isDivElement(next) &&\n currentRangeSelection.current.indexOf(next) !== -1\n ) {\n base = base.filter((id) => id === start || id !== current);\n currentRangeSelection.current =\n currentRangeSelection.current.filter(\n (id) => id === start || id !== current,\n );\n } else {\n base.push(next);\n currentRangeSelection.current.push(next);\n }\n } else {\n base.push(next);\n currentRangeSelection.current.push(current, next);\n }\n\n if (onChange) {\n onChange(\n event,\n base,\n base.map((id) => nodeMap.current[id]?.payload),\n );\n }\n\n setSelectedState(base);\n },\n [onChange, selected, setSelectedState],\n );\n\n const handleRangeSelect = useCallback(\n (event, nodes: { start?; end?; current? }) => {\n let base = selected.slice();\n const { start, end } = nodes;\n // If last selection was a range selection ignore nodes that were selected.\n if (lastSelectionWasRange.current) {\n base = base.filter(\n (id) => currentRangeSelection.current.indexOf(id) === -1,\n );\n }\n\n let range = getNodesInRange(start, end);\n range = range.filter((node) => !isDisabled(node));\n currentRangeSelection.current = range;\n let newSelected = base.concat(range);\n newSelected = newSelected.filter(\n (id, i) => newSelected.indexOf(id) === i,\n );\n\n if (onChange) {\n onChange(\n event,\n newSelected,\n newSelected.map((id) => nodeMap.current[id]?.payload),\n );\n }\n\n setSelectedState(newSelected);\n },\n [getNodesInRange, isDisabled, onChange, selected, setSelectedState],\n );\n\n const handleMultipleSelect = useCallback(\n (event, value) => {\n let newSelected;\n if (selected.indexOf(value) !== -1) {\n newSelected = selected.filter((id) => id !== value);\n } else {\n newSelected = [value].concat(selected);\n }\n\n if (onChange) {\n onChange(\n event,\n newSelected,\n newSelected.map((id) => nodeMap.current[id]?.payload),\n );\n }\n\n setSelectedState(newSelected);\n },\n [onChange, selected, setSelectedState],\n );\n\n const handleSingleSelect = useCallback(\n (event, value) => {\n const newSelected = multiSelect ? [value] : value;\n if (onChange) {\n const nodeValue = nodeMap.current[newSelected]?.payload;\n onChange(event, newSelected, multiSelect ? [nodeValue] : nodeValue);\n }\n\n setSelectedState(newSelected);\n },\n [multiSelect, onChange, setSelectedState],\n );\n\n const selectNode = useCallback(\n (event, id, multiple = false) => {\n if (id && isSelectable(id)) {\n if (multiple) {\n handleMultipleSelect(event, id);\n } else {\n handleSingleSelect(event, id);\n }\n lastSelectedNode.current = id;\n lastSelectionWasRange.current = false;\n currentRangeSelection.current = [];\n\n return true;\n }\n return false;\n },\n [handleMultipleSelect, handleSingleSelect, isSelectable],\n );\n\n const selectRange = useCallback(\n (\n event,\n nodes: { start?; end?; current?: HTMLDivElement | null },\n stacked = false,\n ) => {\n const { start = lastSelectedNode.current, end, current } = nodes;\n if (stacked) {\n handleRangeArrowSelect(event, { start, next: end, current });\n } else if (start != null && end != null) {\n handleRangeSelect(event, { start, end });\n }\n lastSelectionWasRange.current = true;\n },\n [handleRangeArrowSelect, handleRangeSelect],\n );\n\n const rangeSelectToFirst = (event, id) => {\n if (!lastSelectedNode.current) {\n lastSelectedNode.current = id;\n }\n\n const start = lastSelectionWasRange.current\n ? lastSelectedNode.current\n : id;\n\n selectRange(event, {\n start,\n end: getFirstNode(),\n });\n };\n\n const rangeSelectToLast = (event: any, id) => {\n if (!lastSelectedNode.current) {\n lastSelectedNode.current = id;\n }\n\n const start = lastSelectionWasRange.current\n ? lastSelectedNode.current\n : id;\n\n selectRange(event, {\n start,\n end: getLastNode(),\n });\n };\n\n const selectNextNode = (event, id) => {\n if (!isDisabled(getNextNode(id))) {\n selectRange(\n event,\n {\n end: getNextNode(id),\n current: id,\n },\n true,\n );\n }\n };\n\n const selectPreviousNode = (event, id) => {\n if (!isDisabled(getPreviousNode(id))) {\n selectRange(\n event,\n {\n end: getPreviousNode(id),\n current: id,\n },\n true,\n );\n }\n };\n\n const selectAllNodes = (event) => {\n selectRange(event, { start: getFirstNode(), end: getLastNode() });\n };\n\n /*\n * Mapping Helpers\n */\n const registerNode = useCallback((node) => {\n const {\n id,\n index,\n parentId,\n expandable,\n idAttribute,\n disabled,\n selectable: nodeSelectable,\n onFocus: nodeOnFocus,\n payload,\n } = node;\n\n nodeMap.current[id] = {\n id,\n index,\n parentId,\n expandable,\n idAttribute,\n disabled,\n selectable: nodeSelectable,\n onFocus: nodeOnFocus,\n payload,\n };\n }, []);\n\n const unregisterNode = useCallback((id) => {\n const newMap = { ...nodeMap.current };\n delete newMap[id];\n nodeMap.current = newMap;\n\n setFocusedNodeId((oldFocusedNodeId) => {\n if (\n oldFocusedNodeId === id &&\n treeRef.current &&\n treeRef.current ===\n (treeRef.current.ownerDocument || document).activeElement\n ) {\n return getChildrenIds(null)[0];\n }\n return oldFocusedNodeId;\n });\n }, []);\n\n const mapFirstChar = useCallback((id, firstChar) => {\n firstCharMap.current[id] = firstChar;\n }, []);\n\n const unMapFirstChar = useCallback((id) => {\n const newMap = { ...firstCharMap.current };\n delete newMap[id];\n firstCharMap.current = newMap;\n }, []);\n\n /**\n * Event handlers and Navigation\n */\n const handleNextArrow = (event) => {\n if (isExpandable(focusedNodeId)) {\n if (isExpanded(focusedNodeId)) {\n focusNextNode(event, focusedNodeId);\n } else if (!isDisabled(focusedNodeId)) {\n toggleExpansion(event);\n }\n }\n return true;\n };\n\n const handlePreviousArrow = (event) => {\n if (isExpanded(focusedNodeId) && !isDisabled(focusedNodeId)) {\n toggleExpansion(event, focusedNodeId);\n return true;\n }\n\n const parent = getParent(focusedNodeId);\n if (parent) {\n focus(event, parent);\n return true;\n }\n return false;\n };\n\n const handleKeyDown = (event) => {\n let flag = false;\n const { key } = event;\n\n // If the tree is empty there will be no focused node\n if (\n event.altKey ||\n event.currentTarget !== event.target ||\n !focusedNodeId\n ) {\n return;\n }\n\n const ctrlPressed = event.ctrlKey || event.metaKey;\n switch (key) {\n case \" \":\n if (isSelectable(focusedNodeId) && !isDisabled(focusedNodeId)) {\n if (multiSelect && event.shiftKey) {\n selectRange(event, { end: focusedNodeId });\n flag = true;\n } else if (multiSelect) {\n flag = selectNode(event, focusedNodeId, true);\n } else {\n flag = selectNode(event, focusedNodeId);\n }\n }\n event.stopPropagation();\n break;\n case \"Enter\":\n if (!isDisabled(focusedNodeId)) {\n if (isExpandable(focusedNodeId)) {\n toggleExpansion(event);\n flag = true;\n } else if (isSelectable(focusedNodeId)) {\n if (multiSelect && event.shiftKey) {\n selectRange(event, { end: focusedNodeId });\n flag = true;\n } else if (multiSelect) {\n flag = selectNode(event, focusedNodeId, true);\n } else {\n flag = selectNode(event, focusedNodeId);\n }\n }\n }\n event.stopPropagation();\n break;\n case \"ArrowDown\":\n if (multiSelect && event.shiftKey) {\n selectNextNode(event, focusedNodeId);\n }\n focusNextNode(event, focusedNodeId);\n flag = true;\n break;\n case \"ArrowUp\":\n if (multiSelect && event.shiftKey) {\n selectPreviousNode(event, focusedNodeId);\n }\n focusPreviousNode(event, focusedNodeId);\n flag = true;\n break;\n case \"ArrowRight\":\n flag = handleNextArrow(event);\n break;\n case \"ArrowLeft\":\n flag = handlePreviousArrow(event);\n break;\n case \"Home\":\n if (\n multiSelect &&\n ctrlPressed &&\n event.shiftKey &&\n !isDisabled(focusedNodeId)\n ) {\n rangeSelectToFirst(event, focusedNodeId);\n }\n focusFirstNode(event);\n flag = true;\n break;\n case \"End\":\n if (\n multiSelect &&\n ctrlPressed &&\n event.shiftKey &&\n !isDisabled(focusedNodeId)\n ) {\n rangeSelectToLast(event, focusedNodeId);\n }\n focusLastNode(event);\n flag = true;\n break;\n default:\n if (key === \"*\") {\n expandAllSiblings(event, focusedNodeId);\n flag = true;\n } else if (multiSelect && ctrlPressed && key.toLowerCase() === \"a\") {\n selectAllNodes(event);\n flag = true;\n } else if (\n !ctrlPressed &&\n !event.shiftKey &&\n isPrintableCharacter(key)\n ) {\n focusByFirstCharacter(event, focusedNodeId, key);\n flag = true;\n }\n }\n\n if (flag) {\n event.preventDefault();\n event.stopPropagation();\n }\n\n if (onKeyDown) {\n onKeyDown(event);\n }\n };\n\n const handleFocus = (event) => {\n // if the event bubbled (which is React specific) we don't want to steal focus\n if (event.target === event.currentTarget) {\n const firstSelected = Array.isArray(selected) ? selected[0] : selected;\n focus(event, firstSelected || getNavigableChildrenIds(null)[0]);\n }\n\n if (onFocus) {\n onFocus(event);\n }\n };\n\n const handleBlur = (event) => {\n setFocusedNodeId(null);\n\n if (onBlur) {\n onBlur(event);\n }\n };\n\n const activeDescendant =\n focusedNodeId && nodeMap.current[focusedNodeId]\n ? nodeMap.current[focusedNodeId].idAttribute\n : null;\n\n const treeControlContext = useMemo(\n () => ({\n treeId,\n mode,\n collapsible,\n toggleExpansion,\n multiSelect,\n selectNode: selectable ? selectNode : noopSelection,\n selectRange: selectable ? selectRange : noopSelection,\n disabledItemsFocusable,\n registerNode,\n unregisterNode,\n mapFirstChar,\n unMapFirstChar,\n focus,\n }),\n [\n registerNode,\n unregisterNode,\n mapFirstChar,\n unMapFirstChar,\n toggleExpansion,\n selectable,\n selectNode,\n selectRange,\n mode,\n collapsible,\n multiSelect,\n disabledItemsFocusable,\n treeId,\n ],\n );\n\n const treeStateContext = useMemo(\n () => ({\n isExpanded,\n isSelected,\n isFocused,\n isDisabled,\n isChildSelected,\n }),\n [isDisabled, isExpanded, isFocused, isSelected, isChildSelected],\n );\n\n return (\n <TreeViewControlContext.Provider value={treeControlContext}>\n <TreeViewStateContext.Provider value={treeStateContext}>\n <DescendantProvider>\n <ul\n ref={handleRef}\n id={idProp}\n className={cx(classes.root, className)}\n {...(treeviewMode && {\n id: treeId,\n role: \"tree\",\n \"aria-multiselectable\": multiSelect,\n \"aria-activedescendant\": activeDescendant,\n tabIndex: 0,\n onFocus: handleFocus,\n onBlur: handleBlur,\n onKeyDown: handleKeyDown,\n })}\n {...others}\n >\n {children}\n </ul>\n </DescendantProvider>\n </TreeViewStateContext.Provider>\n </TreeViewControlContext.Provider>\n );\n },\n);\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"TreeView.js","sources":["../../../../src/VerticalNavigation/TreeView/TreeView.tsx"],"sourcesContent":["import { forwardRef, useCallback, useMemo, useRef, useState } from \"react\";\n\nimport { useControlled } from \"../../hooks/useControlled\";\nimport { useForkRef } from \"../../hooks/useForkRef\";\nimport { useUniqueId } from \"../../hooks/useUniqueId\";\nimport { DescendantProvider } from \"../../TreeView/internals/DescendantProvider\";\nimport { ExtractNames } from \"../../utils/classes\";\nimport { staticClasses, useClasses } from \"./TreeView.styles\";\nimport {\n NavigationMode,\n TreeViewControlContext,\n TreeViewStateContext,\n} from \"./TreeViewContext\";\n\nexport { staticClasses as treeViewClasses };\n\nexport type HvVerticalNavigationTreeViewClasses = ExtractNames<\n typeof useClasses\n>;\n\nexport interface HvVerticalNavigationTreeViewProps {\n /**\n * Id to be applied to the root node.\n */\n id?: string;\n /**\n * Class names to be applied.\n */\n className?: string;\n /**\n * A Jss Object used to override or extend the styles applied to the component.\n */\n classes?: HvVerticalNavigationTreeViewClasses;\n /**\n * Modus operandi (role) of the widget instance.\n */\n mode?: NavigationMode;\n /**\n * Enables selection.\n * @default false\n */\n selectable?: boolean;\n /**\n * Enables the simultaneous selection of multiple items.\n * @default false\n */\n multiSelect?: boolean;\n /**\n * The selected nodes' ids.\n *\n * When `multiSelect` is true this takes an array of strings; when false (default) a string.\n */\n selected?: string[] | string;\n /**\n * When uncontrolled, defines the initial selected nodes' ids.\n *\n * When `multiSelect` is true this takes an array of strings; when false (default) a string.\n * @default []\n */\n defaultSelected?: string[] | string;\n /**\n * Can non-leaf nodes be collapsed / expanded.\n */\n collapsible?: boolean;\n /**\n * Callback fired when a tree item is selected.\n *\n * @param {object} event The event source of the callback.\n * @param {string} nodeId The id of the selected node.\n */\n onChange?: any;\n /**\n * Expanded nodes' ids.\n */\n expanded?: string[];\n /**\n * When uncontrolled, defines the initial expanded nodes' ids.\n * @default []\n */\n defaultExpanded?: string[];\n /**\n * Callback fired when tree items are expanded/collapsed.\n *\n * @param {object} event The event source of the callback.\n * @param {array} nodeIds The ids of the expanded nodes (old and new).\n */\n onToggle?: (event: any, nodeIds: string[]) => void;\n /**\n * If `true`, will allow focus on disabled items.\n * @default false\n */\n disabledItemsFocusable?: boolean;\n /**\n * @ignore\n */\n onFocus?: (event: React.FocusEvent<any>) => void;\n /**\n * @ignore\n */\n onBlur?: (event: any) => void;\n /**\n * @ignore\n */\n onKeyDown?: (event: KeyboardEvent) => void;\n /**\n * The content of the component.\n */\n children?: React.ReactNode;\n}\n\nfunction isPrintableCharacter(string: string) {\n return string && string.length === 1 && string.match(/\\S/);\n}\n\nfunction findNextFirstChar(\n firstChars: string[],\n startIndex: number,\n char: string,\n) {\n return firstChars.slice(startIndex).findIndex((c) => c === char);\n}\n\nfunction noopSelection() {\n return false;\n}\n\nexport const HvVerticalNavigationTreeView = forwardRef(\n (props: HvVerticalNavigationTreeViewProps, ref) => {\n const {\n id: idProp,\n className,\n classes: classesProp,\n\n mode = \"treeview\",\n\n collapsible = false,\n expanded: expandedProp,\n defaultExpanded = [],\n onToggle,\n\n selectable = false,\n multiSelect: multiSelectProp = false,\n selected: selectedProp,\n defaultSelected = [],\n onChange,\n\n disabledItemsFocusable = false,\n\n onFocus,\n onBlur,\n onKeyDown,\n\n children,\n\n ...others\n } = props;\n\n const { classes, cx } = useClasses(classesProp);\n\n const treeviewMode = mode === \"treeview\";\n const multiSelect = selectable && multiSelectProp;\n\n const treeId = useUniqueId(idProp);\n const treeRef = useRef<HTMLDivElement>(null);\n const handleRef = useForkRef(treeRef, ref);\n\n const [expanded, setExpandedState] = useControlled(\n expandedProp,\n defaultExpanded,\n );\n\n const [selected, setSelectedState] = useControlled(\n selectedProp,\n defaultSelected,\n );\n\n const [focusedNodeId, setFocusedNodeId] = useState<string | null>(null);\n\n const nodeMap = useRef<Record<string, any>>({});\n\n const firstCharMap = useRef<Record<string, any>>({});\n\n /*\n * Status Helpers\n */\n const isExpanded = useCallback(\n (id: string) =>\n !collapsible ||\n (Array.isArray(expanded) ? expanded.indexOf(id) !== -1 : false),\n [collapsible, expanded],\n );\n\n const isExpandable = useCallback(\n (id: string) =>\n collapsible && nodeMap.current[id] && nodeMap.current[id].expandable,\n [collapsible],\n );\n\n const isSelected = useCallback(\n (id: string) =>\n selectable &&\n (Array.isArray(selected)\n ? selected.indexOf(id) !== -1\n : selected === id),\n [selectable, selected],\n );\n\n const isSelectable = useCallback(\n (id: string) =>\n selectable && nodeMap.current[id] && nodeMap.current[id].selectable,\n [selectable],\n );\n\n const isDisabled = useCallback((id: string) => {\n let node = nodeMap.current[id];\n\n // This can be called before the node has been added to the node map.\n if (!node) {\n return false;\n }\n\n if (node.disabled) {\n return true;\n }\n\n while (node.parentId != null) {\n node = nodeMap.current[node.parentId];\n if (node.disabled) {\n return true;\n }\n }\n\n return false;\n }, []);\n\n const isFocused = useCallback(\n (id: string) => focusedNodeId === id,\n [focusedNodeId],\n );\n\n const isChildSelected = useCallback(\n // the second part of the condition is to ensure that the id we're\n // looking at is actually of a child (ie, there's at least one \"-\")\n (id: string) => {\n return Array<string>()\n .concat(selected)\n .some((s) => s.startsWith(id) && s.includes(\"-\"));\n },\n [selected],\n );\n\n /*\n * Child Helpers\n */\n const getChildrenIds = (id: string | null) =>\n Object.keys(nodeMap.current)\n .map((key) => {\n return nodeMap.current[key];\n })\n .filter((node) => node.parentId === id)\n .sort((a, b) => a.index - b.index)\n .map((child) => child.id);\n\n const getNavigableChildrenIds = useCallback(\n (id: string | null) => {\n let childrenIds = getChildrenIds(id);\n\n if (!disabledItemsFocusable) {\n childrenIds = childrenIds.filter((node) => !isDisabled(node));\n }\n return childrenIds;\n },\n [disabledItemsFocusable, isDisabled],\n );\n\n /*\n * Node Helpers\n */\n const getNextNode = useCallback(\n (id: string) => {\n // If expanded get first child\n if (isExpanded(id) && getNavigableChildrenIds(id).length > 0) {\n return getNavigableChildrenIds(id)[0];\n }\n\n let node = nodeMap.current[id];\n while (node != null) {\n // Try to get next sibling\n const siblings = getNavigableChildrenIds(node.parentId);\n const nextSibling = siblings[siblings.indexOf(node.id) + 1];\n\n if (nextSibling) {\n return nextSibling;\n }\n\n // If the sibling does not exist, go up a level to the parent and try again.\n node = nodeMap.current[node.parentId];\n }\n\n return null;\n },\n [getNavigableChildrenIds, isExpanded],\n );\n\n const getPreviousNode = (id: string) => {\n const node = nodeMap.current[id];\n const siblings = getNavigableChildrenIds(node.parentId);\n const nodeIndex = siblings.indexOf(id);\n\n if (nodeIndex === 0) {\n return node.parentId;\n }\n\n let currentNode = siblings[nodeIndex - 1];\n while (\n isExpanded(currentNode) &&\n getNavigableChildrenIds(currentNode).length > 0\n ) {\n currentNode = getNavigableChildrenIds(currentNode).pop();\n }\n\n return currentNode;\n };\n\n const getLastNode = () => {\n let lastNode = getNavigableChildrenIds(null).pop();\n\n while (isExpanded(lastNode)) {\n lastNode = getNavigableChildrenIds(lastNode).pop();\n }\n return lastNode;\n };\n const getFirstNode = () => getNavigableChildrenIds(null)[0];\n const getParent = (id) => nodeMap.current[id].parentId;\n\n /**\n * This is used to determine the start and end of a selection range so\n * we can get the nodes between the two border nodes.\n *\n * It finds the nodes' common ancestor using\n * a naive implementation of a lowest common ancestor algorithm\n * (https://en.wikipedia.org/wiki/Lowest_common_ancestor).\n * Then compares the ancestor's 2 children that are ancestors of nodeA and NodeB\n * so we can compare their indexes to work out which node comes first in a depth first search.\n * (https://en.wikipedia.org/wiki/Depth-first_search)\n *\n * Another way to put it is which node is shallower in a trémaux tree\n * https://en.wikipedia.org/wiki/Tr%C3%A9maux_tree\n */\n const findOrderInTremauxTree = useCallback(\n (nodeAId: string, nodeBId: string) => {\n if (nodeAId === nodeBId) {\n return [nodeAId, nodeBId];\n }\n\n const nodeA = nodeMap.current[nodeAId];\n const nodeB = nodeMap.current[nodeBId];\n\n if (nodeA.parentId === nodeB.id || nodeB.parentId === nodeA.id) {\n return nodeB.parentId === nodeA.id\n ? [nodeA.id, nodeB.id]\n : [nodeB.id, nodeA.id];\n }\n\n const aFamily = [nodeA.id];\n const bFamily = [nodeB.id];\n\n let aAncestor = nodeA.parentId;\n let bAncestor = nodeB.parentId;\n\n let aAncestorIsCommon = bFamily.indexOf(aAncestor) !== -1;\n let bAncestorIsCommon = aFamily.indexOf(bAncestor) !== -1;\n\n let continueA = true;\n let continueB = true;\n\n while (!bAncestorIsCommon && !aAncestorIsCommon) {\n if (continueA) {\n aFamily.push(aAncestor);\n aAncestorIsCommon = bFamily.indexOf(aAncestor) !== -1;\n continueA = aAncestor !== null;\n if (!aAncestorIsCommon && continueA) {\n aAncestor = nodeMap.current[aAncestor].parentId;\n }\n }\n\n if (continueB && !aAncestorIsCommon) {\n bFamily.push(bAncestor);\n bAncestorIsCommon = aFamily.indexOf(bAncestor) !== -1;\n continueB = bAncestor !== null;\n if (!bAncestorIsCommon && continueB) {\n bAncestor = nodeMap.current[bAncestor].parentId;\n }\n }\n }\n\n const commonAncestor = aAncestorIsCommon ? aAncestor : bAncestor;\n const ancestorFamily = getChildrenIds(commonAncestor);\n\n const aSide = aFamily[aFamily.indexOf(commonAncestor) - 1];\n const bSide = bFamily[bFamily.indexOf(commonAncestor) - 1];\n\n return ancestorFamily.indexOf(aSide) < ancestorFamily.indexOf(bSide)\n ? [nodeAId, nodeBId]\n : [nodeBId, nodeAId];\n },\n [],\n );\n\n const getNodesInRange = useCallback(\n (nodeA, nodeB) => {\n if (nodeA && nodeB) {\n const [first, last] = findOrderInTremauxTree(nodeA, nodeB);\n const nodes = [first];\n\n let current = first;\n\n while (current !== last) {\n current = getNextNode(current);\n nodes.push(current);\n }\n\n return nodes;\n }\n return [];\n },\n [findOrderInTremauxTree, getNextNode],\n );\n\n /*\n * Focus Helpers\n */\n const focus = (event, id) => {\n if (id) {\n setFocusedNodeId(id);\n\n if (nodeMap.current[id]?.onFocus) {\n nodeMap.current[id].onFocus(event);\n }\n }\n };\n\n const focusNextNode = (event, id) => focus(event, getNextNode(id));\n const focusPreviousNode = (event, id) => focus(event, getPreviousNode(id));\n const focusFirstNode = (event) => focus(event, getFirstNode());\n const focusLastNode = (event) => focus(event, getLastNode());\n\n const focusByFirstCharacter = (event, id, char) => {\n let start;\n let index;\n const lowercaseChar = char.toLowerCase();\n\n const firstCharIds: string[] = [];\n const firstChars: string[] = [];\n // This really only works since the ids are strings\n Object.keys(firstCharMap.current).forEach((nodeId) => {\n const firstChar = firstCharMap.current[nodeId];\n const map = nodeMap.current[nodeId];\n const visible = map.parentId ? isExpanded(map.parentId) : true;\n const shouldBeSkipped = disabledItemsFocusable\n ? false\n : isDisabled(nodeId);\n\n if (visible && !shouldBeSkipped) {\n firstCharIds.push(nodeId);\n firstChars.push(firstChar);\n }\n });\n\n // Get start index for search based on position of currentItem\n start = firstCharIds.indexOf(id) + 1;\n if (start >= firstCharIds.length) {\n start = 0;\n }\n\n // Check remaining slots in the menu\n index = findNextFirstChar(firstChars, start, lowercaseChar);\n\n // If not found in remaining slots, check from beginning\n if (index === -1) {\n index = findNextFirstChar(firstChars, 0, lowercaseChar);\n }\n\n // If match was found...\n if (index > -1) {\n focus(event, firstCharIds[index]);\n }\n };\n\n /*\n * Expansion Helpers\n */\n const toggleExpansion = useCallback(\n (event, value = focusedNodeId) => {\n if (!value) return;\n\n const newExpanded = expanded.includes(value)\n ? expanded.filter((id) => id !== value)\n : [value].concat(expanded);\n\n if (onToggle) {\n onToggle(event, newExpanded);\n }\n\n setExpandedState(newExpanded);\n },\n [expanded, focusedNodeId, onToggle, setExpandedState],\n );\n\n const expandAllSiblings = (event, id) => {\n const map = nodeMap.current[id];\n const siblings = getChildrenIds(map.parentId);\n\n const diff = siblings.filter(\n (child) => isExpandable(child) && !isExpanded(child),\n );\n\n const newExpanded = expanded.concat(diff);\n\n if (diff.length > 0) {\n setExpandedState(newExpanded);\n\n if (onToggle) {\n onToggle(event, newExpanded);\n }\n }\n };\n\n /*\n * Selection Helpers\n */\n const lastSelectedNode = useRef<HTMLDivElement | null>(null);\n const lastSelectionWasRange = useRef(false);\n const currentRangeSelection = useRef<HTMLDivElement[]>([]);\n\n const isDivElement = (element): element is HTMLDivElement => {\n return (element as HTMLDivElement).nodeType === 1;\n };\n\n const handleRangeArrowSelect = useCallback(\n (event, nodes: { start?; next?; current? }) => {\n let base = Array<string>().concat(selected);\n const { start, next, current } = nodes;\n\n if (!next || !current) {\n return;\n }\n\n if (\n isDivElement(current) &&\n currentRangeSelection.current.indexOf(current) === -1\n ) {\n currentRangeSelection.current = [];\n }\n\n if (lastSelectionWasRange.current) {\n if (\n isDivElement(next) &&\n currentRangeSelection.current.indexOf(next) !== -1\n ) {\n base = base.filter((id) => id === start || id !== current);\n currentRangeSelection.current =\n currentRangeSelection.current.filter(\n (id) => id === start || id !== current,\n );\n } else {\n base.push(next);\n currentRangeSelection.current.push(next);\n }\n } else {\n base.push(next);\n currentRangeSelection.current.push(current, next);\n }\n\n if (onChange) {\n onChange(\n event,\n base,\n base.map((id) => nodeMap.current[id]?.payload),\n );\n }\n\n setSelectedState(base);\n },\n [onChange, selected, setSelectedState],\n );\n\n const handleRangeSelect = useCallback(\n (event, nodes: { start?; end?; current? }) => {\n let base = Array<string>().concat(selected);\n const { start, end } = nodes;\n // If last selection was a range selection ignore nodes that were selected.\n if (lastSelectionWasRange.current) {\n base = base.filter(\n (id) => !currentRangeSelection.current.includes(id as any),\n );\n }\n\n let range = getNodesInRange(start, end);\n range = range.filter((node) => !isDisabled(node));\n currentRangeSelection.current = range;\n let newSelected = base.concat(range);\n newSelected = newSelected.filter(\n (id, i) => newSelected.indexOf(id) === i,\n );\n\n if (onChange) {\n onChange(\n event,\n newSelected,\n newSelected.map((id) => nodeMap.current[id]?.payload),\n );\n }\n\n setSelectedState(newSelected);\n },\n [getNodesInRange, isDisabled, onChange, selected, setSelectedState],\n );\n\n const handleMultipleSelect = useCallback(\n (event, value) => {\n const newSelected = selected.includes(value)\n ? (selected as string[]).filter((id) => id !== value)\n : [value].concat(selected);\n\n if (onChange) {\n onChange(\n event,\n newSelected,\n newSelected.map((id) => nodeMap.current[id]?.payload),\n );\n }\n\n setSelectedState(newSelected);\n },\n [onChange, selected, setSelectedState],\n );\n\n const handleSingleSelect = useCallback(\n (event, value) => {\n const newSelected = multiSelect ? [value] : value;\n if (onChange) {\n const nodeValue = nodeMap.current[newSelected]?.payload;\n onChange(event, newSelected, multiSelect ? [nodeValue] : nodeValue);\n }\n\n setSelectedState(newSelected);\n },\n [multiSelect, onChange, setSelectedState],\n );\n\n const selectNode = useCallback(\n (event, id, multiple = false) => {\n if (id && isSelectable(id)) {\n if (multiple) {\n handleMultipleSelect(event, id);\n } else {\n handleSingleSelect(event, id);\n }\n lastSelectedNode.current = id;\n lastSelectionWasRange.current = false;\n currentRangeSelection.current = [];\n\n return true;\n }\n return false;\n },\n [handleMultipleSelect, handleSingleSelect, isSelectable],\n );\n\n const selectRange = useCallback(\n (\n event,\n nodes: { start?; end?; current?: HTMLDivElement | null },\n stacked = false,\n ) => {\n const { start = lastSelectedNode.current, end, current } = nodes;\n if (stacked) {\n handleRangeArrowSelect(event, { start, next: end, current });\n } else if (start != null && end != null) {\n handleRangeSelect(event, { start, end });\n }\n lastSelectionWasRange.current = true;\n },\n [handleRangeArrowSelect, handleRangeSelect],\n );\n\n const rangeSelectToFirst = (event, id) => {\n if (!lastSelectedNode.current) {\n lastSelectedNode.current = id;\n }\n\n const start = lastSelectionWasRange.current\n ? lastSelectedNode.current\n : id;\n\n selectRange(event, {\n start,\n end: getFirstNode(),\n });\n };\n\n const rangeSelectToLast = (event: any, id) => {\n if (!lastSelectedNode.current) {\n lastSelectedNode.current = id;\n }\n\n const start = lastSelectionWasRange.current\n ? lastSelectedNode.current\n : id;\n\n selectRange(event, {\n start,\n end: getLastNode(),\n });\n };\n\n const selectNextNode = (event, id) => {\n if (!isDisabled(getNextNode(id))) {\n selectRange(\n event,\n {\n end: getNextNode(id),\n current: id,\n },\n true,\n );\n }\n };\n\n const selectPreviousNode = (event, id) => {\n if (!isDisabled(getPreviousNode(id))) {\n selectRange(\n event,\n {\n end: getPreviousNode(id),\n current: id,\n },\n true,\n );\n }\n };\n\n const selectAllNodes = (event) => {\n selectRange(event, { start: getFirstNode(), end: getLastNode() });\n };\n\n /*\n * Mapping Helpers\n */\n const registerNode = useCallback((node) => {\n const {\n id,\n index,\n parentId,\n expandable,\n idAttribute,\n disabled,\n selectable: nodeSelectable,\n onFocus: nodeOnFocus,\n payload,\n } = node;\n\n nodeMap.current[id] = {\n id,\n index,\n parentId,\n expandable,\n idAttribute,\n disabled,\n selectable: nodeSelectable,\n onFocus: nodeOnFocus,\n payload,\n };\n }, []);\n\n const unregisterNode = useCallback((id) => {\n const newMap = { ...nodeMap.current };\n delete newMap[id];\n nodeMap.current = newMap;\n\n setFocusedNodeId((oldFocusedNodeId) => {\n if (\n oldFocusedNodeId === id &&\n treeRef.current &&\n treeRef.current ===\n (treeRef.current.ownerDocument || document).activeElement\n ) {\n return getChildrenIds(null)[0];\n }\n return oldFocusedNodeId;\n });\n }, []);\n\n const mapFirstChar = useCallback((id, firstChar) => {\n firstCharMap.current[id] = firstChar;\n }, []);\n\n const unMapFirstChar = useCallback((id) => {\n const newMap = { ...firstCharMap.current };\n delete newMap[id];\n firstCharMap.current = newMap;\n }, []);\n\n /**\n * Event handlers and Navigation\n */\n const handleNextArrow = (event) => {\n if (!focusedNodeId) return false;\n if (isExpandable(focusedNodeId)) {\n if (isExpanded(focusedNodeId)) {\n focusNextNode(event, focusedNodeId);\n } else if (!isDisabled(focusedNodeId)) {\n toggleExpansion(event);\n }\n }\n return true;\n };\n\n const handlePreviousArrow = (event) => {\n if (!focusedNodeId) return false;\n if (isExpanded(focusedNodeId) && !isDisabled(focusedNodeId)) {\n toggleExpansion(event, focusedNodeId);\n return true;\n }\n\n const parent = getParent(focusedNodeId);\n if (parent) {\n focus(event, parent);\n return true;\n }\n return false;\n };\n\n const handleKeyDown = (event) => {\n let flag = false;\n const { key } = event;\n\n // If the tree is empty there will be no focused node\n if (\n event.altKey ||\n event.currentTarget !== event.target ||\n !focusedNodeId\n ) {\n return;\n }\n\n const ctrlPressed = event.ctrlKey || event.metaKey;\n switch (key) {\n case \" \":\n if (isSelectable(focusedNodeId) && !isDisabled(focusedNodeId)) {\n if (multiSelect && event.shiftKey) {\n selectRange(event, { end: focusedNodeId });\n flag = true;\n } else if (multiSelect) {\n flag = selectNode(event, focusedNodeId, true);\n } else {\n flag = selectNode(event, focusedNodeId);\n }\n }\n event.stopPropagation();\n break;\n case \"Enter\":\n if (!isDisabled(focusedNodeId)) {\n if (isExpandable(focusedNodeId)) {\n toggleExpansion(event);\n flag = true;\n } else if (isSelectable(focusedNodeId)) {\n if (multiSelect && event.shiftKey) {\n selectRange(event, { end: focusedNodeId });\n flag = true;\n } else if (multiSelect) {\n flag = selectNode(event, focusedNodeId, true);\n } else {\n flag = selectNode(event, focusedNodeId);\n }\n }\n }\n event.stopPropagation();\n break;\n case \"ArrowDown\":\n if (multiSelect && event.shiftKey) {\n selectNextNode(event, focusedNodeId);\n }\n focusNextNode(event, focusedNodeId);\n flag = true;\n break;\n case \"ArrowUp\":\n if (multiSelect && event.shiftKey) {\n selectPreviousNode(event, focusedNodeId);\n }\n focusPreviousNode(event, focusedNodeId);\n flag = true;\n break;\n case \"ArrowRight\":\n flag = handleNextArrow(event);\n break;\n case \"ArrowLeft\":\n flag = handlePreviousArrow(event);\n break;\n case \"Home\":\n if (\n multiSelect &&\n ctrlPressed &&\n event.shiftKey &&\n !isDisabled(focusedNodeId)\n ) {\n rangeSelectToFirst(event, focusedNodeId);\n }\n focusFirstNode(event);\n flag = true;\n break;\n case \"End\":\n if (\n multiSelect &&\n ctrlPressed &&\n event.shiftKey &&\n !isDisabled(focusedNodeId)\n ) {\n rangeSelectToLast(event, focusedNodeId);\n }\n focusLastNode(event);\n flag = true;\n break;\n default:\n if (key === \"*\") {\n expandAllSiblings(event, focusedNodeId);\n flag = true;\n } else if (multiSelect && ctrlPressed && key.toLowerCase() === \"a\") {\n selectAllNodes(event);\n flag = true;\n } else if (\n !ctrlPressed &&\n !event.shiftKey &&\n isPrintableCharacter(key)\n ) {\n focusByFirstCharacter(event, focusedNodeId, key);\n flag = true;\n }\n }\n\n if (flag) {\n event.preventDefault();\n event.stopPropagation();\n }\n\n if (onKeyDown) {\n onKeyDown(event);\n }\n };\n\n const handleFocus = (event) => {\n // if the event bubbled (which is React specific) we don't want to steal focus\n if (event.target === event.currentTarget) {\n const firstSelected = Array.isArray(selected) ? selected[0] : selected;\n focus(event, firstSelected || getNavigableChildrenIds(null)[0]);\n }\n\n if (onFocus) {\n onFocus(event);\n }\n };\n\n const handleBlur = (event) => {\n setFocusedNodeId(null);\n\n if (onBlur) {\n onBlur(event);\n }\n };\n\n const activeDescendant =\n focusedNodeId && nodeMap.current[focusedNodeId]\n ? nodeMap.current[focusedNodeId].idAttribute\n : null;\n\n const treeControlContext = useMemo(\n () => ({\n treeId,\n mode,\n collapsible,\n toggleExpansion,\n multiSelect,\n selectNode: selectable ? selectNode : noopSelection,\n selectRange: selectable ? selectRange : noopSelection,\n disabledItemsFocusable,\n registerNode,\n unregisterNode,\n mapFirstChar,\n unMapFirstChar,\n focus,\n }),\n [\n registerNode,\n unregisterNode,\n mapFirstChar,\n unMapFirstChar,\n toggleExpansion,\n selectable,\n selectNode,\n selectRange,\n mode,\n collapsible,\n multiSelect,\n disabledItemsFocusable,\n treeId,\n ],\n );\n\n const treeStateContext = useMemo(\n () => ({\n isExpanded,\n isSelected,\n isFocused,\n isDisabled,\n isChildSelected,\n }),\n [isDisabled, isExpanded, isFocused, isSelected, isChildSelected],\n );\n\n return (\n <TreeViewControlContext.Provider value={treeControlContext}>\n <TreeViewStateContext.Provider value={treeStateContext}>\n <DescendantProvider>\n <ul\n ref={handleRef}\n id={idProp}\n className={cx(classes.root, className)}\n {...(treeviewMode && {\n id: treeId,\n role: \"tree\",\n \"aria-multiselectable\": multiSelect,\n \"aria-activedescendant\": activeDescendant,\n tabIndex: 0,\n onFocus: handleFocus,\n onBlur: handleBlur,\n onKeyDown: handleKeyDown,\n })}\n {...others}\n >\n {children}\n </ul>\n </DescendantProvider>\n </TreeViewStateContext.Provider>\n </TreeViewControlContext.Provider>\n );\n },\n);\n"],"names":[],"mappings":"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"}
|
|
@@ -3,9 +3,9 @@ import { forwardRef, useContext, useState, useRef, useMemo, useEffect, useCallba
|
|
|
3
3
|
import { DropUpXS, DropDownXS } from "@hitachivantara/uikit-react-icons";
|
|
4
4
|
import { useDefaultProps } from "../../hooks/useDefaultProps.js";
|
|
5
5
|
import { useForkRef } from "../../hooks/useForkRef.js";
|
|
6
|
+
import { useDescendant, DescendantProvider } from "../../TreeView/internals/DescendantProvider.js";
|
|
6
7
|
import { setId } from "../../utils/setId.js";
|
|
7
8
|
import { VerticalNavigationContext } from "../VerticalNavigationContext.js";
|
|
8
|
-
import { useDescendant, DescendantProvider } from "./descendants.js";
|
|
9
9
|
import { TreeViewControlContext, TreeViewStateContext } from "./TreeViewContext.js";
|
|
10
10
|
import { useClasses } from "./TreeViewItem.styles.js";
|
|
11
11
|
import { staticClasses } from "./TreeViewItem.styles.js";
|
|
@@ -64,7 +64,7 @@ const HvVerticalNavigationTreeViewItem = forwardRef(
|
|
|
64
64
|
} else if (treeId && nodeId) {
|
|
65
65
|
id = `${treeId}-${nodeId}`;
|
|
66
66
|
}
|
|
67
|
-
const [treeitemElement, setTreeitemElement] = useState(
|
|
67
|
+
const [treeitemElement, setTreeitemElement] = useState();
|
|
68
68
|
const contentRef = useRef(null);
|
|
69
69
|
const handleRef = useForkRef(setTreeitemElement, ref);
|
|
70
70
|
const descendant = useMemo(
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TreeViewItem.js","sources":["../../../../src/VerticalNavigation/TreeView/TreeViewItem.tsx"],"sourcesContent":["import {\n forwardRef,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport { DropDownXS, DropUpXS } from \"@hitachivantara/uikit-react-icons\";\n\nimport { useDefaultProps } from \"../../hooks/useDefaultProps\";\nimport { useForkRef } from \"../../hooks/useForkRef\";\nimport { HvOverflowTooltip } from \"../../OverflowTooltip\";\nimport { HvTooltip } from \"../../Tooltip\";\nimport { HvTypography } from \"../../Typography\";\nimport { ExtractNames } from \"../../utils/classes\";\nimport { setId } from \"../../utils/setId\";\nimport { VerticalNavigationContext } from \"../VerticalNavigationContext\";\nimport { DescendantProvider, useDescendant } from \"./descendants\";\nimport { IconWrapper } from \"./IconWrapper\";\nimport {\n TreeViewControlContext,\n TreeViewStateContext,\n} from \"./TreeViewContext\";\nimport { staticClasses, useClasses } from \"./TreeViewItem.styles\";\n\nexport { staticClasses as treeViewItemClasses };\n\nexport type HvVerticalNavigationTreeViewItemClasses = ExtractNames<\n typeof useClasses\n>;\n\nexport interface HvVerticalNavigationTreeViewItemProps {\n /**\n * Id to be applied to the root node.\n */\n id?: string;\n /**\n * Class names to be applied.\n */\n className?: string;\n /**\n * A Jss Object used to override or extend the styles applied to the Radio button.\n */\n classes?: HvVerticalNavigationTreeViewItemClasses;\n /**\n * Is the node disabled.\n */\n disabled?: boolean;\n /**\n * Can the node be selected.\n */\n selectable?: boolean;\n /**\n * The id of the node.\n */\n nodeId?: string;\n /**\n * The icon to display next to the node's label.\n */\n icon?: React.ReactNode;\n /**\n * The item label.\n */\n label?: React.ReactNode;\n /**\n * The url for the link.\n */\n href?: string;\n /**\n * The behavior when opening a link.\n */\n target?: string;\n /**\n * The node payload.\n */\n payload?: any;\n /**\n * @ignore\n */\n onClick?: any;\n /**\n * @ignore\n */\n onMouseDown?: any;\n /**\n * @ignore\n */\n onFocus?: any;\n /**\n * The content of the component.\n */\n children?: React.ReactNode;\n /**\n * @ignore\n */\n onMouseEnter?: any;\n /**\n * Disables the appearence of a tooltip on hovering an element ( Only applicable when the in collapsed mode)\n */\n disableTooltip?: boolean;\n}\n\nconst preventSelection = (event, disabled) => {\n if (event.shiftKey || event.ctrlKey || event.metaKey || disabled) {\n // Prevent text selection\n event.preventDefault();\n }\n};\n\nexport const HvVerticalNavigationTreeViewItem = forwardRef(\n (props: HvVerticalNavigationTreeViewItemProps, ref) => {\n const {\n id: idProp,\n className,\n classes: classesProp,\n\n disabled: disabledProp = false,\n\n selectable: selectableProp,\n\n nodeId,\n icon = null,\n label,\n href,\n target,\n payload,\n\n onClick,\n onMouseDown,\n onFocus,\n\n children,\n\n disableTooltip,\n\n ...others\n } = useDefaultProps(\"HvVerticalNavigationTreeViewItem\", props);\n\n const { classes, cx } = useClasses(classesProp);\n\n const treeViewControlContext = useContext(TreeViewControlContext);\n const { isExpanded, isSelected, isFocused, isDisabled, isChildSelected } =\n useContext(TreeViewStateContext);\n\n const {\n treeId,\n mode,\n collapsible,\n toggleExpansion,\n multiSelect,\n selectNode,\n selectRange,\n disabledItemsFocusable,\n registerNode,\n unregisterNode,\n mapFirstChar,\n unMapFirstChar,\n focus,\n } = treeViewControlContext;\n\n const treeviewMode = mode === \"treeview\";\n\n let id: string | null = null;\n\n if (idProp != null) {\n id = idProp;\n } else if (treeId && nodeId) {\n id = `${treeId}-${nodeId}`;\n }\n\n const [treeitemElement, setTreeitemElement] = useState(null);\n const contentRef = useRef<HTMLDivElement>(null);\n const handleRef = useForkRef(setTreeitemElement, ref);\n\n const descendant = useMemo(\n () => ({\n element: treeitemElement,\n id: nodeId,\n }),\n [nodeId, treeitemElement],\n );\n\n const { isOpen, useIcons } = useContext(VerticalNavigationContext);\n\n const { index, parentId, level } = useDescendant(descendant);\n\n const expandable = collapsible && Array.isArray(children);\n const expanded = isExpanded ? isExpanded(nodeId) : false;\n const focused = isFocused ? isFocused(nodeId) : false;\n const selected = isSelected ? isSelected(nodeId) : false;\n const disabled = isDisabled ? isDisabled(nodeId) : false;\n\n const selectable =\n selectableProp != null\n ? selectableProp\n : !collapsible || !expandable || !isOpen;\n\n useEffect(() => {\n // On the first render a node's index will be -1. We want to wait for the real index.\n if (registerNode && unregisterNode && index !== -1) {\n registerNode({\n id: nodeId,\n idAttribute: id,\n index,\n parentId,\n selectable,\n expandable,\n disabled: disabledProp,\n onFocus,\n payload,\n });\n\n return () => {\n unregisterNode(nodeId);\n };\n }\n\n return undefined;\n }, [\n registerNode,\n unregisterNode,\n parentId,\n index,\n nodeId,\n expandable,\n disabledProp,\n id,\n selectable,\n onFocus,\n payload,\n ]);\n\n useEffect(() => {\n if (\n mapFirstChar &&\n unMapFirstChar &&\n label &&\n contentRef.current?.textContent\n ) {\n mapFirstChar(\n nodeId,\n contentRef.current?.textContent.substring(0, 1).toLowerCase(),\n );\n\n return () => {\n unMapFirstChar(nodeId);\n };\n }\n return undefined;\n }, [mapFirstChar, unMapFirstChar, nodeId, label]);\n\n let ariaSelected;\n if (multiSelect) {\n ariaSelected = selected;\n } else if (selected) {\n /* single-selection trees unset aria-selected on un-selected items.\n *\n * If the tree does not support multiple selection, aria-selected\n * is set to true for the selected node and it is not present on any other node in the tree.\n * Source: https://www.w3.org/TR/wai-aria-practices/#TreeView\n */\n ariaSelected = true;\n }\n\n const handleFocus = useCallback(\n (event) => {\n // DOM focus stays on the tree which manages focus with aria-activedescendant\n if (event.target === event.currentTarget) {\n (event.target.ownerDocument || document)\n .getElementById(treeId)\n .focus({ preventScroll: true });\n }\n\n const unfocusable = !disabledItemsFocusable && disabled;\n if (\n !focused &&\n event.currentTarget === event.target &&\n !unfocusable &&\n focus\n ) {\n focus(event, nodeId);\n }\n },\n [disabled, disabledItemsFocusable, focus, focused, nodeId, treeId],\n );\n\n const handleExpansion = useCallback(\n (event) => {\n if (!disabled) {\n if (treeviewMode && !focused && focus) {\n focus(event, nodeId);\n }\n\n const multiple =\n multiSelect && (event.shiftKey || event.ctrlKey || event.metaKey);\n\n // If already expanded and trying to toggle selection don't close\n if (\n expandable &&\n isOpen &&\n !(multiple && isExpanded && isExpanded(nodeId))\n ) {\n if (toggleExpansion) toggleExpansion(event, nodeId);\n }\n }\n },\n [\n disabled,\n expandable,\n focus,\n focused,\n isExpanded,\n multiSelect,\n nodeId,\n toggleExpansion,\n treeviewMode,\n isOpen,\n ],\n );\n\n const handleSelection = useCallback(\n (event) => {\n if (selectable && !disabled) {\n if (treeviewMode && !focused && focus) {\n focus(event, nodeId);\n }\n\n const multiple =\n multiSelect && (event.shiftKey || event.ctrlKey || event.metaKey);\n\n if (multiple) {\n if (event.shiftKey) {\n if (selectRange) return selectRange(event, { end: nodeId });\n } else if (selectNode) return selectNode(event, nodeId, true);\n } else if (selectNode) return selectNode(event, nodeId);\n } else {\n return false;\n }\n },\n [\n disabled,\n focus,\n focused,\n multiSelect,\n nodeId,\n selectNode,\n selectRange,\n selectable,\n treeviewMode,\n ],\n );\n\n const handleMouseDown = useCallback(\n (event) => {\n preventSelection(event, disabled);\n\n if (onMouseDown) {\n onMouseDown(event);\n }\n },\n [disabled, onMouseDown],\n );\n\n const handleClick = useCallback(\n (event) => {\n if (!disabled) {\n if (expandable && isOpen) {\n handleExpansion(event);\n }\n\n if (selectable) {\n handleSelection(event);\n }\n }\n\n if (onClick) {\n onClick(event);\n }\n },\n [\n disabled,\n expandable,\n handleExpansion,\n handleSelection,\n onClick,\n selectable,\n isOpen,\n ],\n );\n\n const handleKeyDown = useCallback(\n (event) => {\n let isEventHandled = false;\n const { key } = event;\n\n if (\n event.altKey ||\n event.ctrlKey ||\n event.metaKey ||\n event.currentTarget !== event.target\n ) {\n return;\n }\n if (contentRef.current === event.currentTarget) {\n if (key === \"Enter\" || key === \" \") {\n if (expandable && isOpen) {\n isEventHandled = handleExpansion(event) as unknown as boolean;\n }\n\n if (selectable) {\n isEventHandled = handleSelection(event) as boolean;\n }\n }\n\n if (isEventHandled) {\n event.preventDefault();\n event.stopPropagation();\n }\n }\n },\n [expandable, handleExpansion, handleSelection, selectable, isOpen],\n );\n\n const renderedContent = useMemo(() => {\n const buttonLinkProps = {\n href,\n target,\n };\n\n const hasChildren = !!children;\n const showTooltip = !hasChildren && !isOpen && !disableTooltip;\n\n const isLink = href !== undefined && !disabled;\n\n return (\n <HvTooltip placement=\"right\" title={showTooltip && label}>\n <HvTypography\n id={setId(id, \"button\")}\n component={isLink ? \"a\" : \"div\"}\n {...(isLink ? buttonLinkProps : null)}\n ref={contentRef}\n className={cx(classes.content, {\n [classes.link]: isLink,\n [classes.minimized]: !isOpen,\n })}\n variant=\"body\"\n disabled={disabled}\n onClick={handleClick}\n onMouseDown={handleMouseDown}\n style={{\n paddingLeft:\n (useIcons || !isOpen ? 0 : 10) +\n level * (collapsible ? 16 : 10),\n }}\n role={isLink ? undefined : \"button\"}\n {...(treeviewMode\n ? {\n tabIndex: -1,\n onFocus: handleFocus,\n }\n : {\n tabIndex: selectable || expandable ? 0 : -1,\n onKeyDown: handleKeyDown,\n \"aria-current\":\n (selectable && selected) ||\n (!isOpen && isChildSelected?.(nodeId))\n ? href\n ? \"page\"\n : true\n : undefined,\n \"aria-expanded\": expandable ? expanded : undefined,\n \"aria-controls\":\n isOpen && expandable ? setId(id, \"group\") : undefined,\n \"aria-label\": payload?.label,\n })}\n >\n <IconWrapper\n icon={useIcons && icon}\n label={payload?.label}\n hasChildren={hasChildren}\n showAvatar={!icon && useIcons}\n isOpen={isOpen}\n />\n\n {isOpen && (\n <div\n className={cx(classes.label, {\n [classes.labelIcon]: useIcons,\n [classes.labelExpandable]: !!expandable,\n })}\n >\n <HvOverflowTooltip data={label} />\n </div>\n )}\n\n {isOpen && expandable && (expanded ? <DropUpXS /> : <DropDownXS />)}\n </HvTypography>\n </HvTooltip>\n );\n }, [\n id,\n href,\n target,\n cx,\n classes.content,\n classes.link,\n classes.minimized,\n classes.label,\n classes.labelIcon,\n classes.labelExpandable,\n disabled,\n handleClick,\n handleMouseDown,\n expandable,\n icon,\n level,\n collapsible,\n treeviewMode,\n handleFocus,\n selectable,\n handleKeyDown,\n selected,\n expanded,\n label,\n disableTooltip,\n payload?.label,\n children,\n isOpen,\n useIcons,\n isChildSelected,\n nodeId,\n ]);\n\n const renderedChildren = useMemo(\n () =>\n children && (\n <ul\n id={setId(id, \"group\")}\n className={classes.group}\n role={treeviewMode ? \"group\" : undefined}\n >\n {children}\n </ul>\n ),\n [children, classes?.group, id, treeviewMode],\n );\n\n return (\n <li\n ref={handleRef}\n id={id ?? undefined}\n className={cx(classes.node, {\n [classes.disabled]: disabled,\n [classes.expandable]: expandable,\n [classes.collapsed]: expandable && !expanded,\n [classes.expanded]: expandable && expanded,\n [classes.selectable]: selectable && !disabled,\n [classes.unselectable]: !disabled && !selectable,\n [classes.selected]:\n (!disabled && selectable && selected) ||\n (!isOpen && useIcons && isChildSelected && isChildSelected(nodeId)),\n [classes.unselected]: !disabled && selectable && !selected,\n [classes.focused]: focused,\n [classes.hide]: !isOpen && !useIcons,\n className,\n })}\n data-hasicon={icon != null ? true : undefined}\n {...(mode === \"treeview\" && {\n role: \"treeitem\",\n \"aria-selected\": ariaSelected,\n \"aria-expanded\": expandable ? expanded : undefined,\n \"aria-disabled\": disabled ? true : undefined,\n })}\n {...others}\n >\n {renderedContent}\n {isOpen && (\n <DescendantProvider id={nodeId} level={level + 1}>\n {renderedChildren}\n </DescendantProvider>\n )}\n </li>\n );\n },\n);\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"TreeViewItem.js","sources":["../../../../src/VerticalNavigation/TreeView/TreeViewItem.tsx"],"sourcesContent":["import {\n forwardRef,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport { DropDownXS, DropUpXS } from \"@hitachivantara/uikit-react-icons\";\n\nimport { useDefaultProps } from \"../../hooks/useDefaultProps\";\nimport { useForkRef } from \"../../hooks/useForkRef\";\nimport { HvOverflowTooltip } from \"../../OverflowTooltip\";\nimport { HvTooltip } from \"../../Tooltip\";\nimport {\n DescendantProvider,\n useDescendant,\n} from \"../../TreeView/internals/DescendantProvider\";\nimport { HvTypography } from \"../../Typography\";\nimport { ExtractNames } from \"../../utils/classes\";\nimport { setId } from \"../../utils/setId\";\nimport { VerticalNavigationContext } from \"../VerticalNavigationContext\";\nimport { IconWrapper } from \"./IconWrapper\";\nimport {\n TreeViewControlContext,\n TreeViewStateContext,\n} from \"./TreeViewContext\";\nimport { staticClasses, useClasses } from \"./TreeViewItem.styles\";\n\nexport { staticClasses as treeViewItemClasses };\n\nexport type HvVerticalNavigationTreeViewItemClasses = ExtractNames<\n typeof useClasses\n>;\n\nexport interface HvVerticalNavigationTreeViewItemProps {\n /**\n * Id to be applied to the root node.\n */\n id?: string;\n /**\n * Class names to be applied.\n */\n className?: string;\n /**\n * A Jss Object used to override or extend the styles applied to the Radio button.\n */\n classes?: HvVerticalNavigationTreeViewItemClasses;\n /**\n * Is the node disabled.\n */\n disabled?: boolean;\n /**\n * Can the node be selected.\n */\n selectable?: boolean;\n /**\n * The id of the node.\n */\n nodeId?: string;\n /**\n * The icon to display next to the node's label.\n */\n icon?: React.ReactNode;\n /**\n * The item label.\n */\n label?: React.ReactNode;\n /**\n * The url for the link.\n */\n href?: string;\n /**\n * The behavior when opening a link.\n */\n target?: string;\n /**\n * The node payload.\n */\n payload?: any;\n /**\n * @ignore\n */\n onClick?: any;\n /**\n * @ignore\n */\n onMouseDown?: any;\n /**\n * @ignore\n */\n onFocus?: any;\n /**\n * The content of the component.\n */\n children?: React.ReactNode;\n /**\n * @ignore\n */\n onMouseEnter?: any;\n /**\n * Disables the appearence of a tooltip on hovering an element ( Only applicable when the in collapsed mode)\n */\n disableTooltip?: boolean;\n}\n\nconst preventSelection = (event, disabled) => {\n if (event.shiftKey || event.ctrlKey || event.metaKey || disabled) {\n // Prevent text selection\n event.preventDefault();\n }\n};\n\nexport const HvVerticalNavigationTreeViewItem = forwardRef(\n (props: HvVerticalNavigationTreeViewItemProps, ref) => {\n const {\n id: idProp,\n className,\n classes: classesProp,\n\n disabled: disabledProp = false,\n\n selectable: selectableProp,\n\n nodeId,\n icon = null,\n label,\n href,\n target,\n payload,\n\n onClick,\n onMouseDown,\n onFocus,\n\n children,\n\n disableTooltip,\n\n ...others\n } = useDefaultProps(\"HvVerticalNavigationTreeViewItem\", props);\n\n const { classes, cx } = useClasses(classesProp);\n\n const treeViewControlContext = useContext(TreeViewControlContext);\n const { isExpanded, isSelected, isFocused, isDisabled, isChildSelected } =\n useContext(TreeViewStateContext);\n\n const {\n treeId,\n mode,\n collapsible,\n toggleExpansion,\n multiSelect,\n selectNode,\n selectRange,\n disabledItemsFocusable,\n registerNode,\n unregisterNode,\n mapFirstChar,\n unMapFirstChar,\n focus,\n } = treeViewControlContext;\n\n const treeviewMode = mode === \"treeview\";\n\n let id: string | null = null;\n\n if (idProp != null) {\n id = idProp;\n } else if (treeId && nodeId) {\n id = `${treeId}-${nodeId}`;\n }\n\n const [treeitemElement, setTreeitemElement] = useState<HTMLLIElement>();\n const contentRef = useRef<HTMLDivElement>(null);\n const handleRef = useForkRef(setTreeitemElement, ref);\n\n const descendant = useMemo(\n () => ({\n element: treeitemElement!,\n id: nodeId!,\n }),\n [nodeId, treeitemElement],\n );\n\n const { isOpen, useIcons } = useContext(VerticalNavigationContext);\n\n const { index, parentId, level } = useDescendant(descendant);\n\n const expandable = collapsible && Array.isArray(children);\n const expanded = isExpanded ? isExpanded(nodeId) : false;\n const focused = isFocused ? isFocused(nodeId) : false;\n const selected = isSelected ? isSelected(nodeId) : false;\n const disabled = isDisabled ? isDisabled(nodeId) : false;\n\n const selectable =\n selectableProp != null\n ? selectableProp\n : !collapsible || !expandable || !isOpen;\n\n useEffect(() => {\n // On the first render a node's index will be -1. We want to wait for the real index.\n if (registerNode && unregisterNode && index !== -1) {\n registerNode({\n id: nodeId,\n idAttribute: id,\n index,\n parentId,\n selectable,\n expandable,\n disabled: disabledProp,\n onFocus,\n payload,\n });\n\n return () => {\n unregisterNode(nodeId);\n };\n }\n\n return undefined;\n }, [\n registerNode,\n unregisterNode,\n parentId,\n index,\n nodeId,\n expandable,\n disabledProp,\n id,\n selectable,\n onFocus,\n payload,\n ]);\n\n useEffect(() => {\n if (\n mapFirstChar &&\n unMapFirstChar &&\n label &&\n contentRef.current?.textContent\n ) {\n mapFirstChar(\n nodeId,\n contentRef.current?.textContent.substring(0, 1).toLowerCase(),\n );\n\n return () => {\n unMapFirstChar(nodeId);\n };\n }\n return undefined;\n }, [mapFirstChar, unMapFirstChar, nodeId, label]);\n\n let ariaSelected;\n if (multiSelect) {\n ariaSelected = selected;\n } else if (selected) {\n /* single-selection trees unset aria-selected on un-selected items.\n *\n * If the tree does not support multiple selection, aria-selected\n * is set to true for the selected node and it is not present on any other node in the tree.\n * Source: https://www.w3.org/TR/wai-aria-practices/#TreeView\n */\n ariaSelected = true;\n }\n\n const handleFocus = useCallback(\n (event) => {\n // DOM focus stays on the tree which manages focus with aria-activedescendant\n if (event.target === event.currentTarget) {\n (event.target.ownerDocument || document)\n .getElementById(treeId)\n .focus({ preventScroll: true });\n }\n\n const unfocusable = !disabledItemsFocusable && disabled;\n if (\n !focused &&\n event.currentTarget === event.target &&\n !unfocusable &&\n focus\n ) {\n focus(event, nodeId);\n }\n },\n [disabled, disabledItemsFocusable, focus, focused, nodeId, treeId],\n );\n\n const handleExpansion = useCallback(\n (event) => {\n if (!disabled) {\n if (treeviewMode && !focused && focus) {\n focus(event, nodeId);\n }\n\n const multiple =\n multiSelect && (event.shiftKey || event.ctrlKey || event.metaKey);\n\n // If already expanded and trying to toggle selection don't close\n if (\n expandable &&\n isOpen &&\n !(multiple && isExpanded && isExpanded(nodeId))\n ) {\n if (toggleExpansion) toggleExpansion(event, nodeId);\n }\n }\n },\n [\n disabled,\n expandable,\n focus,\n focused,\n isExpanded,\n multiSelect,\n nodeId,\n toggleExpansion,\n treeviewMode,\n isOpen,\n ],\n );\n\n const handleSelection = useCallback(\n (event) => {\n if (selectable && !disabled) {\n if (treeviewMode && !focused && focus) {\n focus(event, nodeId);\n }\n\n const multiple =\n multiSelect && (event.shiftKey || event.ctrlKey || event.metaKey);\n\n if (multiple) {\n if (event.shiftKey) {\n if (selectRange) return selectRange(event, { end: nodeId });\n } else if (selectNode) return selectNode(event, nodeId, true);\n } else if (selectNode) return selectNode(event, nodeId);\n } else {\n return false;\n }\n },\n [\n disabled,\n focus,\n focused,\n multiSelect,\n nodeId,\n selectNode,\n selectRange,\n selectable,\n treeviewMode,\n ],\n );\n\n const handleMouseDown = useCallback(\n (event) => {\n preventSelection(event, disabled);\n\n if (onMouseDown) {\n onMouseDown(event);\n }\n },\n [disabled, onMouseDown],\n );\n\n const handleClick = useCallback(\n (event) => {\n if (!disabled) {\n if (expandable && isOpen) {\n handleExpansion(event);\n }\n\n if (selectable) {\n handleSelection(event);\n }\n }\n\n if (onClick) {\n onClick(event);\n }\n },\n [\n disabled,\n expandable,\n handleExpansion,\n handleSelection,\n onClick,\n selectable,\n isOpen,\n ],\n );\n\n const handleKeyDown = useCallback(\n (event) => {\n let isEventHandled = false;\n const { key } = event;\n\n if (\n event.altKey ||\n event.ctrlKey ||\n event.metaKey ||\n event.currentTarget !== event.target\n ) {\n return;\n }\n if (contentRef.current === event.currentTarget) {\n if (key === \"Enter\" || key === \" \") {\n if (expandable && isOpen) {\n isEventHandled = handleExpansion(event) as unknown as boolean;\n }\n\n if (selectable) {\n isEventHandled = handleSelection(event) as boolean;\n }\n }\n\n if (isEventHandled) {\n event.preventDefault();\n event.stopPropagation();\n }\n }\n },\n [expandable, handleExpansion, handleSelection, selectable, isOpen],\n );\n\n const renderedContent = useMemo(() => {\n const buttonLinkProps = {\n href,\n target,\n };\n\n const hasChildren = !!children;\n const showTooltip = !hasChildren && !isOpen && !disableTooltip;\n\n const isLink = href !== undefined && !disabled;\n\n return (\n <HvTooltip placement=\"right\" title={showTooltip && label}>\n <HvTypography\n id={setId(id, \"button\")}\n component={isLink ? \"a\" : \"div\"}\n {...(isLink ? buttonLinkProps : null)}\n ref={contentRef}\n className={cx(classes.content, {\n [classes.link]: isLink,\n [classes.minimized]: !isOpen,\n })}\n variant=\"body\"\n disabled={disabled}\n onClick={handleClick}\n onMouseDown={handleMouseDown}\n style={{\n paddingLeft:\n (useIcons || !isOpen ? 0 : 10) +\n level * (collapsible ? 16 : 10),\n }}\n role={isLink ? undefined : \"button\"}\n {...(treeviewMode\n ? {\n tabIndex: -1,\n onFocus: handleFocus,\n }\n : {\n tabIndex: selectable || expandable ? 0 : -1,\n onKeyDown: handleKeyDown,\n \"aria-current\":\n (selectable && selected) ||\n (!isOpen && isChildSelected?.(nodeId))\n ? href\n ? \"page\"\n : true\n : undefined,\n \"aria-expanded\": expandable ? expanded : undefined,\n \"aria-controls\":\n isOpen && expandable ? setId(id, \"group\") : undefined,\n \"aria-label\": payload?.label,\n })}\n >\n <IconWrapper\n icon={useIcons && icon}\n label={payload?.label}\n hasChildren={hasChildren}\n showAvatar={!icon && useIcons}\n isOpen={isOpen}\n />\n\n {isOpen && (\n <div\n className={cx(classes.label, {\n [classes.labelIcon]: useIcons,\n [classes.labelExpandable]: !!expandable,\n })}\n >\n <HvOverflowTooltip data={label} />\n </div>\n )}\n\n {isOpen && expandable && (expanded ? <DropUpXS /> : <DropDownXS />)}\n </HvTypography>\n </HvTooltip>\n );\n }, [\n id,\n href,\n target,\n cx,\n classes.content,\n classes.link,\n classes.minimized,\n classes.label,\n classes.labelIcon,\n classes.labelExpandable,\n disabled,\n handleClick,\n handleMouseDown,\n expandable,\n icon,\n level,\n collapsible,\n treeviewMode,\n handleFocus,\n selectable,\n handleKeyDown,\n selected,\n expanded,\n label,\n disableTooltip,\n payload?.label,\n children,\n isOpen,\n useIcons,\n isChildSelected,\n nodeId,\n ]);\n\n const renderedChildren = useMemo(\n () =>\n children && (\n <ul\n id={setId(id, \"group\")}\n className={classes.group}\n role={treeviewMode ? \"group\" : undefined}\n >\n {children}\n </ul>\n ),\n [children, classes?.group, id, treeviewMode],\n );\n\n return (\n <li\n ref={handleRef}\n id={id ?? undefined}\n className={cx(classes.node, {\n [classes.disabled]: disabled,\n [classes.expandable]: expandable,\n [classes.collapsed]: expandable && !expanded,\n [classes.expanded]: expandable && expanded,\n [classes.selectable]: selectable && !disabled,\n [classes.unselectable]: !disabled && !selectable,\n [classes.selected]:\n (!disabled && selectable && selected) ||\n (!isOpen && useIcons && isChildSelected && isChildSelected(nodeId)),\n [classes.unselected]: !disabled && selectable && !selected,\n [classes.focused]: focused,\n [classes.hide]: !isOpen && !useIcons,\n className,\n })}\n data-hasicon={icon != null ? true : undefined}\n {...(mode === \"treeview\" && {\n role: \"treeitem\",\n \"aria-selected\": ariaSelected,\n \"aria-expanded\": expandable ? expanded : undefined,\n \"aria-disabled\": disabled ? true : undefined,\n })}\n {...others}\n >\n {renderedContent}\n {isOpen && (\n <DescendantProvider id={nodeId} level={level + 1}>\n {renderedChildren}\n </DescendantProvider>\n )}\n </li>\n );\n },\n);\n"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useControlled.js","sources":["../../../src/hooks/useControlled.ts"],"sourcesContent":["// based in https://raw.githubusercontent.com/mui-org/material-ui/next/packages/material-ui/src/utils/useControlled.js\n// modifications:\n// 1. renamed default to initialState, to convey the same meaning of the useState hook.\n// 2. removed the console error when initialState changes; that is acceptable and just ignored, like in useState.\n// 3. the console error regarding switching from controlled to uncontrolled (or vice-versa) is sent synchronously\n// so the stacktrace shows the caller\n// 4. given that, the hook signature was simplified, no need for metadata\n\nimport {
|
|
1
|
+
{"version":3,"file":"useControlled.js","sources":["../../../src/hooks/useControlled.ts"],"sourcesContent":["// based in https://raw.githubusercontent.com/mui-org/material-ui/next/packages/material-ui/src/utils/useControlled.js\n// modifications:\n// 1. renamed default to initialState, to convey the same meaning of the useState hook.\n// 2. removed the console error when initialState changes; that is acceptable and just ignored, like in useState.\n// 3. the console error regarding switching from controlled to uncontrolled (or vice-versa) is sent synchronously\n// so the stacktrace shows the caller\n// 4. given that, the hook signature was simplified, no need for metadata\n\nimport { useCallback, useRef, useState } from \"react\";\n\nexport const useControlled = <T>(\n controlledProp: T | undefined,\n initialState: T | (() => T),\n) => {\n const { current: isControlled } = useRef(controlledProp !== undefined);\n const [valueState, setValue] = useState(initialState);\n const value = isControlled ? (controlledProp as T) : valueState;\n\n if (import.meta.env.DEV && isControlled !== (controlledProp !== undefined)) {\n // eslint-disable-next-line no-console\n console.error(\n [\n `A component is changing the ${\n isControlled ? \"\" : \"un\"\n }controlled state to be ${isControlled ? \"un\" : \"\"}controlled.`,\n \"Elements should not switch from uncontrolled to controlled (or vice versa).\",\n \"Decide between using a controlled or uncontrolled element for the lifetime of the component.\",\n \"The nature of the state is determined during the first render, it's considered controlled if the value is not `undefined`.\",\n ].join(\"\\n\"),\n );\n }\n\n const setValueIfUncontrolled = useCallback(\n (newValue: React.SetStateAction<T>) => {\n if (!isControlled) {\n setValue(newValue);\n }\n },\n [isControlled],\n );\n\n return [value, setValueIfUncontrolled] as const;\n};\n"],"names":[],"mappings":";AAUa,MAAA,gBAAgB,CAC3B,gBACA,iBACG;AACH,QAAM,EAAE,SAAS,aAAiB,IAAA,OAAO,mBAAmB,MAAS;AACrE,QAAM,CAAC,YAAY,QAAQ,IAAI,SAAS,YAAY;AAC9C,QAAA,QAAQ,eAAgB,iBAAuB;AAgBrD,QAAM,yBAAyB;AAAA,IAC7B,CAAC,aAAsC;AACrC,UAAI,CAAC,cAAc;AACjB,iBAAS,QAAQ;AAAA,MACnB;AAAA,IACF;AAAA,IACA,CAAC,YAAY;AAAA,EAAA;AAGR,SAAA,CAAC,OAAO,sBAAsB;AACvC;"}
|
package/dist/types/index.d.ts
CHANGED
|
@@ -79,6 +79,7 @@ import { RefAttributes } from 'react';
|
|
|
79
79
|
import { RefObject } from 'react';
|
|
80
80
|
import { Renderer } from 'react-table';
|
|
81
81
|
import { Row } from 'react-table';
|
|
82
|
+
import { SetStateAction } from 'react';
|
|
82
83
|
import { SlideProps } from '@mui/material/Slide';
|
|
83
84
|
import { SliderProps } from 'rc-slider';
|
|
84
85
|
import { SliderRef } from 'rc-slider';
|
|
@@ -630,8 +631,8 @@ export declare const datePickerClasses: {
|
|
|
630
631
|
icon: "HvDatePicker-icon";
|
|
631
632
|
inputText: "HvDatePicker-inputText";
|
|
632
633
|
action: "HvDatePicker-action";
|
|
633
|
-
error: "HvDatePicker-error";
|
|
634
634
|
dropdown: "HvDatePicker-dropdown";
|
|
635
|
+
error: "HvDatePicker-error";
|
|
635
636
|
labelContainer: "HvDatePicker-labelContainer";
|
|
636
637
|
actionContainer: "HvDatePicker-actionContainer";
|
|
637
638
|
dropdownHeaderInvalid: "HvDatePicker-dropdownHeaderInvalid";
|
|
@@ -850,9 +851,9 @@ export declare const dropdownClasses: {
|
|
|
850
851
|
disabled: "HvDropdown-disabled";
|
|
851
852
|
readOnly: "HvDropdown-readOnly";
|
|
852
853
|
placeholderClosed: "HvDropdown-placeholderClosed";
|
|
854
|
+
dropdown: "HvDropdown-dropdown";
|
|
853
855
|
error: "HvDropdown-error";
|
|
854
856
|
arrow: "HvDropdown-arrow";
|
|
855
|
-
dropdown: "HvDropdown-dropdown";
|
|
856
857
|
labelContainer: "HvDropdown-labelContainer";
|
|
857
858
|
selectionDisabled: "HvDropdown-selectionDisabled";
|
|
858
859
|
dropdownHeader: "HvDropdown-dropdownHeader";
|
|
@@ -4142,6 +4143,8 @@ export declare type HvInlineEditorClasses = ExtractNames<typeof useClasses_81>;
|
|
|
4142
4143
|
export declare interface HvInlineEditorProps extends HvBaseProps<HTMLDivElement, "onBlur" | "onChange"> {
|
|
4143
4144
|
/** The value of the form element. */
|
|
4144
4145
|
value?: string;
|
|
4146
|
+
/** The default value of the form element. */
|
|
4147
|
+
defaultValue?: string;
|
|
4145
4148
|
/** Whether the Edit icon should always be visible */
|
|
4146
4149
|
showIcon?: boolean;
|
|
4147
4150
|
/** Component to use as the input. The component "inherit" from `HvBaseInput` (such as `HvInput` or `HvTextArea`) */
|
|
@@ -7578,7 +7581,7 @@ export declare interface HvVerticalNavigationTreeViewProps {
|
|
|
7578
7581
|
* @param {object} event The event source of the callback.
|
|
7579
7582
|
* @param {array} nodeIds The ids of the expanded nodes (old and new).
|
|
7580
7583
|
*/
|
|
7581
|
-
onToggle?: (event: any, nodeIds:
|
|
7584
|
+
onToggle?: (event: any, nodeIds: string[]) => void;
|
|
7582
7585
|
/**
|
|
7583
7586
|
* If `true`, will allow focus on disabled items.
|
|
7584
7587
|
* @default false
|
|
@@ -7810,8 +7813,8 @@ export declare const multiButtonClasses: {
|
|
|
7810
7813
|
primaryGhost: "HvMultiButton-primaryGhost";
|
|
7811
7814
|
splitGroup: "HvMultiButton-splitGroup";
|
|
7812
7815
|
splitGroupDisabled: "HvMultiButton-splitGroupDisabled";
|
|
7813
|
-
primarySubtle: "HvMultiButton-primarySubtle";
|
|
7814
7816
|
splitContainer: "HvMultiButton-splitContainer";
|
|
7817
|
+
primarySubtle: "HvMultiButton-primarySubtle";
|
|
7815
7818
|
firstButton: "HvMultiButton-firstButton";
|
|
7816
7819
|
lastButton: "HvMultiButton-lastButton";
|
|
7817
7820
|
};
|
|
@@ -9996,7 +9999,7 @@ declare const useClasses_56: (classesProp?: Partial<Record<"root" | "sortDropdow
|
|
|
9996
9999
|
cx: (...args: any) => string;
|
|
9997
10000
|
};
|
|
9998
10001
|
|
|
9999
|
-
declare const useClasses_57: (classesProp?: Partial<Record<"description" | "label" | "root" | "placeholder" | "disabled" | "readOnly" | "placeholderClosed" | "
|
|
10002
|
+
declare const useClasses_57: (classesProp?: Partial<Record<"description" | "label" | "root" | "placeholder" | "disabled" | "readOnly" | "placeholderClosed" | "dropdown" | "error" | "arrow" | "labelContainer" | "selectionDisabled" | "dropdownHeader" | "dropdownHeaderInvalid" | "dropdownHeaderOpen" | "dropdownListContainer" | "rootList", string>>, addStatic?: boolean) => {
|
|
10000
10003
|
classes: {
|
|
10001
10004
|
description: string;
|
|
10002
10005
|
label: string;
|
|
@@ -10005,9 +10008,9 @@ declare const useClasses_57: (classesProp?: Partial<Record<"description" | "labe
|
|
|
10005
10008
|
disabled: string;
|
|
10006
10009
|
readOnly: string;
|
|
10007
10010
|
placeholderClosed: string;
|
|
10011
|
+
dropdown: string;
|
|
10008
10012
|
error: string;
|
|
10009
10013
|
arrow: string;
|
|
10010
|
-
dropdown: string;
|
|
10011
10014
|
labelContainer: string;
|
|
10012
10015
|
selectionDisabled: string;
|
|
10013
10016
|
dropdownHeader: string;
|
|
@@ -10041,7 +10044,7 @@ declare const useClasses_58: (classesProp?: Partial<Record<"selection" | "select
|
|
|
10041
10044
|
cx: (...args: any) => string;
|
|
10042
10045
|
};
|
|
10043
10046
|
|
|
10044
|
-
declare const useClasses_59: (classesProp?: Partial<Record<"description" | "label" | "root" | "panel" | "icon" | "inputText" | "action" | "
|
|
10047
|
+
declare const useClasses_59: (classesProp?: Partial<Record<"description" | "label" | "root" | "panel" | "icon" | "inputText" | "action" | "dropdown" | "error" | "labelContainer" | "actionContainer" | "dropdownHeaderInvalid" | "dropdownHeaderOpen" | "leftContainer" | "rightContainer" | "dateText", string>>, addStatic?: boolean) => {
|
|
10045
10048
|
classes: {
|
|
10046
10049
|
description: string;
|
|
10047
10050
|
label: string;
|
|
@@ -10050,8 +10053,8 @@ declare const useClasses_59: (classesProp?: Partial<Record<"description" | "labe
|
|
|
10050
10053
|
icon: string;
|
|
10051
10054
|
inputText: string;
|
|
10052
10055
|
action: string;
|
|
10053
|
-
error: string;
|
|
10054
10056
|
dropdown: string;
|
|
10057
|
+
error: string;
|
|
10055
10058
|
labelContainer: string;
|
|
10056
10059
|
actionContainer: string;
|
|
10057
10060
|
dropdownHeaderInvalid: string;
|
|
@@ -10574,7 +10577,7 @@ declare const useClasses_87: (classesProp?: Partial<Record<"root" | "formContain
|
|
|
10574
10577
|
cx: (...args: any) => string;
|
|
10575
10578
|
};
|
|
10576
10579
|
|
|
10577
|
-
declare const useClasses_88: (classesProp?: Partial<Record<"secondary" | "primary" | "vertical" | "split" | "root" | "secondarySubtle" | "selected" | "button" | "secondaryGhost" | "splitDisabled" | "multiple" | "primaryGhost" | "splitGroup" | "splitGroupDisabled" | "
|
|
10580
|
+
declare const useClasses_88: (classesProp?: Partial<Record<"secondary" | "primary" | "vertical" | "split" | "root" | "secondarySubtle" | "selected" | "button" | "secondaryGhost" | "splitDisabled" | "multiple" | "primaryGhost" | "splitGroup" | "splitGroupDisabled" | "splitContainer" | "primarySubtle" | "firstButton" | "lastButton", string>>, addStatic?: boolean) => {
|
|
10578
10581
|
classes: {
|
|
10579
10582
|
secondary: string;
|
|
10580
10583
|
primary: string;
|
|
@@ -10590,8 +10593,8 @@ declare const useClasses_88: (classesProp?: Partial<Record<"secondary" | "primar
|
|
|
10590
10593
|
primaryGhost: string;
|
|
10591
10594
|
splitGroup: string;
|
|
10592
10595
|
splitGroupDisabled: string;
|
|
10593
|
-
primarySubtle: string;
|
|
10594
10596
|
splitContainer: string;
|
|
10597
|
+
primarySubtle: string;
|
|
10595
10598
|
firstButton: string;
|
|
10596
10599
|
lastButton: string;
|
|
10597
10600
|
};
|
|
@@ -10806,7 +10809,7 @@ export declare const useClickOutside: <T extends HTMLElement = HTMLElement>(ref:
|
|
|
10806
10809
|
|
|
10807
10810
|
export declare const useComputation: (valueFn: any, valueFallback?: any) => any[];
|
|
10808
10811
|
|
|
10809
|
-
export declare const useControlled: (controlledProp:
|
|
10812
|
+
export declare const useControlled: <T>(controlledProp: T | undefined, initialState: T | (() => T)) => readonly [T, (newValue: SetStateAction<T>) => void];
|
|
10810
10813
|
|
|
10811
10814
|
export declare function useCss(): {
|
|
10812
10815
|
css: {
|
|
@@ -11100,6 +11103,7 @@ export declare interface UseHvTableStylesTableRowProps {
|
|
|
11100
11103
|
|
|
11101
11104
|
export declare function useHvTreeItem(nodeId: string): {
|
|
11102
11105
|
instance: (UseTreeViewNodesInstance & UseTreeViewExpansionInstance & UseTreeViewSelectionInstance & UseTreeViewFocusInstance & UseTreeViewKeyboardNavigationInstance) | null;
|
|
11106
|
+
level: number;
|
|
11103
11107
|
disabled: boolean;
|
|
11104
11108
|
expanded: boolean;
|
|
11105
11109
|
selected: boolean;
|