// 新建檔案 "use client"; import { Modal, Box, Typography, TextField, Table, TableBody, TableCell, TableContainer, TableHead, TableRow, Paper, CircularProgress, Button, } from "@mui/material"; import { useCallback, useEffect, useState } from "react"; import { useTranslation } from "react-i18next"; import { fetchReleasedDoPickOrdersForSelection, assignByDoPickOrderId, type ReleasedDoPickOrderListItem, fetchReleasedDoPickOrdersForSelectionToday, type PostPickOrderResponse, } from "@/app/api/pickOrder/actions"; import { useSession } from "next-auth/react"; import { SessionWithTokens } from "@/config/authConfig"; import Swal from "sweetalert2"; import { requiredDeliveryDateToDayString } from "@/app/utils/formatUtil"; /** DO workbench 使用 workbench released API;Finished Good 不傳即可 */ export type ReleasedDoPickListBridge = { loadBeforeToday: ( shopName?: string, storeId?: string, truck?: string, releaseType?: string, /** Optional `2F`/`4F` for Truck X supplier-floor split */ floor?: string ) => Promise; /** Optional 4th arg: workbench `requiredDeliveryDate` (YYYY-MM-DD) for default truck list; omit = calendar today. */ loadToday: ( shopName?: string, storeId?: string, truck?: string, requiredDeliveryDate?: string, releaseType?: string, /** Optional `2F`/`4F` for Truck X supplier-floor split */ floor?: string ) => Promise; assignByListItemId: (userId: number, id: number) => Promise; }; interface Props { open: boolean; onClose: () => void; onAssigned: () => void; storeId: string; truck: string; isDefaultTruck: boolean; /** Truck X only: today → released-today; before → released (歷史未完工) */ defaultDateScope?: "today" | "before"; listBridge?: ReleasedDoPickListBridge; /** Workbench: `delivery_order_pick_order.requiredDeliveryDate` for Truck X (select day); used when [defaultDateScope] is today. */ defaultTruckRequiredDeliveryDate?: string; /** Workbench: filter list to `releaseType` (e.g. `isExtra`). */ releaseTypeFilter?: string; /** Prefill shop search when opening (e.g. Etra lane picker). */ initialShopSearch?: string; /** * When set with a workbench listBridge, non–Truck-X list uses released-today with this * requiredDate instead of historical released (delivery date before calendar today). */ filterRequiredDeliveryDate?: string; /** * Truck X only: `2F`/`4F` (or `2/F`/`4/F`) — filter by DO supplier preferred floor; storeId stays null. */ truckXFloor?: string; } /** FP-MTMS Version Checklist | Functions Ref. No. 36 | v1.0.0 | 2026-07-27 */ const ReleasedDoPickOrderSelectModal: React.FC = ({ open, onClose, onAssigned, storeId, truck, isDefaultTruck, defaultDateScope: defaultDateScopeProp = "today", listBridge, defaultTruckRequiredDeliveryDate, releaseTypeFilter, initialShopSearch, filterRequiredDeliveryDate, truckXFloor, }) => { const { t } = useTranslation("pickOrder"); const { data: session } = useSession() as { data: SessionWithTokens | null }; const currentUserId = session?.id ? parseInt(session.id) : undefined; const [list, setList] = useState([]); const [loading, setLoading] = useState(false); const [shopSearch, setShopSearch] = useState(""); const [isAssigning, setIsAssigning] = useState(false); const loadList = useCallback(async () => { if (!open) return; setLoading(true); try { let data: ReleasedDoPickOrderListItem[]; const loadReleased = listBridge?.loadBeforeToday ?? fetchReleasedDoPickOrdersForSelection; const loadTodayFn = listBridge?.loadToday ?? fetchReleasedDoPickOrdersForSelectionToday; const floorArg = truckXFloor?.trim() || undefined; const shopArg = shopSearch.trim() || undefined; if (isDefaultTruck) { if (defaultDateScopeProp === "today") { data = await loadTodayFn( shopArg, undefined, "車線-X", defaultTruckRequiredDeliveryDate?.trim() || undefined, releaseTypeFilter?.trim() || undefined, floorArg ); } else { data = await loadReleased( shopArg, undefined, "車線-X", releaseTypeFilter?.trim() || undefined, floorArg ); } } else if (filterRequiredDeliveryDate?.trim() && listBridge?.loadToday) { data = await listBridge.loadToday( shopSearch.trim() || undefined, storeId, truck?.trim() || undefined, filterRequiredDeliveryDate.trim(), releaseTypeFilter?.trim() || undefined ); } else { data = await loadReleased( shopSearch.trim() || undefined, storeId, truck?.trim() || undefined, releaseTypeFilter?.trim() || undefined ); } setList(data); } catch (e) { console.error(e); setList([]); } finally { setLoading(false); } }, [open, shopSearch, storeId, truck, isDefaultTruck, defaultDateScopeProp, listBridge, defaultTruckRequiredDeliveryDate, releaseTypeFilter, filterRequiredDeliveryDate, truckXFloor]); useEffect(() => { loadList(); }, [loadList]); useEffect(() => { if (!open) return; setShopSearch(initialShopSearch?.trim() ?? ""); }, [open, initialShopSearch]); const handleSelectRow = useCallback( async (item: ReleasedDoPickOrderListItem) => { if (!currentUserId) return; const confirmResult = await Swal.fire({ title: t("Confirm Assignment"), html: `

${t("Date")}: ${requiredDeliveryDateToDayString(item.requiredDeliveryDate) || "-"}

${t("Shop")}: ${item.shopName ?? item.shopCode ?? "-"}

${t("Truck")}: ${item.truckLanceCode ?? "-"}

${t("Delivery Order")}: ${(item.deliveryOrderCodes ?? []).join(", ")}

`, icon: "question", showCancelButton: true, confirmButtonText: t("Confirm"), cancelButtonText: t("Cancel"), confirmButtonColor: "#8dba00", cancelButtonColor: "#F04438", didOpen: () => { const container = document.querySelector('.swal2-container'); const popup = Swal.getPopup(); if (container) (container as HTMLElement).style.zIndex = '9999'; if (popup) popup.style.zIndex = '9999'; } }); if (!confirmResult.isConfirmed) return; setIsAssigning(true); try { const assignFn = listBridge?.assignByListItemId ?? assignByDoPickOrderId; const res = await assignFn(currentUserId, item.id); if (res?.code === "SUCCESS") { Swal.fire({ icon: "success", text: t("Assigned successfully"), timer: 1500, showConfirmButton: false, }); onAssigned?.(); onClose(); } else { Swal.fire({ icon: "error", text: res?.message ?? t("Assignment failed"), }); } } catch (e) { console.error(e); Swal.fire({ icon: "error", text: t("Error occurred during assignment.") }); } finally { setIsAssigning(false); } }, [currentUserId, t, onAssigned, onClose, listBridge] ); return ( {t("Not Yet Finished Released Do Pick Orders")} setShopSearch(e.target.value)} sx={{ mb: 2 }} fullWidth /> {loading ? ( ) : ( {t("Date")} {t("Shop")} {t("Truck")} {t("Delivery Order Code")} {t("Action")} {list.map((row) => ( {requiredDeliveryDateToDayString(row.requiredDeliveryDate) || "-"} {row.shopName ?? row.shopCode ?? "-"} {row.truckLanceCode ?? "-"} {(row.deliveryOrderCodes ?? []).join("\n") || "-"} ))}
)} {!loading && list.length === 0 && ( {t("No entries available")} )}
); }; export default ReleasedDoPickOrderSelectModal;