mirror of
https://gitlab.com/mbugroup/lti-web-client.git
synced 2026-05-20 13:32:00 +00:00
feat(FE-149): integrate TransferToLayingForm to API
This commit is contained in:
+373
-156
@@ -1,6 +1,6 @@
|
||||
'use client';
|
||||
|
||||
import { useCallback, useEffect, useMemo, useState } from 'react';
|
||||
import { useCallback, useEffect, useState } from 'react';
|
||||
import { useRouter } from 'next/navigation';
|
||||
import { useFormik } from 'formik';
|
||||
import { toast } from 'react-hot-toast';
|
||||
@@ -8,16 +8,23 @@ import useSWR from 'swr';
|
||||
|
||||
import { Icon } from '@iconify/react';
|
||||
import Button from '@/components/Button';
|
||||
import TextInput from '@/components/input/TextInput';
|
||||
import SelectInput, {
|
||||
OptionType,
|
||||
// useSelect,
|
||||
useSelect,
|
||||
} from '@/components/input/SelectInput';
|
||||
import TextArea from '@/components/input/TextArea';
|
||||
import { useModal } from '@/components/Modal';
|
||||
import ConfirmationModal from '@/components/modal/ConfirmationModal';
|
||||
import DateInput from '@/components/input/DateInput';
|
||||
import NumberInput from '@/components/input/NumberInput';
|
||||
import ConfirmationModalWithNotes from '@/components/modal/ConfirmationModalWithNotes';
|
||||
import ApprovalSteps, {
|
||||
formatGroupedApprovalsToApprovalSteps,
|
||||
} from '@/components/pages/ApprovalSteps';
|
||||
|
||||
import {
|
||||
getFilledTransferToLayingFormInitialValues,
|
||||
getTransferToLayingFormInitialValues,
|
||||
TransferToLayingFormSchema,
|
||||
TransferToLayingFormValues,
|
||||
UpdateTransferToLayingFormSchema,
|
||||
@@ -31,6 +38,8 @@ import {
|
||||
import { cn } from '@/lib/helper';
|
||||
|
||||
import { TransferToLayingApi } from '@/services/api/production/transfer-to-laying';
|
||||
import { ProjectFlock } from '@/types/api/production/project-flock';
|
||||
import { TRANSFER_TO_LAYING_APPROVAL_LINE } from '@/config/approval-line';
|
||||
|
||||
interface TransferToLayingFormProps {
|
||||
type?: 'add' | 'edit' | 'detail';
|
||||
@@ -55,11 +64,23 @@ const TransferToLayingForm = ({
|
||||
const [isApproveLoading, setIsApproveLoading] = useState(false);
|
||||
const [isRejectLoading, setIsRejectLoading] = useState(false);
|
||||
|
||||
const { data: approvalHistory, isLoading: isLoadingApprovalHistory } = useSWR(
|
||||
type === 'detail' && initialValues ? [String(initialValues.id)] : null,
|
||||
([id]: string[]) => TransferToLayingApi.getApprovalHistory(Number(id))
|
||||
);
|
||||
|
||||
const createTransferToLayingHandler = useCallback(
|
||||
async (payload: CreateTransferToLayingPayload) => {
|
||||
console.log('Create transfer to laying:', { payload });
|
||||
const createTransferToLayingRes =
|
||||
await TransferToLayingApi.create(payload);
|
||||
|
||||
toast.success('Berhasil menambahkan data transfer ke laying!');
|
||||
if (isResponseError(createTransferToLayingRes)) {
|
||||
setFormErrorMessage(createTransferToLayingRes.message);
|
||||
return;
|
||||
}
|
||||
|
||||
toast.success(createTransferToLayingRes?.message as string);
|
||||
router.push('/production/transfer-to-laying');
|
||||
},
|
||||
[router]
|
||||
);
|
||||
@@ -69,46 +90,30 @@ const TransferToLayingForm = ({
|
||||
transferToLayingId: number,
|
||||
payload: UpdateTransferToLayingPayload
|
||||
) => {
|
||||
console.log(
|
||||
`Update transfer to laying with ID of ${transferToLayingId}:`,
|
||||
{ payload }
|
||||
const updateKandangRes = await TransferToLayingApi.update(
|
||||
transferToLayingId,
|
||||
payload
|
||||
);
|
||||
|
||||
toast.success('Berhasil mengubah data transfer ke laying!');
|
||||
if (updateKandangRes?.status === 'error') {
|
||||
setFormErrorMessage(updateKandangRes.message);
|
||||
return;
|
||||
}
|
||||
|
||||
toast.success(updateKandangRes?.message as string);
|
||||
router.refresh();
|
||||
router.push('/production/transfer-to-laying');
|
||||
},
|
||||
[router]
|
||||
);
|
||||
|
||||
const formikInitialValues = useMemo<TransferToLayingFormValues>(() => {
|
||||
return {
|
||||
transfer_date: initialValues?.transfer_date ?? '',
|
||||
flockSource: initialValues?.flock_source
|
||||
? {
|
||||
value: initialValues?.flock_source.id,
|
||||
label: initialValues?.flock_source.name,
|
||||
}
|
||||
: undefined,
|
||||
flockDestination: initialValues?.flock_destination
|
||||
? {
|
||||
value: initialValues?.flock_destination.id,
|
||||
label: initialValues?.flock_destination.name,
|
||||
}
|
||||
: undefined,
|
||||
totalQuantity: initialValues?.quantity ?? undefined,
|
||||
// const formikInitialValues = useMemo<TransferToLayingFormValues>(() => {
|
||||
// return getTransferToLayingFormInitialValues(initialValues);
|
||||
// }, [initialValues]);
|
||||
|
||||
kandangs: initialValues?.kandangs
|
||||
? initialValues.kandangs.map((kandang) => ({
|
||||
kandang: {
|
||||
value: kandang.kandang.id,
|
||||
label: kandang.kandang.name,
|
||||
},
|
||||
quantity: kandang.quantity,
|
||||
}))
|
||||
: [],
|
||||
|
||||
reason: initialValues?.reason ?? undefined,
|
||||
};
|
||||
}, [initialValues]);
|
||||
const [formikInitialValues, setFormikInitialValues] = useState(
|
||||
getTransferToLayingFormInitialValues()
|
||||
);
|
||||
|
||||
const formik = useFormik<TransferToLayingFormValues>({
|
||||
initialValues: formikInitialValues,
|
||||
@@ -117,23 +122,23 @@ const TransferToLayingForm = ({
|
||||
? UpdateTransferToLayingFormSchema
|
||||
: TransferToLayingFormSchema,
|
||||
onSubmit: async (values) => {
|
||||
console.log({ values });
|
||||
|
||||
setFormErrorMessage('');
|
||||
|
||||
const transferToLayingPayload: CreateTransferToLayingPayload = {
|
||||
transfer_date: values.transfer_date as string,
|
||||
flock_source_id: values.flockSource?.value as number,
|
||||
flock_destination_id: values.flockDestination?.value as number,
|
||||
source_project_flock_id: values.flockSource?.value as number,
|
||||
target_project_flock_id: values.flockDestination?.value as number,
|
||||
totalQuantity: values.totalQuantity as number,
|
||||
|
||||
kandangs: values.kandangs?.map((kandang) => ({
|
||||
kandang_id: kandang.kandang.value,
|
||||
quantity: kandang.quantity,
|
||||
})) as {
|
||||
kandang_id: number;
|
||||
quantity: number;
|
||||
}[],
|
||||
source_kandangs: values.flockSourceKandangs?.map((kandang) => ({
|
||||
project_flock_kandang_id: kandang.kandang.value,
|
||||
quantity: parseFloat(kandang.quantity as string),
|
||||
})) as CreateTransferToLayingPayload['source_kandangs'],
|
||||
|
||||
target_kandangs: values.flockDestinationKandangs?.map((kandang) => ({
|
||||
project_flock_kandang_id: kandang.kandang.value,
|
||||
quantity: parseFloat(kandang.quantity as string),
|
||||
})) as CreateTransferToLayingPayload['target_kandangs'],
|
||||
|
||||
reason: values.reason as string,
|
||||
};
|
||||
@@ -154,7 +159,11 @@ const TransferToLayingForm = ({
|
||||
});
|
||||
|
||||
const { setValues: formikSetValues, values: formikValues } = formik;
|
||||
const { kandangs: kandangsValue } = formikValues;
|
||||
const {
|
||||
flockSourceKandangs: flockSourceKandangsValue,
|
||||
flockDestinationKandangs: flockDestinationKandangsValue,
|
||||
totalQuantity,
|
||||
} = formikValues;
|
||||
|
||||
const deleteTransferToLayingClickHandler = () => {
|
||||
deleteModal.openModal();
|
||||
@@ -172,24 +181,32 @@ const TransferToLayingForm = ({
|
||||
const confirmationModalDeleteClickHandler = async () => {
|
||||
setIsDeleteLoading(true);
|
||||
|
||||
// TODO: delete data and integrate to real API
|
||||
deleteModal.closeModal();
|
||||
toast.success('Berhasil menghapus data transfer ke laying!');
|
||||
try {
|
||||
await TransferToLayingApi.delete(initialValues?.id as number);
|
||||
|
||||
toast.success('Berhasil menghapus data transfer ke laying!');
|
||||
router.push('/production/transfer-to-laying');
|
||||
} catch (error) {
|
||||
toast.success('Gagal menghapus data transfer ke laying!');
|
||||
} finally {
|
||||
deleteModal.closeModal();
|
||||
setIsDeleteLoading(false);
|
||||
}
|
||||
};
|
||||
|
||||
const confirmationModalApproveClickHandler = async () => {
|
||||
const confirmationModalApproveClickHandler = async (notes: string) => {
|
||||
setIsApproveLoading(true);
|
||||
|
||||
const approveResponse = await TransferToLayingApi.approve(
|
||||
initialValues?.id as number
|
||||
initialValues?.id as number,
|
||||
notes
|
||||
);
|
||||
|
||||
if (isResponseSuccess(approveResponse)) {
|
||||
approveModal.closeModal();
|
||||
|
||||
toast.success('Berhasil approve data transfer ke laying!');
|
||||
router.push('/production/transfer-to-laying');
|
||||
} else {
|
||||
approveModal.closeModal();
|
||||
|
||||
@@ -199,17 +216,19 @@ const TransferToLayingForm = ({
|
||||
setIsApproveLoading(false);
|
||||
};
|
||||
|
||||
const confirmationModalRejectClickHandler = async () => {
|
||||
const confirmationModalRejectClickHandler = async (notes: string) => {
|
||||
setIsRejectLoading(true);
|
||||
|
||||
const rejectResponse = await TransferToLayingApi.reject(
|
||||
initialValues?.id as number
|
||||
initialValues?.id as number,
|
||||
notes
|
||||
);
|
||||
|
||||
if (isResponseSuccess(rejectResponse)) {
|
||||
rejectModal.closeModal();
|
||||
|
||||
toast.success('Berhasil reject data transfer ke laying!');
|
||||
router.push('/production/transfer-to-laying');
|
||||
} else {
|
||||
rejectModal.closeModal();
|
||||
|
||||
@@ -219,49 +238,47 @@ const TransferToLayingForm = ({
|
||||
setIsRejectLoading(false);
|
||||
};
|
||||
|
||||
const isRepeaterInputError = (
|
||||
column: keyof TransferToLayingFormValues['kandangs'][0],
|
||||
// flock source
|
||||
const isFlockSourceKandangsRepeaterInputError = (
|
||||
column: keyof TransferToLayingFormValues['flockSourceKandangs'][0],
|
||||
idx: number
|
||||
) => {
|
||||
return (
|
||||
formik.touched.kandangs?.[idx]?.[column] &&
|
||||
formik.touched.flockSourceKandangs?.[idx]?.[column] &&
|
||||
Boolean(
|
||||
formik.errors.kandangs?.[idx] instanceof Object &&
|
||||
formik.errors.kandangs?.[idx]?.[column]
|
||||
formik.errors.flockSourceKandangs?.[idx] instanceof Object &&
|
||||
formik.errors.flockSourceKandangs?.[idx]?.[column]
|
||||
)
|
||||
);
|
||||
};
|
||||
|
||||
const repeaterInputErrorMessage = (
|
||||
column: keyof TransferToLayingFormValues['kandangs'][0],
|
||||
const flockSourceKandangsRepeaterInputErrorMessage = (
|
||||
column: keyof TransferToLayingFormValues['flockSourceKandangs'][0],
|
||||
idx: number
|
||||
) => {
|
||||
return (formik.errors.kandangs?.[idx] as Record<string, string>)?.[column];
|
||||
return (
|
||||
formik.errors.flockSourceKandangs?.[idx] as Record<string, string>
|
||||
)?.[column];
|
||||
};
|
||||
|
||||
// TODO: remove dummy data and use real data
|
||||
// Flock Source
|
||||
// const {
|
||||
// inputValue: flockSourceInputValue,
|
||||
// setInputValue: setFlockSourceInputValue,
|
||||
// options: flockSourceOptions,
|
||||
// isLoadingOptions: isLoadingFlockSourceOptions,
|
||||
// } = useSelect<FlockWithKandangs>('/transfer-to-laying/production/get-flock-source', 'id', 'name');
|
||||
|
||||
// TODO: remove this dummy data
|
||||
const { data: flockSources, isLoading: isLoadingFlockSourceOptions } = useSWR(
|
||||
'test',
|
||||
() => TransferToLayingApi.getFlockSource()
|
||||
const {
|
||||
setInputValue: setFlockSourceInputValue,
|
||||
options: flockSourceOptions,
|
||||
isLoadingOptions: isLoadingFlockSourceOptions,
|
||||
rawData: flockSources,
|
||||
} = useSelect<ProjectFlock>(
|
||||
'/production/project-flocks',
|
||||
'id',
|
||||
'flock_name',
|
||||
'search',
|
||||
{
|
||||
category: 'GROWING',
|
||||
}
|
||||
);
|
||||
|
||||
const flockSourceOptions = isResponseSuccess(flockSources)
|
||||
? flockSources?.data.map((flockSource) => ({
|
||||
value: flockSource.id,
|
||||
label: flockSource.name,
|
||||
}))
|
||||
: [];
|
||||
|
||||
const flockSourceChangeHandler = (val: OptionType | OptionType[] | null) => {
|
||||
const flockSourceChangeHandler = async (
|
||||
val: OptionType | OptionType[] | null
|
||||
) => {
|
||||
// Get flock source data for total quantity and kandang
|
||||
const flockSource =
|
||||
isResponseSuccess(flockSources) && val !== null
|
||||
@@ -272,21 +289,38 @@ const TransferToLayingForm = ({
|
||||
|
||||
// Set total quantity and kandangs
|
||||
if (flockSource) {
|
||||
const mappedFlockKandangsAvailableQty =
|
||||
await TransferToLayingApi.getMappedFlockKandangsAvailability(
|
||||
flockSource.id
|
||||
);
|
||||
|
||||
const formattedKandangs = flockSource.kandangs.map((item) => ({
|
||||
kandang: {
|
||||
value: item.kandang.id,
|
||||
label: item.kandang.name,
|
||||
value: item.project_flock_kandang_id,
|
||||
label: item.name,
|
||||
},
|
||||
quantity: '',
|
||||
maxQuantity: item.quantity,
|
||||
maxQuantity:
|
||||
(mappedFlockKandangsAvailableQty &&
|
||||
mappedFlockKandangsAvailableQty[item.project_flock_kandang_id]
|
||||
.available_qty) ??
|
||||
0,
|
||||
}));
|
||||
|
||||
formik.setFieldValue('totalQuantity', flockSource.totalQuantity);
|
||||
formik.setFieldValue('maxTotalQuantity', flockSource.totalQuantity);
|
||||
formik.setFieldValue('kandangs', formattedKandangs);
|
||||
let maxTotalQuantity = 0;
|
||||
// flockSource.kandangs.forEach((item) => {
|
||||
// maxTotalQuantity += item.capacity;
|
||||
// });
|
||||
formattedKandangs.forEach((item) => {
|
||||
maxTotalQuantity += item.maxQuantity;
|
||||
});
|
||||
|
||||
formik.setFieldValue('totalQuantity', '');
|
||||
formik.setFieldValue('maxTotalQuantity', maxTotalQuantity);
|
||||
formik.setFieldValue('flockSourceKandangs', formattedKandangs);
|
||||
} else {
|
||||
formik.setFieldValue('totalQuantity', undefined);
|
||||
formik.setFieldValue('kandangs', undefined);
|
||||
formik.setFieldValue('flockSourceKandangs', undefined);
|
||||
formik.setFieldValue('reason', '');
|
||||
}
|
||||
|
||||
@@ -294,52 +328,137 @@ const TransferToLayingForm = ({
|
||||
formik.setFieldValue('flockSource', val);
|
||||
};
|
||||
|
||||
// TODO: remove dummy data and use real data
|
||||
// Flock Destination
|
||||
// const {
|
||||
// inputValue: flockDestinationInputValue,
|
||||
// setInputValue: setFlockDestinationInputValue,
|
||||
// options: flockDestinationOptions,
|
||||
// isLoadingOptions: isLoadingFlockDestinationOptions,
|
||||
// } = useSelect<FlockWithKandangs>('/transfer-to-laying/production/get-flock-destination', 'id', 'name');
|
||||
// flock destination
|
||||
const isFlockDestinationKandangsRepeaterInputError = (
|
||||
column: keyof TransferToLayingFormValues['flockDestinationKandangs'][0],
|
||||
idx: number
|
||||
) => {
|
||||
return (
|
||||
formik.touched.flockDestinationKandangs?.[idx]?.[column] &&
|
||||
Boolean(
|
||||
formik.errors.flockDestinationKandangs?.[idx] instanceof Object &&
|
||||
formik.errors.flockDestinationKandangs?.[idx]?.[column]
|
||||
)
|
||||
);
|
||||
};
|
||||
|
||||
const flockDestinationKandangsRepeaterInputErrorMessage = (
|
||||
column: keyof TransferToLayingFormValues['flockDestinationKandangs'][0],
|
||||
idx: number
|
||||
) => {
|
||||
return (
|
||||
formik.errors.flockDestinationKandangs?.[idx] as Record<string, string>
|
||||
)?.[column];
|
||||
};
|
||||
|
||||
// TODO: remove this dummy data
|
||||
const {
|
||||
data: flockDestinations,
|
||||
isLoading: isLoadingFlockDestinationOptions,
|
||||
} = useSWR('test', () => TransferToLayingApi.getFlockSource());
|
||||
|
||||
const flockDestinationOptions = isResponseSuccess(flockDestinations)
|
||||
? flockDestinations?.data.map((flockDestination) => ({
|
||||
value: flockDestination.id,
|
||||
label: flockDestination.name,
|
||||
}))
|
||||
: [];
|
||||
setInputValue: setFlockDestinationInputValue,
|
||||
options: flockDestinationOptions,
|
||||
isLoadingOptions: isLoadingFlockDestinationOptions,
|
||||
rawData: flockDestinations,
|
||||
} = useSelect<ProjectFlock>(
|
||||
'/production/project-flocks',
|
||||
'id',
|
||||
'flock_name',
|
||||
'search',
|
||||
{
|
||||
category: 'LAYING',
|
||||
}
|
||||
);
|
||||
|
||||
const flockDestinationChangeHandler = (
|
||||
val: OptionType | OptionType[] | null
|
||||
) => {
|
||||
// Get flock destination data for total quantity and kandang
|
||||
const flockDestination =
|
||||
isResponseSuccess(flockDestinations) && val !== null
|
||||
? flockDestinations.data.find(
|
||||
(item) => item.id === (val as OptionType).value
|
||||
)
|
||||
: undefined;
|
||||
|
||||
// Set total quantity and kandangs
|
||||
if (flockDestination) {
|
||||
const formattedKandangs = flockDestination.kandangs.map((item) => ({
|
||||
kandang: {
|
||||
value: item.project_flock_kandang_id,
|
||||
label: item.name,
|
||||
},
|
||||
quantity: '',
|
||||
|
||||
// TODO: integrate this later to real kandang capacity API
|
||||
// maxQuantity: item.capacity ?? 0,
|
||||
maxQuantity: item.capacity ?? Infinity,
|
||||
}));
|
||||
|
||||
formik.setFieldValue('flockDestinationKandangs', formattedKandangs);
|
||||
}
|
||||
|
||||
formik.setFieldTouched('flockDestination', true);
|
||||
formik.setFieldValue('flockDestination', val);
|
||||
};
|
||||
|
||||
const isShowApproveRejectButton =
|
||||
initialValues &&
|
||||
initialValues?.approval?.step_number === 1 &&
|
||||
initialValues?.approval.action !== 'REJECTED';
|
||||
|
||||
const isShowDeleteButton =
|
||||
initialValues &&
|
||||
initialValues?.approval.action !== 'REJECTED' &&
|
||||
initialValues?.approval.action !== 'APPROVED';
|
||||
|
||||
const isShowEditButton = isShowDeleteButton;
|
||||
|
||||
useEffect(() => {
|
||||
const getFilledInitialValues = async () => {
|
||||
if (initialValues) {
|
||||
const filledInitialValues =
|
||||
await getFilledTransferToLayingFormInitialValues(initialValues);
|
||||
|
||||
setFormikInitialValues(filledInitialValues);
|
||||
}
|
||||
};
|
||||
|
||||
getFilledInitialValues();
|
||||
}, [initialValues, setFormikInitialValues]);
|
||||
|
||||
useEffect(() => {
|
||||
formikSetValues(formikInitialValues);
|
||||
}, [formikSetValues, formikInitialValues]);
|
||||
|
||||
useEffect(() => {
|
||||
// calculate total quantity if kandangs quantity change
|
||||
if (kandangsValue && kandangsValue.length > 0) {
|
||||
if (flockSourceKandangsValue && flockSourceKandangsValue.length > 0) {
|
||||
let newTotalQuantity = 0;
|
||||
|
||||
kandangsValue.forEach((item) => {
|
||||
newTotalQuantity += item.quantity as number;
|
||||
flockSourceKandangsValue.forEach((item) => {
|
||||
newTotalQuantity += parseFloat(item.quantity as string);
|
||||
});
|
||||
|
||||
formik.setFieldValue('totalQuantity', newTotalQuantity);
|
||||
formik.validateField('totalQuantity');
|
||||
}
|
||||
}, [formikSetValues, kandangsValue]);
|
||||
}, [formikSetValues, flockSourceKandangsValue]);
|
||||
|
||||
useEffect(() => {
|
||||
// calculate total quantity if kandangs quantity change
|
||||
if (
|
||||
flockDestinationKandangsValue &&
|
||||
flockDestinationKandangsValue.length > 0
|
||||
) {
|
||||
let destinationKandangsTotalQuantity = 0;
|
||||
|
||||
flockDestinationKandangsValue.forEach((item) => {
|
||||
destinationKandangsTotalQuantity += parseFloat(item.quantity as string);
|
||||
});
|
||||
|
||||
if (
|
||||
destinationKandangsTotalQuantity > parseFloat(String(totalQuantity))
|
||||
) {
|
||||
}
|
||||
}
|
||||
}, [formikSetValues, flockDestinationKandangsValue]);
|
||||
|
||||
return (
|
||||
<>
|
||||
@@ -361,17 +480,38 @@ const TransferToLayingForm = ({
|
||||
</h1>
|
||||
</header>
|
||||
|
||||
<div className='w-full my-4 flex flex-row justify-end gap-2'>
|
||||
{type === 'detail' &&
|
||||
initialValues &&
|
||||
!isLoadingApprovalHistory &&
|
||||
isResponseSuccess(approvalHistory) && (
|
||||
<div className='w-full my-4'>
|
||||
<ApprovalSteps
|
||||
approvals={formatGroupedApprovalsToApprovalSteps(
|
||||
TRANSFER_TO_LAYING_APPROVAL_LINE,
|
||||
approvalHistory.data,
|
||||
initialValues.approval
|
||||
)}
|
||||
/>
|
||||
</div>
|
||||
)}
|
||||
|
||||
<div className='w-full my-4 flex flex-row justify-between gap-2'>
|
||||
{type === 'detail' && (
|
||||
<>
|
||||
{isShowApproveRejectButton && (
|
||||
<div className='w-full flex flex-row justify-end gap-2'>
|
||||
{/* TODO: apply RBAC */}
|
||||
<Button
|
||||
variant='outline'
|
||||
color='success'
|
||||
onClick={approveClickHandler}
|
||||
// disabled={selectedRowIds.length === 0}
|
||||
className='w-full sm:w-fit'
|
||||
>
|
||||
<Icon icon='material-symbols:check' width={24} height={24} />
|
||||
<Icon
|
||||
icon='material-symbols:check'
|
||||
width={24}
|
||||
height={24}
|
||||
/>
|
||||
Approve
|
||||
</Button>
|
||||
|
||||
@@ -379,12 +519,17 @@ const TransferToLayingForm = ({
|
||||
variant='outline'
|
||||
color='error'
|
||||
onClick={rejectClickHandler}
|
||||
// disabled={selectedRowIds.length === 0}
|
||||
className='w-full sm:w-fit'
|
||||
>
|
||||
<Icon icon='material-symbols:close' width={24} height={24} />
|
||||
<Icon
|
||||
icon='material-symbols:close'
|
||||
width={24}
|
||||
height={24}
|
||||
/>
|
||||
Reject
|
||||
</Button>
|
||||
</div>
|
||||
)}
|
||||
</>
|
||||
)}
|
||||
</div>
|
||||
@@ -395,13 +540,12 @@ const TransferToLayingForm = ({
|
||||
className='w-full flex flex-col gap-6'
|
||||
>
|
||||
<div className='flex flex-col gap-4'>
|
||||
<TextInput
|
||||
<DateInput
|
||||
required
|
||||
type='date'
|
||||
label='Tanggal Transfer'
|
||||
name='transfer_date'
|
||||
placeholder='Masukkan tanggal transfer'
|
||||
value={formik.values.transfer_date}
|
||||
value={formik.values.transfer_date ?? ''}
|
||||
onChange={formik.handleChange}
|
||||
onBlur={formik.handleBlur}
|
||||
isError={
|
||||
@@ -421,7 +565,7 @@ const TransferToLayingForm = ({
|
||||
options={flockSourceOptions}
|
||||
onChange={flockSourceChangeHandler}
|
||||
isLoading={isLoadingFlockSourceOptions}
|
||||
// onInputChange={setFlockSourceInputValue}
|
||||
onInputChange={setFlockSourceInputValue}
|
||||
isError={
|
||||
formik.touched.flockSource &&
|
||||
Boolean(typeof formik.errors.flockSource === 'string')
|
||||
@@ -439,7 +583,7 @@ const TransferToLayingForm = ({
|
||||
options={flockDestinationOptions}
|
||||
onChange={flockDestinationChangeHandler}
|
||||
isLoading={isLoadingFlockDestinationOptions}
|
||||
// onInputChange={setFlockDestinationInputValue}
|
||||
onInputChange={setFlockDestinationInputValue}
|
||||
isError={
|
||||
formik.touched.flockDestination &&
|
||||
Boolean(typeof formik.errors.flockDestination === 'string')
|
||||
@@ -450,9 +594,8 @@ const TransferToLayingForm = ({
|
||||
/>
|
||||
</div>
|
||||
|
||||
<TextInput
|
||||
<NumberInput
|
||||
required
|
||||
type='number'
|
||||
name='totalQuantity'
|
||||
label='Jumlah Transfer'
|
||||
bottomLabel={
|
||||
@@ -461,7 +604,9 @@ const TransferToLayingForm = ({
|
||||
: undefined
|
||||
}
|
||||
placeholder='Masukkan jumlah transfer'
|
||||
value={formik.values.totalQuantity ?? ''}
|
||||
value={
|
||||
formik.values.totalQuantity ? formik.values.totalQuantity : ''
|
||||
}
|
||||
onChange={formik.handleChange}
|
||||
onBlur={formik.handleBlur}
|
||||
isError={
|
||||
@@ -469,24 +614,22 @@ const TransferToLayingForm = ({
|
||||
Boolean(formik.errors.totalQuantity)
|
||||
}
|
||||
errorMessage={formik.errors.totalQuantity}
|
||||
// readOnly={type === 'detail'}
|
||||
// disabled={Boolean(formik.errors.flockSource)}
|
||||
disabled
|
||||
/>
|
||||
|
||||
<div>
|
||||
<div className='flex flex-col gap-4'>
|
||||
<div className='overflow-x-auto'>
|
||||
<table className='table'>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Kandang</th>
|
||||
<th>Kandang Flock Asal</th>
|
||||
<th>Kuantitas</th>
|
||||
</tr>
|
||||
</thead>
|
||||
|
||||
<tbody>
|
||||
{(!formik.values.kandangs ||
|
||||
formik.values.kandangs.length === 0) && (
|
||||
{(!formik.values.flockSourceKandangs ||
|
||||
formik.values.flockSourceKandangs.length === 0) && (
|
||||
<tr>
|
||||
<td colSpan={2}>
|
||||
<p className='w-full text-center text-gray-400'>
|
||||
@@ -496,8 +639,8 @@ const TransferToLayingForm = ({
|
||||
</tr>
|
||||
)}
|
||||
|
||||
{formik.values.kandangs &&
|
||||
formik.values.kandangs.map((kandang, idx) => (
|
||||
{formik.values.flockSourceKandangs &&
|
||||
formik.values.flockSourceKandangs.map((kandang, idx) => (
|
||||
<tr key={idx}>
|
||||
<td>
|
||||
<SelectInput
|
||||
@@ -511,10 +654,9 @@ const TransferToLayingForm = ({
|
||||
</td>
|
||||
|
||||
<td>
|
||||
<TextInput
|
||||
<NumberInput
|
||||
required
|
||||
type='number'
|
||||
name={`kandangs[${idx}].quantity`}
|
||||
name={`flockSourceKandangs[${idx}].quantity`}
|
||||
bottomLabel={
|
||||
kandang.maxQuantity
|
||||
? `Max: ${kandang.maxQuantity}`
|
||||
@@ -524,8 +666,11 @@ const TransferToLayingForm = ({
|
||||
value={kandang.quantity}
|
||||
onChange={formik.handleChange}
|
||||
onBlur={formik.handleBlur}
|
||||
isError={isRepeaterInputError('quantity', idx)}
|
||||
errorMessage={repeaterInputErrorMessage(
|
||||
isError={isFlockSourceKandangsRepeaterInputError(
|
||||
'quantity',
|
||||
idx
|
||||
)}
|
||||
errorMessage={flockSourceKandangsRepeaterInputErrorMessage(
|
||||
'quantity',
|
||||
idx
|
||||
)}
|
||||
@@ -540,6 +685,76 @@ const TransferToLayingForm = ({
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
|
||||
<div className='overflow-x-auto'>
|
||||
<table className='table'>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Kandang Flock Tujuan</th>
|
||||
<th>Kuantitas</th>
|
||||
</tr>
|
||||
</thead>
|
||||
|
||||
<tbody>
|
||||
{(!formik.values.flockDestinationKandangs ||
|
||||
formik.values.flockDestinationKandangs.length === 0) && (
|
||||
<tr>
|
||||
<td colSpan={2}>
|
||||
<p className='w-full text-center text-gray-400'>
|
||||
Pilih flock tujuan terlebih dahulu!
|
||||
</p>
|
||||
</td>
|
||||
</tr>
|
||||
)}
|
||||
|
||||
{formik.values.flockDestinationKandangs &&
|
||||
formik.values.flockDestinationKandangs.map(
|
||||
(kandang, idx) => (
|
||||
<tr key={idx}>
|
||||
<td>
|
||||
<SelectInput
|
||||
value={kandang.kandang}
|
||||
options={[]}
|
||||
isDisabled
|
||||
className={{
|
||||
wrapper: 'min-w-52',
|
||||
}}
|
||||
/>
|
||||
</td>
|
||||
|
||||
<td>
|
||||
<NumberInput
|
||||
required
|
||||
name={`flockDestinationKandangs[${idx}].quantity`}
|
||||
bottomLabel={
|
||||
kandang.maxQuantity
|
||||
? `Max: ${kandang.maxQuantity}`
|
||||
: undefined
|
||||
}
|
||||
placeholder='Masukkan kuantitas'
|
||||
value={kandang.quantity}
|
||||
onChange={formik.handleChange}
|
||||
onBlur={formik.handleBlur}
|
||||
isError={isFlockDestinationKandangsRepeaterInputError(
|
||||
'quantity',
|
||||
idx
|
||||
)}
|
||||
errorMessage={flockDestinationKandangsRepeaterInputErrorMessage(
|
||||
'quantity',
|
||||
idx
|
||||
)}
|
||||
readOnly={type === 'detail'}
|
||||
className={{
|
||||
wrapper: 'min-w-52',
|
||||
}}
|
||||
/>
|
||||
</td>
|
||||
</tr>
|
||||
)
|
||||
)}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<TextArea
|
||||
@@ -558,9 +773,21 @@ const TransferToLayingForm = ({
|
||||
/>
|
||||
</div>
|
||||
|
||||
{formErrorMessage && (
|
||||
<div role='alert' className='alert alert-error w-full'>
|
||||
<Icon
|
||||
icon='material-symbols:error-outline'
|
||||
width={24}
|
||||
height={24}
|
||||
/>
|
||||
<span>{formErrorMessage}</span>
|
||||
</div>
|
||||
)}
|
||||
|
||||
<div className='flex flex-row justify-between gap-2 flex-wrap'>
|
||||
{type !== 'add' && (
|
||||
<div className='flex flex-row justify-start gap-2'>
|
||||
{isShowDeleteButton && (
|
||||
<Button
|
||||
type='button'
|
||||
color='error'
|
||||
@@ -575,8 +802,9 @@ const TransferToLayingForm = ({
|
||||
/>
|
||||
Delete
|
||||
</Button>
|
||||
)}
|
||||
|
||||
{type !== 'edit' && (
|
||||
{type !== 'edit' && isShowEditButton && (
|
||||
<Button
|
||||
type='button'
|
||||
color='warning'
|
||||
@@ -617,17 +845,6 @@ const TransferToLayingForm = ({
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
|
||||
{formErrorMessage && (
|
||||
<div role='alert' className='alert alert-error'>
|
||||
<Icon
|
||||
icon='material-symbols:error-outline'
|
||||
width={24}
|
||||
height={24}
|
||||
/>
|
||||
<span>{formErrorMessage}</span>
|
||||
</div>
|
||||
)}
|
||||
</form>
|
||||
</section>
|
||||
|
||||
@@ -650,7 +867,7 @@ const TransferToLayingForm = ({
|
||||
|
||||
{type === 'detail' && (
|
||||
<>
|
||||
<ConfirmationModal
|
||||
<ConfirmationModalWithNotes
|
||||
ref={approveModal.ref}
|
||||
type='success'
|
||||
text='Apakah anda yakin ingin approve data transfer ke laying ini?'
|
||||
@@ -665,7 +882,7 @@ const TransferToLayingForm = ({
|
||||
}}
|
||||
/>
|
||||
|
||||
<ConfirmationModal
|
||||
<ConfirmationModalWithNotes
|
||||
ref={rejectModal.ref}
|
||||
type='error'
|
||||
text='Apakah anda yakin ingin reject data transfer ke laying ini?'
|
||||
|
||||
Reference in New Issue
Block a user