@dxos/plugin-navtree 0.8.4-main.72ec0f3 → 0.8.4-main.7996785055

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.
Files changed (244) hide show
  1. package/dist/lib/browser/CommandsDialogContent-U726OBZ2.mjs +117 -0
  2. package/dist/lib/browser/CommandsDialogContent-U726OBZ2.mjs.map +7 -0
  3. package/dist/lib/browser/CommandsTrigger-LCFJL36T.mjs +32 -0
  4. package/dist/lib/browser/CommandsTrigger-LCFJL36T.mjs.map +7 -0
  5. package/dist/lib/browser/NavTreeContainer-35LP3XZM.mjs +12 -0
  6. package/dist/lib/browser/NavTreeContainer-35LP3XZM.mjs.map +7 -0
  7. package/dist/lib/browser/NavTreeDocumentTitle-L6NLLWLD.mjs +26 -0
  8. package/dist/lib/browser/NavTreeDocumentTitle-L6NLLWLD.mjs.map +7 -0
  9. package/dist/lib/browser/app-graph-builder-Z43OTNI2.mjs +44 -0
  10. package/dist/lib/browser/app-graph-builder-Z43OTNI2.mjs.map +7 -0
  11. package/dist/lib/browser/{chunk-E6MZBCU5.mjs → chunk-A4VDCIJC.mjs} +3 -3
  12. package/dist/lib/browser/chunk-A4VDCIJC.mjs.map +7 -0
  13. package/dist/lib/browser/chunk-KF26WA4O.mjs +23 -0
  14. package/dist/lib/browser/chunk-KF26WA4O.mjs.map +7 -0
  15. package/dist/lib/browser/chunk-MTTE5C5L.mjs +1452 -0
  16. package/dist/lib/browser/chunk-MTTE5C5L.mjs.map +7 -0
  17. package/dist/lib/browser/chunk-PD6TZ6TP.mjs +14 -0
  18. package/dist/lib/browser/chunk-PD6TZ6TP.mjs.map +7 -0
  19. package/dist/lib/browser/expose-LKZ6QBBD.mjs +43 -0
  20. package/dist/lib/browser/expose-LKZ6QBBD.mjs.map +7 -0
  21. package/dist/lib/browser/index.mjs +86 -91
  22. package/dist/lib/browser/index.mjs.map +4 -4
  23. package/dist/lib/browser/{keyboard-YYTYJW4M.mjs → keyboard-HYGFQO7T.mjs} +25 -19
  24. package/dist/lib/browser/keyboard-HYGFQO7T.mjs.map +7 -0
  25. package/dist/lib/browser/meta.json +1 -1
  26. package/dist/lib/browser/operation-handler-VHOUWGCZ.mjs +16 -0
  27. package/dist/lib/browser/operation-handler-VHOUWGCZ.mjs.map +7 -0
  28. package/dist/lib/browser/react-surface-XWFN75ZB.mjs +59 -0
  29. package/dist/lib/browser/react-surface-XWFN75ZB.mjs.map +7 -0
  30. package/dist/lib/browser/state-CWMNNF7K.mjs +131 -0
  31. package/dist/lib/browser/state-CWMNNF7K.mjs.map +7 -0
  32. package/dist/types/src/NavTreePlugin.d.ts +2 -1
  33. package/dist/types/src/NavTreePlugin.d.ts.map +1 -1
  34. package/dist/types/src/capabilities/app-graph-builder/app-graph-builder.d.ts +6 -0
  35. package/dist/types/src/capabilities/app-graph-builder/app-graph-builder.d.ts.map +1 -0
  36. package/dist/types/src/capabilities/app-graph-builder/index.d.ts +3 -0
  37. package/dist/types/src/capabilities/app-graph-builder/index.d.ts.map +1 -0
  38. package/dist/types/src/capabilities/index.d.ts +5 -108
  39. package/dist/types/src/capabilities/index.d.ts.map +1 -1
  40. package/dist/types/src/capabilities/keyboard/index.d.ts +3 -0
  41. package/dist/types/src/capabilities/keyboard/index.d.ts.map +1 -0
  42. package/dist/types/src/capabilities/keyboard/keyboard.d.ts +5 -0
  43. package/dist/types/src/capabilities/keyboard/keyboard.d.ts.map +1 -0
  44. package/dist/types/src/capabilities/operation-handler/index.d.ts +4 -0
  45. package/dist/types/src/capabilities/operation-handler/index.d.ts.map +1 -0
  46. package/dist/types/src/capabilities/operation-handler/operation-handler.d.ts +6 -0
  47. package/dist/types/src/capabilities/operation-handler/operation-handler.d.ts.map +1 -0
  48. package/dist/types/src/capabilities/react-surface/index.d.ts +3 -0
  49. package/dist/types/src/capabilities/react-surface/index.d.ts.map +1 -0
  50. package/dist/types/src/capabilities/react-surface/react-surface.d.ts +5 -0
  51. package/dist/types/src/capabilities/react-surface/react-surface.d.ts.map +1 -0
  52. package/dist/types/src/capabilities/state/index.d.ts +3 -0
  53. package/dist/types/src/capabilities/state/index.d.ts.map +1 -0
  54. package/dist/types/src/capabilities/state/state.d.ts +6 -0
  55. package/dist/types/src/capabilities/state/state.d.ts.map +1 -0
  56. package/dist/types/src/components/NavTree/NavTree.d.ts +11 -4
  57. package/dist/types/src/components/NavTree/NavTree.d.ts.map +1 -1
  58. package/dist/types/src/components/NavTree/NavTree.stories.d.ts +2 -2
  59. package/dist/types/src/components/NavTree/NavTree.stories.d.ts.map +1 -1
  60. package/dist/types/src/components/{NavTreeContext.d.ts → NavTreeContext/NavTreeContext.d.ts} +1 -1
  61. package/dist/types/src/components/NavTreeContext/NavTreeContext.d.ts.map +1 -0
  62. package/dist/types/src/components/NavTreeContext/index.d.ts +2 -0
  63. package/dist/types/src/components/NavTreeContext/index.d.ts.map +1 -0
  64. package/dist/types/src/components/NavTreeItem/NavTreeItemAction.d.ts +16 -8
  65. package/dist/types/src/components/NavTreeItem/NavTreeItemAction.d.ts.map +1 -1
  66. package/dist/types/src/components/NavTreeItem/NavTreeItemAction.stories.d.ts +3 -2
  67. package/dist/types/src/components/NavTreeItem/NavTreeItemAction.stories.d.ts.map +1 -1
  68. package/dist/types/src/components/NavTreeItem/NavTreeItemColumns.d.ts.map +1 -1
  69. package/dist/types/src/components/Sidebar/L0Menu.d.ts +8 -5
  70. package/dist/types/src/components/Sidebar/L0Menu.d.ts.map +1 -1
  71. package/dist/types/src/components/Sidebar/L1Panel.d.ts +4 -7
  72. package/dist/types/src/components/Sidebar/L1Panel.d.ts.map +1 -1
  73. package/dist/types/src/components/Sidebar/L1Tabs.d.ts +5 -4
  74. package/dist/types/src/components/Sidebar/L1Tabs.d.ts.map +1 -1
  75. package/dist/types/src/components/UserAccountAvatar/UserAccountAvatar.stories.d.ts.map +1 -1
  76. package/dist/types/src/components/index.d.ts +0 -3
  77. package/dist/types/src/components/index.d.ts.map +1 -1
  78. package/dist/types/src/components/types.d.ts +8 -16
  79. package/dist/types/src/components/types.d.ts.map +1 -1
  80. package/dist/types/src/containers/CommandsDialogContent/CommandsDialogContent.d.ts +6 -0
  81. package/dist/types/src/containers/CommandsDialogContent/CommandsDialogContent.d.ts.map +1 -0
  82. package/dist/types/src/containers/CommandsDialogContent/CommandsDialogContent.stories.d.ts +30 -0
  83. package/dist/types/src/containers/CommandsDialogContent/CommandsDialogContent.stories.d.ts.map +1 -0
  84. package/dist/types/src/containers/CommandsDialogContent/index.d.ts +3 -0
  85. package/dist/types/src/containers/CommandsDialogContent/index.d.ts.map +1 -0
  86. package/dist/types/src/containers/CommandsTrigger/CommandsTrigger.d.ts.map +1 -0
  87. package/dist/types/src/containers/CommandsTrigger/index.d.ts +3 -0
  88. package/dist/types/src/containers/CommandsTrigger/index.d.ts.map +1 -0
  89. package/dist/types/src/containers/NavTreeContainer/NavTreeContainer.d.ts +9 -0
  90. package/dist/types/src/containers/NavTreeContainer/NavTreeContainer.d.ts.map +1 -0
  91. package/dist/types/src/containers/NavTreeContainer/index.d.ts +3 -0
  92. package/dist/types/src/containers/NavTreeContainer/index.d.ts.map +1 -0
  93. package/dist/types/src/{components → containers/NavTreeDocumentTitle}/NavTreeDocumentTitle.d.ts +1 -1
  94. package/dist/types/src/containers/NavTreeDocumentTitle/NavTreeDocumentTitle.d.ts.map +1 -0
  95. package/dist/types/src/containers/NavTreeDocumentTitle/index.d.ts +3 -0
  96. package/dist/types/src/containers/NavTreeDocumentTitle/index.d.ts.map +1 -0
  97. package/dist/types/src/containers/index.d.ts +7 -0
  98. package/dist/types/src/containers/index.d.ts.map +1 -0
  99. package/dist/types/src/experimental/Tree.stories.d.ts +18 -4
  100. package/dist/types/src/experimental/Tree.stories.d.ts.map +1 -1
  101. package/dist/types/src/hooks/index.d.ts +5 -0
  102. package/dist/types/src/hooks/index.d.ts.map +1 -0
  103. package/dist/types/src/hooks/useActions.d.ts +5 -0
  104. package/dist/types/src/hooks/useActions.d.ts.map +1 -0
  105. package/dist/types/src/hooks/useLoadDescendents.d.ts +6 -0
  106. package/dist/types/src/hooks/useLoadDescendents.d.ts.map +1 -0
  107. package/dist/types/src/hooks/useNavTreeModel.d.ts +7 -0
  108. package/dist/types/src/hooks/useNavTreeModel.d.ts.map +1 -0
  109. package/dist/types/src/hooks/useNavTreeState.d.ts +22 -0
  110. package/dist/types/src/hooks/useNavTreeState.d.ts.map +1 -0
  111. package/dist/types/src/index.d.ts +1 -2
  112. package/dist/types/src/index.d.ts.map +1 -1
  113. package/dist/types/src/meta.d.ts +2 -2
  114. package/dist/types/src/meta.d.ts.map +1 -1
  115. package/dist/types/src/operations/expose.d.ts +5 -0
  116. package/dist/types/src/operations/expose.d.ts.map +1 -0
  117. package/dist/types/src/operations/index.d.ts +3 -0
  118. package/dist/types/src/operations/index.d.ts.map +1 -0
  119. package/dist/types/src/testing/app-graph-builder.d.ts +2 -3
  120. package/dist/types/src/testing/app-graph-builder.d.ts.map +1 -1
  121. package/dist/types/src/testing/generator.d.ts +5 -6
  122. package/dist/types/src/testing/generator.d.ts.map +1 -1
  123. package/dist/types/src/testing/update-state.d.ts +2 -2
  124. package/dist/types/src/testing/update-state.d.ts.map +1 -1
  125. package/dist/types/src/types/capabilities.d.ts +16 -0
  126. package/dist/types/src/types/capabilities.d.ts.map +1 -0
  127. package/dist/types/src/types/events.d.ts +5 -0
  128. package/dist/types/src/types/events.d.ts.map +1 -0
  129. package/dist/types/src/types/index.d.ts +4 -0
  130. package/dist/types/src/types/index.d.ts.map +1 -0
  131. package/dist/types/src/{types.d.ts → types/schema.d.ts} +6 -6
  132. package/dist/types/src/types/schema.d.ts.map +1 -0
  133. package/dist/types/src/util.d.ts +11 -7
  134. package/dist/types/src/util.d.ts.map +1 -1
  135. package/dist/types/tsconfig.tsbuildinfo +1 -1
  136. package/package.json +55 -53
  137. package/src/NavTreePlugin.tsx +54 -73
  138. package/src/capabilities/app-graph-builder/app-graph-builder.ts +42 -0
  139. package/src/capabilities/app-graph-builder/index.ts +7 -0
  140. package/src/capabilities/index.ts +5 -9
  141. package/src/capabilities/keyboard/index.ts +7 -0
  142. package/src/capabilities/keyboard/keyboard.ts +66 -0
  143. package/src/capabilities/operation-handler/index.ts +11 -0
  144. package/src/capabilities/operation-handler/operation-handler.ts +16 -0
  145. package/src/capabilities/react-surface/index.ts +7 -0
  146. package/src/capabilities/react-surface/react-surface.tsx +53 -0
  147. package/src/capabilities/state/index.ts +7 -0
  148. package/src/capabilities/state/state.ts +149 -0
  149. package/src/components/NavTree/NavTree.stories.tsx +44 -51
  150. package/src/components/NavTree/NavTree.tsx +63 -32
  151. package/src/components/{NavTreeContext.tsx → NavTreeContext/NavTreeContext.tsx} +1 -1
  152. package/src/components/NavTreeContext/index.ts +5 -0
  153. package/src/components/NavTreeItem/NavTreeItemAction.stories.tsx +17 -9
  154. package/src/components/NavTreeItem/NavTreeItemAction.tsx +65 -42
  155. package/src/components/NavTreeItem/NavTreeItemColumns.tsx +42 -16
  156. package/src/components/Sidebar/L0Menu.tsx +141 -177
  157. package/src/components/Sidebar/L1Panel.tsx +251 -93
  158. package/src/components/Sidebar/L1Tabs.tsx +18 -33
  159. package/src/components/UserAccountAvatar/UserAccountAvatar.stories.tsx +2 -3
  160. package/src/components/UserAccountAvatar/UserAccountAvatar.tsx +1 -1
  161. package/src/components/index.ts +1 -3
  162. package/src/components/types.ts +14 -19
  163. package/src/containers/CommandsDialogContent/CommandsDialogContent.stories.tsx +46 -0
  164. package/src/containers/CommandsDialogContent/CommandsDialogContent.tsx +131 -0
  165. package/src/containers/CommandsDialogContent/index.ts +7 -0
  166. package/src/containers/CommandsTrigger/CommandsTrigger.tsx +28 -0
  167. package/src/containers/CommandsTrigger/index.ts +7 -0
  168. package/src/containers/NavTreeContainer/NavTreeContainer.tsx +271 -0
  169. package/src/containers/NavTreeContainer/index.ts +6 -0
  170. package/src/{components → containers/NavTreeDocumentTitle}/NavTreeDocumentTitle.tsx +4 -3
  171. package/src/containers/NavTreeDocumentTitle/index.ts +7 -0
  172. package/src/containers/index.ts +12 -0
  173. package/src/experimental/Tree.stories.tsx +55 -58
  174. package/src/experimental/Tree.tsx +4 -4
  175. package/src/hooks/index.ts +8 -0
  176. package/src/hooks/useActions.ts +34 -0
  177. package/src/hooks/useLoadDescendents.ts +23 -0
  178. package/src/hooks/useNavTreeModel.ts +118 -0
  179. package/src/hooks/useNavTreeState.ts +42 -0
  180. package/src/index.ts +1 -2
  181. package/src/meta.ts +4 -4
  182. package/src/operations/expose.ts +42 -0
  183. package/src/operations/index.ts +7 -0
  184. package/src/testing/app-graph-builder.ts +158 -234
  185. package/src/testing/generator.ts +19 -17
  186. package/src/testing/update-state.ts +6 -6
  187. package/src/types/capabilities.ts +21 -0
  188. package/src/types/events.ts +12 -0
  189. package/src/types/index.ts +7 -0
  190. package/src/{types.ts → types/schema.ts} +5 -5
  191. package/src/util.ts +27 -16
  192. package/dist/lib/browser/app-graph-builder-OHSCN3GX.mjs +0 -46
  193. package/dist/lib/browser/app-graph-builder-OHSCN3GX.mjs.map +0 -7
  194. package/dist/lib/browser/chunk-5VLWX4PK.mjs +0 -15
  195. package/dist/lib/browser/chunk-5VLWX4PK.mjs.map +0 -7
  196. package/dist/lib/browser/chunk-7D2MPHXV.mjs +0 -1483
  197. package/dist/lib/browser/chunk-7D2MPHXV.mjs.map +0 -7
  198. package/dist/lib/browser/chunk-E6MZBCU5.mjs.map +0 -7
  199. package/dist/lib/browser/intent-resolver-YUVXVPHG.mjs +0 -47
  200. package/dist/lib/browser/intent-resolver-YUVXVPHG.mjs.map +0 -7
  201. package/dist/lib/browser/keyboard-YYTYJW4M.mjs.map +0 -7
  202. package/dist/lib/browser/react-surface-J7MWWAGD.mjs +0 -51
  203. package/dist/lib/browser/react-surface-J7MWWAGD.mjs.map +0 -7
  204. package/dist/lib/browser/state-EUSVT6BI.mjs +0 -117
  205. package/dist/lib/browser/state-EUSVT6BI.mjs.map +0 -7
  206. package/dist/types/src/capabilities/app-graph-builder.d.ts +0 -4
  207. package/dist/types/src/capabilities/app-graph-builder.d.ts.map +0 -1
  208. package/dist/types/src/capabilities/capabilities.d.ts +0 -21
  209. package/dist/types/src/capabilities/capabilities.d.ts.map +0 -1
  210. package/dist/types/src/capabilities/intent-resolver.d.ts +0 -4
  211. package/dist/types/src/capabilities/intent-resolver.d.ts.map +0 -1
  212. package/dist/types/src/capabilities/keyboard.d.ts +0 -4
  213. package/dist/types/src/capabilities/keyboard.d.ts.map +0 -1
  214. package/dist/types/src/capabilities/react-surface.d.ts +0 -4
  215. package/dist/types/src/capabilities/react-surface.d.ts.map +0 -1
  216. package/dist/types/src/capabilities/state.d.ts +0 -20
  217. package/dist/types/src/capabilities/state.d.ts.map +0 -1
  218. package/dist/types/src/components/CommandsDialog/CommandsDialog.d.ts +0 -5
  219. package/dist/types/src/components/CommandsDialog/CommandsDialog.d.ts.map +0 -1
  220. package/dist/types/src/components/CommandsDialog/CommandsTrigger.d.ts.map +0 -1
  221. package/dist/types/src/components/CommandsDialog/index.d.ts +0 -3
  222. package/dist/types/src/components/CommandsDialog/index.d.ts.map +0 -1
  223. package/dist/types/src/components/NavTreeContainer.d.ts +0 -9
  224. package/dist/types/src/components/NavTreeContainer.d.ts.map +0 -1
  225. package/dist/types/src/components/NavTreeContext.d.ts.map +0 -1
  226. package/dist/types/src/components/NavTreeDocumentTitle.d.ts.map +0 -1
  227. package/dist/types/src/events.d.ts +0 -4
  228. package/dist/types/src/events.d.ts.map +0 -1
  229. package/dist/types/src/hooks.d.ts +0 -3
  230. package/dist/types/src/hooks.d.ts.map +0 -1
  231. package/dist/types/src/types.d.ts.map +0 -1
  232. package/src/capabilities/app-graph-builder.ts +0 -53
  233. package/src/capabilities/capabilities.ts +0 -20
  234. package/src/capabilities/intent-resolver.ts +0 -37
  235. package/src/capabilities/keyboard.ts +0 -59
  236. package/src/capabilities/react-surface.tsx +0 -45
  237. package/src/capabilities/state.ts +0 -105
  238. package/src/components/CommandsDialog/CommandsDialog.tsx +0 -126
  239. package/src/components/CommandsDialog/CommandsTrigger.tsx +0 -36
  240. package/src/components/CommandsDialog/index.ts +0 -6
  241. package/src/components/NavTreeContainer.tsx +0 -369
  242. package/src/events.ts +0 -11
  243. package/src/hooks.ts +0 -21
  244. /package/dist/types/src/{components/CommandsDialog → containers/CommandsTrigger}/CommandsTrigger.d.ts +0 -0
@@ -2,70 +2,86 @@
2
2
  // Copyright 2023 DXOS.org
3
3
  //
4
4
 
5
- import React from 'react';
5
+ import React, { useCallback } from 'react';
6
6
 
7
- import { type Action, type Node } from '@dxos/app-graph';
7
+ import { type Node } from '@dxos/app-graph';
8
+ import { useActionRunner } from '@dxos/plugin-graph';
8
9
  import { IconButton, toLocalizedString, useDensityContext, useTranslation } from '@dxos/react-ui';
9
- import { DropdownMenu, type MenuItem, MenuProvider } from '@dxos/react-ui-menu';
10
- import { hoverableControlItem, hoverableOpenControlItem } from '@dxos/react-ui-theme';
10
+ import { Menu, type MenuItem } from '@dxos/react-ui-menu';
11
+ import { composable, composableProps, hoverableControlItem, hoverableOpenControlItem } from '@dxos/ui-theme';
11
12
 
12
13
  import { meta } from '../../meta';
13
14
  import { type ActionProperties } from '../../types';
14
15
 
15
- export type NavTreeItemActionMenuProps = ActionProperties & {
16
- parent: Node;
17
- caller?: string;
18
- monolithic?: boolean;
19
- menuActions?: Action[];
20
- };
21
-
22
16
  const fallbackIcon = 'ph--placeholder--regular';
23
17
 
24
18
  const fineActionButtonProps = {
25
19
  size: 4 as const,
26
20
  density: 'fine' as const,
27
21
  };
22
+
28
23
  const coarseActionButtonProps = {
29
24
  size: 5 as const,
30
25
  density: 'coarse' as const,
31
26
  };
32
27
 
33
- export const NavTreeItemActionDropdownMenu = ({
34
- parent,
35
- label,
36
- icon,
37
- testId,
38
- menuActions,
39
- caller,
40
- }: NavTreeItemActionMenuProps) => {
41
- const { t } = useTranslation(meta.id);
42
- const density = useDensityContext();
43
- return (
44
- <MenuProvider>
45
- <DropdownMenu.Root group={parent} items={menuActions as MenuItem[]} caller={caller}>
46
- <DropdownMenu.Trigger asChild>
28
+ export type NavTreeItemActionMenuProps = ActionProperties & {
29
+ parent: Node.Node;
30
+ path?: string[];
31
+ caller?: string;
32
+ monolithic?: boolean;
33
+ menuActions?: Node.Action[];
34
+ };
35
+
36
+ export const NavTreeItemActionDropdownMenu = composable<HTMLButtonElement, NavTreeItemActionMenuProps>(
37
+ ({ parent, path, label, icon, testId, menuActions, caller, ...props }, forwardedRef) => {
38
+ const { t } = useTranslation(meta.id);
39
+ const density = useDensityContext();
40
+ const runAction = useActionRunner();
41
+ const handleAction = useCallback(
42
+ (action: Node.Action, params: Node.InvokeProps = {}) => runAction(action, { ...params, path }),
43
+ [runAction, path],
44
+ );
45
+
46
+ return (
47
+ <Menu.Root caller={caller} onAction={handleAction}>
48
+ <Menu.Trigger asChild>
47
49
  <IconButton
48
50
  {...(density === 'coarse' ? coarseActionButtonProps : fineActionButtonProps)}
49
- classNames={['shrink-0 pli-2 pointer-fine:pli-1', hoverableControlItem, hoverableOpenControlItem]}
51
+ {...composableProps(props)}
52
+ classNames={['shrink-0 px-2 pointer-fine:px-1', hoverableControlItem, hoverableOpenControlItem]}
50
53
  variant='ghost'
51
54
  icon={icon ?? fallbackIcon}
52
55
  iconOnly
53
56
  label={toLocalizedString(label, t)}
54
57
  data-testid={testId}
58
+ ref={forwardedRef}
55
59
  />
56
- </DropdownMenu.Trigger>
57
- </DropdownMenu.Root>
58
- </MenuProvider>
59
- );
60
- };
60
+ </Menu.Trigger>
61
+ <Menu.Content group={parent} items={menuActions as MenuItem[]} />
62
+ </Menu.Root>
63
+ );
64
+ },
65
+ );
66
+
67
+ NavTreeItemActionDropdownMenu.displayName = 'NavTreeItemActionDropdownMenu';
61
68
 
62
- export const NavTreeItemMonolithicAction = ({
63
- parent,
64
- properties: { disabled, caller, testId, icon, variant = 'ghost', iconOnly = true } = { label: 'never' },
65
- data: invoke,
66
- baseLabel,
67
- }: Action & { parent: Node; onAction?: (action: Action) => void; baseLabel: string }) => {
69
+ export const NavTreeItemMonolithicAction = (
70
+ props: Node.Action & {
71
+ parent: Node.Node;
72
+ path?: string[];
73
+ onAction?: (action: Node.Action) => void;
74
+ baseLabel: string;
75
+ },
76
+ ) => {
77
+ const {
78
+ parent,
79
+ path,
80
+ properties: { disabled, caller, testId, icon, variant = 'ghost', iconOnly = true } = { label: 'never' },
81
+ baseLabel,
82
+ } = props;
68
83
  const density = useDensityContext();
84
+ const runAction = useActionRunner();
69
85
  return (
70
86
  <IconButton
71
87
  {...(density === 'coarse' ? coarseActionButtonProps : fineActionButtonProps)}
@@ -74,7 +90,7 @@ export const NavTreeItemMonolithicAction = ({
74
90
  'shrink-0',
75
91
  hoverableControlItem,
76
92
  hoverableOpenControlItem,
77
- iconOnly ? 'pli-2 pointer-fine:pli-1' : 'p-2 pointer-fine:p-2 mie-1',
93
+ iconOnly ? 'px-2 pointer-fine:px-1' : 'p-2 pointer-fine:p-2 me-1',
78
94
  ]}
79
95
  icon={icon ?? fallbackIcon}
80
96
  iconOnly={iconOnly}
@@ -86,22 +102,29 @@ export const NavTreeItemMonolithicAction = ({
86
102
  return;
87
103
  }
88
104
 
89
- void invoke?.(caller ? { parent, caller } : { parent });
105
+ void runAction(props, caller ? { parent, caller, path } : { parent, path });
90
106
  }}
91
107
  data-testid={testId}
92
108
  />
93
109
  );
94
110
  };
95
111
 
96
- export const NavTreeItemAction = ({ monolithic, menuActions, parent: node, ...props }: NavTreeItemActionMenuProps) => {
112
+ export const NavTreeItemAction = ({
113
+ monolithic,
114
+ menuActions,
115
+ menuType,
116
+ parent: node,
117
+ path,
118
+ ...props
119
+ }: NavTreeItemActionMenuProps) => {
97
120
  const { t } = useTranslation(meta.id);
98
121
 
99
122
  const monolithicAction = menuActions?.length === 1 && menuActions[0];
100
123
  const baseLabel = toLocalizedString(monolithicAction ? monolithicAction.properties!.label : props.label, t);
101
124
 
102
125
  return monolithic && menuActions?.length === 1 ? (
103
- <NavTreeItemMonolithicAction baseLabel={baseLabel} parent={node} {...menuActions[0]} />
126
+ <NavTreeItemMonolithicAction baseLabel={baseLabel} parent={node} path={path} {...menuActions[0]} />
104
127
  ) : (
105
- <NavTreeItemActionDropdownMenu {...props} label={baseLabel} parent={node} menuActions={menuActions} />
128
+ <NavTreeItemActionDropdownMenu {...props} label={baseLabel} parent={node} path={path} menuActions={menuActions} />
106
129
  );
107
130
  };
@@ -2,12 +2,12 @@
2
2
  // Copyright 2025 DXOS.org
3
3
  //
4
4
 
5
- import React, { Fragment, memo } from 'react';
5
+ import React, { Fragment, memo, useMemo } from 'react';
6
6
 
7
- import { isAction } from '@dxos/app-graph';
7
+ import { Node } from '@dxos/app-graph';
8
8
  import { Popover, Treegrid, toLocalizedString, useTranslation } from '@dxos/react-ui';
9
9
 
10
- import { useLoadDescendents } from '../../hooks';
10
+ import { useActions } from '../../hooks';
11
11
  import { meta } from '../../meta';
12
12
  import { NAV_TREE_ITEM } from '../NavTree';
13
13
  import { useNavTreeContext } from '../NavTreeContext';
@@ -17,25 +17,49 @@ import { NavTreeItemAction } from './NavTreeItemAction';
17
17
 
18
18
  export const NavTreeItemColumns = memo(({ path, item, open }: NavTreeItemColumnsProps) => {
19
19
  const { t } = useTranslation(meta.id);
20
- const { useActions, renderItemEnd: ItemEnd, popoverAnchorId } = useNavTreeContext();
20
+ const { renderItemEnd: ItemEnd, popoverAnchorId } = useNavTreeContext();
21
21
 
22
22
  const level = path.length - 2;
23
- const { actions: _actions, groupedActions } = useActions(item);
24
- const [primaryAction, ...secondaryActions] = _actions.toSorted((a, _b) =>
25
- a.properties?.disposition === 'list-item-primary' ? -1 : 1,
23
+ const { actions: actionsProp, groupedActions } = useActions(item);
24
+ const sortedActions = useMemo(
25
+ () =>
26
+ actionsProp.toSorted((actionA, actionB) => {
27
+ const primaryA = actionA.properties?.disposition === 'list-item-primary';
28
+ const primaryB = actionB.properties?.disposition === 'list-item-primary';
29
+ if (primaryA && !primaryB) {
30
+ return -1;
31
+ }
32
+ if (primaryB && !primaryA) {
33
+ return 1;
34
+ }
35
+ return 0;
36
+ }),
37
+ [actionsProp],
26
38
  );
39
+ const [primaryAction, ...secondaryActions] = sortedActions;
27
40
 
28
- const actions = (primaryAction?.properties?.disposition === 'list-item-primary' ? secondaryActions : _actions)
29
- .flatMap((action) => (isAction(action) ? [action] : []))
30
- .filter((a) => ['list-item', 'list-item-primary'].includes(a.properties?.disposition));
41
+ const actions = useMemo(
42
+ () =>
43
+ (primaryAction?.properties?.disposition === 'list-item-primary' ? secondaryActions : sortedActions)
44
+ .flatMap((action) => (Node.isAction(action) ? [action] : []))
45
+ .filter((a) => ['list-item', 'list-item-primary'].includes(a.properties?.disposition)),
46
+ [sortedActions, primaryAction],
47
+ );
31
48
 
32
- useLoadDescendents(item);
33
- useLoadDescendents(primaryAction && !isAction(primaryAction) ? primaryAction : undefined);
49
+ const primaryMenuActions = useMemo(
50
+ () =>
51
+ primaryAction
52
+ ? Node.isAction(primaryAction)
53
+ ? [primaryAction]
54
+ : groupedActions[primaryAction?.id ?? '']
55
+ : undefined,
56
+ [primaryAction, groupedActions],
57
+ );
34
58
 
35
- const ActionRoot = popoverAnchorId === `dxos.org/ui/${NAV_TREE_ITEM}/${item.id}` ? Popover.Anchor : Fragment;
59
+ const ActionRoot = popoverAnchorId === `${NAV_TREE_ITEM}:${item.id}` ? Popover.Anchor : Fragment;
36
60
 
37
61
  return (
38
- <div role='none' className='contents app-no-drag'>
62
+ <div role='none' className='contents dx-app-no-drag'>
39
63
  {primaryAction?.properties?.disposition === 'list-item-primary' && !primaryAction?.properties?.disabled ? (
40
64
  <Treegrid.Cell classNames='contents'>
41
65
  <NavTreeItemAction
@@ -43,8 +67,9 @@ export const NavTreeItemColumns = memo(({ path, item, open }: NavTreeItemColumns
43
67
  label={toLocalizedString(primaryAction.properties?.label, t)}
44
68
  icon={primaryAction.properties?.icon ?? 'ph--placeholder--regular'}
45
69
  parent={item}
46
- monolithic={isAction(primaryAction)}
47
- menuActions={isAction(primaryAction) ? [primaryAction] : groupedActions[primaryAction.id]}
70
+ path={path}
71
+ monolithic={Node.isAction(primaryAction)}
72
+ menuActions={primaryMenuActions}
48
73
  menuType={primaryAction.properties?.menuType}
49
74
  caller={NAV_TREE_ITEM}
50
75
  />
@@ -60,6 +85,7 @@ export const NavTreeItemColumns = memo(({ path, item, open }: NavTreeItemColumns
60
85
  label={t('tree item actions label')}
61
86
  icon='ph--dots-three-vertical--regular'
62
87
  parent={item}
88
+ path={path}
63
89
  menuActions={actions}
64
90
  menuType='dropdown'
65
91
  caller={NAV_TREE_ITEM}