diff --git a/frontend/src/canvas/image-drop.ts b/frontend/src/canvas/image-drop.ts index d7caeb0..e529d18 100644 --- a/frontend/src/canvas/image-drop.ts +++ b/frontend/src/canvas/image-drop.ts @@ -242,9 +242,18 @@ export function setupDragDrop( continue; } - const placeholder = createPlaceholder(viewport, cursorX, cursorY); const jobId = uploads?.addJob(file, boardId); + // Check if job was cancelled while queued (user clicked cancel) + if (jobId && uploads?.isCancelled(jobId)) { + col++; + if (col >= cols) { col = 0; row++; cursorY += rowMaxH + GAP; rowMaxH = 0; } + continue; + } + + const placeholder = createPlaceholder(viewport, cursorX, cursorY); + if (jobId) uploads?.startUpload(jobId); + try { const res = await uploadImage(boardId, file, (p) => { if (jobId) uploads?.setProgress(jobId, p); diff --git a/frontend/src/components/UploadPanel.tsx b/frontend/src/components/UploadPanel.tsx index a3368cc..395d023 100644 --- a/frontend/src/components/UploadPanel.tsx +++ b/frontend/src/components/UploadPanel.tsx @@ -12,6 +12,7 @@ function formatSize(bytes: number): string { } const STATUS_LABELS: Record = { + queued: 'Queued', uploading: 'Uploading', processing: 'Processing', done: 'Done', @@ -19,13 +20,14 @@ const STATUS_LABELS: Record = { }; const STATUS_COLORS: Record = { + queued: '#888', uploading: '#4a9eff', processing: '#ffa94d', done: '#4ade80', failed: '#f87171', }; -function JobRow({ job, onDismiss }: { job: UploadJob; onDismiss: () => void }) { +function JobRow({ job, onDismiss, onCancel }: { job: UploadJob; onDismiss: () => void; onCancel?: () => void }) { const pct = Math.round(job.progress * 100); const color = STATUS_COLORS[job.status]; @@ -48,6 +50,12 @@ function JobRow({ job, onDismiss }: { job: UploadJob; onDismiss: () => void }) { {formatSize(job.fileSize)} + {job.status === 'queued' && onCancel && ( + + )} {(job.status === 'done' || job.status === 'failed') && (