import React from 'react'; import { LucideIcon, Edit, Eye, X } from 'lucide-react'; import Modal, { ModalHeader, ModalBody, ModalFooter } from '../Modal/Modal'; import { Button } from '../Button'; import { Input } from '../Input'; import { StatusIndicatorConfig, getStatusColor } from '../StatusCard'; import { formatters } from '../Stats/StatsPresets'; export interface StatusModalField { label: string; value: string | number | React.ReactNode; type?: 'text' | 'currency' | 'date' | 'datetime' | 'percentage' | 'list' | 'status' | 'image' | 'email' | 'tel' | 'number' | 'select'; highlight?: boolean; span?: 1 | 2; // For grid layout editable?: boolean; // Whether this field can be edited required?: boolean; // Whether this field is required placeholder?: string; // Placeholder text for inputs options?: Array<{label: string; value: string | number}>; // For select fields } export interface StatusModalSection { title: string; icon?: LucideIcon; fields: StatusModalField[]; } export interface StatusModalAction { label: string; icon?: LucideIcon; variant?: 'primary' | 'secondary' | 'outline' | 'danger'; onClick: () => void | Promise; disabled?: boolean; loading?: boolean; } export interface StatusModalProps { isOpen: boolean; onClose: () => void; mode: 'view' | 'edit'; onModeChange?: (mode: 'view' | 'edit') => void; // Content title: string; subtitle?: string; statusIndicator?: StatusIndicatorConfig; image?: string; sections: StatusModalSection[]; // Actions actions?: StatusModalAction[]; showDefaultActions?: boolean; onEdit?: () => void; onSave?: () => Promise; onCancel?: () => void; onFieldChange?: (sectionIndex: number, fieldIndex: number, value: string | number) => void; // Layout size?: 'sm' | 'md' | 'lg' | 'xl' | '2xl'; loading?: boolean; } /** * Format field value based on type */ const formatFieldValue = (value: string | number | React.ReactNode, type: StatusModalField['type'] = 'text'): React.ReactNode => { if (React.isValidElement(value)) return value; switch (type) { case 'currency': return formatters.currency(Number(value)); case 'date': return new Date(String(value)).toLocaleDateString('es-ES'); case 'datetime': return new Date(String(value)).toLocaleString('es-ES'); case 'percentage': return `${value}%`; case 'list': if (Array.isArray(value)) { return ( ); } return String(value); case 'status': return ( {String(value)} ); case 'image': return ( ); default: return String(value); } }; /** * Render editable field based on type and mode */ const renderEditableField = ( field: StatusModalField, isEditMode: boolean, onChange?: (value: string | number) => void ): React.ReactNode => { if (!isEditMode || !field.editable) { return formatFieldValue(field.value, field.type); } const handleChange = (e: React.ChangeEvent) => { const value = field.type === 'number' || field.type === 'currency' ? Number(e.target.value) : e.target.value; onChange?.(value); }; const inputValue = field.type === 'currency' ? Number(String(field.value).replace(/[^0-9.-]+/g, '')) : field.value; switch (field.type) { case 'email': return ( ); case 'tel': return ( ); case 'number': case 'currency': return ( ); case 'date': const dateValue = field.value ? new Date(String(field.value)).toISOString().split('T')[0] : ''; return ( ); case 'list': return (