From c53d71fc286e204ba3748b6578e112240fc1410f Mon Sep 17 00:00:00 2001 From: shuaiplus <2327005759@qq.com> Date: Sun, 5 Jul 2026 23:44:54 +0800 Subject: [PATCH] feat(settings): move device management into settings --- .../src/components/AppAuthenticatedShell.tsx | 8 +- webapp/src/components/AppMainRoutes.tsx | 78 +++++++++++-------- webapp/src/styles.css | 42 ++++++++++ 3 files changed, 91 insertions(+), 37 deletions(-) diff --git a/webapp/src/components/AppAuthenticatedShell.tsx b/webapp/src/components/AppAuthenticatedShell.tsx index 69fe065..67352b4 100644 --- a/webapp/src/components/AppAuthenticatedShell.tsx +++ b/webapp/src/components/AppAuthenticatedShell.tsx @@ -1,4 +1,4 @@ -import { ArrowUpDown, Check, ChevronDown, Clock3, Cloud, FileClock, Folder as FolderIcon, Globe2, KeyRound, Lock, LogOut, MonitorSmartphone, Send as SendIcon, Settings as SettingsIcon, ShieldUser, SlidersHorizontal, Users } from 'lucide-preact'; +import { ArrowUpDown, Check, ChevronDown, Clock3, Cloud, FileClock, Folder as FolderIcon, KeyRound, Lock, LogOut, MonitorSmartphone, Send as SendIcon, Settings as SettingsIcon, ShieldUser, SlidersHorizontal, Users } from 'lucide-preact'; import type { ComponentChildren } from 'preact'; import { useEffect, useRef, useState } from 'preact/hooks'; import { Link } from 'wouter'; @@ -57,7 +57,8 @@ export default function AppAuthenticatedShell(props: AppAuthenticatedShellProps) const isAdmin = isAdminProfile(props.profile); const vaultActive = props.location === '/vault' || props.location === '/vault/totp'; const deviceManagementActive = props.location === DEVICE_MANAGEMENT_ROUTE || props.location === LEGACY_DEVICE_MANAGEMENT_ROUTE; - const settingsActive = props.location === props.settingsAccountRoute || props.location === '/settings/domain-rules' || deviceManagementActive; + const settingsActive = props.location === '/settings' || props.location === props.settingsAccountRoute || props.location === '/settings/domain-rules' || deviceManagementActive; + const flatSettingsActive = settingsActive && !deviceManagementActive; const dataActive = props.location === '/backup' || props.isImportRoute; const managementActive = props.location === '/admin' || props.location === '/logs'; const [navLayoutMode, setNavLayoutMode] = useState(readNavLayoutMode); @@ -175,8 +176,7 @@ export default function AppAuthenticatedShell(props: AppAuthenticatedShellProps) {renderSideLink('/vault', props.location === '/vault', , t('nav_vault_items'))} {renderSideLink('/vault/totp', props.location === '/vault/totp', , t('txt_verification_code'))} {renderSideLink('/sends', props.location === '/sends', , t('nav_sends'))} - {renderSideLink(props.settingsAccountRoute, props.location === props.settingsAccountRoute, , t('nav_account_settings'))} - {renderSideLink('/settings/domain-rules', props.location === '/settings/domain-rules', , t('nav_domain_rules'))} + {renderSideLink('/settings', flatSettingsActive, , t('txt_settings'))} {renderSideLink(DEVICE_MANAGEMENT_ROUTE, deviceManagementActive, , t('nav_device_management'))} {isAdmin && renderSideLink('/backup', props.location === '/backup', , t('nav_backup_strategy'))} {renderSideLink(props.importRoute, props.isImportRoute, , t('nav_import_export'))} diff --git a/webapp/src/components/AppMainRoutes.tsx b/webapp/src/components/AppMainRoutes.tsx index 8fed21d..a2ce516 100644 --- a/webapp/src/components/AppMainRoutes.tsx +++ b/webapp/src/components/AppMainRoutes.tsx @@ -320,43 +320,55 @@ export default function AppMainRoutes(props: AppMainRoutesProps) { {props.profile ? ( -
-
- - - {t('nav_account_settings')} - - - - {t('nav_device_management')} - - - - {t('nav_domain_rules')} - - - - {t('nav_import_export')} - - {isAdmin && ( - - - {t('nav_admin_panel')} +
+
+

{t('txt_settings')}

+
+ + + {t('nav_account_settings')} - )} - {isAdmin && ( - - - {t('nav_log_center')} + + + {t('nav_device_management')} - )} - {isAdmin && ( - - - {t('nav_backup_strategy')} + + + {t('nav_domain_rules')} - )} +
+
+

{t('nav_group_data_backup')}

+
+ + + {t('nav_import_export')} + + {isAdmin && ( + + + {t('nav_backup_strategy')} + + )} +
+
+ {isAdmin && ( +
+

{t('nav_group_management')}

+
+ + + {t('nav_admin_panel')} + + + + {t('nav_log_center')} + +
+
+ )} +