diff --git a/AyCode.Blazor.Components/Components/Grids/MgGridBase.cs b/AyCode.Blazor.Components/Components/Grids/MgGridBase.cs index 8aee83b..8844764 100644 --- a/AyCode.Blazor.Components/Components/Grids/MgGridBase.cs +++ b/AyCode.Blazor.Components/Components/Grids/MgGridBase.cs @@ -9,6 +9,7 @@ using AyCode.Utils.Extensions; using DevExpress.Blazor; using Microsoft.AspNetCore.Components; using System.ComponentModel; +using System.Reflection; namespace AyCode.Blazor.Components.Components.Grids; @@ -18,14 +19,17 @@ public interface IMgGridBase : IGrid } public abstract class MgGridBase : DxGrid, IMgGridBase - where TSignalRDataSource : AcSignalRDataSource> - where TDataItem : class, IId - where TId : struct + where TSignalRDataSource : AcSignalRDataSource> + where TDataItem : class, IId + where TId : struct where TLoggerClient : AcLoggerBase { - private readonly EqualityComparer _equalityComparer = EqualityComparer.Default; + private readonly EqualityComparer _equalityComparerId = EqualityComparer.Default; + private readonly TypeConverter _typeConverterId = TypeDescriptor.GetConverter(typeof(TId)); protected bool IsFirstInitializeParameters; + protected bool IsFirstInitializeParameterCore; + private TSignalRDataSource _dataSource = null!; private List _dataSourceParam = []; private string _gridLogName; @@ -34,13 +38,19 @@ public abstract class MgGridBase !_equalityComparer.Equals(dataItem.Id, default);//dataItem.Id.IsNullOrEmpty(); - protected bool IdEquals(TId id1, TId id2) => _equalityComparer.Equals(id1, id2); + protected bool HasIdValue(TDataItem dataItem) => HasIdValue(dataItem.Id); + protected bool HasIdValue(TId id) => !_equalityComparerId.Equals(id, default); + protected bool IdEquals(TId id1, TId id2) => _equalityComparerId.Equals(id1, id2); [Parameter] public TLoggerClient Logger { get; set; } [Parameter] public string GridName { get; set; } + [Parameter] public IId? ParentDataItem { get; set; } + [Parameter] public string? KeyFieldNameToParentId { get; set; } [Parameter] public object[]? ContextIds { get; set; } + public bool IsMasterGrid => ParentDataItem == null; + protected PropertyInfo? KeyFieldPropertyInfoToParent; + private string? _filterText = null; [Parameter] @@ -73,6 +83,12 @@ public abstract class MgGridBase EditModelSaving { get; set; } [Parameter] public EventCallback OnGridEditModelSaving { get; set; } + protected new EventCallback EditStart { get; set; } + [Parameter] public EventCallback OnGridEditStart { get; set; } + + protected new EventCallback CustomizeEditModel { get; set; } + [Parameter] public EventCallback OnGridCustomizeEditModel { get; set; } + [Parameter] public EventCallback> OnDataSourceChanged { get; set; } [Parameter] public EventCallback> OnGridItemChanging { get; set; } @@ -101,7 +117,7 @@ public abstract class MgGridBase; - if (_dataSource != null!)// && _dataSourceParam is List workingReferenceList) + if (_dataSource != null!) // && _dataSourceParam is List workingReferenceList) _dataSource.SetWorkingReferenceList(_dataSourceParam); } } @@ -168,10 +184,18 @@ public abstract class MgGridBase typeof(TDataItem).GetProperty(propertyName); + + private async Task OnCustomizeEditModel(GridCustomizeEditModelEventArgs e) + { + var editModel = (e.EditModel as TDataItem)!; + + if (e.IsNew) + { + if (!HasIdValue(editModel)) SetNewId(editModel); + + if (ParentDataItem != null && !KeyFieldNameToParentId.IsNullOrWhiteSpace()) + { + KeyFieldPropertyInfoToParent ??= GetDataItemPropertyInfo(KeyFieldNameToParentId); + KeyFieldPropertyInfoToParent!.SetValue(editModel, ParentDataItem.Id); + } + + e.EditModel = editModel; + } + + await OnGridCustomizeEditModel.InvokeAsync(e); + } + + private async Task OnEditStart(GridEditStartEventArgs e) + { + var dataItem = (e.DataItem as TDataItem)!; + + await OnGridEditStart.InvokeAsync(e); + } + + //void Grid_CustomizeEditModel(GridCustomizeEditModelEventArgs e) + //{ + // var model = e.EditModel as EditableWorkOrder; + // if (model == null) + // { + // model = new EditableWorkOrder(); + + // model.WorkOrderNum = "123"; + // model.Description = "hey"; + + // e.EditModel = model; + // } + //} private async Task OnItemSaving(GridEditModelSavingEventArgs e) { var dataItem = (e.EditModel as TDataItem)!; - if (e.IsNew && !HasIdValue(dataItem)) SetNewId(dataItem); + if (e.IsNew) + { + if (!HasIdValue(dataItem)) SetNewId(dataItem); + + //if (ParentDataItem != null && !KeyFieldNameToParentId.IsNullOrWhiteSpace()) + //{ + // Type examType = typeof(TDataItem); + + // // Change the static property value. + // PropertyInfo piShared = examType.GetProperty(KeyFieldNameToParentId); + // piShared.SetValue(dataItem, ParentDataItem.Id); + //} + } var logText = e.IsNew ? "add" : "update"; Logger.Debug($"{_gridLogName} OnItemSaving {logText}; Id: {dataItem.Id}"); @@ -205,7 +298,11 @@ public abstract class MgGridBase.Default; @@ -277,15 +374,19 @@ public abstract class MgGridBase || typeof(TDataItem) is IId) KeyFieldName = "Id"; base.DataItemDeleting = EventCallback.Factory.Create(this, OnItemDeleting); base.EditModelSaving = EventCallback.Factory.Create(this, OnItemSaving); + base.CustomizeEditModel = EventCallback.Factory.Create(this, OnCustomizeEditModel); + base.EditStart = EventCallback.Factory.Create(this, OnEditStart); CustomizeElement += OnCustomizeElement; @@ -310,21 +411,22 @@ public abstract class MgGridBase PostDataToServerAsync(dataItem, messageTag, TrackingState.Add);