// src/pages/Distribucion/GestionarDistribuidoresPage.tsx 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 distribuidorService from '../../services/Distribucion/distribuidorService'; import type { DistribuidorDto } from '../../models/dtos/Distribucion/DistribuidorDto'; import type { CreateDistribuidorDto } from '../../models/dtos/Distribucion/CreateDistribuidorDto'; import type { UpdateDistribuidorDto } from '../../models/dtos/Distribucion/UpdateDistribuidorDto'; import DistribuidorFormModal from '../../components/Modals/Distribucion/DistribuidorFormModal'; import { usePermissions } from '../../hooks/usePermissions'; import axios from 'axios'; const GestionarDistribuidoresPage: React.FC = () => { const [distribuidores, setDistribuidores] = useState([]); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); const [filtroNombre, setFiltroNombre] = useState(''); const [filtroNroDoc, setFiltroNroDoc] = useState(''); const [modalOpen, setModalOpen] = useState(false); const [editingDistribuidor, setEditingDistribuidor] = useState(null); const [apiErrorMessage, setApiErrorMessage] = useState(null); const [page, setPage] = useState(0); const [rowsPerPage, setRowsPerPage] = useState(5); const [anchorEl, setAnchorEl] = useState(null); const [selectedDistribuidorRow, setSelectedDistribuidorRow] = useState(null); const { tienePermiso, isSuperAdmin } = usePermissions(); const puedeVer = isSuperAdmin || tienePermiso("DG001"); const puedeCrear = isSuperAdmin || tienePermiso("DG002"); const puedeModificar = isSuperAdmin || tienePermiso("DG003"); const puedeEliminar = isSuperAdmin || tienePermiso("DG005"); const cargarDistribuidores = 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 distribuidorService.getAllDistribuidores(filtroNombre, filtroNroDoc); setDistribuidores(data); } catch (err) { console.error(err); setError('Error al cargar los distribuidores.'); } finally { setLoading(false); } }, [filtroNombre, filtroNroDoc, puedeVer]); useEffect(() => { cargarDistribuidores(); }, [cargarDistribuidores]); const handleOpenModal = (distribuidor?: DistribuidorDto) => { setEditingDistribuidor(distribuidor || null); setApiErrorMessage(null); setModalOpen(true); }; const handleCloseModal = () => { setModalOpen(false); setEditingDistribuidor(null); }; const handleSubmitModal = async (data: CreateDistribuidorDto | UpdateDistribuidorDto, id?: number) => { setApiErrorMessage(null); try { if (id && editingDistribuidor) { await distribuidorService.updateDistribuidor(id, data as UpdateDistribuidorDto); } else { await distribuidorService.createDistribuidor(data as CreateDistribuidorDto); } cargarDistribuidores(); } catch (err: any) { const message = axios.isAxiosError(err) && err.response?.data?.message ? err.response.data.message : 'Error al guardar el distribuidor.'; setApiErrorMessage(message); throw err; } }; const handleDelete = async (id: number) => { if (window.confirm(`¿Está seguro de eliminar este distribuidor (ID: ${id})?`)) { setApiErrorMessage(null); try { await distribuidorService.deleteDistribuidor(id); cargarDistribuidores(); } catch (err: any) { const message = axios.isAxiosError(err) && err.response?.data?.message ? err.response.data.message : 'Error al eliminar el distribuidor.'; setApiErrorMessage(message); } } handleMenuClose(); }; const handleMenuOpen = (event: React.MouseEvent, distribuidor: DistribuidorDto) => { setAnchorEl(event.currentTarget); setSelectedDistribuidorRow(distribuidor); }; const handleMenuClose = () => { setAnchorEl(null); setSelectedDistribuidorRow(null); }; const handleChangePage = (_event: unknown, newPage: number) => setPage(newPage); const handleChangeRowsPerPage = (event: React.ChangeEvent) => { setRowsPerPage(parseInt(event.target.value, 10)); setPage(0); }; const displayData = distribuidores.slice(page * rowsPerPage, page * rowsPerPage + rowsPerPage); if (!loading && !puedeVer) { return {error || "No tiene permiso."}; } return ( Gestionar Distribuidores setFiltroNombre(e.target.value)} sx={{ flexGrow: 1, minWidth: '200px' }} /> setFiltroNroDoc(e.target.value)} sx={{ flexGrow: 1, minWidth: '200px' }} /> {/* */} {puedeCrear && ( )} {loading && } {error && !loading && {error}} {apiErrorMessage && {apiErrorMessage}} {!loading && !error && puedeVer && ( NombreNro. Doc. ContactoZona TeléfonoLocalidad {(puedeModificar || puedeEliminar) && Acciones} {displayData.length === 0 ? ( No se encontraron distribuidores. ) : ( displayData.map((d) => ( {d.nombre}{d.nroDoc} {d.contacto || '-'}{d.nombreZona || '-'} {d.telefono || '-'}{d.localidad || '-'} {(puedeModificar || puedeEliminar) && ( handleMenuOpen(e, d)} disabled={!puedeModificar && !puedeEliminar}> )} )))}
)} {puedeModificar && ( { handleOpenModal(selectedDistribuidorRow!); handleMenuClose(); }}>Modificar)} {puedeEliminar && ( handleDelete(selectedDistribuidorRow!.idDistribuidor)}>Eliminar)} {(!puedeModificar && !puedeEliminar) && Sin acciones} setApiErrorMessage(null)} />
); }; export default GestionarDistribuidoresPage;