mirror of
https://github.com/diegosouzapw/OmniRoute.git
synced 2026-07-09 17:28:51 +00:00
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:
parent
3c2022a13d
commit
0f1bbc58a4
46 changed files with 274 additions and 70 deletions
|
|
@ -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)}
|
||||
|
|
|
|||
|
|
@ -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">
|
||||
|
|
|
|||
|
|
@ -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) {
|
||||
|
|
|
|||
|
|
@ -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": "الصفحة الرئيسية",
|
||||
|
|
|
|||
|
|
@ -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",
|
||||
|
|
|
|||
|
|
@ -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": "Начало",
|
||||
|
|
|
|||
|
|
@ -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",
|
||||
|
|
|
|||
|
|
@ -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",
|
||||
|
|
|
|||
|
|
@ -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",
|
||||
|
|
|
|||
|
|
@ -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",
|
||||
|
|
|
|||
|
|
@ -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",
|
||||
|
|
|
|||
|
|
@ -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",
|
||||
|
|
|
|||
|
|
@ -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",
|
||||
|
|
|
|||
|
|
@ -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",
|
||||
|
|
|
|||
|
|
@ -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",
|
||||
|
|
|
|||
|
|
@ -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",
|
||||
|
|
|
|||
|
|
@ -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": "בית",
|
||||
|
|
|
|||
|
|
@ -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": "घर",
|
||||
|
|
|
|||
|
|
@ -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",
|
||||
|
|
|
|||
|
|
@ -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",
|
||||
|
|
|
|||
|
|
@ -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",
|
||||
|
|
|
|||
|
|
@ -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",
|
||||
|
|
|
|||
|
|
@ -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": "ホーム",
|
||||
|
|
|
|||
|
|
@ -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": "홈",
|
||||
|
|
|
|||
|
|
@ -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",
|
||||
|
|
|
|||
|
|
@ -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",
|
||||
|
|
|
|||
|
|
@ -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",
|
||||
|
|
|
|||
|
|
@ -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",
|
||||
|
|
|
|||
|
|
@ -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",
|
||||
|
|
|
|||
|
|
@ -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",
|
||||
|
|
|
|||
|
|
@ -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",
|
||||
|
|
|
|||
|
|
@ -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",
|
||||
|
|
|
|||
|
|
@ -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ă",
|
||||
|
|
|
|||
|
|
@ -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": "Главная",
|
||||
|
|
|
|||
|
|
@ -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",
|
||||
|
|
|
|||
|
|
@ -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",
|
||||
|
|
|
|||
|
|
@ -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",
|
||||
|
|
|
|||
|
|
@ -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",
|
||||
|
|
|
|||
|
|
@ -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",
|
||||
|
|
|
|||
|
|
@ -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": "บ้าน",
|
||||
|
|
|
|||
|
|
@ -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",
|
||||
|
|
|
|||
|
|
@ -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": "додому",
|
||||
|
|
|
|||
|
|
@ -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",
|
||||
|
|
|
|||
|
|
@ -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ủ",
|
||||
|
|
|
|||
|
|
@ -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": "首页",
|
||||
|
|
|
|||
|
|
@ -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", () => {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue