diff --git a/app/Http/Controllers/DashboardController.php b/app/Http/Controllers/DashboardController.php new file mode 100644 index 0000000..f6ecd02 --- /dev/null +++ b/app/Http/Controllers/DashboardController.php @@ -0,0 +1,32 @@ + Product::count(), + 'vendorsCount' => Vendor::count(), + 'purchaseOrdersCount' => PurchaseOrder::count(), + 'warehousesCount' => Warehouse::count(), + 'totalInventoryValue' => Inventory::join('products', 'inventories.product_id', '=', 'products.id') + ->sum('inventories.quantity'), // Simplified, maybe just sum quantities for now + 'pendingOrdersCount' => PurchaseOrder::where('status', 'pending')->count(), + 'lowStockCount' => Inventory::whereColumn('quantity', '<=', 'safety_stock')->count(), + ]; + + return Inertia::render('Dashboard', [ + 'stats' => $stats, + ]); + } +} diff --git a/resources/js/Layouts/AuthenticatedLayout.tsx b/resources/js/Layouts/AuthenticatedLayout.tsx index 67035c0..78b19ad 100644 --- a/resources/js/Layouts/AuthenticatedLayout.tsx +++ b/resources/js/Layouts/AuthenticatedLayout.tsx @@ -1,4 +1,4 @@ -import { ChevronDown, ChevronRight, Package, ClipboardList, ShoppingCart } from "lucide-react"; +import { ChevronDown, ChevronRight, Package, ClipboardList, ShoppingCart, Menu, X, PanelLeftClose, PanelLeftOpen } from "lucide-react"; import { Toaster } from "sonner"; import { useState, useEffect } from "react"; import { Link, usePage } from "@inertiajs/react"; @@ -14,6 +14,14 @@ interface MenuItem { export default function AuthenticatedLayout({ children }: { children: React.ReactNode }) { const { url } = usePage(); + 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", @@ -94,7 +102,19 @@ export default function AuthenticatedLayout({ children }: { children: React.Reac } }, [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) @@ -111,56 +131,74 @@ export default function AuthenticatedLayout({ children }: { children: React.Reac const isActive = item.route ? url.startsWith(item.route) : false; return ( -