using CommunityToolkit.Mvvm.ComponentModel; using CommunityToolkit.Mvvm.Input; using Jugenddienst_Stunden.Models; using Jugenddienst_Stunden.Types; using System.Windows.Input; namespace Jugenddienst_Stunden.ViewModels; public class StundeViewModel : ObservableObject, IQueryAttributable { public int Id { get; set; } public string Title { get; set; } = "Eintrag bearbeiten"; public string SubTitle { get; set; } = DateTime.Today.ToString("dddd, d. MMMM yyyy"); private HoursBase HoursBase = new HoursBase(); internal Settings Settings = new Settings(); public event EventHandler AlertEvent; public event EventHandler InfoEvent; public event Func> ConfirmEvent; /// /// Gemeinden für die Auswahlliste /// public List OptionsGemeinde { get; private set; } /// /// Projekte für die Auswahlliste /// public List OptionsProjekt { get; private set; } /// /// Freistellungen für die Auswahlliste /// public List OptionsFreistellung { get; private set; } /// /// Vorhandene Zeiten anzeigen, wenn neuer Eintrag erstellt wird /// public List DayTimes { get; set; } private DayTime _dayTime; /// /// Aktueller Stundeneintrag /// public DayTime DayTime { get => _dayTime; set { if (_dayTime != value) { _dayTime = value; }OnPropertyChanged(nameof(DayTime)); } } /// /// Dürfen Gemeinden verwendet werden? /// public bool GemeindeAktivSet { get; set; } /// /// Dürfen Projekte verwendet werden? /// public bool ProjektAktivSet { get; set; } public bool FreistellungEnabled { get; set; } public ICommand SaveCommand { get; private set; } public ICommand DeleteCommand { get; private set; } public ICommand DeleteConfirmCommand { get; private set; } //public ICommand LoadDataCommand { get; private set; } public StundeViewModel() { DayTime = new DayTime(); SaveCommand = new AsyncRelayCommand(Save); //DeleteCommand = new AsyncRelayCommand(Delete); DeleteConfirmCommand = new Command(async () => await DeleteConfirm()); LoadSettingsAsync(); } public StundeViewModel(DayTime stunde) { DayTime = new DayTime(); SaveCommand = new AsyncRelayCommand(Save); DeleteConfirmCommand = new AsyncRelayCommand(DeleteConfirm); LoadSettingsAsync(); } private async void LoadSettingsAsync() { Settings = await HoursBase.LoadSettings(); OptionsGemeinde = Settings.Gemeinden; OptionsProjekt = Settings.Projekte; OptionsFreistellung = Settings.Freistellungen; GemeindeAktivSet = Settings.GemeindeAktivSet; ProjektAktivSet = Settings.ProjektAktivSet; OnPropertyChanged(nameof(OptionsGemeinde)); OnPropertyChanged(nameof(OptionsFreistellung)); OnPropertyChanged(nameof(OptionsProjekt)); OnPropertyChanged(nameof(GemeindeAktivSet)); OnPropertyChanged(nameof(ProjektAktivSet)); } private async Task LoadData() { try { Hours _hours = await Models.HoursBase.LoadBasicData(); DayTime.EmployeeId = _hours.EmployeeId; } catch (Exception e) { AlertEvent?.Invoke(this, e.Message); } } async Task Save() { bool exceptionOccurred = false; try { await Models.HoursBase.SaveEntry(DayTime); } catch (Exception e) { AlertEvent?.Invoke(this, e.Message); exceptionOccurred = true; } if (!exceptionOccurred) { if (DayTime.Id != null) { await Shell.Current.GoToAsync($"..?saved={DayTime.Id}"); } else { await Shell.Current.GoToAsync($"..?date={DayTime.Day.ToString("yyyy-MM-dd")}"); } } } private async Task Delete() { await Models.HoursBase.DeleteEntry(DayTime); await Shell.Current.GoToAsync($"..?date={DayTime.Day.ToString("yyyy-MM-dd")}"); } private async Task DeleteConfirm() { if (ConfirmEvent != null) { bool answer = await ConfirmEvent.Invoke("Achtung", "Löschen kann nicht ungeschehen gemacht werden. Fortfahren?"); if (answer) { //Löschen await Models.HoursBase.DeleteEntry(DayTime); await Shell.Current.GoToAsync($"..?date={DayTime.Day.ToString("yyyy-MM-dd")}"); } else { //nicht Löschen } } } /// /// Anwenden der Query-Parameter /// async void IQueryAttributable.ApplyQueryAttributes(IDictionary query) { var probe = query; if (query.ContainsKey("load")) { //DateTime heute = DateTime.Now; _dayTime = await Models.HoursBase.LoadEntry(Convert.ToInt32(query["load"])); if (System.String.IsNullOrEmpty(DayTime.Description)) { AlertEvent?.Invoke(this, "Eintrag hat keine Daten zurückgegeben"); } SubTitle = DayTime.Day.ToString("dddd, d. MMMM yyyy"); _dayTime.GemeindeAktiv = OptionsGemeinde.FirstOrDefault(Gemeinde => Gemeinde.Id == DayTime.Gemeinde) ?? new Gemeinde(); _dayTime.ProjektAktiv = OptionsProjekt.FirstOrDefault(Projekt => Projekt.Id == DayTime.Projekt) ?? new Projekt(); _dayTime.FreistellungAktiv = OptionsFreistellung.FirstOrDefault(Freistellung => Freistellung.Id == DayTime.Free) ?? new Freistellung(); FreistellungEnabled = !_dayTime.Approved; OnPropertyChanged(nameof(FreistellungEnabled)); OnPropertyChanged(nameof(DayTime)); OnPropertyChanged(nameof(SubTitle)); } if (query.ContainsKey("date")) { Title = "Neuer Eintrag"; DateTime _date = DateTime.ParseExact((string)query["date"], "yyyy-MM-dd", System.Globalization.CultureInfo.InvariantCulture); //Bei neuem Eintrag die vorhandenen des gleichen Tages anzeigen try { DayTimes = await HoursBase.LoadDay(_date); } catch (Exception) { //Ein Tag ohne Einträge gibt eine Fehlermeldung, //die soll aber ignoriert werden, weil beim Neueintrag ist das ja Wurscht } DayTime.Day = _date; SubTitle = _date.ToString("dddd, d. MMMM yyyy"); _ = LoadData(); OnPropertyChanged(nameof(Title)); OnPropertyChanged(nameof(SubTitle)); OnPropertyChanged(nameof(DayTimes)); } } }