import { useState } from 'react'; import { useForm } from 'react-hook-form'; import { zodResolver } from '@hookform/resolvers/zod'; import { z } from 'zod'; import { Button } from '@/components/ui/button'; import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card'; import { Input } from '@/components/ui/input'; import { Textarea } from '@/components/ui/textarea'; import { Form, FormControl, FormField, FormItem, FormLabel, FormMessage, } from '@/components/ui/form'; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from '@/components/ui/select'; import { Asset, useAssets } from '@/hooks/useAssets'; const assetSchema = z.object({ asset_code: z.string().min(1, 'Asset code is required'), name: z.string().min(1, 'Asset name is required'), description: z.string().optional(), asset_category_id: z.string().optional(), condition: z.enum(['new', 'used', 'refurbished', 'damaged']), status: z.enum(['in_use', 'available', 'maintenance', 'disposed', 'lost']), assigned_to_department: z.string().optional(), location_id: z.string().optional(), purchase_cost: z.number().min(0, 'Purchase cost must be positive'), current_book_value: z.number().min(0, 'Book value must be positive'), model_number: z.string().optional(), serial_number: z.string().optional(), sub_category: z.string().optional(), }); type AssetFormData = z.infer; interface AssetFormProps { asset?: Asset; onSuccess?: () => void; onCancel?: () => void; } export function AssetForm({ asset, onSuccess, onCancel }: AssetFormProps) { const { createAsset, updateAsset, categories, locations, isCreating, isUpdating } = useAssets(); const [isSubmitting, setIsSubmitting] = useState(false); const form = useForm({ resolver: zodResolver(assetSchema), defaultValues: { asset_code: asset?.asset_code || '', name: asset?.name || '', description: asset?.description || '', asset_category_id: asset?.asset_category_id || '', condition: asset?.condition || 'new', status: asset?.status || 'available', assigned_to_department: asset?.assigned_to_department || '', location_id: asset?.location_id || '', purchase_cost: asset?.purchase_cost || 0, current_book_value: asset?.current_book_value || 0, model_number: asset?.model_number || '', serial_number: asset?.serial_number || '', sub_category: asset?.sub_category || '', }, }); const onSubmit = async (data: AssetFormData) => { setIsSubmitting(true); try { if (asset) { updateAsset({ id: asset.id, ...data } as Partial & { id: string }); } else { createAsset(data as Omit); } onSuccess?.(); } catch (error) { console.error('Error saving asset:', error); } finally { setIsSubmitting(false); } }; return ( {asset ? 'Edit Asset' : 'Create New Asset'}
( Asset Code * )} /> ( Asset Name * )} />
( Description