@using Microsoft.AspNetCore.Components.Forms @inject CatalogApiClient Api @if (!string.IsNullOrWhiteSpace(errorMessage)) { } else if (!string.IsNullOrWhiteSpace(infoMessage)) { } @if (isLoading) {

Lade Daten...

} else if (items.Count == 0) {

Keine Einträge vorhanden.

} else {
@{ SetEditContext(editFormContext.EditContext); var editModel = (CatalogEditModel)editFormContext.EditModel; SetPopupHeaderText(editModel.IsNew); } @if (!editModel.IsNew) { }
} @code { private List items = new(); private bool isLoading; private string? errorMessage; private string? infoMessage; private EditContext? editContext; private ValidationMessageStore? validationMessageStore; private string popupHeaderText = "Edit"; private readonly List procedureOptions = new() { new() { Value = 0, Text = "PRTBMY_CATALOG_UPDATE" }, new() { Value = 1, Text = "PRTBMY_CATALOG_SAVE" } }; protected override async Task OnInitializedAsync() { await LoadCatalogs(); } private void SetEditContext(EditContext context) { if (editContext == context) { return; } if (editContext != null) { editContext.OnFieldChanged -= OnEditFieldChanged; } editContext = context; validationMessageStore = new ValidationMessageStore(editContext); editContext.OnFieldChanged += OnEditFieldChanged; } private void OnEditFieldChanged(object? sender, FieldChangedEventArgs e) { if (validationMessageStore == null || editContext == null) { return; } if (e.FieldIdentifier.FieldName == nameof(CatalogEditModel.UpdateProcedure)) { validationMessageStore.Clear(); editContext.NotifyValidationStateChanged(); return; } if (e.FieldIdentifier.FieldName == nameof(CatalogEditModel.CatTitle)) { var field = new FieldIdentifier(editContext.Model, nameof(CatalogEditModel.CatTitle)); validationMessageStore.Clear(field); editContext.NotifyValidationStateChanged(); } } private void SetPopupHeaderText(bool isNew) { popupHeaderText = isNew ? "Neu" : "Edit"; } private void OnCustomizeEditModel(GridCustomizeEditModelEventArgs e) { popupHeaderText = e.IsNew ? "Neu" : "Edit"; if (e.IsNew) { e.EditModel = new CatalogEditModel { IsNew = true }; return; } var item = (CatalogReadDto)e.DataItem; e.EditModel = new CatalogEditModel { Guid = item.Guid, CatTitle = item.CatTitle, CatString = item.CatString, UpdateProcedure = 0, OriginalCatTitle = item.CatTitle, IsNew = false }; } private async Task LoadCatalogs() { isLoading = true; errorMessage = null; try { items = await Api.GetAllAsync(); } catch (Exception ex) { errorMessage = $"Kataloge konnten nicht geladen werden: {ex.Message}"; } finally { isLoading = false; StateHasChanged(); } } private async Task OnEditModelSaving(GridEditModelSavingEventArgs e) { errorMessage = null; infoMessage = null; validationMessageStore?.Clear(); editContext?.NotifyValidationStateChanged(); var editModel = (CatalogEditModel)e.EditModel; if (!ValidateEditModel(editModel, e.IsNew)) { e.Cancel = true; return; } var dto = new CatalogWriteDto { CatTitle = editModel.CatTitle, CatString = editModel.CatString, UpdateProcedure = editModel.UpdateProcedure }; try { if (e.IsNew) { var created = await Api.CreateAsync(dto); if (!created.Success || created.Value == null) { if (!string.IsNullOrWhiteSpace(created.Error)) { AddValidationError(editModel, nameof(CatalogEditModel.CatTitle), created.Error); } else { errorMessage = "Anlegen fehlgeschlagen."; } e.Cancel = true; return; } infoMessage = "Katalog angelegt."; } else { var updated = await Api.UpdateAsync(editModel.Guid, dto); if (!updated.Success) { errorMessage = updated.Error ?? "Aktualisierung fehlgeschlagen."; e.Cancel = true; return; } infoMessage = "Katalog aktualisiert."; } await LoadCatalogs(); } catch (Exception ex) { errorMessage = $"Fehler beim Speichern: {ex.Message}"; e.Cancel = true; } } private void AddValidationError(CatalogEditModel editModel, string fieldName, string message) { if (editContext == null || validationMessageStore == null) { return; } var field = new FieldIdentifier(editModel, fieldName); validationMessageStore.Add(field, message); editContext.NotifyValidationStateChanged(); } private bool ValidateEditModel(CatalogEditModel editModel, bool isNew) { if (isNew) { return true; } if (editModel.UpdateProcedure == 0 && !string.Equals(editModel.CatTitle, editModel.OriginalCatTitle, StringComparison.OrdinalIgnoreCase)) { AddValidationError(editModel, nameof(CatalogEditModel.CatTitle), "Titel kann nicht geändert werden."); return false; } return true; } private async Task OnDataItemDeleting(GridDataItemDeletingEventArgs e) { errorMessage = null; infoMessage = null; var item = (CatalogReadDto)e.DataItem; try { var deleted = await Api.DeleteAsync(item.Guid); if (!deleted.Success) { errorMessage = deleted.Error ?? "Löschen fehlgeschlagen."; e.Cancel = true; return; } infoMessage = "Katalog gelöscht."; await LoadCatalogs(); } catch (Exception ex) { errorMessage = $"Fehler beim Löschen: {ex.Message}"; e.Cancel = true; } } private sealed class CatalogEditModel { public int Guid { get; set; } public string CatTitle { get; set; } = string.Empty; public string CatString { get; set; } = string.Empty; public int UpdateProcedure { get; set; } public string OriginalCatTitle { get; set; } = string.Empty; public bool IsNew { get; set; } } private sealed class ProcedureOption { public int Value { get; set; } public string Text { get; set; } = string.Empty; } }