Feat/activity l3 detail #1

Merged
XiaChangSong merged 8 commits from feat/activity-l3-detail into mvp-foundation 2026-08-26 22:09:40 +08:00
3 changed files with 11 additions and 22 deletions
Showing only changes of commit 023d3157a0 - Show all commits
+1 -1
View File
@@ -332,7 +332,7 @@ function Detail({ route, nav }: { route: Route; nav: Nav }) {
case 'actd': case 'actd':
return <ActvPage id={route.id} nav={nav} />; return <ActvPage id={route.id} nav={nav} />;
case 'acti': case 'acti':
return <ActiPage id={route.id} nav={nav} />; return <ActiPage id={route.id} />;
case 'tool': case 'tool':
return <ToolPage id={route.id} />; return <ToolPage id={route.id} />;
case 'obj': case 'obj':
@@ -724,10 +724,11 @@ const STEP_RES_TONE: Readonly<Record<DemoStep['res'], string>> = {
/** /**
* L3 · 实例详情 —— 一次运行的完整视图(2026-08-26 规划,用户确认后落地): * L3 · 实例详情 —— 一次运行的完整视图(2026-08-26 规划,用户确认后落地):
* 主从 2:1(DESIGN-SPEC §9)—— 左「动作过程记录」是主角(追溯与验收的落点), * 主从 2:1(DESIGN-SPEC §9)—— 左「动作过程记录」是主角(追溯与验收的落点),
* 右栏输入/输出是辅助;编辑与删除收在这一层(功能 5/6),不污染清单。 * 右栏输入/输出是辅助。实例不可删除、不可编辑(2026-08-26 用户定)——
* 编辑/删除入口撤掉,唯一的动作是进行中的「终止活动」。
* 数据为静态占位,结构按将来接口的形状铺。 * 数据为静态占位,结构按将来接口的形状铺。
*/ */
export function ActiPage({ id, nav }: { id: string; nav: Nav }) { export function ActiPage({ id }: { id: string }) {
const [aid, iid] = id.split(':'); const [aid, iid] = id.split(':');
const a = DEMO_ACTIVITIES.find((x) => x.id === aid); const a = DEMO_ACTIVITIES.find((x) => x.id === aid);
const inst = a !== undefined ? demoInstances(a.owner).find((x) => x.id === iid) : undefined; const inst = a !== undefined ? demoInstances(a.owner).find((x) => x.id === iid) : undefined;
@@ -735,7 +736,7 @@ export function ActiPage({ id, nav }: { id: string; nav: Nav }) {
term 记下终止时刻 —— 终止的过程面与「自己跑挂」不同(当前步记「已终止」,不是「附件缺失」那种失败原因) */ term 记下终止时刻 —— 终止的过程面与「自己跑挂」不同(当前步记「已终止」,不是「附件缺失」那种失败原因) */
const [term, setTerm] = useState<string | undefined>(undefined); const [term, setTerm] = useState<string | undefined>(undefined);
if (a === undefined || inst === undefined) { if (a === undefined || inst === undefined) {
return <Note tone="warn">实例不存在 —— 它可能已被删除,从面包屑返回活动详情看看。</Note>; return <Note tone="warn">实例不存在 —— 它不在该活动的清单里,从面包屑返回活动详情看看。</Note>;
} }
const state: InstanceState = term !== undefined ? '失败' : inst.state; const state: InstanceState = term !== undefined ? '失败' : inst.state;
const steps = term !== undefined ? terminatedSteps(inst.startedAt) : demoSteps(state, inst.startedAt); const steps = term !== undefined ? terminatedSteps(inst.startedAt) : demoSteps(state, inst.startedAt);
@@ -771,9 +772,9 @@ export function ActiPage({ id, nav }: { id: string; nav: Nav }) {
<Chip ico="cpu">{a.llm}</Chip> <Chip ico="cpu">{a.llm}</Chip>
</> </>
} }
desc="一次运行的完整视图:输入 / 过程 / 输出 / 状态。编辑与删除收在这一层,清单页不受打扰。" desc="一次运行的完整视图:输入 / 过程 / 输出 / 状态 —— 实例不可编辑、不可删除,进行中的运行可终止。"
acts={[ acts={[
/* 头部动作(2026-08-26 规划):进行中可终止(二次确认);编辑本期只留入口(编什么待定);删除二次确认(用户标注存疑,先按规划做) */ /* 唯一动作(2026-08-26 用户定:实例不许删、不许编):进行中可终止,二次确认 */
...(state === '进行中' ...(state === '进行中'
? [ ? [
{ {
@@ -790,19 +791,6 @@ export function ActiPage({ id, nav }: { id: string; nav: Nav }) {
} satisfies ActSpec, } satisfies ActSpec,
] ]
: []), : []),
{ label: '编辑实例', ico: 'pencil-line', disabled: true },
{
label: '删除实例',
ico: 'trash-2',
danger: true,
ask: {
title: `确认删除实例 ${inst.id}?`,
note: '删除后,这次运行的输入 / 过程 / 输出记录一并移除,清单里也不再出现。',
impact: { who: '该实例及其全部运行记录', undo: '不可撤销 —— 删除即清空', when: '确认后立即生效(本期前端演示,接口对接后落库)' },
okLabel: '确认删除',
onOk: () => nav.push({ k: 'actd', id: a.id }),
},
},
]} ]}
/> />
{reason !== undefined && <Note tone="warn">{reason}</Note>} {reason !== undefined && <Note tone="warn">{reason}</Note>}
+4 -3
View File
@@ -89,7 +89,8 @@ L1(模块首页 · 活动清单)需要一个**标签页**切换,因为活
- 2026-08-25 · **文案口径(用户定)**:创建实例 → **启动活动**;实例清单 → **历史活动**;停止 → **终止活动**。 - 2026-08-25 · **文案口径(用户定)**:创建实例 → **启动活动**;实例清单 → **历史活动**;停止 → **终止活动**。
- 2026-08-26 · **L2 历史活动改列表(用户定)**:卡片式清单撤掉,改表格列(实例 / 负责人 / 输入 / 输出 / 启动时间 / 状态 / 操作,操作栏带标题),隔行浅斑马 + 悬停亮行,行内操作(终止活动 / 查看详情)常驻;分页单页 8 条不变。 - 2026-08-26 · **L2 历史活动改列表(用户定)**:卡片式清单撤掉,改表格列(实例 / 负责人 / 输入 / 输出 / 启动时间 / 状态 / 操作,操作栏带标题),隔行浅斑马 + 悬停亮行,行内操作(终止活动 / 查看详情)常驻;分页单页 8 条不变。
- 2026-08-26 · **L2 历史活动加检索(用户定)**:列表上方检索条 —— 条件下拉四选(实例 / 负责人 / 状态 / 启动时间),控件随条件换:实例=按实例号模糊输入、负责人=人员下拉(候选取自现有实例,接接口后换人员接口)、状态=五态下拉、启动时间=日期段(含两端整日);筛中显示「筛出 X / 共 Y」并可一键清空;分页按筛出的集合走。 - 2026-08-26 · **L2 历史活动加检索(用户定)**:列表上方检索条 —— 条件下拉四选(实例 / 负责人 / 状态 / 启动时间),控件随条件换:实例=按实例号模糊输入、负责人=人员下拉(候选取自现有实例,接接口后换人员接口)、状态=五态下拉、启动时间=日期段(含两端整日);筛中显示「筛出 X / 共 Y」并可一键清空;分页按筛出的集合走。
- 2026-08-26 · **L3 实例详情已落地(静态占位版,用户确认规划后实施)**:路由 `acti`(id = `活动id:实例号`),L2 行内「查看详情」接入。布局 = 主从 2:1(DESIGN-SPEC §9):左侧「动作过程记录」竖时间线是主角(五步节点流:输入接收 → 要素结构化 → 定价测算 → **负责人验收** → 输出归档 —— 验收永远留给人,对应人机分工),当前步呼吸高亮、未到达空心灰显、连接线成不间断竖轨;右栏输入(键值)/ 输出(文件行,下载随接口开放)。头部 = 状态丸 + 负责人/启动/结束·耗时/专属 LLM;驳回/失败出原因说明块;头部动作三个:终止活动(进行中才有,二次确认)、编辑实例(disabled 占位)、删除实例(二次确认 —— 删除存疑仍悬着,先按规划做进 UI)。终止后的过程面与「自己跑挂」区分:当前步记「已终止」而非失败原因。数据仍是静态假数据。 - 2026-08-26 · **L3 实例详情已落地(静态占位版,用户确认规划后实施)**:路由 `acti`(id = `活动id:实例号`),L2 行内「查看详情」接入。布局 = 主从 2:1(DESIGN-SPEC §9):左侧「动作过程记录」竖时间线是主角(五步节点流:输入接收 → 要素结构化 → 定价测算 → **负责人验收** → 输出归档 —— 验收永远留给人,对应人机分工),当前步呼吸高亮、未到达空心灰显、连接线成不间断竖轨;右栏输入(键值)/ 输出(文件行,下载随接口开放)。头部 = 状态丸 + 负责人/启动/结束·耗时/专属 LLM;驳回/失败出原因说明块;终止后的过程面与「自己跑挂」区分:当前步记「已终止」而非失败原因。数据仍是静态假数据。
- 2026-08-26 · **实例不可删除、不可编辑(用户定,推翻 L3 原规划)**:L3 的编辑/删除入口撤掉,唯一动作是进行中的「终止活动」(二次确认);六功能里实例的「编辑/删除」两项就此划掉,待确认问题里的两条(编辑指什么 / 删除是否放开)同时关闭。
## 三、功能表(整理稿) ## 三、功能表(整理稿)
@@ -100,6 +101,6 @@ L1(模块首页 · 活动清单)需要一个**标签页**切换,因为活
- ~~活动模块里的「设计」与设计中心「活动库」是什么关系?~~ **已答(2026-08-25)**:不再有「设计中心 vs 运营中心」的分工 —— 设计并入运营,活动模块自带设计能力;设计中心各区后续按同思路并入运营中心重做。 - ~~活动模块里的「设计」与设计中心「活动库」是什么关系?~~ **已答(2026-08-25)**:不再有「设计中心 vs 运营中心」的分工 —— 设计并入运营,活动模块自带设计能力;设计中心各区后续按同思路并入运营中心重做。
- ~~「设计」在活动模块里做到什么程度?~~ **已答(2026-08-25)**:六功能已界定 —— 活动(定义)的创建与展示 + 实例的创建/展示/编辑/删除;定义只许创建不许编删,创建要过审核。 - ~~「设计」在活动模块里做到什么程度?~~ **已答(2026-08-25)**:六功能已界定 —— 活动(定义)的创建与展示 + 实例的创建/展示/编辑/删除;定义只许创建不许编删,创建要过审核。
- 活动创建的**审核**:谁来审、在模块内审还是别处、审什么(输入输出契约的合理性?)?(待用户展开) - 活动创建的**审核**:谁来审、在模块内审还是别处、审什么(输入输出契约的合理性?)?(待用户展开)
- 实例的**编辑**具体指编辑什么:实例的输入数据?进行中的干预(暂停/叫停)?还是产出修正?(待用户展开) - 实例的**编辑**~~具体指编辑什么~~:**已答(2026-08-26):实例不可编辑**,入口不做。
- 实例删除是否真放开 —— 用户已标注存疑,先规划,后续按需求调。(悬着,不阻塞) - 实例删除~~是否真放开~~:**已答(2026-08-26):实例不可删除**,入口不做;六功能只剩实例的创建/展示。
- 「运营」侧还要不要监控/验收类功能(此前提过负责人验收规划与统计产出)—— 六功能里未直接出现,是否归在「实例的展示/编辑」里,还是另有入口?(待用户展开) - 「运营」侧还要不要监控/验收类功能(此前提过负责人验收规划与统计产出)—— 六功能里未直接出现,是否归在「实例的展示/编辑」里,还是另有入口?(待用户展开)