From 4e03c65c078ba03789130aa243f85d0921b7f163 Mon Sep 17 00:00:00 2001 From: JKuijperM Date: Wed, 29 Jul 2026 13:29:28 +0200 Subject: [PATCH 1/9] Created the .env.example --- expenses_manager/.env.example | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 expenses_manager/.env.example diff --git a/expenses_manager/.env.example b/expenses_manager/.env.example new file mode 100644 index 0000000..faaef7b --- /dev/null +++ b/expenses_manager/.env.example @@ -0,0 +1,17 @@ +# Django +DEBUG=True +SECRET_KEY=genera-una-clave-aqui + +# Hosts (separados por comas). En producción, tu dominio real. +ALLOWED_HOSTS=localhost,127.0.0.1 +CSRF_TRUSTED_ORIGINS= + +# Base de datos. +# En local puedes dejar DB_ENGINE vacío o en sqlite3 para usar SQLite sin más. +# Para PostgreSQL, pon DB_ENGINE=postgresql y rellena el resto. +DB_ENGINE=sqlite3 +DB_NAME= +DB_USER= +DB_PASSWORD= +DB_HOST=localhost +DB_PORT=5432 \ No newline at end of file From 4ad2b59a1cf28a06c04ce27f7c0f1033936ccefd Mon Sep 17 00:00:00 2001 From: JKuijperM Date: Wed, 29 Jul 2026 15:14:14 +0200 Subject: [PATCH 2/9] Fixed minor typos --- expenses_manager/expenses/forms.py | 10 +++++----- expenses_manager/expenses/models.py | 1 - expenses_manager/expenses/views.py | 1 - 3 files changed, 5 insertions(+), 7 deletions(-) diff --git a/expenses_manager/expenses/forms.py b/expenses_manager/expenses/forms.py index 3d88580..83ee34e 100644 --- a/expenses_manager/expenses/forms.py +++ b/expenses_manager/expenses/forms.py @@ -122,15 +122,15 @@ class GoalForm(forms.ModelForm): class Meta: model = Goal fields = [ - 'name', - 'kind', - 'target_amount', - 'category', + "name", + "kind", + "target_amount", + "category", "include_subcategories", "account", "start_date", "period", - "show_on_home" + "show_on_home", ] widgets = { "start_date": forms.DateInput( diff --git a/expenses_manager/expenses/models.py b/expenses_manager/expenses/models.py index 688e0d9..50b1181 100644 --- a/expenses_manager/expenses/models.py +++ b/expenses_manager/expenses/models.py @@ -5,7 +5,6 @@ from django.conf import settings from django.db.models import Sum from functools import cached_property from django.utils.text import slugify -from django.db.models.fields import related from django.db.models.functions import ExtractMonth diff --git a/expenses_manager/expenses/views.py b/expenses_manager/expenses/views.py index fb35a91..cc29921 100644 --- a/expenses_manager/expenses/views.py +++ b/expenses_manager/expenses/views.py @@ -237,7 +237,6 @@ def expense_create(request): @login_required def expense_edit(request, pk): - # sourcery skip: assign-if-exp, merge-else-if-into-elif expense = get_object_or_404( Expense, pk=pk, From bc1a95729243ac31e22f2b270a50b7f28ff79d64 Mon Sep 17 00:00:00 2001 From: JKuijperM Date: Wed, 29 Jul 2026 15:33:10 +0200 Subject: [PATCH 3/9] Make responsive --- expenses_manager/expenses/templates/expenses/base.html | 5 +++-- expenses_manager/expenses/templates/expenses/base_auth.html | 3 ++- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/expenses_manager/expenses/templates/expenses/base.html b/expenses_manager/expenses/templates/expenses/base.html index 1e6cb78..8aa61a1 100644 --- a/expenses_manager/expenses/templates/expenses/base.html +++ b/expenses_manager/expenses/templates/expenses/base.html @@ -1,8 +1,9 @@ {% load static %} - - + + + {% block title %}Expenses manager{% endblock %} diff --git a/expenses_manager/expenses/templates/expenses/base_auth.html b/expenses_manager/expenses/templates/expenses/base_auth.html index 04b7bca..2b9f350 100644 --- a/expenses_manager/expenses/templates/expenses/base_auth.html +++ b/expenses_manager/expenses/templates/expenses/base_auth.html @@ -1,8 +1,9 @@ {% load static %} - + + {% block title %}Login{% endblock %} From 176f9d075c1d384394ae71ca3cb559132a55e366 Mon Sep 17 00:00:00 2001 From: JKuijperM Date: Wed, 29 Jul 2026 16:41:35 +0200 Subject: [PATCH 4/9] Improvements in the mobile view --- .../expenses/static/expenses/css/base.css | 156 +++++++++++++++++- .../expenses/static/expenses/js/nav.js | 30 ++++ .../expenses/templates/categories/list.html | 4 +- .../templates/expenses/account_list.html | 2 + .../expenses/templates/expenses/base.html | 14 +- .../templates/expenses/dashboard.html | 25 ++- .../templates/expenses/expense_list.html | 4 +- .../expenses/templates/expenses/home.html | 6 +- .../templates/expenses/income_list.html | 2 + .../expenses/templates/fuel/list.html | 2 + .../expenses/templates/goals/list.html | 2 + 11 files changed, 228 insertions(+), 19 deletions(-) create mode 100644 expenses_manager/expenses/static/expenses/js/nav.js diff --git a/expenses_manager/expenses/static/expenses/css/base.css b/expenses_manager/expenses/static/expenses/css/base.css index 80a1763..56d6ee6 100644 --- a/expenses_manager/expenses/static/expenses/css/base.css +++ b/expenses_manager/expenses/static/expenses/css/base.css @@ -40,6 +40,25 @@ a.danger { text-decoration: underline; } +.nav-toggle { + display: none; + flex-direction: column; + justify-content: center; + gap: 4px; + background: none; + border: none; + padding: 8px; + cursor: pointer; +} + +.nav-toggle-bar { + display: block; + width: 24px; + height: 3px; + background: #e5e7eb; + border-radius: 2px; +} + .nav-item.active { font-weight: bold; border-bottom: 2px solid white; @@ -108,9 +127,20 @@ a.danger { margin-bottom: 4rem; } +.charts-container > section { + flex: 1 1 320px; + min-width: 280px; +} + .chart-box { - height: 300px; - margin-bottom: 3rem; + position: relative; + height: 320px; + width: 100%; + margin-top: 0.5rem; +} + +.chart-box canvas { + max-width: 100%; } .canvas-wrapper { @@ -177,6 +207,16 @@ table { margin-top: 1rem; } +.table-wrap { + width: 100%; + overflow-x: auto; + -webkit-overflow-scrolling: touch; +} + +.table-wrap table { + white-space: nowrap; +} + th, td { padding: 0.6rem 0.75rem; text-align: left; @@ -277,9 +317,24 @@ tbody tr:hover { .dashboard-presets { display: flex; + flex-wrap: wrap; gap: 0.5rem; } +.clear-filters-row { + margin-top: 0.5rem; +} + +.clear-filters { + color: #b91c1c; + text-decoration: none; + font-size: 0.85rem; +} + +.clear-filters:hover { + text-decoration: underline; +} + .preset { padding: 0.35rem 0.6rem; border-radius: 6px; @@ -354,6 +409,16 @@ tbody tr:hover { .dropdown-toggle { padding: 10px; display: inline-block; + background: none; + border: none; + font: inherit; + color: inherit; + cursor: pointer; +} + +.dropdown-toggle:focus-visible { + outline: 2px solid #93c5fd; + outline-offset: 2px; } .dropdown-menu { @@ -379,7 +444,7 @@ tbody tr:hover { background-color: #f5f5f5; } -.dropdown:hover .dropdown-menu { +.dropdown.dropdown--open .dropdown-menu { display: block; } @@ -536,4 +601,89 @@ tbody tr:hover { .auth-help { margin-top: 16px; font-size: 0.9em; +} + +@media (max-width: 768px) { + .content { + padding: 16px; + } + + .topbar { + display: flex; + align-items: center; + justify-content: space-between; + flex-wrap: wrap; + } + + .nav-toggle { + display: flex; + } + + .nav { + display: none; + flex-direction: column; + align-items: stretch; + gap: 8px; + width: 100%; + margin-top: 12px; + } + + .nav.nav--open { + display: flex; + } + + .nav .spacer { + display: none; + } + + .dropdown-menu { + display: none; + position: static; + border: none; + box-shadow: none; + background: transparent; + min-width: 0; + padding-left: 12px; + } + + .dropdown-menu a { + color: #e5e7eb; + } + + .dropdown-menu a:hover { + background-color: transparent; + text-decoration: underline; + } + + .dashboard-grid { + grid-template-columns: 1fr; + } + + .card-chart { + height: 320px; + } +} + +@media (max-width: 480px) { + .content { + padding: 12px; + } + + .topbar { + padding: 10px 12px; + } + + .kpi-grid, + .goals-widget, + .settings-grid { + grid-template-columns: 1fr; + } + + .chart-box { + height: 240px; + } + + .card-chart { + height: 260px; + } } \ No newline at end of file diff --git a/expenses_manager/expenses/static/expenses/js/nav.js b/expenses_manager/expenses/static/expenses/js/nav.js new file mode 100644 index 0000000..c382c5c --- /dev/null +++ b/expenses_manager/expenses/static/expenses/js/nav.js @@ -0,0 +1,30 @@ +document.addEventListener('DOMContentLoaded', function () { + var toggle = document.getElementById('navToggle'); + var nav = document.getElementById('mainNav'); + + if (!toggle || !nav) { + return; + } + + toggle.addEventListener('click', function () { + var isOpen = nav.classList.toggle('nav--open'); + toggle.setAttribute('aria-expanded', isOpen ? 'true' : 'false'); + }); + + var dropdownToggle = document.getElementById('dropdownToggle'); + var dropdown = document.getElementById('settingsDropdown'); + + if (dropdownToggle && dropdown) { + dropdownToggle.addEventListener('click', function () { + var isOpen = dropdown.classList.toggle('dropdown--open'); + dropdownToggle.setAttribute('aria-expanded', isOpen ? 'true' : 'false'); + }); + + document.addEventListener('click', function (event) { + if (!dropdown.contains(event.target)) { + dropdown.classList.remove('dropdown--open'); + dropdownToggle.setAttribute('aria-expanded', 'false'); + } + }); + } +}); diff --git a/expenses_manager/expenses/templates/categories/list.html b/expenses_manager/expenses/templates/categories/list.html index 24826ab..b057511 100644 --- a/expenses_manager/expenses/templates/categories/list.html +++ b/expenses_manager/expenses/templates/categories/list.html @@ -18,6 +18,7 @@

Listado

+
@@ -37,6 +38,7 @@ {% endfor %} -
+ +
{% endblock %} \ No newline at end of file diff --git a/expenses_manager/expenses/templates/expenses/account_list.html b/expenses_manager/expenses/templates/expenses/account_list.html index cc7bd4d..c869f28 100644 --- a/expenses_manager/expenses/templates/expenses/account_list.html +++ b/expenses_manager/expenses/templates/expenses/account_list.html @@ -6,6 +6,7 @@ ➕ Nueva cuenta +
@@ -46,4 +47,5 @@ {% endfor %}
+
{% endblock %} \ No newline at end of file diff --git a/expenses_manager/expenses/templates/expenses/base.html b/expenses_manager/expenses/templates/expenses/base.html index 8aa61a1..32f2470 100644 --- a/expenses_manager/expenses/templates/expenses/base.html +++ b/expenses_manager/expenses/templates/expenses/base.html @@ -13,7 +13,12 @@ {% if user.is_authenticated %}
-