diff --git a/src/components/pages/expense/form/ExpenseRealizationKandangDetailExpense.tsx b/src/components/pages/expense/form/ExpenseRealizationKandangDetailExpense.tsx new file mode 100644 index 00000000..8b889c5b --- /dev/null +++ b/src/components/pages/expense/form/ExpenseRealizationKandangDetailExpense.tsx @@ -0,0 +1,224 @@ +'use client'; + +import { FormikContextType } from 'formik'; + +import Card from '@/components/Card'; +import SelectInput, { + OptionType, + useSelect, +} from '@/components/input/SelectInput'; +import NumberInput from '@/components/input/NumberInput'; +import TextInput from '@/components/input/TextInput'; + +import { ExpenseRealizationFormValues } from '@/components/pages/expense/form/ExpenseRealizationForm.schema'; +import { cn } from '@/lib/helper'; +import { NonstockApi } from '@/services/api/master-data'; +import { Nonstock } from '@/types/api/master-data/nonstock'; + +interface ExpenseRealizationKandangDetailExpenseProps { + type?: 'add' | 'edit' | 'detail'; + formik: FormikContextType; + className?: { + wrapper?: string; + }; +} + +const ExpenseRealizationKandangDetailExpense: React.FC< + ExpenseRealizationKandangDetailExpenseProps +> = ({ type, formik, className }) => { + const { + setInputValue: setNonstockInputValue, + options: nonstockOptions, + isLoadingOptions: isLoadingNonstockOptions, + } = useSelect(NonstockApi.basePath, 'id', 'name'); + + const nonstockChangeHandler = ( + kandangExpenseIdx: number, + costItemIdx: number, + val: OptionType | OptionType[] | null + ) => { + formik.setFieldTouched( + `realizations[${kandangExpenseIdx}].cost_items[${costItemIdx}].nonstock`, + true + ); + formik.setFieldValue( + `realizations[${kandangExpenseIdx}].cost_items[${costItemIdx}].nonstock`, + val + ); + }; + + const isExpenseRepeaterInputError = ( + column: 'nonstock' | 'quantity' | 'total_cost' | 'notes', + kandangExpenseIdx: number, + expenseIdx: number + ) => { + return ( + formik.touched.realizations?.[kandangExpenseIdx]?.cost_items?.[ + expenseIdx + ]?.[column] && + Boolean( + formik.errors.realizations?.[kandangExpenseIdx] instanceof Object && + formik.errors.realizations?.[kandangExpenseIdx].cost_items?.[ + expenseIdx + ] instanceof Object && + formik.errors.realizations?.[kandangExpenseIdx].cost_items?.[ + expenseIdx + ]?.[column] + ) + ); + }; + + return ( + +
+

+ Rincian Realisasi Biaya Operasional +

+
+ +
+ {formik.values.realizations.length === 0 && ( +
+

+ Pilih kandang terlebih dahulu! +

+
+ )} + + {formik.values.realizations.map((kandangExpense, kandangExpenseIdx) => { + const kandangName = formik.values.kandangs?.find( + (kandang) => kandang.id === kandangExpense.kandang_id + ); + + return ( + kandangName?.name && ( +
+
+
+ Biaya {kandangName?.name} +
+ +
+ + + + + + + + + + + + {kandangExpense.cost_items.map( + (expenseItem, expenseIdx) => ( + + + + + + + + + + ) + )} + +
NonstockTotal KuantitasTotal BiayaCatatan
+ { + nonstockChangeHandler( + kandangExpenseIdx, + expenseIdx, + val + ); + }} + options={nonstockOptions} + isLoading={isLoadingNonstockOptions} + onInputChange={setNonstockInputValue} + className={{ wrapper: 'min-w-48' }} + isDisabled + /> + + + + + Rp + + } + className={{ wrapper: 'min-w-24' }} + /> + + +
+
+
+
+ ) + ); + })} +
+
+ ); +}; + +export default ExpenseRealizationKandangDetailExpense;