统一页面右上角操作区(05-31-unified-page-header-actions)

这个提交包含在:
2026-05-31 16:41:44 +08:00
父节点 b71d23e661
当前提交 dcf34d7ac6
共修改 18 个文件,包含 480 行新增和 183 行删除
+37 -32
查看文件
@@ -29,7 +29,7 @@ import { hasPermission } from "../auth/permissions";
import { toast } from "sonner";
import { downloadBlob } from "../lib/download";
import { formatInvoiceOcrErrorMessage } from "../lib/invoiceOcr";
import { ListWorkspace, WorkspaceHeader } from "../components/patterns/ListWorkspace";
import { HeaderActionGroup, ListWorkspace, WorkspaceHeader } from "../components/patterns/ListWorkspace";
import { Button } from "../components/ui/button";
import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger } from "../components/ui/dropdown-menu";
import { InvoiceUploadCard } from "./invoice-pool/InvoiceUploadCard";
@@ -475,7 +475,7 @@ export function InvoicePoolPage() {
<WorkspaceHeader
title="票据"
actions={
<div className="flex flex-wrap gap-2">
<HeaderActionGroup>
{isInvoiceDetailMode ? (
<Button type="button" variant="secondary" onClick={returnToInvoiceList}>
返回列表
@@ -484,41 +484,13 @@ export function InvoicePoolPage() {
<>
<Button
type="button"
variant={invoiceActionPanel === "upload" ? "default" : "secondary"}
onClick={() => setInvoiceActionPanel((current) => (current === "upload" ? null : "upload"))}
onClick={() => setInvoiceActionPanel("upload")}
>
上传票据
</Button>
<Button
type="button"
variant={invoiceActionPanel === "bind" ? "default" : "secondary"}
onClick={() => setInvoiceActionPanel((current) => (current === "bind" ? null : "bind"))}
>
绑定
</Button>
<DropdownMenu>
<DropdownMenuTrigger asChild>
<Button
data-testid="invoice-export"
type="button"
variant="secondary"
disabled={exportMutation.isPending}
>
{exportMutation.isPending ? "导出中..." : "导出"}
</Button>
</DropdownMenuTrigger>
<DropdownMenuContent align="end">
<DropdownMenuItem data-testid="invoice-export-csv" onSelect={() => exportMutation.mutate("csv")}>
导出 CSV
</DropdownMenuItem>
<DropdownMenuItem data-testid="invoice-export-xlsx" onSelect={() => exportMutation.mutate("xlsx")}>
导出 Excel
</DropdownMenuItem>
</DropdownMenuContent>
</DropdownMenu>
</>
)}
</div>
</HeaderActionGroup>
}
/>
@@ -573,6 +545,39 @@ export function InvoicePoolPage() {
{!isInvoiceDetailMode ? (
<InvoiceListCard
listQuery={listQuery}
actions={
<>
<Button
type="button"
size="sm"
variant={invoiceActionPanel === "bind" ? "default" : "secondary"}
onClick={() => setInvoiceActionPanel((current) => (current === "bind" ? null : "bind"))}
>
绑定
</Button>
<DropdownMenu>
<DropdownMenuTrigger asChild>
<Button
data-testid="invoice-export"
type="button"
size="sm"
variant="secondary"
disabled={exportMutation.isPending}
>
{exportMutation.isPending ? "导出中..." : "导出"}
</Button>
</DropdownMenuTrigger>
<DropdownMenuContent align="end">
<DropdownMenuItem data-testid="invoice-export-csv" onSelect={() => exportMutation.mutate("csv")}>
导出 CSV
</DropdownMenuItem>
<DropdownMenuItem data-testid="invoice-export-xlsx" onSelect={() => exportMutation.mutate("xlsx")}>
导出 Excel
</DropdownMenuItem>
</DropdownMenuContent>
</DropdownMenu>
</>
}
status={status}
setStatus={setStatus}
ownerScope={ownerScope}