/** * Form Utilities * Utility functions for common form operations */ /** * Sanitize form values */ export function sanitizeFormValues>( values: T, sanitizers: Partial string>> ): T { const sanitized = { ...values }; for (const key in sanitizers) { if (key in sanitized) { const sanitizer = sanitizers[key]; if (sanitizer) { sanitized[key] = sanitizer(sanitized[key]) as T[Extract]; } } } return sanitized; } /** * Extract form values for specific fields */ export function extractFields>( values: T, fields: (keyof T)[] ): Pick { const extracted = {} as Pick; for (const field of fields) { if (field in values) { extracted[field] = values[field]; } } return extracted; } /** * Check if all required fields are filled */ export function areRequiredFieldsFilled>( values: T, requiredFields: (keyof T)[] ): boolean { return requiredFields.every((field) => { const value = values[field]; return value && value.trim().length > 0; }); } /** * Get empty required fields */ export function getEmptyRequiredFields>( values: T, requiredFields: (keyof T)[] ): (keyof T)[] { return requiredFields.filter((field) => { const value = values[field]; return !value || value.trim().length === 0; }); } /** * Create form field options */ export function createFieldOptions>( fields: Record ) { return fields; } /** * Merge form errors */ export function mergeFormErrors>( ...errorObjects: Array>> ): Record { const merged = {} as Record; for (const errors of errorObjects) { for (const key in errors) { if (errors[key as keyof T] !== undefined) { merged[key as keyof T] = errors[key as keyof T] as string | null; } } } return merged; } /** * Clear specific field errors */ export function clearFieldErrors>( errors: Record, fields: (keyof T)[] ): Record { const cleared = { ...errors }; for (const field of fields) { cleared[field] = null; } return cleared; }