From a238401f13451f5285da56c82a93b41427bf5fde Mon Sep 17 00:00:00 2001 From: "Edgar P. Burkhart" Date: Sat, 4 Jan 2025 18:45:36 +0100 Subject: [PATCH] Add AccountSelect widget and update account field in forms - Introduced AccountSelect widget for improved account selection in forms. - Updated AccountForm, StatementForm, and TransactionFiltersForm to use AccountSelect. - Modified account model options to include 'archived' in ordering. - Added new migration for account model options change. --- nummi/account/forms.py | 5 +++++ .../migrations/0004_alter_account_options.py | 20 +++++++++++++++++++ nummi/account/models.py | 2 +- .../account/forms/widgets/account.html | 5 +++++ nummi/main/static/main/js/base.js | 15 ++++++++++++++ nummi/statement/forms.py | 14 +++++++++++++ nummi/transaction/forms.py | 14 ++++++++++++- 7 files changed, 73 insertions(+), 2 deletions(-) create mode 100644 nummi/account/migrations/0004_alter_account_options.py create mode 100644 nummi/account/templates/account/forms/widgets/account.html diff --git a/nummi/account/forms.py b/nummi/account/forms.py index cde1416..8dc869a 100644 --- a/nummi/account/forms.py +++ b/nummi/account/forms.py @@ -1,3 +1,4 @@ +from django.forms.widgets import Select from main.forms import IconInput, NummiForm from .models import Account @@ -15,3 +16,7 @@ class AccountForm(NummiForm): widgets = { "icon": IconInput(), } + + +class AccountSelect(Select): + template_name = "account/forms/widgets/account.html" diff --git a/nummi/account/migrations/0004_alter_account_options.py b/nummi/account/migrations/0004_alter_account_options.py new file mode 100644 index 0000000..7c4fd2d --- /dev/null +++ b/nummi/account/migrations/0004_alter_account_options.py @@ -0,0 +1,20 @@ +# Generated by Django 4.2.7 on 2025-01-04 17:44 + +from django.db import migrations + + +class Migration(migrations.Migration): + dependencies = [ + ("account", "0003_account_archived"), + ] + + operations = [ + migrations.AlterModelOptions( + name="account", + options={ + "ordering": ["-default", "archived", "name"], + "verbose_name": "Account", + "verbose_name_plural": "Accounts", + }, + ), + ] diff --git a/nummi/account/models.py b/nummi/account/models.py index 16aca17..07ee795 100644 --- a/nummi/account/models.py +++ b/nummi/account/models.py @@ -41,7 +41,7 @@ class Account(UserModel): ) class Meta: - ordering = ["-default", "name"] + ordering = ["-default", "archived", "name"] verbose_name = _("Account") verbose_name_plural = _("Accounts") diff --git a/nummi/account/templates/account/forms/widgets/account.html b/nummi/account/templates/account/forms/widgets/account.html new file mode 100644 index 0000000..0641a32 --- /dev/null +++ b/nummi/account/templates/account/forms/widgets/account.html @@ -0,0 +1,5 @@ +{% load main_extras %} + + {{ "bank"|remix }} + {% include "django/forms/widgets/select.html" %} + diff --git a/nummi/main/static/main/js/base.js b/nummi/main/static/main/js/base.js index 3cf2d92..2b41ee2 100644 --- a/nummi/main/static/main/js/base.js +++ b/nummi/main/static/main/js/base.js @@ -34,6 +34,21 @@ for (let form of forms) { setTimeout(setIcon, 0); }); } + let accountSelect = form.querySelector(".account-select"); + if (accountSelect) { + let input = accountSelect.querySelector("select"); + let icon = accountSelect.querySelector("span"); + let icons = JSON.parse(input.dataset.icons); + + function setIcon(event) { + icon.className = `ri-${icons[input.value] || "bank"}-line`; + } + setIcon(); + input.addEventListener("input", setIcon); + form.addEventListener("reset", (event) => { + setTimeout(setIcon, 0); + }); + } let iconSelect = form.querySelector(".icon-select"); if (iconSelect) { diff --git a/nummi/statement/forms.py b/nummi/statement/forms.py index 353ebe7..e2b9f46 100644 --- a/nummi/statement/forms.py +++ b/nummi/statement/forms.py @@ -1,3 +1,6 @@ +import json + +from account.forms import AccountSelect from django import forms from django.forms.widgets import Select from django.utils.translation import gettext_lazy as _ @@ -13,6 +16,7 @@ class StatementForm(NummiForm): fields = ["account", "start_date", "date", "start_value", "value", "file"] widgets = { "file": NummiFileInput, + "account": AccountSelect, } meta_fieldsets = [ @@ -40,6 +44,16 @@ class StatementForm(NummiForm): required=False, ) + self.fields["account"].widget.attrs |= { + "class": "account", + "data-icons": json.dumps( + { + str(acc.id): acc.icon + for acc in self.fields["account"].queryset.only("id", "icon") + } + ), + } + if _disable_account: self.fields["account"].disabled = True diff --git a/nummi/transaction/forms.py b/nummi/transaction/forms.py index 15d3dbd..16110a0 100644 --- a/nummi/transaction/forms.py +++ b/nummi/transaction/forms.py @@ -1,5 +1,6 @@ import json +from account.forms import AccountSelect from category.forms import CategorySelect from django import forms from django.forms import formset_factory @@ -168,7 +169,9 @@ class TransactionFiltersForm(forms.Form): category = forms.ModelChoiceField( queryset=None, required=False, widget=CategorySelect() ) - account = forms.ModelChoiceField(queryset=None, required=False) + account = forms.ModelChoiceField( + queryset=None, required=False, widget=AccountSelect() + ) search = forms.CharField(label=_("Search"), required=False) sort_by = forms.ChoiceField( label=_("Sort by"), @@ -198,3 +201,12 @@ class TransactionFiltersForm(forms.Form): } ), } + self.fields["account"].widget.attrs |= { + "class": "account", + "data-icons": json.dumps( + { + str(acc.id): acc.icon + for acc in self.fields["account"].queryset.only("id", "icon") + } + ), + }