Enhance table rendering functionality: refactor headers and rows handling, add dynamic table support, and implement refresh capabilities. Update related templates and JavaScript for improved data management.

This commit is contained in:
Yaro Kasear 2025-08-21 11:57:09 -05:00
parent 1e05ad16ce
commit 79d94ff950
13 changed files with 132 additions and 43 deletions

View file

@ -36,18 +36,18 @@ ROUTE_BREADCRUMBS = {
}
inventory_headers = {
"Date Entered": lambda i: {"text": i.timestamp.strftime("%Y-%m-%d") if i.timestamp else None},
"Identifier": lambda i: {"text": i.identifier},
"Name": lambda i: {"text": i.name},
"Serial Number": lambda i: {"text": i.serial},
"Bar Code": lambda i: {"text": i.barcode},
"Brand": lambda i: {"text": i.brand.name} if i.brand else {"text": None},
"Model": lambda i: {"text": i.model},
"Item Type": lambda i: {"text": i.device_type.description} if i.device_type else {"text": None},
"Shared?": lambda i: {"text": i.shared, "type": "bool", "html": checked_box if i.shared else unchecked_box},
"Owner": lambda i: {"text": i.owner.identifier, "url": url_for("main.user", id=i.owner.id)} if i.owner else {"text": None},
"Location": lambda i: {"text": i.location.identifier} if i.location else {"Text": None},
"Condition": lambda i: {"text": i.condition}
"Date Entered": lambda i: {"field": "timestamp", "text": i.timestamp.strftime("%Y-%m-%d") if i.timestamp else None},
"Identifier": lambda i: {"field": "identifier", "text": i.identifier},
"Name": lambda i: {"field": "name", "text": i.name},
"Serial Number": lambda i: {"field": "serial", "text": i.serial},
"Bar Code": lambda i: {"field": "barcode", "text": i.barcode},
"Brand": lambda i: {"field": "brand.name", "text": i.brand.name} if i.brand else {"text": None},
"Model": lambda i: {"field": "model", "text": i.model},
"Item Type": lambda i: {"field": "device_type.description", "text": i.device_type.description} if i.device_type else {"text": None},
"Shared?": lambda i: {"field": "shared", "text": i.shared, "type": "bool", "html": checked_box if i.shared else unchecked_box},
"Owner": lambda i: {"field": "owner.identifier", "text": i.owner.identifier, "url": url_for("main.user", id=i.owner.id)} if i.owner else {"text": None},
"Location": lambda i: {"field": "location.identifier", "text": i.location.identifier} if i.location else {"Text": None},
"Condition": lambda i: {"field": "condition", "text": i.condition}
}
checked_box = '''
@ -75,17 +75,17 @@ FILTER_MAP = {
}
user_headers = {
"Last Name": lambda i: {"text": i.last_name},
"First Name": lambda i: {"text": i.first_name},
"Title": lambda i: {"text": i.title},
"Supervisor": lambda i: {"text": i.supervisor.identifier, "url": url_for("main.user", id=i.supervisor.id)} if i.supervisor else {"text": None},
"Location": lambda i: {"text": i.location.identifier} if i.location else {"text": None},
"Staff?": lambda i: {"text": i.staff, "type": "bool", "html": checked_box if i.staff else unchecked_box},
"Active?": lambda i: {"text": i.active, "type": "bool", "html": checked_box if i.active else unchecked_box}
"Last Name": lambda i: {"field": "last_name","text": i.last_name},
"First Name": lambda i: {"field": "first_name","text": i.first_name},
"Title": lambda i: {"field": "title","text": i.title},
"Supervisor": lambda i: {"field": "supervisor,identifier","text": i.supervisor.identifier, "url": url_for("main.user", id=i.supervisor.id)} if i.supervisor else {"text": None},
"Location": lambda i: {"field": "location,identifier","text": i.location.identifier} if i.location else {"text": None},
"Staff?": lambda i: {"field": "staff","text": i.staff, "type": "bool", "html": checked_box if i.staff else unchecked_box},
"Active?": lambda i: {"field": "active","text": i.active, "type": "bool", "html": checked_box if i.active else unchecked_box}
}
worklog_headers = {
"Contact": lambda i: {"text": i.contact.identifier, "url": url_for("main.user", id=i.contact.id)} if i.contact else {"Text": None},
"Contact": lambda i: {"text": i.contact.identifier, "url": url_for("main.user_item", id=i.contact.id)} if i.contact else {"Text": None},
"Work Item": lambda i: {"text": i.work_item.identifier, "url": url_for('main.inventory_item',id=i.work_item.id)} if i.work_item else {"text": None},
"Start Time": lambda i: {"text": i.start_time.strftime("%Y-%m-%d")},
"End Time": lambda i: {"text": i.end_time.strftime("%Y-%m-%d")} if i.end_time else {"text": None},

View file

@ -43,13 +43,18 @@ def list_inventory():
inventory = query.all()
inventory = sorted(inventory, key=lambda i: i.identifier)
rows=[{"id": item.id, "cells": [row_fn(item) for row_fn in inventory_headers.values()]} for item in inventory]
fields = [d['field'] for d in rows[0]['cells']]
return render_template(
'table.html',
title=f"Inventory Listing ({filter_name})" if filter_by else "Inventory Listing",
header=inventory_headers,
rows=[{"id": item.id, "cells": [row_fn(item) for row_fn in inventory_headers.values()]} for item in inventory],
fields=fields,
rows=rows,
entry_route = 'inventory_item',
csv_route = 'inventory'
csv_route = 'inventory',
model_name = 'inventory'
)
@main.route("/inventory/index")

View file

@ -17,18 +17,19 @@ def list_users():
return render_template(
'table.html',
header = user_headers,
rows = [{"id": user.id, "cells": [fn(user) for fn in user_headers.values()]} for user in users],
model_name = 'user',
title = "Users",
entry_route = 'user',
csv_route = 'user'
entry_route = 'user_item',
csv_route = 'user',
fields = ['last_name', 'first_name', 'title', 'supervisor.identifier', 'location.identifier', 'staff', 'active'],
)
@main.route("/user/<id>")
def user(id):
def user_item(id):
try:
id = int(id)
except ValueError:
return render_template('error.html', title='Bad ID', message='ID must be an integer.', endpoint='user', endpoint_args={'id': -1})
return render_template('error.html', title='Bad ID', message='ID must be an integer.', endpoint='user_item', endpoint_args={'id': -1})
users_query = db.session.query(User).order_by(User.first_name, User.last_name)
users = eager_load_user_relationships(users_query).all()

View file

@ -17,18 +17,19 @@ def list_worklog():
return render_template(
'table.html',
header=worklog_headers,
rows=[{"id": log.id, "cells": [fn(log) for fn in worklog_headers.values()]} for log in query.all()],
model_name='worklog',
title="Work Log",
entry_route='worklog_entry',
fields = ['contact.identifier', 'work_item.identifier', 'start_time', 'end_time', 'complete', 'followup', 'analysis'],
entry_route='worklog_item',
csv_route='worklog'
)
@main.route("/worklog/<id>")
def worklog_entry(id):
def worklog_item(id):
try:
id = int(id)
except ValueError:
return render_template('error.html', title='Bad ID', message='ID must be an integer.', endpoint='worklog_entry', endpoint_args={'id': -1})
return render_template('error.html', title='Bad ID', message='ID must be an integer.', endpoint='worklog_item', endpoint_args={'id': -1})
log = eager_load_worklog_relationships(db.session.query(WorkLog)).get(id)
user_query = db.session.query(User).order_by(User.first_name)
@ -55,7 +56,7 @@ def worklog_entry(id):
items=items
)
@main.route("/worklog_entry/new", methods=["GET"])
@main.route("/worklog_item/new", methods=["GET"])
def new_worklog():
items = eager_load_inventory_relationships(db.session.query(Inventory)).all()
users = eager_load_user_relationships(db.session.query(User).order_by(User.first_name)).all()