using System; using System.Collections.ObjectModel; using System.Linq; // Wichtig für .Where und .Select using Avalonia.Controls; using Avalonia.Interactivity; using Avalonia.Media; using ChronoFlow.Controller; using ChronoFlow.Model; using ChronoFlow.Persistence; // Wichtig für SqliteZeiterfassungsService namespace ChronoFlow.View { public partial class ZeiterfassungView : UserControl { private readonly ZeiterfassungsController _controller; private readonly ObservableCollection _anzeigeEinträge; private readonly User _user; public ZeiterfassungView(User user) { InitializeComponent(); _user = user; _controller = new ZeiterfassungsController(); _anzeigeEinträge = new ObservableCollection(); // ✅ Benutzer aus Datenbank laden und Dropdown füllen var benutzer = new SqliteZeiterfassungsService().LadeAlleBenutzer(); var nurMitarbeiter = benutzer .Where(b => b.Role == "Mitarbeiter") .Select(b => b.Username) .ToList(); MitarbeiterBoxDropdown.ItemsSource = nurMitarbeiter; // Einträge aus SQLite laden var geladeneEintraege = _controller.LadeAlleEintraege(); foreach (var eintrag in geladeneEintraege) { _anzeigeEinträge.Add(eintrag); } Eintragsliste.ItemsSource = _anzeigeEinträge; // Eingabeformular nur für Admin sichtbar if (_user.Role != "Admin" && EingabePanel != null) { EingabePanel.IsVisible = false; } } private void SpeichernButton_Click(object? sender, RoutedEventArgs e) { try { string mitarbeiter = MitarbeiterBoxDropdown.SelectedItem?.ToString() ?? ""; DateTime datum = DatumPicker.SelectedDate?.Date ?? DateTime.Today; string startText = StartzeitBox.Text ?? ""; string endText = EndzeitBox.Text ?? ""; if (!TimeSpan.TryParse(startText, out TimeSpan startZeit)) { FeedbackText.Text = "Ungültige Startzeit!"; FeedbackText.Foreground = Brushes.Red; FeedbackText.IsVisible = true; return; } if (!TimeSpan.TryParse(endText, out TimeSpan endZeit)) { FeedbackText.Text = "Ungültige Endzeit!"; FeedbackText.Foreground = Brushes.Red; FeedbackText.IsVisible = true; return; } var eintrag = new Zeiteintrag { Mitarbeiter = mitarbeiter, Startzeit = datum.Date + startZeit, Endzeit = datum.Date + endZeit, Projekt = ProjektBox.Text, Kommentar = KommentarBox.Text, Erledigt = false }; _controller.SpeichereEintrag(eintrag); _anzeigeEinträge.Add(eintrag); FeedbackText.Text = "Eintrag gespeichert."; FeedbackText.Foreground = Brushes.Green; FeedbackText.IsVisible = true; } catch (Exception ex) { FeedbackText.Text = $"Fehler: {ex.Message}"; FeedbackText.Foreground = Brushes.Red; FeedbackText.IsVisible = true; } } private void MarkiereErledigt_Click(object? sender, RoutedEventArgs e) { if (sender is Button button && button.DataContext is Zeiteintrag eintrag) { eintrag.Erledigt = true; RefreshListe(); } } private void MarkiereNichtErledigt_Click(object? sender, RoutedEventArgs e) { if (sender is Button button && button.DataContext is Zeiteintrag eintrag) { eintrag.Erledigt = false; RefreshListe(); } } private void Kommentar_LostFocus(object? sender, RoutedEventArgs e) { if (sender is TextBox tb && tb.DataContext is Zeiteintrag eintrag) { eintrag.MitarbeiterKommentar = tb.Text; } } private void RefreshListe() { Eintragsliste.ItemsSource = null; Eintragsliste.ItemsSource = _anzeigeEinträge; } } }