ChronoFlow/ChronoFlow.View/Admin/MitarbeiterListeView.axaml.cs
2025-06-28 14:27:18 +02:00

182 lines
5.7 KiB
C#

using System;
using System.Collections.ObjectModel;
using System.Linq;
using Avalonia.Controls;
using Avalonia.Input;
using Avalonia.Interactivity;
using ChronoFlow.Model;
using ChronoFlow.Persistence;
using ChronoFlow.Security;
namespace ChronoFlow.View.Admin;
/// <summary>
/// Zeigt eine Liste aller Benutzer mit der Rolle "Mitarbeiter" zur Bearbeitung oder Löschung.
/// </summary>
public partial class MitarbeiterListeView : UserControl
{
private readonly ViewManager _viewManager;
private readonly ObservableCollection<User> _alleMitarbeiter = new();
private readonly SqliteZeiterfassungsService _dbService = new();
/// <summary>
/// Öffentlicher parameterloser Konstruktor für Avalonia (zur Vermeidung von AVLN0005-Warnungen).
/// </summary>
public MitarbeiterListeView() : this(new ViewManager(new ContentControl()))
{
Console.WriteLine("⚠ Parameterloser Konstruktor genutzt (Dummy-ViewManager).");
}
/// <summary>
/// Konstruktor mit ViewManager (für Navigation).
/// </summary>
public MitarbeiterListeView(ViewManager viewManager)
{
InitializeComponent();
_viewManager = viewManager;
LadeMitarbeiter();
}
/// <summary>
/// Hilfsmethode zum Abrufen des übergeordneten Fensters.
/// </summary>
private Window? GetParentWindow() => this.VisualRoot as Window;
/// <summary>
/// Lädt alle Benutzer mit Rolle "Mitarbeiter" und zeigt sie in der Liste an.
/// </summary>
private void LadeMitarbeiter()
{
try
{
var mitarbeiter = _dbService.LadeAlleBenutzer()
.Where(m => m.Role == "Mitarbeiter")
.OrderBy(m => m.Username)
.ToList();
_alleMitarbeiter.Clear();
foreach (var user in mitarbeiter)
_alleMitarbeiter.Add(user);
MitarbeiterListe.ItemsSource = _alleMitarbeiter;
}
catch (Exception ex)
{
Console.WriteLine($"❌ Fehler beim Laden der Mitarbeiter: {ex.Message}");
}
}
/// <summary>
/// Filtert die Mitarbeiterliste beim Tippen im Suchfeld.
/// </summary>
private void Suchfeld_KeyUp(object? sender, KeyEventArgs e)
{
var text = Suchfeld?.Text?.ToLower() ?? "";
MitarbeiterListe.ItemsSource = _alleMitarbeiter
.Where(m => m.Username.ToLower().Contains(text))
.ToList();
}
/// <summary>
/// Öffnet Dialog zur Bearbeitung eines Mitarbeiters.
/// </summary>
private async void Bearbeiten_Click(object? sender, RoutedEventArgs e)
{
if (sender is Button button && button.Tag is User benutzer)
{
var dialog = new MitarbeiterBearbeitenDialog(benutzer);
var parentWindow = GetParentWindow();
if (parentWindow != null)
{
var updatedUser = await dialog.ShowDialog<User>(parentWindow);
if (updatedUser != null)
{
updatedUser.Password = benutzer.Password;
updatedUser.Role = benutzer.Role;
updatedUser.OriginalUsername = benutzer.Username;
_dbService.UpdateBenutzer(updatedUser);
LadeMitarbeiter();
}
}
else
{
Console.WriteLine("❌ Bearbeiten_Click: Konnte übergeordnetes Fenster nicht ermitteln.");
}
}
}
/// <summary>
/// Löscht einen Benutzer nach Bestätigung.
/// </summary>
private async void Loeschen_Click(object? sender, RoutedEventArgs e)
{
if (sender is Button button && button.Tag is User benutzer)
{
var dialog = new ConfirmDialog($"Möchten Sie den Benutzer '{benutzer.Username}' wirklich löschen?");
var parentWindow = GetParentWindow();
if (parentWindow != null)
{
var result = await dialog.ShowDialog<bool>(parentWindow);
if (result)
{
_dbService.LoescheBenutzer(benutzer.Username);
LadeMitarbeiter();
}
}
else
{
Console.WriteLine("❌ Loeschen_Click: VisualRoot ist kein Window.");
}
}
}
/// <summary>
/// Setzt das Passwort eines Benutzers zurück auf "newpassword" (gehasht).
/// </summary>
private async void PasswortReset_Click(object? sender, RoutedEventArgs e)
{
if (sender is Button button && button.Tag is User benutzer)
{
var parentWindow = GetParentWindow();
if (parentWindow != null)
{
var dialog = new ConfirmDialog($"Möchten Sie das Passwort für '{benutzer.Username}' wirklich zurücksetzen?");
var result = await dialog.ShowDialog<bool>(parentWindow);
if (result)
{
benutzer.Password = PasswordHasher.HashPassword("newpassword");
benutzer.MussPasswortAendern = true;
_dbService.UpdateBenutzer(benutzer);
Console.WriteLine($"✅ Passwort für {benutzer.Username} wurde zurückgesetzt.");
}
}
else
{
Console.WriteLine("❌ PasswortReset_Click: VisualRoot ist kein Window.");
}
}
}
/// <summary>
/// Navigiert zurück zur Admin-Hauptansicht.
/// </summary>
private void ZurueckButton_Click(object? sender, RoutedEventArgs e)
{
try
{
_viewManager.Show("AdminMain");
}
catch (Exception ex)
{
Console.WriteLine($"❌ Fehler beim Zurückspringen: {ex.Message}");
}
}
}