Resolution Center: Assign/Reassign Resolutions, Permission-Gated Bulk Actions, and Personalization Polish
Executive summary
This release rounds out the Resolution Center workflow and tightens permission handling across documents, mail, and resolutions. Reviewers can now assign or reassign resolutions (individually and in bulk) through a unified modal, bulk status controls are hidden from users who lack the right permission, document tags display and save reliably, and the themed (personalization) UI gets readability and missing-data fixes.
Why this was needed
Several Resolution Center features were stubbed out (the "Assign" action was a placeholder TODO) or behaved inconsistently. Users without status-change rights could still see bulk "Update Status" buttons, and triggering them could break the screen. Document tags sometimes failed to render or could not be cleared on save, and the configurable theme presets had low-contrast text and no graceful screen when a resolution or its document/mail no longer existed.
Client / user impact
- Reviewers can assign and reassign one or many resolutions from a single, consistent modal.
- Bulk "Update Status" / "Mark as Completed" buttons appear only for users who actually have the permission, removing confusing dead-end actions.
- Document tags now display correctly and can be edited or fully cleared, with the change persisting.
- Resolutions are now visible from the document details tab.
- Themed views (Horizon/Midnight/Lumina) are more legible, including for presbyopic users, and show a clear "not found" screen instead of a broken page when a resolution, document, or mail is missing.
Technical scope
- New
AssignResolutionModalcomponent (entity / role / user selectors) replaces the oldBulkReassignResolutionModal, reused for both single assign and bulk reassign on document and mail resolution tabs (merges #687-#694). - Added bulk-assign wiring: new
assignResolutionsservice +useAssignResolutionsMutation, a new resolution route, and a sharedResolutionCreatePayloadtype (now reused by the mail Add Resolution modal);assigned_role_idis sent only when a role is chosen, and resolution/user IDs are normalized to integer arrays. - Permission gating: bulk "Update Status" in documents (
CHANGE_DOCUMENT_STATUS) and mail (CHANGE_MAIL_STATUS), plus resolution completion/assign actions, are conditionally rendered viahasPermission. - Document details: robust tag normalization (
coerceTagCollection/normalizeDocumentTags) handles varied backend shapes, dedupes, renders badges, and always sendstagsso empty selections clear assignments. - Resolution detail pages add
isError/missing-data handling that renders sharedNotFoundDocument/NotFoundMailstates. - Personalization/theme CSS: unified badge tints and high-contrast (black/white) badge text for Horizon and Midnight; theme-aware
bg-card/text-foreground/border-borderclasses replace hardcoded slate/white. - UI primitives gain a
modalprop and an up-direction dropdown placement so selectors render correctly inside dialogs.
Risk & mitigation
Mostly low-to-moderate frontend risk: permission-gating uses existing hasPermission checks, and the not-found states are additive guards. Moderate areas are the rewritten document tag normalization (varied input shapes, NaN/fallback IDs, now always sending tags) and the assign payload contract, which depend on the backend accepting integer arrays, optional assigned_role_id, and tag clears. Mitigation: exercise assign/reassign and tag edit/clear against the QA API and confirm payload shapes before promotion to production.
QA validation focus
- Assign and reassign resolutions (single and bulk) on both document and mail resolution tabs; confirm role/user selection submits and dropdowns render inside the modal.
- Verify bulk "Update Status" and "Mark as Completed" are hidden for users lacking
CHANGE_DOCUMENT_STATUS/CHANGE_MAIL_STATUS/ resolution permissions, and that the previous status-update screen break is gone. - Edit document tags: add, remove all (clear), and re-save; confirm tags render and persist after refresh.
- Confirm the Actions column cannot be hidden via column configuration, and resolutions show in the document details tab.
- Open a deleted/invalid resolution, document, and mail URL and confirm the not-found screen appears.
- Switch between Horizon, Midnight, and Lumina themes and check badge/text contrast and header legibility.