@fluentui/react-tree 9.0.0-beta.5 → 9.0.0-beta.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/.swcrc +30 -0
- package/CHANGELOG.json +145 -1
- package/CHANGELOG.md +39 -2
- package/dist/index.d.ts +26 -20
- package/lib/Tree.js.map +1 -1
- package/lib/TreeItem.js.map +1 -1
- package/lib/TreeItemLayout.js.map +1 -1
- package/lib/TreeItemPersonaLayout.js.map +1 -1
- package/lib/components/Tree/Tree.js.map +1 -1
- package/lib/components/Tree/Tree.types.js +1 -1
- package/lib/components/Tree/Tree.types.js.map +1 -1
- package/lib/components/Tree/index.js.map +1 -1
- package/lib/components/Tree/renderTree.js +1 -3
- package/lib/components/Tree/renderTree.js.map +1 -1
- package/lib/components/Tree/useTree.js +5 -4
- package/lib/components/Tree/useTree.js.map +1 -1
- package/lib/components/Tree/useTreeContextValues.js +3 -3
- package/lib/components/Tree/useTreeContextValues.js.map +1 -1
- package/lib/components/Tree/useTreeStyles.js.map +1 -1
- package/lib/components/TreeItem/TreeItem.js.map +1 -1
- package/lib/components/TreeItem/TreeItem.types.js +1 -1
- package/lib/components/TreeItem/TreeItem.types.js.map +1 -1
- package/lib/components/TreeItem/index.js.map +1 -1
- package/lib/components/TreeItem/renderTreeItem.js +2 -12
- package/lib/components/TreeItem/renderTreeItem.js.map +1 -1
- package/lib/components/TreeItem/useTreeItem.js.map +1 -1
- package/lib/components/TreeItem/useTreeItemContextValues.js.map +1 -1
- package/lib/components/TreeItem/useTreeItemStyles.js.map +1 -1
- package/lib/components/TreeItemLayout/TreeItemLayout.js.map +1 -1
- package/lib/components/TreeItemLayout/TreeItemLayout.types.js.map +1 -1
- package/lib/components/TreeItemLayout/index.js.map +1 -1
- package/lib/components/TreeItemLayout/renderTreeItemLayout.js +1 -9
- package/lib/components/TreeItemLayout/renderTreeItemLayout.js.map +1 -1
- package/lib/components/TreeItemLayout/useTreeItemLayout.js +1 -0
- package/lib/components/TreeItemLayout/useTreeItemLayout.js.map +1 -1
- package/lib/components/TreeItemLayout/useTreeItemLayoutStyles.js.map +1 -1
- package/lib/components/TreeItemPersonaLayout/TreeItemPersonaLayout.js.map +1 -1
- package/lib/components/TreeItemPersonaLayout/TreeItemPersonaLayout.types.js.map +1 -1
- package/lib/components/TreeItemPersonaLayout/index.js.map +1 -1
- package/lib/components/TreeItemPersonaLayout/renderTreeItemPersonaLayout.js +2 -14
- package/lib/components/TreeItemPersonaLayout/renderTreeItemPersonaLayout.js.map +1 -1
- package/lib/components/TreeItemPersonaLayout/useTreeItemPersonaLayout.js +1 -0
- package/lib/components/TreeItemPersonaLayout/useTreeItemPersonaLayout.js.map +1 -1
- package/lib/components/TreeItemPersonaLayout/useTreeItemPersonaLayoutContextValues.js.map +1 -1
- package/lib/components/TreeItemPersonaLayout/useTreeItemPersonaLayoutStyles.js.map +1 -1
- package/lib/contexts/index.js.map +1 -1
- package/lib/contexts/treeContext.js +1 -2
- package/lib/contexts/treeContext.js.map +1 -1
- package/lib/contexts/treeItemContext.js +2 -4
- package/lib/contexts/treeItemContext.js.map +1 -1
- package/lib/hooks/index.js.map +1 -1
- package/lib/hooks/useFlatTree.js +42 -22
- package/lib/hooks/useFlatTree.js.map +1 -1
- package/lib/hooks/useFlatTreeNavigation.js +7 -7
- package/lib/hooks/useFlatTreeNavigation.js.map +1 -1
- package/lib/hooks/useHTMLElementWalker.js +5 -5
- package/lib/hooks/useHTMLElementWalker.js.map +1 -1
- package/lib/hooks/useNestedTreeNavigation.js.map +1 -1
- package/lib/hooks/useOpenItemsState.js.map +1 -1
- package/lib/hooks/useRovingTabIndexes.js.map +1 -1
- package/lib/index.js.map +1 -1
- package/lib/utils/ImmutableSet.js.map +1 -1
- package/lib/utils/assert.js +1 -0
- package/lib/utils/assert.js.map +1 -1
- package/lib/utils/createFlatTreeItems.js +109 -0
- package/lib/utils/createFlatTreeItems.js.map +1 -0
- package/lib/utils/flattenTree.js +3 -4
- package/lib/utils/flattenTree.js.map +1 -1
- package/lib/utils/nextTypeAheadElement.js +2 -2
- package/lib/utils/nextTypeAheadElement.js.map +1 -1
- package/lib/utils/normalizeOpenItems.js.map +1 -1
- package/lib/utils/tokens.js.map +1 -1
- package/lib/utils/treeItemFilter.js.map +1 -1
- package/lib-commonjs/Tree.js +5 -4
- package/lib-commonjs/Tree.js.map +1 -1
- package/lib-commonjs/TreeItem.js +5 -4
- package/lib-commonjs/TreeItem.js.map +1 -1
- package/lib-commonjs/TreeItemLayout.js +5 -4
- package/lib-commonjs/TreeItemLayout.js.map +1 -1
- package/lib-commonjs/TreeItemPersonaLayout.js +5 -4
- package/lib-commonjs/TreeItemPersonaLayout.js.map +1 -1
- package/lib-commonjs/components/Tree/Tree.js +18 -22
- package/lib-commonjs/components/Tree/Tree.js.map +1 -1
- package/lib-commonjs/components/Tree/Tree.types.js +5 -2
- package/lib-commonjs/components/Tree/Tree.types.js.map +1 -1
- package/lib-commonjs/components/Tree/index.js +10 -9
- package/lib-commonjs/components/Tree/index.js.map +1 -1
- package/lib-commonjs/components/Tree/renderTree.js +16 -18
- package/lib-commonjs/components/Tree/renderTree.js.map +1 -1
- package/lib-commonjs/components/Tree/useTree.js +88 -101
- package/lib-commonjs/components/Tree/useTree.js.map +1 -1
- package/lib-commonjs/components/Tree/useTreeContextValues.js +22 -28
- package/lib-commonjs/components/Tree/useTreeContextValues.js.map +1 -1
- package/lib-commonjs/components/Tree/useTreeStyles.js +31 -20
- package/lib-commonjs/components/Tree/useTreeStyles.js.map +1 -1
- package/lib-commonjs/components/TreeItem/TreeItem.js +18 -17
- package/lib-commonjs/components/TreeItem/TreeItem.js.map +1 -1
- package/lib-commonjs/components/TreeItem/TreeItem.types.js +5 -3
- package/lib-commonjs/components/TreeItem/TreeItem.types.js.map +1 -1
- package/lib-commonjs/components/TreeItem/index.js +9 -8
- package/lib-commonjs/components/TreeItem/index.js.map +1 -1
- package/lib-commonjs/components/TreeItem/renderTreeItem.js +19 -32
- package/lib-commonjs/components/TreeItem/renderTreeItem.js.map +1 -1
- package/lib-commonjs/components/TreeItem/useTreeItem.js +229 -249
- package/lib-commonjs/components/TreeItem/useTreeItem.js.map +1 -1
- package/lib-commonjs/components/TreeItem/useTreeItemContextValues.js +24 -20
- package/lib-commonjs/components/TreeItem/useTreeItemContextValues.js.map +1 -1
- package/lib-commonjs/components/TreeItem/useTreeItemStyles.js +353 -188
- package/lib-commonjs/components/TreeItem/useTreeItemStyles.js.map +1 -1
- package/lib-commonjs/components/TreeItemLayout/TreeItemLayout.js +16 -15
- package/lib-commonjs/components/TreeItemLayout/TreeItemLayout.js.map +1 -1
- package/lib-commonjs/components/TreeItemLayout/TreeItemLayout.types.js +3 -2
- package/lib-commonjs/components/TreeItemLayout/TreeItemLayout.types.js.map +1 -1
- package/lib-commonjs/components/TreeItemLayout/index.js +9 -8
- package/lib-commonjs/components/TreeItemLayout/index.js.map +1 -1
- package/lib-commonjs/components/TreeItemLayout/renderTreeItemLayout.js +14 -27
- package/lib-commonjs/components/TreeItemLayout/renderTreeItemLayout.js.map +1 -1
- package/lib-commonjs/components/TreeItemLayout/useTreeItemLayout.js +42 -52
- package/lib-commonjs/components/TreeItemLayout/useTreeItemLayout.js.map +1 -1
- package/lib-commonjs/components/TreeItemLayout/useTreeItemLayoutStyles.js +126 -88
- package/lib-commonjs/components/TreeItemLayout/useTreeItemLayoutStyles.js.map +1 -1
- package/lib-commonjs/components/TreeItemPersonaLayout/TreeItemPersonaLayout.js +18 -17
- package/lib-commonjs/components/TreeItemPersonaLayout/TreeItemPersonaLayout.js.map +1 -1
- package/lib-commonjs/components/TreeItemPersonaLayout/TreeItemPersonaLayout.types.js +3 -2
- package/lib-commonjs/components/TreeItemPersonaLayout/TreeItemPersonaLayout.types.js.map +1 -1
- package/lib-commonjs/components/TreeItemPersonaLayout/index.js +9 -8
- package/lib-commonjs/components/TreeItemPersonaLayout/index.js.map +1 -1
- package/lib-commonjs/components/TreeItemPersonaLayout/renderTreeItemPersonaLayout.js +17 -34
- package/lib-commonjs/components/TreeItemPersonaLayout/renderTreeItemPersonaLayout.js.map +1 -1
- package/lib-commonjs/components/TreeItemPersonaLayout/useTreeItemPersonaLayout.js +46 -61
- package/lib-commonjs/components/TreeItemPersonaLayout/useTreeItemPersonaLayout.js.map +1 -1
- package/lib-commonjs/components/TreeItemPersonaLayout/useTreeItemPersonaLayoutContextValues.js +18 -15
- package/lib-commonjs/components/TreeItemPersonaLayout/useTreeItemPersonaLayoutContextValues.js.map +1 -1
- package/lib-commonjs/components/TreeItemPersonaLayout/useTreeItemPersonaLayoutStyles.js +165 -101
- package/lib-commonjs/components/TreeItemPersonaLayout/useTreeItemPersonaLayoutStyles.js.map +1 -1
- package/lib-commonjs/contexts/index.js +6 -5
- package/lib-commonjs/contexts/index.js.map +1 -1
- package/lib-commonjs/contexts/treeContext.js +25 -17
- package/lib-commonjs/contexts/treeContext.js.map +1 -1
- package/lib-commonjs/contexts/treeItemContext.js +20 -12
- package/lib-commonjs/contexts/treeItemContext.js.map +1 -1
- package/lib-commonjs/hooks/index.js +7 -6
- package/lib-commonjs/hooks/index.js.map +1 -1
- package/lib-commonjs/hooks/useFlatTree.js +74 -52
- package/lib-commonjs/hooks/useFlatTree.js.map +1 -1
- package/lib-commonjs/hooks/useFlatTreeNavigation.js +73 -72
- package/lib-commonjs/hooks/useFlatTreeNavigation.js.map +1 -1
- package/lib-commonjs/hooks/useHTMLElementWalker.js +94 -83
- package/lib-commonjs/hooks/useHTMLElementWalker.js.map +1 -1
- package/lib-commonjs/hooks/useNestedTreeNavigation.js +61 -58
- package/lib-commonjs/hooks/useNestedTreeNavigation.js.map +1 -1
- package/lib-commonjs/hooks/useOpenItemsState.js +32 -22
- package/lib-commonjs/hooks/useOpenItemsState.js.map +1 -1
- package/lib-commonjs/hooks/useRovingTabIndexes.js +56 -53
- package/lib-commonjs/hooks/useRovingTabIndexes.js.map +1 -1
- package/lib-commonjs/index.js +48 -180
- package/lib-commonjs/index.js.map +1 -1
- package/lib-commonjs/utils/ImmutableSet.js +39 -38
- package/lib-commonjs/utils/ImmutableSet.js.map +1 -1
- package/lib-commonjs/utils/assert.js +13 -9
- package/lib-commonjs/utils/assert.js.map +1 -1
- package/lib-commonjs/utils/createFlatTreeItems.js +126 -0
- package/lib-commonjs/utils/createFlatTreeItems.js.map +1 -0
- package/lib-commonjs/utils/flattenTree.js +25 -29
- package/lib-commonjs/utils/flattenTree.js.map +1 -1
- package/lib-commonjs/utils/nextTypeAheadElement.js +18 -16
- package/lib-commonjs/utils/nextTypeAheadElement.js.map +1 -1
- package/lib-commonjs/utils/normalizeOpenItems.js +13 -9
- package/lib-commonjs/utils/normalizeOpenItems.js.map +1 -1
- package/lib-commonjs/utils/tokens.js +30 -20
- package/lib-commonjs/utils/tokens.js.map +1 -1
- package/lib-commonjs/utils/treeItemFilter.js +9 -7
- package/lib-commonjs/utils/treeItemFilter.js.map +1 -1
- package/package.json +19 -15
- package/lib/utils/createUnfilteredFlatTree.js +0 -77
- package/lib/utils/createUnfilteredFlatTree.js.map +0 -1
- package/lib/utils/createVisibleFlatTree.js +0 -80
- package/lib/utils/createVisibleFlatTree.js.map +0 -1
- package/lib-commonjs/utils/createUnfilteredFlatTree.js +0 -84
- package/lib-commonjs/utils/createUnfilteredFlatTree.js.map +0 -1
- package/lib-commonjs/utils/createVisibleFlatTree.js +0 -87
- package/lib-commonjs/utils/createVisibleFlatTree.js.map +0 -1
package/lib/hooks/useFlatTree.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { useEventCallback } from '@fluentui/react-utilities';
|
|
2
2
|
import * as React from 'react';
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
3
|
+
import { createFlatTreeItems, VisibleFlatTreeItemGenerator } from '../utils/createFlatTreeItems';
|
|
4
|
+
import { treeDataTypes } from '../utils/tokens';
|
|
5
5
|
import { useFlatTreeNavigation } from './useFlatTreeNavigation';
|
|
6
6
|
import { useOpenItemsState } from './useOpenItemsState';
|
|
7
7
|
/**
|
|
@@ -13,14 +13,13 @@ import { useOpenItemsState } from './useOpenItemsState';
|
|
|
13
13
|
* It should be used on cases where more complex interactions with a Tree is required.
|
|
14
14
|
* On simple scenarios it is advised to simply use a nested structure instead.
|
|
15
15
|
*
|
|
16
|
-
* @param
|
|
16
|
+
* @param flatTreeItemProps - a list of tree items
|
|
17
17
|
* @param options - in case control over the internal openItems is required
|
|
18
18
|
*/
|
|
19
|
-
export function useFlatTree_unstable(
|
|
19
|
+
export function useFlatTree_unstable(flatTreeItemProps, options = {}) {
|
|
20
20
|
const [openItems, updateOpenItems] = useOpenItemsState(options);
|
|
21
|
-
const
|
|
22
|
-
const [navigate, navigationRef] = useFlatTreeNavigation(
|
|
23
|
-
const visibleFlatTree = React.useMemo(() => createVisibleFlatTree(unfilteredFlatTree, openItems), [unfilteredFlatTree, openItems]);
|
|
21
|
+
const flatTreeItems = React.useMemo(() => createFlatTreeItems(flatTreeItemProps), [flatTreeItemProps]);
|
|
22
|
+
const [navigate, navigationRef] = useFlatTreeNavigation(flatTreeItems);
|
|
24
23
|
const handleOpenChange = useEventCallback((event, data) => {
|
|
25
24
|
event.preventDefault();
|
|
26
25
|
updateOpenItems(data);
|
|
@@ -29,21 +28,42 @@ export function useFlatTree_unstable(items, options = {}) {
|
|
|
29
28
|
event.preventDefault();
|
|
30
29
|
navigate(data);
|
|
31
30
|
});
|
|
32
|
-
const
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
31
|
+
const getNextNavigableItem = useEventCallback((visibleItems, data) => {
|
|
32
|
+
const item = flatTreeItems.get(data.target.id);
|
|
33
|
+
if (item) {
|
|
34
|
+
switch (data.type) {
|
|
35
|
+
case treeDataTypes.typeAhead:
|
|
36
|
+
return item;
|
|
37
|
+
case treeDataTypes.arrowLeft:
|
|
38
|
+
return flatTreeItems.get(item.parentId);
|
|
39
|
+
case treeDataTypes.arrowRight:
|
|
40
|
+
return visibleItems[item.index + 1];
|
|
41
|
+
case treeDataTypes.end:
|
|
42
|
+
return visibleItems[visibleItems.length - 1];
|
|
43
|
+
case treeDataTypes.home:
|
|
44
|
+
return visibleItems[0];
|
|
45
|
+
case treeDataTypes.arrowDown:
|
|
46
|
+
return visibleItems[item.index + 1];
|
|
47
|
+
case treeDataTypes.arrowUp:
|
|
48
|
+
return visibleItems[item.index - 1];
|
|
49
|
+
}
|
|
45
50
|
}
|
|
46
|
-
};
|
|
47
|
-
|
|
51
|
+
});
|
|
52
|
+
const getTreeProps = React.useCallback(() => ({
|
|
53
|
+
ref: navigationRef,
|
|
54
|
+
openItems,
|
|
55
|
+
onOpenChange: handleOpenChange,
|
|
56
|
+
// eslint-disable-next-line @typescript-eslint/naming-convention
|
|
57
|
+
onNavigation_unstable: handleNavigation
|
|
58
|
+
}),
|
|
59
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
60
|
+
[openItems]);
|
|
61
|
+
const items = React.useCallback(() => VisibleFlatTreeItemGenerator(openItems, flatTreeItems), [openItems, flatTreeItems]);
|
|
62
|
+
return React.useMemo(() => ({
|
|
63
|
+
navigate,
|
|
64
|
+
getTreeProps,
|
|
65
|
+
getNextNavigableItem,
|
|
66
|
+
items
|
|
67
|
+
}), [navigate, getTreeProps, getNextNavigableItem, items]);
|
|
48
68
|
}
|
|
49
69
|
//# sourceMappingURL=useFlatTree.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["useEventCallback","React","
|
|
1
|
+
{"version":3,"names":["useEventCallback","React","createFlatTreeItems","VisibleFlatTreeItemGenerator","treeDataTypes","useFlatTreeNavigation","useOpenItemsState","useFlatTree_unstable","flatTreeItemProps","options","openItems","updateOpenItems","flatTreeItems","useMemo","navigate","navigationRef","handleOpenChange","event","data","preventDefault","handleNavigation","getNextNavigableItem","visibleItems","item","get","target","id","type","typeAhead","arrowLeft","parentId","arrowRight","index","end","length","home","arrowDown","arrowUp","getTreeProps","useCallback","ref","onOpenChange","onNavigation_unstable","items"],"sources":["../../src/hooks/useFlatTree.ts"],"sourcesContent":["import { useEventCallback } from '@fluentui/react-utilities';\nimport * as React from 'react';\nimport { createFlatTreeItems, VisibleFlatTreeItemGenerator } from '../utils/createFlatTreeItems';\nimport { treeDataTypes } from '../utils/tokens';\nimport { useFlatTreeNavigation } from './useFlatTreeNavigation';\nimport { useOpenItemsState } from './useOpenItemsState';\nimport type {\n TreeNavigationData_unstable,\n TreeNavigationEvent_unstable,\n TreeOpenChangeData,\n TreeOpenChangeEvent,\n TreeProps,\n} from '../Tree';\nimport type { TreeItemId, TreeItemProps } from '../TreeItem';\n\nexport type FlatTreeItemProps = TreeItemProps & {\n id: TreeItemId;\n parentId?: string;\n};\n\nexport type FlatTreeItem = Readonly<MutableFlatTreeItem>;\n\n/**\n * @internal\n * Used internally on createFlatTreeItems and VisibleFlatTreeItemGenerator\n * to ensure required properties when building a FlatTreeITem\n */\nexport type MutableFlatTreeItem = {\n parentId?: string;\n childrenSize: number;\n index: number;\n id: string;\n level: number;\n getTreeItemProps(): Required<Pick<TreeItemProps, 'id' | 'aria-setsize' | 'aria-level' | 'aria-posinset' | 'leaf'>> &\n TreeItemProps;\n};\n\nexport type FlatTreeProps = Required<\n Pick<TreeProps, 'openItems' | 'onOpenChange' | 'onNavigation_unstable'> & { ref: React.Ref<HTMLDivElement> }\n>;\n\n/**\n * FlatTree API to manage all required mechanisms to convert a list of items into renderable TreeItems\n * in multiple scenarios including virtualization.\n *\n * !!A flat tree is an unofficial spec for tree!!\n *\n * It should be used on cases where more complex interactions with a Tree is required.\n *\n * On simple scenarios it is advised to simply use a nested structure instead.\n */\nexport type FlatTree = {\n /**\n * returns the properties required for the Tree component to work properly.\n * That includes:\n * `openItems`, `onOpenChange`, `onNavigation_unstable` and `ref`\n */\n getTreeProps(): FlatTreeProps;\n /**\n * internal method used to react to an `onNavigation` event.\n * This method ensures proper navigation on keyboard and mouse interaction.\n * In case of virtualization it might be required to cancel default provided `onNavigation`\n * event and then call this method manually.\n *\n * @example\n * ```ts\n * // react-window\n * const handleNavigation = (event, data) => {\n * event.preventDefault();\n * const nextItem = tree.getNextNavigableItem(data);\n * // scroll to item using virtualization scroll mechanism\n * if (nextItem && document.getElementById(nextItem.id)) {\n * listRef.current.scrollToItem(nextItem.index);\n * }\n * // wait for scrolling to happen and then invoke navigate method\n * requestAnimationFrame(() => {\n * tree.navigate(data);\n * });\n * };\n *```\n */\n navigate(data: TreeNavigationData_unstable): void;\n /**\n * returns next item to be focused on a navigation.\n * This method is provided to decouple the element that needs to be focused from\n * the action of focusing it itself.\n *\n * On the case of TypeAhead navigation this method returns the current item.\n */\n getNextNavigableItem(visibleItems: FlatTreeItem[], data: TreeNavigationData_unstable): FlatTreeItem | undefined;\n /**\n * an iterable containing all visually available flat tree items\n */\n items(): IterableIterator<FlatTreeItem>;\n};\n\n/**\n * this hook provides FlatTree API to manage all required mechanisms to convert a list of items into renderable TreeItems\n * in multiple scenarios including virtualization.\n *\n * !!A flat tree is an unofficial spec for tree!!\n *\n * It should be used on cases where more complex interactions with a Tree is required.\n * On simple scenarios it is advised to simply use a nested structure instead.\n *\n * @param flatTreeItemProps - a list of tree items\n * @param options - in case control over the internal openItems is required\n */\nexport function useFlatTree_unstable(\n flatTreeItemProps: FlatTreeItemProps[],\n options: Pick<TreeProps, 'openItems' | 'defaultOpenItems'> = {},\n): FlatTree {\n const [openItems, updateOpenItems] = useOpenItemsState(options);\n const flatTreeItems = React.useMemo(() => createFlatTreeItems(flatTreeItemProps), [flatTreeItemProps]);\n const [navigate, navigationRef] = useFlatTreeNavigation(flatTreeItems);\n\n const handleOpenChange = useEventCallback((event: TreeOpenChangeEvent, data: TreeOpenChangeData) => {\n event.preventDefault();\n updateOpenItems(data);\n });\n\n const handleNavigation = useEventCallback(\n (event: TreeNavigationEvent_unstable, data: TreeNavigationData_unstable) => {\n event.preventDefault();\n navigate(data);\n },\n );\n\n const getNextNavigableItem = useEventCallback((visibleItems: FlatTreeItem[], data: TreeNavigationData_unstable) => {\n const item = flatTreeItems.get(data.target.id);\n if (item) {\n switch (data.type) {\n case treeDataTypes.typeAhead:\n return item;\n case treeDataTypes.arrowLeft:\n return flatTreeItems.get(item.parentId!);\n case treeDataTypes.arrowRight:\n return visibleItems[item.index + 1];\n case treeDataTypes.end:\n return visibleItems[visibleItems.length - 1];\n case treeDataTypes.home:\n return visibleItems[0];\n case treeDataTypes.arrowDown:\n return visibleItems[item.index + 1];\n case treeDataTypes.arrowUp:\n return visibleItems[item.index - 1];\n }\n }\n });\n\n const getTreeProps = React.useCallback(\n () => ({\n ref: navigationRef as React.Ref<HTMLDivElement>,\n openItems,\n onOpenChange: handleOpenChange,\n // eslint-disable-next-line @typescript-eslint/naming-convention\n onNavigation_unstable: handleNavigation,\n }),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [openItems],\n );\n\n const items = React.useCallback(\n () => VisibleFlatTreeItemGenerator(openItems, flatTreeItems),\n [openItems, flatTreeItems],\n );\n\n return React.useMemo(\n () => ({ navigate, getTreeProps, getNextNavigableItem, items }),\n [navigate, getTreeProps, getNextNavigableItem, items],\n );\n}\n"],"mappings":"AAAA,SAASA,gBAAgB,QAAQ;AACjC,YAAYC,KAAA,MAAW;AACvB,SAASC,mBAAmB,EAAEC,4BAA4B,QAAQ;AAClE,SAASC,aAAa,QAAQ;AAC9B,SAASC,qBAAqB,QAAQ;AACtC,SAASC,iBAAiB,QAAQ;AA2FlC;;;;;;;;;;;;AAYA,OAAO,SAASC,qBACdC,iBAAsC,EACtCC,OAAA,GAA6D,CAAC,CAAC,EACrD;EACV,MAAM,CAACC,SAAA,EAAWC,eAAA,CAAgB,GAAGL,iBAAA,CAAkBG,OAAA;EACvD,MAAMG,aAAA,GAAgBX,KAAA,CAAMY,OAAO,CAAC,MAAMX,mBAAA,CAAoBM,iBAAA,GAAoB,CAACA,iBAAA,CAAkB;EACrG,MAAM,CAACM,QAAA,EAAUC,aAAA,CAAc,GAAGV,qBAAA,CAAsBO,aAAA;EAExD,MAAMI,gBAAA,GAAmBhB,gBAAA,CAAiB,CAACiB,KAAA,EAA4BC,IAAA,KAA6B;IAClGD,KAAA,CAAME,cAAc;IACpBR,eAAA,CAAgBO,IAAA;EAClB;EAEA,MAAME,gBAAA,GAAmBpB,gBAAA,CACvB,CAACiB,KAAA,EAAqCC,IAAA,KAAsC;IAC1ED,KAAA,CAAME,cAAc;IACpBL,QAAA,CAASI,IAAA;EACX;EAGF,MAAMG,oBAAA,GAAuBrB,gBAAA,CAAiB,CAACsB,YAAA,EAA8BJ,IAAA,KAAsC;IACjH,MAAMK,IAAA,GAAOX,aAAA,CAAcY,GAAG,CAACN,IAAA,CAAKO,MAAM,CAACC,EAAE;IAC7C,IAAIH,IAAA,EAAM;MACR,QAAQL,IAAA,CAAKS,IAAI;QACf,KAAKvB,aAAA,CAAcwB,SAAS;UAC1B,OAAOL,IAAA;QACT,KAAKnB,aAAA,CAAcyB,SAAS;UAC1B,OAAOjB,aAAA,CAAcY,GAAG,CAACD,IAAA,CAAKO,QAAQ;QACxC,KAAK1B,aAAA,CAAc2B,UAAU;UAC3B,OAAOT,YAAY,CAACC,IAAA,CAAKS,KAAK,GAAG,EAAE;QACrC,KAAK5B,aAAA,CAAc6B,GAAG;UACpB,OAAOX,YAAY,CAACA,YAAA,CAAaY,MAAM,GAAG,EAAE;QAC9C,KAAK9B,aAAA,CAAc+B,IAAI;UACrB,OAAOb,YAAY,CAAC,EAAE;QACxB,KAAKlB,aAAA,CAAcgC,SAAS;UAC1B,OAAOd,YAAY,CAACC,IAAA,CAAKS,KAAK,GAAG,EAAE;QACrC,KAAK5B,aAAA,CAAciC,OAAO;UACxB,OAAOf,YAAY,CAACC,IAAA,CAAKS,KAAK,GAAG,EAAE;MAAA;IAEzC;EACF;EAEA,MAAMM,YAAA,GAAerC,KAAA,CAAMsC,WAAW,CACpC,OAAO;IACLC,GAAA,EAAKzB,aAAA;IACLL,SAAA;IACA+B,YAAA,EAAczB,gBAAA;IACd;IACA0B,qBAAA,EAAuBtB;EACzB;EACA;EACA,CAACV,SAAA,CAAU;EAGb,MAAMiC,KAAA,GAAQ1C,KAAA,CAAMsC,WAAW,CAC7B,MAAMpC,4BAAA,CAA6BO,SAAA,EAAWE,aAAA,GAC9C,CAACF,SAAA,EAAWE,aAAA,CAAc;EAG5B,OAAOX,KAAA,CAAMY,OAAO,CAClB,OAAO;IAAEC,QAAA;IAAUwB,YAAA;IAAcjB,oBAAA;IAAsBsB;EAAM,IAC7D,CAAC7B,QAAA,EAAUwB,YAAA,EAAcjB,oBAAA,EAAsBsB,KAAA,CAAM;AAEzD"}
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import { useFluent_unstable } from '@fluentui/react-shared-contexts';
|
|
2
|
-
import { useMergedRefs } from '@fluentui/react-utilities';
|
|
2
|
+
import { useEventCallback, useMergedRefs } from '@fluentui/react-utilities';
|
|
3
3
|
import { nextTypeAheadElement } from '../utils/nextTypeAheadElement';
|
|
4
4
|
import { treeDataTypes } from '../utils/tokens';
|
|
5
5
|
import { treeItemFilter } from '../utils/treeItemFilter';
|
|
6
6
|
import { useHTMLElementWalkerRef } from './useHTMLElementWalker';
|
|
7
7
|
import { useRovingTabIndex } from './useRovingTabIndexes';
|
|
8
|
-
export function useFlatTreeNavigation(
|
|
8
|
+
export function useFlatTreeNavigation(flatTreeItems) {
|
|
9
9
|
const {
|
|
10
10
|
targetDocument
|
|
11
11
|
} = useFluent_unstable();
|
|
@@ -25,7 +25,7 @@ export function useFlatTreeNavigation(flatTree) {
|
|
|
25
25
|
treeItemWalker.currentElement = data.target;
|
|
26
26
|
return nextTypeAheadElement(treeItemWalker, data.event.key);
|
|
27
27
|
case treeDataTypes.arrowLeft:
|
|
28
|
-
return parentElement(
|
|
28
|
+
return parentElement(flatTreeItems, data.target, targetDocument);
|
|
29
29
|
case treeDataTypes.arrowRight:
|
|
30
30
|
treeItemWalker.currentElement = data.target;
|
|
31
31
|
return firstChild(data.target, treeItemWalker);
|
|
@@ -43,12 +43,12 @@ export function useFlatTreeNavigation(flatTree) {
|
|
|
43
43
|
return treeItemWalker.previousElement();
|
|
44
44
|
}
|
|
45
45
|
}
|
|
46
|
-
|
|
46
|
+
const navigate = useEventCallback(data => {
|
|
47
47
|
const nextElement = getNextElement(data);
|
|
48
48
|
if (nextElement) {
|
|
49
49
|
rove(nextElement);
|
|
50
50
|
}
|
|
51
|
-
}
|
|
51
|
+
});
|
|
52
52
|
return [navigate, useMergedRefs(treeItemWalkerRootRef, rovingRootRef)];
|
|
53
53
|
}
|
|
54
54
|
function firstChild(target, treeWalker) {
|
|
@@ -64,8 +64,8 @@ function firstChild(target, treeWalker) {
|
|
|
64
64
|
}
|
|
65
65
|
return null;
|
|
66
66
|
}
|
|
67
|
-
function parentElement(
|
|
68
|
-
const flatTreeItem =
|
|
67
|
+
function parentElement(flatTreeItems, target, document) {
|
|
68
|
+
const flatTreeItem = flatTreeItems.get(target.id);
|
|
69
69
|
if (flatTreeItem && flatTreeItem.parentId) {
|
|
70
70
|
return document.getElementById(flatTreeItem.parentId);
|
|
71
71
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["useFluent_unstable","useMergedRefs","nextTypeAheadElement","treeDataTypes","treeItemFilter","useHTMLElementWalkerRef","useRovingTabIndex","useFlatTreeNavigation","
|
|
1
|
+
{"version":3,"names":["useFluent_unstable","useEventCallback","useMergedRefs","nextTypeAheadElement","treeDataTypes","treeItemFilter","useHTMLElementWalkerRef","useRovingTabIndex","useFlatTreeNavigation","flatTreeItems","targetDocument","treeItemWalkerRef","treeItemWalkerRootRef","rove","rovingRootRef","getNextElement","data","current","treeItemWalker","type","click","target","typeAhead","currentElement","event","key","arrowLeft","parentElement","arrowRight","firstChild","end","root","lastChild","home","arrowDown","nextElement","arrowUp","previousElement","navigate","treeWalker","nextElementAriaPosInSet","getAttribute","nextElementAriaLevel","targetAriaLevel","Number","document","flatTreeItem","get","id","parentId","getElementById"],"sources":["../../src/hooks/useFlatTreeNavigation.ts"],"sourcesContent":["import { useFluent_unstable } from '@fluentui/react-shared-contexts';\nimport { useEventCallback, useMergedRefs } from '@fluentui/react-utilities';\nimport { TreeNavigationData_unstable } from '../Tree';\nimport { FlatTreeItems } from '../utils/createFlatTreeItems';\nimport { nextTypeAheadElement } from '../utils/nextTypeAheadElement';\nimport { treeDataTypes } from '../utils/tokens';\nimport { treeItemFilter } from '../utils/treeItemFilter';\nimport { HTMLElementWalker, useHTMLElementWalkerRef } from './useHTMLElementWalker';\nimport { useRovingTabIndex } from './useRovingTabIndexes';\n\nexport function useFlatTreeNavigation(flatTreeItems: FlatTreeItems) {\n const { targetDocument } = useFluent_unstable();\n const [treeItemWalkerRef, treeItemWalkerRootRef] = useHTMLElementWalkerRef(treeItemFilter);\n const [{ rove }, rovingRootRef] = useRovingTabIndex(treeItemFilter);\n\n function getNextElement(data: TreeNavigationData_unstable) {\n if (!targetDocument || !treeItemWalkerRef.current) {\n return null;\n }\n const treeItemWalker = treeItemWalkerRef.current;\n switch (data.type) {\n case treeDataTypes.click:\n return data.target;\n case treeDataTypes.typeAhead:\n treeItemWalker.currentElement = data.target;\n return nextTypeAheadElement(treeItemWalker, data.event.key);\n case treeDataTypes.arrowLeft:\n return parentElement(flatTreeItems, data.target, targetDocument);\n case treeDataTypes.arrowRight:\n treeItemWalker.currentElement = data.target;\n return firstChild(data.target, treeItemWalker);\n case treeDataTypes.end:\n treeItemWalker.currentElement = treeItemWalker.root;\n return treeItemWalker.lastChild();\n case treeDataTypes.home:\n treeItemWalker.currentElement = treeItemWalker.root;\n return treeItemWalker.firstChild();\n case treeDataTypes.arrowDown:\n treeItemWalker.currentElement = data.target;\n return treeItemWalker.nextElement();\n case treeDataTypes.arrowUp:\n treeItemWalker.currentElement = data.target;\n return treeItemWalker.previousElement();\n }\n }\n const navigate = useEventCallback((data: TreeNavigationData_unstable) => {\n const nextElement = getNextElement(data);\n if (nextElement) {\n rove(nextElement);\n }\n });\n return [navigate, useMergedRefs(treeItemWalkerRootRef, rovingRootRef)] as const;\n}\n\nfunction firstChild(target: HTMLElement, treeWalker: HTMLElementWalker): HTMLElement | null {\n const nextElement = treeWalker.nextElement();\n if (!nextElement) {\n return null;\n }\n const nextElementAriaPosInSet = nextElement.getAttribute('aria-posinset');\n const nextElementAriaLevel = nextElement.getAttribute('aria-level');\n const targetAriaLevel = target.getAttribute('aria-level');\n if (nextElementAriaPosInSet === '1' && Number(nextElementAriaLevel) === Number(targetAriaLevel) + 1) {\n return nextElement;\n }\n return null;\n}\n\nfunction parentElement(flatTreeItems: FlatTreeItems, target: HTMLElement, document: Document) {\n const flatTreeItem = flatTreeItems.get(target.id);\n if (flatTreeItem && flatTreeItem.parentId) {\n return document.getElementById(flatTreeItem.parentId);\n }\n return null;\n}\n"],"mappings":"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"}
|
|
@@ -4,12 +4,12 @@ export function createHTMLElementWalker(root, filter = () => NodeFilter.FILTER_A
|
|
|
4
4
|
let temporaryFilter;
|
|
5
5
|
const treeWalker = document.createTreeWalker(root, NodeFilter.SHOW_ELEMENT, {
|
|
6
6
|
acceptNode(node) {
|
|
7
|
-
var _a;
|
|
8
7
|
if (!isHTMLElement(node)) {
|
|
9
8
|
return NodeFilter.FILTER_REJECT;
|
|
10
9
|
}
|
|
11
10
|
const filterResult = filter(node);
|
|
12
|
-
|
|
11
|
+
var _temporaryFilter;
|
|
12
|
+
return filterResult === NodeFilter.FILTER_ACCEPT ? (_temporaryFilter = temporaryFilter === null || temporaryFilter === void 0 ? void 0 : temporaryFilter(node)) !== null && _temporaryFilter !== void 0 ? _temporaryFilter : filterResult : filterResult;
|
|
13
13
|
}
|
|
14
14
|
});
|
|
15
15
|
return {
|
|
@@ -68,12 +68,12 @@ export function createHTMLElementWalker(root, filter = () => NodeFilter.FILTER_A
|
|
|
68
68
|
}
|
|
69
69
|
export const useHTMLElementWalkerRef = filter => {
|
|
70
70
|
const walkerRef = React.useRef();
|
|
71
|
-
const rootRefCallback =
|
|
72
|
-
if (!
|
|
71
|
+
const rootRefCallback = element1 => {
|
|
72
|
+
if (!element1) {
|
|
73
73
|
walkerRef.current = undefined;
|
|
74
74
|
return;
|
|
75
75
|
}
|
|
76
|
-
walkerRef.current = createHTMLElementWalker(
|
|
76
|
+
walkerRef.current = createHTMLElementWalker(element1, filter);
|
|
77
77
|
};
|
|
78
78
|
return [walkerRef, rootRefCallback];
|
|
79
79
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["isHTMLElement","React","createHTMLElementWalker","root","filter","NodeFilter","FILTER_ACCEPT","temporaryFilter","treeWalker","document","createTreeWalker","SHOW_ELEMENT","acceptNode","node","FILTER_REJECT","filterResult","
|
|
1
|
+
{"version":3,"names":["isHTMLElement","React","createHTMLElementWalker","root","filter","NodeFilter","FILTER_ACCEPT","temporaryFilter","treeWalker","document","createTreeWalker","SHOW_ELEMENT","acceptNode","node","FILTER_REJECT","filterResult","_temporaryFilter","currentElement","currentNode","element","firstChild","localFilter","result","undefined","lastChild","nextElement","nextNode","nextSibling","parentElement","parentNode","previousElement","previousNode","previousSibling","useHTMLElementWalkerRef","walkerRef","useRef","rootRefCallback","element1","current"],"sources":["../../src/hooks/useHTMLElementWalker.ts"],"sourcesContent":["import { isHTMLElement } from '@fluentui/react-utilities';\nimport * as React from 'react';\n\nexport interface HTMLElementWalker {\n readonly root: HTMLElement;\n currentElement: HTMLElement;\n firstChild(filter?: HTMLElementFilter): HTMLElement | null;\n lastChild(filter?: HTMLElementFilter): HTMLElement | null;\n nextElement(filter?: HTMLElementFilter): HTMLElement | null;\n nextSibling(filter?: HTMLElementFilter): HTMLElement | null;\n parentElement(filter?: HTMLElementFilter): HTMLElement | null;\n previousElement(filter?: HTMLElementFilter): HTMLElement | null;\n previousSibling(filter?: HTMLElementFilter): HTMLElement | null;\n}\n\nexport type HTMLElementFilter = (element: HTMLElement) => number;\n\nexport function createHTMLElementWalker(\n root: HTMLElement,\n filter: HTMLElementFilter = () => NodeFilter.FILTER_ACCEPT,\n): HTMLElementWalker {\n let temporaryFilter: HTMLElementFilter | undefined;\n const treeWalker = document.createTreeWalker(root, NodeFilter.SHOW_ELEMENT, {\n acceptNode(node: Node) {\n if (!isHTMLElement(node)) {\n return NodeFilter.FILTER_REJECT;\n }\n const filterResult = filter(node);\n return filterResult === NodeFilter.FILTER_ACCEPT ? temporaryFilter?.(node) ?? filterResult : filterResult;\n },\n });\n return {\n get root() {\n return treeWalker.root as HTMLElement;\n },\n get currentElement() {\n return treeWalker.currentNode as HTMLElement;\n },\n set currentElement(element) {\n treeWalker.currentNode = element;\n },\n firstChild: localFilter => {\n temporaryFilter = localFilter;\n const result = treeWalker.firstChild() as HTMLElement | null;\n temporaryFilter = undefined;\n return result;\n },\n lastChild: localFilter => {\n temporaryFilter = localFilter;\n const result = treeWalker.lastChild() as HTMLElement | null;\n temporaryFilter = undefined;\n return result;\n },\n nextElement: localFilter => {\n temporaryFilter = localFilter;\n const result = treeWalker.nextNode() as HTMLElement | null;\n temporaryFilter = undefined;\n return result;\n },\n nextSibling: localFilter => {\n temporaryFilter = localFilter;\n const result = treeWalker.nextSibling() as HTMLElement | null;\n temporaryFilter = undefined;\n return result;\n },\n parentElement: localFilter => {\n temporaryFilter = localFilter;\n const result = treeWalker.parentNode() as HTMLElement | null;\n temporaryFilter = undefined;\n return result;\n },\n previousElement: localFilter => {\n temporaryFilter = localFilter;\n const result = treeWalker.previousNode() as HTMLElement | null;\n temporaryFilter = undefined;\n return result;\n },\n previousSibling: localFilter => {\n temporaryFilter = localFilter;\n const result = treeWalker.previousSibling() as HTMLElement | null;\n temporaryFilter = undefined;\n return result;\n },\n };\n}\n\nexport const useHTMLElementWalkerRef = (filter?: HTMLElementFilter) => {\n const walkerRef = React.useRef<HTMLElementWalker>();\n\n const rootRefCallback = (element?: HTMLElement) => {\n if (!element) {\n walkerRef.current = undefined;\n return;\n }\n walkerRef.current = createHTMLElementWalker(element, filter);\n };\n return [walkerRef as React.RefObject<HTMLElementWalker>, rootRefCallback as React.Ref<HTMLElement>] as const;\n};\n"],"mappings":"AAAA,SAASA,aAAa,QAAQ;AAC9B,YAAYC,KAAA,MAAW;AAgBvB,OAAO,SAASC,wBACdC,IAAiB,EACjBC,MAAA,GAA4BA,CAAA,KAAMC,UAAA,CAAWC,aAAa,EACvC;EACnB,IAAIC,eAAA;EACJ,MAAMC,UAAA,GAAaC,QAAA,CAASC,gBAAgB,CAACP,IAAA,EAAME,UAAA,CAAWM,YAAY,EAAE;IAC1EC,WAAWC,IAAU,EAAE;MACrB,IAAI,CAACb,aAAA,CAAca,IAAA,GAAO;QACxB,OAAOR,UAAA,CAAWS,aAAa;MACjC;MACA,MAAMC,YAAA,GAAeX,MAAA,CAAOS,IAAA;UACuBG,gBAAA;MAAnD,OAAOD,YAAA,KAAiBV,UAAA,CAAWC,aAAa,GAAG,CAAAU,gBAAA,GAAAT,eAAA,aAAAA,eAAA,uBAAAA,eAAA,CAAkBM,IAAA,eAAlBG,gBAAA,cAAAA,gBAAA,GAA2BD,YAAY,GAAGA,YAAY;IAC3G;EACF;EACA,OAAO;IACL,IAAIZ,KAAA,EAAO;MACT,OAAOK,UAAA,CAAWL,IAAI;IACxB;IACA,IAAIc,eAAA,EAAiB;MACnB,OAAOT,UAAA,CAAWU,WAAW;IAC/B;IACA,IAAID,eAAeE,OAAA,EAAS;MAC1BX,UAAA,CAAWU,WAAW,GAAGC,OAAA;IAC3B;IACAC,UAAA,EAAYC,WAAA,IAAe;MACzBd,eAAA,GAAkBc,WAAA;MAClB,MAAMC,MAAA,GAASd,UAAA,CAAWY,UAAU;MACpCb,eAAA,GAAkBgB,SAAA;MAClB,OAAOD,MAAA;IACT;IACAE,SAAA,EAAWH,WAAA,IAAe;MACxBd,eAAA,GAAkBc,WAAA;MAClB,MAAMC,MAAA,GAASd,UAAA,CAAWgB,SAAS;MACnCjB,eAAA,GAAkBgB,SAAA;MAClB,OAAOD,MAAA;IACT;IACAG,WAAA,EAAaJ,WAAA,IAAe;MAC1Bd,eAAA,GAAkBc,WAAA;MAClB,MAAMC,MAAA,GAASd,UAAA,CAAWkB,QAAQ;MAClCnB,eAAA,GAAkBgB,SAAA;MAClB,OAAOD,MAAA;IACT;IACAK,WAAA,EAAaN,WAAA,IAAe;MAC1Bd,eAAA,GAAkBc,WAAA;MAClB,MAAMC,MAAA,GAASd,UAAA,CAAWmB,WAAW;MACrCpB,eAAA,GAAkBgB,SAAA;MAClB,OAAOD,MAAA;IACT;IACAM,aAAA,EAAeP,WAAA,IAAe;MAC5Bd,eAAA,GAAkBc,WAAA;MAClB,MAAMC,MAAA,GAASd,UAAA,CAAWqB,UAAU;MACpCtB,eAAA,GAAkBgB,SAAA;MAClB,OAAOD,MAAA;IACT;IACAQ,eAAA,EAAiBT,WAAA,IAAe;MAC9Bd,eAAA,GAAkBc,WAAA;MAClB,MAAMC,MAAA,GAASd,UAAA,CAAWuB,YAAY;MACtCxB,eAAA,GAAkBgB,SAAA;MAClB,OAAOD,MAAA;IACT;IACAU,eAAA,EAAiBX,WAAA,IAAe;MAC9Bd,eAAA,GAAkBc,WAAA;MAClB,MAAMC,MAAA,GAASd,UAAA,CAAWwB,eAAe;MACzCzB,eAAA,GAAkBgB,SAAA;MAClB,OAAOD,MAAA;IACT;EACF;AACF;AAEA,OAAO,MAAMW,uBAAA,GAA2B7B,MAAA,IAA+B;EACrE,MAAM8B,SAAA,GAAYjC,KAAA,CAAMkC,MAAM;EAE9B,MAAMC,eAAA,GAAmBC,QAAA,IAA0B;IACjD,IAAI,CAACA,QAAA,EAAS;MACZH,SAAA,CAAUI,OAAO,GAAGf,SAAA;MACpB;IACF;IACAW,SAAA,CAAUI,OAAO,GAAGpC,uBAAA,CAAwBmC,QAAA,EAASjC,MAAA;EACvD;EACA,OAAO,CAAC8B,SAAA,EAAiDE,eAAA,CAA0C;AACrG"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["useHTMLElementWalkerRef","nextTypeAheadElement","treeDataTypes","treeItemFilter","useRovingTabIndex","useMergedRefs","useNestedTreeNavigation","rove","rovingRootRef","walkerRef","rootRef","getNextElement","data","current","treeItemWalker","type","click","target","typeAhead","currentElement","event","key","arrowLeft","parentElement","arrowRight","firstChild","end","root","lastChildRecursive","home","arrowDown","nextElement","arrowUp","previousElement","navigate","walker","lastElement","lastChild"],"sources":["
|
|
1
|
+
{"version":3,"names":["useHTMLElementWalkerRef","nextTypeAheadElement","treeDataTypes","treeItemFilter","useRovingTabIndex","useMergedRefs","useNestedTreeNavigation","rove","rovingRootRef","walkerRef","rootRef","getNextElement","data","current","treeItemWalker","type","click","target","typeAhead","currentElement","event","key","arrowLeft","parentElement","arrowRight","firstChild","end","root","lastChildRecursive","home","arrowDown","nextElement","arrowUp","previousElement","navigate","walker","lastElement","lastChild"],"sources":["../../src/hooks/useNestedTreeNavigation.ts"],"sourcesContent":["import { TreeNavigationData_unstable } from '../Tree';\nimport { HTMLElementWalker, useHTMLElementWalkerRef } from './useHTMLElementWalker';\nimport { nextTypeAheadElement } from '../utils/nextTypeAheadElement';\nimport { treeDataTypes } from '../utils/tokens';\nimport { treeItemFilter } from '../utils/treeItemFilter';\nimport { useRovingTabIndex } from './useRovingTabIndexes';\nimport { useMergedRefs } from '@fluentui/react-utilities';\n\nexport function useNestedTreeNavigation() {\n const [{ rove }, rovingRootRef] = useRovingTabIndex(treeItemFilter);\n const [walkerRef, rootRef] = useHTMLElementWalkerRef(treeItemFilter);\n\n const getNextElement = (data: TreeNavigationData_unstable) => {\n if (!walkerRef.current) {\n return;\n }\n const treeItemWalker = walkerRef.current;\n switch (data.type) {\n case treeDataTypes.click:\n return data.target;\n case treeDataTypes.typeAhead:\n treeItemWalker.currentElement = data.target;\n return nextTypeAheadElement(treeItemWalker, data.event.key);\n case treeDataTypes.arrowLeft:\n treeItemWalker.currentElement = data.target;\n return treeItemWalker.parentElement();\n case treeDataTypes.arrowRight:\n treeItemWalker.currentElement = data.target;\n return treeItemWalker.firstChild();\n case treeDataTypes.end:\n treeItemWalker.currentElement = treeItemWalker.root;\n return lastChildRecursive(treeItemWalker);\n case treeDataTypes.home:\n treeItemWalker.currentElement = treeItemWalker.root;\n return treeItemWalker.firstChild();\n case treeDataTypes.arrowDown:\n treeItemWalker.currentElement = data.target;\n return treeItemWalker.nextElement();\n case treeDataTypes.arrowUp:\n treeItemWalker.currentElement = data.target;\n return treeItemWalker.previousElement();\n }\n };\n function navigate(data: TreeNavigationData_unstable) {\n const nextElement = getNextElement(data);\n if (nextElement) {\n rove(nextElement);\n }\n }\n return [navigate, useMergedRefs(rootRef, rovingRootRef)] as const;\n}\n\nfunction lastChildRecursive(walker: HTMLElementWalker) {\n let lastElement: HTMLElement | null = null;\n let nextElement: HTMLElement | null = null;\n while ((nextElement = walker.lastChild())) {\n lastElement = nextElement;\n }\n return lastElement;\n}\n"],"mappings":"AACA,SAA4BA,uBAAuB,QAAQ;AAC3D,SAASC,oBAAoB,QAAQ;AACrC,SAASC,aAAa,QAAQ;AAC9B,SAASC,cAAc,QAAQ;AAC/B,SAASC,iBAAiB,QAAQ;AAClC,SAASC,aAAa,QAAQ;AAE9B,OAAO,SAASC,wBAAA,EAA0B;EACxC,MAAM,CAAC;IAAEC;EAAI,CAAE,EAAEC,aAAA,CAAc,GAAGJ,iBAAA,CAAkBD,cAAA;EACpD,MAAM,CAACM,SAAA,EAAWC,OAAA,CAAQ,GAAGV,uBAAA,CAAwBG,cAAA;EAErD,MAAMQ,cAAA,GAAkBC,IAAA,IAAsC;IAC5D,IAAI,CAACH,SAAA,CAAUI,OAAO,EAAE;MACtB;IACF;IACA,MAAMC,cAAA,GAAiBL,SAAA,CAAUI,OAAO;IACxC,QAAQD,IAAA,CAAKG,IAAI;MACf,KAAKb,aAAA,CAAcc,KAAK;QACtB,OAAOJ,IAAA,CAAKK,MAAM;MACpB,KAAKf,aAAA,CAAcgB,SAAS;QAC1BJ,cAAA,CAAeK,cAAc,GAAGP,IAAA,CAAKK,MAAM;QAC3C,OAAOhB,oBAAA,CAAqBa,cAAA,EAAgBF,IAAA,CAAKQ,KAAK,CAACC,GAAG;MAC5D,KAAKnB,aAAA,CAAcoB,SAAS;QAC1BR,cAAA,CAAeK,cAAc,GAAGP,IAAA,CAAKK,MAAM;QAC3C,OAAOH,cAAA,CAAeS,aAAa;MACrC,KAAKrB,aAAA,CAAcsB,UAAU;QAC3BV,cAAA,CAAeK,cAAc,GAAGP,IAAA,CAAKK,MAAM;QAC3C,OAAOH,cAAA,CAAeW,UAAU;MAClC,KAAKvB,aAAA,CAAcwB,GAAG;QACpBZ,cAAA,CAAeK,cAAc,GAAGL,cAAA,CAAea,IAAI;QACnD,OAAOC,kBAAA,CAAmBd,cAAA;MAC5B,KAAKZ,aAAA,CAAc2B,IAAI;QACrBf,cAAA,CAAeK,cAAc,GAAGL,cAAA,CAAea,IAAI;QACnD,OAAOb,cAAA,CAAeW,UAAU;MAClC,KAAKvB,aAAA,CAAc4B,SAAS;QAC1BhB,cAAA,CAAeK,cAAc,GAAGP,IAAA,CAAKK,MAAM;QAC3C,OAAOH,cAAA,CAAeiB,WAAW;MACnC,KAAK7B,aAAA,CAAc8B,OAAO;QACxBlB,cAAA,CAAeK,cAAc,GAAGP,IAAA,CAAKK,MAAM;QAC3C,OAAOH,cAAA,CAAemB,eAAe;IAAA;EAE3C;EACA,SAASC,SAAStB,IAAiC,EAAE;IACnD,MAAMmB,WAAA,GAAcpB,cAAA,CAAeC,IAAA;IACnC,IAAImB,WAAA,EAAa;MACfxB,IAAA,CAAKwB,WAAA;IACP;EACF;EACA,OAAO,CAACG,QAAA,EAAU7B,aAAA,CAAcK,OAAA,EAASF,aAAA,EAAe;AAC1D;AAEA,SAASoB,mBAAmBO,MAAyB,EAAE;EACrD,IAAIC,WAAA,GAAkC,IAAI;EAC1C,IAAIL,WAAA,GAAkC,IAAI;EAC1C,OAAQA,WAAA,GAAcI,MAAA,CAAOE,SAAS,IAAK;IACzCD,WAAA,GAAcL,WAAA;EAChB;EACA,OAAOK,WAAA;AACT"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["useControllableState","useEventCallback","React","createImmutableSet","emptyImmutableSet","useOpenItemsState","props","openItems","setOpenItems","state","useMemo","defaultState","defaultOpenItems","initialState","updateOpenItems","data","currentOpenItems","createNextOpenItems","previousOpenItems","id","target","previousOpenItemsHasId","has","open","nextOpenItems","add","delete"],"sources":["
|
|
1
|
+
{"version":3,"names":["useControllableState","useEventCallback","React","createImmutableSet","emptyImmutableSet","useOpenItemsState","props","openItems","setOpenItems","state","useMemo","defaultState","defaultOpenItems","initialState","updateOpenItems","data","currentOpenItems","createNextOpenItems","previousOpenItems","id","target","previousOpenItemsHasId","has","open","nextOpenItems","add","delete"],"sources":["../../src/hooks/useOpenItemsState.ts"],"sourcesContent":["import { useControllableState, useEventCallback } from '@fluentui/react-utilities';\nimport * as React from 'react';\nimport { createImmutableSet, emptyImmutableSet, ImmutableSet } from '../utils/ImmutableSet';\nimport type { TreeItemId } from '../TreeItem';\nimport type { TreeOpenChangeData, TreeProps } from '../Tree';\n\nexport function useOpenItemsState(props: Pick<TreeProps, 'openItems' | 'defaultOpenItems'>) {\n const [openItems, setOpenItems] = useControllableState({\n state: React.useMemo(() => props.openItems && createImmutableSet(props.openItems), [props.openItems]),\n defaultState: React.useMemo(\n () => props.defaultOpenItems && createImmutableSet(props.defaultOpenItems),\n [props.defaultOpenItems],\n ),\n initialState: emptyImmutableSet,\n });\n const updateOpenItems = useEventCallback((data: TreeOpenChangeData) =>\n setOpenItems(currentOpenItems => createNextOpenItems(data, currentOpenItems)),\n );\n return [openItems, updateOpenItems] as const;\n}\n\nfunction createNextOpenItems(\n data: TreeOpenChangeData,\n previousOpenItems: ImmutableSet<TreeItemId>,\n): ImmutableSet<TreeItemId> {\n const id = data.target.id;\n const previousOpenItemsHasId = previousOpenItems.has(id);\n if (data.open ? previousOpenItemsHasId : !previousOpenItemsHasId) {\n return previousOpenItems;\n }\n const nextOpenItems = createImmutableSet(previousOpenItems);\n return data.open ? nextOpenItems.add(id) : nextOpenItems.delete(id);\n}\n"],"mappings":"AAAA,SAASA,oBAAoB,EAAEC,gBAAgB,QAAQ;AACvD,YAAYC,KAAA,MAAW;AACvB,SAASC,kBAAkB,EAAEC,iBAAiB,QAAsB;AAIpE,OAAO,SAASC,kBAAkBC,KAAwD,EAAE;EAC1F,MAAM,CAACC,SAAA,EAAWC,YAAA,CAAa,GAAGR,oBAAA,CAAqB;IACrDS,KAAA,EAAOP,KAAA,CAAMQ,OAAO,CAAC,MAAMJ,KAAA,CAAMC,SAAS,IAAIJ,kBAAA,CAAmBG,KAAA,CAAMC,SAAS,GAAG,CAACD,KAAA,CAAMC,SAAS,CAAC;IACpGI,YAAA,EAAcT,KAAA,CAAMQ,OAAO,CACzB,MAAMJ,KAAA,CAAMM,gBAAgB,IAAIT,kBAAA,CAAmBG,KAAA,CAAMM,gBAAgB,GACzE,CAACN,KAAA,CAAMM,gBAAgB,CAAC;IAE1BC,YAAA,EAAcT;EAChB;EACA,MAAMU,eAAA,GAAkBb,gBAAA,CAAkBc,IAAA,IACxCP,YAAA,CAAaQ,gBAAA,IAAoBC,mBAAA,CAAoBF,IAAA,EAAMC,gBAAA;EAE7D,OAAO,CAACT,SAAA,EAAWO,eAAA,CAAgB;AACrC;AAEA,SAASG,oBACPF,IAAwB,EACxBG,iBAA2C,EACjB;EAC1B,MAAMC,EAAA,GAAKJ,IAAA,CAAKK,MAAM,CAACD,EAAE;EACzB,MAAME,sBAAA,GAAyBH,iBAAA,CAAkBI,GAAG,CAACH,EAAA;EACrD,IAAIJ,IAAA,CAAKQ,IAAI,GAAGF,sBAAA,GAAyB,CAACA,sBAAsB,EAAE;IAChE,OAAOH,iBAAA;EACT;EACA,MAAMM,aAAA,GAAgBrB,kBAAA,CAAmBe,iBAAA;EACzC,OAAOH,IAAA,CAAKQ,IAAI,GAAGC,aAAA,CAAcC,GAAG,CAACN,EAAA,IAAMK,aAAA,CAAcE,MAAM,CAACP,EAAA,CAAG;AACrE"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["useMergedRefs","React","useHTMLElementWalkerRef","useRovingTabIndex","filter","currentElementRef","useRef","walkerRef","rootRef","rootRefCallback","element","reset","current","walker","currentElement","root","tabbableChild","firstChild","tabIndex","NodeFilter","FILTER_ACCEPT","FILTER_SKIP","process","env","NODE_ENV","console","warn","nextElement","rove","focus"],"sources":["
|
|
1
|
+
{"version":3,"names":["useMergedRefs","React","useHTMLElementWalkerRef","useRovingTabIndex","filter","currentElementRef","useRef","walkerRef","rootRef","rootRefCallback","element","reset","current","walker","currentElement","root","tabbableChild","firstChild","tabIndex","NodeFilter","FILTER_ACCEPT","FILTER_SKIP","process","env","NODE_ENV","console","warn","nextElement","rove","focus"],"sources":["../../src/hooks/useRovingTabIndexes.ts"],"sourcesContent":["import { useMergedRefs } from '@fluentui/react-utilities';\nimport * as React from 'react';\nimport { HTMLElementFilter, useHTMLElementWalkerRef } from './useHTMLElementWalker';\n\n/**\n * https://www.w3.org/WAI/ARIA/apg/practices/keyboard-interface/#kbd_roving_tabindex\n */\nexport function useRovingTabIndex(filter?: HTMLElementFilter) {\n const currentElementRef = React.useRef<HTMLElement>();\n const [walkerRef, rootRef] = useHTMLElementWalkerRef(filter);\n\n const rootRefCallback = (element?: HTMLElement) => {\n if (!element) {\n return;\n }\n reset();\n };\n\n function reset() {\n if (!walkerRef.current) {\n return;\n }\n const walker = walkerRef.current;\n walker.currentElement = walker.root;\n let tabbableChild = walker.firstChild(element =>\n element.tabIndex === 0 ? NodeFilter.FILTER_ACCEPT : NodeFilter.FILTER_SKIP,\n );\n walker.currentElement = walker.root;\n tabbableChild ??= walker.firstChild();\n if (!tabbableChild) {\n if (process.env.NODE_ENV === 'development') {\n // eslint-disable-next-line no-console\n console.warn('useRovingTabIndexes: internal error, no tabbable element was found');\n }\n return;\n }\n tabbableChild.tabIndex = 0;\n currentElementRef.current = tabbableChild;\n let nextElement: HTMLElement | null = null;\n while ((nextElement = walker.nextElement()) && nextElement !== tabbableChild) {\n nextElement.tabIndex = -1;\n }\n }\n function rove(nextElement: HTMLElement) {\n if (!currentElementRef.current) {\n return;\n }\n currentElementRef.current.tabIndex = -1;\n nextElement.tabIndex = 0;\n nextElement.focus();\n currentElementRef.current = nextElement;\n }\n\n return [\n {\n rove,\n reset,\n },\n useMergedRefs(rootRef, rootRefCallback) as React.Ref<HTMLElement>,\n ] as const;\n}\n"],"mappings":"AAAA,SAASA,aAAa,QAAQ;AAC9B,YAAYC,KAAA,MAAW;AACvB,SAA4BC,uBAAuB,QAAQ;AAE3D;;;AAGA,OAAO,SAASC,kBAAkBC,MAA0B,EAAE;EAC5D,MAAMC,iBAAA,GAAoBJ,KAAA,CAAMK,MAAM;EACtC,MAAM,CAACC,SAAA,EAAWC,OAAA,CAAQ,GAAGN,uBAAA,CAAwBE,MAAA;EAErD,MAAMK,eAAA,GAAmBC,OAAA,IAA0B;IACjD,IAAI,CAACA,OAAA,EAAS;MACZ;IACF;IACAC,KAAA;EACF;EAEA,SAASA,MAAA,EAAQ;IACf,IAAI,CAACJ,SAAA,CAAUK,OAAO,EAAE;MACtB;IACF;IACA,MAAMC,MAAA,GAASN,SAAA,CAAUK,OAAO;IAChCC,MAAA,CAAOC,cAAc,GAAGD,MAAA,CAAOE,IAAI;IACnC,IAAIC,aAAA,GAAgBH,MAAA,CAAOI,UAAU,CAACP,OAAA,IACpCA,OAAA,CAAQQ,QAAQ,KAAK,IAAIC,UAAA,CAAWC,aAAa,GAAGD,UAAA,CAAWE,WAAW;IAE5ER,MAAA,CAAOC,cAAc,GAAGD,MAAA,CAAOE,IAAI;IACnCC,aAAA,aAAAA,aAAA,cAAAA,aAAA,GAAAA,aAAA,GAAkBH,MAAA,CAAOI,UAAU,EAAE;IACrC,IAAI,CAACD,aAAA,EAAe;MAClB,IAAIM,OAAA,CAAQC,GAAG,CAACC,QAAQ,KAAK,eAAe;QAC1C;QACAC,OAAA,CAAQC,IAAI,CAAC;MACf;MACA;IACF;IACAV,aAAA,CAAcE,QAAQ,GAAG;IACzBb,iBAAA,CAAkBO,OAAO,GAAGI,aAAA;IAC5B,IAAIW,WAAA,GAAkC,IAAI;IAC1C,OAAO,CAACA,WAAA,GAAcd,MAAA,CAAOc,WAAW,EAAC,KAAMA,WAAA,KAAgBX,aAAA,EAAe;MAC5EW,WAAA,CAAYT,QAAQ,GAAG,CAAC;IAC1B;EACF;EACA,SAASU,KAAKD,WAAwB,EAAE;IACtC,IAAI,CAACtB,iBAAA,CAAkBO,OAAO,EAAE;MAC9B;IACF;IACAP,iBAAA,CAAkBO,OAAO,CAACM,QAAQ,GAAG,CAAC;IACtCS,WAAA,CAAYT,QAAQ,GAAG;IACvBS,WAAA,CAAYE,KAAK;IACjBxB,iBAAA,CAAkBO,OAAO,GAAGe,WAAA;EAC9B;EAEA,OAAO,CACL;IACEC,IAAA;IACAjB;EACF,GACAX,aAAA,CAAcQ,OAAA,EAASC,eAAA,EACxB;AACH"}
|
package/lib/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["Tree","treeClassNames","renderTree_unstable","useTreeStyles_unstable","useTree_unstable","useTreeContextValues_unstable","TreeProvider","useTreeContext_unstable","useTreeItemContext_unstable","TreeItemProvider","treeItemLevelToken","TreeItem","treeItemClassNames","renderTreeItem_unstable","useTreeItemStyles_unstable","useTreeItem_unstable","TreeItemLayout","treeItemLayoutClassNames","renderTreeItemLayout_unstable","useTreeItemLayoutStyles_unstable","useTreeItemLayout_unstable","TreeItemPersonaLayout","treeItemPersonaLayoutClassNames","renderTreeItemPersonaLayout_unstable","useTreeItemPersonaLayoutStyles_unstable","useTreeItemPersonaLayout_unstable","useFlatTree_unstable","flattenTree_unstable"],"sources":["../src/
|
|
1
|
+
{"version":3,"names":["Tree","treeClassNames","renderTree_unstable","useTreeStyles_unstable","useTree_unstable","useTreeContextValues_unstable","TreeProvider","useTreeContext_unstable","useTreeItemContext_unstable","TreeItemProvider","treeItemLevelToken","TreeItem","treeItemClassNames","renderTreeItem_unstable","useTreeItemStyles_unstable","useTreeItem_unstable","TreeItemLayout","treeItemLayoutClassNames","renderTreeItemLayout_unstable","useTreeItemLayoutStyles_unstable","useTreeItemLayout_unstable","TreeItemPersonaLayout","treeItemPersonaLayoutClassNames","renderTreeItemPersonaLayout_unstable","useTreeItemPersonaLayoutStyles_unstable","useTreeItemPersonaLayout_unstable","useFlatTree_unstable","flattenTree_unstable"],"sources":["../src/index.ts"],"sourcesContent":["export {\n Tree,\n treeClassNames,\n renderTree_unstable,\n useTreeStyles_unstable,\n useTree_unstable,\n useTreeContextValues_unstable,\n} from './Tree';\nexport type {\n TreeProps,\n TreeState,\n TreeSlots,\n TreeOpenChangeData,\n TreeOpenChangeEvent,\n TreeNavigationEvent_unstable,\n TreeNavigationData_unstable,\n} from './Tree';\n\nexport { TreeProvider, useTreeContext_unstable, useTreeItemContext_unstable, TreeItemProvider } from './contexts';\nexport type { TreeContextValue } from './contexts';\n\nexport { treeItemLevelToken } from './utils/tokens';\n\nexport {\n TreeItem,\n treeItemClassNames,\n renderTreeItem_unstable,\n useTreeItemStyles_unstable,\n useTreeItem_unstable,\n} from './TreeItem';\nexport type { TreeItemId, TreeItemProps, TreeItemState, TreeItemSlots } from './TreeItem';\n\nexport {\n TreeItemLayout,\n treeItemLayoutClassNames,\n renderTreeItemLayout_unstable,\n useTreeItemLayoutStyles_unstable,\n useTreeItemLayout_unstable,\n} from './TreeItemLayout';\nexport type { TreeItemLayoutProps, TreeItemLayoutSlots, TreeItemLayoutState } from './TreeItemLayout';\n\nexport {\n TreeItemPersonaLayout,\n treeItemPersonaLayoutClassNames,\n renderTreeItemPersonaLayout_unstable,\n useTreeItemPersonaLayoutStyles_unstable,\n useTreeItemPersonaLayout_unstable,\n} from './TreeItemPersonaLayout';\nexport type {\n TreeItemPersonaLayoutProps,\n TreeItemPersonaLayoutSlots,\n TreeItemPersonaLayoutState,\n} from './TreeItemPersonaLayout';\n\nexport { useFlatTree_unstable } from './hooks/index';\nexport type { FlatTreeItem, FlatTreeItemProps, FlatTreeProps, FlatTree } from './hooks/index';\n\nexport { flattenTree_unstable } from './utils/flattenTree';\nexport type { NestedTreeItem } from './utils/flattenTree';\n"],"mappings":"AAAA,SACEA,IAAI,EACJC,cAAc,EACdC,mBAAmB,EACnBC,sBAAsB,EACtBC,gBAAgB,EAChBC,6BAA6B,QACxB;AAWP,SAASC,YAAY,EAAEC,uBAAuB,EAAEC,2BAA2B,EAAEC,gBAAgB,QAAQ;AAGrG,SAASC,kBAAkB,QAAQ;AAEnC,SACEC,QAAQ,EACRC,kBAAkB,EAClBC,uBAAuB,EACvBC,0BAA0B,EAC1BC,oBAAoB,QACf;AAGP,SACEC,cAAc,EACdC,wBAAwB,EACxBC,6BAA6B,EAC7BC,gCAAgC,EAChCC,0BAA0B,QACrB;AAGP,SACEC,qBAAqB,EACrBC,+BAA+B,EAC/BC,oCAAoC,EACpCC,uCAAuC,EACvCC,iCAAiC,QAC5B;AAOP,SAASC,oBAAoB,QAAQ;AAGrC,SAASC,oBAAoB,QAAQ"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["emptyImmutableSet","createImmutableSet","iterable","internalSet","Set","dangerouslyCreateImmutableSet","size","add","value","nextSet","clear","delete","has","Symbol","iterator"],"sources":["
|
|
1
|
+
{"version":3,"names":["emptyImmutableSet","createImmutableSet","iterable","internalSet","Set","dangerouslyCreateImmutableSet","size","add","value","nextSet","clear","delete","has","Symbol","iterator"],"sources":["../../src/utils/ImmutableSet.ts"],"sourcesContent":["export interface ImmutableSet<Value> {\n /**\n * The number of (unique) elements in a ImmutableSet.\n */\n readonly size: number;\n /**\n * Creates a new ImmutableSet containing all previous element plus the one provided as argument\n * @param value - new value to be included in the new ImmutableSet instance\n */\n add(value: Value): ImmutableSet<Value>;\n /**\n * Returns a reference to ImmutableSet.emptySet\n */\n clear(): ImmutableSet<Value>;\n /**\n * Creates a new ImmutableSet with the original items and removes a specified value from the new ImmutableSet.\n */\n delete(value: Value): ImmutableSet<Value>;\n /**\n * @returns a boolean indicating whether an element with the specified value exists in the ImmutableSet or not.\n */\n has(value: Value): boolean;\n /** Iterates over values in the ImmutableSet. */\n [Symbol.iterator](): IterableIterator<Value>;\n}\n\nexport const emptyImmutableSet = createImmutableSet<never>();\n\n/**\n * properly creates an ImmutableSet instance from an iterable\n */\nexport function createImmutableSet<Value>(iterable?: Iterable<Value>): ImmutableSet<Value> {\n const internalSet = new Set(iterable);\n return dangerouslyCreateImmutableSet(internalSet);\n}\n/**\n * Avoid using *dangerouslyCreateImmutableSet*, since this method will expose internally used set, use createImmutableSet instead,\n * @param internalSet - a set that is used internally to store values.\n */\nexport function dangerouslyCreateImmutableSet<Value>(internalSet: Set<Value>): ImmutableSet<Value> {\n return {\n size: internalSet.size,\n add(value) {\n const nextSet = new Set(internalSet);\n nextSet.add(value);\n return dangerouslyCreateImmutableSet(nextSet);\n },\n clear() {\n return emptyImmutableSet;\n },\n delete(value) {\n const nextSet = new Set(internalSet);\n nextSet.delete(value);\n return dangerouslyCreateImmutableSet(nextSet);\n },\n has(value) {\n return internalSet.has(value);\n },\n [Symbol.iterator]() {\n return internalSet[Symbol.iterator]();\n },\n };\n}\n"],"mappings":"AA0BA,OAAO,MAAMA,iBAAA,gBAAoBC,kBAAA;AAEjC;;;AAGA,OAAO,SAASA,mBAA0BC,QAA0B,EAAuB;EACzF,MAAMC,WAAA,GAAc,IAAIC,GAAA,CAAIF,QAAA;EAC5B,OAAOG,6BAAA,CAA8BF,WAAA;AACvC;AACA;;;;AAIA,OAAO,SAASE,8BAAqCF,WAAuB,EAAuB;EACjG,OAAO;IACLG,IAAA,EAAMH,WAAA,CAAYG,IAAI;IACtBC,IAAIC,KAAK,EAAE;MACT,MAAMC,OAAA,GAAU,IAAIL,GAAA,CAAID,WAAA;MACxBM,OAAA,CAAQF,GAAG,CAACC,KAAA;MACZ,OAAOH,6BAAA,CAA8BI,OAAA;IACvC;IACAC,MAAA,EAAQ;MACN,OAAOV,iBAAA;IACT;IACAW,OAAOH,KAAK,EAAE;MACZ,MAAMC,OAAA,GAAU,IAAIL,GAAA,CAAID,WAAA;MACxBM,OAAA,CAAQE,MAAM,CAACH,KAAA;MACf,OAAOH,6BAAA,CAA8BI,OAAA;IACvC;IACAG,IAAIJ,KAAK,EAAE;MACT,OAAOL,WAAA,CAAYS,GAAG,CAACJ,KAAA;IACzB;IACA,CAACK,MAAA,CAAOC,QAAQ,IAAI;MAClB,OAAOX,WAAW,CAACU,MAAA,CAAOC,QAAQ,CAAC;IACrC;EACF;AACF"}
|
package/lib/utils/assert.js
CHANGED
package/lib/utils/assert.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["assertIsDefinedRef","refObject","msg","current","undefined","process","env","NODE_ENV","TypeError"],"sources":["
|
|
1
|
+
{"version":3,"names":["React","assertIsDefinedRef","refObject","msg","current","undefined","process","env","NODE_ENV","TypeError"],"sources":["../../src/utils/assert.ts"],"sourcesContent":["import * as React from 'react';\n\nexport function assertIsDefinedRef<V>(\n refObject: React.RefObject<V | null | undefined>,\n msg = `assertIsDefinedRef: reference not properly defined ${refObject}`,\n): asserts refObject is React.MutableRefObject<V> {\n // eslint-disable-next-line eqeqeq\n if (refObject.current == undefined && process.env.NODE_ENV === 'development') {\n throw new TypeError(msg);\n }\n}\n"],"mappings":"AAAA,YAAYA,KAAA,MAAW;AAEvB,OAAO,SAASC,mBACdC,SAAgD,EAChDC,GAAA,GAAO,sDAAqDD,SAAU,EAAC,EACvB;EAChD;EACA,IAAIA,SAAA,CAAUE,OAAO,IAAIC,SAAA,IAAaC,OAAA,CAAQC,GAAG,CAACC,QAAQ,KAAK,eAAe;IAC5E,MAAM,IAAIC,SAAA,CAAUN,GAAA;EACtB;AACF"}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* creates a list of flat tree items
|
|
3
|
+
* and provides a map to access each item by id
|
|
4
|
+
*/export function createFlatTreeItems(flatTreeItemProps) {
|
|
5
|
+
const root = createFlatTreeRootItem();
|
|
6
|
+
const itemsPerId = new Map([[flatTreeRootId, root]]);
|
|
7
|
+
const items = [];
|
|
8
|
+
for (let index = 0; index < flatTreeItemProps.length; index++) {
|
|
9
|
+
const {
|
|
10
|
+
parentId = flatTreeRootId,
|
|
11
|
+
...treeItemProps
|
|
12
|
+
} = flatTreeItemProps[index];
|
|
13
|
+
const nextItemProps = flatTreeItemProps[index + 1];
|
|
14
|
+
const currentParent = itemsPerId.get(parentId);
|
|
15
|
+
if (!currentParent) {
|
|
16
|
+
if (process.env.NODE_ENV === 'development') {
|
|
17
|
+
// eslint-disable-next-line no-console
|
|
18
|
+
console.error(`useFlatTree: item ${flatTreeItemProps[index].id} is wrongly positioned, did you properly ordered provided item props? make sure provided items are organized`);
|
|
19
|
+
}
|
|
20
|
+
break;
|
|
21
|
+
}
|
|
22
|
+
const isLeaf = (nextItemProps === null || nextItemProps === void 0 ? void 0 : nextItemProps.parentId) !== treeItemProps.id;
|
|
23
|
+
var _currentParent_level;
|
|
24
|
+
const currentLevel = ((_currentParent_level = currentParent.level) !== null && _currentParent_level !== void 0 ? _currentParent_level : 0) + 1;
|
|
25
|
+
const currentChildrenSize = ++currentParent.childrenSize;
|
|
26
|
+
const flatTreeItem = {
|
|
27
|
+
id: treeItemProps.id,
|
|
28
|
+
getTreeItemProps: () => ({
|
|
29
|
+
...treeItemProps,
|
|
30
|
+
'aria-level': currentLevel,
|
|
31
|
+
'aria-posinset': currentChildrenSize,
|
|
32
|
+
'aria-setsize': currentParent.childrenSize,
|
|
33
|
+
leaf: isLeaf
|
|
34
|
+
}),
|
|
35
|
+
level: currentLevel,
|
|
36
|
+
parentId,
|
|
37
|
+
childrenSize: 0,
|
|
38
|
+
index: -1
|
|
39
|
+
};
|
|
40
|
+
itemsPerId.set(flatTreeItem.id, flatTreeItem);
|
|
41
|
+
items.push(flatTreeItem);
|
|
42
|
+
}
|
|
43
|
+
return {
|
|
44
|
+
root,
|
|
45
|
+
size: items.length,
|
|
46
|
+
getByIndex: index => items[index],
|
|
47
|
+
get: id => itemsPerId.get(id),
|
|
48
|
+
set: (id, value) => itemsPerId.set(id, value)
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
export const flatTreeRootId = '__fuiFlatTreeRoot';
|
|
52
|
+
function createFlatTreeRootItem() {
|
|
53
|
+
return {
|
|
54
|
+
id: flatTreeRootId,
|
|
55
|
+
getTreeItemProps: () => {
|
|
56
|
+
if (process.env.NODE_ENV !== 'production') {
|
|
57
|
+
// eslint-disable-next-line no-console
|
|
58
|
+
console.error('useFlatTree: internal error, trying to access treeitem props from invalid root element');
|
|
59
|
+
}
|
|
60
|
+
return {
|
|
61
|
+
id: flatTreeRootId,
|
|
62
|
+
'aria-setsize': -1,
|
|
63
|
+
'aria-level': -1,
|
|
64
|
+
'aria-posinset': -1,
|
|
65
|
+
leaf: true
|
|
66
|
+
};
|
|
67
|
+
},
|
|
68
|
+
childrenSize: 0,
|
|
69
|
+
get index() {
|
|
70
|
+
if (process.env.NODE_ENV !== 'production') {
|
|
71
|
+
// eslint-disable-next-line no-console
|
|
72
|
+
console.error('useFlatTree: internal error, trying to access treeitem props from invalid root element');
|
|
73
|
+
}
|
|
74
|
+
return -1;
|
|
75
|
+
},
|
|
76
|
+
level: 0
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
// eslint-disable-next-line @typescript-eslint/naming-convention
|
|
80
|
+
export function* VisibleFlatTreeItemGenerator(openItems, flatTreeItems) {
|
|
81
|
+
for (let index = 0, visibleIndex = 0; index < flatTreeItems.size; index++) {
|
|
82
|
+
const item = flatTreeItems.getByIndex(index);
|
|
83
|
+
var _flatTreeItems_get;
|
|
84
|
+
const parent = item.parentId ? (_flatTreeItems_get = flatTreeItems.get(item.parentId)) !== null && _flatTreeItems_get !== void 0 ? _flatTreeItems_get : flatTreeItems.root : flatTreeItems.root;
|
|
85
|
+
if (isItemVisible(item, openItems, flatTreeItems)) {
|
|
86
|
+
item.index = visibleIndex++;
|
|
87
|
+
yield item;
|
|
88
|
+
} else {
|
|
89
|
+
index += parent.childrenSize - 1 + item.childrenSize;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
function isItemVisible(item, openItems, flatTreeItems) {
|
|
94
|
+
if (item.level === 1) {
|
|
95
|
+
return true;
|
|
96
|
+
}
|
|
97
|
+
while (item.parentId && item.parentId !== flatTreeItems.root.id) {
|
|
98
|
+
if (!openItems.has(item.parentId)) {
|
|
99
|
+
return false;
|
|
100
|
+
}
|
|
101
|
+
const parent = flatTreeItems.get(item.parentId);
|
|
102
|
+
if (!parent) {
|
|
103
|
+
return false;
|
|
104
|
+
}
|
|
105
|
+
item = parent;
|
|
106
|
+
}
|
|
107
|
+
return true;
|
|
108
|
+
}
|
|
109
|
+
//# sourceMappingURL=createFlatTreeItems.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["createFlatTreeItems","flatTreeItemProps","root","createFlatTreeRootItem","itemsPerId","Map","flatTreeRootId","items","index","length","parentId","treeItemProps","nextItemProps","currentParent","get","process","env","NODE_ENV","console","error","id","isLeaf","_currentParent_level","currentLevel","level","currentChildrenSize","childrenSize","flatTreeItem","getTreeItemProps","leaf","set","push","size","getByIndex","value","VisibleFlatTreeItemGenerator","openItems","flatTreeItems","visibleIndex","item","_flatTreeItems_get","parent","isItemVisible","has"],"sources":["../../src/utils/createFlatTreeItems.ts"],"sourcesContent":["import type { TreeItemId } from '../TreeItem';\nimport type { ImmutableSet } from './ImmutableSet';\nimport type { FlatTreeItem, FlatTreeItemProps, MutableFlatTreeItem } from '../hooks/useFlatTree';\n\n/**\n * @internal\n */\nexport type FlatTreeItems = {\n size: number;\n root: FlatTreeItem;\n get(id: string): FlatTreeItem | undefined;\n set(id: string, value: FlatTreeItem): void;\n getByIndex(index: number): FlatTreeItem;\n};\n\n/**\n * creates a list of flat tree items\n * and provides a map to access each item by id\n */\nexport function createFlatTreeItems(flatTreeItemProps: FlatTreeItemProps[]): FlatTreeItems {\n const root = createFlatTreeRootItem();\n const itemsPerId = new Map<string, MutableFlatTreeItem>([[flatTreeRootId, root]]);\n const items: MutableFlatTreeItem[] = [];\n\n for (let index = 0; index < flatTreeItemProps.length; index++) {\n const { parentId = flatTreeRootId, ...treeItemProps } = flatTreeItemProps[index];\n\n const nextItemProps: FlatTreeItemProps | undefined = flatTreeItemProps[index + 1];\n const currentParent = itemsPerId.get(parentId);\n if (!currentParent) {\n if (process.env.NODE_ENV === 'development') {\n // eslint-disable-next-line no-console\n console.error(\n `useFlatTree: item ${flatTreeItemProps[index].id} is wrongly positioned, did you properly ordered provided item props? make sure provided items are organized`,\n );\n }\n break;\n }\n const isLeaf = nextItemProps?.parentId !== treeItemProps.id;\n const currentLevel = (currentParent.level ?? 0) + 1;\n const currentChildrenSize = ++currentParent.childrenSize;\n\n const flatTreeItem: FlatTreeItem = {\n id: treeItemProps.id,\n getTreeItemProps: () => ({\n ...treeItemProps,\n 'aria-level': currentLevel,\n 'aria-posinset': currentChildrenSize,\n 'aria-setsize': currentParent.childrenSize,\n leaf: isLeaf,\n }),\n level: currentLevel,\n parentId,\n childrenSize: 0,\n index: -1,\n };\n itemsPerId.set(flatTreeItem.id, flatTreeItem);\n items.push(flatTreeItem);\n }\n\n return {\n root,\n size: items.length,\n getByIndex: index => items[index],\n get: id => itemsPerId.get(id),\n set: (id, value) => itemsPerId.set(id, value),\n };\n}\n\nexport const flatTreeRootId = '__fuiFlatTreeRoot';\n\nfunction createFlatTreeRootItem(): FlatTreeItem {\n return {\n id: flatTreeRootId,\n getTreeItemProps: () => {\n if (process.env.NODE_ENV !== 'production') {\n // eslint-disable-next-line no-console\n console.error('useFlatTree: internal error, trying to access treeitem props from invalid root element');\n }\n return { id: flatTreeRootId, 'aria-setsize': -1, 'aria-level': -1, 'aria-posinset': -1, leaf: true };\n },\n childrenSize: 0,\n get index() {\n if (process.env.NODE_ENV !== 'production') {\n // eslint-disable-next-line no-console\n console.error('useFlatTree: internal error, trying to access treeitem props from invalid root element');\n }\n return -1;\n },\n level: 0,\n };\n}\n\n// eslint-disable-next-line @typescript-eslint/naming-convention\nexport function* VisibleFlatTreeItemGenerator(openItems: ImmutableSet<TreeItemId>, flatTreeItems: FlatTreeItems) {\n for (let index = 0, visibleIndex = 0; index < flatTreeItems.size; index++) {\n const item: MutableFlatTreeItem = flatTreeItems.getByIndex(index);\n const parent = item.parentId ? flatTreeItems.get(item.parentId) ?? flatTreeItems.root : flatTreeItems.root;\n if (isItemVisible(item, openItems, flatTreeItems)) {\n item.index = visibleIndex++;\n yield item;\n } else {\n index += parent.childrenSize - 1 + item.childrenSize;\n }\n }\n}\n\nfunction isItemVisible(item: FlatTreeItem, openItems: ImmutableSet<TreeItemId>, flatTreeItems: FlatTreeItems) {\n if (item.level === 1) {\n return true;\n }\n while (item.parentId && item.parentId !== flatTreeItems.root.id) {\n if (!openItems.has(item.parentId)) {\n return false;\n }\n const parent = flatTreeItems.get(item.parentId);\n if (!parent) {\n return false;\n }\n item = parent;\n }\n return true;\n}\n"],"mappings":"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"}
|