"use client"; import { Autocomplete, Box, Button, CircularProgress, Grid, Stack, TextField, Typography, } from "@mui/material"; import { useCallback, useEffect, useMemo, useState } from "react"; import { useTranslation } from "react-i18next"; import SearchResults, { Column } from "../SearchResults/SearchResults"; import { fetchConsoPickOrderClient } from "@/app/api/pickOrder/actions"; import { fetchNameList, NameList } from "@/app/api/user/actions"; import { isEmpty, upperFirst } from "lodash"; import { arrayToDateString } from "@/app/utils/formatUtil"; interface Props { filterArgs: Record; } interface AssignmentData { id: string; consoCode: string; releasedDate: string | null; status: string; assignTo: number | null; assignedUserName?: string; } const AssignTo: React.FC = ({ filterArgs }) => { const { t } = useTranslation("pickOrder"); // State const [assignmentData, setAssignmentData] = useState([]); const [isLoading, setIsLoading] = useState(false); const [pagingController, setPagingController] = useState({ pageNum: 1, pageSize: 50, }); const [totalCount, setTotalCount] = useState(); const [usernameList, setUsernameList] = useState([]); const [selectedUser, setSelectedUser] = useState(null); // Fetch assignment data const fetchAssignmentData = useCallback(async () => { setIsLoading(true); try { const params = { ...pagingController, ...filterArgs, // Add user filter if selected ...(selectedUser && { assignTo: selectedUser.id }), }; console.log("Fetching with params:", params); const res = await fetchConsoPickOrderClient(params); if (res) { console.log("API response:", res); // Enhance data with user names and add id const enhancedData = res.records.map((record: any, index: number) => { const userName = record.assignTo ? usernameList.find(user => user.id === record.assignTo)?.name : null; return { ...record, id: record.consoCode || `temp-${index}`, assignedUserName: userName || 'Unassigned', }; }); setAssignmentData(enhancedData); setTotalCount(res.total); } } catch (error) { console.error("Error fetching assignment data:", error); } finally { setIsLoading(false); } }, [pagingController, filterArgs, selectedUser, usernameList]); // Load username list useEffect(() => { const loadUsernameList = async () => { try { const res = await fetchNameList(); if (res) { console.log("Loaded username list:", res); setUsernameList(res); } } catch (error) { console.error("Error loading username list:", error); } }; loadUsernameList(); }, []); // Fetch data when dependencies change useEffect(() => { fetchAssignmentData(); }, [fetchAssignmentData]); // Handle user selection const handleUserChange = useCallback((event: any, newValue: NameList | null) => { setSelectedUser(newValue); // Reset to first page when filtering setPagingController(prev => ({ ...prev, pageNum: 1 })); }, []); // Clear filter const handleClearFilter = useCallback(() => { setSelectedUser(null); setPagingController(prev => ({ ...prev, pageNum: 1 })); }, []); // Columns definition const columns = useMemo[]>( () => [ { name: "consoCode", label: t("Consolidated Code"), }, { name: "assignedUserName", label: t("Assigned To"), renderCell: (params) => { if (!params.assignTo) { return ( {t("Unassigned")} ); } return ( {params.assignedUserName} ); }, }, { name: "status", label: t("Status"), renderCell: (params) => { return upperFirst(params.status); }, }, { name: "releasedDate", label: t("Released Date"), renderCell: (params) => { if (!params.releasedDate) { return ( {t("Not Released")} ); } return arrayToDateString(params.releasedDate); }, }, ], [t], ); return ( {/* Filter Section */} option.name} value={selectedUser} onChange={handleUserChange} renderInput={(params) => ( )} renderOption={(props, option) => ( {option.name} (ID: {option.id}) )} /> {/* Data Table - Match PickExecution exactly */} {isLoading ? ( ) : ( items={assignmentData} columns={columns} pagingController={pagingController} setPagingController={setPagingController} totalCount={totalCount} /> )} ); }; export default AssignTo;