From df9e999a3417560e1d14addebd52df45074c9b64 Mon Sep 17 00:00:00 2001 From: DaPi Date: Thu, 26 Sep 2024 11:31:02 +0200 Subject: [PATCH] Save / Update / Delete Entrys --- .../Jugenddienst Stunden.csproj | 5 ++ Jugenddienst Stunden/Models/Auth.cs | 18 +++++ Jugenddienst Stunden/Models/Stunde.cs | 44 ++++++++++- Jugenddienst Stunden/Types/Hours.cs | 8 +- .../ViewModels/LoginViewModel.cs | 2 +- .../ViewModels/StundeViewModel.cs | 74 +++++++++++-------- .../ViewModels/StundenViewModel.cs | 14 +++- Jugenddienst Stunden/Views/LoginPage.xaml.cs | 2 + Jugenddienst Stunden/Views/StundePage.xaml | 10 +-- 9 files changed, 133 insertions(+), 44 deletions(-) diff --git a/Jugenddienst Stunden/Jugenddienst Stunden.csproj b/Jugenddienst Stunden/Jugenddienst Stunden.csproj index a6e7250..2367648 100644 --- a/Jugenddienst Stunden/Jugenddienst Stunden.csproj +++ b/Jugenddienst Stunden/Jugenddienst Stunden.csproj @@ -64,6 +64,7 @@ com.danielpichler.jugenddienststunden + True @@ -80,6 +81,10 @@ $(TargetFrameworks);net8.0-windows10.0.26100.0 + + True + + diff --git a/Jugenddienst Stunden/Models/Auth.cs b/Jugenddienst Stunden/Models/Auth.cs index aa47b8a..e32cbf0 100644 --- a/Jugenddienst Stunden/Models/Auth.cs +++ b/Jugenddienst Stunden/Models/Auth.cs @@ -70,6 +70,24 @@ namespace Jugenddienst_Stunden.Models { //} } + public static async Task DeleteItemAsync(string url, string token) { + //using (HttpClient client = new HttpClient() { Timeout = TimeSpan.FromSeconds(15) }) { + + try { + HttpClient client = new HttpClient(); + client.DefaultRequestHeaders.Add("Accept", "application/json"); + client.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", token); + + HttpResponseMessage response = await client.DeleteAsync(url); + + if (response.IsSuccessStatusCode) + Debug.WriteLine(@"\tTodoItem successfully deleted."); + } catch (Exception ex) { + Debug.WriteLine(@"\tERROR {0}", ex.Message); + } + //} + } + } } diff --git a/Jugenddienst Stunden/Models/Stunde.cs b/Jugenddienst Stunden/Models/Stunde.cs index dda98c9..68ff1cc 100644 --- a/Jugenddienst Stunden/Models/Stunde.cs +++ b/Jugenddienst Stunden/Models/Stunde.cs @@ -24,8 +24,9 @@ namespace Jugenddienst_Stunden.Models { //Christine Feichter public static string apiKey = Preferences.Default.Get("apiKey", "MTQzfEFlMVRjQXdZMnI4RmpxZ0FSY3A0VEN2bVZYVXxodHRwOi8vaG91cnMuZGF1bmkubWluZS5udTo4MS9hcHBhcGk="); - public static string name = Preferences.Default.Get("name", "Christine"); - public static string surname = Preferences.Default.Get("surname", "Feichter"); + public static int EmployeeId = Preferences.Default.Get("employeeId", 0); + public static string name = Preferences.Default.Get("name", "Vorname"); + public static string surname = Preferences.Default.Get("surname", "Nachname"); public static string apiUrl = Preferences.Default.Get("apiUrl", "https://"); //Damian @@ -71,6 +72,32 @@ namespace Jugenddienst_Stunden.Models { return hours; } + public static async Task LoadBasicData() { + + + Hours hours = new Hours(); + + if (Connectivity.Current.NetworkAccess == NetworkAccess.None) { + await App.Current.MainPage.DisplayAlert("Keine Internetverbindung", + "Bitte überprüfen Sie Ihre Internetverbindung und versuchen Sie es erneut.", + "OK"); + } else { + var tokendata = new TokenData(apiKey); + + string data = await Auth.GetApiDataWithAuthAsync(tokendata.url + "?basic", tokendata.apiKey); + + if (data == "null") { + throw new Exception("Keine Daten erhalten"); + } + if (data == "\"Lalala\"") { + throw new Exception("Problem mit Token"); + } + + hours = JsonConvert.DeserializeObject(data); + + } + return hours; + } public static async Task> LoadDay(DateTime date) { @@ -134,7 +161,18 @@ namespace Jugenddienst_Stunden.Models { public static async Task SaveEntry(DayTime stunde) { //, string begin, string end, string freistellung, string bemerkung) { var tokendata = new TokenData(apiKey); - await Auth.SaveItemAsync(tokendata.url, tokendata.apiKey, stunde,false); + bool isNew = false; + if (stunde.id == null) + isNew = true; + await Auth.SaveItemAsync(tokendata.url, tokendata.apiKey, stunde, isNew); + + return stunde; + } + + public static async Task DeleteEntry(DayTime stunde) { //, string begin, string end, string freistellung, string bemerkung) { + + var tokendata = new TokenData(apiKey); + await Auth.DeleteItemAsync(tokendata.url + "/entry/" + stunde.id, tokendata.apiKey); return stunde; } diff --git a/Jugenddienst Stunden/Types/Hours.cs b/Jugenddienst Stunden/Types/Hours.cs index 87d0d4a..9009063 100644 --- a/Jugenddienst Stunden/Types/Hours.cs +++ b/Jugenddienst Stunden/Types/Hours.cs @@ -2,6 +2,7 @@ using CommunityToolkit.Mvvm.ComponentModel; using Jugenddienst_Stunden.Models; using Newtonsoft.Json; +using System.Collections.ObjectModel; namespace Jugenddienst_Stunden.Types { @@ -17,9 +18,9 @@ namespace Jugenddienst_Stunden.Types public string zeit_total; //https://stackoverflow.com/questions/29449641/deserialize-json-when-a-value-can-be-an-object-or-an-empty-array/29450279#29450279 - //[JsonConverter(typeof(JsonSingleOrEmptyArrayConverter))] //public Dictionary zeit_total_daily; + public List zeit_total_daily_api; public List daytime; //public List wochensumme; @@ -38,6 +39,9 @@ namespace Jugenddienst_Stunden.Types public DateTime Date; public DateTime MinDate; public DateTime MaxDate; + public Collection Projekte { get; set; } + public Collection Gemeinden { get; set; } + public int EmployeeId { get; set; } - } + } } diff --git a/Jugenddienst Stunden/ViewModels/LoginViewModel.cs b/Jugenddienst Stunden/ViewModels/LoginViewModel.cs index 6d9eb3a..cc65d8d 100644 --- a/Jugenddienst Stunden/ViewModels/LoginViewModel.cs +++ b/Jugenddienst Stunden/ViewModels/LoginViewModel.cs @@ -11,7 +11,7 @@ namespace Jugenddienst_Stunden.ViewModels { public string Message => "Scanne den QR-Code von deinem Benutzerprofil auf der Stundenseite."; - public string Server { get; set; } = "Server: " + Preferences.Default.Get("apiUrl", "https://"); + public string Server { get; set; } = "Server: " + Preferences.Default.Get("apiUrl", "https://").Replace("/appapi",""); public string Title { get; set; } = Preferences.Default.Get("name", "") + " " + Preferences.Default.Get("surname", ""); diff --git a/Jugenddienst Stunden/ViewModels/StundeViewModel.cs b/Jugenddienst Stunden/ViewModels/StundeViewModel.cs index 9b20330..40347fc 100644 --- a/Jugenddienst Stunden/ViewModels/StundeViewModel.cs +++ b/Jugenddienst Stunden/ViewModels/StundeViewModel.cs @@ -22,6 +22,7 @@ namespace Jugenddienst_Stunden.ViewModels { public DayTime Stunde { get => _stunde; } + public event EventHandler AlertEvent; public ObservableCollection OptionsGemeinde { get; private set; } @@ -63,38 +64,25 @@ namespace Jugenddienst_Stunden.ViewModels { } } - - //public TimeSpan Von { - // get => _stunde.begin.ToTimeSpan(); - // set { - // if (_stunde.begin.ToTimeSpan() != value) { - // _stunde.begin = TimeOnly.FromTimeSpan(value); - // OnPropertyChanged(nameof(Von)); - // } - // } - //} - //public TimeSpan Bis { - // get => _stunde.end.ToTimeSpan(); - // set { - // if (_stunde.end.ToTimeSpan() != value) { - // _stunde.end = TimeOnly.FromTimeSpan(value); - // OnPropertyChanged(nameof(Bis)); - // } - // } - //} + public Collection Projekte { get; set; } + public Collection Gemeinden { get; set; } - public ICommand SaveCommand { get; private set; } public ICommand DeleteCommand { get; private set; } + //public ICommand LoadDataCommand { get; private set; } public StundeViewModel() { _stunde = new DayTime(); + //_stunde.EmployeeId = Preferences.Default.Get("employeeId", 0); + + //LoadDataCommand = new AsyncRelayCommand(LoadData); + SaveCommand = new AsyncRelayCommand(Save); - //DeleteCommand = new AsyncRelayCommand(Delete); + DeleteCommand = new AsyncRelayCommand(Delete); OptionsFreistellung = new ObservableCollection { "Keine", @@ -102,30 +90,50 @@ namespace Jugenddienst_Stunden.ViewModels { "Krankheit", "Elternzeit" }; + + _ = LoadData(); } public StundeViewModel(DayTime stunde) { _stunde = stunde; SaveCommand = new AsyncRelayCommand(Save); - //DeleteCommand = new AsyncRelayCommand(Delete); + DeleteCommand = new AsyncRelayCommand(Delete); + } + + private async Task LoadData() { + try { + Hours _hours = await Models.Stunde.LoadBasicData(); + OptionsProjekt = new ObservableCollection(_hours.Projekte); + OptionsGemeinde = new ObservableCollection(_hours.Gemeinden); + OnPropertyChanged(nameof(OptionsGemeinde)); + OnPropertyChanged(nameof(OptionsProjekt)); + _stunde.EmployeeId = _hours.EmployeeId; + } catch (Exception e) { + AlertEvent?.Invoke(this, e.Message); + } } async Task Save() { await Models.Stunde.SaveEntry(_stunde); - await Shell.Current.GoToAsync($"..?saved={_stunde.id}"); + if (_stunde.id != null) { + await Shell.Current.GoToAsync($"..?saved={_stunde.id}"); + } else { + await Shell.Current.GoToAsync($"..?date={_stunde.day.ToString("yyyy-MM-dd")}"); + } } - //private async Task Delete() { - // _stunde.Delete(); - // await Shell.Current.GoToAsync($"..?deleted={_stunde.Filename}"); - //} + private async Task Delete() { + await Models.Stunde.DeleteEntry(_stunde); + await Shell.Current.GoToAsync($"..?date={_stunde.day.ToString("yyyy-MM-dd")}"); + } + + - - async void IQueryAttributable.ApplyQueryAttributes(IDictionary query) { if (query.ContainsKey("load")) { + //DateTime heute = DateTime.Now; _stunde = await Models.Stunde.LoadEntry(Convert.ToInt32(query["load"])); if (String.IsNullOrEmpty(_stunde.description)) { @@ -151,8 +159,14 @@ namespace Jugenddienst_Stunden.ViewModels { OnPropertyChanged(nameof(SubTitle)); } + if (query.ContainsKey("date")) { + SubTitle = DateTime.ParseExact((string)query["date"], "yyyy-MM-dd", System.Globalization.CultureInfo.InvariantCulture).ToString("dddd, d. MMM. yyyy"); + _stunde.day = DateTime.ParseExact((string)query["date"], "yyyy-MM-dd", System.Globalization.CultureInfo.InvariantCulture); + OnPropertyChanged(nameof(SubTitle)); + } + } - + } } diff --git a/Jugenddienst Stunden/ViewModels/StundenViewModel.cs b/Jugenddienst Stunden/ViewModels/StundenViewModel.cs index ab7fd26..39194db 100644 --- a/Jugenddienst Stunden/ViewModels/StundenViewModel.cs +++ b/Jugenddienst Stunden/ViewModels/StundenViewModel.cs @@ -7,15 +7,16 @@ using ZXing.Net.Maui; using System.Collections.ObjectModel; using System.ComponentModel; using Jugenddienst_Stunden.Types; +using System.Globalization; namespace Jugenddienst_Stunden.ViewModels { - internal class StundenViewModel : ObservableObject { + internal class StundenViewModel : ObservableObject, IQueryAttributable { public string Name => AppInfo.Name; public string Surname => AppInfo.VersionString; public string MoreInfoUrl => "https://aka.ms/maui"; public string Message => "Hier werden deine geleisteten Arbeitsstunden aufgelistet"; - public string LoadOverview => "Zeige Summen für " + DateTime.Today.ToString("MMMM"); + public string LoadOverview => "Lade Summen für " + DateTime.Today.ToString("MMMM"); public static DateTime GetDay = DateTime.Today; public string ShowDay => "Zeit an Tag " + GetDay.ToString("ddd d. MMM") + ": "; @@ -125,7 +126,8 @@ namespace Jugenddienst_Stunden.ViewModels { private async Task NewEntryAsync() { //Hier muss das Datum übergeben werden - await Shell.Current.GoToAsync(nameof(Views.StundePage)); + //await Shell.Current.GoToAsync(nameof(Views.StundePage)); + await Shell.Current.GoToAsync($"{nameof(Views.StundePage)}?date={dateToday.ToString("yyyy-MM-dd")}"); } private async Task SelectEntryAsync(DayTime entry) { @@ -174,6 +176,12 @@ namespace Jugenddienst_Stunden.ViewModels { } } + async void IQueryAttributable.ApplyQueryAttributes(IDictionary query) { + if (query.ContainsKey("date")) { + await LoadDay(Convert.ToDateTime(query["date"])); + } + } + private void RefreshProperties() { OnPropertyChanged(nameof(Nominal)); OnPropertyChanged(nameof(Overtime)); diff --git a/Jugenddienst Stunden/Views/LoginPage.xaml.cs b/Jugenddienst Stunden/Views/LoginPage.xaml.cs index aa7a4fd..588553c 100644 --- a/Jugenddienst Stunden/Views/LoginPage.xaml.cs +++ b/Jugenddienst Stunden/Views/LoginPage.xaml.cs @@ -39,11 +39,13 @@ public partial class LoginPage : ContentPage { Models.Stunde.apiKey = barcode.Value; Models.Stunde.name = op.name; Models.Stunde.surname = op.surname; + Models.Stunde.EmployeeId = int.Parse(op.id); Title = op.name + " " + op.surname; Preferences.Default.Set("apiKey", barcode.Value); Preferences.Default.Set("name", op.name); Preferences.Default.Set("surname", op.surname); + Preferences.Default.Set("EmployeeId", int.Parse(op.id)); //Preferences.Default.Set("apiUrl", Pre); _loginViewModel.Server = Preferences.Default.Get("apiUrl", ""); diff --git a/Jugenddienst Stunden/Views/StundePage.xaml b/Jugenddienst Stunden/Views/StundePage.xaml index df49027..49c7fef 100644 --- a/Jugenddienst Stunden/Views/StundePage.xaml +++ b/Jugenddienst Stunden/Views/StundePage.xaml @@ -16,14 +16,14 @@ - - + + - - + + @@ -43,7 +43,7 @@