diff --git a/Jugenddienst Stunden/Jugenddienst Stunden.csproj b/Jugenddienst Stunden/Jugenddienst Stunden.csproj index 6de232a..ba1f2d6 100644 --- a/Jugenddienst Stunden/Jugenddienst Stunden.csproj +++ b/Jugenddienst Stunden/Jugenddienst Stunden.csproj @@ -44,8 +44,8 @@ com.companyname.jugenddienststunden - 1.0.5 - 6 + 1.0.6 + 7 False True @@ -53,8 +53,8 @@ True com.companyname.jugenddienststunden - 1.0.5 - 6 + 1.0.6 + 7 True @@ -64,8 +64,8 @@ True False True - 1.0.5 - 6 + 1.0.6 + 7 False @@ -75,8 +75,8 @@ com.companyname.jugenddienststunden - 1.0.5 - 6 + 1.0.6 + 7 $(DefineConstants);DISABLE_XAML_GENERATED_BREAK_ON_UNHANDLED_EXCEPTION True False @@ -88,17 +88,17 @@ False True True - 1.0.5 - 6 + 1.0.6 + 7 False - False + True False com.companyname.jugenddienststunden - 1.0.5 - 6 + 1.0.6 + 7 True True @@ -108,6 +108,8 @@ snupkg AnyCPU False + 1.0.6 + 1.0.6 diff --git a/Jugenddienst Stunden/Models/BaseFunc.cs b/Jugenddienst Stunden/Models/BaseFunc.cs index ba9cad9..125ef03 100644 --- a/Jugenddienst Stunden/Models/BaseFunc.cs +++ b/Jugenddienst Stunden/Models/BaseFunc.cs @@ -109,8 +109,8 @@ internal static class BaseFunc { internal static async Task SaveItemAsync(string url, string token, DayTime item, bool isNewItem = false) { - //Uhrzeiten sollten sinnvolle Werte haben - if (item.TimeSpanVon == item.TimeSpanBis) { + //Uhrzeiten sollten sinnvolle Werte haben - außer bei Freistellungen, da wäre eigentlich null + if (item.TimeSpanVon == item.TimeSpanBis && item.FreistellungAktiv == null) { throw new Exception("Beginn und Ende sind gleich"); } @@ -134,9 +134,13 @@ internal static class BaseFunc { throw new Exception("Projekt nicht gewählt"); } //Keine Beschreibung - if (string.IsNullOrEmpty(item.Description)) { + if (string.IsNullOrEmpty(item.Description) && item.FreistellungAktiv == null) { throw new Exception("Keine Beschreibung"); } + //Keine Beschreibung + if (string.IsNullOrEmpty(item.Description)) { + item.Description = item.FreistellungAktiv.Name; + } using (HttpClient client = new HttpClient() { Timeout = TimeSpan.FromSeconds(15) }) { //HttpClient client = new HttpClient(); client.DefaultRequestHeaders.Add("Accept", "application/json"); diff --git a/Jugenddienst Stunden/ViewModels/StundeViewModel.cs b/Jugenddienst Stunden/ViewModels/StundeViewModel.cs index b620165..d2b6b01 100644 --- a/Jugenddienst Stunden/ViewModels/StundeViewModel.cs +++ b/Jugenddienst Stunden/ViewModels/StundeViewModel.cs @@ -2,6 +2,7 @@ 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; @@ -9,7 +10,7 @@ namespace Jugenddienst_Stunden.ViewModels; /// /// Viewmodel für die einzelnen Stundeneinträge / Bearbeitung /// -public class StundeViewModel : ObservableObject, IQueryAttributable { +public partial class StundeViewModel : ObservableObject, IQueryAttributable { public int Id { get; set; } public string Title { get; set; } = "Eintrag bearbeiten"; @@ -25,84 +26,68 @@ public class StundeViewModel : ObservableObject, IQueryAttributable { /// /// Gemeinden für die Auswahlliste /// - public List OptionsGemeinde { get; private set; } + [ObservableProperty] + private List optionsGemeinde; /// /// Projekte für die Auswahlliste /// - public List OptionsProjekt { get; private set; } + [ObservableProperty] + private List optionsProjekt; /// /// Freistellungen für die Auswahlliste /// - public List OptionsFreistellung { get; private set; } + [ObservableProperty] + private List optionsFreistellung; /// /// Vorhandene Zeiten anzeigen, wenn neuer Eintrag erstellt wird /// - public List DayTimes { get; set; } + [ObservableProperty] + private List dayTimes; - private DayTime _dayTime; /// /// Aktueller Stundeneintrag /// - public DayTime DayTime { - get => _dayTime; - set { - if (_dayTime != value) { - _dayTime = value; - - } - OnPropertyChanged(nameof(DayTime)); - } - } - - + [ObservableProperty] + private DayTime dayTime; /// /// Dürfen Gemeinden verwendet werden? /// - public bool GemeindeAktivSet { get; set; } + [ObservableProperty] + private bool gemeindeAktivSet; /// /// Dürfen Projekte verwendet werden? /// - public bool ProjektAktivSet { get; set; } - - public bool FreistellungEnabled { get; set; } - + [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() { - 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() { - try { Settings = await HoursBase.LoadSettings(); + GlobalVar.Settings = Settings; OptionsGemeinde = Settings.Gemeinden; OptionsProjekt = Settings.Projekte; @@ -110,20 +95,10 @@ public class StundeViewModel : ObservableObject, IQueryAttributable { GemeindeAktivSet = Settings.GemeindeAktivSet; ProjektAktivSet = Settings.ProjektAktivSet; - GlobalVar.Settings = Settings; - OnPropertyChanged(nameof(OptionsGemeinde)); - OnPropertyChanged(nameof(OptionsFreistellung)); - OnPropertyChanged(nameof(OptionsProjekt)); - - OnPropertyChanged(nameof(GemeindeAktivSet)); - OnPropertyChanged(nameof(ProjektAktivSet)); + } catch (Exception e) { AlertEvent?.Invoke(this, e.Message); } - - - - } async Task Save() { @@ -159,100 +134,91 @@ public class StundeViewModel : ObservableObject, IQueryAttributable { //nicht Löschen } } - } - - - /// /// Anwenden der Query-Parameter /// async void IQueryAttributable.ApplyQueryAttributes(IDictionary query) { - var probe = query; 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"])); - _dayTime = dat.daytime; - _dayTime.TimeSpanVon = dat.daytime.Begin.ToTimeSpan(); - _dayTime.TimeSpanBis = dat.daytime.End.ToTimeSpan(); - OptionsGemeinde = dat.settings.Gemeinden; - OptionsProjekt = dat.settings.Projekte; - OptionsFreistellung = dat.settings.Freistellungen; - + GlobalVar.Settings = dat.settings; GemeindeAktivSet = dat.settings.GemeindeAktivSet; ProjektAktivSet = dat.settings.ProjektAktivSet; - GlobalVar.Settings = dat.settings; + 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(); + OnPropertyChanged(nameof(DayTime)); } catch (Exception e) { AlertEvent?.Invoke(this, e.Message); + } finally { + } if (System.String.IsNullOrEmpty(DayTime.Description)) { AlertEvent?.Invoke(this, "Eintrag hat keinen Beschreibungstext"); } SubTitle = DayTime.Day.ToString("dddd, d. MMMM yyyy"); + OnPropertyChanged(nameof(SubTitle)); + FreistellungEnabled = !DayTime.Approved; + //OnPropertyChanged(nameof(DayTime)); - _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; - - } - if (query.ContainsKey("date")) { + } 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; - - GlobalVar.Settings = dat.settings; + } 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; - DayTime.EmployeeId = GlobalVar.EmployeeId; + + OnPropertyChanged(nameof(SubTitle)); + OnPropertyChanged(nameof(DayTime)); } - } - OnPropertyChanged(nameof(FreistellungEnabled)); - OnPropertyChanged(nameof(DayTime)); - OnPropertyChanged(nameof(DayTimes)); - - OnPropertyChanged(nameof(SubTitle)); - OnPropertyChanged(nameof(Title)); - OnPropertyChanged(nameof(OptionsGemeinde)); - OnPropertyChanged(nameof(OptionsFreistellung)); - OnPropertyChanged(nameof(OptionsProjekt)); - - OnPropertyChanged(nameof(GemeindeAktivSet)); - OnPropertyChanged(nameof(ProjektAktivSet)); - } - } diff --git a/Jugenddienst Stunden/ViewModels/StundenViewModel.cs b/Jugenddienst Stunden/ViewModels/StundenViewModel.cs index 071ea7e..2da0991 100644 --- a/Jugenddienst Stunden/ViewModels/StundenViewModel.cs +++ b/Jugenddienst Stunden/ViewModels/StundenViewModel.cs @@ -154,8 +154,6 @@ internal class StundenViewModel : ObservableObject, IQueryAttributable, INotifyP public StundenViewModel() { _hour = new Hours(); - //LoadSettingsAsync(); - //HoursBase.tokendata = new TokenData(HoursBase.apiKey); LoadDataCommand = new AsyncRelayCommand(LoadData); NewEntryCommand = new AsyncRelayCommand(NewEntryAsync); SelectEntryCommand = new AsyncRelayCommand(SelectEntryAsync); @@ -163,27 +161,9 @@ internal class StundenViewModel : ObservableObject, IQueryAttributable, INotifyP RefreshCommand = new Command(async () => await RefreshItemsAsync()); Task task = LoadDay(DateTime.Today); - } - private async Task LoadSettingsAsync() { - try { - Settings = await HoursBase.LoadSettings(); - - GemeindeAktivSet = Settings.GemeindeAktivSet; - ProjektAktivSet = Settings.ProjektAktivSet; - - OnPropertyChanged(nameof(GemeindeAktivSet)); - OnPropertyChanged(nameof(ProjektAktivSet)); - doContinue = true; - } catch (Exception e) { - doContinue = false; - AlertEvent?.Invoke(this, e.Message); - } - - } - /// /// Öffnet eine neue Stundeneingabe /// @@ -213,7 +193,9 @@ internal class StundenViewModel : ObservableObject, IQueryAttributable, INotifyP /// private async Task LoadData() { try { - _hour = await HoursBase.LoadData(); + BaseResponse dat = await HoursBase.LoadBase("hours"); + _hour = dat.hour; + //_hour = await HoursBase.LoadData(); RefreshProperties(); } catch (Exception e) { AlertEvent?.Invoke(this, e.Message); @@ -226,11 +208,10 @@ internal class StundenViewModel : ObservableObject, IQueryAttributable, INotifyP /// public async Task LoadDay(DateTime date) { DayTotal = new TimeOnly(0); - //await LoadSettingsAsync(); - //if (doContinue) { try { //_dayTimes = await HoursBase.LoadDay(date); BaseResponse dat = await HoursBase.LoadBase("date=" + date.ToString("yyyy-MM-dd")); + _dayTimes = dat.daytimes; Settings = dat.settings; GemeindeAktivSet = Settings.GemeindeAktivSet; @@ -256,6 +237,12 @@ internal class StundenViewModel : ObservableObject, IQueryAttributable, INotifyP } DayTotal = TimeOnly.FromTimeSpan(span); + //Nach der Tagessumme die anderen Tage anhängen + if (_dayTimes != null) { + BaseResponse dat1 = await HoursBase.LoadBase("date=" + date.ToString("yyyy-MM-dd") + "&tilldate=" + date.AddDays(3).ToString("yyyy-MM-dd")); + if (dat1.daytimes != null) + _dayTimes = dat.daytimes.Concat(dat1.daytimes).ToList(); + } } catch (Exception e) { _dayTimes = new List(); @@ -266,7 +253,6 @@ internal class StundenViewModel : ObservableObject, IQueryAttributable, INotifyP OnPropertyChanged(nameof(Sollstunden)); OnPropertyChanged(nameof(DayTimes)); } - //} } diff --git a/Jugenddienst Stunden/Views/StundePage.xaml b/Jugenddienst Stunden/Views/StundePage.xaml index c7d3399..c972304 100644 --- a/Jugenddienst Stunden/Views/StundePage.xaml +++ b/Jugenddienst Stunden/Views/StundePage.xaml @@ -49,7 +49,6 @@ -