diff --git a/src/app/production/project-flock/chickin/add/page.tsx b/src/app/production/project-flock/chickin/add/page.tsx index 3ca09c89..bcb4d612 100644 --- a/src/app/production/project-flock/chickin/add/page.tsx +++ b/src/app/production/project-flock/chickin/add/page.tsx @@ -11,10 +11,6 @@ const AddChickin = () => { return ( <>
-
diff --git a/src/components/pages/production/chickin/form/ChickinForm.tsx b/src/components/pages/production/chickin/form/ChickinForm.tsx index 1ed33b2c..1f56459f 100644 --- a/src/components/pages/production/chickin/form/ChickinForm.tsx +++ b/src/components/pages/production/chickin/form/ChickinForm.tsx @@ -45,7 +45,7 @@ const ChickinFormKandang = ({ return (
diff --git a/src/components/pages/production/chickin/form/tabs/ChickLogsView.tsx b/src/components/pages/production/chickin/form/tabs/ChickLogsView.tsx index bb368c67..8accf9ae 100644 --- a/src/components/pages/production/chickin/form/tabs/ChickLogsView.tsx +++ b/src/components/pages/production/chickin/form/tabs/ChickLogsView.tsx @@ -3,6 +3,7 @@ import Button from '@/components/Button'; import Card from '@/components/Card'; import { useModal } from '@/components/Modal'; import ConfirmationModal from '@/components/modal/ConfirmationModal'; +import ConfirmationModalWithNotes from '@/components/modal/ConfirmationModalWithNotes'; import PillBadge from '@/components/PillBadge'; import Table from '@/components/Table'; import { isResponseError, isResponseSuccess } from '@/lib/api-helper'; @@ -31,12 +32,13 @@ const ChickinLogsView = ({ confirmModal.openModal(); }; - const confirmationModalApproveClickHandler = async () => { + const confirmationModalApproveClickHandler = async (notes?: string) => { setChickinErrorMessage(''); setIsApproveLoading(true); const approveChickinRes = await ChickinApi.singleApproval( initialValues?.id as number, - 'APPROVED' + 'APPROVED', + notes ); if (isResponseSuccess(approveChickinRes)) { toast.success(approveChickinRes?.message as string); @@ -151,7 +153,7 @@ const ChickinLogsView = ({
)} - { + confirmationModalApproveClickHandler(notes); + }, isLoading: isApproveLoading, }} /> diff --git a/src/components/pages/production/project-flock/ProjectFlockTable.tsx b/src/components/pages/production/project-flock/ProjectFlockTable.tsx index 7c7c70ed..b455725e 100644 --- a/src/components/pages/production/project-flock/ProjectFlockTable.tsx +++ b/src/components/pages/production/project-flock/ProjectFlockTable.tsx @@ -6,6 +6,7 @@ import DebouncedTextInput from '@/components/input/DebouncedTextInput'; import SelectInput, { OptionType } from '@/components/input/SelectInput'; import { 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'; @@ -144,6 +145,9 @@ const ProjectFlockTable = () => { useState(); const deleteModal = useModal(); const confirmModal = useModal(); + const [approvalAction, setApprovalAction] = useState<'APPROVED' | 'REJECTED'>( + 'APPROVED' + ); const [isDeleteLoading, setIsDeleteLoading] = useState(false); const [isApproveLoading, setIsApproveLoading] = useState(false); @@ -226,18 +230,21 @@ const ProjectFlockTable = () => { updateFilter('search', e.target.value); }; - const confirmationModalApproveClickHandler = async () => { + const confirmApprovalHandler = async ( + notes: string, + approvalAction: 'APPROVED' | 'REJECTED' + ) => { setIsApproveLoading(true); - const approveProjectFlockRes = await ProjectFlockApi.customRequest< - BaseApiResponse, - ProjectFlockApprovalPayload - >(`/approvals`, { - method: 'POST', - payload: { - action: 'APPROVED', - approvable_ids: selectedRowIds.map((id) => id), - }, - }); + const approveProjectFlockRes = + approvalAction === 'APPROVED' + ? await ProjectFlockApi.bulkApprove( + selectedRowIds.map((id) => id), + notes + ) + : await ProjectFlockApi.bulkReject( + selectedRowIds.map((id) => id), + notes + ); if (isResponseSuccess(approveProjectFlockRes)) { toast.success('Project Flock berhasil di-approve!'); @@ -271,6 +278,7 @@ const ProjectFlockTable = () => { variant='outline' color='success' onClick={() => { + setApprovalAction('APPROVED'); confirmModal.openModal(); }} disabled={selectedRowIds.length === 0} @@ -279,6 +287,19 @@ const ProjectFlockTable = () => { Approve +
{ }} /> - { + confirmApprovalHandler(notes, approvalAction); + }, isLoading: isApproveLoading, }} /> diff --git a/src/components/pages/production/project-flock/chickin/ProjectFlockChickinDetail.tsx b/src/components/pages/production/project-flock/chickin/ProjectFlockChickinDetail.tsx index 68b1343a..3028edfd 100644 --- a/src/components/pages/production/project-flock/chickin/ProjectFlockChickinDetail.tsx +++ b/src/components/pages/production/project-flock/chickin/ProjectFlockChickinDetail.tsx @@ -20,6 +20,7 @@ import { Icon } from '@iconify/react'; import { useRouter } from 'next/navigation'; import { useEffect, useState } from 'react'; import useSWR from 'swr'; +import { FormHeader } from '@/components/helper/form/FormHeader'; const ProjectFlockChickinDetail = ({ projectFlockId, @@ -100,6 +101,10 @@ const ProjectFlockChickinDetail = ({ }, [projectFlockId, listProjectFlock]); return ( <> +
projectFlock?.period, + header: 'Periode', + }, { accessorKey: 'approval.step_name', header: 'Status', diff --git a/src/components/pages/production/project-flock/form/ProjectFlockForm.tsx b/src/components/pages/production/project-flock/form/ProjectFlockForm.tsx index 62c66cea..63bfc079 100644 --- a/src/components/pages/production/project-flock/form/ProjectFlockForm.tsx +++ b/src/components/pages/production/project-flock/form/ProjectFlockForm.tsx @@ -41,6 +41,7 @@ import ApprovalSteps, { useApprovalSteps, } from '@/components/pages/ApprovalSteps'; import { PROJECT_FLOCK_APPROVAL_LINE } from '@/config/approval-line'; +import ConfirmationModalWithNotes from '@/components/modal/ConfirmationModalWithNotes'; interface ProjectFlockFormProps { formType?: 'add' | 'edit' | 'detail'; @@ -71,8 +72,11 @@ const ProjectFlockForm = ({ const [optionsKandang, setOptionsKandang] = useState( initialValues?.kandangs ?? [] ); - const [selectedFlock, setSelectedFlock] = useState( - initialValues?.flock?.id ?? 0 + const [selectedFlock, setSelectedFlock] = useState( + initialValues?.flock_name?.slice( + 0, + initialValues?.flock_name?.lastIndexOf(' ') + ) ?? '' ); const deleteModal = useModal(); @@ -101,9 +105,13 @@ const ProjectFlockForm = ({ useEffect(() => { if (initialValues?.approval?.step_name) { - const approvedDisabled = initialValues.approval.step_name !== 'Pengajuan'; + const pengajuanRejected = + initialValues.approval.step_number == 1 && + initialValues.approval.action == 'REJECTED'; + const approvedDisabled = + initialValues.approval.step_number !== 1 || pengajuanRejected; setIsApprovedDisabled(approvedDisabled); - setIsRejectedDisabled(!approvedDisabled); + setIsRejectedDisabled(!approvedDisabled || pengajuanRejected); setApprovalAction(!approvedDisabled ? 'APPROVED' : 'REJECTED'); } }, [initialValues]); @@ -470,32 +478,23 @@ const ProjectFlockForm = ({ setIsDeleteLoading(false); }; - const confirmationModalClickHandler = async ({ - action = 'APPROVED', - }: { - action: 'APPROVED' | 'REJECTED'; - }) => { + const confirmApprovalHandler = async ( + notes: string, + approvalAction: 'REJECTED' | 'APPROVED' + ) => { if (initialValues?.id === undefined) return; setIsApproveLoading(true); - const approveProjectFlockRes = await ProjectFlockApi.customRequest< - BaseApiResponse, - ProjectFlockApprovalPayload - >(`/approvals`, { - method: 'POST', - payload: { - action: action, - approvable_ids: [initialValues?.id], - }, - }); - if (isResponseSuccess(approveProjectFlockRes)) { - if (refreshProjectFlocks) { - await refreshProjectFlocks(); - } - toast.success(approveProjectFlockRes.message as string); + const approvalRes = + approvalAction == 'APPROVED' + ? await ProjectFlockApi.approve(initialValues?.id, notes) + : await ProjectFlockApi.reject(initialValues?.id, notes); + if (isResponseSuccess(approvalRes)) { + refreshProjectFlocks?.(); + toast.success(approvalRes.message as string); } - if (isResponseError(approveProjectFlockRes)) { - toast.error(approveProjectFlockRes?.message as string); + if (isResponseError(approvalRes)) { + toast.error(approvalRes?.message as string); } refreshApprovals(); confirmModal.closeModal(); @@ -600,7 +599,7 @@ const ProjectFlockForm = ({
Informasi Umum
- + {selectedFlock}
{ + return flock.label === selectedFlock; + })?.value, + } as OptionType) + : undefined + } onChange={(val) => { optionChangeHandler(val, 'flock'); - setSelectedFlock((val as OptionType)?.value as number); + setSelectedFlock((val as OptionType)?.label as string); formik.setFieldValue( 'flock_name', (val as OptionType)?.label @@ -816,7 +824,7 @@ const ProjectFlockForm = ({ }} /> - { - confirmationModalClickHandler({ - action: approvalAction, - }); + onClick: (notes) => { + confirmApprovalHandler(notes, approvalAction); }, }} /> diff --git a/src/services/api/production/chickin.ts b/src/services/api/production/chickin.ts index 39eb2501..31221ed1 100644 --- a/src/services/api/production/chickin.ts +++ b/src/services/api/production/chickin.ts @@ -21,7 +21,8 @@ export class ChickinService extends BaseApiService< */ async singleApproval( id: number, - action: 'APPROVED' | 'REJECTED' + action: 'APPROVED' | 'REJECTED', + notes?: string ): Promise | undefined> { try { const path = `${this.basePath}/approvals`; @@ -30,7 +31,7 @@ export class ChickinService extends BaseApiService< body: { action: action, approvable_ids: [id], - notes: `${action} chickin ${id}`, + notes: notes ?? `${action} chickin ${id}`, }, }); } catch (error) { diff --git a/src/services/api/production/project-flock.ts b/src/services/api/production/project-flock.ts index 03d29a56..e8b23602 100644 --- a/src/services/api/production/project-flock.ts +++ b/src/services/api/production/project-flock.ts @@ -120,7 +120,7 @@ export class ProjectFlockService extends BaseApiService< | undefined > { try { - const path = `${this.basePath}/kandangs/${locationId.toString()}/periods`; + const path = `${this.basePath}/location/${locationId.toString()}/periods`; return await httpClient< SuccessApiResponse< { @@ -145,36 +145,40 @@ export class ProjectFlockService extends BaseApiService< * Approve single Project Flock */ async approve( - id: number + id: number, + notes?: string ): Promise | undefined> { - return await this.bulkApprovalAction([id], 'APPROVED'); + return await this.bulkApprovalAction([id], 'APPROVED', notes); } /** * Reject single Project Flock */ async reject( - id: number + id: number, + notes?: string ): Promise | undefined> { - return await this.bulkApprovalAction([id], 'REJECTED'); + return await this.bulkApprovalAction([id], 'REJECTED', notes); } /** * Approve Bulk Project Flock */ async bulkApprove( - ids: number[] + ids: number[], + notes?: string ): Promise | undefined> { - return await this.bulkApprovalAction(ids, 'APPROVED'); + return await this.bulkApprovalAction(ids, 'APPROVED', notes); } /** * Reject Bulk Project Flock */ async bulkReject( - ids: number[] + ids: number[], + notes?: string ): Promise | undefined> { - return await this.bulkApprovalAction(ids, 'REJECTED'); + return await this.bulkApprovalAction(ids, 'REJECTED', notes); } /** @@ -182,7 +186,8 @@ export class ProjectFlockService extends BaseApiService< */ async bulkApprovalAction( ids: number[], - action: 'APPROVED' | 'REJECTED' + action: 'APPROVED' | 'REJECTED', + notes?: string ): Promise | undefined> { try { const path = `${this.basePath}/approvals`; @@ -191,7 +196,7 @@ export class ProjectFlockService extends BaseApiService< body: { action: action, approvable_ids: ids, - notes: `Bulk ${action} Project Flock ${ids.join(', ')}`, + notes: notes ?? `Bulk ${action} Project Flock ${ids.join(', ')}`, }, }); } catch (error) {