using CommunityToolkit.Mvvm.ComponentModel; using CommunityToolkit.Mvvm.Input; using Jugenddienst_Stunden.Models; using Jugenddienst_Stunden.Types; using System.ComponentModel; using System.Windows.Input; using static System.Runtime.InteropServices.JavaScript.JSType; namespace Jugenddienst_Stunden.ViewModels; /// /// Viewmodel für die einzelnen Stundeneinträge / Bearbeitung /// public partial 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; //public event Func> ConfirmEvent; //public event EventHandler ConfirmEvent; /// /// Gemeinden für die Auswahlliste /// [ObservableProperty] private List optionsGemeinde; /// /// Projekte für die Auswahlliste /// [ObservableProperty] private List optionsProjekt; /// /// Freistellungen für die Auswahlliste /// [ObservableProperty] private List optionsFreistellung; /// /// Vorhandene Zeiten anzeigen, wenn neuer Eintrag erstellt wird /// [ObservableProperty] private List dayTimes; /// /// Aktueller Stundeneintrag /// [ObservableProperty] private DayTime dayTime; /// /// Dürfen Gemeinden verwendet werden? /// [ObservableProperty] private bool gemeindeAktivSet; /// /// Dürfen Projekte verwendet werden? /// [ObservableProperty] private bool projektAktivSet; [ObservableProperty] private bool freistellungEnabled; 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() { SaveCommand = new AsyncRelayCommand(Save); //DeleteCommand = new AsyncRelayCommand(Delete); DeleteConfirmCommand = new Command(async () => await DeleteConfirm()); } public StundeViewModel(DayTime stunde) { SaveCommand = new AsyncRelayCommand(Save); DeleteConfirmCommand = new AsyncRelayCommand(DeleteConfirm); } private async void LoadSettingsAsync() { try { Settings = await HoursBase.LoadSettings(); GlobalVar.Settings = Settings; OptionsGemeinde = Settings.Gemeinden; OptionsProjekt = Settings.Projekte; OptionsFreistellung = Settings.Freistellungen; GemeindeAktivSet = Settings.GemeindeAktivSet; ProjektAktivSet = Settings.ProjektAktivSet; } catch (Exception e) { AlertEvent?.Invoke(this, e.Message); } } async Task Save() { bool exceptionOccurred = false; bool proceed = true; if (DayTime.TimeSpanVon == DayTime.TimeSpanBis && DayTime.FreistellungAktiv.Name == null) { proceed = false; AlertEvent?.Invoke(this, "Uhrzeiten sollten unterschiedlich sein"); } if (proceed) { try { await 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")}"); } } } } /// /// Löschen ohne Bestätigung /// private async Task Delete() { await HoursBase.DeleteEntry(DayTime); await Shell.Current.GoToAsync($"..?date={DayTime.Day.ToString("yyyy-MM-dd")}"); } /// /// Löschen mit Bestätigung /// 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 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) { //load beinhaltet die ID: Eintrag bearbeiten //date beinhaltet einen Tag: Neuen Eintrag erstellen if (query.ContainsKey("load")) { //DateTime heute = DateTime.Now; try { //_dayTime = await HoursBase.LoadEntry(Convert.ToInt32(query["load"])); BaseResponse dat = await HoursBase.LoadBase("id=" + Convert.ToInt32(query["load"])); GlobalVar.Settings = dat.settings; GemeindeAktivSet = dat.settings.GemeindeAktivSet; ProjektAktivSet = dat.settings.ProjektAktivSet; DayTime = dat.daytime; DayTime.TimeSpanVon = dat.daytime.Begin.ToTimeSpan(); DayTime.TimeSpanBis = dat.daytime.End.ToTimeSpan(); OptionsGemeinde = dat.settings.Gemeinden ?? new List(); OptionsProjekt = dat.settings.Projekte ?? new List(); OptionsFreistellung = dat.settings.Freistellungen ?? new List(); 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(); //Evtl. noch die anderen Zeiten des gleichen Tages holen BaseResponse dat1 = await HoursBase.LoadBase("date=" + DayTime.Day.ToString("yyyy-MM-dd")); DayTimes = dat1.daytimes; OnPropertyChanged(nameof(DayTime)); OnPropertyChanged(nameof(DayTimes)); } catch (Exception e) { AlertEvent?.Invoke(this, e.Message); } finally { } if (System.String.IsNullOrEmpty(DayTime.Description)) { InfoEvent?.Invoke(this, "Eintrag hat keinen Beschreibungstext"); } SubTitle = DayTime.Day.ToString("dddd, d. MMMM yyyy"); OnPropertyChanged(nameof(SubTitle)); FreistellungEnabled = !DayTime.Approved; //OnPropertyChanged(nameof(DayTime)); } else if (query.ContainsKey("date")) { Title = "Neuer Eintrag"; OnPropertyChanged(nameof(Title)); 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); BaseResponse dat = await HoursBase.LoadBase("date=" + _date.ToString("yyyy-MM-dd")); GlobalVar.Settings = dat.settings; DayTimes = dat.daytimes; OptionsGemeinde = dat.settings.Gemeinden; OptionsProjekt = dat.settings.Projekte; OptionsFreistellung = dat.settings.Freistellungen; GemeindeAktivSet = dat.settings.GemeindeAktivSet; ProjektAktivSet = dat.settings.ProjektAktivSet; } catch (Exception) { //Ein Tag ohne Einträge gibt eine Fehlermeldung, //die soll aber ignoriert werden, weil beim Neueintrag ist das ja Wurscht //In dem Fall müssen die Settings aber nochmal geholt werden, weil die dann nicht geladen wurden LoadSettingsAsync(); } finally { DayTime = new DayTime(); DayTime.Day = _date; DayTime.EmployeeId = GlobalVar.EmployeeId; DayTime.GemeindeAktiv = new Gemeinde(); DayTime.ProjektAktiv = new Projekt(); DayTime.FreistellungAktiv = new Freistellung(); SubTitle = _date.ToString("dddd, d. MMMM yyyy"); FreistellungEnabled = true; OnPropertyChanged(nameof(SubTitle)); //OnPropertyChanged(nameof(DayTime)); } } } }