Übersicht: Verbindungs-Label klarer, Verbindungszeilen anklickbar

Nutzerfrage: was bedeutet "Optionen" bei einer IP-Adresse verknüpften
DHCP-Netzwerk-Zeile? Umbenannt zu "DHCP-Optionen". Zusätzlich: die
"Verbindungen"-Zeilen im Detailpanel eines Knotens sind jetzt anklickbar
(springt zum verbundenen Element, wie bei Linien-Klicks) und zeigen
beim Hovern eine Klartext-Erklärung als Tooltip (OverviewStyle.
explanation(for:), bereits für EdgeDetailView gebaut).

59 Unit-Tests grün. Manual.md/HANDOFF.md aktualisiert.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01YDmUd93KxsYGr2kLTotWnG
This commit is contained in:
Kay
2026-09-15 14:20:09 +02:00
co-authored by Claude Sonnet 5
parent a7272f059a
commit bd610b0a8c
4 changed files with 33 additions and 10 deletions
@@ -204,7 +204,10 @@ struct OverviewView: View {
viewModel.selectedNodeID = nodeID
}
} else if let id = viewModel.selectedNodeID, let node = viewModel.graph.nodes.first(where: { $0.id == id }) {
NodeDetailView(node: node, graph: viewModel.graph, onEdit: editNode)
NodeDetailView(node: node, graph: viewModel.graph, onEdit: editNode) { nodeID in
selectedEdge = nil
viewModel.selectedNodeID = nodeID
}
} else {
LegendView()
}
@@ -536,6 +539,7 @@ private struct NodeDetailView: View {
let node: OverviewNode
let graph: OverviewGraph
let onEdit: (OverviewNode) -> Void
let onSelectNode: (String) -> Void
var body: some View {
ScrollView {
@@ -578,12 +582,18 @@ private struct NodeDetailView: View {
ForEach(connected) { edge in
let otherID = edge.from == node.id ? edge.to : edge.from
let otherTitle = graph.nodes.first(where: { $0.id == otherID })?.title ?? otherID
Label(
edge.label.map { "\(otherTitle) (\($0))" } ?? otherTitle,
systemImage: edge.from == node.id ? "arrow.right" : "arrow.left"
)
.foregroundStyle(OverviewStyle.color(for: edge.kind))
.font(.caption)
Button {
onSelectNode(otherID)
} label: {
Label(
edge.label.map { "\(otherTitle) (\($0))" } ?? otherTitle,
systemImage: edge.from == node.id ? "arrow.right" : "arrow.left"
)
.foregroundStyle(OverviewStyle.color(for: edge.kind))
.font(.caption)
}
.buttonStyle(.plain)
.help(OverviewStyle.explanation(for: edge.kind))
}
}
}
@@ -189,7 +189,7 @@ final class OverviewViewModel: ObservableObject {
))
let networkPart = address.split(separator: "/").first.map(String.init) ?? address
if let addressID = networkToAddressID[networkPart] {
edges.append(OverviewEdge(from: addressID, to: id, label: "Optionen", kind: .dhcp))
edges.append(OverviewEdge(from: addressID, to: id, label: "DHCP-Optionen", kind: .dhcp))
}
}