Add logger support to grids, data sources, and helpers
- Added optional logger to TaskHelper.Forget for fire-and-forget error logging - Updated MgGridBase and data sources to accept and use logger instances - Refactored AcSignalRDataSource to log deserialization faults - Modified constructors and usages of SignalRDataSourceList/Observable for logger injection - Added CountryCode to CargoTruck and displayed in new GridCargoTruck - Introduced GridCargoTruck.razor and base class with logger integration - Updated GridCargoPartner to use new cargo truck grid as detail row - Improved code style and ensured consistent error handling throughout
This commit is contained in:
parent
41ccb10ef7
commit
3e4d3260f0
|
|
@ -17,4 +17,5 @@ public sealed class CargoPartner : PartnerBase, ICargoPartner
|
||||||
|
|
||||||
//[Association(ThisKey = nameof(Id), OtherKey = nameof(Shipping.CargoPartnerId), CanBeNull = true)]
|
//[Association(ThisKey = nameof(Id), OtherKey = nameof(Shipping.CargoPartnerId), CanBeNull = true)]
|
||||||
public List<Shipping>? Shippings { get; set; }
|
public List<Shipping>? Shippings { get; set; }
|
||||||
|
//public decimal DecProp{get; set; }
|
||||||
}
|
}
|
||||||
|
|
@ -11,5 +11,7 @@ namespace FruitBank.Common.Entities;
|
||||||
public sealed class CargoTruck: MgEntityBase//, ICargoPartner
|
public sealed class CargoTruck: MgEntityBase//, ICargoPartner
|
||||||
{
|
{
|
||||||
public int CargoPartnerId { get; set; }
|
public int CargoPartnerId { get; set; }
|
||||||
|
public string CountryCode { get; set; }
|
||||||
public string LicencePlate { get; set; }
|
public string LicencePlate { get; set; }
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -276,15 +276,13 @@
|
||||||
|
|
||||||
private async Task Callback(ToolbarItemClickEventArgs obj)
|
private async Task Callback(ToolbarItemClickEventArgs obj)
|
||||||
{
|
{
|
||||||
if (windowVisible)
|
if (windowVisible) await windowRef.CloseAsync();
|
||||||
await windowRef.CloseAsync();
|
else await windowRef.ShowAsync();
|
||||||
else
|
|
||||||
await windowRef.ShowAsync();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void Callback2(WindowClosingEventArgs obj)
|
private void Callback2(WindowClosingEventArgs obj)
|
||||||
{
|
{
|
||||||
ReloadDataFromDb(true).Forget();
|
ReloadDataFromDb(true).Forget(_logger);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -29,7 +29,7 @@
|
||||||
<DxGridDataColumn FieldName="Name" />
|
<DxGridDataColumn FieldName="Name" />
|
||||||
<DxGridDataColumn FieldName="TaxId" />
|
<DxGridDataColumn FieldName="TaxId" />
|
||||||
<DxGridDataColumn FieldName="CertificationNumber" />
|
<DxGridDataColumn FieldName="CertificationNumber" />
|
||||||
<DxGridDataColumn FieldName="@nameof(Partner.CountryCode)" />
|
<DxGridDataColumn FieldName="@nameof(CargoPartner.CountryCode)" />
|
||||||
<DxGridDataColumn FieldName="PostalCode" />
|
<DxGridDataColumn FieldName="PostalCode" />
|
||||||
<DxGridDataColumn FieldName="@nameof(CargoPartner.Country)" />
|
<DxGridDataColumn FieldName="@nameof(CargoPartner.Country)" />
|
||||||
<DxGridDataColumn FieldName="State" />
|
<DxGridDataColumn FieldName="State" />
|
||||||
|
|
@ -41,7 +41,7 @@
|
||||||
<DxGridDataColumn FieldName="Modified" ReadOnly="true" />
|
<DxGridDataColumn FieldName="Modified" ReadOnly="true" />
|
||||||
<DxGridCommandColumn Visible="!IsMasterGrid" Width="120"></DxGridCommandColumn>
|
<DxGridCommandColumn Visible="!IsMasterGrid" Width="120"></DxGridCommandColumn>
|
||||||
</Columns>
|
</Columns>
|
||||||
<DetailRowTemplate>
|
<DetailRowTemplate>
|
||||||
@if (IsMasterGrid)
|
@if (IsMasterGrid)
|
||||||
{
|
{
|
||||||
var partner = ((CargoPartner)context.DataItem);
|
var partner = ((CargoPartner)context.DataItem);
|
||||||
|
|
@ -51,8 +51,8 @@
|
||||||
<DxTabs>
|
<DxTabs>
|
||||||
<DxTabPage Text="Kamionok">
|
<DxTabPage Text="Kamionok">
|
||||||
@{
|
@{
|
||||||
// var observableShippingDocuments = new AcObservableCollection<CargoTruck>(cargoTrucks);
|
var observableShippingDocuments = new AcObservableCollection<CargoTruck>(cargoTrucks);
|
||||||
// <GridShippingDocument ShippingDocuments="@observableShippingDocuments" ParentDataItem="@partner" Partners="@Partners" IsMasterGrid="false"></GridShippingDocument>
|
<GridCargoTruck ParentDataItem="@partner" CargoTrucks="@observableShippingDocuments"></GridCargoTruck>
|
||||||
}
|
}
|
||||||
</DxTabPage>
|
</DxTabPage>
|
||||||
|
|
||||||
|
|
@ -66,13 +66,13 @@
|
||||||
}
|
}
|
||||||
</DetailRowTemplate>
|
</DetailRowTemplate>
|
||||||
<ToolbarTemplate>
|
<ToolbarTemplate>
|
||||||
@if (IsMasterGrid)
|
@if (IsMasterGrid)
|
||||||
{
|
{
|
||||||
<MgGridToolbarTemplate Grid="Grid" OnReloadDataClick="() => ReloadDataFromDb(true)" />
|
<MgGridToolbarTemplate Grid="Grid" OnReloadDataClick="() => ReloadDataFromDb(true)" />
|
||||||
}
|
}
|
||||||
</ToolbarTemplate>
|
</ToolbarTemplate>
|
||||||
</GridCargoPartnerBase>
|
</GridCargoPartnerBase>
|
||||||
</GridContent>
|
</GridContent>
|
||||||
</MgGridWithInfoPanel>
|
</MgGridWithInfoPanel>
|
||||||
|
|
||||||
@code {
|
@code {
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,99 @@
|
||||||
|
@using System.Collections.ObjectModel
|
||||||
|
@using AyCode.Blazor.Components.Components.Grids
|
||||||
|
@using AyCode.Core.Helpers
|
||||||
|
@using AyCode.Core.Interfaces
|
||||||
|
@using AyCode.Core.Loggers
|
||||||
|
@using AyCode.Utils.Extensions
|
||||||
|
@using FruitBank.Common.Dtos
|
||||||
|
@using FruitBank.Common.Entities
|
||||||
|
@using FruitBankHybrid.Shared.Components.Grids.Shippings
|
||||||
|
@using FruitBankHybrid.Shared.Databases
|
||||||
|
@using FruitBankHybrid.Shared.Services.Loggers
|
||||||
|
@using FruitBankHybrid.Shared.Services.SignalRs
|
||||||
|
|
||||||
|
@inject IEnumerable<IAcLogWriterClientBase> LogWriters
|
||||||
|
@inject FruitBankSignalRClient FruitBankSignalRClient
|
||||||
|
|
||||||
|
<MgGridWithInfoPanel ShowInfoPanel="@IsMasterGrid">
|
||||||
|
<GridContent>
|
||||||
|
<GridCargoTruckBase @ref="Grid"
|
||||||
|
DataSource="CargoTrucks"
|
||||||
|
ParentDataItem="ParentDataItem"
|
||||||
|
AutoSaveLayoutName="GridCargoTruck"
|
||||||
|
SignalRClient="FruitBankSignalRClient"
|
||||||
|
Logger="_logger"
|
||||||
|
CssClass="@GridCss"
|
||||||
|
ValidationEnabled="false"
|
||||||
|
OnGridFocusedRowChanged="Grid_FocusedRowChanged">
|
||||||
|
<Columns>
|
||||||
|
<DxGridDataColumn FieldName="Id" SortIndex="0" SortOrder="GridColumnSortOrder.Descending" ReadOnly="true" />
|
||||||
|
|
||||||
|
<DxGridDataColumn FieldName="@nameof(CargoTruck.LicencePlate)" />
|
||||||
|
<DxGridDataColumn FieldName="@nameof(CargoTruck.CountryCode)" />
|
||||||
|
|
||||||
|
<DxGridDataColumn FieldName="Created" ReadOnly="true" />
|
||||||
|
<DxGridDataColumn FieldName="Modified" ReadOnly="true" />
|
||||||
|
<DxGridCommandColumn Visible="!IsMasterGrid" Width="120"></DxGridCommandColumn>
|
||||||
|
</Columns>
|
||||||
|
<ToolbarTemplate>
|
||||||
|
@if (IsMasterGrid)
|
||||||
|
{
|
||||||
|
<MgGridToolbarTemplate Grid="Grid" OnReloadDataClick="() => ReloadDataFromDb(true)" />
|
||||||
|
}
|
||||||
|
</ToolbarTemplate>
|
||||||
|
</GridCargoTruckBase>
|
||||||
|
</GridContent>
|
||||||
|
</MgGridWithInfoPanel>
|
||||||
|
|
||||||
|
@code {
|
||||||
|
//[Inject] public required ObjectLock ObjectLock { get; set; }
|
||||||
|
[Inject] public required DatabaseClient Database { get; set; }
|
||||||
|
|
||||||
|
[Parameter] public AcObservableCollection<CargoTruck>? CargoTrucks { get; set; }
|
||||||
|
|
||||||
|
const string ExportFileName = "ExportResult";
|
||||||
|
string GridSearchText = "";
|
||||||
|
bool EditItemsEnabled { get; set; }
|
||||||
|
int FocusedRowVisibleIndex { get; set; }
|
||||||
|
public GridCargoTruckBase Grid { get; set; }
|
||||||
|
string GridCss => !IsMasterGrid ? "hide-toolbar" : string.Empty;
|
||||||
|
|
||||||
|
[Parameter] public IId<int>? ParentDataItem { get; set; }
|
||||||
|
|
||||||
|
public bool IsMasterGrid => ParentDataItem == null;
|
||||||
|
public bool ParentDataItemIsCargoPartner => (ParentDataItem is CargoPartner);
|
||||||
|
|
||||||
|
|
||||||
|
private int _activeTabIndex;
|
||||||
|
private LoggerClient<GridCargoTruck> _logger;
|
||||||
|
|
||||||
|
protected override async Task OnInitializedAsync()
|
||||||
|
{
|
||||||
|
_logger = new LoggerClient<GridCargoTruck>(LogWriters.ToArray());
|
||||||
|
await ReloadDataFromDb(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
private async Task ReloadDataFromDb(bool forceReload = false)
|
||||||
|
{
|
||||||
|
if (!IsMasterGrid) return;
|
||||||
|
|
||||||
|
if (Grid == null) return;
|
||||||
|
|
||||||
|
using (await ObjectLock.GetSemaphore<CargoTruck>().UseWaitAsync())
|
||||||
|
if (forceReload) await Grid.ReloadDataSourceAsync();
|
||||||
|
|
||||||
|
if (forceReload) Grid.Reload();
|
||||||
|
}
|
||||||
|
|
||||||
|
async Task Grid_FocusedRowChanged(GridFocusedRowChangedEventArgs args)
|
||||||
|
{
|
||||||
|
if (Grid == null) return;
|
||||||
|
|
||||||
|
if (Grid.IsEditing() && !Grid.IsEditingNewRow())
|
||||||
|
await Grid.SaveChangesAsync();
|
||||||
|
|
||||||
|
FocusedRowVisibleIndex = args.VisibleIndex;
|
||||||
|
EditItemsEnabled = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
@ -0,0 +1,85 @@
|
||||||
|
using AyCode.Core.Interfaces;
|
||||||
|
using AyCode.Utils.Extensions;
|
||||||
|
using DevExpress.Blazor;
|
||||||
|
using FruitBank.Common.Entities;
|
||||||
|
using FruitBank.Common.Interfaces;
|
||||||
|
using FruitBank.Common.SignalRs;
|
||||||
|
using FruitBankHybrid.Shared.Pages;
|
||||||
|
using Microsoft.AspNetCore.Components;
|
||||||
|
|
||||||
|
namespace FruitBankHybrid.Shared.Components.Grids.Cargos;
|
||||||
|
|
||||||
|
public class GridCargoTruckBase: FruitBankGridBase<CargoTruck>, IGrid
|
||||||
|
{
|
||||||
|
private bool _isFirstInitializeParameterCore;
|
||||||
|
private bool _isFirstInitializeParameters;
|
||||||
|
|
||||||
|
public GridCargoTruckBase() : base()
|
||||||
|
{
|
||||||
|
//GetAllMessageTag = SignalRTags.GetCargoTrucks;
|
||||||
|
AddMessageTag = SignalRTags.AddCargoTruck;
|
||||||
|
UpdateMessageTag = SignalRTags.UpdateCargoTruck;
|
||||||
|
|
||||||
|
//RemoveMessageTag = SignalRTags.;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override async Task OnInitializedAsync()
|
||||||
|
{
|
||||||
|
if (GetAllMessageTag > 0) return;
|
||||||
|
|
||||||
|
if (IsMasterGrid) GetAllMessageTag = SignalRTags.GetCargoTrucks;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (ContextIds == null || ContextIds.Length == 0) ContextIds = [ParentDataItem!.Id];
|
||||||
|
|
||||||
|
switch (ParentDataItem)
|
||||||
|
{
|
||||||
|
case ICargoPartner:
|
||||||
|
GetAllMessageTag = SignalRTags.GetCargoTrucks;
|
||||||
|
if (KeyFieldNameToParentId.IsNullOrWhiteSpace()) KeyFieldNameToParentId = nameof(CargoTruck.CargoPartnerId);
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
await base.OnInitializedAsync();
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override void OnParametersSet()
|
||||||
|
{
|
||||||
|
base.OnParametersSet();
|
||||||
|
|
||||||
|
if (!_isFirstInitializeParameters)
|
||||||
|
{
|
||||||
|
//if (!IsMasterGrid && (ContextIds == null || ContextIds.Length == 0))
|
||||||
|
//{
|
||||||
|
// ContextIds = [ParentDataItem!.Id];
|
||||||
|
// GetAllMessageTag = SignalRTags.GetShippingItemsByDocumentId;
|
||||||
|
//}
|
||||||
|
|
||||||
|
_isFirstInitializeParameters = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override async Task SetParametersAsyncCore(ParameterView parameters)
|
||||||
|
{
|
||||||
|
await base.SetParametersAsyncCore(parameters);
|
||||||
|
|
||||||
|
if (!_isFirstInitializeParameterCore)
|
||||||
|
{
|
||||||
|
//if (!IsMasterGrid && (ContextIds == null || ContextIds.Length == 0))
|
||||||
|
//{
|
||||||
|
// ContextIds = [ParentDataItem!.Id];
|
||||||
|
// GetAllMessageTag = SignalRTags.GetShippingItemsByDocumentId;
|
||||||
|
//}
|
||||||
|
|
||||||
|
//ShowFilterRow = true;
|
||||||
|
//ShowGroupPanel = true;
|
||||||
|
//AllowSort = false;
|
||||||
|
|
||||||
|
//etc...
|
||||||
|
|
||||||
|
_isFirstInitializeParameterCore = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -1,5 +1,7 @@
|
||||||
using AyCode.Core.Extensions;
|
using AyCode.Core.Extensions;
|
||||||
|
using AyCode.Core.Helpers;
|
||||||
using AyCode.Core.Interfaces;
|
using AyCode.Core.Interfaces;
|
||||||
|
using AyCode.Core.Loggers;
|
||||||
using AyCode.Interfaces.Entities;
|
using AyCode.Interfaces.Entities;
|
||||||
using AyCode.Services.SignalRs;
|
using AyCode.Services.SignalRs;
|
||||||
using AyCode.Utils.Extensions;
|
using AyCode.Utils.Extensions;
|
||||||
|
|
@ -15,7 +17,6 @@ using Nop.Core.Domain.Orders;
|
||||||
using System.Collections.Concurrent;
|
using System.Collections.Concurrent;
|
||||||
using System.Collections.ObjectModel;
|
using System.Collections.ObjectModel;
|
||||||
using System.Threading;
|
using System.Threading;
|
||||||
using AyCode.Core.Helpers;
|
|
||||||
|
|
||||||
namespace FruitBankHybrid.Shared.Databases;
|
namespace FruitBankHybrid.Shared.Databases;
|
||||||
|
|
||||||
|
|
@ -42,13 +43,12 @@ public class ShippingItemTable : SignalRDataSourceList<ShippingItemTableItem>
|
||||||
{
|
{
|
||||||
private static readonly SignalRCrudTags SignalRCrudTags = new(SignalRTags.GetShippingItems, 0, SignalRTags.AddShippingItem, SignalRTags.UpdateShippingItem, 0);
|
private static readonly SignalRCrudTags SignalRCrudTags = new(SignalRTags.GetShippingItems, 0, SignalRTags.AddShippingItem, SignalRTags.UpdateShippingItem, 0);
|
||||||
|
|
||||||
public ShippingItemTable(AcSignalRClientBase signalRClient, params object[]? contextIds)
|
public ShippingItemTable(AcSignalRClientBase signalRClient, IAcLoggerBase? logger, params object[]? contextIds) : this(signalRClient, SignalRCrudTags, logger, contextIds)
|
||||||
: this(signalRClient, SignalRCrudTags, contextIds)
|
|
||||||
{
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public ShippingItemTable(AcSignalRClientBase signalRClient, SignalRCrudTags signalRCrudTags, params object[]? contextIds) : base(signalRClient, signalRCrudTags, contextIds)
|
public ShippingItemTable(AcSignalRClientBase signalRClient, SignalRCrudTags signalRCrudTags, IAcLoggerBase? logger, params object[]? contextIds) : base(signalRClient, signalRCrudTags, logger, contextIds)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -108,7 +108,7 @@ public class OrderDtoTable(FruitBankSignalRClient fruitBankSignalRClient) : AcOb
|
||||||
|
|
||||||
public abstract class DatabaseTableBase<TDataItem> : SignalRDataSourceObservable<TDataItem> where TDataItem : class, IId<int>
|
public abstract class DatabaseTableBase<TDataItem> : SignalRDataSourceObservable<TDataItem> where TDataItem : class, IId<int>
|
||||||
{
|
{
|
||||||
protected DatabaseTableBase(AcSignalRClientBase signalRClient, SignalRCrudTags signalRCrudTags, params object[]? contextIds) : base(signalRClient, signalRCrudTags, contextIds)
|
protected DatabaseTableBase(AcSignalRClientBase signalRClient, SignalRCrudTags signalRCrudTags, IAcLoggerBase? logger, params object[]? contextIds) : base(signalRClient, signalRCrudTags, logger, contextIds)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -168,7 +168,7 @@ public class DatabaseClient : DatabaseClientBase
|
||||||
_fruitBankSignalRClient = fruitBankSignalRClient;
|
_fruitBankSignalRClient = fruitBankSignalRClient;
|
||||||
|
|
||||||
AddTable(new ProductDtoTable(_fruitBankSignalRClient));
|
AddTable(new ProductDtoTable(_fruitBankSignalRClient));
|
||||||
AddTable(new ShippingItemTable(_fruitBankSignalRClient));
|
AddTable(new ShippingItemTable(_fruitBankSignalRClient, null));
|
||||||
AddTable(new OrderDtoTable(_fruitBankSignalRClient));
|
AddTable(new OrderDtoTable(_fruitBankSignalRClient));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,18 +1,19 @@
|
||||||
using System.Collections.ObjectModel;
|
using AyCode.Core.Helpers;
|
||||||
using AyCode.Core.Interfaces;
|
using AyCode.Core.Interfaces;
|
||||||
|
using AyCode.Core.Loggers;
|
||||||
using AyCode.Services.Server.SignalRs;
|
using AyCode.Services.Server.SignalRs;
|
||||||
using AyCode.Services.SignalRs;
|
using AyCode.Services.SignalRs;
|
||||||
|
using System.Collections.ObjectModel;
|
||||||
using System.Diagnostics;
|
using System.Diagnostics;
|
||||||
using AyCode.Core.Helpers;
|
|
||||||
|
|
||||||
namespace FruitBankHybrid.Shared.Services.SignalRs;
|
namespace FruitBankHybrid.Shared.Services.SignalRs;
|
||||||
|
|
||||||
[Serializable]
|
[Serializable]
|
||||||
[DebuggerDisplay("Count = {Count}")]
|
[DebuggerDisplay("Count = {Count}")]
|
||||||
public class SignalRDataSourceList<TDataItem>(AcSignalRClientBase signalRClient, SignalRCrudTags signalRCrudTags, params object[]? contextIds)
|
public class SignalRDataSourceList<TDataItem>(AcSignalRClientBase signalRClient, SignalRCrudTags signalRCrudTags, IAcLoggerBase? logger, params object[]? contextIds)
|
||||||
: AcSignalRDataSource<TDataItem, int, List<TDataItem>>(signalRClient, signalRCrudTags, contextIds) where TDataItem : class, IId<int>;
|
: AcSignalRDataSource<TDataItem, int, List<TDataItem>>(signalRClient, signalRCrudTags, logger, contextIds) where TDataItem : class, IId<int>;
|
||||||
|
|
||||||
[Serializable]
|
[Serializable]
|
||||||
[DebuggerDisplay("Count = {Count}")]
|
[DebuggerDisplay("Count = {Count}")]
|
||||||
public class SignalRDataSourceObservable<TDataItem>(AcSignalRClientBase signalRClient, SignalRCrudTags signalRCrudTags, params object[]? contextIds)
|
public class SignalRDataSourceObservable<TDataItem>(AcSignalRClientBase signalRClient, SignalRCrudTags signalRCrudTags, IAcLoggerBase? logger, params object[]? contextIds)
|
||||||
: AcSignalRDataSource<TDataItem, int, AcObservableCollection<TDataItem>>(signalRClient, signalRCrudTags, contextIds) where TDataItem : class, IId<int>;
|
: AcSignalRDataSource<TDataItem, int, AcObservableCollection<TDataItem>>(signalRClient, signalRCrudTags, logger, contextIds) where TDataItem : class, IId<int>;
|
||||||
Loading…
Reference in New Issue