feat: 重构开奖模块导航与面包屑,优化期号详情与列表展示
This commit is contained in:
96
src/components/admin/admin-breadcrumb.tsx
Normal file
96
src/components/admin/admin-breadcrumb.tsx
Normal file
@@ -0,0 +1,96 @@
|
||||
"use client";
|
||||
|
||||
import Link from "next/link";
|
||||
import { usePathname } from "next/navigation";
|
||||
import {
|
||||
Breadcrumb,
|
||||
BreadcrumbItem,
|
||||
BreadcrumbLink,
|
||||
BreadcrumbList,
|
||||
BreadcrumbPage,
|
||||
BreadcrumbSeparator,
|
||||
} from "@/components/ui/breadcrumb";
|
||||
import { adminShellNavItems, ADMIN_BASE } from "@/modules/_config/admin-nav";
|
||||
import React from "react";
|
||||
|
||||
const DRAW_ROUTE_LABELS: Record<string, string> = {
|
||||
finance: "期号收支",
|
||||
review: "审核",
|
||||
results: "开奖结果",
|
||||
};
|
||||
|
||||
function titleCase(value: string): string {
|
||||
return value
|
||||
.split("-")
|
||||
.map((part) => part.charAt(0).toUpperCase() + part.slice(1))
|
||||
.join(" ");
|
||||
}
|
||||
|
||||
export function AdminBreadcrumb() {
|
||||
const pathname = usePathname();
|
||||
|
||||
// 把路径拆分成段
|
||||
const segments = pathname.split("/").filter(Boolean);
|
||||
|
||||
// 基础面包屑:首页/仪表盘
|
||||
const breadcrumbs = [
|
||||
{
|
||||
label: "首页",
|
||||
href: ADMIN_BASE,
|
||||
isCurrent: pathname === ADMIN_BASE,
|
||||
},
|
||||
];
|
||||
|
||||
if (pathname !== ADMIN_BASE) {
|
||||
const businessSegment = segments[1];
|
||||
if (businessSegment) {
|
||||
const navItem = adminShellNavItems.find((item) => {
|
||||
return item.segment === businessSegment || item.href.includes(businessSegment);
|
||||
});
|
||||
|
||||
if (navItem && navItem.href !== ADMIN_BASE) {
|
||||
breadcrumbs.push({
|
||||
label: navItem.segment === "draws" ? "期号列表" : navItem.label,
|
||||
href: navItem.href,
|
||||
isCurrent: pathname === navItem.href || segments.length === 2,
|
||||
});
|
||||
}
|
||||
|
||||
if (segments.length > 2) {
|
||||
const subSegment = segments[2];
|
||||
const subLabel = subSegment ? DRAW_ROUTE_LABELS[subSegment] ?? titleCase(subSegment) : "";
|
||||
if (subLabel) {
|
||||
breadcrumbs.push({
|
||||
label: subLabel,
|
||||
href: pathname,
|
||||
isCurrent: true,
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return (
|
||||
<Breadcrumb>
|
||||
<BreadcrumbList>
|
||||
{breadcrumbs.map((crumb, index) => {
|
||||
const isLast = index === breadcrumbs.length - 1;
|
||||
const itemKey = `${crumb.href}-${index}`;
|
||||
|
||||
return (
|
||||
<React.Fragment key={itemKey}>
|
||||
<BreadcrumbItem>
|
||||
{crumb.isCurrent ? (
|
||||
<BreadcrumbPage>{crumb.label}</BreadcrumbPage>
|
||||
) : (
|
||||
<BreadcrumbLink render={<Link href={crumb.href} />}>{crumb.label}</BreadcrumbLink>
|
||||
)}
|
||||
</BreadcrumbItem>
|
||||
{!isLast && <BreadcrumbSeparator />}
|
||||
</React.Fragment>
|
||||
);
|
||||
})}
|
||||
</BreadcrumbList>
|
||||
</Breadcrumb>
|
||||
);
|
||||
}
|
||||
@@ -4,11 +4,13 @@ import type { ReactNode } from "react";
|
||||
|
||||
import { AdminAppSidebar } from "@/components/admin/admin-sidebar";
|
||||
import { ShellToolbar } from "@/components/admin/toolbar";
|
||||
import { AdminBreadcrumb } from "@/components/admin/admin-breadcrumb";
|
||||
import {
|
||||
SidebarInset,
|
||||
SidebarProvider,
|
||||
SidebarTrigger,
|
||||
} from "@/components/ui/sidebar";
|
||||
import { Separator } from "@/components/ui/separator";
|
||||
|
||||
export function AdminShell({ children }: { children: ReactNode }) {
|
||||
return (
|
||||
@@ -17,9 +19,8 @@ export function AdminShell({ children }: { children: ReactNode }) {
|
||||
<SidebarInset className="max-md:overflow-x-hidden">
|
||||
<header className="sticky top-0 z-30 flex min-h-12 items-center gap-3 border-b border-border bg-background/80 px-4 py-2 backdrop-blur-md">
|
||||
<SidebarTrigger />
|
||||
<span className="text-sm font-medium text-muted-foreground md:hidden">
|
||||
彩票后台
|
||||
</span>
|
||||
<Separator orientation="vertical" className="mr-2 h-4" />
|
||||
<AdminBreadcrumb />
|
||||
<div className="ml-auto flex shrink-0 items-center">
|
||||
<ShellToolbar />
|
||||
</div>
|
||||
|
||||
Reference in New Issue
Block a user