diff --git a/frontend/src/components/basics/SelectField.tsx b/frontend/src/components/basics/SelectField.tsx new file mode 100644 index 0000000..1dc0ecb --- /dev/null +++ b/frontend/src/components/basics/SelectField.tsx @@ -0,0 +1,25 @@ +type SelectFieldProps = { + value: string; + onChange: (value: string) => void; + options: { value: string; label: string }[]; + className?: string; +}; + +/** + * SelectField - A dropdown styled consistently with input fields + */ +export default function SelectField({value, onChange, options, className = ''}: SelectFieldProps) { + return ( + onChange(e.target.value)} + className={`p-2 w-full border rounded-md bg-white border-gray-600 hover:border-blue-800 transition-colors text-gray-600 focus:outline-none focus:border-blue-900 cursor-pointer ${className}`} + > + {options.map((option) => ( + + {option.label} + + ))} + + ); +} \ No newline at end of file diff --git a/frontend/src/components/basics/TextLinkButton.tsx b/frontend/src/components/basics/TextLinkButton.tsx new file mode 100644 index 0000000..733abd6 --- /dev/null +++ b/frontend/src/components/basics/TextLinkButton.tsx @@ -0,0 +1,20 @@ +type TextLinkButtonProps = { + text: string; + onClick: () => void; + className?: string; +}; + +/** + * TextLinkButton - A button styled as a hyperlink + */ +export default function TextLinkButton({text, onClick, className = ''}: TextLinkButtonProps) { + return ( + + {text} + + ); +} \ No newline at end of file diff --git a/frontend/src/components/users/UserManagementPage.tsx b/frontend/src/components/users/UserManagementPage.tsx index 2e9a83a..9977ee4 100644 --- a/frontend/src/components/users/UserManagementPage.tsx +++ b/frontend/src/components/users/UserManagementPage.tsx @@ -1,6 +1,6 @@ import {useEffect, useState} from "react"; import {createUser, fetchCurrentUser, updateUser} from "../../api/points/UserPoint"; -import type {UserDto} from "../../api/dtos/UserDto.ts"; // @todo add model and mapper! +import type {UserDto} from "../../api/dtos/UserDto.ts"; import ContentBackground from "../basics/ContentBackground"; import ContentBody from "../basics/ContentBody"; import StickyHeader from "../basics/StickyHeader"; @@ -14,12 +14,14 @@ import ButtonGroupLayout from "../basics/ButtonGroupLayout.tsx"; import {Plus, X} from "lucide-react"; import ButtonLink from "../basics/ButtonLink.tsx"; import {getRecipeListUrl} from "../../routes.ts"; +import TextLinkButton from "../basics/TextLinkButton.tsx"; +import SelectField from "../basics/SelectField.tsx"; /** * UserManagementPage * ------------------- * Displays a two-column layout: - * - Left: list of all users + * - Left: list of all users (wider on desktop) * - Right: edit form for selected or new user * * Allows: @@ -55,6 +57,7 @@ export default function UserManagementPage() { setSelectedUser(me); //} }; + /** Handles selecting a user from the list */ const handleSelectUser = (user: UserDto) => { setSelectedUser({...user}); @@ -98,6 +101,11 @@ export default function UserManagementPage() { }); }; + const roleOptions = [ + {value: "user", label: "Benutzer"}, + {value: "admin", label: "Administrator"} + ]; + return ( @@ -120,17 +128,17 @@ export default function UserManagementPage() { - - {/* User List @todo selector component!*/} - + + {/* User List - Wider on desktop, attached to left */} + Benutzer - + {users.map((user) => ( handleSelectUser(user)} > @@ -141,20 +149,13 @@ export default function UserManagementPage() { {/* Edit Form */} - + {selectedUser ? ( {selectedUser.id ? "Benutzer bearbeiten" : "Neuen Benutzer anlegen"} - { - e.preventDefault(); - handleSave(); - }} - className="flex flex-col gap-3 max-w-md" - > - {/* @todo create component for laben and input field combination */} + Benutzername + Vorname + Nachname + E-Mail - {isAdmin && (Benutzergruppe)} {isAdmin && ( - // @todo style - - setSelectedUser({...selectedUser, role: e.target.value}) - } - > - Benutzer - Administrator - + <> + Benutzergruppe + + setSelectedUser({...selectedUser, role: value}) + } + options={roleOptions} + /> + > )} {/* Show password field only when creating new user */} - {!selectedUser.id && (Passwort)} {!selectedUser.id && ( - { - }} - /> - )} - {!selectedUser.id && (Passwort bestätigen)} - {!selectedUser.id && ( - { - }} - /> + <> + Passwort + { + }} + /> + + Passwort bestätigen + { + }} + /> + > )} - {/* Change password button for existing user */} + {/* Change password link for existing user */} {selectedUser.id && ( - + + + )} @@ -245,7 +250,7 @@ export default function UserManagementPage() { onClick={loadData} /> - + ) : ( Bitte einen Benutzer auswählen. @@ -264,4 +269,4 @@ export default function UserManagementPage() { ); -} +} \ No newline at end of file
Bitte einen Benutzer auswählen.