All updates
QAFrontend

Mail & Admin fixes: bulk Mark-as-Read progress tracking, Status column rendering, unread-row highlighting, and a responsive Create Folder dialog

PR #958pixbox-supportApr 10, 2026 · 08:34 UTC
QAApr 10, 2026

Executive summary

A batch release promoting four bug fixes and one UI improvement from development to the QA environment. The headline fix corrects bulk "Mark as Read / Unread" actions so large selections now show real progress instead of silently completing only a partial subset. The release also repairs the Status column display in batch mails, improves unread-row highlighting in the inbox, and makes the admin Create Folder dialog usable on smaller screens.

Why this was needed

Several defects affected day-to-day mail handling at scale. When a user selected all mails (tested against a ~4,180-item dataset) and chose Mark as Read/Unread, the backend queued an asynchronous job and returned a "job accepted" response, but the frontend treated it as instant success: the toast appeared immediately, no progress dialog opened, and only the items processed before the user navigated away actually appeared updated (BUG-014). Separately, the Status column in the batch mails grid showed the literal text "[object Object]" because the backend returns status as a structured { id, name } value the grid was not unwrapping. Unread rows in the inbox were only partially emphasized (date and empty cells were not highlighted), and the admin Create Folder dialog could overflow on smaller screens.

Client / user impact

  • Bulk Mark as Read / Mark as Unread on large selections now opens a progress dialog that polls until every selected mail is actually updated, so users no longer see false success or partially-applied changes.
  • The Status column in the batch mails grid (Uploaded, Allocations, Processing, Proofreading, Completed tabs) now shows the correct status name instead of "[object Object]".
  • Unread inbox rows are now fully and consistently highlighted, including date columns and empty-value cells, making unread mail easier to spot at a glance.
  • The admin Create Folder dialog now fits on smaller screens with a scrollable body and a wider two-column layout.

Technical scope

Frontend-only change (9 files, +259 / -73). Notable items in this batch:

  • Bulk Mark as Read/Unread async fix (BUG-014): routed the select-all onSuccess through handleMutationResponse(response) so an HTTP 202 + { job_id } reply from PUT /v1/mails/update registers a bulk job and the global progress dialog polls to completion. Applied in all three places sharing the bug: inbox/InboxGrid/InboxGrid.tsx, inbox/MailGrid/hooks/useMailGridHandlers.ts, and batches/TabContents/MailContents/MailContents.tsx.
  • Status column rendering: added a normalizeReferenceValue helper in utils/array.helpers.ts to unwrap { id, name }-style reference objects, plus an explicit status branch and a defensive object-unwrap fallback in batch mails columns.tsx.
  • Inbox unread highlighting: replaced hardcoded placeholder text classes with resolveTextClassName({ isUnread }) across date, array, priority, filename, and action-required cells in inbox/InboxGrid/columns.tsx.
  • API type sync: added a generated UserDeleteResponse model and its export (no runtime behavior change).
  • Admin Create Folder dialog (admin/folders/FolderFormDialog): widened to sm:max-w-3xl, capped at 85vh with a scrollable flex body, and moved fields/toggles into a two-column FormGrid. Note: this UI change is in the diff but is not listed in the PR description.

Risk & mitigation

Low overall. The async-job fix only changes the success-handling path for select-all bulk actions; per-item explicit selections are unchanged. Risk is that the bulk progress dialog must correctly detect and poll the queued job — if the backend response shape differs from expectations, the dialog may not open. The Status/reference unwrap and unread-highlight changes are display-only and fall back to a dash placeholder for unrecognized values. The UserDeleteResponse addition is generated type-only. Mitigation: this release targets the QA environment for verification before any production promotion.

QA validation focus

  • On a large inbox/mail dataset, select all and run Mark as Read, then Mark as Unread; confirm a progress dialog opens, polls to completion, and every selected mail reflects the new state (no instant toast, no partial update). Verify across /inbox?tab=inbox, /inbox?tab=mail, and /batches/mails.
  • Open the batch mails grid on each tab (Uploaded, Allocations, Processing, Proofreading, Completed) and confirm the Status column shows real status names, never "[object Object]" or a stray dash.
  • In the inbox, mark a mail unread and confirm the entire row is highlighted, including date columns (Received On, Last Modified, Share Deadline, Shared On) and any empty/placeholder cells; confirm read rows look unchanged.
  • Open the admin Create Folder dialog on a smaller viewport; confirm header and footer stay pinned, the body scrolls, and Parent Folder/Tenant plus the toggle switches lay out in two columns.
  • Smoke-test remaining mail flows for regressions.