From 0c2a83a31f8ff1dc5cd75f2b599c1b1141eb3eed Mon Sep 17 00:00:00 2001 From: MarcWieland Date: Tue, 18 Nov 2025 10:08:01 +0100 Subject: [PATCH] =?UTF-8?q?Neue=20Benutzer=C3=BCbersicht?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- FilterCair.Client/Pages/Admin/AdminHome.razor | 8 +- FilterCair.Client/Pages/Admin/Users.razor | 308 ++++++++++++++++++ 2 files changed, 312 insertions(+), 4 deletions(-) create mode 100644 FilterCair.Client/Pages/Admin/Users.razor diff --git a/FilterCair.Client/Pages/Admin/AdminHome.razor b/FilterCair.Client/Pages/Admin/AdminHome.razor index 452b431..d597f6b 100644 --- a/FilterCair.Client/Pages/Admin/AdminHome.razor +++ b/FilterCair.Client/Pages/Admin/AdminHome.razor @@ -5,7 +5,7 @@

- Willkommen im Adminbereich + Adminbereich

@@ -19,10 +19,10 @@
-
+
- -
Filter verwalten
+ +
Benutzer verwalten
diff --git a/FilterCair.Client/Pages/Admin/Users.razor b/FilterCair.Client/Pages/Admin/Users.razor new file mode 100644 index 0000000..327a32a --- /dev/null +++ b/FilterCair.Client/Pages/Admin/Users.razor @@ -0,0 +1,308 @@ +@page "/admin/users" +@layout AdminLayout +@inject IJSRuntime JS + +Benutzerverwaltung + + + +
+
+

+ Benutzerverwaltung +

+ +
+ + @if (isLoading) + { +
+
+

Lade Benutzer...

+
+ } + else if (users.Count == 0) + { +
+ Keine Benutzer vorhanden. Lege den ersten Benutzer an! +
+ } + else + { +
+ + + + + + + + + + + + + + @foreach (var u in users) + { + + + + + + + + + + } + +
BenutzernameVornameNachnameE-MailRolleAktivAktionen
@u.UserName@u.FirstName@u.LastName@u.Email + + @u.Role + + + + + + +
+
+ } + + + @if (showModal) + { + + } +
+@code { + private List users = new(); + private AppUser currentUser = new(); + private bool showModal = false; + private bool isEditMode = false; + private bool isLoading = true; + + protected override async Task OnInitializedAsync() + { + // Demo-Daten direkt beim Start + users = new List + { + new AppUser { Id = 1, UserName = "admin", FirstName = "Max", LastName = "Mustermann", Email = "admin@filtercair.de", Role = "Administrator", IsActive = true }, + new AppUser { Id = 2, UserName = "peter", FirstName = "Peter", LastName = "Parker", Email = "peter@company.com", Role = "User", IsActive = true }, + new AppUser { Id = 3, UserName = "susi", FirstName = "Susanne", LastName = "Müller", Email = "susi@company.com", Role = "User", IsActive = false }, + new AppUser { Id = 4, UserName = "tom", FirstName = "Tom", LastName = "Tester", Email = "tom@test.de", Role = "User", IsActive = true } + }; + isLoading = false; + } + + private void ShowCreateModal() + { + currentUser = new AppUser { IsActive = true, Role = "User" }; + isEditMode = false; + showModal = true; + } + + private void ShowEditModal(AppUser user) + { + currentUser = new AppUser + { + Id = user.Id, + UserName = user.UserName, + FirstName = user.FirstName, + LastName = user.LastName, + Email = user.Email, + Role = user.Role, + IsActive = user.IsActive, + Password = "" // bleibt leer → wird beim Edit nicht überschrieben + }; + isEditMode = true; + showModal = true; + } + + private void CloseModal() + { + showModal = false; + StateHasChanged(); + } + + private void OnBackdropClick(MouseEventArgs args) + { + CloseModal(); + } + + private void OnModalKeyDown(KeyboardEventArgs args) + { + if (args.Key == "Escape") + { + CloseModal(); + } + } + + private async Task SaveUser() + { + if (string.IsNullOrWhiteSpace(currentUser.UserName) || string.IsNullOrWhiteSpace(currentUser.Email) || + (!isEditMode && string.IsNullOrWhiteSpace(currentUser.Password))) + { + await JS.InvokeVoidAsync("showToast", "Bitte alle Pflichtfelder ausfüllen!", "error"); + return; + } + + if (isEditMode) + { + var existing = users.First(x => x.Id == currentUser.Id); + existing.UserName = currentUser.UserName; + existing.FirstName = currentUser.FirstName; + existing.LastName = currentUser.LastName; + existing.Email = currentUser.Email; + existing.Role = currentUser.Role; + existing.IsActive = currentUser.IsActive; + // Passwort wird nur geändert, wenn was eingetragen ist + if (!string.IsNullOrWhiteSpace(currentUser.Password)) + existing.PasswordHash = currentUser.Password; // hier einfach als Klartext für Demozwecke + } + else + { + currentUser.Id = users.Max(x => x.Id) + 1; + currentUser.PasswordHash = currentUser.Password; // Dummy-Hash + users.Add(currentUser); + } + + CloseModal(); + await JS.InvokeVoidAsync("showToast", isEditMode ? "✅ Benutzer aktualisiert!" : "✅ Benutzer angelegt!"); + } + + private async Task DeleteUser(AppUser user) + { + var confirmed = await JS.InvokeAsync("confirm", $"Soll der Benutzer '{user.UserName}' wirklich gelöscht werden?"); + if (confirmed) + { + users.Remove(user); + await JS.InvokeVoidAsync("showToast", "🗑️ Benutzer gelöscht"); + } + } + + // Dummy-User-Klasse nur für diese Seite + public class AppUser + { + public int Id { get; set; } + public string UserName { get; set; } = string.Empty; + public string FirstName { get; set; } = string.Empty; + public string LastName { get; set; } = string.Empty; + public string Email { get; set; } = string.Empty; + public string Password { get; set; } = string.Empty; // nur im Modal + public string? PasswordHash { get; set; } // wird später mal richtig + public string Role { get; set; } = "User"; + public bool IsActive { get; set; } = true; + } +} \ No newline at end of file