基线:鉴权会话+工作组+工作台三区修复+编排工作区+产品设计文档

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KeDBx2PHLavbURXB8LJJ7m
This commit is contained in:
2026-07-27 20:43:35 +08:00
co-authored by Claude Fable 5
parent 61fe181678
commit ac85ecf2ea
119 changed files with 16634 additions and 1246 deletions
@@ -12,7 +12,7 @@ import { decideApprovalRoute, listApprovalsForMeRoute } from '@contracts';
import { Ico } from '@web-shared/Ico.tsx';
import ScrollArea from '@web-shared/ScrollArea.tsx';
import { call } from '@web-shared/typed-fetch.ts';
import { Chip, DocPanel, Hero, ListEmpty, NoteBand, Section, SidebarHead } from '@web-shared/desk/module-kit.tsx';
import { Chip, DocPanel, Hero, EmptyState, ListEmpty, NoteBand, Section, SidebarHead } from '@web-shared/desk/module-kit.tsx';
const STATE_CHIP = {
pending: { tone: 'todo' as const, label: '待审批', pulse: true },
@@ -96,8 +96,10 @@ export function ApprovalDesk() {
);
})}
{visible.length === 0 && (
<ListEmpty icon="circle-check">
{filter === 'todo' ? '待批清空了 —— 没有等你放行的事项' : '暂无已处理记录'}
<ListEmpty icon="circle-check" title={filter === 'todo' ? '待批清空了' : '还没有处理记录'}>
{filter === 'todo'
? '没有等你放行的事项 —— 有新的审批单会第一时间到这里。'
: '你处理过的审批会留在这里,随时回看当时的依据与裁决。'}
</ListEmpty>
)}
</ScrollArea>
@@ -105,7 +107,12 @@ export function ApprovalDesk() {
{sel === undefined ? (
<main className="execution-panel jc-panel-card">
<ListEmpty icon="shield-check">没有卡在你工位上的审批点</ListEmpty>
<EmptyState
ico="shield-check"
tone="ok"
title="没有等你放行的事项"
desc="流程走到审批点时,审批单会连同它的依据一起送到这里 —— 你只需要看一眼就能拍板。"
/>
</main>
) : (
<DocPanel scrollKey={sel.id}>
@@ -125,10 +132,10 @@ export function ApprovalDesk() {
/>
<Section icon="clipboard-check" title="依据快照" extra="调用必附上下文 · 裸调用不得发出">
<div className="jc-rows">
<div className="jc-kv">
{sel.basis.map((b) => (
<div key={b.k} className="jc-row">
<em>{b.k}</em>
<div key={b.k} className="jc-kv-i">
<i>{b.k}</i>
<b className="jc-mono">{b.v}</b>
</div>
))}
@@ -149,7 +156,7 @@ export function ApprovalDesk() {
value={comment}
onChange={(e) => setComment(e.target.value)}
/>
{error !== undefined && <div className="jc-err">{error}</div>}
{error !== undefined && <div className="jc-callout t-bad">{error}</div>}
<div className="jc-mod-actions">
<button
type="button"