182 lines
5.7 KiB
C#
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}");
|
|
}
|
|
}
|
|
}
|