refactor(app): implement year filtering for accounts and enhance dashboard PDF generation

This commit is contained in:
2026-04-03 14:24:46 +02:00
parent 4636acf7b0
commit 68c7a1ca6a
10 changed files with 208 additions and 34 deletions
@@ -39,8 +39,8 @@
<i class="bi bi-file-earmark-pdf"></i> PDF
</button>
|
<button class="btn btn-nav @(selectedYear.HasValue ? "btn-primary" : "btn-outline-secondary")" @onclick="OpenYearFilterDialog">
<i class="bi bi-funnel"></i> Filter<br>@GetFilterLabel()
<button class="btn btn-nav btn-primary" @onclick="OpenYearFilterDialog">
<i class="bi bi-funnel"></i> Ansicht<br>@GetFilterLabel()
</button>
</div>
+31
View File
@@ -4,6 +4,7 @@
@inject ISettingsService SettingsService
@inject IPdfStatementService PdfStatementService
@inject IFileSaveService FileSaveService
@inject IEntryService EntryService
@inject NavigationManager NavigationManager
<div class="container-fluid">
@@ -34,6 +35,10 @@
<button class="btn-nav btn-dark" @onclick="HandleDashboardExportAsync">
<i class="bi bi-file-earmark-pdf"></i> PDF
</button>
|
<button class="btn btn-nav btn-primary" @onclick="OpenYearFilterDialog">
<i class="bi bi-funnel"></i> Ansicht<br>@GetFilterLabel()
</button>
</div>
@if (accounts != null && accounts.Any())
@@ -107,3 +112,29 @@
OnCancel="CancelRestoreConfirm" />
}
@if (showYearFilterDialog)
{
<div class="dialog-backdrop" @onclick="CloseYearFilterDialog">
<div class="dialog-content" @onclick:stopPropagation="true">
<h5>Filter auswählen</h5>
<p class="text-muted mb-3">Wähle ein Jahr oder alle Buchungen.</p>
<div class="filter-options-grid">
<button class="btn @(selectedYear.HasValue ? "btn-outline-secondary" : "btn-primary")" @onclick="() => SelectFilterYear(null)">
Alle Buchungen
</button>
@foreach (var year in availableYears)
{
<button class="btn @(selectedYear == year ? "btn-primary" : "btn-outline-secondary")" @onclick="() => SelectFilterYear(year)">
@year
</button>
}
</div>
<div class="d-flex justify-content-end mt-3">
<button class="btn btn-outline-secondary" @onclick="CloseYearFilterDialog">
<i class="bi bi-x-lg"></i> Schließen
</button>
</div>
</div>
</div>
}
+34 -5
View File
@@ -11,6 +11,9 @@ public partial class Dashboard
private bool showAddAccount;
private bool showEditClubName;
private bool showRestoreConfirm;
private bool showYearFilterDialog;
private int? selectedYear = DateTime.Now.Year;
private List<int> availableYears = [];
private string clubName = string.Empty;
private string? operationMessage;
private string operationMessageClass = "alert-info";
@@ -31,16 +34,22 @@ public partial class Dashboard
protected override async Task OnInitializedAsync()
{
await LoadClubName();
await LoadAccounts();
await LoadAll();
}
#endregion
#region Data Loading
private async Task LoadAll()
{
await LoadAccounts();
availableYears = await EntryService.GetAllEntryYearsAsync();
}
private async Task LoadAccounts()
{
accounts = await AccountService.GetAllAccountsAsync();
accounts = await AccountService.GetAllAccountsAsync(selectedYear);
}
private async Task LoadClubName()
@@ -56,7 +65,7 @@ public partial class Dashboard
{
await AccountService.CreateAccountAsync(name);
showAddAccount = false;
await LoadAccounts();
await LoadAll();
}
private async Task HandleSaveClubName(string newName)
@@ -104,8 +113,26 @@ public partial class Dashboard
private async Task HandleDashboardExportAsync()
{
var pdf = await PdfStatementService.GenerateDashboardStatementAsync();
savedPdfPath = await FileSaveService.SaveFileAsync(pdf, $"{DisplayClubName}_Übersicht.pdf");
var pdf = await PdfStatementService.GenerateDashboardStatementAsync(selectedYear);
var suffix = selectedYear.HasValue ? $"_{selectedYear.Value}" : "_Gesamt";
savedPdfPath = await FileSaveService.SaveFileAsync(pdf, $"{DisplayClubName}_Übersicht{suffix}.pdf");
}
private void OpenYearFilterDialog()
{
showYearFilterDialog = true;
}
private void CloseYearFilterDialog()
{
showYearFilterDialog = false;
}
private async Task SelectFilterYear(int? year)
{
selectedYear = year;
showYearFilterDialog = false;
await LoadAll();
}
private async Task HandleOpenSavedPdf()
@@ -138,5 +165,7 @@ public partial class Dashboard
return amount.ToString("N2", CultureInfo.GetCultureInfo("de-DE")) + " €";
}
private string GetFilterLabel() => selectedYear?.ToString() ?? "Alle";
#endregion
}