{"version":3,"file":"toolbox-layout.mjs","sources":["../../../projects/toolbox/layout/header/header.link.ts","../../../projects/toolbox/layout/header/header.component.ts","../../../projects/toolbox/layout/header/header.component.html","../../../projects/toolbox/layout/footer/footer.component.ts","../../../projects/toolbox/layout/footer/footer.component.html","../../../projects/toolbox/layout/page-title/page-title.component.ts","../../../projects/toolbox/layout/page-title/page-title.component.html","../../../projects/toolbox/layout/toolbox-layout.ts"],"sourcesContent":["export interface TbxHeaderLink {\r\n  text: string;\r\n  link: string;\r\n  icon: string;\r\n}\r\n\r\nexport declare type TbxHeaderLinks = TbxHeaderLink[];\r\n\r\nexport const homeLink: TbxHeaderLink = {\r\n  text: \"Home\",\r\n  link: \"/\",\r\n  icon: \"fa-solid fa-home\"\r\n};\r\n\r\nexport const feedbackLink: TbxHeaderLink = {\r\n  text: \"Feedback\",\r\n  link:  \"/\",\r\n  icon:  \"fa-regular fa-message\"\r\n};\r\n\r\nexport const DEFAULT_LINKS: TbxHeaderLinks = [\r\n  homeLink,\r\n  feedbackLink\r\n];\r\n","import { RouterLink } from \"@angular/router\";\r\nimport { NgOptimizedImage } from \"@angular/common\";\r\nimport { DomSanitizer, SafeUrl } from \"@angular/platform-browser\";\r\nimport { ChangeDetectionStrategy, Component, inject, input } from \"@angular/core\";\r\nimport { TbxAppStateModel } from \"@lacera/ngx-toolbox/app\";\r\nimport { isNotNullOrEmpty } from \"@lacera/ngx-toolbox/utilities\";\r\nimport { TbxRoutesService } from \"@lacera/ngx-toolbox/routing\";\r\nimport { TbxRegionBadgeComponent } from \"@lacera/ngx-toolbox/components\";\r\n\r\nimport { DEFAULT_LINKS } from \"./header.link\";\r\n\r\n@Component( {\r\n  selector: \"tbx-page-header\",\r\n  templateUrl: \"./header.component.html\",\r\n  styleUrls: [\"./header.component.scss\"],\r\n  changeDetection: ChangeDetectionStrategy.OnPush,\r\n  imports: [RouterLink, NgOptimizedImage, TbxRegionBadgeComponent]\r\n} )\r\nexport class TbxHeaderComponent {\r\n  /** The application state received from the backend. */\r\n  public state = input.required<TbxAppStateModel>();\r\n\r\n  /** The brand image to display on the left panel. */\r\n  public brandImg = input<string>( \"assets/images/bn-48x48.png\" );\r\n\r\n  /** The router links to display in the header. */\r\n  public links = input( DEFAULT_LINKS );\r\n\r\n  public headerClass =\r\n    input( \"navbar navbar-expand-sm navbar-material\" );\r\n\r\n  private readonly sanitizer = inject( DomSanitizer );\r\n  private readonly routes = inject( TbxRoutesService );\r\n\r\n  public get userName(): string {\r\n    const user = this.state().user;\r\n\r\n    return isNotNullOrEmpty( user.fullName )\r\n      ? user.fullName\r\n      : isNotNullOrEmpty( user.userName )\r\n        ? user.userName\r\n        : \"Unknown\";\r\n  }\r\n\r\n  public get homeUrl(): string {\r\n    return this.routes.homeUrl;\r\n  }\r\n\r\n  public get userPictureUrl(): string {\r\n    const url = this.state().user.smallPictureUrl;\r\n\r\n    return isNotNullOrEmpty( url ) && url !== \"N/A\"\r\n      ? url\r\n      : \"https://i.pinimg.com/736x/a4/ea/a3/a4eaa3b46515004d80ef0f23c9e921cd.jpg\";\r\n  }\r\n\r\n  public get feedbackUrl(): SafeUrl {\r\n    const url = this.routes.feedback(\r\n      this.userName,\r\n      this.state().application.name,\r\n      { returnUrl: this.routes.homeAbsoluteUrl }\r\n    );\r\n\r\n    return this.sanitizer.bypassSecurityTrustUrl( url );\r\n  }\r\n\r\n  public get internalClass(): string {\r\n    return [\r\n      this.headerClass()\r\n    ].filter( Boolean ).join( \" \" );\r\n  }\r\n}\r\n","<header [class]=\"internalClass\">\r\n  <div class=\"container-fluid\">\r\n    @if (!state().application.production) {\r\n      <div id=\"beta-stamp\"></div>\r\n    }\r\n    <a class=\"navbar-brand\" [routerLink]=\"homeUrl\">\r\n      <div class=\"brand-logo\">\r\n        <img [ngSrc]=\"brandImg()\"\r\n             priority=\"\"\r\n             width=\"48\"\r\n             height=\"48\"\r\n             [alt]=\"state().application.name\"\r\n             [title]=\"state().application.name\">\r\n      </div>\r\n      <div class=\"logo-title d-none d-lg-block\">\r\n        <span class=\"logo-title-shadow\">Member Events</span> Sync\r\n        <tbx-region-badge [region]=\"state().application.region\"/>\r\n        <div class=\"logo-subtitle\">Part of the LACERA Applications.</div>\r\n      </div>\r\n    </a>\r\n\r\n    <ul class=\"navbar-nav\">\r\n      @for (link of links(); track link.text) {\r\n        <li class=\"nav-item\">\r\n          @if (link.text.toLowerCase() === 'feedback') {\r\n            <a class=\"nav-link active\"\r\n               target=\"_blank\"\r\n               rel=\"noopener noreferrer\"\r\n               [href]=\"feedbackUrl\">\r\n              <span [class]=\"link.icon\"></span> {{ link.text }}\r\n            </a>\r\n          } @else {\r\n            <a class=\"nav-link active\"\r\n               [routerLink]=\"link.link\"\r\n               [title]=\"link.title || ''\">\r\n              <span [class]=\"link.icon\"></span> {{ link.text }}\r\n            </a>\r\n          }\r\n        </li>\r\n      }\r\n    </ul>\r\n\r\n    <div class=\"text-end\">\r\n      <img [ngSrc]=\"userPictureUrl\"\r\n           [alt]=\"userName\"\r\n           width=\"32\"\r\n           height=\"32\"\r\n           [title]=\"userName\"\r\n           class=\"rounded-circle\">\r\n    </div>\r\n  </div>\r\n</header>\r\n","import {\r\n  Component,\r\n  ChangeDetectionStrategy,\r\n  input,\r\n  signal,\r\n  computed\r\n} from \"@angular/core\";\r\nimport { AsyncPipe, DatePipe, UpperCasePipe } from \"@angular/common\";\r\n\r\nimport { TbxAppStateModel } from \"@lacera/ngx-toolbox/app\";\r\nimport { TbxClockService } from \"@lacera/ngx-toolbox/utilities\";\r\nimport { TbxAboutComponent } from \"@lacera/ngx-toolbox/about\";\r\n\r\n@Component( {\r\n  selector: \"tbx-page-footer\",\r\n  styleUrls: [\"./footer.component.scss\"],\r\n  templateUrl: \"./footer.component.html\",\r\n  imports: [\r\n    AsyncPipe,\r\n    DatePipe,\r\n    UpperCasePipe,\r\n    TbxAboutComponent\r\n  ],\r\n  changeDetection: ChangeDetectionStrategy.OnPush\r\n} )\r\nexport class TbxFooterComponent {\r\n  /** The current application state with all its information. */\r\n  public readonly state = input.required<TbxAppStateModel>();\r\n\r\n  /** The LACERA logo image (defaults to 'assets/images/lacera-logo-16x16.png'). */\r\n  public readonly laceraLogoImg =\r\n    input<string>( \"assets/images/lacera-logo-16x16.png\" );\r\n\r\n  /** Gets the background color to display the region label. */\r\n  public regionClass = computed<string>( () => {\r\n    switch( this.state().application.region ) {\r\n      case 37:\r\n        return \"badge text-bg-success\";\r\n      case 55:\r\n        return \"badge text-bg-warning\";\r\n      default:\r\n        return \"badge text-bg-danger\";\r\n    }\r\n  } );\r\n\r\n  protected readonly now = this.clockService.now;\r\n  protected readonly aboutVisible = signal( false );\r\n\r\n  public constructor( private readonly clockService: TbxClockService ) {\r\n  }\r\n\r\n  public toggleAbout = () => this.aboutVisible.set( !this.aboutVisible() );\r\n}\r\n","<footer>\r\n  <div class=\"copyright d-none d-md-block\">\r\n    &copy; {{ now | async | date: 'yyyy' }} LACERA - All rights reserved\r\n  </div>\r\n  <div class=\"version\">\r\n      <span class=\"d-none d-sm-inline\">{{ now | async | date: 'M/dd/yyyy' }}\r\n        &#9642; </span>\r\n    <span class=\"d-none d-sm-inline\">{{ now | async | date: 'mediumTime' }} &#9642;\r\n    </span>\r\n    <span>{{ state().application.sqlServer | uppercase }} &#9642; </span>\r\n    <span [class]=\"regionClass()\" style=\"font-size: inherit; line-height: .6\">\r\n      {{ state().application.regionLabel | uppercase }}\r\n    </span>\r\n    <span> &#9642; {{ state().user.userName | uppercase }} &#9642; </span>\r\n    <span>\r\n      <button class=\"btn-version\" (click)=\"toggleAbout()\">\r\n        {{ state().application.version }}\r\n      </button>\r\n      <img style=\"vertical-align: baseline\"\r\n           [src]=\"laceraLogoImg()\"\r\n           [height]=\"16\" [width]=\"16\" alt=\"logo\"/>\r\n    </span>\r\n  </div>\r\n</footer>\r\n\r\n@if (aboutVisible()) {\r\n  <tbx-about [show]=\"aboutVisible()\"\r\n             [state]=\"state()\"\r\n             (close)=\"toggleAbout()\"\r\n             image=\"/assets/images/bn_logo_sm.png\"/>\r\n}\r\n","import { Component } from \"@angular/core\";\r\n\r\n@Component( {\n    selector: \"tbx-page-title\",\n    imports: [],\n    templateUrl: \"./page-title.component.html\",\n    styleUrl: \"./page-title.component.css\"\n} )\r\nexport class TbxPageTitleComponent {\r\n}\r\n","<div class=\"page-title\">\r\n  <ng-content></ng-content>\r\n</div>\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}