Commit Graph

153 Commits

Author SHA1 Message Date
beo3000 fbfdb74cad fix colorpicker:
1. Neues Feld _colorValue für direkten String-Wert
  2. OnInitialized: _colorValue direkt aus Category.Color geladen
  3. MudColorPicker: ValueChanged="OnColorChanged" statt @bind-Value
  4. Neue OnColorChanged Methode aktualisiert beide Felder
  5. DTOs verwenden jetzt _colorValue statt _color?.Value
2026-01-04 13:09:23 +01:00
beo3000 b5caa75980 K21 fertig. Änderungen:
1. AuthState.cs:68 - IsClubTreasurer Property hinzugefügt
  2. AuthState.cs:100,116,123,132 - Initial + WithPermissions um Treasurer erweitert
  3. NavMenu.razor:25-48 - Kassenbuch NavGroup mit 3 Links:
    - Übersicht (/cashbook)
    - Kategorien (/cashbook/categories)
    - Berichte (/cashbook/reports)

  Sichtbar für: Kassenwart, Admin, SuperAdmin
2026-01-04 10:01:07 +01:00
beo3000 0d94d4c5c0 K20 fertig. Änderungen:
1. ClubService.cs:134 - MonthlyMembershipFee in UpdateAsync hinzugefügt
  2. Settings.razor:358-364 - Laden der Kassenbuch-Einstellungen beim Init
  3. Settings.razor:665-689 - SaveCashBookSettings() Methode implementiert

  Der Kassenbuch-Tab in den Vereins-Einstellungen funktioniert jetzt:
  - Zeigt aktuellen Kontostand
  - Erlaubt Ändern des monatlichen Mitgliedsbeitrags
  - Speichert Änderungen via Fluxor-Action
  - Quick-Links zu Kassenbuch, Kategorien, Berichten
2026-01-04 09:56:15 +01:00
beo3000 a59fdac5d5 K19 fertig.
Erstellte Dateien:
  - src/Koogle.Web/Components/Pages/CashBook/MembershipFeeDialog.razor - Dialog mit Monat/Jahr-Auswahl, optionalem Betrags-Override, Warnung bei bestehenden Beiträgen

  Geänderte Dateien:
  - CashBook.razor - Button "Mitgliedsbeiträge" hinzugefügt
  - CashBook.razor.cs - OpenMembershipFeeDialog() Methode, prüft auf existierende Beiträge

  Features:
  - Monat/Jahr-Auswahl
  - Optionaler Betrags-Override (Switch)
  - Warnung bei existierenden Beiträgen für gewählten Monat
  - Dispatched CreateMembershipFeesAction
2026-01-03 22:12:21 +01:00
beo3000 8a9096c95e K18 fertig.
Erstellte Datei: src/Koogle.Web/Controllers/CashBookController.cs

  Endpoints:
  - GET /api/cashbook/export/excel?year=2026&month=1 → Excel-Download
  - GET /api/cashbook/export/pdf?year=2026&month=1 → PDF-Download

  Policy: ClubTreasurer

  Reports.razor.cs aktualisiert → Export-Buttons öffnen jetzt die Controller-Endpoints.
2026-01-03 22:08:27 +01:00
beo3000 dfe74adf01 ● K15 fertig. Erstellte Dateien:
- src/Koogle.Web/Components/Pages/CashBook/Reports.razor - UI mit Monat/Jahr-Auswahl, Saldo-Karten, Donut-Charts für Kategorien, expandierbare Buchungsliste
  - src/Koogle.Web/Components/Pages/CashBook/Reports.razor.cs - Code-behind

  Route: /cashbook/reports | Policy: ClubViewer

  Export-Buttons (Excel/PDF) zeigen Info-Message - werden in K16/K17 implementiert.
2026-01-03 21:55:02 +01:00
beo3000 05d1622bd4 K14: add Categories UI page + dialog
🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-03 21:49:11 +01:00
beo3000 3a9e891174 K13: add CashBook UI page + entry dialog
🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-03 21:42:55 +01:00
beo3000 4cee96408b mod design gradient, like on home-page 2026-01-03 10:57:23 +01:00
beo3000 587b92409d added ParticipantsMode.FreeToChoose:
Neue Datei erstellt:
  - src/Koogle.Web/Components/Game/PlayerSelectorDialog.razor - Dialog zur manuellen Spielerauswahl

  Geändert:
  - src/Koogle.Web/Components/Pages/Days/DayDetails.razor:863-891 - ShowPlayerSelector implementiert

  Funktionsweise:
  1. Bei ParticipantsMode.FreeToChoose zeigt GameInputPanel.razor:23-32 den Button "Spieler wechseln"
  2. Der neue Dialog listet alle Spieler aus Participants.PlayerIds
  3. Bei DeathBox werden ausgeschiedene Spieler standardmäßig ausgeblendet (Toggle verfügbar)
  4. Bei Spielerauswahl wird SetCurrentPlayerAction dispatcht

  Features:
  - Aktueller Spieler ist markiert (grün)
  - Ausgeschiedene Spieler sind durchgestrichen mit "Ausgeschieden"-Badge
  - Optional können ausgeschiedene Spieler eingeblendet werden (falls nötig)
  - Funktioniert mit allen Game-Typen (DeathBox, Shit, Training)
2026-01-03 10:28:13 +01:00
beo3000 39d4629e72 fix switch club:
Problem: RefreshSignInAsync in UserService.SwitchClubAsync (Zeile 719) setzte zwar den neuen Cookie, aber HttpClient.PostAsJsonAsync empfing diesen Cookie nur intern - der Browser bekam ihn nie.

  Lösung: Form-POST statt HttpClient-API-Call, wie bei Login/Logout.

  Änderungen:

  1. ClubSwitcher.razor - Komplett überarbeitet:
    - HttpClient durch natives <form method="post"> ersetzt
    - AntiForgery-Token manuell gesetzt (wie LogoutButton)
    - Kein JavaScript/Client-Code mehr nötig
  2. AuthController.cs (Zeile 146):
    - [FromBody] → [FromForm]
    - [ValidateAntiForgeryToken] aktiviert

  Ablauf jetzt:
  1. User klickt auf Club im Dropdown
  2. Form-POST an /auth/switch-club
  3. Controller ruft SwitchClubAsync → DB-Update + RefreshSignInAsync
  4. LocalRedirect("/dashboard") → Browser erhält neuen Cookie direkt
  5. Claims sind beim Reload korrekt
2026-01-02 23:07:48 +01:00
beo3000 3b65f9f1cd fix switch club and RefreshSign 2026-01-02 22:48:00 +01:00
beo3000 51b8c2dbd4 edit users in club-settings 2026-01-02 20:58:49 +01:00
beo3000 f9e72d095b mod home 2026-01-02 20:22:01 +01:00
beo3000 c2f85cca57 mod home style 2026-01-02 19:49:44 +01:00
beo3000 f0b0d617a5 handling club memberships and creation of clubs:
Neue Dateien erstellt:

  - Domain/Enums/ClubRequestStatus.cs - Enum
  - Domain/Entities/ClubRequest.cs - Entity
  - Infrastructure/Data/Configurations/ClubRequestConfiguration.cs - EF Config
  - Application/DTOs/ClubRequestDto.cs - DTOs
  - Application/Interfaces/IClubRequestService.cs - Interface
  - Application/Services/ClubRequestService.cs - Service
  - Web/Controllers/ClubSwitchController.cs - API
  - Web/Components/Pages/Account/ClubSetup.razor - Club-Setup Seite
  - Web/Components/Shared/ClubSwitcher.razor - NavMenu Dropdown
  - Web/Components/Pages/Admin/ClubRequests.razor - SuperAdmin Freigaben

  Geänderte Dateien:

  - Login/Register: ClubName-Feld entfernt
  - UserService: Auto-Select Logic, SwitchClubAsync
  - AuthController: Routing basierend auf Club-Anzahl
  - MainLayout: ClubSwitcher statt statischer Anzeige
  - AuthState/Effects: AvailableClubs laden

  Flow:

  Login → Clubs vorhanden?
    ├─ Nein → /account/club-setup
    ├─ 1 Club → Auto-Select → /dashboard
    └─ Mehrere → IsDefault wählen → /dashboard
2026-01-02 19:15:30 +01:00
beo3000 028909c24f manage invitations and requests by club-admin 2026-01-02 14:47:09 +01:00
beo3000 7ba1307bac fix typo 2026-01-01 20:15:13 +01:00
beo3000 c3b71bcbec mod home-page 2026-01-01 20:13:28 +01:00
beo3000 b163fb30c7 send day protocol by email 2026-01-01 20:04:55 +01:00
beo3000 0d8289563d add email service:
Neue Dateien

  - src/Koogle.Domain/Interfaces/IEmailService.cs - Interface
  - src/Koogle.Infrastructure/Configuration/SmtpSettings.cs - SMTP-Konfiguration
  - src/Koogle.Infrastructure/Services/SmtpEmailService.cs - MailKit-basierte Implementierung

  Geänderte Dateien

  | Datei                  | Änderung                                    |
  |------------------------|---------------------------------------------|
  | Club.cs                | + SenderEmail Property                      |
  | Person.cs              | + UserProfileId + Navigation zu UserProfile |
  | ClubConfiguration.cs   | + SenderEmail Config                        |
  | PersonConfiguration.cs | + UserProfileId FK + Index                  |
  | DayService.cs          | + E-Mail-Versand bei Day-Close              |
  | ClubDto.cs             | + SenderEmail in allen DTOs                 |
  | PersonDto.cs           | + UserProfileId                             |
  | DependencyInjection.cs | + SmtpSettings + SmtpEmailService           |
  | appsettings.json       | + SmtpSettings Section                      |

  Gelöschte Dateien

  - StubEmailService.cs
  - IEmailService.cs (Application → Domain verschoben)

  Migration

  - AddEmailFeatures - Neue Spalten SenderEmail (Clubs) und UserProfileId (Persons)

  Konfiguration (appsettings.json)

  "SmtpSettings": {
    "Host": "smtp.example.com",
    "Port": 587,
    "Enabled": false  // Auf true setzen um E-Mails zu aktivieren
  }

  Funktionen

  1. Club-spezifische Absender-Adresse - Club.SenderEmail (Fallback: DefaultSenderEmail)
  2. Spieltag-Protokoll - HTML-E-Mail mit Tabelle der Strafen pro Teilnehmer
  3. Empfänger - Nur Teilnehmer mit verknüpftem UserProfile
  4. Error Handling - Log & Continue (Day-Close schlägt nicht fehl)
2026-01-01 19:13:05 +01:00
beo3000 49463ba6cf typo 2026-01-01 14:52:50 +01:00
beo3000 c25fa0c0ec mod Club-Editor for demo 2026-01-01 14:42:11 +01:00
beo3000 fc9dfcaca0 added club-settings:
Neue Datei: src/Koogle.Web/Components/Pages/Settings.razor
  - Route /settings mit ClubAdmin-Policy
  - Zeigt Name, LoginName, Kostenberechnung
  - "Bearbeiten" Button öffnet bestehenden ClubEditDialog
  - Kein Löschen, keine Neuanlage

  Geändert: src/Koogle.Web/Components/Layout/NavMenu.razor
  - Neuer Link "Vereins-Einstellungen" in "Stammdaten"-Gruppe (Icon: Tune)
2026-01-01 14:34:02 +01:00
beo3000 8fd8c37952 added Home-Advertising page 2026-01-01 13:23:49 +01:00
beo3000 2f1a2a159b mod Submit Page 2026-01-01 11:03:36 +01:00
beo3000 3b12a82982 submit gifs by URL:
UI (Submit.razor)
  - Toggle zwischen "Datei" und "URL" Modus
  - URL-Eingabefeld mit Validierung (nur HTTP/HTTPS)
  - Beide Modi teilen Submit-Button und Erfolgsanzeige

  Service (IClubGifService, ClubGifService)
  - Neue Methode SubmitAnonymousFromUrlAsync(token, url, name)
  - Nutzt bestehende SaveGifFromUrlAsync von MediaStorageService

  Serverseitige Validierung (bereits in MediaStorageService vorhanden):
  - Content-Type Prüfung: nur image/gif, video/mp4, video/webm
  - Dateigröße max. 20MB
  - Datei wird nach Download nochmals auf Größe geprüft
  - Ungültige Content-Types werden mit Exception abgelehnt
2026-01-01 10:58:02 +01:00
beo3000 968026729d fix UI details 2025-12-31 18:23:15 +01:00
beo3000 6b2715cec9 added deplayment-scripts
fix club-permissions
2025-12-31 18:08:32 +01:00
beo3000 49a03a8fbb fix Bell-Handling 2025-12-30 20:37:21 +01:00
beo3000 dd4317bf80 fix Seeder, QR-Copde Copy Clipboard 2025-12-30 18:21:46 +01:00
beo3000 a3a5c288a1 added giftype NoWood 2025-12-30 17:43:10 +01:00
beo3000 752523fe78 added gif-Feature:
Summary of Changes:

  Phase 1-3 (Domain/Infrastructure/Application):
  - ThrowEventType enum with Strike, Circle, Bell, Gutter flags
  - ClubGif, ClubGifRating, GifSubmissionToken entities
  - EF configurations with proper indexes
  - ClubGifRepository with weighted random selection
  - MediaStorageService for file storage (wwwroot/club-media/{LoginName}/gifs/)
  - ClubGifService with rating system and auto-disable at -5 threshold

  Phase 4-5 (Admin UI & Playback):
  - Admin page at /club/{ClubId}/admin/gifs with Upload, Import, Edit, Token management
  - QR code generation for submission tokens
  - GifPlayer component with overlay, rating buttons, and dismiss
  - Fluxor state management (GifState, actions, reducers, effects)

  Phase 6 (Anonymous Submission):
  - Public page at /gif/submit/{Token} with EmptyLayout
  - Token validation and file upload

  Phase 7 (Game Integration + Migration):
  - Database migration AddClubGifFeature applied
  - GameEffects.TriggerGifForEventsAsync triggers GIFs on special throws
  - SignalR broadcast via BroadcastGifTriggeredAsync to all clients
  - DayDetails.razor includes GifPlayer and handles SignalR GIF events

  Key Features:

  - GIFs play on Strike (alle 9), Circle (Kranz), Bell (Glocke), Gutter (Rinne)
  - Weighted random selection based on ratings
  - Real-time sync across all connected clients via SignalR
  - Thumbs up/down rating with auto-disable at -5
  - Max file size: 20MB, Video duration: 15s
  - Supports GIF, MP4, WebM formats
2025-12-30 14:57:06 +01:00
beo3000 0e4e1530ed added LoginName for Clubs 2025-12-30 11:57:01 +01:00
beo3000 965ec24d33 change participants when creating a new day 2025-12-30 10:09:34 +01:00
beo3000 6f419b3373 SinalR Sync part 2:
DayDetails.razor

  1. GameHubService injiziert (Zeile 26)
  2. IAsyncDisposable implementiert statt IDisposable
  3. SignalR-Events abonniert:
    - OnGameStateUpdated → aktualisiert lokalen State via RemoteGameStateUpdatedAction
    - OnThrowRecorded → zeigt Snackbar-Benachrichtigung
    - OnGameStarted → lädt aktives Spiel neu
    - OnGameEnded → lädt abgeschlossene Spiele neu
  4. Hub-Verbindung initialisiert in OnAfterRenderAsync:
    - StartAsync() - verbindet zum Hub
    - JoinDayAsync(DayId) - tritt der Day-Gruppe bei
    - JoinGameAsync() - tritt der Game-Gruppe bei (wenn aktiv)
  5. Automatisches Join/Leave bei Spielwechsel via OnGameStateChanged
  6. Cleanup in DisposeAsync:
    - Unsubscribe von Events
    - LeaveGameAsync/LeaveDayAsync aufrufen
    - Hub-Verbindung disposen

  GameEffects.cs

  BroadcastThrowAsync hinzugefügt (Zeile 451-458) - broadcast Wurf sofort an andere Clients

  GameActions.cs / GameReducers.cs

  RemoteGameStateUpdatedAction und Reducer hinzugefügt für Remote-State-Updates
2025-12-29 17:13:17 +01:00
beo3000 7cbdfe28e6 fix Typo 2025-12-29 16:14:51 +01:00
beo3000 1fbf4763d9 add dayStatisticChart 2025-12-29 16:11:22 +01:00
beo3000 21130895d4 add statistics:
Erfasste Metriken:
  - ThrowCount, PinCount, ClearedCount, GutterCount, CircleCount, StrikeCount, BellCount

  Widget zeigt:
  - Jahres-Übersicht (Spiele, Würfe, Kegel, Durchschnitt)
  - Top 5 Kegler Rangliste
  - Monatstrend-Tabelle
2025-12-29 15:27:25 +01:00
beo3000 7795c3064f fix deathbox handling 2025-12-28 22:43:21 +01:00
beo3000 f75b08d98d fix Gutte in Decrease-Mode 2025-12-28 21:51:35 +01:00
beo3000 62000e1291 fix PlayerOrder DeathBox 2025-12-28 21:42:13 +01:00
beo3000 cafd38519f add deathbox 2025-12-28 21:25:04 +01:00
beo3000 b8bd1b0939 fix ShitGameLogic 2025-12-28 17:23:10 +01:00
beo3000 5c088345b3 add demo-club:
Neue Dateien (5)

  | Datei                                                  | Zweck                |
  |--------------------------------------------------------|----------------------|
  | src/Koogle.Infrastructure/Data/DemoSeeder.cs           | Seeder + Reset-Logik |
  | src/Koogle.Domain/Interfaces/IDemoResetService.cs      | Interface            |
  | src/Koogle.Infrastructure/Services/DemoResetService.cs | Service              |
  | src/Koogle.Web/Store/Demo/DemoActions.cs               | Fluxor Actions       |
  | src/Koogle.Web/Store/Demo/DemoEffects.cs               | Fluxor Effects       |

  Geaenderte Dateien (6)

  | Datei                        | Aenderung                     |
  |------------------------------|-------------------------------|
  | appsettings.Development.json | Demo-Config hinzugefuegt      |
  | Program.cs                   | DemoSeeder.SeedAsync() Aufruf |
  | DependencyInjection.cs       | IDemoResetService registriert |
  | Login.razor                  | Demo-Hinweis-Box              |
  | Clubs.razor                  | Reset-Button + Confirm-Dialog |

  Demo-Daten

  - User: demo@koogle.de / demo123 (ClubAdmin, kein SuperAdmin)
  - Club: "Demo"
  - 8 Mitglieder: Hans Maier, Klaus Schmidt, Werner Braun, Dieter Fischer, Juergen Weber, Heinz Mueller, Rolf Schneider, Karl Hoffmann
  - 2 Gaeste: Stefan Gast, Thomas Besucher
  - 10 Expenses mit Trigger-Zuordnung (Gosse 0.50, Pudel 0.30, ... Abwesenheit 5.00)
  - 3 Spieltage mit Games
2025-12-28 12:10:15 +01:00
beo3000 44b04ec2de dev Trigger / Expense Masterdata, Seeder for triggers 2025-12-28 11:16:51 +01:00
beo3000 954c2589e6 added Trigger and Trigger/Expense Releations 2025-12-28 10:18:39 +01:00
beo3000 22fbb79801 added GameAction Framework 2025-12-28 08:34:23 +01:00
beo3000 82c6c2d91d mod layout 2025-12-27 22:54:51 +01:00
beo3000 37b8fc0e8d add: IsCleared 2025-12-27 22:46:54 +01:00
beo3000 03364291aa fix undo/redo handling 2025-12-27 21:46:20 +01:00
beo3000 191fb3db3f fix undo/redo handling 2025-12-27 20:51:03 +01:00
beo3000 0a7fb1f0af del UndoButton 2025-12-27 19:31:44 +01:00
beo3000 ea08ff9a5b fix throwhandle:
Zusammenfassung der Fixes:

  1. Fix 1 (HandlePinClick und HandleNumberClick): _hasModifiedPins = true wird jetzt VOR dem Dispatch gesetzt, um zu verhindern, dass OnGameStateChanged den Before-State während der Pin-Modifikation überschreibt.
  2. Fix 2 (ConfirmThrow): Nach dem Dispatch wird explizit CaptureBeforeThrowState() aufgerufen. Das ist der wichtigste Fix:
    - Nach RecordThrowAction Dispatch sind alle Reducer/Effects durchgelaufen
    - Der State ist bereits mit den neuen Pin-Zuständen aktualisiert
    - _beforeThrowState wird mit dem NEUEN Zustand für den nächsten Wurf erfasst

  Vorher wurde _beforeThrowState nie nach einem Wurf aktualisiert (weil _hasModifiedPins zum falschen Zeitpunkt gesetzt war), sodass beim zweiten Wurf der stale Before-State verwendet wurde.
2025-12-27 19:14:36 +01:00
beo3000 e50b13f092 add undo/redo 2025-12-27 18:23:24 +01:00
beo3000 48b96cec0c fix gutter 2025-12-27 16:59:07 +01:00
beo3000 c10329c468 fix: use DayState.AvailablePersons in game boards
🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-27 14:51:39 +01:00
beo3000 f297317b71 call gamelogic 2025-12-27 14:39:15 +01:00
beo3000 c33a6f9d91 add ThrowTimer 2025-12-27 14:18:45 +01:00
beo3000 5db650f2b2 fix "kein Holz" 2025-12-27 14:07:35 +01:00
beo3000 061ba4dbdb fix decrease mode 2025-12-27 14:01:32 +01:00
beo3000 aa8cf4d83a refactoring gameinput 2025-12-27 13:42:32 +01:00
beo3000 92dfb47a08 refactoring GameSetup 2025-12-27 13:15:18 +01:00
beo3000 f1880f08a8 save setup model 2025-12-27 11:45:19 +01:00
beo3000 65df43ed23 fix load game OnInitialized and OnParametersSet 2025-12-27 10:59:59 +01:00
beo3000 e436ee2754 Complete phase H8: Undo functionality (unbegrenzt)
- Add UndoButton.razor as reusable component
- Refactor GameInputPanel to use UndoButton component
- Enhance GameEffects with proper UndoThrowAction handler
- IState injection for state access in effects

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-27 09:11:40 +01:00
beo3000 23a1008a31 Complete phase H7: DayDetails Tabs Integration
- GameBoardPanel: Dynamic board component rendering
- CompletedGamesList: Shows game history for day
- DayDetails: 3 tabs (Details/Eingabe/Tafel) + Start/End Game buttons

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-27 08:33:34 +01:00
beo3000 5afc8fd251 Complete phase H6: Game Setup Dialog
- GameTypeSelector: Select game type from registry
- ParticipantSelector: Multi-select participants from day
- CommonSetupOptions: ThrowMode, ThrowsPerRound, ParticipantsMode
- GameSetupDialog: Full setup wizard with DynamicComponent

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-27 08:24:52 +01:00
beo3000 264f91d543 Complete phase H5: Scheiss-Spiel + Trigger-Integration
🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-27 08:16:22 +01:00
beo3000 8824162cd9 Add Training Game (Phase H4)
- TrainingGameDefinition with game type metadata
- TrainingGameModel + TrainingPlayerStats for stats tracking
- TrainingGameLogicService implementing game logic
- TrainingSetup.razor for config (ThrowMode, ThrowsPerRound, ParticipantsMode)
- TrainingBoard.razor showing player stats table with totals/averages
- Game type registration in Program.cs

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-26 14:49:26 +01:00
beo3000 8067ff3cf4 Add Pin Input Components (Phase H2)
- Pin.razor: clickable pin with Standing/Fallen/Disabled states
- PinPanel.razor: 9-pin layout in classic bowling configuration
- NumberPanel.razor: quick-entry 0-9, bell toggle, throw confirm
- ThrowPanel.razor: gutter buttons, throw counters, mode display
- GameInputPanel.razor: orchestrates all panels, handles throw logic
- ThrowResult.cs: throw result record with strike/circle detection

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-26 14:29:19 +01:00
beo3000 bef4309e0e mod: multiselect participants 2025-12-25 22:00:06 +01:00
beo3000 1e9cf520f6 mod Expense-Table, show time and chg order 2025-12-25 21:48:39 +01:00
beo3000 8d2222de8f select Person and Quick-Assign expenses 2025-12-25 21:36:43 +01:00
beo3000 0911236a0d feat(G8): add invite link handling for club membership 2025-12-25 21:17:00 +01:00
beo3000 97ea3b35ca feat(G7): add JoinClub page and no-club dashboard message 2025-12-25 21:07:40 +01:00
beo3000 e62bea77d8 feat(G6): add pending memberships tab to Admin Users
- Add tabs: "Alle Benutzer" + "Ausstehende Anträge"
- Show pending membership requests with approve/reject buttons
- Add RejectMembershipDialog with optional rejection reason

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-25 20:59:27 +01:00
beo3000 ec50e971a9 feat(G5): add PendingMembershipsWidget
- new PendingMembershipsWidget.razor shows pending membership count
- only visible to club admins/super admins
- integrated into Dashboard.razor
- click navigates to admin users page

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-25 20:53:41 +01:00
beo3000 1a7e596abd mod Sie-Form -> Du-Form 2025-12-25 18:44:26 +01:00
beo3000 32c48d2bc3 fix namespaces
add AccessDenied Page
2025-12-25 18:15:21 +01:00
beo3000 61bd41576a show name of selected club 2025-12-25 17:34:58 +01:00
beo3000 bb00aa8a11 fix AuthState 2025-12-25 17:18:00 +01:00
beo3000 245940b40e Add finalized navigation menu (F3)
- Dashboard link (all authenticated users)
- Spieltage, Personen (club-specific, require selected club)
- Stammdaten with Kostenvorlagen (ClubEditor+)
- Administration section with Vereine/Benutzer (SuperAdmin)
- Profile link for authenticated users

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-25 16:43:12 +01:00
beo3000 bc99bc25db Add evaluation components (F2)
- DayEvaluationComponent: shows day expense summary per person
- PersonEvaluationComponent: shows person expense summary + details

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-25 16:32:49 +01:00
beo3000 7c9f3c36d9 Add Dashboard page (F1)
- DashboardDto, IDashboardService, DashboardService
- Summary cards: members, guests, days, open expenses
- Recent days list with navigation
- Top penalty recipients list
- Home redirects to /dashboard
- Updated HomePageTests

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-25 15:26:35 +01:00
beo3000 343ad931d1 Add PersonExpense management to DayDetails (E4)
- Extend DayState with SelectedDayExpenses, AvailableExpenses
- Add Fluxor actions for load/create/update/delete expenses
- Add reducers + effects for PersonExpense operations
- Create AddPersonExpenseDialog with inverse expense support
- Update DayDetails with expense table, summary, status toggle

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-25 15:14:34 +01:00
beo3000 27be43fe53 merge day detils 2025-12-25 15:04:24 +01:00
beo3000 26378afdbd Add Day Details Page (E3)
🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-25 13:54:39 +01:00
beo3000 642c4d11bf Add Days List Page (E2)
🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-25 09:41:54 +01:00
beo3000 51600596c2 Add Expense Pages (D4) 2025-12-24 17:23:31 +01:00
beo3000 d74cdb678d mod AuthTest 2025-12-24 15:15:33 +01:00
beo3000 2d6a49309f Add Person Pages (D2)
- Persons.razor: MudTable with search/filter, CRUD dialogs
- PersonEditDialog.razor: Create/Edit form for persons

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-24 15:06:37 +01:00
beo3000 93b55a11e6 Add Club admin page with CRUD (Phase C2)
- Clubs.razor: MudTable with search, create/edit/delete
- ClubEditDialog.razor: Form for club name + expense calculation
- ConfirmDialog.razor: Reusable confirmation dialog

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-24 14:46:37 +01:00
beo3000 716ae6a604 added test-framework 2025-12-24 14:11:31 +01:00
beo3000 0bc0de2215 edit users 2025-12-23 17:57:16 +01:00
beo3000 d26a2cb1c5 add profile page 2025-12-23 17:28:14 +01:00
beo3000 ad3ac3185c add password reset 2025-12-23 17:09:24 +01:00
beo3000 fa7f1300d8 add registration
planning extend registration and club memberships
2025-12-23 16:58:32 +01:00
beo3000 9491ff26d8 mod layout 2025-12-21 23:01:56 +01:00
beo3000 d8c41ad712 add fluxor AuthState 2025-12-21 22:14:00 +01:00