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:
committed by
Facebook GitHub Bot
parent
7d9744b8ff
commit
c6dddccd87
@@ -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>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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,6 +150,7 @@ export const Visualization2D: React.FC<
|
|||||||
|
|
||||||
return (
|
return (
|
||||||
<Layout.Container>
|
<Layout.Container>
|
||||||
|
{!hideControls && (
|
||||||
<VisualiserControls
|
<VisualiserControls
|
||||||
onSetWireFrameMode={instance.uiActions.onSetWireFrameMode}
|
onSetWireFrameMode={instance.uiActions.onSetWireFrameMode}
|
||||||
wireFrameMode={wireFrameMode}
|
wireFrameMode={wireFrameMode}
|
||||||
@@ -154,6 +159,7 @@ export const Visualization2D: React.FC<
|
|||||||
setTargetMode={setTargetMode}
|
setTargetMode={setTargetMode}
|
||||||
targetMode={targetMode}
|
targetMode={targetMode}
|
||||||
/>
|
/>
|
||||||
|
)}
|
||||||
|
|
||||||
<div
|
<div
|
||||||
onMouseLeave={(e) => {
|
onMouseLeave={(e) => {
|
||||||
|
|||||||
Reference in New Issue
Block a user