diff --git a/frontend/src/App.tsx b/frontend/src/App.tsx index 39e39d3..8867836 100644 --- a/frontend/src/App.tsx +++ b/frontend/src/App.tsx @@ -3665,10 +3665,8 @@ function accountStorageKey(suffix: string, user: AuthUser | null): string { return `accountProfile:${user?.id ?? 'guest'}:${suffix}`; } -type AdminTab = - | 'dashboard' | 'listings' | 'users' | 'messages' | 'reports' | 'payments' - | 'stats' | 'settings' | 'moderation' | 'categories' | 'locations' | 'promotions' | 'forbiddenWords' - | 'leads' | 'campaigns' | 'mailConfig'; +// Zakladki panelu maja odpowiedniki w sciezkach /admin/* - jedno zrodlo prawdy w routes.ts. +type AdminTab = AdminTabKey; const ADMIN_TAB_META: Record = { dashboard: { title: 'Panel administratora', subtitle: 'Zarządzaj ogłoszeniami i użytkownikami serwisu.' }, @@ -3848,7 +3846,14 @@ function AdminMessageModal({ user, onClose }: { user: AuthUser; onClose: () => v function AdminPage() { const navigate = useNavigate(); const { user } = useAuth(); - const [tab, setTab] = useState('dashboard'); + // Aktywna zakladka wynika z adresu (/admin/leady), nie ze stanu komponentu - + // dzieki temu kazda sekcja panelu ma wlasny URL, dziala F5 i przycisk Wstecz. + const adminSegment = useParams()['*'] ?? ''; + const tab: AdminTab = ADMIN_PATH_TO_TAB[adminSegment] ?? 'dashboard'; + const isUnknownAdminSection = adminSegment !== '' && !(adminSegment in ADMIN_PATH_TO_TAB); + const setTab = useCallback((next: AdminTab) => { + navigate(adminTabPath(next)); + }, [navigate]); const [users, setUsers] = useState([]); const [listings, setListings] = useState([]); const [reports, setReports] = useState([]); @@ -4193,6 +4198,10 @@ function AdminPage() { } }; + if (isUnknownAdminSection) { + return ; + } + return (
@@ -4201,31 +4210,26 @@ function AdminPage() {

Narzędzia

diff --git a/frontend/src/styles.css b/frontend/src/styles.css index 55ce034..e2071c4 100644 --- a/frontend/src/styles.css +++ b/frontend/src/styles.css @@ -21387,7 +21387,7 @@ svg { gap: 3px; } -.admin-nav button { +.admin-nav button, .admin-nav a { align-items: center; background: transparent; border: 0; @@ -21404,22 +21404,22 @@ svg { text-align: left; } -.admin-nav button svg { +.admin-nav button svg, .admin-nav a svg { color: #7186a0; height: 15px; width: 15px; } -.admin-nav button.active { +.admin-nav button.active, .admin-nav a.active { background: #ebf6f0; color: #109253; } -.admin-nav button.active svg { +.admin-nav button.active svg, .admin-nav a.active svg { color: #109253; } -.admin-nav button b { +.admin-nav button b, .admin-nav a b { background: #129357; border-radius: 999px; color: #ffffff; @@ -26773,3 +26773,6 @@ svg { .not-found-actions a { border-radius: 10px; font-size: 14px; font-weight: 800; padding: 12px 22px; text-decoration: none; } .not-found-primary { background: #13a360; color: #ffffff; } .not-found-secondary { border: 1px solid #d5dde7; color: #27384f; } + +/* Routing: pozycje menu admina to teraz (NavLink) */ +.admin-nav a { color: inherit; cursor: pointer; text-decoration: none; }