feat(FE): api integration production standards

This commit is contained in:
randy-ar
2025-12-27 13:46:19 +07:00
parent 663c1dea14
commit d49bca1d40
8 changed files with 1167 additions and 581 deletions
@@ -6,7 +6,7 @@ import Table, { TABLE_DEFAULT_STYLING } from '@/components/Table';
import { ProductionStandard } from '@/types/api/master-data/production-standard';
import { Icon } from '@iconify/react';
import useSWR from 'swr';
import { productionStandardApi } from '@/services/api/master-data';
import { ProductionStandardApi } from '@/services/api/master-data';
import { isResponseSuccess } from '@/lib/api-helper';
import RowOptionsMenuWrapper from '@/components/table/RowOptionsMenuWrapper';
import { CellContext } from '@tanstack/react-table';
@@ -80,14 +80,14 @@ const ProductionStandardTable = () => {
isLoading: productionStandardsLoading,
mutate: refreshProductionStandards,
} = useSWR(
`${productionStandardApi.basePath}`,
productionStandardApi.getAllFetcher
`${ProductionStandardApi.basePath}`,
ProductionStandardApi.getAllFetcher
);
const confirmationModalDeleteClickHandler = async () => {
setIsDeleteLoading(true);
await productionStandardApi.delete(
await ProductionStandardApi.delete(
selectedProductionStandard?.id as number
);
refreshProductionStandards();
@@ -100,8 +100,8 @@ const ProductionStandardTable = () => {
return (
<>
<div className='flex flex-col gap-6 p-6'>
<div className='flex flex-row gap-6 justify-end'>
<Button href='/master-data/production-standard/add'>
<div className='flex flex-row gap-6 justify-start'>
<Button href='/master-data/production-standard/add' variant='outline'>
<Icon icon='mdi:plus' /> Tambah
</Button>
</div>
@@ -121,8 +121,8 @@ const ProductionStandardTable = () => {
accessorKey: 'name',
},
{
header: 'Jumlah Week',
accessorFn: (row) => row.details.length,
header: 'Kategori',
accessorFn: (row) => row.project_category,
},
{
header: 'Aksi',
@@ -1,41 +1,14 @@
import * as Yup from 'yup';
export const ProductionStandardFormSchema = Yup.object({
name: Yup.string().required('Nama wajib diisi!'),
project_category: Yup.string().required('Kategori proyek wajib diisi!'),
details: Yup.array().of(
Yup.object({
week: Yup.number().required('Minggu wajib diisi!'),
production_standard_details: Yup.object({
target_hen_day_production: Yup.number().required(
'Produksi telur per hari wajib diisi!'
),
target_hen_house_production: Yup.number().required(
'Produksi telur per kandang wajib diisi!'
),
target_egg_weight: Yup.number().required('Berat telur wajib diisi!'),
target_egg_mass: Yup.number().required('Massa telur wajib diisi!'),
}),
standard_growth_details: Yup.object({
target_mean_bw: Yup.number().required('Berat rata-rata wajib diisi!'),
max_depletion: Yup.number().required('Maksimal depletion wajib diisi!'),
min_uniformity: Yup.number().required(
'Minimal uniformitas wajib diisi!'
),
feed_intake: Yup.number().required('Pengambilan makanan wajib diisi!'),
}),
})
),
});
export const UpdateProductionStandardFormSchema = ProductionStandardFormSchema;
export type ProductionStandardFormValues = Yup.InferType<
typeof ProductionStandardFormSchema
>;
export const ProductionStandardRepeaterFormSchema = Yup.object({
// Schema for LAYING category (production_standard_details is required)
const LayingRepeaterFormSchema = Yup.object({
week: Yup.number().required('Minggu wajib diisi!'),
production_standard_uniformity_details: Yup.object({
target_mean_bw: Yup.number().required('Berat rata-rata wajib diisi!'),
max_depletion: Yup.number().required('Maksimal depletion wajib diisi!'),
min_uniformity: Yup.number().required('Minimal uniformitas wajib diisi!'),
feed_intake: Yup.number().required('Pengambilan makanan wajib diisi!'),
}),
production_standard_details: Yup.object({
target_hen_day_production: Yup.number().required(
'Produksi telur per hari wajib diisi!'
@@ -45,18 +18,74 @@ export const ProductionStandardRepeaterFormSchema = Yup.object({
),
target_egg_weight: Yup.number().required('Berat telur wajib diisi!'),
target_egg_mass: Yup.number().required('Massa telur wajib diisi!'),
}),
standard_growth_details: Yup.object({
}).required(),
});
// Schema for GROWING category (production_standard_details is optional)
const GrowingRepeaterFormSchema = Yup.object({
week: Yup.number().required('Minggu wajib diisi!'),
production_standard_uniformity_details: Yup.object({
target_mean_bw: Yup.number().required('Berat rata-rata wajib diisi!'),
max_depletion: Yup.number().required('Maksimal depletion wajib diisi!'),
min_uniformity: Yup.number().required('Minimal uniformitas wajib diisi!'),
feed_intake: Yup.number().required('Pengambilan makanan wajib diisi!'),
}),
production_standard_details: Yup.object({
target_hen_day_production: Yup.number().optional(),
target_hen_house_production: Yup.number().optional(),
target_egg_weight: Yup.number().optional(),
target_egg_mass: Yup.number().optional(),
}).optional(),
});
// Explicit types for better type inference
export type LayingRepeaterFormValues = Yup.InferType<
typeof LayingRepeaterFormSchema
>;
export type GrowingRepeaterFormValues = Yup.InferType<
typeof GrowingRepeaterFormSchema
>;
// Union type for repeater form values
export type ProductionStandardRepeaterFormSchemaValues =
| LayingRepeaterFormValues
| GrowingRepeaterFormValues;
// Dynamic schema factory for repeater form based on project category
export const createProductionStandardRepeaterFormSchema = (
category: string
) => {
// For LAYING category, production_standard_details is required
if (category === 'LAYING') {
return LayingRepeaterFormSchema;
}
// For GROWING category, production_standard_details is optional
return GrowingRepeaterFormSchema;
};
// Dynamic schema factory for main form based on project category
export const createProductionStandardFormSchema = (category: string) => {
return Yup.object({
name: Yup.string().required('Nama wajib diisi!'),
project_category: Yup.string().required('Kategori proyek wajib diisi!'),
details: Yup.array().of(
createProductionStandardRepeaterFormSchema(category)
),
});
};
// Static schemas for backward compatibility (default to LAYING)
export const ProductionStandardFormSchema =
createProductionStandardFormSchema('LAYING');
export const UpdateProductionStandardFormSchema = ProductionStandardFormSchema;
export type ProductionStandardFormValues = Yup.InferType<
typeof ProductionStandardFormSchema
>;
export const ProductionStandardRepeaterFormSchema = LayingRepeaterFormSchema;
export const UpdateProductionStandardRepeaterFormSchema =
ProductionStandardRepeaterFormSchema;
export type ProductionStandardRepeaterFormSchemaValues = Yup.InferType<
typeof ProductionStandardRepeaterFormSchema
>;
File diff suppressed because it is too large Load Diff