From f5bc03c263fbc3ee3706d8f51283601b265a9701 Mon Sep 17 00:00:00 2001 From: Luke De Feo Date: Mon, 21 Aug 2023 04:24:16 -0700 Subject: [PATCH] Add framework event node level event filtering Summary: Lets you filter a nodes events by thread or type Reviewed By: lblasa Differential Revision: D48346955 fbshipit-source-id: 455d65ad21c54c5ad26782ac6a446f7ae15a4356 --- .../TimelineDataDescription.tsx | 3 + .../shared/FrameworkEventsTreeSelect.tsx | 4 +- .../inspector/FrameworkEventsInspector.tsx | 113 ++++++++++++++---- 3 files changed, 94 insertions(+), 26 deletions(-) diff --git a/desktop/flipper-plugin/src/ui/data-inspector/TimelineDataDescription.tsx b/desktop/flipper-plugin/src/ui/data-inspector/TimelineDataDescription.tsx index 9e49ca847..da185ea6b 100644 --- a/desktop/flipper-plugin/src/ui/data-inspector/TimelineDataDescription.tsx +++ b/desktop/flipper-plugin/src/ui/data-inspector/TimelineDataDescription.tsx @@ -45,6 +45,9 @@ export class TimelineDataDescription extends Component { render(): ReactNode { const moments = Object.values(this.props.timeline.time); + if (moments == null || moments.length === 0) { + return null; + } const firstMoment = moments[0].moment; const points = moments.map((value) => ({ label: value.display, diff --git a/desktop/plugins/public/ui-debugger/components/shared/FrameworkEventsTreeSelect.tsx b/desktop/plugins/public/ui-debugger/components/shared/FrameworkEventsTreeSelect.tsx index f7031f2ed..7d1a512a1 100644 --- a/desktop/plugins/public/ui-debugger/components/shared/FrameworkEventsTreeSelect.tsx +++ b/desktop/plugins/public/ui-debugger/components/shared/FrameworkEventsTreeSelect.tsx @@ -16,7 +16,9 @@ export function FrameworkEventsTreeSelect({ onSetEventSelected, selected, placeholder, + width, }: { + width?: number; placeholder: string; selected: string[]; treeData: TreeSelectNode[]; @@ -33,7 +35,7 @@ export function FrameworkEventsTreeSelect({ placeholder={placeholder} virtual={false} //for scrollbar style={{ - width: '100%', + width: width ?? '100%', }} treeData={treeData} treeDefaultExpandAll diff --git a/desktop/plugins/public/ui-debugger/components/sidebar/inspector/FrameworkEventsInspector.tsx b/desktop/plugins/public/ui-debugger/components/sidebar/inspector/FrameworkEventsInspector.tsx index 7bc20c192..d4b8157fe 100644 --- a/desktop/plugins/public/ui-debugger/components/sidebar/inspector/FrameworkEventsInspector.tsx +++ b/desktop/plugins/public/ui-debugger/components/sidebar/inspector/FrameworkEventsInspector.tsx @@ -10,14 +10,20 @@ import { DataInspector, Layout, + produce, theme, TimelineDataDescription, } from 'flipper-plugin'; import {FrameworkEvent, ClientNode} from '../../../ClientTypes'; -import React, {ReactNode} from 'react'; +import React, {ReactNode, useState} from 'react'; import {StackTraceInspector} from './StackTraceInspector'; -import {Descriptions, Tag} from 'antd'; +import {Collapse, Descriptions, Select, Tag} from 'antd'; import {frameworkEventSeparator} from '../../shared/FrameworkEventsTreeSelect'; +import { + buildTreeSelectData, + FrameworkEventsTreeSelect, +} from '../../shared/FrameworkEventsTreeSelect'; +import {uniqBy} from 'lodash'; type Props = { node: ClientNode; @@ -29,30 +35,87 @@ export const FrameworkEventsInspector: React.FC = ({ events, showExtra, }) => { + const allThreads = uniqBy(events, 'thread').map((event) => event.thread); + const [filteredThreads, setFilteredThreads] = useState>( + new Set(), + ); + + const allEventTypes = uniqBy(events, 'type').map((event) => event.type); + const [filteredEventTypes, setFilteredEventTypes] = useState>( + new Set(), + ); + + const filteredEvents = events + .filter( + (event) => + filteredEventTypes.size === 0 || filteredEventTypes.has(event.type), + ) + .filter( + (event) => + filteredThreads.size === 0 || filteredThreads.has(event.thread!), + ); + return ( - { - const idx = parseInt(current, 10); - const event = events[idx]; - showExtra?.( - 'Event details', - , - ); - }} - timeline={{ - time: events.map((event, idx) => { - return { - moment: event.timestamp, - display: `${eventTypeToName(event.type)}`, - color: threadToColor(event.thread), - key: idx.toString(), - }; - }), - current: 'initialNone', - }} - /> + + + + + { + setFilteredEventTypes((cur) => + produce(cur, (draft) => { + if (selected) { + draft.add(eventType); + } else { + draft.delete(eventType); + } + }), + ); + }} + selected={[...filteredEventTypes]} + /> +