From 24f877e50bac81368488316723781774be6c79ca Mon Sep 17 00:00:00 2001 From: LordMathis Date: Wed, 6 Nov 2024 23:34:37 +0100 Subject: [PATCH] Initial admin dashboard layout --- .../src/components/navigation/UserMenu.jsx | 39 +++- .../settings/admin/AdminDashboard.jsx | 182 ++++++++++++++++++ 2 files changed, 220 insertions(+), 1 deletion(-) create mode 100644 frontend/src/components/settings/admin/AdminDashboard.jsx diff --git a/frontend/src/components/navigation/UserMenu.jsx b/frontend/src/components/navigation/UserMenu.jsx index c5d0e68..0002eb0 100644 --- a/frontend/src/components/navigation/UserMenu.jsx +++ b/frontend/src/components/navigation/UserMenu.jsx @@ -8,12 +8,19 @@ import { Text, Divider, } from '@mantine/core'; -import { IconUser, IconLogout, IconSettings } from '@tabler/icons-react'; +import { + IconUser, + IconUsers, + IconLogout, + IconSettings, +} from '@tabler/icons-react'; import { useAuth } from '../../contexts/AuthContext'; import AccountSettings from '../settings/account/AccountSettings'; +import AdminDashboard from '../settings/admin/AdminDashboard'; const UserMenu = () => { const [accountSettingsOpened, setAccountSettingsOpened] = useState(false); + const [adminDashboardOpened, setAdminDashboardOpened] = useState(false); const [opened, setOpened] = useState(false); const { user, logout } = useAuth(); @@ -81,6 +88,31 @@ const UserMenu = () => { + {user.role === 'admin' && ( + { + setAdminDashboardOpened(true); + setOpened(false); + }} + px="sm" + py="xs" + style={(theme) => ({ + borderRadius: theme.radius.sm, + '&:hover': { + backgroundColor: + theme.colorScheme === 'dark' + ? theme.colors.dark[5] + : theme.colors.gray[0], + }, + })} + > + + + Admin Dashboard + + + )} + { opened={accountSettingsOpened} onClose={() => setAccountSettingsOpened(false)} /> + + setAdminDashboardOpened(false)} + /> ); }; diff --git a/frontend/src/components/settings/admin/AdminDashboard.jsx b/frontend/src/components/settings/admin/AdminDashboard.jsx new file mode 100644 index 0000000..74f468b --- /dev/null +++ b/frontend/src/components/settings/admin/AdminDashboard.jsx @@ -0,0 +1,182 @@ +import React, { useState } from 'react'; +import { + Modal, + Table, + Button, + Group, + TextInput, + PasswordInput, + Select, + Stack, + Text, + ActionIcon, + Box, +} from '@mantine/core'; +import { IconTrash, IconEdit, IconPlus } from '@tabler/icons-react'; + +// Dummy data - replace with actual API calls in production +const DUMMY_USERS = [ + { + id: 1, + email: 'admin@example.com', + displayName: 'Admin User', + role: 'admin', + createdAt: '2024-01-01', + }, + { + id: 2, + email: 'editor@example.com', + displayName: 'Editor User', + role: 'editor', + createdAt: '2024-01-02', + }, + { + id: 3, + email: 'viewer@example.com', + displayName: 'Viewer User', + role: 'viewer', + createdAt: '2024-01-03', + }, +]; + +const CreateUserModal = ({ opened, onClose, onCreateUser }) => { + const [email, setEmail] = useState(''); + const [password, setPassword] = useState(''); + const [displayName, setDisplayName] = useState(''); + const [role, setRole] = useState('viewer'); + + const handleSubmit = () => { + onCreateUser({ email, password, displayName, role }); + setEmail(''); + setPassword(''); + setDisplayName(''); + setRole('viewer'); + onClose(); + }; + + return ( + + + setEmail(e.currentTarget.value)} + placeholder="user@example.com" + /> + setDisplayName(e.currentTarget.value)} + placeholder="John Doe" + /> + setPassword(e.currentTarget.value)} + placeholder="Enter password" + /> +