Commit f774dff
committed
admin: bar charts + daily activity charts in the stat cards
Previously the Statistics + MCP Statistics sections rendered six "Top X"
breakdowns as raw text rows: ``camera_id · 42``, ``user@email.com · 137``,
``2026-05-01 · 67``. That looks like a CRUD admin tool, not a product.
Replaced all six with hand-rolled SVG/CSS visualisations that actually
let the eye compare values.
What changed:
Stream Statistics Old New
───────────────── ───────────────────── ─────────────────────
Top Cameras text rows horizontal bars (green)
Top Viewers text rows horizontal bars (green)
Daily Activity text rows vertical-bar chart (green)
MCP Statistics Old New
───────────────── ───────────────────── ─────────────────────
Top Tools text rows (mono) horizontal bars (purple, mono labels)
By API Key text rows horizontal bars (purple)
MCP Daily Activity text rows vertical-bar chart (purple)
Implementation:
- New ``frontend/src/components/AdminCharts.jsx`` exporting two
components. ``BarList`` takes a flat ``items`` array
(``{key, label, count}``), normalises against the max in the set,
renders one stacked label/count head + thin track + filled segment
per row. ``DailyActivityChart`` takes the ``by_day`` array directly
(``{date, count}``), sorts by date, and emits an SVG with one
vertical bar per day plus an MM-DD x-axis label and a baseline.
- Both components use ``currentColor`` for fills so the SVG inherits
the accent from CSS via ``data-accent`` (green for stream-side
cards, purple for MCP-side). No hard-coded palette references in
the component.
- Bar widths animate via ``transition: width 0.4s cubic-bezier`` so
the chart settles into place rather than jumping when the days
filter changes. Daily-chart bars get a 75% opacity hover state +
``<title>`` tooltip showing the date and count.
- Empty states render an italicised "No data" rather than a list with
one "No data" row — consistent across both components.
- Mono labels (the ``monoLabel`` flag on BarList) renders MCP tool
names in JetBrains Mono so ``view_camera`` and friends still read
as code identifiers, matching the prior text-list ``<code>``
treatment.
What didn't change:
- Total Accesses / Total MCP Calls big-number stat cards left
alone — those are single scalars, not breakdowns, so a chart
doesn't help. (They are slightly redundant with the KPI strip
above, but the days-window selector below the strip can drift
from the strip's window, so keeping them is honest.)
- No new dependencies — no chart.js, no recharts, no d3. ~120
lines of inline SVG + ~90 lines of CSS for the entire visual
upgrade.
Verification: ``npm run build`` clean (521ms), ``npm run test`` 55/55
green. Backend untouched.1 parent 06f8e20 commit f774dff
3 files changed
Lines changed: 256 additions & 66 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
| 29 | + | |
| 30 | + | |
| 31 | + | |
| 32 | + | |
| 33 | + | |
| 34 | + | |
| 35 | + | |
| 36 | + | |
| 37 | + | |
| 38 | + | |
| 39 | + | |
| 40 | + | |
| 41 | + | |
| 42 | + | |
| 43 | + | |
| 44 | + | |
| 45 | + | |
| 46 | + | |
| 47 | + | |
| 48 | + | |
| 49 | + | |
| 50 | + | |
| 51 | + | |
| 52 | + | |
| 53 | + | |
| 54 | + | |
| 55 | + | |
| 56 | + | |
| 57 | + | |
| 58 | + | |
| 59 | + | |
| 60 | + | |
| 61 | + | |
| 62 | + | |
| 63 | + | |
| 64 | + | |
| 65 | + | |
| 66 | + | |
| 67 | + | |
| 68 | + | |
| 69 | + | |
| 70 | + | |
| 71 | + | |
| 72 | + | |
| 73 | + | |
| 74 | + | |
| 75 | + | |
| 76 | + | |
| 77 | + | |
| 78 | + | |
| 79 | + | |
| 80 | + | |
| 81 | + | |
| 82 | + | |
| 83 | + | |
| 84 | + | |
| 85 | + | |
| 86 | + | |
| 87 | + | |
| 88 | + | |
| 89 | + | |
| 90 | + | |
| 91 | + | |
| 92 | + | |
| 93 | + | |
| 94 | + | |
| 95 | + | |
| 96 | + | |
| 97 | + | |
| 98 | + | |
| 99 | + | |
| 100 | + | |
| 101 | + | |
| 102 | + | |
| 103 | + | |
| 104 | + | |
| 105 | + | |
| 106 | + | |
| 107 | + | |
| 108 | + | |
| 109 | + | |
| 110 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
6171 | 6171 | | |
6172 | 6172 | | |
6173 | 6173 | | |
| 6174 | + | |
| 6175 | + | |
| 6176 | + | |
| 6177 | + | |
| 6178 | + | |
| 6179 | + | |
| 6180 | + | |
| 6181 | + | |
| 6182 | + | |
| 6183 | + | |
| 6184 | + | |
| 6185 | + | |
| 6186 | + | |
| 6187 | + | |
| 6188 | + | |
| 6189 | + | |
| 6190 | + | |
| 6191 | + | |
| 6192 | + | |
| 6193 | + | |
| 6194 | + | |
| 6195 | + | |
| 6196 | + | |
| 6197 | + | |
| 6198 | + | |
| 6199 | + | |
| 6200 | + | |
| 6201 | + | |
| 6202 | + | |
| 6203 | + | |
| 6204 | + | |
| 6205 | + | |
| 6206 | + | |
| 6207 | + | |
| 6208 | + | |
| 6209 | + | |
| 6210 | + | |
| 6211 | + | |
| 6212 | + | |
| 6213 | + | |
| 6214 | + | |
| 6215 | + | |
| 6216 | + | |
| 6217 | + | |
| 6218 | + | |
| 6219 | + | |
| 6220 | + | |
| 6221 | + | |
| 6222 | + | |
| 6223 | + | |
| 6224 | + | |
| 6225 | + | |
| 6226 | + | |
| 6227 | + | |
| 6228 | + | |
| 6229 | + | |
| 6230 | + | |
| 6231 | + | |
| 6232 | + | |
| 6233 | + | |
| 6234 | + | |
| 6235 | + | |
| 6236 | + | |
| 6237 | + | |
| 6238 | + | |
| 6239 | + | |
| 6240 | + | |
| 6241 | + | |
| 6242 | + | |
| 6243 | + | |
| 6244 | + | |
| 6245 | + | |
| 6246 | + | |
| 6247 | + | |
| 6248 | + | |
| 6249 | + | |
| 6250 | + | |
| 6251 | + | |
| 6252 | + | |
| 6253 | + | |
| 6254 | + | |
| 6255 | + | |
| 6256 | + | |
| 6257 | + | |
| 6258 | + | |
| 6259 | + | |
| 6260 | + | |
| 6261 | + | |
| 6262 | + | |
| 6263 | + | |
| 6264 | + | |
| 6265 | + | |
| 6266 | + | |
| 6267 | + | |
| 6268 | + | |
| 6269 | + | |
| 6270 | + | |
| 6271 | + | |
| 6272 | + | |
| 6273 | + | |
| 6274 | + | |
| 6275 | + | |
| 6276 | + | |
| 6277 | + | |
| 6278 | + | |
| 6279 | + | |
| 6280 | + | |
| 6281 | + | |
| 6282 | + | |
| 6283 | + | |
6174 | 6284 | | |
6175 | 6285 | | |
6176 | 6286 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
8 | 8 | | |
9 | 9 | | |
10 | 10 | | |
| 11 | + | |
11 | 12 | | |
12 | 13 | | |
13 | 14 | | |
| |||
449 | 450 | | |
450 | 451 | | |
451 | 452 | | |
452 | | - | |
453 | | - | |
454 | | - | |
455 | | - | |
456 | | - | |
457 | | - | |
458 | | - | |
459 | | - | |
460 | | - | |
461 | | - | |
462 | | - | |
| 453 | + | |
| 454 | + | |
| 455 | + | |
| 456 | + | |
| 457 | + | |
| 458 | + | |
| 459 | + | |
| 460 | + | |
463 | 461 | | |
464 | 462 | | |
465 | 463 | | |
466 | 464 | | |
467 | | - | |
468 | | - | |
469 | | - | |
470 | | - | |
471 | | - | |
472 | | - | |
473 | | - | |
474 | | - | |
475 | | - | |
476 | | - | |
477 | | - | |
| 465 | + | |
| 466 | + | |
| 467 | + | |
| 468 | + | |
| 469 | + | |
| 470 | + | |
| 471 | + | |
| 472 | + | |
478 | 473 | | |
479 | 474 | | |
480 | 475 | | |
481 | 476 | | |
482 | | - | |
483 | | - | |
484 | | - | |
485 | | - | |
486 | | - | |
487 | | - | |
488 | | - | |
489 | | - | |
490 | | - | |
491 | | - | |
492 | | - | |
| 477 | + | |
493 | 478 | | |
494 | 479 | | |
495 | 480 | | |
| |||
722 | 707 | | |
723 | 708 | | |
724 | 709 | | |
725 | | - | |
726 | | - | |
727 | | - | |
728 | | - | |
729 | | - | |
730 | | - | |
731 | | - | |
732 | | - | |
733 | | - | |
734 | | - | |
735 | | - | |
| 710 | + | |
| 711 | + | |
| 712 | + | |
| 713 | + | |
| 714 | + | |
| 715 | + | |
| 716 | + | |
| 717 | + | |
| 718 | + | |
736 | 719 | | |
737 | 720 | | |
738 | 721 | | |
739 | 722 | | |
740 | | - | |
741 | | - | |
742 | | - | |
743 | | - | |
744 | | - | |
745 | | - | |
746 | | - | |
747 | | - | |
748 | | - | |
749 | | - | |
750 | | - | |
| 723 | + | |
| 724 | + | |
| 725 | + | |
| 726 | + | |
| 727 | + | |
| 728 | + | |
| 729 | + | |
| 730 | + | |
751 | 731 | | |
752 | 732 | | |
753 | 733 | | |
754 | 734 | | |
755 | | - | |
756 | | - | |
757 | | - | |
758 | | - | |
759 | | - | |
760 | | - | |
761 | | - | |
762 | | - | |
763 | | - | |
764 | | - | |
765 | | - | |
| 735 | + | |
766 | 736 | | |
767 | 737 | | |
768 | 738 | | |
| |||
0 commit comments