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(), }).nullable(),
destination_warehouse_id: Yup.number() destination_warehouse_id: Yup.number()
.required('Gudang tujuan wajib diisi!') .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() products: Yup.array()
.of(ProductObjectSchema) .of(ProductObjectSchema)
.min(1, 'Minimal harus ada 1 produk!') .min(1, 'Minimal harus ada 1 produk!')
@@ -745,6 +745,31 @@ const MovementForm = ({ type = 'add', initialValues }: MovementFormProps) => {
} }
}, [formik.values.source_warehouse_id]); }, [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 ( return (
<> <>
<section className='w-full'> <section className='w-full'>
@@ -828,10 +853,33 @@ const MovementForm = ({ type = 'add', initialValues }: MovementFormProps) => {
formik.setFieldTouched('source_warehouse', true); formik.setFieldTouched('source_warehouse', true);
formik.setFieldValue('source_warehouse', val); formik.setFieldValue('source_warehouse', val);
formik.setFieldTouched('source_warehouse_id', true); formik.setFieldTouched('source_warehouse_id', true);
const newSourceWarehouseId = (val as WarehouseOptionType)
?.value;
formik.setFieldValue( formik.setFieldValue(
'source_warehouse_id', '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} options={warehouseOptions}
onInputChange={setWarehouseSelectInputValue} onInputChange={setWarehouseSelectInputValue}
@@ -899,10 +947,33 @@ const MovementForm = ({ type = 'add', initialValues }: MovementFormProps) => {
formik.setFieldTouched('destination_warehouse', true); formik.setFieldTouched('destination_warehouse', true);
formik.setFieldValue('destination_warehouse', val); formik.setFieldValue('destination_warehouse', val);
formik.setFieldTouched('destination_warehouse_id', true); formik.setFieldTouched('destination_warehouse_id', true);
const newDestinationWarehouseId = (val as WarehouseOptionType)
?.value;
formik.setFieldValue( formik.setFieldValue(
'destination_warehouse_id', '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} options={warehouseOptions}
onInputChange={setWarehouseSelectInputValue} onInputChange={setWarehouseSelectInputValue}