Refactor grid logic into BandGridBase<TItem> base class
Move shared state and methods from CatalogsGrid and MassDataGrid into BandGridBase<TItem>. This centralizes edit context handling, validation, popup header logic, row editing/deleting, and layout feedback, reducing duplication and improving maintainability. Individual grid components now only override OnEditFieldChanged for custom validation.
This commit is contained in:
@@ -2,6 +2,7 @@
|
||||
using DbFirst.BlazorWebApp.Services;
|
||||
using DevExpress.Blazor;
|
||||
using Microsoft.AspNetCore.Components;
|
||||
using Microsoft.AspNetCore.Components.Forms;
|
||||
using Microsoft.AspNetCore.Components.Rendering;
|
||||
|
||||
namespace DbFirst.BlazorWebApp.Components;
|
||||
@@ -27,6 +28,15 @@ public abstract class BandGridBase<TItem> : ComponentBase
|
||||
protected SizeMode _sizeMode = SizeMode.Medium;
|
||||
protected static readonly List<SizeMode> _sizeModes = Enum.GetValues<SizeMode>().ToList();
|
||||
|
||||
protected string? errorMessage;
|
||||
protected string? infoMessage;
|
||||
protected bool isLoading;
|
||||
protected bool hasLoaded;
|
||||
protected EditContext? editContext;
|
||||
protected ValidationMessageStore? validationMessageStore;
|
||||
protected string popupHeaderText = "Edit";
|
||||
protected int _focusedVisibleIndex;
|
||||
|
||||
private const string LayoutType = "GRID_BANDS";
|
||||
|
||||
// --- Lifecycle ---
|
||||
@@ -216,4 +226,53 @@ public abstract class BandGridBase<TItem> : ComponentBase
|
||||
builder.AddAttribute(seq++, "ReadOnly", true);
|
||||
builder.CloseComponent();
|
||||
}
|
||||
|
||||
protected void SetEditContext(EditContext context)
|
||||
{
|
||||
if (editContext == context) return;
|
||||
if (editContext != null)
|
||||
editContext.OnFieldChanged -= OnEditFieldChanged;
|
||||
editContext = context;
|
||||
validationMessageStore = new ValidationMessageStore(editContext);
|
||||
editContext.OnFieldChanged += OnEditFieldChanged;
|
||||
}
|
||||
|
||||
protected virtual void OnEditFieldChanged(object? sender, FieldChangedEventArgs e)
|
||||
{
|
||||
validationMessageStore?.Clear();
|
||||
editContext?.NotifyValidationStateChanged();
|
||||
}
|
||||
|
||||
protected void SetPopupHeaderText(bool isNew) => popupHeaderText = isNew ? "Neu" : "Edit";
|
||||
|
||||
protected async Task EditFocusedRow()
|
||||
=> await gridRef!.StartEditRowAsync(_focusedVisibleIndex);
|
||||
|
||||
protected Task DeleteFocusedRow()
|
||||
{
|
||||
gridRef!.ShowRowDeleteConfirmation(_focusedVisibleIndex);
|
||||
return Task.CompletedTask;
|
||||
}
|
||||
|
||||
protected async Task SaveLayoutWithFeedbackAsync()
|
||||
{
|
||||
try
|
||||
{
|
||||
await SaveLayoutAsync();
|
||||
infoMessage = "Layout gespeichert.";
|
||||
errorMessage = null;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
errorMessage = $"Layout konnte nicht gespeichert werden: {ex.Message}";
|
||||
}
|
||||
}
|
||||
|
||||
protected async Task ResetLayoutWithFeedbackAsync()
|
||||
{
|
||||
await ResetLayoutAsync();
|
||||
infoMessage = "Layout zurückgesetzt.";
|
||||
errorMessage = null;
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user