put the settings section in the url
Five settings pages moved from a `*_SELECTED` global to `/settings/:page/:section`. The sidebar entry is a react-router `<NavLink>` rather than a button holding the key in its onClick closure, so a section is linkable, cmd-clickable and gets its active state from the router; each page renders one `SettingsRoute` guard that canonicalises both the bare route and a section that does not exist. Integrations needed more than the shared factory. It builds its own sidebar, and it kept the Enterprise/Personal tab in a second global — which is why a deep link to a Personal section could never have worked: the link set the section, the tab stayed on Enterprise, and the content pane said "Select a section" about a section that existed. The tab is derived from the section key now. Also removes the `/settings/resources` menu item (audit M8) and its two locale keys: there has never been such a route, so it bounced to the catch-all and out to `/`.
This commit is contained in:
@@ -30,11 +30,20 @@ export function App() {
|
||||
<Dashboard.DashboardLayout>
|
||||
<Routes>
|
||||
<Route path="/" element={<Dashboard.HomeScreen />} />
|
||||
{/* Route pairs, like /headscale and /photos below: the bare page route exists so the
|
||||
existing links into it keep working, and its `SettingsRoute` guard redirects to the
|
||||
first section. The section is the URL rather than a `*_SELECTED` global, so a settings
|
||||
sub-page is linkable, bookmarkable and cmd-clickable. */}
|
||||
<Route path="/settings/profile" element={<Dashboard.ProfileSettings />} />
|
||||
<Route path="/settings/profile/:section" element={<Dashboard.ProfileSettings />} />
|
||||
<Route path="/settings/ai" element={<Dashboard.AISettings />} />
|
||||
<Route path="/settings/ai/:section" element={<Dashboard.AISettings />} />
|
||||
<Route path="/settings/system" element={<Dashboard.SystemSettings />} />
|
||||
<Route path="/settings/system/:section" element={<Dashboard.SystemSettings />} />
|
||||
<Route path="/settings/integrations" element={<Dashboard.IntegrationsSettings />} />
|
||||
<Route path="/settings/integrations/:section" element={<Dashboard.IntegrationsSettings />} />
|
||||
<Route path="/settings/user-management" element={<Dashboard.UserManagementSettings />} />
|
||||
<Route path="/settings/user-management/:section" element={<Dashboard.UserManagementSettings />} />
|
||||
{/* A project group is a working directory, so it is spelled as a path, not ?cwd= — see
|
||||
apps/ChatHistory/chat-routes.ts. The splat has to be last in a pattern, which is why
|
||||
"new" comes before the group rather than after it. A session carries no group: the
|
||||
|
||||
Reference in New Issue
Block a user