Enhance Documents UX with detail view, type-specific cards, and expiration alerts #43
Reference in New Issue
Block a user
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Problem
The Documents feature has a fragmented UX where metadata is hidden behind the Edit button:
Current workflow:
Issues:
Proposed Solution
1. Type-Specific Card Metadata
Display contextually relevant metadata on list cards based on document type:
2. Dedicated "View Details" Page
Replace the current preview-only page with a detail view that shows:
Layout:
3. Expiration Alerts (30-day warning)
Add visual indicators for documents expiring within 30 days:
Acceptance Criteria
Technical Notes
Screenshots
Current state documented during investigation - cards show minimal info, metadata only visible in Edit modal.
Plan: Documents UX Enhancement
Phase: Planning | Agent: Planner | Status: AWAITING_REVIEW
Summary
Enhance the Documents feature with type-specific metadata display, a proper detail view with visible metadata, and expiration warning indicators. This is a frontend-only change - all required data already exists in API responses.
Codebase Analysis Findings
Files Examined:
frontend/src/features/documents/pages/DocumentsPage.tsx- Desktop list viewfrontend/src/features/documents/pages/DocumentDetailPage.tsx- Detail pagefrontend/src/features/documents/mobile/DocumentsMobileScreen.tsx- Mobile list viewfrontend/src/features/documents/components/DocumentForm.tsx- Type-specific field patternsfrontend/src/features/documents/types/documents.types.ts- Data structuresKey Findings:
expirationDatefield being availableNo Backend Changes Required -
DocumentRecordalready includesexpirationDate,issuedDate, anddetailsobject with all type-specific fields.Architecture Decision
Create 2 shared components to avoid duplication across 3 views:
ExpirationBadgeexpirationDate: string | nullDocumentCardMetadatadoc: DocumentRecord, variant: 'card' | 'detail' | 'mobile'Milestones
Milestone 1: Create ExpirationBadge Component
Scope: New component for expiration warnings
Files:
frontend/src/features/documents/components/ExpirationBadge.tsxfrontend/src/features/documents/components/ExpirationBadge.test.tsxImplementation:
expirationDate: string | null | undefined,className?: stringnullif no expiration dateAcceptance:
Milestone 2: Create DocumentCardMetadata Component
Scope: Shared component for type-specific metadata display
Files:
frontend/src/features/documents/components/DocumentCardMetadata.tsxfrontend/src/features/documents/components/DocumentCardMetadata.test.tsxImplementation:
doc: DocumentRecord,variant: 'card' | 'detail' | 'mobile'card: Compact, text-sm, max 3-4 fieldsmobile: Compact, text-xs, dark mode supportdetail: Full display, grid layoutAcceptance:
Milestone 3: Update DocumentsPage (Desktop List)
Scope: Add metadata and expiration badges to desktop cards
Files:
frontend/src/features/documents/pages/DocumentsPage.tsxImplementation:
Acceptance:
Milestone 4: Update DocumentsMobileScreen
Scope: Add metadata and expiration badges to mobile cards
Files:
frontend/src/features/documents/mobile/DocumentsMobileScreen.tsxImplementation:
Acceptance:
Milestone 5: Redesign DocumentDetailPage
Scope: Side-by-side layout with full metadata panel
Files:
frontend/src/features/documents/pages/DocumentDetailPage.tsxImplementation:
Desktop layout (md breakpoint and up):
Mobile layout (below md):
md:flex md:gap-6for side-by-sideAcceptance:
Milestone 6: Quality Assurance and Testing
Scope: Viewport testing, lint, type-check
Tasks:
npm run lint- fix all issuesnpm run type-check- fix all issuesnpm test- all tests passFiles Summary
frontend/src/features/documents/components/ExpirationBadge.tsxfrontend/src/features/documents/components/ExpirationBadge.test.tsxfrontend/src/features/documents/components/DocumentCardMetadata.tsxfrontend/src/features/documents/components/DocumentCardMetadata.test.tsxfrontend/src/features/documents/pages/DocumentsPage.tsxfrontend/src/features/documents/pages/DocumentDetailPage.tsxfrontend/src/features/documents/mobile/DocumentsMobileScreen.tsxTotal: 4 new files, 3 modified files
Dependencies
Risk Assessment
Verdict: AWAITING_REVIEW | Next: QR plan-completeness review
QR Review: Plan Completeness
Phase: Plan-Review | Agent: Quality Reviewer | Status: PASS
Checklist
Decision Log Review
Findings
None. Plan is complete and well-structured.
Considered But Not Flagged
Verdict: PASS | Next: TW plan-scrub
TW Review: Plan Scrub
Phase: Plan-Review | Agent: Technical Writer | Status: PASS
Documentation Quality Check
Terminology Consistency
Scrub Findings
Minor clarity improvement (not blocking):
Verified Against Codebase
DocumentRecordinterface confirmed atdocuments.types.ts:3-25dayjsimport pattern confirmed fromDocumentForm.tsx:9dark:text-avus,dark:text-titanioconfirmed in existing filesmin-h-[44px]pattern confirmed throughoutVerdict: PASS | Next: QR plan-code
QR Review: Plan Code
Phase: Plan-Review | Agent: Quality Reviewer | Status: PASS
RULE 0: Production Reliability
RULE 1: Project Conformance
features/documents/components/RULE 2: Structural Quality
Proposed Code Analysis
ExpirationBadge:
DocumentCardMetadata:
Layout Changes:
Findings
None. Proposed code follows all project standards.
Considered But Not Flagged
Record<string, any>. The plan uses optional chaining which handles undefined gracefully. A typed discriminated union could improve type safety but is out of scope for this UI enhancement and would require backend schema changes.Verdict: PASS | Next: QR plan-docs
QR Review: Plan Docs
Phase: Plan-Review | Agent: Quality Reviewer | Status: PASS
Documentation Impact Assessment
Post-Implementation Documentation Needs
frontend/src/features/documents/README.mdCLAUDE.mddocs/Comment Quality Check
Findings
None. Documentation scope is minimal for this UI enhancement.
Recommendation
Post-implementation: Add brief JSDoc comments to new components describing props and return values. No other documentation updates required.
Verdict: PASS | Next: Plan Approved - Ready for Execution
Plan Review Summary
PLAN APPROVED - Ready to create branch and begin implementation.
Milestone: Implementation Complete
Phase: Execution | Agent: Developer | Status: PASS
Milestones Completed
Files Changed
frontend/src/features/documents/components/ExpirationBadge.tsxfrontend/src/features/documents/components/ExpirationBadge.test.tsxfrontend/src/features/documents/components/DocumentCardMetadata.tsxfrontend/src/features/documents/components/DocumentCardMetadata.test.tsxfrontend/src/features/documents/pages/DocumentsPage.tsxfrontend/src/features/documents/pages/DocumentDetailPage.tsxfrontend/src/features/documents/mobile/DocumentsMobileScreen.tsxfrontend/jest.config.ts(fixed testMatch pattern)Quality Checks
npm run lint- passes (pre-existing warnings only)npm run type-check- passesPR
PR #44: #44
Verdict: PASS | Next: Quality Agent final review
Fix: UX Improvements
Phase: Execution | Agent: Developer | Status: COMPLETE
Changes Made
DocumentsPage.tsxDocumentsMobileScreen.tsxDocumentDetailPage.tsxhasDisplayableMetadatahelper; conditionally render Details sectionDetails
Button Rename: Changed "Open" to "View Details" on both desktop and mobile document list views for clearer UX intent.
Empty State Handling: Added logic to hide the "Details" section header when a document has no displayable metadata. Previously, documents without metadata (expiration date, policy number, etc.) would show an empty "Details" header with nothing beneath it.
Quality Checks
Commit
Ready for testing on staging after push