@sudobility/testomniac_ui 0.0.34 → 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.
@@ -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":"AAcA,wBAAgB,SAAS,gCAmKxB"}
1
+ {"version":3,"file":"PagesPage.d.ts","sourceRoot":"","sources":["../../src/pages/PagesPage.tsx"],"names":[],"mappings":"AAiBA,wBAAgB,SAAS,gCAsNxB"}
@@ -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'} rounded-r-md`, children: "Map" })] })] })] }), 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 }) })) : (_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 }) })) }));
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":"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"}
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.34",
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,8 +29,8 @@
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.112",
33
- "@sudobility/testomniac_lib": "^0.0.123",
32
+ "@sudobility/testomniac_client": "^0.0.114",
33
+ "@sudobility/testomniac_lib": "^0.0.124",
34
34
  "@sudobility/testomniac_types": "^0.0.88",
35
35
  "@sudobility/types": "^1.9.62",
36
36
  "@tanstack/react-query": ">=5.0.0",
@@ -44,8 +44,8 @@
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.112",
48
- "@sudobility/testomniac_lib": "^0.0.123",
47
+ "@sudobility/testomniac_client": "^0.0.114",
48
+ "@sudobility/testomniac_lib": "^0.0.124",
49
49
  "@sudobility/testomniac_types": "^0.0.88",
50
50
  "@sudobility/types": "^1.9.62",
51
51
  "@tanstack/react-query": "^5.90.5",