diff --git a/.beads/issues.jsonl b/.beads/issues.jsonl
index acd5453..2974ff2 100644
--- a/.beads/issues.jsonl
+++ b/.beads/issues.jsonl
@@ -1,4 +1,6 @@
+{"id":"books-8ea","title":"fjern brugers navn fra højre hjørne ved profile ikonet","status":"in_progress","priority":2,"issue_type":"task","owner":"nhh@softwarehuset.com","created_at":"2026-01-30T14:20:16.406033+01:00","created_by":"Nicolaj Hartmann","updated_at":"2026-01-30T14:20:47.977337+01:00"}
{"id":"books-bj6","title":"Test automatisk pickup","status":"closed","priority":2,"issue_type":"task","owner":"nhh@softwarehuset.com","created_at":"2026-01-30T14:04:40.572496+01:00","created_by":"Nicolaj Hartmann","updated_at":"2026-01-30T14:05:44.401903+01:00","closed_at":"2026-01-30T14:05:44.401903+01:00","close_reason":"completed"}
-{"id":"books-h6e","title":"fjern hurtig bogføring og den visning der høre dertil","status":"in_progress","priority":2,"issue_type":"task","owner":"nhh@softwarehuset.com","created_at":"2026-01-30T14:14:50.436314+01:00","created_by":"Nicolaj Hartmann","updated_at":"2026-01-30T14:15:06.776032+01:00"}
+{"id":"books-h6e","title":"fjern hurtig bogføring og den visning der høre dertil","status":"closed","priority":2,"issue_type":"task","owner":"nhh@softwarehuset.com","created_at":"2026-01-30T14:14:50.436314+01:00","created_by":"Nicolaj Hartmann","updated_at":"2026-01-30T14:18:09.911294+01:00","closed_at":"2026-01-30T14:18:09.911294+01:00","close_reason":"Closed"}
+{"id":"books-hzt","title":"fix bug med tilføj brugere står forkert med encoded tegn","status":"open","priority":2,"issue_type":"task","owner":"nhh@softwarehuset.com","created_at":"2026-01-30T14:21:34.556319+01:00","created_by":"Nicolaj Hartmann","updated_at":"2026-01-30T14:21:34.556319+01:00"}
{"id":"books-sbm","title":"ændre navnet i venstre side til Books","status":"closed","priority":2,"issue_type":"task","owner":"nhh@softwarehuset.com","created_at":"2026-01-30T14:11:13.017202+01:00","created_by":"Nicolaj Hartmann","updated_at":"2026-01-30T14:12:14.16594+01:00","closed_at":"2026-01-30T14:12:14.16594+01:00","close_reason":"Closed"}
{"id":"books-wqf","title":"Opret en logud knap i topbaren","status":"closed","priority":2,"issue_type":"task","owner":"nhh@softwarehuset.com","created_at":"2026-01-30T14:06:06.999508+01:00","created_by":"Nicolaj Hartmann","updated_at":"2026-01-30T14:10:52.860045+01:00","closed_at":"2026-01-30T14:10:52.860045+01:00","close_reason":"Closed"}
diff --git a/frontend/src/components/layout/Header.tsx b/frontend/src/components/layout/Header.tsx
index 9890f81..a5ba233 100644
--- a/frontend/src/components/layout/Header.tsx
+++ b/frontend/src/components/layout/Header.tsx
@@ -1,21 +1,38 @@
-import { Layout, Space, Button, Dropdown, Avatar, Typography, Divider } from 'antd';
+import { useState } from 'react';
+import { Layout, Space, Button, Dropdown, Avatar, Divider, Tooltip, Badge } from 'antd';
import {
UserOutlined,
LogoutOutlined,
SettingOutlined,
BellOutlined,
QuestionCircleOutlined,
+ TeamOutlined,
+ CrownOutlined,
+ MenuOutlined,
} from '@ant-design/icons';
import type { MenuProps } from 'antd';
+import { useNavigate } from 'react-router-dom';
import CompanySwitcher from './CompanySwitcher';
import FiscalYearSelector from './FiscalYearSelector';
+import UserAccessManager from '@/components/company/UserAccessManager';
import { useAuthStore } from '@/stores/authStore';
+import { useCanAdmin, useActiveCompanyRole } from '@/stores/companyStore';
+import { useUIStore } from '@/stores/uiStore';
+import { semanticColors, spacing } from '@/styles/designTokens';
const { Header: AntHeader } = Layout;
-const { Text } = Typography;
-export default function Header() {
- const { user, logout } = useAuthStore();
+interface HeaderProps {
+ isMobile?: boolean;
+}
+
+export default function Header({ isMobile = false }: HeaderProps) {
+ const navigate = useNavigate();
+ const { logout } = useAuthStore();
+ const canAdmin = useCanAdmin();
+ const activeRole = useActiveCompanyRole();
+ const toggleMobileDrawer = useUIStore((state) => state.toggleMobileDrawer);
+ const [userAccessOpen, setUserAccessOpen] = useState(false);
const userMenuItems: MenuProps['items'] = [
{
@@ -28,8 +45,13 @@ export default function Header() {
icon: ,
label: 'Indstillinger',
},
+ ...(canAdmin ? [{
+ key: 'manage-users',
+ icon: ,
+ label: 'Administrer brugere',
+ }] : []),
{
- type: 'divider',
+ type: 'divider' as const,
},
{
key: 'logout',
@@ -45,10 +67,13 @@ export default function Header() {
logout();
break;
case 'settings':
- // Navigate to settings
+ navigate('/indstillinger');
break;
case 'profile':
- // Navigate to profile
+ navigate('/profil');
+ break;
+ case 'manage-users':
+ setUserAccessOpen(true);
break;
}
};
@@ -56,39 +81,75 @@ export default function Header() {
return (
- {/* Left side - Company Switcher and Fiscal Year Selector */}
- }>
-
-
+ {/* Left side - Mobile menu + Company Switcher and Fiscal Year Selector */}
+
+ {/* Hamburger menu for mobile */}
+ {isMobile && (
+ }
+ onClick={toggleMobileDrawer}
+ aria-label="Åbn navigation"
+ style={{ marginRight: spacing.xs }}
+ />
+ )}
+ : undefined}>
+
+ {!isMobile && }
+
{/* Right side - User actions */}
+ {/* Team/User Management - only for owners */}
+ {canAdmin && (
+
+ }
+ onClick={() => setUserAccessOpen(true)}
+ aria-label="Administrer brugere"
+ />
+
+ )}
+
{/* Help */}
}
- title="Hjaelp"
+ aria-label="Hjælp"
+ title="Hjælp"
/>
{/* Notifications */}
}
+ aria-label="Notifikationer"
title="Notifikationer"
/>
+ {/* Logout */}
+
+ }
+ onClick={logout}
+ aria-label="Log ud"
+ />
+
+
{/* User Menu */}
-
+ : 0}
+ offset={[-2, 2]}
+ style={{ cursor: 'pointer' }}
+ role="button"
+ aria-label="Brugermenu"
+ aria-haspopup="menu"
+ tabIndex={0}
+ >
}
style={{ backgroundColor: '#1677ff' }}
+ aria-hidden="true"
/>
-
- {user?.name || user?.email || 'Bruger'}
-
-
+
+
+ {/* User Access Manager Modal */}
+ setUserAccessOpen(false)}
+ />
);
}