layout-tsi 0.0.1 → 0.0.2

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.
@@ -435,6 +435,8 @@ class MenuItemComponent {
435
435
  return;
436
436
  }
437
437
  if (this.item()?.submenu?.length > 0) {
438
+ if (this.isCollapsedMode)
439
+ return;
438
440
  this.open.set(!this.open());
439
441
  this.menuService.setOpenMenu(this.level(), this.open() ? this.getItemId() : null);
440
442
  }
@@ -499,11 +501,11 @@ class MenuItemComponent {
499
501
  return item.path;
500
502
  }
501
503
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.25", ngImport: i0, type: MenuItemComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
502
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.25", type: MenuItemComponent, isStandalone: true, selector: "app-menu-item", inputs: { item: { classPropertyName: "item", publicName: "item", isSignal: true, isRequired: true, transformFunction: null }, isSidebarOpen: { classPropertyName: "isSidebarOpen", publicName: "isSidebarOpen", isSignal: true, isRequired: false, transformFunction: null }, isSidebarHovering: { classPropertyName: "isSidebarHovering", publicName: "isSidebarHovering", isSignal: true, isRequired: false, transformFunction: null }, level: { classPropertyName: "level", publicName: "level", isSignal: true, isRequired: false, transformFunction: null }, parentModuleName: { classPropertyName: "parentModuleName", publicName: "parentModuleName", isSignal: true, isRequired: false, transformFunction: null }, accentColor: { classPropertyName: "accentColor", publicName: "accentColor", isSignal: true, isRequired: false, transformFunction: null }, accesos: { classPropertyName: "accesos", publicName: "accesos", isSignal: true, isRequired: false, transformFunction: null }, rolId: { classPropertyName: "rolId", publicName: "rolId", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: "@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", styles: [".active-route{color:var(--sidebar-active-text)!important;background:linear-gradient(90deg,#ffffff24,#ffffff0a)!important;border-left:3px solid var(--sidebar-accent, #c50048)!important;border-radius:0 8px 8px 0!important;box-shadow:inset 0 1px #ffffff0f!important}.cursor-drow{cursor:default}.submenu{transform-origin:top;animation:submenuIn .26s cubic-bezier(.4,0,.2,1) both}.submenu--closing{animation:submenuOut .22s cubic-bezier(.4,0,.2,1) both}@keyframes submenuIn{0%{opacity:0;transform:translateY(-8px) scaleY(.94)}to{opacity:1;transform:translateY(0) scaleY(1)}}@keyframes submenuOut{0%{opacity:1;transform:translateY(0) scaleY(1)}to{opacity:0;transform:translateY(-8px) scaleY(.94)}}.acceso-tooltip-fixed{position:fixed;z-index:99999;transform:translateY(-50%);pointer-events:none;padding:4px 10px 4px 8px;border-radius:6px;font-family:monospace;white-space:nowrap;background:#0f0f14;border:1px solid rgba(255,255,255,.07);border-left:2px solid var(--sidebar-accent, #c50048);display:flex;align-items:center;gap:5px;animation:tooltipFadeIn .14s cubic-bezier(.25,.46,.45,.94)}.acceso-tooltip-fixed .tooltip-label{font-size:10px;font-weight:400;color:#fff;letter-spacing:.3px}.acceso-tooltip-fixed .tooltip-value{font-size:11px;font-weight:700;color:var(--sidebar-accent, #c50048)}.acceso-tooltip-fixed:before{content:\"\";position:absolute;right:100%;top:50%;transform:translateY(-50%);border:4px solid transparent;border-right-color:var(--sidebar-accent, #c50048)}@keyframes tooltipFadeIn{0%{opacity:0;transform:translateY(-50%) translate(-4px)}to{opacity:1;transform:translateY(-50%) translate(0)}}.sidebar-text{display:inline-block;vertical-align:middle;white-space:normal;word-break:break-word;opacity:1;transform:translate(0);transition:opacity .15s ease .22s,transform .15s ease .22s}.sidebar-text--hidden{opacity:0;transform:translate(-4px);white-space:nowrap;max-width:0;overflow:hidden;transition:opacity .12s ease 0s,transform .12s ease 0s,max-width 0s linear .12s}.sidebar-chevron{opacity:1;transition:opacity .15s ease .22s}.sidebar-chevron--hidden{opacity:0;transition:opacity .12s ease 0s}.item-sidebar{color:var(--sidebar-text-color)!important;transition:all .2s ease;border-radius:8px}.item-sidebar>span:first-child{min-width:0;flex:1}.item-sidebar:hover{color:var(--sidebar-active-text)!important;background:#ffffff17!important;transform:translate(2px)}.sidebar-flyout{position:fixed;left:70px;z-index:9999;min-width:220px;max-width:300px;overflow-y:auto;scrollbar-width:none;background:linear-gradient(160deg,var(--sidebar-gradient-start, #1a1a2e) 0%,var(--sidebar-bg, #16213e) 100%);border:1px solid rgba(255,255,255,.1);border-left:3px solid var(--flyout-accent, #c50048);border-radius:0 12px 12px;box-shadow:8px 6px 32px #0000008c,0 0 0 1px #ffffff0a;animation:flyout-slide-in .15s cubic-bezier(.25,.46,.45,.94);pointer-events:auto}.sidebar-flyout--closing{animation:flyout-slide-out .13s ease-in both}@keyframes flyout-slide-out{0%{opacity:1;transform:translate(0)}to{opacity:0;transform:translate(-8px)}}.flyout-header{display:flex;align-items:center;gap:10px;padding:12px 16px 10px;border-bottom:1px solid rgba(255,255,255,.08);background:#ffffff0a}.flyout-header-icon{color:var(--flyout-accent, #c50048);font-size:14px;min-width:16px;text-align:center}.flyout-header-title{font-size:12px;font-weight:700;color:var(--sidebar-active-text, #fff);letter-spacing:.5px;text-transform:uppercase;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;flex:1}.flyout-header-acceso{font-size:10px;font-weight:700;font-family:monospace;color:var(--flyout-accent, #c50048);background:#ffffff12;border:1px solid rgba(255,255,255,.1);border-left:2px solid var(--flyout-accent, #c50048);padding:2px 7px;border-radius:4px;white-space:nowrap;flex-shrink:0}.flyout-items{padding:6px;margin:0}.flyout-item{display:flex;align-items:center;gap:10px;padding:8px 12px;border-radius:8px;cursor:pointer;color:var(--sidebar-text-color, rgba(255, 255, 255, .7));font-size:13px;transition:background .15s ease,color .15s ease,transform .15s ease;white-space:nowrap;overflow:hidden;position:relative}.flyout-item:hover{background:#ffffff1a;color:var(--sidebar-active-text, #fff);transform:translate(3px)}.flyout-item-active{background:linear-gradient(90deg,#ffffff21,#ffffff08)!important;color:var(--sidebar-active-text, #fff)!important}.flyout-item-active:before{content:\"\";position:absolute;left:0;top:15%;height:70%;width:3px;background:var(--flyout-accent, #c50048);border-radius:0 2px 2px 0}.flyout-item-icon{font-size:12px;min-width:14px;text-align:center;color:inherit;opacity:.75}.flyout-item-label{flex:1;overflow:hidden;text-overflow:ellipsis}.flyout-chevron{font-size:10px;opacity:.5;margin-left:auto;flex-shrink:0;transition:transform .2s ease}.flyout-group{display:flex;flex-direction:column}.flyout-item-has-children{cursor:default}.flyout-item-expanded{background:#ffffff12!important;color:var(--sidebar-active-text, #fff)!important}.flyout-subitems{padding:2px 6px 2px 14px;border-left:2px solid rgba(255,255,255,.1);margin:0 6px 4px 20px}.flyout-subitem{display:flex;align-items:center;gap:8px;padding:7px 10px;border-radius:6px;cursor:pointer;color:var(--sidebar-text-color, rgba(255, 255, 255, .65));font-size:12px;transition:background .15s ease,color .15s ease,transform .15s ease;white-space:nowrap;overflow:hidden}.flyout-subitem:hover{background:#ffffff17;color:var(--sidebar-active-text, #fff);transform:translate(2px)}.flyout-subitem-active{color:var(--sidebar-active-text, #fff)!important;position:relative}.flyout-subitem-active:before{content:\"\";position:absolute;left:-14px;top:20%;height:60%;width:2px;background:var(--flyout-accent, #c50048);border-radius:1px}@keyframes flyout-slide-in{0%{opacity:0;transform:translate(-10px)}to{opacity:1;transform:translate(0)}}\n"], dependencies: [{ kind: "component", type: MenuItemComponent, selector: "app-menu-item", inputs: ["item", "isSidebarOpen", "isSidebarHovering", "level", "parentModuleName", "accentColor", "accesos", "rolId"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
504
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.25", type: MenuItemComponent, isStandalone: true, selector: "app-menu-item", inputs: { item: { classPropertyName: "item", publicName: "item", isSignal: true, isRequired: true, transformFunction: null }, isSidebarOpen: { classPropertyName: "isSidebarOpen", publicName: "isSidebarOpen", isSignal: true, isRequired: false, transformFunction: null }, isSidebarHovering: { classPropertyName: "isSidebarHovering", publicName: "isSidebarHovering", isSignal: true, isRequired: false, transformFunction: null }, level: { classPropertyName: "level", publicName: "level", isSignal: true, isRequired: false, transformFunction: null }, parentModuleName: { classPropertyName: "parentModuleName", publicName: "parentModuleName", isSignal: true, isRequired: false, transformFunction: null }, accentColor: { classPropertyName: "accentColor", publicName: "accentColor", isSignal: true, isRequired: false, transformFunction: null }, accesos: { classPropertyName: "accesos", publicName: "accesos", isSignal: true, isRequired: false, transformFunction: null }, rolId: { classPropertyName: "rolId", publicName: "rolId", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: "@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", styles: [".active-route{color:var(--sidebar-active-text)!important;background:linear-gradient(90deg,#ffffff24,#ffffff0a)!important;border-left:3px solid var(--sidebar-accent, #c50048)!important;border-radius:0 8px 8px 0!important;box-shadow:inset 0 1px #ffffff0f!important}.cursor-drow{cursor:default}.submenu{transform-origin:top;animation:submenuIn .26s cubic-bezier(.4,0,.2,1) both}.submenu--closing{animation:submenuOut .22s cubic-bezier(.4,0,.2,1) both}@keyframes submenuIn{0%{opacity:0;transform:translateY(-8px) scaleY(.94)}to{opacity:1;transform:translateY(0) scaleY(1)}}@keyframes submenuOut{0%{opacity:1;transform:translateY(0) scaleY(1)}to{opacity:0;transform:translateY(-8px) scaleY(.94)}}.acceso-tooltip-fixed{position:fixed;z-index:99999;transform:translateY(-50%);pointer-events:none;padding:4px 10px 4px 8px;border-radius:6px;font-family:monospace;white-space:nowrap;background:#0f0f14;border:1px solid rgba(255,255,255,.07);border-left:2px solid var(--sidebar-accent, #c50048);display:flex;align-items:center;gap:5px;animation:tooltipFadeIn .14s cubic-bezier(.25,.46,.45,.94)}.acceso-tooltip-fixed .tooltip-label{font-size:10px;font-weight:400;color:#fff;letter-spacing:.3px}.acceso-tooltip-fixed .tooltip-value{font-size:11px;font-weight:700;color:var(--sidebar-accent, #c50048)}.acceso-tooltip-fixed:before{content:\"\";position:absolute;right:100%;top:50%;transform:translateY(-50%);border:4px solid transparent;border-right-color:var(--sidebar-accent, #c50048)}@keyframes tooltipFadeIn{0%{opacity:0;transform:translateY(-50%) translate(-4px)}to{opacity:1;transform:translateY(-50%) translate(0)}}.sidebar-text{display:inline-block;vertical-align:middle;white-space:normal;word-break:break-word;opacity:1;transform:translate(0);transition:opacity .15s ease .22s,transform .15s ease .22s}.sidebar-text--hidden{opacity:0;transform:translate(-4px);white-space:nowrap;max-width:0;overflow:hidden;transition:opacity .12s ease 0s,transform .12s ease 0s,max-width 0s linear .12s}.sidebar-chevron{opacity:1;transition:opacity .15s ease .22s}.sidebar-chevron--hidden{opacity:0;transition:opacity .12s ease 0s}.item-sidebar{color:var(--sidebar-text-color)!important;transition:all .2s ease;border-radius:8px}.item-sidebar>span:first-child{min-width:0;flex:1}.item-sidebar:hover{color:var(--sidebar-active-text)!important;background:#ffffff17!important;transform:translate(2px)}:host-context(.sidebar.open) .item-sidebar{border-radius:8px 0 0 8px;margin-right:-8px}:host-context(.sidebar.open) .item-sidebar:hover{transform:none}:host-context(.sidebar.open) .item-sidebar.active-route{border-radius:0!important;background:#ffffff24!important}.sidebar-flyout{position:fixed;left:70px;z-index:9999;min-width:220px;max-width:300px;overflow-y:auto;scrollbar-width:none;background:linear-gradient(160deg,var(--sidebar-gradient-start, #1a1a2e) 0%,var(--sidebar-bg, #16213e) 100%);border:1px solid rgba(255,255,255,.1);border-left:3px solid var(--flyout-accent, #c50048);border-radius:0 12px 12px;box-shadow:8px 6px 32px #0000008c,0 0 0 1px #ffffff0a;animation:flyout-slide-in .15s cubic-bezier(.25,.46,.45,.94);pointer-events:auto}.sidebar-flyout--closing{animation:flyout-slide-out .13s ease-in both}@keyframes flyout-slide-out{0%{opacity:1;transform:translate(0)}to{opacity:0;transform:translate(-8px)}}.flyout-header{display:flex;align-items:center;gap:10px;padding:12px 16px 10px;border-bottom:1px solid rgba(255,255,255,.08);background:#ffffff0a}.flyout-header-icon{color:var(--flyout-accent, #c50048);font-size:14px;min-width:16px;text-align:center}.flyout-header-title{font-size:12px;font-weight:700;color:var(--sidebar-active-text, #fff);letter-spacing:.5px;text-transform:uppercase;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;flex:1}.flyout-header-acceso{font-size:10px;font-weight:700;font-family:monospace;color:var(--flyout-accent, #c50048);background:#ffffff12;border:1px solid rgba(255,255,255,.1);border-left:2px solid var(--flyout-accent, #c50048);padding:2px 7px;border-radius:4px;white-space:nowrap;flex-shrink:0}.flyout-items{padding:6px;margin:0}.flyout-item{display:flex;align-items:center;gap:10px;padding:8px 12px;border-radius:8px;cursor:pointer;color:var(--sidebar-text-color, rgba(255, 255, 255, .7));font-size:13px;transition:background .15s ease,color .15s ease,transform .15s ease;white-space:nowrap;overflow:hidden;position:relative}.flyout-item:hover{background:#ffffff1a;color:var(--sidebar-active-text, #fff);transform:translate(3px)}.flyout-item-active{background:linear-gradient(90deg,#ffffff21,#ffffff08)!important;color:var(--sidebar-active-text, #fff)!important}.flyout-item-active:before{content:\"\";position:absolute;left:0;top:15%;height:70%;width:3px;background:var(--flyout-accent, #c50048);border-radius:0 2px 2px 0}.flyout-item-icon{font-size:12px;min-width:14px;text-align:center;color:inherit;opacity:.75}.flyout-item-label{flex:1;overflow:hidden;text-overflow:ellipsis}.flyout-chevron{font-size:10px;opacity:.5;margin-left:auto;flex-shrink:0;transition:transform .2s ease}.flyout-group{display:flex;flex-direction:column}.flyout-item-has-children{cursor:default}.flyout-item-expanded{background:#ffffff12!important;color:var(--sidebar-active-text, #fff)!important}.flyout-subitems{padding:2px 6px 2px 14px;border-left:2px solid rgba(255,255,255,.1);margin:0 6px 4px 20px}.flyout-subitem{display:flex;align-items:center;gap:8px;padding:7px 10px;border-radius:6px;cursor:pointer;color:var(--sidebar-text-color, rgba(255, 255, 255, .65));font-size:12px;transition:background .15s ease,color .15s ease,transform .15s ease;white-space:nowrap;overflow:hidden}.flyout-subitem:hover{background:#ffffff17;color:var(--sidebar-active-text, #fff);transform:translate(2px)}.flyout-subitem-active{color:var(--sidebar-active-text, #fff)!important;position:relative}.flyout-subitem-active:before{content:\"\";position:absolute;left:-14px;top:20%;height:60%;width:2px;background:var(--flyout-accent, #c50048);border-radius:1px}@keyframes flyout-slide-in{0%{opacity:0;transform:translate(-10px)}to{opacity:1;transform:translate(0)}}\n"], dependencies: [{ kind: "component", type: MenuItemComponent, selector: "app-menu-item", inputs: ["item", "isSidebarOpen", "isSidebarHovering", "level", "parentModuleName", "accentColor", "accesos", "rolId"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
503
505
  }
504
506
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.25", ngImport: i0, type: MenuItemComponent, decorators: [{
505
507
  type: Component,
506
- args: [{ selector: 'app-menu-item', imports: [NgClass, RouterLink], changeDetection: ChangeDetectionStrategy.OnPush, template: "@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", styles: [".active-route{color:var(--sidebar-active-text)!important;background:linear-gradient(90deg,#ffffff24,#ffffff0a)!important;border-left:3px solid var(--sidebar-accent, #c50048)!important;border-radius:0 8px 8px 0!important;box-shadow:inset 0 1px #ffffff0f!important}.cursor-drow{cursor:default}.submenu{transform-origin:top;animation:submenuIn .26s cubic-bezier(.4,0,.2,1) both}.submenu--closing{animation:submenuOut .22s cubic-bezier(.4,0,.2,1) both}@keyframes submenuIn{0%{opacity:0;transform:translateY(-8px) scaleY(.94)}to{opacity:1;transform:translateY(0) scaleY(1)}}@keyframes submenuOut{0%{opacity:1;transform:translateY(0) scaleY(1)}to{opacity:0;transform:translateY(-8px) scaleY(.94)}}.acceso-tooltip-fixed{position:fixed;z-index:99999;transform:translateY(-50%);pointer-events:none;padding:4px 10px 4px 8px;border-radius:6px;font-family:monospace;white-space:nowrap;background:#0f0f14;border:1px solid rgba(255,255,255,.07);border-left:2px solid var(--sidebar-accent, #c50048);display:flex;align-items:center;gap:5px;animation:tooltipFadeIn .14s cubic-bezier(.25,.46,.45,.94)}.acceso-tooltip-fixed .tooltip-label{font-size:10px;font-weight:400;color:#fff;letter-spacing:.3px}.acceso-tooltip-fixed .tooltip-value{font-size:11px;font-weight:700;color:var(--sidebar-accent, #c50048)}.acceso-tooltip-fixed:before{content:\"\";position:absolute;right:100%;top:50%;transform:translateY(-50%);border:4px solid transparent;border-right-color:var(--sidebar-accent, #c50048)}@keyframes tooltipFadeIn{0%{opacity:0;transform:translateY(-50%) translate(-4px)}to{opacity:1;transform:translateY(-50%) translate(0)}}.sidebar-text{display:inline-block;vertical-align:middle;white-space:normal;word-break:break-word;opacity:1;transform:translate(0);transition:opacity .15s ease .22s,transform .15s ease .22s}.sidebar-text--hidden{opacity:0;transform:translate(-4px);white-space:nowrap;max-width:0;overflow:hidden;transition:opacity .12s ease 0s,transform .12s ease 0s,max-width 0s linear .12s}.sidebar-chevron{opacity:1;transition:opacity .15s ease .22s}.sidebar-chevron--hidden{opacity:0;transition:opacity .12s ease 0s}.item-sidebar{color:var(--sidebar-text-color)!important;transition:all .2s ease;border-radius:8px}.item-sidebar>span:first-child{min-width:0;flex:1}.item-sidebar:hover{color:var(--sidebar-active-text)!important;background:#ffffff17!important;transform:translate(2px)}.sidebar-flyout{position:fixed;left:70px;z-index:9999;min-width:220px;max-width:300px;overflow-y:auto;scrollbar-width:none;background:linear-gradient(160deg,var(--sidebar-gradient-start, #1a1a2e) 0%,var(--sidebar-bg, #16213e) 100%);border:1px solid rgba(255,255,255,.1);border-left:3px solid var(--flyout-accent, #c50048);border-radius:0 12px 12px;box-shadow:8px 6px 32px #0000008c,0 0 0 1px #ffffff0a;animation:flyout-slide-in .15s cubic-bezier(.25,.46,.45,.94);pointer-events:auto}.sidebar-flyout--closing{animation:flyout-slide-out .13s ease-in both}@keyframes flyout-slide-out{0%{opacity:1;transform:translate(0)}to{opacity:0;transform:translate(-8px)}}.flyout-header{display:flex;align-items:center;gap:10px;padding:12px 16px 10px;border-bottom:1px solid rgba(255,255,255,.08);background:#ffffff0a}.flyout-header-icon{color:var(--flyout-accent, #c50048);font-size:14px;min-width:16px;text-align:center}.flyout-header-title{font-size:12px;font-weight:700;color:var(--sidebar-active-text, #fff);letter-spacing:.5px;text-transform:uppercase;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;flex:1}.flyout-header-acceso{font-size:10px;font-weight:700;font-family:monospace;color:var(--flyout-accent, #c50048);background:#ffffff12;border:1px solid rgba(255,255,255,.1);border-left:2px solid var(--flyout-accent, #c50048);padding:2px 7px;border-radius:4px;white-space:nowrap;flex-shrink:0}.flyout-items{padding:6px;margin:0}.flyout-item{display:flex;align-items:center;gap:10px;padding:8px 12px;border-radius:8px;cursor:pointer;color:var(--sidebar-text-color, rgba(255, 255, 255, .7));font-size:13px;transition:background .15s ease,color .15s ease,transform .15s ease;white-space:nowrap;overflow:hidden;position:relative}.flyout-item:hover{background:#ffffff1a;color:var(--sidebar-active-text, #fff);transform:translate(3px)}.flyout-item-active{background:linear-gradient(90deg,#ffffff21,#ffffff08)!important;color:var(--sidebar-active-text, #fff)!important}.flyout-item-active:before{content:\"\";position:absolute;left:0;top:15%;height:70%;width:3px;background:var(--flyout-accent, #c50048);border-radius:0 2px 2px 0}.flyout-item-icon{font-size:12px;min-width:14px;text-align:center;color:inherit;opacity:.75}.flyout-item-label{flex:1;overflow:hidden;text-overflow:ellipsis}.flyout-chevron{font-size:10px;opacity:.5;margin-left:auto;flex-shrink:0;transition:transform .2s ease}.flyout-group{display:flex;flex-direction:column}.flyout-item-has-children{cursor:default}.flyout-item-expanded{background:#ffffff12!important;color:var(--sidebar-active-text, #fff)!important}.flyout-subitems{padding:2px 6px 2px 14px;border-left:2px solid rgba(255,255,255,.1);margin:0 6px 4px 20px}.flyout-subitem{display:flex;align-items:center;gap:8px;padding:7px 10px;border-radius:6px;cursor:pointer;color:var(--sidebar-text-color, rgba(255, 255, 255, .65));font-size:12px;transition:background .15s ease,color .15s ease,transform .15s ease;white-space:nowrap;overflow:hidden}.flyout-subitem:hover{background:#ffffff17;color:var(--sidebar-active-text, #fff);transform:translate(2px)}.flyout-subitem-active{color:var(--sidebar-active-text, #fff)!important;position:relative}.flyout-subitem-active:before{content:\"\";position:absolute;left:-14px;top:20%;height:60%;width:2px;background:var(--flyout-accent, #c50048);border-radius:1px}@keyframes flyout-slide-in{0%{opacity:0;transform:translate(-10px)}to{opacity:1;transform:translate(0)}}\n"] }]
508
+ args: [{ selector: 'app-menu-item', imports: [NgClass, RouterLink], changeDetection: ChangeDetectionStrategy.OnPush, template: "@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", styles: [".active-route{color:var(--sidebar-active-text)!important;background:linear-gradient(90deg,#ffffff24,#ffffff0a)!important;border-left:3px solid var(--sidebar-accent, #c50048)!important;border-radius:0 8px 8px 0!important;box-shadow:inset 0 1px #ffffff0f!important}.cursor-drow{cursor:default}.submenu{transform-origin:top;animation:submenuIn .26s cubic-bezier(.4,0,.2,1) both}.submenu--closing{animation:submenuOut .22s cubic-bezier(.4,0,.2,1) both}@keyframes submenuIn{0%{opacity:0;transform:translateY(-8px) scaleY(.94)}to{opacity:1;transform:translateY(0) scaleY(1)}}@keyframes submenuOut{0%{opacity:1;transform:translateY(0) scaleY(1)}to{opacity:0;transform:translateY(-8px) scaleY(.94)}}.acceso-tooltip-fixed{position:fixed;z-index:99999;transform:translateY(-50%);pointer-events:none;padding:4px 10px 4px 8px;border-radius:6px;font-family:monospace;white-space:nowrap;background:#0f0f14;border:1px solid rgba(255,255,255,.07);border-left:2px solid var(--sidebar-accent, #c50048);display:flex;align-items:center;gap:5px;animation:tooltipFadeIn .14s cubic-bezier(.25,.46,.45,.94)}.acceso-tooltip-fixed .tooltip-label{font-size:10px;font-weight:400;color:#fff;letter-spacing:.3px}.acceso-tooltip-fixed .tooltip-value{font-size:11px;font-weight:700;color:var(--sidebar-accent, #c50048)}.acceso-tooltip-fixed:before{content:\"\";position:absolute;right:100%;top:50%;transform:translateY(-50%);border:4px solid transparent;border-right-color:var(--sidebar-accent, #c50048)}@keyframes tooltipFadeIn{0%{opacity:0;transform:translateY(-50%) translate(-4px)}to{opacity:1;transform:translateY(-50%) translate(0)}}.sidebar-text{display:inline-block;vertical-align:middle;white-space:normal;word-break:break-word;opacity:1;transform:translate(0);transition:opacity .15s ease .22s,transform .15s ease .22s}.sidebar-text--hidden{opacity:0;transform:translate(-4px);white-space:nowrap;max-width:0;overflow:hidden;transition:opacity .12s ease 0s,transform .12s ease 0s,max-width 0s linear .12s}.sidebar-chevron{opacity:1;transition:opacity .15s ease .22s}.sidebar-chevron--hidden{opacity:0;transition:opacity .12s ease 0s}.item-sidebar{color:var(--sidebar-text-color)!important;transition:all .2s ease;border-radius:8px}.item-sidebar>span:first-child{min-width:0;flex:1}.item-sidebar:hover{color:var(--sidebar-active-text)!important;background:#ffffff17!important;transform:translate(2px)}:host-context(.sidebar.open) .item-sidebar{border-radius:8px 0 0 8px;margin-right:-8px}:host-context(.sidebar.open) .item-sidebar:hover{transform:none}:host-context(.sidebar.open) .item-sidebar.active-route{border-radius:0!important;background:#ffffff24!important}.sidebar-flyout{position:fixed;left:70px;z-index:9999;min-width:220px;max-width:300px;overflow-y:auto;scrollbar-width:none;background:linear-gradient(160deg,var(--sidebar-gradient-start, #1a1a2e) 0%,var(--sidebar-bg, #16213e) 100%);border:1px solid rgba(255,255,255,.1);border-left:3px solid var(--flyout-accent, #c50048);border-radius:0 12px 12px;box-shadow:8px 6px 32px #0000008c,0 0 0 1px #ffffff0a;animation:flyout-slide-in .15s cubic-bezier(.25,.46,.45,.94);pointer-events:auto}.sidebar-flyout--closing{animation:flyout-slide-out .13s ease-in both}@keyframes flyout-slide-out{0%{opacity:1;transform:translate(0)}to{opacity:0;transform:translate(-8px)}}.flyout-header{display:flex;align-items:center;gap:10px;padding:12px 16px 10px;border-bottom:1px solid rgba(255,255,255,.08);background:#ffffff0a}.flyout-header-icon{color:var(--flyout-accent, #c50048);font-size:14px;min-width:16px;text-align:center}.flyout-header-title{font-size:12px;font-weight:700;color:var(--sidebar-active-text, #fff);letter-spacing:.5px;text-transform:uppercase;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;flex:1}.flyout-header-acceso{font-size:10px;font-weight:700;font-family:monospace;color:var(--flyout-accent, #c50048);background:#ffffff12;border:1px solid rgba(255,255,255,.1);border-left:2px solid var(--flyout-accent, #c50048);padding:2px 7px;border-radius:4px;white-space:nowrap;flex-shrink:0}.flyout-items{padding:6px;margin:0}.flyout-item{display:flex;align-items:center;gap:10px;padding:8px 12px;border-radius:8px;cursor:pointer;color:var(--sidebar-text-color, rgba(255, 255, 255, .7));font-size:13px;transition:background .15s ease,color .15s ease,transform .15s ease;white-space:nowrap;overflow:hidden;position:relative}.flyout-item:hover{background:#ffffff1a;color:var(--sidebar-active-text, #fff);transform:translate(3px)}.flyout-item-active{background:linear-gradient(90deg,#ffffff21,#ffffff08)!important;color:var(--sidebar-active-text, #fff)!important}.flyout-item-active:before{content:\"\";position:absolute;left:0;top:15%;height:70%;width:3px;background:var(--flyout-accent, #c50048);border-radius:0 2px 2px 0}.flyout-item-icon{font-size:12px;min-width:14px;text-align:center;color:inherit;opacity:.75}.flyout-item-label{flex:1;overflow:hidden;text-overflow:ellipsis}.flyout-chevron{font-size:10px;opacity:.5;margin-left:auto;flex-shrink:0;transition:transform .2s ease}.flyout-group{display:flex;flex-direction:column}.flyout-item-has-children{cursor:default}.flyout-item-expanded{background:#ffffff12!important;color:var(--sidebar-active-text, #fff)!important}.flyout-subitems{padding:2px 6px 2px 14px;border-left:2px solid rgba(255,255,255,.1);margin:0 6px 4px 20px}.flyout-subitem{display:flex;align-items:center;gap:8px;padding:7px 10px;border-radius:6px;cursor:pointer;color:var(--sidebar-text-color, rgba(255, 255, 255, .65));font-size:12px;transition:background .15s ease,color .15s ease,transform .15s ease;white-space:nowrap;overflow:hidden}.flyout-subitem:hover{background:#ffffff17;color:var(--sidebar-active-text, #fff);transform:translate(2px)}.flyout-subitem-active{color:var(--sidebar-active-text, #fff)!important;position:relative}.flyout-subitem-active:before{content:\"\";position:absolute;left:-14px;top:20%;height:60%;width:2px;background:var(--flyout-accent, #c50048);border-radius:1px}@keyframes flyout-slide-in{0%{opacity:0;transform:translate(-10px)}to{opacity:1;transform:translate(0)}}\n"] }]
507
509
  }], ctorParameters: () => [] });
508
510
 
509
511
  class BottomNavigationComponent {
@@ -1 +1 @@
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 { 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 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)=\"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\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 }[]\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 items: action.items.map(i => ({ icon: i.icon, label: i.label, 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\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)=\"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\"\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 </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=\"assets/images/admin-avatar.png\" 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=\"assets/images/admin-avatar.png\">\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","/*\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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"}
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 { 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)=\"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\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 }[]\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 items: action.items.map(i => ({ icon: i.icon, label: i.label, 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\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)=\"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\"\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 </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=\"assets/images/admin-avatar.png\" 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=\"assets/images/admin-avatar.png\">\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","/*\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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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "layout-tsi",
3
- "version": "0.0.1",
3
+ "version": "0.0.2",
4
4
  "peerDependencies": {
5
5
  "@angular/common": "^19.2.0",
6
6
  "@angular/core": "^19.2.0",
@@ -21,4 +21,4 @@
21
21
  "default": "./fesm2022/layout-tsi.mjs"
22
22
  }
23
23
  }
24
- }
24
+ }