'use client'; import BaseButton from '@/components/ui-kit/BaseButton'; import BaseIconButton from '@/components/ui-kit/BaseIconButton'; import { useAuthContext } from '@/context/auth-context'; import { box_requests } from '@/data/box/box.requests'; import { item_requests } from '@/data/item/item.requests'; import { party_requests } from '@/data/party/party.requests'; import { FormValues, RealCreateBoxBodyType, UpdateRealBoxBodyType } from '@/data/real-box/real-box.model'; import { real_box_requests } from '@/data/real-box/real-box.requests'; import { pageLinks } from '@/helpers/constants'; import { useMyNavigation } from '@/hooks/useMyNavigation'; import { useMyTranslation } from '@/hooks/useMyTranslation'; import { notifyUnknownError } from '@/services/notification'; import { AddCircleRounded, Close } from '@mui/icons-material'; import { Box, Checkbox, Chip, CircularProgress, FormControl, FormHelperText, Grid, InputLabel, ListItemText, MenuItem, Select, Stack, styled, Typography, } from '@mui/material'; import { useQuery } from '@tanstack/react-query'; import get from 'lodash.get'; import { useSearchParams } from 'next/navigation'; import { useEffect, useState } from 'react'; import { Controller, useFieldArray, useForm } from 'react-hook-form'; const StyledCreateBox = styled(Box)` .item-row { display: flex; align-items: center; justify-content: space-between; gap: 16px; } & > * { flex: 1 1 1; } `; interface Props { partiesData?: { value: number; label: string }[]; initialValues?: { id?: number; boxId?: string; partyId?: number; partyName?: string; paketIds?: Array; }; } const DashboardCreateRealBoxPage = ({ initialValues, partiesData }: Props) => { const { user } = useAuthContext(); const editMode = !!initialValues?.id; const [keyword, setKeyword] = useState(''); const t = useMyTranslation(); const params = useSearchParams(); const { push } = useMyNavigation(); const [partyId, setPartyId] = useState(''); const [loading, setLoading] = useState(false); console.log(initialValues); const { register, control, handleSubmit, setValue, reset, watch, formState: { errors }, } = useForm({ defaultValues: { partyName: initialValues?.partyName || '', packetItemDtos: initialValues?.paketIds ? initialValues.paketIds.map(paket => ({ packetId: paket.id, itemDtos: paket.items ? paket.items.map((item: any) => item.id) : [], })) : params.get('party_id') ? [{ packetId: +params.get('party_id')!, itemDtos: [] }] : [{ packetId: 0, itemDtos: [] }], id: initialValues?.id, boxId: initialValues?.boxId, partyId: initialValues?.partyId, }, }); useEffect(() => { if (initialValues) { reset({ partyName: initialValues.partyName || '', packetItemDtos: initialValues.paketIds ? initialValues.paketIds.map(paket => ({ packetId: paket.id, itemDtos: paket.items ? paket.items.map((item: any) => item.id) : [], })) : [{ packetId: 0, itemDtos: [] }], id: initialValues.id, boxId: initialValues.boxId, partyId: initialValues.partyId, }); if (initialValues.partyId) { setPartyId(initialValues.partyId); } } }, [initialValues, reset]); const { fields, append, remove } = useFieldArray({ control, name: 'packetItemDtos', keyName: 'key', }); const requiredText = t('required'); // Fetch parties data const { data: parties = [], isLoading: isLoadingParties } = useQuery({ queryKey: ['parties-list', 'COLLECTING'], queryFn: () => party_requests.getAll({ status: 'COLLECTING' }), select: data => data.data.data.data.map((p: any) => ({ id: p.id, name: p.name, })), }); // Fetch packets data const { data: packets = [], isLoading: isLoadingPackets } = useQuery({ queryKey: ['packets-list', partyId, keyword], queryFn: () => box_requests.getAll({ partyId: partyId, cargoId: keyword, }), select: data => data?.data?.data?.data.filter((box: any) => box.status === 'READY_TO_INVOICE') ?? [], enabled: !!partyId, }); const onSubmit = handleSubmit(async values => { try { setLoading(true); if (editMode) { const updateBody: UpdateRealBoxBodyType = { boxId: initialValues!.boxId!, partyName: values.partyName, packetItemDtos: values.packetItemDtos.map(packet => ({ packetId: packet.packetId, itemDtos: packet.itemDtos, })), }; await real_box_requests.update(updateBody); } else { const createBody: RealCreateBoxBodyType = { partyName: values.partyName, packetItemDtos: values.packetItemDtos.map(packet => ({ packetId: packet.packetId, itemDtos: packet.itemDtos, })), }; await real_box_requests.create(createBody); } push(pageLinks.dashboard.real_boxes.index); } catch (error) { notifyUnknownError(error); } finally { setLoading(false); } }); const handlePartyChange = (event: any) => { const selectedParty = parties.find(p => p.id === event.target.value); if (selectedParty) { setValue('partyName', selectedParty.name); setPartyId(selectedParty.id); setKeyword(''); setValue('packetItemDtos', [{ packetId: 0, itemDtos: [] }]); } }; const handlePacketChange = (index: number, value: number) => { setValue(`packetItemDtos.${index}.packetId`, value); setValue(`packetItemDtos.${index}.itemDtos`, []); }; const appendPacket = () => { append({ packetId: 0, itemDtos: [] }); }; const removePacket = (index: number) => { remove(index); }; // Component for each packet row to isolate product selection const PacketRow = ({ index, field }: { index: number; field: any }) => { const packetId = watch(`packetItemDtos.${index}.packetId`); // Fetch products specific to this packet const { data: products, isLoading: isLoadingProducts } = useQuery({ queryKey: ['product-list', packetId], queryFn: () => item_requests.list({ packetId }), select: data => data?.data?.data.data ?? [], enabled: !!packetId, }); return (
{t('packet')}
{t('packet')} ( )} /> {!!get(errors, `packetItemDtos.${index}.packetId`) && ( {requiredText} )}
{fields.length > 1 && ( removePacket(index)} > )}
{packetId && ( {t('products')} {isLoadingProducts ? ( ) : ( ( { if (e.target.checked) { setValue(`packetItemDtos.${index}.itemDtos`, products?.map(p => p.id) || []); } else { setValue(`packetItemDtos.${index}.itemDtos`, []); } }} indeterminate={ watch(`packetItemDtos.${index}.itemDtos`)?.length > 0 && watch(`packetItemDtos.${index}.itemDtos`)?.length < products?.length! } /> )} /> {t('select_all')} ( )} /> )} )}
); }; return ( {editMode ? t('update_box') : t('create_box')} {t('party_name')} {t('party_name')} ( )} /> {!!errors.partyId && {requiredText}}
{fields.map((field, index) => ( ))} } sx={{ mt: 2 }}> {t('add_packet')}
{loading ? : editMode ? t('update_box') : t('create_box')}
); }; export default DashboardCreateRealBoxPage;