Beachte die Einstellung ob Projekte und Gemeinden aktiv sind. Verbiete Änderungen an der Freistellung, wenn sie genehmigt wurde. Vereinfache das Speichern der Einstellungen Bessere Fehlerbehandlung, einheitlichere API
259 lines
8.6 KiB
C#
259 lines
8.6 KiB
C#
using CommunityToolkit.Mvvm.ComponentModel;
|
|
using CommunityToolkit.Mvvm.Input;
|
|
using Jugenddienst_Stunden.Models;
|
|
using Jugenddienst_Stunden.Types;
|
|
using System.Windows.Input;
|
|
using static System.Runtime.InteropServices.JavaScript.JSType;
|
|
|
|
namespace Jugenddienst_Stunden.ViewModels;
|
|
/// <summary>
|
|
/// Viewmodel für die einzelnen Stundeneinträge / Bearbeitung
|
|
/// </summary>
|
|
public class StundeViewModel : ObservableObject, IQueryAttributable {
|
|
|
|
public int Id { get; set; }
|
|
public string Title { get; set; } = "Eintrag bearbeiten";
|
|
public string SubTitle { get; set; } = DateTime.Today.ToString("dddd, d. MMMM yyyy");
|
|
|
|
//private HoursBase HoursBase = new HoursBase();
|
|
internal Settings Settings = new Settings();
|
|
|
|
public event EventHandler<string> AlertEvent;
|
|
public event EventHandler<string> InfoEvent;
|
|
public event Func<string, string, Task<bool>> ConfirmEvent;
|
|
|
|
/// <summary>
|
|
/// Gemeinden für die Auswahlliste
|
|
/// </summary>
|
|
public List<Gemeinde> OptionsGemeinde { get; private set; }
|
|
|
|
/// <summary>
|
|
/// Projekte für die Auswahlliste
|
|
/// </summary>
|
|
public List<Projekt> OptionsProjekt { get; private set; }
|
|
|
|
/// <summary>
|
|
/// Freistellungen für die Auswahlliste
|
|
/// </summary>
|
|
public List<Freistellung> OptionsFreistellung { get; private set; }
|
|
|
|
/// <summary>
|
|
/// Vorhandene Zeiten anzeigen, wenn neuer Eintrag erstellt wird
|
|
/// </summary>
|
|
public List<DayTime> DayTimes { get; set; }
|
|
|
|
private DayTime _dayTime;
|
|
/// <summary>
|
|
/// Aktueller Stundeneintrag
|
|
/// </summary>
|
|
public DayTime DayTime {
|
|
get => _dayTime;
|
|
set {
|
|
if (_dayTime != value) {
|
|
_dayTime = value;
|
|
|
|
}
|
|
OnPropertyChanged(nameof(DayTime));
|
|
}
|
|
}
|
|
|
|
|
|
|
|
/// <summary>
|
|
/// Dürfen Gemeinden verwendet werden?
|
|
/// </summary>
|
|
public bool GemeindeAktivSet { get; set; }
|
|
|
|
/// <summary>
|
|
/// Dürfen Projekte verwendet werden?
|
|
/// </summary>
|
|
public bool ProjektAktivSet { get; set; }
|
|
|
|
public bool FreistellungEnabled { get; set; }
|
|
|
|
|
|
|
|
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();
|
|
|
|
OptionsGemeinde = Settings.Gemeinden;
|
|
OptionsProjekt = Settings.Projekte;
|
|
OptionsFreistellung = Settings.Freistellungen;
|
|
|
|
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() {
|
|
bool exceptionOccurred = false;
|
|
try {
|
|
await HoursBase.SaveEntry(DayTime);
|
|
} catch (Exception e) {
|
|
AlertEvent?.Invoke(this, e.Message);
|
|
exceptionOccurred = true;
|
|
}
|
|
if (!exceptionOccurred) {
|
|
if (DayTime.Id != null) {
|
|
await Shell.Current.GoToAsync($"..?saved={DayTime.Id}");
|
|
} else {
|
|
await Shell.Current.GoToAsync($"..?date={DayTime.Day.ToString("yyyy-MM-dd")}");
|
|
}
|
|
}
|
|
}
|
|
|
|
private async Task Delete() {
|
|
await HoursBase.DeleteEntry(DayTime);
|
|
await Shell.Current.GoToAsync($"..?date={DayTime.Day.ToString("yyyy-MM-dd")}");
|
|
}
|
|
|
|
private async Task DeleteConfirm() {
|
|
if (ConfirmEvent != null) {
|
|
bool answer = await ConfirmEvent.Invoke("Achtung", "Löschen kann nicht ungeschehen gemacht werden. Fortfahren?");
|
|
if (answer) {
|
|
//Löschen
|
|
await HoursBase.DeleteEntry(DayTime);
|
|
await Shell.Current.GoToAsync($"..?date={DayTime.Day.ToString("yyyy-MM-dd")}");
|
|
} else {
|
|
//nicht Löschen
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
/// Anwenden der Query-Parameter
|
|
/// </summary>
|
|
async void IQueryAttributable.ApplyQueryAttributes(IDictionary<string, object> 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;
|
|
|
|
GemeindeAktivSet = dat.settings.GemeindeAktivSet;
|
|
ProjektAktivSet = dat.settings.ProjektAktivSet;
|
|
|
|
GlobalVar.Settings = dat.settings;
|
|
|
|
|
|
} catch (Exception e) {
|
|
AlertEvent?.Invoke(this, e.Message);
|
|
}
|
|
|
|
if (System.String.IsNullOrEmpty(DayTime.Description)) {
|
|
AlertEvent?.Invoke(this, "Eintrag hat keinen Beschreibungstext");
|
|
}
|
|
SubTitle = DayTime.Day.ToString("dddd, d. MMMM yyyy");
|
|
|
|
|
|
_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")) {
|
|
Title = "Neuer Eintrag";
|
|
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"));
|
|
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.Day = _date;
|
|
SubTitle = _date.ToString("dddd, d. MMMM yyyy");
|
|
FreistellungEnabled = true;
|
|
DayTime.EmployeeId = GlobalVar.EmployeeId;
|
|
}
|
|
|
|
|
|
}
|
|
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));
|
|
|
|
}
|
|
|
|
|
|
}
|