diff --git a/Jugenddienst Stunden/Interfaces/IAlertService.cs b/Jugenddienst Stunden/Interfaces/IAlertService.cs index 3cdaf7b..6e39cde 100644 --- a/Jugenddienst Stunden/Interfaces/IAlertService.cs +++ b/Jugenddienst Stunden/Interfaces/IAlertService.cs @@ -5,7 +5,7 @@ using System.Text; using System.Threading.Tasks; namespace Jugenddienst_Stunden.Interfaces; -internal interface IAlertService { +public interface IAlertService { event EventHandler AlertRaised; void Raise(string message); } diff --git a/Jugenddienst Stunden/MauiProgram.cs b/Jugenddienst Stunden/MauiProgram.cs index 1803843..875cb50 100644 --- a/Jugenddienst Stunden/MauiProgram.cs +++ b/Jugenddienst Stunden/MauiProgram.cs @@ -114,6 +114,8 @@ public static class MauiProgram { // DI: Views/ViewModels builder.Services.AddTransient(); builder.Services.AddTransient(); + builder.Services.AddTransient(); + builder.Services.AddTransient(); builder.Services.AddTransient(); builder.Services.AddTransient(); diff --git a/Jugenddienst Stunden/ViewModels/StundeViewModel.cs b/Jugenddienst Stunden/ViewModels/StundeViewModel.cs index 2f70ed7..54b90b2 100644 --- a/Jugenddienst Stunden/ViewModels/StundeViewModel.cs +++ b/Jugenddienst Stunden/ViewModels/StundeViewModel.cs @@ -77,33 +77,16 @@ public partial class StundeViewModel : ObservableObject, IQueryAttributable { //public ICommand LoadDataCommand { get; private set; } - public StundeViewModel() : this(GetServiceOrCreate()) { - LoadSettingsAsync(); - } - - private static IHoursService GetServiceOrCreate() { - // Fallback-Konstruktion, falls DI nicht injiziert wurde (z. B. im Designer) - var http = new HttpClient(); - var options = new Infrastructure.ApiOptions { BaseUrl = GlobalVar.ApiUrl, Timeout = TimeSpan.FromSeconds(15) }; - var tokenProvider = new GlobalVarTokenProvider(); - var api = new ApiClient(http, options, tokenProvider, new PreferencesAppSettings()); - var repo = new HoursRepository(api); - var validator = new HoursValidator(); - return new HoursService(repo, validator); - } - - internal StundeViewModel(IHoursService hoursService) { + public StundeViewModel(IHoursService hoursService, IAlertService alertService) { _hoursService = hoursService; SaveCommand = new AsyncRelayCommand(Save); - //DeleteCommand = new AsyncRelayCommand(Delete); DeleteConfirmCommand = new Command(async () => await DeleteConfirm()); - } - // DI-Konstruktor, der den globalen Alert-Service abonniert und Alerts an das ViewModel weiterreicht. - internal StundeViewModel(IHoursService hoursService, IAlertService alertService) : this(hoursService) { if (alertService is not null) { alertService.AlertRaised += (s, msg) => AlertEvent?.Invoke(this, msg); } + + LoadSettingsAsync(); } private async void LoadSettingsAsync() { @@ -125,7 +108,7 @@ public partial class StundeViewModel : ObservableObject, IQueryAttributable { async Task Save() { bool exceptionOccurred = false; bool proceed = true; - + //Arbeitszeit sollte nicht null sein if (DayTime.TimeSpanVon == DayTime.TimeSpanBis && DayTime.FreistellungAktiv.Name == null) { proceed = false; @@ -203,45 +186,37 @@ public partial class StundeViewModel : ObservableObject, IQueryAttributable { //DateTime heute = DateTime.Now; try { var entry = await _hoursService.GetEntryAsync(Convert.ToInt32(query["load"])); - // var settings = await _hoursService.GetSettingsAsync(); - // GlobalVar.Settings = settings; - // GemeindeAktivSet = settings.GemeindeAktivSet; - // ProjektAktivSet = settings.ProjektAktivSet; DayTime = entry; DayTime.TimeSpanVon = entry.Begin.ToTimeSpan(); DayTime.TimeSpanBis = entry.End.ToTimeSpan(); - // OptionsGemeinde = settings.Gemeinden ?? new List(); - // OptionsProjekt = settings.Projekte ?? new List(); - // OptionsFreistellung = settings.Freistellungen ?? new List(); - DayTime.GemeindeAktiv = OptionsGemeinde.FirstOrDefault(Gemeinde => Gemeinde.Id == DayTime.Gemeinde) ?? - new Gemeinde(); + new Gemeinde(); DayTime.ProjektAktiv = OptionsProjekt.FirstOrDefault(Projekt => Projekt.Id == DayTime.Projekt) ?? - new Projekt(); + new Projekt(); DayTime.FreistellungAktiv = OptionsFreistellung.FirstOrDefault(Freistellung => Freistellung.Id == DayTime.Free) ?? new Freistellung(); - //Evtl. noch die anderen Zeiten des gleichen Tages holen - var day = await _hoursService.GetDayWithSettingsAsync(DayTime.Day); - DayTimes = day.dayTimes; OnPropertyChanged(nameof(DayTime)); - OnPropertyChanged(nameof(DayTimes)); + 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; } catch (Exception e) { AlertEvent?.Invoke(this, e.Message); } finally { + //Evtl. noch die anderen Zeiten des gleichen Tages holen + var day = await _hoursService.GetDayWithSettingsAsync(DayTime.Day); + DayTimes = day.dayTimes; + OnPropertyChanged(nameof(DayTimes)); } - 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"; diff --git a/Jugenddienst Stunden/Views/StundePage.xaml b/Jugenddienst Stunden/Views/StundePage.xaml index dbed4c1..7c80d50 100644 --- a/Jugenddienst Stunden/Views/StundePage.xaml +++ b/Jugenddienst Stunden/Views/StundePage.xaml @@ -8,10 +8,6 @@ x:Class="Jugenddienst_Stunden.Views.StundePage" Title="{Binding Title}"> - - - - diff --git a/Jugenddienst Stunden/Views/StundePage.xaml.cs b/Jugenddienst Stunden/Views/StundePage.xaml.cs index 44eb8c2..1f3cdc0 100644 --- a/Jugenddienst Stunden/Views/StundePage.xaml.cs +++ b/Jugenddienst Stunden/Views/StundePage.xaml.cs @@ -13,14 +13,13 @@ public partial class StundePage : ContentPage { /// /// CTOR /// - public StundePage() { + public StundePage(StundeViewModel vm) { InitializeComponent(); - if (BindingContext is StundeViewModel vm) { - vm.AlertEvent += Vm_AlertEvent; - vm.InfoEvent += Vm_InfoEvent; - vm.ConfirmEvent += ShowConfirm; - } + BindingContext = vm; + vm.AlertEvent += Vm_AlertEvent; + vm.InfoEvent += Vm_InfoEvent; + vm.ConfirmEvent += ShowConfirm; } private void Vm_AlertEvent(object? sender, string e) {