@sudobility/testomniac_ui 0.0.33 → 0.0.35
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/pages/PagesGraphView.d.ts +16 -0
- package/dist/components/pages/PagesGraphView.d.ts.map +1 -0
- package/dist/components/pages/PagesGraphView.js +110 -0
- package/dist/components/pages/PagesGraphView.js.map +1 -0
- package/dist/components/pages/graphLayout.d.ts +24 -0
- package/dist/components/pages/graphLayout.d.ts.map +1 -0
- package/dist/components/pages/graphLayout.js +51 -0
- package/dist/components/pages/graphLayout.js.map +1 -0
- package/dist/pages/PagesPage.d.ts.map +1 -1
- package/dist/pages/PagesPage.js +16 -2
- package/dist/pages/PagesPage.js.map +1 -1
- package/package.json +7 -7
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import '@xyflow/react/dist/style.css';
|
|
2
|
+
import type { NavigationGraphEdge, NavigationGraphNode } from '@sudobility/testomniac_client';
|
|
3
|
+
interface PagesGraphViewProps {
|
|
4
|
+
nodes: NavigationGraphNode[];
|
|
5
|
+
edges: NavigationGraphEdge[];
|
|
6
|
+
route: NavigationGraphEdge[] | null;
|
|
7
|
+
selectedTargetPageId: number | null;
|
|
8
|
+
onSelectTarget: (pageId: number | null) => void;
|
|
9
|
+
showRemoved: boolean;
|
|
10
|
+
onToggleRemoved: (next: boolean) => void;
|
|
11
|
+
originPageId: number | null;
|
|
12
|
+
fill?: boolean;
|
|
13
|
+
}
|
|
14
|
+
export declare function PagesGraphView({ nodes, edges, route, selectedTargetPageId, onSelectTarget, showRemoved, onToggleRemoved, originPageId, fill, }: PagesGraphViewProps): import("react").JSX.Element;
|
|
15
|
+
export {};
|
|
16
|
+
//# sourceMappingURL=PagesGraphView.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PagesGraphView.d.ts","sourceRoot":"","sources":["../../../src/components/pages/PagesGraphView.tsx"],"names":[],"mappings":"AAYA,OAAO,8BAA8B,CAAC;AACtC,OAAO,KAAK,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,MAAM,+BAA+B,CAAC;AAM9F,UAAU,mBAAmB;IAC3B,KAAK,EAAE,mBAAmB,EAAE,CAAC;IAC7B,KAAK,EAAE,mBAAmB,EAAE,CAAC;IAC7B,KAAK,EAAE,mBAAmB,EAAE,GAAG,IAAI,CAAC;IACpC,oBAAoB,EAAE,MAAM,GAAG,IAAI,CAAC;IACpC,cAAc,EAAE,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;IAChD,WAAW,EAAE,OAAO,CAAC;IACrB,eAAe,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IACzC,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAKD,wBAAgB,cAAc,CAAC,EAC7B,KAAK,EACL,KAAK,EACL,KAAK,EACL,oBAAoB,EACpB,cAAc,EACd,WAAW,EACX,eAAe,EACf,YAAY,EACZ,IAAI,GACL,EAAE,mBAAmB,+BAqLrB"}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useEffect, useMemo } from 'react';
|
|
3
|
+
import { ReactFlow, Background, Controls, MiniMap, useNodesState, useEdgesState, MarkerType, } from '@xyflow/react';
|
|
4
|
+
import '@xyflow/react/dist/style.css';
|
|
5
|
+
import { assignColumns, MAX_GRAPH_NODES, UNREACHABLE_COLUMN } from './graphLayout';
|
|
6
|
+
const COLUMN_WIDTH = 260;
|
|
7
|
+
const ROW_HEIGHT = 90;
|
|
8
|
+
const edgeKey = (edge) => `${edge.fromPageId}-${edge.toRelativePath}-${edge.kind}-${edge.selector}`;
|
|
9
|
+
export function PagesGraphView({ nodes, edges, route, selectedTargetPageId, onSelectTarget, showRemoved, onToggleRemoved, originPageId, fill, }) {
|
|
10
|
+
const { flowNodes, flowEdges, droppedCount, unreachableCount } = useMemo(() => {
|
|
11
|
+
const liveEdges = edges.filter(edge => edge.removedAt == null);
|
|
12
|
+
const origin = originPageId ?? nodes[0]?.pageId ?? 0;
|
|
13
|
+
const { columns, unreachable } = assignColumns(nodes, liveEdges, origin);
|
|
14
|
+
// Cap by distance from the origin, keeping the nearest. Unreachable
|
|
15
|
+
// pages sort last so they are dropped first.
|
|
16
|
+
const ordered = [...nodes].sort((a, b) => {
|
|
17
|
+
const ca = columns.get(a.pageId) ?? UNREACHABLE_COLUMN;
|
|
18
|
+
const cb = columns.get(b.pageId) ?? UNREACHABLE_COLUMN;
|
|
19
|
+
const ra = ca === UNREACHABLE_COLUMN ? Number.MAX_SAFE_INTEGER : ca;
|
|
20
|
+
const rb = cb === UNREACHABLE_COLUMN ? Number.MAX_SAFE_INTEGER : cb;
|
|
21
|
+
if (ra !== rb)
|
|
22
|
+
return ra - rb;
|
|
23
|
+
return a.relativePath.localeCompare(b.relativePath);
|
|
24
|
+
});
|
|
25
|
+
const kept = ordered.slice(0, MAX_GRAPH_NODES);
|
|
26
|
+
const keptIds = new Set(kept.map(node => node.pageId));
|
|
27
|
+
// Fixed x for the unreachable column, computed BEFORE positioning so it
|
|
28
|
+
// does not depend on mutation order of rowByColumn.
|
|
29
|
+
const maxColumn = kept.reduce((acc, node) => {
|
|
30
|
+
const column = columns.get(node.pageId) ?? UNREACHABLE_COLUMN;
|
|
31
|
+
return column > acc ? column : acc;
|
|
32
|
+
}, 0);
|
|
33
|
+
const unreachableX = (maxColumn + 2) * COLUMN_WIDTH;
|
|
34
|
+
// Stable ordering within a column: by path, never by insertion.
|
|
35
|
+
const rowByColumn = new Map();
|
|
36
|
+
const positioned = kept.map(node => {
|
|
37
|
+
const column = columns.get(node.pageId) ?? UNREACHABLE_COLUMN;
|
|
38
|
+
const row = rowByColumn.get(column) ?? 0;
|
|
39
|
+
rowByColumn.set(column, row + 1);
|
|
40
|
+
const isTarget = node.pageId === selectedTargetPageId;
|
|
41
|
+
return {
|
|
42
|
+
id: String(node.pageId),
|
|
43
|
+
position: {
|
|
44
|
+
x: column === UNREACHABLE_COLUMN ? unreachableX : column * COLUMN_WIDTH,
|
|
45
|
+
y: row * ROW_HEIGHT,
|
|
46
|
+
},
|
|
47
|
+
data: { label: node.relativePath },
|
|
48
|
+
className: [
|
|
49
|
+
'rounded-md border px-3 py-2 text-xs',
|
|
50
|
+
isTarget
|
|
51
|
+
? 'border-foreground bg-foreground text-background'
|
|
52
|
+
: 'border-border bg-card text-foreground',
|
|
53
|
+
!node.hasInboundEdge ? 'ring-1 ring-destructive' : '',
|
|
54
|
+
node.requiresLogin ? 'italic' : '',
|
|
55
|
+
]
|
|
56
|
+
.filter(Boolean)
|
|
57
|
+
.join(' '),
|
|
58
|
+
};
|
|
59
|
+
});
|
|
60
|
+
const routeKeys = new Set((route ?? []).map(edgeKey));
|
|
61
|
+
const visible = edges.filter(edge => keptIds.has(edge.fromPageId) &&
|
|
62
|
+
keptIds.has(edge.toPageId) &&
|
|
63
|
+
(showRemoved || edge.removedAt == null));
|
|
64
|
+
const flow = visible.map(edge => {
|
|
65
|
+
const onRoute = routeKeys.has(edgeKey(edge));
|
|
66
|
+
const removed = edge.removedAt != null;
|
|
67
|
+
return {
|
|
68
|
+
id: edgeKey(edge),
|
|
69
|
+
source: String(edge.fromPageId),
|
|
70
|
+
target: String(edge.toPageId),
|
|
71
|
+
label: edge.label ?? undefined,
|
|
72
|
+
markerEnd: { type: MarkerType.ArrowClosed },
|
|
73
|
+
animated: onRoute,
|
|
74
|
+
style: {
|
|
75
|
+
strokeWidth: onRoute ? 3 : 1,
|
|
76
|
+
opacity: route && !onRoute ? 0.25 : removed ? 0.4 : 1,
|
|
77
|
+
strokeDasharray: removed ? '2 4' : edge.kind === 'declared' ? '6 4' : undefined,
|
|
78
|
+
},
|
|
79
|
+
};
|
|
80
|
+
});
|
|
81
|
+
return {
|
|
82
|
+
flowNodes: positioned,
|
|
83
|
+
flowEdges: flow,
|
|
84
|
+
droppedCount: nodes.length - kept.length,
|
|
85
|
+
unreachableCount: unreachable.length,
|
|
86
|
+
};
|
|
87
|
+
}, [nodes, edges, route, selectedTargetPageId, showRemoved, originPageId]);
|
|
88
|
+
const [rfNodes, setRfNodes, onNodesChange] = useNodesState(flowNodes);
|
|
89
|
+
const [rfEdges, setRfEdges, onEdgesChange] = useEdgesState(flowEdges);
|
|
90
|
+
// useNodesState/useEdgesState only SEED state from their argument. Without
|
|
91
|
+
// this sync the graph goes stale as soon as the selected target or the
|
|
92
|
+
// removed-links toggle changes. PagesMapView.tsx does the same thing.
|
|
93
|
+
useEffect(() => {
|
|
94
|
+
setRfNodes(flowNodes);
|
|
95
|
+
setRfEdges(flowEdges);
|
|
96
|
+
}, [flowNodes, flowEdges, setRfNodes, setRfEdges]);
|
|
97
|
+
const originLabel = useMemo(() => {
|
|
98
|
+
const match = nodes.find(node => node.pageId === originPageId);
|
|
99
|
+
return match?.relativePath ?? '(unresolved)';
|
|
100
|
+
}, [nodes, originPageId]);
|
|
101
|
+
if (nodes.length === 0) {
|
|
102
|
+
return (_jsx("div", { className: "py-8 text-center text-muted-foreground", children: _jsx("p", { className: "text-muted-foreground", children: "No navigation graph yet. Run a scan to discover links." }) }));
|
|
103
|
+
}
|
|
104
|
+
return (_jsxs("div", { className: fill ? 'flex h-full min-h-[400px] flex-col gap-2' : 'space-y-2', children: [_jsxs("div", { className: "flex flex-shrink-0 flex-wrap items-center gap-3 text-xs text-muted-foreground", children: [_jsxs("label", { className: "flex items-center gap-1", children: [_jsx("span", { children: "Route to" }), _jsxs("select", { className: "rounded border border-border bg-card px-2 py-1 text-foreground", value: selectedTargetPageId ?? '', onChange: event => onSelectTarget(event.target.value ? Number(event.target.value) : null), children: [_jsx("option", { value: "", children: "(none)" }), [...nodes]
|
|
105
|
+
.sort((a, b) => a.relativePath.localeCompare(b.relativePath))
|
|
106
|
+
.map(node => (_jsx("option", { value: node.pageId, children: node.relativePath }, node.pageId)))] })] }), _jsxs("label", { className: "flex items-center gap-1", children: [_jsx("input", { type: "checkbox", checked: showRemoved, onChange: event => onToggleRemoved(event.target.checked) }), _jsx("span", { children: "Show removed links" })] }), _jsxs("span", { children: ["Origin: ", originLabel] }), selectedTargetPageId != null && (_jsx("span", { children: route === null
|
|
107
|
+
? 'No known route to this page.'
|
|
108
|
+
: `Route: ${route.length} hop${route.length === 1 ? '' : 's'}` })), unreachableCount > 0 && (_jsxs("span", { children: [unreachableCount, " page(s) not reachable from the origin."] })), droppedCount > 0 && (_jsxs("span", { children: [droppedCount, " page(s) not shown (limit ", MAX_GRAPH_NODES, ")."] }))] }), _jsx("div", { className: `w-full overflow-hidden rounded-lg border border-border ${fill ? 'min-h-0 flex-1' : 'h-[600px]'}`, children: _jsxs(ReactFlow, { nodes: rfNodes, edges: rfEdges, onNodesChange: onNodesChange, onEdgesChange: onEdgesChange, defaultViewport: { x: 40, y: 40, zoom: 0.7 }, minZoom: 0.1, className: "bg-muted", children: [_jsx(Background, {}), _jsx(Controls, {}), _jsx(MiniMap, {})] }) })] }));
|
|
109
|
+
}
|
|
110
|
+
//# sourceMappingURL=PagesGraphView.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PagesGraphView.js","sourceRoot":"","sources":["../../../src/components/pages/PagesGraphView.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/** Cap on rendered nodes. Excess is dropped by distance and reported, never silently. */
|
|
2
|
+
export declare const MAX_GRAPH_NODES = 300;
|
|
3
|
+
/** Column marker for pages with no path from the origin. */
|
|
4
|
+
export declare const UNREACHABLE_COLUMN = -1;
|
|
5
|
+
export interface LayoutInput {
|
|
6
|
+
pageId: number;
|
|
7
|
+
}
|
|
8
|
+
export interface LayoutEdge {
|
|
9
|
+
fromPageId: number;
|
|
10
|
+
toPageId: number;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Assign each page a column by BFS depth from the origin over LIVE edges.
|
|
14
|
+
*
|
|
15
|
+
* Reachability is a DAG, not a tree, so shortest depth wins when a page is
|
|
16
|
+
* reachable several ways. Pages with no path land in UNREACHABLE_COLUMN rather
|
|
17
|
+
* than being dropped — the scan bootstraps by navigating directly to many
|
|
18
|
+
* paths, so unreached pages are expected and worth showing.
|
|
19
|
+
*/
|
|
20
|
+
export declare function assignColumns(nodes: LayoutInput[], liveEdges: LayoutEdge[], originPageId: number): {
|
|
21
|
+
columns: Map<number, number>;
|
|
22
|
+
unreachable: number[];
|
|
23
|
+
};
|
|
24
|
+
//# sourceMappingURL=graphLayout.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"graphLayout.d.ts","sourceRoot":"","sources":["../../../src/components/pages/graphLayout.ts"],"names":[],"mappings":"AAAA,yFAAyF;AACzF,eAAO,MAAM,eAAe,MAAM,CAAC;AAEnC,4DAA4D;AAC5D,eAAO,MAAM,kBAAkB,KAAK,CAAC;AAErC,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,UAAU;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;;;;;;GAOG;AACH,wBAAgB,aAAa,CAC3B,KAAK,EAAE,WAAW,EAAE,EACpB,SAAS,EAAE,UAAU,EAAE,EACvB,YAAY,EAAE,MAAM,GACnB;IAAE,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAAC,WAAW,EAAE,MAAM,EAAE,CAAA;CAAE,CAqCzD"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/** Cap on rendered nodes. Excess is dropped by distance and reported, never silently. */
|
|
2
|
+
export const MAX_GRAPH_NODES = 300;
|
|
3
|
+
/** Column marker for pages with no path from the origin. */
|
|
4
|
+
export const UNREACHABLE_COLUMN = -1;
|
|
5
|
+
/**
|
|
6
|
+
* Assign each page a column by BFS depth from the origin over LIVE edges.
|
|
7
|
+
*
|
|
8
|
+
* Reachability is a DAG, not a tree, so shortest depth wins when a page is
|
|
9
|
+
* reachable several ways. Pages with no path land in UNREACHABLE_COLUMN rather
|
|
10
|
+
* than being dropped — the scan bootstraps by navigating directly to many
|
|
11
|
+
* paths, so unreached pages are expected and worth showing.
|
|
12
|
+
*/
|
|
13
|
+
export function assignColumns(nodes, liveEdges, originPageId) {
|
|
14
|
+
const known = new Set(nodes.map(node => node.pageId));
|
|
15
|
+
const outgoing = new Map();
|
|
16
|
+
for (const edge of liveEdges) {
|
|
17
|
+
if (!known.has(edge.fromPageId) || !known.has(edge.toPageId))
|
|
18
|
+
continue;
|
|
19
|
+
const list = outgoing.get(edge.fromPageId) ?? [];
|
|
20
|
+
list.push(edge.toPageId);
|
|
21
|
+
outgoing.set(edge.fromPageId, list);
|
|
22
|
+
}
|
|
23
|
+
const columns = new Map();
|
|
24
|
+
if (known.has(originPageId)) {
|
|
25
|
+
columns.set(originPageId, 0);
|
|
26
|
+
let frontier = [originPageId];
|
|
27
|
+
let depth = 0;
|
|
28
|
+
while (frontier.length > 0) {
|
|
29
|
+
depth += 1;
|
|
30
|
+
const next = [];
|
|
31
|
+
for (const pageId of frontier) {
|
|
32
|
+
for (const target of outgoing.get(pageId) ?? []) {
|
|
33
|
+
if (columns.has(target))
|
|
34
|
+
continue;
|
|
35
|
+
columns.set(target, depth);
|
|
36
|
+
next.push(target);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
frontier = next;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
const unreachable = [];
|
|
43
|
+
for (const node of nodes) {
|
|
44
|
+
if (!columns.has(node.pageId)) {
|
|
45
|
+
columns.set(node.pageId, UNREACHABLE_COLUMN);
|
|
46
|
+
unreachable.push(node.pageId);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
return { columns, unreachable };
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=graphLayout.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"graphLayout.js","sourceRoot":"","sources":["../../../src/components/pages/graphLayout.ts"],"names":[],"mappings":"AAAA,yFAAyF;AACzF,MAAM,CAAC,MAAM,eAAe,GAAG,GAAG,CAAC;AAEnC,4DAA4D;AAC5D,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,CAAC,CAAC;AAWrC;;;;;;;GAOG;AACH,MAAM,UAAU,aAAa,CAC3B,KAAoB,EACpB,SAAuB,EACvB,YAAoB;IAEpB,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;IACtD,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAoB,CAAC;IAC7C,KAAK,MAAM,IAAI,IAAI,SAAS,EAAE,CAAC;QAC7B,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC;YAAE,SAAS;QACvE,MAAM,IAAI,GAAG,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC;QACjD,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACzB,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;IACtC,CAAC;IAED,MAAM,OAAO,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC1C,IAAI,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,CAAC;QAC5B,OAAO,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC;QAC7B,IAAI,QAAQ,GAAG,CAAC,YAAY,CAAC,CAAC;QAC9B,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,OAAO,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC3B,KAAK,IAAI,CAAC,CAAC;YACX,MAAM,IAAI,GAAa,EAAE,CAAC;YAC1B,KAAK,MAAM,MAAM,IAAI,QAAQ,EAAE,CAAC;gBAC9B,KAAK,MAAM,MAAM,IAAI,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC;oBAChD,IAAI,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC;wBAAE,SAAS;oBAClC,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;oBAC3B,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;gBACpB,CAAC;YACH,CAAC;YACD,QAAQ,GAAG,IAAI,CAAC;QAClB,CAAC;IACH,CAAC;IAED,MAAM,WAAW,GAAa,EAAE,CAAC;IACjC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;YAC9B,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC;YAC7C,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAChC,CAAC;IACH,CAAC;IACD,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC;AAClC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PagesPage.d.ts","sourceRoot":"","sources":["../../src/pages/PagesPage.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"PagesPage.d.ts","sourceRoot":"","sources":["../../src/pages/PagesPage.tsx"],"names":[],"mappings":"AAiBA,wBAAgB,SAAS,gCAsNxB"}
|
package/dist/pages/PagesPage.js
CHANGED
|
@@ -1,15 +1,18 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
2
|
import { useState, useMemo } from 'react';
|
|
3
|
-
import { useEnvironmentPages, useEnvironmentTestInteractions, useRunPages, useRunTestInteractions, useRunnerPageStates, } from '@sudobility/testomniac_client';
|
|
3
|
+
import { useEnvironmentPages, useEnvironmentTestInteractions, useNavigationGraph, useRoute, useRunPages, useRunTestInteractions, useRunnerPageStates, } from '@sudobility/testomniac_client';
|
|
4
4
|
import { ContentLayout } from '@sudobility/components';
|
|
5
5
|
import { SEOHead, useTestomniacApi } from '../context/config';
|
|
6
6
|
import { useRouteParams } from '../context/routing';
|
|
7
7
|
import { PagesListView } from '../components/pages/PagesListView';
|
|
8
8
|
import { PagesMapView } from '../components/pages/PagesMapView';
|
|
9
|
+
import { PagesGraphView } from '../components/pages/PagesGraphView';
|
|
9
10
|
export function PagesPage() {
|
|
10
11
|
const { entitySlug, envId, runId } = useRouteParams();
|
|
11
12
|
const { networkClient, token, baseUrl } = useTestomniacApi();
|
|
12
13
|
const [view, setView] = useState('list');
|
|
14
|
+
const [targetPageId, setTargetPageId] = useState(null);
|
|
15
|
+
const [showRemoved, setShowRemoved] = useState(false);
|
|
13
16
|
const runScoped = Boolean(runId);
|
|
14
17
|
const environmentPagesQuery = useEnvironmentPages(networkClient, baseUrl, token ?? '', Number(envId), { enabled: !!envId && !!token && !runScoped });
|
|
15
18
|
const runPagesQuery = useRunPages(networkClient, baseUrl, token ?? '', Number(runId), {
|
|
@@ -39,6 +42,15 @@ export function PagesPage() {
|
|
|
39
42
|
const primaryRunnerId = pages.length > 0 ? pages[0].runnerId : 0;
|
|
40
43
|
const pageStatesQuery = useRunnerPageStates(networkClient, baseUrl, token ?? '', primaryRunnerId, { enabled: !!primaryRunnerId && !!token });
|
|
41
44
|
const pageStates = useMemo(() => pageStatesQuery.data?.data ?? [], [pageStatesQuery.data]);
|
|
45
|
+
// Graph mode is runner-scoped by design: edges belong to a runner, not a run.
|
|
46
|
+
const graphQuery = useNavigationGraph(networkClient, baseUrl, token ?? '', primaryRunnerId, {
|
|
47
|
+
enabled: !!primaryRunnerId && !!token && view === 'graph',
|
|
48
|
+
});
|
|
49
|
+
const routeQuery = useRoute(networkClient, baseUrl, token ?? '', primaryRunnerId, targetPageId ?? 0, {
|
|
50
|
+
enabled: !!primaryRunnerId && !!token && !!targetPageId && view === 'graph',
|
|
51
|
+
});
|
|
52
|
+
const graph = graphQuery.data?.data ?? null;
|
|
53
|
+
const routeHops = targetPageId ? (routeQuery.data?.data?.route ?? null) : null;
|
|
42
54
|
const screenshotsByPageId = useMemo(() => {
|
|
43
55
|
const map = new Map();
|
|
44
56
|
for (const ps of pageStates) {
|
|
@@ -58,6 +70,8 @@ export function PagesPage() {
|
|
|
58
70
|
? 'bg-foreground text-background'
|
|
59
71
|
: 'text-muted-foreground hover:text-foreground'} rounded-l-md`, children: "List" }), _jsx("button", { onClick: () => setView('map'), className: `px-4 py-1.5 text-sm font-medium transition-colors ${view === 'map'
|
|
60
72
|
? 'bg-foreground text-background'
|
|
61
|
-
: 'text-muted-foreground hover:text-foreground'}
|
|
73
|
+
: 'text-muted-foreground hover:text-foreground'}`, children: "Map" }), _jsx("button", { onClick: () => setView('graph'), className: `px-4 py-1.5 text-sm font-medium transition-colors ${view === 'graph'
|
|
74
|
+
? 'bg-foreground text-background'
|
|
75
|
+
: 'text-muted-foreground hover:text-foreground'} rounded-r-md`, children: "Graph" })] })] })] }), children: pages.length === 0 ? (_jsx("div", { className: "px-4 py-4 sm:px-6", children: _jsx("p", { className: "text-muted-foreground", children: "No pages discovered yet." }) })) : view === 'list' ? (_jsx("div", { className: "px-4 py-4 sm:px-6", children: _jsx(PagesListView, { pages: pages, envId: envId, entitySlug: entitySlug, runId: runId, screenshotsByPageId: screenshotsByPageId, apiUrl: baseUrl }) })) : view === 'graph' ? (_jsx("div", { className: "h-full min-h-0 p-4 sm:p-6", children: graphQuery.isLoading ? (_jsx("div", { className: "py-8 text-center text-muted-foreground", children: "Loading graph..." })) : graphQuery.error ? (_jsxs("div", { className: "py-8 text-center text-destructive", children: ["Error: ", graphQuery.error.message] })) : (_jsx(PagesGraphView, { nodes: graph?.nodes ?? [], edges: graph?.edges ?? [], route: routeHops, selectedTargetPageId: targetPageId, onSelectTarget: setTargetPageId, showRemoved: showRemoved, onToggleRemoved: setShowRemoved, originPageId: routeQuery.data?.data?.originPageId ?? null, fill: true })) })) : (_jsx("div", { className: "h-full min-h-0 p-4 sm:p-6", children: _jsx(PagesMapView, { pages: pages, testInteractions: testInteractions, envId: envId, entitySlug: entitySlug, runId: runId, screenshotsByPageId: screenshotsByPageId, apiUrl: baseUrl, fill: true }) })) }));
|
|
62
76
|
}
|
|
63
77
|
//# sourceMappingURL=PagesPage.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PagesPage.js","sourceRoot":"","sources":["../../src/pages/PagesPage.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AAC1C,OAAO,EACL,mBAAmB,EACnB,8BAA8B,EAC9B,WAAW,EACX,sBAAsB,EACtB,mBAAmB,GACpB,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,EAAE,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAC9D,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,mCAAmC,CAAC;AAClE,OAAO,EAAE,YAAY,EAAE,MAAM,kCAAkC,CAAC;
|
|
1
|
+
{"version":3,"file":"PagesPage.js","sourceRoot":"","sources":["../../src/pages/PagesPage.tsx"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@sudobility/testomniac_ui",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.35",
|
|
4
4
|
"description": "Shared dashboard UI components, pages, and hooks for Testomniac apps (router/i18n-agnostic)",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -29,9 +29,9 @@
|
|
|
29
29
|
"@heroicons/react": ">=2.0.0",
|
|
30
30
|
"@sudobility/components": "^5.0.98",
|
|
31
31
|
"@sudobility/design": "^1.1.46",
|
|
32
|
-
"@sudobility/testomniac_client": "^0.0.
|
|
33
|
-
"@sudobility/testomniac_lib": "^0.0.
|
|
34
|
-
"@sudobility/testomniac_types": "^0.0.
|
|
32
|
+
"@sudobility/testomniac_client": "^0.0.114",
|
|
33
|
+
"@sudobility/testomniac_lib": "^0.0.124",
|
|
34
|
+
"@sudobility/testomniac_types": "^0.0.88",
|
|
35
35
|
"@sudobility/types": "^1.9.62",
|
|
36
36
|
"@tanstack/react-query": ">=5.0.0",
|
|
37
37
|
"@tanstack/react-table": ">=8.0.0",
|
|
@@ -44,9 +44,9 @@
|
|
|
44
44
|
"@heroicons/react": "^2.2.0",
|
|
45
45
|
"@sudobility/components": "^5.0.98",
|
|
46
46
|
"@sudobility/design": "^1.1.46",
|
|
47
|
-
"@sudobility/testomniac_client": "^0.0.
|
|
48
|
-
"@sudobility/testomniac_lib": "^0.0.
|
|
49
|
-
"@sudobility/testomniac_types": "^0.0.
|
|
47
|
+
"@sudobility/testomniac_client": "^0.0.114",
|
|
48
|
+
"@sudobility/testomniac_lib": "^0.0.124",
|
|
49
|
+
"@sudobility/testomniac_types": "^0.0.88",
|
|
50
50
|
"@sudobility/types": "^1.9.62",
|
|
51
51
|
"@tanstack/react-query": "^5.90.5",
|
|
52
52
|
"@tanstack/react-table": "^8.21.3",
|