From 2a7a72f31ef21db46296abc46d3243bd6e7be615 Mon Sep 17 00:00:00 2001 From: Yaro Kasear Date: Tue, 29 Jul 2025 10:18:34 -0500 Subject: [PATCH] Redo breadcrumb logic to something less painful. --- inventory/__init__.py | 6 +- inventory/routes/helpers.py | 62 ++++++++++++++++++- .../fragments/_breadcrumb_fragment.html | 34 +++++----- inventory/templates/inventory.html | 7 +-- inventory/templates/inventory_index.html | 4 +- inventory/templates/layout.html | 5 +- inventory/templates/search.html | 4 +- inventory/templates/settings.html | 4 +- inventory/templates/table.html | 5 +- inventory/templates/user.html | 7 +-- inventory/templates/worklog.html | 7 +-- 11 files changed, 88 insertions(+), 57 deletions(-) diff --git a/inventory/__init__.py b/inventory/__init__.py index e41ee3e..7634e87 100644 --- a/inventory/__init__.py +++ b/inventory/__init__.py @@ -4,7 +4,6 @@ from sqlalchemy.engine.url import make_url import logging import os - db = SQLAlchemy() logger = logging.getLogger('sqlalchemy.engine') @@ -39,4 +38,9 @@ def create_app(): app.register_blueprint(main) app.register_blueprint(image_bp) + from .routes.helpers import generate_breadcrumbs + @app.context_processor + def inject_breadcrumbs(): + return {'breadcrumbs': generate_breadcrumbs()} + return app diff --git a/inventory/routes/helpers.py b/inventory/routes/helpers.py index d39c116..d2bdb18 100644 --- a/inventory/routes/helpers.py +++ b/inventory/routes/helpers.py @@ -4,12 +4,37 @@ import hashlib import io import os -from flask import url_for, jsonify +from flask import url_for, jsonify, request +from flask import current_app as app -from ..models import Inventory +from ..models import User, Inventory, WorkLog from ..models.image import ImageAttachable +ROUTE_BREADCRUMBS = { + 'main.user': { + 'trail': [('Users', 'main.list_users')], + 'model': User, + 'arg': 'id', + 'label_attr': 'identifier', + 'url_func': lambda i: url_for('main.user', id=i.id) + }, + 'main.inventory_item': { + 'trail': [('Inventory', 'main.list_inventory')], + 'model': Inventory, + 'arg': 'id', + 'label_attr': 'identifier', + 'url_func': lambda i: url_for('main.inventory_item', id=i.id) + }, + 'main.worklog': { + 'trail': [('Work Log', 'main.list_worklog')], + 'model': WorkLog, + 'arg': 'id', + 'label_attr': 'identifier', + 'url_func': lambda i: url_for('main.worklog', id=i.id) + } +} + inventory_headers = { "Date Entered": lambda i: {"text": i.timestamp.strftime("%Y-%m-%d") if i.timestamp else None}, "Identifier": lambda i: {"text": i.identifier}, @@ -104,4 +129,35 @@ def make_csv(export_func, columns, rows): "success": True, "csv": base64.b64encode(csv_string.encode()).decode(), "count": len(rows) - }) \ No newline at end of file + }) + +def generate_breadcrumbs(): + crumbs = [] + + endpoint = request.endpoint + view_args = request.view_args or {} + + if endpoint in ROUTE_BREADCRUMBS: + print(endpoint, view_args) + config = ROUTE_BREADCRUMBS[endpoint] + + for label, ep in config.get('trail', []): + crumbs.append({'label': label, 'url': url_for(ep)}) + + obj_id = view_args.get(config['arg']) + if obj_id: + obj = config['model'].query.get(obj_id) + if obj: + crumbs.append({ + 'label': getattr(obj, config['label_attr'], str(obj)), + 'url': config['url_func'](obj) + }) + else: + # fallback to ugly slashes + path = request.path.strip('/').split('/') + accumulated = '' + for segment in path: + accumulated += '/' + segment + crumbs.append({'label': segment.title(), 'url': accumulated}) + + return crumbs diff --git a/inventory/templates/fragments/_breadcrumb_fragment.html b/inventory/templates/fragments/_breadcrumb_fragment.html index 9f1d0ab..31c5e73 100644 --- a/inventory/templates/fragments/_breadcrumb_fragment.html +++ b/inventory/templates/fragments/_breadcrumb_fragment.html @@ -1,24 +1,18 @@ {% import "fragments/_icon_fragment.html" as icons %} -{% macro breadcrumb_header(breadcrumbs=[], title=None) %} - - + {% endmacro %} diff --git a/inventory/templates/inventory.html b/inventory/templates/inventory.html index 68a35f8..680c9c2 100644 --- a/inventory/templates/inventory.html +++ b/inventory/templates/inventory.html @@ -115,12 +115,7 @@ {% endset %} {{ toolbars.render_toolbar( id='inventory', - left=breadcrumbs.breadcrumb_header( - breadcrumbs=[ - {'label': "Inventory", 'url': url_for('main.list_inventory')} - ], - title=title - ), + left=breadcrumb_macro.render_breadcrumb(breadcrumbs=breadcrumbs), right=buttonBar ) }} {% if item.condition in ["Removed", "Disposed"] %} diff --git a/inventory/templates/inventory_index.html b/inventory/templates/inventory_index.html index 2f258f0..45d5829 100644 --- a/inventory/templates/inventory_index.html +++ b/inventory/templates/inventory_index.html @@ -4,9 +4,7 @@ {% block title %}{{ title }}{% endblock %} {% block precontent %} - {{ toolbars.render_toolbar('index', left=breadcrumbs.breadcrumb_header( - title=title - )) }} + {{ toolbars.render_toolbar('index', left=breadcrumb_macro.render_breadcrumb(breadcrumbs=breadcrumbs)) }} {% endblock %} {% block content %} diff --git a/inventory/templates/layout.html b/inventory/templates/layout.html index 0505223..92b867b 100644 --- a/inventory/templates/layout.html +++ b/inventory/templates/layout.html @@ -1,5 +1,5 @@ {% import "fragments/_button_fragment.html" as buttons %} -{% import "fragments/_breadcrumb_fragment.html" as breadcrumbs %} +{% import "fragments/_breadcrumb_fragment.html" as breadcrumb_macro %} {% import "fragments/_combobox_fragment.html" as combos %} {% import "fragments/_dropdown_fragment.html" as dropdowns %} {% import "fragments/_editor_fragment.html" as editor %} @@ -59,7 +59,8 @@ - {% block precontent %}{% endblock %} + {% block precontent %} + {% endblock %}
{% block content %}{% endblock %}
diff --git a/inventory/templates/search.html b/inventory/templates/search.html index 6bc6dba..8650bd3 100644 --- a/inventory/templates/search.html +++ b/inventory/templates/search.html @@ -6,9 +6,7 @@ {% block precontent %} {{ toolbars.render_toolbar( id='search', - left = breadcrumbs.breadcrumb_header( - title=title - ) + left = breadcrumb_macro.render_breadcrumb(breadcrumbs=breadcrumbs) ) }} {% if not results['inventory']['rows'] and not results['users']['rows'] and not results['worklog']['rows'] %}
There are no results for "{{ query }}".
diff --git a/inventory/templates/settings.html b/inventory/templates/settings.html index 36d8069..2b93cae 100644 --- a/inventory/templates/settings.html +++ b/inventory/templates/settings.html @@ -98,9 +98,7 @@ {% endset %} {{ toolbars.render_toolbar( id='settings', - left=breadcrumbs.breadcrumb_header( - title=title - ), + left=breadcrumb_macro.render_breadcrumb(breadcrumbs=breadcrumbs), right=buttons.render_button( id='save', icon='floppy', diff --git a/inventory/templates/table.html b/inventory/templates/table.html index a31ba9a..2c56143 100644 --- a/inventory/templates/table.html +++ b/inventory/templates/table.html @@ -21,10 +21,7 @@ {% endset %} {{ toolbars.render_toolbar( 'table', - left = breadcrumbs.breadcrumb_header( - title=title, - breadcrumbs=breadcrumb - ), + left = breadcrumb_macro.render_breadcrumb(breadcrumbs=breadcrumbs), right = toolbarButtons ) }} {% endblock %} diff --git a/inventory/templates/user.html b/inventory/templates/user.html index 5d81c5a..1f73575 100644 --- a/inventory/templates/user.html +++ b/inventory/templates/user.html @@ -75,12 +75,7 @@ {% endset %} {{ toolbars.render_toolbar( id = 'newUser', - left = breadcrumbs.breadcrumb_header( - title=title, - breadcrumbs=[ - {'label': 'Users', 'url': url_for('main.list_users')} - ] - ), + left = breadcrumb_macro.render_breadcrumb(breadcrumbs=breadcrumbs), right = iconBar ) }} {% if not user.active %} diff --git a/inventory/templates/worklog.html b/inventory/templates/worklog.html index 8ce580d..b1477bc 100644 --- a/inventory/templates/worklog.html +++ b/inventory/templates/worklog.html @@ -120,12 +120,7 @@ {% endset %} {{ toolbars.render_toolbar( id='newWorklog', - left=breadcrumbs.breadcrumb_header( - breadcrumbs=[ - {'label': 'Work Log', 'url': url_for('main.list_worklog')} - ], - title=title - ), + left=breadcrumb_macro.render_breadcrumb(breadcrumbs=breadcrumbs), right=iconBar ) }} {% if log.complete %}