diff --git a/desktop/plugins/public/ui-debugger/DesktopTypes.tsx b/desktop/plugins/public/ui-debugger/DesktopTypes.tsx
index 8c7f56da9..db68be5ed 100644
--- a/desktop/plugins/public/ui-debugger/DesktopTypes.tsx
+++ b/desktop/plugins/public/ui-debugger/DesktopTypes.tsx
@@ -95,9 +95,16 @@ export type UIActions = {
onPlayPauseToggled: () => void;
onSearchTermUpdated: (searchTerm: string) => void;
onSetWireFrameMode: (WireFrameMode: WireFrameMode) => void;
+ onExpandAllRecursively: (nodeId: Id) => void;
+ onCollapseAllNonAncestors: (nodeId: Id) => void;
+ onCollapseAllRecursively: (nodeId: Id) => void;
};
-export type SelectionSource = 'visualiser' | 'tree' | 'keyboard';
+export type SelectionSource =
+ | 'visualiser'
+ | 'tree'
+ | 'keyboard'
+ | 'context-menu';
export type StreamState =
| {state: 'Ok'}
diff --git a/desktop/plugins/public/ui-debugger/components/tree/ContextMenu.tsx b/desktop/plugins/public/ui-debugger/components/tree/ContextMenu.tsx
index 6deaa3fe7..ffd7bcfcf 100644
--- a/desktop/plugins/public/ui-debugger/components/tree/ContextMenu.tsx
+++ b/desktop/plugins/public/ui-debugger/components/tree/ContextMenu.tsx
@@ -6,8 +6,9 @@
*
* @format
*/
+
import {FrameworkEvent, Id, ClientNode} from '../../ClientTypes';
-import {ViewMode} from '../../DesktopTypes';
+import {OnSelectNode, ViewMode} from '../../DesktopTypes';
import React, {ReactNode} from 'react';
import {DataSource, getFlipperLib} from 'flipper-plugin';
import {Dropdown, Menu} from 'antd';
@@ -21,6 +22,9 @@ import {
CopyOutlined,
FullscreenExitOutlined,
FullscreenOutlined,
+ MenuFoldOutlined,
+ MenuUnfoldOutlined,
+ NodeExpandOutlined,
SnippetsOutlined,
TableOutlined,
} from '@ant-design/icons';
@@ -33,6 +37,10 @@ export const ContextMenu: React.FC<{
onFocusNode: (id?: Id) => void;
onContextMenuOpen: (open: boolean) => void;
onSetViewMode: (viewMode: ViewMode) => void;
+ onExpandRecursively: (id: Id) => void;
+ onCollapseRecursively: (id: Id) => void;
+ onCollapseNonAncestors: (id: Id) => void;
+ onSelectNode: OnSelectNode;
}> = ({
nodes,
frameworkEvents,
@@ -42,11 +50,51 @@ export const ContextMenu: React.FC<{
onFocusNode,
onContextMenuOpen,
onSetViewMode,
+ onExpandRecursively,
+ onCollapseRecursively,
+ onCollapseNonAncestors,
+ onSelectNode,
}) => {
const copyItems: ReactNode[] = [];
const hoveredNode = nodes.get(hoveredNodeId ?? Number.MAX_SAFE_INTEGER);
+ let treeCollapseItems: ReactNode[] = [];
if (hoveredNode) {
+ treeCollapseItems = [
+ }
+ onClick={() => {
+ onExpandRecursively(hoveredNode.id);
+ onSelectNode(hoveredNode.id, 'context-menu');
+ tracker.track('context-menu-expand-recursive', {});
+ }}
+ />,
+
+ }
+ onClick={() => {
+ onCollapseRecursively(hoveredNode.id);
+ onSelectNode(hoveredNode.id, 'context-menu');
+ tracker.track('context-menu-collapse-recursive', {});
+ }}
+ />,
+ }
+ onClick={() => {
+ onCollapseNonAncestors(hoveredNode.id);
+ onSelectNode(hoveredNode.id, 'context-menu');
+ tracker.track('context-menu-collapse-non-ancestors', {});
+ }}
+ />,
+
,
+ ];
+
copyItems.push(
(