imprvements, fixes, etc...

This commit is contained in:
Loretta 2024-07-05 15:39:14 +02:00
parent 72e4506ea4
commit bf95f669a3
1 changed files with 36 additions and 14 deletions

View File

@ -119,6 +119,30 @@ namespace AyCode.Blazor.Components.Services
public object SyncRoot => _syncRoot;
public bool IsFixedSize => false;
public bool HasWorkingReferenceList { get; private set; }
public void SetWorkingReferenceList(List<T> workingList)
{
if (workingList == null!) return; //throw new ArgumentNullException(nameof(workingList));
Monitor.Enter(_syncRoot);
try
{
HasWorkingReferenceList = true;
if (ReferenceEquals(InnerList, workingList)) return;
if (workingList.Count == 0) workingList.AddRange(InnerList);
Clear(true);
InnerList = workingList;
}
finally
{
Monitor.Exit(_syncRoot);
}
}
private object[]? GetContextParams()
{
var parameters = new List<object>();
@ -138,9 +162,9 @@ 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, GetContextParams())) ?? throw new NullReferenceException();
var responseData = (await SignalRClient.GetAllAsync<List<T>>(SignalRCrudTags.GetAllMessageTag, GetContextParams())) ?? throw new NullReferenceException();
await LoadDataSource(resultList);
await LoadDataSource(responseData, false, false, clearChangeTracking);
}
public Task LoadDataSourceAsync(bool clearChangeTracking = true)
@ -152,28 +176,26 @@ namespace AyCode.Blazor.Components.Services
if (result.Status != SignalResponseStatus.Success || result.ResponseData == null)
throw new NullReferenceException($"LoadDataSourceAsync; result.Status != SignalResponseStatus.Success || result.ResponseData == null; Status: {SignalResponseStatus.Success}");
return LoadDataSource(result.ResponseData);
return LoadDataSource(result.ResponseData, false, false, clearChangeTracking);
}, GetContextParams());
}
public async Task LoadDataSource(IList<T> fromSource, bool clearChangeTracking = true)
public async Task LoadDataSource(IList<T> fromSource, bool refreshDataFromDbAsync = false, bool setSourceToWorkingReferenceList = false, bool clearChangeTracking = true)
{
Monitor.Enter(_syncRoot);
try
{
if (!ReferenceEquals(InnerList, fromSource))
{
Clear(clearChangeTracking);
if (fromSource is List<T> fromSourceCasted) InnerList = fromSourceCasted;
if (setSourceToWorkingReferenceList && fromSource is List<T> fromSourceList) SetWorkingReferenceList(fromSourceList);
else InnerList.AddRange(fromSource);
}
else if (clearChangeTracking) TrackingItems.Clear();
//foreach (var item in fromSource)
//{
// InnerList.Add(item);
// var eventArgs = new ItemChangedEventArgs<T>(item, TrackingState.GetAll);
// if (OnDataSourceItemChanged != null) await OnDataSourceItemChanged.Invoke(eventArgs);
//}
if (refreshDataFromDbAsync) LoadDataSourceAsync(false).Forget();
}
finally
{