layout-tsi 0.0.6 → 0.0.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/fesm2022/layout-tsi.mjs +1777 -3560
- package/fesm2022/layout-tsi.mjs.map +1 -1
- package/index.d.ts +5 -0
- package/lib/models/general/app-tab.model.d.ts +9 -0
- package/lib/models/general/dashboard.model.d.ts +15 -0
- package/lib/models/general/route-info.model.d.ts +16 -0
- package/lib/models/general/session-data.model.d.ts +8 -0
- package/lib/service/detector.service.d.ts +8 -0
- package/lib/service/header-ui.service.d.ts +9 -0
- package/lib/service/menu.service.d.ts +17 -0
- package/lib/service/tabs.service.d.ts +36 -0
- package/lib/ui/bottom-navigation/bottom-navigation.component.d.ts +31 -0
- package/lib/ui/chatbot/chatbot.component.d.ts +30 -0
- package/lib/ui/chatbot/chatbot.model.d.ts +28 -0
- package/lib/ui/chatbot/chatbot.service.d.ts +19 -0
- package/lib/ui/dashboard/dashboard-chart-bars/dashboard-chart-bars.component.d.ts +45 -0
- package/lib/ui/dashboard/dashboard-chart-donut/dashboard-chart-donut.component.d.ts +21 -0
- package/lib/ui/dashboard/dashboard-view-switcher/dashboard-view-switcher.component.d.ts +14 -0
- package/lib/ui/dashboard/item-dashboard/item-dashboard.component.d.ts +26 -0
- package/lib/ui/dashboard/item-dashboard-group/item-dashboard-group.component.d.ts +28 -0
- package/lib/ui/full/full.component.d.ts +49 -0
- package/lib/ui/menu-item/menu-item.component.d.ts +68 -0
- package/lib/ui/not-found/not-found.component.d.ts +7 -0
- package/lib/ui/tab-bar/tab-bar.component.d.ts +23 -0
- package/lib/ui/vertical-header/vertical-header.component.d.ts +106 -0
- package/lib/utils/validaciones.d.ts +1 -0
- package/package.json +4 -5
- package/public-api.d.ts +21 -0
- package/types/layout-tsi.d.ts +0 -965
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"layout-tsi.mjs","names":[],"sources":["../../../projects/layout-tsi/src/lib/service/menu.service.ts","../../../projects/layout-tsi/src/lib/service/header-ui.service.ts","../../../projects/layout-tsi/src/lib/utils/validaciones.ts","../../../projects/layout-tsi/src/lib/service/tabs.service.ts","../../../projects/layout-tsi/src/lib/ui/menu-item/menu-item.component.ts","../../../projects/layout-tsi/src/lib/ui/menu-item/menu-item.component.html","../../../projects/layout-tsi/src/lib/ui/bottom-navigation/bottom-navigation.component.ts","../../../projects/layout-tsi/src/lib/ui/bottom-navigation/bottom-navigation.component.html","../../../projects/layout-tsi/src/lib/ui/vertical-header/vertical-header.component.ts","../../../projects/layout-tsi/src/lib/ui/vertical-header/vertical-header.component.html","../../../projects/layout-tsi/src/lib/ui/tab-bar/tab-bar.component.ts","../../../projects/layout-tsi/src/lib/ui/tab-bar/tab-bar.component.html","../../../projects/layout-tsi/src/lib/service/detector.service.ts","../../../projects/layout-tsi/src/lib/ui/full/full.component.ts","../../../projects/layout-tsi/src/lib/ui/full/full.component.html","../../../projects/layout-tsi/src/lib/ui/chatbot/chatbot.model.ts","../../../projects/layout-tsi/src/lib/ui/chatbot/chatbot.service.ts","../../../projects/layout-tsi/src/lib/ui/chatbot/chatbot.component.ts","../../../projects/layout-tsi/src/lib/ui/chatbot/chatbot.component.html","../../../projects/layout-tsi/src/lib/ui/not-found/not-found.component.ts","../../../projects/layout-tsi/src/lib/ui/not-found/not-found.component.html","../../../projects/layout-tsi/src/lib/ui/dashboard/dashboard-chart-donut/dashboard-chart-donut.component.ts","../../../projects/layout-tsi/src/lib/ui/dashboard/dashboard-chart-bars/dashboard-chart-bars.component.ts","../../../projects/layout-tsi/src/lib/ui/dashboard/item-dashboard/item-dashboard.component.ts","../../../projects/layout-tsi/src/lib/ui/dashboard/item-dashboard/item-dashboard.component.html","../../../projects/layout-tsi/src/lib/ui/dashboard/item-dashboard-group/item-dashboard-group.component.ts","../../../projects/layout-tsi/src/lib/ui/dashboard/item-dashboard-group/item-dashboard-group.component.html","../../../projects/layout-tsi/src/lib/ui/dashboard/dashboard-view-switcher/dashboard-view-switcher.component.ts","../../../projects/layout-tsi/src/lib/ui/dashboard/dashboard-view-switcher/dashboard-view-switcher.component.html"],"sourcesContent":["import { Injectable, signal } from '@angular/core';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class MenuService {\r\n\r\n private _openMenus = signal<Map<number, string>>(new Map())\r\n\r\n openMenus = this._openMenus.asReadonly()\r\n\r\n setOpenMenu(level: number, id: string | null) {\r\n const currentMap = new Map(this._openMenus())\r\n if (id == null) {\r\n currentMap.delete(level)\r\n } else {\r\n currentMap.set(level, id)\r\n }\r\n this._openMenus.set(currentMap)\r\n }\r\n}\r\n","import { Injectable, signal } from '@angular/core';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class HeaderUiService {\r\n\r\n typeDocumento = signal<number>(null)\r\n numintDocumento = signal<number>(null)\r\n\r\n setTypeDocumento(value: number) {\r\n this.typeDocumento.set(value)\r\n }\r\n\r\n setNumintDocumento(value: number) {\r\n this.numintDocumento.set(value)\r\n }\r\n}\r\n","export function validaArray(data: any): boolean {\r\n return Array.isArray(data) && data.length > 0\r\n}\r\n","import { computed, DestroyRef, effect, inject, Injectable, InjectionToken, Injector, signal } from '@angular/core';\r\nimport { NavigationEnd, Router } from '@angular/router';\r\nimport { EMPTY, Observable, Subject, combineLatest } from 'rxjs';\r\nimport { catchError, debounceTime, distinctUntilChanged, filter, map, skip, switchMap, takeUntil } from 'rxjs/operators';\r\nimport { takeUntilDestroyed, toObservable } from '@angular/core/rxjs-interop';\r\nimport { validaArray } from '../utils/validaciones';\r\nimport { AppTab } from '../models/general/app-tab.model';\r\n\r\nexport interface TabsSyncProvider {\r\n getAccess(): Observable<{ message: string }>\r\n saveAccess(payload: string): Observable<any>\r\n}\r\n\r\n// Provider opcional: sin él, TabsService funciona solo con localStorage (sin sincronizar con backend).\r\nexport const TABS_SYNC_PROVIDER = new InjectionToken<TabsSyncProvider>('TABS_SYNC_PROVIDER')\r\n\r\nconst STORAGE_KEY = 'tsi_quick_tabs'\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class TabsService {\r\n\r\n private readonly router = inject(Router)\r\n private readonly syncProvider = inject(TABS_SYNC_PROVIDER, { optional: true })\r\n private readonly destroyRef = inject(DestroyRef)\r\n private readonly injector = inject(Injector)\r\n\r\n tabs = signal<AppTab[]>([])\r\n activeId = signal<string | null>(null)\r\n visible = signal<boolean>(true)\r\n\r\n // Corta la carga/sincronización en curso cuando clear() destruye la sesión (logout).\r\n private readonly destroy$ = new Subject<void>()\r\n\r\n sortedTabs = computed(() => {\r\n const ts = this.tabs()\r\n return [...ts.filter(t => t.pinned), ...ts.filter(t => !t.pinned)]\r\n })\r\n\r\n toggleVisible() { this.visible.update(v => !v) }\r\n\r\n constructor() {\r\n this.loadFromStorage()\r\n\r\n // Guardado inmediato en localStorage en cada cambio\r\n effect(() => {\r\n localStorage.setItem(STORAGE_KEY, JSON.stringify({\r\n tabs: this.tabs(),\r\n visible: this.visible()\r\n }))\r\n })\r\n\r\n this.router.events.pipe(\r\n filter((e): e is NavigationEnd => e instanceof NavigationEnd),\r\n takeUntilDestroyed()\r\n ).subscribe(e => {\r\n const path = e.urlAfterRedirects.split('?')[0]\r\n const tab = this.tabs().find(t => t.path === path)\r\n if (tab) this.activeId.set(tab.id)\r\n })\r\n }\r\n\r\n // Al ser un servicio singleton (providedIn: 'root'), el constructor sólo se ejecuta\r\n // una vez por carga de la app. Por eso la carga inicial se expone como init(): debe\r\n // invocarse en cada inicio de sesión (ver FullComponent) para que, tras un clear()\r\n // por logout, el siguiente login vuelva a consultar la API y arme sus accesos.\r\n init() {\r\n if (!this.syncProvider) return\r\n this.syncProvider.getAccess().pipe(\r\n takeUntil(this.destroy$),\r\n takeUntilDestroyed(this.destroyRef)\r\n ).subscribe({\r\n next: res => {\r\n this.parseData(res.message)\r\n this.startApiSync()\r\n },\r\n error: () => this.startApiSync()\r\n })\r\n }\r\n\r\n // Arranca DESPUÉS de la carga inicial: skip(1) omite el valor actual\r\n // (recién cargado desde API) y sólo reacciona a cambios del usuario.\r\n private startApiSync() {\r\n if (!this.syncProvider) return\r\n combineLatest([\r\n toObservable(this.tabs, { injector: this.injector }),\r\n toObservable(this.visible, { injector: this.injector })\r\n ]).pipe(\r\n skip(1),\r\n debounceTime(1500),\r\n map(([tabs, visible]) => JSON.stringify({ tabs, visible })),\r\n distinctUntilChanged(),\r\n switchMap(payload =>\r\n this.syncProvider!.saveAccess(payload).pipe(catchError(() => EMPTY))\r\n ),\r\n takeUntil(this.destroy$),\r\n takeUntilDestroyed(this.destroyRef)\r\n ).subscribe()\r\n }\r\n\r\n private parseData(raw: string) {\r\n const data = JSON.parse(raw)\r\n if (validaArray(data.tabs)) this.tabs.set(data.tabs)\r\n if (typeof data.visible === 'boolean') this.visible.set(data.visible)\r\n }\r\n\r\n private loadFromStorage() {\r\n try {\r\n const raw = localStorage.getItem(STORAGE_KEY)\r\n if (!raw) return\r\n this.parseData(raw)\r\n } catch { }\r\n }\r\n\r\n clear() {\r\n this.destroy$.next()\r\n this.tabs.set([])\r\n this.activeId.set(null)\r\n this.visible.set(true)\r\n localStorage.removeItem(STORAGE_KEY)\r\n }\r\n\r\n addBackground(path: string, title: string, icon: string, module?: string, moduleKey?: string) {\r\n if (this.tabs().some(t => t.path === path)) return\r\n this.tabs.update(ts => [...ts, { id: path, path, title, icon, pinned: false, module, moduleKey }])\r\n if (!this.visible()) this.visible.set(true)\r\n }\r\n\r\n activate(id: string) {\r\n this.activeId.set(id)\r\n const tab = this.tabs().find(t => t.id === id)\r\n if (tab) this.router.navigate([tab.path])\r\n }\r\n\r\n close(id: string, event: Event) {\r\n event.stopPropagation()\r\n const tabs = this.tabs()\r\n const tab = tabs.find(t => t.id === id)\r\n if (!tab || tab.pinned) return\r\n\r\n const idx = tabs.findIndex(t => t.id === id)\r\n const newTabs = tabs.filter(t => t.id !== id)\r\n this.tabs.set(newTabs)\r\n\r\n if (this.activeId() === id) {\r\n const next = newTabs[idx] ?? newTabs[idx - 1] ?? null\r\n if (next) this.activate(next.id)\r\n else this.activeId.set(null)\r\n }\r\n }\r\n\r\n closeAll() {\r\n const pinned = this.tabs().filter(t => t.pinned)\r\n this.tabs.set(pinned)\r\n const active = pinned.find(t => t.id === this.activeId())\r\n if (!active) {\r\n const last = pinned[pinned.length - 1] ?? null\r\n if (last) this.activate(last.id)\r\n else this.activeId.set(null)\r\n }\r\n }\r\n\r\n togglePin(id: string, event: Event) {\r\n event.stopPropagation()\r\n this.tabs.update(ts =>\r\n ts.map(t => t.id === id ? { ...t, pinned: !t.pinned } : t)\r\n )\r\n }\r\n}\r\n","import { NgClass } from '@angular/common';\r\nimport { ChangeDetectionStrategy, Component, computed, effect, inject, InjectionToken, input, OnDestroy, signal } from '@angular/core';\r\nimport { NavigationEnd, Router, RouterLink } from '@angular/router';\r\nimport { toSignal } from '@angular/core/rxjs-interop';\r\nimport { filter, map, startWith } from 'rxjs';\r\nimport { MenuService } from '../../service/menu.service';\r\nimport { HeaderUiService } from '../../service/header-ui.service';\r\nimport { RouteInfo } from '../../models/general/route-info.model';\r\nimport { validaArray } from '../../utils/validaciones';\r\nimport { TabsService } from '../../service/tabs.service';\r\n\r\nconst activeFlyoutKey = signal<string | null>(null)\r\n\r\ninterface TooltipState { text: string; x: number; y: number }\r\nconst activeTooltip = signal<TooltipState | null>(null)\r\n\r\n// Provider opcional: abre otras apps del ecosistema (items con extralink=true). Sin él, el click no hace nada.\r\n// routeName se pasa aparte porque moduloID no siempre es único (dos módulos distintos\r\n// pueden compartir el mismo id) — el consumidor lo usa para desambiguar si lo necesita.\r\nexport interface ExtralinkOpener {\r\n open(moduloID: number, routeName?: string): void\r\n}\r\n\r\nexport const EXTRALINK_OPENER = new InjectionToken<ExtralinkOpener>('EXTRALINK_OPENER')\r\n\r\n@Component({\r\n selector: 'app-menu-item',\r\n imports: [NgClass, RouterLink],\r\n templateUrl: './menu-item.component.html',\r\n styleUrl: './menu-item.component.scss',\r\n changeDetection:ChangeDetectionStrategy.OnPush\r\n})\r\n\r\nexport class MenuItemComponent implements OnDestroy {\r\n\r\n private menuService = inject(MenuService)\r\n private headerUiService = inject(HeaderUiService)\r\n private readonly tabsService = inject(TabsService)\r\n private readonly router = inject(Router)\r\n private readonly extralinkOpener = inject(EXTRALINK_OPENER, { optional: true })\r\n\r\n item = input.required<RouteInfo>()\r\n isSidebarOpen = input<boolean>(true)\r\n isSidebarHovering = input<boolean>(false)\r\n level = input<number>(0)\r\n parentModuleName = input<string | null>(null)\r\n accentColor = input<string>('#398bf7')\r\n // Accesos/rol de la sesión: se reciben del consumidor (en vez de inyectar\r\n // SesionService acá) para que layout-tsi no dependa de core-tsi.\r\n accesos = input<any[]>([])\r\n rolId = input<number | null>(null)\r\n open = signal<boolean>(false)\r\n\r\n flyoutY = signal(0)\r\n expandedFlyoutChild = signal<string | null>(null)\r\n flyoutTimer: ReturnType<typeof setTimeout> | null = null\r\n tooltip = activeTooltip\r\n\r\n showFlyout = computed(() =>\r\n activeFlyoutKey() === this.getFlyoutKey() && this.isSidebarOpen() && window.innerWidth > 1191\r\n )\r\n\r\n // El cierre tenía un delay de 80ms (debounce de onItemMouseLeave/onFlyoutMouseLeave)\r\n // seguido de un @if que lo desmontaba en seco, sin animación — eso es lo que se\r\n // sentía como \"lag\" (una pausa y después un salto). Ahora se anima la salida y\r\n // recién se desmonta cuando esa animación termina.\r\n flyoutRendered = signal(false)\r\n private flyoutExitTimer: ReturnType<typeof setTimeout> | null = null\r\n\r\n private currentUrl = toSignal(\r\n this.router.events.pipe(\r\n filter((e): e is NavigationEnd => e instanceof NavigationEnd),\r\n map(() => this.router.url),\r\n startWith(this.router.url)\r\n ),\r\n { initialValue: this.router.url }\r\n )\r\n\r\n // Una ruta con query param \"project\" (p. ej. tareas de un proyecto específico)\r\n // no debe resaltar el item de menú general de esa misma ruta, porque confunde.\r\n esRutaActiva(path?: string | null): boolean {\r\n if (!path) return false\r\n const [rutaActual, query] = this.currentUrl().split('?')\r\n const coincide = rutaActual === path || rutaActual.startsWith(`${path}/`)\r\n if (!coincide) return false\r\n return !new URLSearchParams(query ?? '').has('project')\r\n }\r\n\r\n // Reemplaza a @dropdownAnimation (sin @angular/animations), calcado del\r\n // timing real de consults: fade + scaleY, sin animar altura. La salida no\r\n // tiene equivalente CSS puro (Angular removía el <ul> recién al terminar el\r\n // :leave) — acá se mantiene montado con \"--closing\" el tiempo de esa\r\n // animación y recién ahí se desmonta.\r\n submenuRendered = signal(false)\r\n private submenuLeaveTimer: ReturnType<typeof setTimeout> | null = null\r\n\r\n constructor() {\r\n effect(() => {\r\n const openMenus = this.menuService.openMenus()\r\n const currentOpenId = openMenus.get(this.level())\r\n if (currentOpenId !== this.getItemId()) {\r\n this.open.set(false)\r\n }\r\n })\r\n\r\n effect(() => {\r\n if (this.isOpen()) {\r\n if (this.submenuLeaveTimer) {\r\n clearTimeout(this.submenuLeaveTimer)\r\n this.submenuLeaveTimer = null\r\n }\r\n this.submenuRendered.set(true)\r\n } else if (this.submenuRendered()) {\r\n this.submenuLeaveTimer = setTimeout(() => this.submenuRendered.set(false), 220)\r\n }\r\n })\r\n\r\n effect(() => {\r\n if (this.showFlyout()) {\r\n if (this.flyoutExitTimer) {\r\n clearTimeout(this.flyoutExitTimer)\r\n this.flyoutExitTimer = null\r\n }\r\n this.flyoutRendered.set(true)\r\n } else if (this.flyoutRendered()) {\r\n this.flyoutExitTimer = setTimeout(() => this.flyoutRendered.set(false), 130)\r\n }\r\n })\r\n }\r\n\r\n ngOnDestroy() {\r\n if (this.flyoutTimer) clearTimeout(this.flyoutTimer)\r\n if (this.submenuLeaveTimer) clearTimeout(this.submenuLeaveTimer)\r\n if (this.flyoutExitTimer) clearTimeout(this.flyoutExitTimer)\r\n if (activeFlyoutKey() == this.getFlyoutKey()) {\r\n activeFlyoutKey.set(null)\r\n }\r\n }\r\n\r\n hasAccess(menuItem?: RouteInfo): boolean {\r\n const itemToCheck = menuItem || this.item()\r\n const accesos = this.accesos()\r\n const rolID = this.rolId()\r\n\r\n if (!menuItem && this.item().extralink) {\r\n return accesos.some(acc => acc.codmod == this.item().moduloID)\r\n }\r\n\r\n if (validaArray(itemToCheck.rol)) {\r\n return itemToCheck.rol.includes(rolID)\r\n }\r\n\r\n if (!itemToCheck.moduloID && !itemToCheck.accesoID) {\r\n return true\r\n }\r\n\r\n return accesos.some(\r\n (acc: any) =>\r\n acc.codmod == itemToCheck.moduloID &&\r\n acc.codacc == itemToCheck.accesoID\r\n )\r\n }\r\n\r\n get isSidebarActuallyOpen(): boolean {\r\n return window.innerWidth <= 1191 ? true : !this.isSidebarOpen()\r\n }\r\n\r\n get isCollapsedMode(): boolean {\r\n return window.innerWidth > 1191 && this.isSidebarOpen()\r\n }\r\n\r\n getFlyoutKey(): string {\r\n return `flyout-${this.level()}-${this.item().title}`\r\n }\r\n\r\n onItemMouseEnter(event: MouseEvent) {\r\n if (this.flyoutTimer) {\r\n clearTimeout(this.flyoutTimer)\r\n this.flyoutTimer = null\r\n }\r\n if (this.isCollapsedMode) {\r\n const sidebar = document.getElementById('sidebar')\r\n if (sidebar) {\r\n const sidebarRect = sidebar.getBoundingClientRect()\r\n if (event.clientX > sidebarRect.left + 70) return\r\n }\r\n const el = event.currentTarget as HTMLElement\r\n const rect = el.getBoundingClientRect()\r\n const estimatedHeight = Math.max(60, (this.item().submenu?.length ?? 0) * 38 + 52)\r\n const maxTop = window.innerHeight - estimatedHeight - 8\r\n this.flyoutY.set(Math.min(rect.top, maxTop))\r\n activeFlyoutKey.set(this.getFlyoutKey())\r\n } else if (this.codAcceso()) {\r\n const rect = (event.currentTarget as HTMLElement).getBoundingClientRect()\r\n let x = rect.right + 10\r\n let y = rect.top + rect.height / 2\r\n if (window.innerWidth <= 1191) {\r\n const sidebarRect = document.getElementById('sidebar')?.getBoundingClientRect()\r\n if (sidebarRect) {\r\n x = rect.right - sidebarRect.left + 10\r\n y = rect.top - sidebarRect.top + rect.height / 2\r\n }\r\n }\r\n activeTooltip.set({ text: this.codAcceso(), x, y })\r\n }\r\n }\r\n\r\n onItemMouseOver() {\r\n if (this.flyoutTimer) {\r\n clearTimeout(this.flyoutTimer)\r\n this.flyoutTimer = null\r\n }\r\n }\r\n\r\n onItemMouseLeave() {\r\n activeTooltip.set(null)\r\n this.flyoutTimer = setTimeout(() => {\r\n if (activeFlyoutKey() === this.getFlyoutKey()) {\r\n activeFlyoutKey.set(null)\r\n this.expandedFlyoutChild.set(null)\r\n }\r\n }, 80)\r\n }\r\n\r\n showChildTooltip(event: MouseEvent, item: RouteInfo) {\r\n const cod = this.codAccesoItem(item)\r\n if (!cod) return\r\n const rect = (event.currentTarget as HTMLElement).getBoundingClientRect()\r\n activeTooltip.set({ text: cod, x: rect.right + 10, y: rect.top + rect.height / 2 })\r\n }\r\n\r\n hideChildTooltip() {\r\n activeTooltip.set(null)\r\n }\r\n\r\n onFlyoutMouseEnter() {\r\n if (this.flyoutTimer) {\r\n clearTimeout(this.flyoutTimer)\r\n this.flyoutTimer = null\r\n }\r\n }\r\n\r\n onFlyoutMouseLeave() {\r\n this.flyoutTimer = setTimeout(() => {\r\n if (activeFlyoutKey() === this.getFlyoutKey()) {\r\n activeFlyoutKey.set(null)\r\n this.expandedFlyoutChild.set(null)\r\n }\r\n }, 80)\r\n }\r\n\r\n toggleFlyoutChild(child: RouteInfo) {\r\n if (!child.submenu?.length) return\r\n const key = child.title + child.path\r\n this.expandedFlyoutChild.set(this.expandedFlyoutChild() == key ? null : key)\r\n }\r\n\r\n isFlyoutChildExpanded(child: RouteInfo): boolean {\r\n return this.expandedFlyoutChild() === (child.title + child.path)\r\n }\r\n\r\n onFlyoutItemClick(child: RouteInfo, event: MouseEvent) {\r\n if (child.submenu?.length) {\r\n event.preventDefault()\r\n event.stopPropagation()\r\n this.toggleFlyoutChild(child)\r\n return\r\n }\r\n activeFlyoutKey.set(null)\r\n if (child.extralink) {\r\n this.openLink(child)\r\n return\r\n }\r\n this.headerUiService.setTypeDocumento(null)\r\n this.headerUiService.setNumintDocumento(null)\r\n }\r\n\r\n onFlyoutGrandchildClick(grandchild: RouteInfo) {\r\n activeFlyoutKey.set(null)\r\n this.expandedFlyoutChild.set(null)\r\n if (grandchild.extralink) {\r\n this.openLink(grandchild)\r\n return\r\n }\r\n this.headerUiService.setTypeDocumento(null)\r\n this.headerUiService.setNumintDocumento(null)\r\n }\r\n\r\n onFlyoutItemRightClick(event: MouseEvent, child: RouteInfo) {\r\n if (child.extralink) return\r\n if (!child.submenu?.length && child.path) {\r\n event.preventDefault()\r\n window.open(child.path)\r\n }\r\n }\r\n\r\n onFlyoutItemMiddleClick(event: MouseEvent, child: RouteInfo) {\r\n if (event.button === 1 && !child.submenu?.length && child.path && !child.extralink) {\r\n event.preventDefault()\r\n this.tabsService.addBackground(child.path, child.title, child.icon, this.item().title)\r\n }\r\n }\r\n\r\n toggle() {\r\n if (this.item().extralink) {\r\n this.openLink(this.item())\r\n return\r\n }\r\n if (this.item()?.submenu?.length > 0) {\r\n if (this.isCollapsedMode) return\r\n this.open.set(!this.open())\r\n this.menuService.setOpenMenu(this.level(), this.open() ? this.getItemId() : null)\r\n } else {\r\n this.headerUiService.setTypeDocumento(null)\r\n this.headerUiService.setNumintDocumento(null)\r\n }\r\n }\r\n\r\n openLink(item: RouteInfo) {\r\n this.extralinkOpener?.open(item.moduloID, item.routeName)\r\n }\r\n\r\n onMiddleClick(event: MouseEvent) {\r\n if (this.item().extralink) {\r\n event.preventDefault()\r\n return\r\n }\r\n if (event.button == 1 && !this.item().submenu?.length && this.item().path) {\r\n event.preventDefault()\r\n const module = this.level() === 0 ? null : this.parentModuleName()\r\n this.tabsService.addBackground(this.item().path, this.item().title, this.item().icon, module)\r\n }\r\n }\r\n\r\n onRightClick(event: MouseEvent) {\r\n if (this.item().extralink) {\r\n event.preventDefault()\r\n return\r\n }\r\n if (!this.item().submenu?.length && this.item().path) {\r\n window.open(this.item().path)\r\n }\r\n }\r\n\r\n isOpen() {\r\n return this.open()\r\n }\r\n\r\n getItemId(): string {\r\n return `${this.level}-${this.item().path}-${this.item().title}`\r\n }\r\n\r\n codAcceso = () => {\r\n const { accesoID, moduloID, extralink } = this.item()\r\n if (extralink && moduloID != null) return `ModuloID: ${moduloID}`\r\n if (accesoID == null && moduloID == null) return ''\r\n const mod = moduloID != null ? moduloID : 'ND'\r\n const acc = accesoID != null ? accesoID : 'ND'\r\n return `AccesoID: ${mod}-${acc}`\r\n }\r\n\r\n codAccesoItem(item: RouteInfo): string {\r\n if (item.extralink && item.moduloID != null) return `ModuloID: ${item.moduloID}`\r\n if (item.accesoID == null && item.moduloID == null) return ''\r\n const mod = item.moduloID != null ? item.moduloID : 'ND'\r\n const acc = item.accesoID != null ? item.accesoID : 'ND'\r\n return `AccesoID: ${mod}-${acc}`\r\n }\r\n\r\n manejarRuta(item: RouteInfo) {\r\n if (item.extralink) return null\r\n if (validaArray(item.submenu)) return null\r\n return item.path\r\n }\r\n}\r\n","@if(hasAccess()){\r\n<li (mouseenter)=\"onItemMouseEnter($event)\" (mouseleave)=\"onItemMouseLeave()\"\r\n (mouseover)=\"onItemMouseOver()\">\r\n <div class=\"d-flex align-items-center justify-content-between pt-2 pb-2 px-2 item-sidebar\" (click)=\"toggle()\"\r\n (mousedown)=\"onMiddleClick($event)\" (contextmenu)=\"onRightClick($event)\"\r\n [routerLink]=\"(!item().submenu?.length && item().path && !item().extralink) ? item().path : null\"\r\n [class.active-route]=\"esRutaActiva(item().path)\" [class.cursor-pointer]=\"item().submenu?.length == 0\"\r\n [class.cursor-drow]=\"item().submenu?.length > 0\">\r\n <span>\r\n @if (item().title) {\r\n <i [class]=\"(item().icon ? item().icon : '') + (isSidebarActuallyOpen ? ' me-1' : ' me-1 ms-2')\"></i>\r\n <span class=\"sidebar-text\" [class.sidebar-text--hidden]=\"!isSidebarActuallyOpen\">\r\n {{ item().title }}\r\n </span>\r\n }\r\n </span>\r\n @if (item().submenu?.length > 0) {\r\n <i class=\"fas sidebar-chevron\" [class.sidebar-chevron--hidden]=\"!isSidebarActuallyOpen\" [ngClass]=\"{\r\n 'fa-chevron-down': isOpen(),\r\n 'fa-chevron-right': !isOpen()\r\n }\"></i>\r\n }\r\n </div>\r\n @if (item().submenu?.length && isSidebarActuallyOpen && submenuRendered()) {\r\n <ul class=\"list-unstyled ms-3 submenu\" [class.submenu--closing]=\"!isOpen()\">\r\n @for (child of item().submenu; track $index) {\r\n <app-menu-item [item]=\"child\" [level]=\"level() + 1\" [isSidebarOpen]=\"!isSidebarActuallyOpen\" [parentModuleName]=\"parentModuleName()\" [accentColor]=\"accentColor()\" [accesos]=\"accesos()\" [rolId]=\"rolId()\" />\r\n }\r\n </ul>\r\n }\r\n\r\n @if (flyoutRendered()) {\r\n <div class=\"sidebar-flyout\" [class.sidebar-flyout--closing]=\"!showFlyout()\" [style.top.px]=\"flyoutY()\" [style.max-height]=\"'calc(100dvh - ' + flyoutY() + 'px - 8px)'\"\r\n [style.--flyout-accent]=\"accentColor()\" (mouseenter)=\"onFlyoutMouseEnter()\" (mouseleave)=\"onFlyoutMouseLeave()\">\r\n <div class=\"flyout-header\">\r\n <i [class]=\"(item().icon || '') + ' flyout-header-icon'\"></i>\r\n <span class=\"flyout-header-title\">{{ item().title }}</span>\r\n @if (codAcceso()) {\r\n <span class=\"flyout-header-acceso\">{{ codAcceso().split(': ')[1] }}</span>\r\n }\r\n </div>\r\n @if (item().submenu?.length > 0) {\r\n <ul class=\"list-unstyled flyout-items\">\r\n @for (child of item().submenu; track $index) {\r\n @if (hasAccess(child)) {\r\n <li class=\"flyout-group\">\r\n <div class=\"flyout-item\" [class.flyout-item-has-children]=\"child.submenu?.length > 0\"\r\n [class.flyout-item-expanded]=\"isFlyoutChildExpanded(child)\" [routerLink]=\"manejarRuta(child)\"\r\n [class.flyout-item-active]=\"!child.submenu?.length && esRutaActiva(child.path)\"\r\n (click)=\"onFlyoutItemClick(child, $event)\" (mousedown)=\"onFlyoutItemMiddleClick($event, child)\"\r\n (contextmenu)=\"onFlyoutItemRightClick($event, child)\" (mouseenter)=\"showChildTooltip($event, child)\"\r\n (mouseleave)=\"hideChildTooltip()\">\r\n @if (child.icon) {\r\n <i [class]=\"child.icon + ' flyout-item-icon'\"></i>\r\n }\r\n <span class=\"flyout-item-label\">{{ child.title }}</span>\r\n @if (child.submenu?.length > 0) {\r\n <i class=\"fas flyout-chevron\" [class.fa-chevron-down]=\"isFlyoutChildExpanded(child)\"\r\n [class.fa-chevron-right]=\"!isFlyoutChildExpanded(child)\"></i>\r\n }\r\n </div>\r\n\r\n @if (isFlyoutChildExpanded(child) && child.submenu?.length > 0) {\r\n <ul class=\"list-unstyled flyout-subitems\">\r\n @for (grandchild of child.submenu; track $index) {\r\n @if (hasAccess(grandchild)) {\r\n <li class=\"flyout-subitem\" [routerLink]=\"manejarRuta(grandchild)\" [class.flyout-subitem-active]=\"esRutaActiva(grandchild.path)\"\r\n (click)=\"onFlyoutGrandchildClick(grandchild)\" (mousedown)=\"onFlyoutItemMiddleClick($event, grandchild)\"\r\n (contextmenu)=\"onFlyoutItemRightClick($event, grandchild)\"\r\n (mouseenter)=\"showChildTooltip($event, grandchild)\" (mouseleave)=\"hideChildTooltip()\">\r\n @if (grandchild.icon) {\r\n <i [class]=\"grandchild.icon + ' flyout-item-icon'\"></i>\r\n }\r\n <span class=\"flyout-item-label\">{{ grandchild.title }}</span>\r\n </li>\r\n }\r\n }\r\n </ul>\r\n }\r\n </li>\r\n }\r\n }\r\n </ul>\r\n }\r\n </div>\r\n }\r\n</li>\r\n}\r\n\r\n@if (tooltip()?.text) {\r\n<div class=\"acceso-tooltip-fixed\" [style.left.px]=\"tooltip()!.x\" [style.top.px]=\"tooltip()!.y\">\r\n <span class=\"tooltip-label\">{{ tooltip()!.text.split(': ')[0] }}:</span>\r\n <span class=\"tooltip-value\">{{ tooltip()!.text.split(': ')[1] }}</span>\r\n</div>\r\n}\r\n","import { Component, HostListener, input, output, signal } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\n\r\nexport interface BottomNavItem {\r\n icon: string\r\n label: string\r\n action?: () => void\r\n active?: boolean\r\n type?: 'button' | 'dropdown'\r\n onOpen?: () => void\r\n items?: Array<{\r\n icon: string;\r\n label: string;\r\n action: () => void;\r\n value?: string\r\n }>\r\n}\r\n\r\n@Component({\r\n selector: 'app-bottom-navigation',\r\n imports: [CommonModule],\r\n templateUrl: './bottom-navigation.component.html',\r\n styleUrls: ['./bottom-navigation.component.scss'],\r\n})\r\n\r\nexport class BottomNavigationComponent {\r\n\r\n menuItems = input<BottomNavItem[]>([])\r\n isVisible = input<boolean>(true)\r\n itemClick = output<{ index: number, item: BottomNavItem }>()\r\n\r\n activeDropdown = signal<number | null>(null)\r\n\r\n @HostListener('document:click')\r\n onDocumentClick() {\r\n this.activeDropdown.set(null)\r\n }\r\n\r\n toggleDropdown(index: number, event?: MouseEvent) {\r\n if (event) event.stopPropagation()\r\n const isOpening = this.activeDropdown() != index\r\n this.activeDropdown.set(isOpening ? index : null)\r\n if (isOpening) {\r\n const item = this.menuItems()[index]\r\n item?.onOpen?.()\r\n }\r\n }\r\n\r\n onItemClick(index: number, item: BottomNavItem, event?: MouseEvent) {\r\n if (event) event.stopPropagation()\r\n this.activeDropdown.set(null)\r\n this.itemClick.emit({ index, item })\r\n if (item?.action) item.action()\r\n }\r\n\r\n onSubItemClick(subItem: any, event?: MouseEvent) {\r\n if (event) event.stopPropagation()\r\n this.activeDropdown.set(null)\r\n if (subItem.action) subItem.action()\r\n }\r\n\r\n onDropdownClick(event: MouseEvent) { event.stopPropagation() }\r\n}\r\n","<nav class=\"bottom-nav\" [class.visible]=\"isVisible()\">\r\n @for (item of menuItems(); track $index) {\r\n @if (item.type == 'dropdown') {\r\n <div class=\"bottom-nav-dropdown\">\r\n <button class=\"bottom-nav-item\" [class.active]=\"activeDropdown() === $index\"\r\n (click)=\"onItemClick($index, item, $event); toggleDropdown($index, $event)\">\r\n <i [class]=\"item.icon\"></i>\r\n <span>{{ item.label }}</span>\r\n </button>\r\n\r\n @if (activeDropdown() == $index) {\r\n <div class=\"dropdown-menu show\" (click)=\"onDropdownClick($event)\">\r\n @for (subItem of item.items; track subItem.label; let last = $last; let first = $first) {\r\n <button class=\"dropdown-item\"\r\n [ngClass]=\"{'border-top-radius': first, 'border-bottom-radius': last}\"\r\n (click)=\"onSubItemClick(subItem, $event)\">\r\n\r\n <i [class]=\"subItem.icon\" class=\"me-2\"></i>\r\n <span class=\"flex-grow-1\">{{ subItem.label }}</span>\r\n\r\n @if (subItem.value) {\r\n <span class=\"fw-semibold ms-2\">{{ subItem.value }}</span>\r\n }\r\n </button>\r\n\r\n }\r\n </div>\r\n }\r\n </div>\r\n } @else {\r\n <button class=\"bottom-nav-item\" [class.active]=\"item.active\" (click)=\"onItemClick($index, item, $event)\">\r\n <i [class]=\"item.icon\"></i>\r\n <span>{{ item.label }}</span>\r\n </button>\r\n }\r\n }\r\n</nav>\r\n","import { AfterViewInit, Component, ElementRef, HostListener, NgZone, OnDestroy, ViewChild, inject, input, output, signal, computed } from '@angular/core';\r\nimport { TabsService } from '../../service/tabs.service';\r\nimport { Router } from '@angular/router';\r\nimport { CommonModule } from '@angular/common';\r\nimport { BottomNavItem } from '../bottom-navigation/bottom-navigation.component';\r\n\r\nexport interface VerticalHeaderAction {\r\n icon: string\r\n label: string\r\n badge?: number | null\r\n hidden?: boolean\r\n /** Opt-in: además de en el header, refleja esta acción en el bottom-nav (mobile). Por defecto no baja. */\r\n showInBottomNav?: boolean\r\n items?: { icon: string; label: string; accion: () => void; title?: string; value?: string }[]\r\n accion?: () => void\r\n}\r\n\r\n@Component({\r\n selector: 'app-vertical-header',\r\n imports: [CommonModule],\r\n templateUrl: './vertical-header.component.html',\r\n styleUrl: './vertical-header.component.scss'\r\n})\r\n\r\nexport class VerticalHeaderComponent implements AfterViewInit, OnDestroy {\r\n\r\n @ViewChild('headerContainer') headerContainerRef!: ElementRef<HTMLDivElement>\r\n @ViewChild('headerSideStart') headerSideStartRef!: ElementRef<HTMLDivElement>\r\n @ViewChild('headerSideEnd') headerSideEndRef!: ElementRef<HTMLDivElement>\r\n @ViewChild('compactSearchWrapper') compactSearchWrapperRef!: ElementRef<HTMLDivElement>\r\n\r\n // Buscador centrado: se contrae a \"F2\" apenas su hueco (280px, centrado)\r\n // choca con el título/módulo de la izquierda o con los íconos de la derecha,\r\n // en vez de depender de un breakpoint fijo.\r\n private static readonly SEARCH_WIDTH = 280\r\n private static readonly SEARCH_GAP = 16\r\n searchCollapsed = signal(false)\r\n private resizeObserver?: ResizeObserver\r\n\r\n private readonly ngZone = inject(NgZone)\r\n private router = inject(Router)\r\n readonly tabsService = inject(TabsService)\r\n\r\n actions = input<VerticalHeaderAction[]>([])\r\n\r\n // Algunas apps solo muestran el buscador global a ciertos roles.\r\n showSearch = input<boolean>(true)\r\n\r\n themes = input<{ id: string; icon: string; label: string }[]>([\r\n { id: 'light', icon: 'fa-sun', label: 'Claro' },\r\n { id: 'dark', icon: 'fa-moon', label: 'Oscuro' },\r\n { id: 'sky-blue', icon: 'fa-cloud', label: 'Sky Blue' },\r\n { id: 'system', icon: 'fa-desktop', label: 'Sistema' },\r\n ])\r\n showThemeSwitcher = input<boolean>(true)\r\n showTabs = input<boolean>(true)\r\n\r\n // Notificaciones: estándar en todas las apps TSI, ícono y estilo fijos —\r\n // el consumidor solo decide si se muestra y provee el contador y el click.\r\n showNotifications = input<boolean>(false)\r\n notificationsCount = input<number>(0)\r\n notificationsClick = output<void>()\r\n /** Opt-in: además de en el header, refleja las notificaciones en el bottom-nav (mobile). Por defecto no baja (igual que en consults). */\r\n notificationsInBottomNav = input<boolean>(false)\r\n\r\n // Soporte (chatbot): ídem, ícono y estilo fijos — el consumidor solo\r\n // decide si está disponible y controla su visibilidad.\r\n showChatbotToggle = input<boolean>(false)\r\n chatbotVisible = input<boolean>(false)\r\n chatbotVisibleChange = output<boolean>()\r\n /** Opt-in: además de en el header, refleja el toggle de soporte en el bottom-nav (mobile). Por defecto no baja. */\r\n chatbotInBottomNav = input<boolean>(false)\r\n currentTheme = input<string>('light')\r\n themeChange = output<string>()\r\n\r\n // Espejo de las acciones del header hacia el bottom-nav (mobile): mismo dato,\r\n // sin listas separadas — cada pieza (notificaciones, soporte, acciones) decide\r\n // por su cuenta si además de en el header se refleja acá.\r\n bottomNavItems = computed<BottomNavItem[]>(() => {\r\n const items: BottomNavItem[] = []\r\n\r\n if (this.showNotifications() && this.notificationsInBottomNav()) {\r\n items.push({\r\n icon: 'fas fa-bell',\r\n label: this.notificationsCount() > 0 ? `Notificaciones (${this.notificationsCount()})` : 'Notificaciones',\r\n action: () => this.notificationsClick.emit(),\r\n })\r\n }\r\n\r\n if (this.showChatbotToggle() && this.chatbotInBottomNav()) {\r\n items.push({\r\n icon: 'fas fa-robot',\r\n label: this.chatbotVisible() ? 'Ocultar soporte' : 'Mostrar soporte',\r\n action: () => this.chatbotVisibleChange.emit(!this.chatbotVisible()),\r\n })\r\n }\r\n\r\n for (const action of this.actions()) {\r\n if (action.hidden || !action.showInBottomNav) continue\r\n if (action.items?.length) {\r\n items.push({\r\n icon: action.icon,\r\n label: action.label,\r\n type: 'dropdown',\r\n action: action.accion,\r\n items: action.items.map(i => ({ icon: i.icon, label: i.label, value: i.value, action: i.accion })),\r\n })\r\n } else if (action.accion) {\r\n items.push({ icon: action.icon, label: action.label, action: action.accion })\r\n }\r\n }\r\n\r\n return items\r\n })\r\n\r\n readonly themeIcon = computed<string>(() =>\r\n this.themes().find(item => item.id === this.currentTheme())?.icon ?? 'fa-palette'\r\n )\r\n\r\n readonly themeLabel = computed<string>(() =>\r\n this.themes().find(item => item.id === this.currentTheme())?.label ?? 'Personalizado'\r\n )\r\n\r\n versionApp = input<string>('')\r\n accentColor = input<string>('#398bf7')\r\n envClass = input<string>('prod')\r\n produccion = input<boolean>(false)\r\n emitirToogle = output<void>()\r\n isScrolled = input<boolean>(false)\r\n isSidebarOpen = input<boolean>(false)\r\n\r\n nameProyecto = input<string>('')\r\n\r\n searchComponents = output<void>()\r\n showPanelControl = input<boolean>(true)\r\n panelControlClick = output<void>()\r\n logout = output<void>()\r\n\r\n // Datos de sesión: se reciben del consumidor (en vez de inyectar SesionService\r\n // acá) para que layout-tsi no dependa de core-tsi.\r\n userName = input<string>('')\r\n empresaName = input<string>('')\r\n // Imagen de perfil (URL o base64). Si no se envía o falla al cargar, se usa el avatar por defecto.\r\n userAvatar = input<string | null>(null)\r\n avatarFallido = signal<string | null>(null)\r\n avatarSrc = computed(() => (this.userAvatar() !== this.avatarFallido() && this.userAvatar()) || 'assets/images/admin-avatar.png')\r\n\r\n tooltip = signal<{ text: string; x: number; y: number } | null>(null)\r\n\r\n // Reemplazan a ngbDropdown (sin @ng-bootstrap acá): un dropdown nativo por\r\n // click, reutilizando las clases de Bootstrap (dropdown/dropdown-menu/show)\r\n // que ya vienen estilizadas — así no hace falta reimplementar el CSS.\r\n openActionKey = signal<string | null>(null)\r\n themeMenuOpen = signal<boolean>(false)\r\n userMenuOpen = signal<boolean>(false)\r\n\r\n @HostListener('document:click')\r\n onDocumentClick() {\r\n this.tooltip.set(null)\r\n this.closeAllMenus()\r\n }\r\n\r\n private closeAllMenus() {\r\n this.openActionKey.set(null)\r\n this.themeMenuOpen.set(false)\r\n this.userMenuOpen.set(false)\r\n }\r\n\r\n toggleActionMenu(event: MouseEvent, action: VerticalHeaderAction) {\r\n event.stopPropagation()\r\n const opening = this.openActionKey() !== action.label\r\n this.closeAllMenus()\r\n this.openActionKey.set(opening ? action.label : null)\r\n }\r\n\r\n runAction(item: { accion: () => void }) {\r\n this.openActionKey.set(null)\r\n item.accion()\r\n }\r\n\r\n toggleThemeMenu(event: MouseEvent) {\r\n event.stopPropagation()\r\n const opening = !this.themeMenuOpen()\r\n this.closeAllMenus()\r\n this.themeMenuOpen.set(opening)\r\n }\r\n\r\n selectTheme(id: string) {\r\n this.themeMenuOpen.set(false)\r\n this.themeChange.emit(id)\r\n }\r\n\r\n toggleUserMenu(event: MouseEvent) {\r\n event.stopPropagation()\r\n const opening = !this.userMenuOpen()\r\n this.closeAllMenus()\r\n this.userMenuOpen.set(opening)\r\n }\r\n\r\n showTooltip(event: MouseEvent, text: string) {\r\n if (!text) return\r\n const rect = (event.currentTarget as HTMLElement).getBoundingClientRect()\r\n this.tooltip.set({ text, x: rect.right + 4, y: rect.top + rect.height / 2 })\r\n }\r\n\r\n hideTooltip() { this.tooltip.set(null) }\r\n\r\n // Ningún atajo de teclado se define acá (ni F2 ni ninguno con `key`): todos\r\n // viven en el wrapper del consumidor con su propio keydown listener, todos\r\n // por igual — evita mezclar guards de rol/hasOpenModals en dos lugares.\r\n goToHome() { this.router.navigate(['/atajos']) }\r\n\r\n ngAfterViewInit() {\r\n // ResizeObserver corre fuera de la zona de Angular (no está parcheado por\r\n // zone.js), así que sin ngZone.run() el signal se actualiza pero la vista\r\n // no se refresca hasta que algo más dispare un ciclo de detección.\r\n this.resizeObserver = new ResizeObserver(() => this.ngZone.run(() => this.updateSearchCollapse()))\r\n this.resizeObserver.observe(this.headerContainerRef.nativeElement)\r\n this.resizeObserver.observe(this.headerSideStartRef.nativeElement)\r\n this.resizeObserver.observe(this.headerSideEndRef.nativeElement)\r\n this.updateSearchCollapse()\r\n }\r\n\r\n ngOnDestroy() {\r\n this.resizeObserver?.disconnect()\r\n }\r\n\r\n private updateSearchCollapse() {\r\n const containerRect = this.headerContainerRef.nativeElement.getBoundingClientRect()\r\n const startRect = this.headerSideStartRef.nativeElement.getBoundingClientRect()\r\n const endRect = this.headerSideEndRef.nativeElement.getBoundingClientRect()\r\n // El botón compacto \"F2\" solo existe cuando ya está colapsado, así que su\r\n // propio ancho no debe contar para decidir si hay que colapsar — si no,\r\n // aparecer empuja el límite derecho y el estado queda pegado en \"colapsado\".\r\n const compactWidth = this.compactSearchWrapperRef?.nativeElement.getBoundingClientRect().width ?? 0\r\n\r\n const half = VerticalHeaderComponent.SEARCH_WIDTH / 2\r\n const gap = VerticalHeaderComponent.SEARCH_GAP\r\n const center = containerRect.left + containerRect.width / 2\r\n const searchLeft = center - half\r\n const searchRight = center + half\r\n const endLeft = endRect.left + compactWidth\r\n\r\n // Por debajo de md (768px) el buscador centrado ya está oculto por Bootstrap\r\n // (d-md-flex) sin importar si hay colisión real — así que el ícono compacto\r\n // tiene que quedar como colapsado ahí sí o sí, no solo cuando choca.\r\n const belowMd = containerRect.width < 768\r\n const collides = belowMd || (startRect.right + gap > searchLeft) || (searchRight + gap > endLeft)\r\n if (collides !== this.searchCollapsed()) this.searchCollapsed.set(collides)\r\n }\r\n}\r\n","<div #headerContainer class=\"d-flex header-container\" [ngClass]=\"envClass()\">\r\n <div class=\"first-header d-none d-md-flex\">\r\n <img src=\"assets/images/logo-tsi-tres.png\" width=\"40px\" height=\"40px\" style=\"cursor:pointer\"\r\n (click)=\"goToHome()\" title=\"Ir a Home\">\r\n <span class=\"text-white empresa-nombre ps-2\" [title]=\"versionApp()\">{{empresaName()}}</span>\r\n </div>\r\n\r\n <div class=\"d-flex w-100 h-100 justify-content-between align-items-center pe-3 ps-0\">\r\n <div #headerSideStart class=\"d-flex align-items-center header-side\">\r\n <button class=\"btn text-white none-style sidebar-toggle-btn\" (click)=\"emitirToogle.emit()\">\r\n <i class=\"fa-solid fa-table-columns\" [class.flipped]=\"isSidebarOpen()\"></i>\r\n <i class=\"fa-solid fa-chevron-left toggle-arrow\" [class.flipped]=\"isSidebarOpen()\"></i>\r\n </button>\r\n <span class=\"text-white empresa-nombre d-inline d-md-none ps-2\">{{empresaName()}}</span>\r\n <span class=\"text-white fs-5 fw-normal d-none d-md-inline ps-2 text-nowrap\">{{nameProyecto()}}</span>\r\n @if (showTabs() && tabsService.tabs().length) {\r\n <button class=\"tabs-header-btn mx-2 d-none d-md-flex\"\r\n [class.tabs-header-btn--active]=\"tabsService.visible()\" (click)=\"tabsService.toggleVisible()\"\r\n [title]=\"tabsService.visible() ? 'Ocultar acceso rápido' : 'Mostrar acceso rápido'\">\r\n <i class=\"fas fa-layer-group\"></i>\r\n @if (!tabsService.visible()) {\r\n <span class=\"tabs-header-count\">{{ tabsService.tabs().length }}</span>\r\n }\r\n </button>\r\n }\r\n </div>\r\n\r\n @if (showSearch()) {\r\n <button class=\"global-search-trigger d-none d-md-flex align-items-center\"\r\n [class.global-search-trigger--collapsed]=\"searchCollapsed()\" title=\"Búsqueda de páginas (F2)\"\r\n (click)=\"searchComponents.emit()\">\r\n <i class=\"fas fa-search global-search-icon\"></i>\r\n <span class=\"global-search-placeholder\">Buscar páginas...</span>\r\n <kbd class=\"global-search-kbd\">F2</kbd>\r\n </button>\r\n }\r\n\r\n <div #headerSideEnd class=\"d-flex align-items-center header-side header-side--end\">\r\n\r\n <!-- Fallback del buscador centrado cuando no entra (colisión) o en mobile\r\n (el buscador centrado se oculta por completo por debajo de md): la\r\n píldora de texto \"F2\", igual que antes. -->\r\n <div #compactSearchWrapper class=\"h-100 d-flex align-items-center\">\r\n @if (showSearch() && searchCollapsed()) {\r\n <button class=\"global-search-compact-pill\" title=\"Buscar páginas (F2)\"\r\n (click)=\"searchComponents.emit()\">F2</button>\r\n }\r\n </div>\r\n\r\n <div class=\"d-flex align-items-center\">\r\n <ng-content select=\"[extra-actions]\" />\r\n\r\n <!-- Acciones adicionales, definidas por el consumidor: siempre a la izquierda\r\n de los tres fijos (tema, notificaciones, soporte). Solo se ocultan en mobile\r\n las que además se reflejan en el bottom-nav (showInBottomNav) — si una acción\r\n no baja al bottom-nav, se queda visible acá para no desaparecer del todo. -->\r\n @for (action of actions(); track action.label) {\r\n @if (!action.hidden) {\r\n @if (action.items?.length) {\r\n <div class=\"dropdown d-inline-block z-index\" [class.show]=\"openActionKey() === action.label\" [class.desktop-only]=\"action.showInBottomNav\">\r\n <div class=\"h-100 d-flex align-items-center\">\r\n <button class=\"notification-btn option p-0 m-0 me-2\" [title]=\"action.label\" (click)=\"action.accion?.(); toggleActionMenu($event, action)\">\r\n <i class=\"fas text-white\" [ngClass]=\"action.icon\"></i>\r\n </button>\r\n </div>\r\n\r\n <div class=\"dropdown-menu dropdown-menu-end mtp-9 mb-0 py-0 custom-dropdown\" [class.show]=\"openActionKey() === action.label\">\r\n @for (opcion of action.items; track opcion.label; let last = $last) {\r\n <button class=\"dropdown-item py-2 fs-7 fw-4 d-flex align-items-center\"\r\n [ngClass]=\"{'divider-border': !last,'border-top-radius': $index == 0,'border-bottom-radius': last}\"\r\n (click)=\"runAction(opcion)\"\r\n (mouseenter)=\"showTooltip($event, opcion.title ?? '')\" (mouseleave)=\"hideTooltip()\">\r\n <i [class]=\"opcion.icon\" class=\"me-1\"></i> {{ opcion.label }}\r\n @if (opcion.value) {\r\n <span class=\"ms-auto ps-3 fw-6\">{{ opcion.value }}</span>\r\n }\r\n </button>\r\n }\r\n </div>\r\n </div>\r\n } @else {\r\n <div class=\"h-100 d-flex align-items-center\" [class.desktop-only]=\"action.showInBottomNav\">\r\n <button class=\"notification-btn option p-0 m-0 me-2\" [title]=\"action.label\" (click)=\"action.accion?.()\">\r\n <i class=\"fas text-white\" [ngClass]=\"action.icon\"></i>\r\n @if (action.badge) {\r\n <span class=\"notification-badge\" [ngClass]=\"produccion() ? 'bg-danger' : 'bg-info'\">\r\n {{ action.badge }}\r\n </span>\r\n }\r\n </button>\r\n </div>\r\n }\r\n }\r\n }\r\n\r\n @if (showThemeSwitcher()) {\r\n <div class=\"dropdown d-inline-block z-index\" [class.show]=\"themeMenuOpen()\">\r\n <div class=\"h-100 d-flex align-items-center\">\r\n <button class=\"notification-btn option p-0 m-0 me-2\" (click)=\"toggleThemeMenu($event)\"\r\n [title]=\"'Tema: ' + themeLabel()\">\r\n <i class=\"fas text-white\" [ngClass]=\"themeIcon()\"></i>\r\n </button>\r\n </div>\r\n\r\n <div class=\"dropdown-menu dropdown-menu-end mtp-9 mb-0 py-0 custom-dropdown\" [class.show]=\"themeMenuOpen()\">\r\n @for (item of themes(); track item.id) {\r\n <button class=\"dropdown-item py-2 fs-7 fw-4 border-bottom-radius divider-border\"\r\n (click)=\"selectTheme(item.id)\">\r\n <i class=\"fas me-1\" [ngClass]=\"item.icon\"></i> {{ item.label }}\r\n @if (currentTheme() === item.id) {\r\n <i class=\"fas fa-check ms-auto text-success\"></i>\r\n }\r\n </button>\r\n }\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n\r\n <!-- Notificaciones y soporte: ícono/estilo estándar, siempre visibles también en mobile -->\r\n @if (showNotifications()) {\r\n <div class=\"h-100 d-flex align-items-center\">\r\n <button class=\"notification-btn option p-0 m-0 me-2\" title=\"Notificaciones\"\r\n (click)=\"notificationsClick.emit()\">\r\n <i class=\"fas fa-bell text-white\"></i>\r\n @if (notificationsCount() > 0) {\r\n <span class=\"notification-badge\" [ngClass]=\"produccion() ? 'bg-danger' : 'bg-info'\">\r\n {{ notificationsCount() }}\r\n </span>\r\n }\r\n </button>\r\n </div>\r\n }\r\n\r\n @if (showChatbotToggle()) {\r\n <div class=\"h-100 d-flex align-items-center\">\r\n <button class=\"notification-btn option p-0 m-0 me-2\"\r\n [title]=\"chatbotVisible() ? 'Ocultar soporte' : 'Mostrar soporte'\"\r\n (click)=\"chatbotVisibleChange.emit(!chatbotVisible())\">\r\n <i class=\"fas fa-robot text-white\"></i>\r\n </button>\r\n </div>\r\n }\r\n\r\n <div class=\"dropdown d-inline-block z-index\" [class.show]=\"userMenuOpen()\">\r\n <div class=\"h-100 d-flex align-items-center\">\r\n <button class=\"border-0 bg-none\" (click)=\"toggleUserMenu($event)\">\r\n <img class=\"circle-icon shadow-sm\" [src]=\"avatarSrc()\" (error)=\"avatarFallido.set(userAvatar())\" alt=\"\">\r\n </button>\r\n </div>\r\n <div class=\"dropdown-menu dropdown-menu-end mtp-9 mb-0 py-0\" [class.show]=\"userMenuOpen()\">\r\n <div\r\n class=\"d-flex no-block align-items-center p-3 divider-border bg-gray-user-data border-top-radius\">\r\n <div class=\"d-flex align-items-center\">\r\n <img class=\"circle-icon shadow-sm\" [src]=\"avatarSrc()\" (error)=\"avatarFallido.set(userAvatar())\" alt=\"\">\r\n <div class=\"ms-2\">\r\n <p class=\"fs-7 my-0 py-0 fw-6\">{{userName()}}</p>\r\n @if (userName().startsWith('DESARROLLADOR')) {\r\n <span class=\"fs-7 fw-bold\">Desarrollador</span>\r\n } @else if (userName().startsWith('SOPORTE')) {\r\n <span class=\"fs-7 fw-bold\">Soporte</span>\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n @if (showPanelControl()) {\r\n <button class=\"dropdown-item py-3 fs-7 fw-4\" (click)=\"userMenuOpen.set(false); panelControlClick.emit()\">\r\n Panel de control\r\n </button>\r\n }\r\n <button class=\"dropdown-item py-3 fs-7 fw-4 border-bottom-radius\" (click)=\"userMenuOpen.set(false); logout.emit()\"><i\r\n class=\"fas fa-power-off\"></i> Cerrar sesión</button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n@if (tooltip()?.text) {\r\n<div class=\"acceso-tooltip-fixed\" [style.left.px]=\"tooltip()!.x\" [style.top.px]=\"tooltip()!.y\"\r\n [style.borderLeftColor]=\"accentColor()\" [style.--tooltip-accent]=\"accentColor()\">\r\n <span class=\"tooltip-label\">{{ tooltip()!.text.split(': ')[0] }}:</span>\r\n <span class=\"tooltip-value\" [style.color]=\"accentColor()\">{{ tooltip()!.text.split(': ')[1] }}</span>\r\n</div>\r\n}\r\n","import { Component, computed, effect, inject, input, signal } from '@angular/core';\r\nimport { TabsService } from '../../service/tabs.service';\r\nimport { AppTab } from '../../models/general/app-tab.model';\r\n\r\nconst DEFAULT_MODULE_COLORS: Record<string, string> = {\r\n 'Archivos': '#ea6f0a',\r\n 'Contabilidad': '#059669',\r\n 'Comercial': '#2563eb',\r\n 'Logística': '#9333ea',\r\n 'Cuentas por cobrar': '#d97706',\r\n 'Cuentas por pagar': '#dc2626',\r\n}\r\n\r\n// Duración de la animación de salida (@keyframes tabBarSlideOut en el scss):\r\n// se mantiene montada este tiempo antes de desmontarla de verdad.\r\nconst LEAVE_DURATION_MS = 160\r\n\r\n@Component({\r\n selector: 'app-tab-bar',\r\n imports: [],\r\n templateUrl: './tab-bar.component.html',\r\n styleUrl: './tab-bar.component.scss',\r\n})\r\n\r\nexport class TabBarComponent {\r\n\r\n tabs = inject(TabsService)\r\n\r\n // Reemplaza a @slideDown (sin @angular/animations): la salida (:leave) no\r\n // tiene equivalente CSS puro porque Angular remueve el elemento del DOM al\r\n // instante — acá lo mantenemos montado con una clase \"--leaving\" el tiempo\r\n // que dura la animación de salida, y recién ahí lo desmontamos.\r\n shouldShow = computed(() => this.tabs.tabs().length > 0 && this.tabs.visible())\r\n rendered = signal(false)\r\n private leaveTimer: ReturnType<typeof setTimeout> | null = null\r\n\r\n constructor() {\r\n effect(() => {\r\n if (this.shouldShow()) {\r\n if (this.leaveTimer) {\r\n clearTimeout(this.leaveTimer)\r\n this.leaveTimer = null\r\n }\r\n this.rendered.set(true)\r\n } else if (this.rendered()) {\r\n this.leaveTimer = setTimeout(() => this.rendered.set(false), LEAVE_DURATION_MS)\r\n }\r\n })\r\n }\r\n\r\n // Se combina con los colores por defecto en vez de reemplazarlos: un proyecto solo\r\n // necesita pasar los módulos que quiera personalizar, el resto sigue con su color base.\r\n moduleColors = input<Record<string, string>>({})\r\n\r\n // Tooltip nativo al hover (sin ng-bootstrap): mismo patrón fixed-position\r\n // que ya usan menu-item/vertical-header en esta librería.\r\n hoveredTab = signal<AppTab | null>(null)\r\n tipPosition = signal<{ x: number; y: number }>({ x: 0, y: 0 })\r\n private hoverTimer: ReturnType<typeof setTimeout> | null = null\r\n\r\n getModuleColor(tab: AppTab): string {\r\n const key = tab.moduleKey ?? tab.module ?? ''\r\n return this.moduleColors()[key] ?? DEFAULT_MODULE_COLORS[key] ?? '#6b7280'\r\n }\r\n\r\n onTabMouseEnter(event: MouseEvent, tab: AppTab) {\r\n if (this.hoverTimer) clearTimeout(this.hoverTimer)\r\n const rect = (event.currentTarget as HTMLElement).getBoundingClientRect()\r\n this.hoverTimer = setTimeout(() => {\r\n this.tipPosition.set({ x: rect.left + rect.width / 2, y: rect.bottom + 8 })\r\n this.hoveredTab.set(tab)\r\n }, 600)\r\n }\r\n\r\n onTabMouseLeave() {\r\n if (this.hoverTimer) {\r\n clearTimeout(this.hoverTimer)\r\n this.hoverTimer = null\r\n }\r\n this.hoveredTab.set(null)\r\n }\r\n\r\n onTabMouseDown(event: MouseEvent, tab: AppTab) {\r\n if (event.button === 1 && !tab.pinned) {\r\n event.preventDefault()\r\n this.tabs.close(tab.id, event)\r\n }\r\n }\r\n}\r\n","@if (rendered()) {\r\n<div class=\"tab-bar\" [class.tab-bar--leaving]=\"!shouldShow()\">\r\n <div class=\"tab-list\">\r\n @for (tab of tabs.sortedTabs(); track tab.id) {\r\n\r\n <div class=\"tab\" [class.tab--active]=\"tabs.activeId() === tab.id\" [class.tab--pinned]=\"tab.pinned\"\r\n [class.tab--with-module]=\"!!tab.module\" (mouseenter)=\"onTabMouseEnter($event, tab)\" (mouseleave)=\"onTabMouseLeave()\"\r\n (click)=\"tabs.activate(tab.id)\" (mousedown)=\"onTabMouseDown($event, tab)\">\r\n @if (tab.icon) {\r\n <i [class]=\"tab.icon + ' tab-icon'\"></i>\r\n }\r\n <div class=\"tab-body\">\r\n <span class=\"tab-title\">{{ tab.title }}</span>\r\n @if (tab.module) {\r\n <span class=\"tab-module\">\r\n <span class=\"tab-module-dot\" [style.background]=\"getModuleColor(tab)\"></span>\r\n {{ tab.module }}\r\n </span>\r\n }\r\n </div>\r\n <button class=\"tab-btn tab-pin\" [class.tab-pin--active]=\"tab.pinned\" (click)=\"tabs.togglePin(tab.id, $event)\"\r\n [title]=\"tab.pinned ? 'Desfijar' : 'Fijar'\">\r\n <i class=\"fas fa-thumbtack\"></i>\r\n </button>\r\n @if (!tab.pinned) {\r\n <button class=\"tab-btn tab-close\" (click)=\"tabs.close(tab.id, $event)\" title=\"Cerrar\">\r\n <i class=\"fas fa-times\"></i>\r\n </button>\r\n }\r\n </div>\r\n }\r\n </div>\r\n\r\n <div class=\"tab-actions\">\r\n <button class=\"tab-close-all\" (click)=\"tabs.closeAll()\" title=\"Cerrar todas las pestañas\">\r\n <i class=\"fas fa-times-circle\"></i>\r\n <span>Cerrar todo</span>\r\n </button>\r\n </div>\r\n</div>\r\n\r\n@if (hoveredTab(); as tab) {\r\n<div class=\"tab-tip-fixed\" [style.left.px]=\"tipPosition().x\" [style.top.px]=\"tipPosition().y\">\r\n <span class=\"tab-tip-title\">{{ tab.title }}</span>\r\n @if (tab.module) {\r\n <span class=\"tab-tip-module\">\r\n <span class=\"tab-tip-dot\" [style.background]=\"getModuleColor(tab)\"></span>\r\n {{ tab.module }}\r\n </span>\r\n }\r\n</div>\r\n}\r\n}\r\n","import { Injectable, signal } from '@angular/core';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\n\r\nexport class DetectorService {\r\n\r\n private componenteActual = signal<string | null>(null)\r\n\r\n setComponente(componente: string) {\r\n this.componenteActual.set(componente)\r\n }\r\n\r\n getComponente() {\r\n return this.componenteActual.asReadonly()\r\n }\r\n}\r\n","import { CommonModule } from '@angular/common';\r\nimport { Component, computed, ContentChild, effect, ElementRef, HostListener, inject, input, reflectComponentType, signal, ViewChild } from '@angular/core';\r\nimport { ChildrenOutletContexts, NavigationEnd, Router, RouterModule } from '@angular/router';\r\nimport { MenuItemComponent } from '../menu-item/menu-item.component';\r\nimport { RouteInfo } from '../../models/general/route-info.model';\r\nimport { SessionData } from '../../models/general/session-data.model';\r\nimport { BottomNavigationComponent, BottomNavItem } from '../bottom-navigation/bottom-navigation.component';\r\nimport { VerticalHeaderComponent } from '../vertical-header/vertical-header.component';\r\nimport { TabBarComponent } from '../tab-bar/tab-bar.component';\r\nimport { DetectorService } from '../../service/detector.service';\r\nimport { TabsService } from '../../service/tabs.service';\r\nimport { filter } from 'rxjs/operators';\r\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\r\n\r\n@Component({\r\n selector: 'app-full',\r\n imports: [CommonModule, RouterModule, MenuItemComponent, BottomNavigationComponent, TabBarComponent],\r\n templateUrl: './full.component.html',\r\n styleUrl: './full.component.scss',\r\n})\r\n\r\nexport class FullComponent {\r\n\r\n private readonly detectorService = inject(DetectorService)\r\n private readonly contexts = inject(ChildrenOutletContexts)\r\n private readonly router = inject(Router)\r\n private readonly tabsService = inject(TabsService)\r\n\r\n menuItems = input<RouteInfo[]>([])\r\n nameProyecto = input<string>('')\r\n accentColor = input<string>('#398bf7')\r\n showTabs = input<boolean>(true)\r\n tabModuleColors = input<Record<string, string>>({})\r\n currentYear = new Date().getFullYear()\r\n\r\n // El vertical-header se recibe proyectado (<ng-content select=\"[header]\">), así\r\n // que no es un ViewChild del template propio de `full` sino contenido — por eso\r\n // ContentChild en vez de ViewChild (mismo mecanismo que usa consults con ViewChild\r\n // porque ahí el header vive directo en su propio template, no proyectado).\r\n // El bottom-nav SOLO sale de ahí — igual que en consults, sin lista aparte.\r\n private verticalHeaderSignal = signal<VerticalHeaderComponent | null>(null)\r\n @ContentChild(VerticalHeaderComponent)\r\n set verticalHeaderRef(vh: VerticalHeaderComponent | undefined) {\r\n if (vh) this.verticalHeaderSignal.set(vh)\r\n }\r\n\r\n bottomMenuItems = computed<BottomNavItem[]>(() =>\r\n this.verticalHeaderSignal()?.bottomNavItems() ?? []\r\n )\r\n\r\n isSidebarOpen = signal<boolean>(false)\r\n isSidebarHovering = signal<boolean>(false)\r\n isScrolled = signal<boolean>(false)\r\n\r\n isDesktop = window.innerWidth >= 1191\r\n isMobileView = signal<boolean>(window.innerWidth <= 667)\r\n sidebarWidth = signal<number>(260)\r\n\r\n // Datos de sesión: se reciben del consumidor (en vez de inyectar SesionService\r\n // acá) para que layout-tsi no dependa de core-tsi. Es un solo objeto requerido\r\n // (input.required) en vez de 6 inputs sueltos, para que Angular tire error si\r\n // el consumidor se olvida de pasarlo, en vez de fallar en silencio con '' o [].\r\n sessionData = input.required<SessionData>()\r\n\r\n nombreSucursal = computed(() =>\r\n this.sessionData().sucursales?.find(s => s.codsuc == this.sessionData().codsuc)?.sucursal ?? ''\r\n )\r\n\r\n cambiarSucursal() {\r\n this.router.navigateByUrl('seleccionar-sucursal')\r\n }\r\n\r\n get userInitials(): string {\r\n return this.sessionData().nombreUser.split(' ').filter(Boolean).slice(0, 2).map(n => n[0].toUpperCase()).join('')\r\n }\r\n\r\n // El contenido del router-outlet aparecía en seco al cambiar de página/tab.\r\n // (activate) avisa cada vez que se instancia un componente nuevo ahí — se\r\n // saca la clase y se vuelve a poner en el siguiente frame para forzar que\r\n // el @keyframes de entrada se reinicie (una clase ya puesta no reinicia su\r\n // animación si se la vuelve a poner sin sacarla antes).\r\n routeAnimating = signal(false)\r\n\r\n onRouteActivate() {\r\n this.routeAnimating.set(false)\r\n requestAnimationFrame(() => requestAnimationFrame(() => this.routeAnimating.set(true)))\r\n }\r\n\r\n constructor() {\r\n effect(() => {\r\n document.documentElement.style.setProperty('--sidebar-accent', this.accentColor())\r\n })\r\n\r\n this.tabsService.init()\r\n\r\n this.router.events.pipe(filter((e): e is NavigationEnd => e instanceof NavigationEnd), takeUntilDestroyed()).subscribe(() => {\r\n const component = this.contexts.getContext('primary')?.outlet?.component\r\n if (component) {\r\n const mirror = reflectComponentType(component.constructor as any)\r\n if (mirror) this.detectorService.setComponente(mirror.selector)\r\n }\r\n })\r\n }\r\n\r\n @ViewChild('contentContainer') contentContainer: ElementRef\r\n @ViewChild('sidebar') sidebarRef!: ElementRef<HTMLDivElement>\r\n\r\n toggleSidebar() {\r\n this.isSidebarOpen.set(!this.isSidebarOpen())\r\n this.updateSidebarWidth()\r\n }\r\n\r\n closeSidebar() {\r\n this.isSidebarOpen.set(false)\r\n }\r\n\r\n @HostListener('window:resize', ['$event'])\r\n onResize(event: any) {\r\n this.isDesktop = event.target.innerWidth >= 1191\r\n this.isMobileView.set(event.target.innerWidth <= 667)\r\n if (this.isDesktop) {\r\n this.isSidebarOpen.set(false)\r\n }\r\n }\r\n\r\n ngAfterViewInit() {\r\n if (this.contentContainer) {\r\n this.contentContainer.nativeElement.addEventListener('scroll', () => {\r\n const scrollTop = this.contentContainer.nativeElement.scrollTop\r\n this.isScrolled.set(scrollTop > 0)\r\n })\r\n }\r\n if (this.sidebarRef) {\r\n this.sidebarRef.nativeElement.addEventListener('transitionend', (event: TransitionEvent) => {\r\n if (event.propertyName == 'max-width') {\r\n this.updateSidebarWidth()\r\n }\r\n })\r\n }\r\n window.addEventListener('resize', () => this.updateSidebarWidth())\r\n this.updateSidebarWidth()\r\n }\r\n\r\n get isSidebarActuallyOpen(): boolean {\r\n return window.innerWidth <= 1191 ? true : !this.isSidebarOpen()\r\n }\r\n\r\n updateSidebarWidth() {\r\n if (this.sidebarRef) {\r\n const newWidth = this.sidebarRef.nativeElement.offsetWidth\r\n this.sidebarWidth.set(newWidth)\r\n }\r\n }\r\n\r\n @HostListener('document:click', ['$event'])\r\n onClickOutside(event: Event) {\r\n if (window.innerWidth > 1191) return\r\n const sidebarEl = this.sidebarRef?.nativeElement\r\n const toggleButton = document.querySelector('app-vertical-header')\r\n\r\n if (this.isSidebarOpen() && sidebarEl &&\r\n !sidebarEl.contains(event.target as Node) &&\r\n !toggleButton?.contains(event.target as Node)) {\r\n this.isSidebarOpen.set(false)\r\n }\r\n }\r\n\r\n onSidebarHoverEnter() {\r\n if (window.innerWidth > 1191 && this.isSidebarOpen()) {\r\n this.isSidebarHovering.set(true)\r\n }\r\n }\r\n\r\n onSidebarHoverLeave() {\r\n if (window.innerWidth > 1191 && this.isSidebarOpen()) {\r\n this.isSidebarHovering.set(false)\r\n }\r\n }\r\n\r\n showBottomNav = computed<boolean>(() =>\r\n this.isMobileView() && !this.isSidebarOpen() && this.bottomMenuItems().length > 0\r\n )\r\n}\r\n","<ng-content select=\"[header]\" />\r\n\r\n<div [ngClass]=\"{'layout': true, 'open': isSidebarOpen()}\">\r\n <div #sidebar class=\"sidebar\" id=\"sidebar\" [ngClass]=\"isSidebarOpen() ? 'open' : ''\"\r\n (mouseenter)=\"onSidebarHoverEnter()\" (mouseleave)=\"onSidebarHoverLeave()\">\r\n <div class=\"sub-sidebar py-3\">\r\n <div class=\"user-profile\" [class.collapsed]=\"!isSidebarActuallyOpen\">\r\n <div class=\"user-info\" [class.user-info--hidden]=\"!isSidebarActuallyOpen\">\r\n <span class=\"fw-6 fs-7 truncate-text user-name\">{{ sessionData().nombreUser }}</span>\r\n <span class=\"truncate-text user-sucursal\">{{ nombreSucursal() }}</span>\r\n </div>\r\n @if (sessionData().sucursales.length > 1) {\r\n <button type=\"button\" class=\"btn-cambiar-sucursal\" title=\"Cambiar sucursal\" aria-label=\"Cambiar sucursal\"\r\n (click)=\"cambiarSucursal()\">\r\n <i class=\"fas fa-right-left\"></i>\r\n </button>\r\n }\r\n </div>\r\n </div>\r\n\r\n <div class=\"pt-3 px-2 list-menu-sidebar\">\r\n <ul class=\"list-unstyled\">\r\n @for (item of menuItems(); track $index) {\r\n <app-menu-item [item]=\"item\" [isSidebarOpen]=\"isSidebarOpen()\" [isSidebarHovering]=\"isSidebarHovering()\"\r\n [parentModuleName]=\"item.title\" [accentColor]=\"accentColor()\" [accesos]=\"sessionData().accesos\" [rolId]=\"sessionData().rolId\" />\r\n }\r\n </ul>\r\n </div>\r\n\r\n <div class=\"sidebar-footer text-center\" [class.sidebar-footer--hidden]=\"!isSidebarActuallyOpen\">\r\n <p> © {{ currentYear }} Grupo TSI - {{ sessionData().idCia }} </p>\r\n </div>\r\n </div>\r\n\r\n <div #contentContainer class=\"content\" [class.has-bottom-nav]=\"showBottomNav()\"\r\n [ngStyle]=\"{'background-color': 'var(--background-color)'}\">\r\n @if (showTabs()) {\r\n <app-tab-bar [moduleColors]=\"tabModuleColors()\" />\r\n }\r\n <div class=\"content-scroll\">\r\n <div class=\"container-fluid\" [class.route-fade-in]=\"routeAnimating()\">\r\n <router-outlet (activate)=\"onRouteActivate()\" />\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n@if (showBottomNav()) {\r\n<app-bottom-navigation [menuItems]=\"bottomMenuItems()\" [isVisible]=\"true\" />\r\n}\r\n<ng-content select=\"[chatbot]\" />\r\n","import { InjectionToken } from '@angular/core';\r\n\r\nexport interface ChatOption {\r\n label: string\r\n nextNodeId?: string\r\n response?: string\r\n}\r\n\r\nexport interface ChatNode {\r\n id: string\r\n message: string\r\n options?: ChatOption[]\r\n}\r\n\r\nexport interface ChatbotConfig {\r\n botName: string\r\n botAvatar?: string\r\n primaryColor?: string\r\n welcomeMessage: string\r\n nodes: ChatNode[]\r\n rootNodeId: string\r\n position?: 'bottom-right' | 'bottom-left'\r\n contactInfo?: string\r\n}\r\n\r\nexport interface ChatMessage {\r\n from: 'bot' | 'user'\r\n text: string\r\n options?: ChatOption[]\r\n optionsDisabled?: boolean\r\n}\r\n\r\nexport const CHATBOT_CONFIG = new InjectionToken<ChatbotConfig>('CHATBOT_CONFIG')\r\n","import { computed, Injectable, inject, signal } from '@angular/core';\r\nimport { CHATBOT_CONFIG, ChatMessage, ChatNode, ChatOption } from './chatbot.model';\r\n\r\n@Injectable()\r\n\r\nexport class ChatbotService {\r\n\r\n private config = inject(CHATBOT_CONFIG)\r\n\r\n messages = signal<ChatMessage[]>([])\r\n isTyping = signal(false)\r\n isOpen = signal(false)\r\n\r\n hasActiveConversation = computed(() => this.messages().length > 1)\r\n\r\n constructor() {\r\n this.init()\r\n }\r\n\r\n private getNode(id: string): ChatNode | null {\r\n return this.config.nodes.find(n => n.id === id)\r\n }\r\n\r\n private init(): void {\r\n const rootNode = this.getNode(this.config.rootNodeId)\r\n this.messages.set([{\r\n from: 'bot',\r\n text: this.config.welcomeMessage,\r\n options: rootNode?.options ?? [],\r\n optionsDisabled: false\r\n }])\r\n }\r\n\r\n open(): void {\r\n this.isOpen.set(true)\r\n }\r\n\r\n minimize(): void {\r\n this.isOpen.set(false)\r\n }\r\n\r\n close(): void {\r\n this.isOpen.set(false)\r\n this.init()\r\n }\r\n\r\n selectOption(option: ChatOption, messageIndex: number): void {\r\n this.messages.update(msgs =>\r\n msgs.map((m, i) => i === messageIndex ? { ...m, optionsDisabled: true } : m)\r\n )\r\n\r\n this.messages.update(msgs => [...msgs, { from: 'user', text: option.label }])\r\n\r\n this.isTyping.set(true)\r\n\r\n setTimeout(() => {\r\n this.isTyping.set(false)\r\n\r\n if (option.nextNodeId) {\r\n const nextNode = this.getNode(option.nextNodeId)\r\n if (nextNode) {\r\n this.messages.update(msgs => [...msgs, {\r\n from: 'bot',\r\n text: nextNode.message,\r\n options: nextNode.options ?? [],\r\n optionsDisabled: false\r\n }])\r\n }\r\n } else if (option.response) {\r\n this.messages.update(msgs => [\r\n ...msgs,\r\n { from: 'bot', text: option.response! },\r\n ...(this.config.contactInfo ? [{ from: 'bot' as const, text: this.config.contactInfo! }] : [])\r\n ])\r\n }\r\n }, 700)\r\n }\r\n\r\n restart(): void {\r\n this.init()\r\n }\r\n}\r\n","import { ChangeDetectionStrategy, Component, effect, ElementRef, inject, NgZone, signal, viewChild } from '@angular/core';\r\nimport { CHATBOT_CONFIG, ChatOption } from './chatbot.model';\r\nimport { ChatbotService } from './chatbot.service';\r\n\r\n@Component({\r\n selector: 'app-chatbot',\r\n templateUrl: './chatbot.component.html',\r\n styleUrl: './chatbot.component.scss',\r\n providers: [ChatbotService],\r\n changeDetection: ChangeDetectionStrategy.OnPush\r\n})\r\nexport class ChatbotComponent {\r\n\r\n protected service = inject(ChatbotService)\r\n protected config = inject(CHATBOT_CONFIG)\r\n private zone = inject(NgZone)\r\n\r\n private messagesEnd = viewChild<ElementRef>('messagesEnd')\r\n private wrapper = viewChild<ElementRef>('wrapper')\r\n\r\n position = signal<{ x: number; y: number } | null>(null)\r\n isDragging = signal<boolean>(false)\r\n openDir = signal<'above' | 'below'>('above')\r\n openHDir = signal<'left' | 'right'>('right')\r\n\r\n private dragOffset = { x: 0, y: 0 }\r\n private hasDragged = false\r\n\r\n constructor() {\r\n effect(() => {\r\n this.service.messages()\r\n this.service.isTyping()\r\n setTimeout(() => this.scrollToBottom(), 50)\r\n })\r\n }\r\n\r\n get primaryColor(): string { return this.config.primaryColor ?? '#c50048' }\r\n\r\n selectOption(option: ChatOption, index: number) { this.service.selectOption(option, index) }\r\n\r\n onFabClick() {\r\n if (!this.hasDragged) {\r\n this.calcOpenDirection()\r\n this.service.open()\r\n }\r\n this.hasDragged = false\r\n }\r\n\r\n private calcOpenDirection() {\r\n const el = this.wrapper()?.nativeElement as HTMLElement\r\n if (!el) return\r\n const rect = el.getBoundingClientRect()\r\n const WINDOW_H = 490\r\n const WINDOW_W = 320\r\n this.openDir.set(rect.top > WINDOW_H ? 'above' : 'below')\r\n this.openHDir.set(rect.left + WINDOW_W <= window.innerWidth ? 'right' : 'left')\r\n }\r\n\r\n startDrag(event: MouseEvent) {\r\n if ((event.target as HTMLElement).closest('.chatbot-header-actions')) return\r\n event.preventDefault()\r\n\r\n const el = this.wrapper()!.nativeElement as HTMLElement\r\n const rect = el.getBoundingClientRect()\r\n\r\n this.dragOffset = { x: event.clientX - rect.left, y: event.clientY - rect.top }\r\n this.hasDragged = false\r\n\r\n if (!this.position()) this.position.set({ x: rect.left, y: rect.top })\r\n\r\n this.isDragging.set(true)\r\n\r\n this.zone.runOutsideAngular(() => {\r\n document.addEventListener('mousemove', this.onDrag)\r\n document.addEventListener('mouseup', this.stopDrag)\r\n })\r\n }\r\n\r\n private onDrag = (event: MouseEvent) => {\r\n this.hasDragged = true\r\n const el = this.wrapper()!.nativeElement as HTMLElement\r\n const x = Math.max(0, Math.min(event.clientX - this.dragOffset.x, window.innerWidth - el.offsetWidth))\r\n const y = Math.max(0, Math.min(event.clientY - this.dragOffset.y, window.innerHeight - el.offsetHeight))\r\n this.zone.run(() => this.position.set({ x, y }))\r\n }\r\n\r\n private stopDrag = () => {\r\n this.zone.run(() => this.isDragging.set(false))\r\n document.removeEventListener('mousemove', this.onDrag)\r\n document.removeEventListener('mouseup', this.stopDrag)\r\n }\r\n\r\n private scrollToBottom() {\r\n this.messagesEnd()?.nativeElement.scrollIntoView({ behavior: 'smooth' })\r\n }\r\n}\r\n","<div #wrapper class=\"chatbot-wrapper\"\r\n [class.chatbot-left]=\"config.position === 'bottom-left'\"\r\n [class.chatbot-dragging]=\"isDragging()\"\r\n [style.--chatbot-primary]=\"primaryColor\"\r\n [style.left.px]=\"position()?.x\"\r\n [style.top.px]=\"position()?.y\"\r\n [style.right]=\"position() ? 'auto' : null\"\r\n [style.bottom]=\"position() ? 'auto' : null\">\r\n\r\n @if (!service.isOpen()) {\r\n <span class=\"chatbot-beta\">Beta</span>\r\n }\r\n <button class=\"chatbot-fab\"\r\n [class.chatbot-fab--hidden]=\"service.isOpen()\"\r\n (mousedown)=\"startDrag($event)\"\r\n (click)=\"onFabClick()\"\r\n title=\"Abrir asistente\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"26\" height=\"26\" fill=\"currentColor\" viewBox=\"0 0 24 24\">\r\n <path d=\"M12 2a2 2 0 0 1 2 2c0 .74-.4 1.39-1 1.73V7h1a7 7 0 0 1 7 7h1a1 1 0 0 1 1 1v3a1 1 0 0 1-1 1h-1v1a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-1H2a1 1 0 0 1-1-1v-3a1 1 0 0 1 1-1h1a7 7 0 0 1 7-7h1V5.73c-.6-.34-1-.99-1-1.73a2 2 0 0 1 2-2M7.5 13A2.5 2.5 0 0 0 5 15.5 2.5 2.5 0 0 0 7.5 18a2.5 2.5 0 0 0 2.5-2.5A2.5 2.5 0 0 0 7.5 13m9 0a2.5 2.5 0 0 0-2.5 2.5 2.5 2.5 0 0 0 2.5 2.5 2.5 2.5 0 0 0 2.5-2.5A2.5 2.5 0 0 0 16.5 13z\" />\r\n </svg>\r\n @if (service.hasActiveConversation()) {\r\n <span class=\"chatbot-badge\" title=\"Conversación en progreso\"></span>\r\n }\r\n </button>\r\n\r\n @if (service.isOpen()) {\r\n <div class=\"chatbot-window\"\r\n [class.open-above]=\"openDir() === 'above'\"\r\n [class.open-below]=\"openDir() === 'below'\"\r\n [class.open-right]=\"openHDir() === 'right'\"\r\n [class.open-left]=\"openHDir() === 'left'\">\r\n\r\n <div class=\"chatbot-header\" (mousedown)=\"startDrag($event)\">\r\n <div class=\"chatbot-header-info\">\r\n <span class=\"chatbot-avatar\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"22\" height=\"22\" fill=\"currentColor\" viewBox=\"0 0 24 24\">\r\n <path d=\"M12 2a2 2 0 0 1 2 2c0 .74-.4 1.39-1 1.73V7h1a7 7 0 0 1 7 7h1a1 1 0 0 1 1 1v3a1 1 0 0 1-1 1h-1v1a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-1H2a1 1 0 0 1-1-1v-3a1 1 0 0 1 1-1h1a7 7 0 0 1 7-7h1V5.73c-.6-.34-1-.99-1-1.73a2 2 0 0 1 2-2M7.5 13A2.5 2.5 0 0 0 5 15.5 2.5 2.5 0 0 0 7.5 18a2.5 2.5 0 0 0 2.5-2.5A2.5 2.5 0 0 0 7.5 13m9 0a2.5 2.5 0 0 0-2.5 2.5 2.5 2.5 0 0 0 2.5 2.5 2.5 2.5 0 0 0 2.5-2.5A2.5 2.5 0 0 0 16.5 13z\" />\r\n </svg>\r\n </span>\r\n <div>\r\n <div class=\"chatbot-name\">{{ config.botName || 'Asistente' }}</div>\r\n <div class=\"chatbot-status\">En línea</div>\r\n </div>\r\n </div>\r\n <div class=\"chatbot-header-actions\">\r\n <button class=\"chatbot-action-btn\" (click)=\"service.minimize()\" title=\"Minimizar\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" fill=\"currentColor\" viewBox=\"0 0 16 16\">\r\n <path d=\"M2 8a.5.5 0 0 1 .5-.5h11a.5.5 0 0 1 0 1h-11A.5.5 0 0 1 2 8z\" />\r\n </svg>\r\n </button>\r\n <button class=\"chatbot-action-btn\" (click)=\"service.close()\" title=\"Cerrar y reiniciar\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"13\" height=\"13\" fill=\"currentColor\" viewBox=\"0 0 16 16\">\r\n <path d=\"M2.146 2.854a.5.5 0 1 1 .708-.708L8 7.293l5.146-5.147a.5.5 0 0 1 .708.708L8.707 8l5.147 5.146a.5.5 0 0 1-.708.708L8 8.707l-5.146 5.147a.5.5 0 0 1-.708-.708L7.293 8z\" />\r\n </svg>\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <div class=\"chatbot-body\">\r\n @for (msg of service.messages(); track $index; let i = $index) {\r\n <div class=\"chat-row\" [class.chat-row-user]=\"msg.from === 'user'\">\r\n @if (msg.from === 'bot') {\r\n <span class=\"bot-icon\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" fill=\"currentColor\" viewBox=\"0 0 24 24\">\r\n <path d=\"M12 2a2 2 0 0 1 2 2c0 .74-.4 1.39-1 1.73V7h1a7 7 0 0 1 7 7h1a1 1 0 0 1 1 1v3a1 1 0 0 1-1 1h-1v1a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-1H2a1 1 0 0 1-1-1v-3a1 1 0 0 1 1-1h1a7 7 0 0 1 7-7h1V5.73c-.6-.34-1-.99-1-1.73a2 2 0 0 1 2-2M7.5 13A2.5 2.5 0 0 0 5 15.5 2.5 2.5 0 0 0 7.5 18a2.5 2.5 0 0 0 2.5-2.5A2.5 2.5 0 0 0 7.5 13m9 0a2.5 2.5 0 0 0-2.5 2.5 2.5 2.5 0 0 0 2.5 2.5 2.5 2.5 0 0 0 2.5-2.5A2.5 2.5 0 0 0 16.5 13z\" />\r\n </svg>\r\n </span>\r\n }\r\n <div class=\"chat-col\">\r\n <div class=\"message-bubble\" [class.bubble-bot]=\"msg.from === 'bot'\" [class.bubble-user]=\"msg.from === 'user'\">\r\n {{ msg.text }}\r\n </div>\r\n @if (msg.options && msg.options.length > 0) {\r\n <div class=\"options-container\">\r\n @for (opt of msg.options; track $index) {\r\n <button class=\"option-btn\" [disabled]=\"msg.optionsDisabled\" (click)=\"selectOption(opt, i)\">\r\n {{ opt.label }}\r\n </button>\r\n }\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n }\r\n\r\n @if (service.isTyping()) {\r\n <div class=\"chat-row\">\r\n <span class=\"bot-icon\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" fill=\"currentColor\" viewBox=\"0 0 24 24\">\r\n <path d=\"M12 2a2 2 0 0 1 2 2c0 .74-.4 1.39-1 1.73V7h1a7 7 0 0 1 7 7h1a1 1 0 0 1 1 1v3a1 1 0 0 1-1 1h-1v1a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-1H2a1 1 0 0 1-1-1v-3a1 1 0 0 1 1-1h1a7 7 0 0 1 7-7h1V5.73c-.6-.34-1-.99-1-1.73a2 2 0 0 1 2-2M7.5 13A2.5 2.5 0 0 0 5 15.5 2.5 2.5 0 0 0 7.5 18a2.5 2.5 0 0 0 2.5-2.5A2.5 2.5 0 0 0 7.5 13m9 0a2.5 2.5 0 0 0-2.5 2.5 2.5 2.5 0 0 0 2.5 2.5 2.5 2.5 0 0 0 2.5-2.5A2.5 2.5 0 0 0 16.5 13z\" />\r\n </svg>\r\n </span>\r\n <div class=\"message-bubble bubble-bot typing-bubble\">\r\n <span class=\"dot\"></span><span class=\"dot\"></span><span class=\"dot\"></span>\r\n </div>\r\n </div>\r\n }\r\n <div #messagesEnd></div>\r\n </div>\r\n\r\n <div class=\"chatbot-footer\">\r\n <button class=\"restart-btn\" (click)=\"service.restart()\">↺ Reiniciar conversación</button>\r\n </div>\r\n </div>\r\n }\r\n</div>\r\n","import { Location } from '@angular/common';\r\nimport { Component, inject } from '@angular/core';\r\nimport { RouterLink } from '@angular/router';\r\n\r\n@Component({\r\n selector: 'app-not-found',\r\n imports: [RouterLink],\r\n templateUrl: './not-found.component.html',\r\n styleUrl: './not-found.component.scss'\r\n})\r\nexport class NotFoundComponent {\r\n\r\n private location = inject(Location)\r\n\r\n onBack() {\r\n this.location.back();\r\n }\r\n}\r\n","<div class=\"nf-page d-flex align-items-center justify-content-center vh-100\">\r\n\r\n <!-- Blobs decorativos de fondo -->\r\n <div class=\"nf-blob nf-blob-1\"></div>\r\n <div class=\"nf-blob nf-blob-2\"></div>\r\n\r\n <div class=\"nf-card bg-white shadow-s text-center px-4 px-md-5 py-4 mx-3\">\r\n\r\n <!-- Ilustración: ventana con 404 y lupa buscando -->\r\n <svg class=\"nf-illustration\" viewBox=\"0 0 520 340\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" role=\"img\" aria-label=\"Página no encontrada\">\r\n <defs>\r\n <linearGradient id=\"nfGrad\" x1=\"0\" y1=\"0\" x2=\"1\" y2=\"1\">\r\n <stop offset=\"0%\" style=\"stop-color: var(--sidebar-accent)\" />\r\n <stop offset=\"100%\" style=\"stop-color: var(--sidebar-accent); stop-opacity: 0.55\" />\r\n </linearGradient>\r\n </defs>\r\n\r\n <!-- Órbita punteada de fondo -->\r\n <circle class=\"nf-orbit\" cx=\"260\" cy=\"170\" r=\"150\"\r\n stroke=\"var(--font-border-input)\" stroke-width=\"1.5\"\r\n stroke-dasharray=\"6 10\" opacity=\"0.7\" />\r\n\r\n <!-- Decoraciones flotantes -->\r\n <g class=\"nf-spark nf-spark-1\" stroke=\"var(--sidebar-accent)\" stroke-width=\"3\" stroke-linecap=\"round\">\r\n <path d=\"M92 78 v20 M82 88 h20\" />\r\n </g>\r\n <g class=\"nf-spark nf-spark-2\" stroke=\"var(--placeholder-color)\" stroke-width=\"3\" stroke-linecap=\"round\">\r\n <path d=\"M448 220 v16 M440 228 h16\" />\r\n </g>\r\n <circle class=\"nf-spark nf-spark-3\" cx=\"430\" cy=\"70\" r=\"6\" fill=\"var(--sidebar-accent)\" opacity=\"0.7\" />\r\n <circle class=\"nf-spark nf-spark-1\" cx=\"70\" cy=\"230\" r=\"5\" fill=\"var(--placeholder-color)\" opacity=\"0.7\" />\r\n <path class=\"nf-spark nf-spark-2\" d=\"M120 300 q8 -10 16 0 q8 10 16 0\"\r\n stroke=\"var(--font-border-input)\" stroke-width=\"3\" stroke-linecap=\"round\" fill=\"none\" />\r\n\r\n <!-- Ventana de navegador -->\r\n <g class=\"nf-window\">\r\n <rect x=\"120\" y=\"60\" width=\"280\" height=\"200\" rx=\"16\"\r\n fill=\"var(--background-input)\" stroke=\"var(--font-border-input)\" stroke-width=\"2\" />\r\n <!-- Barra superior -->\r\n <line x1=\"120\" y1=\"98\" x2=\"400\" y2=\"98\" stroke=\"var(--font-border-input)\" stroke-width=\"2\" />\r\n <circle cx=\"144\" cy=\"79\" r=\"5\" fill=\"var(--sidebar-accent)\" />\r\n <circle cx=\"162\" cy=\"79\" r=\"5\" fill=\"var(--placeholder-color)\" opacity=\"0.8\" />\r\n <circle cx=\"180\" cy=\"79\" r=\"5\" fill=\"var(--font-border-input)\" />\r\n <!-- Barra de dirección -->\r\n <rect x=\"200\" y=\"71\" width=\"184\" height=\"16\" rx=\"8\" fill=\"var(--font-border-input)\" opacity=\"0.5\" />\r\n\r\n <!-- 404 dentro de la ventana -->\r\n <text x=\"260\" y=\"188\" text-anchor=\"middle\" class=\"nf-404-text\" fill=\"url(#nfGrad)\">404</text>\r\n\r\n <!-- Líneas de contenido (skeleton) -->\r\n <rect x=\"180\" y=\"212\" width=\"160\" height=\"9\" rx=\"4.5\" fill=\"var(--font-border-input)\" opacity=\"0.7\" />\r\n <rect x=\"205\" y=\"230\" width=\"110\" height=\"9\" rx=\"4.5\" fill=\"var(--font-border-input)\" opacity=\"0.45\" />\r\n </g>\r\n\r\n <!-- Lupa buscando -->\r\n <g class=\"nf-lens\">\r\n <circle cx=\"352\" cy=\"238\" r=\"46\" fill=\"var(--background-card)\" fill-opacity=\"0.55\"\r\n stroke=\"url(#nfGrad)\" stroke-width=\"8\" />\r\n <line x1=\"386\" y1=\"272\" x2=\"424\" y2=\"310\" stroke=\"url(#nfGrad)\" stroke-width=\"14\" stroke-linecap=\"round\" />\r\n <!-- Signo de interrogación dentro de la lupa -->\r\n <path d=\"M340 224 q0 -14 13 -14 q13 0 13 12 q0 9 -10 13 q-3 1.5 -3 7\"\r\n stroke=\"var(--text-color)\" stroke-width=\"5\" stroke-linecap=\"round\" fill=\"none\" />\r\n <circle cx=\"353\" cy=\"256\" r=\"3.5\" fill=\"var(--text-color)\" />\r\n </g>\r\n </svg>\r\n\r\n <!-- Badge -->\r\n <span class=\"nf-badge fw-semibold\">ERROR 404</span>\r\n\r\n <h2 class=\"fw-semibold text-input mt-3\">Página no encontrada</h2>\r\n\r\n <p class=\"nf-desc fs-6 mt-2 mb-4 mx-auto\">\r\n Lo sentimos, la página que buscas no existe o fue movida.\r\n Verifica la dirección o regresa al inicio.\r\n </p>\r\n\r\n <!-- Acciones -->\r\n <div class=\"d-flex gap-3 justify-content-center flex-wrap\">\r\n <button type=\"button\" (click)=\"onBack()\" class=\"btn nf-btn-primary px-4 py-2 shadow\">\r\n <i class=\"fa-solid fa-arrow-left me-2\"></i>Volver\r\n </button>\r\n <a routerLink=\"/\" class=\"btn nf-btn-ghost text-dark px-4 py-2\">\r\n <i class=\"fa-solid fa-house me-2\"></i>Ir al inicio\r\n </a>\r\n </div>\r\n\r\n </div>\r\n</div>\r\n","import { NgClass, NgStyle } from '@angular/common';\r\nimport { Component, computed, input, output, signal } from '@angular/core';\r\nimport { DashboardItem, DonutSegmentItem } from '../../../models/general/dashboard.model';\r\n\r\n@Component({\r\n selector: 'app-dashboard-chart-donut',\r\n imports: [NgClass, NgStyle],\r\n template: `\r\n <div class=\"d-flex flex-column align-items-center py-1 px-2\">\r\n\r\n <!-- SVG ring -->\r\n <div style=\"position:relative; width:160px; height:160px; flex-shrink:0;\">\r\n <svg viewBox=\"0 0 200 200\" style=\"width:100%; height:100%;\">\r\n @for (seg of donutSegments(); track $index) {\r\n <circle cx=\"100\" cy=\"100\" r=\"70\" fill=\"none\"\r\n [attr.stroke]=\"seg.color\"\r\n stroke-width=\"42\"\r\n [attr.stroke-dasharray]=\"seg.strokeDasharray\"\r\n [attr.transform]=\"seg.transform\"\r\n style=\"cursor:pointer; transition:opacity .2s ease;\"\r\n [style.opacity]=\"hoveredIndex() === -1 || hoveredIndex() === $index ? '1' : '0.3'\"\r\n (mouseenter)=\"hoveredIndex.set($index)\"\r\n (mouseleave)=\"hoveredIndex.set(-1)\"\r\n (click)=\"clicked.emit(seg.item)\" />\r\n }\r\n </svg>\r\n\r\n <!-- Centro: cambia al hacer hover -->\r\n <div style=\"position:absolute; top:50%; left:50%; transform:translate(-50%,-50%);\r\n text-align:center; pointer-events:none; line-height:1.2; width:70px;\">\r\n <div style=\"font-size:1.4rem; font-weight:700; color:#fff; white-space:nowrap;\">\r\n {{ centerDisplay().value }}\r\n </div>\r\n <div style=\"font-size:.7rem; color:rgba(255,255,255,0.65); text-transform:uppercase; letter-spacing:.04em;\">\r\n {{ centerDisplay().sub }}\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Leyenda -->\r\n <ul class=\"list-unstyled m-0 w-100 mt-2\">\r\n @for (seg of donutSegments(); track $index) {\r\n <li class=\"d-flex align-items-start gap-2 mb-2\"\r\n style=\"cursor:pointer; transition:opacity .2s ease;\"\r\n [style.opacity]=\"hoveredIndex() === -1 || hoveredIndex() === $index ? '1' : '0.35'\"\r\n (mouseenter)=\"hoveredIndex.set($index)\"\r\n (mouseleave)=\"hoveredIndex.set(-1)\"\r\n (click)=\"clicked.emit(seg.item)\">\r\n <span class=\"rounded-circle flex-shrink-0 mt-1\"\r\n [ngStyle]=\"{ background: seg.color }\"\r\n style=\"width:9px; height:9px; display:inline-block;\">\r\n </span>\r\n <span [ngClass]=\"textClass()\" style=\"font-size:.75rem; line-height:1.3; flex:1;\">\r\n {{ seg.label }}\r\n </span>\r\n <span class=\"flex-shrink-0 px-1\"\r\n style=\"font-size:.75rem; font-weight:600; color:rgba(255,255,255,0.9); white-space:nowrap;\">\r\n {{ complemento() }}{{ seg.displayValue }}\r\n <span style=\"opacity:.7;\">({{ seg.percent }}%)</span>\r\n </span>\r\n </li>\r\n }\r\n </ul>\r\n\r\n </div>\r\n `\r\n})\r\nexport class DashboardChartDonutComponent {\r\n\r\n textClass = input<string>('text-white');\r\n complemento = input<string>('');\r\n\r\n data = input<any[]>([])\r\n keyValue = input<string>('value')\r\n keyDescri = input<string>('descri')\r\n palette = input<string[]>([])\r\n\r\n clicked = output<DashboardItem>();\r\n hoveredIndex = signal(-1);\r\n\r\n // ── Dona ──────────────────────────────────────────────────────────────────\r\n private readonly C = 2 * Math.PI * 70\r\n private readonly GAP = 2\r\n\r\n donutSegments = computed<DonutSegmentItem[]>(() => {\r\n const data = this.data()\r\n const palette = this.palette()\r\n const total = data.reduce((s, i) => s + (i[this.keyValue()] || 0), 0)\r\n if (total === 0) return []\r\n\r\n let cumPercent = 0\r\n return data.map((item, index) => {\r\n const val = item[this.keyValue()] || 0\r\n const percent = val / total\r\n const arcLength = Math.max(0, percent * this.C - this.GAP)\r\n const rotation = cumPercent * 360 - 90\r\n cumPercent += percent\r\n return {\r\n color: palette[index % palette.length],\r\n strokeDasharray: `${arcLength} ${this.C - arcLength}`,\r\n transform: `rotate(${rotation}, 100, 100)`,\r\n label: item[this.keyDescri()] ?? '',\r\n value: val,\r\n displayValue: String(val),\r\n percent: val > 0 ? (Math.round(percent * 100) < 1 ? '<1' : String(Math.round(percent * 100))) : '0',\r\n item,\r\n }\r\n })\r\n })\r\n\r\n centerDisplay = computed(() => {\r\n const idx = this.hoveredIndex();\r\n const segs = this.donutSegments();\r\n if (idx >= 0 && segs[idx]) {\r\n const s = segs[idx];\r\n return { value: s.displayValue, sub: s.percent + '%' };\r\n }\r\n const total = segs.reduce((acc, s) => acc + s.value, 0);\r\n return { value: String(total), sub: 'Total' };\r\n });\r\n}\r\n","import { NgClass, NgStyle } from '@angular/common';\r\nimport { Component, computed, input, output, signal } from '@angular/core';\r\nimport { DashboardItem } from '../../../models/general/dashboard.model';\r\n\r\ninterface HBarItem {\r\n x: number; y: number; w: number; barH: number; cy: number;\r\n tooltipX: number; tooltipY: number;\r\n value: number; displayValue: string; percent: string;\r\n label: string; color: string; item: any;\r\n}\r\n\r\ninterface HBarData {\r\n bars: HBarItem[];\r\n xTicks: { val: number; x: number }[];\r\n svgW: number;\r\n svgH: number;\r\n axisY: number;\r\n axisLft: number;\r\n svgRgt: number;\r\n svgTop: number;\r\n}\r\n\r\n@Component({\r\n selector: 'app-dashboard-chart-bars',\r\n imports: [NgClass, NgStyle],\r\n template: `\r\n <div class=\"d-flex flex-column align-items-center py-1 px-2\">\r\n\r\n <!-- SVG: barras horizontales + ejes -->\r\n <div style=\"width:100%;\">\r\n <svg [attr.viewBox]=\"'0 0 ' + chartData().svgW + ' ' + chartData().svgH\"\r\n style=\"width:100%; display:block; overflow:visible;\">\r\n\r\n <!-- Grid lines verticales + labels eje X -->\r\n @for (tick of chartData().xTicks; track tick.val) {\r\n <line [attr.x1]=\"tick.x\" [attr.y1]=\"chartData().svgTop\"\r\n [attr.x2]=\"tick.x\" [attr.y2]=\"chartData().axisY\"\r\n stroke=\"rgba(255,255,255,0.1)\" stroke-width=\"1\" />\r\n <text [attr.x]=\"tick.x\" [attr.y]=\"chartData().axisY + 10\"\r\n text-anchor=\"middle\" font-size=\"7\" fill=\"rgba(255,255,255,0.45)\"\r\n style=\"pointer-events:none;\">{{ tick.val }}</text>\r\n }\r\n\r\n <!-- Eje Y (izquierda) -->\r\n <line [attr.x1]=\"chartData().axisLft\" [attr.y1]=\"chartData().svgTop\"\r\n [attr.x2]=\"chartData().axisLft\" [attr.y2]=\"chartData().axisY\"\r\n stroke=\"rgba(255,255,255,0.35)\" stroke-width=\"1\" />\r\n\r\n <!-- Eje X (abajo) -->\r\n <line [attr.x1]=\"chartData().axisLft\" [attr.y1]=\"chartData().axisY\"\r\n [attr.x2]=\"chartData().svgRgt\" [attr.y2]=\"chartData().axisY\"\r\n stroke=\"rgba(255,255,255,0.35)\" stroke-width=\"1\" />\r\n\r\n <!-- Barras -->\r\n @for (bar of chartData().bars; track $index) {\r\n <rect [attr.x]=\"bar.x\" [attr.y]=\"bar.y\"\r\n [attr.width]=\"bar.w\" [attr.height]=\"bar.barH\"\r\n [attr.fill]=\"bar.color\" rx=\"3\"\r\n style=\"cursor:pointer; transition:opacity .2s ease;\"\r\n [style.opacity]=\"hoveredIndex() === -1 || hoveredIndex() === $index ? '1' : '0.25'\"\r\n (mouseenter)=\"hoveredIndex.set($index)\"\r\n (mouseleave)=\"hoveredIndex.set(-1)\"\r\n (click)=\"clicked.emit(bar.item)\" />\r\n }\r\n\r\n <!-- Tooltips (encima de todo) -->\r\n @for (bar of chartData().bars; track $index) {\r\n @if (hoveredIndex() === $index) {\r\n <g style=\"pointer-events:none;\">\r\n <rect [attr.x]=\"bar.tooltipX\" [attr.y]=\"bar.tooltipY\"\r\n width=\"46\" height=\"28\" rx=\"4\" fill=\"white\"\r\n style=\"filter:drop-shadow(0 2px 6px rgba(0,0,0,0.35));\" />\r\n <text [attr.x]=\"bar.tooltipX + 23\" [attr.y]=\"bar.tooltipY + 11\"\r\n text-anchor=\"middle\" font-size=\"9\" font-weight=\"700\" fill=\"#111\">\r\n {{ complemento() }}{{ bar.displayValue }}\r\n </text>\r\n <text [attr.x]=\"bar.tooltipX + 23\" [attr.y]=\"bar.tooltipY + 22\"\r\n text-anchor=\"middle\" font-size=\"8\" fill=\"#555\">\r\n {{ bar.percent }}%\r\n </text>\r\n </g>\r\n }\r\n }\r\n\r\n </svg>\r\n </div>\r\n\r\n <!-- Leyenda -->\r\n <ul class=\"list-unstyled m-0 w-100 mt-2\">\r\n @for (bar of chartData().bars; track $index) {\r\n <li class=\"d-flex align-items-start gap-2 mb-2\"\r\n style=\"cursor:pointer; transition:opacity .2s ease;\"\r\n [style.opacity]=\"hoveredIndex() === -1 || hoveredIndex() === $index ? '1' : '0.35'\"\r\n (mouseenter)=\"hoveredIndex.set($index)\"\r\n (mouseleave)=\"hoveredIndex.set(-1)\"\r\n (click)=\"clicked.emit(bar.item)\">\r\n <span class=\"flex-shrink-0 mt-1\"\r\n [ngStyle]=\"{ background: bar.color }\"\r\n style=\"width:9px; height:9px; display:inline-block; border-radius:2px;\">\r\n </span>\r\n <span [ngClass]=\"textClass()\" style=\"font-size:.75rem; line-height:1.3; flex:1;\">\r\n {{ bar.label }}\r\n </span>\r\n <span class=\"flex-shrink-0 px-1\"\r\n style=\"font-size:.75rem; font-weight:600; color:rgba(255,255,255,0.9); white-space:nowrap;\">\r\n {{ complemento() }}{{ bar.displayValue }}\r\n <span style=\"opacity:.7;\">({{ bar.percent }}%)</span>\r\n </span>\r\n </li>\r\n }\r\n </ul>\r\n\r\n </div>\r\n `\r\n})\r\nexport class DashboardChartBarsComponent {\r\n\r\n data = input.required<any[]>();\r\n maxValue = input<number>(null);\r\n keyValue = input<string>('value');\r\n keyDescri = input<string>('descri');\r\n palette = input<string[]>([]);\r\n textClass = input<string>('text-white');\r\n complemento = input<string>('');\r\n\r\n clicked = output<DashboardItem>();\r\n hoveredIndex = signal(-1);\r\n\r\n // ── Barras horizontales SVG ───────────────────────────────────────────────\r\n chartData = computed<HBarData>(() => {\r\n const data = this.data();\r\n const max = Number(this.maxValue());\r\n const palette = this.palette();\r\n const total = data.reduce((s, i) => s + (i[this.keyValue()] || 0), 0);\r\n\r\n const LFT = 6, RGT = 6, TOP = 4, BTM = 16, SLOT_H = 18, TICK_N = 4, SVG_W = 260;\r\n const BAR_H = Math.round(SLOT_H * 0.6);\r\n const chartW = SVG_W - LFT - RGT;\r\n const chartH = data.length * SLOT_H;\r\n const svgH = TOP + chartH + BTM;\r\n const axisY = TOP + chartH;\r\n\r\n const xTicks = Array.from({ length: TICK_N + 1 }, (_, i) => ({\r\n val: Math.round((i / TICK_N) * max),\r\n x: Math.round(LFT + (i / TICK_N) * chartW),\r\n }));\r\n\r\n const bars: HBarItem[] = data.map((item, i) => {\r\n const val = item[this.keyValue()] || 0;\r\n const w = max > 0 ? Math.max(2, Math.round((val / max) * chartW)) : 2;\r\n const y = TOP + i * SLOT_H + Math.round((SLOT_H - BAR_H) / 2);\r\n const cy = y + Math.round(BAR_H / 2);\r\n const tipX = Math.min(LFT + w + 4, SVG_W - 50);\r\n const tipY = Math.max(0, cy - 14);\r\n return {\r\n x: LFT, y, w, barH: BAR_H, cy,\r\n tooltipX: tipX, tooltipY: tipY,\r\n value: val, displayValue: String(val),\r\n percent: total > 0 ? (val > 0 ? (Math.round((val / total) * 100) < 1 ? '<1' : String(Math.round((val / total) * 100))) : '0') : '0',\r\n label: (item[this.keyDescri()] ?? '').toString(),\r\n color: palette[i % palette.length],\r\n item,\r\n };\r\n });\r\n\r\n return { bars, xTicks, svgW: SVG_W, svgH, axisY, axisLft: LFT, svgRgt: SVG_W - RGT, svgTop: TOP };\r\n });\r\n}\r\n","import { NgClass } from '@angular/common';\r\nimport { Component, computed, input, output, signal } from '@angular/core';\r\nimport { DashboardItem, ViewMode } from '../../../models/general/dashboard.model';\r\nimport { DashboardChartDonutComponent } from '../dashboard-chart-donut/dashboard-chart-donut.component';\r\nimport { DashboardChartBarsComponent } from '../dashboard-chart-bars/dashboard-chart-bars.component';\r\n\r\n@Component({\r\n selector: 'app-item-dashboard',\r\n imports: [NgClass, DashboardChartDonutComponent, DashboardChartBarsComponent],\r\n templateUrl: './item-dashboard.component.html',\r\n styleUrl: './item-dashboard.component.scss'\r\n})\r\nexport class ItemDashboardComponent {\r\n\r\n data = input<any[]>([])\r\n titulo = input<string>('')\r\n textClass = input<string>('text-white')\r\n colorClass = input<string>('')\r\n keyValue = input<string>('value')\r\n keyDescri = input<string>('descri')\r\n complemento = input<string>('')\r\n isDesplegable = input<boolean>(false)\r\n isLoading = input<boolean>(false)\r\n viewMode = input<ViewMode>('cards')\r\n\r\n showContent = signal<boolean>(false)\r\n\r\n emit = output<DashboardItem>()\r\n emitContent = output<string>()\r\n\r\n filteredData = computed(() =>\r\n this.data().filter(item => item[this.keyValue()] > 0)\r\n )\r\n\r\n totalItems = computed(() =>\r\n this.filteredData().reduce((sum, item) => sum + (item[this.keyValue()] || 0), 0)\r\n )\r\n\r\n maxValue = computed(() => {\r\n const vals = this.filteredData().map(item => item[this.keyValue()] || 0)\r\n return vals.length > 0 ? Math.max(...vals) : 1\r\n })\r\n\r\n // ── Paleta compartida entre dona y barras ──────────────────────────────────\r\n readonly palette = [\r\n '#ffffff', '#48dae4', '#06d6a0', '#ff9f1c',\r\n '#c77dff', '#fff06d', '#ef476f', '#b5e48c',\r\n ]\r\n\r\n getPercent(item: any): number {\r\n const max = this.maxValue()\r\n return max === 0 ? 0 : Math.round((item[this.keyValue()] / max) * 100)\r\n }\r\n\r\n toggleMostrar() {\r\n const before = this.showContent()\r\n this.showContent.update(v => !v)\r\n if (before) return\r\n this.emitContent.emit(this.titulo())\r\n }\r\n\r\n mover(item: DashboardItem) {\r\n this.emit.emit(item)\r\n }\r\n}\r\n","<div class=\"iv2-card mb-2\" [ngClass]=\"colorClass() ? colorClass() : 'bg-danger'\">\r\n\r\n <!-- ── HEADER ── -->\r\n <div class=\"iv2-header\">\r\n\r\n <div class=\"iv2-icon-dot\"></div>\r\n\r\n <div class=\"iv2-title-wrap\">\r\n <h5 class=\"iv2-title\" [ngClass]=\"textClass()\">{{ titulo() }}</h5>\r\n\r\n @if (!isLoading() && totalItems() > 0) {\r\n <span class=\"iv2-total-badge\">{{ totalItems() }}</span>\r\n }\r\n </div>\r\n\r\n @if (isDesplegable()) {\r\n <button class=\"iv2-toggle-btn\" [ngClass]=\"textClass()\" (click)=\"toggleMostrar()\"\r\n [attr.aria-expanded]=\"showContent()\">\r\n <svg class=\"iv2-chevron\" [class.iv2-chevron--open]=\"showContent()\"\r\n viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <polyline points=\"6 9 12 15 18 9\"></polyline>\r\n </svg>\r\n </button>\r\n }\r\n </div>\r\n\r\n <!-- ── CONTENIDO (expandible) ── -->\r\n <div class=\"iv2-content\" [class.iv2-content--expanded]=\"showContent() || !isDesplegable()\">\r\n <div class=\"iv2-inner\">\r\n\r\n <!-- SKELETON -->\r\n @if (isLoading()) {\r\n <div class=\"iv2-skeleton\">\r\n <div class=\"iv2-sk-row\">\r\n <div class=\"iv2-sk-line iv2-sk-line--long\" [ngClass]=\"colorClass() + '-line'\"></div>\r\n <div class=\"iv2-sk-line iv2-sk-line--short\" [ngClass]=\"colorClass() + '-line'\"></div>\r\n </div>\r\n <div class=\"iv2-sk-row mt-2\">\r\n <div class=\"iv2-sk-line iv2-sk-line--long\" [ngClass]=\"colorClass() + '-line'\"></div>\r\n <div class=\"iv2-sk-line iv2-sk-line--short\" [ngClass]=\"colorClass() + '-line'\"></div>\r\n </div>\r\n </div>\r\n\r\n } @else {\r\n\r\n <!-- ══ CARDS ══ -->\r\n @if (viewMode() === 'cards') {\r\n @if (filteredData().length > 0) {\r\n <ul class=\"iv2-list\">\r\n @for (item of filteredData(); track $index) {\r\n <li class=\"iv2-item\" [class.iv2-item--clickable]=\"item[keyValue()] > 0\"\r\n (click)=\"mover(item)\">\r\n <div class=\"iv2-item-info\">\r\n <span class=\"iv2-item-label\" [ngClass]=\"textClass()\">{{ item[keyDescri()] }}</span>\r\n <div class=\"iv2-bar-track\">\r\n <div class=\"iv2-bar-fill\" [style.width.%]=\"getPercent(item)\"></div>\r\n </div>\r\n </div>\r\n <div class=\"iv2-item-right\">\r\n <span class=\"iv2-value-badge\">{{ complemento() }}{{ item[keyValue()] }}</span>\r\n </div>\r\n </li>\r\n }\r\n </ul>\r\n } @else {\r\n <div class=\"iv2-empty\">\r\n <div class=\"iv2-empty-icon\"><svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg></div>\r\n <p class=\"iv2-empty-title\" [ngClass]=\"textClass()\">Todo al día</p>\r\n <p class=\"iv2-empty-sub\" [ngClass]=\"textClass()\">Sin pendientes por el momento</p>\r\n </div>\r\n }\r\n }\r\n\r\n <!-- ══ BARRAS ══ -->\r\n @if (viewMode() === 'bars') {\r\n @if (filteredData().length > 0) {\r\n <app-dashboard-chart-bars\r\n [data]=\"filteredData()\"\r\n [complemento]=\"complemento()\"\r\n [keyValue]=\"keyValue()\"\r\n [keyDescri]=\"keyDescri()\"\r\n [palette]=\"palette\"\r\n [maxValue]=\"maxValue()\"\r\n (clicked)=\"mover($event)\" />\r\n } @else {\r\n <div class=\"iv2-empty\">\r\n <div class=\"iv2-empty-icon\"><svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg></div>\r\n <p class=\"iv2-empty-title\" [ngClass]=\"textClass()\">Todo al día</p>\r\n <p class=\"iv2-empty-sub\" [ngClass]=\"textClass()\">Sin pendientes por el momento</p>\r\n </div>\r\n }\r\n }\r\n\r\n <!-- ══ DONA ══ -->\r\n @if (viewMode() === 'donut') {\r\n @if (filteredData().length > 0) {\r\n <app-dashboard-chart-donut\r\n [data]=\"filteredData()\"\r\n [textClass]=\"textClass()\"\r\n [complemento]=\"complemento()\"\r\n [keyValue]=\"keyValue()\"\r\n [keyDescri]=\"keyDescri()\"\r\n [palette]=\"palette\"\r\n (clicked)=\"mover($event)\" />\r\n } @else {\r\n <div class=\"iv2-empty\">\r\n <div class=\"iv2-empty-icon\"><svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg></div>\r\n <p class=\"iv2-empty-title\" [ngClass]=\"textClass()\">Todo al día</p>\r\n <p class=\"iv2-empty-sub\" [ngClass]=\"textClass()\">Sin pendientes por el momento</p>\r\n </div>\r\n }\r\n }\r\n\r\n }\r\n\r\n </div>\r\n </div>\r\n</div>\r\n","import { DecimalPipe, KeyValuePipe, NgClass } from '@angular/common';\r\nimport { Component, computed, input, output, signal } from '@angular/core';\r\nimport { DashboardItem, ViewMode } from '../../../models/general/dashboard.model';\r\n\r\n@Component({\r\n selector: 'app-item-dashboard-group',\r\n imports: [NgClass, KeyValuePipe, DecimalPipe],\r\n templateUrl: './item-dashboard-group.component.html',\r\n styleUrl: './item-dashboard-group.component.scss'\r\n})\r\nexport class ItemDashboardGroupComponent {\r\n\r\n data = input<DashboardItem[]>([])\r\n titulo = input<string>('')\r\n textClass = input<string>('text-white')\r\n colorClass = input<string>('')\r\n keyValue = input<string>('value')\r\n keyDescri = input<string>('descri')\r\n complemento = input<string>('')\r\n isDesplegable = input<boolean>(false)\r\n isLoading = input<boolean>(false)\r\n viewMode = input<ViewMode>('cards')\r\n\r\n showContent = signal<boolean>(false)\r\n\r\n emit = output<DashboardItem>()\r\n emitContent = output<string>()\r\n\r\n dataGroup = computed(() => this.groupBy<any>(this.data(), 'GROUP'))\r\n\r\n filteredDataGroup = computed(() => {\r\n const grouped = this.dataGroup()\r\n const result: Record<string, any[]> = {}\r\n for (const key of Object.keys(grouped)) {\r\n const items = grouped[key].filter((item: any) => item[this.keyValue()] > 0)\r\n if (items.length > 0) result[key] = items\r\n }\r\n return result\r\n })\r\n\r\n totalItems = computed(() =>\r\n this.data().reduce((sum, item: any) => sum + (item[this.keyValue()] || 0), 0)\r\n )\r\n\r\n maxValue = computed(() => {\r\n const vals = this.data()\r\n .filter((item: any) => item[this.keyValue()] > 0)\r\n .map((item: any) => item[this.keyValue()] || 0)\r\n return vals.length > 0 ? Math.max(...vals) : 1\r\n })\r\n\r\n hasData = computed(() => Object.keys(this.filteredDataGroup()).length > 0)\r\n\r\n getPercent(item: any): number {\r\n const max = this.maxValue()\r\n return max === 0 ? 0 : Math.round((item[this.keyValue()] / max) * 100)\r\n }\r\n\r\n toggleMostrar() {\r\n const before = this.showContent()\r\n this.showContent.update(v => !v)\r\n if (before) return\r\n this.emitContent.emit(this.titulo())\r\n }\r\n\r\n mover(item: DashboardItem) {\r\n this.emit.emit(item)\r\n }\r\n\r\n private groupBy<T>(array: T[], key: keyof T): Record<string, T[]> {\r\n return array.reduce((acc, item) => {\r\n const groupKey = String(item[key])\r\n if (!acc[groupKey]) acc[groupKey] = []\r\n acc[groupKey].push(item)\r\n return acc\r\n }, {} as Record<string, T[]>)\r\n }\r\n}\r\n","<div class=\"iv2-card mb-2\" [ngClass]=\"colorClass() ? colorClass() : 'bg-danger'\">\r\n\r\n <!-- ── HEADER ── -->\r\n <div class=\"iv2-header\">\r\n\r\n <div class=\"iv2-icon-dot\"></div>\r\n\r\n <div class=\"iv2-title-wrap\">\r\n <h5 class=\"iv2-title\" [ngClass]=\"textClass()\">{{ titulo() }}</h5>\r\n </div>\r\n\r\n @if (isDesplegable()) {\r\n <button class=\"iv2-toggle-btn\" [ngClass]=\"textClass()\" (click)=\"toggleMostrar()\"\r\n [attr.aria-expanded]=\"showContent()\">\r\n <svg class=\"iv2-chevron\" [class.iv2-chevron--open]=\"showContent()\" viewBox=\"0 0 24 24\" fill=\"none\"\r\n stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <polyline points=\"6 9 12 15 18 9\"></polyline>\r\n </svg>\r\n </button>\r\n }\r\n </div>\r\n\r\n <!-- ── CONTENIDO (expandible) ── -->\r\n <div class=\"iv2-content\" [class.iv2-content--expanded]=\"showContent() || !isDesplegable()\">\r\n <div class=\"iv2-inner\">\r\n\r\n <!-- SKELETON -->\r\n @if (isLoading()) {\r\n <div class=\"iv2-skeleton\">\r\n <div class=\"iv2-sk-row\">\r\n <div class=\"iv2-sk-line iv2-sk-line--long\" [ngClass]=\"colorClass() + '-line'\"></div>\r\n <div class=\"iv2-sk-line iv2-sk-line--short\" [ngClass]=\"colorClass() + '-line'\"></div>\r\n </div>\r\n <div class=\"iv2-sk-row mt-2\">\r\n <div class=\"iv2-sk-line iv2-sk-line--long\" [ngClass]=\"colorClass() + '-line'\"></div>\r\n <div class=\"iv2-sk-line iv2-sk-line--short\" [ngClass]=\"colorClass() + '-line'\"></div>\r\n </div>\r\n <div class=\"iv2-sk-row mt-2\">\r\n <div class=\"iv2-sk-line iv2-sk-line--long\" [ngClass]=\"colorClass() + '-line'\"></div>\r\n <div class=\"iv2-sk-line iv2-sk-line--short\" [ngClass]=\"colorClass() + '-line'\"></div>\r\n </div>\r\n </div>\r\n\r\n } @else {\r\n\r\n <!-- ══ CARDS ══ -->\r\n @if (viewMode() === 'cards') {\r\n @if (hasData()) {\r\n <ul class=\"iv2-list\">\r\n @for (group of filteredDataGroup() | keyvalue; track group.key) {\r\n\r\n <li class=\"iv2-group-header\">\r\n <span class=\"iv2-group-label\" [ngClass]=\"textClass()\">{{ group.key }}</span>\r\n <div class=\"iv2-group-divider\"></div>\r\n </li>\r\n\r\n @for (item of group.value; track $index) {\r\n <li class=\"iv2-item\" [class.iv2-item--clickable]=\"item[keyValue()] > 0\"\r\n (click)=\"item[keyValue()] > 0 && mover(item)\">\r\n <div class=\"iv2-item-info\">\r\n <span class=\"iv2-item-label\" [ngClass]=\"textClass()\">{{ item[keyDescri()] }}</span>\r\n <div class=\"iv2-bar-track\">\r\n <div class=\"iv2-bar-fill\" [style.width.%]=\"getPercent(item)\"></div>\r\n </div>\r\n </div>\r\n <div class=\"iv2-item-right\">\r\n <span class=\"iv2-value-badge\">{{ complemento() }}{{ item[keyValue()] | number: '1.2-2' }}</span>\r\n </div>\r\n </li>\r\n }\r\n\r\n }\r\n </ul>\r\n } @else {\r\n <div class=\"iv2-empty\">\r\n <div class=\"iv2-empty-icon\"><svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <polyline points=\"20 6 9 17 4 12\"></polyline>\r\n </svg></div>\r\n <p class=\"iv2-empty-title\" [ngClass]=\"textClass()\">Todo al día</p>\r\n <p class=\"iv2-empty-sub\" [ngClass]=\"textClass()\">Sin pendientes por el momento</p>\r\n </div>\r\n }\r\n }\r\n\r\n <!-- ══ BARRAS ══ -->\r\n @if (viewMode() === 'bars') {\r\n <div class=\"iv2-empty\">\r\n <div class=\"iv2-empty-icon\"><svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <polyline points=\"20 6 9 17 4 12\"></polyline>\r\n </svg></div>\r\n <p class=\"iv2-empty-title\" [ngClass]=\"textClass()\">En implementación</p>\r\n <p class=\"iv2-empty-sub\" [ngClass]=\"textClass()\">Muy pronto</p>\r\n </div>\r\n }\r\n\r\n <!-- ══ DONA ══ -->\r\n @if (viewMode() === 'donut') {\r\n <div class=\"iv2-empty\">\r\n <div class=\"iv2-empty-icon\"><svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <polyline points=\"20 6 9 17 4 12\"></polyline>\r\n </svg></div>\r\n <p class=\"iv2-empty-title\" [ngClass]=\"textClass()\">En implementación</p>\r\n <p class=\"iv2-empty-sub\" [ngClass]=\"textClass()\">Muy pronto</p>\r\n </div>\r\n }\r\n\r\n }\r\n\r\n </div>\r\n </div>\r\n</div>\r\n","import { Component, effect, input, output, signal } from '@angular/core';\r\nimport { ViewMode } from '../../../models/general/dashboard.model';\r\n\r\n// Duración de la animación de salida (@keyframes fabMiniOut en el scss): se\r\n// mantiene montado este tiempo antes de desmontarlo de verdad.\r\nconst LEAVE_DURATION_MS = 150\r\n\r\n@Component({\r\n selector: 'app-dashboard-view-switcher',\r\n imports: [],\r\n templateUrl: './dashboard-view-switcher.component.html',\r\n styleUrl: './dashboard-view-switcher.component.scss',\r\n})\r\nexport class DashboardViewSwitcherComponent {\r\n\r\n viewMode = input<ViewMode>('cards')\r\n accentColor = input<string>('#398bf7')\r\n\r\n viewModeChange = output<ViewMode>()\r\n\r\n fabOpen = signal(false)\r\n\r\n // Reemplaza a @fabMenu (query + stagger, sin @angular/animations): el\r\n // stagger se logra con animation-delay por :nth-child en el scss, y la\r\n // salida se maneja igual que en tab-bar (mantener montado + clase \"--closing\").\r\n fabRendered = signal(false)\r\n private closeTimer: ReturnType<typeof setTimeout> | null = null\r\n\r\n constructor() {\r\n effect(() => {\r\n if (this.fabOpen()) {\r\n if (this.closeTimer) {\r\n clearTimeout(this.closeTimer)\r\n this.closeTimer = null\r\n }\r\n this.fabRendered.set(true)\r\n } else if (this.fabRendered()) {\r\n this.closeTimer = setTimeout(() => this.fabRendered.set(false), LEAVE_DURATION_MS)\r\n }\r\n })\r\n }\r\n\r\n setView(mode: ViewMode) {\r\n this.viewModeChange.emit(mode)\r\n this.fabOpen.set(false)\r\n }\r\n}\r\n","<div class=\"view-fab\" [style.--fab-main-from]=\"accentColor()\" [style.--fab-main-to]=\"accentColor()\"\r\n [style.--fab-active-bg]=\"accentColor()\" [style.--fab-mini-hover-border]=\"accentColor()\"\r\n [style.--fab-mini-hover-color]=\"accentColor()\" (mouseenter)=\"fabOpen.set(true)\" (mouseleave)=\"fabOpen.set(false)\">\r\n @if (fabRendered()) {\r\n <div class=\"fab-menu\" [class.fab-menu--closing]=\"!fabOpen()\">\r\n\r\n <div class=\"fab-mini-wrap\">\r\n <span class=\"fab-tooltip\">Dona</span>\r\n <button class=\"fab-mini\" [class.active]=\"viewMode() === 'donut'\" (click)=\"setView('donut')\"\r\n title=\"Vista de dona\">\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <circle cx=\"12\" cy=\"12\" r=\"10\"></circle>\r\n <circle cx=\"12\" cy=\"12\" r=\"4\"></circle>\r\n </svg>\r\n </button>\r\n </div>\r\n\r\n <div class=\"fab-mini-wrap\">\r\n <span class=\"fab-tooltip\">Barras</span>\r\n <button class=\"fab-mini\" [class.active]=\"viewMode() === 'bars'\" (click)=\"setView('bars')\"\r\n title=\"Vista de barras\">\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\r\n <rect x=\"2\" y=\"13\" width=\"5\" height=\"9\" rx=\"1\"></rect>\r\n <rect x=\"9\" y=\"7\" width=\"5\" height=\"15\" rx=\"1\"></rect>\r\n <rect x=\"16\" y=\"3\" width=\"5\" height=\"19\" rx=\"1\"></rect>\r\n </svg>\r\n </button>\r\n </div>\r\n\r\n <div class=\"fab-mini-wrap\">\r\n <span class=\"fab-tooltip\">Tarjetas</span>\r\n <button class=\"fab-mini\" [class.active]=\"viewMode() === 'cards'\" (click)=\"setView('cards')\"\r\n title=\"Vista de tarjetas\">\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <rect x=\"3\" y=\"3\" width=\"7\" height=\"7\"></rect>\r\n <rect x=\"14\" y=\"3\" width=\"7\" height=\"7\"></rect>\r\n <rect x=\"3\" y=\"14\" width=\"7\" height=\"7\"></rect>\r\n <rect x=\"14\" y=\"14\" width=\"7\" height=\"7\"></rect>\r\n </svg>\r\n </button>\r\n </div>\r\n\r\n </div>\r\n }\r\n\r\n <button class=\"fab-main\" [class.is-open]=\"fabOpen()\" (click)=\"fabOpen.set(!fabOpen())\" title=\"Cambiar vista\">\r\n @switch (viewMode()) {\r\n @case ('cards') {\r\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <rect x=\"3\" y=\"3\" width=\"7\" height=\"7\"></rect>\r\n <rect x=\"14\" y=\"3\" width=\"7\" height=\"7\"></rect>\r\n <rect x=\"3\" y=\"14\" width=\"7\" height=\"7\"></rect>\r\n <rect x=\"14\" y=\"14\" width=\"7\" height=\"7\"></rect>\r\n </svg>\r\n }\r\n @case ('bars') {\r\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\r\n <rect x=\"2\" y=\"13\" width=\"5\" height=\"9\" rx=\"1\"></rect>\r\n <rect x=\"9\" y=\"7\" width=\"5\" height=\"15\" rx=\"1\"></rect>\r\n <rect x=\"16\" y=\"3\" width=\"5\" height=\"19\" rx=\"1\"></rect>\r\n </svg>\r\n }\r\n @case ('donut') {\r\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <circle cx=\"12\" cy=\"12\" r=\"10\"></circle>\r\n <circle cx=\"12\" cy=\"12\" r=\"4\"></circle>\r\n </svg>\r\n }\r\n }\r\n </button>\r\n</div>\r\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"layout-tsi.mjs","sources":["../../../projects/layout-tsi/src/lib/service/menu.service.ts","../../../projects/layout-tsi/src/lib/service/header-ui.service.ts","../../../projects/layout-tsi/src/lib/utils/validaciones.ts","../../../projects/layout-tsi/src/lib/service/tabs.service.ts","../../../projects/layout-tsi/src/lib/ui/menu-item/menu-item.component.ts","../../../projects/layout-tsi/src/lib/ui/menu-item/menu-item.component.html","../../../projects/layout-tsi/src/lib/ui/bottom-navigation/bottom-navigation.component.ts","../../../projects/layout-tsi/src/lib/ui/bottom-navigation/bottom-navigation.component.html","../../../projects/layout-tsi/src/lib/ui/vertical-header/vertical-header.component.ts","../../../projects/layout-tsi/src/lib/ui/vertical-header/vertical-header.component.html","../../../projects/layout-tsi/src/lib/ui/tab-bar/tab-bar.component.ts","../../../projects/layout-tsi/src/lib/ui/tab-bar/tab-bar.component.html","../../../projects/layout-tsi/src/lib/service/detector.service.ts","../../../projects/layout-tsi/src/lib/ui/full/full.component.ts","../../../projects/layout-tsi/src/lib/ui/full/full.component.html","../../../projects/layout-tsi/src/lib/ui/chatbot/chatbot.model.ts","../../../projects/layout-tsi/src/lib/ui/chatbot/chatbot.service.ts","../../../projects/layout-tsi/src/lib/ui/chatbot/chatbot.component.ts","../../../projects/layout-tsi/src/lib/ui/chatbot/chatbot.component.html","../../../projects/layout-tsi/src/lib/ui/not-found/not-found.component.ts","../../../projects/layout-tsi/src/lib/ui/not-found/not-found.component.html","../../../projects/layout-tsi/src/lib/ui/dashboard/dashboard-chart-donut/dashboard-chart-donut.component.ts","../../../projects/layout-tsi/src/lib/ui/dashboard/dashboard-chart-bars/dashboard-chart-bars.component.ts","../../../projects/layout-tsi/src/lib/ui/dashboard/item-dashboard/item-dashboard.component.ts","../../../projects/layout-tsi/src/lib/ui/dashboard/item-dashboard/item-dashboard.component.html","../../../projects/layout-tsi/src/lib/ui/dashboard/item-dashboard-group/item-dashboard-group.component.ts","../../../projects/layout-tsi/src/lib/ui/dashboard/item-dashboard-group/item-dashboard-group.component.html","../../../projects/layout-tsi/src/lib/ui/dashboard/dashboard-view-switcher/dashboard-view-switcher.component.ts","../../../projects/layout-tsi/src/lib/ui/dashboard/dashboard-view-switcher/dashboard-view-switcher.component.html","../../../projects/layout-tsi/src/public-api.ts","../../../projects/layout-tsi/src/layout-tsi.ts"],"sourcesContent":["import { computed, inject, Injectable, signal } from '@angular/core';\nimport { NavigationEnd, Router } from '@angular/router';\nimport { toSignal } from '@angular/core/rxjs-interop';\nimport { filter, map } from 'rxjs';\nimport { RouteInfo } from '../models/general/route-info.model';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class MenuService {\n\n private readonly router = inject(Router)\n\n private _openMenus = signal<Map<number, string>>(new Map())\n private _rutas = signal<string[]>([])\n private _seleccion = signal(0)\n\n openMenus = this._openMenus.asReadonly()\n seleccion = this._seleccion.asReadonly()\n\n currentUrl = toSignal(\n this.router.events.pipe(\n filter((e): e is NavigationEnd => e instanceof NavigationEnd),\n map(() => this.router.url)\n ),\n { initialValue: this.router.url }\n )\n\n rutaActiva = computed(() => {\n const rutaActual = this.currentUrl().split('?')[0]\n let mejor: string | null = null\n for (const ruta of this._rutas()) {\n const coincide = rutaActual === ruta || rutaActual.startsWith(`${ruta}/`)\n if (coincide && (mejor == null || ruta.length > mejor.length)) mejor = ruta\n }\n return mejor\n })\n\n setOpenMenu(level: number, id: string | null) {\n const currentMap = new Map(this._openMenus())\n if (id == null) {\n currentMap.delete(level)\n } else {\n currentMap.set(level, id)\n }\n this._openMenus.set(currentMap)\n }\n\n setRutas(items: RouteInfo[]) {\n const rutas: string[] = []\n const recorrer = (lista: RouteInfo[]) => {\n for (const item of lista ?? []) {\n if (item.submenu?.length) recorrer(item.submenu)\n else if (item.path && !item.extralink) rutas.push(item.path)\n }\n }\n recorrer(items)\n this._rutas.set(rutas)\n }\n\n notificarSeleccion() {\n this._seleccion.update(n => n + 1)\n }\n}\n","import { Injectable, signal } from '@angular/core';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class HeaderUiService {\r\n\r\n typeDocumento = signal<number>(null)\r\n numintDocumento = signal<number>(null)\r\n\r\n setTypeDocumento(value: number) {\r\n this.typeDocumento.set(value)\r\n }\r\n\r\n setNumintDocumento(value: number) {\r\n this.numintDocumento.set(value)\r\n }\r\n}\r\n","export function validaArray(data: any): boolean {\r\n return Array.isArray(data) && data.length > 0\r\n}\r\n","import { computed, DestroyRef, effect, inject, Injectable, InjectionToken, Injector, signal } from '@angular/core';\r\nimport { NavigationEnd, Router } from '@angular/router';\r\nimport { EMPTY, Observable, Subject, combineLatest } from 'rxjs';\r\nimport { catchError, debounceTime, distinctUntilChanged, filter, map, skip, switchMap, takeUntil } from 'rxjs/operators';\r\nimport { takeUntilDestroyed, toObservable } from '@angular/core/rxjs-interop';\r\nimport { validaArray } from '../utils/validaciones';\r\nimport { AppTab } from '../models/general/app-tab.model';\r\n\r\nexport interface TabsSyncProvider {\r\n getAccess(): Observable<{ message: string }>\r\n saveAccess(payload: string): Observable<any>\r\n}\r\n\r\n// Provider opcional: sin él, TabsService funciona solo con localStorage (sin sincronizar con backend).\r\nexport const TABS_SYNC_PROVIDER = new InjectionToken<TabsSyncProvider>('TABS_SYNC_PROVIDER')\r\n\r\nconst STORAGE_KEY = 'tsi_quick_tabs'\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class TabsService {\r\n\r\n private readonly router = inject(Router)\r\n private readonly syncProvider = inject(TABS_SYNC_PROVIDER, { optional: true })\r\n private readonly destroyRef = inject(DestroyRef)\r\n private readonly injector = inject(Injector)\r\n\r\n tabs = signal<AppTab[]>([])\r\n activeId = signal<string | null>(null)\r\n visible = signal<boolean>(true)\r\n\r\n // Corta la carga/sincronización en curso cuando clear() destruye la sesión (logout).\r\n private readonly destroy$ = new Subject<void>()\r\n\r\n sortedTabs = computed(() => {\r\n const ts = this.tabs()\r\n return [...ts.filter(t => t.pinned), ...ts.filter(t => !t.pinned)]\r\n })\r\n\r\n toggleVisible() { this.visible.update(v => !v) }\r\n\r\n constructor() {\r\n this.loadFromStorage()\r\n\r\n // Guardado inmediato en localStorage en cada cambio\r\n effect(() => {\r\n localStorage.setItem(STORAGE_KEY, JSON.stringify({\r\n tabs: this.tabs(),\r\n visible: this.visible()\r\n }))\r\n })\r\n\r\n this.router.events.pipe(\r\n filter((e): e is NavigationEnd => e instanceof NavigationEnd),\r\n takeUntilDestroyed()\r\n ).subscribe(e => {\r\n const path = e.urlAfterRedirects.split('?')[0]\r\n const tab = this.tabs().find(t => t.path === path)\r\n if (tab) this.activeId.set(tab.id)\r\n })\r\n }\r\n\r\n // Al ser un servicio singleton (providedIn: 'root'), el constructor sólo se ejecuta\r\n // una vez por carga de la app. Por eso la carga inicial se expone como init(): debe\r\n // invocarse en cada inicio de sesión (ver FullComponent) para que, tras un clear()\r\n // por logout, el siguiente login vuelva a consultar la API y arme sus accesos.\r\n init() {\r\n if (!this.syncProvider) return\r\n this.syncProvider.getAccess().pipe(\r\n takeUntil(this.destroy$),\r\n takeUntilDestroyed(this.destroyRef)\r\n ).subscribe({\r\n next: res => {\r\n this.parseData(res.message)\r\n this.startApiSync()\r\n },\r\n error: () => this.startApiSync()\r\n })\r\n }\r\n\r\n // Arranca DESPUÉS de la carga inicial: skip(1) omite el valor actual\r\n // (recién cargado desde API) y sólo reacciona a cambios del usuario.\r\n private startApiSync() {\r\n if (!this.syncProvider) return\r\n combineLatest([\r\n toObservable(this.tabs, { injector: this.injector }),\r\n toObservable(this.visible, { injector: this.injector })\r\n ]).pipe(\r\n skip(1),\r\n debounceTime(1500),\r\n map(([tabs, visible]) => JSON.stringify({ tabs, visible })),\r\n distinctUntilChanged(),\r\n switchMap(payload =>\r\n this.syncProvider!.saveAccess(payload).pipe(catchError(() => EMPTY))\r\n ),\r\n takeUntil(this.destroy$),\r\n takeUntilDestroyed(this.destroyRef)\r\n ).subscribe()\r\n }\r\n\r\n private parseData(raw: string) {\r\n const data = JSON.parse(raw)\r\n if (validaArray(data.tabs)) this.tabs.set(data.tabs)\r\n if (typeof data.visible === 'boolean') this.visible.set(data.visible)\r\n }\r\n\r\n private loadFromStorage() {\r\n try {\r\n const raw = localStorage.getItem(STORAGE_KEY)\r\n if (!raw) return\r\n this.parseData(raw)\r\n } catch { }\r\n }\r\n\r\n clear() {\r\n this.destroy$.next()\r\n this.tabs.set([])\r\n this.activeId.set(null)\r\n this.visible.set(true)\r\n localStorage.removeItem(STORAGE_KEY)\r\n }\r\n\r\n addBackground(path: string, title: string, icon: string, module?: string, moduleKey?: string) {\r\n if (this.tabs().some(t => t.path === path)) return\r\n this.tabs.update(ts => [...ts, { id: path, path, title, icon, pinned: false, module, moduleKey }])\r\n if (!this.visible()) this.visible.set(true)\r\n }\r\n\r\n activate(id: string) {\r\n this.activeId.set(id)\r\n const tab = this.tabs().find(t => t.id === id)\r\n if (tab) this.router.navigate([tab.path])\r\n }\r\n\r\n close(id: string, event: Event) {\r\n event.stopPropagation()\r\n const tabs = this.tabs()\r\n const tab = tabs.find(t => t.id === id)\r\n if (!tab || tab.pinned) return\r\n\r\n const idx = tabs.findIndex(t => t.id === id)\r\n const newTabs = tabs.filter(t => t.id !== id)\r\n this.tabs.set(newTabs)\r\n\r\n if (this.activeId() === id) {\r\n const next = newTabs[idx] ?? newTabs[idx - 1] ?? null\r\n if (next) this.activate(next.id)\r\n else this.activeId.set(null)\r\n }\r\n }\r\n\r\n closeAll() {\r\n const pinned = this.tabs().filter(t => t.pinned)\r\n this.tabs.set(pinned)\r\n const active = pinned.find(t => t.id === this.activeId())\r\n if (!active) {\r\n const last = pinned[pinned.length - 1] ?? null\r\n if (last) this.activate(last.id)\r\n else this.activeId.set(null)\r\n }\r\n }\r\n\r\n togglePin(id: string, event: Event) {\r\n event.stopPropagation()\r\n this.tabs.update(ts =>\r\n ts.map(t => t.id === id ? { ...t, pinned: !t.pinned } : t)\r\n )\r\n }\r\n}\r\n","import { NgClass } from '@angular/common';\r\nimport { ChangeDetectionStrategy, Component, computed, effect, inject, InjectionToken, input, OnDestroy, signal } from '@angular/core';\r\nimport { RouterLink } from '@angular/router';\r\nimport { MenuService } from '../../service/menu.service';\r\nimport { HeaderUiService } from '../../service/header-ui.service';\r\nimport { RouteInfo } from '../../models/general/route-info.model';\r\nimport { validaArray } from '../../utils/validaciones';\r\nimport { TabsService } from '../../service/tabs.service';\r\n\r\nconst activeFlyoutKey = signal<string | null>(null)\r\n\r\ninterface TooltipState { text: string; x: number; y: number }\r\nconst activeTooltip = signal<TooltipState | null>(null)\r\n\r\n// Provider opcional: abre otras apps del ecosistema (items con extralink=true). Sin él, el click no hace nada.\r\n// routeName se pasa aparte porque moduloID no siempre es único (dos módulos distintos\r\n// pueden compartir el mismo id) — el consumidor lo usa para desambiguar si lo necesita.\r\nexport interface ExtralinkOpener {\r\n open(moduloID: number, routeName?: string): void\r\n}\r\n\r\nexport const EXTRALINK_OPENER = new InjectionToken<ExtralinkOpener>('EXTRALINK_OPENER')\r\n\r\n@Component({\r\n selector: 'app-menu-item',\r\n imports: [NgClass, RouterLink],\r\n templateUrl: './menu-item.component.html',\r\n styleUrl: './menu-item.component.scss',\r\n changeDetection:ChangeDetectionStrategy.OnPush\r\n})\r\n\r\nexport class MenuItemComponent implements OnDestroy {\r\n\r\n private menuService = inject(MenuService)\r\n private headerUiService = inject(HeaderUiService)\r\n private readonly tabsService = inject(TabsService)\r\n private readonly extralinkOpener = inject(EXTRALINK_OPENER, { optional: true })\r\n\r\n item = input.required<RouteInfo>()\r\n isSidebarOpen = input<boolean>(true)\r\n isSidebarHovering = input<boolean>(false)\r\n level = input<number>(0)\r\n parentModuleName = input<string | null>(null)\r\n accentColor = input<string>('#398bf7')\r\n // Accesos/rol de la sesión: se reciben del consumidor (en vez de inyectar\r\n // SesionService acá) para que layout-tsi no dependa de core-tsi.\r\n accesos = input<any[]>([])\r\n rolId = input<number | null>(null)\r\n open = signal<boolean>(false)\r\n\r\n flyoutY = signal(0)\r\n expandedFlyoutChild = signal<string | null>(null)\r\n flyoutTimer: ReturnType<typeof setTimeout> | null = null\r\n tooltip = activeTooltip\r\n\r\n showFlyout = computed(() =>\r\n activeFlyoutKey() === this.getFlyoutKey() && this.isSidebarOpen() && window.innerWidth > 1191\r\n )\r\n\r\n // El cierre tenía un delay de 80ms (debounce de onItemMouseLeave/onFlyoutMouseLeave)\r\n // seguido de un @if que lo desmontaba en seco, sin animación — eso es lo que se\r\n // sentía como \"lag\" (una pausa y después un salto). Ahora se anima la salida y\r\n // recién se desmonta cuando esa animación termina.\r\n flyoutRendered = signal(false)\r\n private flyoutExitTimer: ReturnType<typeof setTimeout> | null = null\r\n\r\n // Una ruta con query param \"project\" (p. ej. tareas de un proyecto específico)\r\n // no debe resaltar el item de menú general de esa misma ruta, porque confunde.\r\n esRutaActiva(path?: string | null): boolean {\r\n if (!path || path !== this.menuService.rutaActiva()) return false\r\n const query = this.menuService.currentUrl().split('?')[1]\r\n return !new URLSearchParams(query ?? '').has('project')\r\n }\r\n\r\n // Reemplaza a @dropdownAnimation (sin @angular/animations), calcado del\r\n // timing real de consults: fade + scaleY, sin animar altura. La salida no\r\n // tiene equivalente CSS puro (Angular removía el <ul> recién al terminar el\r\n // :leave) — acá se mantiene montado con \"--closing\" el tiempo de esa\r\n // animación y recién ahí se desmonta.\r\n submenuRendered = signal(false)\r\n private submenuLeaveTimer: ReturnType<typeof setTimeout> | null = null\r\n\r\n constructor() {\r\n effect(() => {\r\n const openMenus = this.menuService.openMenus()\r\n const currentOpenId = openMenus.get(this.level())\r\n if (currentOpenId !== this.getItemId()) {\r\n this.open.set(false)\r\n }\r\n })\r\n\r\n effect(() => {\r\n if (this.isOpen()) {\r\n if (this.submenuLeaveTimer) {\r\n clearTimeout(this.submenuLeaveTimer)\r\n this.submenuLeaveTimer = null\r\n }\r\n this.submenuRendered.set(true)\r\n } else if (this.submenuRendered()) {\r\n this.submenuLeaveTimer = setTimeout(() => this.submenuRendered.set(false), 220)\r\n }\r\n })\r\n\r\n effect(() => {\r\n if (this.showFlyout()) {\r\n if (this.flyoutExitTimer) {\r\n clearTimeout(this.flyoutExitTimer)\r\n this.flyoutExitTimer = null\r\n }\r\n this.flyoutRendered.set(true)\r\n } else if (this.flyoutRendered()) {\r\n this.flyoutExitTimer = setTimeout(() => this.flyoutRendered.set(false), 130)\r\n }\r\n })\r\n }\r\n\r\n ngOnDestroy() {\r\n if (this.flyoutTimer) clearTimeout(this.flyoutTimer)\r\n if (this.submenuLeaveTimer) clearTimeout(this.submenuLeaveTimer)\r\n if (this.flyoutExitTimer) clearTimeout(this.flyoutExitTimer)\r\n if (activeFlyoutKey() == this.getFlyoutKey()) {\r\n activeFlyoutKey.set(null)\r\n }\r\n }\r\n\r\n hasAccess(menuItem?: RouteInfo): boolean {\r\n const itemToCheck = menuItem || this.item()\r\n const accesos = this.accesos()\r\n const rolID = this.rolId()\r\n\r\n if (!menuItem && this.item().extralink) {\r\n return accesos.some(acc => acc.codmod == this.item().moduloID)\r\n }\r\n\r\n if (validaArray(itemToCheck.rol)) {\r\n return itemToCheck.rol.includes(rolID)\r\n }\r\n\r\n if (!itemToCheck.moduloID && !itemToCheck.accesoID) {\r\n return true\r\n }\r\n\r\n return accesos.some(\r\n (acc: any) =>\r\n acc.codmod == itemToCheck.moduloID &&\r\n acc.codacc == itemToCheck.accesoID\r\n )\r\n }\r\n\r\n get isSidebarActuallyOpen(): boolean {\r\n return window.innerWidth <= 1191 ? true : !this.isSidebarOpen()\r\n }\r\n\r\n get isCollapsedMode(): boolean {\r\n return window.innerWidth > 1191 && this.isSidebarOpen()\r\n }\r\n\r\n getFlyoutKey(): string {\r\n return `flyout-${this.level()}-${this.item().title}`\r\n }\r\n\r\n onItemMouseEnter(event: MouseEvent) {\r\n if (this.flyoutTimer) {\r\n clearTimeout(this.flyoutTimer)\r\n this.flyoutTimer = null\r\n }\r\n if (this.isCollapsedMode) {\r\n const sidebar = document.getElementById('sidebar')\r\n if (sidebar) {\r\n const sidebarRect = sidebar.getBoundingClientRect()\r\n if (event.clientX > sidebarRect.left + 70) return\r\n }\r\n const el = event.currentTarget as HTMLElement\r\n const rect = el.getBoundingClientRect()\r\n const estimatedHeight = Math.max(60, (this.item().submenu?.length ?? 0) * 38 + 52)\r\n const maxTop = window.innerHeight - estimatedHeight - 8\r\n this.flyoutY.set(Math.min(rect.top, maxTop))\r\n activeFlyoutKey.set(this.getFlyoutKey())\r\n } else if (this.codAcceso()) {\r\n const rect = (event.currentTarget as HTMLElement).getBoundingClientRect()\r\n let x = rect.right + 10\r\n let y = rect.top + rect.height / 2\r\n if (window.innerWidth <= 1191) {\r\n const sidebarRect = document.getElementById('sidebar')?.getBoundingClientRect()\r\n if (sidebarRect) {\r\n x = rect.right - sidebarRect.left + 10\r\n y = rect.top - sidebarRect.top + rect.height / 2\r\n }\r\n }\r\n activeTooltip.set({ text: this.codAcceso(), x, y })\r\n }\r\n }\r\n\r\n onItemMouseOver() {\r\n if (this.flyoutTimer) {\r\n clearTimeout(this.flyoutTimer)\r\n this.flyoutTimer = null\r\n }\r\n }\r\n\r\n onItemMouseLeave() {\r\n activeTooltip.set(null)\r\n this.flyoutTimer = setTimeout(() => {\r\n if (activeFlyoutKey() === this.getFlyoutKey()) {\r\n activeFlyoutKey.set(null)\r\n this.expandedFlyoutChild.set(null)\r\n }\r\n }, 80)\r\n }\r\n\r\n showChildTooltip(event: MouseEvent, item: RouteInfo) {\r\n const cod = this.codAccesoItem(item)\r\n if (!cod) return\r\n const rect = (event.currentTarget as HTMLElement).getBoundingClientRect()\r\n activeTooltip.set({ text: cod, x: rect.right + 10, y: rect.top + rect.height / 2 })\r\n }\r\n\r\n hideChildTooltip() {\r\n activeTooltip.set(null)\r\n }\r\n\r\n onFlyoutMouseEnter() {\r\n if (this.flyoutTimer) {\r\n clearTimeout(this.flyoutTimer)\r\n this.flyoutTimer = null\r\n }\r\n }\r\n\r\n onFlyoutMouseLeave() {\r\n this.flyoutTimer = setTimeout(() => {\r\n if (activeFlyoutKey() === this.getFlyoutKey()) {\r\n activeFlyoutKey.set(null)\r\n this.expandedFlyoutChild.set(null)\r\n }\r\n }, 80)\r\n }\r\n\r\n toggleFlyoutChild(child: RouteInfo) {\r\n if (!child.submenu?.length) return\r\n const key = child.title + child.path\r\n this.expandedFlyoutChild.set(this.expandedFlyoutChild() == key ? null : key)\r\n }\r\n\r\n isFlyoutChildExpanded(child: RouteInfo): boolean {\r\n return this.expandedFlyoutChild() === (child.title + child.path)\r\n }\r\n\r\n onFlyoutItemClick(child: RouteInfo, event: MouseEvent) {\r\n if (child.submenu?.length) {\r\n event.preventDefault()\r\n event.stopPropagation()\r\n this.toggleFlyoutChild(child)\r\n return\r\n }\r\n activeFlyoutKey.set(null)\r\n if (child.extralink) {\r\n this.openLink(child)\r\n return\r\n }\r\n this.headerUiService.setTypeDocumento(null)\r\n this.headerUiService.setNumintDocumento(null)\r\n }\r\n\r\n onFlyoutGrandchildClick(grandchild: RouteInfo) {\r\n activeFlyoutKey.set(null)\r\n this.expandedFlyoutChild.set(null)\r\n if (grandchild.extralink) {\r\n this.openLink(grandchild)\r\n return\r\n }\r\n this.headerUiService.setTypeDocumento(null)\r\n this.headerUiService.setNumintDocumento(null)\r\n }\r\n\r\n onFlyoutItemRightClick(event: MouseEvent, child: RouteInfo) {\r\n if (child.extralink) return\r\n if (!child.submenu?.length && child.path) {\r\n event.preventDefault()\r\n window.open(child.path)\r\n }\r\n }\r\n\r\n onFlyoutItemMiddleClick(event: MouseEvent, child: RouteInfo) {\r\n if (event.button === 1 && !child.submenu?.length && child.path && !child.extralink) {\r\n event.preventDefault()\r\n this.tabsService.addBackground(child.path, child.title, child.icon, this.item().title)\r\n }\r\n }\r\n\r\n toggle() {\r\n if (this.item().extralink) {\r\n this.openLink(this.item())\r\n return\r\n }\r\n if (this.item()?.submenu?.length > 0) {\r\n if (this.isCollapsedMode) return\r\n this.open.set(!this.open())\r\n this.menuService.setOpenMenu(this.level(), this.open() ? this.getItemId() : null)\r\n } else {\r\n this.headerUiService.setTypeDocumento(null)\r\n this.headerUiService.setNumintDocumento(null)\r\n this.menuService.notificarSeleccion()\r\n }\r\n }\r\n\r\n openLink(item: RouteInfo) {\r\n this.extralinkOpener?.open(item.moduloID, item.routeName)\r\n }\r\n\r\n onMiddleClick(event: MouseEvent) {\r\n if (this.item().extralink) {\r\n event.preventDefault()\r\n return\r\n }\r\n if (event.button == 1 && !this.item().submenu?.length && this.item().path) {\r\n event.preventDefault()\r\n const module = this.level() === 0 ? null : this.parentModuleName()\r\n this.tabsService.addBackground(this.item().path, this.item().title, this.item().icon, module)\r\n }\r\n }\r\n\r\n onRightClick(event: MouseEvent) {\r\n if (this.item().extralink) {\r\n event.preventDefault()\r\n return\r\n }\r\n if (!this.item().submenu?.length && this.item().path) {\r\n window.open(this.item().path)\r\n }\r\n }\r\n\r\n isOpen() {\r\n return this.open()\r\n }\r\n\r\n getItemId(): string {\r\n return `${this.level}-${this.item().path}-${this.item().title}`\r\n }\r\n\r\n codAcceso = () => {\r\n const { accesoID, moduloID, extralink } = this.item()\r\n if (extralink && moduloID != null) return `ModuloID: ${moduloID}`\r\n if (accesoID == null && moduloID == null) return ''\r\n const mod = moduloID != null ? moduloID : 'ND'\r\n const acc = accesoID != null ? accesoID : 'ND'\r\n return `AccesoID: ${mod}-${acc}`\r\n }\r\n\r\n codAccesoItem(item: RouteInfo): string {\r\n if (item.extralink && item.moduloID != null) return `ModuloID: ${item.moduloID}`\r\n if (item.accesoID == null && item.moduloID == null) return ''\r\n const mod = item.moduloID != null ? item.moduloID : 'ND'\r\n const acc = item.accesoID != null ? item.accesoID : 'ND'\r\n return `AccesoID: ${mod}-${acc}`\r\n }\r\n\r\n manejarRuta(item: RouteInfo) {\r\n if (item.extralink) return null\r\n if (validaArray(item.submenu)) return null\r\n return item.path\r\n }\r\n}\r\n","@if(hasAccess()){\r\n<li (mouseenter)=\"onItemMouseEnter($event)\" (mouseleave)=\"onItemMouseLeave()\"\r\n (mouseover)=\"onItemMouseOver()\">\r\n <div class=\"d-flex align-items-center justify-content-between pt-2 pb-2 px-2 item-sidebar\" (click)=\"toggle()\"\r\n (mousedown)=\"onMiddleClick($event)\" (contextmenu)=\"onRightClick($event)\"\r\n [routerLink]=\"(!item().submenu?.length && item().path && !item().extralink) ? item().path : null\"\r\n [class.active-route]=\"esRutaActiva(item().path)\" [class.cursor-pointer]=\"item().submenu?.length == 0\"\r\n [class.cursor-drow]=\"item().submenu?.length > 0\">\r\n <span>\r\n @if (item().title) {\r\n <i [class]=\"(item().icon ? item().icon : '') + (isSidebarActuallyOpen ? ' me-1' : ' me-1 ms-2')\"></i>\r\n <span class=\"sidebar-text\" [class.sidebar-text--hidden]=\"!isSidebarActuallyOpen\">\r\n {{ item().title }}\r\n </span>\r\n }\r\n </span>\r\n @if (item().submenu?.length > 0) {\r\n <i class=\"fas sidebar-chevron\" [class.sidebar-chevron--hidden]=\"!isSidebarActuallyOpen\" [ngClass]=\"{\r\n 'fa-chevron-down': isOpen(),\r\n 'fa-chevron-right': !isOpen()\r\n }\"></i>\r\n }\r\n </div>\r\n @if (item().submenu?.length && isSidebarActuallyOpen && submenuRendered()) {\r\n <ul class=\"list-unstyled ms-3 submenu\" [class.submenu--closing]=\"!isOpen()\">\r\n @for (child of item().submenu; track $index) {\r\n <app-menu-item [item]=\"child\" [level]=\"level() + 1\" [isSidebarOpen]=\"!isSidebarActuallyOpen\" [parentModuleName]=\"parentModuleName()\" [accentColor]=\"accentColor()\" [accesos]=\"accesos()\" [rolId]=\"rolId()\" />\r\n }\r\n </ul>\r\n }\r\n\r\n @if (flyoutRendered()) {\r\n <div class=\"sidebar-flyout\" [class.sidebar-flyout--closing]=\"!showFlyout()\" [style.top.px]=\"flyoutY()\" [style.max-height]=\"'calc(100dvh - ' + flyoutY() + 'px - 8px)'\"\r\n [style.--flyout-accent]=\"accentColor()\" (mouseenter)=\"onFlyoutMouseEnter()\" (mouseleave)=\"onFlyoutMouseLeave()\">\r\n <div class=\"flyout-header\">\r\n <i [class]=\"(item().icon || '') + ' flyout-header-icon'\"></i>\r\n <span class=\"flyout-header-title\">{{ item().title }}</span>\r\n @if (codAcceso()) {\r\n <span class=\"flyout-header-acceso\">{{ codAcceso().split(': ')[1] }}</span>\r\n }\r\n </div>\r\n @if (item().submenu?.length > 0) {\r\n <ul class=\"list-unstyled flyout-items\">\r\n @for (child of item().submenu; track $index) {\r\n @if (hasAccess(child)) {\r\n <li class=\"flyout-group\">\r\n <div class=\"flyout-item\" [class.flyout-item-has-children]=\"child.submenu?.length > 0\"\r\n [class.flyout-item-expanded]=\"isFlyoutChildExpanded(child)\" [routerLink]=\"manejarRuta(child)\"\r\n [class.flyout-item-active]=\"!child.submenu?.length && esRutaActiva(child.path)\"\r\n (click)=\"onFlyoutItemClick(child, $event)\" (mousedown)=\"onFlyoutItemMiddleClick($event, child)\"\r\n (contextmenu)=\"onFlyoutItemRightClick($event, child)\" (mouseenter)=\"showChildTooltip($event, child)\"\r\n (mouseleave)=\"hideChildTooltip()\">\r\n @if (child.icon) {\r\n <i [class]=\"child.icon + ' flyout-item-icon'\"></i>\r\n }\r\n <span class=\"flyout-item-label\">{{ child.title }}</span>\r\n @if (child.submenu?.length > 0) {\r\n <i class=\"fas flyout-chevron\" [class.fa-chevron-down]=\"isFlyoutChildExpanded(child)\"\r\n [class.fa-chevron-right]=\"!isFlyoutChildExpanded(child)\"></i>\r\n }\r\n </div>\r\n\r\n @if (isFlyoutChildExpanded(child) && child.submenu?.length > 0) {\r\n <ul class=\"list-unstyled flyout-subitems\">\r\n @for (grandchild of child.submenu; track $index) {\r\n @if (hasAccess(grandchild)) {\r\n <li class=\"flyout-subitem\" [routerLink]=\"manejarRuta(grandchild)\" [class.flyout-subitem-active]=\"esRutaActiva(grandchild.path)\"\r\n (click)=\"onFlyoutGrandchildClick(grandchild)\" (mousedown)=\"onFlyoutItemMiddleClick($event, grandchild)\"\r\n (contextmenu)=\"onFlyoutItemRightClick($event, grandchild)\"\r\n (mouseenter)=\"showChildTooltip($event, grandchild)\" (mouseleave)=\"hideChildTooltip()\">\r\n @if (grandchild.icon) {\r\n <i [class]=\"grandchild.icon + ' flyout-item-icon'\"></i>\r\n }\r\n <span class=\"flyout-item-label\">{{ grandchild.title }}</span>\r\n </li>\r\n }\r\n }\r\n </ul>\r\n }\r\n </li>\r\n }\r\n }\r\n </ul>\r\n }\r\n </div>\r\n }\r\n</li>\r\n}\r\n\r\n@if (tooltip()?.text) {\r\n<div class=\"acceso-tooltip-fixed\" [style.left.px]=\"tooltip()!.x\" [style.top.px]=\"tooltip()!.y\">\r\n <span class=\"tooltip-label\">{{ tooltip()!.text.split(': ')[0] }}:</span>\r\n <span class=\"tooltip-value\">{{ tooltip()!.text.split(': ')[1] }}</span>\r\n</div>\r\n}\r\n","import { Component, HostListener, input, output, signal } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\n\r\nexport interface BottomNavItem {\r\n icon: string\r\n label: string\r\n action?: () => void\r\n active?: boolean\r\n type?: 'button' | 'dropdown'\r\n onOpen?: () => void\r\n items?: Array<{\r\n icon: string;\r\n label: string;\r\n action: () => void;\r\n value?: string\r\n }>\r\n}\r\n\r\n@Component({\r\n selector: 'app-bottom-navigation',\r\n imports: [CommonModule],\r\n templateUrl: './bottom-navigation.component.html',\r\n styleUrls: ['./bottom-navigation.component.scss'],\r\n})\r\n\r\nexport class BottomNavigationComponent {\r\n\r\n menuItems = input<BottomNavItem[]>([])\r\n isVisible = input<boolean>(true)\r\n itemClick = output<{ index: number, item: BottomNavItem }>()\r\n\r\n activeDropdown = signal<number | null>(null)\r\n\r\n @HostListener('document:click')\r\n onDocumentClick() {\r\n this.activeDropdown.set(null)\r\n }\r\n\r\n toggleDropdown(index: number, event?: MouseEvent) {\r\n if (event) event.stopPropagation()\r\n const isOpening = this.activeDropdown() != index\r\n this.activeDropdown.set(isOpening ? index : null)\r\n if (isOpening) {\r\n const item = this.menuItems()[index]\r\n item?.onOpen?.()\r\n }\r\n }\r\n\r\n onItemClick(index: number, item: BottomNavItem, event?: MouseEvent) {\r\n if (event) event.stopPropagation()\r\n this.activeDropdown.set(null)\r\n this.itemClick.emit({ index, item })\r\n if (item?.action) item.action()\r\n }\r\n\r\n onSubItemClick(subItem: any, event?: MouseEvent) {\r\n if (event) event.stopPropagation()\r\n this.activeDropdown.set(null)\r\n if (subItem.action) subItem.action()\r\n }\r\n\r\n onDropdownClick(event: MouseEvent) { event.stopPropagation() }\r\n}\r\n","<nav class=\"bottom-nav\" [class.visible]=\"isVisible()\">\r\n @for (item of menuItems(); track $index) {\r\n @if (item.type == 'dropdown') {\r\n <div class=\"bottom-nav-dropdown\">\r\n <button class=\"bottom-nav-item\" [class.active]=\"activeDropdown() === $index\"\r\n (click)=\"onItemClick($index, item, $event); toggleDropdown($index, $event)\">\r\n <i [class]=\"item.icon\"></i>\r\n <span>{{ item.label }}</span>\r\n </button>\r\n\r\n @if (activeDropdown() == $index) {\r\n <div class=\"dropdown-menu show\" (click)=\"onDropdownClick($event)\">\r\n @for (subItem of item.items; track subItem.label; let last = $last; let first = $first) {\r\n <button class=\"dropdown-item\"\r\n [ngClass]=\"{'border-top-radius': first, 'border-bottom-radius': last}\"\r\n (click)=\"onSubItemClick(subItem, $event)\">\r\n\r\n <i [class]=\"subItem.icon\" class=\"me-2\"></i>\r\n <span class=\"flex-grow-1\">{{ subItem.label }}</span>\r\n\r\n @if (subItem.value) {\r\n <span class=\"fw-semibold ms-2\">{{ subItem.value }}</span>\r\n }\r\n </button>\r\n\r\n }\r\n </div>\r\n }\r\n </div>\r\n } @else {\r\n <button class=\"bottom-nav-item\" [class.active]=\"item.active\" (click)=\"onItemClick($index, item, $event)\">\r\n <i [class]=\"item.icon\"></i>\r\n <span>{{ item.label }}</span>\r\n </button>\r\n }\r\n }\r\n</nav>\r\n","import { AfterViewInit, Component, ElementRef, HostListener, Injector, NgZone, OnDestroy, ViewChild, afterNextRender, inject, input, output, signal, computed } from '@angular/core';\r\nimport { TabsService } from '../../service/tabs.service';\r\nimport { Router } from '@angular/router';\r\nimport { CommonModule } from '@angular/common';\r\nimport { BottomNavItem } from '../bottom-navigation/bottom-navigation.component';\r\n\r\nexport interface VerticalHeaderAction {\r\n icon: string\r\n label: string\r\n badge?: number | null\r\n hidden?: boolean\r\n /** Opt-in: además de en el header, refleja esta acción en el bottom-nav (mobile). Por defecto no baja. */\r\n showInBottomNav?: boolean\r\n items?: { icon: string; label: string; accion: () => void; title?: string; value?: string }[]\r\n accion?: () => void\r\n}\r\n\r\n@Component({\r\n selector: 'app-vertical-header',\r\n imports: [CommonModule],\r\n templateUrl: './vertical-header.component.html',\r\n styleUrl: './vertical-header.component.scss'\r\n})\r\n\r\nexport class VerticalHeaderComponent implements AfterViewInit, OnDestroy {\r\n\r\n @ViewChild('headerContainer') headerContainerRef!: ElementRef<HTMLDivElement>\r\n @ViewChild('headerSideStart') headerSideStartRef!: ElementRef<HTMLDivElement>\r\n @ViewChild('headerSideEnd') headerSideEndRef!: ElementRef<HTMLDivElement>\r\n @ViewChild('compactSearchWrapper') compactSearchWrapperRef!: ElementRef<HTMLDivElement>\r\n @ViewChild('accesoTooltip') accesoTooltipRef?: ElementRef<HTMLDivElement>\r\n\r\n // Buscador centrado: se contrae a \"F2\" apenas su hueco (280px, centrado)\r\n // choca con el título/módulo de la izquierda o con los íconos de la derecha,\r\n // en vez de depender de un breakpoint fijo.\r\n private static readonly SEARCH_WIDTH = 280\r\n private static readonly SEARCH_GAP = 16\r\n searchCollapsed = signal(false)\r\n private resizeObserver?: ResizeObserver\r\n\r\n private readonly ngZone = inject(NgZone)\r\n private readonly injector = inject(Injector)\r\n private router = inject(Router)\r\n readonly tabsService = inject(TabsService)\r\n\r\n actions = input<VerticalHeaderAction[]>([])\r\n\r\n // Algunas apps solo muestran el buscador global a ciertos roles.\r\n showSearch = input<boolean>(true)\r\n\r\n themes = input<{ id: string; icon: string; label: string }[]>([\r\n { id: 'light', icon: 'fa-sun', label: 'Claro' },\r\n { id: 'dark', icon: 'fa-moon', label: 'Oscuro' },\r\n { id: 'sky-blue', icon: 'fa-cloud', label: 'Sky Blue' },\r\n { id: 'system', icon: 'fa-desktop', label: 'Sistema' },\r\n ])\r\n showThemeSwitcher = input<boolean>(true)\r\n showTabs = input<boolean>(true)\r\n\r\n // Notificaciones: estándar en todas las apps TSI, ícono y estilo fijos —\r\n // el consumidor solo decide si se muestra y provee el contador y el click.\r\n showNotifications = input<boolean>(false)\r\n notificationsCount = input<number>(0)\r\n notificationsClick = output<void>()\r\n /** Opt-in: además de en el header, refleja las notificaciones en el bottom-nav (mobile). Por defecto no baja (igual que en consults). */\r\n notificationsInBottomNav = input<boolean>(false)\r\n\r\n // Soporte (chatbot): ídem, ícono y estilo fijos — el consumidor solo\r\n // decide si está disponible y controla su visibilidad.\r\n showChatbotToggle = input<boolean>(false)\r\n chatbotVisible = input<boolean>(false)\r\n chatbotVisibleChange = output<boolean>()\r\n /** Opt-in: además de en el header, refleja el toggle de soporte en el bottom-nav (mobile). Por defecto no baja. */\r\n chatbotInBottomNav = input<boolean>(false)\r\n currentTheme = input<string>('light')\r\n themeChange = output<string>()\r\n\r\n // Espejo de las acciones del header hacia el bottom-nav (mobile): mismo dato,\r\n // sin listas separadas — cada pieza (notificaciones, soporte, acciones) decide\r\n // por su cuenta si además de en el header se refleja acá.\r\n bottomNavItems = computed<BottomNavItem[]>(() => {\r\n const items: BottomNavItem[] = []\r\n\r\n if (this.showNotifications() && this.notificationsInBottomNav()) {\r\n items.push({\r\n icon: 'fas fa-bell',\r\n label: this.notificationsCount() > 0 ? `Notificaciones (${this.notificationsCount()})` : 'Notificaciones',\r\n action: () => this.notificationsClick.emit(),\r\n })\r\n }\r\n\r\n if (this.showChatbotToggle() && this.chatbotInBottomNav()) {\r\n items.push({\r\n icon: 'fas fa-robot',\r\n label: this.chatbotVisible() ? 'Ocultar soporte' : 'Mostrar soporte',\r\n action: () => this.chatbotVisibleChange.emit(!this.chatbotVisible()),\r\n })\r\n }\r\n\r\n for (const action of this.actions()) {\r\n if (action.hidden || !action.showInBottomNav) continue\r\n if (action.items?.length) {\r\n items.push({\r\n icon: action.icon,\r\n label: action.label,\r\n type: 'dropdown',\r\n action: action.accion,\r\n items: action.items.map(i => ({ icon: i.icon, label: i.label, value: i.value, action: i.accion })),\r\n })\r\n } else if (action.accion) {\r\n items.push({ icon: action.icon, label: action.label, action: action.accion })\r\n }\r\n }\r\n\r\n return items\r\n })\r\n\r\n readonly themeIcon = computed<string>(() =>\r\n this.themes().find(item => item.id === this.currentTheme())?.icon ?? 'fa-palette'\r\n )\r\n\r\n readonly themeLabel = computed<string>(() =>\r\n this.themes().find(item => item.id === this.currentTheme())?.label ?? 'Personalizado'\r\n )\r\n\r\n versionApp = input<string>('')\r\n accentColor = input<string>('#398bf7')\r\n envClass = input<string>('prod')\r\n produccion = input<boolean>(false)\r\n emitirToogle = output<void>()\r\n isScrolled = input<boolean>(false)\r\n isSidebarOpen = input<boolean>(false)\r\n\r\n nameProyecto = input<string>('')\r\n\r\n searchComponents = output<void>()\r\n showPanelControl = input<boolean>(true)\r\n panelControlClick = output<void>()\r\n logout = output<void>()\r\n\r\n // Datos de sesión: se reciben del consumidor (en vez de inyectar SesionService\r\n // acá) para que layout-tsi no dependa de core-tsi.\r\n userName = input<string>('')\r\n empresaName = input<string>('')\r\n // Imagen de perfil (URL o base64). Si no se envía o falla al cargar, se usa el avatar por defecto.\r\n userAvatar = input<string | null>(null)\r\n avatarFallido = signal<string | null>(null)\r\n avatarSrc = computed(() => (this.userAvatar() !== this.avatarFallido() && this.userAvatar()) || 'assets/images/admin-avatar.png')\r\n\r\n private static readonly TOOLTIP_GAP = 4\r\n private static readonly TOOLTIP_MARGIN = 8\r\n tooltip = signal<{ text: string; y: number; side: 'right' | 'left'; left?: number; right?: number; maxWidth?: number } | null>(null)\r\n\r\n // Reemplazan a ngbDropdown (sin @ng-bootstrap acá): un dropdown nativo por\r\n // click, reutilizando las clases de Bootstrap (dropdown/dropdown-menu/show)\r\n // que ya vienen estilizadas — así no hace falta reimplementar el CSS.\r\n openActionKey = signal<string | null>(null)\r\n themeMenuOpen = signal<boolean>(false)\r\n userMenuOpen = signal<boolean>(false)\r\n\r\n @HostListener('document:click')\r\n onDocumentClick() {\r\n this.tooltip.set(null)\r\n this.closeAllMenus()\r\n }\r\n\r\n private closeAllMenus() {\r\n this.openActionKey.set(null)\r\n this.themeMenuOpen.set(false)\r\n this.userMenuOpen.set(false)\r\n }\r\n\r\n toggleActionMenu(event: MouseEvent, action: VerticalHeaderAction) {\r\n event.stopPropagation()\r\n const opening = this.openActionKey() !== action.label\r\n this.closeAllMenus()\r\n this.openActionKey.set(opening ? action.label : null)\r\n }\r\n\r\n runAction(item: { accion: () => void }) {\r\n this.openActionKey.set(null)\r\n item.accion()\r\n }\r\n\r\n toggleThemeMenu(event: MouseEvent) {\r\n event.stopPropagation()\r\n const opening = !this.themeMenuOpen()\r\n this.closeAllMenus()\r\n this.themeMenuOpen.set(opening)\r\n }\r\n\r\n selectTheme(id: string) {\r\n this.themeMenuOpen.set(false)\r\n this.themeChange.emit(id)\r\n }\r\n\r\n toggleUserMenu(event: MouseEvent) {\r\n event.stopPropagation()\r\n const opening = !this.userMenuOpen()\r\n this.closeAllMenus()\r\n this.userMenuOpen.set(opening)\r\n }\r\n\r\n showTooltip(event: MouseEvent, text: string) {\r\n if (!text) return\r\n const rect = (event.currentTarget as HTMLElement).getBoundingClientRect()\r\n const gap = VerticalHeaderComponent.TOOLTIP_GAP\r\n const margin = VerticalHeaderComponent.TOOLTIP_MARGIN\r\n const y = rect.top + rect.height / 2\r\n this.tooltip.set({ text, y, side: 'right', left: rect.right + gap })\r\n\r\n afterNextRender(() => {\r\n const el = this.accesoTooltipRef?.nativeElement\r\n const current = this.tooltip()\r\n if (!el || current?.text !== text) return\r\n\r\n const width = el.getBoundingClientRect().width\r\n const viewport = document.documentElement.clientWidth\r\n const spaceRight = viewport - rect.right - gap - margin\r\n const spaceLeft = rect.left - gap - margin\r\n\r\n if (width <= spaceRight) return\r\n if (width <= spaceLeft) {\r\n this.tooltip.set({ text, y, side: 'left', right: viewport - rect.left + gap })\r\n } else if (spaceLeft > spaceRight) {\r\n this.tooltip.set({ text, y, side: 'left', right: viewport - rect.left + gap, maxWidth: spaceLeft })\r\n } else {\r\n this.tooltip.set({ text, y, side: 'right', left: rect.right + gap, maxWidth: spaceRight })\r\n }\r\n }, { injector: this.injector })\r\n }\r\n\r\n hideTooltip() { this.tooltip.set(null) }\r\n\r\n // Ningún atajo de teclado se define acá (ni F2 ni ninguno con `key`): todos\r\n // viven en el wrapper del consumidor con su propio keydown listener, todos\r\n // por igual — evita mezclar guards de rol/hasOpenModals en dos lugares.\r\n goToHome() { this.router.navigate(['/atajos']) }\r\n\r\n ngAfterViewInit() {\r\n // ResizeObserver corre fuera de la zona de Angular (no está parcheado por\r\n // zone.js), así que sin ngZone.run() el signal se actualiza pero la vista\r\n // no se refresca hasta que algo más dispare un ciclo de detección.\r\n this.resizeObserver = new ResizeObserver(() => this.ngZone.run(() => this.updateSearchCollapse()))\r\n this.resizeObserver.observe(this.headerContainerRef.nativeElement)\r\n this.resizeObserver.observe(this.headerSideStartRef.nativeElement)\r\n this.resizeObserver.observe(this.headerSideEndRef.nativeElement)\r\n this.updateSearchCollapse()\r\n }\r\n\r\n ngOnDestroy() {\r\n this.resizeObserver?.disconnect()\r\n }\r\n\r\n private updateSearchCollapse() {\r\n const containerRect = this.headerContainerRef.nativeElement.getBoundingClientRect()\r\n const startRect = this.headerSideStartRef.nativeElement.getBoundingClientRect()\r\n const endRect = this.headerSideEndRef.nativeElement.getBoundingClientRect()\r\n // El botón compacto \"F2\" solo existe cuando ya está colapsado, así que su\r\n // propio ancho no debe contar para decidir si hay que colapsar — si no,\r\n // aparecer empuja el límite derecho y el estado queda pegado en \"colapsado\".\r\n const compactWidth = this.compactSearchWrapperRef?.nativeElement.getBoundingClientRect().width ?? 0\r\n\r\n const half = VerticalHeaderComponent.SEARCH_WIDTH / 2\r\n const gap = VerticalHeaderComponent.SEARCH_GAP\r\n const center = containerRect.left + containerRect.width / 2\r\n const searchLeft = center - half\r\n const searchRight = center + half\r\n const endLeft = endRect.left + compactWidth\r\n\r\n // Por debajo de md (768px) el buscador centrado ya está oculto por Bootstrap\r\n // (d-md-flex) sin importar si hay colisión real — así que el ícono compacto\r\n // tiene que quedar como colapsado ahí sí o sí, no solo cuando choca.\r\n const belowMd = containerRect.width < 768\r\n const collides = belowMd || (startRect.right + gap > searchLeft) || (searchRight + gap > endLeft)\r\n if (collides !== this.searchCollapsed()) this.searchCollapsed.set(collides)\r\n }\r\n}\r\n","<div #headerContainer class=\"d-flex header-container\" [ngClass]=\"envClass()\">\r\n <div class=\"first-header d-none d-md-flex\">\r\n <img src=\"assets/images/logo-tsi-tres.png\" width=\"40px\" height=\"40px\" style=\"cursor:pointer\"\r\n (click)=\"goToHome()\" title=\"Ir a Home\">\r\n <span class=\"text-white empresa-nombre ps-2\" [title]=\"versionApp()\">{{empresaName()}}</span>\r\n </div>\r\n\r\n <div class=\"d-flex w-100 h-100 justify-content-between align-items-center pe-3 ps-0\">\r\n <div #headerSideStart class=\"d-flex align-items-center header-side\">\r\n <button class=\"btn text-white none-style sidebar-toggle-btn\" (click)=\"emitirToogle.emit()\">\r\n <i class=\"fa-solid fa-table-columns\" [class.flipped]=\"isSidebarOpen()\"></i>\r\n <i class=\"fa-solid fa-chevron-left toggle-arrow\" [class.flipped]=\"isSidebarOpen()\"></i>\r\n </button>\r\n <span class=\"text-white empresa-nombre d-inline d-md-none ps-2\">{{empresaName()}}</span>\r\n <span class=\"text-white fs-5 fw-normal d-none d-md-inline ps-2 text-nowrap\">{{nameProyecto()}}</span>\r\n @if (showTabs() && tabsService.tabs().length) {\r\n <button class=\"tabs-header-btn mx-2 d-none d-md-flex\"\r\n [class.tabs-header-btn--active]=\"tabsService.visible()\" (click)=\"tabsService.toggleVisible()\"\r\n [title]=\"tabsService.visible() ? 'Ocultar acceso rápido' : 'Mostrar acceso rápido'\">\r\n <i class=\"fas fa-layer-group\"></i>\r\n @if (!tabsService.visible()) {\r\n <span class=\"tabs-header-count\">{{ tabsService.tabs().length }}</span>\r\n }\r\n </button>\r\n }\r\n </div>\r\n\r\n @if (showSearch()) {\r\n <button class=\"global-search-trigger d-none d-md-flex align-items-center\"\r\n [class.global-search-trigger--collapsed]=\"searchCollapsed()\" title=\"Búsqueda de páginas (F2)\"\r\n (click)=\"searchComponents.emit()\">\r\n <i class=\"fas fa-search global-search-icon\"></i>\r\n <span class=\"global-search-placeholder\">Buscar páginas...</span>\r\n <kbd class=\"global-search-kbd\">F2</kbd>\r\n </button>\r\n }\r\n\r\n <div #headerSideEnd class=\"d-flex align-items-center header-side header-side--end\">\r\n\r\n <!-- Fallback del buscador centrado cuando no entra (colisión) o en mobile\r\n (el buscador centrado se oculta por completo por debajo de md): la\r\n píldora de texto \"F2\", igual que antes. -->\r\n <div #compactSearchWrapper class=\"h-100 d-flex align-items-center\">\r\n @if (showSearch() && searchCollapsed()) {\r\n <button class=\"global-search-compact-pill\" title=\"Buscar páginas (F2)\"\r\n (click)=\"searchComponents.emit()\">F2</button>\r\n }\r\n </div>\r\n\r\n <div class=\"d-flex align-items-center\">\r\n <ng-content select=\"[extra-actions]\" />\r\n\r\n <!-- Acciones adicionales, definidas por el consumidor: siempre a la izquierda\r\n de los tres fijos (tema, notificaciones, soporte). Solo se ocultan en mobile\r\n las que además se reflejan en el bottom-nav (showInBottomNav) — si una acción\r\n no baja al bottom-nav, se queda visible acá para no desaparecer del todo. -->\r\n @for (action of actions(); track action.label) {\r\n @if (!action.hidden) {\r\n @if (action.items?.length) {\r\n <div class=\"dropdown d-inline-block z-index\" [class.show]=\"openActionKey() === action.label\" [class.desktop-only]=\"action.showInBottomNav\">\r\n <div class=\"h-100 d-flex align-items-center\">\r\n <button class=\"notification-btn option p-0 m-0 me-2\" [title]=\"action.label\" (click)=\"action.accion?.(); toggleActionMenu($event, action)\">\r\n <i class=\"fas text-white\" [ngClass]=\"action.icon\"></i>\r\n </button>\r\n </div>\r\n\r\n <div class=\"dropdown-menu dropdown-menu-end mtp-9 mb-0 py-0 custom-dropdown\" [class.show]=\"openActionKey() === action.label\">\r\n @for (opcion of action.items; track opcion.label; let last = $last) {\r\n <button class=\"dropdown-item py-2 fs-7 fw-4 d-flex align-items-center\"\r\n [ngClass]=\"{'divider-border': !last,'border-top-radius': $index == 0,'border-bottom-radius': last}\"\r\n (click)=\"runAction(opcion)\"\r\n (mouseenter)=\"showTooltip($event, opcion.title ?? '')\" (mouseleave)=\"hideTooltip()\">\r\n <i [class]=\"opcion.icon\" class=\"me-1\"></i> {{ opcion.label }}\r\n @if (opcion.value) {\r\n <span class=\"ms-auto ps-3 fw-6\">{{ opcion.value }}</span>\r\n }\r\n </button>\r\n }\r\n </div>\r\n </div>\r\n } @else {\r\n <div class=\"h-100 d-flex align-items-center\" [class.desktop-only]=\"action.showInBottomNav\">\r\n <button class=\"notification-btn option p-0 m-0 me-2\" [title]=\"action.label\" (click)=\"action.accion?.()\">\r\n <i class=\"fas text-white\" [ngClass]=\"action.icon\"></i>\r\n @if (action.badge) {\r\n <span class=\"notification-badge\" [ngClass]=\"produccion() ? 'bg-danger' : 'bg-info'\">\r\n {{ action.badge }}\r\n </span>\r\n }\r\n </button>\r\n </div>\r\n }\r\n }\r\n }\r\n\r\n @if (showThemeSwitcher()) {\r\n <div class=\"dropdown d-inline-block z-index\" [class.show]=\"themeMenuOpen()\">\r\n <div class=\"h-100 d-flex align-items-center\">\r\n <button class=\"notification-btn option p-0 m-0 me-2\" (click)=\"toggleThemeMenu($event)\"\r\n [title]=\"'Tema: ' + themeLabel()\">\r\n <i class=\"fas text-white\" [ngClass]=\"themeIcon()\"></i>\r\n </button>\r\n </div>\r\n\r\n <div class=\"dropdown-menu dropdown-menu-end mtp-9 mb-0 py-0 custom-dropdown\" [class.show]=\"themeMenuOpen()\">\r\n @for (item of themes(); track item.id) {\r\n <button class=\"dropdown-item py-2 fs-7 fw-4 border-bottom-radius divider-border\"\r\n (click)=\"selectTheme(item.id)\">\r\n <i class=\"fas me-1\" [ngClass]=\"item.icon\"></i> {{ item.label }}\r\n @if (currentTheme() === item.id) {\r\n <i class=\"fas fa-check ms-auto text-success\"></i>\r\n }\r\n </button>\r\n }\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n\r\n <!-- Notificaciones y soporte: ícono/estilo estándar, siempre visibles también en mobile -->\r\n @if (showNotifications()) {\r\n <div class=\"h-100 d-flex align-items-center\">\r\n <button class=\"notification-btn option p-0 m-0 me-2\" title=\"Notificaciones\"\r\n (click)=\"notificationsClick.emit()\">\r\n <i class=\"fas fa-bell text-white\"></i>\r\n @if (notificationsCount() > 0) {\r\n <span class=\"notification-badge\" [ngClass]=\"produccion() ? 'bg-danger' : 'bg-info'\">\r\n {{ notificationsCount() }}\r\n </span>\r\n }\r\n </button>\r\n </div>\r\n }\r\n\r\n @if (showChatbotToggle()) {\r\n <div class=\"h-100 d-flex align-items-center\">\r\n <button class=\"notification-btn option p-0 m-0 me-2\"\r\n [title]=\"chatbotVisible() ? 'Ocultar soporte' : 'Mostrar soporte'\"\r\n (click)=\"chatbotVisibleChange.emit(!chatbotVisible())\">\r\n <i class=\"fas fa-robot text-white\"></i>\r\n </button>\r\n </div>\r\n }\r\n\r\n <div class=\"dropdown d-inline-block z-index\" [class.show]=\"userMenuOpen()\">\r\n <div class=\"h-100 d-flex align-items-center\">\r\n <button class=\"border-0 bg-none\" (click)=\"toggleUserMenu($event)\">\r\n <img class=\"circle-icon shadow-sm\" [src]=\"avatarSrc()\" (error)=\"avatarFallido.set(userAvatar())\" alt=\"\">\r\n </button>\r\n </div>\r\n <div class=\"dropdown-menu dropdown-menu-end mtp-9 mb-0 py-0\" [class.show]=\"userMenuOpen()\">\r\n <div\r\n class=\"d-flex no-block align-items-center p-3 divider-border bg-gray-user-data border-top-radius\">\r\n <div class=\"d-flex align-items-center\">\r\n <img class=\"circle-icon shadow-sm\" [src]=\"avatarSrc()\" (error)=\"avatarFallido.set(userAvatar())\" alt=\"\">\r\n <div class=\"ms-2\">\r\n <p class=\"fs-7 my-0 py-0 fw-6\">{{userName()}}</p>\r\n @if (userName().startsWith('DESARROLLADOR')) {\r\n <span class=\"fs-7 fw-bold\">Desarrollador</span>\r\n } @else if (userName().startsWith('SOPORTE')) {\r\n <span class=\"fs-7 fw-bold\">Soporte</span>\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n @if (showPanelControl()) {\r\n <button class=\"dropdown-item py-3 fs-7 fw-4\" (click)=\"userMenuOpen.set(false); panelControlClick.emit()\">\r\n Panel de control\r\n </button>\r\n }\r\n <button class=\"dropdown-item py-3 fs-7 fw-4 border-bottom-radius\" (click)=\"userMenuOpen.set(false); logout.emit()\"><i\r\n class=\"fas fa-power-off\"></i> Cerrar sesión</button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n@if (tooltip()?.text) {\r\n<div #accesoTooltip class=\"acceso-tooltip-fixed\" [class.acceso-tooltip-fixed--left]=\"tooltip()!.side === 'left'\"\r\n [class.acceso-tooltip-fixed--wrap]=\"tooltip()!.maxWidth != null\"\r\n [style.left.px]=\"tooltip()!.left\" [style.right.px]=\"tooltip()!.right\" [style.top.px]=\"tooltip()!.y\"\r\n [style.maxWidth.px]=\"tooltip()!.maxWidth\" [style.--tooltip-accent]=\"accentColor()\">\r\n <span class=\"tooltip-label\">{{ tooltip()!.text.split(': ')[0] }}:</span>\r\n <span class=\"tooltip-value\" [style.color]=\"accentColor()\">{{ tooltip()!.text.split(': ')[1] }}</span>\r\n</div>\r\n}\r\n","import { Component, computed, effect, inject, input, signal } from '@angular/core';\r\nimport { TabsService } from '../../service/tabs.service';\r\nimport { AppTab } from '../../models/general/app-tab.model';\r\n\r\nconst DEFAULT_MODULE_COLORS: Record<string, string> = {\r\n 'Archivos': '#ea6f0a',\r\n 'Contabilidad': '#059669',\r\n 'Comercial': '#2563eb',\r\n 'Logística': '#9333ea',\r\n 'Cuentas por cobrar': '#d97706',\r\n 'Cuentas por pagar': '#dc2626',\r\n}\r\n\r\n// Duración de la animación de salida (@keyframes tabBarSlideOut en el scss):\r\n// se mantiene montada este tiempo antes de desmontarla de verdad.\r\nconst LEAVE_DURATION_MS = 160\r\n\r\n@Component({\r\n selector: 'app-tab-bar',\r\n imports: [],\r\n templateUrl: './tab-bar.component.html',\r\n styleUrl: './tab-bar.component.scss',\r\n})\r\n\r\nexport class TabBarComponent {\r\n\r\n tabs = inject(TabsService)\r\n\r\n // Reemplaza a @slideDown (sin @angular/animations): la salida (:leave) no\r\n // tiene equivalente CSS puro porque Angular remueve el elemento del DOM al\r\n // instante — acá lo mantenemos montado con una clase \"--leaving\" el tiempo\r\n // que dura la animación de salida, y recién ahí lo desmontamos.\r\n shouldShow = computed(() => this.tabs.tabs().length > 0 && this.tabs.visible())\r\n rendered = signal(false)\r\n private leaveTimer: ReturnType<typeof setTimeout> | null = null\r\n\r\n constructor() {\r\n effect(() => {\r\n if (this.shouldShow()) {\r\n if (this.leaveTimer) {\r\n clearTimeout(this.leaveTimer)\r\n this.leaveTimer = null\r\n }\r\n this.rendered.set(true)\r\n } else if (this.rendered()) {\r\n this.leaveTimer = setTimeout(() => this.rendered.set(false), LEAVE_DURATION_MS)\r\n }\r\n })\r\n }\r\n\r\n // Se combina con los colores por defecto en vez de reemplazarlos: un proyecto solo\r\n // necesita pasar los módulos que quiera personalizar, el resto sigue con su color base.\r\n moduleColors = input<Record<string, string>>({})\r\n\r\n // Tooltip nativo al hover (sin ng-bootstrap): mismo patrón fixed-position\r\n // que ya usan menu-item/vertical-header en esta librería.\r\n hoveredTab = signal<AppTab | null>(null)\r\n tipPosition = signal<{ x: number; y: number }>({ x: 0, y: 0 })\r\n private hoverTimer: ReturnType<typeof setTimeout> | null = null\r\n\r\n getModuleColor(tab: AppTab): string {\r\n const key = tab.moduleKey ?? tab.module ?? ''\r\n return this.moduleColors()[key] ?? DEFAULT_MODULE_COLORS[key] ?? '#6b7280'\r\n }\r\n\r\n onTabMouseEnter(event: MouseEvent, tab: AppTab) {\r\n if (this.hoverTimer) clearTimeout(this.hoverTimer)\r\n const rect = (event.currentTarget as HTMLElement).getBoundingClientRect()\r\n this.hoverTimer = setTimeout(() => {\r\n this.tipPosition.set({ x: rect.left + rect.width / 2, y: rect.bottom + 8 })\r\n this.hoveredTab.set(tab)\r\n }, 600)\r\n }\r\n\r\n onTabMouseLeave() {\r\n if (this.hoverTimer) {\r\n clearTimeout(this.hoverTimer)\r\n this.hoverTimer = null\r\n }\r\n this.hoveredTab.set(null)\r\n }\r\n\r\n onTabMouseDown(event: MouseEvent, tab: AppTab) {\r\n if (event.button === 1 && !tab.pinned) {\r\n event.preventDefault()\r\n this.tabs.close(tab.id, event)\r\n }\r\n }\r\n}\r\n","@if (rendered()) {\r\n<div class=\"tab-bar\" [class.tab-bar--leaving]=\"!shouldShow()\">\r\n <div class=\"tab-list\">\r\n @for (tab of tabs.sortedTabs(); track tab.id) {\r\n\r\n <div class=\"tab\" [class.tab--active]=\"tabs.activeId() === tab.id\" [class.tab--pinned]=\"tab.pinned\"\r\n [class.tab--with-module]=\"!!tab.module\" (mouseenter)=\"onTabMouseEnter($event, tab)\" (mouseleave)=\"onTabMouseLeave()\"\r\n (click)=\"tabs.activate(tab.id)\" (mousedown)=\"onTabMouseDown($event, tab)\">\r\n @if (tab.icon) {\r\n <i [class]=\"tab.icon + ' tab-icon'\"></i>\r\n }\r\n <div class=\"tab-body\">\r\n <span class=\"tab-title\">{{ tab.title }}</span>\r\n @if (tab.module) {\r\n <span class=\"tab-module\">\r\n <span class=\"tab-module-dot\" [style.background]=\"getModuleColor(tab)\"></span>\r\n {{ tab.module }}\r\n </span>\r\n }\r\n </div>\r\n <button class=\"tab-btn tab-pin\" [class.tab-pin--active]=\"tab.pinned\" (click)=\"tabs.togglePin(tab.id, $event)\"\r\n [title]=\"tab.pinned ? 'Desfijar' : 'Fijar'\">\r\n <i class=\"fas fa-thumbtack\"></i>\r\n </button>\r\n @if (!tab.pinned) {\r\n <button class=\"tab-btn tab-close\" (click)=\"tabs.close(tab.id, $event)\" title=\"Cerrar\">\r\n <i class=\"fas fa-times\"></i>\r\n </button>\r\n }\r\n </div>\r\n }\r\n </div>\r\n\r\n <div class=\"tab-actions\">\r\n <button class=\"tab-close-all\" (click)=\"tabs.closeAll()\" title=\"Cerrar todas las pestañas\">\r\n <i class=\"fas fa-times-circle\"></i>\r\n <span>Cerrar todo</span>\r\n </button>\r\n </div>\r\n</div>\r\n\r\n@if (hoveredTab(); as tab) {\r\n<div class=\"tab-tip-fixed\" [style.left.px]=\"tipPosition().x\" [style.top.px]=\"tipPosition().y\">\r\n <span class=\"tab-tip-title\">{{ tab.title }}</span>\r\n @if (tab.module) {\r\n <span class=\"tab-tip-module\">\r\n <span class=\"tab-tip-dot\" [style.background]=\"getModuleColor(tab)\"></span>\r\n {{ tab.module }}\r\n </span>\r\n }\r\n</div>\r\n}\r\n}\r\n","import { Injectable, signal } from '@angular/core';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\n\r\nexport class DetectorService {\r\n\r\n private componenteActual = signal<string | null>(null)\r\n\r\n setComponente(componente: string) {\r\n this.componenteActual.set(componente)\r\n }\r\n\r\n getComponente() {\r\n return this.componenteActual.asReadonly()\r\n }\r\n}\r\n","import { CommonModule } from '@angular/common';\r\nimport { Component, computed, ContentChild, effect, ElementRef, HostListener, inject, input, reflectComponentType, signal, untracked, ViewChild } from '@angular/core';\r\nimport { ChildrenOutletContexts, NavigationEnd, Router, RouterModule } from '@angular/router';\r\nimport { MenuItemComponent } from '../menu-item/menu-item.component';\r\nimport { RouteInfo } from '../../models/general/route-info.model';\r\nimport { SessionData } from '../../models/general/session-data.model';\r\nimport { BottomNavigationComponent, BottomNavItem } from '../bottom-navigation/bottom-navigation.component';\r\nimport { VerticalHeaderComponent } from '../vertical-header/vertical-header.component';\r\nimport { TabBarComponent } from '../tab-bar/tab-bar.component';\r\nimport { DetectorService } from '../../service/detector.service';\r\nimport { TabsService } from '../../service/tabs.service';\r\nimport { MenuService } from '../../service/menu.service';\r\nimport { filter } from 'rxjs/operators';\r\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\r\n\r\n@Component({\r\n selector: 'app-full',\r\n imports: [CommonModule, RouterModule, MenuItemComponent, BottomNavigationComponent, TabBarComponent],\r\n templateUrl: './full.component.html',\r\n styleUrl: './full.component.scss',\r\n})\r\n\r\nexport class FullComponent {\r\n\r\n private readonly detectorService = inject(DetectorService)\r\n private readonly contexts = inject(ChildrenOutletContexts)\r\n private readonly router = inject(Router)\r\n private readonly tabsService = inject(TabsService)\r\n private readonly menuService = inject(MenuService)\r\n\r\n menuItems = input<RouteInfo[]>([])\r\n nameProyecto = input<string>('')\r\n accentColor = input<string>('#398bf7')\r\n showTabs = input<boolean>(true)\r\n tabModuleColors = input<Record<string, string>>({})\r\n currentYear = new Date().getFullYear()\r\n\r\n // El vertical-header se recibe proyectado (<ng-content select=\"[header]\">), así\r\n // que no es un ViewChild del template propio de `full` sino contenido — por eso\r\n // ContentChild en vez de ViewChild (mismo mecanismo que usa consults con ViewChild\r\n // porque ahí el header vive directo en su propio template, no proyectado).\r\n // El bottom-nav SOLO sale de ahí — igual que en consults, sin lista aparte.\r\n private verticalHeaderSignal = signal<VerticalHeaderComponent | null>(null)\r\n @ContentChild(VerticalHeaderComponent)\r\n set verticalHeaderRef(vh: VerticalHeaderComponent | undefined) {\r\n if (vh) this.verticalHeaderSignal.set(vh)\r\n }\r\n\r\n bottomMenuItems = computed<BottomNavItem[]>(() =>\r\n this.verticalHeaderSignal()?.bottomNavItems() ?? []\r\n )\r\n\r\n isSidebarOpen = signal<boolean>(false)\r\n isSidebarHovering = signal<boolean>(false)\r\n isScrolled = signal<boolean>(false)\r\n\r\n isDesktop = window.innerWidth >= 1191\r\n isMobileView = signal<boolean>(window.innerWidth <= 667)\r\n sidebarWidth = signal<number>(260)\r\n\r\n // Datos de sesión: se reciben del consumidor (en vez de inyectar SesionService\r\n // acá) para que layout-tsi no dependa de core-tsi. Es un solo objeto requerido\r\n // (input.required) en vez de 6 inputs sueltos, para que Angular tire error si\r\n // el consumidor se olvida de pasarlo, en vez de fallar en silencio con '' o [].\r\n sessionData = input.required<SessionData>()\r\n\r\n nombreSucursal = computed(() =>\r\n this.sessionData().sucursales?.find(s => s.codsuc == this.sessionData().codsuc)?.sucursal ?? ''\r\n )\r\n\r\n cambiarSucursal() {\r\n this.router.navigateByUrl('seleccionar-sucursal')\r\n }\r\n\r\n get userInitials(): string {\r\n return this.sessionData().nombreUser.split(' ').filter(Boolean).slice(0, 2).map(n => n[0].toUpperCase()).join('')\r\n }\r\n\r\n // El contenido del router-outlet aparecía en seco al cambiar de página/tab.\r\n // (activate) avisa cada vez que se instancia un componente nuevo ahí — se\r\n // saca la clase y se vuelve a poner en el siguiente frame para forzar que\r\n // el @keyframes de entrada se reinicie (una clase ya puesta no reinicia su\r\n // animación si se la vuelve a poner sin sacarla antes).\r\n routeAnimating = signal(false)\r\n\r\n onRouteActivate() {\r\n this.routeAnimating.set(false)\r\n requestAnimationFrame(() => requestAnimationFrame(() => this.routeAnimating.set(true)))\r\n }\r\n\r\n constructor() {\r\n effect(() => {\r\n document.documentElement.style.setProperty('--sidebar-accent', this.accentColor())\r\n })\r\n\r\n effect(() => this.menuService.setRutas(this.menuItems()))\r\n\r\n effect(() => {\r\n if (this.menuService.seleccion() && window.innerWidth <= 1191) {\r\n untracked(() => this.closeSidebar())\r\n }\r\n })\r\n\r\n this.tabsService.init()\r\n\r\n this.router.events.pipe(filter((e): e is NavigationEnd => e instanceof NavigationEnd), takeUntilDestroyed()).subscribe(() => {\r\n const component = this.contexts.getContext('primary')?.outlet?.component\r\n if (component) {\r\n const mirror = reflectComponentType(component.constructor as any)\r\n if (mirror) this.detectorService.setComponente(mirror.selector)\r\n }\r\n })\r\n }\r\n\r\n @ViewChild('contentContainer') contentContainer: ElementRef\r\n @ViewChild('sidebar') sidebarRef!: ElementRef<HTMLDivElement>\r\n\r\n toggleSidebar() {\r\n this.isSidebarOpen.set(!this.isSidebarOpen())\r\n this.updateSidebarWidth()\r\n }\r\n\r\n closeSidebar() {\r\n this.isSidebarOpen.set(false)\r\n }\r\n\r\n @HostListener('window:resize', ['$event'])\r\n onResize(event: any) {\r\n this.isDesktop = event.target.innerWidth >= 1191\r\n this.isMobileView.set(event.target.innerWidth <= 667)\r\n if (this.isDesktop) {\r\n this.isSidebarOpen.set(false)\r\n }\r\n }\r\n\r\n ngAfterViewInit() {\r\n if (this.contentContainer) {\r\n this.contentContainer.nativeElement.addEventListener('scroll', () => {\r\n const scrollTop = this.contentContainer.nativeElement.scrollTop\r\n this.isScrolled.set(scrollTop > 0)\r\n })\r\n }\r\n if (this.sidebarRef) {\r\n this.sidebarRef.nativeElement.addEventListener('transitionend', (event: TransitionEvent) => {\r\n if (event.propertyName == 'max-width') {\r\n this.updateSidebarWidth()\r\n }\r\n })\r\n }\r\n window.addEventListener('resize', () => this.updateSidebarWidth())\r\n this.updateSidebarWidth()\r\n }\r\n\r\n get isSidebarActuallyOpen(): boolean {\r\n return window.innerWidth <= 1191 ? true : !this.isSidebarOpen()\r\n }\r\n\r\n updateSidebarWidth() {\r\n if (this.sidebarRef) {\r\n const newWidth = this.sidebarRef.nativeElement.offsetWidth\r\n this.sidebarWidth.set(newWidth)\r\n }\r\n }\r\n\r\n @HostListener('document:click', ['$event'])\r\n onClickOutside(event: Event) {\r\n if (window.innerWidth > 1191) return\r\n const sidebarEl = this.sidebarRef?.nativeElement\r\n const toggleButton = document.querySelector('app-vertical-header')\r\n\r\n if (this.isSidebarOpen() && sidebarEl &&\r\n !sidebarEl.contains(event.target as Node) &&\r\n !toggleButton?.contains(event.target as Node)) {\r\n this.isSidebarOpen.set(false)\r\n }\r\n }\r\n\r\n onSidebarHoverEnter() {\r\n if (window.innerWidth > 1191 && this.isSidebarOpen()) {\r\n this.isSidebarHovering.set(true)\r\n }\r\n }\r\n\r\n onSidebarHoverLeave() {\r\n if (window.innerWidth > 1191 && this.isSidebarOpen()) {\r\n this.isSidebarHovering.set(false)\r\n }\r\n }\r\n\r\n showBottomNav = computed<boolean>(() =>\r\n this.isMobileView() && !this.isSidebarOpen() && this.bottomMenuItems().length > 0\r\n )\r\n}\r\n","<ng-content select=\"[header]\" />\r\n\r\n<div [ngClass]=\"{'layout': true, 'open': isSidebarOpen()}\">\r\n <div #sidebar class=\"sidebar\" id=\"sidebar\" [ngClass]=\"isSidebarOpen() ? 'open' : ''\"\r\n (mouseenter)=\"onSidebarHoverEnter()\" (mouseleave)=\"onSidebarHoverLeave()\">\r\n <div class=\"sub-sidebar py-3\">\r\n <div class=\"user-profile\" [class.collapsed]=\"!isSidebarActuallyOpen\">\r\n <div class=\"user-info\" [class.user-info--hidden]=\"!isSidebarActuallyOpen\">\r\n <span class=\"fw-6 fs-7 truncate-text user-name\">{{ sessionData().nombreUser }}</span>\r\n <span class=\"truncate-text user-sucursal\">{{ nombreSucursal() }}</span>\r\n </div>\r\n @if (sessionData().sucursales.length > 1) {\r\n <button type=\"button\" class=\"btn-cambiar-sucursal\" title=\"Cambiar sucursal\" aria-label=\"Cambiar sucursal\"\r\n (click)=\"cambiarSucursal()\">\r\n <i class=\"fas fa-right-left\"></i>\r\n </button>\r\n }\r\n </div>\r\n </div>\r\n\r\n <div class=\"pt-3 px-2 list-menu-sidebar\">\r\n <ul class=\"list-unstyled\">\r\n @for (item of menuItems(); track $index) {\r\n <app-menu-item [item]=\"item\" [isSidebarOpen]=\"isSidebarOpen()\" [isSidebarHovering]=\"isSidebarHovering()\"\r\n [parentModuleName]=\"item.title\" [accentColor]=\"accentColor()\" [accesos]=\"sessionData().accesos\" [rolId]=\"sessionData().rolId\" />\r\n }\r\n </ul>\r\n </div>\r\n\r\n <div class=\"sidebar-footer text-center\" [class.sidebar-footer--hidden]=\"!isSidebarActuallyOpen\">\r\n <p> © {{ currentYear }} Grupo TSI - {{ sessionData().idCia }} </p>\r\n </div>\r\n </div>\r\n\r\n <div #contentContainer class=\"content\" [class.has-bottom-nav]=\"showBottomNav()\"\r\n [ngStyle]=\"{'background-color': 'var(--background-color)'}\">\r\n @if (showTabs()) {\r\n <app-tab-bar [moduleColors]=\"tabModuleColors()\" />\r\n }\r\n <div class=\"content-scroll\">\r\n <div class=\"container-fluid\" [class.route-fade-in]=\"routeAnimating()\">\r\n <router-outlet (activate)=\"onRouteActivate()\" />\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n@if (showBottomNav()) {\r\n<app-bottom-navigation [menuItems]=\"bottomMenuItems()\" [isVisible]=\"true\" />\r\n}\r\n<ng-content select=\"[chatbot]\" />\r\n","import { InjectionToken } from '@angular/core';\r\n\r\nexport interface ChatOption {\r\n label: string\r\n nextNodeId?: string\r\n response?: string\r\n}\r\n\r\nexport interface ChatNode {\r\n id: string\r\n message: string\r\n options?: ChatOption[]\r\n}\r\n\r\nexport interface ChatbotConfig {\r\n botName: string\r\n botAvatar?: string\r\n primaryColor?: string\r\n welcomeMessage: string\r\n nodes: ChatNode[]\r\n rootNodeId: string\r\n position?: 'bottom-right' | 'bottom-left'\r\n contactInfo?: string\r\n}\r\n\r\nexport interface ChatMessage {\r\n from: 'bot' | 'user'\r\n text: string\r\n options?: ChatOption[]\r\n optionsDisabled?: boolean\r\n}\r\n\r\nexport const CHATBOT_CONFIG = new InjectionToken<ChatbotConfig>('CHATBOT_CONFIG')\r\n","import { computed, Injectable, inject, signal } from '@angular/core';\r\nimport { CHATBOT_CONFIG, ChatMessage, ChatNode, ChatOption } from './chatbot.model';\r\n\r\n@Injectable()\r\n\r\nexport class ChatbotService {\r\n\r\n private config = inject(CHATBOT_CONFIG)\r\n\r\n messages = signal<ChatMessage[]>([])\r\n isTyping = signal(false)\r\n isOpen = signal(false)\r\n\r\n hasActiveConversation = computed(() => this.messages().length > 1)\r\n\r\n constructor() {\r\n this.init()\r\n }\r\n\r\n private getNode(id: string): ChatNode | null {\r\n return this.config.nodes.find(n => n.id === id)\r\n }\r\n\r\n private init(): void {\r\n const rootNode = this.getNode(this.config.rootNodeId)\r\n this.messages.set([{\r\n from: 'bot',\r\n text: this.config.welcomeMessage,\r\n options: rootNode?.options ?? [],\r\n optionsDisabled: false\r\n }])\r\n }\r\n\r\n open(): void {\r\n this.isOpen.set(true)\r\n }\r\n\r\n minimize(): void {\r\n this.isOpen.set(false)\r\n }\r\n\r\n close(): void {\r\n this.isOpen.set(false)\r\n this.init()\r\n }\r\n\r\n selectOption(option: ChatOption, messageIndex: number): void {\r\n this.messages.update(msgs =>\r\n msgs.map((m, i) => i === messageIndex ? { ...m, optionsDisabled: true } : m)\r\n )\r\n\r\n this.messages.update(msgs => [...msgs, { from: 'user', text: option.label }])\r\n\r\n this.isTyping.set(true)\r\n\r\n setTimeout(() => {\r\n this.isTyping.set(false)\r\n\r\n if (option.nextNodeId) {\r\n const nextNode = this.getNode(option.nextNodeId)\r\n if (nextNode) {\r\n this.messages.update(msgs => [...msgs, {\r\n from: 'bot',\r\n text: nextNode.message,\r\n options: nextNode.options ?? [],\r\n optionsDisabled: false\r\n }])\r\n }\r\n } else if (option.response) {\r\n this.messages.update(msgs => [\r\n ...msgs,\r\n { from: 'bot', text: option.response! },\r\n ...(this.config.contactInfo ? [{ from: 'bot' as const, text: this.config.contactInfo! }] : [])\r\n ])\r\n }\r\n }, 700)\r\n }\r\n\r\n restart(): void {\r\n this.init()\r\n }\r\n}\r\n","import { ChangeDetectionStrategy, Component, effect, ElementRef, inject, NgZone, signal, viewChild } from '@angular/core';\r\nimport { CHATBOT_CONFIG, ChatOption } from './chatbot.model';\r\nimport { ChatbotService } from './chatbot.service';\r\n\r\n@Component({\r\n selector: 'app-chatbot',\r\n templateUrl: './chatbot.component.html',\r\n styleUrl: './chatbot.component.scss',\r\n providers: [ChatbotService],\r\n changeDetection: ChangeDetectionStrategy.OnPush\r\n})\r\nexport class ChatbotComponent {\r\n\r\n protected service = inject(ChatbotService)\r\n protected config = inject(CHATBOT_CONFIG)\r\n private zone = inject(NgZone)\r\n\r\n private messagesEnd = viewChild<ElementRef>('messagesEnd')\r\n private wrapper = viewChild<ElementRef>('wrapper')\r\n\r\n position = signal<{ x: number; y: number } | null>(null)\r\n isDragging = signal<boolean>(false)\r\n openDir = signal<'above' | 'below'>('above')\r\n openHDir = signal<'left' | 'right'>('right')\r\n\r\n private dragOffset = { x: 0, y: 0 }\r\n private hasDragged = false\r\n\r\n constructor() {\r\n effect(() => {\r\n this.service.messages()\r\n this.service.isTyping()\r\n setTimeout(() => this.scrollToBottom(), 50)\r\n })\r\n }\r\n\r\n get primaryColor(): string { return this.config.primaryColor ?? '#c50048' }\r\n\r\n selectOption(option: ChatOption, index: number) { this.service.selectOption(option, index) }\r\n\r\n onFabClick() {\r\n if (!this.hasDragged) {\r\n this.calcOpenDirection()\r\n this.service.open()\r\n }\r\n this.hasDragged = false\r\n }\r\n\r\n private calcOpenDirection() {\r\n const el = this.wrapper()?.nativeElement as HTMLElement\r\n if (!el) return\r\n const rect = el.getBoundingClientRect()\r\n const WINDOW_H = 490\r\n const WINDOW_W = 320\r\n this.openDir.set(rect.top > WINDOW_H ? 'above' : 'below')\r\n this.openHDir.set(rect.left + WINDOW_W <= window.innerWidth ? 'right' : 'left')\r\n }\r\n\r\n startDrag(event: MouseEvent) {\r\n if ((event.target as HTMLElement).closest('.chatbot-header-actions')) return\r\n event.preventDefault()\r\n\r\n const el = this.wrapper()!.nativeElement as HTMLElement\r\n const rect = el.getBoundingClientRect()\r\n\r\n this.dragOffset = { x: event.clientX - rect.left, y: event.clientY - rect.top }\r\n this.hasDragged = false\r\n\r\n if (!this.position()) this.position.set({ x: rect.left, y: rect.top })\r\n\r\n this.isDragging.set(true)\r\n\r\n this.zone.runOutsideAngular(() => {\r\n document.addEventListener('mousemove', this.onDrag)\r\n document.addEventListener('mouseup', this.stopDrag)\r\n })\r\n }\r\n\r\n private onDrag = (event: MouseEvent) => {\r\n this.hasDragged = true\r\n const el = this.wrapper()!.nativeElement as HTMLElement\r\n const x = Math.max(0, Math.min(event.clientX - this.dragOffset.x, window.innerWidth - el.offsetWidth))\r\n const y = Math.max(0, Math.min(event.clientY - this.dragOffset.y, window.innerHeight - el.offsetHeight))\r\n this.zone.run(() => this.position.set({ x, y }))\r\n }\r\n\r\n private stopDrag = () => {\r\n this.zone.run(() => this.isDragging.set(false))\r\n document.removeEventListener('mousemove', this.onDrag)\r\n document.removeEventListener('mouseup', this.stopDrag)\r\n }\r\n\r\n private scrollToBottom() {\r\n this.messagesEnd()?.nativeElement.scrollIntoView({ behavior: 'smooth' })\r\n }\r\n}\r\n","<div #wrapper class=\"chatbot-wrapper\"\r\n [class.chatbot-left]=\"config.position === 'bottom-left'\"\r\n [class.chatbot-dragging]=\"isDragging()\"\r\n [style.--chatbot-primary]=\"primaryColor\"\r\n [style.left.px]=\"position()?.x\"\r\n [style.top.px]=\"position()?.y\"\r\n [style.right]=\"position() ? 'auto' : null\"\r\n [style.bottom]=\"position() ? 'auto' : null\">\r\n\r\n @if (!service.isOpen()) {\r\n <span class=\"chatbot-beta\">Beta</span>\r\n }\r\n <button class=\"chatbot-fab\"\r\n [class.chatbot-fab--hidden]=\"service.isOpen()\"\r\n (mousedown)=\"startDrag($event)\"\r\n (click)=\"onFabClick()\"\r\n title=\"Abrir asistente\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"26\" height=\"26\" fill=\"currentColor\" viewBox=\"0 0 24 24\">\r\n <path d=\"M12 2a2 2 0 0 1 2 2c0 .74-.4 1.39-1 1.73V7h1a7 7 0 0 1 7 7h1a1 1 0 0 1 1 1v3a1 1 0 0 1-1 1h-1v1a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-1H2a1 1 0 0 1-1-1v-3a1 1 0 0 1 1-1h1a7 7 0 0 1 7-7h1V5.73c-.6-.34-1-.99-1-1.73a2 2 0 0 1 2-2M7.5 13A2.5 2.5 0 0 0 5 15.5 2.5 2.5 0 0 0 7.5 18a2.5 2.5 0 0 0 2.5-2.5A2.5 2.5 0 0 0 7.5 13m9 0a2.5 2.5 0 0 0-2.5 2.5 2.5 2.5 0 0 0 2.5 2.5 2.5 2.5 0 0 0 2.5-2.5A2.5 2.5 0 0 0 16.5 13z\" />\r\n </svg>\r\n @if (service.hasActiveConversation()) {\r\n <span class=\"chatbot-badge\" title=\"Conversación en progreso\"></span>\r\n }\r\n </button>\r\n\r\n @if (service.isOpen()) {\r\n <div class=\"chatbot-window\"\r\n [class.open-above]=\"openDir() === 'above'\"\r\n [class.open-below]=\"openDir() === 'below'\"\r\n [class.open-right]=\"openHDir() === 'right'\"\r\n [class.open-left]=\"openHDir() === 'left'\">\r\n\r\n <div class=\"chatbot-header\" (mousedown)=\"startDrag($event)\">\r\n <div class=\"chatbot-header-info\">\r\n <span class=\"chatbot-avatar\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"22\" height=\"22\" fill=\"currentColor\" viewBox=\"0 0 24 24\">\r\n <path d=\"M12 2a2 2 0 0 1 2 2c0 .74-.4 1.39-1 1.73V7h1a7 7 0 0 1 7 7h1a1 1 0 0 1 1 1v3a1 1 0 0 1-1 1h-1v1a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-1H2a1 1 0 0 1-1-1v-3a1 1 0 0 1 1-1h1a7 7 0 0 1 7-7h1V5.73c-.6-.34-1-.99-1-1.73a2 2 0 0 1 2-2M7.5 13A2.5 2.5 0 0 0 5 15.5 2.5 2.5 0 0 0 7.5 18a2.5 2.5 0 0 0 2.5-2.5A2.5 2.5 0 0 0 7.5 13m9 0a2.5 2.5 0 0 0-2.5 2.5 2.5 2.5 0 0 0 2.5 2.5 2.5 2.5 0 0 0 2.5-2.5A2.5 2.5 0 0 0 16.5 13z\" />\r\n </svg>\r\n </span>\r\n <div>\r\n <div class=\"chatbot-name\">{{ config.botName || 'Asistente' }}</div>\r\n <div class=\"chatbot-status\">En línea</div>\r\n </div>\r\n </div>\r\n <div class=\"chatbot-header-actions\">\r\n <button class=\"chatbot-action-btn\" (click)=\"service.minimize()\" title=\"Minimizar\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" fill=\"currentColor\" viewBox=\"0 0 16 16\">\r\n <path d=\"M2 8a.5.5 0 0 1 .5-.5h11a.5.5 0 0 1 0 1h-11A.5.5 0 0 1 2 8z\" />\r\n </svg>\r\n </button>\r\n <button class=\"chatbot-action-btn\" (click)=\"service.close()\" title=\"Cerrar y reiniciar\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"13\" height=\"13\" fill=\"currentColor\" viewBox=\"0 0 16 16\">\r\n <path d=\"M2.146 2.854a.5.5 0 1 1 .708-.708L8 7.293l5.146-5.147a.5.5 0 0 1 .708.708L8.707 8l5.147 5.146a.5.5 0 0 1-.708.708L8 8.707l-5.146 5.147a.5.5 0 0 1-.708-.708L7.293 8z\" />\r\n </svg>\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <div class=\"chatbot-body\">\r\n @for (msg of service.messages(); track $index; let i = $index) {\r\n <div class=\"chat-row\" [class.chat-row-user]=\"msg.from === 'user'\">\r\n @if (msg.from === 'bot') {\r\n <span class=\"bot-icon\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" fill=\"currentColor\" viewBox=\"0 0 24 24\">\r\n <path d=\"M12 2a2 2 0 0 1 2 2c0 .74-.4 1.39-1 1.73V7h1a7 7 0 0 1 7 7h1a1 1 0 0 1 1 1v3a1 1 0 0 1-1 1h-1v1a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-1H2a1 1 0 0 1-1-1v-3a1 1 0 0 1 1-1h1a7 7 0 0 1 7-7h1V5.73c-.6-.34-1-.99-1-1.73a2 2 0 0 1 2-2M7.5 13A2.5 2.5 0 0 0 5 15.5 2.5 2.5 0 0 0 7.5 18a2.5 2.5 0 0 0 2.5-2.5A2.5 2.5 0 0 0 7.5 13m9 0a2.5 2.5 0 0 0-2.5 2.5 2.5 2.5 0 0 0 2.5 2.5 2.5 2.5 0 0 0 2.5-2.5A2.5 2.5 0 0 0 16.5 13z\" />\r\n </svg>\r\n </span>\r\n }\r\n <div class=\"chat-col\">\r\n <div class=\"message-bubble\" [class.bubble-bot]=\"msg.from === 'bot'\" [class.bubble-user]=\"msg.from === 'user'\">\r\n {{ msg.text }}\r\n </div>\r\n @if (msg.options && msg.options.length > 0) {\r\n <div class=\"options-container\">\r\n @for (opt of msg.options; track $index) {\r\n <button class=\"option-btn\" [disabled]=\"msg.optionsDisabled\" (click)=\"selectOption(opt, i)\">\r\n {{ opt.label }}\r\n </button>\r\n }\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n }\r\n\r\n @if (service.isTyping()) {\r\n <div class=\"chat-row\">\r\n <span class=\"bot-icon\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" fill=\"currentColor\" viewBox=\"0 0 24 24\">\r\n <path d=\"M12 2a2 2 0 0 1 2 2c0 .74-.4 1.39-1 1.73V7h1a7 7 0 0 1 7 7h1a1 1 0 0 1 1 1v3a1 1 0 0 1-1 1h-1v1a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-1H2a1 1 0 0 1-1-1v-3a1 1 0 0 1 1-1h1a7 7 0 0 1 7-7h1V5.73c-.6-.34-1-.99-1-1.73a2 2 0 0 1 2-2M7.5 13A2.5 2.5 0 0 0 5 15.5 2.5 2.5 0 0 0 7.5 18a2.5 2.5 0 0 0 2.5-2.5A2.5 2.5 0 0 0 7.5 13m9 0a2.5 2.5 0 0 0-2.5 2.5 2.5 2.5 0 0 0 2.5 2.5 2.5 2.5 0 0 0 2.5-2.5A2.5 2.5 0 0 0 16.5 13z\" />\r\n </svg>\r\n </span>\r\n <div class=\"message-bubble bubble-bot typing-bubble\">\r\n <span class=\"dot\"></span><span class=\"dot\"></span><span class=\"dot\"></span>\r\n </div>\r\n </div>\r\n }\r\n <div #messagesEnd></div>\r\n </div>\r\n\r\n <div class=\"chatbot-footer\">\r\n <button class=\"restart-btn\" (click)=\"service.restart()\">↺ Reiniciar conversación</button>\r\n </div>\r\n </div>\r\n }\r\n</div>\r\n","import { Location } from '@angular/common';\r\nimport { Component, inject } from '@angular/core';\r\nimport { RouterLink } from '@angular/router';\r\n\r\n@Component({\r\n selector: 'app-not-found',\r\n imports: [RouterLink],\r\n templateUrl: './not-found.component.html',\r\n styleUrl: './not-found.component.scss'\r\n})\r\nexport class NotFoundComponent {\r\n\r\n private location = inject(Location)\r\n\r\n onBack() {\r\n this.location.back();\r\n }\r\n}\r\n","<div class=\"nf-page d-flex align-items-center justify-content-center vh-100\">\r\n\r\n <!-- Blobs decorativos de fondo -->\r\n <div class=\"nf-blob nf-blob-1\"></div>\r\n <div class=\"nf-blob nf-blob-2\"></div>\r\n\r\n <div class=\"nf-card bg-white shadow-s text-center px-4 px-md-5 py-4 mx-3\">\r\n\r\n <!-- Ilustración: ventana con 404 y lupa buscando -->\r\n <svg class=\"nf-illustration\" viewBox=\"0 0 520 340\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" role=\"img\" aria-label=\"Página no encontrada\">\r\n <defs>\r\n <linearGradient id=\"nfGrad\" x1=\"0\" y1=\"0\" x2=\"1\" y2=\"1\">\r\n <stop offset=\"0%\" style=\"stop-color: var(--sidebar-accent)\" />\r\n <stop offset=\"100%\" style=\"stop-color: var(--sidebar-accent); stop-opacity: 0.55\" />\r\n </linearGradient>\r\n </defs>\r\n\r\n <!-- Órbita punteada de fondo -->\r\n <circle class=\"nf-orbit\" cx=\"260\" cy=\"170\" r=\"150\"\r\n stroke=\"var(--font-border-input)\" stroke-width=\"1.5\"\r\n stroke-dasharray=\"6 10\" opacity=\"0.7\" />\r\n\r\n <!-- Decoraciones flotantes -->\r\n <g class=\"nf-spark nf-spark-1\" stroke=\"var(--sidebar-accent)\" stroke-width=\"3\" stroke-linecap=\"round\">\r\n <path d=\"M92 78 v20 M82 88 h20\" />\r\n </g>\r\n <g class=\"nf-spark nf-spark-2\" stroke=\"var(--placeholder-color)\" stroke-width=\"3\" stroke-linecap=\"round\">\r\n <path d=\"M448 220 v16 M440 228 h16\" />\r\n </g>\r\n <circle class=\"nf-spark nf-spark-3\" cx=\"430\" cy=\"70\" r=\"6\" fill=\"var(--sidebar-accent)\" opacity=\"0.7\" />\r\n <circle class=\"nf-spark nf-spark-1\" cx=\"70\" cy=\"230\" r=\"5\" fill=\"var(--placeholder-color)\" opacity=\"0.7\" />\r\n <path class=\"nf-spark nf-spark-2\" d=\"M120 300 q8 -10 16 0 q8 10 16 0\"\r\n stroke=\"var(--font-border-input)\" stroke-width=\"3\" stroke-linecap=\"round\" fill=\"none\" />\r\n\r\n <!-- Ventana de navegador -->\r\n <g class=\"nf-window\">\r\n <rect x=\"120\" y=\"60\" width=\"280\" height=\"200\" rx=\"16\"\r\n fill=\"var(--background-input)\" stroke=\"var(--font-border-input)\" stroke-width=\"2\" />\r\n <!-- Barra superior -->\r\n <line x1=\"120\" y1=\"98\" x2=\"400\" y2=\"98\" stroke=\"var(--font-border-input)\" stroke-width=\"2\" />\r\n <circle cx=\"144\" cy=\"79\" r=\"5\" fill=\"var(--sidebar-accent)\" />\r\n <circle cx=\"162\" cy=\"79\" r=\"5\" fill=\"var(--placeholder-color)\" opacity=\"0.8\" />\r\n <circle cx=\"180\" cy=\"79\" r=\"5\" fill=\"var(--font-border-input)\" />\r\n <!-- Barra de dirección -->\r\n <rect x=\"200\" y=\"71\" width=\"184\" height=\"16\" rx=\"8\" fill=\"var(--font-border-input)\" opacity=\"0.5\" />\r\n\r\n <!-- 404 dentro de la ventana -->\r\n <text x=\"260\" y=\"188\" text-anchor=\"middle\" class=\"nf-404-text\" fill=\"url(#nfGrad)\">404</text>\r\n\r\n <!-- Líneas de contenido (skeleton) -->\r\n <rect x=\"180\" y=\"212\" width=\"160\" height=\"9\" rx=\"4.5\" fill=\"var(--font-border-input)\" opacity=\"0.7\" />\r\n <rect x=\"205\" y=\"230\" width=\"110\" height=\"9\" rx=\"4.5\" fill=\"var(--font-border-input)\" opacity=\"0.45\" />\r\n </g>\r\n\r\n <!-- Lupa buscando -->\r\n <g class=\"nf-lens\">\r\n <circle cx=\"352\" cy=\"238\" r=\"46\" fill=\"var(--background-card)\" fill-opacity=\"0.55\"\r\n stroke=\"url(#nfGrad)\" stroke-width=\"8\" />\r\n <line x1=\"386\" y1=\"272\" x2=\"424\" y2=\"310\" stroke=\"url(#nfGrad)\" stroke-width=\"14\" stroke-linecap=\"round\" />\r\n <!-- Signo de interrogación dentro de la lupa -->\r\n <path d=\"M340 224 q0 -14 13 -14 q13 0 13 12 q0 9 -10 13 q-3 1.5 -3 7\"\r\n stroke=\"var(--text-color)\" stroke-width=\"5\" stroke-linecap=\"round\" fill=\"none\" />\r\n <circle cx=\"353\" cy=\"256\" r=\"3.5\" fill=\"var(--text-color)\" />\r\n </g>\r\n </svg>\r\n\r\n <!-- Badge -->\r\n <span class=\"nf-badge fw-semibold\">ERROR 404</span>\r\n\r\n <h2 class=\"fw-semibold text-input mt-3\">Página no encontrada</h2>\r\n\r\n <p class=\"nf-desc fs-6 mt-2 mb-4 mx-auto\">\r\n Lo sentimos, la página que buscas no existe o fue movida.\r\n Verifica la dirección o regresa al inicio.\r\n </p>\r\n\r\n <!-- Acciones -->\r\n <div class=\"d-flex gap-3 justify-content-center flex-wrap\">\r\n <button type=\"button\" (click)=\"onBack()\" class=\"btn nf-btn-primary px-4 py-2 shadow\">\r\n <i class=\"fa-solid fa-arrow-left me-2\"></i>Volver\r\n </button>\r\n <a routerLink=\"/\" class=\"btn nf-btn-ghost text-dark px-4 py-2\">\r\n <i class=\"fa-solid fa-house me-2\"></i>Ir al inicio\r\n </a>\r\n </div>\r\n\r\n </div>\r\n</div>\r\n","import { NgClass, NgStyle } from '@angular/common';\r\nimport { Component, computed, input, output, signal } from '@angular/core';\r\nimport { DashboardItem, DonutSegmentItem } from '../../../models/general/dashboard.model';\r\n\r\n@Component({\r\n selector: 'app-dashboard-chart-donut',\r\n imports: [NgClass, NgStyle],\r\n template: `\r\n <div class=\"d-flex flex-column align-items-center py-1 px-2\">\r\n\r\n <!-- SVG ring -->\r\n <div style=\"position:relative; width:160px; height:160px; flex-shrink:0;\">\r\n <svg viewBox=\"0 0 200 200\" style=\"width:100%; height:100%;\">\r\n @for (seg of donutSegments(); track $index) {\r\n <circle cx=\"100\" cy=\"100\" r=\"70\" fill=\"none\"\r\n [attr.stroke]=\"seg.color\"\r\n stroke-width=\"42\"\r\n [attr.stroke-dasharray]=\"seg.strokeDasharray\"\r\n [attr.transform]=\"seg.transform\"\r\n style=\"cursor:pointer; transition:opacity .2s ease;\"\r\n [style.opacity]=\"hoveredIndex() === -1 || hoveredIndex() === $index ? '1' : '0.3'\"\r\n (mouseenter)=\"hoveredIndex.set($index)\"\r\n (mouseleave)=\"hoveredIndex.set(-1)\"\r\n (click)=\"clicked.emit(seg.item)\" />\r\n }\r\n </svg>\r\n\r\n <!-- Centro: cambia al hacer hover -->\r\n <div style=\"position:absolute; top:50%; left:50%; transform:translate(-50%,-50%);\r\n text-align:center; pointer-events:none; line-height:1.2; width:70px;\">\r\n <div style=\"font-size:1.4rem; font-weight:700; color:#fff; white-space:nowrap;\">\r\n {{ centerDisplay().value }}\r\n </div>\r\n <div style=\"font-size:.7rem; color:rgba(255,255,255,0.65); text-transform:uppercase; letter-spacing:.04em;\">\r\n {{ centerDisplay().sub }}\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Leyenda -->\r\n <ul class=\"list-unstyled m-0 w-100 mt-2\">\r\n @for (seg of donutSegments(); track $index) {\r\n <li class=\"d-flex align-items-start gap-2 mb-2\"\r\n style=\"cursor:pointer; transition:opacity .2s ease;\"\r\n [style.opacity]=\"hoveredIndex() === -1 || hoveredIndex() === $index ? '1' : '0.35'\"\r\n (mouseenter)=\"hoveredIndex.set($index)\"\r\n (mouseleave)=\"hoveredIndex.set(-1)\"\r\n (click)=\"clicked.emit(seg.item)\">\r\n <span class=\"rounded-circle flex-shrink-0 mt-1\"\r\n [ngStyle]=\"{ background: seg.color }\"\r\n style=\"width:9px; height:9px; display:inline-block;\">\r\n </span>\r\n <span [ngClass]=\"textClass()\" style=\"font-size:.75rem; line-height:1.3; flex:1;\">\r\n {{ seg.label }}\r\n </span>\r\n <span class=\"flex-shrink-0 px-1\"\r\n style=\"font-size:.75rem; font-weight:600; color:rgba(255,255,255,0.9); white-space:nowrap;\">\r\n {{ complemento() }}{{ seg.displayValue }}\r\n <span style=\"opacity:.7;\">({{ seg.percent }}%)</span>\r\n </span>\r\n </li>\r\n }\r\n </ul>\r\n\r\n </div>\r\n `\r\n})\r\nexport class DashboardChartDonutComponent {\r\n\r\n textClass = input<string>('text-white');\r\n complemento = input<string>('');\r\n\r\n data = input<any[]>([])\r\n keyValue = input<string>('value')\r\n keyDescri = input<string>('descri')\r\n palette = input<string[]>([])\r\n\r\n clicked = output<DashboardItem>();\r\n hoveredIndex = signal(-1);\r\n\r\n // ── Dona ──────────────────────────────────────────────────────────────────\r\n private readonly C = 2 * Math.PI * 70\r\n private readonly GAP = 2\r\n\r\n donutSegments = computed<DonutSegmentItem[]>(() => {\r\n const data = this.data()\r\n const palette = this.palette()\r\n const total = data.reduce((s, i) => s + (i[this.keyValue()] || 0), 0)\r\n if (total === 0) return []\r\n\r\n let cumPercent = 0\r\n return data.map((item, index) => {\r\n const val = item[this.keyValue()] || 0\r\n const percent = val / total\r\n const arcLength = Math.max(0, percent * this.C - this.GAP)\r\n const rotation = cumPercent * 360 - 90\r\n cumPercent += percent\r\n return {\r\n color: palette[index % palette.length],\r\n strokeDasharray: `${arcLength} ${this.C - arcLength}`,\r\n transform: `rotate(${rotation}, 100, 100)`,\r\n label: item[this.keyDescri()] ?? '',\r\n value: val,\r\n displayValue: String(val),\r\n percent: val > 0 ? (Math.round(percent * 100) < 1 ? '<1' : String(Math.round(percent * 100))) : '0',\r\n item,\r\n }\r\n })\r\n })\r\n\r\n centerDisplay = computed(() => {\r\n const idx = this.hoveredIndex();\r\n const segs = this.donutSegments();\r\n if (idx >= 0 && segs[idx]) {\r\n const s = segs[idx];\r\n return { value: s.displayValue, sub: s.percent + '%' };\r\n }\r\n const total = segs.reduce((acc, s) => acc + s.value, 0);\r\n return { value: String(total), sub: 'Total' };\r\n });\r\n}\r\n","import { NgClass, NgStyle } from '@angular/common';\r\nimport { Component, computed, input, output, signal } from '@angular/core';\r\nimport { DashboardItem } from '../../../models/general/dashboard.model';\r\n\r\ninterface HBarItem {\r\n x: number; y: number; w: number; barH: number; cy: number;\r\n tooltipX: number; tooltipY: number;\r\n value: number; displayValue: string; percent: string;\r\n label: string; color: string; item: any;\r\n}\r\n\r\ninterface HBarData {\r\n bars: HBarItem[];\r\n xTicks: { val: number; x: number }[];\r\n svgW: number;\r\n svgH: number;\r\n axisY: number;\r\n axisLft: number;\r\n svgRgt: number;\r\n svgTop: number;\r\n}\r\n\r\n@Component({\r\n selector: 'app-dashboard-chart-bars',\r\n imports: [NgClass, NgStyle],\r\n template: `\r\n <div class=\"d-flex flex-column align-items-center py-1 px-2\">\r\n\r\n <!-- SVG: barras horizontales + ejes -->\r\n <div style=\"width:100%;\">\r\n <svg [attr.viewBox]=\"'0 0 ' + chartData().svgW + ' ' + chartData().svgH\"\r\n style=\"width:100%; display:block; overflow:visible;\">\r\n\r\n <!-- Grid lines verticales + labels eje X -->\r\n @for (tick of chartData().xTicks; track tick.val) {\r\n <line [attr.x1]=\"tick.x\" [attr.y1]=\"chartData().svgTop\"\r\n [attr.x2]=\"tick.x\" [attr.y2]=\"chartData().axisY\"\r\n stroke=\"rgba(255,255,255,0.1)\" stroke-width=\"1\" />\r\n <text [attr.x]=\"tick.x\" [attr.y]=\"chartData().axisY + 10\"\r\n text-anchor=\"middle\" font-size=\"7\" fill=\"rgba(255,255,255,0.45)\"\r\n style=\"pointer-events:none;\">{{ tick.val }}</text>\r\n }\r\n\r\n <!-- Eje Y (izquierda) -->\r\n <line [attr.x1]=\"chartData().axisLft\" [attr.y1]=\"chartData().svgTop\"\r\n [attr.x2]=\"chartData().axisLft\" [attr.y2]=\"chartData().axisY\"\r\n stroke=\"rgba(255,255,255,0.35)\" stroke-width=\"1\" />\r\n\r\n <!-- Eje X (abajo) -->\r\n <line [attr.x1]=\"chartData().axisLft\" [attr.y1]=\"chartData().axisY\"\r\n [attr.x2]=\"chartData().svgRgt\" [attr.y2]=\"chartData().axisY\"\r\n stroke=\"rgba(255,255,255,0.35)\" stroke-width=\"1\" />\r\n\r\n <!-- Barras -->\r\n @for (bar of chartData().bars; track $index) {\r\n <rect [attr.x]=\"bar.x\" [attr.y]=\"bar.y\"\r\n [attr.width]=\"bar.w\" [attr.height]=\"bar.barH\"\r\n [attr.fill]=\"bar.color\" rx=\"3\"\r\n style=\"cursor:pointer; transition:opacity .2s ease;\"\r\n [style.opacity]=\"hoveredIndex() === -1 || hoveredIndex() === $index ? '1' : '0.25'\"\r\n (mouseenter)=\"hoveredIndex.set($index)\"\r\n (mouseleave)=\"hoveredIndex.set(-1)\"\r\n (click)=\"clicked.emit(bar.item)\" />\r\n }\r\n\r\n <!-- Tooltips (encima de todo) -->\r\n @for (bar of chartData().bars; track $index) {\r\n @if (hoveredIndex() === $index) {\r\n <g style=\"pointer-events:none;\">\r\n <rect [attr.x]=\"bar.tooltipX\" [attr.y]=\"bar.tooltipY\"\r\n width=\"46\" height=\"28\" rx=\"4\" fill=\"white\"\r\n style=\"filter:drop-shadow(0 2px 6px rgba(0,0,0,0.35));\" />\r\n <text [attr.x]=\"bar.tooltipX + 23\" [attr.y]=\"bar.tooltipY + 11\"\r\n text-anchor=\"middle\" font-size=\"9\" font-weight=\"700\" fill=\"#111\">\r\n {{ complemento() }}{{ bar.displayValue }}\r\n </text>\r\n <text [attr.x]=\"bar.tooltipX + 23\" [attr.y]=\"bar.tooltipY + 22\"\r\n text-anchor=\"middle\" font-size=\"8\" fill=\"#555\">\r\n {{ bar.percent }}%\r\n </text>\r\n </g>\r\n }\r\n }\r\n\r\n </svg>\r\n </div>\r\n\r\n <!-- Leyenda -->\r\n <ul class=\"list-unstyled m-0 w-100 mt-2\">\r\n @for (bar of chartData().bars; track $index) {\r\n <li class=\"d-flex align-items-start gap-2 mb-2\"\r\n style=\"cursor:pointer; transition:opacity .2s ease;\"\r\n [style.opacity]=\"hoveredIndex() === -1 || hoveredIndex() === $index ? '1' : '0.35'\"\r\n (mouseenter)=\"hoveredIndex.set($index)\"\r\n (mouseleave)=\"hoveredIndex.set(-1)\"\r\n (click)=\"clicked.emit(bar.item)\">\r\n <span class=\"flex-shrink-0 mt-1\"\r\n [ngStyle]=\"{ background: bar.color }\"\r\n style=\"width:9px; height:9px; display:inline-block; border-radius:2px;\">\r\n </span>\r\n <span [ngClass]=\"textClass()\" style=\"font-size:.75rem; line-height:1.3; flex:1;\">\r\n {{ bar.label }}\r\n </span>\r\n <span class=\"flex-shrink-0 px-1\"\r\n style=\"font-size:.75rem; font-weight:600; color:rgba(255,255,255,0.9); white-space:nowrap;\">\r\n {{ complemento() }}{{ bar.displayValue }}\r\n <span style=\"opacity:.7;\">({{ bar.percent }}%)</span>\r\n </span>\r\n </li>\r\n }\r\n </ul>\r\n\r\n </div>\r\n `\r\n})\r\nexport class DashboardChartBarsComponent {\r\n\r\n data = input.required<any[]>();\r\n maxValue = input<number>(null);\r\n keyValue = input<string>('value');\r\n keyDescri = input<string>('descri');\r\n palette = input<string[]>([]);\r\n textClass = input<string>('text-white');\r\n complemento = input<string>('');\r\n\r\n clicked = output<DashboardItem>();\r\n hoveredIndex = signal(-1);\r\n\r\n // ── Barras horizontales SVG ───────────────────────────────────────────────\r\n chartData = computed<HBarData>(() => {\r\n const data = this.data();\r\n const max = Number(this.maxValue());\r\n const palette = this.palette();\r\n const total = data.reduce((s, i) => s + (i[this.keyValue()] || 0), 0);\r\n\r\n const LFT = 6, RGT = 6, TOP = 4, BTM = 16, SLOT_H = 18, TICK_N = 4, SVG_W = 260;\r\n const BAR_H = Math.round(SLOT_H * 0.6);\r\n const chartW = SVG_W - LFT - RGT;\r\n const chartH = data.length * SLOT_H;\r\n const svgH = TOP + chartH + BTM;\r\n const axisY = TOP + chartH;\r\n\r\n const xTicks = Array.from({ length: TICK_N + 1 }, (_, i) => ({\r\n val: Math.round((i / TICK_N) * max),\r\n x: Math.round(LFT + (i / TICK_N) * chartW),\r\n }));\r\n\r\n const bars: HBarItem[] = data.map((item, i) => {\r\n const val = item[this.keyValue()] || 0;\r\n const w = max > 0 ? Math.max(2, Math.round((val / max) * chartW)) : 2;\r\n const y = TOP + i * SLOT_H + Math.round((SLOT_H - BAR_H) / 2);\r\n const cy = y + Math.round(BAR_H / 2);\r\n const tipX = Math.min(LFT + w + 4, SVG_W - 50);\r\n const tipY = Math.max(0, cy - 14);\r\n return {\r\n x: LFT, y, w, barH: BAR_H, cy,\r\n tooltipX: tipX, tooltipY: tipY,\r\n value: val, displayValue: String(val),\r\n percent: total > 0 ? (val > 0 ? (Math.round((val / total) * 100) < 1 ? '<1' : String(Math.round((val / total) * 100))) : '0') : '0',\r\n label: (item[this.keyDescri()] ?? '').toString(),\r\n color: palette[i % palette.length],\r\n item,\r\n };\r\n });\r\n\r\n return { bars, xTicks, svgW: SVG_W, svgH, axisY, axisLft: LFT, svgRgt: SVG_W - RGT, svgTop: TOP };\r\n });\r\n}\r\n","import { NgClass } from '@angular/common';\r\nimport { Component, computed, input, output, signal } from '@angular/core';\r\nimport { DashboardItem, ViewMode } from '../../../models/general/dashboard.model';\r\nimport { DashboardChartDonutComponent } from '../dashboard-chart-donut/dashboard-chart-donut.component';\r\nimport { DashboardChartBarsComponent } from '../dashboard-chart-bars/dashboard-chart-bars.component';\r\n\r\n@Component({\r\n selector: 'app-item-dashboard',\r\n imports: [NgClass, DashboardChartDonutComponent, DashboardChartBarsComponent],\r\n templateUrl: './item-dashboard.component.html',\r\n styleUrl: './item-dashboard.component.scss'\r\n})\r\nexport class ItemDashboardComponent {\r\n\r\n data = input<any[]>([])\r\n titulo = input<string>('')\r\n textClass = input<string>('text-white')\r\n colorClass = input<string>('')\r\n keyValue = input<string>('value')\r\n keyDescri = input<string>('descri')\r\n complemento = input<string>('')\r\n isDesplegable = input<boolean>(false)\r\n isLoading = input<boolean>(false)\r\n viewMode = input<ViewMode>('cards')\r\n\r\n showContent = signal<boolean>(false)\r\n\r\n emit = output<DashboardItem>()\r\n emitContent = output<string>()\r\n\r\n filteredData = computed(() =>\r\n this.data().filter(item => item[this.keyValue()] > 0)\r\n )\r\n\r\n totalItems = computed(() =>\r\n this.filteredData().reduce((sum, item) => sum + (item[this.keyValue()] || 0), 0)\r\n )\r\n\r\n maxValue = computed(() => {\r\n const vals = this.filteredData().map(item => item[this.keyValue()] || 0)\r\n return vals.length > 0 ? Math.max(...vals) : 1\r\n })\r\n\r\n // ── Paleta compartida entre dona y barras ──────────────────────────────────\r\n readonly palette = [\r\n '#ffffff', '#48dae4', '#06d6a0', '#ff9f1c',\r\n '#c77dff', '#fff06d', '#ef476f', '#b5e48c',\r\n ]\r\n\r\n getPercent(item: any): number {\r\n const max = this.maxValue()\r\n return max === 0 ? 0 : Math.round((item[this.keyValue()] / max) * 100)\r\n }\r\n\r\n toggleMostrar() {\r\n const before = this.showContent()\r\n this.showContent.update(v => !v)\r\n if (before) return\r\n this.emitContent.emit(this.titulo())\r\n }\r\n\r\n mover(item: DashboardItem) {\r\n this.emit.emit(item)\r\n }\r\n}\r\n","<div class=\"iv2-card mb-2\" [ngClass]=\"colorClass() ? colorClass() : 'bg-danger'\">\r\n\r\n <!-- ── HEADER ── -->\r\n <div class=\"iv2-header\">\r\n\r\n <div class=\"iv2-icon-dot\"></div>\r\n\r\n <div class=\"iv2-title-wrap\">\r\n <h5 class=\"iv2-title\" [ngClass]=\"textClass()\">{{ titulo() }}</h5>\r\n\r\n @if (!isLoading() && totalItems() > 0) {\r\n <span class=\"iv2-total-badge\">{{ totalItems() }}</span>\r\n }\r\n </div>\r\n\r\n @if (isDesplegable()) {\r\n <button class=\"iv2-toggle-btn\" [ngClass]=\"textClass()\" (click)=\"toggleMostrar()\"\r\n [attr.aria-expanded]=\"showContent()\">\r\n <svg class=\"iv2-chevron\" [class.iv2-chevron--open]=\"showContent()\"\r\n viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <polyline points=\"6 9 12 15 18 9\"></polyline>\r\n </svg>\r\n </button>\r\n }\r\n </div>\r\n\r\n <!-- ── CONTENIDO (expandible) ── -->\r\n <div class=\"iv2-content\" [class.iv2-content--expanded]=\"showContent() || !isDesplegable()\">\r\n <div class=\"iv2-inner\">\r\n\r\n <!-- SKELETON -->\r\n @if (isLoading()) {\r\n <div class=\"iv2-skeleton\">\r\n <div class=\"iv2-sk-row\">\r\n <div class=\"iv2-sk-line iv2-sk-line--long\" [ngClass]=\"colorClass() + '-line'\"></div>\r\n <div class=\"iv2-sk-line iv2-sk-line--short\" [ngClass]=\"colorClass() + '-line'\"></div>\r\n </div>\r\n <div class=\"iv2-sk-row mt-2\">\r\n <div class=\"iv2-sk-line iv2-sk-line--long\" [ngClass]=\"colorClass() + '-line'\"></div>\r\n <div class=\"iv2-sk-line iv2-sk-line--short\" [ngClass]=\"colorClass() + '-line'\"></div>\r\n </div>\r\n </div>\r\n\r\n } @else {\r\n\r\n <!-- ══ CARDS ══ -->\r\n @if (viewMode() === 'cards') {\r\n @if (filteredData().length > 0) {\r\n <ul class=\"iv2-list\">\r\n @for (item of filteredData(); track $index) {\r\n <li class=\"iv2-item\" [class.iv2-item--clickable]=\"item[keyValue()] > 0\"\r\n (click)=\"mover(item)\">\r\n <div class=\"iv2-item-info\">\r\n <span class=\"iv2-item-label\" [ngClass]=\"textClass()\">{{ item[keyDescri()] }}</span>\r\n <div class=\"iv2-bar-track\">\r\n <div class=\"iv2-bar-fill\" [style.width.%]=\"getPercent(item)\"></div>\r\n </div>\r\n </div>\r\n <div class=\"iv2-item-right\">\r\n <span class=\"iv2-value-badge\">{{ complemento() }}{{ item[keyValue()] }}</span>\r\n </div>\r\n </li>\r\n }\r\n </ul>\r\n } @else {\r\n <div class=\"iv2-empty\">\r\n <div class=\"iv2-empty-icon\"><svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg></div>\r\n <p class=\"iv2-empty-title\" [ngClass]=\"textClass()\">Todo al día</p>\r\n <p class=\"iv2-empty-sub\" [ngClass]=\"textClass()\">Sin pendientes por el momento</p>\r\n </div>\r\n }\r\n }\r\n\r\n <!-- ══ BARRAS ══ -->\r\n @if (viewMode() === 'bars') {\r\n @if (filteredData().length > 0) {\r\n <app-dashboard-chart-bars\r\n [data]=\"filteredData()\"\r\n [complemento]=\"complemento()\"\r\n [keyValue]=\"keyValue()\"\r\n [keyDescri]=\"keyDescri()\"\r\n [palette]=\"palette\"\r\n [maxValue]=\"maxValue()\"\r\n (clicked)=\"mover($event)\" />\r\n } @else {\r\n <div class=\"iv2-empty\">\r\n <div class=\"iv2-empty-icon\"><svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg></div>\r\n <p class=\"iv2-empty-title\" [ngClass]=\"textClass()\">Todo al día</p>\r\n <p class=\"iv2-empty-sub\" [ngClass]=\"textClass()\">Sin pendientes por el momento</p>\r\n </div>\r\n }\r\n }\r\n\r\n <!-- ══ DONA ══ -->\r\n @if (viewMode() === 'donut') {\r\n @if (filteredData().length > 0) {\r\n <app-dashboard-chart-donut\r\n [data]=\"filteredData()\"\r\n [textClass]=\"textClass()\"\r\n [complemento]=\"complemento()\"\r\n [keyValue]=\"keyValue()\"\r\n [keyDescri]=\"keyDescri()\"\r\n [palette]=\"palette\"\r\n (clicked)=\"mover($event)\" />\r\n } @else {\r\n <div class=\"iv2-empty\">\r\n <div class=\"iv2-empty-icon\"><svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg></div>\r\n <p class=\"iv2-empty-title\" [ngClass]=\"textClass()\">Todo al día</p>\r\n <p class=\"iv2-empty-sub\" [ngClass]=\"textClass()\">Sin pendientes por el momento</p>\r\n </div>\r\n }\r\n }\r\n\r\n }\r\n\r\n </div>\r\n </div>\r\n</div>\r\n","import { DecimalPipe, KeyValuePipe, NgClass } from '@angular/common';\r\nimport { Component, computed, input, output, signal } from '@angular/core';\r\nimport { DashboardItem, ViewMode } from '../../../models/general/dashboard.model';\r\n\r\n@Component({\r\n selector: 'app-item-dashboard-group',\r\n imports: [NgClass, KeyValuePipe, DecimalPipe],\r\n templateUrl: './item-dashboard-group.component.html',\r\n styleUrl: './item-dashboard-group.component.scss'\r\n})\r\nexport class ItemDashboardGroupComponent {\r\n\r\n data = input<DashboardItem[]>([])\r\n titulo = input<string>('')\r\n textClass = input<string>('text-white')\r\n colorClass = input<string>('')\r\n keyValue = input<string>('value')\r\n keyDescri = input<string>('descri')\r\n complemento = input<string>('')\r\n isDesplegable = input<boolean>(false)\r\n isLoading = input<boolean>(false)\r\n viewMode = input<ViewMode>('cards')\r\n\r\n showContent = signal<boolean>(false)\r\n\r\n emit = output<DashboardItem>()\r\n emitContent = output<string>()\r\n\r\n dataGroup = computed(() => this.groupBy<any>(this.data(), 'GROUP'))\r\n\r\n filteredDataGroup = computed(() => {\r\n const grouped = this.dataGroup()\r\n const result: Record<string, any[]> = {}\r\n for (const key of Object.keys(grouped)) {\r\n const items = grouped[key].filter((item: any) => item[this.keyValue()] > 0)\r\n if (items.length > 0) result[key] = items\r\n }\r\n return result\r\n })\r\n\r\n totalItems = computed(() =>\r\n this.data().reduce((sum, item: any) => sum + (item[this.keyValue()] || 0), 0)\r\n )\r\n\r\n maxValue = computed(() => {\r\n const vals = this.data()\r\n .filter((item: any) => item[this.keyValue()] > 0)\r\n .map((item: any) => item[this.keyValue()] || 0)\r\n return vals.length > 0 ? Math.max(...vals) : 1\r\n })\r\n\r\n hasData = computed(() => Object.keys(this.filteredDataGroup()).length > 0)\r\n\r\n getPercent(item: any): number {\r\n const max = this.maxValue()\r\n return max === 0 ? 0 : Math.round((item[this.keyValue()] / max) * 100)\r\n }\r\n\r\n toggleMostrar() {\r\n const before = this.showContent()\r\n this.showContent.update(v => !v)\r\n if (before) return\r\n this.emitContent.emit(this.titulo())\r\n }\r\n\r\n mover(item: DashboardItem) {\r\n this.emit.emit(item)\r\n }\r\n\r\n private groupBy<T>(array: T[], key: keyof T): Record<string, T[]> {\r\n return array.reduce((acc, item) => {\r\n const groupKey = String(item[key])\r\n if (!acc[groupKey]) acc[groupKey] = []\r\n acc[groupKey].push(item)\r\n return acc\r\n }, {} as Record<string, T[]>)\r\n }\r\n}\r\n","<div class=\"iv2-card mb-2\" [ngClass]=\"colorClass() ? colorClass() : 'bg-danger'\">\r\n\r\n <!-- ── HEADER ── -->\r\n <div class=\"iv2-header\">\r\n\r\n <div class=\"iv2-icon-dot\"></div>\r\n\r\n <div class=\"iv2-title-wrap\">\r\n <h5 class=\"iv2-title\" [ngClass]=\"textClass()\">{{ titulo() }}</h5>\r\n </div>\r\n\r\n @if (isDesplegable()) {\r\n <button class=\"iv2-toggle-btn\" [ngClass]=\"textClass()\" (click)=\"toggleMostrar()\"\r\n [attr.aria-expanded]=\"showContent()\">\r\n <svg class=\"iv2-chevron\" [class.iv2-chevron--open]=\"showContent()\" viewBox=\"0 0 24 24\" fill=\"none\"\r\n stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <polyline points=\"6 9 12 15 18 9\"></polyline>\r\n </svg>\r\n </button>\r\n }\r\n </div>\r\n\r\n <!-- ── CONTENIDO (expandible) ── -->\r\n <div class=\"iv2-content\" [class.iv2-content--expanded]=\"showContent() || !isDesplegable()\">\r\n <div class=\"iv2-inner\">\r\n\r\n <!-- SKELETON -->\r\n @if (isLoading()) {\r\n <div class=\"iv2-skeleton\">\r\n <div class=\"iv2-sk-row\">\r\n <div class=\"iv2-sk-line iv2-sk-line--long\" [ngClass]=\"colorClass() + '-line'\"></div>\r\n <div class=\"iv2-sk-line iv2-sk-line--short\" [ngClass]=\"colorClass() + '-line'\"></div>\r\n </div>\r\n <div class=\"iv2-sk-row mt-2\">\r\n <div class=\"iv2-sk-line iv2-sk-line--long\" [ngClass]=\"colorClass() + '-line'\"></div>\r\n <div class=\"iv2-sk-line iv2-sk-line--short\" [ngClass]=\"colorClass() + '-line'\"></div>\r\n </div>\r\n <div class=\"iv2-sk-row mt-2\">\r\n <div class=\"iv2-sk-line iv2-sk-line--long\" [ngClass]=\"colorClass() + '-line'\"></div>\r\n <div class=\"iv2-sk-line iv2-sk-line--short\" [ngClass]=\"colorClass() + '-line'\"></div>\r\n </div>\r\n </div>\r\n\r\n } @else {\r\n\r\n <!-- ══ CARDS ══ -->\r\n @if (viewMode() === 'cards') {\r\n @if (hasData()) {\r\n <ul class=\"iv2-list\">\r\n @for (group of filteredDataGroup() | keyvalue; track group.key) {\r\n\r\n <li class=\"iv2-group-header\">\r\n <span class=\"iv2-group-label\" [ngClass]=\"textClass()\">{{ group.key }}</span>\r\n <div class=\"iv2-group-divider\"></div>\r\n </li>\r\n\r\n @for (item of group.value; track $index) {\r\n <li class=\"iv2-item\" [class.iv2-item--clickable]=\"item[keyValue()] > 0\"\r\n (click)=\"item[keyValue()] > 0 && mover(item)\">\r\n <div class=\"iv2-item-info\">\r\n <span class=\"iv2-item-label\" [ngClass]=\"textClass()\">{{ item[keyDescri()] }}</span>\r\n <div class=\"iv2-bar-track\">\r\n <div class=\"iv2-bar-fill\" [style.width.%]=\"getPercent(item)\"></div>\r\n </div>\r\n </div>\r\n <div class=\"iv2-item-right\">\r\n <span class=\"iv2-value-badge\">{{ complemento() }}{{ item[keyValue()] | number: '1.2-2' }}</span>\r\n </div>\r\n </li>\r\n }\r\n\r\n }\r\n </ul>\r\n } @else {\r\n <div class=\"iv2-empty\">\r\n <div class=\"iv2-empty-icon\"><svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <polyline points=\"20 6 9 17 4 12\"></polyline>\r\n </svg></div>\r\n <p class=\"iv2-empty-title\" [ngClass]=\"textClass()\">Todo al día</p>\r\n <p class=\"iv2-empty-sub\" [ngClass]=\"textClass()\">Sin pendientes por el momento</p>\r\n </div>\r\n }\r\n }\r\n\r\n <!-- ══ BARRAS ══ -->\r\n @if (viewMode() === 'bars') {\r\n <div class=\"iv2-empty\">\r\n <div class=\"iv2-empty-icon\"><svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <polyline points=\"20 6 9 17 4 12\"></polyline>\r\n </svg></div>\r\n <p class=\"iv2-empty-title\" [ngClass]=\"textClass()\">En implementación</p>\r\n <p class=\"iv2-empty-sub\" [ngClass]=\"textClass()\">Muy pronto</p>\r\n </div>\r\n }\r\n\r\n <!-- ══ DONA ══ -->\r\n @if (viewMode() === 'donut') {\r\n <div class=\"iv2-empty\">\r\n <div class=\"iv2-empty-icon\"><svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <polyline points=\"20 6 9 17 4 12\"></polyline>\r\n </svg></div>\r\n <p class=\"iv2-empty-title\" [ngClass]=\"textClass()\">En implementación</p>\r\n <p class=\"iv2-empty-sub\" [ngClass]=\"textClass()\">Muy pronto</p>\r\n </div>\r\n }\r\n\r\n }\r\n\r\n </div>\r\n </div>\r\n</div>\r\n","import { Component, effect, input, output, signal } from '@angular/core';\r\nimport { ViewMode } from '../../../models/general/dashboard.model';\r\n\r\n// Duración de la animación de salida (@keyframes fabMiniOut en el scss): se\r\n// mantiene montado este tiempo antes de desmontarlo de verdad.\r\nconst LEAVE_DURATION_MS = 150\r\n\r\n@Component({\r\n selector: 'app-dashboard-view-switcher',\r\n imports: [],\r\n templateUrl: './dashboard-view-switcher.component.html',\r\n styleUrl: './dashboard-view-switcher.component.scss',\r\n})\r\nexport class DashboardViewSwitcherComponent {\r\n\r\n viewMode = input<ViewMode>('cards')\r\n accentColor = input<string>('#398bf7')\r\n\r\n viewModeChange = output<ViewMode>()\r\n\r\n fabOpen = signal(false)\r\n\r\n // Reemplaza a @fabMenu (query + stagger, sin @angular/animations): el\r\n // stagger se logra con animation-delay por :nth-child en el scss, y la\r\n // salida se maneja igual que en tab-bar (mantener montado + clase \"--closing\").\r\n fabRendered = signal(false)\r\n private closeTimer: ReturnType<typeof setTimeout> | null = null\r\n\r\n constructor() {\r\n effect(() => {\r\n if (this.fabOpen()) {\r\n if (this.closeTimer) {\r\n clearTimeout(this.closeTimer)\r\n this.closeTimer = null\r\n }\r\n this.fabRendered.set(true)\r\n } else if (this.fabRendered()) {\r\n this.closeTimer = setTimeout(() => this.fabRendered.set(false), LEAVE_DURATION_MS)\r\n }\r\n })\r\n }\r\n\r\n setView(mode: ViewMode) {\r\n this.viewModeChange.emit(mode)\r\n this.fabOpen.set(false)\r\n }\r\n}\r\n","<div class=\"view-fab\" [style.--fab-main-from]=\"accentColor()\" [style.--fab-main-to]=\"accentColor()\"\r\n [style.--fab-active-bg]=\"accentColor()\" [style.--fab-mini-hover-border]=\"accentColor()\"\r\n [style.--fab-mini-hover-color]=\"accentColor()\" (mouseenter)=\"fabOpen.set(true)\" (mouseleave)=\"fabOpen.set(false)\">\r\n @if (fabRendered()) {\r\n <div class=\"fab-menu\" [class.fab-menu--closing]=\"!fabOpen()\">\r\n\r\n <div class=\"fab-mini-wrap\">\r\n <span class=\"fab-tooltip\">Dona</span>\r\n <button class=\"fab-mini\" [class.active]=\"viewMode() === 'donut'\" (click)=\"setView('donut')\"\r\n title=\"Vista de dona\">\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <circle cx=\"12\" cy=\"12\" r=\"10\"></circle>\r\n <circle cx=\"12\" cy=\"12\" r=\"4\"></circle>\r\n </svg>\r\n </button>\r\n </div>\r\n\r\n <div class=\"fab-mini-wrap\">\r\n <span class=\"fab-tooltip\">Barras</span>\r\n <button class=\"fab-mini\" [class.active]=\"viewMode() === 'bars'\" (click)=\"setView('bars')\"\r\n title=\"Vista de barras\">\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\r\n <rect x=\"2\" y=\"13\" width=\"5\" height=\"9\" rx=\"1\"></rect>\r\n <rect x=\"9\" y=\"7\" width=\"5\" height=\"15\" rx=\"1\"></rect>\r\n <rect x=\"16\" y=\"3\" width=\"5\" height=\"19\" rx=\"1\"></rect>\r\n </svg>\r\n </button>\r\n </div>\r\n\r\n <div class=\"fab-mini-wrap\">\r\n <span class=\"fab-tooltip\">Tarjetas</span>\r\n <button class=\"fab-mini\" [class.active]=\"viewMode() === 'cards'\" (click)=\"setView('cards')\"\r\n title=\"Vista de tarjetas\">\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <rect x=\"3\" y=\"3\" width=\"7\" height=\"7\"></rect>\r\n <rect x=\"14\" y=\"3\" width=\"7\" height=\"7\"></rect>\r\n <rect x=\"3\" y=\"14\" width=\"7\" height=\"7\"></rect>\r\n <rect x=\"14\" y=\"14\" width=\"7\" height=\"7\"></rect>\r\n </svg>\r\n </button>\r\n </div>\r\n\r\n </div>\r\n }\r\n\r\n <button class=\"fab-main\" [class.is-open]=\"fabOpen()\" (click)=\"fabOpen.set(!fabOpen())\" title=\"Cambiar vista\">\r\n @switch (viewMode()) {\r\n @case ('cards') {\r\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <rect x=\"3\" y=\"3\" width=\"7\" height=\"7\"></rect>\r\n <rect x=\"14\" y=\"3\" width=\"7\" height=\"7\"></rect>\r\n <rect x=\"3\" y=\"14\" width=\"7\" height=\"7\"></rect>\r\n <rect x=\"14\" y=\"14\" width=\"7\" height=\"7\"></rect>\r\n </svg>\r\n }\r\n @case ('bars') {\r\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\r\n <rect x=\"2\" y=\"13\" width=\"5\" height=\"9\" rx=\"1\"></rect>\r\n <rect x=\"9\" y=\"7\" width=\"5\" height=\"15\" rx=\"1\"></rect>\r\n <rect x=\"16\" y=\"3\" width=\"5\" height=\"19\" rx=\"1\"></rect>\r\n </svg>\r\n }\r\n @case ('donut') {\r\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <circle cx=\"12\" cy=\"12\" r=\"10\"></circle>\r\n <circle cx=\"12\" cy=\"12\" r=\"4\"></circle>\r\n </svg>\r\n }\r\n }\r\n </button>\r\n</div>\r\n","/*\r\n * Public API Surface of layout-tsi\r\n */\r\n\r\n// SHELL (layout genérico: sidebar + header + menú)\r\nexport * from './lib/ui/full/full.component';\r\nexport * from './lib/ui/vertical-header/vertical-header.component';\r\nexport * from './lib/ui/menu-item/menu-item.component';\r\nexport * from './lib/ui/tab-bar/tab-bar.component';\r\nexport * from './lib/ui/bottom-navigation/bottom-navigation.component';\r\nexport * from './lib/ui/chatbot/chatbot.component';\r\nexport * from './lib/ui/chatbot/chatbot.model';\r\n\r\n// GENERAL PAGES\r\nexport * from './lib/ui/not-found/not-found.component';\r\n\r\n// DASHBOARD\r\nexport * from './lib/ui/dashboard/item-dashboard/item-dashboard.component';\r\nexport * from './lib/ui/dashboard/item-dashboard-group/item-dashboard-group.component';\r\nexport * from './lib/ui/dashboard/dashboard-chart-donut/dashboard-chart-donut.component';\r\nexport * from './lib/ui/dashboard/dashboard-chart-bars/dashboard-chart-bars.component';\r\nexport * from './lib/ui/dashboard/dashboard-view-switcher/dashboard-view-switcher.component';\r\n\r\n// SERVICES\r\nexport * from './lib/service/detector.service';\r\nexport * from './lib/service/menu.service';\r\nexport * from './lib/service/header-ui.service';\r\nexport * from './lib/service/tabs.service';\r\n\r\n// MODELS\r\nexport * from './lib/models/general/route-info.model';\r\nexport * from './lib/models/general/session-data.model';\r\nexport * from './lib/models/general/app-tab.model';\r\nexport * from './lib/models/general/dashboard.model';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["filter","map","LEAVE_DURATION_MS"],"mappings":"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"}
|