From e9fb79041ee699ab124e0c7608accb90313ae16e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Br=C3=BCckner?= Date: Thu, 4 Jun 2026 13:51:30 +0200 Subject: [PATCH] feat: inline label editing for topology links --- src/components/LabTemplates.tsx | 65 ++++++++++++++++++++++++++------- 1 file changed, 51 insertions(+), 14 deletions(-) diff --git a/src/components/LabTemplates.tsx b/src/components/LabTemplates.tsx index a1c5710..2132f95 100644 --- a/src/components/LabTemplates.tsx +++ b/src/components/LabTemplates.tsx @@ -6,9 +6,9 @@ import React, { useState } from 'react'; import { LabTemplate, Device, TopologyLink } from '../types'; import TopologyPanel from './TopologyPanel'; -import { - Server, Plus, Edit3, Trash, User, MapPin, - Layers, ChevronRight, Save, X, Check +import { + Server, Plus, Edit3, Trash, User, MapPin, + Layers, ChevronRight, Save, X, Check, Pencil } from 'lucide-react'; interface LabTemplatesProps { @@ -37,6 +37,8 @@ export default function LabTemplates({ const [linkFrom, setLinkFrom] = useState(''); const [linkTo, setLinkTo] = useState(''); const [linkType, setLinkType] = useState('Trunk Uplink'); + const [editingLinkIdx, setEditingLinkIdx] = useState(null); + const [editingLinkLabel, setEditingLinkLabel] = useState(''); const [formData, setFormData] = useState<{ id?: string; @@ -467,18 +469,53 @@ export default function LabTemplates({ {tempLinks.map((link, idx) => { const fromDev = devices.find(d => d.id === link.fromDevice)?.hostname || link.fromDevice; const toDev = devices.find(d => d.id === link.toDevice)?.hostname || link.toDevice; + const isEditingThis = editingLinkIdx === idx; return ( -
- - {fromDev} ──── {link.type} ──── {toDev} - - +
+ {fromDev} ──── + {isEditingThis ? ( + setEditingLinkLabel(e.target.value)} + onBlur={() => { + if (editingLinkLabel.trim()) { + setTempLinks(tempLinks.map((l, i) => i === idx ? { ...l, type: editingLinkLabel.trim() } : l)); + } + setEditingLinkIdx(null); + }} + onKeyDown={(e) => { + if (e.key === 'Enter') { + if (editingLinkLabel.trim()) { + setTempLinks(tempLinks.map((l, i) => i === idx ? { ...l, type: editingLinkLabel.trim() } : l)); + } + setEditingLinkIdx(null); + } + if (e.key === 'Escape') setEditingLinkIdx(null); + }} + className="flex-1 min-w-0 bg-slate-800 text-slate-100 border border-indigo-500 rounded px-1.5 py-0.5 focus:outline-none" + /> + ) : ( + {link.type} + )} + ──── {toDev} +
+ + +
); })}