refactor(FE-208): add validation to ensure destination warehouse is different from source warehouse in MovementForm

This commit is contained in:
rstubryan
2025-11-22 11:07:23 +07:00
parent 34c1da94d8
commit c12a58cb6d
2 changed files with 82 additions and 3 deletions
@@ -171,7 +171,15 @@ export const MovementFormSchema: Yup.ObjectSchema<MovementFormSchemaType> =
}).nullable(),
destination_warehouse_id: Yup.number()
.required('Gudang tujuan wajib diisi!')
.typeError('Gudang tujuan wajib diisi!'),
.typeError('Gudang tujuan wajib diisi!')
.test(
'different-warehouse',
'Gudang tujuan tidak boleh sama dengan gudang asal!',
function (value) {
const { source_warehouse_id } = this.parent;
return !value || !source_warehouse_id || value !== source_warehouse_id;
}
),
products: Yup.array()
.of(ProductObjectSchema)
.min(1, 'Minimal harus ada 1 produk!')
@@ -745,6 +745,31 @@ const MovementForm = ({ type = 'add', initialValues }: MovementFormProps) => {
}
}, [formik.values.source_warehouse_id]);
useEffect(() => {
if (
formik.values.source_warehouse_id &&
formik.values.destination_warehouse_id &&
formik.values.source_warehouse_id ===
formik.values.destination_warehouse_id
) {
formik.setFieldError(
'destination_warehouse_id',
'Gudang tujuan tidak boleh sama dengan gudang asal!'
);
} else {
if (
formik.errors.destination_warehouse_id ===
'Gudang tujuan tidak boleh sama dengan gudang asal!'
) {
formik.setFieldError('destination_warehouse_id', undefined);
}
}
}, [
formik.values.source_warehouse_id,
formik.values.destination_warehouse_id,
formik.errors.destination_warehouse_id,
]);
return (
<>
<section className='w-full'>
@@ -828,10 +853,33 @@ const MovementForm = ({ type = 'add', initialValues }: MovementFormProps) => {
formik.setFieldTouched('source_warehouse', true);
formik.setFieldValue('source_warehouse', val);
formik.setFieldTouched('source_warehouse_id', true);
const newSourceWarehouseId = (val as WarehouseOptionType)
?.value;
formik.setFieldValue(
'source_warehouse_id',
(val as WarehouseOptionType)?.value
newSourceWarehouseId
);
if (
newSourceWarehouseId &&
formik.values.destination_warehouse_id &&
newSourceWarehouseId ===
formik.values.destination_warehouse_id
) {
formik.setFieldError(
'destination_warehouse_id',
'Gudang tujuan tidak boleh sama dengan gudang asal!'
);
} else {
if (
formik.errors.destination_warehouse_id ===
'Gudang tujuan tidak boleh sama dengan gudang asal!'
) {
formik.setFieldError(
'destination_warehouse_id',
undefined
);
}
}
}}
options={warehouseOptions}
onInputChange={setWarehouseSelectInputValue}
@@ -899,10 +947,33 @@ const MovementForm = ({ type = 'add', initialValues }: MovementFormProps) => {
formik.setFieldTouched('destination_warehouse', true);
formik.setFieldValue('destination_warehouse', val);
formik.setFieldTouched('destination_warehouse_id', true);
const newDestinationWarehouseId = (val as WarehouseOptionType)
?.value;
formik.setFieldValue(
'destination_warehouse_id',
(val as WarehouseOptionType)?.value
newDestinationWarehouseId
);
if (
newDestinationWarehouseId &&
formik.values.source_warehouse_id &&
newDestinationWarehouseId ===
formik.values.source_warehouse_id
) {
formik.setFieldError(
'destination_warehouse_id',
'Gudang tujuan tidak boleh sama dengan gudang asal!'
);
} else {
if (
formik.errors.destination_warehouse_id ===
'Gudang tujuan tidak boleh sama dengan gudang asal!'
) {
formik.setFieldError(
'destination_warehouse_id',
undefined
);
}
}
}}
options={warehouseOptions}
onInputChange={setWarehouseSelectInputValue}