Skip to main content

Rutas y layouts

Árbol raíz​

app-routing.module.ts define cuatro rutas, con anchorScrolling: "enabled" y scrollPositionRestoration: "enabled":

RutaDestino
"" (exacta)Redirige a whaticket/chat
"" con ContentComponentHijos de shared/routes/content.routes.ts (área autenticada)
"" con FullComponentHijos de shared/routes/full.routes.ts (solo auth)
**Redirige a auth/login
  • ContentComponent (shared/components/layout/content) es el shell autenticado: header, sidebar y, al tener perfil cargado, abre los dos sockets (InternalChatSocketService.connect y ChatSocketService.connect) y despacha InternalChatActions.loadConversations. Al destruirse los desconecta. El layout visual se elige con el query param layout (Dubai, London, Seoul, Paris, Tokyo, Madrid, Moscow, NewYork, Rome).
  • FullComponent es el layout sin chrome para login.

Módulos lazy del layout autenticado​

Todos se cargan con loadChildren: () => import(...). La columna Permiso es el acrónimo de data.permission evaluado por permissionGuard; "solo AuthGuard" significa que la ruta no exige permiso.

PAGE_URLSMóduloGuardsPermiso
dashboardDashboardModuleAuthGuardsolo AuthGuard
access-control/rolesRolesModuleAuthGuard, permissionGuardACCESS_CONTROL_READ
access-control/permissionsPermissionsModuleidemACCESS_CONTROL_READ
access-control/role-permissionsRolePermissionsModuleidemACCESS_CONTROL_READ
access-control/modulesModulesModuleidemACCESS_CONTROL_READ
access-control/permissions-builderPermissionsBuilderModuleidemACCESS_CONTROL_READ
whaticketWhaticketModuleAuthGuardsolo AuthGuard
internal-chatInternalChatModuleAuthGuardsolo AuthGuard
labelsLabelsModuleAuthGuard, permissionGuardLABEL_READ
scheduled-messagesScheduledMessagesModuleidemMESSAGE_READ
locked-ticketsLockedTicketsModuleidemTICKET_UNLOCK_ANY
quick-responsesQuickResponsesModuleidemQUICK_RESPONSE_READ
contactsContactsModuleidemCONTACT_READ
usersUsersModuleidemUSER_READ
profileProfileModuleAuthGuardsolo AuthGuard
departmentsDepartmentsModuleAuthGuard, permissionGuardDEPARTMENT_READ
connectionsConnectionsModuleAuthGuard, permissionGuardCONNECTION_READ
settingsSettingsModuleAuthGuard, permissionGuardSETTINGS_READ

Rutas anidadas dentro de los módulos:

Ruta completaMódulo hijoPermiso
whaticket/chatChatModule (features/whaticket/chat)TICKET_READ
internal-chat/conversationsconversations.module.tsINTERNAL_CHAT_READ
profile/starred-messagesstarred-messagessin permiso

Cada módulo de feature repite la guarda en su propio *-routing.module.ts (por ejemplo ConnectionsRoutingModule usa canActivate: [permissionGuard] con data: { permission: 'CONNECTION_READ' }). La ruta de settings, además, suma AuthGuard y AdminGuard en su routing de feature (settings-routing.module.ts), de modo que exige tipo de usuario admin además del permiso.

Layout de autenticación​

features/auth/auth.module.ts, cargado bajo auth:

RutaComponenteGuard
auth/loginLoginComponentLoggedInAuthGuard (si ya hay sesión vigente redirige a /)
auth/reconnectReconnectComponent— (pantalla a la que se envía en modo iframe cuando falla la sesión)

Guards​

GuardArchivoComportamiento
AuthGuardcore/guards/auth.guard.tsSi la sesión expiró: en iframe deja pasar (espera el handshake postMessage); fuera de iframe despacha userLogout y va a /auth/login
LoggedInAuthGuardcore/guards/loggedIn.guard.tsEvita mostrar login con sesión activa
AdminGuardcore/guards/admin.guard.tsCompara userType del perfil con 'admin' (TYPES_USER_PERMISSIONS.ADMIN); si no, redirige a /dashboard
permissionGuardcore/guards/permission.guard.tsGuard funcional; lee route.data['permission'] y consulta MyPermissionsService; si falla o se niega navega a /profile/profile-detail (ver nota)

:::caution Destino de redirección sin ruta permissionGuard navega a /profile/profile-detail, pero profile-routing.module.ts solo define '' y starred-messages. Esa URL cae en el comodín **, que redirige a auth/login; como LoggedInAuthGuard rechaza el login con sesión vigente y envía a / (que redirige a whaticket/chat). El spec del guard (permission.guard.spec.ts) fija la URL /profile/profile-detail. :::

Detalle de permisos en Auth, interceptores y RBAC.

Menú lateral​

El sidebar se alimenta de MENU_ITEMS en core/helpers/ui/nav.constant.ts. Cada ítem puede llevar permission; los ítems sin permission (Dashboard, Chat interno, Mensajes destacados, contenedores de submenú) se muestran siempre. Elementos presentes: Dashboard, Control de acceso (5 subítems), Mensajería (Chats, Chat interno, Mensajes destacados, Tickets bloqueados), Conexiones, Contactos, Usuarios, Etiquetas, Respuestas rápidas, Departamentos y Configuración. Mensajes programados no figura en el menú (la ruta existe en content.routes.ts).