@fluentui/react-tree 9.4.12 → 9.4.14
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.md +30 -2
- package/lib/components/FlatTree/useFlatTree.js +13 -29
- package/lib/components/FlatTree/useFlatTree.js.map +1 -1
- package/lib/components/FlatTree/useHeadlessFlatTree.js +5 -23
- package/lib/components/FlatTree/useHeadlessFlatTree.js.map +1 -1
- package/lib/components/Tree/useNestedControllableCheckedItems.js.map +1 -1
- package/lib/components/Tree/useTree.js +26 -46
- package/lib/components/Tree/useTree.js.map +1 -1
- package/lib/{components/FlatTree → hooks}/useFlatTreeNavigation.js +35 -27
- package/lib/hooks/useFlatTreeNavigation.js.map +1 -0
- package/lib/hooks/useHTMLElementWalkerRef.js +17 -0
- package/lib/hooks/useHTMLElementWalkerRef.js.map +1 -0
- package/lib/hooks/useRootTree.js +24 -20
- package/lib/hooks/useRootTree.js.map +1 -1
- package/lib/hooks/useRovingTabIndexes.js +1 -1
- package/lib/hooks/useRovingTabIndexes.js.map +1 -1
- package/lib/hooks/useTreeNavigation.js +66 -0
- package/lib/hooks/useTreeNavigation.js.map +1 -0
- package/lib-commonjs/components/FlatTree/useFlatTree.js +13 -29
- package/lib-commonjs/components/FlatTree/useFlatTree.js.map +1 -1
- package/lib-commonjs/components/FlatTree/useHeadlessFlatTree.js +5 -23
- package/lib-commonjs/components/FlatTree/useHeadlessFlatTree.js.map +1 -1
- package/lib-commonjs/components/Tree/useTree.js +26 -46
- package/lib-commonjs/components/Tree/useTree.js.map +1 -1
- package/lib-commonjs/{components/FlatTree → hooks}/useFlatTreeNavigation.js +35 -26
- package/lib-commonjs/hooks/useFlatTreeNavigation.js.map +1 -0
- package/lib-commonjs/hooks/useHTMLElementWalkerRef.js +28 -0
- package/lib-commonjs/hooks/useHTMLElementWalkerRef.js.map +1 -0
- package/lib-commonjs/hooks/useRootTree.js +24 -20
- package/lib-commonjs/hooks/useRootTree.js.map +1 -1
- package/lib-commonjs/hooks/useRovingTabIndexes.js +1 -1
- package/lib-commonjs/hooks/useRovingTabIndexes.js.map +1 -1
- package/lib-commonjs/hooks/useTreeNavigation.js +77 -0
- package/lib-commonjs/hooks/useTreeNavigation.js.map +1 -0
- package/package.json +7 -7
- package/lib/components/FlatTree/useFlatTreeNavigation.js.map +0 -1
- package/lib/components/Tree/useTreeNavigation.js +0 -52
- package/lib/components/Tree/useTreeNavigation.js.map +0 -1
- package/lib-commonjs/components/FlatTree/useFlatTreeNavigation.js.map +0 -1
- package/lib-commonjs/components/Tree/useTreeNavigation.js +0 -62
- package/lib-commonjs/components/Tree/useTreeNavigation.js.map +0 -1
package/lib/hooks/useRootTree.js
CHANGED
|
@@ -18,29 +18,41 @@ import { createNextOpenItems } from './useControllableOpenItems';
|
|
|
18
18
|
const checkedItems = React.useMemo(()=>createCheckedItems(props.checkedItems), [
|
|
19
19
|
props.checkedItems
|
|
20
20
|
]);
|
|
21
|
-
const requestOpenChange = (
|
|
21
|
+
const requestOpenChange = (request)=>{
|
|
22
22
|
var _props_onOpenChange;
|
|
23
|
-
const
|
|
24
|
-
|
|
25
|
-
|
|
23
|
+
const open = request.itemType === 'branch' && !openItems.has(request.value);
|
|
24
|
+
const nextOpenItems = createNextOpenItems({
|
|
25
|
+
value: request.value,
|
|
26
|
+
open
|
|
27
|
+
}, openItems);
|
|
28
|
+
(_props_onOpenChange = props.onOpenChange) === null || _props_onOpenChange === void 0 ? void 0 : _props_onOpenChange.call(props, request.event, {
|
|
29
|
+
...request,
|
|
30
|
+
open,
|
|
26
31
|
openItems: nextOpenItems.dangerouslyGetInternalSet_unstable()
|
|
27
32
|
});
|
|
28
33
|
};
|
|
29
|
-
const requestCheckedChange = (
|
|
34
|
+
const requestCheckedChange = (request)=>{
|
|
30
35
|
var _props_onCheckedChange;
|
|
31
|
-
|
|
36
|
+
if (selectionMode === 'none') {
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
(_props_onCheckedChange = props.onCheckedChange) === null || _props_onCheckedChange === void 0 ? void 0 : _props_onCheckedChange.call(props, request.event, {
|
|
40
|
+
...request,
|
|
41
|
+
selectionMode,
|
|
42
|
+
checkedItems: checkedItems.dangerouslyGetInternalMap_unstable()
|
|
43
|
+
});
|
|
32
44
|
};
|
|
33
|
-
const requestNavigation = (
|
|
45
|
+
const requestNavigation = (request)=>{
|
|
34
46
|
var _props_onNavigation;
|
|
35
|
-
(_props_onNavigation = props.onNavigation) === null || _props_onNavigation === void 0 ? void 0 : _props_onNavigation.call(props,
|
|
36
|
-
switch(
|
|
47
|
+
(_props_onNavigation = props.onNavigation) === null || _props_onNavigation === void 0 ? void 0 : _props_onNavigation.call(props, request.event, request);
|
|
48
|
+
switch(request.type){
|
|
37
49
|
case treeDataTypes.ArrowDown:
|
|
38
50
|
case treeDataTypes.ArrowUp:
|
|
39
51
|
case treeDataTypes.Home:
|
|
40
52
|
case treeDataTypes.End:
|
|
41
53
|
// stop the default behavior of the event
|
|
42
54
|
// which is to scroll the page
|
|
43
|
-
|
|
55
|
+
request.event.preventDefault();
|
|
44
56
|
}
|
|
45
57
|
};
|
|
46
58
|
const requestTreeResponse = useEventCallback((request)=>{
|
|
@@ -48,17 +60,9 @@ import { createNextOpenItems } from './useControllableOpenItems';
|
|
|
48
60
|
case 'navigate':
|
|
49
61
|
return requestNavigation(request);
|
|
50
62
|
case 'open':
|
|
51
|
-
return requestOpenChange(
|
|
52
|
-
...request,
|
|
53
|
-
open: request.itemType === 'branch' && !openItems.has(request.value),
|
|
54
|
-
openItems: openItems.dangerouslyGetInternalSet_unstable()
|
|
55
|
-
});
|
|
63
|
+
return requestOpenChange(request);
|
|
56
64
|
case 'selection':
|
|
57
|
-
return requestCheckedChange(
|
|
58
|
-
...request,
|
|
59
|
-
selectionMode: selectionMode,
|
|
60
|
-
checkedItems: checkedItems.dangerouslyGetInternalMap_unstable()
|
|
61
|
-
});
|
|
65
|
+
return requestCheckedChange(request);
|
|
62
66
|
}
|
|
63
67
|
});
|
|
64
68
|
return {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["useRootTree.ts"],"sourcesContent":["import {
|
|
1
|
+
{"version":3,"sources":["useRootTree.ts"],"sourcesContent":["import { getIntrinsicElementProps, useEventCallback, slot } from '@fluentui/react-utilities';\nimport type { TreeCheckedChangeData, TreeProps, TreeState } from '../Tree';\nimport * as React from 'react';\nimport { TreeContextValue, TreeItemRequest } from '../contexts/treeContext';\nimport { createOpenItems } from '../utils/createOpenItems';\nimport { createCheckedItems } from '../utils/createCheckedItems';\nimport { treeDataTypes } from '../utils/tokens';\nimport { createNextOpenItems } from './useControllableOpenItems';\n\n/**\n * Create the state required to render the root level tree.\n *\n * @param props - props from this instance of tree\n * @param ref - reference to root HTMLElement of tree\n */\nexport function useRootTree(\n props: TreeProps,\n ref: React.Ref<HTMLElement>,\n): Omit<TreeState & TreeContextValue, 'treeType'> {\n warnIfNoProperPropsRootTree(props);\n\n const { appearance = 'subtle', size = 'medium', selectionMode = 'none' } = props;\n\n const openItems = React.useMemo(() => createOpenItems(props.openItems), [props.openItems]);\n const checkedItems = React.useMemo(() => createCheckedItems(props.checkedItems), [props.checkedItems]);\n\n const requestOpenChange = (request: Extract<TreeItemRequest, { requestType: 'open' }>) => {\n const open = request.itemType === 'branch' && !openItems.has(request.value);\n const nextOpenItems = createNextOpenItems({ value: request.value, open }, openItems);\n props.onOpenChange?.(request.event, {\n ...request,\n open,\n openItems: nextOpenItems.dangerouslyGetInternalSet_unstable(),\n });\n };\n\n const requestCheckedChange = (request: Extract<TreeItemRequest, { requestType: 'selection' }>) => {\n if (selectionMode === 'none') {\n return;\n }\n props.onCheckedChange?.(request.event, {\n ...request,\n selectionMode,\n checkedItems: checkedItems.dangerouslyGetInternalMap_unstable(),\n // Casting is required here due to selection | multiselection spreading the union problem\n } as TreeCheckedChangeData);\n };\n\n const requestNavigation = (request: Extract<TreeItemRequest, { requestType: 'navigate' }>) => {\n props.onNavigation?.(request.event, request);\n switch (request.type) {\n case treeDataTypes.ArrowDown:\n case treeDataTypes.ArrowUp:\n case treeDataTypes.Home:\n case treeDataTypes.End:\n // stop the default behavior of the event\n // which is to scroll the page\n request.event.preventDefault();\n }\n };\n\n const requestTreeResponse = useEventCallback((request: TreeItemRequest) => {\n switch (request.requestType) {\n case 'navigate':\n return requestNavigation(request);\n case 'open':\n return requestOpenChange(request);\n case 'selection':\n return requestCheckedChange(request);\n }\n });\n\n return {\n components: { root: 'div' },\n contextType: 'root',\n selectionMode,\n open: true,\n appearance,\n size,\n level: 1,\n openItems,\n checkedItems,\n requestTreeResponse,\n root: slot.always(\n getIntrinsicElementProps('div', {\n // FIXME:\n // `ref` is wrongly assigned to be `HTMLElement` instead of `HTMLDivElement`\n // but since it would be a breaking change to fix it, we are casting ref to it's proper type\n ref: ref as React.Ref<HTMLDivElement>,\n role: 'tree',\n 'aria-multiselectable': selectionMode === 'multiselect' ? true : undefined,\n ...props,\n }),\n { elementType: 'div' },\n ),\n };\n}\n\nfunction warnIfNoProperPropsRootTree(props: Pick<TreeProps, 'aria-label' | 'aria-labelledby'>) {\n if (process.env.NODE_ENV === 'development') {\n if (!props['aria-label'] && !props['aria-labelledby']) {\n // eslint-disable-next-line no-console\n console.warn(/* #__DE-INDENT__ */ `\n @fluentui/react-tree [useRootTree]:\n Tree must have either a \\`aria-label\\` or \\`aria-labelledby\\` property defined\n `);\n }\n }\n}\n"],"names":["getIntrinsicElementProps","useEventCallback","slot","React","createOpenItems","createCheckedItems","treeDataTypes","createNextOpenItems","useRootTree","props","ref","warnIfNoProperPropsRootTree","appearance","size","selectionMode","openItems","useMemo","checkedItems","requestOpenChange","request","open","itemType","has","value","nextOpenItems","onOpenChange","event","dangerouslyGetInternalSet_unstable","requestCheckedChange","onCheckedChange","dangerouslyGetInternalMap_unstable","requestNavigation","onNavigation","type","ArrowDown","ArrowUp","Home","End","preventDefault","requestTreeResponse","requestType","components","root","contextType","level","always","role","undefined","elementType","process","env","NODE_ENV","console","warn"],"mappings":"AAAA,SAASA,wBAAwB,EAAEC,gBAAgB,EAAEC,IAAI,QAAQ,4BAA4B;AAE7F,YAAYC,WAAW,QAAQ;AAE/B,SAASC,eAAe,QAAQ,2BAA2B;AAC3D,SAASC,kBAAkB,QAAQ,8BAA8B;AACjE,SAASC,aAAa,QAAQ,kBAAkB;AAChD,SAASC,mBAAmB,QAAQ,6BAA6B;AAEjE;;;;;CAKC,GACD,OAAO,SAASC,YACdC,KAAgB,EAChBC,GAA2B;IAE3BC,4BAA4BF;IAE5B,MAAM,EAAEG,aAAa,QAAQ,EAAEC,OAAO,QAAQ,EAAEC,gBAAgB,MAAM,EAAE,GAAGL;IAE3E,MAAMM,YAAYZ,MAAMa,OAAO,CAAC,IAAMZ,gBAAgBK,MAAMM,SAAS,GAAG;QAACN,MAAMM,SAAS;KAAC;IACzF,MAAME,eAAed,MAAMa,OAAO,CAAC,IAAMX,mBAAmBI,MAAMQ,YAAY,GAAG;QAACR,MAAMQ,YAAY;KAAC;IAErG,MAAMC,oBAAoB,CAACC;YAGzBV;QAFA,MAAMW,OAAOD,QAAQE,QAAQ,KAAK,YAAY,CAACN,UAAUO,GAAG,CAACH,QAAQI,KAAK;QAC1E,MAAMC,gBAAgBjB,oBAAoB;YAAEgB,OAAOJ,QAAQI,KAAK;YAAEH;QAAK,GAAGL;SAC1EN,sBAAAA,MAAMgB,YAAY,cAAlBhB,0CAAAA,yBAAAA,OAAqBU,QAAQO,KAAK,EAAE;YAClC,GAAGP,OAAO;YACVC;YACAL,WAAWS,cAAcG,kCAAkC;QAC7D;IACF;IAEA,MAAMC,uBAAuB,CAACT;YAI5BV;QAHA,IAAIK,kBAAkB,QAAQ;YAC5B;QACF;SACAL,yBAAAA,MAAMoB,eAAe,cAArBpB,6CAAAA,4BAAAA,OAAwBU,QAAQO,KAAK,EAAE;YACrC,GAAGP,OAAO;YACVL;YACAG,cAAcA,aAAaa,kCAAkC;QAE/D;IACF;IAEA,MAAMC,oBAAoB,CAACZ;YACzBV;SAAAA,sBAAAA,MAAMuB,YAAY,cAAlBvB,0CAAAA,yBAAAA,OAAqBU,QAAQO,KAAK,EAAEP;QACpC,OAAQA,QAAQc,IAAI;YAClB,KAAK3B,cAAc4B,SAAS;YAC5B,KAAK5B,cAAc6B,OAAO;YAC1B,KAAK7B,cAAc8B,IAAI;YACvB,KAAK9B,cAAc+B,GAAG;gBACpB,yCAAyC;gBACzC,8BAA8B;gBAC9BlB,QAAQO,KAAK,CAACY,cAAc;QAChC;IACF;IAEA,MAAMC,sBAAsBtC,iBAAiB,CAACkB;QAC5C,OAAQA,QAAQqB,WAAW;YACzB,KAAK;gBACH,OAAOT,kBAAkBZ;YAC3B,KAAK;gBACH,OAAOD,kBAAkBC;YAC3B,KAAK;gBACH,OAAOS,qBAAqBT;QAChC;IACF;IAEA,OAAO;QACLsB,YAAY;YAAEC,MAAM;QAAM;QAC1BC,aAAa;QACb7B;QACAM,MAAM;QACNR;QACAC;QACA+B,OAAO;QACP7B;QACAE;QACAsB;QACAG,MAAMxC,KAAK2C,MAAM,CACf7C,yBAAyB,OAAO;YAC9B,SAAS;YACT,4EAA4E;YAC5E,4FAA4F;YAC5FU,KAAKA;YACLoC,MAAM;YACN,wBAAwBhC,kBAAkB,gBAAgB,OAAOiC;YACjE,GAAGtC,KAAK;QACV,IACA;YAAEuC,aAAa;QAAM;IAEzB;AACF;AAEA,SAASrC,4BAA4BF,KAAwD;IAC3F,IAAIwC,QAAQC,GAAG,CAACC,QAAQ,KAAK,eAAe;QAC1C,IAAI,CAAC1C,KAAK,CAAC,aAAa,IAAI,CAACA,KAAK,CAAC,kBAAkB,EAAE;YACrD,sCAAsC;YACtC2C,QAAQC,IAAI,CAAsB,CAAC;8EAGnC,CAAC;QACH;IACF;AACF"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import * as React from 'react';
|
|
2
2
|
/**
|
|
3
3
|
* https://www.w3.org/WAI/ARIA/apg/practices/keyboard-interface/#kbd_roving_tabindex
|
|
4
|
-
*/ export function useRovingTabIndex(
|
|
4
|
+
*/ export function useRovingTabIndex() {
|
|
5
5
|
const currentElementRef = React.useRef();
|
|
6
6
|
const initialize = React.useCallback((walker)=>{
|
|
7
7
|
walker.currentElement = walker.root;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["useRovingTabIndexes.ts"],"sourcesContent":["import * as React from 'react';\nimport {
|
|
1
|
+
{"version":3,"sources":["useRovingTabIndexes.ts"],"sourcesContent":["import * as React from 'react';\nimport { HTMLElementWalker } from '../utils/createHTMLElementWalker';\n\n/**\n * https://www.w3.org/WAI/ARIA/apg/practices/keyboard-interface/#kbd_roving_tabindex\n */\nexport function useRovingTabIndex() {\n const currentElementRef = React.useRef<HTMLElement>();\n\n const initialize = React.useCallback((walker: HTMLElementWalker) => {\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 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 const rove = React.useCallback((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 rove,\n initialize,\n };\n}\n"],"names":["React","useRovingTabIndex","currentElementRef","useRef","initialize","useCallback","walker","currentElement","root","tabbableChild","firstChild","element","tabIndex","NodeFilter","FILTER_ACCEPT","FILTER_SKIP","current","nextElement","rove","focus"],"mappings":"AAAA,YAAYA,WAAW,QAAQ;AAG/B;;CAEC,GACD,OAAO,SAASC;IACd,MAAMC,oBAAoBF,MAAMG,MAAM;IAEtC,MAAMC,aAAaJ,MAAMK,WAAW,CAAC,CAACC;QACpCA,OAAOC,cAAc,GAAGD,OAAOE,IAAI;QACnC,IAAIC,gBAAgBH,OAAOI,UAAU,CAACC,CAAAA,UACpCA,QAAQC,QAAQ,KAAK,IAAIC,WAAWC,aAAa,GAAGD,WAAWE,WAAW;QAE5ET,OAAOC,cAAc,GAAGD,OAAOE,IAAI;QACnCC,0BAAAA,2BAAAA,gBAAAA,gBAAkBH,OAAOI,UAAU;QACnC,IAAI,CAACD,eAAe;YAClB;QACF;QACAA,cAAcG,QAAQ,GAAG;QACzBV,kBAAkBc,OAAO,GAAGP;QAC5B,IAAIQ,cAAkC;QACtC,MAAO,AAACA,CAAAA,cAAcX,OAAOW,WAAW,EAAC,KAAMA,gBAAgBR,cAAe;YAC5EQ,YAAYL,QAAQ,GAAG,CAAC;QAC1B;IACF,GAAG,EAAE;IACL,MAAMM,OAAOlB,MAAMK,WAAW,CAAC,CAACY;QAC9B,IAAI,CAACf,kBAAkBc,OAAO,EAAE;YAC9B;QACF;QACAd,kBAAkBc,OAAO,CAACJ,QAAQ,GAAG,CAAC;QACtCK,YAAYL,QAAQ,GAAG;QACvBK,YAAYE,KAAK;QACjBjB,kBAAkBc,OAAO,GAAGC;IAC9B,GAAG,EAAE;IAEL,OAAO;QACLC;QACAd;IACF;AACF"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { nextTypeAheadElement } from '../utils/nextTypeAheadElement';
|
|
2
|
+
import { treeDataTypes } from '../utils/tokens';
|
|
3
|
+
import { useRovingTabIndex } from './useRovingTabIndexes';
|
|
4
|
+
import * as React from 'react';
|
|
5
|
+
import { useHTMLElementWalkerRef } from './useHTMLElementWalkerRef';
|
|
6
|
+
import { useMergedRefs } from '@fluentui/react-utilities';
|
|
7
|
+
export function useTreeNavigation() {
|
|
8
|
+
const { rove, initialize: initializeRovingTabIndex } = useRovingTabIndex();
|
|
9
|
+
const { walkerRef, rootRef: walkerRootRef } = useHTMLElementWalkerRef();
|
|
10
|
+
const rootRefCallback = React.useCallback((root)=>{
|
|
11
|
+
if (root && walkerRef.current) {
|
|
12
|
+
initializeRovingTabIndex(walkerRef.current);
|
|
13
|
+
}
|
|
14
|
+
}, [
|
|
15
|
+
walkerRef,
|
|
16
|
+
initializeRovingTabIndex
|
|
17
|
+
]);
|
|
18
|
+
const getNextElement = (data)=>{
|
|
19
|
+
if (!walkerRef.current) {
|
|
20
|
+
return null;
|
|
21
|
+
}
|
|
22
|
+
switch(data.type){
|
|
23
|
+
case treeDataTypes.Click:
|
|
24
|
+
return data.target;
|
|
25
|
+
case treeDataTypes.TypeAhead:
|
|
26
|
+
walkerRef.current.currentElement = data.target;
|
|
27
|
+
return nextTypeAheadElement(walkerRef.current, data.event.key);
|
|
28
|
+
case treeDataTypes.ArrowLeft:
|
|
29
|
+
walkerRef.current.currentElement = data.target;
|
|
30
|
+
return walkerRef.current.parentElement();
|
|
31
|
+
case treeDataTypes.ArrowRight:
|
|
32
|
+
walkerRef.current.currentElement = data.target;
|
|
33
|
+
return walkerRef.current.firstChild();
|
|
34
|
+
case treeDataTypes.End:
|
|
35
|
+
walkerRef.current.currentElement = walkerRef.current.root;
|
|
36
|
+
return lastChildRecursive(walkerRef.current);
|
|
37
|
+
case treeDataTypes.Home:
|
|
38
|
+
walkerRef.current.currentElement = walkerRef.current.root;
|
|
39
|
+
return walkerRef.current.firstChild();
|
|
40
|
+
case treeDataTypes.ArrowDown:
|
|
41
|
+
walkerRef.current.currentElement = data.target;
|
|
42
|
+
return walkerRef.current.nextElement();
|
|
43
|
+
case treeDataTypes.ArrowUp:
|
|
44
|
+
walkerRef.current.currentElement = data.target;
|
|
45
|
+
return walkerRef.current.previousElement();
|
|
46
|
+
}
|
|
47
|
+
};
|
|
48
|
+
function navigate(data) {
|
|
49
|
+
const nextElement = getNextElement(data);
|
|
50
|
+
if (nextElement) {
|
|
51
|
+
rove(nextElement);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
return {
|
|
55
|
+
navigate,
|
|
56
|
+
rootRef: useMergedRefs(walkerRootRef, rootRefCallback)
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
function lastChildRecursive(walker) {
|
|
60
|
+
let lastElement = null;
|
|
61
|
+
let nextElement = null;
|
|
62
|
+
while(nextElement = walker.lastChild()){
|
|
63
|
+
lastElement = nextElement;
|
|
64
|
+
}
|
|
65
|
+
return lastElement;
|
|
66
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["useTreeNavigation.ts"],"sourcesContent":["import { TreeNavigationData_unstable } from '../components/Tree/Tree.types';\nimport { nextTypeAheadElement } from '../utils/nextTypeAheadElement';\nimport { treeDataTypes } from '../utils/tokens';\nimport { useRovingTabIndex } from './useRovingTabIndexes';\nimport { HTMLElementWalker } from '../utils/createHTMLElementWalker';\nimport * as React from 'react';\nimport { useHTMLElementWalkerRef } from './useHTMLElementWalkerRef';\nimport { useMergedRefs } from '@fluentui/react-utilities';\n\nexport function useTreeNavigation() {\n const { rove, initialize: initializeRovingTabIndex } = useRovingTabIndex();\n const { walkerRef, rootRef: walkerRootRef } = useHTMLElementWalkerRef();\n\n const rootRefCallback: React.RefCallback<HTMLElement> = React.useCallback(\n root => {\n if (root && walkerRef.current) {\n initializeRovingTabIndex(walkerRef.current);\n }\n },\n [walkerRef, initializeRovingTabIndex],\n );\n\n const getNextElement = (data: TreeNavigationData_unstable) => {\n if (!walkerRef.current) {\n return null;\n }\n switch (data.type) {\n case treeDataTypes.Click:\n return data.target;\n case treeDataTypes.TypeAhead:\n walkerRef.current.currentElement = data.target;\n return nextTypeAheadElement(walkerRef.current, data.event.key);\n case treeDataTypes.ArrowLeft:\n walkerRef.current.currentElement = data.target;\n return walkerRef.current.parentElement();\n case treeDataTypes.ArrowRight:\n walkerRef.current.currentElement = data.target;\n return walkerRef.current.firstChild();\n case treeDataTypes.End:\n walkerRef.current.currentElement = walkerRef.current.root;\n return lastChildRecursive(walkerRef.current);\n case treeDataTypes.Home:\n walkerRef.current.currentElement = walkerRef.current.root;\n return walkerRef.current.firstChild();\n case treeDataTypes.ArrowDown:\n walkerRef.current.currentElement = data.target;\n return walkerRef.current.nextElement();\n case treeDataTypes.ArrowUp:\n walkerRef.current.currentElement = data.target;\n return walkerRef.current.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, rootRef: useMergedRefs(walkerRootRef, rootRefCallback) } 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"],"names":["nextTypeAheadElement","treeDataTypes","useRovingTabIndex","React","useHTMLElementWalkerRef","useMergedRefs","useTreeNavigation","rove","initialize","initializeRovingTabIndex","walkerRef","rootRef","walkerRootRef","rootRefCallback","useCallback","root","current","getNextElement","data","type","Click","target","TypeAhead","currentElement","event","key","ArrowLeft","parentElement","ArrowRight","firstChild","End","lastChildRecursive","Home","ArrowDown","nextElement","ArrowUp","previousElement","navigate","walker","lastElement","lastChild"],"mappings":"AACA,SAASA,oBAAoB,QAAQ,gCAAgC;AACrE,SAASC,aAAa,QAAQ,kBAAkB;AAChD,SAASC,iBAAiB,QAAQ,wBAAwB;AAE1D,YAAYC,WAAW,QAAQ;AAC/B,SAASC,uBAAuB,QAAQ,4BAA4B;AACpE,SAASC,aAAa,QAAQ,4BAA4B;AAE1D,OAAO,SAASC;IACd,MAAM,EAAEC,IAAI,EAAEC,YAAYC,wBAAwB,EAAE,GAAGP;IACvD,MAAM,EAAEQ,SAAS,EAAEC,SAASC,aAAa,EAAE,GAAGR;IAE9C,MAAMS,kBAAkDV,MAAMW,WAAW,CACvEC,CAAAA;QACE,IAAIA,QAAQL,UAAUM,OAAO,EAAE;YAC7BP,yBAAyBC,UAAUM,OAAO;QAC5C;IACF,GACA;QAACN;QAAWD;KAAyB;IAGvC,MAAMQ,iBAAiB,CAACC;QACtB,IAAI,CAACR,UAAUM,OAAO,EAAE;YACtB,OAAO;QACT;QACA,OAAQE,KAAKC,IAAI;YACf,KAAKlB,cAAcmB,KAAK;gBACtB,OAAOF,KAAKG,MAAM;YACpB,KAAKpB,cAAcqB,SAAS;gBAC1BZ,UAAUM,OAAO,CAACO,cAAc,GAAGL,KAAKG,MAAM;gBAC9C,OAAOrB,qBAAqBU,UAAUM,OAAO,EAAEE,KAAKM,KAAK,CAACC,GAAG;YAC/D,KAAKxB,cAAcyB,SAAS;gBAC1BhB,UAAUM,OAAO,CAACO,cAAc,GAAGL,KAAKG,MAAM;gBAC9C,OAAOX,UAAUM,OAAO,CAACW,aAAa;YACxC,KAAK1B,cAAc2B,UAAU;gBAC3BlB,UAAUM,OAAO,CAACO,cAAc,GAAGL,KAAKG,MAAM;gBAC9C,OAAOX,UAAUM,OAAO,CAACa,UAAU;YACrC,KAAK5B,cAAc6B,GAAG;gBACpBpB,UAAUM,OAAO,CAACO,cAAc,GAAGb,UAAUM,OAAO,CAACD,IAAI;gBACzD,OAAOgB,mBAAmBrB,UAAUM,OAAO;YAC7C,KAAKf,cAAc+B,IAAI;gBACrBtB,UAAUM,OAAO,CAACO,cAAc,GAAGb,UAAUM,OAAO,CAACD,IAAI;gBACzD,OAAOL,UAAUM,OAAO,CAACa,UAAU;YACrC,KAAK5B,cAAcgC,SAAS;gBAC1BvB,UAAUM,OAAO,CAACO,cAAc,GAAGL,KAAKG,MAAM;gBAC9C,OAAOX,UAAUM,OAAO,CAACkB,WAAW;YACtC,KAAKjC,cAAckC,OAAO;gBACxBzB,UAAUM,OAAO,CAACO,cAAc,GAAGL,KAAKG,MAAM;gBAC9C,OAAOX,UAAUM,OAAO,CAACoB,eAAe;QAC5C;IACF;IACA,SAASC,SAASnB,IAAiC;QACjD,MAAMgB,cAAcjB,eAAeC;QACnC,IAAIgB,aAAa;YACf3B,KAAK2B;QACP;IACF;IACA,OAAO;QAAEG;QAAU1B,SAASN,cAAcO,eAAeC;IAAiB;AAC5E;AAEA,SAASkB,mBAAmBO,MAAyB;IACnD,IAAIC,cAAkC;IACtC,IAAIL,cAAkC;IACtC,MAAQA,cAAcI,OAAOE,SAAS,GAAK;QACzCD,cAAcL;IAChB;IACA,OAAOK;AACT"}
|
|
@@ -11,11 +11,8 @@ Object.defineProperty(exports, "useFlatTree_unstable", {
|
|
|
11
11
|
const _interop_require_wildcard = require("@swc/helpers/_/_interop_require_wildcard");
|
|
12
12
|
const _react = /*#__PURE__*/ _interop_require_wildcard._(require("react"));
|
|
13
13
|
const _useRootTree = require("../../hooks/useRootTree");
|
|
14
|
-
const _useFlatTreeNavigation = require("./useFlatTreeNavigation");
|
|
15
|
-
const _createHTMLElementWalker = require("../../utils/createHTMLElementWalker");
|
|
16
|
-
const _reactsharedcontexts = require("@fluentui/react-shared-contexts");
|
|
17
|
-
const _treeItemFilter = require("../../utils/treeItemFilter");
|
|
18
14
|
const _reactutilities = require("@fluentui/react-utilities");
|
|
15
|
+
const _useFlatTreeNavigation = require("../../hooks/useFlatTreeNavigation");
|
|
19
16
|
const _useSubtree = require("../../hooks/useSubtree");
|
|
20
17
|
const _ImmutableSet = require("../../utils/ImmutableSet");
|
|
21
18
|
const _ImmutableMap = require("../../utils/ImmutableMap");
|
|
@@ -28,32 +25,19 @@ const useFlatTree_unstable = (props, ref)=>{
|
|
|
28
25
|
return isRoot ? useRootFlatTree(props, ref) : useSubFlatTree(props, ref);
|
|
29
26
|
};
|
|
30
27
|
function useRootFlatTree(props, ref) {
|
|
31
|
-
const
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
const handleNavigation = (0, _reactutilities.useEventCallback)((event, data)=>{
|
|
44
|
-
var _props_onNavigation;
|
|
45
|
-
(_props_onNavigation = props.onNavigation) === null || _props_onNavigation === void 0 ? void 0 : _props_onNavigation.call(props, event, data);
|
|
46
|
-
if (walkerRef.current && !event.isDefaultPrevented()) {
|
|
47
|
-
navigate(data, walkerRef.current);
|
|
48
|
-
}
|
|
28
|
+
const navigation = (0, _useFlatTreeNavigation.useFlatTreeNavigation)();
|
|
29
|
+
return Object.assign((0, _useRootTree.useRootTree)({
|
|
30
|
+
...props,
|
|
31
|
+
onNavigation: (0, _reactutilities.useEventCallback)((event, data)=>{
|
|
32
|
+
var _props_onNavigation;
|
|
33
|
+
(_props_onNavigation = props.onNavigation) === null || _props_onNavigation === void 0 ? void 0 : _props_onNavigation.call(props, event, data);
|
|
34
|
+
if (!event.isDefaultPrevented()) {
|
|
35
|
+
navigation.navigate(data);
|
|
36
|
+
}
|
|
37
|
+
})
|
|
38
|
+
}, (0, _reactutilities.useMergedRefs)(ref, navigation.rootRef)), {
|
|
39
|
+
treeType: 'flat'
|
|
49
40
|
});
|
|
50
|
-
return {
|
|
51
|
-
treeType: 'flat',
|
|
52
|
-
...(0, _useRootTree.useRootTree)({
|
|
53
|
-
...props,
|
|
54
|
-
onNavigation: handleNavigation
|
|
55
|
-
}, (0, _reactutilities.useMergedRefs)(ref, initializeWalker))
|
|
56
|
-
};
|
|
57
41
|
}
|
|
58
42
|
function useSubFlatTree(props, ref) {
|
|
59
43
|
if (process.env.NODE_ENV === 'development') {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["useFlatTree.js"],"sourcesContent":["import * as React from 'react';\nimport { useRootTree } from '../../hooks/useRootTree';\nimport {
|
|
1
|
+
{"version":3,"sources":["useFlatTree.js"],"sourcesContent":["import * as React from 'react';\nimport { useRootTree } from '../../hooks/useRootTree';\nimport { useEventCallback, useMergedRefs } from '@fluentui/react-utilities';\nimport { useFlatTreeNavigation } from '../../hooks/useFlatTreeNavigation';\nimport { useSubtree } from '../../hooks/useSubtree';\nimport { ImmutableSet } from '../../utils/ImmutableSet';\nimport { ImmutableMap } from '../../utils/ImmutableMap';\nimport { SubtreeContext } from '../../contexts/subtreeContext';\nexport const useFlatTree_unstable = (props, ref)=>{\n const isRoot = React.useContext(SubtreeContext) === undefined;\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 isRoot ? useRootFlatTree(props, ref) : useSubFlatTree(props, ref);\n};\nfunction useRootFlatTree(props, ref) {\n const navigation = useFlatTreeNavigation();\n return Object.assign(useRootTree({\n ...props,\n onNavigation: 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 (!event.isDefaultPrevented()) {\n navigation.navigate(data);\n }\n })\n }, useMergedRefs(ref, navigation.rootRef)), {\n treeType: 'flat'\n });\n}\nfunction useSubFlatTree(props, ref) {\n if (process.env.NODE_ENV === 'development') {\n throw new Error(`@fluentui/react-tree [useFlatTree]:\nSubtrees are not allowed in a FlatTree!\nYou cannot use a <FlatTree> component inside of another <FlatTree> nor a <Tree> component!`);\n }\n return {\n ...useSubtree(props, ref),\n // ------ defaultTreeContextValue\n level: 0,\n contextType: 'root',\n treeType: 'nested',\n selectionMode: 'none',\n openItems: ImmutableSet.empty,\n checkedItems: ImmutableMap.empty,\n requestTreeResponse: noop,\n appearance: 'subtle',\n size: 'medium',\n // ------ defaultTreeContextValue\n open: false\n };\n}\nfunction noop() {\n/* do nothing */ }\n"],"names":["useFlatTree_unstable","props","ref","isRoot","React","useContext","SubtreeContext","undefined","useRootFlatTree","useSubFlatTree","navigation","useFlatTreeNavigation","Object","assign","useRootTree","onNavigation","useEventCallback","event","data","_props_onNavigation","call","isDefaultPrevented","navigate","useMergedRefs","rootRef","treeType","process","env","NODE_ENV","Error","useSubtree","level","contextType","selectionMode","openItems","ImmutableSet","empty","checkedItems","ImmutableMap","requestTreeResponse","noop","appearance","size","open"],"mappings":";;;;+BAQaA;;;eAAAA;;;;iEARU;6BACK;gCACoB;uCACV;4BACX;8BACE;8BACA;gCACE;AACxB,MAAMA,uBAAuB,CAACC,OAAOC;IACxC,MAAMC,SAASC,OAAMC,UAAU,CAACC,8BAAc,MAAMC;IACpD,uDAAuD;IACvD,sEAAsE;IACtE,sDAAsD;IACtD,OAAOJ,SAASK,gBAAgBP,OAAOC,OAAOO,eAAeR,OAAOC;AACxE;AACA,SAASM,gBAAgBP,KAAK,EAAEC,GAAG;IAC/B,MAAMQ,aAAaC,IAAAA,4CAAqB;IACxC,OAAOC,OAAOC,MAAM,CAACC,IAAAA,wBAAW,EAAC;QAC7B,GAAGb,KAAK;QACRc,cAAcC,IAAAA,gCAAgB,EAAC,CAACC,OAAOC;YACnC,IAAIC;YACHA,CAAAA,sBAAsBlB,MAAMc,YAAY,AAAD,MAAO,QAAQI,wBAAwB,KAAK,IAAI,KAAK,IAAIA,oBAAoBC,IAAI,CAACnB,OAAOgB,OAAOC;YACxI,IAAI,CAACD,MAAMI,kBAAkB,IAAI;gBAC7BX,WAAWY,QAAQ,CAACJ;YACxB;QACJ;IACJ,GAAGK,IAAAA,6BAAa,EAACrB,KAAKQ,WAAWc,OAAO,IAAI;QACxCC,UAAU;IACd;AACJ;AACA,SAAShB,eAAeR,KAAK,EAAEC,GAAG;IAC9B,IAAIwB,QAAQC,GAAG,CAACC,QAAQ,KAAK,eAAe;QACxC,MAAM,IAAIC,MAAM,CAAC;;0FAEiE,CAAC;IACvF;IACA,OAAO;QACH,GAAGC,IAAAA,sBAAU,EAAC7B,OAAOC,IAAI;QACzB,iCAAiC;QACjC6B,OAAO;QACPC,aAAa;QACbP,UAAU;QACVQ,eAAe;QACfC,WAAWC,0BAAY,CAACC,KAAK;QAC7BC,cAAcC,0BAAY,CAACF,KAAK;QAChCG,qBAAqBC;QACrBC,YAAY;QACZC,MAAM;QACN,iCAAiC;QACjCC,MAAM;IACV;AACJ;AACA,SAASH;AACT,cAAc,GAAG"}
|
|
@@ -13,31 +13,17 @@ const _reactutilities = require("@fluentui/react-utilities");
|
|
|
13
13
|
const _react = /*#__PURE__*/ _interop_require_wildcard._(require("react"));
|
|
14
14
|
const _createHeadlessTree = require("../../utils/createHeadlessTree");
|
|
15
15
|
const _tokens = require("../../utils/tokens");
|
|
16
|
-
const _useFlatTreeNavigation = require("
|
|
16
|
+
const _useFlatTreeNavigation = require("../../hooks/useFlatTreeNavigation");
|
|
17
17
|
const _useControllableOpenItems = require("../../hooks/useControllableOpenItems");
|
|
18
18
|
const _getTreeItemValueFromElement = require("../../utils/getTreeItemValueFromElement");
|
|
19
19
|
const _useFlatControllableCheckedItems = require("./useFlatControllableCheckedItems");
|
|
20
|
-
const _createHTMLElementWalker = require("../../utils/createHTMLElementWalker");
|
|
21
|
-
const _treeItemFilter = require("../../utils/treeItemFilter");
|
|
22
|
-
const _reactsharedcontexts = require("@fluentui/react-shared-contexts");
|
|
23
20
|
function useHeadlessFlatTree_unstable(props, options = {}) {
|
|
24
21
|
const headlessTree = _react.useMemo(()=>(0, _createHeadlessTree.createHeadlessTree)(props), [
|
|
25
22
|
props
|
|
26
23
|
]);
|
|
27
24
|
const [openItems, setOpenItems] = (0, _useControllableOpenItems.useControllableOpenItems)(options);
|
|
28
25
|
const [checkedItems, setCheckedItems] = (0, _useFlatControllableCheckedItems.useFlatControllableCheckedItems)(options, headlessTree);
|
|
29
|
-
const
|
|
30
|
-
const { targetDocument } = (0, _reactsharedcontexts.useFluent_unstable)();
|
|
31
|
-
const walkerRef = _react.useRef();
|
|
32
|
-
const initializeWalker = _react.useCallback((root)=>{
|
|
33
|
-
if (root && targetDocument) {
|
|
34
|
-
walkerRef.current = (0, _createHTMLElementWalker.createHTMLElementWalker)(root, targetDocument, _treeItemFilter.treeItemFilter);
|
|
35
|
-
initialize(walkerRef.current);
|
|
36
|
-
}
|
|
37
|
-
}, [
|
|
38
|
-
initialize,
|
|
39
|
-
targetDocument
|
|
40
|
-
]);
|
|
26
|
+
const navigation = (0, _useFlatTreeNavigation.useFlatTreeNavigation)();
|
|
41
27
|
const treeRef = _react.useRef(null);
|
|
42
28
|
const handleOpenChange = (0, _reactutilities.useEventCallback)((event, data)=>{
|
|
43
29
|
var _options_onOpenChange;
|
|
@@ -82,7 +68,7 @@ function useHeadlessFlatTree_unstable(props, options = {}) {
|
|
|
82
68
|
var _treeRef_current;
|
|
83
69
|
return (_treeRef_current = treeRef.current) === null || _treeRef_current === void 0 ? void 0 : _treeRef_current.querySelector(`[${_getTreeItemValueFromElement.dataTreeItemValueAttrName}="${item.value}"]`);
|
|
84
70
|
}, []);
|
|
85
|
-
const ref = (0, _reactutilities.useMergedRefs)(treeRef,
|
|
71
|
+
const ref = (0, _reactutilities.useMergedRefs)(treeRef, navigation.rootRef);
|
|
86
72
|
const getTreeProps = _react.useCallback(()=>{
|
|
87
73
|
var _options_onNavigation;
|
|
88
74
|
return {
|
|
@@ -105,17 +91,13 @@ function useHeadlessFlatTree_unstable(props, options = {}) {
|
|
|
105
91
|
headlessTree
|
|
106
92
|
]);
|
|
107
93
|
return _react.useMemo(()=>({
|
|
108
|
-
navigate:
|
|
109
|
-
if (walkerRef.current) {
|
|
110
|
-
navigate(data, walkerRef.current);
|
|
111
|
-
}
|
|
112
|
-
},
|
|
94
|
+
navigate: navigation.navigate,
|
|
113
95
|
getTreeProps,
|
|
114
96
|
getNextNavigableItem,
|
|
115
97
|
getElementFromItem,
|
|
116
98
|
items
|
|
117
99
|
}), [
|
|
118
|
-
navigate,
|
|
100
|
+
navigation.navigate,
|
|
119
101
|
getTreeProps,
|
|
120
102
|
getNextNavigableItem,
|
|
121
103
|
getElementFromItem,
|
|
@@ -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 '
|
|
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 '../../hooks/useFlatTreeNavigation';\nimport { createNextOpenItems, useControllableOpenItems } from '../../hooks/useControllableOpenItems';\nimport { dataTreeItemValueAttrName } from '../../utils/getTreeItemValueFromElement';\nimport { createNextFlatCheckedItems, useFlatControllableCheckedItems } from './useFlatControllableCheckedItems';\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 navigation = useFlatTreeNavigation();\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, navigation.rootRef);\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: navigation.navigate,\n getTreeProps,\n getNextNavigableItem,\n getElementFromItem,\n items\n }), [\n navigation.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","navigation","useFlatTreeNavigation","treeRef","useRef","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","useCallback","_treeRef_current","current","querySelector","dataTreeItemValueAttrName","ref","useMergedRefs","rootRef","getTreeProps","_options_onNavigation","selectionMode","onNavigation","noop","items","navigate"],"mappings":"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"}
|
|
@@ -16,10 +16,7 @@ const _useNestedControllableCheckedItems = require("./useNestedControllableCheck
|
|
|
16
16
|
const _subtreeContext = require("../../contexts/subtreeContext");
|
|
17
17
|
const _useRootTree = require("../../hooks/useRootTree");
|
|
18
18
|
const _useSubtree = require("../../hooks/useSubtree");
|
|
19
|
-
const
|
|
20
|
-
const _treeItemFilter = require("../../utils/treeItemFilter");
|
|
21
|
-
const _useTreeNavigation = require("./useTreeNavigation");
|
|
22
|
-
const _reactsharedcontexts = require("@fluentui/react-shared-contexts");
|
|
19
|
+
const _useTreeNavigation = require("../../hooks/useTreeNavigation");
|
|
23
20
|
const _treeContext = require("../../contexts/treeContext");
|
|
24
21
|
const useTree_unstable = (props, ref)=>{
|
|
25
22
|
const isRoot = _react.useContext(_subtreeContext.SubtreeContext) === undefined;
|
|
@@ -31,55 +28,38 @@ const useTree_unstable = (props, ref)=>{
|
|
|
31
28
|
function useNestedRootTree(props, ref) {
|
|
32
29
|
const [openItems, setOpenItems] = (0, _useControllableOpenItems.useControllableOpenItems)(props);
|
|
33
30
|
const checkedItems = (0, _useNestedControllableCheckedItems.useNestedCheckedItems)(props);
|
|
34
|
-
const
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
if (walkerRef.current) {
|
|
31
|
+
const navigation = (0, _useTreeNavigation.useTreeNavigation)();
|
|
32
|
+
return Object.assign((0, _useRootTree.useRootTree)({
|
|
33
|
+
...props,
|
|
34
|
+
openItems,
|
|
35
|
+
checkedItems,
|
|
36
|
+
onOpenChange: (0, _reactutilities.useEventCallback)((event, data)=>{
|
|
37
|
+
var _props_onOpenChange;
|
|
38
|
+
const nextOpenItems = (0, _useControllableOpenItems.createNextOpenItems)(data, openItems);
|
|
39
|
+
(_props_onOpenChange = props.onOpenChange) === null || _props_onOpenChange === void 0 ? void 0 : _props_onOpenChange.call(props, event, {
|
|
40
|
+
...data,
|
|
41
|
+
openItems: nextOpenItems.dangerouslyGetInternalSet_unstable()
|
|
42
|
+
});
|
|
43
|
+
setOpenItems(nextOpenItems);
|
|
44
|
+
}),
|
|
45
|
+
onNavigation: (0, _reactutilities.useEventCallback)((event, data)=>{
|
|
46
|
+
var _props_onNavigation;
|
|
47
|
+
(_props_onNavigation = props.onNavigation) === null || _props_onNavigation === void 0 ? void 0 : _props_onNavigation.call(props, event, data);
|
|
48
|
+
if (!event.isDefaultPrevented()) {
|
|
49
|
+
navigation.navigate(data);
|
|
50
|
+
}
|
|
51
|
+
}),
|
|
52
|
+
onCheckedChange: (0, _reactutilities.useEventCallback)((event, data)=>{
|
|
57
53
|
var _props_onCheckedChange;
|
|
58
54
|
const nextCheckedItems = (0, _useNestedControllableCheckedItems.createNextNestedCheckedItems)(data, checkedItems);
|
|
59
55
|
(_props_onCheckedChange = props.onCheckedChange) === null || _props_onCheckedChange === void 0 ? void 0 : _props_onCheckedChange.call(props, event, {
|
|
60
56
|
...data,
|
|
61
57
|
checkedItems: nextCheckedItems.dangerouslyGetInternalMap_unstable()
|
|
62
58
|
});
|
|
63
|
-
}
|
|
64
|
-
})
|
|
65
|
-
|
|
66
|
-
var _props_onNavigation;
|
|
67
|
-
(_props_onNavigation = props.onNavigation) === null || _props_onNavigation === void 0 ? void 0 : _props_onNavigation.call(props, event, data);
|
|
68
|
-
if (walkerRef.current && !event.isDefaultPrevented()) {
|
|
69
|
-
navigate(data, walkerRef.current);
|
|
70
|
-
}
|
|
59
|
+
})
|
|
60
|
+
}, (0, _reactutilities.useMergedRefs)(ref, navigation.rootRef)), {
|
|
61
|
+
treeType: 'nested'
|
|
71
62
|
});
|
|
72
|
-
return {
|
|
73
|
-
treeType: 'nested',
|
|
74
|
-
...(0, _useRootTree.useRootTree)({
|
|
75
|
-
...props,
|
|
76
|
-
openItems,
|
|
77
|
-
checkedItems,
|
|
78
|
-
onOpenChange: handleOpenChange,
|
|
79
|
-
onNavigation: handleNavigation,
|
|
80
|
-
onCheckedChange: handleCheckedChange
|
|
81
|
-
}, (0, _reactutilities.useMergedRefs)(ref, initializeWalker))
|
|
82
|
-
};
|
|
83
63
|
}
|
|
84
64
|
function useNestedSubtree(props, ref) {
|
|
85
65
|
if (process.env.NODE_ENV === 'development') {
|
|
@@ -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 { SubtreeContext } from '../../contexts/subtreeContext';\nimport { useRootTree } from '../../hooks/useRootTree';\nimport { useSubtree } from '../../hooks/useSubtree';\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 { SubtreeContext } from '../../contexts/subtreeContext';\nimport { useRootTree } from '../../hooks/useRootTree';\nimport { useSubtree } from '../../hooks/useSubtree';\nimport { useTreeNavigation } from '../../hooks/useTreeNavigation';\nimport { useTreeContext_unstable } from '../../contexts/treeContext';\nexport const useTree_unstable = (props, ref)=>{\n const isRoot = React.useContext(SubtreeContext) === undefined;\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 isRoot ? useNestedRootTree(props, ref) : useNestedSubtree(props, ref);\n};\nfunction useNestedRootTree(props, ref) {\n const [openItems, setOpenItems] = useControllableOpenItems(props);\n const checkedItems = useNestedCheckedItems(props);\n const navigation = useTreeNavigation();\n return Object.assign(useRootTree({\n ...props,\n openItems,\n checkedItems,\n onOpenChange: 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 onNavigation: 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 (!event.isDefaultPrevented()) {\n navigation.navigate(data);\n }\n }),\n onCheckedChange: useEventCallback((event, data)=>{\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 }, useMergedRefs(ref, navigation.rootRef)), {\n treeType: 'nested'\n });\n}\nfunction useNestedSubtree(props, ref) {\n if (process.env.NODE_ENV === 'development') {\n // this doesn't break rule of hooks, as environment is a static value\n // eslint-disable-next-line react-hooks/rules-of-hooks\n const treeType = useTreeContext_unstable((ctx)=>ctx.treeType);\n if (treeType === 'flat') {\n throw new Error(`@fluentui/react-tree [useTree]:\nSubtrees are not allowed in a FlatTree!\nYou cannot use a <Tree> component inside of a <FlatTree> component!`);\n }\n }\n return useSubtree(props, ref);\n}\n"],"names":["useTree_unstable","props","ref","isRoot","React","useContext","SubtreeContext","undefined","useNestedRootTree","useNestedSubtree","openItems","setOpenItems","useControllableOpenItems","checkedItems","useNestedCheckedItems","navigation","useTreeNavigation","Object","assign","useRootTree","onOpenChange","useEventCallback","event","data","_props_onOpenChange","nextOpenItems","createNextOpenItems","call","dangerouslyGetInternalSet_unstable","onNavigation","_props_onNavigation","isDefaultPrevented","navigate","onCheckedChange","_props_onCheckedChange","nextCheckedItems","createNextNestedCheckedItems","dangerouslyGetInternalMap_unstable","useMergedRefs","rootRef","treeType","process","env","NODE_ENV","useTreeContext_unstable","ctx","Error","useSubtree"],"mappings":";;;;+BASaA;;;eAAAA;;;;iEATU;gCACyB;0CACc;mDACM;gCACrC;6BACH;4BACD;mCACO;6BACM;AACjC,MAAMA,mBAAmB,CAACC,OAAOC;IACpC,MAAMC,SAASC,OAAMC,UAAU,CAACC,8BAAc,MAAMC;IACpD,uDAAuD;IACvD,sEAAsE;IACtE,sDAAsD;IACtD,OAAOJ,SAASK,kBAAkBP,OAAOC,OAAOO,iBAAiBR,OAAOC;AAC5E;AACA,SAASM,kBAAkBP,KAAK,EAAEC,GAAG;IACjC,MAAM,CAACQ,WAAWC,aAAa,GAAGC,IAAAA,kDAAwB,EAACX;IAC3D,MAAMY,eAAeC,IAAAA,wDAAqB,EAACb;IAC3C,MAAMc,aAAaC,IAAAA,oCAAiB;IACpC,OAAOC,OAAOC,MAAM,CAACC,IAAAA,wBAAW,EAAC;QAC7B,GAAGlB,KAAK;QACRS;QACAG;QACAO,cAAcC,IAAAA,gCAAgB,EAAC,CAACC,OAAOC;YACnC,IAAIC;YACJ,MAAMC,gBAAgBC,IAAAA,6CAAmB,EAACH,MAAMb;YAC/Cc,CAAAA,sBAAsBvB,MAAMmB,YAAY,AAAD,MAAO,QAAQI,wBAAwB,KAAK,IAAI,KAAK,IAAIA,oBAAoBG,IAAI,CAAC1B,OAAOqB,OAAO;gBACpI,GAAGC,IAAI;gBACPb,WAAWe,cAAcG,kCAAkC;YAC/D;YACAjB,aAAac;QACjB;QACAI,cAAcR,IAAAA,gCAAgB,EAAC,CAACC,OAAOC;YACnC,IAAIO;YACHA,CAAAA,sBAAsB7B,MAAM4B,YAAY,AAAD,MAAO,QAAQC,wBAAwB,KAAK,IAAI,KAAK,IAAIA,oBAAoBH,IAAI,CAAC1B,OAAOqB,OAAOC;YACxI,IAAI,CAACD,MAAMS,kBAAkB,IAAI;gBAC7BhB,WAAWiB,QAAQ,CAACT;YACxB;QACJ;QACAU,iBAAiBZ,IAAAA,gCAAgB,EAAC,CAACC,OAAOC;YACtC,IAAIW;YACJ,MAAMC,mBAAmBC,IAAAA,+DAA4B,EAACb,MAAMV;YAC3DqB,CAAAA,yBAAyBjC,MAAMgC,eAAe,AAAD,MAAO,QAAQC,2BAA2B,KAAK,IAAI,KAAK,IAAIA,uBAAuBP,IAAI,CAAC1B,OAAOqB,OAAO;gBAChJ,GAAGC,IAAI;gBACPV,cAAcsB,iBAAiBE,kCAAkC;YACrE;QACJ;IACJ,GAAGC,IAAAA,6BAAa,EAACpC,KAAKa,WAAWwB,OAAO,IAAI;QACxCC,UAAU;IACd;AACJ;AACA,SAAS/B,iBAAiBR,KAAK,EAAEC,GAAG;IAChC,IAAIuC,QAAQC,GAAG,CAACC,QAAQ,KAAK,eAAe;QACxC,qEAAqE;QACrE,sDAAsD;QACtD,MAAMH,WAAWI,IAAAA,oCAAuB,EAAC,CAACC,MAAMA,IAAIL,QAAQ;QAC5D,IAAIA,aAAa,QAAQ;YACrB,MAAM,IAAIM,MAAM,CAAC;;mEAEsC,CAAC;QAC5D;IACJ;IACA,OAAOC,IAAAA,sBAAU,EAAC9C,OAAOC;AAC7B"}
|