Reenabled deletion of Time-Entrys
This commit is contained in:
@@ -73,10 +73,17 @@ internal sealed class ApiClient : IApiClient {
|
|||||||
using var res = await _http.SendAsync(req, HttpCompletionOption.ResponseHeadersRead, ct).ConfigureAwait(false);
|
using var res = await _http.SendAsync(req, HttpCompletionOption.ResponseHeadersRead, ct).ConfigureAwait(false);
|
||||||
var text = await res.Content.ReadAsStringAsync(ct).ConfigureAwait(false);
|
var text = await res.Content.ReadAsStringAsync(ct).ConfigureAwait(false);
|
||||||
|
|
||||||
|
if (res.StatusCode == System.Net.HttpStatusCode.NotFound) {
|
||||||
|
var message = req.Method + ": " + req.RequestUri + " nicht gefunden";
|
||||||
|
throw ApiException.From(res.StatusCode, message);
|
||||||
|
}
|
||||||
|
|
||||||
if (!res.IsSuccessStatusCode)
|
if (!res.IsSuccessStatusCode)
|
||||||
throw ApiException.From(res.StatusCode, TryGetMessage(text), text);
|
throw ApiException.From(res.StatusCode, TryGetMessage(text), text);
|
||||||
|
|
||||||
|
|
||||||
if (res.StatusCode != System.Net.HttpStatusCode.OK) {
|
if (res.StatusCode != System.Net.HttpStatusCode.OK) {
|
||||||
|
|
||||||
// Verhalten wie in BaseFunc: bei Fehlerstatus -> "message" aus Body lesen und mit dessen Inhalt eine Exception werfen.
|
// Verhalten wie in BaseFunc: bei Fehlerstatus -> "message" aus Body lesen und mit dessen Inhalt eine Exception werfen.
|
||||||
try {
|
try {
|
||||||
var options = new JsonDocumentOptions { AllowTrailingCommas = true };
|
var options = new JsonDocumentOptions { AllowTrailingCommas = true };
|
||||||
@@ -142,8 +149,27 @@ internal sealed class ApiClient : IApiClient {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Wenn path bereits absolut ist, direkt verwenden
|
// Wenn path bereits absolut ist, direkt verwenden
|
||||||
if (Uri.TryCreate(relativePath, UriKind.Absolute, out var absoluteFromPath))
|
//if (Uri.TryCreate(relativePath, UriKind.Absolute, out var absoluteFromPath))
|
||||||
return absoluteFromPath;
|
// return absoluteFromPath;
|
||||||
|
|
||||||
|
// Sonderfall: Wenn path ein absoluter file:// URI ist, diesen relativ zur Basis behandeln
|
||||||
|
// Weiß nicht wie file:// zustande kommt, vermutlich wäre das zu verhindern
|
||||||
|
if (Uri.TryCreate(relativePath, UriKind.Absolute, out var uri)) {
|
||||||
|
if (uri.Scheme == Uri.UriSchemeFile) {
|
||||||
|
|
||||||
|
var normalizedBase = baseUrl.Trim();
|
||||||
|
if (!normalizedBase.EndsWith('/'))
|
||||||
|
normalizedBase += "/";
|
||||||
|
|
||||||
|
if (relativePath.StartsWith('/'))
|
||||||
|
relativePath = relativePath.TrimStart('/');
|
||||||
|
|
||||||
|
var baseUriNormalized = new Uri(normalizedBase, UriKind.Absolute);
|
||||||
|
return new Uri(baseUriNormalized, relativePath);
|
||||||
|
}
|
||||||
|
return uri;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
return new Uri(baseUri, relativePath);
|
return new Uri(baseUri, relativePath);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -44,8 +44,8 @@ public static class MauiProgram {
|
|||||||
//#endif
|
//#endif
|
||||||
|
|
||||||
// ApiClient registrieren: SocketsHttpHandler als Primary Handler (vermeidet AndroidMessageHandler-Castfehler)
|
// ApiClient registrieren: SocketsHttpHandler als Primary Handler (vermeidet AndroidMessageHandler-Castfehler)
|
||||||
var apiOptions = new Infrastructure.ApiOptions { BaseUrl = GlobalVar.ApiUrl, Timeout = TimeSpan.FromSeconds(15) };
|
//var apiOptions = new Infrastructure.ApiOptions { BaseUrl = GlobalVar.ApiUrl, Timeout = TimeSpan.FromSeconds(15) };
|
||||||
builder.Services.AddApiHttpClient(apiOptions);
|
//builder.Services.AddApiHttpClient(apiOptions);
|
||||||
|
|
||||||
// DI: AlertService für globale Alerts (z. B. leere ApiUrl)
|
// DI: AlertService für globale Alerts (z. B. leere ApiUrl)
|
||||||
builder.Services.AddSingleton<IAlertService, AlertService>();
|
builder.Services.AddSingleton<IAlertService, AlertService>();
|
||||||
|
|||||||
@@ -178,8 +178,12 @@ public partial class StundeViewModel : ObservableObject, IQueryAttributable {
|
|||||||
await ConfirmEvent.Invoke("Achtung", "Löschen kann nicht ungeschehen gemacht werden. Fortfahren?");
|
await ConfirmEvent.Invoke("Achtung", "Löschen kann nicht ungeschehen gemacht werden. Fortfahren?");
|
||||||
if (answer) {
|
if (answer) {
|
||||||
//Löschen
|
//Löschen
|
||||||
await _hoursService.DeleteEntryAsync(DayTime);
|
try {
|
||||||
await Shell.Current.GoToAsync($"..?date={DayTime.Day.ToString("yyyy-MM-dd")}");
|
await _hoursService.DeleteEntryAsync(DayTime);
|
||||||
|
await Shell.Current.GoToAsync($"..?date={DayTime.Day.ToString("yyyy-MM-dd")}");
|
||||||
|
} catch (Exception e) {
|
||||||
|
AlertEvent?.Invoke(this, e.Message);
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
//nicht Löschen
|
//nicht Löschen
|
||||||
}
|
}
|
||||||
@@ -244,7 +248,7 @@ public partial class StundeViewModel : ObservableObject, IQueryAttributable {
|
|||||||
var (list, settings) = await _hoursService.GetDayWithSettingsAsync(_date);
|
var (list, settings) = await _hoursService.GetDayWithSettingsAsync(_date);
|
||||||
UpdateSettingsAsync(settings);
|
UpdateSettingsAsync(settings);
|
||||||
DayTimes = list;
|
DayTimes = list;
|
||||||
|
OnPropertyChanged(nameof(DayTimes));
|
||||||
} 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
|
||||||
|
|||||||
Reference in New Issue
Block a user