"use client"; import React, { useState, useEffect, useCallback, useMemo } from 'react'; import { Box, Typography, FormControl, InputLabel, Select, MenuItem, Card, CardContent, Stack, Table, TableBody, TableCell, TableContainer, TableHead, TableRow, Paper, CircularProgress, TablePagination, Chip } from '@mui/material'; import { useTranslation } from 'react-i18next'; import dayjs from 'dayjs'; import { arrayToDayjs } from '@/app/utils/formatUtil'; import { fetchTicketReleaseTable, getTicketReleaseTable } from '@/app/api/do/actions'; const FGPickOrderTicketReleaseTable: React.FC = () => { const { t } = useTranslation("ticketReleaseTable"); const [selectedDate, setSelectedDate] = useState("today"); const [selectedFloor, setSelectedFloor] = useState(""); const [selectedStatus, setSelectedStatus] = useState("released"); const [data, setData] = useState([]); const [loading, setLoading] = useState(true); const [paginationController, setPaginationController] = useState({ pageNum: 0, pageSize: 5, }); const formatTime = (timeData: any): string => { if (!timeData) return ''; let hour: number; let minute: number; if (typeof timeData === 'string') { const parts = timeData.split(':'); hour = parseInt(parts[0], 10); minute = parseInt(parts[1] || '0', 10); } else if (Array.isArray(timeData)) { hour = timeData[0] || 0; minute = timeData[1] || 0; } else { return ''; } const formattedHour = hour.toString().padStart(2, '0'); const formattedMinute = minute.toString().padStart(2, '0'); return `${formattedHour}:${formattedMinute}`; }; const getDateLabel = (offset: number) => { return dayjs().add(offset, 'day').format('YYYY-MM-DD'); }; const getDateRange = () => { const today = dayjs().format('YYYY-MM-DD'); const dayAfterTomorrow = dayjs().add(2, 'day').format('YYYY-MM-DD'); return { startDate: today, endDate: dayAfterTomorrow }; }; useEffect(() => { const loadData = async () => { setLoading(true); try { const { startDate, endDate } = getDateRange(); const result = await fetchTicketReleaseTable(startDate, endDate); setData(result); } catch (error) { console.error('Error fetching ticket release table:', error); } finally { setLoading(false); } }; loadData(); }, []); const filteredData = data.filter((item) => { // Filter by floor if selected if (selectedFloor && item.storeId !== selectedFloor) { return false; } // Filter by date if selected if (selectedDate && item.requiredDeliveryDate) { const itemDate = dayjs(item.requiredDeliveryDate).format('YYYY-MM-DD'); const targetDate = getDateLabel( selectedDate === "today" ? 0 : selectedDate === "tomorrow" ? 1 : 2 ); if (itemDate !== targetDate) { return false; } } // Filter by status if selected if (selectedStatus && item.ticketStatus?.toLowerCase() !== selectedStatus.toLowerCase()) { return false; } return true; },[data, selectedDate, selectedFloor, selectedStatus]); const handlePageChange = useCallback((event: unknown, newPage: number) => { setPaginationController(prev => ({ ...prev, pageNum: newPage, })); }, []); const handlePageSizeChange = useCallback((event: React.ChangeEvent) => { const newPageSize = parseInt(event.target.value, 10); setPaginationController({ pageNum: 0, pageSize: newPageSize, }); }, []); const paginatedData = useMemo(() => { const startIndex = paginationController.pageNum * paginationController.pageSize; const endIndex = startIndex + paginationController.pageSize; return filteredData.slice(startIndex, endIndex); }, [filteredData, paginationController]); useEffect(() => { setPaginationController(prev => ({ ...prev, pageNum: 0 })); }, [selectedDate, selectedFloor, selectedStatus]); return ( {/* Title */} {t("Ticket Release Table")} {/* Dropdown Menus */} {t("Select Date")} {t("Floor")} {t("Status")} {loading ? ( ) : ( <> {t("Store ID")} {t("Required Delivery Date")} {t("Truck Information")} {t("Truck Lane Code")} - {t("Departure Time")} {/*{t("Truck Departure Time")} {t("Truck Lane Code")}*/} {t("Shop Name")} {t("Loading Sequence")} {/*{t("Delivery Order Code(s)")} {t("Pick Order Code(s)")} {t("Ticket Number")} {t("Ticket Release Time")} {t("Ticket Complete Date Time")} {t("Ticket Status")}*/} {t("Ticket Information")} {t("Ticket No.")} ({t("Status")}) {t("Released Time")} - {t("Completed Time")} {t("Handler Name")} {t("Number of FG Items (Order Item(s) Count)")} {paginatedData.length === 0 ? ( {t("No data available")} ) : ( paginatedData.map((row) => { return ( {row.storeId || '-'} {row.requiredDeliveryDate ? dayjs(row.requiredDeliveryDate).format('YYYY-MM-DD') : '-'} {row.truckLanceCode && ( )} {row.truckDepartureTime && ( )} {!row.truckLanceCode && !row.truckDepartureTime && ( - )} {row.shopName || '-'} {row.loadingSequence || '-'} {/*{row.deliveryOrderCode || '-'} {row.pickOrderCode || '-'} {row.ticketNo || '-'} {row.ticketReleaseTime ? dayjs(row.ticketReleaseTime).format('YYYY-MM-DD HH:mm:ss') : '-'} {row.ticketCompleteDateTime ? dayjs(row.ticketCompleteDateTime).format('YYYY-MM-DD HH:mm:ss') : '-'} {row.ticketStatus || '-'}*/} {row.ticketNo || '-'} ({row.ticketStatus ? t(row.ticketStatus.toLowerCase()) : '-'}) {t("Released Time")}: {row.ticketReleaseTime ? (() => { if (Array.isArray(row.ticketReleaseTime)) { return arrayToDayjs(row.ticketReleaseTime, true).format('HH:mm'); } const parsedDate = dayjs(row.ticketReleaseTime, 'YYYYMMDDHHmmss'); if (!parsedDate.isValid()) { return dayjs(row.ticketReleaseTime).format('HH:mm'); } return parsedDate.format('HH:mm'); })() : '-'} {t("Completed Time")}: {row.ticketCompleteDateTime ? (() => { if (Array.isArray(row.ticketCompleteDateTime)) { return arrayToDayjs(row.ticketCompleteDateTime, true).format('HH:mm'); } const parsedDate = dayjs(row.ticketCompleteDateTime, 'YYYYMMDDHHmmss'); if (!parsedDate.isValid()) { return dayjs(row.ticketCompleteDateTime).format('HH:mm'); } return parsedDate.format('HH:mm'); })() : '-'} {row.handlerName || '-'} {row.numberOfFGItems ?? 0} ); }) )}
{filteredData.length > 0 && ( )} )}
); }; export default FGPickOrderTicketReleaseTable;