feat(usability): name everyday tasks and prioritize common actions (U05)

This commit is contained in:
2026-11-02 06:29:32 +01:00
parent 9c41856b5b
commit 33a8abf5cc
6 changed files with 38 additions and 24 deletions
+4
View File
@@ -31,3 +31,7 @@ Einzelkonto und Übersicht enthalten nur wirksame Buchungen. Zeitraum und Bedeut
## U04 – Jahreskontext
Gemeinsame explizite Jahresauswahl bleibt beim Wechsel Übersicht/Konto/Zurück erhalten, auch „Alle Jahre“. Auswahl enthält aktuelles und gewähltes Jahr auch ohne Buchungen. Liste und Summen benennen den Zeitraum; Leerzustände unterscheiden fehlende Buchungen und leeren Zeitraum. Abweichendes Datum bleibt unverändert, erfordert eine gezielte Bestätigung im Formular und bietet nach Erfolg „Buchung im Jahr … anzeigen“. Prüfung: 21/21 Debug-Tests, einschließlich gerenderter Navigation 2025 → Konto → Zurück, Buchung 2026 bei Filter 2025 und anschließendem Aufruf des gespeicherten Jahres. Dabei bestehende doppelte DbContext-Registrierung korrigiert, da die Singleton-Factory sonst scoped Optionen konsumiert.
## U05 – Alltagssprache
Aktionsleisten benennen Erfassen, Kontenverschieben, PDF-Speichern und Sicherung ausführlich. Flexible Breiten und Zeilenumbruch ersetzen die feste 75-px-Breite. Rückspielen liegt weiterhin auffindbar unter „Weitere Aktionen“ und erklärt Umfang und Rückfallsicherung. „Kontostand“ und „Änderung im Jahr“ ersetzen Fachbegriffe. Umbuchung erklärt ausdrücklich, dass keine Banküberweisung ausgelöst wird. Anrede in den betroffenen Abläufen: du. Prüfung: 21/21 Debug-Tests; native Sichtprüfung folgt im Abschluss. Ein Nutzertest mit der Zielgruppe ist dadurch nicht ersetzt.
@@ -5,6 +5,8 @@
<div class="dialog-content" @onclick:stopPropagation="true">
<h5 class="mb-3">@(EditEntry != null ? "Umbuchung bearbeiten" : "Neue Umbuchung")</h5>
<p class="text-muted">Erfasst nur die Buchung. Führt keine Banküberweisung aus.</p>
<div class="form-container">
<label class="form-label">Zielkonto</label>
<select class="form-select" @bind="targetAccountId">
@@ -39,17 +39,15 @@
<button class="btn btn-secondary btn-nav" @onclick="NavigateBack">
<i class="bi bi-arrow-left"></i> Zurück
</button>
|
<button class="btn btn-success btn-nav" @onclick="() => showAddEntry = true">
<i class="bi bi-plus-lg"></i> Buchung
<i class="bi bi-plus-lg"></i> Einnahme oder Ausgabe erfassen
</button>
<button class="btn btn-info btn-nav" @onclick="() => showAddTransfer = true">
<i class="bi bi-arrow-left-right"></i> Umbuchung
<i class="bi bi-arrow-left-right"></i> Geld zwischen Konten verschieben
</button>
<button class="btn btn-dark btn-nav" @onclick="HandleExport" disabled="@fileBusy">
<i class="bi bi-file-earmark-pdf"></i> PDF
<i class="bi bi-file-earmark-pdf"></i> Als PDF speichern
</button>
|
<button class="btn btn-nav btn-primary" @onclick="OpenYearFilterDialog">
<i class="bi bi-funnel"></i> @GetFilterLabel()
</button>
@@ -61,7 +59,7 @@
<div class="summary-section">
<div class="summary-flex">
<div>
<small class="text-muted">Saldo</small>
<small class="text-muted">Kontostand</small>
<div class="fs-3 fw-bold @(balance.TotalBalance >= 0 ? "amount-positive" : "amount-negative")">
@FormatAmount(balance.TotalBalance)
</div>
@@ -91,7 +89,7 @@
</div>
</div>
<div class="text-end">
<small class="text-muted">Umsätze @selectedYear.Value</small>
<small class="text-muted">Änderung im Jahr @selectedYear.Value</small>
<div class="fw-bold @(balance.CurrentYearIncome - balance.CurrentYearExpense >= 0 ? "amount-positive" : "amount-negative")">
@FormatAmount(balance.CurrentYearIncome - balance.CurrentYearExpense)
</div>
@@ -166,7 +164,7 @@
@if (!string.IsNullOrWhiteSpace(savedPdfPath))
{
<ConfirmDialog Title="PDF öffnen"
Message="Die PDF wurde gespeichert. Möchten Sie sie jetzt öffnen?"
Message="Die PDF wurde gespeichert. Möchtest du sie jetzt öffnen?"
ConfirmText="Ja, öffnen"
CancelText="Nein"
ConfirmButtonClass="btn btn-primary"
+12 -11
View File
@@ -28,24 +28,25 @@
<button class="btn-nav btn-primary" @onclick="() => showAddAccount = true">
<i class="bi bi-plus-lg"></i> Neues Konto
</button>
|
<button class="btn-nav btn-success" @onclick="HandleBackupAsync" disabled="@fileBusy">
<i class="bi bi-save"></i> Backup
<i class="bi bi-save"></i> Sicherung erstellen
</button>
<button class="btn-nav btn-warning" @onclick="HandleRestoreAsync" disabled="@fileBusy">
<i class="bi bi-arrow-counterclockwise"></i> Restore
</button>
|
<button class="btn-nav btn-dark" @onclick="HandleDashboardExportAsync" disabled="@fileBusy">
<i class="bi bi-file-earmark-pdf"></i> PDF
<i class="bi bi-file-earmark-pdf"></i> Als PDF speichern
</button>
|
<button class="btn btn-nav btn-primary" @onclick="OpenYearFilterDialog">
<i class="bi bi-funnel"></i> @GetFilterLabel()
</button>
<button class="btn btn-nav btn-secondary" @onclick="ToggleThemeAsync" title="Farbmodus wechseln">
<i class="@ThemeButtonIconClass"></i> Modus<br>@ThemeButtonLabel
</button>
<details class="more-actions">
<summary class="btn btn-outline-secondary">Weitere Aktionen</summary>
<button class="btn btn-warning mt-2" @onclick="HandleRestoreAsync" disabled="@fileBusy">
<i class="bi bi-arrow-counterclockwise"></i> Sicherung zurückspielen
</button>
</details>
</div>
@if (accounts != null && accounts.Any())
@@ -92,7 +93,7 @@
@if (!string.IsNullOrWhiteSpace(savedPdfPath))
{
<ConfirmDialog Title="PDF öffnen"
Message="Die PDF wurde gespeichert. Möchten Sie sie jetzt öffnen?"
Message="Die PDF wurde gespeichert. Möchtest du sie jetzt öffnen?"
ConfirmText="Ja, öffnen"
CancelText="Nein"
ConfirmButtonClass="btn btn-primary"
@@ -103,8 +104,8 @@
@if (showRestoreConfirm)
{
<ConfirmDialog Title="Restore bestätigen"
Message="Restore überschreibt die aktuelle Datenbank. Möchten Sie fortfahren?"
<ConfirmDialog Title="Sicherung zurückspielen"
Message="Die Buchungen und Konten werden durch die gewählte Sicherung ersetzt. Vorher wird eine Rückfallsicherung erstellt. Vereinsname und Darstellung sind nicht enthalten. Möchtest du fortfahren?"
ConfirmText="Ja, wiederherstellen"
CancelText="Nein, abbrechen"
ConfirmButtonClass="btn btn-warning"
+11 -2
View File
@@ -217,8 +217,14 @@ html, body {
}
.btn-nav {
width: 75px;
height: 75px;
width: auto;
min-width: 7rem;
max-width: 15rem;
min-height: 75px;
height: auto;
white-space: normal;
overflow-wrap: anywhere;
text-align: center;
display: flex;
flex-direction: column;
gap: 0;
@@ -588,3 +594,6 @@ input[type="number"].no-spinner {
margin-bottom: 0.3rem;
}
.more-actions { align-self: center; }
.more-actions[open] { padding: .5rem; border: 1px solid var(--color-border); border-radius: .5rem; }
@@ -40,7 +40,7 @@ public class YearNavigationTests
page.WaitForAssertion(() => Assert.Contains("Jahr: 2025", page.Markup));
page.Find(".account-card").Click();
page.WaitForElement(".summary-section");
page.FindAll("button").Single(b => b.TextContent.Trim() == "Buchung").Click();
page.FindAll("button").Single(b => b.TextContent.Contains("Einnahme oder Ausgabe erfassen")).Click();
var dialog = page.FindComponent<AddEntryDialog>();
dialog.Find("input[type=date]").Change("2026-01-02");
dialog.Find("input[type=text]").Change("Außerhalb");