import React, { useState } from 'react'; import { useForm, useFieldArray } 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 { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card'; import { Loader2, Plus, X, Send, Trash2 } from 'lucide-react'; import { CustomDropdown } from '@/components/asset-management/shared/CustomDropdown'; import { AssetRequestCreateRequest, AssetRequestCreateSchema, RequestedAssetItem, ASSET_REQUEST_CONFIG, } from '@/types/asset-request'; import { ASSET_TYPES } from '@/types/asset-management'; interface AssetRequestFormProps { employeeID: number; onSubmit: (data: AssetRequestCreateRequest) => Promise; isSubmitting?: boolean; } type AssetRequestFormValues = { requestedAssets: RequestedAssetItem[]; justification: string; }; const AssetRequestForm: React.FC = ({ employeeID, onSubmit, isSubmitting = false, }) => { const [justificationLength, setJustificationLength] = useState(0); const form = useForm({ resolver: zodResolver(AssetRequestCreateSchema.omit({ employeeID: true })), defaultValues: { requestedAssets: [ { assetType: '', quantity: 1, specifications: '', }, ], justification: '', }, }); const { fields, append, remove } = useFieldArray({ control: form.control, name: 'requestedAssets', }); const handleSubmit = async (values: AssetRequestFormValues) => { try { const requestData: AssetRequestCreateRequest = { employeeID, requestedAssets: values.requestedAssets, justification: values.justification, }; await onSubmit(requestData); // Reset form on successful submission form.reset({ requestedAssets: [ { assetType: '', quantity: 1, specifications: '', }, ], justification: '', }); setJustificationLength(0); } catch (error) { console.error('Form submission error:', error); if (error instanceof Error) { form.setError('root', { type: 'manual', message: error.message, }); } } }; const handleAddItem = () => { if (fields.length < ASSET_REQUEST_CONFIG.MAX_ITEMS_PER_REQUEST) { append({ assetType: '', quantity: 1, specifications: '', }); } }; const handleRemoveItem = (index: number) => { if (fields.length > 1) { remove(index); } }; return ( Request Assets

Submit a request for assets you need. You can request multiple items at once.

{/* Display form-level errors */} {form.formState.errors.root && (

{form.formState.errors.root.message}

)} {/* Requested Assets Section */}

Requested Assets

{fields.map((field, index) => (

Item {index + 1}

{fields.length > 1 && ( )}
{/* Asset Type */} ( Asset Type * ({ value: type, label: type, }))} value={field.value} onChange={field.onChange} placeholder="Select asset type" error={ !!form.formState.errors.requestedAssets?.[index]?.assetType } aria-label={`Asset type for item ${index + 1}`} /> )} /> {/* Quantity */} ( Quantity * field.onChange(parseInt(e.target.value) || 1)} aria-label={`Quantity for item ${index + 1}`} /> )} />
{/* Specifications */} ( Specifications (Optional)