import { ChevronRight, Package, ShoppingCart, Menu, X, PanelLeftClose, PanelLeftOpen, Boxes, Warehouse, Truck, Contact2, FileText, LogOut, User, ChevronDown } from "lucide-react"; import { Toaster } from "sonner"; import { useState, useEffect } from "react"; import { Link, usePage } from "@inertiajs/react"; import { cn } from "@/lib/utils"; import BreadcrumbNav, { BreadcrumbItemType } from "@/Components/shared/BreadcrumbNav"; import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuLabel, DropdownMenuSeparator, DropdownMenuTrigger, } from "@/Components/ui/dropdown-menu"; interface MenuItem { id: string; label: string; icon?: React.ReactNode; route?: string; children?: MenuItem[]; } export default function AuthenticatedLayout({ children, breadcrumbs }: { children: React.ReactNode, breadcrumbs?: BreadcrumbItemType[] }) { const { url, props } = usePage(); // @ts-ignore const user = props.auth?.user || { name: 'Guest', username: 'guest' }; const [isCollapsed, setIsCollapsed] = useState(() => { if (typeof window !== "undefined") { return localStorage.getItem("sidebar-collapsed") === "true"; } return false; }); const [isMobileOpen, setIsMobileOpen] = useState(false); const menuItems: MenuItem[] = [ { id: "inventory-management", label: "商品與庫存管理", icon: , children: [ { id: "product-management", label: "商品資料管理", icon: , route: "/products", }, { id: "warehouse-management", label: "倉庫管理", icon: , route: "/warehouses", }, ], }, { id: "vendor-management", label: "廠商管理", icon: , children: [ { id: "vendor-list", label: "廠商資料管理", icon: , route: "/vendors", }, ], }, { id: "purchase-management", label: "採購管理", icon: , children: [ { id: "purchase-order-list", label: "管理採購單", icon: , route: "/purchase-orders", }, ], }, ]; // 初始化狀態:優先讀取 localStorage const [expandedItems, setExpandedItems] = useState(() => { try { const saved = localStorage.getItem("sidebar-expanded-items"); if (saved) return JSON.parse(saved); } catch (e) { console.error("Failed to parse sidebar state", e); } // 如果沒有存檔,則預設僅展開當前 URL 對應的群組 const activeItem = menuItems.find(item => item.children?.some(child => child.route && url.startsWith(child.route)) ); return activeItem ? [activeItem.id] : ["inventory-management"]; }); // 監聽 URL 變化,確保「當前」頁面所屬群組是展開的 // 但不要影響其他群組的狀態(除非使用者手動切換) useEffect(() => { const activeItem = menuItems.find(item => item.children?.some(child => child.route && url.startsWith(child.route)) ); if (activeItem && !expandedItems.includes(activeItem.id)) { setExpandedItems(prev => { const next = [...prev, activeItem.id]; localStorage.setItem("sidebar-expanded-items", JSON.stringify(next)); return next; }); } }, [url]); useEffect(() => { localStorage.setItem("sidebar-collapsed", String(isCollapsed)); }, [isCollapsed]); const toggleExpand = (itemId: string) => { if (isCollapsed) { setIsCollapsed(false); if (!expandedItems.includes(itemId)) { setExpandedItems(prev => [...prev, itemId]); } return; } setExpandedItems((prev) => { const next = prev.includes(itemId) ? prev.filter((id) => id !== itemId) : [...prev, itemId]; localStorage.setItem("sidebar-expanded-items", JSON.stringify(next)); return next; }); }; const renderMenuItem = (item: MenuItem, level: number = 0) => { const hasChildren = item.children && item.children.length > 0; const isExpanded = expandedItems.includes(item.id); const isActive = item.route ? url.startsWith(item.route) : false; return (
{hasChildren ? ( ) : ( setIsMobileOpen(false)} className={cn( "w-full flex items-center transition-all rounded-lg group", level === 0 ? "px-3 py-2.5" : "px-3 py-2", level > 0 && !isCollapsed && "pl-11", isActive ? "bg-primary-lightest text-primary-main" : "text-slate-600 hover:bg-slate-100 hover:text-slate-900", isCollapsed && level === 0 && "justify-center px-0 h-10 w-10 mx-auto" )} title={isCollapsed ? item.label : ""} > {item.icon && ( {item.icon} )} {!isCollapsed && ( {item.label} )} )} {hasChildren && isExpanded && !isCollapsed && (
{item.children?.map((child) => renderMenuItem(child, level + 1))}
)}
); }; return (
{/* Mobile Header -> Global Header */}
K
小小冰室 ERP
{/* User Menu */}
{user.name} {user.username || 'Administrator'}
我的帳號 登出系統
{/* Sidebar Desktop */} {/* Mobile Sidebar Overlay */} { isMobileOpen && (
setIsMobileOpen(false)} /> ) } {/* Mobile Sidebar Drawer */} {/* Main Content */}
{breadcrumbs && breadcrumbs.length > 1 && ( )}
{children}
); }