generated from john/python-template
7.5 KiB
7.5 KiB
Documents Page Contract
Purpose
Documents manages the archival record for each historical artifact independently of its source files and transcription jobs. A Document can be created first, linked to people in one or more roles, and used later as the parent for Sources and Jobs.
Routes
| Route | Purpose |
|---|---|
/documents |
Searchable archival Document list. |
/documents/new |
Create a Document. |
/documents/{document_id} |
View one Document and its related records. |
/documents/{document_id}/info |
View archival metadata and system logistics for one Document. |
/documents/{document_id}/edit |
Edit metadata and the complete Linked People set. |
/documents/{document_id}/delete |
Confirm or block deletion. |
/documents/{document_id}/jobs |
Show Jobs belonging to the Document. |
/documents/{document_id}/sources |
Source-image gallery for the Document. |
/documents/{document_id}/print |
Preview and browser-print the persisted Document. |
List Behavior
- The title is Archival Documents.
- Create new document opens the create route.
- The table defaults to Document Title order and supports search and column sorting.
- Columns are Document Title, Author, Tags, Document Date, Type, # Sources, and Transcription Status.
- Document Title is left-aligned; the remaining columns are centered.
- Author lists all linked people in the
authorrole. -
Sources reflects the count of linked Source rows for each Document.
- Transcription Status reflects the most recent Job status for that Document; documents with no Jobs show a blank marker.
- Date display prefers exact date, then approximate date, then
Unknown. - Selecting a row opens Document Detail.
- Row navigation includes list context so Document Detail provides Back to Documents.
- No records displays
No documents found in repository.
Create and Edit Behavior
Required:
- Document name.
- Document type selected from the Document Type registry.
Optional:
- Exact date.
- Approximate date.
- Document location.
- Archive identifier.
- Notes.
- Tags.
- Linked People, with exactly one Person Role per linked Person.
Rules:
- Exact date must parse as
YYYY-MM-DD; browser presentation may follow locale. - The exact-date input is labeled Document date.
- Existing people appear with disambiguating labels.
- Tag assignment supports selecting existing tags and adding new labels inline.
- Create new person opens Person creation.
person_idmay preselect that Person in the author role on Document creation.- An invalid requested Person produces a warning rather than a broken form.
return_to=jobs_newreturns a successful create to Job creation with the new Document selected.- Edit includes active and inactive Document Types so historical values remain maintainable.
- One Linked People table contains Select, Person, and Role columns.
- Add and Edit use an inline Person/Role editor; Save, Cancel, and Delete change staged UI state only.
- A Person may appear once per Document regardless of role.
- Existing inactive-role links remain visible; only active roles may be newly assigned.
- Document fields and the complete staged link set commit atomically on the main save.
- Save success returns to Document Detail.
Detail Behavior
- The heading shows name, type, and internal ID.
- The header includes a contextual back action: Back to Documents by default, Back to Person when opened from Person Detail, and Back to Job when opened from Job Detail.
- The detail workspace shows a Source-style pan/zoom media viewer with Previous Page / Next Page navigation for document source pages.
- The center column is Editable Revision for the active source page.
- Related People are grouped by role and link to Person Detail.
- Source Pages & Transcriptions shows source/job counts and actions for source-image gallery, document jobs, and adding a Job.
- Edit Document, Print, Document Details, View Source Detail, and Delete are available from the header.
- Invalid IDs and missing Documents produce explicit states without rendering a partial page.
Document Source Images Behavior
/documents/{document_id}/sourcesshows the current Document's source pages in a thumbnail gallery.- Each card shows the page number, stored filename, and an Open Source Detail action.
- The page includes a Back to Document action.
- No source pages displays an explicit empty state.
Document Info Behavior
/documents/{document_id}/infocontains Archival Metadata and System Logistics.- It includes a Back to Document action.
- Archival metadata includes authors, document type, tags, document date, location (linked when present), archive identifier, and notes.
Print Behavior
- Print opens a dedicated preview for persisted Document data.
- Facsimile places each Source image beside its current transcription and starts every Source on a new printed sheet.
- Text only omits images, joins single line breaks inside paragraphs, and preserves blank-line paragraph boundaries.
- Non-null revised text takes precedence over raw transcription, including an intentionally empty revision.
- Archival metadata resolves Author through the hidden built-in semantic identity, not its mutable label.
- Archival metadata includes the Document Type label.
- Metadata tables use a narrow non-wrapping label column and wider wrapping data columns rather than stretching across the page.
- Job metadata uses one oldest-to-newest column per Job and ends with Status.
- Stored text is escaped and Source media uses record-validated application URLs rather than local file paths.
- Printing uses the browser print dialog; server-generated PDFs are not provided.
Document Jobs Behavior
- The page lists the Document's Jobs newest first with status and Job ID.
- Open Job navigates to Job Detail.
- Create Job opens Job creation with the Document selected.
- No jobs displays an explicit empty state.
Delete Behavior
- Deletion is blocked while any Source or Job belongs to the Document.
- The blocked state names the dependency categories and provides navigation back and to Jobs.
- An unlinked Document requires an explicit permanent-delete action.
- Success returns to the Documents list.
Acceptance Checklist
- List columns, alignment, search, sorting, date fallback, and row navigation match this contract.
- Create/edit enforce name, registered type, and valid exact-date input.
- Linked People staging enforces one role and one row per Person.
- Document and Linked People writes never partially commit.
- Person-first Document creation preselects the requested Person as author.
- Detail links people, Sources, and Jobs to the correct records.
- Delete never removes a Document with Source or Job dependencies.
- Both print formats preserve the frozen content, ordering, text-precedence, and safety contracts.
- Service failures use the shared error presenter and never report false success.
Implementation Anchors
src/transcription/ui/pages/documents_page.pysrc/transcription/ui/components/table/documents.pysrc/transcription/services/documents.pysrc/transcription/services/people.pysrc/transcription/services/workflows.pysrc/transcription/ui/components/linked_people.pysrc/transcription/ui/pages/print_preview_page.pysrc/transcription/api/print_api.pytests/ui/test_documents_page.pytests/services/test_document_service.py
Known Limitations and Deferred Work
- Source page ordering remains read-only.
- Printing other entities, batch printing, and server-side export formats are deferred.