import { useState } from "react"; import { SearchableSelect } from "@/Components/ui/searchable-select"; import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogFooter, DialogDescription, } from "@/Components/ui/dialog"; import { Label } from "@/Components/ui/label"; import { Loader2, Plus, Warehouse as WarehouseIcon } from 'lucide-react'; import { Card, CardContent } from "@/Components/ui/card"; import { Button } from "@/Components/ui/button"; import AuthenticatedLayout from "@/Layouts/AuthenticatedLayout"; import { Head, router } from "@inertiajs/react"; import WarehouseDialog from "@/Components/Warehouse/WarehouseDialog"; import SearchToolbar from "@/Components/shared/SearchToolbar"; import WarehouseCard from "@/Components/Warehouse/WarehouseCard"; import WarehouseEmptyState from "@/Components/Warehouse/WarehouseEmptyState"; import { Warehouse } from "@/types/warehouse"; import Pagination from "@/Components/shared/Pagination"; import { toast } from "sonner"; import { getBreadcrumbs } from "@/utils/breadcrumb"; import { Can } from "@/Components/Permission/Can"; interface PageProps { warehouses: { data: Warehouse[]; links: any[]; current_page: number; last_page: number; total: number; }; totals: { available_stock: number; available_amount: number; book_stock: number; book_amount: number; }; filters: { search?: string; per_page?: string; }; } export default function WarehouseIndex({ warehouses, totals, filters }: PageProps) { // 篩選狀態 const [searchTerm, setSearchTerm] = useState(filters.search || ""); const [perPage, setPerPage] = useState(filters.per_page || '10'); // 對話框狀態 const [isDialogOpen, setIsDialogOpen] = useState(false); const [editingWarehouse, setEditingWarehouse] = useState(null); // 調撥單單建立狀態 const [isTransferCreateOpen, setIsTransferCreateOpen] = useState(false); const [sourceWarehouseId, setSourceWarehouseId] = useState(""); const [targetWarehouseId, setTargetWarehouseId] = useState(""); const [creating, setCreating] = useState(false); // 搜尋處理 const handleSearch = (term: string) => { setSearchTerm(term); router.get(route('warehouses.index'), { search: term, per_page: perPage }, { preserveState: true, preserveScroll: true, replace: true, }); }; const handlePerPageChange = (value: string) => { setPerPage(value); router.get(route('warehouses.index'), { ...filters, per_page: value, page: 1 }, { preserveState: false, replace: true, preserveScroll: true } ); }; // 導航處理 const handleViewInventory = (warehouseId: string | number) => { router.get(`/warehouses/${warehouseId}/inventory`); }; // 倉庫操作處理函式 const handleAddWarehouse = () => { setEditingWarehouse(null); setIsDialogOpen(true); }; const handleEditWarehouse = (warehouse: Warehouse) => { setEditingWarehouse(warehouse); setIsDialogOpen(true); }; // 接收 Dialog 回傳的資料並呼叫後端 const handleSaveWarehouse = (data: Partial) => { if (editingWarehouse) { router.put(route('warehouses.update', editingWarehouse.id), data, { onSuccess: () => setIsDialogOpen(false), }); } else { router.post(route('warehouses.store'), data, { onSuccess: () => setIsDialogOpen(false), }); } }; const handleDeleteWarehouse = (id: string | number) => { router.delete(route('warehouses.destroy', id), { onSuccess: () => { toast.success('倉庫已刪除'); setEditingWarehouse(null); }, onError: (errors: any) => { console.error(errors); } }); }; const handleAddTransferOrder = () => { setIsTransferCreateOpen(true); }; const handleCreateTransferOrder = () => { if (!sourceWarehouseId) { toast.error("請選擇來源倉庫"); return; } if (!targetWarehouseId) { toast.error("請選擇目的倉庫"); return; } if (sourceWarehouseId === targetWarehouseId) { toast.error("來源與目的倉庫不能相同"); return; } setCreating(true); router.post(route('inventory.transfer.store'), { from_warehouse_id: sourceWarehouseId, to_warehouse_id: targetWarehouseId }, { onFinish: () => setCreating(false), onSuccess: () => { setIsTransferCreateOpen(false); setSourceWarehouseId(""); setTargetWarehouseId(""); toast.success('調撥單已建立'); } }); }; return (
{/* 頁面標題 */}

倉庫管理

管理倉庫地點、負責人與庫存監控

{/* 統計區塊 */}
可用庫存總計
{totals.available_stock.toLocaleString()} ( 總額:${totals.available_amount?.toLocaleString()} )
帳面庫存總計
{totals.book_stock.toLocaleString()} ( 總額:${totals.book_amount?.toLocaleString()} )
{/* 工具列 */}
{/* 搜尋框 */}
{/* 操作按鈕 */}
{/* 倉庫卡片列表 */} {warehouses.data.length === 0 ? ( ) : (
{warehouses.data.map((warehouse) => ( 0} onViewInventory={() => handleViewInventory(warehouse.id)} onEdit={handleEditWarehouse} /> ))}
)} {/* 分頁 */}
每頁顯示
共 {warehouses.total} 筆紀錄
{/* 倉庫對話框 */} {/* 調撥單建立對話框 */} 建立新調撥單 請選擇來源倉庫與目的倉庫。
({ label: w.name, value: w.id.toString() }))} placeholder="請選擇來源倉庫" className="h-9" />
w.id.toString() !== sourceWarehouseId) .map((w: any) => ({ label: w.name, value: w.id.toString() })) } placeholder="請選擇目的倉庫" className="h-9" />
); }