From 7f3371591eba8a99e970fe563cac1172face4733 Mon Sep 17 00:00:00 2001 From: Denozordec Date: Sat, 18 Jul 2026 17:46:49 +0700 Subject: [PATCH] =?UTF-8?q?feat(topology):=20Badge-=D0=BF=D0=BE=D0=B4?= =?UTF-8?q?=D0=BF=D0=B8=D1=81=D0=B8=20=D1=81=D0=B2=D1=8F=D0=B7=D0=B5=D0=B9?= =?UTF-8?q?=20=D0=B8=20parent-child=20=D0=B3=D1=80=D1=83=D0=BF=D0=BF=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Связи показывают тип, подпись, протокол и IP туннеля вместе; группы на заднем слое, узлы внутри прилипают к группе. Co-authored-by: Cursor --- .../components/topology/edge-edit-sheet.tsx | 38 ++- .../web/src/components/topology/edge-types.ts | 6 + .../web/src/components/topology/edge-utils.ts | 24 +- .../topology/edges/topology-edge.tsx | 94 ++++++++ .../src/components/topology/group-utils.ts | 228 ++++++++++++++++++ .../components/topology/topology-editor.tsx | 133 ++++++---- apps/web/src/components/topology/types.ts | 33 +++ 7 files changed, 496 insertions(+), 60 deletions(-) create mode 100644 apps/web/src/components/topology/edge-types.ts create mode 100644 apps/web/src/components/topology/edges/topology-edge.tsx create mode 100644 apps/web/src/components/topology/group-utils.ts diff --git a/apps/web/src/components/topology/edge-edit-sheet.tsx b/apps/web/src/components/topology/edge-edit-sheet.tsx index 9c8f14a..b5a77c0 100644 --- a/apps/web/src/components/topology/edge-edit-sheet.tsx +++ b/apps/web/src/components/topology/edge-edit-sheet.tsx @@ -35,6 +35,8 @@ export function EdgeEditSheet({ const [lineStyle, setLineStyle] = useState<'solid' | 'dashed'>('solid') const [direction, setDirection] = useState('forward') const [protocol, setProtocol] = useState('') + const [localIp, setLocalIp] = useState('') + const [remoteIp, setRemoteIp] = useState('') const [notes, setNotes] = useState('') useEffect(() => { @@ -44,9 +46,13 @@ export function EdgeEditSheet({ setLineStyle(d.lineStyle ?? 'solid') setDirection(d.direction ?? 'forward') setProtocol(d.protocol ?? '') + setLocalIp(d.localIp ?? '') + setRemoteIp(d.remoteIp ?? '') setNotes(d.notes ?? '') }, [data, edgeId, open]) + const showTunnelIps = relation === 'vpn' || relation === 'tunnel' + return ( setLabel(e.target.value)} disabled={locked} maxLength={60} - placeholder="Например: eth0 / 10 Gbit" + placeholder="Например: eth0 / uplink — рядом с протоколом" /> @@ -130,6 +138,32 @@ export function EdgeEditSheet({ placeholder="TCP/443, WireGuard, BGP…" /> + {showTunnelIps ? ( + <> + + setLocalIp(e.target.value)} + disabled={locked} + maxLength={45} + placeholder="10.8.0.1" + className="font-mono" + /> + + + setRemoteIp(e.target.value)} + disabled={locked} + maxLength={45} + placeholder="10.8.0.2" + className="font-mono" + /> + + + ) : null}