V4.1 revisions in preparation for v4.2. AI data capture now better defined.

This commit is contained in:
Jim Lancaster
2026-08-12 18:51:48 -05:00
parent 89cf69f8a2
commit 171132919d
15 changed files with 944 additions and 11 deletions
@@ -56,6 +56,7 @@ def render_documents_table(rows: Sequence[DocumentTableRow]) -> None:
"field": "name",
"sortable": True,
"classes": "font-serif font-semibold text-left ui-table-cell-wrap",
"align": "left",
"style": "width: 30%;",
},
{
@@ -63,7 +64,8 @@ def render_documents_table(rows: Sequence[DocumentTableRow]) -> None:
"label": "Type",
"field": "document_type",
"sortable": True,
"classes": "text-left ui-table-cell-wrap",
"classes": "ui-table-cell-wrap",
"align": "center",
"style": "width: 14%;",
},
{
@@ -71,7 +73,8 @@ def render_documents_table(rows: Sequence[DocumentTableRow]) -> None:
"label": "Author",
"field": "authors",
"sortable": True,
"classes": "text-left ui-table-cell-wrap",
"classes": "ui-table-cell-wrap",
"align": "center",
"style": "width: 22%;",
},
{
@@ -80,6 +83,7 @@ def render_documents_table(rows: Sequence[DocumentTableRow]) -> None:
"field": "document_date",
"sortable": True,
"classes": "font-mono text-xs",
"align": "center",
"style": "width: 14%;",
},
{
@@ -88,6 +92,7 @@ def render_documents_table(rows: Sequence[DocumentTableRow]) -> None:
"field": "archive_identifier",
"sortable": True,
"classes": "font-mono text-xs",
"align": "center",
"style": "width: 20%;",
},
],
@@ -62,14 +62,16 @@ def render_people_table(rows: Sequence[PersonTableRow]) -> None:
"label": "Display Name",
"field": "display_name",
"sortable": True,
"classes": "text-left ui-table-cell-wrap",
"classes": "ui-table-cell-wrap",
"align": "center",
},
{
"name": "maiden_name",
"label": "Maiden Name",
"field": "maiden_name",
"sortable": True,
"classes": "text-left ui-table-cell-wrap",
"classes": "ui-table-cell-wrap",
"align": "center",
},
{
"name": "birth_date",
@@ -77,6 +79,7 @@ def render_people_table(rows: Sequence[PersonTableRow]) -> None:
"field": "birth_date",
"sortable": True,
"classes": "font-mono text-xs",
"align": "center",
},
{
"name": "death_date",
@@ -84,6 +87,7 @@ def render_people_table(rows: Sequence[PersonTableRow]) -> None:
"field": "death_date",
"sortable": True,
"classes": "font-mono text-xs",
"align": "center",
},
],
default_sort_by="full_name",
@@ -58,6 +58,7 @@ def render_sources_table(rows: Sequence[SourceTableRow]) -> None:
"field": "document_name",
"sortable": True,
"classes": "font-serif text-left ui-table-cell-wrap",
"align": "left",
"style": "width: 27%;",
},
{
@@ -73,6 +74,7 @@ def render_sources_table(rows: Sequence[SourceTableRow]) -> None:
"field": "upload_name",
"sortable": True,
"classes": "font-serif text-left ui-table-cell-wrap",
"align": "left",
"style": "width: 25%;",
},
{
@@ -81,6 +83,7 @@ def render_sources_table(rows: Sequence[SourceTableRow]) -> None:
"field": "job_source_status",
"sortable": True,
"classes": "font-mono",
"align": "center",
"style": "width: 14%;",
},
{
@@ -89,6 +92,7 @@ def render_sources_table(rows: Sequence[SourceTableRow]) -> None:
"field": "job_source_error_detail",
"sortable": False,
"classes": "font-mono text-xs text-left ui-text-muted ui-table-cell-wrap",
"align": "left",
"style": "width: 24%;",
},
],
+8 -2
View File
@@ -597,8 +597,14 @@ def _render_related_people_card(document: Document) -> None:
with ui.column().classes("w-full ui-row-surface p-2 gap-1"):
archival_badge(role_code)
for person in grouped[role_code]:
ui.link(person.full_name, f"/ui/people/{person.id}").classes(
"text-xs font-semibold ui-link-primary"
ui.button(
person.full_name,
on_click=lambda _=None, person_id=person.id: ui.navigate.to(
f"/people/{person_id}"
),
icon="person",
).props("flat dense no-caps").classes(
"self-start text-xs font-semibold ui-link-primary"
)
+2 -2
View File
@@ -340,7 +340,7 @@ def _render_person_form_fields(
with ui.row().classes("w-full gap-3 grid grid-cols-1 md:grid-cols-3"):
birth_date_input = (
ui.input(
label="Birth date (YYYY-MM-DD)",
label="Birth date",
value=person.birth_date.isoformat() if person and person.birth_date else "",
)
.props('outlined type="date"')
@@ -363,7 +363,7 @@ def _render_person_form_fields(
with ui.row().classes("w-full gap-3 grid grid-cols-1 md:grid-cols-3"):
death_date_input = (
ui.input(
label="Death date (YYYY-MM-DD)",
label="Death date",
value=person.death_date.isoformat() if person and person.death_date else "",
)
.props('outlined type="date"')
@@ -2,6 +2,7 @@
from __future__ import annotations
import json
from pathlib import Path
from urllib.parse import quote
from uuid import UUID
@@ -327,6 +328,24 @@ def _render_source_job_metadata_zone(latest_job_source: JobSource | None) -> Non
ui.label("Failure Detail:").classes("ui-text-muted text-xs mb-1")
ui.label(latest_job_source.error_detail).classes("p-2 ui-note-box text-xs")
_render_provider_evidence(latest_job_source)
def _render_provider_evidence(job_source: JobSource) -> None:
ui.label("Provider Evidence").classes("text-xs font-semibold ui-text-primary mt-3")
_render_json_evidence("AI Metadata", job_source.ai_metadata)
_render_json_evidence("Raw API Response", job_source.raw_api_response)
def _render_json_evidence(label: str, value: object | None) -> None:
with ui.expansion(label, icon="data_object").classes("w-full ui-row-surface"):
if value is None:
render_empty_state(f"No {label.lower()} stored for this execution.", italic=True)
return
ui.code(json.dumps(value, indent=2, sort_keys=True, ensure_ascii=False), language="json").classes(
"w-full text-xs"
)
def _render_source_revision_logistics_zone(source: Source) -> None:
with archival_card(title="Revision Logistics"):