|
30 | 30 | </div> |
31 | 31 | <div class="stat-item complete"> |
32 | 32 | <span class="stat-number">@(_winners.Count > 0 |
33 | | - ? Math.Round((double)OwnedCount / _winners.Count * 100, 1) |
34 | | - : 0)%</span> |
| 33 | + ? Math.Round((double)OwnedCount / _winners.Count * 100, 1) |
| 34 | + : 0)%</span> |
35 | 35 | <span class="stat-label">Complete</span> |
36 | 36 | </div> |
37 | 37 | </div> |
|
41 | 41 |
|
42 | 42 | <div class="collection-summary"> |
43 | 43 | <span class="collection-count">@_winners.Count of @_winners.Count cars</span> |
| 44 | + <button class="btn btn-secondary btn-sm" @onclick="ShowUserIdModal">Change User ID</button> |
44 | 45 | </div> |
45 | 46 |
|
46 | 47 | <div class="collection-tabs"> |
47 | 48 | <button class="tab-btn @(_activeFilter == FilterType.All ? "active" : "")" |
48 | | - @onclick="() => SetFilter(FilterType.All)">All Winners (@_winners.Count) |
| 49 | + @onclick="() => SetFilter(FilterType.All)">All Winners (@_winners.Count) |
49 | 50 | </button> |
50 | 51 | <button class="tab-btn @(_activeFilter == FilterType.Owned ? "active" : "")" |
51 | | - @onclick="() => SetFilter(FilterType.Owned)">Owned (@OwnedCount) |
| 52 | + @onclick="() => SetFilter(FilterType.Owned)">Owned (@OwnedCount) |
52 | 53 | </button> |
53 | 54 | <button class="tab-btn @(_activeFilter == FilterType.NotOwned ? "active" : "")" |
54 | | - @onclick="() => SetFilter(FilterType.NotOwned)">Not Owned (@(_winners.Count - OwnedCount)) |
| 55 | + @onclick="() => SetFilter(FilterType.NotOwned)">Not Owned (@(_winners.Count - OwnedCount)) |
55 | 56 | </button> |
56 | 57 | </div> |
57 | 58 |
|
58 | 59 | <div class="car-grid"> |
59 | 60 | @foreach (var winner in FilteredWinners) |
60 | 61 | { |
61 | | - <CarCard Car="@winner" OnOwnershipChanged="OnOwnershipChanged"/> |
| 62 | + <CarCard Car="@winner" OnOwnershipChanged="OnOwnershipChanged" /> |
62 | 63 | } |
63 | 64 | </div> |
64 | 65 |
|
| 66 | +<!-- User ID Change Modal --> |
| 67 | +@if (_showUserIdModal) |
| 68 | +{ |
| 69 | + <div class="modal-backdrop" @onclick="HideUserIdModal"> |
| 70 | + <div class="modal-content" @onclick:stopPropagation="true"> |
| 71 | + <div class="modal-header"> |
| 72 | + <h5>Change User ID</h5> |
| 73 | + <button type="button" class="btn-close" @onclick="HideUserIdModal">×</button> |
| 74 | + </div> |
| 75 | + <div class="modal-body"> |
| 76 | + <p>Current User ID: <strong>@_userId</strong></p> |
| 77 | + <label for="newUserId">New User ID:</label> |
| 78 | + <input type="number" id="newUserId" @bind="_newUserId" class="form-control" min="1" /> |
| 79 | + </div> |
| 80 | + <div class="modal-footer"> |
| 81 | + <button type="button" class="btn btn-secondary" @onclick="HideUserIdModal">Cancel</button> |
| 82 | + <button type="button" class="btn btn-primary" @onclick="UpdateUserId">Update</button> |
| 83 | + </div> |
| 84 | + </div> |
| 85 | + </div> |
| 86 | +} |
| 87 | + |
65 | 88 | @code { |
66 | 89 | private List<Winner> _winners = []; |
67 | 90 | private FilterType _activeFilter = FilterType.All; |
68 | 91 |
|
69 | 92 | private int OwnedCount => _winners.Count(c => c.IsOwned); |
70 | 93 | private bool ShowHeader => FeatureFlags.EnableStatsHeader; |
71 | 94 | private int _userId; |
| 95 | + private bool _showUserIdModal; |
| 96 | + private int _newUserId; |
72 | 97 |
|
73 | 98 | private IEnumerable<Winner> FilteredWinners => _activeFilter switch |
74 | 99 | { |
|
103 | 128 | protected override async Task OnAfterRenderAsync(bool firstRender) |
104 | 129 | { |
105 | 130 | // Initialize user ID from local storage |
106 | | - await GetUserId(); |
107 | | - StateHasChanged(); |
| 131 | + if (firstRender) |
| 132 | + { |
| 133 | + await GetUserId(); |
| 134 | + StateHasChanged(); |
| 135 | + } |
108 | 136 | } |
109 | 137 |
|
110 | 138 | private async Task GetUserId() |
|
149 | 177 | StateHasChanged(); |
150 | 178 | } |
151 | 179 |
|
| 180 | + private void ShowUserIdModal() |
| 181 | + { |
| 182 | + _newUserId = _userId; // Initialize with current value |
| 183 | + _showUserIdModal = true; |
| 184 | + StateHasChanged(); |
| 185 | + } |
| 186 | + |
| 187 | + private void HideUserIdModal() |
| 188 | + { |
| 189 | + _showUserIdModal = false; |
| 190 | + StateHasChanged(); |
| 191 | + } |
| 192 | + |
| 193 | + private async Task UpdateUserId() |
| 194 | + { |
| 195 | + if (_newUserId > 0) |
| 196 | + { |
| 197 | + _userId = _newUserId; |
| 198 | + await JsRuntime.InvokeVoidAsync("localStorage.setItem", "userId", _userId.ToString()); |
| 199 | + Logger.LogInformation("Updated user ID to: {UserId}", _userId); |
| 200 | + _showUserIdModal = false; |
| 201 | + StateHasChanged(); |
| 202 | + } |
| 203 | + } |
| 204 | + |
152 | 205 | } |
0 commit comments