import React, { useState, useEffect, useCallback } from 'react'; import { Box, Typography, TextField, Button, Paper, IconButton, Menu, MenuItem, Table, TableBody, TableCell, TableContainer, TableHead, TableRow, TablePagination, CircularProgress, Alert } from '@mui/material'; import AddIcon from '@mui/icons-material/Add'; import MoreVertIcon from '@mui/icons-material/MoreVert'; import estadoBobinaService from '../../services/estadoBobinaService'; import type { EstadoBobinaDto } from '../../models/dtos/Impresion/EstadoBobinaDto'; import type { CreateEstadoBobinaDto } from '../../models/dtos/Impresion/CreateEstadoBobinaDto'; import type { UpdateEstadoBobinaDto } from '../../models/dtos/Impresion/UpdateEstadoBobinaDto'; import EstadoBobinaFormModal from '../../components/Modals/EstadoBobinaFormModal'; import { usePermissions } from '../../hooks/usePermissions'; import axios from 'axios'; const GestionarEstadosBobinaPage: React.FC = () => { const [estadosBobina, setEstadosBobina] = useState([]); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); const [filtroDenominacion, setFiltroDenominacion] = useState(''); const [modalOpen, setModalOpen] = useState(false); const [editingEstado, setEditingEstado] = useState(null); const [apiErrorMessage, setApiErrorMessage] = useState(null); const [page, setPage] = useState(0); const [rowsPerPage, setRowsPerPage] = useState(5); const [anchorEl, setAnchorEl] = useState(null); const [selectedEstadoRow, setSelectedEstadoRow] = useState(null); const { tienePermiso, isSuperAdmin } = usePermissions(); // Permisos para Estados de Bobina (ej: IB010 a IB013) const puedeVer = isSuperAdmin || tienePermiso("IB010"); const puedeCrear = isSuperAdmin || tienePermiso("IB011"); const puedeModificar = isSuperAdmin || tienePermiso("IB012"); const puedeEliminar = isSuperAdmin || tienePermiso("IB013"); const cargarEstadosBobina = useCallback(async () => { if (!puedeVer) { setError("No tiene permiso para ver esta sección."); setLoading(false); return; } setLoading(true); setError(null); setApiErrorMessage(null); try { const data = await estadoBobinaService.getAllEstadosBobina(filtroDenominacion); setEstadosBobina(data); } catch (err) { console.error(err); setError('Error al cargar los estados de bobina.'); } finally { setLoading(false); } }, [filtroDenominacion, puedeVer]); useEffect(() => { cargarEstadosBobina(); }, [cargarEstadosBobina]); const handleOpenModal = (estado?: EstadoBobinaDto) => { setEditingEstado(estado || null); setApiErrorMessage(null); setModalOpen(true); }; const handleCloseModal = () => { setModalOpen(false); setEditingEstado(null); }; const handleSubmitModal = async (data: CreateEstadoBobinaDto | (UpdateEstadoBobinaDto & { idEstadoBobina: number })) => { setApiErrorMessage(null); try { if (editingEstado && 'idEstadoBobina' in data) { await estadoBobinaService.updateEstadoBobina(editingEstado.idEstadoBobina, data); } else { await estadoBobinaService.createEstadoBobina(data as CreateEstadoBobinaDto); } cargarEstadosBobina(); } catch (err: any) { console.error("Error en submit modal (padre - EstadosBobina):", err); const message = axios.isAxiosError(err) && err.response?.data?.message ? err.response.data.message : 'Ocurrió un error inesperado al guardar el estado de bobina.'; setApiErrorMessage(message); throw err; } }; const handleDelete = async (id: number) => { if (window.confirm(`¿Está seguro de que desea eliminar este estado de bobina (ID: ${id})?`)) { setApiErrorMessage(null); try { await estadoBobinaService.deleteEstadoBobina(id); cargarEstadosBobina(); } catch (err: any) { console.error("Error al eliminar estado de bobina:", err); const message = axios.isAxiosError(err) && err.response?.data?.message ? err.response.data.message : 'Ocurrió un error inesperado al eliminar el estado de bobina.'; setApiErrorMessage(message); } } handleMenuClose(); }; const handleMenuOpen = (event: React.MouseEvent, estado: EstadoBobinaDto) => { setAnchorEl(event.currentTarget); setSelectedEstadoRow(estado); }; const handleMenuClose = () => { setAnchorEl(null); setSelectedEstadoRow(null); }; const handleChangePage = (_event: unknown, newPage: number) => { setPage(newPage); }; const handleChangeRowsPerPage = (event: React.ChangeEvent) => { setRowsPerPage(parseInt(event.target.value, 10)); setPage(0); }; const displayData = estadosBobina.slice(page * rowsPerPage, page * rowsPerPage + rowsPerPage); if (!loading && !puedeVer) { return ( Gestionar Estados de Bobina {error || "No tiene permiso para acceder a esta sección."} ); } return ( Gestionar Estados de Bobina setFiltroDenominacion(e.target.value)} /> {puedeCrear && ( )} {loading && } {error && !loading && {error}} {apiErrorMessage && {apiErrorMessage}} {!loading && !error && ( Denominación Observación {(puedeModificar || puedeEliminar) && Acciones} {displayData.length === 0 && !loading ? ( No se encontraron estados de bobina. ) : ( displayData.map((estado) => ( {estado.denominacion} {estado.obs || '-'} {(puedeModificar || puedeEliminar) && ( handleMenuOpen(e, estado)} disabled={!puedeModificar && !puedeEliminar} > )} )) )}
)} {puedeModificar && ( { handleOpenModal(selectedEstadoRow!); handleMenuClose(); }}> Modificar )} {puedeEliminar && ( handleDelete(selectedEstadoRow!.idEstadoBobina)}> Eliminar )} {(!puedeModificar && !puedeEliminar) && Sin acciones} setApiErrorMessage(null)} />
); }; export default GestionarEstadosBobinaPage;