Less requests to get Data faster

Load settings with `GetEntryWithSettingsAsync`, update `Hours` and `ViewModels`.
This commit is contained in:
2025-12-25 11:39:44 +01:00
parent 15856d0dd0
commit 656d39f43e
6 changed files with 69 additions and 28 deletions

View File

@@ -13,4 +13,5 @@ public interface IHoursService {
Task<DayTime> GetEntryAsync(int id); Task<DayTime> GetEntryAsync(int id);
Task<DayTime> SaveEntryAsync(DayTime stunde); Task<DayTime> SaveEntryAsync(DayTime stunde);
Task DeleteEntryAsync(DayTime stunde); Task DeleteEntryAsync(DayTime stunde);
Task<(DayTime dayTime, Settings settings, List<DayTime> existingDayTimes)> GetEntryWithSettingsAsync(int id);
} }

View File

@@ -48,6 +48,15 @@ internal class HoursService : IHoursService {
public async Task<DayTime> GetEntryAsync(int id) => await _repo.LoadEntry(id); public async Task<DayTime> GetEntryAsync(int id) => await _repo.LoadEntry(id);
public async Task<(DayTime dayTime, Settings settings, List<DayTime> existingDayTimes)> GetEntryWithSettingsAsync(int id) {
//var stunde = await _repo.LoadEntry(id);
//var (existingDayTimes, settings) = await GetDayWithSettingsAsync(stunde.Day);
//return (stunde, settings, existingDayTimes);
string q = $"id={id}";
var baseRes = await _repo.LoadBase(q);
return (baseRes.daytime ?? new DayTime(), baseRes.settings, baseRes.daytimes ?? new List<DayTime>());
}
public async Task<DayTime> SaveEntryAsync(DayTime stunde) { public async Task<DayTime> SaveEntryAsync(DayTime stunde) {
var settings = await _repo.LoadSettings(); var settings = await _repo.LoadSettings();
_validator.Validate(stunde, settings); _validator.Validate(stunde, settings);

View File

@@ -1,4 +1,5 @@
using Jugenddienst_Stunden.Models; using Jugenddienst_Stunden.Models;
using Jugenddienst_Stunden.Types;
namespace Jugenddienst_Stunden.Types; namespace Jugenddienst_Stunden.Types;
@@ -8,12 +9,12 @@ internal class BaseResponse {
/// <summary> /// <summary>
/// Monatsübersicht /// Monatsübersicht
/// </summary> /// </summary>
public Hours hour { get; set; } public Types.Hours hour { get; set; }
/// <summary> /// <summary>
/// Stundenliste ... für die Katz? /// Stundenliste ... für die Katz?
/// </summary> /// </summary>
public List<Hours> hours { get; set; } public List<Types.Hours> hours { get; set; }
/// <summary> /// <summary>
/// Liste der Stundeneinträge /// Liste der Stundeneinträge

View File

@@ -4,24 +4,45 @@ using System.Collections.ObjectModel;
namespace Jugenddienst_Stunden.Types; namespace Jugenddienst_Stunden.Types;
public partial class Hours : ObservableObject { public partial class Hours : ObservableObject {
public double? Zeit; /// <summary>
/// Total time in seconds for the current context.
/// "zeit" is used by the API to represent the current recorded time value.
/// </summary>
public int zeit;
public double? Nominal; /// <summary>
/// Nominal working time expectation (e.g. seconds per day or month depending on API semantics).
/// Represents the expected amount of time to be worked.
/// </summary>
public int nominal;
//public Dictionary<DateOnly,NominalDay> nominal_day_api; /// <summary>
/// List of nominal day records returned by the API.
/// May be null when the API does not provide per-day nominal data.
/// </summary>
public List<NominalDay>? Nominal_day_api; public List<NominalDay>? Nominal_day_api;
//public Dictionary<int,NominalWeek> nominal_week_api; /// <summary>
/// List of nominal week records returned by the API.
/// May be null when the API does not provide per-week nominal data.
/// </summary>
public List<NominalWeek>? Nominal_week_api; public List<NominalWeek>? Nominal_week_api;
//public List<string> time_line; /// <summary>
public double? Zeit_total; /// Total time in seconds reported by the API for the current period. Nullable if not provided.
/// </summary>
//https://stackoverflow.com/questions/29449641/deserialize-json-when-a-value-can-be-an-object-or-an-empty-array/29450279#29450279 public double? zeit_total;
//[JsonConverter(typeof(JsonSingleOrEmptyArrayConverter<Hours>))]
//public Dictionary<int,decimal> zeit_total_daily;
/// <summary>
/// Daily total time values returned by the API.
/// Each entry represents a day with its associated time value.
/// </summary>
public List<TimeDay> zeit_total_daily_api; public List<TimeDay> zeit_total_daily_api;
/// <summary>
/// Collection of daytime entries representing individual recorded time slots or events.
/// Nullable when the API returns no detailed daytime information.
/// </summary>
public List<DayTime>? daytime; public List<DayTime>? daytime;
//public List<string> wochensumme; //public List<string> wochensumme;

View File

@@ -86,7 +86,7 @@ public partial class StundeViewModel : ObservableObject, IQueryAttributable {
alertService.AlertRaised += (s, msg) => AlertEvent?.Invoke(this, msg); alertService.AlertRaised += (s, msg) => AlertEvent?.Invoke(this, msg);
} }
LoadSettingsAsync(); //LoadSettingsAsync();
} }
private async void LoadSettingsAsync() { private async void LoadSettingsAsync() {
@@ -105,6 +105,16 @@ public partial class StundeViewModel : ObservableObject, IQueryAttributable {
} }
} }
private async void UpdateSettingsAsync(Settings settings) {
GlobalVar.Settings = settings;
OptionsGemeinde = settings.Gemeinden;
OptionsProjekt = settings.Projekte;
OptionsFreistellung = settings.Freistellungen;
GemeindeAktivSet = settings.GemeindeAktivSet;
ProjektAktivSet = settings.ProjektAktivSet;
}
async Task Save() { async Task Save() {
bool exceptionOccurred = false; bool exceptionOccurred = false;
bool proceed = true; bool proceed = true;
@@ -185,7 +195,9 @@ public partial class StundeViewModel : ObservableObject, IQueryAttributable {
if (query.ContainsKey("load")) { if (query.ContainsKey("load")) {
//DateTime heute = DateTime.Now; //DateTime heute = DateTime.Now;
try { try {
var entry = await _hoursService.GetEntryAsync(Convert.ToInt32(query["load"])); //var entry = await _hoursService.GetEntryAsync(Convert.ToInt32(query["load"]));
var (entry, settings, daytimes) = await _hoursService.GetEntryWithSettingsAsync(Convert.ToInt32(query["load"]));
UpdateSettingsAsync(settings);
DayTime = entry; DayTime = entry;
DayTime.TimeSpanVon = entry.Begin.ToTimeSpan(); DayTime.TimeSpanVon = entry.Begin.ToTimeSpan();
@@ -208,13 +220,16 @@ public partial class StundeViewModel : ObservableObject, IQueryAttributable {
OnPropertyChanged(nameof(SubTitle)); OnPropertyChanged(nameof(SubTitle));
FreistellungEnabled = !DayTime.Approved; FreistellungEnabled = !DayTime.Approved;
DayTimes = daytimes;
OnPropertyChanged(nameof(DayTimes));
} catch (Exception e) { } catch (Exception e) {
AlertEvent?.Invoke(this, e.Message); AlertEvent?.Invoke(this, e.Message);
} finally { } finally {
//Evtl. noch die anderen Zeiten des gleichen Tages holen //Evtl. noch die anderen Zeiten des gleichen Tages holen
var day = await _hoursService.GetDayWithSettingsAsync(DayTime.Day); //var day = await _hoursService.GetDayWithSettingsAsync(DayTime.Day);
DayTimes = day.dayTimes; //DayTimes = day.dayTimes;
OnPropertyChanged(nameof(DayTimes)); //OnPropertyChanged(nameof(DayTimes));
} }
//OnPropertyChanged(nameof(DayTime)); //OnPropertyChanged(nameof(DayTime));
@@ -227,15 +242,9 @@ public partial class StundeViewModel : ObservableObject, IQueryAttributable {
//Bei neuem Eintrag die vorhandenen des gleichen Tages anzeigen //Bei neuem Eintrag die vorhandenen des gleichen Tages anzeigen
try { try {
var (list, settings) = await _hoursService.GetDayWithSettingsAsync(_date); var (list, settings) = await _hoursService.GetDayWithSettingsAsync(_date);
GlobalVar.Settings = settings; UpdateSettingsAsync(settings);
DayTimes = list; DayTimes = list;
OptionsGemeinde = settings.Gemeinden;
OptionsProjekt = settings.Projekte;
OptionsFreistellung = settings.Freistellungen;
GemeindeAktivSet = settings.GemeindeAktivSet;
ProjektAktivSet = settings.ProjektAktivSet;
} catch (Exception) { } catch (Exception) {
//Ein Tag ohne Einträge gibt eine Fehlermeldung, //Ein Tag ohne Einträge gibt eine Fehlermeldung,
//die soll aber ignoriert werden, weil beim Neueintrag ist das ja Wurscht //die soll aber ignoriert werden, weil beim Neueintrag ist das ja Wurscht

View File

@@ -101,14 +101,14 @@ public partial class StundenViewModel : ObservableObject, IQueryAttributable, IN
/// Monatsübersicht: Geleistete Stunden /// Monatsübersicht: Geleistete Stunden
/// </summary> /// </summary>
public double? ZeitCalculated { public double? ZeitCalculated {
get => Hours.Zeit_total; get => Hours.zeit_total;
} }
/// <summary> /// <summary>
/// Monatsübersicht: Sollstunden /// Monatsübersicht: Sollstunden
/// </summary> /// </summary>
public double? Nominal { public double? Nominal {
get => Hours.Nominal; get => Hours.nominal;
} }
/// <summary> /// <summary>
@@ -287,7 +287,7 @@ public partial class StundenViewModel : ObservableObject, IQueryAttributable, IN
//Nach der Tagessumme die anderen Tage anhängen //Nach der Tagessumme die anderen Tage anhängen
if (DayTimes != null) { if (DayTimes != null) {
var more = await _hoursService.GetDayRangeAsync(date, date.AddDays(3)); var more = await _hoursService.GetDayRangeAsync(date.AddDays(1), date.AddDays(3));
if (more != null && more.Count > 0) if (more != null && more.Count > 0)
{ {
await MainThread.InvokeOnMainThreadAsync(() => await MainThread.InvokeOnMainThreadAsync(() =>