refactor(FE-114,136): enhance validation and default values in RecordingForm schema

This commit is contained in:
rstubryan
2025-10-16 10:54:36 +07:00
parent 23d5a41d56
commit 19db9a4eac
2 changed files with 43 additions and 41 deletions
@@ -7,17 +7,41 @@ export const RecordingFormSchema = Yup.object({
value: Yup.number().min(1).required(), value: Yup.number().min(1).required(),
label: Yup.string().required(), label: Yup.string().required(),
}).nullable(), }).nullable(),
flock_id: Yup.number().required('Flock wajib diisi!'), flock_id: Yup.number()
.default(0)
.typeError('Flock wajib diisi!')
.test(
'is-valid-flock',
'Flock wajib diisi!',
(value) => value !== undefined && value !== null && value > 0
)
.required('Flock wajib diisi!'),
location: Yup.object({ location: Yup.object({
value: Yup.number().min(1).required(), value: Yup.number().min(1).required(),
label: Yup.string().required(), label: Yup.string().required(),
}).nullable(), }).nullable(),
location_id: Yup.number().required('Lokasi wajib diisi!'), location_id: Yup.number()
.default(0)
.typeError('Lokasi wajib diisi!')
.test(
'is-valid-location',
'Lokasi wajib diisi!',
(value) => value !== undefined && value !== null && value > 0
)
.required('Lokasi wajib diisi!'),
coop: Yup.object({ coop: Yup.object({
value: Yup.number().min(1).required(), value: Yup.number().min(1).required(),
label: Yup.string().required(), label: Yup.string().required(),
}).nullable(), }).nullable(),
coop_id: Yup.number().required('Kandang wajib diisi!'), coop_id: Yup.number()
.default(0)
.typeError('Kandang wajib diisi!')
.test(
'is-valid-coop',
'Kandang wajib diisi!',
(value) => value !== undefined && value !== null && value > 0
)
.required('Kandang wajib diisi!'),
recording_date: Yup.date() recording_date: Yup.date()
.required('Tanggal recording wajib diisi') .required('Tanggal recording wajib diisi')
.typeError('Format tanggal tidak valid'), .typeError('Format tanggal tidak valid'),
@@ -27,10 +51,12 @@ export const RecordingFormSchema = Yup.object({
feed_name: Yup.string().required('Nama pakan wajib diisi!'), feed_name: Yup.string().required('Nama pakan wajib diisi!'),
feed_qty: Yup.number() feed_qty: Yup.number()
.required('Qty pakan wajib diisi!') .required('Qty pakan wajib diisi!')
.min(1, 'Qty minimal 1!'), .min(1, 'Qty minimal 1!')
.typeError('Qty pakan wajib diisi!'),
feed_stock: Yup.number() feed_stock: Yup.number()
.required('Stock pakan wajib diisi!') .required('Stock pakan wajib diisi!')
.min(0, 'Stock minimal 0!'), .min(1, 'Stock minimal 1!')
.typeError('Stock pakan wajib diisi!'),
}) })
) )
.min(1, 'Minimal harus ada 1 data pakan!') .min(1, 'Minimal harus ada 1 data pakan!')
@@ -57,10 +83,12 @@ export const RecordingFormSchema = Yup.object({
vaccine_name: Yup.string().required('Nama vaksin wajib diisi!'), vaccine_name: Yup.string().required('Nama vaksin wajib diisi!'),
total_stock: Yup.number() total_stock: Yup.number()
.required('Total stock wajib diisi!') .required('Total stock wajib diisi!')
.min(0, 'Total stock minimal 0!'), .min(1, 'Total stock minimal 1!')
.typeError('Total stock wajib diisi!'),
used_stock: Yup.number() used_stock: Yup.number()
.required('Jumlah stock wajib diisi!') .required('Jumlah stock wajib diisi!')
.min(0, 'Jumlah stock minimal 0!'), .min(1, 'Jumlah stock minimal 1!')
.typeError('Jumlah stock wajib diisi!'),
}) })
) )
.min(1, 'Minimal harus ada 1 data vaksinasi!') .min(1, 'Minimal harus ada 1 data vaksinasi!')
@@ -147,37 +147,19 @@ const RecordingForm = ({ type = 'add', initialValues }: RecordingFormProps) => {
const locationChangeHandler = (val: OptionType | OptionType[] | null) => { const locationChangeHandler = (val: OptionType | OptionType[] | null) => {
const locationValue = (val as OptionType)?.value; const locationValue = (val as OptionType)?.value;
formik.setFieldValue('location', val); formik.setFieldValue('location', val, false);
formik.setFieldValue('location_id', locationValue || 0); formik.setFieldValue('location_id', locationValue || 0, false);
if (locationValue) { formik.setFieldValue('coop', null, false);
formik.setFieldTouched('location', true); formik.setFieldValue('coop_id', 0, false);
formik.setFieldTouched('location_id', true);
} else {
formik.setFieldTouched('location', false);
formik.setFieldTouched('location_id', false);
}
formik.setFieldValue('coop', null);
formik.setFieldValue('coop_id', 0);
formik.setFieldTouched('coop', false);
formik.setFieldTouched('coop_id', false);
setCoopSelectInputValue(''); setCoopSelectInputValue('');
}; };
const coopChangeHandler = (val: OptionType | OptionType[] | null) => { const coopChangeHandler = (val: OptionType | OptionType[] | null) => {
const coopValue = (val as OptionType)?.value; const coopValue = (val as OptionType)?.value;
formik.setFieldValue('coop', val); formik.setFieldValue('coop', val, false);
formik.setFieldValue('coop_id', coopValue || 0); formik.setFieldValue('coop_id', coopValue || 0, false);
if (coopValue) {
formik.setFieldTouched('coop', true);
formik.setFieldTouched('coop_id', true);
} else {
formik.setFieldTouched('coop', false);
formik.setFieldTouched('coop_id', false);
}
}; };
const isRepeaterInputError = <T extends keyof CreateRecordingPayload>( const isRepeaterInputError = <T extends keyof CreateRecordingPayload>(
@@ -224,16 +206,8 @@ const RecordingForm = ({ type = 'add', initialValues }: RecordingFormProps) => {
const flockChangeHandler = (val: OptionType | OptionType[] | null) => { const flockChangeHandler = (val: OptionType | OptionType[] | null) => {
const flockValue = (val as OptionType)?.value; const flockValue = (val as OptionType)?.value;
formik.setFieldValue('flock', val); formik.setFieldValue('flock', val, false);
formik.setFieldValue('flock_id', flockValue || 0); formik.setFieldValue('flock_id', flockValue || 0, false);
if (flockValue) {
formik.setFieldTouched('flock', true);
formik.setFieldTouched('flock_id', true);
} else {
formik.setFieldTouched('flock', false);
formik.setFieldTouched('flock_id', false);
}
}; };
const addFeedData = () => { const addFeedData = () => {