'use client'; import React, { useState } from 'react'; import { Button } from '@/components/ui/button'; import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card'; import { QuantityInput } from '@/components/ui/quantity-input'; import { CurrencyInput } from '@/components/ui/currency-input'; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from '@/components/ui/select'; import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow, } from '@/components/ui/table'; import type { ExpenseItem } from '../types'; import { formatAmount } from '../utils'; // 공과 옵션 타입 interface ExpenseOption { value: string; label: string; } interface ExpenseDetailSectionProps { expenseItems: ExpenseItem[]; expenseOptions: ExpenseOption[]; // 공과 품목 옵션 (Items API에서 조회) isViewMode: boolean; onAddItems: (count: number) => void; onRemoveSelected: () => void; onItemChange: (id: string, field: keyof ExpenseItem, value: string | number) => void; onSelectItem: (id: string, selected: boolean) => void; onSelectAll: (selected: boolean) => void; } export function ExpenseDetailSection({ expenseItems, expenseOptions, isViewMode, onAddItems, onRemoveSelected, onItemChange, onSelectItem, onSelectAll, }: ExpenseDetailSectionProps) { const [expenseAddCount, setExpenseAddCount] = useState(1); const selectedCount = expenseItems.filter((item) => item.selected).length; const allSelected = expenseItems.length > 0 && expenseItems.every((item) => item.selected); return (
공과 상세 전체 {expenseItems.length}건 {!isViewMode && selectedCount > 0 && ( <> / {selectedCount}개 항목 선택됨 )}
{!isViewMode && (
setExpenseAddCount(val)} className="w-16 text-center" id="expense-add-count" />
)}
{!isViewMode && ( onSelectAll(e.target.checked)} /> )} 공과 금액 {expenseItems.length === 0 ? ( 등록된 공과가 없습니다. ) : ( expenseItems.map((item) => ( {!isViewMode && ( onSelectItem(item.id, e.target.checked)} /> )} onItemChange(item.id, 'amount', value ?? 0)} disabled={isViewMode} className={`text-right ${isViewMode ? 'bg-gray-50' : 'bg-white'}`} /> )) )} {/* 합계 행 */} {expenseItems.length > 0 && ( 합계 {formatAmount(expenseItems.reduce((sum, item) => sum + item.amount, 0))} )}
); }