focus visualiser node when selecting in table view

Summary: Use the visualiser as a reference for the event table

Reviewed By: antonk52

Differential Revision: D48562105

fbshipit-source-id: 8707efdcb0631e9716dd0a06e01518480ca2edc1
This commit is contained in:
Luke De Feo
2023-08-23 01:51:31 -07:00
committed by Facebook GitHub Bot
parent 7d9744b8ff
commit c6dddccd87
2 changed files with 46 additions and 12 deletions

View File

@@ -12,21 +12,26 @@ import {
DataTable, DataTable,
DataTableColumn, DataTableColumn,
DataTableManager, DataTableManager,
DetailSidebar,
Layout, Layout,
usePlugin, usePlugin,
useValue,
} from 'flipper-plugin'; } from 'flipper-plugin';
import React, {useEffect, useRef} from 'react'; import React, {useCallback, useEffect, useRef} from 'react';
import {FrameworkEvent, Id, NodeMap} from '../ClientTypes'; import {FrameworkEvent, Id, NodeMap} from '../ClientTypes';
import {plugin} from '../index'; import {plugin} from '../index';
import {Button, Tooltip} from 'antd'; import {Button, Result, Tooltip} from 'antd';
import {AugmentedFrameworkEvent} from '../DesktopTypes'; import {AugmentedFrameworkEvent} from '../DesktopTypes';
import {formatDuration, formatTimestampMillis} from '../utils/timeUtils'; import {formatDuration, formatTimestampMillis} from '../utils/timeUtils';
import {eventTypeToName} from './sidebar/inspector/FrameworkEventsInspector'; import {eventTypeToName} from './sidebar/inspector/FrameworkEventsInspector';
import {startCase} from 'lodash'; import {startCase} from 'lodash';
import {Visualization2D} from './visualizer/Visualization2D';
import {getNode} from '../utils/map';
export function FrameworkEventsTable({ export function FrameworkEventsTable({
nodeId, nodeId,
isTree, isTree,
nodes,
}: { }: {
nodeId: Id; nodeId: Id;
nodes: NodeMap; nodes: NodeMap;
@@ -34,11 +39,13 @@ export function FrameworkEventsTable({
}) { }) {
const instance = usePlugin(plugin); const instance = usePlugin(plugin);
const focusedNode = useValue(instance.uiState.focusedNode);
const managerRef = useRef<DataTableManager<AugmentedFrameworkEvent> | null>( const managerRef = useRef<DataTableManager<AugmentedFrameworkEvent> | null>(
null, null,
); );
useEffect(() => { useEffect(() => {
instance.uiActions.onSelectNode(undefined, 'tree');
if (nodeId != null) { if (nodeId != null) {
managerRef.current?.resetFilters(); managerRef.current?.resetFilters();
if (isTree) { if (isTree) {
@@ -51,24 +58,45 @@ export function FrameworkEventsTable({
}); });
} }
} }
}, [isTree, nodeId]); }, [instance.uiActions, isTree, nodeId]);
const onSelectRow = useCallback(
(event: FrameworkEvent | undefined): void => {
instance.uiActions.onFocusNode(event?.nodeId);
},
[instance.uiActions],
);
return ( return (
<Layout.Container grow> <Layout.Container grow>
<DataTable<FrameworkEvent> <DataTable<FrameworkEvent>
dataSource={instance.frameworkEvents} dataSource={instance.frameworkEvents}
tableManagerRef={managerRef} tableManagerRef={managerRef}
onSelect={onSelectRow}
columns={columns} columns={columns}
extraActions={ extraActions={
<Tooltip title="Back to tree"> <Tooltip title="Back to tree">
<Button <Button
onClick={() => { onClick={() => {
instance.uiActions.onFocusNode(undefined);
instance.uiActions.onSetViewMode({mode: 'default'}); instance.uiActions.onSetViewMode({mode: 'default'});
}} }}
icon={<PartitionOutlined />}></Button> icon={<PartitionOutlined />}></Button>
</Tooltip> </Tooltip>
} }
/> />
<DetailSidebar width={450}>
{getNode(focusedNode, nodes) != null ? (
<Visualization2D
disableInteractivity
hideControls
width={400}
nodes={nodes}
onSelectNode={instance.uiActions.onSelectNode}
/>
) : (
<Result title="Node is no longer on screen" />
)}
</DetailSidebar>
</Layout.Container> </Layout.Container>
); );
} }

View File

@@ -31,8 +31,10 @@ export const Visualization2D: React.FC<
width: number; width: number;
nodes: Map<Id, ClientNode>; nodes: Map<Id, ClientNode>;
onSelectNode: OnSelectNode; onSelectNode: OnSelectNode;
hideControls?: boolean;
disableInteractivity?: boolean;
} & React.HTMLAttributes<HTMLDivElement> } & React.HTMLAttributes<HTMLDivElement>
> = ({width, nodes, onSelectNode}) => { > = ({width, nodes, onSelectNode, hideControls, disableInteractivity}) => {
const rootNodeRef = useRef<HTMLDivElement>(); const rootNodeRef = useRef<HTMLDivElement>();
const instance = usePlugin(plugin); const instance = usePlugin(plugin);
@@ -62,6 +64,7 @@ export const Visualization2D: React.FC<
const domRect = rootNodeRef.current?.getBoundingClientRect(); const domRect = rootNodeRef.current?.getBoundingClientRect();
if ( if (
disableInteractivity ||
!focusState || !focusState ||
!domRect || !domRect ||
instance.uiState.isContextMenuOpen.get() || instance.uiState.isContextMenuOpen.get() ||
@@ -110,6 +113,7 @@ export const Visualization2D: React.FC<
width, width,
snapshotNode, snapshotNode,
instance.uiActions, instance.uiActions,
disableInteractivity,
]); ]);
useEffect(() => { useEffect(() => {
@@ -146,14 +150,16 @@ export const Visualization2D: React.FC<
return ( return (
<Layout.Container> <Layout.Container>
<VisualiserControls {!hideControls && (
onSetWireFrameMode={instance.uiActions.onSetWireFrameMode} <VisualiserControls
wireFrameMode={wireFrameMode} onSetWireFrameMode={instance.uiActions.onSetWireFrameMode}
focusedNode={focusedNodeId} wireFrameMode={wireFrameMode}
selectedNode={getNode(selectedNodeId?.id, nodes)} focusedNode={focusedNodeId}
setTargetMode={setTargetMode} selectedNode={getNode(selectedNodeId?.id, nodes)}
targetMode={targetMode} setTargetMode={setTargetMode}
/> targetMode={targetMode}
/>
)}
<div <div
onMouseLeave={(e) => { onMouseLeave={(e) => {