Commit Graph
42 Commits
Author SHA1 Message Date
n30nex 139d3ce508 feat: stage current preview on dev for dev1 evaluation
Port the qualified web preview at c41e6fa8940fba929704bc2f9a94f119fef4a4ca onto
org dev b4d498e697. Preserve upstream changes and
branch policies; keep the independent private Collector service separate.

Preview-Version: 2.2.1-n30nex.1
Preview-Revision: c41e6fa8940fba929704bc2f9a94f119fef4a4ca
2026-10-04 16:31:50 -04:00
MrAlders0n 0924260dc5 Show activity before the first rollup as a gap (#138) 2026-10-02 19:22:20 -04:00
MrAlders0n acf46342a1 Fix issues from the 2.0.0 release review (#137) 2026-10-02 19:04:46 -04:00
MrAlders0n 4b9e48a35a Hourly observer and node sparklines on scope cards (#136) 2026-10-02 15:46:03 -04:00
MrAlders0n d951a7e362 Sparklines for most path entries and scope activity (#135) 2026-10-02 14:00:39 -04:00
MrAlders0n f6caab663c Add hourly sparklines to analytics stat cards (#134) 2026-10-02 13:37:26 -04:00
MrAlders0n 39e921c277 Serve analytics from hourly rollups and handle empty regions (#132) 2026-10-02 08:03:00 -04:00
MrAlders0n f9ffb564c7 Drop analytics refresh buttons and repeated titles (#131) 2026-10-01 18:58:26 -04:00
MrAlders0n 609dbc384f Translate the remaining hardcoded UI text (#129) 2026-10-01 17:55:54 -04:00
MrAlders0n e491a822c9 Plain wording across panels and fix retention-bound views (#127) 2026-10-01 16:36:11 -04:00
MrAlders0n e2d272e08e Drop the Observer section from Analytics (#111) 2026-09-30 16:09:13 -04:00
MrAlders0n 31d01a8425 Shared observer sidebar and header actions (#108) 2026-09-30 14:36:17 -04:00
MrAlders0n b1f41dea1d Observer header details, channel row cleanup, tab order (#107) 2026-09-30 14:10:18 -04:00
MrAlders0n 63344af365 Polish observer cards and clock drift on phones (#106) 2026-09-30 13:47:10 -04:00
MrAlders0n 8d1f30d553 Bring back the Analytics observer tab and tidy analytics (#104) 2026-09-30 13:24:54 -04:00
MrAlders0n 3e43cfd009 fix: follow up on last week's merges (#55-#101) (#102)
Bugs: clear compare params on tab change, recover channel live messages after a 429,
observer copy link keeps only region params, route table no longer navigates on region
change with nothing selected, map borders memo on data identity, live overview can't
resurrect a failed query, French relative times, no language write on first visit,
0/0 node locations hidden outside the map, path/signal stats use the shared retry rule.

i18n: node/packet/mesh/observer strings that were still hardcoded after #62.

Cleanup: formatUtc, ACTION_BUTTON_CLASS, observer-stats, useWindowedStats, observer-id;
observer pages use StatCard/Card/Field/Segmented/SearchBar/SelectDropdown; one details
chrome on the stats tabs; comment and translations-guide trims; localStorage stub for
Node 26 in the test setup.
2026-09-30 10:19:32 -04:00
MrAlders0n 39b85a9032 fix: follow up on the #75-#99 stack review (#101) 2026-09-30 08:35:07 -04:00
n30nex d259be512e feat: observer monitoring, retained evidence and channel scopes (#75-#99)
Lands the stacked web PRs #75, #79, #80, #81, #83, #85, #87, #89, #92, #95 and #99 in one squash. Server counterparts #166-#176 are merged. Remaining review items follow in a fix PR.
2026-09-30 08:03:13 -04:00
n30nex 9cd2e8f6db fix(stats): hide unavailable Mesh overview data (#72) 2026-09-25 11:21:29 -04:00
n30nex dce4e49900 fix(stats): hide unavailable Talkers results (#68) 2026-09-25 11:21:07 -04:00
n30nex 9423059b6f feat(i18n): translate stats analytics, clock drift and timestamps (#70) 2026-09-25 11:20:27 -04:00
n30nex 929ba83cf1 feat(stats): add Paths and Hashes analytics (#57) 2026-09-23 20:16:23 -04:00
n30nex 2405e1ac96 feat(stats): add RF and signal analytics (#55) 2026-09-23 20:14:03 -04:00
n30nex e01c090c8e feat(stats): add hourly traffic and region-aware scope analytics (#53)
Adds the Traffic and Scopes analytics tabs. Includes the hourly traffic work from #52, which this PR contains in full.

Closes #50. Closes #51.
2026-09-20 11:41:43 -04:00
n30nex 88e2c0f319 feat(stats): compare flood packets heard by two observers (#48) 2026-09-19 22:58:36 -04:00
MrAlders0n 205dad8506 stats tests: follow the airtime field rename 2026-09-10 09:17:18 -04:00
MrAlders0n 12ddc8a921 Observer tab: airtime as percent, add heard-activity charts
Airtime telemetry is on-air seconds, so chart it as a percent of elapsed time.
Add channel busy, packets heard, SNR heard and payload type charts from the
new per-observer activity endpoint; hidden until the server has it.
2026-09-09 23:21:39 -04:00
MrAlders0n f1a69fa121 Mark each top advertiser with its IATA 2026-07-24 09:11:32 -04:00
MrAlders0n 11b06000b5 Back out frontend zero-frame filter; fixing at the source instead 2026-07-15 22:04:42 -04:00
MrAlders0n fb376901f9 Drop empty observer telemetry frames and show airtime as duration 2026-07-15 21:44:11 -04:00
MrAlders0n c3979326aa Add a name search that spotlights matches and dims the rest of the mesh 2026-07-11 22:19:05 -04:00
MrAlders0n 6b0486f3f4 Gate the neighbour graph to a region and size labels by busyness 2026-07-11 22:11:16 -04:00
MrAlders0n 45669d7c26 Focus the neighbour graph into an ego view on click 2026-07-11 19:53:41 -04:00
MrAlders0n 25bd3ce30e Add a neighbour graph under the renamed Analytics tab 2026-07-11 18:56:58 -04:00
MrAlders0n df9f4a07ad stats: node-types donut, multi-IATA filtering, preset split
- node-types: new /stats/node-types endpoint + useNodeTypes; donutOption
   replaces the "Coming soon" card with a live donut
 - stats endpoints take iatas[] instead of a single iata, so multi-IATA
   regions filter instead of falling back to all (drops useStatsIata)
 - radio presets keep the node/observer split via stacked presetBarsOption
 - drop client-side telemetry ms-normalization (backend now emits epoch ms
   on both paths); charts pick delta-vs-raw counters off the response interval
 - MeshTab: range-driven charts lead, all-time charts follow; KPI window
   from overview.windowHours instead of a hardcoded 24h
 - ci: docker-publish builds a :dev image on dev-branch pushes
2026-06-11 13:34:11 -04:00
MrAlders0n 9c93dac0f6 stats: bench the node-types donut until a real endpoint exists
The donut counted types among the top-10 nodes only, so the center
read '10 NODES' as if the region had ten nodes, and its center text
never sat quite right (ECharts titles anchor the main text, the
subtext hangs below). There's no /stats/node-types endpoint to feed it
properly yet (ticket filed), so the card shows 'Coming soon' and the
donut builder goes away rather than lingering as dead code.
2026-06-10 08:44:13 -04:00
MrAlders0n d1ff74cc1f stats: anchor the donut center text on the pie's exact center
textAlign/textVerticalAlign make left/top the anchor point, so the
value+label block centers on (35%, 50%) geometrically instead of the
hand-tuned top offset that drifted with card size.
2026-06-10 08:26:47 -04:00
MrAlders0n 39641b6339 ui: footer version from package.json plus a batch of interaction fixes
- footer read 'v0.1' forever; it's injected from package.json at build
  time now
- region picker shows 'Failed to load' instead of an eternal Loading
  when /iatas errors
- selecting text in a modal and releasing over the backdrop no longer
  closes it (close requires the press to start on the backdrop)
- Escape in a dropdown inside the mobile filter sheet closes just the
  dropdown, not the whole sheet
- Shift+Tab right after a modal opens wraps to the last control instead
  of escaping the focus trap
- formatCount rolls 999,999 over to 1M instead of printing 1000k
- TABS list moved to lib/constants so AppShell only exports components
2026-06-10 07:03:16 -04:00
MrAlders0n d5deb1e042 stats: node types back to a donut (3 categories), fix leaderboard labels
The donut suits node types after all — few slices, and the total reads
better in the ring than on three bars. The center text is a title block
with textAlign center now, which ECharts actually centers (the old
graphic text anchored its left edge at the ring's x and clipped);
TitleComponent registered in the tree-shaken setup. Payload types stays
a bar chart.

Leaderboard names (top nodes/observers, radio presets) are left-aligned
at the card edge and ellipsized instead of running off the grid's left
side.
2026-06-10 06:59:49 -04:00
MrAlders0n 115f6a83cc stats: replace the type donuts with vertical bar charts
The payload-types donut was buckling: 10+ slivers, a scrollable legend
with truncated names, and a center total that clipped at narrower
widths. Bars label every category inline, show counts on top, and the
total moved into the card header. Node types gets the same treatment
for consistency.

Also fix charts starting on the fallback palette when a saved theme
loads: themeId is already the saved id before the CSS vars land, so
useChartColors now keys on a paletteRev that bumps on every applyTheme.
2026-06-10 06:46:13 -04:00
MrAlders0n 7e07669f33 stats: fix live KPI counters never updating
useLiveOverview keyed its setQueryData on the whole RegionFilter object
while the overview query keys on the regionKey string, so every WS bump
silently missed the cache and the counters only moved on the 60s
refetch. Also drop pending counts when the region changes so old-region
increments don't bleed into the new KPIs.
2026-06-10 06:30:32 -04:00
MrAlders0n be072bb42c feat(stats): add Mesh + Observer stats tab with ECharts
Integrate the stats feature onto main: live mesh KPIs, observations
time-series, payload/node-type donuts, top-nodes/observers leaderboards,
radio presets, scope stats, and per-observer telemetry (battery, airtime,
noise, queue, receive errors) with 1h/6h/24h bucketing.

- adapt to the multi-IATA region model (useRegion -> single iata for /stats/*)
- rename stats getScopes -> getStatsScopes (avoids /scopes name-list collision)
- donut legend kept right but scrollable + truncating so it never clips
- balanced mesh grid; observer empty-state for telemetry-less observers
- normalize telemetry t to ms (raw path emits seconds, bucketed emits ms)
- add echarts 5.5.1; lazy-load StatsOverview chunk
2026-06-09 22:02:27 -04:00