Q130: every open task says why it is not moving, when it resumes, and who must act
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
271a83a7bc
commit
074a1fc8e3
14 files changed
+255
-7
No files matched your search
@@ -31,6 +31,11 @@ export const zh: Record<string, string> = {
|
||||
"Writing": "写作方式",
|
||||
"superseded": "已被取代",
|
||||
"stalled": "已停滞",
|
||||
"needs you": "待你处理",
|
||||
"waiting": "等待中",
|
||||
"Resumes on its own at {time}.": "将于 {time} 自动恢复。",
|
||||
"Waiting on you, or resumes on its own at {time}.": "等待你处理,或于 {time} 自动恢复。",
|
||||
"Waiting on you.": "等待你处理。",
|
||||
"Resume": "恢复",
|
||||
"Missing this run": "本次运行缺少的能力",
|
||||
"Disconnect": "断开连接",
|
||||
|
||||
@@ -338,6 +338,11 @@ function TaskCard({
|
||||
<div className="row" style={{ flexWrap: "wrap", gap: 6, minWidth: 0 }}>
|
||||
{project ? <Pill>{project.name}</Pill> : <Pill>{capitalize(task.risk)}</Pill>}
|
||||
{task.stalledReason && task.status !== "done" && <Pill tone="red">{t("stalled")}</Pill>}
|
||||
{task.hold && !task.stalledReason && (
|
||||
<span title={task.hold.reason} style={{ display: "inline-flex" }}>
|
||||
<Pill tone={task.hold.waitingOn === "operator" ? "red" : "amber"}>{task.hold.waitingOn === "operator" ? t("needs you") : t("waiting")}</Pill>
|
||||
</span>
|
||||
)}
|
||||
{task.status !== "done" && latestRun && (
|
||||
<span style={{ flexShrink: 0, display: "inline-flex" }}>
|
||||
<Pill tone={runTone(latestRun.state)}>{prettyRunState(latestRun.state)}</Pill>
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
import { TaskHoldNotice } from "./TaskHoldNotice";
|
||||
import { useState, type FormEvent } from "react";
|
||||
import { Avatar, Button, Field, Icon, IconButton, Pill, Segmented } from "../../shared/ui";
|
||||
import type {
|
||||
@@ -142,7 +143,7 @@ function OverviewTab({ task, assignee, project, goal, workspace, provider, runs
|
||||
}) {
|
||||
return (
|
||||
<>
|
||||
{task.stalledReason && <div className="form-error" role="alert" style={{ marginBottom: 12 }}>{task.stalledReason}</div>}
|
||||
{task.hold && <TaskHoldNotice hold={task.hold} />}
|
||||
{task.description && (
|
||||
<p style={{ margin: "0 0 14px", color: "var(--text-2)", fontSize: 14, lineHeight: 1.55, whiteSpace: "pre-wrap" }}>{task.description}</p>
|
||||
)}
|
||||
|
||||
@@ -0,0 +1,22 @@
|
||||
import type { TaskHold } from "../../../../shared/domain";
|
||||
import { t } from "../../i18n/i18n";
|
||||
|
||||
function when(iso: string): string {
|
||||
return new Date(iso).toLocaleString([], { month: "short", day: "numeric", hour: "2-digit", minute: "2-digit", hour12: false });
|
||||
}
|
||||
|
||||
/** Why an open task is not moving, when it resumes on its own, and whether it waits on the operator. */
|
||||
export function TaskHoldNotice({ hold }: { hold: TaskHold }) {
|
||||
const next = hold.waitingOn === "provider"
|
||||
? t("Resumes on its own at {time}.", { time: when(hold.resumesAt) })
|
||||
: hold.resumesAt
|
||||
? t("Waiting on you, or resumes on its own at {time}.", { time: when(hold.resumesAt) })
|
||||
: t("Waiting on you.");
|
||||
const color = hold.waitingOn === "operator" ? "var(--red)" : "var(--amber)";
|
||||
return (
|
||||
<div role="status" style={{ marginBottom: 12, fontSize: 13, color, lineHeight: 1.5 }}>
|
||||
<div>{hold.reason}</div>
|
||||
<div style={{ fontWeight: 600 }}>{next}</div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
Reference in new issue
Block a user