refactor(FE): Make vehicle/expedition/transport fields optional

This commit is contained in:
rstubryan
2026-01-15 19:29:03 +07:00
parent 87bf474cf6
commit 228e79bb31
3 changed files with 40 additions and 44 deletions
@@ -185,8 +185,8 @@ const PurchaseOrderAcceptApprovalForm = ({
purchase_item_id: formItem.purchase_item_id || 0,
received_date: formItem.received_date || '',
travel_number: formItem.travel_number || '',
vehicle_number: formItem.vehicle_number || '',
expedition_vendor_id: formItem.expedition_vendor_id || 0,
vehicle_number: formItem.vehicle_number || null,
expedition_vendor_id: formItem.expedition_vendor_id || null,
received_qty:
typeof formItem.received_qty === 'string'
? parseFloat(formItem.received_qty) || 0
@@ -194,10 +194,13 @@ const PurchaseOrderAcceptApprovalForm = ({
transport_per_item:
typeof formItem.transport_per_item === 'string'
? parseFloat(formItem.transport_per_item) || 0
: formItem.transport_per_item || 0,
: formItem.transport_per_item || null,
};
}) || [],
travel_documents: values.travel_documents || [],
travel_documents:
values.travel_documents
?.filter((file): file is File => file instanceof File)
.filter(Boolean) || undefined,
};
switch (type) {
@@ -405,22 +408,13 @@ const PurchaseOrderAcceptApprovalForm = ({
Dokumen Surat Jalan
<span className='text-error'>*</span>
</th>
<th>
Nomor Kendaraan
<span className='text-error'>*</span>
</th>
<th>
Vendor Ekspedisi
<span className='text-error'>*</span>
</th>
<th>Nomor Kendaraan</th>
<th>Vendor Ekspedisi</th>
<th>
Jumlah Diterima
<span className='text-error'>*</span>
</th>
<th>
Transport/Item
<span className='text-error'>*</span>
</th>
<th>Transport/Item</th>
</tr>
</thead>
<tbody>
@@ -538,7 +532,6 @@ const PurchaseOrderAcceptApprovalForm = ({
</td>
<td>
<TextInput
required
name={`items.${idx}.vehicle_number`}
type='text'
value={formItem?.vehicle_number || ''}
@@ -564,7 +557,6 @@ const PurchaseOrderAcceptApprovalForm = ({
</td>
<td>
<SelectInput
required
isClearable={true}
value={formItem?.expedition_vendor}
key={`expedition-vendor-${idx}`}
@@ -633,7 +625,6 @@ const PurchaseOrderAcceptApprovalForm = ({
</td>
<td>
<NumberInput
required
name={`items.${idx}.transport_per_item`}
value={formItem?.transport_per_item || ''}
onChange={(e) =>
@@ -684,7 +675,6 @@ const PurchaseOrderAcceptApprovalForm = ({
<div className={'col-span-2 my-2'}>
<FileInput
required
name='travel_documents'
label='Dokumen Surat Jalan'
accept='.pdf,.jpg,.jpeg,.png'
@@ -38,16 +38,16 @@ type PurchaseRequestAcceptApprovalFormSchemaType = {
purchase_item_id: number;
received_date: string;
travel_number: string;
vehicle_number: string;
vehicle_number?: string | null;
expedition_vendor?: {
value: number;
label: string;
} | null;
expedition_vendor_id: number;
expedition_vendor_id?: number | null;
received_qty: number | string;
transport_per_item: number | string;
transport_per_item?: number | string | null;
}[];
travel_documents: File[];
travel_documents?: (File | null | undefined)[] | null;
};
export type PurchaseStaffApprovalItemSchema = {
@@ -75,14 +75,14 @@ export type PurchaseAcceptApprovalItemSchema = {
purchase_item_id: number;
received_date: string;
travel_number: string;
vehicle_number: string;
vehicle_number?: string | null;
expedition_vendor?: {
value: number;
label: string;
} | null;
expedition_vendor_id: number;
expedition_vendor_id?: number | null;
received_qty: number | string;
transport_per_item: number | string;
transport_per_item?: number | string | null;
};
export type PurchaseDeleteItemsSchema = {
@@ -184,15 +184,20 @@ const PurchaseAcceptApprovalItemObjectSchema: Yup.ObjectSchema<PurchaseAcceptApp
.required('No. Surat jalan wajib diisi!')
.typeError('No. Surat jalan wajib diisi!'),
vehicle_number: Yup.string()
.required('Nomor kendaraan wajib diisi!')
.typeError('Nomor kendaraan wajib diisi!'),
.nullable()
.optional()
.typeError('Nomor kendaraan harus berupa string!'),
expedition_vendor: Yup.object({
value: Yup.number().min(1).required(),
label: Yup.string().required(),
}).nullable(),
})
.nullable()
.optional(),
expedition_vendor_id: Yup.number()
.min(1, 'Vendor ekspedisi wajib diisi!')
.required('Vendor ekspedisi wajib diisi!')
.nullable()
.optional()
.min(1, 'Vendor ekspedisi tidak valid!')
.typeError('Vendor ekspedisi harus berupa angka!')
.test(
'is-valid-expedition-vendor',
'Vendor ekspedisi harus dipilih!',
@@ -200,8 +205,7 @@ const PurchaseAcceptApprovalItemObjectSchema: Yup.ObjectSchema<PurchaseAcceptApp
if (!this.parent.expedition_vendor) return true;
return Boolean(value && value > 0);
}
)
.typeError('Vendor ekspedisi harus dipilih!'),
),
received_qty: Yup.mixed<string | number>()
.required('Jumlah diterima wajib diisi!')
.test(
@@ -217,13 +221,14 @@ const PurchaseAcceptApprovalItemObjectSchema: Yup.ObjectSchema<PurchaseAcceptApp
)
.typeError('Jumlah diterima harus berupa angka!'),
transport_per_item: Yup.mixed<string | number>()
.required('Biaya transport per item wajib diisi!')
.nullable()
.optional()
.test(
'is-valid-transport-per-item',
'Biaya transport per item harus berupa angka lebih dari atau sama dengan 0!',
function (value) {
if (value === '' || value === null || value === undefined)
return false;
return true;
const numValue =
typeof value === 'string' ? parseFloat(value) : value;
return !isNaN(numValue) && numValue >= 0;
@@ -389,16 +394,17 @@ export const PurchaseRequestAcceptApprovalFormSchema: Yup.ObjectSchema<PurchaseR
travel_documents: Yup.array()
.of(
Yup.mixed<File>()
.required('Dokumen surat jalan wajib diupload!')
.nullable()
.optional()
.test('fileSize', 'Ukuran dokumen maksimal 5 MB', (value) => {
if (!value) return true;
if (value instanceof File) return value.size <= 5 * 1024 * 1024;
return true;
})
)
.required('Dokumen surat jalan wajib diupload!')
.min(1, 'Minimal upload 1 dokumen surat jalan!')
.typeError('Dokumen surat jalan wajib diupload!'),
.nullable()
.optional()
.typeError('Dokumen surat jalan harus berupa array!'),
});
export const PurchaseRequestAcceptApprovalFormInitialValues: PurchaseRequestAcceptApprovalFormSchemaType =
+4 -4
View File
@@ -120,12 +120,12 @@ export type CreateAcceptApprovalRequestPayload = {
purchase_item_id: number;
received_date: string;
travel_number: string;
vehicle_number: string;
expedition_vendor_id: number;
vehicle_number?: string | null;
expedition_vendor_id?: number | null;
received_qty: number;
transport_per_item: number;
transport_per_item?: number | null;
}[];
travel_documents?: File[];
travel_documents?: File[] | null;
};
export type DeletePurchaseRequestItemPayload = {