From f43a94a40336a2c4d5000377c2505e87838bd0b2 Mon Sep 17 00:00:00 2001 From: Pouzor Date: Sun, 8 Mar 2026 11:32:38 +0100 Subject: [PATCH] fix: persist sourceHandle/targetHandle so cluster edges survive reload --- backend/app/db/database.py | 4 ++++ backend/app/db/models.py | 2 ++ backend/app/schemas/canvas.py | 2 ++ backend/app/schemas/edges.py | 4 ++++ frontend/src/App.tsx | 6 +++++- 5 files changed, 17 insertions(+), 1 deletion(-) diff --git a/backend/app/db/database.py b/backend/app/db/database.py index bf7813b..579fa8b 100644 --- a/backend/app/db/database.py +++ b/backend/app/db/database.py @@ -32,6 +32,10 @@ async def init_db() -> None: await conn.exec_driver_sql("ALTER TABLE edges ADD COLUMN path_style TEXT") with suppress(Exception): await conn.exec_driver_sql("ALTER TABLE nodes ADD COLUMN custom_icon TEXT") + with suppress(Exception): + await conn.exec_driver_sql("ALTER TABLE edges ADD COLUMN source_handle TEXT") + with suppress(Exception): + await conn.exec_driver_sql("ALTER TABLE edges ADD COLUMN target_handle TEXT") async def get_db() -> AsyncGenerator[AsyncSession, None]: diff --git a/backend/app/db/models.py b/backend/app/db/models.py index f762666..a095ab0 100644 --- a/backend/app/db/models.py +++ b/backend/app/db/models.py @@ -58,6 +58,8 @@ class Edge(Base): speed: Mapped[str | None] = mapped_column(String) custom_color: Mapped[str | None] = mapped_column(String) path_style: Mapped[str | None] = mapped_column(String) + source_handle: Mapped[str | None] = mapped_column(String) + target_handle: Mapped[str | None] = mapped_column(String) created_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), default=_now) diff --git a/backend/app/schemas/canvas.py b/backend/app/schemas/canvas.py index 87c31d9..abf4da2 100644 --- a/backend/app/schemas/canvas.py +++ b/backend/app/schemas/canvas.py @@ -36,6 +36,8 @@ class EdgeSave(BaseModel): speed: str | None = None custom_color: str | None = None path_style: str | None = None + source_handle: str | None = None + target_handle: str | None = None class CanvasSaveRequest(BaseModel): diff --git a/backend/app/schemas/edges.py b/backend/app/schemas/edges.py index b2b1435..d68f806 100644 --- a/backend/app/schemas/edges.py +++ b/backend/app/schemas/edges.py @@ -12,6 +12,8 @@ class EdgeBase(BaseModel): speed: str | None = None custom_color: str | None = None path_style: str | None = None + source_handle: str | None = None + target_handle: str | None = None class EdgeCreate(EdgeBase): @@ -25,6 +27,8 @@ class EdgeUpdate(BaseModel): speed: str | None = None custom_color: str | None = None path_style: str | None = None + source_handle: str | None = None + target_handle: str | None = None class EdgeResponse(EdgeBase): diff --git a/frontend/src/App.tsx b/frontend/src/App.tsx index 4cdb03d..6e8fe71 100644 --- a/frontend/src/App.tsx +++ b/frontend/src/App.tsx @@ -66,6 +66,8 @@ export default function App() { speed: e.data?.speed ?? null, custom_color: e.data?.custom_color ?? null, path_style: e.data?.path_style ?? null, + source_handle: e.sourceHandle ?? null, + target_handle: e.targetHandle ?? null, })) await canvasApi.save({ nodes: nodesToSave, edges: edgesToSave, viewport: {} }) markSaved() @@ -103,11 +105,13 @@ export default function App() { ...(n.type === 'proxmox' && n.container_mode !== false ? { width: 300, height: 200 } : {}), } }) - const rfEdges = apiEdges.map((e: EdgeData & { id: string; source: string; target: string }) => ({ + const rfEdges = apiEdges.map((e: EdgeData & { id: string; source: string; target: string; source_handle?: string; target_handle?: string }) => ({ id: e.id, source: e.source, target: e.target, type: e.type, + sourceHandle: e.source_handle ?? null, + targetHandle: e.target_handle ?? null, data: e, })) loadCanvas(rfNodes, rfEdges)