|
- "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
- } from '@mui/material';
- import { useTranslation } from 'react-i18next';
- import dayjs from 'dayjs';
- import { fetchTicketReleaseTable, getTicketReleaseTable } from '@/app/api/do/actions';
-
- const FGPickOrderTicketReleaseTable: React.FC = () => {
- const { t } = useTranslation("pickOrder");
- const [selectedDate, setSelectedDate] = useState<string>("today");
- const [selectedFloor, setSelectedFloor] = useState<string>("");
- const [data, setData] = useState<getTicketReleaseTable[]>([]);
- const [loading, setLoading] = useState<boolean>(true);
- const [paginationController, setPaginationController] = useState({
- pageNum: 0,
- pageSize: 10,
- });
-
- const getDateLabel = (offset: number) => {
- return dayjs().add(offset, 'day').format('YYYY-MM-DD');
- };
-
- useEffect(() => {
- const loadData = async () => {
- setLoading(true);
- try {
- const result = await fetchTicketReleaseTable();
- 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;
- }
- }
-
- return true;
- },[data, selectedDate, selectedFloor]);
-
- const handlePageChange = useCallback((event: unknown, newPage: number) => {
- setPaginationController(prev => ({
- ...prev,
- pageNum: newPage,
- }));
- }, []);
-
- const handlePageSizeChange = useCallback((event: React.ChangeEvent<HTMLInputElement>) => {
- 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]);
-
- return (
- <Card sx={{ mb: 2 }}>
- <CardContent>
- {/* Title */}
- <Typography variant="h5" sx={{ mb: 3, fontWeight: 600 }}>
- Ticket Release Table
- </Typography>
-
- {/* Dropdown Menus */}
- <Stack direction="row" spacing={2} sx={{ mb: 3 }}>
- {/* Date Selection Dropdown */}
- <FormControl sx={{ minWidth: 250 }} size="small">
- <InputLabel id="date-select-label">{t("Select Date")}</InputLabel>
- <Select
- labelId="date-select-label"
- id="date-select"
- value={selectedDate}
- label={t("Select Date")}
- onChange={(e) => setSelectedDate(e.target.value)}
- >
- <MenuItem value="today">
- {t("Today")} ({getDateLabel(0)})
- </MenuItem>
- <MenuItem value="tomorrow">
- {t("Tomorrow")} ({getDateLabel(1)})
- </MenuItem>
- <MenuItem value="dayAfterTomorrow">
- {t("Day After Tomorrow")} ({getDateLabel(2)})
- </MenuItem>
- </Select>
- </FormControl>
-
- <FormControl sx={{ minWidth: 150 }} size="small">
- <InputLabel
- id="floor-select-label"
- shrink={true}
- >
- {t("Floor")}
- </InputLabel>
- <Select
- labelId="floor-select-label"
- id="floor-select"
- value={selectedFloor}
- label={t("Floor")}
- onChange={(e) => setSelectedFloor(e.target.value)}
- displayEmpty
- >
- <MenuItem value="">
- <em>{t("All Floors")}</em>
- </MenuItem>
- <MenuItem value="2/F">2/F</MenuItem>
- <MenuItem value="4/F">4/F</MenuItem>
- </Select>
- </FormControl>
- </Stack>
-
- <Box sx={{ mt: 2 }}>
- {loading ? (
- <Box sx={{ display: 'flex', justifyContent: 'center', p: 3 }}>
- <CircularProgress />
- </Box>
- ) : (
- <>
- <TableContainer component={Paper}>
- <Table size="small" sx={{ minWidth: 650 }}>
- <TableHead>
- <TableRow>
- <TableCell>{t("Store ID")}</TableCell>
- <TableCell>{t("Required Delivery Date")}</TableCell>
- <TableCell>
- <Box sx={{ display: 'flex', flexDirection: 'column', gap: 0.5 }}>
- <Typography variant="subtitle2" sx={{ fontWeight: 600 }}>
- {t("Truck Information")}
- </Typography>
- <Typography variant="caption" sx={{ color: 'text.secondary' }}>
- {t("Departure Time")} / {t("Truck Lane Code")}
- </Typography>
- </Box>
- </TableCell>
- {/*<TableCell>{t("Truck Departure Time")}</TableCell>
- <TableCell>{t("Truck Lane Code")}</TableCell>*/}
- <TableCell>{t("Shop Name")}</TableCell>
- <TableCell>{t("Loading Sequence")}</TableCell>
- {/*<TableCell>{t("Delivery Order Code(s)")}</TableCell>
- <TableCell>{t("Pick Order Code(s)")}</TableCell>
- <TableCell>{t("Ticket Number")}</TableCell>
- <TableCell>{t("Ticket Release Time")}</TableCell>
- <TableCell>{t("Ticket Complete Date Time")}</TableCell>
- <TableCell>{t("Ticket Status")}</TableCell>*/}
- <TableCell>
- <Box sx={{ display: 'flex', flexDirection: 'column', gap: 0.5 }}>
- <Typography variant="subtitle2" sx={{ fontWeight: 600 }}>
- {t("Ticket Information")}
- </Typography>
- <Typography variant="caption" sx={{ color: 'text.secondary' }}>
- {t("Ticket No.")} ({t("Status")}) / {t("Release Time")} / {t("Complete Time")}
- </Typography>
- </Box>
- </TableCell>
- <TableCell>{t("Handler Name")}</TableCell>
- <TableCell>{t("Number of FG Items")}</TableCell>
- </TableRow>
- </TableHead>
- <TableBody>
- {paginatedData.length === 0 ? (
- <TableRow>
- <TableCell colSpan={12} align="center">
- {t("No data available")}
- </TableCell>
- </TableRow>
- ) : (
- paginatedData.map((row) => {
- const isPending = row.ticketStatus?.toLowerCase() === 'pending';
- const showTimes = !isPending && (row.ticketStatus?.toLowerCase() === 'released' || row.ticketStatus?.toLowerCase() === 'completed');
-
- return (
- <TableRow key={row.id}>
- <TableCell>{row.storeId || '-'}</TableCell>
- <TableCell>
- {row.requiredDeliveryDate
- ? dayjs(row.requiredDeliveryDate).format('YYYY-MM-DD')
- : '-'}
- </TableCell>
-
- <TableCell>
- <Typography variant="body2">
- {row.truckDepartureTime && row.truckLanceCode
- ? (() => {
- let timeStr = row.truckDepartureTime.toString().trim();
- timeStr = timeStr.replace(',', ':');
- const timeMatch = timeStr.match(/^(\d{1,2})[:](\d{2})/);
- if (timeMatch) {
- const hours = timeMatch[1].padStart(2, '0');
- const minutes = timeMatch[2];
- return `${hours}:${minutes} | ${row.truckLanceCode}`;
- }
- return `${timeStr} | ${row.truckLanceCode}`;
- })()
- : row.truckDepartureTime
- ? (() => {
- let timeStr = row.truckDepartureTime.toString().trim();
- timeStr = timeStr.replace(',', ':');
- const timeMatch = timeStr.match(/^(\d{1,2})[:](\d{2})/);
- if (timeMatch) {
- const hours = timeMatch[1].padStart(2, '0');
- const minutes = timeMatch[2];
- return `${hours}:${minutes}`;
- }
- return timeStr;
- })()
- : row.truckLanceCode || '-'}
- </Typography>
- </TableCell>
-
- <TableCell>{row.shopName || '-'}</TableCell>
- <TableCell>{row.loadingSequence || '-'}</TableCell>
- {/*<TableCell>{row.deliveryOrderCode || '-'}</TableCell>
- <TableCell>{row.pickOrderCode || '-'}</TableCell>
- <TableCell>{row.ticketNo || '-'}</TableCell>
- <TableCell>
- {row.ticketReleaseTime
- ? dayjs(row.ticketReleaseTime).format('YYYY-MM-DD HH:mm:ss')
- : '-'}
- </TableCell>
- <TableCell>
- {row.ticketCompleteDateTime
- ? dayjs(row.ticketCompleteDateTime).format('YYYY-MM-DD HH:mm:ss')
- : '-'}
- </TableCell>
- <TableCell>{row.ticketStatus || '-'}</TableCell>*/}
-
- <TableCell>
- <Box sx={{ display: 'flex', flexDirection: 'column', gap: 0.5 }}>
- <Typography variant="body2">
- {row.ticketNo || '-'} ({row.ticketStatus || '-'})
- </Typography>
- {showTimes && (
- <>
- <Typography variant="body2">
- {row.ticketReleaseTime
- ? dayjs(row.ticketReleaseTime, 'YYYYMMDDHHmmss').format('YYYY-MM-DD HH:mm')
- : '-'}
- </Typography>
- <Typography variant="body2">
- {row.ticketCompleteDateTime
- ? dayjs(row.ticketCompleteDateTime, 'YYYYMMDDHHmmss').format('YYYY-MM-DD HH:mm')
- : '-'}
- </Typography>
- </>
- )}
- </Box>
- </TableCell>
- <TableCell>{row.handlerName || '-'}</TableCell>
- <TableCell>-</TableCell>
- </TableRow>
- );
- })
- )}
- </TableBody>
- </Table>
- </TableContainer>
- {filteredData.length > 0 && (
- <TablePagination
- component="div"
- count={filteredData.length}
- page={paginationController.pageNum}
- rowsPerPage={paginationController.pageSize}
- onPageChange={handlePageChange}
- onRowsPerPageChange={handlePageSizeChange}
- rowsPerPageOptions={[5, 10, 15]}
- labelRowsPerPage={t("Rows per page")}
- />
- )}
- </>
- )}
- </Box>
- </CardContent>
- </Card>
- );
- };
-
- export default FGPickOrderTicketReleaseTable;
|