'use client'; import { FormikContextType } from 'formik'; import { Icon } from '@iconify/react'; 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 Button from '@/components/Button'; import { ExpenseRequestFormValues } from '@/components/pages/expense/form/ExpenseRequestForm.schema'; import { cn } from '@/lib/helper'; import { NonstockApi } from '@/services/api/master-data'; import { Nonstock } from '@/types/api/master-data/nonstock'; import { removeArrayItemAndSync } from '@/lib/utils/formik'; interface ExpenseRequestKandangDetailExpenseProps { type?: 'add' | 'edit' | 'detail'; formik: FormikContextType; className?: { wrapper?: string; }; } const ExpenseRequestKandangDetailExpense: React.FC< ExpenseRequestKandangDetailExpenseProps > = ({ type, formik, className }) => { const { setInputValue: setNonstockInputValue, options: nonstockOptions, isLoadingOptions: isLoadingNonstockOptions, } = useSelect(NonstockApi.basePath, 'id', 'name'); const nonstockChangeHandler = ( kandangExpenseIdx: number, expenseIdx: number, val: OptionType | OptionType[] | null ) => { formik.setFieldTouched( `expense_nonstocks[${kandangExpenseIdx}].cost_items[${expenseIdx}].nonstock`, true ); formik.setFieldValue( `expense_nonstocks[${kandangExpenseIdx}].cost_items[${expenseIdx}].nonstock`, val ); }; const addExpenseItemHandler = (kandangExpenseIdx: number) => { const newExpensesValue = [ ...formik.values.expense_nonstocks[kandangExpenseIdx].cost_items, { nonstock: undefined, price: undefined, quantity: undefined, notes: '', }, ]; formik.setFieldValue( `expense_nonstocks[${kandangExpenseIdx}].cost_items`, newExpensesValue ); }; const deleteExpenseItemHandler = ( kandangExpenseIdx: number, expenseIdx: number ) => { const path = `expense_nonstocks[${kandangExpenseIdx}].cost_items`; // trims values, errors, and touched at expenseIdx removeArrayItemAndSync(formik, path, expenseIdx); }; const isExpenseRepeaterInputError = ( column: 'nonstock' | 'quantity' | 'price' | 'notes', kandangExpenseIdx: number, expenseIdx: number ) => { return ( formik.touched.expense_nonstocks?.[kandangExpenseIdx]?.cost_items?.[ expenseIdx ]?.[column] && Boolean( formik.errors.expense_nonstocks?.[kandangExpenseIdx] instanceof Object && formik.errors.expense_nonstocks?.[kandangExpenseIdx].cost_items?.[ expenseIdx ] instanceof Object && formik.errors.expense_nonstocks?.[kandangExpenseIdx].cost_items?.[ expenseIdx ]?.[column] ) ); }; return (

Rincian Pengajuan Biaya Operasional

{(formik.values.expense_nonstocks.length === 0 || !formik.values.supplier?.value) && (

Pilih kandang terlebih dahulu!

)} {formik.values.expense_nonstocks.length > 0 && formik.values.supplier?.value && formik.values.expense_nonstocks.map( (kandangExpense, kandangExpenseIdx) => { const kandangName = formik.values.kandangs?.find( (kandang) => kandang.id === kandangExpense.kandang_id ); return ( kandangName?.name && (
Biaya {kandangName?.name}
{type !== 'detail' && } {kandangExpense.cost_items.map( (expenseItem, expenseIdx) => ( {type !== 'detail' && ( )} ) )}
Nonstock Total Kuantitas Harga Satuan CatatanAksi
{ nonstockChangeHandler( kandangExpenseIdx, expenseIdx, val ); }} options={nonstockOptions} isLoading={isLoadingNonstockOptions} onInputChange={setNonstockInputValue} className={{ wrapper: 'min-w-48' }} /> Rp } className={{ wrapper: 'min-w-24' }} />
{type !== 'detail' && ( )}
) ); } )}
); }; export default ExpenseRequestKandangDetailExpense;