using System; using System.Collections.ObjectModel; using System.Linq; using Avalonia.Controls; using Avalonia.Interactivity; using Avalonia.Input; using ChronoFlow.Model; using ChronoFlow.Persistence; namespace ChronoFlow.View.Admin; /// /// Diese View zeigt alle noch nicht abgeschlossenen Projekte. /// Admins können Projekte bearbeiten, löschen oder abschließen. /// public partial class AlleProjekteView : UserControl { private readonly ViewManager? _viewManager; private readonly ObservableCollection _alleProjekte = new(); private readonly SqliteZeiterfassungsService _dbService = new(); /// /// Öffentlicher, parameterloser Konstruktor – notwendig für Avalonia XAML-Runtime (AVLN0005). /// Wird nur verwendet, wenn kein ViewManager übergeben wird. /// public AlleProjekteView() { InitializeComponent(); Console.WriteLine("⚠ AlleProjekteView mit Standard-Konstruktor initialisiert."); LadeAlleProjekte(); } /// /// Konstruktor mit ViewManager zur Navigation (z.B. zurück zum Admin-Dashboard). /// public AlleProjekteView(ViewManager viewManager) { InitializeComponent(); _viewManager = viewManager; LadeAlleProjekte(); } /// /// Lädt alle nicht erledigten Projekte aus der Datenbank und zeigt sie in der Liste an. /// private void LadeAlleProjekte() { try { _alleProjekte.Clear(); var alle = _dbService.LadeAlleZeiteintraege(); Console.WriteLine($"🧪 Aus DB geladen: {alle.Count} Einträge"); foreach (var e in alle) Console.WriteLine($"➡️ {e.Projekt} | {e.Mitarbeiter} | {e.Projektleiter}"); var ausDb = alle //.Where(p => !p.Erledigt) .OrderBy(p => p.Endzeit) .ToList(); foreach (var eintrag in ausDb) _alleProjekte.Add(eintrag); ProjekteListe.ItemsSource = _alleProjekte; Console.WriteLine($"🔄 {ausDb.Count} offene Projekte geladen."); } catch (Exception ex) { Console.WriteLine($"❌ Fehler beim Laden der Projekte: {ex.Message}"); } } /// /// Filtert die Projektliste nach Projekt- oder Mitarbeitername bei Tasteneingabe im Suchfeld. /// private void Suchfeld_KeyUp(object? sender, KeyEventArgs e) { var text = Suchfeld?.Text?.ToLower() ?? ""; ProjekteListe.ItemsSource = _alleProjekte .Where(p => (p.Projekt?.ToLower().Contains(text) ?? false) || (p.Mitarbeiter?.ToLower().Contains(text) ?? false)) .ToList(); } /// /// Öffnet einen Dialog zum Bearbeiten des ausgewählten Projekts. /// Änderungen werden gespeichert und die Liste neu geladen. /// private async void Bearbeiten_Click(object? sender, RoutedEventArgs e) { if (sender is Button button && button.Tag is Zeiteintrag projekt) { var dialog = new ProjektBearbeitenDialog(projekt); if (this.VisualRoot is Window parentWindow) { var updatedProjekt = await dialog.ShowDialog(parentWindow); if (updatedProjekt != null) { _dbService.UpdateProjekt(updatedProjekt); LadeAlleProjekte(); Console.WriteLine($"✏️ Projekt aktualisiert: {updatedProjekt.Projekt}"); } } else { Console.WriteLine("❌ Bearbeiten_Click: VisualRoot ist kein Window."); } } } /// /// Löscht das ausgewählte Projekt dauerhaft aus der Datenbank. /// private void Loeschen_Click(object? sender, RoutedEventArgs e) { if (sender is Button button && button.Tag is Zeiteintrag projekt) { _dbService.LoescheProjekt(projekt.Id); LadeAlleProjekte(); Console.WriteLine($"🗑️ Projekt gelöscht: {projekt.Projekt}"); } } /// /// Markiert ein Projekt als erledigt (abgeschlossen) und aktualisiert die Anzeige. /// private void Abschliessen_Click(object? sender, RoutedEventArgs e) { if (sender is Button button && button.Tag is Zeiteintrag projekt) { projekt.Erledigt = true; _dbService.UpdateProjekt(projekt); Console.WriteLine($"✅ Projekt abgeschlossen: {projekt.Projekt}"); LadeAlleProjekte(); } } /// /// Navigiert zurück zur Admin-Startansicht. /// private void ZurueckButton_Click(object? sender, RoutedEventArgs e) { _viewManager?.Show("AdminMain"); } }