import React, { useState, useEffect } from 'react'; import { Modal, Box, Typography, TextField, Button, CircularProgress, Alert, FormControl, InputLabel, Select, MenuItem, FormControlLabel, Checkbox } from '@mui/material'; import type { CanillaDto } from '../../../models/dtos/Distribucion/CanillaDto'; import type { CreateCanillaDto } from '../../../models/dtos/Distribucion/CreateCanillaDto'; import type { UpdateCanillaDto } from '../../../models/dtos/Distribucion/UpdateCanillaDto'; import type { ZonaDto } from '../../../models/dtos/Zonas/ZonaDto'; // Para el dropdown de zonas import type { EmpresaDto } from '../../../models/dtos/Distribucion/EmpresaDto'; // Para el dropdown de empresas import zonaService from '../../../services/Distribucion/zonaService'; import empresaService from '../../../services/Distribucion/empresaService'; const modalStyle = { position: 'absolute' as 'absolute', top: '50%', left: '50%', transform: 'translate(-50%, -50%)', width: { xs: '90%', sm: 600 }, // Un poco más ancho bgcolor: 'background.paper', border: '2px solid #000', boxShadow: 24, p: 4, maxHeight: '90vh', overflowY: 'auto' }; interface CanillaFormModalProps { open: boolean; onClose: () => void; onSubmit: (data: CreateCanillaDto | UpdateCanillaDto, id?: number) => Promise; initialData?: CanillaDto | null; errorMessage?: string | null; clearErrorMessage: () => void; } const CanillaFormModal: React.FC = ({ open, onClose, onSubmit, initialData, errorMessage, clearErrorMessage }) => { const [legajo, setLegajo] = useState(''); // Manejar como string para el TextField const [nomApe, setNomApe] = useState(''); const [parada, setParada] = useState(''); const [idZona, setIdZona] = useState(''); const [accionista, setAccionista] = useState(false); const [obs, setObs] = useState(''); const [empresa, setEmpresa] = useState(0); // 0 para N/A (accionista) const [zonas, setZonas] = useState([]); const [empresas, setEmpresas] = useState([]); const [loading, setLoading] = useState(false); const [loadingDropdowns, setLoadingDropdowns] = useState(false); const [localErrors, setLocalErrors] = useState<{ [key: string]: string | null }>({}); const isEditing = Boolean(initialData); useEffect(() => { const fetchDropdownData = async () => { setLoadingDropdowns(true); try { const [zonasData, empresasData] = await Promise.all([ zonaService.getAllZonas(), // Asume que este servicio devuelve zonas activas empresaService.getAllEmpresas() ]); setZonas(zonasData); setEmpresas(empresasData); } catch (error) { console.error("Error al cargar datos para dropdowns", error); setLocalErrors(prev => ({...prev, dropdowns: 'Error al cargar zonas/empresas.'})); } finally { setLoadingDropdowns(false); } }; if (open) { fetchDropdownData(); setLegajo(initialData?.legajo?.toString() || ''); setNomApe(initialData?.nomApe || ''); setParada(initialData?.parada || ''); setIdZona(initialData?.idZona || ''); setAccionista(initialData ? initialData.accionista : false); setObs(initialData?.obs || ''); setEmpresa(initialData ? initialData.empresa : 0); // Si es accionista, empresa es 0 setLocalErrors({}); clearErrorMessage(); } }, [open, initialData, clearErrorMessage]); const validate = (): boolean => { const errors: { [key: string]: string | null } = {}; if (!nomApe.trim()) errors.nomApe = 'Nombre y Apellido son obligatorios.'; if (!idZona) errors.idZona = 'Debe seleccionar una zona.'; const legajoNum = legajo ? parseInt(legajo, 10) : null; if (legajo.trim() && (isNaN(legajoNum!) || legajoNum! < 0)) { errors.legajo = 'Legajo debe ser un número positivo o vacío.'; } // Lógica de empresa y accionista if (accionista && empresa !== 0 && empresa !== '') { errors.empresa = 'Si es Accionista, la Empresa debe ser N/A (0).'; } if (!accionista && (empresa === 0 || empresa === '')) { errors.empresa = 'Si no es Accionista, debe seleccionar una Empresa.'; } setLocalErrors(errors); return Object.keys(errors).length === 0; }; const handleInputChange = (fieldName: string) => { if (localErrors[fieldName]) { setLocalErrors(prev => ({ ...prev, [fieldName]: null })); } if (errorMessage) clearErrorMessage(); }; const handleSubmit = async (event: React.FormEvent) => { event.preventDefault(); clearErrorMessage(); if (!validate()) return; setLoading(true); try { const legajoParsed = legajo.trim() ? parseInt(legajo, 10) : null; const dataToSubmit = { legajo: legajoParsed, nomApe, parada: parada || undefined, idZona: Number(idZona), accionista, obs: obs || undefined, empresa: Number(empresa) }; if (isEditing && initialData) { await onSubmit(dataToSubmit as UpdateCanillaDto, initialData.idCanilla); } else { await onSubmit(dataToSubmit as CreateCanillaDto); } onClose(); } catch (error: any) { console.error("Error en submit de CanillaFormModal:", error); } finally { setLoading(false); } }; return ( {isEditing ? 'Editar Canillita' : 'Agregar Nuevo Canillita'} {/* SECCIÓN DE CAMPOS CON BOX Y FLEXBOX */} {setLegajo(e.target.value); handleInputChange('legajo');}} margin="dense" fullWidth error={!!localErrors.legajo} helperText={localErrors.legajo || ''} disabled={loading} sx={{ flex: 1, minWidth: 'calc(50% - 8px)' }} /> {setNomApe(e.target.value); handleInputChange('nomApe');}} margin="dense" fullWidth error={!!localErrors.nomApe} helperText={localErrors.nomApe || ''} disabled={loading} autoFocus={!isEditing} sx={{ flex: 1, minWidth: 'calc(50% - 8px)' }} /> setParada(e.target.value)} margin="dense" fullWidth multiline rows={2} disabled={loading} /> Zona {localErrors.idZona && {localErrors.idZona}} Empresa {localErrors.empresa && {localErrors.empresa}} setObs(e.target.value)} margin="dense" fullWidth multiline rows={2} disabled={loading} sx={{mt:1}} /> { setAccionista(e.target.checked); if (e.target.checked) setEmpresa(0); handleInputChange('accionista'); handleInputChange('empresa'); }} disabled={loading}/>} label="Es Accionista" /> {errorMessage && {errorMessage}} {localErrors.dropdowns && {localErrors.dropdowns}} ); }; export default CanillaFormModal;