feat(usability): name everyday tasks and prioritize common actions (U05)
This commit is contained in:
@@ -31,3 +31,7 @@ Einzelkonto und Übersicht enthalten nur wirksame Buchungen. Zeitraum und Bedeut
|
|||||||
## U04 – Jahreskontext
|
## 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.
|
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">
|
<div class="dialog-content" @onclick:stopPropagation="true">
|
||||||
<h5 class="mb-3">@(EditEntry != null ? "Umbuchung bearbeiten" : "Neue Umbuchung")</h5>
|
<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">
|
<div class="form-container">
|
||||||
<label class="form-label">Zielkonto</label>
|
<label class="form-label">Zielkonto</label>
|
||||||
<select class="form-select" @bind="targetAccountId">
|
<select class="form-select" @bind="targetAccountId">
|
||||||
|
|||||||
@@ -39,18 +39,16 @@
|
|||||||
<button class="btn btn-secondary btn-nav" @onclick="NavigateBack">
|
<button class="btn btn-secondary btn-nav" @onclick="NavigateBack">
|
||||||
<i class="bi bi-arrow-left"></i> Zurück
|
<i class="bi bi-arrow-left"></i> Zurück
|
||||||
</button>
|
</button>
|
||||||
|
|
<button class="btn btn-success btn-nav" @onclick="() => showAddEntry = true">
|
||||||
<button class="btn btn-success btn-nav" @onclick="() => showAddEntry = true">
|
<i class="bi bi-plus-lg"></i> Einnahme oder Ausgabe erfassen
|
||||||
<i class="bi bi-plus-lg"></i> Buchung
|
|
||||||
</button>
|
</button>
|
||||||
<button class="btn btn-info btn-nav" @onclick="() => showAddTransfer = true">
|
<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>
|
||||||
<button class="btn btn-dark btn-nav" @onclick="HandleExport" disabled="@fileBusy">
|
<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>
|
||||||
|
|
<button class="btn btn-nav btn-primary" @onclick="OpenYearFilterDialog">
|
||||||
<button class="btn btn-nav btn-primary" @onclick="OpenYearFilterDialog">
|
|
||||||
<i class="bi bi-funnel"></i> @GetFilterLabel()
|
<i class="bi bi-funnel"></i> @GetFilterLabel()
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
@@ -61,7 +59,7 @@
|
|||||||
<div class="summary-section">
|
<div class="summary-section">
|
||||||
<div class="summary-flex">
|
<div class="summary-flex">
|
||||||
<div>
|
<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")">
|
<div class="fs-3 fw-bold @(balance.TotalBalance >= 0 ? "amount-positive" : "amount-negative")">
|
||||||
@FormatAmount(balance.TotalBalance)
|
@FormatAmount(balance.TotalBalance)
|
||||||
</div>
|
</div>
|
||||||
@@ -91,7 +89,7 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="text-end">
|
<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")">
|
<div class="fw-bold @(balance.CurrentYearIncome - balance.CurrentYearExpense >= 0 ? "amount-positive" : "amount-negative")">
|
||||||
@FormatAmount(balance.CurrentYearIncome - balance.CurrentYearExpense)
|
@FormatAmount(balance.CurrentYearIncome - balance.CurrentYearExpense)
|
||||||
</div>
|
</div>
|
||||||
@@ -166,7 +164,7 @@
|
|||||||
@if (!string.IsNullOrWhiteSpace(savedPdfPath))
|
@if (!string.IsNullOrWhiteSpace(savedPdfPath))
|
||||||
{
|
{
|
||||||
<ConfirmDialog Title="PDF öffnen"
|
<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"
|
ConfirmText="Ja, öffnen"
|
||||||
CancelText="Nein"
|
CancelText="Nein"
|
||||||
ConfirmButtonClass="btn btn-primary"
|
ConfirmButtonClass="btn btn-primary"
|
||||||
|
|||||||
@@ -28,24 +28,25 @@
|
|||||||
<button class="btn-nav btn-primary" @onclick="() => showAddAccount = true">
|
<button class="btn-nav btn-primary" @onclick="() => showAddAccount = true">
|
||||||
<i class="bi bi-plus-lg"></i> Neues Konto
|
<i class="bi bi-plus-lg"></i> Neues Konto
|
||||||
</button>
|
</button>
|
||||||
|
|
|
||||||
<button class="btn-nav btn-success" @onclick="HandleBackupAsync" disabled="@fileBusy">
|
<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>
|
||||||
<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">
|
<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>
|
||||||
|
|
|
||||||
<button class="btn btn-nav btn-primary" @onclick="OpenYearFilterDialog">
|
<button class="btn btn-nav btn-primary" @onclick="OpenYearFilterDialog">
|
||||||
<i class="bi bi-funnel"></i> @GetFilterLabel()
|
<i class="bi bi-funnel"></i> @GetFilterLabel()
|
||||||
</button>
|
</button>
|
||||||
<button class="btn btn-nav btn-secondary" @onclick="ToggleThemeAsync" title="Farbmodus wechseln">
|
<button class="btn btn-nav btn-secondary" @onclick="ToggleThemeAsync" title="Farbmodus wechseln">
|
||||||
<i class="@ThemeButtonIconClass"></i> Modus<br>@ThemeButtonLabel
|
<i class="@ThemeButtonIconClass"></i> Modus<br>@ThemeButtonLabel
|
||||||
</button>
|
</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>
|
</div>
|
||||||
|
|
||||||
@if (accounts != null && accounts.Any())
|
@if (accounts != null && accounts.Any())
|
||||||
@@ -92,7 +93,7 @@
|
|||||||
@if (!string.IsNullOrWhiteSpace(savedPdfPath))
|
@if (!string.IsNullOrWhiteSpace(savedPdfPath))
|
||||||
{
|
{
|
||||||
<ConfirmDialog Title="PDF öffnen"
|
<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"
|
ConfirmText="Ja, öffnen"
|
||||||
CancelText="Nein"
|
CancelText="Nein"
|
||||||
ConfirmButtonClass="btn btn-primary"
|
ConfirmButtonClass="btn btn-primary"
|
||||||
@@ -103,8 +104,8 @@
|
|||||||
|
|
||||||
@if (showRestoreConfirm)
|
@if (showRestoreConfirm)
|
||||||
{
|
{
|
||||||
<ConfirmDialog Title="Restore bestätigen"
|
<ConfirmDialog Title="Sicherung zurückspielen"
|
||||||
Message="Restore überschreibt die aktuelle Datenbank. Möchten Sie fortfahren?"
|
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"
|
ConfirmText="Ja, wiederherstellen"
|
||||||
CancelText="Nein, abbrechen"
|
CancelText="Nein, abbrechen"
|
||||||
ConfirmButtonClass="btn btn-warning"
|
ConfirmButtonClass="btn btn-warning"
|
||||||
|
|||||||
@@ -217,8 +217,14 @@ html, body {
|
|||||||
}
|
}
|
||||||
|
|
||||||
.btn-nav {
|
.btn-nav {
|
||||||
width: 75px;
|
width: auto;
|
||||||
height: 75px;
|
min-width: 7rem;
|
||||||
|
max-width: 15rem;
|
||||||
|
min-height: 75px;
|
||||||
|
height: auto;
|
||||||
|
white-space: normal;
|
||||||
|
overflow-wrap: anywhere;
|
||||||
|
text-align: center;
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
gap: 0;
|
gap: 0;
|
||||||
@@ -588,3 +594,6 @@ input[type="number"].no-spinner {
|
|||||||
margin-bottom: 0.3rem;
|
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.WaitForAssertion(() => Assert.Contains("Jahr: 2025", page.Markup));
|
||||||
page.Find(".account-card").Click();
|
page.Find(".account-card").Click();
|
||||||
page.WaitForElement(".summary-section");
|
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>();
|
var dialog = page.FindComponent<AddEntryDialog>();
|
||||||
dialog.Find("input[type=date]").Change("2026-01-02");
|
dialog.Find("input[type=date]").Change("2026-01-02");
|
||||||
dialog.Find("input[type=text]").Change("Außerhalb");
|
dialog.Find("input[type=text]").Change("Außerhalb");
|
||||||
|
|||||||
Reference in New Issue
Block a user