This commit is contained in:
beo3000 2025-11-06 07:38:47 +01:00
parent 77a42808fd
commit c629237c55
8 changed files with 147 additions and 23 deletions

View File

@ -1,8 +1,13 @@
@using KoogleApp.Data
@using KoogleApp.Model
@using KoogleApp.Model.EventMessages
@using KoogleApp.Services;
@implements IMyHandle<PlayerViewChangedMessage>
@inject SharedDataService _sharedDataService
@inject IMyEventAggregator _eventAggregator
@inject SessionStorage _sessionStorage
<MudGrid>
@ -16,16 +21,32 @@
</MudGrid>
@code {
private Player _player;
private Player? _player;
protected override void OnInitialized()
{
_eventAggregator.Subscribe(this);
}
public async ValueTask DisposeAsync()
{
_eventAggregator.Unsubscribe(this);
}
protected override async Task OnAfterRenderAsync(bool firstRender)
{
if (firstRender)
{
_player = await _sharedDataService.GetByIdAsync(1);
_player = await _sessionStorage.GetSelectedPlayerAsync();
StateHasChanged();
}
}
public async Task HandleAsync(PlayerViewChangedMessage message)
{
_player = await _sessionStorage.GetSelectedPlayerAsync();
StateHasChanged();
}
}

View File

@ -4,33 +4,39 @@
@using KoogleApp.Model.Framework
@using KoogleApp.Services
@implements IMyHandle<PlayerViewChangedMessage>
@implements IDisposable
@inject IMyEventAggregator _eventAggregator
@inject SharedDataService _sharedDataService
@inject SessionStorage _sessionStorage
@if (_players != null)
{
<MudList T="Player" Color="@Color.Info"
@ref="_list"
@bind-SelectedValue="SelectedValue"
SelectionMode="SelectionMode.SingleSelection">
<MudNavMenu>
@if (_players != null)
{
@foreach (var player in _players)
{
<MudNavLink Match="NavLinkMatch.All" OnClick="@(async e => await OnPlayerClick(player.Id))">@player.Name</MudNavLink>
<MudListItem Text="@player.Name"
OnClick="OnClick"
Value="@player"/>
}
}
</MudNavMenu>
</MudList>
}
@* <MudGrid>
<MudItem xs="12">
<MudPaper Class="d-flex align-center justify-center mud-width-full py-0">
Players Panel
</MudPaper>
</MudItem>
</MudGrid> *@
@code {
private List<Player> _players;
private MudList<Player> _list;
public Player? SelectedValue;
private List<Player>? _players;
protected override async Task OnAfterRenderAsync(bool firstRender)
{
@ -41,9 +47,43 @@
}
}
private async Task OnPlayerClick(int playerId)
private async Task OnClick(MouseEventArgs obj)
{
await _sessionStorage.SetSelectedPlayerAsync(SelectedValue);
await _eventAggregator.PublishAsync(new GameViewChangedMessage(GameView.Player) { Scope = EventScope.Circuit });
if (SelectedValue != null)
{
await _eventAggregator.PublishAsync(new PlayerViewChangedMessage(SelectedValue.Id, this) { Scope = EventScope.Circuit });
}
}
public async Task HandleAsync(PlayerViewChangedMessage message)
{
if (message.Sender == this)
{
return;
}
SelectedValue = await _sessionStorage.GetSelectedPlayerAsync();
// _list.SelectedValue = SelectedValue;
StateHasChanged();
// await InvokeAsync(StateHasChanged);
}
protected override void OnInitialized()
{
_eventAggregator.Subscribe(this);
}
public void Dispose()
{
_eventAggregator.Unsubscribe(this);
}
}

View File

@ -11,6 +11,8 @@
@attribute [Authorize()]
@implements IAsyncDisposable
@inject NavigationManager Navigation
@inject AuthenticationStateProvider AuthenticationStateProvider
@inject IMyEventAggregator _eventAggregator

View File

@ -0,0 +1,19 @@
using KoogleApp.Components.Controls;
using KoogleApp.Model.Framework;
namespace KoogleApp.Model.EventMessages
{
public class PlayerViewChangedMessage : ScopedEventBase
{
public int PlayerId { get; set; }
public PlayersPanel Sender { get; set; }
public PlayerViewChangedMessage(int playerId, PlayersPanel sender)
{
Scope = EventScope.User;
PlayerId = playerId;
Sender = sender;
}
}
}

View File

@ -0,0 +1,14 @@
namespace KoogleApp.Model
{
public class PlayerExpense
{
public int Id { get; set; }
public int PlayerId { get; set; } // Foreign Key
public string Name { get; set; } = string.Empty;
// Navigation Property zurück zum Parent
public Player? Player { get; set; }
}
}

View File

@ -8,6 +8,7 @@ namespace KoogleApp.Services
public static IServiceCollection AddAppServices(this IServiceCollection services)
{
services.AddScopedEventAggregator();
services.AddScoped<SessionStorage>();
// Memory Cache
services.AddMemoryCache();

View File

@ -0,0 +1,19 @@
using KoogleApp.Model;
using Microsoft.AspNetCore.Components.Server.ProtectedBrowserStorage;
namespace KoogleApp.Services
{
public class SessionStorage(ProtectedSessionStorage sessionStorage, ProtectedLocalStorage localStorage)
{
public async Task<Player?> GetSelectedPlayerAsync()
{
var result = await sessionStorage.GetAsync<Player>("selectedPlayer");
return result.Success ? result.Value : null;
}
public async Task SetSelectedPlayerAsync(Player? record)
{
await sessionStorage.SetAsync("selectedPlayer", record);
}
}
}

View File

@ -3,11 +3,19 @@
"Status": {
"Content": "Willkommen! Starte die Zusammenarbeit."
},
"Version": 2,
"LastModified": "2025-11-03T19:09:57.4404986+01:00",
"Version": 3,
"LastModified": "2025-11-05T20:53:27.735651+01:00",
"LastModifiedBy": "test1@test.de"
},
"UndoHistory": [
{
"Status": {
"Content": "Willkommen! Starte die Zusammenarbeit."
},
"Version": 2,
"LastModified": "2025-11-03T19:09:57.4404986+01:00",
"LastModifiedBy": "test1@test.de"
},
{
"Status": {
"Content": "Willkommen! Starte die Zusammenarbeit."