From ec973b606aaa486ccb10ceb10cd8bc1d5064c520 Mon Sep 17 00:00:00 2001 From: malice Date: Fri, 17 Jul 2026 14:06:12 -0600 Subject: [PATCH] chore(dashboard): remove orphaned route, redirect 5 legacy routes, fix a misleading docstring (#143) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * chore(dashboard): remove orphaned /adapter-config route AdapterConfig is already embedded directly in Environment.tsx (excludeKeys={CURATED_KEYS} hideLlmToggle); no in-app ever targeted the standalone /adapter-config route. Drop the route, its App.tsx import, the extraTitleItems entry in Layout.tsx, and the now-unused Sliders icon import. pages/AdapterConfig.tsx itself is kept — it's imported directly by Environment.tsx. * chore(dashboard): redirect 5 orphaned legacy routes to their tabbed homes /gauge-sites, /town-anchors, /mesh, /meshtastic/sources, and /meshcore/companion each duplicate content now tabbed inside Places, MeshtasticNodes, and MeshCoreContactsCompanion, and have no in-app pointing at them (verified with rg). Convert them to redirects, matching the existing /notifications and /data-sources precedent. /town-anchors, /meshtastic/sources, and /meshcore/companion land on their host's first tab rather than deep-linking to the second tab (no ?tab= support exists) — same accepted trade-off as the existing /notifications and /data-sources redirects. Drop the now-dead extraTitleItems entries and the redundant '/meshcore/companion' pathTitles entry, plus the Radio, Droplets, Layers, and Bot icon imports that were only used by those entries (MapPin is kept — still used by the /places nav item). These 5 routes were never nav entries (extraTitleItems only), so the sidebar stays at 17 items with 5 Meshtastic / 5 MeshCore — MT/MC symmetry unchanged. * docs(dashboard-api): fix misleading refresh_toggles docstring The docstring claimed this endpoint was "kept for backwards-compat with the dashboard's manual ping path," but rg turns up no frontend call site for /notifications/refresh-toggles anywhere in dashboard-frontend. The auto-refresh middleware (_auto_refresh_toggle_filter, registered via register_config_routes_hooks) already refreshes the ToggleFilter on every successful notifications config PUT, covering the normal case. Endpoint is untouched -- comment only, kept for ops/debug use. --------- Co-authored-by: Matt Johnson --- work/dashboard-frontend/src/App.tsx | 23 ++++++++----------- .../src/components/Layout.tsx | 15 +----------- work/meshai/dashboard/api/config_routes.py | 6 +++-- 3 files changed, 15 insertions(+), 29 deletions(-) diff --git a/work/dashboard-frontend/src/App.tsx b/work/dashboard-frontend/src/App.tsx index 2fbde71..a0a8785 100644 --- a/work/dashboard-frontend/src/App.tsx +++ b/work/dashboard-frontend/src/App.tsx @@ -1,20 +1,14 @@ import { Routes, Route, Navigate } from 'react-router-dom' import Layout from './components/Layout' import Dashboard from './pages/Dashboard' -import Mesh from './pages/Mesh' import Environment from './pages/Environment' import Config from './pages/Config' import ActivityLog from './pages/ActivityLog' import Notifications from './pages/Notifications' import Reference from './pages/Reference' -import AdapterConfig from './pages/AdapterConfig' -import GaugeSites from './pages/GaugeSites' -import TownAnchors from './pages/TownAnchors' import MeshCoreRouting from './pages/MeshCoreRouting' import MeshCoreConnection from './pages/MeshCoreConnection' -import MeshCoreCompanion from './pages/MeshCoreCompanion' import MeshtasticConnection from './pages/MeshtasticConnection' -import MeshtasticSources from './pages/MeshtasticSources' import Places from './pages/Places' import MeshtasticNodes from './pages/MeshtasticNodes' import MeshCoreContactsCompanion from './pages/MeshCoreContactsCompanion' @@ -41,7 +35,6 @@ function App() { {/* Legacy /notifications -> Meshtastic Routing */} } /> } /> - } /> {/* New aggregated pages */} } /> @@ -49,14 +42,17 @@ function App() { {/* Custom sources folded into Data Feeds; keep old bookmark working */} } /> - {/* De-navved routes still work */} - } /> - } /> - } /> + {/* Legacy /gauge-sites -> Places (Gauge Sites tab) */} + } /> + {/* Legacy /town-anchors -> Places (lands on first tab, no ?tab= deep-link) */} + } /> + {/* Legacy /mesh -> Meshtastic Nodes & Health (Nodes tab) */} + } /> {/* Meshtastic routes */} } /> - } /> + {/* Legacy /meshtastic/sources -> Nodes & Health (lands on first tab, no ?tab= deep-link) */} + } /> } /> } /> } /> @@ -66,7 +62,8 @@ function App() { } /> } /> } /> - } /> + {/* Legacy /meshcore/companion -> Contacts & Companion (lands on first tab, no ?tab= deep-link) */} + } /> } /> diff --git a/work/dashboard-frontend/src/components/Layout.tsx b/work/dashboard-frontend/src/components/Layout.tsx index 626e896..8a55d4e 100644 --- a/work/dashboard-frontend/src/components/Layout.tsx +++ b/work/dashboard-frontend/src/components/Layout.tsx @@ -3,19 +3,14 @@ import { Link, useLocation, useNavigate } from 'react-router-dom' import { useDirty } from '@/context/DirtyContext' import { LayoutDashboard, - Radio, Cloud, BellRing, BookOpen, - Sliders, - Droplets, MapPin, Map, Wifi, - Layers, Network, Users, - Bot, Settings, Calendar, Activity, @@ -85,14 +80,7 @@ const navGroups: NavGroup[] = [ // Flattened view of every nav item for title lookup. // Also include de-navved routes so they still resolve a title. -const extraTitleItems: NavItem[] = [ - { path: '/adapter-config', label: 'Adapter Config', icon: Sliders }, - { path: '/gauge-sites', label: 'Gauge Sites', icon: Droplets }, - { path: '/town-anchors', label: 'Town Anchors', icon: MapPin }, - { path: '/mesh', label: 'Mesh', icon: Radio }, - { path: '/meshtastic/sources', label: 'Sources', icon: Layers }, - { path: '/meshcore/companion', label: 'Companion', icon: Bot }, -] +const extraTitleItems: NavItem[] = [] const allNavItems: NavItem[] = [ ...navGroups.flatMap((g) => g.items), @@ -108,7 +96,6 @@ const pathTitles: Record = { '/meshtastic/danger-zones': 'Danger Zones', '/meshcore/danger-zones': 'Danger Zones', '/meshcore/contacts': 'Contacts & Companion', - '/meshcore/companion': 'Contacts & Companion', } function formatUptime(seconds: number): string { diff --git a/work/meshai/dashboard/api/config_routes.py b/work/meshai/dashboard/api/config_routes.py index 5a28311..104de0f 100644 --- a/work/meshai/dashboard/api/config_routes.py +++ b/work/meshai/dashboard/api/config_routes.py @@ -411,8 +411,10 @@ def _refresh_mesh_context(app, new_ctx_cfg) -> bool: @router.post("/notifications/refresh-toggles") async def refresh_toggles(request: Request): - """Explicit refresh endpoint (kept for backwards-compat with the - dashboard's manual ping path).""" + """Explicit refresh endpoint. Not called by the dashboard frontend -- + the _auto_refresh_toggle_filter middleware below already refreshes the + ToggleFilter automatically on every successful notifications config PUT. + Kept for ops/debug use (manually forcing a refresh outside that path).""" bus = getattr(request.app.state, "bus", None) config = getattr(request.app.state, "config", None) if bus is None or config is None: