All updates
QAFrontend

QA Promotion (20 Feb): Real-Time Bulk Mail Progress, Select-All, Vendor Task Details & Upload Header Polish

PR #801heytulsiprasadFeb 20, 2026 · 06:38 UTC
QAFeb 20, 2026

Executive summary

This release promotes the 20 February development cycle into the QA environment for testing. It bundles a major new real-time progress experience for bulk mail operations, a Gmail-style "Select All Records" capability across data grids, a rebuilt Vendor Portal task-details view with live status updates, a more resilient document-upload header, and a batch of stability and UI fixes. Nothing here has reached Production yet; this is the testing-cycle build.

Why this was needed

Large bulk actions (status changes, folder moves) previously blocked the user behind a modal and a synchronous toast, with no visibility once the operation grew large enough for the backend to process it in the background. Users also lacked a true "select all matching records" option and had to select rows page by page. In the Vendor Portal, task progress relied on frequent polling and a thinner task view, and the document-upload header overlapped when the resizable panel was narrowed. This cycle groups the fixes addressing these gaps so they can be validated together before going live.

Client / user impact

  • Bulk mail operations now show a non-blocking, Google Drive-style progress panel docked bottom-right, with live X/Y counts that update in real time and persist as the user navigates between pages.
  • Users can select every matching record at once ("Select All X Records") and apply status updates, user/folder assignment, move, share, download, and read/unread in one action.
  • Vendor Portal users get a richer task-details page (file list, progress bar, upload-center and batch names, durations) that updates live instead of via constant polling, plus a working "Download Original" button and server-backed "Clear Completed".
  • The document-upload header no longer overlaps when the side panel is narrowed, and the reprocessing option only appears for completed documents.

Technical scope

Frontend-only promotion across the auth, mail, and vendor apps (~3,400 additions). Grounded in the diff and commits, notable changes:

  • Async bulk progress (PR #795): New BulkOperationProgress panel plus useJobProgressSocket/useBulkJobProgress hooks and a bulk-job Zustand store; detects HTTP 202, tracks job_progress/mail_updated events over the /ws/notifications WebSocket with HTTP-polling fallback, and lifts the panel into DashboardLayout for route persistence. UpdateMailStatusModal/BulkUpdateStatusModal now route 202 responses to the panel instead of a toast; progress is clamped 0-100 and uses Math.max to stay monotonic.
  • Select All (PR #782): Gmail-style select-all wired into bulk actions; folder modals fixed to use the selection-aware path only when mode === "selectAll".
  • Vendor task details (PRs #796, #799): Monolithic page decomposed into TaskDetailHeader/TaskProgressBar/TaskStatsGrid/TaskInfoCards/TaskFileList, switched to a comprehensive details endpoint, WebSocket-driven updates, floating-pill pagination, Download Original, API-backed Clear Completed, and a Math.min(100, …) cap in 5 spots so extracted ZIPs never exceed 100%.
  • Document upload header (PR #800): Replaced lg: viewport breakpoints with CSS @container queries (cq-upload-header) so layout follows panel width; container-type moved off the sticky header.
  • PDF/build: pdfjs-dist now lazy-loaded and a Turbopack canvas stub added to avoid SSR/native-module bundling errors.
  • Smaller fixes: suppressHydrationWarning on root layouts, reprocessing checkbox gated to Completed status, Add Address hidden until an entity is selected, login empty-field validation, vendor 404 page, and various debounce/UX tweaks.

Risk & mitigation

Moderate. The bulk-progress feature adds real-time WebSocket plumbing, a global store, and dual sync/async response handling, so edge cases (WebSocket drop, dismiss-while-running, cache invalidation timing) are the main risk; an HTTP-polling fallback and decoupled dismiss-vs-tracking logic mitigate this. Select-all and the vendor task rebuild touch high-traffic flows. Several changes depend on backend behavior (HTTP 202, job-event publishing, the new vendor details endpoint); if the backend is not aligned in QA, progress or task data may not populate. Mitigation: this is a QA-only promotion gated behind a full test plan before any Production release.

QA validation focus

  • Trigger a bulk status update on more than one mail and confirm a 202 shows the progress panel (not a sync toast) on both Inbox and Batch Mails pages.
  • Dismiss the panel mid-job and confirm background tracking continues, the grid refreshes on completion, and counts never jump backward or exceed 100%.
  • Use "Select All X Records" and run status update, assign user/folders, move, and share; verify correct counts in both select-all and explicit selection modes.
  • In Vendor Portal: open task details, upload files (including a ZIP), and confirm live progress capped at 100%, working pagination/filters, Download Original, and Clear Completed.
  • Narrow the document-upload resizable panel and confirm the header grid reflows without overlap; verify the reprocessing checkbox appears only for Completed documents and Add Address is hidden until an entity is selected.
  • Smoke-test PDF preview and confirm no hydration or canvas build warnings across Chrome, Safari, Firefox, and Edge.