import React, { useEffect, useState } 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 { 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, Monitor, Search } from 'lucide-react'; import { SystemDetails, SystemDetailsCreateRequest, SystemDetailsUpdateRequest, SystemDetailsCreateSchema, SystemDetailsUpdateSchema, Asset } from '@/types/asset-management'; import { useAssets } from '@/hooks/asset-management/useAssets'; interface SystemDetailsFormProps { systemDetails?: SystemDetails; preselectedAssetId?: number; onSubmit: (data: SystemDetailsCreateRequest | SystemDetailsUpdateRequest) => Promise; onCancel: () => void; isSubmitting?: boolean; title?: string; } type SystemDetailsFormValues = { assetID: number; systemModel: string; processor: string; installedRAM: string; graphics: string; screenResolution: string; diskModel: string; diskSize: string; manufacturer: string; }; const SystemDetailsForm: React.FC = ({ systemDetails, preselectedAssetId, onSubmit, onCancel, isSubmitting = false, title }) => { const isEditing = !!systemDetails; const formTitle = title || (isEditing ? 'Edit System Details' : 'Create System Details'); const { data: assets = [], isLoading: isLoadingAssets } = useAssets(); const [assetSearch, setAssetSearch] = useState(''); const form = useForm({ resolver: zodResolver(isEditing ? SystemDetailsUpdateSchema.omit({ systemDetailsID: true }) : SystemDetailsCreateSchema), defaultValues: { assetID: systemDetails?.assetID || preselectedAssetId || 0, systemModel: systemDetails?.systemModel || '', processor: systemDetails?.processor || '', installedRAM: systemDetails?.installedRAM || '', graphics: systemDetails?.graphics || '', screenResolution: systemDetails?.screenResolution || '', diskModel: systemDetails?.diskModel || '', diskSize: systemDetails?.diskSize || '', manufacturer: systemDetails?.manufacturer || '', }, }); // Filter assets based on search term const filteredAssets = assets.filter(asset => asset.assetType.toLowerCase().includes(assetSearch.toLowerCase()) || asset.brandModel.toLowerCase().includes(assetSearch.toLowerCase()) || asset.serialNumber.toLowerCase().includes(assetSearch.toLowerCase()) || asset.assetCode.toLowerCase().includes(assetSearch) ); const handleSubmit = async (values: SystemDetailsFormValues) => { try { if (isEditing && systemDetails) { const updateData: SystemDetailsUpdateRequest = { systemDetailsID: systemDetails.systemDetailsID, ...values, }; await onSubmit(updateData); } else { const createData: SystemDetailsCreateRequest = values; await onSubmit(createData); } } catch (error) { console.error('Form submission error:', error); // Set form errors if validation failed if (error instanceof Error) { if (error.message.includes('Asset with ID') && error.message.includes('does not exist')) { form.setError('assetID', { type: 'manual', message: 'The selected asset does not exist. Please select a valid asset.' }); } else if (error.message.includes('System details already exist')) { form.setError('assetID', { type: 'manual', message: 'System details already exist for this asset. Please select a different asset.' }); } else if (error.message.includes('System model')) { form.setError('systemModel', { type: 'manual', message: 'Invalid system model format.' }); } else if (error.message.includes('Processor')) { form.setError('processor', { type: 'manual', message: 'Invalid processor information.' }); } else { // Set a general form error form.setError('root', { type: 'manual', message: error.message }); } } } }; // Common RAM options const ramOptions = [ '4GB', '8GB', '16GB', '32GB', '64GB', '128GB' ]; // Common screen resolutions const resolutionOptions = [ '1366x768', '1920x1080', '2560x1440', '3840x2160', '2560x1600', '1440x900' ]; // Common disk sizes const diskSizeOptions = [ '128GB', '256GB', '512GB', '1TB', '2TB', '4TB' ]; return ( {formTitle}
{/* Display form-level errors */} {form.formState.errors.root && (

{form.formState.errors.root.message}

)} {/* Asset Selection */} ( Asset * Select the asset for which you want to add system details.
setAssetSearch(e.target.value)} className="pl-10" />
({ value: asset.assetID.toString(), label: `${asset.assetCode} - ${asset.assetType} - ${asset.brandModel}` }))} value={field.value?.toString() || ''} onChange={(value) => field.onChange(parseInt(value))} placeholder="Select an asset" disabled={isLoadingAssets || (isEditing && !!systemDetails)} error={!!form.formState.errors.assetID} aria-label="Asset selection" aria-describedby={form.formState.errors.assetID ? 'assetID-error' : undefined} />
)} />
{/* System Model */} ( System Model * )} /> {/* Manufacturer */} ( Manufacturer * )} /> {/* Processor */} ( Processor * )} /> {/* Installed RAM */} ( Installed RAM * ({ value: ram, label: ram })), { value: 'custom', label: 'Custom Amount' } ]} value={field.value} onChange={field.onChange} placeholder="Select RAM amount" error={!!form.formState.errors.installedRAM} aria-label="RAM amount selection" aria-describedby={form.formState.errors.installedRAM ? 'installedRAM-error' : undefined} /> {field.value === 'custom' && ( field.onChange(e.target.value)} className="mt-2" /> )} )} /> {/* Graphics */} ( Graphics * )} /> {/* Screen Resolution */} ( Screen Resolution * ({ value: resolution, label: resolution })), { value: 'custom', label: 'Custom Resolution' } ]} value={field.value} onChange={field.onChange} placeholder="Select resolution" error={!!form.formState.errors.screenResolution} aria-label="Screen resolution selection" aria-describedby={form.formState.errors.screenResolution ? 'screenResolution-error' : undefined} /> {field.value === 'custom' && ( field.onChange(e.target.value)} className="mt-2" /> )} )} /> {/* Disk Model */} ( Disk Model * )} /> {/* Disk Size */} ( Disk Size * ({ value: size, label: size })), { value: 'custom', label: 'Custom Size' } ]} value={field.value} onChange={field.onChange} placeholder="Select disk size" error={!!form.formState.errors.diskSize} aria-label="Disk size selection" aria-describedby={form.formState.errors.diskSize ? 'diskSize-error' : undefined} /> {field.value === 'custom' && ( field.onChange(e.target.value)} className="mt-2" /> )} )} />
{/* Form Actions */}
); }; export default SystemDetailsForm;