Fase 3:
- Backend API:
Autenticación y autorización básicas con JWT implementadas.
Cambio de contraseña funcional.
Módulo "Tipos de Pago" (CRUD completo) implementado en el backend (Controlador, Servicio, Repositorio) usando Dapper, transacciones y con lógica de historial.
Se incluyen permisos en el token JWT.
- Frontend React:
Estructura base con Vite, TypeScript, MUI.
Contexto de autenticación (AuthContext) que maneja el estado del usuario y el token.
Página de Login.
Modal de Cambio de Contraseña (forzado y opcional).
Hook usePermissions para verificar permisos.
Página GestionarTiposPagoPage con tabla, paginación, filtro, modal para crear/editar, y menú de acciones, respetando permisos.
Layout principal (MainLayout) con navegación por Tabs (funcionalidad básica de navegación).
Estructura de enrutamiento (AppRoutes) que maneja rutas públicas, protegidas y anidadas para módulos.
2025-05-07 13:41:18 -03:00
import React , { type ReactNode , useState , useEffect } from 'react' ;
2025-06-03 13:45:20 -03:00
import {
Box , AppBar , Toolbar , Typography , Tabs , Tab , Paper ,
IconButton , Menu , MenuItem , ListItemIcon , ListItemText , Divider // Nuevas importaciones
} from '@mui/material' ;
import AccountCircle from '@mui/icons-material/AccountCircle' ; // Icono de usuario
import LockResetIcon from '@mui/icons-material/LockReset' ; // Icono para cambiar contraseña
import LogoutIcon from '@mui/icons-material/Logout' ; // Icono para cerrar sesión
2025-05-05 15:49:01 -03:00
import { useAuth } from '../contexts/AuthContext' ;
feat: Implementación CRUD Canillitas, Distribuidores y Precios de Publicación
Backend API:
- Canillitas (`dist_dtCanillas`):
- Implementado CRUD completo (Modelos, DTOs, Repositorio, Servicio, Controlador).
- Lógica para manejo de `Accionista`, `Baja`, `FechaBaja`.
- Auditoría en `dist_dtCanillas_H`.
- Validación de legajo único y lógica de empresa vs accionista.
- Distribuidores (`dist_dtDistribuidores`):
- Implementado CRUD completo (Modelos, DTOs, Repositorio, Servicio, Controlador).
- Auditoría en `dist_dtDistribuidores_H`.
- Creación de saldos iniciales para el nuevo distribuidor en todas las empresas.
- Verificación de NroDoc único y Nombre opcionalmente único.
- Precios de Publicación (`dist_Precios`):
- Implementado CRUD básico (Modelos, DTOs, Repositorio, Servicio, Controlador).
- Endpoints anidados bajo `/publicaciones/{idPublicacion}/precios`.
- Lógica de negocio para cerrar período de precio anterior al crear uno nuevo.
- Lógica de negocio para reabrir período de precio anterior al eliminar el último.
- Auditoría en `dist_Precios_H`.
- Auditoría en Eliminación de Publicaciones:
- Extendido `PublicacionService.EliminarAsync` para eliminar en cascada registros de precios, recargos, porcentajes de pago (distribuidores y canillitas) y secciones de publicación.
- Repositorios correspondientes (`PrecioRepository`, `RecargoZonaRepository`, `PorcPagoRepository`, `PorcMonCanillaRepository`, `PubliSeccionRepository`) actualizados con métodos `DeleteByPublicacionIdAsync` que registran en sus respectivas tablas `_H` (si existen y se implementó la lógica).
- Asegurada la correcta propagación del `idUsuario` para la auditoría en cascada.
- Correcciones de Nulabilidad:
- Ajustados los métodos `MapToDto` y su uso en `CanillaService` y `PublicacionService` para manejar correctamente tipos anulables.
Frontend React:
- Canillitas:
- `canillaService.ts`.
- `CanillaFormModal.tsx` con selectores para Zona y Empresa, y lógica de Accionista.
- `GestionarCanillitasPage.tsx` con filtros, paginación, y acciones (editar, toggle baja).
- Distribuidores:
- `distribuidorService.ts`.
- `DistribuidorFormModal.tsx` con múltiples campos y selector de Zona.
- `GestionarDistribuidoresPage.tsx` con filtros, paginación, y acciones (editar, eliminar).
- Precios de Publicación:
- `precioService.ts`.
- `PrecioFormModal.tsx` para crear/editar períodos de precios (VigenciaD, VigenciaH opcional, precios por día).
- `GestionarPreciosPublicacionPage.tsx` accesible desde la gestión de publicaciones, para listar y gestionar los períodos de precios de una publicación específica.
- Layout:
- Reemplazado el uso de `Grid` por `Box` con Flexbox en `CanillaFormModal`, `GestionarCanillitasPage` (filtros), `DistribuidorFormModal` y `PrecioFormModal` para resolver problemas de tipos y mejorar la consistencia del layout de formularios.
- Navegación:
- Actualizadas las rutas y pestañas para los nuevos módulos y sub-módulos.
2025-05-20 12:38:55 -03:00
import ChangePasswordModal from '../components/Modals/Usuarios/ChangePasswordModal' ;
2025-06-03 13:45:20 -03:00
import { useNavigate , useLocation } from 'react-router-dom' ;
2025-05-05 15:49:01 -03:00
interface MainLayoutProps {
2025-05-31 23:48:42 -03:00
children : ReactNode ;
2025-05-05 15:49:01 -03:00
}
Fase 3:
- Backend API:
Autenticación y autorización básicas con JWT implementadas.
Cambio de contraseña funcional.
Módulo "Tipos de Pago" (CRUD completo) implementado en el backend (Controlador, Servicio, Repositorio) usando Dapper, transacciones y con lógica de historial.
Se incluyen permisos en el token JWT.
- Frontend React:
Estructura base con Vite, TypeScript, MUI.
Contexto de autenticación (AuthContext) que maneja el estado del usuario y el token.
Página de Login.
Modal de Cambio de Contraseña (forzado y opcional).
Hook usePermissions para verificar permisos.
Página GestionarTiposPagoPage con tabla, paginación, filtro, modal para crear/editar, y menú de acciones, respetando permisos.
Layout principal (MainLayout) con navegación por Tabs (funcionalidad básica de navegación).
Estructura de enrutamiento (AppRoutes) que maneja rutas públicas, protegidas y anidadas para módulos.
2025-05-07 13:41:18 -03:00
const modules = [
2025-05-31 23:48:42 -03:00
{ label : 'Inicio' , path : '/' } ,
{ label : 'Distribución' , path : '/distribucion' } ,
{ label : 'Contables' , path : '/contables' } ,
{ label : 'Impresión' , path : '/impresion' } ,
{ label : 'Reportes' , path : '/reportes' } ,
{ label : 'Radios' , path : '/radios' } ,
{ label : 'Usuarios' , path : '/usuarios' } ,
Fase 3:
- Backend API:
Autenticación y autorización básicas con JWT implementadas.
Cambio de contraseña funcional.
Módulo "Tipos de Pago" (CRUD completo) implementado en el backend (Controlador, Servicio, Repositorio) usando Dapper, transacciones y con lógica de historial.
Se incluyen permisos en el token JWT.
- Frontend React:
Estructura base con Vite, TypeScript, MUI.
Contexto de autenticación (AuthContext) que maneja el estado del usuario y el token.
Página de Login.
Modal de Cambio de Contraseña (forzado y opcional).
Hook usePermissions para verificar permisos.
Página GestionarTiposPagoPage con tabla, paginación, filtro, modal para crear/editar, y menú de acciones, respetando permisos.
Layout principal (MainLayout) con navegación por Tabs (funcionalidad básica de navegación).
Estructura de enrutamiento (AppRoutes) que maneja rutas públicas, protegidas y anidadas para módulos.
2025-05-07 13:41:18 -03:00
] ;
2025-05-05 15:49:01 -03:00
const MainLayout : React.FC < MainLayoutProps > = ( { children } ) = > {
Fase 3:
- Backend API:
Autenticación y autorización básicas con JWT implementadas.
Cambio de contraseña funcional.
Módulo "Tipos de Pago" (CRUD completo) implementado en el backend (Controlador, Servicio, Repositorio) usando Dapper, transacciones y con lógica de historial.
Se incluyen permisos en el token JWT.
- Frontend React:
Estructura base con Vite, TypeScript, MUI.
Contexto de autenticación (AuthContext) que maneja el estado del usuario y el token.
Página de Login.
Modal de Cambio de Contraseña (forzado y opcional).
Hook usePermissions para verificar permisos.
Página GestionarTiposPagoPage con tabla, paginación, filtro, modal para crear/editar, y menú de acciones, respetando permisos.
Layout principal (MainLayout) con navegación por Tabs (funcionalidad básica de navegación).
Estructura de enrutamiento (AppRoutes) que maneja rutas públicas, protegidas y anidadas para módulos.
2025-05-07 13:41:18 -03:00
const {
user ,
logout ,
2025-05-31 23:48:42 -03:00
isAuthenticated ,
Fase 3:
- Backend API:
Autenticación y autorización básicas con JWT implementadas.
Cambio de contraseña funcional.
Módulo "Tipos de Pago" (CRUD completo) implementado en el backend (Controlador, Servicio, Repositorio) usando Dapper, transacciones y con lógica de historial.
Se incluyen permisos en el token JWT.
- Frontend React:
Estructura base con Vite, TypeScript, MUI.
Contexto de autenticación (AuthContext) que maneja el estado del usuario y el token.
Página de Login.
Modal de Cambio de Contraseña (forzado y opcional).
Hook usePermissions para verificar permisos.
Página GestionarTiposPagoPage con tabla, paginación, filtro, modal para crear/editar, y menú de acciones, respetando permisos.
Layout principal (MainLayout) con navegación por Tabs (funcionalidad básica de navegación).
Estructura de enrutamiento (AppRoutes) que maneja rutas públicas, protegidas y anidadas para módulos.
2025-05-07 13:41:18 -03:00
isPasswordChangeForced ,
2025-05-31 23:48:42 -03:00
showForcedPasswordChangeModal ,
Fase 3:
- Backend API:
Autenticación y autorización básicas con JWT implementadas.
Cambio de contraseña funcional.
Módulo "Tipos de Pago" (CRUD completo) implementado en el backend (Controlador, Servicio, Repositorio) usando Dapper, transacciones y con lógica de historial.
Se incluyen permisos en el token JWT.
- Frontend React:
Estructura base con Vite, TypeScript, MUI.
Contexto de autenticación (AuthContext) que maneja el estado del usuario y el token.
Página de Login.
Modal de Cambio de Contraseña (forzado y opcional).
Hook usePermissions para verificar permisos.
Página GestionarTiposPagoPage con tabla, paginación, filtro, modal para crear/editar, y menú de acciones, respetando permisos.
Layout principal (MainLayout) con navegación por Tabs (funcionalidad básica de navegación).
Estructura de enrutamiento (AppRoutes) que maneja rutas públicas, protegidas y anidadas para módulos.
2025-05-07 13:41:18 -03:00
setShowForcedPasswordChangeModal ,
2025-05-31 23:48:42 -03:00
passwordChangeCompleted
Fase 3:
- Backend API:
Autenticación y autorización básicas con JWT implementadas.
Cambio de contraseña funcional.
Módulo "Tipos de Pago" (CRUD completo) implementado en el backend (Controlador, Servicio, Repositorio) usando Dapper, transacciones y con lógica de historial.
Se incluyen permisos en el token JWT.
- Frontend React:
Estructura base con Vite, TypeScript, MUI.
Contexto de autenticación (AuthContext) que maneja el estado del usuario y el token.
Página de Login.
Modal de Cambio de Contraseña (forzado y opcional).
Hook usePermissions para verificar permisos.
Página GestionarTiposPagoPage con tabla, paginación, filtro, modal para crear/editar, y menú de acciones, respetando permisos.
Layout principal (MainLayout) con navegación por Tabs (funcionalidad básica de navegación).
Estructura de enrutamiento (AppRoutes) que maneja rutas públicas, protegidas y anidadas para módulos.
2025-05-07 13:41:18 -03:00
} = useAuth ( ) ;
const navigate = useNavigate ( ) ;
2025-06-03 13:45:20 -03:00
const location = useLocation ( ) ;
Fase 3:
- Backend API:
Autenticación y autorización básicas con JWT implementadas.
Cambio de contraseña funcional.
Módulo "Tipos de Pago" (CRUD completo) implementado en el backend (Controlador, Servicio, Repositorio) usando Dapper, transacciones y con lógica de historial.
Se incluyen permisos en el token JWT.
- Frontend React:
Estructura base con Vite, TypeScript, MUI.
Contexto de autenticación (AuthContext) que maneja el estado del usuario y el token.
Página de Login.
Modal de Cambio de Contraseña (forzado y opcional).
Hook usePermissions para verificar permisos.
Página GestionarTiposPagoPage con tabla, paginación, filtro, modal para crear/editar, y menú de acciones, respetando permisos.
Layout principal (MainLayout) con navegación por Tabs (funcionalidad básica de navegación).
Estructura de enrutamiento (AppRoutes) que maneja rutas públicas, protegidas y anidadas para módulos.
2025-05-07 13:41:18 -03:00
const [ selectedTab , setSelectedTab ] = useState < number | false > ( false ) ;
2025-06-03 13:45:20 -03:00
const [ anchorElUserMenu , setAnchorElUserMenu ] = useState < null | HTMLElement > ( null ) ; // Estado para el menú de usuario
Fase 3:
- Backend API:
Autenticación y autorización básicas con JWT implementadas.
Cambio de contraseña funcional.
Módulo "Tipos de Pago" (CRUD completo) implementado en el backend (Controlador, Servicio, Repositorio) usando Dapper, transacciones y con lógica de historial.
Se incluyen permisos en el token JWT.
- Frontend React:
Estructura base con Vite, TypeScript, MUI.
Contexto de autenticación (AuthContext) que maneja el estado del usuario y el token.
Página de Login.
Modal de Cambio de Contraseña (forzado y opcional).
Hook usePermissions para verificar permisos.
Página GestionarTiposPagoPage con tabla, paginación, filtro, modal para crear/editar, y menú de acciones, respetando permisos.
Layout principal (MainLayout) con navegación por Tabs (funcionalidad básica de navegación).
Estructura de enrutamiento (AppRoutes) que maneja rutas públicas, protegidas y anidadas para módulos.
2025-05-07 13:41:18 -03:00
useEffect ( ( ) = > {
const currentModulePath = modules . findIndex ( module = >
location . pathname === module . path || ( module . path !== '/' && location . pathname . startsWith ( module . path + '/' ) )
) ;
if ( currentModulePath !== - 1 ) {
setSelectedTab ( currentModulePath ) ;
} else if ( location . pathname === '/' ) {
2025-06-03 13:45:20 -03:00
setSelectedTab ( 0 ) ; // Asegurar que la pestaña de Inicio se seleccione para la ruta raíz
Fase 3:
- Backend API:
Autenticación y autorización básicas con JWT implementadas.
Cambio de contraseña funcional.
Módulo "Tipos de Pago" (CRUD completo) implementado en el backend (Controlador, Servicio, Repositorio) usando Dapper, transacciones y con lógica de historial.
Se incluyen permisos en el token JWT.
- Frontend React:
Estructura base con Vite, TypeScript, MUI.
Contexto de autenticación (AuthContext) que maneja el estado del usuario y el token.
Página de Login.
Modal de Cambio de Contraseña (forzado y opcional).
Hook usePermissions para verificar permisos.
Página GestionarTiposPagoPage con tabla, paginación, filtro, modal para crear/editar, y menú de acciones, respetando permisos.
Layout principal (MainLayout) con navegación por Tabs (funcionalidad básica de navegación).
Estructura de enrutamiento (AppRoutes) que maneja rutas públicas, protegidas y anidadas para módulos.
2025-05-07 13:41:18 -03:00
} else {
2025-06-03 13:45:20 -03:00
setSelectedTab ( false ) ; // Ninguna pestaña seleccionada si no coincide
Fase 3:
- Backend API:
Autenticación y autorización básicas con JWT implementadas.
Cambio de contraseña funcional.
Módulo "Tipos de Pago" (CRUD completo) implementado en el backend (Controlador, Servicio, Repositorio) usando Dapper, transacciones y con lógica de historial.
Se incluyen permisos en el token JWT.
- Frontend React:
Estructura base con Vite, TypeScript, MUI.
Contexto de autenticación (AuthContext) que maneja el estado del usuario y el token.
Página de Login.
Modal de Cambio de Contraseña (forzado y opcional).
Hook usePermissions para verificar permisos.
Página GestionarTiposPagoPage con tabla, paginación, filtro, modal para crear/editar, y menú de acciones, respetando permisos.
Layout principal (MainLayout) con navegación por Tabs (funcionalidad básica de navegación).
Estructura de enrutamiento (AppRoutes) que maneja rutas públicas, protegidas y anidadas para módulos.
2025-05-07 13:41:18 -03:00
}
} , [ location . pathname ] ) ;
2025-06-03 13:45:20 -03:00
const handleOpenUserMenu = ( event : React.MouseEvent < HTMLElement > ) = > {
setAnchorElUserMenu ( event . currentTarget ) ;
} ;
const handleCloseUserMenu = ( ) = > {
setAnchorElUserMenu ( null ) ;
} ;
const handleChangePasswordClick = ( ) = > {
setShowForcedPasswordChangeModal ( true ) ;
handleCloseUserMenu ( ) ;
} ;
const handleLogoutClick = ( ) = > {
logout ( ) ;
handleCloseUserMenu ( ) ; // Cierra el menú antes de desloguear completamente
} ;
Fase 3:
- Backend API:
Autenticación y autorización básicas con JWT implementadas.
Cambio de contraseña funcional.
Módulo "Tipos de Pago" (CRUD completo) implementado en el backend (Controlador, Servicio, Repositorio) usando Dapper, transacciones y con lógica de historial.
Se incluyen permisos en el token JWT.
- Frontend React:
Estructura base con Vite, TypeScript, MUI.
Contexto de autenticación (AuthContext) que maneja el estado del usuario y el token.
Página de Login.
Modal de Cambio de Contraseña (forzado y opcional).
Hook usePermissions para verificar permisos.
Página GestionarTiposPagoPage con tabla, paginación, filtro, modal para crear/editar, y menú de acciones, respetando permisos.
Layout principal (MainLayout) con navegación por Tabs (funcionalidad básica de navegación).
Estructura de enrutamiento (AppRoutes) que maneja rutas públicas, protegidas y anidadas para módulos.
2025-05-07 13:41:18 -03:00
const handleModalClose = ( passwordChangedSuccessfully : boolean ) = > {
if ( passwordChangedSuccessfully ) {
passwordChangeCompleted ( ) ;
} else {
if ( isPasswordChangeForced ) {
logout ( ) ;
} else {
setShowForcedPasswordChangeModal ( false ) ;
}
}
} ;
const handleTabChange = ( _event : React.SyntheticEvent , newValue : number ) = > {
setSelectedTab ( newValue ) ;
2025-05-31 23:48:42 -03:00
navigate ( modules [ newValue ] . path ) ;
Fase 3:
- Backend API:
Autenticación y autorización básicas con JWT implementadas.
Cambio de contraseña funcional.
Módulo "Tipos de Pago" (CRUD completo) implementado en el backend (Controlador, Servicio, Repositorio) usando Dapper, transacciones y con lógica de historial.
Se incluyen permisos en el token JWT.
- Frontend React:
Estructura base con Vite, TypeScript, MUI.
Contexto de autenticación (AuthContext) que maneja el estado del usuario y el token.
Página de Login.
Modal de Cambio de Contraseña (forzado y opcional).
Hook usePermissions para verificar permisos.
Página GestionarTiposPagoPage con tabla, paginación, filtro, modal para crear/editar, y menú de acciones, respetando permisos.
Layout principal (MainLayout) con navegación por Tabs (funcionalidad básica de navegación).
Estructura de enrutamiento (AppRoutes) que maneja rutas públicas, protegidas y anidadas para módulos.
2025-05-07 13:41:18 -03:00
} ;
2025-05-31 23:48:42 -03:00
// Determinar si el módulo actual es el de Reportes
const isReportesModule = location . pathname . startsWith ( '/reportes' ) ;
Fase 3:
- Backend API:
Autenticación y autorización básicas con JWT implementadas.
Cambio de contraseña funcional.
Módulo "Tipos de Pago" (CRUD completo) implementado en el backend (Controlador, Servicio, Repositorio) usando Dapper, transacciones y con lógica de historial.
Se incluyen permisos en el token JWT.
- Frontend React:
Estructura base con Vite, TypeScript, MUI.
Contexto de autenticación (AuthContext) que maneja el estado del usuario y el token.
Página de Login.
Modal de Cambio de Contraseña (forzado y opcional).
Hook usePermissions para verificar permisos.
Página GestionarTiposPagoPage con tabla, paginación, filtro, modal para crear/editar, y menú de acciones, respetando permisos.
Layout principal (MainLayout) con navegación por Tabs (funcionalidad básica de navegación).
Estructura de enrutamiento (AppRoutes) que maneja rutas públicas, protegidas y anidadas para módulos.
2025-05-07 13:41:18 -03:00
if ( showForcedPasswordChangeModal && isPasswordChangeForced ) {
return (
< Box sx = { { display : 'flex' , justifyContent : 'center' , alignItems : 'center' , minHeight : '100vh' } } >
2025-05-31 23:48:42 -03:00
< ChangePasswordModal
Fase 3:
- Backend API:
Autenticación y autorización básicas con JWT implementadas.
Cambio de contraseña funcional.
Módulo "Tipos de Pago" (CRUD completo) implementado en el backend (Controlador, Servicio, Repositorio) usando Dapper, transacciones y con lógica de historial.
Se incluyen permisos en el token JWT.
- Frontend React:
Estructura base con Vite, TypeScript, MUI.
Contexto de autenticación (AuthContext) que maneja el estado del usuario y el token.
Página de Login.
Modal de Cambio de Contraseña (forzado y opcional).
Hook usePermissions para verificar permisos.
Página GestionarTiposPagoPage con tabla, paginación, filtro, modal para crear/editar, y menú de acciones, respetando permisos.
Layout principal (MainLayout) con navegación por Tabs (funcionalidad básica de navegación).
Estructura de enrutamiento (AppRoutes) que maneja rutas públicas, protegidas y anidadas para módulos.
2025-05-07 13:41:18 -03:00
open = { showForcedPasswordChangeModal }
onClose = { handleModalClose }
isFirstLogin = { isPasswordChangeForced }
2025-05-31 23:48:42 -03:00
/ >
Fase 3:
- Backend API:
Autenticación y autorización básicas con JWT implementadas.
Cambio de contraseña funcional.
Módulo "Tipos de Pago" (CRUD completo) implementado en el backend (Controlador, Servicio, Repositorio) usando Dapper, transacciones y con lógica de historial.
Se incluyen permisos en el token JWT.
- Frontend React:
Estructura base con Vite, TypeScript, MUI.
Contexto de autenticación (AuthContext) que maneja el estado del usuario y el token.
Página de Login.
Modal de Cambio de Contraseña (forzado y opcional).
Hook usePermissions para verificar permisos.
Página GestionarTiposPagoPage con tabla, paginación, filtro, modal para crear/editar, y menú de acciones, respetando permisos.
Layout principal (MainLayout) con navegación por Tabs (funcionalidad básica de navegación).
Estructura de enrutamiento (AppRoutes) que maneja rutas públicas, protegidas y anidadas para módulos.
2025-05-07 13:41:18 -03:00
< / Box >
) ;
}
2025-05-05 15:49:01 -03:00
return (
< Box sx = { { display : 'flex' , flexDirection : 'column' , minHeight : '100vh' } } >
2025-06-03 13:45:20 -03:00
< AppBar position = "sticky" elevation = { 1 } /* Elevation sutil para AppBar */ >
< Toolbar sx = { { display : 'flex' , justifyContent : 'space-between' } } >
< Typography variant = "h6" component = "div" noWrap sx = { { cursor : 'pointer' } } onClick = { ( ) = > navigate ( '/' ) } >
Fase 3:
- Backend API:
Autenticación y autorización básicas con JWT implementadas.
Cambio de contraseña funcional.
Módulo "Tipos de Pago" (CRUD completo) implementado en el backend (Controlador, Servicio, Repositorio) usando Dapper, transacciones y con lógica de historial.
Se incluyen permisos en el token JWT.
- Frontend React:
Estructura base con Vite, TypeScript, MUI.
Contexto de autenticación (AuthContext) que maneja el estado del usuario y el token.
Página de Login.
Modal de Cambio de Contraseña (forzado y opcional).
Hook usePermissions para verificar permisos.
Página GestionarTiposPagoPage con tabla, paginación, filtro, modal para crear/editar, y menú de acciones, respetando permisos.
Layout principal (MainLayout) con navegación por Tabs (funcionalidad básica de navegación).
Estructura de enrutamiento (AppRoutes) que maneja rutas públicas, protegidas y anidadas para módulos.
2025-05-07 13:41:18 -03:00
Sistema de Gestión - El Día
2025-05-05 15:49:01 -03:00
< / Typography >
2025-06-03 13:45:20 -03:00
< Box sx = { { display : 'flex' , alignItems : 'center' } } >
{ user && (
< Typography sx = { { mr : 2 , display : { xs : 'none' , sm : 'block' } } } /* Ocultar en pantallas muy pequeñas */ >
Hola , { user . nombreCompleto }
< / Typography >
) }
{ isAuthenticated && (
< >
< IconButton
size = "large"
aria - label = "Cuenta del usuario"
aria - controls = "menu-appbar"
aria - haspopup = "true"
sx = { {
padding : '15px' ,
} }
onClick = { handleOpenUserMenu }
color = "inherit"
>
< AccountCircle sx = { { fontSize : 36 } } / >
< / IconButton >
< Menu
id = "menu-appbar"
anchorEl = { anchorElUserMenu }
anchorOrigin = { { vertical : 'bottom' , horizontal : 'right' } }
keepMounted
transformOrigin = { { vertical : 'top' , horizontal : 'right' } }
open = { Boolean ( anchorElUserMenu ) }
onClose = { handleCloseUserMenu }
sx = { { '& .MuiPaper-root' : { minWidth : 220 , marginTop : '8px' } } }
>
{ user && ( // Mostrar info del usuario en el menú
< Box sx = { { px : 2 , py : 1.5 , pointerEvents : 'none' /* Para que no sea clickeable */ } } >
< Typography variant = "subtitle1" sx = { { fontWeight : 'medium' } } > { user . nombreCompleto } < / Typography >
< Typography variant = "body2" color = "text.secondary" > { user . username } < / Typography >
< / Box >
) }
{ user && < Divider sx = { { mb : 1 } } / > }
{ ! isPasswordChangeForced && ( // No mostrar si ya está forzado a cambiarla
< MenuItem onClick = { handleChangePasswordClick } >
< ListItemIcon > < LockResetIcon fontSize = "small" / > < / ListItemIcon >
< ListItemText > Cambiar Contraseña < / ListItemText >
< / MenuItem >
) }
< MenuItem onClick = { handleLogoutClick } >
< ListItemIcon > < LogoutIcon fontSize = "small" / > < / ListItemIcon >
< ListItemText > Cerrar Sesión < / ListItemText >
< / MenuItem >
< / Menu >
< / >
) }
< / Box >
2025-05-05 15:49:01 -03:00
< / Toolbar >
2025-05-31 23:48:42 -03:00
< Paper square elevation = { 0 } >
Fase 3:
- Backend API:
Autenticación y autorización básicas con JWT implementadas.
Cambio de contraseña funcional.
Módulo "Tipos de Pago" (CRUD completo) implementado en el backend (Controlador, Servicio, Repositorio) usando Dapper, transacciones y con lógica de historial.
Se incluyen permisos en el token JWT.
- Frontend React:
Estructura base con Vite, TypeScript, MUI.
Contexto de autenticación (AuthContext) que maneja el estado del usuario y el token.
Página de Login.
Modal de Cambio de Contraseña (forzado y opcional).
Hook usePermissions para verificar permisos.
Página GestionarTiposPagoPage con tabla, paginación, filtro, modal para crear/editar, y menú de acciones, respetando permisos.
Layout principal (MainLayout) con navegación por Tabs (funcionalidad básica de navegación).
Estructura de enrutamiento (AppRoutes) que maneja rutas públicas, protegidas y anidadas para módulos.
2025-05-07 13:41:18 -03:00
< Tabs
value = { selectedTab }
onChange = { handleTabChange }
2025-06-03 13:45:20 -03:00
indicatorColor = "secondary" // O 'primary' si prefieres el mismo color que el fondo
textColor = "inherit" // El texto de la pestaña hereda el color (blanco sobre fondo oscuro)
2025-05-31 23:48:42 -03:00
variant = "scrollable"
scrollButtons = "auto"
2025-06-03 13:45:20 -03:00
allowScrollButtonsMobile
Fase 3:
- Backend API:
Autenticación y autorización básicas con JWT implementadas.
Cambio de contraseña funcional.
Módulo "Tipos de Pago" (CRUD completo) implementado en el backend (Controlador, Servicio, Repositorio) usando Dapper, transacciones y con lógica de historial.
Se incluyen permisos en el token JWT.
- Frontend React:
Estructura base con Vite, TypeScript, MUI.
Contexto de autenticación (AuthContext) que maneja el estado del usuario y el token.
Página de Login.
Modal de Cambio de Contraseña (forzado y opcional).
Hook usePermissions para verificar permisos.
Página GestionarTiposPagoPage con tabla, paginación, filtro, modal para crear/editar, y menú de acciones, respetando permisos.
Layout principal (MainLayout) con navegación por Tabs (funcionalidad básica de navegación).
Estructura de enrutamiento (AppRoutes) que maneja rutas públicas, protegidas y anidadas para módulos.
2025-05-07 13:41:18 -03:00
aria - label = "módulos principales"
2025-06-03 13:45:20 -03:00
sx = { {
backgroundColor : 'primary.main' , // Color de fondo de las pestañas
color : 'white' , // Color del texto de las pestañas
'& .MuiTabs-indicator' : {
height : 3 , // Un indicador un poco más grueso
} ,
'& .MuiTab-root' : { // Estilo para cada pestaña
minWidth : 100 , // Ancho mínimo para cada pestaña
textTransform : 'none' , // Evitar MAYÚSCULAS por defecto
fontWeight : 'normal' ,
opacity : 0.85 , // Ligeramente transparentes si no están seleccionadas
'&.Mui-selected' : {
fontWeight : 'bold' ,
opacity : 1 ,
// color: 'secondary.main' // Opcional: color diferente para la pestaña seleccionada
} ,
}
} }
Fase 3:
- Backend API:
Autenticación y autorización básicas con JWT implementadas.
Cambio de contraseña funcional.
Módulo "Tipos de Pago" (CRUD completo) implementado en el backend (Controlador, Servicio, Repositorio) usando Dapper, transacciones y con lógica de historial.
Se incluyen permisos en el token JWT.
- Frontend React:
Estructura base con Vite, TypeScript, MUI.
Contexto de autenticación (AuthContext) que maneja el estado del usuario y el token.
Página de Login.
Modal de Cambio de Contraseña (forzado y opcional).
Hook usePermissions para verificar permisos.
Página GestionarTiposPagoPage con tabla, paginación, filtro, modal para crear/editar, y menú de acciones, respetando permisos.
Layout principal (MainLayout) con navegación por Tabs (funcionalidad básica de navegación).
Estructura de enrutamiento (AppRoutes) que maneja rutas públicas, protegidas y anidadas para módulos.
2025-05-07 13:41:18 -03:00
>
{ modules . map ( ( module ) = > (
< Tab key = { module . path } label = { module . label } / >
) ) }
< / Tabs >
< / Paper >
2025-05-05 15:49:01 -03:00
< / AppBar >
Fase 3:
- Backend API:
Autenticación y autorización básicas con JWT implementadas.
Cambio de contraseña funcional.
Módulo "Tipos de Pago" (CRUD completo) implementado en el backend (Controlador, Servicio, Repositorio) usando Dapper, transacciones y con lógica de historial.
Se incluyen permisos en el token JWT.
- Frontend React:
Estructura base con Vite, TypeScript, MUI.
Contexto de autenticación (AuthContext) que maneja el estado del usuario y el token.
Página de Login.
Modal de Cambio de Contraseña (forzado y opcional).
Hook usePermissions para verificar permisos.
Página GestionarTiposPagoPage con tabla, paginación, filtro, modal para crear/editar, y menú de acciones, respetando permisos.
Layout principal (MainLayout) con navegación por Tabs (funcionalidad básica de navegación).
Estructura de enrutamiento (AppRoutes) que maneja rutas públicas, protegidas y anidadas para módulos.
2025-05-07 13:41:18 -03:00
2025-05-05 15:49:01 -03:00
< Box
component = "main"
sx = { {
flexGrow : 1 ,
2025-06-03 13:45:20 -03:00
py : isReportesModule ? 0 : { xs : 1.5 , sm : 2 , md : 2.5 } , // Padding vertical responsivo
px : isReportesModule ? 0 : { xs : 1.5 , sm : 2 , md : 2.5 } , // Padding horizontal responsivo
display : 'flex' ,
flexDirection : 'column'
2025-05-05 15:49:01 -03:00
} }
>
{ children }
< / Box >
Fase 3:
- Backend API:
Autenticación y autorización básicas con JWT implementadas.
Cambio de contraseña funcional.
Módulo "Tipos de Pago" (CRUD completo) implementado en el backend (Controlador, Servicio, Repositorio) usando Dapper, transacciones y con lógica de historial.
Se incluyen permisos en el token JWT.
- Frontend React:
Estructura base con Vite, TypeScript, MUI.
Contexto de autenticación (AuthContext) que maneja el estado del usuario y el token.
Página de Login.
Modal de Cambio de Contraseña (forzado y opcional).
Hook usePermissions para verificar permisos.
Página GestionarTiposPagoPage con tabla, paginación, filtro, modal para crear/editar, y menú de acciones, respetando permisos.
Layout principal (MainLayout) con navegación por Tabs (funcionalidad básica de navegación).
Estructura de enrutamiento (AppRoutes) que maneja rutas públicas, protegidas y anidadas para módulos.
2025-05-07 13:41:18 -03:00
2025-06-03 13:45:20 -03:00
< Box component = "footer" sx = { { p : 1 , backgroundColor : 'grey.200' /* Un gris más claro */ , color : 'text.secondary' , textAlign : 'left' , borderTop : ( theme ) = > ` 1px solid ${ theme . palette . divider } ` } } >
< Typography variant = "caption" >
{ /* Puedes usar caption para un texto más pequeño en el footer */ }
Usuario : { user ? . username } | Acceso : { user ? . esSuperAdmin ? 'Super Administrador' : ( user ? . perfil || ` ID ${ user ? . idPerfil } ` ) }
2025-05-05 15:49:01 -03:00
< / Typography >
< / Box >
Fase 3:
- Backend API:
Autenticación y autorización básicas con JWT implementadas.
Cambio de contraseña funcional.
Módulo "Tipos de Pago" (CRUD completo) implementado en el backend (Controlador, Servicio, Repositorio) usando Dapper, transacciones y con lógica de historial.
Se incluyen permisos en el token JWT.
- Frontend React:
Estructura base con Vite, TypeScript, MUI.
Contexto de autenticación (AuthContext) que maneja el estado del usuario y el token.
Página de Login.
Modal de Cambio de Contraseña (forzado y opcional).
Hook usePermissions para verificar permisos.
Página GestionarTiposPagoPage con tabla, paginación, filtro, modal para crear/editar, y menú de acciones, respetando permisos.
Layout principal (MainLayout) con navegación por Tabs (funcionalidad básica de navegación).
Estructura de enrutamiento (AppRoutes) que maneja rutas públicas, protegidas y anidadas para módulos.
2025-05-07 13:41:18 -03:00
2025-05-31 23:48:42 -03:00
< ChangePasswordModal
2025-06-03 13:45:20 -03:00
open = { showForcedPasswordChangeModal && ! isPasswordChangeForced } // Solo mostrar si no es el forzado inicial
onClose = { ( ) = > handleModalClose ( false ) } // Asumir que si se cierra sin cambiar, no fue exitoso
isFirstLogin = { false } // Este modal no es para el primer login forzado
2025-05-31 23:48:42 -03:00
/ >
2025-05-05 15:49:01 -03:00
< / Box >
) ;
} ;
export default MainLayout ;