fix(pc-detail-responsive-approval-polish): 协调详情断点并收敛审批展示
ci-e2e / e2e (push) Canceled after 0s
ci-minimal / check-minimal (push) Canceled after 0s

这个提交包含在:
2026-08-03 21:31:44 +08:00
父节点 a5b7e18507
当前提交 c018ea4eb8
共修改 14 个文件,包含 642 行新增和 71 行删除
+56 -45
查看文件
@@ -32,7 +32,7 @@ import { PageScaffold } from "../components/patterns/PageScaffold";
import { SectionPanel } from "../components/patterns/SectionPanel";
import { Button } from "../components/ui/button";
import { Textarea } from "../components/ui/textarea";
import { resolvePurchaseDisplayCode, workflowActionLabel } from "../lib/approvalDisplay";
import { approvalRoleLabel, resolvePurchaseDisplayCode, workflowActionLabel } from "../lib/approvalDisplay";
import { formatDisplayDateTime } from "../lib/displayFormat";
import {
buildPcDetailSource,
@@ -254,13 +254,16 @@ export function WorkflowTaskDetailPage() {
onClick={() => navigate(backSource, { replace: true })}
type="button"
>
{backSource.startsWith("/reimbursements") ? "返回报销列表" : "返回待办列表"}
返回审批列表
</Button>
</div>
);
}
const detail = detailQuery.data;
const canApprove = allowedActions.has("approve");
const canReturn = allowedActions.has("return");
const canReject = allowedActions.has("reject");
const canTransfer = allowedActions.has("transfer");
const allowedActionLabels = detail.allowedActions.map(workflowActionLabel).join(" / ");
const businessStatusLabel = workflowInstanceStatusLabel(detail.workflowInstance?.currentStatus);
@@ -281,7 +284,7 @@ export function WorkflowTaskDetailPage() {
actions={(
<Button asChild variant="secondary" data-testid="workflow-task-back">
<Link replace to={backSource}>
{backSource.startsWith("/reimbursements") ? "返回报销列表" : "返回待办列表"}
返回审批列表
</Link>
</Button>
)}
@@ -294,7 +297,9 @@ export function WorkflowTaskDetailPage() {
<StatStrip columns={4} className="ops-status-strip">
<MetricCard title="当前节点" value={<span className="text-base">{detail.task.stepName}</span>} />
<MetricCard title="业务类型" value={<span className="text-base">{entityTitle(detail.workflowInstance?.entityType)}</span>} />
<MetricCard title="可执行动作" value={<span className="text-base">{allowedActionLabels || "-"}</span>} />
{allowedActionLabels ? (
<MetricCard title="可执行动作" value={<span className="text-base">{allowedActionLabels}</span>} />
) : null}
<MetricCard title="创建时间" value={<span className="text-base">{formatDisplayDateTime(detail.task.createdAt)}</span>} />
</StatStrip>
@@ -431,7 +436,7 @@ export function WorkflowTaskDetailPage() {
{workflowActionLabel(item.action)} · {item.actorName || item.actorId}
</div>
<div className="text-zinc-600">{item.comment || "-"}</div>
<div className="text-xs text-zinc-500">{item.createdAt || "-"}</div>
<div className="text-xs text-zinc-500">{formatDisplayDateTime(item.createdAt)}</div>
</div>
))
) : (
@@ -445,53 +450,59 @@ export function WorkflowTaskDetailPage() {
<BusinessDetailActionPanel
title="处理"
className="workflow-action-panel"
secondaryActions={(
primaryAction={canApprove ? (
<Button
data-testid="workflow-task-approve"
disabled={mutation.isPending}
onClick={() => requestWorkflowAction("approve")}
type="button"
>
通过
</Button>
) : null}
secondaryActions={canReturn || canReject ? (
<>
<Button
data-testid="workflow-task-approve"
disabled={!allowedActions.has("approve") || mutation.isPending}
onClick={() => requestWorkflowAction("approve")}
type="button"
>
通过
</Button>
<Button
data-testid="workflow-task-return-toggle"
variant="secondary"
disabled={!allowedActions.has("return") || mutation.isPending}
onClick={() => setActiveSecondaryAction(activeSecondaryAction === "return" ? null : "return")}
type="button"
>
退回
</Button>
<Button
data-testid="workflow-task-reject-toggle"
variant="secondary"
disabled={!allowedActions.has("reject") || mutation.isPending}
onClick={() => setActiveSecondaryAction(activeSecondaryAction === "reject" ? null : "reject")}
type="button"
>
驳回
</Button>
{canTransfer ? (
<details className="workflow-action-more">
<summary>更多</summary>
<button
data-testid="workflow-task-transfer-menu-item"
type="button"
onClick={() => setActiveSecondaryAction("transfer")}
>
转审
</button>
</details>
{canReturn ? (
<Button
data-testid="workflow-task-return-toggle"
variant="secondary"
disabled={mutation.isPending}
onClick={() => setActiveSecondaryAction(activeSecondaryAction === "return" ? null : "return")}
type="button"
>
退回
</Button>
) : null}
{canReject ? (
<Button
data-testid="workflow-task-reject-toggle"
variant="secondary"
disabled={mutation.isPending}
onClick={() => setActiveSecondaryAction(activeSecondaryAction === "reject" ? null : "reject")}
type="button"
>
驳回
</Button>
) : null}
</>
)}
) : null}
moreActions={canTransfer ? (
<details className="workflow-action-more">
<summary>更多</summary>
<button
data-testid="workflow-task-transfer-menu-item"
type="button"
onClick={() => setActiveSecondaryAction("transfer")}
>
转审
</button>
</details>
) : null}
summary={(
<>
<div>节点:{detail.task.stepName}</div>
<div>实例状态:{workflowInstanceStatusLabel(detail.workflowInstance?.currentStatus)}</div>
<div>当前审批角色:{detail.task.assigneeRole ?? "-"}</div>
<div>当前审批角色:{approvalRoleLabel(detail.task.assigneeRole)}</div>
<div>创建时间:{formatDisplayDateTime(detail.task.createdAt)}</div>
<div>完成时间:{formatDisplayDateTime(detail.task.completedAt)}</div>
<div>发起时间:{formatDisplayDateTime(detail.workflowInstance?.startedAt)}</div>