Skip to content

Commit beef11f

Browse files
committed
feat: support drilldown to details from topology view in react ui
Signed-off-by: Nick Mitchell <[email protected]>
1 parent c6baff9 commit beef11f

File tree

3 files changed

+49
-14
lines changed

3 files changed

+49
-14
lines changed

pdl-live-react/src/view/dataflow/CustomNode.tsx

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,18 @@
11
import { type FunctionComponent } from "react"
2-
import { DefaultNode, type GraphElement } from "@patternfly/react-topology"
2+
import {
3+
DefaultNode,
4+
type GraphElement,
5+
type WithSelectionProps,
6+
} from "@patternfly/react-topology"
37

4-
interface CustomNodeProps {
8+
type CustomNodeProps = WithSelectionProps & {
59
element: GraphElement
610
}
711

8-
const CustomNode: FunctionComponent<CustomNodeProps> = ({
9-
element,
10-
}: CustomNodeProps) => {
11-
const data = element.getData()
12+
const CustomNode: FunctionComponent<CustomNodeProps> = (
13+
props: CustomNodeProps,
14+
) => {
15+
const data = props.element.getData()
1216
const ordinal = data && "ordinal" in data ? data.ordinal : undefined
1317
const variant = data && "variant" in data ? data.variant : undefined
1418
/*const content =
@@ -18,7 +22,7 @@ const CustomNode: FunctionComponent<CustomNodeProps> = ({
1822

1923
return (
2024
<DefaultNode
21-
element={element}
25+
{...props}
2226
badge={(ordinal !== undefined ? `[${ordinal}] ` : "") + variant}
2327
badgeColor={
2428
variant === "Final Result"

pdl-live-react/src/view/dataflow/DataFlow.tsx

Lines changed: 36 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
import { useEffect, useMemo, useState } from "react"
1+
import { useCallback, useEffect, useMemo, useState } from "react"
2+
import { useNavigate, useLocation, useSearchParams } from "react-router-dom"
23

34
import {
45
type Model,
@@ -24,18 +25,47 @@ type Props = {
2425
}
2526

2627
export default function DataFlow({ block }: Props) {
27-
const [selectedIds, setSelectedIds] = useState<string[]>([])
28+
const { hash } = useLocation()
29+
const navigate = useNavigate()
30+
31+
const [selectedIds, setSelectedIds] = useState<string[]>()
32+
const onSelect = useCallback(
33+
(ids: string[]) => {
34+
setSelectedIds(ids)
35+
if (ids.length === 1) {
36+
const id = ids[0].replace(/-(result|\d+)$/, "")
37+
navigate(`?detail&type=block&id=${id}${hash}`)
38+
}
39+
},
40+
[setSelectedIds, hash, navigate],
41+
)
2842

2943
const { nodes, edges } = useMemo(() => computeModel(block), [block])
3044

45+
const [searchParams] = useSearchParams()
46+
const selectedFromSearch = searchParams.get("id")
47+
useEffect(() => {
48+
if (selectedFromSearch) {
49+
const node = nodes
50+
.filter(({ id, group }) => !group && id.includes(selectedFromSearch))
51+
.sort()[0]
52+
if (node) {
53+
setSelectedIds([node.id])
54+
}
55+
} else {
56+
setSelectedIds([])
57+
}
58+
}, [setSelectedIds, selectedFromSearch, nodes])
59+
const state = useMemo(() => ({ selectedIds }), [selectedIds])
60+
3161
const controller = useMemo(() => {
3262
const newController = new Visualization()
3363
newController.registerLayoutFactory(layoutFactory)
3464
newController.registerComponentFactory(componentFactory)
35-
newController.addEventListener(SELECTION_EVENT, setSelectedIds)
65+
newController.addEventListener(SELECTION_EVENT, onSelect)
3666

3767
return newController
38-
}, [])
68+
}, [onSelect])
3969

4070
useEffect(() => {
4171
const model: Model = {
@@ -52,7 +82,7 @@ export default function DataFlow({ block }: Props) {
5282
setTimeout(() => {
5383
controller.getGraph().reset()
5484
controller.getGraph().layout()
55-
}, 100)
85+
}, 50)
5686
}, [nodes, edges, controller])
5787

5888
return (
@@ -80,7 +110,7 @@ export default function DataFlow({ block }: Props) {
80110
}
81111
>
82112
<VisualizationProvider controller={controller}>
83-
<VisualizationSurface state={{ selectedIds }} />
113+
<VisualizationSurface state={state} />
84114
</VisualizationProvider>
85115
</TopologyView>
86116
)

pdl-live-react/src/view/dataflow/components.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import {
33
DefaultGroup,
44
ModelKind,
55
withPanZoom,
6+
withSelection,
67
GraphComponent,
78
type ComponentFactory,
89
} from "@patternfly/react-topology"
@@ -18,7 +19,7 @@ const componentFactory: ComponentFactory = (kind: ModelKind, type: string) => {
1819
case ModelKind.graph:
1920
return withPanZoom()(GraphComponent)
2021
case ModelKind.node:
21-
return CustomNode
22+
return withSelection()(CustomNode)
2223
case ModelKind.edge:
2324
return DefaultEdge
2425
default:

0 commit comments

Comments
 (0)