Add UI enhancements: charts, firmware summary, uninstalled components, source chips

- Dashboard: line charts (assets over time, components total + uninstalled)
  with filled areas, shared x-axis (Mon YYYY), auto-formatted y-labels (1k/1M)
  and global start date derived from earliest FirstSeenAt across components
- /ui/ingest/history: source type chips (Ingest / CSV Import / Manual / System)
- /ui/component/models: firmware version count column, column filters,
  sortable headers, vendor distribution pie chart
- /ui/component/{vendor}/{model}: firmware version summary table with
  per-version healthy/unknown/failed counts, failed rows highlighted
- /ui/component/uninstalled: new page + nav item; components not installed
  on any server, two-level grouping by vendor then model (collapsed by default)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-03-01 21:41:48 +03:00
parent cad028efaf
commit abb3f10f3c
7 changed files with 999 additions and 48 deletions

View File

@@ -2190,10 +2190,11 @@
<div class="nav-item"><a href="/ui/search" class="{{if eq .ActiveNav "search"}}active{{end}}">Search</a></div>
<div class="nav-item"><a href="/ui/asset" class="{{if eq .ActiveNav "assets"}}active{{end}}">Asset</a></div>
<div class="nav-group">
<div class="nav-group-label {{if or (eq .ActiveNav "components") (eq .ActiveNav "components-models")}}active{{end}}">Components</div>
<div class="nav-group-label {{if or (eq .ActiveNav "components") (eq .ActiveNav "components-models") (eq .ActiveNav "components-uninstalled")}}active{{end}}">Components</div>
<div class="nav-submenu">
<a href="/ui/component" class="{{if eq .ActiveNav "components"}}active{{end}}">Component</a>
<a href="/ui/component/models" class="{{if eq .ActiveNav "components-models"}}active{{end}}">Model</a>
<a href="/ui/component/uninstalled" class="{{if eq .ActiveNav "components-uninstalled"}}active{{end}}">Uninstalled</a>
</div>
</div>
<div class="nav-item"><a href="/ui/failure" class="{{if eq .ActiveNav "failures"}}active{{end}}">Failure</a></div>