Files
basic-erp/apps/web/src/app/features/shared/coming-soon.page.ts
T
GeorgeandClaude Sonnet 5.5 4c8c499a72 feat(web): login, sesión, interceptor, guards y layout con menú por permisos
- Login contra POST /api/auth/login; SessionStore en localStorage con el
  timeout deslizante que informa el servidor (sessionTimeoutMinutes).
- Interceptor: Bearer en /api, renueva actividad y, ante 401, cierra la
  sesión y vuelve al login recordando la ruta (solo rutas internas).
- Guards: sesión, invitado y permiso por pantalla (data.path). Corrige que
  inject() no puede usarse tras un await en permissionGuard.
- Layout con barra superior (empresa, usuario, tema, salir) y menú lateral
  filtrado por GET /api/user/menu; plegable y con botón en pantallas angostas.
- Menú único en libs/sap-types (MENU, filterMenu); el backend verifica por
  test que las rutas de permiso de sus recursos existan en él.
- Una ruta por pantalla del menú; las no construidas muestran "no disponible".
- Verificado en Chrome headless contra el backend y SAP reales: redirección
  sin sesión, menú de 20 pantallas, navegación, plegado, tema oscuro y
  persistencia, vista móvil, salir, token inválido y credenciales malas.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-13 19:18:05 -05:00

20 lines
658 B
TypeScript

import { ChangeDetectionStrategy, Component, inject } from '@angular/core';
import { ActivatedRoute } from '@angular/router';
/** Pantalla aún no implementada: se reemplaza ruta por ruta a medida que se construyen. */
@Component({
selector: 'sbo-coming-soon-page',
changeDetection: ChangeDetectionStrategy.OnPush,
template: `
<h1>{{ title }}</h1>
<p>Esta pantalla aún no está disponible.</p>
`,
styles: `
h1 { margin: 0 0 6px; font-size: 18px; font-weight: 600; }
p { margin: 0; color: var(--quiet); }
`,
})
export class ComingSoonPage {
protected readonly title = inject(ActivatedRoute).snapshot.data['title'] as string;
}