You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Per-file error state + retry button (part 1; part 2 shipped in #398) #352
Split out of #298 (the rest of that audit is superseded by the v3 redesign). Two residual UI gaps, verified against the current tree:
Per-file error state and per-file retry. Retry/Resume is run-level only (packages/react/src/components/FileList.tsx footer). No component renders a per-file FAILED state: FileRow, FilePreview, and FileHero track only SUCCESSFUL / UPLOADING / PROCESSING. The plumbing already exists and is unused by the UI: core.retry(fileId) (packages/core/src/core.ts:701) and retryUpload(fileId) (packages/react/src/hooks/useUploaderController.ts:507). Rendering a failed badge + retry affordance per file is UI-only work, but lands as a cross-framework batch (React canon first, five ports, parity-fixture regen).
Compact list row hides its progress bar at 0%.ProgressBar itself renders whenever the run is active (ProgressBar.tsx:29), and FileHero / FilePreview / FileList use it unconditionally — but FileRow.tsx:166 still gates on {!!progress && …}, so the compact row shows nothing until the first byte moves. One-line fix plus the same gate check in the other frameworks' row templates.
Both are 3.2 candidates alongside the existing cross-framework batch (credit-link target-size, DriveAuthFallback pending state, etc.).
Part 2 (compact FileRow hides progress at 0%) landed in #398: the redundant !!progress wrapper was deleted in react/vue/svelte/angular/vanilla; each port's ProgressBar already self-gates on !!progress || isUploadActive(status), so nothing renders at rest and no parity fixture moved.
Part 1 (per-file failed badge + retry) stays open, with corrected scope from a fresh read of dev:
core.retry(fileId) is at packages/core/src/core.ts:909 (not 701); retryUpload(fileId?) is on the controller commands via orchestrator/uploader-orchestrator.ts:115. Core does set per-file FAILED (onFileError → updateFile(id, { status: FAILED }) and markUnsuccessfulFilesFailed).
Nothing renders it: FileRow/FileHero/FilePreview only branch on SUCCESSFUL/UPLOADING/PROCESSING. Every FAILED read in the UI packages is run-level (FileList/UploaderPanel).
Two items the original body omits: a per-file error message needs a core type addition (UploadFile has no error field), which hits the public-API and type pins; and runRetry flips run-level status to UPLOADING even for a single-file retry, so the footer visibly leaves its failed state. Decide whether that reads acceptably before building the button.
A deterministic FAILED state already exists in all six storybooks (packages/storybook-config/src/testing/state-stories.ts:61-64), so verification is cheap.
Size M (React canon + five ports, one new testid/slot pair). Deferred past the 3.3.1 release because run-level Retry already re-sends every failed file, so nobody is stuck.
changed the title [-]Per-file error state + retry button; compact FileRow hides progress at 0%[/-][+]Per-file error state + retry button (part 1; part 2 shipped in #398)[/+]on Sep 11, 2026
Activity
Merge pull request #398 from DevinoSolutions/fix/ui-batch-352-229
AminDhouib commentedon Sep 11, 2026
Part 2 (compact FileRow hides progress at 0%) landed in #398: the redundant
!!progresswrapper was deleted in react/vue/svelte/angular/vanilla; each port's ProgressBar already self-gates on!!progress || isUploadActive(status), so nothing renders at rest and no parity fixture moved.Part 1 (per-file failed badge + retry) stays open, with corrected scope from a fresh read of dev:
core.retry(fileId)is atpackages/core/src/core.ts:909(not 701);retryUpload(fileId?)is on the controller commands viaorchestrator/uploader-orchestrator.ts:115. Core does set per-file FAILED (onFileError→updateFile(id, { status: FAILED })andmarkUnsuccessfulFilesFailed).UploadFilehas no error field), which hits the public-API and type pins; andrunRetryflips run-level status to UPLOADING even for a single-file retry, so the footer visibly leaves its failed state. Decide whether that reads acceptably before building the button.packages/storybook-config/src/testing/state-stories.ts:61-64), so verification is cheap.[-]Per-file error state + retry button; compact FileRow hides progress at 0%[/-][+]Per-file error state + retry button (part 1; part 2 shipped in #398)[/+]