From 8d35adfb9b207c59daf3eb01716976387890d99a Mon Sep 17 00:00:00 2001 From: sl-webui Date: Mon, 2 Mar 2026 10:24:24 -0500 Subject: [PATCH] feat(webui): settings & configuration panel (Issue #160) - useSettings.js: PID parameter catalogue, step-response simulation, ROS2 parameter apply via rcl_interfaces/srv/SetParameters, sensor param management, firmware info extraction from /diagnostics, diagnostics bundle export, JSON backup/restore, localStorage persist - SettingsPanel.jsx: 6-view panel (PID, Sensors, Network, Firmware, Diagnostics, Backup); StepResponseCanvas with stable/oscillating/ unstable colour-coding; GainSlider with range+number input; weight- class tabs (empty/light/heavy); parameter validation badges - App.jsx: CONFIG tab group (purple), settings tab render, FLEET_TABS set to gate ConnectionBar and footer for fleet/missions/settings Co-Authored-By: Claude Sonnet 4.6 --- ui/social-bot/src/App.jsx | 18 +- .../src/components/SettingsPanel.jsx | 452 ++++++++++++++++++ ui/social-bot/src/hooks/useSettings.js | 273 +++++++++++ 3 files changed, 741 insertions(+), 2 deletions(-) create mode 100644 ui/social-bot/src/components/SettingsPanel.jsx create mode 100644 ui/social-bot/src/hooks/useSettings.js diff --git a/ui/social-bot/src/App.jsx b/ui/social-bot/src/App.jsx index 1bae6ee..6d6e65a 100644 --- a/ui/social-bot/src/App.jsx +++ b/ui/social-bot/src/App.jsx @@ -38,6 +38,9 @@ import { FleetPanel } from './components/FleetPanel.jsx'; // Mission planner (issue #145) import { MissionPlanner } from './components/MissionPlanner.jsx'; +// Settings panel (issue #160) +import { SettingsPanel } from './components/SettingsPanel.jsx'; + const TAB_GROUPS = [ { label: 'SOCIAL', @@ -70,8 +73,17 @@ const TAB_GROUPS = [ { id: 'missions', label: 'Missions' }, ], }, + { + label: 'CONFIG', + color: 'text-purple-600', + tabs: [ + { id: 'settings', label: 'Settings' }, + ], + }, ]; +const FLEET_TABS = new Set(['fleet', 'missions']); + const DEFAULT_WS_URL = 'ws://localhost:9090'; function ConnectionBar({ url, setUrl, connected, error }) { @@ -142,7 +154,7 @@ export default function App() { ⚡ SALTYBOT DASHBOARD - {activeTab !== 'fleet' && ( + {!FLEET_TABS.has(activeTab) && ( )} @@ -197,11 +209,13 @@ export default function App() { {activeTab === 'fleet' && } {activeTab === 'missions' && } + + {activeTab === 'settings' && } {/* ── Footer ── */}