Files
basic-erp/apps/web/src/app/layout/main-layout.ts
T

53 lines
1.9 KiB
TypeScript

import { ChangeDetectionStrategy, Component, inject, signal } from '@angular/core';
import { RouterLink, RouterLinkActive, RouterOutlet } from '@angular/router';
import { AccountCodesService } from '../core/sl/account-codes';
import { AccountSegmentsService } from '../core/sl/account-segments';
import { AuthService } from '../core/auth/auth.service';
import { SessionStore } from '../core/auth/session.store';
import { MenuService } from '../core/menu/menu.service';
import { ThemeSwitcher } from '../core/theme/theme-switcher';
/** Marco de la aplicación: barra superior, menú lateral filtrado por permisos y contenido. */
@Component({
selector: 'sbo-main-layout',
changeDetection: ChangeDetectionStrategy.OnPush,
imports: [RouterOutlet, RouterLink, RouterLinkActive, ThemeSwitcher],
templateUrl: './main-layout.html',
styleUrl: './main-layout.css',
})
export class MainLayout {
private readonly auth = inject(AuthService);
protected readonly session = inject(SessionStore);
protected readonly menu = inject(MenuService);
protected readonly sidebarOpen = signal(false);
private readonly segments = inject(AccountSegmentsService);
/** Se instancia aquí para que las celdas de cuenta puedan pedir el código con formato de lo que muestran. */
private readonly accountCodes = inject(AccountCodesService);
constructor() {
void this.segments.ensureLoaded();
}
private readonly collapsed = signal<ReadonlySet<string>>(new Set());
protected isOpen(moduleId: string): boolean {
return !this.collapsed().has(moduleId);
}
protected toggle(moduleId: string): void {
this.collapsed.update((s) => {
const next = new Set(s);
if (!next.delete(moduleId)) next.add(moduleId);
return next;
});
}
protected retryMenu(): void {
void this.menu.ensureLoaded();
}
protected logout(): void {
void this.auth.logout();
}
}