import type { Component } from 'vue' import { BriefcaseBusiness, Building2, ContactRound, ClipboardList, Database, FileCheck2, KeyRound, Settings, ShieldCheck, Truck, Users, Warehouse as WarehouseIcon, } from '@lucide/vue' export interface AdminNavigationNode { key: string title: string icon: Component path?: string permission?: string children?: AdminNavigationNode[] } export interface AdminNavigationLeaf extends AdminNavigationNode { path: string permission: string children?: never } export const adminNavigation: AdminNavigationNode[] = [ { key: 'business', title: '业务管理', icon: BriefcaseBusiness, children: [ { key: 'customers', title: '客户管理', icon: Building2, path: '/customers', permission: 'platform:customer:list' }, { key: 'enterprise-reviews', title: '企业审核', icon: FileCheck2, path: '/customers/reviews', permission: 'platform:customer:review' }, { key: 'warehouses', title: '仓库管理', icon: WarehouseIcon, path: '/warehouses', permission: 'platform:warehouse:list' }, { key: 'first-leg-orders', title: '头程订单', icon: ClipboardList, path: '/orders/first-leg', permission: 'platform:order:list' }, ], }, { key: 'master-data', title: '基础资料', icon: Database, children: [ { key: 'express-companies', title: '快递公司', icon: Truck, path: '/master-data/express-companies', permission: 'platform:express:list' }, { key: 'counterparties', title: '往来单位', icon: ContactRound, path: '/master-data/counterparties', permission: 'platform:counterparty:list' }, ], }, { key: 'system', title: '系统管理', icon: Settings, children: [ { key: 'internal-users', title: '内部用户', icon: Users, path: '/system/users', permission: 'platform:user:list' }, { key: 'roles', title: '角色管理', icon: ShieldCheck, path: '/system/roles', permission: 'platform:role:list' }, { key: 'permissions', title: '菜单权限', icon: KeyRound, path: '/system/permissions', permission: 'platform:permission:list' }, ], }, ] export function getNavigationLeaves(nodes: AdminNavigationNode[]): AdminNavigationLeaf[] { return nodes.flatMap((node) => { if (node.children?.length) return getNavigationLeaves(node.children) if (!node.path || !node.permission) return [] return [node as AdminNavigationLeaf] }) } export function filterAdminNavigation( nodes: AdminNavigationNode[], permissionCodes: ReadonlySet, ): AdminNavigationNode[] { return nodes.flatMap((node) => { if (node.children?.length) { const children = filterAdminNavigation(node.children, permissionCodes) return children.length ? [{ ...node, children }] : [] } if (!node.path || !node.permission || !permissionCodes.has(node.permission)) return [] return [{ ...node }] }) } export function getFirstNavigationLeaf(nodes: AdminNavigationNode[]): AdminNavigationLeaf | null { return getNavigationLeaves(nodes)[0] ?? null }