EfCore Tracking fix; Implement FilterText to TiamGrid/DataSource; Implement multiple Context[Id]s params to SignalRClient; improvements, fixes, etc...

This commit is contained in:
Loretta 2024-06-29 22:27:33 +02:00
parent 33d21d9caf
commit 8e0b79e68e
3 changed files with 24 additions and 10 deletions

View File

@ -84,19 +84,19 @@ namespace AyCode.Blazor.Components.Services
}
#region CRUD
public virtual Task<TResponseData?> GetByIdAsync<TResponseData>(int messageTag, params Guid[] ids) where TResponseData : class
public virtual Task<TResponseData?> GetByIdAsync<TResponseData>(int messageTag, object[] ids) where TResponseData : class
=> SendMessageToServerAsync<TResponseData>(messageTag, new SignalPostJsonDataMessage<IdMessage>(new IdMessage(ids)), AcDomain.NextUniqueInt32);
public virtual Task GetByIdAsync<TResponseData>(int messageTag, Func<ISignalResponseMessage<TResponseData?>, Task> responseCallback, params Guid[] ids)
public virtual Task GetByIdAsync<TResponseData>(int messageTag, Func<ISignalResponseMessage<TResponseData?>, Task> responseCallback, object[] ids)
=> SendMessageToServerAsync(messageTag, new SignalPostJsonDataMessage<IdMessage>(new IdMessage(ids)), responseCallback);
public virtual Task<TResponseData?> GetAllAsync<TResponseData>(int messageTag) where TResponseData : class
=> SendMessageToServerAsync<TResponseData>(messageTag);
public virtual Task GetAllAsync<TResponseData>(int messageTag, Func<ISignalResponseMessage<TResponseData?>, Task> responseCallback)
=> SendMessageToServerAsync(messageTag, null, responseCallback);
public virtual Task GetAllAsync<TResponseData>(int messageTag, Func<ISignalResponseMessage<TResponseData?>, Task> responseCallback, params Guid[]? contextIds)
public virtual Task GetAllAsync<TResponseData>(int messageTag, Func<ISignalResponseMessage<TResponseData?>, Task> responseCallback, object[]? contextIds)
=> SendMessageToServerAsync(messageTag, (contextIds == null || contextIds.Length == 0 ? null : new SignalPostJsonDataMessage<IdMessage>(new IdMessage(contextIds))), responseCallback);
public virtual Task<TResponseData?> GetAllAsync<TResponseData>(int messageTag, params Guid[]? contextIds) where TResponseData : class
public virtual Task<TResponseData?> GetAllAsync<TResponseData>(int messageTag, object[]? contextIds) where TResponseData : class
=> SendMessageToServerAsync<TResponseData>(messageTag, contextIds == null || contextIds.Length == 0 ? null : new SignalPostJsonDataMessage<IdMessage>(new IdMessage(contextIds)), AcDomain.NextUniqueInt32);
public virtual Task<TPostData?> PostDataAsync<TPostData>(int messageTag, TPostData postData) where TPostData : class

View File

@ -7,6 +7,7 @@ using AyCode.Core.Extensions;
using AyCode.Core.Helpers;
using AyCode.Core.Interfaces;
using AyCode.Services.SignalRs;
using AyCode.Utils.Extensions;
namespace AyCode.Blazor.Components.Services
{
@ -96,16 +97,18 @@ namespace AyCode.Blazor.Components.Services
protected List<T> InnerList = []; //TODO: Dictionary??? - J.
protected readonly ChangeTracking<T> TrackingItems = new();
protected readonly Guid[]? ContextIds;
public List<Guid>? ContextIds;
public string? FilterText { get; set; }
public AcSignalRClientBase SignalRClient;
protected readonly SignalRCrudTags SignalRCrudTags;
public Func<ItemChangedEventArgs<T>, Task>? OnDataSourceItemChanged;
public Func<Task>? OnDataSourceLoaded;
public AcSignalRDataSource(AcSignalRClientBase signalRClient, SignalRCrudTags signalRCrudTags, params Guid[]? contextIds)
public AcSignalRDataSource(AcSignalRClientBase signalRClient, SignalRCrudTags signalRCrudTags, IEnumerable<Guid>? contextIds = null)
{
if (contextIds?.Length > 0) ContextIds = contextIds;
if (contextIds != null) (ContextIds = new List<Guid>()).AddRange(contextIds);
SignalRCrudTags = signalRCrudTags;
SignalRClient = signalRClient;
@ -115,6 +118,16 @@ namespace AyCode.Blazor.Components.Services
public object SyncRoot => _syncRoot;
public bool IsFixedSize => false;
private object[]? GetContextParams()
{
var parameters = new List<object>();
if (ContextIds != null) parameters.AddRange(ContextIds.Cast<object>());
if (!FilterText.IsNullOrWhiteSpace()) parameters.Add(FilterText);
if (parameters.Count == 0) parameters = null;
return parameters?.ToArray();
}
/// <summary>
/// GetAllMessageTag
/// </summary>
@ -124,7 +137,7 @@ namespace AyCode.Blazor.Components.Services
{
if (SignalRCrudTags.GetAllMessageTag == AcSignalRTags.None) throw new ArgumentException($"SignalRCrudTags.GetAllMessageTag == SignalRTags.None");
var resultList = (await SignalRClient.GetAllAsync<List<T>>(SignalRCrudTags.GetAllMessageTag, ContextIds)) ?? throw new NullReferenceException();
var resultList = (await SignalRClient.GetAllAsync<List<T>>(SignalRCrudTags.GetAllMessageTag, GetContextParams())) ?? throw new NullReferenceException();
await LoadDataSource(resultList);
}
@ -139,7 +152,7 @@ namespace AyCode.Blazor.Components.Services
throw new NullReferenceException($"LoadDataSourceAsync; result.Status != SignalResponseStatus.Success || result.ResponseData == null; Status: {SignalResponseStatus.Success}");
return LoadDataSource(result.ResponseData);
}, ContextIds);
}, GetContextParams());
}
public async Task LoadDataSource(IList<T> fromSource, bool clearChangeTracking = true)
@ -179,7 +192,7 @@ namespace AyCode.Blazor.Components.Services
try
{
resultitem = await SignalRClient.GetByIdAsync<T>(SignalRCrudTags.GetItemMessageTag, id);
resultitem = await SignalRClient.GetByIdAsync<T>(SignalRCrudTags.GetItemMessageTag, [id]);
if (resultitem == null) return null;
if (TryGetIndex(id, out var index)) InnerList[index] = resultitem;

View File

@ -58,6 +58,7 @@
<PackageReference Include="MessagePack" Version="2.5.168" />
<PackageReference Include="Microsoft.AspNetCore.SignalR.Client" Version="8.0.6" />
<PackageReference Include="Microsoft.AspNetCore.SignalR.Common" Version="8.0.6" />
<PackageReference Include="Serialize.Linq" Version="3.0.152" />
</ItemGroup>
</Project>