AdminUI: DriverStatusPanel (Restart/Reconnect driver controls) is orphaned — referenced by no page #546
Reference in New Issue
Block a user
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Found during the ClusterClient→gRPC Phase 1A live gate (docs/plans/2026-08-06-clusterclient-to-grpc-live-gate.md):
DriverStatusPanel.razoris the only component carrying the Restart/Reconnect driver buttons, and it is referenced by no page or component — verified repo-wide on bothmasterand the 1A branch (0 usages; the only non-script-analysis POST the AdminUI makes is /api/deployments). So RestartDriver/ReconnectDriver have no reachable UI control; they work end-to-end when driven directly (proven over gRPC in the 1A gate). Pre-existing, transport-independent, out of the gRPC program's scope. Decide: wire the panel into /hosts (or wherever it was meant to live), or delete it.Fixed, merged to
master@9420f8efand pushed (branchfix/issue-546-panel, commitsd33e4e20+e669fb34).Decision: wire it in — the commands were proven end-to-end over the gRPC mesh in the 1A gate; deleting working operator capability lost more than it saved.
/hostsdriver rows now carry a collapsed Controls expander rendering<DriverStatusPanel DriverInstanceId="@d.DriverInstanceId" ClusterId="@g.ClusterId" Enabled="@d.Enabled" />in a full-width detail row. Expansion state is per instance-id and survives the page's 5 s rebuild; both rows are@key'd so a panel can never be diffed onto a different driver (it binds its id once inOnInitializedAsync);Enabledis projected from the realDriverInstance.Enabled(view-model records extended with a trailing optional param; an unmatched snapshot row defaults enabled deliberately — the row only exists because live health arrived).Code review surfaced one Important: the panel's subscriptions/timer survived an
Enabledtrue→false flip on an expanded row (pre-existing panel behavior, first made reachable here). Closed ine669fb34by includingEnabledin the detail row's@key— a flip disposes and remounts, and both directions were verified against the panel's actualOnInitializedAsync/DisposeAsynclifecycle.Guard against re-orphaning:
HostsPanelWiringTestssource-scan pins thatHosts.razorreferences the panel AND that all three parameters are bound to row expressions, not literals. AdminUI.Tests 1113/0; full suite on the merged SHA exit 0, 9,333/0.Live-verified on docker-dev (image from
9420f8ef):/hostsrenders 11 Controls buttons (one per driver row), collapsed by default; expanding theSITEA-modbusrow shows the panel; clicking Reconnect in the browser rendered "RECONNECT DISPATCHED" and both SITE-A nodes loggedForceReconnect requested by admin→reconnected~10 s later — the full UI → AdminOps → mesh gRPC → driver path. Collapse removes the panel (disposing its subscriptions).