Fix route diagram open issues: bugs, visual polish, interactive features
Some checks failed
CI / build (push) Successful in 1m12s
CI / deploy (push) Has been cancelled
CI / docker (push) Has been cancelled

Batch 1 — Bug fixes:
- #51: Pass group+routeId to stats/timeseries API for route-scoped data
- #55: Propagate processor FAILED status to diagram error node highlighting

Batch 2 — Visual polish:
- #56: Brighter canvas background with amber/cyan radial gradients
- #57: Stronger glow filters (stdDeviation 3→6, opacity 0.4→0.6)
- #58: Uniform 200×40px leaf nodes with label truncation at 22 chars
- #59: Diagram legend (node types, edge types, overlay indicators)
- #64: SVG <title> tooltips on all nodes showing type, status, duration

Batch 3 — Interactive features:
- #60: Draggable minimap viewport (click-to-center, drag-to-pan)
- #62: CSS View Transitions slide animation, back arrow, Backspace key

Batch 4 — Advanced features:
- #50: Execution picker dropdown scoped to group+routeId
- #49: Iteration count badge (×N) on compound nodes
- #63: Route header stats (Executions Today, Success Rate, Avg, P99)

Closes #49 #50 #51 #55 #56 #57 #58 #59 #60 #62 #63 #64

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
hsiegeln
2026-03-14 22:14:23 +01:00
parent 7553139cf2
commit a108b57591
15 changed files with 643 additions and 58 deletions

View File

@@ -2,15 +2,22 @@ import { useQuery } from '@tanstack/react-query';
import { api } from '../client';
import type { SearchRequest } from '../types';
export function useExecutionStats(timeFrom: string | undefined, timeTo: string | undefined) {
export function useExecutionStats(
timeFrom: string | undefined,
timeTo: string | undefined,
routeId?: string,
group?: string,
) {
return useQuery({
queryKey: ['executions', 'stats', timeFrom, timeTo],
queryKey: ['executions', 'stats', timeFrom, timeTo, routeId, group],
queryFn: async () => {
const { data, error } = await api.GET('/search/stats', {
params: {
query: {
from: timeFrom!,
to: timeTo || undefined,
routeId: routeId || undefined,
group: group || undefined,
},
},
});
@@ -38,9 +45,14 @@ export function useSearchExecutions(filters: SearchRequest, live = false) {
});
}
export function useStatsTimeseries(timeFrom: string | undefined, timeTo: string | undefined) {
export function useStatsTimeseries(
timeFrom: string | undefined,
timeTo: string | undefined,
routeId?: string,
group?: string,
) {
return useQuery({
queryKey: ['executions', 'timeseries', timeFrom, timeTo],
queryKey: ['executions', 'timeseries', timeFrom, timeTo, routeId, group],
queryFn: async () => {
const { data, error } = await api.GET('/search/stats/timeseries', {
params: {
@@ -48,6 +60,8 @@ export function useStatsTimeseries(timeFrom: string | undefined, timeTo: string
from: timeFrom!,
to: timeTo || undefined,
buckets: 24,
routeId: routeId || undefined,
group: group || undefined,
},
},
});