From 53a68c91d03da45cd7dc73daa05d1ab620f9f3d5 Mon Sep 17 00:00:00 2001 From: beo3000 Date: Mon, 5 Jan 2026 15:47:43 +0100 Subject: [PATCH] fix select members MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 --- .../Components/Pages/Days/DayDetails.razor | 27 ++++++++++++++----- .../Components/Pages/Days/DayEditDialog.razor | 21 ++++++++++++--- 2 files changed, 38 insertions(+), 10 deletions(-) diff --git a/src/Koogle.Web/Components/Pages/Days/DayDetails.razor b/src/Koogle.Web/Components/Pages/Days/DayDetails.razor index c9f5136..fa39b50 100644 --- a/src/Koogle.Web/Components/Pages/Days/DayDetails.razor +++ b/src/Koogle.Web/Components/Pages/Days/DayDetails.razor @@ -597,9 +597,20 @@ else 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)); 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)); - _activeTabIndex = 0; // Switch back to Details tab - Snackbar.Add("Spiel wird beendet...", Severity.Info); + var res = await DialogService.ShowMessageBox("Spiel beenden", "Spiel wirklich beenden?", yesText:"Ja", noText:"Nein"); + if (res.HasValue && res.Value) + { + Dispatcher.Dispatch(new EndGameAction(GameStatus.Completed)); + _activeTabIndex = 0; // Switch back to Details tab + Snackbar.Add("Spiel wird beendet...", Severity.Info); + } } private string? GetCurrentPlayerName() diff --git a/src/Koogle.Web/Components/Pages/Days/DayEditDialog.razor b/src/Koogle.Web/Components/Pages/Days/DayEditDialog.razor index 383fdcf..7496c3c 100644 --- a/src/Koogle.Web/Components/Pages/Days/DayEditDialog.razor +++ b/src/Koogle.Web/Components/Pages/Days/DayEditDialog.razor @@ -3,6 +3,8 @@ @using Fluxor @using Koogle.Web.Store.PersonState +@inherits Fluxor.Blazor.Web.Components.FluxorComponent + @inject IState PersonState @inject IDispatcher Dispatcher @@ -98,6 +100,8 @@ protected override void OnInitialized() { + base.OnInitialized(); + if (Day is not null) { _postDate = Day.PostDate; @@ -105,8 +109,11 @@ } else { - // Load persons for selection when creating new day - Dispatcher.Dispatch(new LoadPersonsAction()); + // Only load persons if not already loaded + if (PersonState.Value.Persons.Count == 0 && !PersonState.Value.IsLoading) + { + Dispatcher.Dispatch(new LoadPersonsAction()); + } // Pre-select all members _selectedPersonIds = PersonState.Value.Persons @@ -118,9 +125,15 @@ 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(); } }