@fluentui/react-tree 9.0.0-beta.23 → 9.0.0-beta.25
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 +88 -10
- package/CHANGELOG.md +37 -11
- package/dist/index.d.ts +75 -49
- package/lib/components/Tree/Tree.types.js +1 -1
- package/lib/components/Tree/Tree.types.js.map +1 -1
- package/lib/components/Tree/useRootTree.js +55 -73
- package/lib/components/Tree/useRootTree.js.map +1 -1
- package/lib/components/TreeItem/TreeItem.types.js.map +1 -1
- package/lib/components/TreeItem/renderTreeItem.js +4 -2
- package/lib/components/TreeItem/renderTreeItem.js.map +1 -1
- package/lib/components/TreeItem/useTreeItem.js +58 -16
- package/lib/components/TreeItem/useTreeItem.js.map +1 -1
- package/lib/components/TreeItem/useTreeItemContextValues.js +13 -6
- package/lib/components/TreeItem/useTreeItemContextValues.js.map +1 -1
- package/lib/components/TreeItemLayout/TreeItemLayout.types.js.map +1 -1
- package/lib/components/TreeItemLayout/renderTreeItemLayout.js.map +1 -1
- package/lib/components/TreeItemLayout/useTreeItemLayout.js +7 -28
- package/lib/components/TreeItemLayout/useTreeItemLayout.js.map +1 -1
- package/lib/components/TreeItemPersonaLayout/TreeItemPersonaLayout.types.js.map +1 -1
- package/lib/components/TreeItemPersonaLayout/renderTreeItemPersonaLayout.js.map +1 -1
- package/lib/components/TreeItemPersonaLayout/useTreeItemPersonaLayout.js.map +1 -1
- package/lib/contexts/index.js +1 -0
- package/lib/contexts/index.js.map +1 -1
- package/lib/contexts/treeContext.js +2 -2
- package/lib/contexts/treeContext.js.map +1 -1
- package/lib/contexts/treeItemContext.js +0 -4
- package/lib/contexts/treeItemContext.js.map +1 -1
- package/lib/contexts/treeItemSlotsContext.js +9 -0
- package/lib/contexts/treeItemSlotsContext.js.map +1 -0
- package/lib/hooks/index.js +1 -1
- package/lib/hooks/index.js.map +1 -1
- package/lib/hooks/useControllableOpenItems.js +25 -0
- package/lib/hooks/useControllableOpenItems.js.map +1 -0
- package/lib/hooks/useFlatTree.js +3 -3
- package/lib/hooks/useFlatTree.js.map +1 -1
- package/lib/index.js.map +1 -1
- package/lib/utils/ImmutableSet.js +16 -9
- package/lib/utils/ImmutableSet.js.map +1 -1
- package/lib/utils/createFlatTreeItems.js.map +1 -1
- package/lib/utils/flattenTree.js +0 -5
- package/lib/utils/flattenTree.js.map +1 -1
- package/lib-commonjs/components/Tree/Tree.types.js +0 -2
- package/lib-commonjs/components/Tree/Tree.types.js.map +1 -1
- package/lib-commonjs/components/Tree/useRootTree.js +54 -72
- package/lib-commonjs/components/Tree/useRootTree.js.map +1 -1
- package/lib-commonjs/components/TreeItem/renderTreeItem.js +3 -1
- package/lib-commonjs/components/TreeItem/renderTreeItem.js.map +1 -1
- package/lib-commonjs/components/TreeItem/useTreeItem.js +57 -15
- package/lib-commonjs/components/TreeItem/useTreeItem.js.map +1 -1
- package/lib-commonjs/components/TreeItem/useTreeItemContextValues.js +14 -6
- package/lib-commonjs/components/TreeItem/useTreeItemContextValues.js.map +1 -1
- package/lib-commonjs/components/TreeItemLayout/useTreeItemLayout.js +6 -26
- package/lib-commonjs/components/TreeItemLayout/useTreeItemLayout.js.map +1 -1
- package/lib-commonjs/contexts/index.js +1 -0
- package/lib-commonjs/contexts/index.js.map +1 -1
- package/lib-commonjs/contexts/treeContext.js +1 -1
- package/lib-commonjs/contexts/treeContext.js.map +1 -1
- package/lib-commonjs/contexts/treeItemContext.js +0 -4
- package/lib-commonjs/contexts/treeItemContext.js.map +1 -1
- package/lib-commonjs/contexts/treeItemSlotsContext.js +25 -0
- package/lib-commonjs/contexts/treeItemSlotsContext.js.map +1 -0
- package/lib-commonjs/hooks/index.js +1 -1
- package/lib-commonjs/hooks/index.js.map +1 -1
- package/lib-commonjs/hooks/{useOpenItemsState.js → useControllableOpenItems.js} +15 -14
- package/lib-commonjs/hooks/useControllableOpenItems.js.map +1 -0
- package/lib-commonjs/hooks/useFlatTree.js +3 -3
- package/lib-commonjs/hooks/useFlatTree.js.map +1 -1
- package/lib-commonjs/utils/ImmutableSet.js +21 -16
- package/lib-commonjs/utils/ImmutableSet.js.map +1 -1
- package/lib-commonjs/utils/flattenTree.js +0 -5
- package/lib-commonjs/utils/flattenTree.js.map +1 -1
- package/package.json +7 -7
- package/lib/hooks/useOpenItemsState.js +0 -28
- package/lib/hooks/useOpenItemsState.js.map +0 -1
- package/lib-commonjs/hooks/useOpenItemsState.js.map +0 -1
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import * as React from 'react';
|
|
2
2
|
import * as ReactDOM from 'react-dom';
|
|
3
3
|
import { getNativeElementProps, useEventCallback, useMergedRefs } from '@fluentui/react-utilities';
|
|
4
|
-
import {
|
|
4
|
+
import { createNextOpenItems, useControllableOpenItems, useNestedTreeNavigation } from '../../hooks';
|
|
5
5
|
import { treeDataTypes } from '../../utils/tokens';
|
|
6
6
|
/**
|
|
7
7
|
* Create the state required to render the root level Tree.
|
|
@@ -11,15 +11,19 @@ import { treeDataTypes } from '../../utils/tokens';
|
|
|
11
11
|
*/ export function useRootTree(props, ref) {
|
|
12
12
|
warnIfNoProperPropsRootTree(props);
|
|
13
13
|
const { appearance ='subtle' , size ='medium' } = props;
|
|
14
|
-
const [openItems,
|
|
14
|
+
const [openItems, setOpenItems] = useControllableOpenItems(props);
|
|
15
15
|
const [navigate, navigationRef] = useNestedTreeNavigation();
|
|
16
16
|
const requestOpenChange = (data)=>{
|
|
17
17
|
var _props_onOpenChange;
|
|
18
|
-
|
|
18
|
+
const nextOpenItems = createNextOpenItems(data, openItems);
|
|
19
|
+
(_props_onOpenChange = props.onOpenChange) === null || _props_onOpenChange === void 0 ? void 0 : _props_onOpenChange.call(props, data.event, {
|
|
20
|
+
...data,
|
|
21
|
+
openItems: nextOpenItems
|
|
22
|
+
});
|
|
19
23
|
if (data.event.isDefaultPrevented()) {
|
|
20
24
|
return;
|
|
21
25
|
}
|
|
22
|
-
return
|
|
26
|
+
return setOpenItems(nextOpenItems);
|
|
23
27
|
};
|
|
24
28
|
const requestNavigation = (data)=>{
|
|
25
29
|
var _props_onNavigation_unstable;
|
|
@@ -32,91 +36,69 @@ import { treeDataTypes } from '../../utils/tokens';
|
|
|
32
36
|
data.event.preventDefault();
|
|
33
37
|
}
|
|
34
38
|
};
|
|
35
|
-
const
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
};
|
|
52
|
-
const handleTreeItemKeyDown = ({ event , type , value , itemType })=>{
|
|
53
|
-
const open = openItems.has(value);
|
|
54
|
-
switch(type){
|
|
39
|
+
const requestTreeResponse = useEventCallback((request)=>{
|
|
40
|
+
switch(request.type){
|
|
41
|
+
case treeDataTypes.Click:
|
|
42
|
+
case treeDataTypes.ExpandIconClick:
|
|
43
|
+
{
|
|
44
|
+
return ReactDOM.unstable_batchedUpdates(()=>{
|
|
45
|
+
requestOpenChange({
|
|
46
|
+
...request,
|
|
47
|
+
open: request.itemType === 'branch' && !openItems.has(request.value)
|
|
48
|
+
});
|
|
49
|
+
requestNavigation({
|
|
50
|
+
...request,
|
|
51
|
+
type: treeDataTypes.Click
|
|
52
|
+
});
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
55
|
case treeDataTypes.ArrowRight:
|
|
56
|
-
|
|
57
|
-
|
|
56
|
+
{
|
|
57
|
+
if (request.itemType === 'leaf') {
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
const open = openItems.has(request.value);
|
|
61
|
+
if (!open) {
|
|
62
|
+
return requestOpenChange({
|
|
63
|
+
...request,
|
|
64
|
+
open: true
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
return requestNavigation(request);
|
|
58
68
|
}
|
|
59
|
-
|
|
69
|
+
case treeDataTypes.Enter:
|
|
70
|
+
{
|
|
71
|
+
const open = openItems.has(request.value);
|
|
60
72
|
return requestOpenChange({
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
open: true,
|
|
64
|
-
type: treeDataTypes.ArrowRight,
|
|
65
|
-
target: event.currentTarget
|
|
73
|
+
...request,
|
|
74
|
+
open: request.itemType === 'branch' && !open
|
|
66
75
|
});
|
|
67
76
|
}
|
|
68
|
-
return requestNavigation({
|
|
69
|
-
event,
|
|
70
|
-
value,
|
|
71
|
-
type,
|
|
72
|
-
target: event.currentTarget
|
|
73
|
-
});
|
|
74
|
-
case treeDataTypes.Enter:
|
|
75
|
-
return requestOpenChange({
|
|
76
|
-
event,
|
|
77
|
-
value,
|
|
78
|
-
open: itemType === 'branch' && !open,
|
|
79
|
-
type: treeDataTypes.Enter,
|
|
80
|
-
target: event.currentTarget
|
|
81
|
-
});
|
|
82
77
|
case treeDataTypes.ArrowLeft:
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
78
|
+
{
|
|
79
|
+
const open = openItems.has(request.value);
|
|
80
|
+
if (open && request.itemType === 'branch') {
|
|
81
|
+
return requestOpenChange({
|
|
82
|
+
...request,
|
|
83
|
+
open: false,
|
|
84
|
+
type: treeDataTypes.ArrowLeft
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
return requestNavigation({
|
|
88
|
+
...request,
|
|
89
|
+
type: treeDataTypes.ArrowLeft
|
|
90
90
|
});
|
|
91
91
|
}
|
|
92
|
-
return requestNavigation({
|
|
93
|
-
event,
|
|
94
|
-
value,
|
|
95
|
-
target: event.currentTarget,
|
|
96
|
-
type: treeDataTypes.ArrowLeft
|
|
97
|
-
});
|
|
98
92
|
case treeDataTypes.End:
|
|
99
93
|
case treeDataTypes.Home:
|
|
100
94
|
case treeDataTypes.ArrowUp:
|
|
101
95
|
case treeDataTypes.ArrowDown:
|
|
102
96
|
case treeDataTypes.TypeAhead:
|
|
103
97
|
return requestNavigation({
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
type,
|
|
107
|
-
target: event.currentTarget
|
|
98
|
+
...request,
|
|
99
|
+
target: request.event.currentTarget
|
|
108
100
|
});
|
|
109
101
|
}
|
|
110
|
-
};
|
|
111
|
-
const requestTreeResponse = useEventCallback((request)=>{
|
|
112
|
-
switch(request.event.type){
|
|
113
|
-
case 'click':
|
|
114
|
-
// casting is required here as we're narrowing down the event to only click events
|
|
115
|
-
return handleTreeItemClick(request);
|
|
116
|
-
case 'keydown':
|
|
117
|
-
// casting is required here as we're narrowing down the event to only keyboard events
|
|
118
|
-
return handleTreeItemKeyDown(request);
|
|
119
|
-
}
|
|
120
102
|
});
|
|
121
103
|
return {
|
|
122
104
|
components: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["useRootTree.ts"],"sourcesContent":["import * as React from 'react';\nimport * as ReactDOM from 'react-dom';\nimport { getNativeElementProps, useEventCallback, useMergedRefs } from '@fluentui/react-utilities';\nimport { TreeOpenChangeData, TreeProps, TreeState, TreeNavigationData_unstable } from './Tree.types';\nimport {
|
|
1
|
+
{"version":3,"sources":["useRootTree.ts"],"sourcesContent":["import * as React from 'react';\nimport * as ReactDOM from 'react-dom';\nimport { getNativeElementProps, useEventCallback, useMergedRefs } from '@fluentui/react-utilities';\nimport type { TreeOpenChangeData, TreeProps, TreeState, TreeNavigationData_unstable } from './Tree.types';\nimport { createNextOpenItems, useControllableOpenItems, useNestedTreeNavigation } from '../../hooks';\nimport { treeDataTypes } from '../../utils/tokens';\nimport { TreeItemRequest } from '../../contexts';\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(props: TreeProps, ref: React.Ref<HTMLElement>): TreeState {\n warnIfNoProperPropsRootTree(props);\n\n const { appearance = 'subtle', size = 'medium' } = props;\n\n const [openItems, setOpenItems] = useControllableOpenItems(props);\n\n const [navigate, navigationRef] = useNestedTreeNavigation();\n\n const requestOpenChange = (data: Omit<TreeOpenChangeData, 'openItems'>) => {\n const nextOpenItems = createNextOpenItems(data, openItems);\n props.onOpenChange?.(data.event, { ...data, openItems: nextOpenItems } as TreeOpenChangeData);\n if (data.event.isDefaultPrevented()) {\n return;\n }\n return setOpenItems(nextOpenItems);\n };\n\n const requestNavigation = (data: TreeNavigationData_unstable) => {\n props.onNavigation_unstable?.(data.event, data);\n if (data.event.isDefaultPrevented()) {\n return;\n }\n navigate(data);\n if (data.type === treeDataTypes.ArrowDown || data.type === treeDataTypes.ArrowUp) {\n data.event.preventDefault();\n }\n };\n\n const requestTreeResponse = useEventCallback((request: TreeItemRequest) => {\n switch (request.type) {\n case treeDataTypes.Click:\n case treeDataTypes.ExpandIconClick: {\n return ReactDOM.unstable_batchedUpdates(() => {\n requestOpenChange({ ...request, open: request.itemType === 'branch' && !openItems.has(request.value) });\n requestNavigation({ ...request, type: treeDataTypes.Click });\n });\n }\n case treeDataTypes.ArrowRight: {\n if (request.itemType === 'leaf') {\n return;\n }\n const open = openItems.has(request.value);\n if (!open) {\n return requestOpenChange({ ...request, open: true });\n }\n return requestNavigation(request);\n }\n case treeDataTypes.Enter: {\n const open = openItems.has(request.value);\n return requestOpenChange({ ...request, open: request.itemType === 'branch' && !open });\n }\n case treeDataTypes.ArrowLeft: {\n const open = openItems.has(request.value);\n if (open && request.itemType === 'branch') {\n return requestOpenChange({ ...request, open: false, type: treeDataTypes.ArrowLeft });\n }\n return requestNavigation({ ...request, type: treeDataTypes.ArrowLeft });\n }\n case treeDataTypes.End:\n case treeDataTypes.Home:\n case treeDataTypes.ArrowUp:\n case treeDataTypes.ArrowDown:\n case treeDataTypes.TypeAhead:\n return requestNavigation({ ...request, target: request.event.currentTarget });\n }\n });\n\n return {\n components: {\n root: 'div',\n },\n open: true,\n appearance,\n size,\n level: 1,\n openItems,\n requestTreeResponse,\n root: getNativeElementProps('div', {\n ref: useMergedRefs(navigationRef, ref),\n role: 'tree',\n ...props,\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('Tree must have either a `aria-label` or `aria-labelledby` property defined');\n }\n }\n}\n"],"names":["React","ReactDOM","getNativeElementProps","useEventCallback","useMergedRefs","createNextOpenItems","useControllableOpenItems","useNestedTreeNavigation","treeDataTypes","useRootTree","props","ref","warnIfNoProperPropsRootTree","appearance","size","openItems","setOpenItems","navigate","navigationRef","requestOpenChange","data","nextOpenItems","onOpenChange","event","isDefaultPrevented","requestNavigation","onNavigation_unstable","type","ArrowDown","ArrowUp","preventDefault","requestTreeResponse","request","Click","ExpandIconClick","unstable_batchedUpdates","open","itemType","has","value","ArrowRight","Enter","ArrowLeft","End","Home","TypeAhead","target","currentTarget","components","root","level","role","process","env","NODE_ENV","console","warn"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["TreeItem.types.ts"],"sourcesContent":["import type { ComponentProps, ComponentState, ExtractSlotProps, Slot } from '@fluentui/react-utilities';\nimport type { TreeItemContextValue } from '../../contexts';\nimport { treeItemLevelToken } from '../../utils/tokens';\nimport * as React from 'react';\n\nexport type TreeItemCSSProperties = React.CSSProperties & { [treeItemLevelToken]?: string | number };\n\nexport type TreeItemType = 'leaf' | 'branch';\n\nexport type TreeItemSlots = {\n root: Slot<ExtractSlotProps<Slot<'div'> & { style?: TreeItemCSSProperties }>>;\n};\n\nexport type TreeItemValue = string | number;\n\nexport type TreeItemContextValues = {
|
|
1
|
+
{"version":3,"sources":["TreeItem.types.ts"],"sourcesContent":["import type { ComponentProps, ComponentState, ExtractSlotProps, Slot } from '@fluentui/react-utilities';\nimport type { TreeItemContextValue } from '../../contexts';\nimport { treeItemLevelToken } from '../../utils/tokens';\nimport * as React from 'react';\nimport { TreeItemSlotsContextValue } from '../../contexts/treeItemSlotsContext';\n\nexport type TreeItemCSSProperties = React.CSSProperties & { [treeItemLevelToken]?: string | number };\n\nexport type TreeItemType = 'leaf' | 'branch';\n\nexport type TreeItemSlots = {\n root: Slot<ExtractSlotProps<Slot<'div'> & { style?: TreeItemCSSProperties }>>;\n /**\n * Expand icon slot,\n * by default renders a chevron icon to indicate opening and closing\n */\n expandIcon?: Slot<'div'>;\n aside?: Slot<'div'>;\n /**\n * actionable elements are normally buttons, menus, or other focusable elements.\n * Those elements are only visibly available if the given tree item is currently active.\n */\n actions?: Slot<\n ExtractSlotProps<\n Slot<'div'> & {\n /**\n * Forces visibility of the aside/action content\n */\n visible?: boolean;\n }\n >\n >;\n};\n\nexport type TreeItemInternalSlot = Pick<TreeItemSlots, 'root'>;\n\nexport type TreeItemValue = string | number;\n\nexport type TreeItemContextValues = {\n treeItem: TreeItemContextValue;\n treeItemSlots: TreeItemSlotsContextValue;\n};\n\n/**\n * TreeItem Props\n */\nexport type TreeItemProps = ComponentProps<Partial<TreeItemSlots>> & {\n itemType: TreeItemType;\n value?: TreeItemValue;\n};\n\n/**\n * State used in rendering TreeItem\n */\nexport type TreeItemState = ComponentState<TreeItemInternalSlot> &\n TreeItemContextValue &\n TreeItemSlotsContextValue & {\n level: number;\n itemType: TreeItemType;\n };\n"],"names":["React"],"mappings":"AAGA,YAAYA,WAAW,QAAQ"}
|
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
/** @jsxRuntime classic */ /** @jsx createElement */ import { createElement } from '@fluentui/react-jsx-runtime';
|
|
2
2
|
import { getSlotsNext } from '@fluentui/react-utilities';
|
|
3
|
-
import { TreeItemProvider } from '../../contexts';
|
|
3
|
+
import { TreeItemProvider, TreeItemSlotsProvider } from '../../contexts';
|
|
4
4
|
/**
|
|
5
5
|
* Render the final JSX of TreeItem
|
|
6
6
|
*/ export const renderTreeItem_unstable = (state, contextValues)=>{
|
|
7
7
|
const { slots , slotProps } = getSlotsNext(state);
|
|
8
8
|
return /*#__PURE__*/ createElement(slots.root, slotProps.root, /*#__PURE__*/ createElement(TreeItemProvider, {
|
|
9
9
|
value: contextValues.treeItem
|
|
10
|
-
},
|
|
10
|
+
}, /*#__PURE__*/ createElement(TreeItemSlotsProvider, {
|
|
11
|
+
value: contextValues.treeItemSlots
|
|
12
|
+
}, slotProps.root.children)));
|
|
11
13
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["renderTreeItem.tsx"],"sourcesContent":["/** @jsxRuntime classic */\n/** @jsx createElement */\n\nimport { createElement } from '@fluentui/react-jsx-runtime';\nimport { getSlotsNext } from '@fluentui/react-utilities';\nimport type { TreeItemState,
|
|
1
|
+
{"version":3,"sources":["renderTreeItem.tsx"],"sourcesContent":["/** @jsxRuntime classic */\n/** @jsx createElement */\n\nimport { createElement } from '@fluentui/react-jsx-runtime';\nimport { getSlotsNext } from '@fluentui/react-utilities';\nimport type { TreeItemState, TreeItemContextValues, TreeItemInternalSlot } from './TreeItem.types';\nimport { TreeItemProvider, TreeItemSlotsProvider } from '../../contexts';\n\n/**\n * Render the final JSX of TreeItem\n */\nexport const renderTreeItem_unstable = (state: TreeItemState, contextValues: TreeItemContextValues) => {\n const { slots, slotProps } = getSlotsNext<TreeItemInternalSlot>(state);\n\n return (\n <slots.root {...slotProps.root}>\n <TreeItemProvider value={contextValues.treeItem}>\n <TreeItemSlotsProvider value={contextValues.treeItemSlots}>{slotProps.root.children}</TreeItemSlotsProvider>\n </TreeItemProvider>\n </slots.root>\n );\n};\n"],"names":["createElement","getSlotsNext","TreeItemProvider","TreeItemSlotsProvider","renderTreeItem_unstable","state","contextValues","slots","slotProps","root","value","treeItem","treeItemSlots","children"],"mappings":"AAAA,wBAAwB,GACxB,uBAAuB,GAEvB,SAASA,aAAa,QAAQ,8BAA8B;AAC5D,SAASC,YAAY,QAAQ,4BAA4B;AAEzD,SAASC,gBAAgB,EAAEC,qBAAqB,QAAQ,iBAAiB;AAEzE;;CAEC,GACD,OAAO,MAAMC,0BAA0B,CAACC,OAAsBC,gBAAyC;IACrG,MAAM,EAAEC,MAAK,EAAEC,UAAS,EAAE,GAAGP,aAAmCI;IAEhE,qBACE,AAdJ,cAcKE,MAAME,IAAI,EAAKD,UAAUC,IAAI,gBAC5B,AAfN,cAeOP;QAAiBQ,OAAOJ,cAAcK,QAAQ;qBAC7C,AAhBR,cAgBSR;QAAsBO,OAAOJ,cAAcM,aAAa;OAAGJ,UAAUC,IAAI,CAACI,QAAQ;AAI3F,EAAE"}
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import * as React from 'react';
|
|
2
|
-
import { getNativeElementProps, useId, useMergedRefs } from '@fluentui/react-utilities';
|
|
2
|
+
import { getNativeElementProps, isResolvedShorthand, resolveShorthand, useControllableState, useId, useMergedRefs } from '@fluentui/react-utilities';
|
|
3
3
|
import { useEventCallback } from '@fluentui/react-utilities';
|
|
4
4
|
import { elementContains } from '@fluentui/react-portal';
|
|
5
5
|
import { useTreeContext_unstable } from '../../contexts/index';
|
|
6
6
|
import { treeDataTypes } from '../../utils/tokens';
|
|
7
7
|
import { dataTreeItemValueAttrName } from '../../utils/getTreeItemValueFromElement';
|
|
8
|
+
import { TreeItemChevron } from '../TreeItemChevron';
|
|
8
9
|
/**
|
|
9
10
|
* Create the state required to render TreeItem.
|
|
10
11
|
*
|
|
@@ -17,18 +18,34 @@ import { dataTreeItemValueAttrName } from '../../utils/getTreeItemValueFromEleme
|
|
|
17
18
|
var _props_value;
|
|
18
19
|
const contextLevel = useTreeContext_unstable((ctx)=>ctx.level);
|
|
19
20
|
const value = useId('fuiTreeItemValue-', (_props_value = props.value) === null || _props_value === void 0 ? void 0 : _props_value.toString());
|
|
20
|
-
const { onClick , onKeyDown , as ='div' , itemType ='leaf' , 'aria-level': level = contextLevel , ...rest } = props;
|
|
21
|
+
const { onClick , onKeyDown , as ='div' , itemType ='leaf' , 'aria-level': level = contextLevel , expandIcon , aside , ...rest } = props;
|
|
21
22
|
const requestTreeResponse = useTreeContext_unstable((ctx)=>ctx.requestTreeResponse);
|
|
22
|
-
const [
|
|
23
|
+
const [isActionsVisibleExternal, actions] = isResolvedShorthand(props.actions) ? [
|
|
24
|
+
props.actions.visible,
|
|
25
|
+
{
|
|
26
|
+
...props.actions,
|
|
27
|
+
visible: undefined
|
|
28
|
+
}
|
|
29
|
+
] : [
|
|
30
|
+
undefined,
|
|
31
|
+
props.actions
|
|
32
|
+
];
|
|
33
|
+
const [isActionsVisible, setActionsVisible] = useControllableState({
|
|
34
|
+
state: isActionsVisibleExternal,
|
|
35
|
+
defaultState: false,
|
|
36
|
+
initialState: false
|
|
37
|
+
});
|
|
23
38
|
const [isAsideVisible, setAsideVisible] = React.useState(true);
|
|
24
|
-
const handleActionsRef = (
|
|
25
|
-
setAsideVisible(
|
|
39
|
+
const handleActionsRef = (actionsElement)=>{
|
|
40
|
+
setAsideVisible(actionsElement === null);
|
|
26
41
|
};
|
|
27
42
|
const open = useTreeContext_unstable((ctx)=>ctx.openItems.has(value));
|
|
28
43
|
const actionsRef = React.useRef(null);
|
|
29
44
|
const expandIconRef = React.useRef(null);
|
|
30
45
|
const layoutRef = React.useRef(null);
|
|
31
46
|
const subtreeRef = React.useRef(null);
|
|
47
|
+
const actionsRefs = useMergedRefs(isResolvedShorthand(actions) ? actions.ref : undefined, handleActionsRef, actionsRef);
|
|
48
|
+
const expandIconRefs = useMergedRefs(isResolvedShorthand(expandIcon) ? expandIcon.ref : undefined, expandIconRef);
|
|
32
49
|
const handleClick = useEventCallback((event)=>{
|
|
33
50
|
onClick === null || onClick === void 0 ? void 0 : onClick(event);
|
|
34
51
|
if (event.isDefaultPrevented()) {
|
|
@@ -45,17 +62,16 @@ import { dataTreeItemValueAttrName } from '../../utils/getTreeItemValueFromEleme
|
|
|
45
62
|
const isFromExpandIcon = expandIconRef.current && elementContains(expandIconRef.current, event.target);
|
|
46
63
|
requestTreeResponse({
|
|
47
64
|
event,
|
|
48
|
-
itemType,
|
|
49
65
|
value,
|
|
66
|
+
itemType,
|
|
67
|
+
target: event.currentTarget,
|
|
50
68
|
type: isFromExpandIcon ? treeDataTypes.ExpandIconClick : treeDataTypes.Click
|
|
51
69
|
});
|
|
52
70
|
});
|
|
53
71
|
const handleKeyDown = useEventCallback((event)=>{
|
|
54
72
|
onKeyDown === null || onKeyDown === void 0 ? void 0 : onKeyDown(event);
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
}
|
|
58
|
-
if (event.currentTarget !== event.target) {
|
|
73
|
+
// Ignore keyboard events that do not originate from the current tree item.
|
|
74
|
+
if (event.isDefaultPrevented() || event.currentTarget !== event.target) {
|
|
59
75
|
return;
|
|
60
76
|
}
|
|
61
77
|
switch(event.key){
|
|
@@ -68,6 +84,7 @@ import { dataTreeItemValueAttrName } from '../../utils/getTreeItemValueFromEleme
|
|
|
68
84
|
case treeDataTypes.ArrowRight:
|
|
69
85
|
return requestTreeResponse({
|
|
70
86
|
event,
|
|
87
|
+
target: event.currentTarget,
|
|
71
88
|
value,
|
|
72
89
|
itemType,
|
|
73
90
|
type: event.key
|
|
@@ -77,6 +94,7 @@ import { dataTreeItemValueAttrName } from '../../utils/getTreeItemValueFromEleme
|
|
|
77
94
|
if (isTypeAheadCharacter) {
|
|
78
95
|
requestTreeResponse({
|
|
79
96
|
event,
|
|
97
|
+
target: event.currentTarget,
|
|
80
98
|
value,
|
|
81
99
|
itemType,
|
|
82
100
|
type: treeDataTypes.TypeAhead
|
|
@@ -99,16 +117,37 @@ import { dataTreeItemValueAttrName } from '../../utils/getTreeItemValueFromEleme
|
|
|
99
117
|
return setActionsVisible(false);
|
|
100
118
|
}
|
|
101
119
|
});
|
|
120
|
+
const isBranch = itemType === 'branch';
|
|
121
|
+
const actionsSlot = React.useMemo(()=>isActionsVisible ? resolveShorthand(actions) : undefined, [
|
|
122
|
+
actions,
|
|
123
|
+
isActionsVisible
|
|
124
|
+
]);
|
|
125
|
+
if (actionsSlot) {
|
|
126
|
+
actionsSlot.ref = actionsRefs;
|
|
127
|
+
}
|
|
128
|
+
const asideSlot = React.useMemo(()=>isAsideVisible ? resolveShorthand(aside) : undefined, [
|
|
129
|
+
aside,
|
|
130
|
+
isAsideVisible
|
|
131
|
+
]);
|
|
132
|
+
const expandIconSlot = React.useMemo(()=>resolveShorthand(expandIcon, {
|
|
133
|
+
required: isBranch,
|
|
134
|
+
defaultProps: {
|
|
135
|
+
children: /*#__PURE__*/ React.createElement(TreeItemChevron, null),
|
|
136
|
+
'aria-hidden': true
|
|
137
|
+
}
|
|
138
|
+
}), [
|
|
139
|
+
expandIcon,
|
|
140
|
+
isBranch
|
|
141
|
+
]);
|
|
142
|
+
if (expandIconSlot) {
|
|
143
|
+
expandIconSlot.ref = expandIconRefs;
|
|
144
|
+
}
|
|
102
145
|
return {
|
|
103
146
|
value,
|
|
104
147
|
open,
|
|
105
148
|
subtreeRef,
|
|
106
|
-
actionsRef: useMergedRefs(actionsRef, handleActionsRef),
|
|
107
|
-
expandIconRef,
|
|
108
149
|
layoutRef,
|
|
109
150
|
itemType,
|
|
110
|
-
isActionsVisible,
|
|
111
|
-
isAsideVisible,
|
|
112
151
|
level,
|
|
113
152
|
components: {
|
|
114
153
|
root: 'div'
|
|
@@ -120,13 +159,16 @@ import { dataTreeItemValueAttrName } from '../../utils/getTreeItemValueFromEleme
|
|
|
120
159
|
role: 'treeitem',
|
|
121
160
|
'aria-level': level,
|
|
122
161
|
[dataTreeItemValueAttrName]: value,
|
|
123
|
-
'aria-expanded':
|
|
162
|
+
'aria-expanded': isBranch ? open : undefined,
|
|
124
163
|
onClick: handleClick,
|
|
125
164
|
onKeyDown: handleKeyDown,
|
|
126
165
|
onMouseOver: handleActionsVisible,
|
|
127
166
|
onFocus: handleActionsVisible,
|
|
128
167
|
onMouseOut: handleActionsInvisible,
|
|
129
168
|
onBlur: handleActionsInvisible
|
|
130
|
-
})
|
|
169
|
+
}),
|
|
170
|
+
actions: actionsSlot,
|
|
171
|
+
aside: asideSlot,
|
|
172
|
+
expandIcon: expandIconSlot
|
|
131
173
|
};
|
|
132
174
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["useTreeItem.ts"],"sourcesContent":["import * as React from 'react';\nimport { getNativeElementProps, useId, useMergedRefs } from '@fluentui/react-utilities';\nimport { useEventCallback } from '@fluentui/react-utilities';\nimport { elementContains } from '@fluentui/react-portal';\nimport type { TreeItemProps, TreeItemState } from './TreeItem.types';\nimport { useTreeContext_unstable } from '../../contexts/index';\nimport { treeDataTypes } from '../../utils/tokens';\nimport { dataTreeItemValueAttrName } from '../../utils/getTreeItemValueFromElement';\n\n/**\n * Create the state required to render TreeItem.\n *\n * The returned state can be modified with hooks such as useTreeItemStyles_unstable,\n * before being passed to renderTreeItem_unstable.\n *\n * @param props - props from this instance of TreeItem\n * @param ref - reference to root HTMLElement of TreeItem\n */\nexport function useTreeItem_unstable(props: TreeItemProps, ref: React.Ref<HTMLDivElement>): TreeItemState {\n const contextLevel = useTreeContext_unstable(ctx => ctx.level);\n\n const value = useId('fuiTreeItemValue-', props.value?.toString());\n\n const { onClick, onKeyDown, as = 'div', itemType = 'leaf', 'aria-level': level = contextLevel, ...rest } = props;\n\n const requestTreeResponse = useTreeContext_unstable(ctx => ctx.requestTreeResponse);\n\n const [isActionsVisible, setActionsVisible] = React.useState(false);\n const [isAsideVisible, setAsideVisible] = React.useState(true);\n\n const handleActionsRef = (actions: HTMLDivElement | null) => {\n setAsideVisible(actions === null);\n };\n\n const open = useTreeContext_unstable(ctx => ctx.openItems.has(value));\n\n const actionsRef = React.useRef<HTMLDivElement>(null);\n const expandIconRef = React.useRef<HTMLDivElement>(null);\n const layoutRef = React.useRef<HTMLDivElement>(null);\n const subtreeRef = React.useRef<HTMLDivElement>(null);\n\n const handleClick = useEventCallback((event: React.MouseEvent<HTMLDivElement>) => {\n onClick?.(event);\n if (event.isDefaultPrevented()) {\n return;\n }\n const isEventFromActions = actionsRef.current && elementContains(actionsRef.current, event.target as Node);\n if (isEventFromActions) {\n return;\n }\n const isEventFromSubtree = subtreeRef.current && elementContains(subtreeRef.current, event.target as Node);\n if (isEventFromSubtree) {\n return;\n }\n const isFromExpandIcon = expandIconRef.current && elementContains(expandIconRef.current, event.target as Node);\n requestTreeResponse({\n event,\n itemType,\n value,\n type: isFromExpandIcon ? treeDataTypes.ExpandIconClick : treeDataTypes.Click,\n });\n });\n\n const handleKeyDown = useEventCallback((event: React.KeyboardEvent<HTMLDivElement>) => {\n onKeyDown?.(event);\n if (event.isDefaultPrevented()) {\n return;\n }\n if (event.currentTarget !== event.target) {\n return;\n }\n switch (event.key) {\n case treeDataTypes.End:\n case treeDataTypes.Home:\n case treeDataTypes.Enter:\n case treeDataTypes.ArrowUp:\n case treeDataTypes.ArrowDown:\n case treeDataTypes.ArrowLeft:\n case treeDataTypes.ArrowRight:\n return requestTreeResponse({ event, value, itemType, type: event.key });\n }\n const isTypeAheadCharacter =\n event.key.length === 1 && event.key.match(/\\w/) && !event.altKey && !event.ctrlKey && !event.metaKey;\n if (isTypeAheadCharacter) {\n requestTreeResponse({ event, value, itemType, type: treeDataTypes.TypeAhead });\n }\n });\n\n const handleActionsVisible = useEventCallback((event: React.FocusEvent | React.MouseEvent) => {\n const isTargetFromSubtree = Boolean(\n subtreeRef.current && elementContains(subtreeRef.current, event.target as Node),\n );\n if (!isTargetFromSubtree) {\n setActionsVisible(true);\n }\n });\n\n const handleActionsInvisible = useEventCallback((event: React.FocusEvent | React.MouseEvent) => {\n const isTargetFromSubtree = Boolean(\n subtreeRef.current && elementContains(subtreeRef.current, event.target as Node),\n );\n const isRelatedTargetFromActions = Boolean(\n actionsRef.current && elementContains(actionsRef.current, event.relatedTarget as Node),\n );\n if (isRelatedTargetFromActions) {\n return setActionsVisible(true);\n }\n if (!isTargetFromSubtree) {\n return setActionsVisible(false);\n }\n });\n\n return {\n value,\n open,\n subtreeRef,\n actionsRef: useMergedRefs(actionsRef, handleActionsRef),\n expandIconRef,\n layoutRef,\n itemType,\n isActionsVisible,\n isAsideVisible,\n level,\n components: {\n root: 'div',\n },\n root: getNativeElementProps(as, {\n tabIndex: -1,\n ...rest,\n ref,\n role: 'treeitem',\n 'aria-level': level,\n [dataTreeItemValueAttrName]: value,\n 'aria-expanded': itemType === 'branch' ? open : undefined,\n onClick: handleClick,\n onKeyDown: handleKeyDown,\n onMouseOver: handleActionsVisible,\n onFocus: handleActionsVisible,\n onMouseOut: handleActionsInvisible,\n onBlur: handleActionsInvisible,\n }),\n };\n}\n"],"names":["React","getNativeElementProps","useId","useMergedRefs","useEventCallback","elementContains","useTreeContext_unstable","treeDataTypes","dataTreeItemValueAttrName","useTreeItem_unstable","props","ref","contextLevel","ctx","level","value","toString","onClick","onKeyDown","as","itemType","rest","requestTreeResponse","isActionsVisible","setActionsVisible","useState","isAsideVisible","setAsideVisible","handleActionsRef","actions","open","openItems","has","actionsRef","useRef","expandIconRef","layoutRef","subtreeRef","handleClick","event","isDefaultPrevented","isEventFromActions","current","target","isEventFromSubtree","isFromExpandIcon","type","ExpandIconClick","Click","handleKeyDown","currentTarget","key","End","Home","Enter","ArrowUp","ArrowDown","ArrowLeft","ArrowRight","isTypeAheadCharacter","length","match","altKey","ctrlKey","metaKey","TypeAhead","handleActionsVisible","isTargetFromSubtree","Boolean","handleActionsInvisible","isRelatedTargetFromActions","relatedTarget","components","root","tabIndex","role","undefined","onMouseOver","onFocus","onMouseOut","onBlur"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["useTreeItem.tsx"],"sourcesContent":["import * as React from 'react';\nimport {\n getNativeElementProps,\n isResolvedShorthand,\n resolveShorthand,\n useControllableState,\n useId,\n useMergedRefs,\n} from '@fluentui/react-utilities';\nimport { useEventCallback } from '@fluentui/react-utilities';\nimport { elementContains } from '@fluentui/react-portal';\nimport type { TreeItemProps, TreeItemSlots, TreeItemState } from './TreeItem.types';\nimport { useTreeContext_unstable } from '../../contexts/index';\nimport { treeDataTypes } from '../../utils/tokens';\nimport { dataTreeItemValueAttrName } from '../../utils/getTreeItemValueFromElement';\nimport { TreeItemChevron } from '../TreeItemChevron';\n\n/**\n * Create the state required to render TreeItem.\n *\n * The returned state can be modified with hooks such as useTreeItemStyles_unstable,\n * before being passed to renderTreeItem_unstable.\n *\n * @param props - props from this instance of TreeItem\n * @param ref - reference to root HTMLElement of TreeItem\n */\nexport function useTreeItem_unstable(props: TreeItemProps, ref: React.Ref<HTMLDivElement>): TreeItemState {\n const contextLevel = useTreeContext_unstable(ctx => ctx.level);\n\n const value = useId('fuiTreeItemValue-', props.value?.toString());\n\n const {\n onClick,\n onKeyDown,\n as = 'div',\n itemType = 'leaf',\n 'aria-level': level = contextLevel,\n expandIcon,\n aside,\n ...rest\n } = props;\n\n const requestTreeResponse = useTreeContext_unstable(ctx => ctx.requestTreeResponse);\n\n const [isActionsVisibleExternal, actions]: [boolean | undefined, TreeItemSlots['actions']] = isResolvedShorthand(\n props.actions,\n )\n ? // .visible prop should not be propagated to the DOM\n [props.actions.visible, { ...props.actions, visible: undefined }]\n : [undefined, props.actions];\n\n const [isActionsVisible, setActionsVisible] = useControllableState({\n state: isActionsVisibleExternal,\n defaultState: false,\n initialState: false,\n });\n const [isAsideVisible, setAsideVisible] = React.useState(true);\n\n const handleActionsRef = (actionsElement: HTMLDivElement | null) => {\n setAsideVisible(actionsElement === null);\n };\n\n const open = useTreeContext_unstable(ctx => ctx.openItems.has(value));\n\n const actionsRef = React.useRef<HTMLDivElement>(null);\n const expandIconRef = React.useRef<HTMLDivElement>(null);\n const layoutRef = React.useRef<HTMLDivElement>(null);\n const subtreeRef = React.useRef<HTMLDivElement>(null);\n\n const actionsRefs = useMergedRefs(\n isResolvedShorthand(actions) ? actions.ref : undefined,\n handleActionsRef,\n actionsRef,\n );\n const expandIconRefs = useMergedRefs(isResolvedShorthand(expandIcon) ? expandIcon.ref : undefined, expandIconRef);\n\n const handleClick = useEventCallback((event: React.MouseEvent<HTMLDivElement>) => {\n onClick?.(event);\n if (event.isDefaultPrevented()) {\n return;\n }\n const isEventFromActions = actionsRef.current && elementContains(actionsRef.current, event.target as Node);\n if (isEventFromActions) {\n return;\n }\n const isEventFromSubtree = subtreeRef.current && elementContains(subtreeRef.current, event.target as Node);\n if (isEventFromSubtree) {\n return;\n }\n const isFromExpandIcon = expandIconRef.current && elementContains(expandIconRef.current, event.target as Node);\n requestTreeResponse({\n event,\n value,\n itemType,\n target: event.currentTarget,\n type: isFromExpandIcon ? treeDataTypes.ExpandIconClick : treeDataTypes.Click,\n });\n });\n\n const handleKeyDown = useEventCallback((event: React.KeyboardEvent<HTMLDivElement>) => {\n onKeyDown?.(event);\n // Ignore keyboard events that do not originate from the current tree item.\n if (event.isDefaultPrevented() || event.currentTarget !== event.target) {\n return;\n }\n switch (event.key) {\n case treeDataTypes.End:\n case treeDataTypes.Home:\n case treeDataTypes.Enter:\n case treeDataTypes.ArrowUp:\n case treeDataTypes.ArrowDown:\n case treeDataTypes.ArrowLeft:\n case treeDataTypes.ArrowRight:\n return requestTreeResponse({ event, target: event.currentTarget, value, itemType, type: event.key });\n }\n const isTypeAheadCharacter =\n event.key.length === 1 && event.key.match(/\\w/) && !event.altKey && !event.ctrlKey && !event.metaKey;\n if (isTypeAheadCharacter) {\n requestTreeResponse({ event, target: event.currentTarget, value, itemType, type: treeDataTypes.TypeAhead });\n }\n });\n\n const handleActionsVisible = useEventCallback((event: React.FocusEvent | React.MouseEvent) => {\n const isTargetFromSubtree = Boolean(\n subtreeRef.current && elementContains(subtreeRef.current, event.target as Node),\n );\n if (!isTargetFromSubtree) {\n setActionsVisible(true);\n }\n });\n\n const handleActionsInvisible = useEventCallback((event: React.FocusEvent | React.MouseEvent) => {\n const isTargetFromSubtree = Boolean(\n subtreeRef.current && elementContains(subtreeRef.current, event.target as Node),\n );\n const isRelatedTargetFromActions = Boolean(\n actionsRef.current && elementContains(actionsRef.current, event.relatedTarget as Node),\n );\n if (isRelatedTargetFromActions) {\n return setActionsVisible(true);\n }\n if (!isTargetFromSubtree) {\n return setActionsVisible(false);\n }\n });\n\n const isBranch = itemType === 'branch';\n\n const actionsSlot = React.useMemo(\n () => (isActionsVisible ? resolveShorthand(actions) : undefined),\n [actions, isActionsVisible],\n );\n if (actionsSlot) {\n actionsSlot.ref = actionsRefs;\n }\n const asideSlot = React.useMemo(\n () => (isAsideVisible ? resolveShorthand(aside) : undefined),\n [aside, isAsideVisible],\n );\n const expandIconSlot = React.useMemo(\n () =>\n resolveShorthand(expandIcon, {\n required: isBranch,\n defaultProps: {\n children: <TreeItemChevron />,\n 'aria-hidden': true,\n },\n }),\n [expandIcon, isBranch],\n );\n if (expandIconSlot) {\n expandIconSlot.ref = expandIconRefs;\n }\n\n return {\n value,\n open,\n subtreeRef,\n layoutRef,\n itemType,\n level,\n components: {\n root: 'div',\n },\n root: getNativeElementProps(as, {\n tabIndex: -1,\n ...rest,\n ref,\n role: 'treeitem',\n 'aria-level': level,\n [dataTreeItemValueAttrName]: value,\n 'aria-expanded': isBranch ? open : undefined,\n onClick: handleClick,\n onKeyDown: handleKeyDown,\n onMouseOver: handleActionsVisible,\n onFocus: handleActionsVisible,\n onMouseOut: handleActionsInvisible,\n onBlur: handleActionsInvisible,\n }),\n actions: actionsSlot,\n aside: asideSlot,\n expandIcon: expandIconSlot,\n };\n}\n"],"names":["React","getNativeElementProps","isResolvedShorthand","resolveShorthand","useControllableState","useId","useMergedRefs","useEventCallback","elementContains","useTreeContext_unstable","treeDataTypes","dataTreeItemValueAttrName","TreeItemChevron","useTreeItem_unstable","props","ref","contextLevel","ctx","level","value","toString","onClick","onKeyDown","as","itemType","expandIcon","aside","rest","requestTreeResponse","isActionsVisibleExternal","actions","visible","undefined","isActionsVisible","setActionsVisible","state","defaultState","initialState","isAsideVisible","setAsideVisible","useState","handleActionsRef","actionsElement","open","openItems","has","actionsRef","useRef","expandIconRef","layoutRef","subtreeRef","actionsRefs","expandIconRefs","handleClick","event","isDefaultPrevented","isEventFromActions","current","target","isEventFromSubtree","isFromExpandIcon","currentTarget","type","ExpandIconClick","Click","handleKeyDown","key","End","Home","Enter","ArrowUp","ArrowDown","ArrowLeft","ArrowRight","isTypeAheadCharacter","length","match","altKey","ctrlKey","metaKey","TypeAhead","handleActionsVisible","isTargetFromSubtree","Boolean","handleActionsInvisible","isRelatedTargetFromActions","relatedTarget","isBranch","actionsSlot","useMemo","asideSlot","expandIconSlot","required","defaultProps","children","components","root","tabIndex","role","onMouseOver","onFocus","onMouseOut","onBlur"],"mappings":"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"}
|
|
@@ -1,20 +1,27 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
1
2
|
export function useTreeItemContextValues_unstable(state) {
|
|
2
|
-
const { value ,
|
|
3
|
+
const { value , itemType , layoutRef , subtreeRef , open , actions , aside , expandIcon } = state;
|
|
3
4
|
/**
|
|
4
5
|
* This context is created with "@fluentui/react-context-selector",
|
|
5
6
|
* there is no sense to memoize it
|
|
6
7
|
*/ const treeItem = {
|
|
7
|
-
isActionsVisible,
|
|
8
|
-
isAsideVisible,
|
|
9
8
|
value,
|
|
10
|
-
actionsRef,
|
|
11
9
|
itemType,
|
|
12
10
|
layoutRef,
|
|
13
11
|
subtreeRef,
|
|
14
|
-
expandIconRef,
|
|
15
12
|
open
|
|
16
13
|
};
|
|
14
|
+
const treeItemSlots = React.useMemo(()=>({
|
|
15
|
+
actions,
|
|
16
|
+
aside,
|
|
17
|
+
expandIcon
|
|
18
|
+
}), [
|
|
19
|
+
actions,
|
|
20
|
+
aside,
|
|
21
|
+
expandIcon
|
|
22
|
+
]);
|
|
17
23
|
return {
|
|
18
|
-
treeItem
|
|
24
|
+
treeItem,
|
|
25
|
+
treeItemSlots
|
|
19
26
|
};
|
|
20
27
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["useTreeItemContextValues.ts"],"sourcesContent":["import
|
|
1
|
+
{"version":3,"sources":["useTreeItemContextValues.ts"],"sourcesContent":["import * as React from 'react';\nimport type { TreeItemContextValues, TreeItemState } from './TreeItem.types';\nimport type { TreeItemContextValue, TreeItemSlotsContextValue } from '../../contexts';\n\nexport function useTreeItemContextValues_unstable(state: TreeItemState): TreeItemContextValues {\n const { value, itemType, layoutRef, subtreeRef, open, actions, aside, expandIcon } = state;\n\n /**\n * This context is created with \"@fluentui/react-context-selector\",\n * there is no sense to memoize it\n */\n const treeItem: TreeItemContextValue = {\n value,\n itemType,\n layoutRef,\n subtreeRef,\n open,\n };\n\n const treeItemSlots: TreeItemSlotsContextValue = React.useMemo(\n () => ({ actions, aside, expandIcon }),\n [actions, aside, expandIcon],\n );\n\n return { treeItem, treeItemSlots };\n}\n"],"names":["React","useTreeItemContextValues_unstable","state","value","itemType","layoutRef","subtreeRef","open","actions","aside","expandIcon","treeItem","treeItemSlots","useMemo"],"mappings":"AAAA,YAAYA,WAAW,QAAQ;AAI/B,OAAO,SAASC,kCAAkCC,KAAoB,EAAyB;IAC7F,MAAM,EAAEC,MAAK,EAAEC,SAAQ,EAAEC,UAAS,EAAEC,WAAU,EAAEC,KAAI,EAAEC,QAAO,EAAEC,MAAK,EAAEC,WAAU,EAAE,GAAGR;IAErF;;;GAGC,GACD,MAAMS,WAAiC;QACrCR;QACAC;QACAC;QACAC;QACAC;IACF;IAEA,MAAMK,gBAA2CZ,MAAMa,OAAO,CAC5D,IAAO,CAAA;YAAEL;YAASC;YAAOC;QAAW,CAAA,GACpC;QAACF;QAASC;QAAOC;KAAW;IAG9B,OAAO;QAAEC;QAAUC;IAAc;AACnC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["TreeItemLayout.types.ts"],"sourcesContent":["import type { ComponentProps, ComponentState,
|
|
1
|
+
{"version":3,"sources":["TreeItemLayout.types.ts"],"sourcesContent":["import type { ComponentProps, ComponentState, Slot } from '@fluentui/react-utilities';\nimport { ButtonContextValue } from '@fluentui/react-button';\nimport { TreeItemSlots } from '../TreeItem/TreeItem.types';\n\nexport type TreeItemLayoutSlots = {\n root: Slot<'div'>;\n /**\n * Content. Children of the root slot are automatically rendered here\n */\n content: NonNullable<Slot<'div'>>;\n /**\n * Icon slot that renders right before main content\n */\n iconBefore?: Slot<'div'>;\n /**\n * Icon slot that renders right after main content\n */\n iconAfter?: Slot<'div'>;\n};\n\nexport type TreeItemLayoutInternalSlots = TreeItemLayoutSlots & Pick<TreeItemSlots, 'actions' | 'aside' | 'expandIcon'>;\n\n/**\n * TreeItemLayout Props\n */\nexport type TreeItemLayoutProps = ComponentProps<Partial<TreeItemLayoutSlots>>;\n\n/**\n * State used in rendering TreeItemLayout\n */\nexport type TreeItemLayoutState = ComponentState<TreeItemLayoutInternalSlots> & {\n buttonContextValue: ButtonContextValue;\n};\n"],"names":[],"mappings":"AAAA,WAgCE"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["renderTreeItemLayout.tsx"],"sourcesContent":["/** @jsxRuntime classic */\n/** @jsx createElement */\n\nimport { createElement } from '@fluentui/react-jsx-runtime';\nimport { getSlotsNext } from '@fluentui/react-utilities';\nimport type { TreeItemLayoutState,
|
|
1
|
+
{"version":3,"sources":["renderTreeItemLayout.tsx"],"sourcesContent":["/** @jsxRuntime classic */\n/** @jsx createElement */\n\nimport { createElement } from '@fluentui/react-jsx-runtime';\nimport { getSlotsNext } from '@fluentui/react-utilities';\nimport type { TreeItemLayoutState, TreeItemLayoutInternalSlots } from './TreeItemLayout.types';\nimport { ButtonContextProvider } from '@fluentui/react-button';\n\n/**\n * Render the final JSX of TreeItemLayout\n */\nexport const renderTreeItemLayout_unstable = (state: TreeItemLayoutState) => {\n const { slots, slotProps } = getSlotsNext<TreeItemLayoutInternalSlots>(state);\n\n return (\n <slots.root {...slotProps.root}>\n {slots.expandIcon && <slots.expandIcon {...slotProps.expandIcon} />}\n {slots.iconBefore && <slots.iconBefore {...slotProps.iconBefore} />}\n <slots.content {...slotProps.content}>{slotProps.root.children}</slots.content>\n {slots.iconAfter && <slots.iconAfter {...slotProps.iconAfter} />}\n <ButtonContextProvider value={state.buttonContextValue}>\n {slots.actions && <slots.actions {...slotProps.actions} />}\n {slots.aside && <slots.aside {...slotProps.aside} />}\n </ButtonContextProvider>\n </slots.root>\n );\n};\n"],"names":["createElement","getSlotsNext","ButtonContextProvider","renderTreeItemLayout_unstable","state","slots","slotProps","root","expandIcon","iconBefore","content","children","iconAfter","value","buttonContextValue","actions","aside"],"mappings":"AAAA,wBAAwB,GACxB,uBAAuB,GAEvB,SAASA,aAAa,QAAQ,8BAA8B;AAC5D,SAASC,YAAY,QAAQ,4BAA4B;AAEzD,SAASC,qBAAqB,QAAQ,yBAAyB;AAE/D;;CAEC,GACD,OAAO,MAAMC,gCAAgC,CAACC,QAA+B;IAC3E,MAAM,EAAEC,MAAK,EAAEC,UAAS,EAAE,GAAGL,aAA0CG;IAEvE,qBACE,AAdJ,cAcKC,MAAME,IAAI,EAAKD,UAAUC,IAAI,EAC3BF,MAAMG,UAAU,kBAAI,AAf3B,cAe4BH,MAAMG,UAAU,EAAKF,UAAUE,UAAU,GAC9DH,MAAMI,UAAU,kBAAI,AAhB3B,cAgB4BJ,MAAMI,UAAU,EAAKH,UAAUG,UAAU,iBAC/D,AAjBN,cAiBOJ,MAAMK,OAAO,EAAKJ,UAAUI,OAAO,EAAGJ,UAAUC,IAAI,CAACI,QAAQ,GAC7DN,MAAMO,SAAS,kBAAI,AAlB1B,cAkB2BP,MAAMO,SAAS,EAAKN,UAAUM,SAAS,iBAC5D,AAnBN,cAmBOV;QAAsBW,OAAOT,MAAMU,kBAAkB;OACnDT,MAAMU,OAAO,kBAAI,AApB1B,cAoB2BV,MAAMU,OAAO,EAAKT,UAAUS,OAAO,GACrDV,MAAMW,KAAK,kBAAI,AArBxB,cAqByBX,MAAMW,KAAK,EAAKV,UAAUU,KAAK;AAIxD,EAAE"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import * as React from 'react';
|
|
2
|
-
import { getNativeElementProps,
|
|
2
|
+
import { getNativeElementProps, resolveShorthand, useMergedRefs } from '@fluentui/react-utilities';
|
|
3
3
|
import { useTreeItemContext_unstable } from '../../contexts/treeItemContext';
|
|
4
|
-
import {
|
|
4
|
+
import { useTreeItemSlotsContext_unstable } from '../../contexts/treeItemSlotsContext';
|
|
5
5
|
/**
|
|
6
6
|
* Create the state required to render TreeItemLayout.
|
|
7
7
|
*
|
|
@@ -11,15 +11,9 @@ import { TreeItemChevron } from '../TreeItemChevron';
|
|
|
11
11
|
* @param props - props from this instance of TreeItemLayout
|
|
12
12
|
* @param ref - reference to root HTMLElement of TreeItemLayout
|
|
13
13
|
*/ export const useTreeItemLayout_unstable = (props, ref)=>{
|
|
14
|
-
const { content , iconAfter , iconBefore ,
|
|
14
|
+
const { content , iconAfter , iconBefore , as ='span' } = props;
|
|
15
|
+
const { actions , aside , expandIcon } = useTreeItemSlotsContext_unstable();
|
|
15
16
|
const layoutRef = useTreeItemContext_unstable((ctx)=>ctx.layoutRef);
|
|
16
|
-
const expandIconRef = useTreeItemContext_unstable((ctx)=>ctx.expandIconRef);
|
|
17
|
-
const isActionsVisibleContext = useTreeItemContext_unstable((ctx)=>ctx.isActionsVisible);
|
|
18
|
-
const isAsideVisible = useTreeItemContext_unstable((ctx)=>ctx.isAsideVisible);
|
|
19
|
-
var _ref;
|
|
20
|
-
const isActionsVisible = (_ref = isResolvedShorthand(actions) ? actions.visible : undefined) !== null && _ref !== void 0 ? _ref : isActionsVisibleContext;
|
|
21
|
-
const isBranch = useTreeItemContext_unstable((ctx)=>ctx.itemType === 'branch');
|
|
22
|
-
const actionsRef = useMergedRefs(isResolvedShorthand(actions) ? actions.ref : undefined, useTreeItemContext_unstable((ctx)=>ctx.actionsRef));
|
|
23
17
|
return {
|
|
24
18
|
components: {
|
|
25
19
|
root: 'div',
|
|
@@ -50,23 +44,8 @@ import { TreeItemChevron } from '../TreeItemChevron';
|
|
|
50
44
|
'aria-hidden': true
|
|
51
45
|
}
|
|
52
46
|
}),
|
|
53
|
-
aside:
|
|
54
|
-
actions:
|
|
55
|
-
|
|
56
|
-
...actions,
|
|
57
|
-
visible: undefined
|
|
58
|
-
} : actions, {
|
|
59
|
-
defaultProps: {
|
|
60
|
-
ref: actionsRef
|
|
61
|
-
}
|
|
62
|
-
}) : undefined,
|
|
63
|
-
expandIcon: resolveShorthand(expandIcon, {
|
|
64
|
-
required: isBranch,
|
|
65
|
-
defaultProps: {
|
|
66
|
-
children: /*#__PURE__*/ React.createElement(TreeItemChevron, null),
|
|
67
|
-
'aria-hidden': true,
|
|
68
|
-
ref: useMergedRefs(isResolvedShorthand(expandIcon) ? expandIcon.ref : undefined, expandIconRef)
|
|
69
|
-
}
|
|
70
|
-
})
|
|
47
|
+
aside: resolveShorthand(aside),
|
|
48
|
+
actions: resolveShorthand(actions),
|
|
49
|
+
expandIcon: resolveShorthand(expandIcon)
|
|
71
50
|
};
|
|
72
51
|
};
|