using System; using System.Collections.ObjectModel; using System.Linq; using System.Threading.Tasks; using CommunityToolkit.Mvvm.ComponentModel; using CommunityToolkit.Mvvm.Input; using ChronoFlow.Model; using ChronoFlow.Persistence; using ChronoFlow.Controller; namespace ChronoFlow.View.Mitarbeiter; /// /// ViewModel für die Mitarbeiter-Aufgabenansicht. /// Enthält alle Aufgaben für den eingeloggten Benutzer und erlaubt das Speichern von Änderungen. /// public partial class EmployeeTasksViewModel : ObservableObject { private readonly User _benutzer; private readonly ZeiterfassungsController controller = new(); private readonly string aktuellerBenutzername; [ObservableProperty] private ObservableCollection eintraege = new(); [ObservableProperty] private string? statusText; public bool HatKeineEintraege => Eintraege.Count == 0; partial void OnEintraegeChanged(ObservableCollection? oldValue, ObservableCollection newValue) { OnPropertyChanged(nameof(HatKeineEintraege)); } public EmployeeTasksViewModel(User benutzer) { _benutzer = benutzer; aktuellerBenutzername = benutzer.Username; controller = new ZeiterfassungsController(); // falls du das oben nicht hast _ = LadeEintraegeAsync(); } [RelayCommand] public async Task LadeEintraegeAsync() { // 🔄 Einträge synchron laden, aber async verpacken var alleEintraege = await Task.Run(() => controller.LadeAlleEintraege()); var relevanteEintraege = alleEintraege .Where(e => !e.Erledigt && (e.Mitarbeiter == aktuellerBenutzername || e.Projektleiter == aktuellerBenutzername)) .OrderBy(e => e.Endzeit) .ToList(); foreach (var eintrag in relevanteEintraege) { eintrag.WurdeSeitLoginBearbeitet = eintrag.LetzteBearbeitung > _benutzer.VorletzterLogin; } if (relevanteEintraege.Any(e => e.WurdeSeitLoginBearbeitet)) StatusText = "📢 Es wurden Aufgaben seit Ihrem letzten Login geändert."; Eintraege = new ObservableCollection(relevanteEintraege); } [RelayCommand] public async Task SpeichereEintraegeAsync() { // Achtung: Hier verwendest du noch das Repository, obwohl du oben mit dem Controller arbeitest. // Du kannst entweder: // A) Das Repository auch im ViewModel übergeben // B) Die Methode UpdateStatusUndKommentarAsync auch in den Controller packen foreach (var eintrag in Eintraege) { await Task.Run(() => { var sqlite = new SqliteZeiterfassungsService(); sqlite.UpdateStatusUndKommentarAsync(eintrag.Id, eintrag.Erledigt, eintrag.MitarbeiterKommentar).Wait(); }); } StatusText = "✅ Änderungen gespeichert."; await LadeEintraegeAsync(); } }