feat(ui): #3557 UI tweaks + map unification pass#3561
Conversation
- Auto Time Sync: reword description to make clear the server pushes its time to the node (server is the authority). - Sidebar: rename "Messages" nav item to "Node Details" (nav.messages). - Unified map: make node-popup source rows clickable. Meshtastic rows open that source's Node Details (#messages) tab focused on the node's DM via router state; MeshCore rows switch to that source. - Sidebar: fix pinned-but-collapsed-on-load bug — initialize isCollapsed from the persisted pin state so a pinned sidebar loads expanded. - News/ChangeLog popup: remove the "Don't show again" checkbox; closing now marks the shown items dismissed by default (News icon re-opens the feed). - Map unification: add tile-selector + legend toggles (hidden by default, in Map Features) to the Global/Dashboard and MeshCore maps, and GeoJSON layer enable/disable toggles to the MeshCore map. Shared localStorage keys across all map surfaces. GeoJSON fetch made defensive (Array.isArray). Adds regression tests for the clickable popup source rows. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Peq865k9vuH4PvKTFhQuNq
12992c3 to
1aa8741
Compare
|
Claude finished @Yeraze's task —— View job PR Review: feat(ui): #3557 UI tweaks + map unification pass
Overall this is a well-structured, careful PR. The map unification is consistent across all three map surfaces, the sidebar pin-state fix is correct, and the test coverage for the new popup click behavior is thorough. Below are a few observations ranging from real bugs to minor polish notes. Potential Bugs1. GeoJSON fetch in DashboardMap uses an unauthenticated
const response = await fetch(`${baseUrl}/api/geojson/layers`);This is a raw 2.
for (const item of newsItems) {
await api.dismissNewsItem(item.id);
}These are serialized; if there are 10 unread news items, closing the popup blocks for 10 round-trips before calling await Promise.all(newsItems.map(item => api.dismissNewsItem(item.id)));Then 3.
const status = await api.getUserNewsStatus();
await api.updateUserNewsStatus(mostRecentId, status.dismissedNewsIds || []);The Code Quality / Best Practices4. Duplicated GeoJSON fetch +
5. Duplicated tile-selector localStorage state across three components
6. MeshCore popup source-row click navigates to source root, not DM
if (source.protocol === 'MeshCore') {
navigate(`/source/${source.sourceId}/`);
return;
}The PR description acknowledges MeshCore sources "just switch to that source," which is reasonable for now, but from a UX standpoint the user's intent was to see that node's details. This could be a follow-up item. 7. The disabled button already gets 8. Minor: The Because Test CoverageThe new test suite (
One gap: there's no test for the LocaleThe rename of Summary: Solid PR. The main actionable items are (1) the sequential |
Finalize the 4.11.0 release (from 4.11.0-rc2) and bring documentation up to date with everything new since 4.10. Version bump across all five files: package.json, package-lock.json, helm/meshmonitor/Chart.yaml, desktop/src-tauri/tauri.conf.json, desktop/package.json. Documentation: - CHANGELOG: finalize the Unreleased section as [4.11.0], adding the previously-missing entries — headline MeshCore virtual node (#3540), MeshCore path-by-repeater-name (#3550), MeshCore map icons + filtering (#3563), per-node Hide from Map (#3565), telemetry time-range selector (#3530), newer AirQualityMetrics fields (#3517), UI/map unification (#3561), plus the bug-fix and documentation changes since 4.10.4. - virtual-node.md: document the new MeshCore Virtual Node alongside the Meshtastic one (default port 5000, per-source enablement, admin-command safety, MeshCore app setup, troubleshooting) + a two-variants intro note. - configuration/index.md, docs/index.md, README.md: mention the MeshCore Virtual Node in the Virtual Node feature blurbs. - CLAUDE.md: refresh stale version header (4.10.0 -> 4.11.0) and migration count (84 -> 92, latest 092_add_hide_from_map_to_nodes). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Closes #3557.
Summary
Implements the six UI tweaks from #3557 plus a basic map UI-unification pass across the Meshtastic, MeshCore, and Global/Dashboard maps.
Issue #3557 items
nav.messageslabel globally (also relabels the messages permission in the Users admin UI).#messages) tab focused on the node's DM (via routerlocation.state, consumed by a mount effect inApp.tsx); MeshCore rows switch to that source.isCollapsednow initializes from the persisted pin state, so a pinned-expanded sidebar loads expanded instead of collapsed-with-pin-lit.Map unification pass
meshmonitor-showTileSelector/meshmonitor-showLegendlocalStorage keys.Array.isArray).Testing
tsc --noEmit: clean.Notes
MapLegend(Meshtastic hop-gradient + line types) for consistency; its polylines use a separate direct/short/long palette, so a follow-up could unify MeshCore line colors to the overlay palette.news.do_not_show_againlocale key is left in place (harmless).🤖 Generated with Claude Code