fix select members

Zusammenfassung der Änderungen:

  1. FluxorComponent als Basisklasse - Dialog reagiert nun auf PersonState-Änderungen
  2. Redundante DB-Anfragen vermeiden - LoadPersonsAction wird nur dispatched wenn Persons.Count == 0 && !IsLoading
  3. Pre-Selection bei asynchronem Laden - In OnAfterRender wird die Member-Vorauswahl aktualisiert sobald Persons verfügbar sind

  Ursache des Problems:
  - Der Dialog dispatched LoadPersonsAction bei jedem Öffnen
  - DayDetails.razor dispatched gleichzeitig mehrere Actions (LoadAvailablePersonsAction, etc.)
  - Viele parallele DB-Requests erschöpfen den Connection Pool
This commit is contained in:
beo3000 2026-01-05 15:47:43 +01:00
parent 8987fc34b5
commit 53a68c91d0
2 changed files with 38 additions and 10 deletions

View File

@ -597,9 +597,20 @@ else
return Icons.Material.Filled.Circle; // Future return Icons.Material.Filled.Circle; // Future
} }
private void AdvanceStatus() private async Task AdvanceStatus()
{ {
if (Day is null) return; if (Day is null)
return;
if (Day.Status == DayStatus.Started )
{
var res = await DialogService.ShowMessageBox("Tag abschließen?", "Spieltag wirklich beenden?", yesText: "Ja", noText: "Nein");
if (res.HasValue && !res.Value)
{
return;
}
}
Dispatcher.Dispatch(new AdvanceDayStatusAction(Day.Id)); Dispatcher.Dispatch(new AdvanceDayStatusAction(Day.Id));
Snackbar.Add("Status wird aktualisiert...", Severity.Info); Snackbar.Add("Status wird aktualisiert...", Severity.Info);
} }
@ -834,11 +845,15 @@ else
} }
} }
private void EndGame() private async Task EndGame()
{ {
Dispatcher.Dispatch(new EndGameAction(GameStatus.Completed)); var res = await DialogService.ShowMessageBox("Spiel beenden", "Spiel wirklich beenden?", yesText:"Ja", noText:"Nein");
_activeTabIndex = 0; // Switch back to Details tab if (res.HasValue && res.Value)
Snackbar.Add("Spiel wird beendet...", Severity.Info); {
Dispatcher.Dispatch(new EndGameAction(GameStatus.Completed));
_activeTabIndex = 0; // Switch back to Details tab
Snackbar.Add("Spiel wird beendet...", Severity.Info);
}
} }
private string? GetCurrentPlayerName() private string? GetCurrentPlayerName()

View File

@ -3,6 +3,8 @@
@using Fluxor @using Fluxor
@using Koogle.Web.Store.PersonState @using Koogle.Web.Store.PersonState
@inherits Fluxor.Blazor.Web.Components.FluxorComponent
@inject IState<PersonState> PersonState @inject IState<PersonState> PersonState
@inject IDispatcher Dispatcher @inject IDispatcher Dispatcher
@ -98,6 +100,8 @@
protected override void OnInitialized() protected override void OnInitialized()
{ {
base.OnInitialized();
if (Day is not null) if (Day is not null)
{ {
_postDate = Day.PostDate; _postDate = Day.PostDate;
@ -105,8 +109,11 @@
} }
else else
{ {
// Load persons for selection when creating new day // Only load persons if not already loaded
Dispatcher.Dispatch(new LoadPersonsAction()); if (PersonState.Value.Persons.Count == 0 && !PersonState.Value.IsLoading)
{
Dispatcher.Dispatch(new LoadPersonsAction());
}
// Pre-select all members // Pre-select all members
_selectedPersonIds = PersonState.Value.Persons _selectedPersonIds = PersonState.Value.Persons
@ -118,9 +125,15 @@
protected override void OnAfterRender(bool firstRender) protected override void OnAfterRender(bool firstRender)
{ {
if (firstRender && !IsEditMode) base.OnAfterRender(firstRender);
if (!IsEditMode && _selectedPersonIds.Count == 0 && PersonState.Value.Persons.Count > 0)
{ {
// Update selection after persons are loaded // Update pre-selection after persons are loaded
_selectedPersonIds = PersonState.Value.Persons
.Where(p => p.PersonStatus == PersonStatus.Member)
.Select(p => p.Id)
.ToList();
StateHasChanged(); StateHasChanged();
} }
} }