R97 B1-B5 精修高频页面操作密度

这个提交包含在:
2026-05-06 17:56:57 +08:00
父节点 4cfac0ddf8
当前提交 705cf1e361
共修改 7 个文件,包含 226 行新增和 151 行删除
+113 -60
查看文件
@@ -71,12 +71,13 @@ export function WorkflowTasksPage() {
});
const totalPages = Math.max(1, Math.ceil((query.data?.total ?? 0) / PAGE_SIZE));
const taskItems = query.data?.items ?? [];
return (
<div className="space-y-6">
<PageHeader title="待我处理" subtitle="审批待办列表,覆盖报销、请假、采购与差旅流程。" />
<div className="space-y-4 md:space-y-6">
<PageHeader title="待我处理" subtitle="待处理审批。" />
<div className="card-std p-6 space-y-4">
<div className="card-std space-y-4 p-4 md:p-5">
<Tabs
data-testid="workflow-tasks-status-tabs"
value={status}
@@ -116,70 +117,122 @@ export function WorkflowTasksPage() {
) : null}
{!query.isLoading && !query.isError ? (
<div className="rounded-lg border border-zinc-200">
<Table data-testid="workflow-tasks-table">
<TableHeader>
<tr>
<TableHead>任务</TableHead>
<TableHead>业务对象</TableHead>
<TableHead>状态</TableHead>
<TableHead>创建时间</TableHead>
<TableHead className="w-24">操作</TableHead>
</tr>
</TableHeader>
<TableBody>
{(query.data?.items ?? []).length ? (
query.data?.items.map((task) => (
<TableRow data-testid="workflow-task-row" key={task.id}>
<TableCell>
<div className="font-medium text-zinc-900">{task.stepName}</div>
<div className="text-xs text-zinc-500">{task.id}</div>
</TableCell>
<TableCell>
<div className="font-medium text-zinc-900">
{entityLabel(task.workflowInstance?.entityType)}
<>
<div className="space-y-3 md:hidden" data-testid="workflow-tasks-mobile-list">
{taskItems.length ? (
taskItems.map((task) => (
<article className="rounded-xl border border-zinc-200 bg-white p-4 shadow-sm" key={task.id}>
<div className="flex items-start justify-between gap-3">
<div className="min-w-0">
<div className="truncate text-sm font-semibold text-zinc-900">{task.stepName}</div>
<div className="mt-1 text-xs text-zinc-500">
{entityLabel(task.workflowInstance?.entityType)} · {new Date(task.createdAt).toLocaleString()}
</div>
<div className="font-mono text-xs text-zinc-500">
{task.workflowInstance?.entityId ?? "-"}
</div>
</TableCell>
<TableCell><StatusBadge status={task.status} /></TableCell>
<TableCell>{new Date(task.createdAt).toLocaleString()}</TableCell>
<TableCell>
<div className="flex flex-wrap gap-2">
{status === "pending" && task.allowedActions.includes("approve") ? (
</div>
<StatusBadge className="shrink-0" status={task.status} />
</div>
<div className="mt-3 truncate rounded-lg bg-zinc-50 px-3 py-2 font-mono text-xs text-zinc-500">
{task.workflowInstance?.entityId ?? task.id}
</div>
<div className="mt-3 grid grid-cols-2 gap-2">
{status === "pending" && (task.allowedActions ?? []).includes("approve") ? (
<Button
className="min-h-11"
size="sm"
type="button"
data-testid={TEST_IDS.workflow.quickApprove}
disabled={approveMutation.isPending && approveMutation.variables === task.id}
onClick={() => approveMutation.mutate(task.id)}
>
{approveMutation.isPending && approveMutation.variables === task.id ? "通过中..." : "通过"}
</Button>
) : null}
<Button
asChild
className={`min-h-11 ${
status === "pending" && (task.allowedActions ?? []).includes("approve") ? "" : "col-span-2"
}`}
size="sm"
variant="secondary"
data-testid={TEST_IDS.workflow.detailLink}
>
<Link to={`/workflow/tasks/${task.id}`}>详情</Link>
</Button>
</div>
</article>
))
) : (
<div className="rounded-xl border border-dashed border-zinc-300 px-4 py-8 text-center text-sm text-zinc-500">
暂无数据
</div>
)}
</div>
<div className="hidden rounded-lg border border-zinc-200 md:block">
<Table data-testid="workflow-tasks-table">
<TableHeader>
<tr>
<TableHead>任务</TableHead>
<TableHead>业务对象</TableHead>
<TableHead>状态</TableHead>
<TableHead>创建时间</TableHead>
<TableHead className="w-24">操作</TableHead>
</tr>
</TableHeader>
<TableBody>
{taskItems.length ? (
taskItems.map((task) => (
<TableRow data-testid="workflow-task-row" key={task.id}>
<TableCell>
<div className="font-medium text-zinc-900">{task.stepName}</div>
<div className="text-xs text-zinc-500">{task.id}</div>
</TableCell>
<TableCell>
<div className="font-medium text-zinc-900">
{entityLabel(task.workflowInstance?.entityType)}
</div>
<div className="font-mono text-xs text-zinc-500">
{task.workflowInstance?.entityId ?? "-"}
</div>
</TableCell>
<TableCell><StatusBadge status={task.status} /></TableCell>
<TableCell>{new Date(task.createdAt).toLocaleString()}</TableCell>
<TableCell>
<div className="flex flex-wrap gap-2">
{status === "pending" && (task.allowedActions ?? []).includes("approve") ? (
<Button
size="sm"
type="button"
data-testid={TEST_IDS.workflow.quickApprove}
disabled={approveMutation.isPending && approveMutation.variables === task.id}
onClick={() => approveMutation.mutate(task.id)}
>
{approveMutation.isPending && approveMutation.variables === task.id ? "通过中..." : "通过"}
</Button>
) : null}
<Button
asChild
size="sm"
type="button"
data-testid={TEST_IDS.workflow.quickApprove}
disabled={approveMutation.isPending && approveMutation.variables === task.id}
onClick={() => approveMutation.mutate(task.id)}
variant="secondary"
data-testid={TEST_IDS.workflow.detailLink}
>
{approveMutation.isPending && approveMutation.variables === task.id ? "通过中..." : "通过"}
<Link to={`/workflow/tasks/${task.id}`}>详情</Link>
</Button>
) : null}
<Button
asChild
size="sm"
variant="secondary"
data-testid={TEST_IDS.workflow.detailLink}
>
<Link to={`/workflow/tasks/${task.id}`}>详情</Link>
</Button>
</div>
</div>
</TableCell>
</TableRow>
))
) : (
<TableRow>
<TableCell className="py-3 text-zinc-500" colSpan={5}>
暂无数据
</TableCell>
</TableRow>
))
) : (
<TableRow>
<TableCell className="py-3 text-zinc-500" colSpan={5}>
暂无数据
</TableCell>
</TableRow>
)}
</TableBody>
</Table>
</div>
)}
</TableBody>
</Table>
</div>
</>
) : null}
<Pagination