Document Actions, Filter Chip Fixes, and Mail Status Display Improvements (QA Batch)
Executive summary
This QA promotion bundles three frontend improvements: a unified, status-aware Actions menu for documents (with a working Download action), polished filter behavior with loading skeletons and stable filter-chip labels, and a cleaner read-only/edit display for mail statuses and deadlines. Together they make document management and filtering feel more consistent and responsive across the app.
Why this was needed
Document row and drawer Actions menus were built ad hoc per grid, causing missing or inconsistent options (e.g. Download was non-functional and "View Details" showed even on Uploaded documents). Applied filter chips flickered and could lose their human-readable column names while data loaded, and the Mail Status card always rendered editable controls with a separate Save button, which was confusing when simply viewing a mail.
Client / user impact
- Users get a consistent Actions menu on document grids and drawers, with a Download action that actually triggers a download and status-transition options driven by allowed transitions.
- "View Details" is now correctly hidden for Uploaded documents.
- Applied-filter chips show loading skeletons and retain their proper column labels, eliminating flicker and blank/raw key names when filtering.
- The mail detail page shows statuses and deadline as clean read-only badges/text when viewing, and editable controls only in edit mode; the inline Save button and a non-functional "Update Status" menu item were removed for now.
Technical scope
Batch promotion of three feature PRs into QA:
- #352 – Document actions refactor:
DocumentContents.tsxandDocumentGrid.tsxnow build menus via sharedgetDocumentActions+convertActionItemsToDropdownItems, replacing per-componentcreateDocumentActionItems.document-actions.tsadds aDownloadaction andhandleDownload, drops the unusedAssign Useraction, and hides View Details when status is "uploaded". Grids pass a unifieddrawerActionscallback (removing the oldviewDetailsButtonOnDrawer). - #353 – Filter glitch + loading states:
column-filter-popover.tsxadds an optionalcolumnLabeltoColumnFilterand persists it on change;applied-filters-display.tsxanddata-grid.tsxmemoize/cache column labels and addisLoadingskeletons;inbox-data-grid.tsxforwardsisLoading. - #354 – Mail status display:
MailStatus.tsxgains anisEditingprop, rendering global statuses as badges and deadline as formatted text when not editing; removes its internal Save mutation/button.MailOverviewDetails.tsxmountsMailStatus, andmails/[id]/page.tsxcomments out the "Update Status" dropdown item.
Risk & mitigation
Low-to-moderate, UI-layer only with no API contract changes. Main risks: the document menus rely heavily on any-typed row data and per-row handler closures, so an unexpected status field could mislabel or mis-gate an action; status update for documents in DocumentContents is a TODO stub (shows an info toast). The removed inline mail Save and "Update Status" item are intentionally disabled, so status-editing flows there are temporarily unavailable. Mitigation: targeted QA on each grid's Actions menu and the mail status view/edit toggle before promoting to production.
QA validation focus
- On document grids (batch documents and standalone), open the row Actions menu and the row drawer: confirm Download works, Delete prompts correctly, and "Move to <status>" options match allowed transitions.
- Confirm "View Details" is hidden for Uploaded documents and present otherwise.
- Apply, edit, and clear column filters; verify chips show skeletons while loading and always display correct column labels (no raw snake_case keys or flicker).
- On a mail detail page, verify Mail Status shows badges + formatted deadline in view mode and editable controls in edit mode; confirm the "Update Status" dropdown item no longer appears.