import { Pencil, Plus, X } from 'lucide-react' import type { ReactNode } from 'react' import { useT } from '../i18n/useT' import type { InvoiceItemTemplate } from '../types/invoice' import { formatIrtInput } from '../utils/irtPrice' import type { DraftAccount, DraftKeyPoint, DraftLineItem } from '../utils/invoiceDraft' import { draftItemFromItemTemplate, emptyDraftAccount, emptyDraftItem, emptyDraftKeyPoint, } from '../utils/invoiceDraft' import formStyles from './InvoiceForm.module.css' import styles from './InvoiceDraftFields.module.css' function focusKeyPointInput(index: number) { const el = document.querySelector(`input[data-keypoint-index="${index}"]`) el?.focus() el?.select() } type Props = { itemTemplates: InvoiceItemTemplate[] items: DraftLineItem[] keyPoints: DraftKeyPoint[] accounts: DraftAccount[] selectedItemTemplateId: string onSelectedItemTemplateId: (id: string) => void onItemsChange: (items: DraftLineItem[]) => void onKeyPointsChange: (points: DraftKeyPoint[]) => void onAccountsChange: (accounts: DraftAccount[]) => void showItemTemplatePicker?: boolean /** Rendered after line items (before key points / accounts), e.g. totals row. */ afterItems?: ReactNode } export function InvoiceDraftFields({ itemTemplates, items, keyPoints, accounts, selectedItemTemplateId, onSelectedItemTemplateId, onItemsChange, onKeyPointsChange, onAccountsChange, showItemTemplatePicker = true, afterItems, }: Props) { const t = useT() function updateItem(key: string, patch: Partial) { onItemsChange(items.map((item) => (item.key === key ? { ...item, ...patch } : item))) } function removeItem(key: string) { if (items.length <= 1) return onItemsChange(items.filter((item) => item.key !== key)) } function addFromItemTemplate() { const template = itemTemplates.find((entry) => entry.id === selectedItemTemplateId) if (!template) return const onlyEmpty = items.length === 1 && !items[0].title.trim() && !items[0].price.trim() && !items[0].description.trim() onItemsChange(onlyEmpty ? [draftItemFromItemTemplate(template)] : [...items, draftItemFromItemTemplate(template)]) onSelectedItemTemplateId('') } return ( <>
{items.map((item, index) => (
{t('invoiceDraft.itemLabel', { index: index + 1 })}
updateItem(item.key, { title: e.target.value })} placeholder={t('invoiceDraft.fieldTitlePlaceholder')} />
updateItem(item.key, { duration: e.target.value })} placeholder={t('invoiceDraft.fieldDurationPlaceholder')} />
updateItem(item.key, { worktime: e.target.value })} placeholder={t('invoiceDraft.fieldWorktimePlaceholder')} />
updateItem(item.key, { price: formatIrtInput(e.target.value) })} placeholder="0" />
updateItem(item.key, { discountedPrice: formatIrtInput(e.target.value) }) } placeholder={t('invoiceDraft.fieldDiscountedPricePlaceholder')} />