fix(web): dashboard review fixes — real health status contract, dedupe version fetch, refresh guard (#109)
Build ErsatzTV Image / Build & test (.NET) (pull_request) Successful in 4m3s
Build ErsatzTV Image / EF migration integrity (SQLite + MySql) (pull_request) Successful in 4m53s
Build ErsatzTV Image / Build & push image (amd64) (pull_request) Has been skipped

- Match the backend's exact health status contract ('pass'|'fail'|'warn'|'info')
  instead of fictional strings; 'info' now renders as a neutral/idle presentation
  and is excluded from failing/warning counts in summarizeHealth.
- Drop the redundant /api/version fetch from getDashboardData/DashboardData;
  SidebarVersion's useDashboardVersionQuery remains the single source.
- Disable "Refresh health" (via Button's loading prop) while a health request
  is in flight to prevent concurrent double-click requests.
- Add the active-flag unmount guard to useDashboardHealthQuery for consistency
  with useDashboardQuery/useChannelsQuery.
- Remove dead .ctv-activity-*/.ctv-release-* CSS left over from the removed
  activity feed/release notes UI.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
2026-07-04 21:14:44 +02:00
co-authored by Claude Fable 5
parent 6a9f1e41a4
commit e6197d63ff
4 changed files with 77 additions and 82 deletions
+2 -68
View File
@@ -442,7 +442,6 @@
}
.ctv-onair-head code,
.ctv-activity-list code,
.ctv-live-channel-row code {
color: var(--text-secondary);
font-family: var(--font-mono, ui-monospace, monospace);
@@ -516,8 +515,7 @@
gap: var(--space-7, 16px);
}
.ctv-health-panel,
.ctv-activity-feed {
.ctv-health-panel {
display: grid;
}
@@ -535,8 +533,7 @@
border-top: 0;
}
.ctv-health-icon,
.ctv-activity-icon {
.ctv-health-icon {
width: 24px;
height: 24px;
display: inline-flex;
@@ -586,69 +583,6 @@
padding: var(--space-4, 8px) var(--space-6, 12px);
}
.ctv-activity-row {
min-height: 44px;
display: grid;
grid-template-columns: auto auto minmax(0, 1fr) auto;
align-items: center;
gap: var(--space-4, 8px);
border-top: 1px solid var(--border-hairline);
padding: 0 var(--space-6, 12px);
}
.ctv-activity-row:first-child {
border-top: 0;
}
.ctv-activity-row > span:nth-child(3) {
overflow: hidden;
color: var(--text-primary);
text-overflow: ellipsis;
white-space: nowrap;
}
.ctv-activity-row code,
.ctv-release-toggle code {
color: var(--text-disabled);
font-family: var(--font-mono, ui-monospace, monospace);
font-size: var(--text-2xs, 11px);
}
.ctv-release-toggle {
width: 100%;
display: grid;
grid-template-columns: auto auto minmax(0, 1fr) auto;
align-items: center;
gap: var(--space-4, 8px);
border: 0;
background: transparent;
color: var(--text-primary);
cursor: pointer;
padding: 0;
text-align: left;
}
.ctv-release-toggle svg:first-child {
color: var(--action-primary);
}
.ctv-release-toggle code {
justify-self: end;
}
.ctv-release-body {
display: grid;
gap: var(--space-3, 6px);
margin-top: var(--space-6, 12px);
color: var(--text-secondary);
font-size: var(--text-xs, 12px);
line-height: 1.45;
}
.ctv-release-body p {
margin: 0;
}
.ctv-live-channel-body {
min-height: 96px;
}