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

这个提交包含在:
2026-05-31 16:41:44 +08:00
父节点 b71d23e661
当前提交 dcf34d7ac6
共修改 18 个文件,包含 480 行新增和 183 行删除
+30 -13
查看文件
@@ -14,7 +14,7 @@ import { useAuth } from "../auth/AuthContext";
import { hasAnyPermission } from "../auth/permissions";
import { DateTextInput } from "../components/common/DateTextInput";
import { StatusBadge } from "../components/common/StatusBadge";
import { ListWorkspace, WorkspaceHeader, WorkspaceNotice } from "../components/patterns/ListWorkspace";
import { HeaderActionGroup, ListWorkspace, WorkspaceHeader, WorkspaceNotice } from "../components/patterns/ListWorkspace";
import {
BusinessListToolbar,
BusinessMobileList,
@@ -22,6 +22,12 @@ import {
} from "../components/patterns/BusinessListTemplate";
import { SectionPanel } from "../components/patterns/SectionPanel";
import { Button } from "../components/ui/button";
import {
DropdownMenu,
DropdownMenuContent,
DropdownMenuItem,
DropdownMenuTrigger,
} from "../components/ui/dropdown-menu";
import { Input } from "../components/ui/input";
import { Label } from "../components/ui/label";
import { Textarea } from "../components/ui/textarea";
@@ -179,19 +185,13 @@ export function ProjectsPage() {
<WorkspaceHeader
title="项目"
actions={
<div className="flex gap-2">
<Button asChild variant="secondary" type="button">
<Link to="/contracts-registry">合同</Link>
</Button>
<Button type="button" variant={showTrialData ? "default" : "secondary"} onClick={() => setShowTrialData((value) => !value)}>
{showTrialData ? "隐藏测试数据" : "显示测试数据"}
</Button>
<HeaderActionGroup>
{canManageProjects ? (
<Button type="button" variant={showCreatePanel ? "default" : "secondary"} onClick={() => setShowCreatePanel((value) => !value)}>
<Button type="button" onClick={() => setShowCreatePanel(true)}>
新建项目
</Button>
) : null}
</div>
</HeaderActionGroup>
}
/>
@@ -260,9 +260,26 @@ export function ProjectsPage() {
<div className="space-y-4">
<BusinessListToolbar
actions={
<Button type="button" size="sm" variant={mine ? "default" : "secondary"} onClick={() => updateSearch({ mine: !mine })}>
{mine ? "我相关" : "全范围"}
</Button>
<>
<Button type="button" size="sm" variant={mine ? "default" : "secondary"} onClick={() => updateSearch({ mine: !mine })}>
{mine ? "我相关" : "全范围"}
</Button>
<DropdownMenu>
<DropdownMenuTrigger asChild>
<Button type="button" size="sm" variant={showTrialData ? "default" : "secondary"}>
更多
</Button>
</DropdownMenuTrigger>
<DropdownMenuContent align="end">
<DropdownMenuItem asChild>
<Link to="/contracts-registry">查看合同</Link>
</DropdownMenuItem>
<DropdownMenuItem onSelect={() => setShowTrialData((value) => !value)}>
{showTrialData ? "隐藏测试数据" : "显示测试数据"}
</DropdownMenuItem>
</DropdownMenuContent>
</DropdownMenu>
</>
}
>
<div className="grid gap-3 md:grid-cols-[minmax(0,1fr),180px]">