[0]
) => ({
- product_warehouse_id: depletion.product_warehouse_id,
+ product_warehouse_id: {
+ value: Number(depletion.product_warehouse_id ?? 0),
+ label: getProductWarehouseOptionLabel(depletion.product_warehouse),
+ },
source_product_warehouse_id: depletion.source_product_warehouse_id,
qty: depletion.qty,
})
) ?? [
{
- product_warehouse_id: 0,
+ product_warehouse_id: undefined,
qty: '',
},
],
@@ -281,12 +316,15 @@ export const getRecordingLayingFormInitialValues = (
...getRecordingGrowingFormInitialValues(initialValues),
eggs: initialValues?.eggs?.map((egg: CreateEggPayload) => ({
- product_warehouse_id: egg.product_warehouse_id,
+ product_warehouse_id: {
+ value: Number(egg.product_warehouse_id ?? 0),
+ label: getProductWarehouseOptionLabel(egg.product_warehouse),
+ },
qty: egg.qty,
weight: egg.weight,
})) ?? [
{
- product_warehouse_id: 0,
+ product_warehouse_id: undefined,
qty: '',
weight: '',
},
diff --git a/src/components/pages/production/recording/form/RecordingForm.tsx b/src/components/pages/production/recording/form/RecordingForm.tsx
index 3b584cfe..9a7e11b6 100644
--- a/src/components/pages/production/recording/form/RecordingForm.tsx
+++ b/src/components/pages/production/recording/form/RecordingForm.tsx
@@ -522,7 +522,7 @@ const RecordingForm = ({ type = 'add', initialValues }: RecordingFormProps) => {
? values.depletions
?.filter((d) => d.product_warehouse_id && d.qty)
.map((depletion) => ({
- product_warehouse_id: depletion.product_warehouse_id!,
+ product_warehouse_id: depletion.product_warehouse_id?.value ?? 0,
...(depletion.source_product_warehouse_id && {
source_product_warehouse_id:
depletion.source_product_warehouse_id,
@@ -533,13 +533,13 @@ const RecordingForm = ({ type = 'add', initialValues }: RecordingFormProps) => {
const stocks = recordingRestriction.canEditStock
? (values.stocks ?? [])
- .filter((s) => s.product_warehouse_id && s.qty)
+ .filter((s) => s.product_warehouse_id?.value && s.qty)
.map((stock) => ({
// In migration mode, product_warehouse_id field holds product.id;
// send it as product_id so the backend auto-creates the warehouse entry.
...(isMigrationMode
- ? { product_id: stock.product_warehouse_id }
- : { product_warehouse_id: stock.product_warehouse_id }),
+ ? { product_id: stock.product_warehouse_id?.value }
+ : { product_warehouse_id: stock.product_warehouse_id?.value }),
qty: Number(stock.qty) || 0,
}))
: [];
@@ -561,9 +561,9 @@ const RecordingForm = ({ type = 'add', initialValues }: RecordingFormProps) => {
const createLayingPayload = useCallback(
(values: RecordingLayingFormValues) => {
const depletions = values.depletions
- ?.filter((d) => d.product_warehouse_id && d.qty)
+ ?.filter((d) => d.product_warehouse_id?.value && d.qty)
.map((depletion) => ({
- product_warehouse_id: depletion.product_warehouse_id!,
+ product_warehouse_id: depletion.product_warehouse_id?.value ?? 0,
...(depletion.source_product_warehouse_id && {
source_product_warehouse_id: depletion.source_product_warehouse_id,
}),
@@ -573,7 +573,7 @@ const RecordingForm = ({ type = 'add', initialValues }: RecordingFormProps) => {
const eggs = values.eggs
?.filter((e) => e.product_warehouse_id && e.qty && e.weight)
.map((egg) => ({
- product_warehouse_id: egg.product_warehouse_id!,
+ product_warehouse_id: egg.product_warehouse_id?.value ?? 0,
qty: Number(egg.qty) || 0,
weight:
typeof egg.weight === 'number'
@@ -583,11 +583,11 @@ const RecordingForm = ({ type = 'add', initialValues }: RecordingFormProps) => {
const stocks = recordingRestriction.canEditStock
? values.stocks
- .filter((s) => s.product_warehouse_id && s.qty)
+ .filter((s) => s.product_warehouse_id?.value && s.qty)
.map((stock) => ({
...(isMigrationMode
- ? { product_id: stock.product_warehouse_id }
- : { product_warehouse_id: stock.product_warehouse_id }),
+ ? { product_id: stock.product_warehouse_id?.value }
+ : { product_warehouse_id: stock.product_warehouse_id?.value }),
qty: Number(stock.qty) || 0,
}))
: [];
@@ -636,21 +636,13 @@ const RecordingForm = ({ type = 'add', initialValues }: RecordingFormProps) => {
rawData: stockProductsPW,
isLoadingOptions: isLoadingStockProductsPW,
loadMore: loadMoreStockProductsPW,
- } = useSelect(
- isMigrationMode ? null : ProductWarehouseApi.basePath,
- 'id',
- 'product.name',
- 'search',
- {
- flags: 'PAKAN,OVK',
- limit: '100',
- available_only: 'false',
- location_id: stockProductsLocationId,
- ...(selectedKandangId
- ? { kandang_id: selectedKandangId.toString() }
- : {}),
- }
- );
+ } = useSelect(ProductWarehouseApi.basePath, 'id', 'product.name', 'search', {
+ flags: 'PAKAN,OVK',
+ limit: '100',
+ available_only: 'false',
+ location_id: stockProductsLocationId,
+ ...(selectedKandangId ? { kandang_id: selectedKandangId.toString() } : {}),
+ });
const {
setInputValue: setStockMasterInputValue,
@@ -1283,8 +1275,12 @@ const RecordingForm = ({ type = 'add', initialValues }: RecordingFormProps) => {
// product_warehouse object returned by the API.
if (isMigrationMode && type === 'edit' && initialValues?.stocks?.length) {
baseValues.stocks = initialValues.stocks.map((stock) => ({
- product_warehouse_id:
- stock.product_warehouse?.product_id ?? stock.product_warehouse_id,
+ product_warehouse_id: {
+ value: Number(
+ stock.product_warehouse?.product_id ?? stock.product_warehouse_id
+ ),
+ label: getProductWarehouseOptionLabel(stock.product_warehouse),
+ },
qty: stock.usage_amount ?? '',
}));
}
@@ -1438,8 +1434,12 @@ const RecordingForm = ({ type = 'add', initialValues }: RecordingFormProps) => {
formik.setFieldValue(
'stocks',
initialValues.stocks.map((stock) => ({
- product_warehouse_id:
- stock.product_warehouse?.product_id ?? stock.product_warehouse_id,
+ product_warehouse_id: {
+ value: Number(
+ stock.product_warehouse?.product_id ?? stock.product_warehouse_id
+ ),
+ label: getProductWarehouseOptionLabel(stock.product_warehouse),
+ },
qty: stock.usage_amount ?? '',
}))
);
@@ -1462,7 +1462,7 @@ const RecordingForm = ({ type = 'add', initialValues }: RecordingFormProps) => {
(stockIdx: number) => {
if ((type as 'add' | 'edit' | 'detail') === 'detail') return null;
const stock = formik.values.stocks?.[stockIdx];
- if (!stock || !stock.product_warehouse_id) return null;
+ if (!stock || !stock.product_warehouse_id?.value) return null;
return null;
},
[formik.values.stocks, type]
@@ -1492,13 +1492,17 @@ const RecordingForm = ({ type = 'add', initialValues }: RecordingFormProps) => {
const getStockUsageAdornment = useCallback(
(stockIdx: number) => {
const stock = formik.values.stocks?.[stockIdx];
- if (!stock || !stock.product_warehouse_id) return null;
+ if (!stock || !stock.product_warehouse_id?.value) return null;
const isDetail = (type as 'add' | 'edit' | 'detail') === 'detail';
- const availableStock = getAvailableStock(stock.product_warehouse_id);
+ const availableStock = getAvailableStock(
+ stock.product_warehouse_id.value
+ );
const requestedUsage = Number(stock.qty) || 0;
const remainingStock = availableStock - requestedUsage;
- const { pendingQty } = getStockPendingInfo(stock.product_warehouse_id);
+ const { pendingQty } = getStockPendingInfo(
+ stock.product_warehouse_id.value
+ );
if (isDetail) {
if (pendingQty > 0) {
@@ -1605,10 +1609,10 @@ const RecordingForm = ({ type = 'add', initialValues }: RecordingFormProps) => {
return (
idx !== currentIdx &&
s.product_warehouse_id &&
- s.product_warehouse_id !== 0
+ s.product_warehouse_id.value !== 0
);
})
- .map((s) => s.product_warehouse_id) || [];
+ .map((s) => s.product_warehouse_id?.value) || [];
return unifiedStockProducts.filter(
(opt) => !selectedProductIds.includes(Number(opt.value))
@@ -1625,10 +1629,10 @@ const RecordingForm = ({ type = 'add', initialValues }: RecordingFormProps) => {
return (
idx !== currentIdx &&
d.product_warehouse_id &&
- d.product_warehouse_id !== 0
+ d.product_warehouse_id.value !== 0
);
})
- .map((d) => d.product_warehouse_id) || [];
+ .map((d) => d.product_warehouse_id?.value) || [];
return depletionProducts.filter(
(opt) => !selectedProductIds.includes(Number(opt.value))
@@ -1645,10 +1649,10 @@ const RecordingForm = ({ type = 'add', initialValues }: RecordingFormProps) => {
return (
idx !== currentIdx &&
e.product_warehouse_id &&
- e.product_warehouse_id !== 0
+ e.product_warehouse_id.value !== 0
);
})
- .map((e) => e.product_warehouse_id) || [];
+ .map((e) => e.product_warehouse_id?.value) || [];
return eggProducts.filter(
(opt) => !selectedProductIds.includes(Number(opt.value))
@@ -1694,7 +1698,9 @@ const RecordingForm = ({ type = 'add', initialValues }: RecordingFormProps) => {
isError: touchedField && Boolean(errorField?.[column]),
errorMessage:
touchedField && errorField?.[column]
- ? (errorField[column] as string)
+ ? errorField[column] instanceof Object
+ ? (errorField[column] as OptionType)?.label
+ : (errorField[column] as string)
: '',
};
};
@@ -2901,20 +2907,15 @@ const RecordingForm = ({ type = 'add', initialValues }: RecordingFormProps) => {
- product.value === stock.product_warehouse_id
- ) || null
- }
+ key={`stock-product-${idx}-${stock.product_warehouse_id?.value}`}
+ value={stock.product_warehouse_id}
onInputChange={setStockInputValue}
onChange={(selectedOption) => {
const option =
selectedOption as OptionType | null;
formik.setFieldValue(
`stocks.${idx}.product_warehouse_id`,
- option?.value || 0
+ option
);
}}
options={getAvailableStockProductOptions(idx)}
@@ -2950,9 +2951,9 @@ const RecordingForm = ({ type = 'add', initialValues }: RecordingFormProps) => {
}
isClearable={type !== 'detail'}
inputPrefix={
- stock.product_warehouse_id
+ stock.product_warehouse_id?.value
? getProductFlagBadgeAdornment(
- stock.product_warehouse_id
+ stock.product_warehouse_id.value
)
: undefined
}
@@ -2988,7 +2989,7 @@ const RecordingForm = ({ type = 'add', initialValues }: RecordingFormProps) => {
inputSuffix={
stock.product_warehouse_id
? getProductUomSuffix(
- stock.product_warehouse_id,
+ stock.product_warehouse_id.value,
'stock'
)
: null
@@ -3181,19 +3182,13 @@ const RecordingForm = ({ type = 'add', initialValues }: RecordingFormProps) => {
)}
- product.value ===
- depletion.product_warehouse_id
- ) || null
- }
+ value={depletion.product_warehouse_id}
onChange={(selectedOption) => {
const option =
selectedOption as OptionType | null;
formik.setFieldValue(
`depletions.${idx}.product_warehouse_id`,
- option?.value || 0
+ option
);
}}
options={getAvailableDepletionProductOptions(idx)}
@@ -3256,7 +3251,7 @@ const RecordingForm = ({ type = 'add', initialValues }: RecordingFormProps) => {
inputSuffix={
depletion.product_warehouse_id
? getProductUomSuffix(
- depletion.product_warehouse_id,
+ depletion.product_warehouse_id.value,
'depletion'
)
: null
@@ -3434,18 +3429,13 @@ const RecordingForm = ({ type = 'add', initialValues }: RecordingFormProps) => {
)}
|
- product.value === egg.product_warehouse_id
- ) || null
- }
+ value={egg.product_warehouse_id}
onChange={(selectedOption) => {
const option =
selectedOption as OptionType | null;
formik.setFieldValue(
`eggs.${idx}.product_warehouse_id`,
- option?.value || 0
+ option
);
}}
options={getAvailableEggProductOptions(idx)}
diff --git a/src/components/pages/production/transfer-to-laying/TransferToLayingFormModal.tsx b/src/components/pages/production/transfer-to-laying/TransferToLayingFormModal.tsx
index 91a56085..a1d30d5a 100644
--- a/src/components/pages/production/transfer-to-laying/TransferToLayingFormModal.tsx
+++ b/src/components/pages/production/transfer-to-laying/TransferToLayingFormModal.tsx
@@ -223,6 +223,8 @@ const TransferToLayingFormModal = () => {
},
});
+ const { flockSource: formikFlockSource } = formik.values;
+
const { formErrorList, close, handleFormSubmit } = useFormikErrorList(formik);
const [selectedFlockSourceRawData, setSelectedFlockSourceRawData] = useState<
@@ -455,13 +457,13 @@ const TransferToLayingFormModal = () => {
useEffect(() => {
if (isResponseSuccess(flockSourceRawData)) {
- const selectedFlockSourceRawData = flockSourceRawData.data.find(
+ const currentSelectedFlockSourceRawData = flockSourceRawData.data.find(
(item) => item.id === formik.values.flockSource?.value
);
- setSelectedFlockSourceRawData(selectedFlockSourceRawData);
+ setSelectedFlockSourceRawData(currentSelectedFlockSourceRawData);
}
- }, [flockSourceRawData]);
+ }, [flockSourceRawData, formikFlockSource]);
useEffect(() => {
formik.setFieldValue('totalQuantity', totalTransferedChicken);
@@ -625,6 +627,7 @@ const TransferToLayingFormModal = () => {
>
{
/>
diff --git a/src/components/pages/purchase/PurchaseTable.tsx b/src/components/pages/purchase/PurchaseTable.tsx
index facc7079..781fb2cf 100644
--- a/src/components/pages/purchase/PurchaseTable.tsx
+++ b/src/components/pages/purchase/PurchaseTable.tsx
@@ -409,10 +409,17 @@ const PurchaseTable = () => {
setIsDeleteLoading(true);
try {
- await PurchaseApi.delete(selectedPurchase?.id as number);
- refreshPurchaseRequests();
- deleteModal.closeModal();
- toast.success('Berhasil menghapus data permintaan pembelian!');
+ const deleteResponse = await PurchaseApi.delete(
+ selectedPurchase?.id as number
+ );
+
+ if (isResponseSuccess(deleteResponse)) {
+ refreshPurchaseRequests();
+ deleteModal.closeModal();
+ toast.success('Berhasil menghapus data permintaan pembelian!');
+ } else {
+ toast.error(deleteResponse?.message ?? 'Gagal menghapus data!');
+ }
} catch {
toast.error('Gagal menghapus data permintaan pembelian!');
}
diff --git a/src/figma-make/components/pages/dashboard/Dashboard.tsx b/src/figma-make/components/pages/dashboard/Dashboard.tsx
index 36b04cf6..3cf8a9b7 100644
--- a/src/figma-make/components/pages/dashboard/Dashboard.tsx
+++ b/src/figma-make/components/pages/dashboard/Dashboard.tsx
@@ -89,7 +89,10 @@ export function Dashboard() {
options: kandangOptions,
loadMore: loadMoreKandang,
isLoadingMore: isLoadingMoreKandang,
- } = useSelect(DailyChecklistKandangApi.basePath, 'id', 'name');
+ } = useSelect(DailyChecklistKandangApi.basePath, 'id', 'name', 'search', {
+ order_by: 'asc',
+ sort_by: 'name',
+ });
const handleKandangScroll = (e: React.UIEvent) => {
const target = e.target as HTMLDivElement;
diff --git a/src/figma-make/components/pages/list-daily-checklist/ListDailyChecklistContent.tsx b/src/figma-make/components/pages/list-daily-checklist/ListDailyChecklistContent.tsx
index ae00d17a..64f716c1 100644
--- a/src/figma-make/components/pages/list-daily-checklist/ListDailyChecklistContent.tsx
+++ b/src/figma-make/components/pages/list-daily-checklist/ListDailyChecklistContent.tsx
@@ -110,7 +110,10 @@ export function ListDailyChecklistContent() {
options: kandangOptions,
isLoadingMore: isLoadingMoreKandang,
loadMore: loadMoreKandang,
- } = useSelect(DailyChecklistKandangApi.basePath, 'id', 'name');
+ } = useSelect(DailyChecklistKandangApi.basePath, 'id', 'name', 'search', {
+ order_by: 'asc',
+ sort_by: 'name',
+ });
const checklistList = isResponseSuccess(checklistListRes)
? checklistListRes.data || []
diff --git a/src/figma-make/components/pages/master-data/employee/MasterEmployeeContent.tsx b/src/figma-make/components/pages/master-data/employee/MasterEmployeeContent.tsx
index 37c81057..572317e0 100644
--- a/src/figma-make/components/pages/master-data/employee/MasterEmployeeContent.tsx
+++ b/src/figma-make/components/pages/master-data/employee/MasterEmployeeContent.tsx
@@ -96,7 +96,10 @@ export function MasterEmployeeContent() {
options: kandangOptions,
loadMore: loadMoreKandang,
isLoadingMore: isLoadingMoreKandang,
- } = useSelect(DailyChecklistKandangApi.basePath, 'id', 'name');
+ } = useSelect(DailyChecklistKandangApi.basePath, 'id', 'name', 'search', {
+ order_by: 'asc',
+ sort_by: 'name',
+ });
const handleKandangScroll = (e: React.UIEvent) => {
const target = e.target as HTMLDivElement;
diff --git a/src/figma-make/components/pages/master-data/kandang/MasterKandangContent.tsx b/src/figma-make/components/pages/master-data/kandang/MasterKandangContent.tsx
index 33de94e4..da733edb 100644
--- a/src/figma-make/components/pages/master-data/kandang/MasterKandangContent.tsx
+++ b/src/figma-make/components/pages/master-data/kandang/MasterKandangContent.tsx
@@ -368,7 +368,9 @@ export function MasterKandangContent() {
name='search'
placeholder='Cari kandang...'
value={tableFilterState.search}
- onChange={(e) => updateFilter('search', e.target.value)}
+ onChange={(e) =>
+ updateFilter('search', e.target.value, true)
+ }
className={{
wrapper: 'w-full sm:w-[280px] border-gray-200',
inputWrapper: 'px-3 py-2 h-fit rounded-md',
@@ -383,7 +385,11 @@ export function MasterKandangContent() {
diff --git a/src/services/http/client.ts b/src/services/http/client.ts
index c9fbfe2c..64bf9680 100644
--- a/src/services/http/client.ts
+++ b/src/services/http/client.ts
@@ -5,7 +5,7 @@ import { RequestOptions } from '@/services/http/base';
import { redirectToSSO } from '@/lib/auth-helper';
const BASE_URL = process.env.NEXT_PUBLIC_API_BASE_URL ?? '';
-const axiosClient = axios.create({ baseURL: BASE_URL, timeout: 30_000 });
+const axiosClient = axios.create({ baseURL: BASE_URL, timeout: 60_000 });
axiosClient.interceptors.response.use(
(response) => response,
@@ -38,7 +38,7 @@ export async function httpClient(
method: opts.method ?? 'GET',
params: opts.query,
data: opts.body,
- timeout: opts.timeoutMs ?? 30_000,
+ timeout: opts.timeoutMs ?? 60_000,
withCredentials: isCookieAuth && !isBearerAuth,
responseType: opts.responseType,
headers: {
diff --git a/src/types/api/production/recording.d.ts b/src/types/api/production/recording.d.ts
index 04392ae4..98f56058 100644
--- a/src/types/api/production/recording.d.ts
+++ b/src/types/api/production/recording.d.ts
@@ -117,6 +117,7 @@ export type CreateGrowingRecordingPayload = {
product_warehouse_id?: number;
source_product_warehouse_id?: number;
qty?: number;
+ product_warehouse?: ProductWarehouse;
}[];
};
@@ -124,6 +125,7 @@ export type CreateEggPayload = {
product_warehouse_id?: number;
qty?: number;
weight?: number;
+ product_warehouse?: ProductWarehouse;
};
export type CreateLayingRecordingPayload = CreateGrowingRecordingPayload & {
| | |