feat(ui): Data Flow tab — live lineage graph + PII overlay + movement triggers

New DataFlowView (topology-style): nodes positioned from /api/dataflow with
measured-anchor SVG edges and animated particles (active CDC + running
movements). PII overlay shows shield badges + per-column detail inspector.
Bottom strip triggers ETL movements and toggles the ETL agent. Wired into
SideNav (Data Flow) and App routing; added types + api helpers.
This commit is contained in:
mo
2026-06-27 02:09:38 +02:00
parent ee9357aa31
commit 6f20e24b8b
5 changed files with 539 additions and 1 deletions
+71
View File
@@ -70,6 +70,77 @@ export type CdcStats = {
consumed: number
}
export type PiiColumn = { name: string; category: string; masked: boolean }
export type DataflowNode = {
id: string
label: string
sub: string
kind: string
x: number
y: number
level: string
metric: string | null
pii?: {
has_pii: boolean
pii_count: number
all_masked: boolean
masked_layer: boolean
categories: string[]
columns: PiiColumn[]
}
}
export type DataflowEdge = {
from: string
to: string
kind: string
movement_id?: string
state?: string
last_rows?: number | null
last_duration_s?: number | null
active?: boolean
}
export type DataflowGraph = {
ok: boolean
nodes: DataflowNode[]
edges: DataflowEdge[]
pii_summary: { datasets?: number; pii_columns?: number; masked_columns?: number; unmasked_columns?: number }
cdc: { connected?: boolean; consumed?: number; window_total?: number }
ts: number
}
export type Movement = {
id: string
label: string
kind: string
dag_id: string
agent: string
from: string
to: string
last_run?: {
state?: string
rows?: number | null
duration_s?: number | null
ended_at?: string
started_at?: string
} | null
}
export type PiiDataset = {
key: string
node_id: string
label: string
table: string
exists: boolean
masked_layer: boolean
pii_columns: PiiColumn[]
pii_count: number
has_pii: boolean
all_masked: boolean
}
export type DomainStatus = {
level: 'ok' | 'warn' | 'down' | 'unknown'
label: string