Trial - boosting prospect grid loading performance

This commit is contained in:
troogs
2026-09-20 11:09:44 +02:00
parent 8b298b37c7
commit b33f9f6c52
15 changed files with 688 additions and 73 deletions
@@ -5,6 +5,7 @@ using FoodsharingSiegen.Contracts.Helper;
using FoodsharingSiegen.Contracts.Model;
using FoodsharingSiegen.Server.Data.Service;
using FoodsharingSiegen.Server.Dialogs;
using FoodsharingSiegen.Shared.Helper;
using Microsoft.AspNetCore.Components;
namespace FoodsharingSiegen.Server.Pages
@@ -37,7 +38,17 @@ namespace FoodsharingSiegen.Server.Pages
/// <summary>
/// Gets or sets the value of the prospect list (ab)
/// </summary>
private List<Prospect>? ProspectList { get; set; }
private List<Prospect> ProspectList { get; set; } = [];
private bool IsLoadingProspects { get; set; }
private bool IsLoadingMoreProspects { get; set; }
private bool HasMoreProspects { get; set; }
private int CurrentPageSize { get; set; } = 50;
private int CurrentSkip { get; set; }
private ProspectSortOption CurrentSort { get; set; } = ProspectSortOption.NameAscending;
@@ -71,6 +82,9 @@ namespace FoodsharingSiegen.Server.Pages
{
Filter = arg;
await LocalStorageService.SetItem(StorageKeys.ProspectFilter, Filter);
CurrentSkip = 0;
ProspectList = [];
await LoadProspects();
}
#endregion
@@ -80,17 +94,83 @@ namespace FoodsharingSiegen.Server.Pages
/// <summary>
/// Loads the prospects (a. beging, 11.04.2022)
/// </summary>
private bool HasActiveFilter()
{
return !string.IsNullOrWhiteSpace(Filter.Text)
|| Filter.WithoutStepInBriefing
|| Filter.WithoutIdCheck
|| Filter.DeletedOnly
|| Filter.IdCheckPossible
|| Filter.NoActivity
|| Filter.RecentActivity;
}
private async Task LoadProspects()
{
var parameter = new GetProspectsParameter
{
IncludeDeleted = true
};
var prospectsR = await ProspectService.GetProspectsAsync(parameter);
if (prospectsR.Success) ProspectList = prospectsR.Data;
if (IsLoadingProspects || IsLoadingMoreProspects) return;
await InvokeAsync(StateHasChanged);
try
{
if (CurrentSkip == 0)
{
IsLoadingProspects = true;
}
else
{
IsLoadingMoreProspects = true;
}
await InvokeAsync(StateHasChanged);
while (true)
{
var parameter = new GetProspectsParameter
{
Skip = CurrentSkip,
Take = CurrentPageSize,
IncludeDeleted = true
};
var prospectsR = await ProspectService.GetProspectsAsync(parameter);
if (!prospectsR.Success)
{
break;
}
var loadedProspects = prospectsR.Data ?? [];
if (CurrentSkip == 0)
{
ProspectList = loadedProspects;
}
else
{
ProspectList = [.. ProspectList, .. loadedProspects];
}
CurrentSkip += loadedProspects.Count;
HasMoreProspects = loadedProspects.Count == CurrentPageSize;
var filteredCount = ProspectList.ApplyFilter(Filter).Count;
if (!HasActiveFilter() || filteredCount > 0 || !HasMoreProspects || loadedProspects.Count == 0)
{
break;
}
}
await InvokeAsync(StateHasChanged);
}
finally
{
IsLoadingProspects = false;
IsLoadingMoreProspects = false;
await InvokeAsync(StateHasChanged);
}
}
private async Task LoadMoreProspects()
{
if (IsLoadingProspects || IsLoadingMoreProspects || !HasMoreProspects) return;
await LoadProspects();
}
#endregion