From 823bae7e6552a7b985c2a3940eaf8db27d192eb3 Mon Sep 17 00:00:00 2001 From: Yaro Kasear Date: Thu, 12 Jun 2025 11:56:01 -0500 Subject: [PATCH] Add breadcrumb support to inventory listing and update templates for improved navigation --- __pycache__/routes.cpython-313.pyc | Bin 22456 -> 23410 bytes routes.py | 13 ++++++++++++- templates/table.html | 3 ++- 3 files changed, 14 insertions(+), 2 deletions(-) diff --git a/__pycache__/routes.cpython-313.pyc b/__pycache__/routes.cpython-313.pyc index 3f71c2bb584e8a7bcef3a97e0d7492a568324d52..99ddc624bdabb9d36429e8cf9e40c84fc86c99b4 100644 GIT binary patch delta 2612 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 Qfl2BE6G+x<@{Xuo0JQ(@ga7~l diff --git a/routes.py b/routes.py index f7a6434..0999a5d 100644 --- a/routes.py +++ b/routes.py @@ -107,6 +107,7 @@ def render_paginated_table( row_fn: Callable[[Any], List[dict]], endpoint: str, per_page=15, + breadcrumb=[], extra_args={} ): data = make_paginated_data(query, page, per_page) @@ -122,6 +123,7 @@ def render_paginated_table( total_pages=data['total_pages'], headers=headers, entry_route=entry_route, + breadcrumb=breadcrumb, extra_args=extra_args ) @@ -144,6 +146,8 @@ def list_inventory(): filter_by = request.args.get('filter_by', type=str) id = request.args.get('id', type=int) + filter_name = None + query = db.session.query(Inventory) query = eager_load_inventory_relationships(query) query = query.order_by(Inventory.inventory_name, Inventory.barcode, Inventory.serial) @@ -151,6 +155,12 @@ def list_inventory(): if filter_by and id: column = FILTER_MAP.get(filter_by) if column is not None: + if filter_by == 'user': + filter_name = db.session.query(User).filter(User.id == id).first().full_name + elif filter_by == 'room': + filter_name = db.session.query(Room).filter(Room.id == id).first().full_name + else: + filter_name = db.session.query(Brand).filter(Brand.id == id).first().name query = query.filter(column == id) else: return "Invalid filter_by parameter", 400 @@ -158,11 +168,12 @@ def list_inventory(): return render_paginated_table( query=query, page=page, - title="Inventory (Filtered)" if filter_by else "Inventory", + title=f"Inventory ({filter_name})" if filter_by else "Inventory", headers=inventory_headers, row_fn=lambda i: [fn(i) for fn in inventory_headers.values()], endpoint="main.list_inventory", entry_route="inventory_item", + breadcrumb=[{'label': 'Inventory', 'url': url_for('main.inventory_index')}], extra_args={'filter_by': filter_by, 'id': id} ) diff --git a/templates/table.html b/templates/table.html index 472245b..4a1ec7c 100644 --- a/templates/table.html +++ b/templates/table.html @@ -9,7 +9,8 @@ {% block content %} {{ breadcrumbs.breadcrumb_header( - title=title + title=title, + breadcrumbs=breadcrumb ) }} {{ tables.render_table(header, rows, entry_route) }}