Trial - boosting prospect grid loading performance
This commit is contained in:
@@ -3,6 +3,7 @@ using FoodsharingSiegen.Contracts.Entity;
|
||||
using FoodsharingSiegen.Contracts.Enums;
|
||||
using FoodsharingSiegen.Contracts.Model;
|
||||
using FoodsharingSiegen.Server.Data.Service;
|
||||
using FoodsharingSiegen.Shared.Helper;
|
||||
using Microsoft.AspNetCore.Components;
|
||||
|
||||
namespace FoodsharingSiegen.Server.Pages
|
||||
@@ -29,7 +30,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;
|
||||
|
||||
@@ -60,6 +71,9 @@ namespace FoodsharingSiegen.Server.Pages
|
||||
{
|
||||
Filter = arg;
|
||||
await LocalStorageService.SetItem(StorageKeys.ProspectFilter, Filter);
|
||||
CurrentSkip = 0;
|
||||
ProspectList = [];
|
||||
await LoadProspects();
|
||||
}
|
||||
|
||||
#endregion
|
||||
@@ -69,13 +83,82 @@ 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 { MustHaveInteractions = [InteractionType.Complete] };
|
||||
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,
|
||||
MustHaveInteractions = [InteractionType.Complete]
|
||||
};
|
||||
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
|
||||
|
||||
Reference in New Issue
Block a user