fix(batch): wireframe polishing — Used by roles, -50% inline, (partial) suffix

- FilesListTab: add (input)/(output)/(error) role label next to batch id in Used by column + tooltip (G-AUD1, plan §4 wireframe `b1 (input)`)
- BatchListTab: add -50% inline badge on Cost column per wireframe §3 `$6.20 (-50%)` (G-AUD2) + (partial) suffix on progress when expired_with_failures (G-AUD3)
- ExpirationBadge: document <1h/<6h/<24h tier semantics + >24h graceful fallback (G-AUD4)
- 4 new i18n keys in en + pt-BR (filesListUsedByRoleInput/Output/Error, batchListProgressPartial); 40 locales auto-filled via fill-missing-from-en.mjs
- Update list-regression test #13 to assert new used-by format (truncated id + role label + tooltip carries full id+role)
This commit is contained in:
diegosouzapw 2026-05-28 16:24:32 -03:00
parent 3c2022a13d
commit 0f1bbc58a4
46 changed files with 274 additions and 70 deletions

View file

@ -453,7 +453,7 @@ export default function BatchListTab({
<td className="px-4 py-3 text-[var(--color-text-muted)] text-xs">
{batch.model ?? "—"}
</td>
{/* Progress — ProgressBarBicolor from F3; spinner when validating (G2) */}
{/* Progress — ProgressBarBicolor from F3; spinner when validating (G2); (partial) suffix when expired with failures (G-AUD3) */}
<td className="px-4 py-3 min-w-[140px]">
{batch.status === "validating" ? (
<div className="flex items-center gap-2 text-xs text-yellow-400">
@ -461,19 +461,31 @@ export default function BatchListTab({
Validating
</div>
) : total > 0 ? (
<ProgressBarBicolor
total={total}
completed={done}
failed={failed}
showLabels
/>
<div className="flex flex-col gap-0.5">
<ProgressBarBicolor
total={total}
completed={done}
failed={failed}
showLabels
/>
{effectiveStatus(batch) === "expired_with_failures" && (
<span className="text-[10px] text-orange-400 italic">
{t("batchListProgressPartial")}
</span>
)}
</div>
) : (
<span className="text-xs text-[var(--color-text-muted)]"></span>
)}
</td>
{/* Cost column — heuristic estimate (D8) */}
<td className="px-4 py-3 text-xs text-[var(--color-text-muted)] whitespace-nowrap">
{estimatedCost}
{/* Cost column — heuristic estimate (D8) with -50% badge per wireframe §3 (G-AUD2) */}
<td className="px-4 py-3 text-xs whitespace-nowrap">
<span className="text-[var(--color-text-muted)]">{estimatedCost}</span>
{estimatedCost !== "—" && (
<span className="ml-1 text-[10px] text-emerald-500/90 bg-emerald-500/10 rounded px-1 py-0.5 align-middle">
-50%
</span>
)}
</td>
<td className="px-4 py-3 text-xs text-[var(--color-text-muted)] whitespace-nowrap">
{relativeTime(batch.createdAt)}

View file

@ -249,31 +249,44 @@ export default function FilesListTab({
<td className="px-4 py-3 text-xs text-[var(--color-text-muted)] whitespace-nowrap">
{formatBytes(file.bytes)}
</td>
{/* "Used by" column (D12) */}
{/* "Used by" column (D12) — shows batch id + role (input/output/error) per plan §4 */}
<td className="px-4 py-3 text-xs">
{related.length === 0 ? (
<span className="text-[var(--color-text-muted)]">
{t("filesListUsedByNone")}
</span>
) : (
<div
className="flex flex-col gap-0.5"
title={related.map((b) => b.id).join(", ")}
>
{related.slice(0, 2).map((b) => (
<span
key={b.id}
className="font-mono text-[10px] text-[var(--color-text-main)]"
(() => {
const roleFor = (b: BatchRecord): string =>
b.inputFileId === file.id
? t("filesListUsedByRoleInput")
: b.outputFileId === file.id
? t("filesListUsedByRoleOutput")
: t("filesListUsedByRoleError");
return (
<div
className="flex flex-col gap-0.5"
title={related.map((b) => `${b.id} (${roleFor(b)})`).join(", ")}
>
{b.id.slice(0, 16)}
</span>
))}
{related.length > 2 && (
<span className="text-[10px] text-[var(--color-text-muted)]">
+{related.length - 2}
</span>
)}
</div>
{related.slice(0, 2).map((b) => (
<span
key={b.id}
className="font-mono text-[10px] text-[var(--color-text-main)]"
>
{b.id.slice(0, 12)}{" "}
<span className="text-[var(--color-text-muted)]">
({roleFor(b)})
</span>
</span>
))}
{related.length > 2 && (
<span className="text-[10px] text-[var(--color-text-muted)]">
+{related.length - 2}
</span>
)}
</div>
);
})()
)}
</td>
<td className="px-4 py-3 text-xs text-[var(--color-text-muted)] whitespace-nowrap">

View file

@ -34,6 +34,10 @@ export default function ExpirationBadge({ expiresAt, variant = "default" }: Prop
</span>
);
}
// D11 tiers: <1h critical (red) · <6h warning (yellow) · else normal (green).
// Plan specifies "<24h normal" — in practice batches always expire ≤24h (OpenAI window),
// so "else" maps to that case. If a provider (e.g. Gemini 48h) yields remaining >24h,
// we still render normal — graceful, no separate tier needed.
let tone = "bg-emerald-500/15 text-emerald-400 border-emerald-500/25";
let label = t("expirationBadgeNormal");
if (remaining < 3600) {

View file

@ -782,7 +782,11 @@
"batchDetailCancelConfirm": "Cancel this batch? In-progress requests will stop.",
"batchActionCancelError": "Failed to cancel batch. Try again.",
"batchActionRetryError": "Failed to retry failed requests. Try again.",
"batchConceptRetentionNote": "Results and error files are retained for 30 days (Anthropic: 29 days)"
"batchConceptRetentionNote": "Results and error files are retained for 30 days (Anthropic: 29 days)",
"filesListUsedByRoleInput": "input",
"filesListUsedByRoleOutput": "output",
"filesListUsedByRoleError": "error",
"batchListProgressPartial": "(partial)"
},
"sidebar": {
"home": "الصفحة الرئيسية",

View file

@ -782,7 +782,11 @@
"batchDetailCancelConfirm": "Cancel this batch? In-progress requests will stop.",
"batchActionCancelError": "Failed to cancel batch. Try again.",
"batchActionRetryError": "Failed to retry failed requests. Try again.",
"batchConceptRetentionNote": "Results and error files are retained for 30 days (Anthropic: 29 days)"
"batchConceptRetentionNote": "Results and error files are retained for 30 days (Anthropic: 29 days)",
"filesListUsedByRoleInput": "input",
"filesListUsedByRoleOutput": "output",
"filesListUsedByRoleError": "error",
"batchListProgressPartial": "(partial)"
},
"sidebar": {
"home": "Home",

View file

@ -782,7 +782,11 @@
"batchDetailCancelConfirm": "Cancel this batch? In-progress requests will stop.",
"batchActionCancelError": "Failed to cancel batch. Try again.",
"batchActionRetryError": "Failed to retry failed requests. Try again.",
"batchConceptRetentionNote": "Results and error files are retained for 30 days (Anthropic: 29 days)"
"batchConceptRetentionNote": "Results and error files are retained for 30 days (Anthropic: 29 days)",
"filesListUsedByRoleInput": "input",
"filesListUsedByRoleOutput": "output",
"filesListUsedByRoleError": "error",
"batchListProgressPartial": "(partial)"
},
"sidebar": {
"home": "Начало",

View file

@ -782,7 +782,11 @@
"batchDetailCancelConfirm": "Cancel this batch? In-progress requests will stop.",
"batchActionCancelError": "Failed to cancel batch. Try again.",
"batchActionRetryError": "Failed to retry failed requests. Try again.",
"batchConceptRetentionNote": "Results and error files are retained for 30 days (Anthropic: 29 days)"
"batchConceptRetentionNote": "Results and error files are retained for 30 days (Anthropic: 29 days)",
"filesListUsedByRoleInput": "input",
"filesListUsedByRoleOutput": "output",
"filesListUsedByRoleError": "error",
"batchListProgressPartial": "(partial)"
},
"sidebar": {
"home": "Home",

View file

@ -782,7 +782,11 @@
"batchDetailCancelConfirm": "Cancel this batch? In-progress requests will stop.",
"batchActionCancelError": "Failed to cancel batch. Try again.",
"batchActionRetryError": "Failed to retry failed requests. Try again.",
"batchConceptRetentionNote": "Results and error files are retained for 30 days (Anthropic: 29 days)"
"batchConceptRetentionNote": "Results and error files are retained for 30 days (Anthropic: 29 days)",
"filesListUsedByRoleInput": "input",
"filesListUsedByRoleOutput": "output",
"filesListUsedByRoleError": "error",
"batchListProgressPartial": "(partial)"
},
"sidebar": {
"home": "Domov",

View file

@ -782,7 +782,11 @@
"batchDetailCancelConfirm": "Cancel this batch? In-progress requests will stop.",
"batchActionCancelError": "Failed to cancel batch. Try again.",
"batchActionRetryError": "Failed to retry failed requests. Try again.",
"batchConceptRetentionNote": "Results and error files are retained for 30 days (Anthropic: 29 days)"
"batchConceptRetentionNote": "Results and error files are retained for 30 days (Anthropic: 29 days)",
"filesListUsedByRoleInput": "input",
"filesListUsedByRoleOutput": "output",
"filesListUsedByRoleError": "error",
"batchListProgressPartial": "(partial)"
},
"sidebar": {
"home": "Hjem",

View file

@ -782,7 +782,11 @@
"batchDetailCancelConfirm": "Cancel this batch? In-progress requests will stop.",
"batchActionCancelError": "Failed to cancel batch. Try again.",
"batchActionRetryError": "Failed to retry failed requests. Try again.",
"batchConceptRetentionNote": "Results and error files are retained for 30 days (Anthropic: 29 days)"
"batchConceptRetentionNote": "Results and error files are retained for 30 days (Anthropic: 29 days)",
"filesListUsedByRoleInput": "input",
"filesListUsedByRoleOutput": "output",
"filesListUsedByRoleError": "error",
"batchListProgressPartial": "(partial)"
},
"sidebar": {
"home": "Zuhause",

View file

@ -773,6 +773,10 @@
"filesListUploadButton": "Upload",
"filesListUsedByColumn": "Used by",
"filesListUsedByNone": "None",
"filesListUsedByRoleInput": "input",
"filesListUsedByRoleOutput": "output",
"filesListUsedByRoleError": "error",
"batchListProgressPartial": "(partial)",
"filesListDelete": "Delete",
"filesListDownload": "Download",
"batchDetailActionCancel": "Cancel batch",

View file

@ -782,7 +782,11 @@
"batchDetailCancelConfirm": "Cancel this batch? In-progress requests will stop.",
"batchActionCancelError": "Failed to cancel batch. Try again.",
"batchActionRetryError": "Failed to retry failed requests. Try again.",
"batchConceptRetentionNote": "Results and error files are retained for 30 days (Anthropic: 29 days)"
"batchConceptRetentionNote": "Results and error files are retained for 30 days (Anthropic: 29 days)",
"filesListUsedByRoleInput": "input",
"filesListUsedByRoleOutput": "output",
"filesListUsedByRoleError": "error",
"batchListProgressPartial": "(partial)"
},
"sidebar": {
"home": "Inicio",

View file

@ -782,7 +782,11 @@
"batchDetailCancelConfirm": "Cancel this batch? In-progress requests will stop.",
"batchActionCancelError": "Failed to cancel batch. Try again.",
"batchActionRetryError": "Failed to retry failed requests. Try again.",
"batchConceptRetentionNote": "Results and error files are retained for 30 days (Anthropic: 29 days)"
"batchConceptRetentionNote": "Results and error files are retained for 30 days (Anthropic: 29 days)",
"filesListUsedByRoleInput": "input",
"filesListUsedByRoleOutput": "output",
"filesListUsedByRoleError": "error",
"batchListProgressPartial": "(partial)"
},
"sidebar": {
"home": "Home",

View file

@ -782,7 +782,11 @@
"batchDetailCancelConfirm": "Cancel this batch? In-progress requests will stop.",
"batchActionCancelError": "Failed to cancel batch. Try again.",
"batchActionRetryError": "Failed to retry failed requests. Try again.",
"batchConceptRetentionNote": "Results and error files are retained for 30 days (Anthropic: 29 days)"
"batchConceptRetentionNote": "Results and error files are retained for 30 days (Anthropic: 29 days)",
"filesListUsedByRoleInput": "input",
"filesListUsedByRoleOutput": "output",
"filesListUsedByRoleError": "error",
"batchListProgressPartial": "(partial)"
},
"sidebar": {
"home": "Kotiin",

View file

@ -782,7 +782,11 @@
"batchDetailCancelConfirm": "Cancel this batch? In-progress requests will stop.",
"batchActionCancelError": "Failed to cancel batch. Try again.",
"batchActionRetryError": "Failed to retry failed requests. Try again.",
"batchConceptRetentionNote": "Results and error files are retained for 30 days (Anthropic: 29 days)"
"batchConceptRetentionNote": "Results and error files are retained for 30 days (Anthropic: 29 days)",
"filesListUsedByRoleInput": "input",
"filesListUsedByRoleOutput": "output",
"filesListUsedByRoleError": "error",
"batchListProgressPartial": "(partial)"
},
"sidebar": {
"home": "Accueil",

View file

@ -782,7 +782,11 @@
"batchDetailCancelConfirm": "Cancel this batch? In-progress requests will stop.",
"batchActionCancelError": "Failed to cancel batch. Try again.",
"batchActionRetryError": "Failed to retry failed requests. Try again.",
"batchConceptRetentionNote": "Results and error files are retained for 30 days (Anthropic: 29 days)"
"batchConceptRetentionNote": "Results and error files are retained for 30 days (Anthropic: 29 days)",
"filesListUsedByRoleInput": "input",
"filesListUsedByRoleOutput": "output",
"filesListUsedByRoleError": "error",
"batchListProgressPartial": "(partial)"
},
"sidebar": {
"home": "Home",

View file

@ -782,7 +782,11 @@
"batchDetailCancelConfirm": "Cancel this batch? In-progress requests will stop.",
"batchActionCancelError": "Failed to cancel batch. Try again.",
"batchActionRetryError": "Failed to retry failed requests. Try again.",
"batchConceptRetentionNote": "Results and error files are retained for 30 days (Anthropic: 29 days)"
"batchConceptRetentionNote": "Results and error files are retained for 30 days (Anthropic: 29 days)",
"filesListUsedByRoleInput": "input",
"filesListUsedByRoleOutput": "output",
"filesListUsedByRoleError": "error",
"batchListProgressPartial": "(partial)"
},
"sidebar": {
"home": "בית",

View file

@ -782,7 +782,11 @@
"batchDetailCancelConfirm": "Cancel this batch? In-progress requests will stop.",
"batchActionCancelError": "Failed to cancel batch. Try again.",
"batchActionRetryError": "Failed to retry failed requests. Try again.",
"batchConceptRetentionNote": "Results and error files are retained for 30 days (Anthropic: 29 days)"
"batchConceptRetentionNote": "Results and error files are retained for 30 days (Anthropic: 29 days)",
"filesListUsedByRoleInput": "input",
"filesListUsedByRoleOutput": "output",
"filesListUsedByRoleError": "error",
"batchListProgressPartial": "(partial)"
},
"sidebar": {
"home": "घर",

View file

@ -782,7 +782,11 @@
"batchDetailCancelConfirm": "Cancel this batch? In-progress requests will stop.",
"batchActionCancelError": "Failed to cancel batch. Try again.",
"batchActionRetryError": "Failed to retry failed requests. Try again.",
"batchConceptRetentionNote": "Results and error files are retained for 30 days (Anthropic: 29 days)"
"batchConceptRetentionNote": "Results and error files are retained for 30 days (Anthropic: 29 days)",
"filesListUsedByRoleInput": "input",
"filesListUsedByRoleOutput": "output",
"filesListUsedByRoleError": "error",
"batchListProgressPartial": "(partial)"
},
"sidebar": {
"home": "Otthon",

View file

@ -782,7 +782,11 @@
"batchDetailCancelConfirm": "Cancel this batch? In-progress requests will stop.",
"batchActionCancelError": "Failed to cancel batch. Try again.",
"batchActionRetryError": "Failed to retry failed requests. Try again.",
"batchConceptRetentionNote": "Results and error files are retained for 30 days (Anthropic: 29 days)"
"batchConceptRetentionNote": "Results and error files are retained for 30 days (Anthropic: 29 days)",
"filesListUsedByRoleInput": "input",
"filesListUsedByRoleOutput": "output",
"filesListUsedByRoleError": "error",
"batchListProgressPartial": "(partial)"
},
"sidebar": {
"home": "Rumah",

View file

@ -782,7 +782,11 @@
"batchDetailCancelConfirm": "Cancel this batch? In-progress requests will stop.",
"batchActionCancelError": "Failed to cancel batch. Try again.",
"batchActionRetryError": "Failed to retry failed requests. Try again.",
"batchConceptRetentionNote": "Results and error files are retained for 30 days (Anthropic: 29 days)"
"batchConceptRetentionNote": "Results and error files are retained for 30 days (Anthropic: 29 days)",
"filesListUsedByRoleInput": "input",
"filesListUsedByRoleOutput": "output",
"filesListUsedByRoleError": "error",
"batchListProgressPartial": "(partial)"
},
"sidebar": {
"home": "Home",

View file

@ -782,7 +782,11 @@
"batchDetailCancelConfirm": "Cancel this batch? In-progress requests will stop.",
"batchActionCancelError": "Failed to cancel batch. Try again.",
"batchActionRetryError": "Failed to retry failed requests. Try again.",
"batchConceptRetentionNote": "Results and error files are retained for 30 days (Anthropic: 29 days)"
"batchConceptRetentionNote": "Results and error files are retained for 30 days (Anthropic: 29 days)",
"filesListUsedByRoleInput": "input",
"filesListUsedByRoleOutput": "output",
"filesListUsedByRoleError": "error",
"batchListProgressPartial": "(partial)"
},
"sidebar": {
"home": "Casa",

View file

@ -782,7 +782,11 @@
"batchDetailCancelConfirm": "Cancel this batch? In-progress requests will stop.",
"batchActionCancelError": "Failed to cancel batch. Try again.",
"batchActionRetryError": "Failed to retry failed requests. Try again.",
"batchConceptRetentionNote": "Results and error files are retained for 30 days (Anthropic: 29 days)"
"batchConceptRetentionNote": "Results and error files are retained for 30 days (Anthropic: 29 days)",
"filesListUsedByRoleInput": "input",
"filesListUsedByRoleOutput": "output",
"filesListUsedByRoleError": "error",
"batchListProgressPartial": "(partial)"
},
"sidebar": {
"home": "ホーム",

View file

@ -782,7 +782,11 @@
"batchDetailCancelConfirm": "Cancel this batch? In-progress requests will stop.",
"batchActionCancelError": "Failed to cancel batch. Try again.",
"batchActionRetryError": "Failed to retry failed requests. Try again.",
"batchConceptRetentionNote": "Results and error files are retained for 30 days (Anthropic: 29 days)"
"batchConceptRetentionNote": "Results and error files are retained for 30 days (Anthropic: 29 days)",
"filesListUsedByRoleInput": "input",
"filesListUsedByRoleOutput": "output",
"filesListUsedByRoleError": "error",
"batchListProgressPartial": "(partial)"
},
"sidebar": {
"home": "홈",

View file

@ -782,7 +782,11 @@
"batchDetailCancelConfirm": "Cancel this batch? In-progress requests will stop.",
"batchActionCancelError": "Failed to cancel batch. Try again.",
"batchActionRetryError": "Failed to retry failed requests. Try again.",
"batchConceptRetentionNote": "Results and error files are retained for 30 days (Anthropic: 29 days)"
"batchConceptRetentionNote": "Results and error files are retained for 30 days (Anthropic: 29 days)",
"filesListUsedByRoleInput": "input",
"filesListUsedByRoleOutput": "output",
"filesListUsedByRoleError": "error",
"batchListProgressPartial": "(partial)"
},
"sidebar": {
"home": "Home",

View file

@ -782,7 +782,11 @@
"batchDetailCancelConfirm": "Cancel this batch? In-progress requests will stop.",
"batchActionCancelError": "Failed to cancel batch. Try again.",
"batchActionRetryError": "Failed to retry failed requests. Try again.",
"batchConceptRetentionNote": "Results and error files are retained for 30 days (Anthropic: 29 days)"
"batchConceptRetentionNote": "Results and error files are retained for 30 days (Anthropic: 29 days)",
"filesListUsedByRoleInput": "input",
"filesListUsedByRoleOutput": "output",
"filesListUsedByRoleError": "error",
"batchListProgressPartial": "(partial)"
},
"sidebar": {
"home": "Rumah",

View file

@ -782,7 +782,11 @@
"batchDetailCancelConfirm": "Cancel this batch? In-progress requests will stop.",
"batchActionCancelError": "Failed to cancel batch. Try again.",
"batchActionRetryError": "Failed to retry failed requests. Try again.",
"batchConceptRetentionNote": "Results and error files are retained for 30 days (Anthropic: 29 days)"
"batchConceptRetentionNote": "Results and error files are retained for 30 days (Anthropic: 29 days)",
"filesListUsedByRoleInput": "input",
"filesListUsedByRoleOutput": "output",
"filesListUsedByRoleError": "error",
"batchListProgressPartial": "(partial)"
},
"sidebar": {
"home": "Thuis",

View file

@ -782,7 +782,11 @@
"batchDetailCancelConfirm": "Cancel this batch? In-progress requests will stop.",
"batchActionCancelError": "Failed to cancel batch. Try again.",
"batchActionRetryError": "Failed to retry failed requests. Try again.",
"batchConceptRetentionNote": "Results and error files are retained for 30 days (Anthropic: 29 days)"
"batchConceptRetentionNote": "Results and error files are retained for 30 days (Anthropic: 29 days)",
"filesListUsedByRoleInput": "input",
"filesListUsedByRoleOutput": "output",
"filesListUsedByRoleError": "error",
"batchListProgressPartial": "(partial)"
},
"sidebar": {
"home": "Hjem",

View file

@ -782,7 +782,11 @@
"batchDetailCancelConfirm": "Cancel this batch? In-progress requests will stop.",
"batchActionCancelError": "Failed to cancel batch. Try again.",
"batchActionRetryError": "Failed to retry failed requests. Try again.",
"batchConceptRetentionNote": "Results and error files are retained for 30 days (Anthropic: 29 days)"
"batchConceptRetentionNote": "Results and error files are retained for 30 days (Anthropic: 29 days)",
"filesListUsedByRoleInput": "input",
"filesListUsedByRoleOutput": "output",
"filesListUsedByRoleError": "error",
"batchListProgressPartial": "(partial)"
},
"sidebar": {
"home": "Bahay",

View file

@ -782,7 +782,11 @@
"batchDetailCancelConfirm": "Cancel this batch? In-progress requests will stop.",
"batchActionCancelError": "Failed to cancel batch. Try again.",
"batchActionRetryError": "Failed to retry failed requests. Try again.",
"batchConceptRetentionNote": "Results and error files are retained for 30 days (Anthropic: 29 days)"
"batchConceptRetentionNote": "Results and error files are retained for 30 days (Anthropic: 29 days)",
"filesListUsedByRoleInput": "input",
"filesListUsedByRoleOutput": "output",
"filesListUsedByRoleError": "error",
"batchListProgressPartial": "(partial)"
},
"sidebar": {
"home": "Dom",

View file

@ -773,6 +773,10 @@
"filesListUploadButton": "Enviar",
"filesListUsedByColumn": "Usado por",
"filesListUsedByNone": "Nenhum",
"filesListUsedByRoleInput": "entrada",
"filesListUsedByRoleOutput": "saída",
"filesListUsedByRoleError": "erro",
"batchListProgressPartial": "(parcial)",
"filesListDelete": "Excluir",
"filesListDownload": "Baixar",
"batchDetailActionCancel": "Cancelar batch",

View file

@ -782,7 +782,11 @@
"batchDetailCancelConfirm": "Cancel this batch? In-progress requests will stop.",
"batchActionCancelError": "Failed to cancel batch. Try again.",
"batchActionRetryError": "Failed to retry failed requests. Try again.",
"batchConceptRetentionNote": "Results and error files are retained for 30 days (Anthropic: 29 days)"
"batchConceptRetentionNote": "Results and error files are retained for 30 days (Anthropic: 29 days)",
"filesListUsedByRoleInput": "input",
"filesListUsedByRoleOutput": "output",
"filesListUsedByRoleError": "error",
"batchListProgressPartial": "(partial)"
},
"sidebar": {
"home": "Página inicial",

View file

@ -782,7 +782,11 @@
"batchDetailCancelConfirm": "Cancel this batch? In-progress requests will stop.",
"batchActionCancelError": "Failed to cancel batch. Try again.",
"batchActionRetryError": "Failed to retry failed requests. Try again.",
"batchConceptRetentionNote": "Results and error files are retained for 30 days (Anthropic: 29 days)"
"batchConceptRetentionNote": "Results and error files are retained for 30 days (Anthropic: 29 days)",
"filesListUsedByRoleInput": "input",
"filesListUsedByRoleOutput": "output",
"filesListUsedByRoleError": "error",
"batchListProgressPartial": "(partial)"
},
"sidebar": {
"home": "Acasă",

View file

@ -782,7 +782,11 @@
"batchDetailCancelConfirm": "Cancel this batch? In-progress requests will stop.",
"batchActionCancelError": "Failed to cancel batch. Try again.",
"batchActionRetryError": "Failed to retry failed requests. Try again.",
"batchConceptRetentionNote": "Results and error files are retained for 30 days (Anthropic: 29 days)"
"batchConceptRetentionNote": "Results and error files are retained for 30 days (Anthropic: 29 days)",
"filesListUsedByRoleInput": "input",
"filesListUsedByRoleOutput": "output",
"filesListUsedByRoleError": "error",
"batchListProgressPartial": "(partial)"
},
"sidebar": {
"home": "Главная",

View file

@ -782,7 +782,11 @@
"batchDetailCancelConfirm": "Cancel this batch? In-progress requests will stop.",
"batchActionCancelError": "Failed to cancel batch. Try again.",
"batchActionRetryError": "Failed to retry failed requests. Try again.",
"batchConceptRetentionNote": "Results and error files are retained for 30 days (Anthropic: 29 days)"
"batchConceptRetentionNote": "Results and error files are retained for 30 days (Anthropic: 29 days)",
"filesListUsedByRoleInput": "input",
"filesListUsedByRoleOutput": "output",
"filesListUsedByRoleError": "error",
"batchListProgressPartial": "(partial)"
},
"sidebar": {
"home": "Domov",

View file

@ -782,7 +782,11 @@
"batchDetailCancelConfirm": "Cancel this batch? In-progress requests will stop.",
"batchActionCancelError": "Failed to cancel batch. Try again.",
"batchActionRetryError": "Failed to retry failed requests. Try again.",
"batchConceptRetentionNote": "Results and error files are retained for 30 days (Anthropic: 29 days)"
"batchConceptRetentionNote": "Results and error files are retained for 30 days (Anthropic: 29 days)",
"filesListUsedByRoleInput": "input",
"filesListUsedByRoleOutput": "output",
"filesListUsedByRoleError": "error",
"batchListProgressPartial": "(partial)"
},
"sidebar": {
"home": "Hem",

View file

@ -782,7 +782,11 @@
"batchDetailCancelConfirm": "Cancel this batch? In-progress requests will stop.",
"batchActionCancelError": "Failed to cancel batch. Try again.",
"batchActionRetryError": "Failed to retry failed requests. Try again.",
"batchConceptRetentionNote": "Results and error files are retained for 30 days (Anthropic: 29 days)"
"batchConceptRetentionNote": "Results and error files are retained for 30 days (Anthropic: 29 days)",
"filesListUsedByRoleInput": "input",
"filesListUsedByRoleOutput": "output",
"filesListUsedByRoleError": "error",
"batchListProgressPartial": "(partial)"
},
"sidebar": {
"home": "Home",

View file

@ -782,7 +782,11 @@
"batchDetailCancelConfirm": "Cancel this batch? In-progress requests will stop.",
"batchActionCancelError": "Failed to cancel batch. Try again.",
"batchActionRetryError": "Failed to retry failed requests. Try again.",
"batchConceptRetentionNote": "Results and error files are retained for 30 days (Anthropic: 29 days)"
"batchConceptRetentionNote": "Results and error files are retained for 30 days (Anthropic: 29 days)",
"filesListUsedByRoleInput": "input",
"filesListUsedByRoleOutput": "output",
"filesListUsedByRoleError": "error",
"batchListProgressPartial": "(partial)"
},
"sidebar": {
"home": "Home",

View file

@ -782,7 +782,11 @@
"batchDetailCancelConfirm": "Cancel this batch? In-progress requests will stop.",
"batchActionCancelError": "Failed to cancel batch. Try again.",
"batchActionRetryError": "Failed to retry failed requests. Try again.",
"batchConceptRetentionNote": "Results and error files are retained for 30 days (Anthropic: 29 days)"
"batchConceptRetentionNote": "Results and error files are retained for 30 days (Anthropic: 29 days)",
"filesListUsedByRoleInput": "input",
"filesListUsedByRoleOutput": "output",
"filesListUsedByRoleError": "error",
"batchListProgressPartial": "(partial)"
},
"sidebar": {
"home": "Home",

View file

@ -782,7 +782,11 @@
"batchDetailCancelConfirm": "Cancel this batch? In-progress requests will stop.",
"batchActionCancelError": "Failed to cancel batch. Try again.",
"batchActionRetryError": "Failed to retry failed requests. Try again.",
"batchConceptRetentionNote": "Results and error files are retained for 30 days (Anthropic: 29 days)"
"batchConceptRetentionNote": "Results and error files are retained for 30 days (Anthropic: 29 days)",
"filesListUsedByRoleInput": "input",
"filesListUsedByRoleOutput": "output",
"filesListUsedByRoleError": "error",
"batchListProgressPartial": "(partial)"
},
"sidebar": {
"home": "บ้าน",

View file

@ -782,7 +782,11 @@
"batchDetailCancelConfirm": "Cancel this batch? In-progress requests will stop.",
"batchActionCancelError": "Failed to cancel batch. Try again.",
"batchActionRetryError": "Failed to retry failed requests. Try again.",
"batchConceptRetentionNote": "Results and error files are retained for 30 days (Anthropic: 29 days)"
"batchConceptRetentionNote": "Results and error files are retained for 30 days (Anthropic: 29 days)",
"filesListUsedByRoleInput": "input",
"filesListUsedByRoleOutput": "output",
"filesListUsedByRoleError": "error",
"batchListProgressPartial": "(partial)"
},
"sidebar": {
"home": "Ana Sayfa",

View file

@ -782,7 +782,11 @@
"batchDetailCancelConfirm": "Cancel this batch? In-progress requests will stop.",
"batchActionCancelError": "Failed to cancel batch. Try again.",
"batchActionRetryError": "Failed to retry failed requests. Try again.",
"batchConceptRetentionNote": "Results and error files are retained for 30 days (Anthropic: 29 days)"
"batchConceptRetentionNote": "Results and error files are retained for 30 days (Anthropic: 29 days)",
"filesListUsedByRoleInput": "input",
"filesListUsedByRoleOutput": "output",
"filesListUsedByRoleError": "error",
"batchListProgressPartial": "(partial)"
},
"sidebar": {
"home": "додому",

View file

@ -782,7 +782,11 @@
"batchDetailCancelConfirm": "Cancel this batch? In-progress requests will stop.",
"batchActionCancelError": "Failed to cancel batch. Try again.",
"batchActionRetryError": "Failed to retry failed requests. Try again.",
"batchConceptRetentionNote": "Results and error files are retained for 30 days (Anthropic: 29 days)"
"batchConceptRetentionNote": "Results and error files are retained for 30 days (Anthropic: 29 days)",
"filesListUsedByRoleInput": "input",
"filesListUsedByRoleOutput": "output",
"filesListUsedByRoleError": "error",
"batchListProgressPartial": "(partial)"
},
"sidebar": {
"home": "Home",

View file

@ -782,7 +782,11 @@
"batchDetailCancelConfirm": "Cancel this batch? In-progress requests will stop.",
"batchActionCancelError": "Failed to cancel batch. Try again.",
"batchActionRetryError": "Failed to retry failed requests. Try again.",
"batchConceptRetentionNote": "Results and error files are retained for 30 days (Anthropic: 29 days)"
"batchConceptRetentionNote": "Results and error files are retained for 30 days (Anthropic: 29 days)",
"filesListUsedByRoleInput": "input",
"filesListUsedByRoleOutput": "output",
"filesListUsedByRoleError": "error",
"batchListProgressPartial": "(partial)"
},
"sidebar": {
"home": "Trang chủ",

View file

@ -782,7 +782,11 @@
"batchDetailCancelConfirm": "Cancel this batch? In-progress requests will stop.",
"batchActionCancelError": "Failed to cancel batch. Try again.",
"batchActionRetryError": "Failed to retry failed requests. Try again.",
"batchConceptRetentionNote": "Results and error files are retained for 30 days (Anthropic: 29 days)"
"batchConceptRetentionNote": "Results and error files are retained for 30 days (Anthropic: 29 days)",
"filesListUsedByRoleInput": "input",
"filesListUsedByRoleOutput": "output",
"filesListUsedByRoleError": "error",
"batchListProgressPartial": "(partial)"
},
"sidebar": {
"home": "首页",

View file

@ -341,7 +341,7 @@ describe("FilesListTab — rendering", () => {
expect(el.textContent).toContain("filesListUsedByColumn");
});
it("13. files with related batches (via inputFileId) show batch ID in used-by column", () => {
it("13. files with related batches (via inputFileId) show batch ID + role in used-by column", () => {
const file = makeFile({ id: "file-used", purpose: "batch" });
const batches = [
{
@ -357,7 +357,14 @@ describe("FilesListTab — rendering", () => {
const el = render(
<FilesListTab files={[file]} loading={false} batches={batches} />
);
expect(el.textContent).toContain("batch-using-file");
// Truncated id prefix (12 chars) appears inline
expect(el.textContent).toContain("batch-using-");
// Role label is rendered next to the id (G-AUD1 — plan §4 "b1 (input)")
expect(el.textContent).toContain("filesListUsedByRoleInput");
// Tooltip carries the full id + role
const cell = el.querySelector("[title*='batch-using-file']");
expect(cell).not.toBeNull();
expect(cell?.getAttribute("title")).toContain("filesListUsedByRoleInput");
});
it("14. loading state shows spinner", () => {