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 otroDestinoService from '../../services/Distribucion/otroDestinoService'; import type { OtroDestinoDto } from '../../models/dtos/Distribucion/OtroDestinoDto'; import type { CreateOtroDestinoDto } from '../../models/dtos/Distribucion/CreateOtroDestinoDto'; import type { UpdateOtroDestinoDto } from '../../models/dtos/Distribucion/UpdateOtroDestinoDto'; import OtroDestinoFormModal from '../../components/Modals/Distribucion/OtroDestinoFormModal'; import { usePermissions } from '../../hooks/usePermissions'; import axios from 'axios'; const GestionarOtrosDestinosPage: React.FC = () => { const [otrosDestinos, setOtrosDestinos] = useState([]); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); const [filtroNombre, setFiltroNombre] = useState(''); const [modalOpen, setModalOpen] = useState(false); const [editingDestino, setEditingDestino] = useState(null); const [apiErrorMessage, setApiErrorMessage] = useState(null); const [page, setPage] = useState(0); const [rowsPerPage, setRowsPerPage] = useState(5); const [anchorEl, setAnchorEl] = useState(null); const [selectedDestinoRow, setSelectedDestinoRow] = useState(null); const { tienePermiso, isSuperAdmin } = usePermissions(); // Permisos para Otros Destinos (OD001 a OD004) - Revisa tus códigos de permiso const puedeVer = isSuperAdmin || tienePermiso("OD001"); // Asumiendo OD001 es ver entidad const puedeCrear = isSuperAdmin || tienePermiso("OD002"); const puedeModificar = isSuperAdmin || tienePermiso("OD003"); const puedeEliminar = isSuperAdmin || tienePermiso("OD004"); const cargarOtrosDestinos = 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 otroDestinoService.getAllOtrosDestinos(filtroNombre); setOtrosDestinos(data); } catch (err) { console.error(err); setError('Error al cargar los otros destinos.'); } finally { setLoading(false); } }, [filtroNombre, puedeVer]); useEffect(() => { cargarOtrosDestinos(); }, [cargarOtrosDestinos]); const handleOpenModal = (destino?: OtroDestinoDto) => { setEditingDestino(destino || null); setApiErrorMessage(null); setModalOpen(true); }; const handleCloseModal = () => { setModalOpen(false); setEditingDestino(null); }; const handleSubmitModal = async (data: CreateOtroDestinoDto | (UpdateOtroDestinoDto & { idDestino: number })) => { setApiErrorMessage(null); try { if (editingDestino && 'idDestino' in data) { await otroDestinoService.updateOtroDestino(editingDestino.idDestino, data); } else { await otroDestinoService.createOtroDestino(data as CreateOtroDestinoDto); } cargarOtrosDestinos(); } catch (err: any) { const message = axios.isAxiosError(err) && err.response?.data?.message ? err.response.data.message : 'Ocurrió un error inesperado al guardar el destino.'; setApiErrorMessage(message); throw err; } }; const handleDelete = async (id: number) => { if (window.confirm(`¿Está seguro de que desea eliminar este destino (ID: ${id})?`)) { setApiErrorMessage(null); try { await otroDestinoService.deleteOtroDestino(id); cargarOtrosDestinos(); } catch (err: any) { const message = axios.isAxiosError(err) && err.response?.data?.message ? err.response.data.message : 'Ocurrió un error inesperado al eliminar el destino.'; setApiErrorMessage(message); } } handleMenuClose(); }; const handleMenuOpen = (event: React.MouseEvent, destino: OtroDestinoDto) => { setAnchorEl(event.currentTarget); setSelectedDestinoRow(destino); }; const handleMenuClose = () => { setAnchorEl(null); setSelectedDestinoRow(null); }; const handleChangePage = (_event: unknown, newPage: number) => setPage(newPage); const handleChangeRowsPerPage = (event: React.ChangeEvent) => { setRowsPerPage(parseInt(event.target.value, 10)); setPage(0); }; const displayData = otrosDestinos.slice(page * rowsPerPage, page * rowsPerPage + rowsPerPage); if (!loading && !puedeVer) { return ( Gestionar Otros Destinos {error || "No tiene permiso para acceder a esta sección."} ); } return ( Gestionar Otros Destinos setFiltroNombre(e.target.value)} /> {puedeCrear && ( )} {loading && } {error && !loading && {error}} {apiErrorMessage && {apiErrorMessage}} {!loading && !error && ( Nombre Observación {(puedeModificar || puedeEliminar) && Acciones} {displayData.length === 0 && !loading ? ( No se encontraron otros destinos. ) : ( displayData.map((destino) => ( {destino.nombre} {destino.obs || '-'} {(puedeModificar || puedeEliminar) && ( handleMenuOpen(e, destino)} disabled={!puedeModificar && !puedeEliminar}> )} )) )}
)} {puedeModificar && ( { handleOpenModal(selectedDestinoRow!); handleMenuClose(); }}>Modificar )} {puedeEliminar && ( handleDelete(selectedDestinoRow!.idDestino)}>Eliminar )} {(!puedeModificar && !puedeEliminar) && Sin acciones} setApiErrorMessage(null)} />
); }; export default GestionarOtrosDestinosPage;