diff --git a/BudgetApp/Components/Pages/Help.razor b/BudgetApp/Components/Pages/Help.razor index 4dfd669..e96dad4 100644 --- a/BudgetApp/Components/Pages/Help.razor +++ b/BudgetApp/Components/Pages/Help.razor @@ -125,6 +125,32 @@ + @* ── Reports ── *@ +
+
+
📈 Reports
+
+
+

The Reports page gives you a visual breakdown of your spending and income over a chosen time period.

+ +
Filters
+ + +
Charts
+ + +
Category Summary Table
+

Below the charts is a table listing every category with its total income, total expenses and net amount. A totals row at the bottom shows the overall figures for the period.

+
+
+ @* ── Settings ── *@
@@ -168,6 +194,7 @@ 🏦 Accounts 💸 Transactions 🏷️ Categories + 📈 Reports ⚙️ Settings 💡 Tips
diff --git a/BudgetApp/budgetapp.db-shm b/BudgetApp/budgetapp.db-shm index 8be99ab..38f52a3 100644 Binary files a/BudgetApp/budgetapp.db-shm and b/BudgetApp/budgetapp.db-shm differ diff --git a/BudgetApp/budgetapp.db-wal b/BudgetApp/budgetapp.db-wal index 9053516..abb10ff 100644 Binary files a/BudgetApp/budgetapp.db-wal and b/BudgetApp/budgetapp.db-wal differ diff --git a/README.md b/README.md index e2eadc2..8724911 100644 --- a/README.md +++ b/README.md @@ -5,16 +5,25 @@ A personal finance dashboard built with Blazor Server (.NET 10). +> **Status:** beta — see the in-app badge. + ## Features - **Multi-account support** — current accounts, savings, credit cards, each with its own currency and colour - **Transaction tracking** — income & expenses with date, category, and account assignment - **Recurring transactions** — daily, weekly, monthly, or yearly recurrence with automatic materialisation up to one year ahead -- **Dashboard** — balance trend chart (Chart.js), recent & upcoming transaction lists, inline balance editing, and configurable time window +- **Dashboard** — balance trend chart (Chart.js), recent & upcoming transaction lists, account filter toggles, inline balance editing, and configurable time window +- **Reports** — doughnut charts for expenses and income by category, monthly income vs expenses bar chart, and a category summary table with filterable date range and account selection - **Categories** — emoji-icon categories with sensible defaults and full CRUD -- **Authentication** — ASP.NET Identity with registration, login, password change, and account deletion -- **Sortable transaction table** — click column headers to reorder by date, description, or amount -- **Responsive UI** — Bootstrap 5, mobile-friendly layout with collapsible sidebar +- **Transactions table** — sortable columns, search, pagination, per-account filtering, time-window presets, bulk selection & delete, and responsive column hiding on mobile +- **Authentication** — ASP.NET Identity with registration, login, password change, account deletion, and 5-attempt lockout +- **SSO providers** — optional Google, Microsoft, and GitHub sign-in (configured via `appsettings.json`) +- **Settings** — change password, reset all data (with confirmation), delete account +- **Toast notifications** — inline validation feedback via a toast system +- **Help & About pages** — in-app guides, tips, and project info +- **Responsive UI** — Bootstrap 5, mobile-friendly layout with collapsible sidebar, responsive table columns, and scoped CSS +- **CI/CD** — GitHub Actions for build/test and Docker Hub publishing +- **Docker** — multi-stage Dockerfile with volume-mounted SQLite, OCI image labels, and automatic security patching ## Tech Stack @@ -22,9 +31,12 @@ A personal finance dashboard built with Blazor Server (.NET 10). |---|---| | Framework | .NET 10 / Blazor Server (InteractiveServer) | | Database | SQLite via EF Core | -| Auth | ASP.NET Core Identity | +| Auth | ASP.NET Core Identity + optional Google / Microsoft / GitHub SSO | | Charts | Chart.js (CDN) with JS interop | | CSS | Bootstrap 5, scoped CSS | +| Tests | xUnit | +| CI/CD | GitHub Actions | +| Container | Docker (multi-stage build) | ## Getting Started @@ -41,6 +53,12 @@ dotnet run The app will be available at `https://localhost:5001` (or the port shown in the console). A `budgetapp.db` SQLite file is created automatically on first run. +### Run Tests + +```bash +dotnet test +``` + ### Run with Docker ```bash @@ -62,14 +80,24 @@ The app will be available at `http://localhost:8080`. BudgetApp/ ├── Components/ │ ├── Layout/ # MainLayout, AuthLayout, NavMenu -│ └── Pages/ # Home, Accounts, Transactions, Categories, Settings, Login, Register +│ ├── Pages/ # Home, Accounts, Transactions, Categories, +│ │ # Reports, Settings, Help, About, Login, Register +│ ├── ToastContainer.razor +│ └── ToastValidator.razor ├── Data/ # EF Core entities, DbContext, Identity user ├── Migrations/ # EF Core migrations (SQLite) -├── Services/ # AccountService, TransactionService, CategoryService, DashboardService +├── Services/ # AccountService, TransactionService, CategoryService, +│ # DashboardService, ToastService, AppState └── wwwroot/ ├── app.css # Global styles └── js/ - └── chart-interop.js # Chart.js interop (balance trend, crosshair, highlight) + └── chart-interop.js # Chart.js interop (line, doughnut, bar charts) + +BudgetApp.Tests/ +├── Helpers/ # TestDbContextFactory +├── Models/ # AccountModelTests +└── Services/ # AccountService, TransactionService, CategoryService, + # DashboardService tests ``` ## Configuration @@ -90,6 +118,29 @@ Override at runtime via environment variable: export ConnectionStrings__DefaultConnection="Data Source=/path/to/budgeteer.db" ``` +### SSO Providers (optional) + +Add client credentials to `appsettings.json` (or via environment / user-secrets). Each provider is only registered when both `ClientId` and `ClientSecret` are non-empty. + +```json +{ + "Authentication": { + "Google": { + "ClientId": "", + "ClientSecret": "" + }, + "Microsoft": { + "ClientId": "", + "ClientSecret": "" + }, + "GitHub": { + "ClientId": "", + "ClientSecret": "" + } + } +} +``` + ## Licence This project is provided as-is for personal use.