diff --git a/apps/note/tables.py b/apps/note/tables.py index 496ae335f24d2a280869b2c1634c91a99cb6ebe2..9309e14ce924e5708183d5b7233b43ccd95a753d 100644 --- a/apps/note/tables.py +++ b/apps/note/tables.py @@ -1,6 +1,8 @@ # Copyright (C) 2018-2020 by BDE ENS Paris-Saclay # SPDX-License-Identifier: GPL-3.0-or-later +import html + import django_tables2 as tables from django.db.models import F from django_tables2.utils import A @@ -19,23 +21,38 @@ class HistoryTable(tables.Table): model = Transaction exclude = ("id", "polymorphic_ctype", ) template_name = 'django_tables2/bootstrap4.html' - sequence = ('...', 'total', 'valid') + sequence = ('...', 'total', 'valid', ) + orderable = False total = tables.Column() # will use Transaction.total() !! + valid = tables.Column(attrs={"td": {"id": lambda record: "validate_" + str(record.id), + "class": lambda record: str(record.valid).lower() + ' validate'}}) + def order_total(self, queryset, is_descending): # needed for rendering queryset = queryset.annotate(total=F('amount') * F('quantity')) \ .order_by(('-' if is_descending else '') + 'total') - return (queryset, True) + return queryset, True + def render_amount(self, value): return pretty_money(value) + def render_total(self, value): return pretty_money(value) + # Django-tables escape strings. That's a wrong thing. + def render_reason(self, value): + return html.unescape(value) + + + def render_valid(self, value): + return "✔" if value else "✖" + + class AliasTable(tables.Table): class Meta: attrs = { diff --git a/static/js/base.js b/static/js/base.js index 87ab0eb3f19a941d791c5314b1ebcef30c1a21f6..cca6e41c431abc2becfba0b32c81d0ac6496c30c 100644 --- a/static/js/base.js +++ b/static/js/base.js @@ -139,7 +139,7 @@ function autoCompleteNote(field_id, alias_matched_id, note_list_id, notes, notes let pattern = field.val(); // If the pattern is not modified, we don't query the API - if (pattern === old_pattern) + if (pattern === old_pattern || pattern === "") return; old_pattern = pattern; @@ -150,11 +150,6 @@ function autoCompleteNote(field_id, alias_matched_id, note_list_id, notes, notes let aliases_matched_obj = $("#" + alias_matched_id); let aliases_matched_html = ""; - if (pattern === "") { - aliases_matched_obj.html(""); - return; - } - // Get matched notes with the given pattern getMatchedNotes(pattern, function(aliases) { // The response arrived too late, we stop the request diff --git a/templates/note/conso_form.html b/templates/note/conso_form.html index 100f46c2c5aa42f0d4e457dec67d8ef7eea1a2cc..a007cecfc09722f26e5d453d71e51cccfe8a9b8b 100644 --- a/templates/note/conso_form.html +++ b/templates/note/conso_form.html @@ -133,9 +133,9 @@ {% block extracss %} <style> - .select2-container{ - max-width: 100%; - min-width: 100%; + .validate:hover { + cursor: pointer; + text-decoration: underline; } </style> {% endblock %} @@ -143,6 +143,7 @@ {% block extrajavascript %} <script type="text/javascript" src="/static/js/consos.js"></script> <script type="text/javascript"> + // Switching in double consumptions mode should update the layout $("#double_conso").click(function() { $("#consos_list_div").show(); $("#infos_div").attr('class', 'col-sm-5 col-xl-6'); @@ -190,5 +191,28 @@ }); {% endif %} {% endfor %} + + // When we click on the validate button, the validation status is switched + $(".validate").click(function(e) { + let id = e.target.id.substring(9); + let validated = e.target.classList.contains("true"); + + // Perform a PATCH request to the API in order to update the transaction + // If the user has insuffisent rights, an error message will appear + // TODO: Add this error message + $.ajax({ + "url": "/api/note/transaction/transaction/" + id + "/", + type: "PATCH", + dataType: "json", + headers: { + "X-CSRFTOKEN": CSRF_TOKEN + }, + data: { + "resourcetype": "TemplateTransaction", + valid: !validated + }, + success: refreshHistory + }); + }); </script> {% endblock %}