From 429f2b91092df0a13a6e454e944c23702d2d11b2 Mon Sep 17 00:00:00 2001 From: randy-ar Date: Wed, 19 Nov 2025 13:00:21 +0700 Subject: [PATCH] fix(FE): adding capacity to kandang and change confirmation modal marketing with note --- .../modal/ConfirmationModalWithNotes.tsx | 1 + .../pages/marketing/MarketingTable.tsx | 10 ++-- .../marketing/detail/MarketingDetail.tsx | 20 ++++--- .../pages/marketing/form/MarketingForm.tsx | 4 +- .../kandang/form/KandangForm.schema.ts | 58 +++++++++++++------ .../master-data/kandang/form/KandangForm.tsx | 11 ++-- src/services/api/marketing/marketing.ts | 33 +++++++++-- 7 files changed, 97 insertions(+), 40 deletions(-) diff --git a/src/components/modal/ConfirmationModalWithNotes.tsx b/src/components/modal/ConfirmationModalWithNotes.tsx index 3a0111cd..f3403abf 100644 --- a/src/components/modal/ConfirmationModalWithNotes.tsx +++ b/src/components/modal/ConfirmationModalWithNotes.tsx @@ -50,6 +50,7 @@ const ConfirmationModalWithNotes: React.FC = ({ ...primaryButton, onClick: () => { primaryButton?.onClick?.(notes); + setNotes(''); }, }} secondaryButton={secondaryButton} diff --git a/src/components/pages/marketing/MarketingTable.tsx b/src/components/pages/marketing/MarketingTable.tsx index 49a5824f..ea8e369a 100644 --- a/src/components/pages/marketing/MarketingTable.tsx +++ b/src/components/pages/marketing/MarketingTable.tsx @@ -5,6 +5,7 @@ import CheckboxInput from '@/components/input/CheckboxInput'; import { OptionType } from '@/components/input/SelectInput'; import Modal, { useModal } from '@/components/Modal'; import ConfirmationModal from '@/components/modal/ConfirmationModal'; +import ConfirmationModalWithNotes from '@/components/modal/ConfirmationModalWithNotes'; import Table from '@/components/Table'; import RowCollapseOptions from '@/components/table/RowCollapseOptions'; import RowDropdownOptions from '@/components/table/RowDropdownOptions'; @@ -170,7 +171,7 @@ const SalesOrderTable = () => { .filter((row) => row.latest_approval.step_number === 2) .map((row) => row.id); - const approveMarketingHandler = async () => { + const approveMarketingHandler = async (notes: string) => { let idsToProcess: number[] = []; if (approveAction === 'APPROVED') { @@ -191,7 +192,8 @@ const SalesOrderTable = () => { const approveMarketingRes = await SalesOrderApi.bulkApprovals( idsToProcess, - approveAction + approveAction, + notes ); if (isResponseSuccess(approveMarketingRes)) { @@ -450,10 +452,10 @@ const SalesOrderTable = () => { }} /> - { + const confirmationModalApproveClickHandler = async (notes: string) => { setIsLoading(true); const res = await SalesOrderApi.singleApproval( initialValues?.id as number, - approvalAction + approvalAction, + notes ); setIsLoading(false); confirmationModal.closeModal(); @@ -91,13 +93,17 @@ const SalesOrderDetail = ({ refreshApproval?.(); }; - const confirmationModalDeliveryClickHandler = async () => { + const confirmationModalDeliveryClickHandler = async (notes: string) => { setIsLoading(true); - // await MarketingApi.delivery(initialValues?.id as number); + const res = await SalesOrderApi.delivery( + initialValues?.id as number, + notes + ); setIsLoading(false); deliveryModal.closeModal(); - toast.success('Successfully delivered Sales Order!'); + toast.success(res?.message as string); refresh?.(); + refreshApproval?.(); }; return ( @@ -285,7 +291,7 @@ const SalesOrderDetail = ({ onClick: confirmationModalDeleteClickHandler, }} /> - - - {/*
{JSON.stringify(initialValues)}
+
{JSON.stringify(initialValues)}
{JSON.stringify(formik.values)}
-
{JSON.stringify(formik.errors)}
*/} +
{JSON.stringify(formik.errors)}
= + Yup.object({ + name: Yup.string().required('Nama wajib diisi!'), - capacity: Yup.number() - .min(1, 'Kapasitas wajib diisi!') - .required('Kapasitas wajib diisi!'), + locationId: Yup.number() + .min(1, 'Lokasi wajib diisi!') + .required('Lokasi wajib diisi!'), + location: Yup.object({ + value: Yup.number().min(1).required(), + label: Yup.string().required(), + }).nullable(), - picId: Yup.number().min(1, 'PIC wajib diisi!').required('PIC wajib diisi!'), - pic: Yup.object({ - value: Yup.number().min(1).required(), - label: Yup.string().required(), - }).nullable(), -}); + capacity: Yup.number() + .min(1, 'Kapasitas wajib diisi!') + .required('Kapasitas wajib diisi!'), + + picId: Yup.number().min(1, 'PIC wajib diisi!').required('PIC wajib diisi!'), + pic: Yup.object({ + value: Yup.number().min(1).required(), + label: Yup.string().required(), + }).nullable(), + }); export const UpdateKandangFormSchema = KandangFormSchema; diff --git a/src/components/pages/master-data/kandang/form/KandangForm.tsx b/src/components/pages/master-data/kandang/form/KandangForm.tsx index 7753a507..d3a5f460 100644 --- a/src/components/pages/master-data/kandang/form/KandangForm.tsx +++ b/src/components/pages/master-data/kandang/form/KandangForm.tsx @@ -82,7 +82,7 @@ const KandangForm = ({ type = 'add', initialValues }: KandangFormProps) => { label: initialValues.location.name, } : null, - capacity: initialValues?.capacity ?? 0, + capacity: initialValues?.capacity, picId: initialValues?.pic?.id ?? 0, pic: initialValues?.pic ? { @@ -102,9 +102,9 @@ const KandangForm = ({ type = 'add', initialValues }: KandangFormProps) => { const kandangPayload: CreateKandangPayload = { name: values.name, - location_id: values.locationId, - capacity: values.capacity, - pic_id: values.picId, + location_id: values.locationId!, + capacity: values.capacity ? parseInt(values.capacity.toString()) : 0, + pic_id: values.picId!, }; switch (type) { @@ -256,7 +256,8 @@ const KandangForm = ({ type = 'add', initialValues }: KandangFormProps) => { required name='capacity' label='Kapasitas' - value={formik.values.capacity ?? undefined} + placeholder='Masukan kapasitas kandang' + value={formik.values.capacity} onChange={formik.handleChange} onBlur={formik.handleBlur} isError={ diff --git a/src/services/api/marketing/marketing.ts b/src/services/api/marketing/marketing.ts index 5fe4da60..feb3f92d 100644 --- a/src/services/api/marketing/marketing.ts +++ b/src/services/api/marketing/marketing.ts @@ -69,7 +69,8 @@ export class SalesOrderService extends BaseApiService< */ async singleApproval( id: number, - action: 'APPROVED' | 'REJECTED' + action: 'APPROVED' | 'REJECTED', + notes?: string ): Promise | undefined> { try { const path = `${this.basePath}/approvals`; @@ -78,7 +79,7 @@ export class SalesOrderService extends BaseApiService< body: { action: action, approvable_ids: [id], - notes: `${action} marketing ${id}`, + notes: notes || `${action} marketing ${id}`, }, }); } catch (error) { @@ -92,7 +93,8 @@ export class SalesOrderService extends BaseApiService< */ async bulkApprovals( ids: number[], - action: 'APPROVED' | 'REJECTED' + action: 'APPROVED' | 'REJECTED', + notes?: string ): Promise | undefined> { try { const path = `${this.basePath}/approvals`; @@ -101,7 +103,7 @@ export class SalesOrderService extends BaseApiService< body: { action: action, approvable_ids: ids, - notes: `${action} marketing ${ids.join(', ')}`, + notes: notes || `${action} marketing ${ids.join(', ')}`, }, }); } catch (error) { @@ -109,6 +111,29 @@ export class SalesOrderService extends BaseApiService< return undefined; } } + + /** + * Delivery + */ + async delivery( + id: number, + notes?: string + ): Promise | undefined> { + try { + const path = `${this.basePath}/deliveries`; + return await httpClient>(path, { + method: 'POST', + body: { + action: 'APPROVED', + approvable_ids: [id], + notes: notes || `Delivery marketing ${id}`, + }, + }); + } catch (error) { + console.error('Error delivery marketing:', error); + return undefined; + } + } } export const SalesOrderApi = new SalesOrderService('/marketing/sales-orders');