diff --git a/app-instance/frontend/components/task-detail/TaskAcceptanceCard.tsx b/app-instance/frontend/components/task-detail/TaskAcceptanceCard.tsx index 704c932..167706f 100644 --- a/app-instance/frontend/components/task-detail/TaskAcceptanceCard.tsx +++ b/app-instance/frontend/components/task-detail/TaskAcceptanceCard.tsx @@ -34,6 +34,7 @@ type Props = { }; const RUNTIME_STATUSES = new Set(['queued', 'running', 'waiting', 'blocked', 'done', 'error', 'cancelled']); +const READY_FOR_ACCEPTANCE_STATUSES = new Set(['awaiting_acceptance', 'needs_revision']); function isRuntimeStatus(status: string): status is TaskRuntimeStatus { return RUNTIME_STATUSES.has(status); @@ -59,6 +60,23 @@ function humanFeedback(type: string, locale: 'zh-CN' | 'en-US') { return type || pickAppText(locale, '验收', 'Acceptance'); } +function humanTaskStatus(status: string, locale: 'zh-CN' | 'en-US') { + const labels: Record = { + open: ['已创建', 'Open'], + running: ['执行中', 'Running'], + awaiting_acceptance: ['等待验收', 'Awaiting acceptance'], + needs_revision: ['需要修改', 'Needs revision'], + closed: ['已完成', 'Closed'], + abandoned: ['已放弃', 'Abandoned'], + accept: ['接受', 'Accepted'], + satisfied: ['接受', 'Accepted'], + revise: ['请求修改', 'Revision requested'], + abandon: ['放弃任务', 'Abandoned'], + }; + const label = labels[status]; + return label ? pickAppText(locale, label[0], label[1]) : status; +} + function FeedbackButton({ type, icon, @@ -99,8 +117,9 @@ export function TaskAcceptanceCard({ const comment = revision ?? localComment; const setComment = onRevisionChange ?? setLocalComment; const isFinalized = taskStatus === 'closed' || taskStatus === 'abandoned'; + const isReadyForAcceptance = READY_FOR_ACCEPTANCE_STATUSES.has(taskStatus); const recordedFeedback = feedbackForRun(feedbackItems, runId) ?? (isFinalized ? latestFeedback(feedbackItems) : null); - const canSubmit = Boolean(runId) && !recordedFeedback && !isFinalized && !actionBusy; + const canSubmit = Boolean(runId) && !recordedFeedback && !isFinalized && isReadyForAcceptance && !actionBusy; const trimmedComment = comment.trim(); const submit = (feedbackType: TaskFeedbackType, nextComment?: string) => { @@ -117,7 +136,7 @@ export function TaskAcceptanceCard({ ) : ( - {taskStatus} + {humanTaskStatus(taskStatus, locale)} )} @@ -138,6 +157,10 @@ export function TaskAcceptanceCard({
{pickAppText(locale, '任务已结束,不能再提交新的验收。', 'This task is finalized and cannot accept new acceptance.')}
+ ) : !isReadyForAcceptance ? ( +
+ {pickAppText(locale, '任务还在执行,完成后才能验收。', 'The task is still running. Acceptance becomes available when a result is ready.')} +
) : !runId ? (
{pickAppText(locale, '暂无可验收的运行记录。', 'No run is available for acceptance yet.')} @@ -174,7 +197,7 @@ export function TaskAcceptanceCard({