import React, { useState, useEffect, useCallback } from 'react'; import { useParams, useNavigate } from 'react-router-dom'; import { Box, Typography, Button, Paper, CircularProgress, Alert, Checkbox, FormControlLabel, FormGroup // Para el caso sin componente checklist } from '@mui/material'; import ArrowBackIcon from '@mui/icons-material/ArrowBack'; import SaveIcon from '@mui/icons-material/Save'; import perfilService from '../../services/Usuarios/perfilService'; import type { PermisoAsignadoDto } from '../../models/dtos/Usuarios/PermisoAsignadoDto'; import type { PerfilDto } from '../../models/dtos/Usuarios/PerfilDto'; import { usePermissions } from '../../hooks/usePermissions'; // Para verificar si el usuario actual puede estar aquí import axios from 'axios'; import PermisosChecklist from '../../components/Modals/Usuarios/PermisosChecklist'; // Importar el componente const AsignarPermisosAPerfilPage: React.FC = () => { const { idPerfil } = useParams<{ idPerfil: string }>(); const navigate = useNavigate(); const { tienePermiso, isSuperAdmin } = usePermissions(); const puedeAsignar = isSuperAdmin || tienePermiso("PU004"); const [perfil, setPerfil] = useState(null); const [permisosDisponibles, setPermisosDisponibles] = useState([]); // Usamos un Set para los IDs de los permisos seleccionados para eficiencia const [permisosSeleccionados, setPermisosSeleccionados] = useState>(new Set()); const [loading, setLoading] = useState(true); const [saving, setSaving] = useState(false); const [error, setError] = useState(null); const [successMessage, setSuccessMessage] = useState(null); const idPerfilNum = Number(idPerfil); const cargarDatos = useCallback(async () => { if (!puedeAsignar) { setError("Acceso denegado. No tiene permiso para asignar permisos."); setLoading(false); return; } if (isNaN(idPerfilNum)) { setError("ID de Perfil inválido."); setLoading(false); return; } setLoading(true); setError(null); setSuccessMessage(null); try { const [perfilData, permisosData] = await Promise.all([ perfilService.getPerfilById(idPerfilNum), perfilService.getPermisosPorPerfil(idPerfilNum) ]); setPerfil(perfilData); setPermisosDisponibles(permisosData); // Inicializar los permisos seleccionados basados en los que vienen 'asignado: true' setPermisosSeleccionados(new Set(permisosData.filter(p => p.asignado).map(p => p.id))); } catch (err) { console.error(err); setError('Error al cargar datos del perfil o permisos.'); if (axios.isAxiosError(err) && err.response?.status === 404) { setError(`Perfil con ID ${idPerfilNum} no encontrado.`); } } finally { setLoading(false); } }, [idPerfilNum, puedeAsignar]); useEffect(() => { cargarDatos(); }, [cargarDatos]); const handlePermisoChange = (permisoId: number, asignado: boolean) => { setPermisosSeleccionados(prev => { const next = new Set(prev); if (asignado) { next.add(permisoId); } else { next.delete(permisoId); } return next; }); // Limpiar mensajes al cambiar selección if (successMessage) setSuccessMessage(null); if (error) setError(null); }; const handleGuardarCambios = async () => { if (!puedeAsignar || !perfil) return; setSaving(true); setError(null); setSuccessMessage(null); try { await perfilService.updatePermisosPorPerfil(perfil.id, { permisosIds: Array.from(permisosSeleccionados) }); setSuccessMessage('Permisos actualizados correctamente.'); // Opcional: recargar datos, aunque el estado local ya está actualizado // cargarDatos(); } catch (err: any) { console.error(err); const message = axios.isAxiosError(err) && err.response?.data?.message ? err.response.data.message : 'Error al guardar los permisos.'; setError(message); } finally { setSaving(false); } }; if (loading) { return ; } if (error && !perfil) { // Si hay un error crítico al cargar el perfil return {error}; } if (!puedeAsignar) { return Acceso denegado.; } if (!perfil) { // Si no hay error, pero el perfil es null después de cargar (no debería pasar si no hay error) return Perfil no encontrado.; } return ( Asignar Permisos al Perfil: {perfil?.nombrePerfil || 'Cargando...'} ID Perfil: {perfil?.id} {error && {error}} {successMessage && {successMessage}} ); }; export default AsignarPermisosAPerfilPage;