@fluentui/react-tree 9.2.1 → 9.4.0
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/CHANGELOG.json +258 -1
- package/CHANGELOG.md +67 -2
- package/dist/index.d.ts +49 -20
- package/lib/components/FlatTree/FlatTree.types.js.map +1 -1
- package/lib/components/FlatTree/renderFlatTree.js.map +1 -1
- package/lib/components/FlatTree/useFlatTree.js +71 -2
- package/lib/components/FlatTree/useFlatTree.js.map +1 -1
- package/lib/components/FlatTree/useFlatTreeContextValues.js +20 -2
- package/lib/components/FlatTree/useFlatTreeContextValues.js.map +1 -1
- package/lib/components/FlatTree/useFlatTreeNavigation.js +28 -14
- package/lib/components/FlatTree/useFlatTreeNavigation.js.map +1 -1
- package/lib/components/FlatTree/useHeadlessFlatTree.js +16 -16
- package/lib/components/FlatTree/useHeadlessFlatTree.js.map +1 -1
- package/lib/components/Tree/Tree.types.js.map +1 -1
- package/lib/components/Tree/renderTree.js +1 -1
- package/lib/components/Tree/renderTree.js.map +1 -1
- package/lib/components/Tree/useTree.js +11 -14
- package/lib/components/Tree/useTree.js.map +1 -1
- package/lib/components/Tree/useTreeContextValues.js +29 -15
- package/lib/components/Tree/useTreeContextValues.js.map +1 -1
- package/lib/components/TreeItem/TreeItem.types.js.map +1 -1
- package/lib/components/TreeItem/useTreeItem.js +52 -26
- package/lib/components/TreeItem/useTreeItem.js.map +1 -1
- package/lib/components/TreeItemLayout/useTreeItemLayout.js +2 -3
- package/lib/components/TreeItemLayout/useTreeItemLayout.js.map +1 -1
- package/lib/components/TreeProvider.js +21 -0
- package/lib/components/TreeProvider.js.map +1 -0
- package/lib/contexts/index.js +1 -0
- package/lib/contexts/index.js.map +1 -1
- package/lib/contexts/subtreeContext.js +14 -0
- package/lib/contexts/subtreeContext.js.map +1 -0
- package/lib/contexts/treeContext.js +9 -5
- package/lib/contexts/treeContext.js.map +1 -1
- package/lib/hooks/useRootTree.js +25 -78
- package/lib/hooks/useRootTree.js.map +1 -1
- package/lib/hooks/useSubtree.js +2 -14
- package/lib/hooks/useSubtree.js.map +1 -1
- package/lib/index.js +2 -1
- package/lib/index.js.map +1 -1
- package/lib/utils/createHTMLElementWalker.js +2 -3
- package/lib/utils/createHTMLElementWalker.js.map +1 -1
- package/lib/utils/createHeadlessTree.js +5 -3
- package/lib/utils/createHeadlessTree.js.map +1 -1
- package/lib/utils/flattenTree.js +1 -2
- package/lib/utils/flattenTree.js.map +1 -1
- package/lib/utils/normalizeOpenItems.js +1 -2
- package/lib/utils/normalizeOpenItems.js.map +1 -1
- package/lib-commonjs/components/FlatTree/useFlatTree.js +71 -2
- package/lib-commonjs/components/FlatTree/useFlatTree.js.map +1 -1
- package/lib-commonjs/components/FlatTree/useFlatTreeContextValues.js +20 -2
- package/lib-commonjs/components/FlatTree/useFlatTreeContextValues.js.map +1 -1
- package/lib-commonjs/components/FlatTree/useFlatTreeNavigation.js +27 -13
- package/lib-commonjs/components/FlatTree/useFlatTreeNavigation.js.map +1 -1
- package/lib-commonjs/components/FlatTree/useHeadlessFlatTree.js +16 -16
- package/lib-commonjs/components/FlatTree/useHeadlessFlatTree.js.map +1 -1
- package/lib-commonjs/components/Tree/renderTree.js +2 -2
- package/lib-commonjs/components/Tree/renderTree.js.map +1 -1
- package/lib-commonjs/components/Tree/useTree.js +11 -14
- package/lib-commonjs/components/Tree/useTree.js.map +1 -1
- package/lib-commonjs/components/Tree/useTreeContextValues.js +30 -15
- package/lib-commonjs/components/Tree/useTreeContextValues.js.map +1 -1
- package/lib-commonjs/components/TreeItem/useTreeItem.js +55 -29
- package/lib-commonjs/components/TreeItem/useTreeItem.js.map +1 -1
- package/lib-commonjs/components/TreeItemLayout/useTreeItemLayout.js +2 -3
- package/lib-commonjs/components/TreeItemLayout/useTreeItemLayout.js.map +1 -1
- package/lib-commonjs/components/TreeProvider.js +32 -0
- package/lib-commonjs/components/TreeProvider.js.map +1 -0
- package/lib-commonjs/contexts/index.js +1 -0
- package/lib-commonjs/contexts/index.js.map +1 -1
- package/lib-commonjs/contexts/subtreeContext.js +31 -0
- package/lib-commonjs/contexts/subtreeContext.js.map +1 -0
- package/lib-commonjs/contexts/treeContext.js +6 -7
- package/lib-commonjs/contexts/treeContext.js.map +1 -1
- package/lib-commonjs/hooks/useRootTree.js +25 -78
- package/lib-commonjs/hooks/useRootTree.js.map +1 -1
- package/lib-commonjs/hooks/useSubtree.js +2 -14
- package/lib-commonjs/hooks/useSubtree.js.map +1 -1
- package/lib-commonjs/index.js +7 -3
- package/lib-commonjs/index.js.map +1 -1
- package/lib-commonjs/utils/createHTMLElementWalker.js +2 -3
- package/lib-commonjs/utils/createHTMLElementWalker.js.map +1 -1
- package/lib-commonjs/utils/createHeadlessTree.js +5 -3
- package/lib-commonjs/utils/createHeadlessTree.js.map +1 -1
- package/lib-commonjs/utils/flattenTree.js +1 -2
- package/lib-commonjs/utils/flattenTree.js.map +1 -1
- package/lib-commonjs/utils/normalizeOpenItems.js +1 -2
- package/lib-commonjs/utils/normalizeOpenItems.js.map +1 -1
- package/package.json +15 -15
|
@@ -26,7 +26,7 @@ function useHeadlessFlatTree_unstable(props, options = {}) {
|
|
|
26
26
|
]);
|
|
27
27
|
const [openItems, setOpenItems] = (0, _useControllableOpenItems.useControllableOpenItems)(options);
|
|
28
28
|
const [checkedItems, setCheckedItems] = (0, _useFlatControllableCheckedItems.useFlatControllableCheckedItems)(options, headlessTree);
|
|
29
|
-
const { initialize, navigate } = (0, _useFlatTreeNavigation.useFlatTreeNavigation)(
|
|
29
|
+
const { initialize, navigate } = (0, _useFlatTreeNavigation.useFlatTreeNavigation)();
|
|
30
30
|
const { targetDocument } = (0, _reactsharedcontexts.useFluent_unstable)();
|
|
31
31
|
const walkerRef = _react.useRef();
|
|
32
32
|
const initializeWalker = _react.useCallback((root)=>{
|
|
@@ -40,30 +40,23 @@ function useHeadlessFlatTree_unstable(props, options = {}) {
|
|
|
40
40
|
]);
|
|
41
41
|
const treeRef = _react.useRef(null);
|
|
42
42
|
const handleOpenChange = (0, _reactutilities.useEventCallback)((event, data)=>{
|
|
43
|
-
var _options_onOpenChange
|
|
43
|
+
var _options_onOpenChange;
|
|
44
44
|
const nextOpenItems = (0, _useControllableOpenItems.createNextOpenItems)(data, openItems);
|
|
45
|
-
(_options_onOpenChange =
|
|
45
|
+
(_options_onOpenChange = options.onOpenChange) === null || _options_onOpenChange === void 0 ? void 0 : _options_onOpenChange.call(options, event, {
|
|
46
46
|
...data,
|
|
47
47
|
openItems: nextOpenItems.dangerouslyGetInternalSet_unstable()
|
|
48
48
|
});
|
|
49
49
|
setOpenItems(nextOpenItems);
|
|
50
50
|
});
|
|
51
51
|
const handleCheckedChange = (0, _reactutilities.useEventCallback)((event, data)=>{
|
|
52
|
-
var _options_onCheckedChange
|
|
52
|
+
var _options_onCheckedChange;
|
|
53
53
|
const nextCheckedItems = (0, _useFlatControllableCheckedItems.createNextFlatCheckedItems)(data, checkedItems, headlessTree);
|
|
54
|
-
(_options_onCheckedChange =
|
|
54
|
+
(_options_onCheckedChange = options.onCheckedChange) === null || _options_onCheckedChange === void 0 ? void 0 : _options_onCheckedChange.call(options, event, {
|
|
55
55
|
...data,
|
|
56
56
|
checkedItems: nextCheckedItems.dangerouslyGetInternalMap_unstable()
|
|
57
57
|
});
|
|
58
58
|
setCheckedItems(nextCheckedItems);
|
|
59
59
|
});
|
|
60
|
-
const handleNavigation = (0, _reactutilities.useEventCallback)((event, data)=>{
|
|
61
|
-
var _options_onNavigation, _options;
|
|
62
|
-
(_options_onNavigation = (_options = options).onNavigation) === null || _options_onNavigation === void 0 ? void 0 : _options_onNavigation.call(_options, event, data);
|
|
63
|
-
if (walkerRef.current) {
|
|
64
|
-
navigate(data, walkerRef.current);
|
|
65
|
-
}
|
|
66
|
-
});
|
|
67
60
|
const getNextNavigableItem = (0, _reactutilities.useEventCallback)((visibleItems, data)=>{
|
|
68
61
|
const item = headlessTree.get(data.value);
|
|
69
62
|
if (item) {
|
|
@@ -90,17 +83,22 @@ function useHeadlessFlatTree_unstable(props, options = {}) {
|
|
|
90
83
|
return (_treeRef_current = treeRef.current) === null || _treeRef_current === void 0 ? void 0 : _treeRef_current.querySelector(`[${_getTreeItemValueFromElement.dataTreeItemValueAttrName}="${item.value}"]`);
|
|
91
84
|
}, []);
|
|
92
85
|
const ref = (0, _reactutilities.useMergedRefs)(treeRef, initializeWalker);
|
|
93
|
-
const getTreeProps = _react.useCallback(()=>
|
|
86
|
+
const getTreeProps = _react.useCallback(()=>{
|
|
87
|
+
var _options_onNavigation;
|
|
88
|
+
return {
|
|
94
89
|
ref,
|
|
95
90
|
openItems,
|
|
96
91
|
selectionMode: options.selectionMode,
|
|
97
92
|
checkedItems,
|
|
98
93
|
onOpenChange: handleOpenChange,
|
|
99
94
|
onCheckedChange: handleCheckedChange,
|
|
100
|
-
onNavigation:
|
|
101
|
-
}
|
|
95
|
+
onNavigation: (_options_onNavigation = options.onNavigation) !== null && _options_onNavigation !== void 0 ? _options_onNavigation : noop
|
|
96
|
+
};
|
|
97
|
+
}, [
|
|
102
98
|
openItems,
|
|
103
|
-
checkedItems
|
|
99
|
+
checkedItems,
|
|
100
|
+
options.selectionMode,
|
|
101
|
+
options.onNavigation
|
|
104
102
|
]);
|
|
105
103
|
const items = _react.useCallback(()=>headlessTree.visibleItems(openItems), [
|
|
106
104
|
openItems,
|
|
@@ -124,3 +122,5 @@ function useHeadlessFlatTree_unstable(props, options = {}) {
|
|
|
124
122
|
items
|
|
125
123
|
]);
|
|
126
124
|
}
|
|
125
|
+
function noop() {
|
|
126
|
+
/* noop */ }
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["useHeadlessFlatTree.js"],"sourcesContent":["import { useEventCallback, useMergedRefs } from '@fluentui/react-utilities';\nimport * as React from 'react';\nimport { createHeadlessTree } from '../../utils/createHeadlessTree';\nimport { treeDataTypes } from '../../utils/tokens';\nimport { useFlatTreeNavigation } from './useFlatTreeNavigation';\nimport { createNextOpenItems, useControllableOpenItems } from '../../hooks/useControllableOpenItems';\nimport { dataTreeItemValueAttrName } from '../../utils/getTreeItemValueFromElement';\nimport { createNextFlatCheckedItems, useFlatControllableCheckedItems } from './useFlatControllableCheckedItems';\nimport { createHTMLElementWalker } from '../../utils/createHTMLElementWalker';\nimport { treeItemFilter } from '../../utils/treeItemFilter';\nimport { useFluent_unstable } from '@fluentui/react-shared-contexts';\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 props - a list of tree items\n * @param options - in case control over the internal openItems is required\n */ export function useHeadlessFlatTree_unstable(props, options = {}) {\n const headlessTree = React.useMemo(()=>createHeadlessTree(props), [\n props\n ]);\n const [openItems, setOpenItems] = useControllableOpenItems(options);\n const [checkedItems, setCheckedItems] = useFlatControllableCheckedItems(options, headlessTree);\n const { initialize, navigate } = useFlatTreeNavigation(headlessTree);\n const { targetDocument } = useFluent_unstable();\n const walkerRef = React.useRef();\n const initializeWalker = React.useCallback((root)=>{\n if (root && targetDocument) {\n walkerRef.current = createHTMLElementWalker(root, targetDocument, treeItemFilter);\n initialize(walkerRef.current);\n }\n }, [\n initialize,\n targetDocument\n ]);\n const treeRef = React.useRef(null);\n const handleOpenChange = useEventCallback((event, data)=>{\n var _options_onOpenChange, _options;\n const nextOpenItems = createNextOpenItems(data, openItems);\n (_options_onOpenChange = (_options = options).onOpenChange) === null || _options_onOpenChange === void 0 ? void 0 : _options_onOpenChange.call(_options, event, {\n ...data,\n openItems: nextOpenItems.dangerouslyGetInternalSet_unstable()\n });\n setOpenItems(nextOpenItems);\n });\n const handleCheckedChange = useEventCallback((event, data)=>{\n var _options_onCheckedChange, _options;\n const nextCheckedItems = createNextFlatCheckedItems(data, checkedItems, headlessTree);\n (_options_onCheckedChange = (_options = options).onCheckedChange) === null || _options_onCheckedChange === void 0 ? void 0 : _options_onCheckedChange.call(_options, event, {\n ...data,\n checkedItems: nextCheckedItems.dangerouslyGetInternalMap_unstable()\n });\n setCheckedItems(nextCheckedItems);\n });\n const handleNavigation = useEventCallback((event, data)=>{\n var _options_onNavigation, _options;\n (_options_onNavigation = (_options = options).onNavigation) === null || _options_onNavigation === void 0 ? void 0 : _options_onNavigation.call(_options, event, data);\n if (walkerRef.current) {\n navigate(data, walkerRef.current);\n }\n });\n const getNextNavigableItem = useEventCallback((visibleItems, data)=>{\n const item = headlessTree.get(data.value);\n if (item) {\n switch(data.type){\n case treeDataTypes.TypeAhead:\n return item;\n case treeDataTypes.ArrowLeft:\n return headlessTree.get(item.parentValue);\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 const getElementFromItem = React.useCallback((item)=>{\n var _treeRef_current;\n return (_treeRef_current = treeRef.current) === null || _treeRef_current === void 0 ? void 0 : _treeRef_current.querySelector(`[${dataTreeItemValueAttrName}=\"${item.value}\"]`);\n }, []);\n const ref = useMergedRefs(treeRef, initializeWalker);\n const getTreeProps = React.useCallback(()=>({\n ref,\n openItems,\n selectionMode: options.selectionMode,\n checkedItems,\n onOpenChange: handleOpenChange,\n onCheckedChange: handleCheckedChange,\n onNavigation: handleNavigation\n }), // eslint-disable-next-line react-hooks/exhaustive-deps\n [\n openItems,\n checkedItems\n ]);\n const items = React.useCallback(()=>headlessTree.visibleItems(openItems), [\n openItems,\n headlessTree\n ]);\n return React.useMemo(()=>({\n navigate: (data)=>{\n if (walkerRef.current) {\n navigate(data, walkerRef.current);\n }\n },\n getTreeProps,\n getNextNavigableItem,\n getElementFromItem,\n items\n }), [\n navigate,\n getTreeProps,\n getNextNavigableItem,\n getElementFromItem,\n items\n ]);\n}\n"],"names":["useHeadlessFlatTree_unstable","props","options","headlessTree","React","useMemo","createHeadlessTree","openItems","setOpenItems","useControllableOpenItems","checkedItems","setCheckedItems","useFlatControllableCheckedItems","initialize","navigate","useFlatTreeNavigation","targetDocument","useFluent_unstable","walkerRef","useRef","initializeWalker","useCallback","root","current","createHTMLElementWalker","treeItemFilter","treeRef","handleOpenChange","useEventCallback","event","data","_options_onOpenChange","_options","nextOpenItems","createNextOpenItems","onOpenChange","call","dangerouslyGetInternalSet_unstable","handleCheckedChange","_options_onCheckedChange","nextCheckedItems","createNextFlatCheckedItems","onCheckedChange","dangerouslyGetInternalMap_unstable","handleNavigation","_options_onNavigation","onNavigation","getNextNavigableItem","visibleItems","item","get","value","type","treeDataTypes","TypeAhead","ArrowLeft","parentValue","ArrowRight","index","End","length","Home","ArrowDown","ArrowUp","getElementFromItem","_treeRef_current","querySelector","dataTreeItemValueAttrName","ref","useMergedRefs","getTreeProps","selectionMode","items"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["useHeadlessFlatTree.js"],"sourcesContent":["import { useEventCallback, useMergedRefs } from '@fluentui/react-utilities';\nimport * as React from 'react';\nimport { createHeadlessTree } from '../../utils/createHeadlessTree';\nimport { treeDataTypes } from '../../utils/tokens';\nimport { useFlatTreeNavigation } from './useFlatTreeNavigation';\nimport { createNextOpenItems, useControllableOpenItems } from '../../hooks/useControllableOpenItems';\nimport { dataTreeItemValueAttrName } from '../../utils/getTreeItemValueFromElement';\nimport { createNextFlatCheckedItems, useFlatControllableCheckedItems } from './useFlatControllableCheckedItems';\nimport { createHTMLElementWalker } from '../../utils/createHTMLElementWalker';\nimport { treeItemFilter } from '../../utils/treeItemFilter';\nimport { useFluent_unstable } from '@fluentui/react-shared-contexts';\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 props - a list of tree items\n * @param options - in case control over the internal openItems is required\n */ export function useHeadlessFlatTree_unstable(props, options = {}) {\n const headlessTree = React.useMemo(()=>createHeadlessTree(props), [\n props\n ]);\n const [openItems, setOpenItems] = useControllableOpenItems(options);\n const [checkedItems, setCheckedItems] = useFlatControllableCheckedItems(options, headlessTree);\n const { initialize, navigate } = useFlatTreeNavigation();\n const { targetDocument } = useFluent_unstable();\n const walkerRef = React.useRef();\n const initializeWalker = React.useCallback((root)=>{\n if (root && targetDocument) {\n walkerRef.current = createHTMLElementWalker(root, targetDocument, treeItemFilter);\n initialize(walkerRef.current);\n }\n }, [\n initialize,\n targetDocument\n ]);\n const treeRef = React.useRef(null);\n const handleOpenChange = useEventCallback((event, data)=>{\n var _options_onOpenChange;\n const nextOpenItems = createNextOpenItems(data, openItems);\n (_options_onOpenChange = options.onOpenChange) === null || _options_onOpenChange === void 0 ? void 0 : _options_onOpenChange.call(options, event, {\n ...data,\n openItems: nextOpenItems.dangerouslyGetInternalSet_unstable()\n });\n setOpenItems(nextOpenItems);\n });\n const handleCheckedChange = useEventCallback((event, data)=>{\n var _options_onCheckedChange;\n const nextCheckedItems = createNextFlatCheckedItems(data, checkedItems, headlessTree);\n (_options_onCheckedChange = options.onCheckedChange) === null || _options_onCheckedChange === void 0 ? void 0 : _options_onCheckedChange.call(options, event, {\n ...data,\n checkedItems: nextCheckedItems.dangerouslyGetInternalMap_unstable()\n });\n setCheckedItems(nextCheckedItems);\n });\n const getNextNavigableItem = useEventCallback((visibleItems, data)=>{\n const item = headlessTree.get(data.value);\n if (item) {\n switch(data.type){\n case treeDataTypes.TypeAhead:\n return item;\n case treeDataTypes.ArrowLeft:\n return headlessTree.get(item.parentValue);\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 const getElementFromItem = React.useCallback((item)=>{\n var _treeRef_current;\n return (_treeRef_current = treeRef.current) === null || _treeRef_current === void 0 ? void 0 : _treeRef_current.querySelector(`[${dataTreeItemValueAttrName}=\"${item.value}\"]`);\n }, []);\n const ref = useMergedRefs(treeRef, initializeWalker);\n const getTreeProps = React.useCallback(()=>{\n var _options_onNavigation;\n return {\n ref,\n openItems,\n selectionMode: options.selectionMode,\n checkedItems,\n onOpenChange: handleOpenChange,\n onCheckedChange: handleCheckedChange,\n onNavigation: (_options_onNavigation = options.onNavigation) !== null && _options_onNavigation !== void 0 ? _options_onNavigation : noop\n };\n }, // eslint-disable-next-line react-hooks/exhaustive-deps\n [\n openItems,\n checkedItems,\n options.selectionMode,\n options.onNavigation\n ]);\n const items = React.useCallback(()=>headlessTree.visibleItems(openItems), [\n openItems,\n headlessTree\n ]);\n return React.useMemo(()=>({\n navigate: (data)=>{\n if (walkerRef.current) {\n navigate(data, walkerRef.current);\n }\n },\n getTreeProps,\n getNextNavigableItem,\n getElementFromItem,\n items\n }), [\n navigate,\n getTreeProps,\n getNextNavigableItem,\n getElementFromItem,\n items\n ]);\n}\nfunction noop() {\n/* noop */ }\n"],"names":["useHeadlessFlatTree_unstable","props","options","headlessTree","React","useMemo","createHeadlessTree","openItems","setOpenItems","useControllableOpenItems","checkedItems","setCheckedItems","useFlatControllableCheckedItems","initialize","navigate","useFlatTreeNavigation","targetDocument","useFluent_unstable","walkerRef","useRef","initializeWalker","useCallback","root","current","createHTMLElementWalker","treeItemFilter","treeRef","handleOpenChange","useEventCallback","event","data","_options_onOpenChange","nextOpenItems","createNextOpenItems","onOpenChange","call","dangerouslyGetInternalSet_unstable","handleCheckedChange","_options_onCheckedChange","nextCheckedItems","createNextFlatCheckedItems","onCheckedChange","dangerouslyGetInternalMap_unstable","getNextNavigableItem","visibleItems","item","get","value","type","treeDataTypes","TypeAhead","ArrowLeft","parentValue","ArrowRight","index","End","length","Home","ArrowDown","ArrowUp","getElementFromItem","_treeRef_current","querySelector","dataTreeItemValueAttrName","ref","useMergedRefs","getTreeProps","_options_onNavigation","selectionMode","onNavigation","noop","items"],"mappings":"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"}
|
|
@@ -10,10 +10,10 @@ Object.defineProperty(exports, "renderTree_unstable", {
|
|
|
10
10
|
});
|
|
11
11
|
const _jsxruntime = require("@fluentui/react-jsx-runtime/jsx-runtime");
|
|
12
12
|
const _reactutilities = require("@fluentui/react-utilities");
|
|
13
|
-
const
|
|
13
|
+
const _TreeProvider = require("../TreeProvider");
|
|
14
14
|
const renderTree_unstable = (state, contextValues)=>{
|
|
15
15
|
(0, _reactutilities.assertSlots)(state);
|
|
16
|
-
return /*#__PURE__*/ (0, _jsxruntime.jsx)(
|
|
16
|
+
return /*#__PURE__*/ (0, _jsxruntime.jsx)(_TreeProvider.TreeProvider, {
|
|
17
17
|
value: contextValues.tree,
|
|
18
18
|
children: state.open && /*#__PURE__*/ (0, _jsxruntime.jsx)(state.root, {
|
|
19
19
|
children: state.root.children
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["renderTree.js"],"sourcesContent":[" import { jsx as _jsx } from \"@fluentui/react-jsx-runtime/jsx-runtime\";\nimport { assertSlots } from '@fluentui/react-utilities';\nimport { TreeProvider } from '
|
|
1
|
+
{"version":3,"sources":["renderTree.js"],"sourcesContent":[" import { jsx as _jsx } from \"@fluentui/react-jsx-runtime/jsx-runtime\";\nimport { assertSlots } from '@fluentui/react-utilities';\nimport { TreeProvider } from '../TreeProvider';\nexport const renderTree_unstable = (state, contextValues)=>{\n assertSlots(state);\n return /*#__PURE__*/ _jsx(TreeProvider, {\n value: contextValues.tree,\n children: state.open && /*#__PURE__*/ _jsx(state.root, {\n children: state.root.children\n })\n });\n};\n"],"names":["renderTree_unstable","state","contextValues","assertSlots","_jsx","TreeProvider","value","tree","children","open","root"],"mappings":";;;;+BAGaA;;;eAAAA;;;4BAHiB;gCACF;8BACC;AACtB,MAAMA,sBAAsB,CAACC,OAAOC;IACvCC,IAAAA,2BAAW,EAACF;IACZ,OAAO,WAAW,GAAGG,IAAAA,eAAI,EAACC,0BAAY,EAAE;QACpCC,OAAOJ,cAAcK,IAAI;QACzBC,UAAUP,MAAMQ,IAAI,IAAI,WAAW,GAAGL,IAAAA,eAAI,EAACH,MAAMS,IAAI,EAAE;YACnDF,UAAUP,MAAMS,IAAI,CAACF,QAAQ;QACjC;IACJ;AACJ"}
|
|
@@ -13,7 +13,7 @@ const _react = /*#__PURE__*/ _interop_require_wildcard._(require("react"));
|
|
|
13
13
|
const _reactutilities = require("@fluentui/react-utilities");
|
|
14
14
|
const _useControllableOpenItems = require("../../hooks/useControllableOpenItems");
|
|
15
15
|
const _useNestedControllableCheckedItems = require("./useNestedControllableCheckedItems");
|
|
16
|
-
const
|
|
16
|
+
const _subtreeContext = require("../../contexts/subtreeContext");
|
|
17
17
|
const _useRootTree = require("../../hooks/useRootTree");
|
|
18
18
|
const _useSubtree = require("../../hooks/useSubtree");
|
|
19
19
|
const _createHTMLElementWalker = require("../../utils/createHTMLElementWalker");
|
|
@@ -21,14 +21,11 @@ const _treeItemFilter = require("../../utils/treeItemFilter");
|
|
|
21
21
|
const _useTreeNavigation = require("./useTreeNavigation");
|
|
22
22
|
const _reactsharedcontexts = require("@fluentui/react-shared-contexts");
|
|
23
23
|
const useTree_unstable = (props, ref)=>{
|
|
24
|
-
const
|
|
25
|
-
// as
|
|
24
|
+
const { level } = (0, _subtreeContext.useSubtreeContext_unstable)();
|
|
25
|
+
// as level is static, this doesn't break rule of hooks
|
|
26
26
|
// and if this becomes an issue later on, this can be easily converted
|
|
27
27
|
// eslint-disable-next-line react-hooks/rules-of-hooks
|
|
28
|
-
return
|
|
29
|
-
...(0, _useSubtree.useSubtree)(props, ref),
|
|
30
|
-
treeType: 'nested'
|
|
31
|
-
} : useNestedRootTree(props, ref);
|
|
28
|
+
return level > 0 ? (0, _useSubtree.useSubtree)(props, ref) : useNestedRootTree(props, ref);
|
|
32
29
|
};
|
|
33
30
|
function useNestedRootTree(props, ref) {
|
|
34
31
|
const [openItems, setOpenItems] = (0, _useControllableOpenItems.useControllableOpenItems)(props);
|
|
@@ -46,9 +43,9 @@ function useNestedRootTree(props, ref) {
|
|
|
46
43
|
targetDocument
|
|
47
44
|
]);
|
|
48
45
|
const handleOpenChange = (0, _reactutilities.useEventCallback)((event, data)=>{
|
|
49
|
-
var _props_onOpenChange
|
|
46
|
+
var _props_onOpenChange;
|
|
50
47
|
const nextOpenItems = (0, _useControllableOpenItems.createNextOpenItems)(data, openItems);
|
|
51
|
-
(_props_onOpenChange =
|
|
48
|
+
(_props_onOpenChange = props.onOpenChange) === null || _props_onOpenChange === void 0 ? void 0 : _props_onOpenChange.call(props, event, {
|
|
52
49
|
...data,
|
|
53
50
|
openItems: nextOpenItems.dangerouslyGetInternalSet_unstable()
|
|
54
51
|
});
|
|
@@ -56,18 +53,18 @@ function useNestedRootTree(props, ref) {
|
|
|
56
53
|
});
|
|
57
54
|
const handleCheckedChange = (0, _reactutilities.useEventCallback)((event, data)=>{
|
|
58
55
|
if (walkerRef.current) {
|
|
59
|
-
var _props_onCheckedChange
|
|
56
|
+
var _props_onCheckedChange;
|
|
60
57
|
const nextCheckedItems = (0, _useNestedControllableCheckedItems.createNextNestedCheckedItems)(data, checkedItems);
|
|
61
|
-
(_props_onCheckedChange =
|
|
58
|
+
(_props_onCheckedChange = props.onCheckedChange) === null || _props_onCheckedChange === void 0 ? void 0 : _props_onCheckedChange.call(props, event, {
|
|
62
59
|
...data,
|
|
63
60
|
checkedItems: nextCheckedItems.dangerouslyGetInternalMap_unstable()
|
|
64
61
|
});
|
|
65
62
|
}
|
|
66
63
|
});
|
|
67
64
|
const handleNavigation = (0, _reactutilities.useEventCallback)((event, data)=>{
|
|
68
|
-
var _props_onNavigation
|
|
69
|
-
(_props_onNavigation =
|
|
70
|
-
if (walkerRef.current) {
|
|
65
|
+
var _props_onNavigation;
|
|
66
|
+
(_props_onNavigation = props.onNavigation) === null || _props_onNavigation === void 0 ? void 0 : _props_onNavigation.call(props, event, data);
|
|
67
|
+
if (walkerRef.current && !event.isDefaultPrevented()) {
|
|
71
68
|
navigate(data, walkerRef.current);
|
|
72
69
|
}
|
|
73
70
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["useTree.js"],"sourcesContent":["import * as React from 'react';\nimport { useEventCallback, useMergedRefs } from '@fluentui/react-utilities';\nimport { createNextOpenItems, useControllableOpenItems } from '../../hooks/useControllableOpenItems';\nimport { createNextNestedCheckedItems, useNestedCheckedItems } from './useNestedControllableCheckedItems';\nimport {
|
|
1
|
+
{"version":3,"sources":["useTree.js"],"sourcesContent":["import * as React from 'react';\nimport { useEventCallback, useMergedRefs } from '@fluentui/react-utilities';\nimport { createNextOpenItems, useControllableOpenItems } from '../../hooks/useControllableOpenItems';\nimport { createNextNestedCheckedItems, useNestedCheckedItems } from './useNestedControllableCheckedItems';\nimport { useSubtreeContext_unstable } from '../../contexts/subtreeContext';\nimport { useRootTree } from '../../hooks/useRootTree';\nimport { useSubtree } from '../../hooks/useSubtree';\nimport { createHTMLElementWalker } from '../../utils/createHTMLElementWalker';\nimport { treeItemFilter } from '../../utils/treeItemFilter';\nimport { useTreeNavigation } from './useTreeNavigation';\nimport { useFluent_unstable } from '@fluentui/react-shared-contexts';\nexport const useTree_unstable = (props, ref)=>{\n const { level } = useSubtreeContext_unstable();\n // as level is static, this doesn't break rule of hooks\n // and if this becomes an issue later on, this can be easily converted\n // eslint-disable-next-line react-hooks/rules-of-hooks\n return level > 0 ? useSubtree(props, ref) : useNestedRootTree(props, ref);\n};\nfunction useNestedRootTree(props, ref) {\n const [openItems, setOpenItems] = useControllableOpenItems(props);\n const checkedItems = useNestedCheckedItems(props);\n const { navigate, initialize } = useTreeNavigation();\n const walkerRef = React.useRef();\n const { targetDocument } = useFluent_unstable();\n const initializeWalker = React.useCallback((root)=>{\n if (root && targetDocument) {\n walkerRef.current = createHTMLElementWalker(root, targetDocument, treeItemFilter);\n initialize(walkerRef.current);\n }\n }, [\n initialize,\n targetDocument\n ]);\n const handleOpenChange = useEventCallback((event, data)=>{\n var _props_onOpenChange;\n const nextOpenItems = createNextOpenItems(data, openItems);\n (_props_onOpenChange = props.onOpenChange) === null || _props_onOpenChange === void 0 ? void 0 : _props_onOpenChange.call(props, event, {\n ...data,\n openItems: nextOpenItems.dangerouslyGetInternalSet_unstable()\n });\n setOpenItems(nextOpenItems);\n });\n const handleCheckedChange = useEventCallback((event, data)=>{\n if (walkerRef.current) {\n var _props_onCheckedChange;\n const nextCheckedItems = createNextNestedCheckedItems(data, checkedItems);\n (_props_onCheckedChange = props.onCheckedChange) === null || _props_onCheckedChange === void 0 ? void 0 : _props_onCheckedChange.call(props, event, {\n ...data,\n checkedItems: nextCheckedItems.dangerouslyGetInternalMap_unstable()\n });\n }\n });\n const handleNavigation = useEventCallback((event, data)=>{\n var _props_onNavigation;\n (_props_onNavigation = props.onNavigation) === null || _props_onNavigation === void 0 ? void 0 : _props_onNavigation.call(props, event, data);\n if (walkerRef.current && !event.isDefaultPrevented()) {\n navigate(data, walkerRef.current);\n }\n });\n return {\n treeType: 'nested',\n ...useRootTree({\n ...props,\n openItems,\n checkedItems,\n onOpenChange: handleOpenChange,\n onNavigation: handleNavigation,\n onCheckedChange: handleCheckedChange\n }, useMergedRefs(ref, initializeWalker))\n };\n}\n"],"names":["useTree_unstable","props","ref","level","useSubtreeContext_unstable","useSubtree","useNestedRootTree","openItems","setOpenItems","useControllableOpenItems","checkedItems","useNestedCheckedItems","navigate","initialize","useTreeNavigation","walkerRef","React","useRef","targetDocument","useFluent_unstable","initializeWalker","useCallback","root","current","createHTMLElementWalker","treeItemFilter","handleOpenChange","useEventCallback","event","data","_props_onOpenChange","nextOpenItems","createNextOpenItems","onOpenChange","call","dangerouslyGetInternalSet_unstable","handleCheckedChange","_props_onCheckedChange","nextCheckedItems","createNextNestedCheckedItems","onCheckedChange","dangerouslyGetInternalMap_unstable","handleNavigation","_props_onNavigation","onNavigation","isDefaultPrevented","treeType","useRootTree","useMergedRefs"],"mappings":";;;;+BAWaA;;;eAAAA;;;;iEAXU;gCACyB;0CACc;mDACM;gCACzB;6BACf;4BACD;yCACa;gCACT;mCACG;qCACC;AAC5B,MAAMA,mBAAmB,CAACC,OAAOC;IACpC,MAAM,EAAEC,KAAK,EAAE,GAAGC,IAAAA,0CAA0B;IAC5C,uDAAuD;IACvD,sEAAsE;IACtE,sDAAsD;IACtD,OAAOD,QAAQ,IAAIE,IAAAA,sBAAU,EAACJ,OAAOC,OAAOI,kBAAkBL,OAAOC;AACzE;AACA,SAASI,kBAAkBL,KAAK,EAAEC,GAAG;IACjC,MAAM,CAACK,WAAWC,aAAa,GAAGC,IAAAA,kDAAwB,EAACR;IAC3D,MAAMS,eAAeC,IAAAA,wDAAqB,EAACV;IAC3C,MAAM,EAAEW,QAAQ,EAAEC,UAAU,EAAE,GAAGC,IAAAA,oCAAiB;IAClD,MAAMC,YAAYC,OAAMC,MAAM;IAC9B,MAAM,EAAEC,cAAc,EAAE,GAAGC,IAAAA,uCAAkB;IAC7C,MAAMC,mBAAmBJ,OAAMK,WAAW,CAAC,CAACC;QACxC,IAAIA,QAAQJ,gBAAgB;YACxBH,UAAUQ,OAAO,GAAGC,IAAAA,gDAAuB,EAACF,MAAMJ,gBAAgBO,8BAAc;YAChFZ,WAAWE,UAAUQ,OAAO;QAChC;IACJ,GAAG;QACCV;QACAK;KACH;IACD,MAAMQ,mBAAmBC,IAAAA,gCAAgB,EAAC,CAACC,OAAOC;QAC9C,IAAIC;QACJ,MAAMC,gBAAgBC,IAAAA,6CAAmB,EAACH,MAAMtB;QAC/CuB,CAAAA,sBAAsB7B,MAAMgC,YAAY,AAAD,MAAO,QAAQH,wBAAwB,KAAK,IAAI,KAAK,IAAIA,oBAAoBI,IAAI,CAACjC,OAAO2B,OAAO;YACpI,GAAGC,IAAI;YACPtB,WAAWwB,cAAcI,kCAAkC;QAC/D;QACA3B,aAAauB;IACjB;IACA,MAAMK,sBAAsBT,IAAAA,gCAAgB,EAAC,CAACC,OAAOC;QACjD,IAAId,UAAUQ,OAAO,EAAE;YACnB,IAAIc;YACJ,MAAMC,mBAAmBC,IAAAA,+DAA4B,EAACV,MAAMnB;YAC3D2B,CAAAA,yBAAyBpC,MAAMuC,eAAe,AAAD,MAAO,QAAQH,2BAA2B,KAAK,IAAI,KAAK,IAAIA,uBAAuBH,IAAI,CAACjC,OAAO2B,OAAO;gBAChJ,GAAGC,IAAI;gBACPnB,cAAc4B,iBAAiBG,kCAAkC;YACrE;QACJ;IACJ;IACA,MAAMC,mBAAmBf,IAAAA,gCAAgB,EAAC,CAACC,OAAOC;QAC9C,IAAIc;QACHA,CAAAA,sBAAsB1C,MAAM2C,YAAY,AAAD,MAAO,QAAQD,wBAAwB,KAAK,IAAI,KAAK,IAAIA,oBAAoBT,IAAI,CAACjC,OAAO2B,OAAOC;QACxI,IAAId,UAAUQ,OAAO,IAAI,CAACK,MAAMiB,kBAAkB,IAAI;YAClDjC,SAASiB,MAAMd,UAAUQ,OAAO;QACpC;IACJ;IACA,OAAO;QACHuB,UAAU;QACV,GAAGC,IAAAA,wBAAW,EAAC;YACX,GAAG9C,KAAK;YACRM;YACAG;YACAuB,cAAcP;YACdkB,cAAcF;YACdF,iBAAiBJ;QACrB,GAAGY,IAAAA,6BAAa,EAAC9C,KAAKkB,kBAAkB;IAC5C;AACJ"}
|
|
@@ -8,22 +8,37 @@ Object.defineProperty(exports, "useTreeContextValues_unstable", {
|
|
|
8
8
|
return useTreeContextValues_unstable;
|
|
9
9
|
}
|
|
10
10
|
});
|
|
11
|
+
const _interop_require_wildcard = require("@swc/helpers/_/_interop_require_wildcard");
|
|
12
|
+
const _react = /*#__PURE__*/ _interop_require_wildcard._(require("react"));
|
|
11
13
|
function useTreeContextValues_unstable(state) {
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
14
|
+
if (state.contextType === 'root') {
|
|
15
|
+
const { openItems, level, contextType, treeType, checkedItems, selectionMode, appearance, size, requestTreeResponse } = state;
|
|
16
|
+
/**
|
|
17
|
+
* This context is created with "@fluentui/react-context-selector",
|
|
18
|
+
* there is no sense to memoize it
|
|
19
|
+
*/ const tree = {
|
|
20
|
+
treeType,
|
|
21
|
+
size,
|
|
22
|
+
openItems,
|
|
23
|
+
appearance,
|
|
24
|
+
checkedItems,
|
|
25
|
+
selectionMode,
|
|
26
|
+
contextType,
|
|
27
|
+
level,
|
|
28
|
+
requestTreeResponse
|
|
29
|
+
};
|
|
30
|
+
return {
|
|
31
|
+
tree
|
|
32
|
+
};
|
|
33
|
+
}
|
|
26
34
|
return {
|
|
27
|
-
|
|
35
|
+
// contextType is statically determined by the context
|
|
36
|
+
// eslint-disable-next-line react-hooks/rules-of-hooks
|
|
37
|
+
tree: _react.useMemo(()=>({
|
|
38
|
+
level: state.level,
|
|
39
|
+
contextType: 'subtree'
|
|
40
|
+
}), [
|
|
41
|
+
state.level
|
|
42
|
+
])
|
|
28
43
|
};
|
|
29
44
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["useTreeContextValues.js"],"sourcesContent":["
|
|
1
|
+
{"version":3,"sources":["useTreeContextValues.js"],"sourcesContent":["import * as React from 'react';\nexport function useTreeContextValues_unstable(state) {\n if (state.contextType === 'root') {\n const { openItems, level, contextType, treeType, checkedItems, selectionMode, appearance, size, requestTreeResponse } = state;\n /**\n * This context is created with \"@fluentui/react-context-selector\",\n * there is no sense to memoize it\n */ const tree = {\n treeType,\n size,\n openItems,\n appearance,\n checkedItems,\n selectionMode,\n contextType,\n level,\n requestTreeResponse\n };\n return {\n tree\n };\n }\n return {\n // contextType is statically determined by the context\n // eslint-disable-next-line react-hooks/rules-of-hooks\n tree: React.useMemo(()=>({\n level: state.level,\n contextType: 'subtree'\n }), [\n state.level\n ])\n };\n}\n"],"names":["useTreeContextValues_unstable","state","contextType","openItems","level","treeType","checkedItems","selectionMode","appearance","size","requestTreeResponse","tree","React","useMemo"],"mappings":";;;;+BACgBA;;;eAAAA;;;;iEADO;AAChB,SAASA,8BAA8BC,KAAK;IAC/C,IAAIA,MAAMC,WAAW,KAAK,QAAQ;QAC9B,MAAM,EAAEC,SAAS,EAAEC,KAAK,EAAEF,WAAW,EAAEG,QAAQ,EAAEC,YAAY,EAAEC,aAAa,EAAEC,UAAU,EAAEC,IAAI,EAAEC,mBAAmB,EAAE,GAAGT;QACxH;;;KAGH,GAAG,MAAMU,OAAO;YACTN;YACAI;YACAN;YACAK;YACAF;YACAC;YACAL;YACAE;YACAM;QACJ;QACA,OAAO;YACHC;QACJ;IACJ;IACA,OAAO;QACH,sDAAsD;QACtD,sDAAsD;QACtDA,MAAMC,OAAMC,OAAO,CAAC,IAAK,CAAA;gBACjBT,OAAOH,MAAMG,KAAK;gBAClBF,aAAa;YACjB,CAAA,GAAI;YACJD,MAAMG,KAAK;SACd;IACL;AACJ"}
|
|
@@ -15,16 +15,20 @@ const _reactutilities = require("@fluentui/react-utilities");
|
|
|
15
15
|
const _reactportal = require("@fluentui/react-portal");
|
|
16
16
|
const _keyboardkeys = require("@fluentui/keyboard-keys");
|
|
17
17
|
const _tokens = require("../../utils/tokens");
|
|
18
|
-
const
|
|
18
|
+
const _contexts = require("../../contexts");
|
|
19
19
|
const _getTreeItemValueFromElement = require("../../utils/getTreeItemValueFromElement");
|
|
20
20
|
function useTreeItem_unstable(props, ref) {
|
|
21
21
|
var _props_value;
|
|
22
|
-
const treeType = (0,
|
|
22
|
+
const treeType = (0, _contexts.useTreeContext_unstable)((ctx)=>ctx.treeType);
|
|
23
23
|
if (treeType === 'flat') {
|
|
24
24
|
warnIfNoProperPropsFlatTreeItem(props);
|
|
25
25
|
}
|
|
26
|
-
const requestTreeResponse = (0,
|
|
27
|
-
const contextLevel = (0,
|
|
26
|
+
const requestTreeResponse = (0, _contexts.useTreeContext_unstable)((ctx)=>ctx.requestTreeResponse);
|
|
27
|
+
const { level: contextLevel } = (0, _contexts.useSubtreeContext_unstable)();
|
|
28
|
+
const parentValue = (0, _contexts.useTreeItemContext_unstable)((ctx)=>{
|
|
29
|
+
var _props_parentValue;
|
|
30
|
+
return (_props_parentValue = props.parentValue) !== null && _props_parentValue !== void 0 ? _props_parentValue : ctx.value;
|
|
31
|
+
});
|
|
28
32
|
// note, if the value is not externally provided,
|
|
29
33
|
// then selection and expansion will not work properly
|
|
30
34
|
const value = (0, _reactutilities.useId)('fuiTreeItemValue-', (_props_value = props.value) === null || _props_value === void 0 ? void 0 : _props_value.toString());
|
|
@@ -39,14 +43,17 @@ function useTreeItem_unstable(props, ref) {
|
|
|
39
43
|
const layoutRef = _react.useRef(null);
|
|
40
44
|
const subtreeRef = _react.useRef(null);
|
|
41
45
|
const selectionRef = _react.useRef(null);
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
const
|
|
46
|
+
const open = (0, _contexts.useTreeContext_unstable)((ctx)=>{
|
|
47
|
+
var _props_open;
|
|
48
|
+
return (_props_open = props.open) !== null && _props_open !== void 0 ? _props_open : ctx.openItems.has(value);
|
|
49
|
+
});
|
|
50
|
+
const selectionMode = (0, _contexts.useTreeContext_unstable)((ctx)=>ctx.selectionMode);
|
|
51
|
+
const checked = (0, _contexts.useTreeContext_unstable)((ctx)=>{
|
|
52
|
+
var _ctx_checkedItems_get;
|
|
53
|
+
return (_ctx_checkedItems_get = ctx.checkedItems.get(value)) !== null && _ctx_checkedItems_get !== void 0 ? _ctx_checkedItems_get : false;
|
|
54
|
+
});
|
|
47
55
|
const handleClick = (0, _reactutilities.useEventCallback)((event)=>{
|
|
48
|
-
|
|
49
|
-
(_onClick = onClick) === null || _onClick === void 0 ? void 0 : _onClick(event);
|
|
56
|
+
onClick === null || onClick === void 0 ? void 0 : onClick(event);
|
|
50
57
|
if (event.isDefaultPrevented()) {
|
|
51
58
|
return;
|
|
52
59
|
}
|
|
@@ -64,7 +71,7 @@ function useTreeItem_unstable(props, ref) {
|
|
|
64
71
|
}
|
|
65
72
|
const isEventFromExpandIcon = expandIconRef.current && (0, _reactportal.elementContains)(expandIconRef.current, event.target);
|
|
66
73
|
_reactdom.unstable_batchedUpdates(()=>{
|
|
67
|
-
var _props_onOpenChange
|
|
74
|
+
var _props_onOpenChange;
|
|
68
75
|
const data = {
|
|
69
76
|
event,
|
|
70
77
|
value,
|
|
@@ -72,16 +79,23 @@ function useTreeItem_unstable(props, ref) {
|
|
|
72
79
|
target: event.currentTarget,
|
|
73
80
|
type: isEventFromExpandIcon ? _tokens.treeDataTypes.ExpandIconClick : _tokens.treeDataTypes.Click
|
|
74
81
|
};
|
|
75
|
-
(_props_onOpenChange =
|
|
82
|
+
(_props_onOpenChange = props.onOpenChange) === null || _props_onOpenChange === void 0 ? void 0 : _props_onOpenChange.call(props, event, data);
|
|
76
83
|
requestTreeResponse({
|
|
77
84
|
...data,
|
|
78
|
-
itemType
|
|
85
|
+
itemType,
|
|
86
|
+
requestType: 'open'
|
|
87
|
+
});
|
|
88
|
+
requestTreeResponse({
|
|
89
|
+
...data,
|
|
90
|
+
itemType,
|
|
91
|
+
parentValue,
|
|
92
|
+
requestType: 'navigate',
|
|
93
|
+
type: _tokens.treeDataTypes.Click
|
|
79
94
|
});
|
|
80
95
|
});
|
|
81
96
|
});
|
|
82
97
|
const handleKeyDown = (0, _reactutilities.useEventCallback)((event)=>{
|
|
83
|
-
|
|
84
|
-
(_onKeyDown = onKeyDown) === null || _onKeyDown === void 0 ? void 0 : _onKeyDown(event);
|
|
98
|
+
onKeyDown === null || onKeyDown === void 0 ? void 0 : onKeyDown(event);
|
|
85
99
|
// Ignore keyboard events that do not originate from the current tree item.
|
|
86
100
|
if (event.isDefaultPrevented() || event.currentTarget !== event.target) {
|
|
87
101
|
return;
|
|
@@ -96,7 +110,7 @@ function useTreeItem_unstable(props, ref) {
|
|
|
96
110
|
return;
|
|
97
111
|
case _tokens.treeDataTypes.Enter:
|
|
98
112
|
{
|
|
99
|
-
var _props_onOpenChange
|
|
113
|
+
var _props_onOpenChange;
|
|
100
114
|
const data = {
|
|
101
115
|
value,
|
|
102
116
|
event,
|
|
@@ -104,10 +118,11 @@ function useTreeItem_unstable(props, ref) {
|
|
|
104
118
|
type: event.key,
|
|
105
119
|
target: event.currentTarget
|
|
106
120
|
};
|
|
107
|
-
(_props_onOpenChange =
|
|
121
|
+
(_props_onOpenChange = props.onOpenChange) === null || _props_onOpenChange === void 0 ? void 0 : _props_onOpenChange.call(props, event, data);
|
|
108
122
|
return requestTreeResponse({
|
|
109
123
|
...data,
|
|
110
|
-
itemType
|
|
124
|
+
itemType,
|
|
125
|
+
requestType: 'open'
|
|
111
126
|
});
|
|
112
127
|
}
|
|
113
128
|
case _tokens.treeDataTypes.End:
|
|
@@ -115,9 +130,11 @@ function useTreeItem_unstable(props, ref) {
|
|
|
115
130
|
case _tokens.treeDataTypes.ArrowUp:
|
|
116
131
|
case _tokens.treeDataTypes.ArrowDown:
|
|
117
132
|
return requestTreeResponse({
|
|
133
|
+
requestType: 'navigate',
|
|
118
134
|
event,
|
|
119
135
|
value,
|
|
120
136
|
itemType,
|
|
137
|
+
parentValue,
|
|
121
138
|
type: event.key,
|
|
122
139
|
target: event.currentTarget
|
|
123
140
|
});
|
|
@@ -135,12 +152,14 @@ function useTreeItem_unstable(props, ref) {
|
|
|
135
152
|
target: event.currentTarget
|
|
136
153
|
};
|
|
137
154
|
if (open) {
|
|
138
|
-
var _props_onOpenChange1
|
|
139
|
-
(_props_onOpenChange1 =
|
|
155
|
+
var _props_onOpenChange1;
|
|
156
|
+
(_props_onOpenChange1 = props.onOpenChange) === null || _props_onOpenChange1 === void 0 ? void 0 : _props_onOpenChange1.call(props, event, data);
|
|
140
157
|
}
|
|
141
158
|
return requestTreeResponse({
|
|
142
159
|
...data,
|
|
143
|
-
itemType
|
|
160
|
+
itemType,
|
|
161
|
+
parentValue,
|
|
162
|
+
requestType: open ? 'open' : 'navigate'
|
|
144
163
|
});
|
|
145
164
|
}
|
|
146
165
|
case _tokens.treeDataTypes.ArrowRight:
|
|
@@ -156,22 +175,26 @@ function useTreeItem_unstable(props, ref) {
|
|
|
156
175
|
target: event.currentTarget
|
|
157
176
|
};
|
|
158
177
|
if (!open) {
|
|
159
|
-
var _props_onOpenChange2
|
|
160
|
-
(_props_onOpenChange2 =
|
|
178
|
+
var _props_onOpenChange2;
|
|
179
|
+
(_props_onOpenChange2 = props.onOpenChange) === null || _props_onOpenChange2 === void 0 ? void 0 : _props_onOpenChange2.call(props, event, data);
|
|
161
180
|
}
|
|
162
181
|
return requestTreeResponse({
|
|
163
182
|
...data,
|
|
164
|
-
itemType
|
|
183
|
+
itemType,
|
|
184
|
+
parentValue,
|
|
185
|
+
requestType: open ? 'navigate' : 'open'
|
|
165
186
|
});
|
|
166
187
|
}
|
|
167
188
|
const isTypeAheadCharacter = event.key.length === 1 && event.key.match(/\w/) && !event.altKey && !event.ctrlKey && !event.metaKey;
|
|
168
189
|
if (isTypeAheadCharacter) {
|
|
169
190
|
requestTreeResponse({
|
|
191
|
+
requestType: 'navigate',
|
|
170
192
|
event,
|
|
171
193
|
target: event.currentTarget,
|
|
172
194
|
value,
|
|
173
195
|
itemType,
|
|
174
|
-
type: _tokens.treeDataTypes.TypeAhead
|
|
196
|
+
type: _tokens.treeDataTypes.TypeAhead,
|
|
197
|
+
parentValue
|
|
175
198
|
});
|
|
176
199
|
}
|
|
177
200
|
});
|
|
@@ -200,6 +223,7 @@ function useTreeItem_unstable(props, ref) {
|
|
|
200
223
|
return;
|
|
201
224
|
}
|
|
202
225
|
requestTreeResponse({
|
|
226
|
+
requestType: 'selection',
|
|
203
227
|
event,
|
|
204
228
|
value,
|
|
205
229
|
itemType,
|
|
@@ -251,14 +275,16 @@ function useTreeItem_unstable(props, ref) {
|
|
|
251
275
|
}
|
|
252
276
|
function warnIfNoProperPropsFlatTreeItem(props) {
|
|
253
277
|
if (process.env.NODE_ENV !== 'production') {
|
|
254
|
-
if (props['aria-posinset'] === undefined || props['aria-setsize'] === undefined || props['aria-level'] === undefined) {
|
|
278
|
+
if (props['aria-posinset'] === undefined || props['aria-setsize'] === undefined || props['aria-level'] === undefined || props.parentValue === undefined && props['aria-level'] !== 1) {
|
|
255
279
|
// eslint-disable-next-line no-console
|
|
256
280
|
console.error(`@fluentui/react-tree [${useTreeItem_unstable.name}]:
|
|
257
|
-
A flat treeitem must have "aria-posinset", "aria-setsize", "aria-level"
|
|
281
|
+
A flat treeitem must have "aria-posinset", "aria-setsize", "aria-level"
|
|
282
|
+
and "parentValue" (if "aria-level" > 1) to ensure a11y and navigation.
|
|
258
283
|
|
|
259
284
|
- "aria-posinset": the position of this treeitem in the current level of the tree.
|
|
260
285
|
- "aria-setsize": the number of siblings in this level of the tree.
|
|
261
|
-
- "aria-level": the current level of the treeitem
|
|
286
|
+
- "aria-level": the current level of the treeitem.
|
|
287
|
+
- "parentValue": the "value" property of the parent item of this item.`);
|
|
262
288
|
}
|
|
263
289
|
}
|
|
264
290
|
}
|