From 5df5f86fd2b702654310de1e2cf1e0673a2186dc Mon Sep 17 00:00:00 2001 From: Yaro Kasear Date: Thu, 12 Jun 2025 11:29:18 -0500 Subject: [PATCH] Add filtering functionality to inventory listing and enhance templates for better data presentation --- __pycache__/routes.cpython-313.pyc | Bin 20803 -> 22456 bytes __pycache__/utils.cpython-313.pyc | Bin 2035 -> 2316 bytes routes.py | 48 ++++++++++++++++++++++++----- templates/_table_fragment.html | 6 ++++ templates/inventory.html | 2 +- templates/inventory_index.html | 12 ++++++++ templates/table.html | 2 +- utils.py | 3 ++ 8 files changed, 64 insertions(+), 9 deletions(-) diff --git a/__pycache__/routes.cpython-313.pyc b/__pycache__/routes.cpython-313.pyc index efdc1ab13b2b0ba35f160f676f90c06554e1a8b6..3f71c2bb584e8a7bcef3a97e0d7492a568324d52 100644 GIT binary patch delta 6845 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 delta 5437 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 diff --git a/__pycache__/utils.cpython-313.pyc b/__pycache__/utils.cpython-313.pyc index 5c2e3fb92338f044758204c245a365a97bb5e7f8..a73e036e71e2a52cb5170a5aa57b7d778ba5b8cd 100644 GIT binary patch delta 376 zcmey&-y_8LnU|M~fq{V`@48n87t2IG2}ZYx>W*B&98wHL-07T}TpM$~u+=9sfz&`T zI|Bm)GXn#|=OhLOhN%qEj8JigV8&>WIG7vCU zGca&7C@>T= zu>k`ELj%JdZG#PhTby?=Z}!-cbw%6rGPlW(bw9GaXPi@vZi`)P7dF63}kT**)* u%)r1") def inventory_item(id): diff --git a/templates/_table_fragment.html b/templates/_table_fragment.html index 7b400a8..79a30bb 100644 --- a/templates/_table_fragment.html +++ b/templates/_table_fragment.html @@ -1,4 +1,5 @@ {% macro render_table(headers, rows, entry_route=None, title=None) %} +{% if rows %}
@@ -32,6 +33,9 @@
+{% else %} +
No data.
+{% endif %} {% endmacro %} {% macro render_pagination(endpoint, page, has_prev, has_next, total_pages, page_variable='page', extra_args={}) %} @@ -43,6 +47,7 @@ {% set _ = next_args.update({page_variable: page + 1}) %} {% set _ = first_args.update({page_variable: 1}) %} {% set _ = last_args.update({page_variable: total_pages}) %} +{% if total_pages > 1 %}
@@ -72,4 +77,5 @@ class="btn btn-primary{% if not has_next %} disabled{% endif %}">Last »
+{% endif %} {% endmacro %} \ No newline at end of file diff --git a/templates/inventory.html b/templates/inventory.html index 898a3ef..c4e6865 100644 --- a/templates/inventory.html +++ b/templates/inventory.html @@ -132,7 +132,7 @@ submit_button=True) }} total_pages=worklog_pagination['total_pages'], endpoint='main.inventory_item', page_variable='worklog_page', - extra_args={'id': item.id, 'worklog_page': worklog_page} + extra_args={'id': item.id, 'worklog_page': worklog_page, 'filter_by': filter_by, 'id': id} ) }} {% endif %} diff --git a/templates/inventory_index.html b/templates/inventory_index.html index b7d0d5d..cb21e4e 100644 --- a/templates/inventory_index.html +++ b/templates/inventory_index.html @@ -77,6 +77,18 @@ title=title By Type + {% else %} +
+ {% for line in listing %} +
+ {% for id, name in line %} + + {% endfor %} +
+ {% endfor %} +
{% endif %} {% endblock %} \ No newline at end of file diff --git a/templates/table.html b/templates/table.html index 3dc7569..472245b 100644 --- a/templates/table.html +++ b/templates/table.html @@ -13,5 +13,5 @@ ) }} {{ tables.render_table(header, rows, entry_route) }} -{{ tables.render_pagination(endpoint, page, has_prev, has_next, total_pages) }} +{{ tables.render_pagination(endpoint, page, has_prev, has_next, total_pages, extra_args=extra_args) }} {% endblock %} \ No newline at end of file diff --git a/utils.py b/utils.py index 91f5720..344e4a6 100644 --- a/utils.py +++ b/utils.py @@ -28,3 +28,6 @@ def eager_load_worklog_relationships(query): joinedload(WorkLog.contact), joinedload(WorkLog.work_item) ) + +def chunk_list(lst, chunk_size): + return [lst[i:i + chunk_size] for i in range(0, len(lst), chunk_size)]