import React from 'react'; import { useForm } from 'react-hook-form'; import { zodResolver } from '@hookform/resolvers/zod'; import { Button } from '@/components/ui/button'; import { Input } from '@/components/ui/input'; import { Textarea } from '@/components/ui/textarea'; import { Form, FormControl, FormField, FormItem, FormLabel, FormMessage, FormDescription, } from '@/components/ui/form'; import { CustomDropdown } from './shared/CustomDropdown'; import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card'; import { Loader2, Save, X, Package } from 'lucide-react'; import { AssetItem, AssetItemCreateRequest, AssetItemUpdateRequest, AssetItemSchema, ASSET_ITEM_TYPES, ASSET_CONDITIONS, } from '@/types/asset-management'; interface AssetItemFormProps { item?: AssetItem; assetId?: number; onSubmit: (data: AssetItemCreateRequest | AssetItemUpdateRequest) => Promise; onCancel: () => void; isSubmitting?: boolean; } type AssetItemFormValues = { itemType: string; itemName: string; quantity: number; specifications: string; serialNumber?: string; condition: string; notes?: string; }; const AssetItemForm: React.FC = ({ item, assetId, onSubmit, onCancel, isSubmitting = false, }) => { const isEditing = !!item; const form = useForm({ resolver: zodResolver(AssetItemSchema.omit({ itemID: true, assetID: true, addedDate: true })), defaultValues: { itemType: item?.itemType || '', itemName: item?.itemName || '', quantity: item?.quantity || 1, specifications: item?.specifications || '', serialNumber: item?.serialNumber || '', condition: item?.condition || 'Good', notes: item?.notes || '', }, }); const handleSubmit = async (values: AssetItemFormValues) => { try { const addedDate = new Date().toISOString(); if (isEditing && item) { const updateData: AssetItemUpdateRequest = { itemID: item.itemID, assetID: item.assetID, ...values, addedDate: item.addedDate, }; await onSubmit(updateData); } else if (assetId) { const createData: AssetItemCreateRequest = { assetID: assetId, ...values, addedDate, }; await onSubmit(createData); } } catch (error) { console.error('Form submission error:', error); } }; return ( {isEditing ? 'Edit Item' : 'Add New Item'}
{/* Item Type */} ( Item Type * ({ value: type, label: type }))} value={field.value} onChange={field.onChange} placeholder="Select item type" error={!!form.formState.errors.itemType} /> Select the type of component or item. )} /> {/* Item Name */} ( Item Name * Enter the specific name or model of the item. )} /> {/* Quantity */} ( Quantity * field.onChange(parseInt(e.target.value) || 1)} /> Number of units of this item. )} /> {/* Condition */} ( Condition * ({ value: condition, label: condition }))} value={field.value} onChange={field.onChange} placeholder="Select condition" error={!!form.formState.errors.condition} /> Current condition of the item. )} /> {/* Specifications */} ( Specifications * Technical specifications or details about the item. )} /> {/* Serial Number */} ( Serial Number Serial number if available. )} />
{/* Notes */} ( Notes