@sudobility/testomniac_ui 0.0.35 → 0.0.37
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 +8 -8
- package/dist/components/pages/PagesGraphView.d.ts.map +1 -1
- package/dist/components/pages/PagesGraphView.js +92 -41
- package/dist/components/pages/PagesGraphView.js.map +1 -1
- package/dist/components/pages/graphLayout.d.ts +12 -9
- package/dist/components/pages/graphLayout.d.ts.map +1 -1
- package/dist/components/pages/graphLayout.js +24 -19
- package/dist/components/pages/graphLayout.js.map +1 -1
- package/dist/pages/PagesPage.d.ts.map +1 -1
- package/dist/pages/PagesPage.js +17 -9
- package/dist/pages/PagesPage.js.map +1 -1
- package/package.json +8 -8
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
import '@xyflow/react/dist/style.css';
|
|
2
|
-
import type {
|
|
2
|
+
import type { GraphTransition, GraphView } from '@sudobility/testomniac_client';
|
|
3
3
|
interface PagesGraphViewProps {
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
route:
|
|
7
|
-
|
|
8
|
-
onSelectTarget: (
|
|
4
|
+
views: GraphView[];
|
|
5
|
+
transitions: GraphTransition[];
|
|
6
|
+
route: GraphTransition[] | null;
|
|
7
|
+
selectedTargetViewId: number | null;
|
|
8
|
+
onSelectTarget: (viewId: number | null) => void;
|
|
9
9
|
showRemoved: boolean;
|
|
10
10
|
onToggleRemoved: (next: boolean) => void;
|
|
11
|
-
|
|
11
|
+
originViewId: number | null;
|
|
12
12
|
fill?: boolean;
|
|
13
13
|
}
|
|
14
|
-
export declare function PagesGraphView({
|
|
14
|
+
export declare function PagesGraphView({ views, transitions, route, selectedTargetViewId, onSelectTarget, showRemoved, onToggleRemoved, originViewId, fill, }: PagesGraphViewProps): import("react").JSX.Element;
|
|
15
15
|
export {};
|
|
16
16
|
//# sourceMappingURL=PagesGraphView.d.ts.map
|
|
@@ -1 +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,
|
|
1
|
+
{"version":3,"file":"PagesGraphView.d.ts","sourceRoot":"","sources":["../../../src/components/pages/PagesGraphView.tsx"],"names":[],"mappings":"AAYA,OAAO,8BAA8B,CAAC;AACtC,OAAO,KAAK,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,+BAA+B,CAAC;AAMhF,UAAU,mBAAmB;IAC3B,KAAK,EAAE,SAAS,EAAE,CAAC;IACnB,WAAW,EAAE,eAAe,EAAE,CAAC;IAC/B,KAAK,EAAE,eAAe,EAAE,GAAG,IAAI,CAAC;IAChC,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;AAeD,wBAAgB,cAAc,CAAC,EAC7B,KAAK,EACL,WAAW,EACX,KAAK,EACL,oBAAoB,EACpB,cAAc,EACd,WAAW,EACX,eAAe,EACf,YAAY,EACZ,IAAI,GACL,EAAE,mBAAmB,+BA+NrB"}
|
|
@@ -5,86 +5,137 @@ import '@xyflow/react/dist/style.css';
|
|
|
5
5
|
import { assignColumns, MAX_GRAPH_NODES, UNREACHABLE_COLUMN } from './graphLayout';
|
|
6
6
|
const COLUMN_WIDTH = 260;
|
|
7
7
|
const ROW_HEIGHT = 90;
|
|
8
|
-
|
|
9
|
-
|
|
8
|
+
/**
|
|
9
|
+
* Label for a view.
|
|
10
|
+
*
|
|
11
|
+
* Several views can share one URL path — a cart with items and an empty one, a
|
|
12
|
+
* modal open and closed. That separation is the whole reason the graph is keyed
|
|
13
|
+
* on signatures, so a shared path gets a short signature suffix rather than
|
|
14
|
+
* collapsing into indistinguishable duplicates.
|
|
15
|
+
*/
|
|
16
|
+
function labelFor(view, sharesPath) {
|
|
17
|
+
const base = view.title ? `${view.urlPath} · ${view.title}` : view.urlPath;
|
|
18
|
+
return sharesPath ? `${base} · ${view.signature.slice(0, 6)}` : base;
|
|
19
|
+
}
|
|
20
|
+
export function PagesGraphView({ views, transitions, route, selectedTargetViewId, onSelectTarget, showRemoved, onToggleRemoved, originViewId, fill, }) {
|
|
21
|
+
const pathCounts = useMemo(() => {
|
|
22
|
+
const counts = new Map();
|
|
23
|
+
for (const view of views) {
|
|
24
|
+
counts.set(view.urlPath, (counts.get(view.urlPath) ?? 0) + 1);
|
|
25
|
+
}
|
|
26
|
+
return counts;
|
|
27
|
+
}, [views]);
|
|
28
|
+
/**
|
|
29
|
+
* Views nothing links to. The scan bootstraps by navigating directly to many
|
|
30
|
+
* paths, so an orphan is worth surfacing rather than hiding.
|
|
31
|
+
*/
|
|
32
|
+
const inbound = useMemo(() => {
|
|
33
|
+
const seen = new Set();
|
|
34
|
+
for (const transition of transitions) {
|
|
35
|
+
if (transition.removedAt == null && transition.toViewId != null) {
|
|
36
|
+
seen.add(transition.toViewId);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
return seen;
|
|
40
|
+
}, [transitions]);
|
|
10
41
|
const { flowNodes, flowEdges, droppedCount, unreachableCount } = useMemo(() => {
|
|
11
|
-
const liveEdges =
|
|
12
|
-
const origin =
|
|
13
|
-
const { columns, unreachable } = assignColumns(
|
|
14
|
-
// Cap by distance from the origin, keeping the nearest. Unreachable
|
|
15
|
-
//
|
|
16
|
-
const ordered = [...
|
|
17
|
-
const ca = columns.get(a.
|
|
18
|
-
const cb = columns.get(b.
|
|
42
|
+
const liveEdges = transitions.filter(edge => edge.removedAt == null);
|
|
43
|
+
const origin = originViewId ?? views[0]?.id ?? 0;
|
|
44
|
+
const { columns, unreachable } = assignColumns(views, liveEdges, origin);
|
|
45
|
+
// Cap by distance from the origin, keeping the nearest. Unreachable views
|
|
46
|
+
// sort last so they are dropped first.
|
|
47
|
+
const ordered = [...views].sort((a, b) => {
|
|
48
|
+
const ca = columns.get(a.id) ?? UNREACHABLE_COLUMN;
|
|
49
|
+
const cb = columns.get(b.id) ?? UNREACHABLE_COLUMN;
|
|
19
50
|
const ra = ca === UNREACHABLE_COLUMN ? Number.MAX_SAFE_INTEGER : ca;
|
|
20
51
|
const rb = cb === UNREACHABLE_COLUMN ? Number.MAX_SAFE_INTEGER : cb;
|
|
21
52
|
if (ra !== rb)
|
|
22
53
|
return ra - rb;
|
|
23
|
-
return a.
|
|
54
|
+
return a.urlPath.localeCompare(b.urlPath);
|
|
24
55
|
});
|
|
25
56
|
const kept = ordered.slice(0, MAX_GRAPH_NODES);
|
|
26
|
-
const keptIds = new Set(kept.map(
|
|
57
|
+
const keptIds = new Set(kept.map(view => view.id));
|
|
27
58
|
// Fixed x for the unreachable column, computed BEFORE positioning so it
|
|
28
59
|
// does not depend on mutation order of rowByColumn.
|
|
29
|
-
const maxColumn = kept.reduce((acc,
|
|
30
|
-
const column = columns.get(
|
|
60
|
+
const maxColumn = kept.reduce((acc, view) => {
|
|
61
|
+
const column = columns.get(view.id) ?? UNREACHABLE_COLUMN;
|
|
31
62
|
return column > acc ? column : acc;
|
|
32
63
|
}, 0);
|
|
33
64
|
const unreachableX = (maxColumn + 2) * COLUMN_WIDTH;
|
|
34
65
|
// Stable ordering within a column: by path, never by insertion.
|
|
35
66
|
const rowByColumn = new Map();
|
|
36
|
-
const positioned = kept.map(
|
|
37
|
-
const column = columns.get(
|
|
67
|
+
const positioned = kept.map(view => {
|
|
68
|
+
const column = columns.get(view.id) ?? UNREACHABLE_COLUMN;
|
|
38
69
|
const row = rowByColumn.get(column) ?? 0;
|
|
39
70
|
rowByColumn.set(column, row + 1);
|
|
40
|
-
const isTarget =
|
|
71
|
+
const isTarget = view.id === selectedTargetViewId;
|
|
41
72
|
return {
|
|
42
|
-
id: String(
|
|
73
|
+
id: String(view.id),
|
|
43
74
|
position: {
|
|
44
75
|
x: column === UNREACHABLE_COLUMN ? unreachableX : column * COLUMN_WIDTH,
|
|
45
76
|
y: row * ROW_HEIGHT,
|
|
46
77
|
},
|
|
47
|
-
data: {
|
|
78
|
+
data: {
|
|
79
|
+
label: labelFor(view, (pathCounts.get(view.urlPath) ?? 0) > 1),
|
|
80
|
+
},
|
|
48
81
|
className: [
|
|
49
82
|
'rounded-md border px-3 py-2 text-xs',
|
|
50
83
|
isTarget
|
|
51
84
|
? 'border-foreground bg-foreground text-background'
|
|
52
85
|
: 'border-border bg-card text-foreground',
|
|
53
|
-
!
|
|
54
|
-
node.requiresLogin ? 'italic' : '',
|
|
86
|
+
!inbound.has(view.id) ? 'ring-1 ring-destructive' : '',
|
|
55
87
|
]
|
|
56
88
|
.filter(Boolean)
|
|
57
89
|
.join(' '),
|
|
58
90
|
};
|
|
59
91
|
});
|
|
60
|
-
const
|
|
61
|
-
const visible =
|
|
62
|
-
keptIds.has(edge.
|
|
92
|
+
const routeIds = new Set((route ?? []).map(edge => edge.id));
|
|
93
|
+
const visible = transitions.filter(edge => edge.toViewId != null &&
|
|
94
|
+
keptIds.has(edge.fromViewId) &&
|
|
95
|
+
keptIds.has(edge.toViewId) &&
|
|
63
96
|
(showRemoved || edge.removedAt == null));
|
|
64
97
|
const flow = visible.map(edge => {
|
|
65
|
-
const onRoute =
|
|
98
|
+
const onRoute = routeIds.has(edge.id);
|
|
66
99
|
const removed = edge.removedAt != null;
|
|
100
|
+
// A transition callers have reported failing is worth seeing before it is
|
|
101
|
+
// walked: routing only demotes such an edge, it never removes it.
|
|
102
|
+
const unreliable = edge.failureCount > 0;
|
|
67
103
|
return {
|
|
68
|
-
id:
|
|
69
|
-
source: String(edge.
|
|
70
|
-
target: String(edge.
|
|
71
|
-
label: edge.
|
|
104
|
+
id: String(edge.id),
|
|
105
|
+
source: String(edge.fromViewId),
|
|
106
|
+
target: String(edge.toViewId),
|
|
107
|
+
label: edge.triggerLabel ?? undefined,
|
|
72
108
|
markerEnd: { type: MarkerType.ArrowClosed },
|
|
73
109
|
animated: onRoute,
|
|
74
110
|
style: {
|
|
75
111
|
strokeWidth: onRoute ? 3 : 1,
|
|
76
112
|
opacity: route && !onRoute ? 0.25 : removed ? 0.4 : 1,
|
|
77
|
-
strokeDasharray: removed
|
|
113
|
+
strokeDasharray: removed
|
|
114
|
+
? '2 4'
|
|
115
|
+
: unreliable
|
|
116
|
+
? '1 3'
|
|
117
|
+
: edge.kind === 'declared'
|
|
118
|
+
? '6 4'
|
|
119
|
+
: undefined,
|
|
78
120
|
},
|
|
79
121
|
};
|
|
80
122
|
});
|
|
81
123
|
return {
|
|
82
124
|
flowNodes: positioned,
|
|
83
125
|
flowEdges: flow,
|
|
84
|
-
droppedCount:
|
|
126
|
+
droppedCount: views.length - kept.length,
|
|
85
127
|
unreachableCount: unreachable.length,
|
|
86
128
|
};
|
|
87
|
-
}, [
|
|
129
|
+
}, [
|
|
130
|
+
views,
|
|
131
|
+
transitions,
|
|
132
|
+
route,
|
|
133
|
+
selectedTargetViewId,
|
|
134
|
+
showRemoved,
|
|
135
|
+
originViewId,
|
|
136
|
+
pathCounts,
|
|
137
|
+
inbound,
|
|
138
|
+
]);
|
|
88
139
|
const [rfNodes, setRfNodes, onNodesChange] = useNodesState(flowNodes);
|
|
89
140
|
const [rfEdges, setRfEdges, onEdgesChange] = useEdgesState(flowEdges);
|
|
90
141
|
// useNodesState/useEdgesState only SEED state from their argument. Without
|
|
@@ -95,16 +146,16 @@ export function PagesGraphView({ nodes, edges, route, selectedTargetPageId, onSe
|
|
|
95
146
|
setRfEdges(flowEdges);
|
|
96
147
|
}, [flowNodes, flowEdges, setRfNodes, setRfEdges]);
|
|
97
148
|
const originLabel = useMemo(() => {
|
|
98
|
-
const match =
|
|
99
|
-
return match?.
|
|
100
|
-
}, [
|
|
101
|
-
if (
|
|
149
|
+
const match = views.find(view => view.id === originViewId);
|
|
150
|
+
return match?.urlPath ?? '(unresolved)';
|
|
151
|
+
}, [views, originViewId]);
|
|
152
|
+
if (views.length === 0) {
|
|
102
153
|
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
154
|
}
|
|
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:
|
|
105
|
-
.sort((a, b) => a.
|
|
106
|
-
.map(
|
|
107
|
-
? 'No known route to this
|
|
108
|
-
: `Route: ${route.length} hop${route.length === 1 ? '' : 's'}` })), unreachableCount > 0 && (_jsxs("span", { children: [unreachableCount, "
|
|
155
|
+
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: selectedTargetViewId ?? '', onChange: event => onSelectTarget(event.target.value ? Number(event.target.value) : null), children: [_jsx("option", { value: "", children: "(none)" }), [...views]
|
|
156
|
+
.sort((a, b) => a.urlPath.localeCompare(b.urlPath))
|
|
157
|
+
.map(view => (_jsx("option", { value: view.id, children: labelFor(view, (pathCounts.get(view.urlPath) ?? 0) > 1) }, view.id)))] })] }), _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] }), selectedTargetViewId != null && (_jsx("span", { children: route === null
|
|
158
|
+
? 'No known route to this view.'
|
|
159
|
+
: `Route: ${route.length} hop${route.length === 1 ? '' : 's'}` })), unreachableCount > 0 && (_jsxs("span", { children: [unreachableCount, " view(s) not reachable from the origin."] })), droppedCount > 0 && (_jsxs("span", { children: [droppedCount, " view(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
160
|
}
|
|
110
161
|
//# sourceMappingURL=PagesGraphView.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PagesGraphView.js","sourceRoot":"","sources":["../../../src/components/pages/PagesGraphView.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AAC3C,OAAO,EACL,SAAS,EACT,UAAU,EACV,QAAQ,EACR,OAAO,EACP,aAAa,EACb,aAAa,EAGb,UAAU,GACX,MAAM,eAAe,CAAC;AACvB,OAAO,8BAA8B,CAAC;AAEtC,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAEnF,MAAM,YAAY,GAAG,GAAG,CAAC;AACzB,MAAM,UAAU,GAAG,EAAE,CAAC;AActB,MAAM,
|
|
1
|
+
{"version":3,"file":"PagesGraphView.js","sourceRoot":"","sources":["../../../src/components/pages/PagesGraphView.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1,23 +1,26 @@
|
|
|
1
1
|
/** Cap on rendered nodes. Excess is dropped by distance and reported, never silently. */
|
|
2
2
|
export declare const MAX_GRAPH_NODES = 300;
|
|
3
|
-
/** Column marker for
|
|
3
|
+
/** Column marker for views with no path from the origin. */
|
|
4
4
|
export declare const UNREACHABLE_COLUMN = -1;
|
|
5
5
|
export interface LayoutInput {
|
|
6
|
-
|
|
6
|
+
id: number;
|
|
7
7
|
}
|
|
8
8
|
export interface LayoutEdge {
|
|
9
|
-
|
|
10
|
-
|
|
9
|
+
fromViewId: number;
|
|
10
|
+
toViewId: number | null;
|
|
11
11
|
}
|
|
12
12
|
/**
|
|
13
|
-
* Assign each
|
|
13
|
+
* Assign each view a column by BFS depth from the origin over LIVE transitions.
|
|
14
14
|
*
|
|
15
|
-
* Reachability is a DAG, not a tree, so shortest depth wins when a
|
|
16
|
-
* reachable several ways.
|
|
15
|
+
* Reachability is a DAG, not a tree, so shortest depth wins when a view is
|
|
16
|
+
* reachable several ways. Views with no path land in UNREACHABLE_COLUMN rather
|
|
17
17
|
* than being dropped — the scan bootstraps by navigating directly to many
|
|
18
|
-
* paths, so unreached
|
|
18
|
+
* paths, so unreached views are expected and worth showing.
|
|
19
|
+
*
|
|
20
|
+
* Transitions with a null `toViewId` are skipped: they point at a path whose
|
|
21
|
+
* view has not been observed yet, so there is nothing to lay out.
|
|
19
22
|
*/
|
|
20
|
-
export declare function assignColumns(nodes: LayoutInput[], liveEdges: LayoutEdge[],
|
|
23
|
+
export declare function assignColumns(nodes: LayoutInput[], liveEdges: LayoutEdge[], originViewId: number): {
|
|
21
24
|
columns: Map<number, number>;
|
|
22
25
|
unreachable: number[];
|
|
23
26
|
};
|
|
@@ -1 +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,
|
|
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,EAAE,EAAE,MAAM,CAAC;CACZ;AAED,MAAM,WAAW,UAAU;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB;AAED;;;;;;;;;;GAUG;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,CAsCzD"}
|
|
@@ -1,35 +1,40 @@
|
|
|
1
1
|
/** Cap on rendered nodes. Excess is dropped by distance and reported, never silently. */
|
|
2
2
|
export const MAX_GRAPH_NODES = 300;
|
|
3
|
-
/** Column marker for
|
|
3
|
+
/** Column marker for views with no path from the origin. */
|
|
4
4
|
export const UNREACHABLE_COLUMN = -1;
|
|
5
5
|
/**
|
|
6
|
-
* Assign each
|
|
6
|
+
* Assign each view a column by BFS depth from the origin over LIVE transitions.
|
|
7
7
|
*
|
|
8
|
-
* Reachability is a DAG, not a tree, so shortest depth wins when a
|
|
9
|
-
* reachable several ways.
|
|
8
|
+
* Reachability is a DAG, not a tree, so shortest depth wins when a view is
|
|
9
|
+
* reachable several ways. Views with no path land in UNREACHABLE_COLUMN rather
|
|
10
10
|
* than being dropped — the scan bootstraps by navigating directly to many
|
|
11
|
-
* paths, so unreached
|
|
11
|
+
* paths, so unreached views are expected and worth showing.
|
|
12
|
+
*
|
|
13
|
+
* Transitions with a null `toViewId` are skipped: they point at a path whose
|
|
14
|
+
* view has not been observed yet, so there is nothing to lay out.
|
|
12
15
|
*/
|
|
13
|
-
export function assignColumns(nodes, liveEdges,
|
|
14
|
-
const known = new Set(nodes.map(node => node.
|
|
16
|
+
export function assignColumns(nodes, liveEdges, originViewId) {
|
|
17
|
+
const known = new Set(nodes.map(node => node.id));
|
|
15
18
|
const outgoing = new Map();
|
|
16
19
|
for (const edge of liveEdges) {
|
|
17
|
-
if (
|
|
20
|
+
if (edge.toViewId == null)
|
|
21
|
+
continue;
|
|
22
|
+
if (!known.has(edge.fromViewId) || !known.has(edge.toViewId))
|
|
18
23
|
continue;
|
|
19
|
-
const list = outgoing.get(edge.
|
|
20
|
-
list.push(edge.
|
|
21
|
-
outgoing.set(edge.
|
|
24
|
+
const list = outgoing.get(edge.fromViewId) ?? [];
|
|
25
|
+
list.push(edge.toViewId);
|
|
26
|
+
outgoing.set(edge.fromViewId, list);
|
|
22
27
|
}
|
|
23
28
|
const columns = new Map();
|
|
24
|
-
if (known.has(
|
|
25
|
-
columns.set(
|
|
26
|
-
let frontier = [
|
|
29
|
+
if (known.has(originViewId)) {
|
|
30
|
+
columns.set(originViewId, 0);
|
|
31
|
+
let frontier = [originViewId];
|
|
27
32
|
let depth = 0;
|
|
28
33
|
while (frontier.length > 0) {
|
|
29
34
|
depth += 1;
|
|
30
35
|
const next = [];
|
|
31
|
-
for (const
|
|
32
|
-
for (const target of outgoing.get(
|
|
36
|
+
for (const viewId of frontier) {
|
|
37
|
+
for (const target of outgoing.get(viewId) ?? []) {
|
|
33
38
|
if (columns.has(target))
|
|
34
39
|
continue;
|
|
35
40
|
columns.set(target, depth);
|
|
@@ -41,9 +46,9 @@ export function assignColumns(nodes, liveEdges, originPageId) {
|
|
|
41
46
|
}
|
|
42
47
|
const unreachable = [];
|
|
43
48
|
for (const node of nodes) {
|
|
44
|
-
if (!columns.has(node.
|
|
45
|
-
columns.set(node.
|
|
46
|
-
unreachable.push(node.
|
|
49
|
+
if (!columns.has(node.id)) {
|
|
50
|
+
columns.set(node.id, UNREACHABLE_COLUMN);
|
|
51
|
+
unreachable.push(node.id);
|
|
47
52
|
}
|
|
48
53
|
}
|
|
49
54
|
return { columns, unreachable };
|
|
@@ -1 +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
|
|
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;;;;;;;;;;GAUG;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,EAAE,CAAC,CAAC,CAAC;IAClD,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAoB,CAAC;IAC7C,KAAK,MAAM,IAAI,IAAI,SAAS,EAAE,CAAC;QAC7B,IAAI,IAAI,CAAC,QAAQ,IAAI,IAAI;YAAE,SAAS;QACpC,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,EAAE,CAAC,EAAE,CAAC;YAC1B,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,kBAAkB,CAAC,CAAC;YACzC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC5B,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":"AAiBA,wBAAgB,SAAS,
|
|
1
|
+
{"version":3,"file":"PagesPage.d.ts","sourceRoot":"","sources":["../../src/pages/PagesPage.tsx"],"names":[],"mappings":"AAiBA,wBAAgB,SAAS,gCAmOxB"}
|
package/dist/pages/PagesPage.js
CHANGED
|
@@ -11,7 +11,7 @@ export function PagesPage() {
|
|
|
11
11
|
const { entitySlug, envId, runId } = useRouteParams();
|
|
12
12
|
const { networkClient, token, baseUrl } = useTestomniacApi();
|
|
13
13
|
const [view, setView] = useState('list');
|
|
14
|
-
const [
|
|
14
|
+
const [targetViewId, setTargetViewId] = useState(null);
|
|
15
15
|
const [showRemoved, setShowRemoved] = useState(false);
|
|
16
16
|
const runScoped = Boolean(runId);
|
|
17
17
|
const environmentPagesQuery = useEnvironmentPages(networkClient, baseUrl, token ?? '', Number(envId), { enabled: !!envId && !!token && !runScoped });
|
|
@@ -42,15 +42,23 @@ export function PagesPage() {
|
|
|
42
42
|
const primaryRunnerId = pages.length > 0 ? pages[0].runnerId : 0;
|
|
43
43
|
const pageStatesQuery = useRunnerPageStates(networkClient, baseUrl, token ?? '', primaryRunnerId, { enabled: !!primaryRunnerId && !!token });
|
|
44
44
|
const pageStates = useMemo(() => pageStatesQuery.data?.data ?? [], [pageStatesQuery.data]);
|
|
45
|
-
// Graph mode is
|
|
46
|
-
|
|
47
|
-
|
|
45
|
+
// Graph mode is environment-scoped: base_url lives on the environment and
|
|
46
|
+
// determines which deployed site a graph describes, so staging and
|
|
47
|
+
// production never share one.
|
|
48
|
+
const graphQuery = useNavigationGraph(networkClient, baseUrl, token ?? '', Number(envId), {
|
|
49
|
+
enabled: !!envId && !!token && view === 'graph',
|
|
48
50
|
});
|
|
49
|
-
const
|
|
50
|
-
|
|
51
|
+
const graph = graphQuery.data ?? null;
|
|
52
|
+
// Route targets are addressed by path: the graph is keyed on views, and
|
|
53
|
+
// several views can share a path.
|
|
54
|
+
const targetView = useMemo(() => graph?.views.find(v => v.id === targetViewId) ?? null, [graph, targetViewId]);
|
|
55
|
+
const routeQuery = useRoute(networkClient, baseUrl, token ?? '', Number(envId), {
|
|
56
|
+
urlPath: targetView?.urlPath ?? '',
|
|
57
|
+
signature: targetView?.signature,
|
|
58
|
+
}, undefined, {
|
|
59
|
+
enabled: !!envId && !!token && !!targetView && view === 'graph',
|
|
51
60
|
});
|
|
52
|
-
const
|
|
53
|
-
const routeHops = targetPageId ? (routeQuery.data?.data?.route ?? null) : null;
|
|
61
|
+
const routeHops = targetView ? (routeQuery.data?.route ?? null) : null;
|
|
54
62
|
const screenshotsByPageId = useMemo(() => {
|
|
55
63
|
const map = new Map();
|
|
56
64
|
for (const ps of pageStates) {
|
|
@@ -72,6 +80,6 @@ export function PagesPage() {
|
|
|
72
80
|
? 'bg-foreground text-background'
|
|
73
81
|
: '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
82
|
? '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, {
|
|
83
|
+
: '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, { views: graph?.views ?? [], transitions: graph?.transitions ?? [], route: routeHops, selectedTargetViewId: targetViewId, onSelectTarget: setTargetViewId, showRemoved: showRemoved, onToggleRemoved: setShowRemoved, originViewId: routeHops?.[0]?.fromViewId ?? 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 }) })) }));
|
|
76
84
|
}
|
|
77
85
|
//# 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.
|
|
3
|
+
"version": "0.0.37",
|
|
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",
|
|
@@ -23,15 +23,15 @@
|
|
|
23
23
|
"format:check": "prettier --check \"src/**/*.{ts,tsx}\"",
|
|
24
24
|
"test": "vitest run --passWithNoTests",
|
|
25
25
|
"test:watch": "vitest --passWithNoTests",
|
|
26
|
-
"verify": "bun run typecheck && bun run lint && bun run format:check"
|
|
26
|
+
"verify": "bun run typecheck && bun run lint && bun run format:check && bun run test && bun run build"
|
|
27
27
|
},
|
|
28
28
|
"peerDependencies": {
|
|
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.116",
|
|
33
|
+
"@sudobility/testomniac_lib": "^0.0.125",
|
|
34
|
+
"@sudobility/testomniac_types": "^0.0.93",
|
|
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.116",
|
|
48
|
+
"@sudobility/testomniac_lib": "^0.0.125",
|
|
49
|
+
"@sudobility/testomniac_types": "^0.0.93",
|
|
50
50
|
"@sudobility/types": "^1.9.62",
|
|
51
51
|
"@tanstack/react-query": "^5.90.5",
|
|
52
52
|
"@tanstack/react-table": "^8.21.3",
|