From 4c97a7d3f10c380de4d76eb3a21f1bcbb1eef08a Mon Sep 17 00:00:00 2001 From: Matt Johnson Date: Thu, 16 Jul 2026 17:50:56 +0000 Subject: [PATCH] chore(dashboard): redirect 5 orphaned legacy routes to their tabbed homes MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit /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. --- work/dashboard-frontend/src/App.tsx | 21 +++++++++---------- .../src/components/Layout.tsx | 13 +----------- 2 files changed, 11 insertions(+), 23 deletions(-) diff --git a/work/dashboard-frontend/src/App.tsx b/work/dashboard-frontend/src/App.tsx index a55bcf5..a0a8785 100644 --- a/work/dashboard-frontend/src/App.tsx +++ b/work/dashboard-frontend/src/App.tsx @@ -1,19 +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 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' @@ -47,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) */} + } /> } /> } /> } /> @@ -64,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 d2094a2..8a55d4e 100644 --- a/work/dashboard-frontend/src/components/Layout.tsx +++ b/work/dashboard-frontend/src/components/Layout.tsx @@ -3,18 +3,14 @@ import { Link, useLocation, useNavigate } from 'react-router-dom' import { useDirty } from '@/context/DirtyContext' import { LayoutDashboard, - Radio, Cloud, BellRing, BookOpen, - Droplets, MapPin, Map, Wifi, - Layers, Network, Users, - Bot, Settings, Calendar, Activity, @@ -84,13 +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: '/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), @@ -106,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 {