import React, { useCallback } from 'react'; import { Box, Typography, Table, TableBody, TableCell, TableContainer, TableHead, TableRow, Paper, Checkbox, TextField, TablePagination, FormControl, Select, MenuItem, } from '@mui/material'; import { useTranslation } from 'react-i18next'; import { OUTPUT_DATE_FORMAT } from '@/app/utils/formatUtil'; import dayjs from 'dayjs'; interface SearchItemWithQty { id: number; label: string; qty: number | null; currentStockBalance?: number; uomDesc?: string; targetDate?: string | null; groupId?: number | null; } interface Group { id: number; name: string; targetDate: string; } interface SearchResultsTableProps { items: SearchItemWithQty[]; selectedItemIds: (string | number)[]; groups: Group[]; onItemSelect: (itemId: number, checked: boolean) => void; onQtyChange: (itemId: number, qty: number | null) => void; onQtyBlur: (itemId: number) => void; onGroupChange: (itemId: number, groupId: string) => void; isItemInCreated: (itemId: number) => boolean; pageNum: number; pageSize: number; onPageChange: (event: unknown, newPage: number) => void; onPageSizeChange: (event: React.ChangeEvent) => void; } const SearchResultsTable: React.FC = ({ items, selectedItemIds, groups, onItemSelect, onQtyChange, onGroupChange, onQtyBlur, isItemInCreated, pageNum, pageSize, onPageChange, onPageSizeChange, }) => { const { t } = useTranslation("pickOrder"); // Calculate pagination const startIndex = (pageNum - 1) * pageSize; const endIndex = startIndex + pageSize; const paginatedResults = items.slice(startIndex, endIndex); const handleQtyChange = useCallback((itemId: number, value: string) => { // Only allow numbers if (value === "" || /^\d+$/.test(value)) { const numValue = value === "" ? null : Number(value); onQtyChange(itemId, numValue); } }, [onQtyChange]); return ( <> {t("Selected")} {t("Item")} {t("Group")} {t("Current Stock")} {t("Stock Unit")} {t("Order Quantity")} {t("Target Date")} {paginatedResults.length === 0 ? ( {t("No data available")} ) : ( paginatedResults.map((item) => ( onItemSelect(item.id, e.target.checked)} disabled={isItemInCreated(item.id)} /> {/* Item */} {item.label.split(' - ')[1] || item.label} {item.label.split(' - ')[0] || ''} {/* Group */} {/* Current Stock */} 0 ? "success.main" : "error.main"} sx={{ fontWeight: item.currentStockBalance && item.currentStockBalance > 0 ? 'bold' : 'normal' }} > {item.currentStockBalance?.toLocaleString()||0} {/* Stock Unit */} {item.uomDesc || "-"} {/* Order Quantity */} { const value = e.target.value; // Only allow numbers if (value === "" || /^\d+$/.test(value)) { const numValue = value === "" ? null : Number(value); onQtyChange(item.id, numValue); } }} onBlur={() => { // Trigger auto-add check when user finishes input (clicks elsewhere) onQtyBlur(item.id); // ← Change this to call onQtyBlur instead! }} inputProps={{ style: { textAlign: 'center' } }} sx={{ width: '80px', '& .MuiInputBase-input': { textAlign: 'center', cursor: 'text' } }} disabled={isItemInCreated(item.id)} /> {/* Target Date */} {item.targetDate ? dayjs(item.targetDate).format(OUTPUT_DATE_FORMAT) : "-"} )) )}
`${from}-${to} of ${count !== -1 ? count : `more than ${to}`}` } /> ); }; export default SearchResultsTable;