refactor(FE): Refactor InventoryAdjustmentForm to use useSelect for

Kandang
This commit is contained in:
rstubryan
2026-02-26 11:09:13 +07:00
parent e5007a285a
commit 9d4e9f6318
@@ -14,7 +14,11 @@ import {
InventoryAdjustmentFormSchema, InventoryAdjustmentFormSchema,
InventoryAdjustmentFormValues, InventoryAdjustmentFormValues,
} from '@/components/pages/inventory/adjustment/form/InventoryAdjustmentForm.schema'; } from '@/components/pages/inventory/adjustment/form/InventoryAdjustmentForm.schema';
import { LocationApi, ProductApi } from '@/services/api/master-data'; import {
KandangApi,
LocationApi,
ProductApi,
} from '@/services/api/master-data';
import { import {
ProjectFlockApi, ProjectFlockApi,
ProjectFlockKandangApi, ProjectFlockKandangApi,
@@ -104,7 +108,6 @@ const InventoryAdjustmentForm = ({
const { const {
setInputValue: setProjectFlockInputValue, setInputValue: setProjectFlockInputValue,
options: projectFlockOptions, options: projectFlockOptions,
rawData: projectFlocksRawData,
isLoadingOptions: isLoadingProjectFlockOptions, isLoadingOptions: isLoadingProjectFlockOptions,
loadMore: loadMoreProjectFlocks, loadMore: loadMoreProjectFlocks,
} = useSelect<ProjectFlock>( } = useSelect<ProjectFlock>(
@@ -117,6 +120,43 @@ const InventoryAdjustmentForm = ({
} }
); );
const { rawData: approvedProjectFlockKandangsRawData } =
useSelect<ProjectFlockKandang>(
ProjectFlockKandangApi.basePath,
'id',
'id',
'search',
{
step_name: 'Disetujui',
limit: '100',
}
);
const approvedProjectFlockKandangs = useMemo(() => {
if (
approvedProjectFlockKandangsRawData &&
'data' in approvedProjectFlockKandangsRawData
) {
return approvedProjectFlockKandangsRawData.data as ProjectFlockKandang[];
}
return [];
}, [approvedProjectFlockKandangsRawData]);
const {
setInputValue: setKandangInputValue,
options: kandangOptionsFromApi,
isLoadingOptions: isLoadingKandangOptions,
loadMore: loadMoreKandangs,
} = useSelect<Kandang>(
selectedProjectFlock ? KandangApi.basePath : '',
'id',
'name',
'search',
{
location_id: selectedProjectFlockLocationId,
}
);
const projectFlockKandangLookupUrl = useMemo(() => { const projectFlockKandangLookupUrl = useMemo(() => {
if (!selectedProjectFlock || !selectedKandang) return null; if (!selectedProjectFlock || !selectedKandang) return null;
const params = new URLSearchParams({ const params = new URLSearchParams({
@@ -162,83 +202,38 @@ const InventoryAdjustmentForm = ({
? projectFlockKandangDetailData.data ? projectFlockKandangDetailData.data
: undefined; : undefined;
const approvedProjectFlockKandangsUrl = useMemo(() => { const {
const params = new URLSearchParams({ setInputValue: setProductInputValue,
step_name: 'Disetujui', options: productOptions,
limit: '100', isLoadingOptions: isLoadingProductOptions,
}); loadMore: loadMoreProducts,
return `${ProjectFlockKandangApi.basePath}?${params.toString()}`; } = useSelect<Product>(
}, []); projectFlockKandangLookup?.project_flock_kandang_id
? ProductApi.basePath
const { data: approvedProjectFlockKandangsData } = useSWR( : '',
approvedProjectFlockKandangsUrl, 'id',
ProjectFlockKandangApi.getAllFetcher 'name',
); 'search',
{
const approvedProjectFlockKandangs = useMemo(() => {
if (!isResponseSuccess(approvedProjectFlockKandangsData)) return [];
return approvedProjectFlockKandangsData.data;
}, [approvedProjectFlockKandangsData]);
const productUrl = useMemo(() => {
if (!projectFlockKandangLookup?.project_flock_kandang_id) return null;
const params = new URLSearchParams({
project_flock_kandang_id: project_flock_kandang_id:
projectFlockKandangLookup.project_flock_kandang_id.toString(), projectFlockKandangLookup?.project_flock_kandang_id?.toString() || '',
page: '1', }
limit: '10',
});
return `${ProductApi.basePath}?${params.toString()}`;
}, [projectFlockKandangLookup?.project_flock_kandang_id]);
const { data: productData, isLoading: isLoadingProductOptions } = useSWR(
productUrl,
productUrl ? ProductApi.getAllFetcher : null
); );
const productOptions = useMemo(() => {
if (!isResponseSuccess(productData)) return [];
return productData.data.map((p: Product) => ({
value: p.id,
label: p.name,
}));
}, [productData]);
const setProductInputValue = useCallback((value: string) => {
// Implementasi search jika diperlukan
}, []);
const loadMoreProducts = useCallback(() => {
// Implementasi load more jika diperlukan
}, []);
const kandangOptions = useMemo(() => { const kandangOptions = useMemo(() => {
let options: OptionType[] = []; let options: OptionType[] = [];
if (selectedProjectFlock && isResponseSuccess(projectFlocksRawData)) { if (selectedProjectFlock) {
const data = projectFlocksRawData.data as ProjectFlock[]; const approvedKandangIds = approvedProjectFlockKandangs
const selectedProjectFlockData = data.find( .filter((pfk) => pfk.project_flock_id === selectedProjectFlock.value)
(pf) => pf.id === selectedProjectFlock.value .map((pfk) => pfk.kandang_id);
);
if (selectedProjectFlockData?.kandangs) { options = kandangOptionsFromApi.filter((kandang) => {
const approvedKandangIds = approvedProjectFlockKandangs if (type === 'add') {
.filter((pfk) => pfk.project_flock_id === selectedProjectFlock.value) return approvedKandangIds.includes(kandang.value as number);
.map((pfk) => pfk.kandang_id); }
return true;
const kandangOptions = selectedProjectFlockData.kandangs });
.filter((kandang: Kandang) => {
if (type === 'add') {
return approvedKandangIds.includes(kandang.id);
}
return true;
})
.map((kandang: Kandang) => ({
value: kandang.id,
label: kandang.name || '',
}));
options = options.concat(kandangOptions);
}
} }
if (projectFlockKandangDetail && type === 'edit') { if (projectFlockKandangDetail && type === 'edit') {
@@ -257,7 +252,7 @@ const InventoryAdjustmentForm = ({
return options; return options;
}, [ }, [
selectedProjectFlock, selectedProjectFlock,
projectFlocksRawData, kandangOptionsFromApi,
projectFlockKandangDetail, projectFlockKandangDetail,
type, type,
approvedProjectFlockKandangs, approvedProjectFlockKandangs,
@@ -806,7 +801,10 @@ const InventoryAdjustmentForm = ({
label='Kandang' label='Kandang'
value={selectedKandang} value={selectedKandang}
onChange={kandangChangeHandler} onChange={kandangChangeHandler}
onInputChange={setKandangInputValue}
options={kandangOptions} options={kandangOptions}
onMenuScrollToBottom={loadMoreKandangs}
isLoading={isLoadingKandangOptions}
isError={ isError={
formik.touched.kandang_id && Boolean(formik.errors.kandang_id) formik.touched.kandang_id && Boolean(formik.errors.kandang_id)
} }