diff --git a/apps/note/urls.py b/apps/note/urls.py index e1cc5216212fbdddd8738c97170bdd637a00ef1e..fea911f6ac5ebdeaa871240fe56c764d024db675 100644 --- a/apps/note/urls.py +++ b/apps/note/urls.py @@ -12,7 +12,6 @@ urlpatterns = [ path('buttons/create/', views.TransactionTemplateCreateView.as_view(), name='template_create'), path('buttons/update/<int:pk>/', views.TransactionTemplateUpdateView.as_view(), name='template_update'), path('buttons/', views.TransactionTemplateListView.as_view(), name='template_list'), - path('consos/<str:template_type>/', views.ConsoView.as_view(), name='consos'), path('consos/', views.ConsoView.as_view(), name='consos'), # API for the note autocompleter diff --git a/apps/note/views.py b/apps/note/views.py index b012ad8b35cc45093261e071cc0f81b885fc6c7d..61012f34285aa050d1d47edba7408b79cc01890d 100644 --- a/apps/note/views.py +++ b/apps/note/views.py @@ -8,7 +8,7 @@ from django.urls import reverse from django.utils.translation import gettext_lazy as _ from django.views.generic import CreateView, ListView, UpdateView -from .models import Transaction, TransactionCategory, TransactionTemplate, Alias +from .models import Transaction, TransactionTemplate, Alias from .forms import TransactionForm, TransactionTemplateForm, ConsoForm @@ -135,19 +135,13 @@ class ConsoView(LoginRequiredMixin, CreateView): Add some context variables in template such as page title """ context = super().get_context_data(**kwargs) - context['template_types'] = TransactionCategory.objects.all() - - if 'template_type' not in self.kwargs.keys(): - return context - - template_type = TransactionCategory.objects.filter( - name=self.kwargs.get('template_type')).get() - context['buttons'] = TransactionTemplate.objects.filter( - template_type=template_type) - context['title'] = template_type - + context['transaction_templates'] = TransactionTemplate.objects.all() \ + .order_by('template_type') + context['title'] = _("Consommations") return context def get_success_url(self): - return reverse('note:consos', - args=(self.kwargs.get('template_type'), )) + """ + When clicking a button, reload the same page + """ + return reverse('note:consos') diff --git a/templates/note/conso_form.html b/templates/note/conso_form.html index e2106f1794c41d65c42c438df6fa4771c73057b2..89a8f8e49019525ea025d6f76d9d98892bd54474 100644 --- a/templates/note/conso_form.html +++ b/templates/note/conso_form.html @@ -2,40 +2,92 @@ {% load i18n static pretty_money %} +{# Remove page title #} +{% block contenttitle %}{% endblock %} + {% block content %} - <fieldset class="module aligned"> - {% for type in template_types %} - <a href="{% url 'note:consos' template_type=type %}"><button>{{ type }}</button></a> - {% endfor %} - </fieldset> - <form method="post" onsubmit="window.onbeforeunload=null">{% csrf_token %} - {% if form.non_field_errors %} - <p class="errornote"> - {% for error in form.non_field_errors %} - {{ error }} + {# Regroup buttons under categories #} + {% regroup transaction_templates by template_type as template_types %} + + <form method="post" onsubmit="window.onbeforeunload=null"> + {% csrf_token %} + + <div class="row"> + <div class="col-sm-5"> + {% if form.non_field_errors %} + <p class="errornote"> + {% for error in form.non_field_errors %} + {{ error }} + {% endfor %} + </p> + {% endif %} + {% for field in form %} + <div class="form-row{% if field.errors %} errors{% endif %}"> + {{ field.errors }} + <div> + {{ field.label_tag }} + {% if field.is_readonly %} + <div class="readonly">{{ field.contents }}</div> + {% else %} + {{ field }} + {% endif %} + {% if field.field.help_text %} + <div class="help">{{ field.field.help_text|safe }}</div> + {% endif %} + </div> + </div> {% endfor %} - </p> - {% endif %} - <fieldset class="module aligned"> - {% for field in form %} - <div class="form-row{% if field.errors %} errors{% endif %}"> - {{ field.errors }} - <div> - {{ field.label_tag }} - {% if field.is_readonly %} - <div class="readonly">{{ field.contents }}</div> - {% else %} - {{ field }} - {% endif %} - {% if field.field.help_text %} - <div class="help">{{ field.field.help_text|safe }}</div> - {% endif %} + </div> + + <div class="col-sm-7"> + <div class="card text-center"> + {# Tabs for button categories #} + <div class="card-header"> + <ul class="nav nav-tabs nav-fill card-header-tabs"> + {% for template_type in template_types %} + <li class="nav-item"> + <a class="nav-link" data-toggle="tab" href="#{{ template_type.grouper|slugify }}"> + {{ template_type.grouper }} + </a> + </li> + {% endfor %} + </ul> + </div> + + {# Tabs content #} + <div class="card-body"> + <div class="tab-content"> + {% for template_type in template_types %} + <div class="tab-pane" id="{{ template_type.grouper|slugify }}"> + {% for button in template_type.list %} + <button class="btn btn-outline-dark" name="button" value="{{ button.name }}"> + {{ button.name }} ({{ button.amount | pretty_money }}) + </button> + {% endfor %} + </div> + {% endfor %} + </div> </div> </div> - {% endfor %} - {% for button in buttons %} - <button name="button" value="{{ button.name }}">{{ button.name }} ({{ button.amount | pretty_money }})</button> - {% endfor %} - </fieldset> + </div> + </div> </form> + + <script type="text/javascript"> + $ = django.jQuery; + $(document).ready(function() { + // If hash of a category in the URL, then select this category + // else select the first one + if (location.hash) { + $("a[href='" + location.hash + "']").tab("show"); + } else { + $("a[data-toggle='tab']").first().tab("show"); + } + + // When selecting a category, change URL + $(document.body).on("click", "a[data-toggle='tab']", function(event) { + location.hash = this.getAttribute("href"); + }); + }); + </script> {% endblock %}