diff --git a/src/components/pages/inventory/movement/form/MovementForm.schema.ts b/src/components/pages/inventory/movement/form/MovementForm.schema.ts index 11c40fe5..7a34dfbd 100644 --- a/src/components/pages/inventory/movement/form/MovementForm.schema.ts +++ b/src/components/pages/inventory/movement/form/MovementForm.schema.ts @@ -1,4 +1,5 @@ import * as Yup from 'yup'; +import { Movement } from '@/types/api/inventory/movement'; export const MovementFormSchema = Yup.object({ alasan_transfer: Yup.string().required('Alasan transfer wajib diisi!'), @@ -66,3 +67,43 @@ export const MovementFormSchema = Yup.object({ export const UpdateMovementFormSchema = MovementFormSchema; export type MovementFormValues = Yup.InferType; + +export const getMovementFormInitialValues = ( + initialValues?: Movement +): MovementFormValues => ({ + alasan_transfer: initialValues?.alasan_transfer ?? '', + tanggal_transfer: initialValues?.tanggal_transfer ?? '', + warehouse_asal: initialValues?.warehouse_asal + ? { + value: initialValues.warehouse_asal.id, + label: initialValues.warehouse_asal.name, + } + : null, + warehouse_asal_id: initialValues?.warehouse_asal?.id ?? 0, + warehouse_tujuan: initialValues?.warehouse_tujuan + ? { + value: initialValues.warehouse_tujuan.id, + label: initialValues.warehouse_tujuan.name, + } + : null, + warehouse_tujuan_id: initialValues?.warehouse_tujuan?.id ?? 0, + product: + initialValues?.product?.map((p) => ({ + product: { value: p.product.id, label: p.product.name }, + product_id: p.product.id, + qty_product: p.qty_product, + })) ?? [], + ekspedisi: + initialValues?.ekspedisi?.map((e) => ({ + product: { value: e.product_id, label: '' }, + product_id: e.product_id, + qty: e.qty, + supplier: { value: e.supplier.id, label: e.supplier.name }, + supplier_id: e.supplier.id, + plat_nomor: e.plat_nomor, + no_surat_jalan: e.no_surat_jalan, + dokumen: e.dokumen, + biaya_ekspedisi: e.biaya_ekspedisi, + nama_sopir: e.nama_sopir, + })) ?? [], +}); diff --git a/src/components/pages/inventory/movement/form/MovementForm.tsx b/src/components/pages/inventory/movement/form/MovementForm.tsx index 0105768d..839b83fe 100644 --- a/src/components/pages/inventory/movement/form/MovementForm.tsx +++ b/src/components/pages/inventory/movement/form/MovementForm.tsx @@ -1,36 +1,33 @@ 'use client'; -import { useCallback, useEffect, useMemo, useState } from 'react'; -import { useRouter } from 'next/navigation'; +import { useEffect, useMemo, useState } from 'react'; import { FieldArray, FormikProvider, useFormik } from 'formik'; -import { toast } from 'react-hot-toast'; import useSWR from 'swr'; import { Icon } from '@iconify/react'; import Button from '@/components/Button'; import TextInput from '@/components/input/TextInput'; import SelectInput, { OptionType } from '@/components/input/SelectInput'; -import { useModal } from '@/components/Modal'; import ConfirmationModal from '@/components/modal/ConfirmationModal'; - +import { FormHeader } from '@/components/helper/form/FormHeader'; +import { FormActions } from '@/components/helper/form/FormActions'; +import { + CreateMovementPayload, + Movement, +} from '@/types/api/inventory/movement'; +import { isResponseSuccess } from '@/lib/api-helper'; import { MovementFormSchema, MovementFormValues, UpdateMovementFormSchema, + getMovementFormInitialValues, } from '@/components/pages/inventory/movement/form/MovementForm.schema'; -import { isResponseError, isResponseSuccess } from '@/lib/api-helper'; -import { - Movement, - CreateMovementPayload, - UpdateMovementPayload, -} from '@/types/api/inventory/movement'; +import { useMovementFormHandlers } from './useMovementFormHandlers'; import { ProductApi, - WarehouseApi, SupplierApi, + WarehouseApi, } from '@/services/api/master-data'; -import { MovementApi } from '@/services/api/inventory'; -import { cn } from '@/lib/helper'; interface MovementFormProps { type?: 'add' | 'edit' | 'detail'; @@ -38,77 +35,20 @@ interface MovementFormProps { } const MovementForm = ({ type = 'add', initialValues }: MovementFormProps) => { - const router = useRouter(); - const deleteModal = useModal(); + const [, setMovementFormErrorMessage] = useState(''); - const [movementFormErrorMessage, setMovementFormErrorMessage] = useState(''); - const [isDeleteLoading, setIsDeleteLoading] = useState(false); - - const createMovementHandler = useCallback( - async (payload: CreateMovementPayload) => { - const res = await MovementApi.create(payload); - if (isResponseError(res)) { - setMovementFormErrorMessage(res.message); - return; - } - toast.success(res?.message as string); - router.push('/inventory/movement'); - }, - [router] - ); - - const updateMovementHandler = useCallback( - async (movementId: number, payload: UpdateMovementPayload) => { - const res = await MovementApi.update(movementId, payload); - if (res?.status === 'error') { - setMovementFormErrorMessage(res.message); - return; - } - toast.success(res?.message as string); - router.refresh(); - router.push('/inventory/movement'); - }, - [router] - ); + const { + deleteModal, + movementFormErrorMessage, + isDeleteLoading, + createMovementHandler, + updateMovementHandler, + deleteMovementClickHandler, + confirmationModalDeleteClickHandler, + } = useMovementFormHandlers(initialValues?.id); const formikInitialValues = useMemo( - () => ({ - alasan_transfer: initialValues?.alasan_transfer ?? '', - tanggal_transfer: initialValues?.tanggal_transfer ?? '', - warehouse_asal: initialValues?.warehouse_asal - ? { - value: initialValues.warehouse_asal.id, - label: initialValues.warehouse_asal.name, - } - : null, - warehouse_asal_id: initialValues?.warehouse_asal?.id ?? 0, - warehouse_tujuan: initialValues?.warehouse_tujuan - ? { - value: initialValues.warehouse_tujuan.id, - label: initialValues.warehouse_tujuan.name, - } - : null, - warehouse_tujuan_id: initialValues?.warehouse_tujuan?.id ?? 0, - product: - initialValues?.product?.map((p) => ({ - product: { value: p.product.id, label: p.product.name }, - product_id: p.product.id, - qty_product: p.qty_product, - })) ?? [], - ekspedisi: - initialValues?.ekspedisi?.map((e) => ({ - product: { value: e.product_id, label: '' }, // Need to fetch product details - product_id: e.product_id, - qty: e.qty, - supplier: { value: e.supplier.id, label: e.supplier.name }, - supplier_id: e.supplier.id, - plat_nomor: e.plat_nomor, - no_surat_jalan: e.no_surat_jalan, - dokumen: e.dokumen, - biaya_ekspedisi: e.biaya_ekspedisi, - nama_sopir: e.nama_sopir, - })) ?? [], - }), + () => getMovementFormInitialValues(initialValues), [initialValues] ); @@ -185,19 +125,6 @@ const MovementForm = ({ type = 'add', initialValues }: MovementFormProps) => { ? suppliers?.data.map((s) => ({ value: s.id, label: s.name })) : []; - const deleteMovementClickHandler = () => { - deleteModal.openModal(); - }; - - const confirmationModalDeleteClickHandler = async () => { - setIsDeleteLoading(true); - await MovementApi.delete(initialValues?.id as number); - deleteModal.closeModal(); - toast.success('Successfully delete Movement!'); - setIsDeleteLoading(false); - router.push('/inventory/movement'); - }; - const { setValues: formikSetValues } = formik; useEffect(() => { @@ -207,22 +134,11 @@ const MovementForm = ({ type = 'add', initialValues }: MovementFormProps) => { return ( <>
-
- -

- {type === 'add' && 'Tambah Movement'} - {type === 'edit' && 'Edit Movement'} - {type === 'detail' && 'Detail Movement'} -

-
- +
{ {({ push, remove }) => ( <> - {typeof formik.errors.product === 'string' && ( -
- {formik.errors.product} -
- )} @@ -433,11 +344,6 @@ const MovementForm = ({ type = 'add', initialValues }: MovementFormProps) => { {({ push, remove }) => ( <> - {typeof formik.errors.ekspedisi === 'string' && ( -
- {formik.errors.ekspedisi} -
- )}
@@ -652,67 +558,16 @@ const MovementForm = ({ type = 'add', initialValues }: MovementFormProps) => { {/* Action buttons */} -
- {type !== 'add' && ( -
- - {type !== 'edit' && ( - - )} -
- )} - {type !== 'detail' && ( -
- - -
- )} -
+ + type={type} + formik={formik} + editUrl={ + initialValues + ? `/inventory/movement/detail/edit/?movementId=${initialValues.id}` + : undefined + } + onDelete={deleteMovementClickHandler} + /> {movementFormErrorMessage && (