{"version":3,"file":"toolbox-app.mjs","sources":["../../../projects/toolbox/app/state/app-state.service.ts","../../../projects/toolbox/app/startup/app.utils.ts","../../../projects/toolbox/app/startup/app.startup.ts","../../../projects/toolbox/app/public-api.ts","../../../projects/toolbox/app/toolbox-app.ts"],"sourcesContent":["import { Injectable } from \"@angular/core\";\r\nimport { SafeHtml, DomSanitizer } from \"@angular/platform-browser\";\r\nimport { Observable, Subject } from \"rxjs\";\r\n\r\nimport { TbxSsoUserModel } from \"@lacera/ngx-toolbox/sso\";\r\nimport { TbxUrlModel } from \"@lacera/ngx-toolbox/http\";\r\nimport { ensureNotNull } from \"@lacera/ngx-toolbox/utilities\";\r\n\r\nimport { TbxAppStateModel } from \"./app-state.model\";\r\nimport { TbxAppModel } from \"./app.model\";\r\nimport { TbxEnvironment } from \"./environment.model\";\r\n\r\n/**\r\n * Provides functions to obtain application information such as name, version, etc.,\r\n * that is retrieved from the server.\r\n */\r\n@Injectable( { providedIn: \"root\" } )\r\nexport class TbxAppStateService {\r\n  /** Gets or sets the environment object configured in the project. */\r\n  public static environment: TbxEnvironment = { production: true };\r\n\r\n  /**\r\n   * Gets or sets a value indicating whether the application is running\r\n   * in production mode.\r\n   */\r\n  public static clientProduction: boolean =\r\n    TbxAppStateService.environment.production ?? true;\r\n\r\n  /** Stores the state to provide it to subscribers. */\r\n  private internalState: TbxAppStateModel;\r\n  private readonly stateSubject: Subject<TbxAppStateModel>;\r\n\r\n  public constructor( private readonly sanitizer: DomSanitizer ) {\r\n    this.internalState = TbxAppStateService.initializeState();\r\n    this.stateSubject = new Subject<TbxAppStateModel>();\r\n  }\r\n\r\n  /** Gets the application state as an observable. */\r\n  public get state$(): Observable<TbxAppStateModel> {\r\n    return this.stateSubject.asObservable();\r\n  }\r\n\r\n  /** Gets the back-end server routes. */\r\n  public get routes(): readonly TbxUrlModel[] { return this.state.routes; }\r\n\r\n  /** Gets the application details. */\r\n  public get application(): TbxAppModel { return this.state.application; }\r\n\r\n  /** Get the application name retrieved from the server. */\r\n  public get applicationName(): string {\r\n    return ensureNotNull( this.state.application.name );\r\n  }\r\n\r\n  /** Gets the current user. */\r\n  public get user(): TbxSsoUserModel { return this.state.user; }\r\n\r\n  /** Gets a value indicating whether the application is production mode. */\r\n  public get productionMode(): boolean { return this.application.production; }\r\n\r\n  /** Get a value indicating whether the user has been authenticated. */\r\n  public get userAuthenticated(): boolean {\r\n    return ensureNotNull( this.state.user.userName ).length > 0;\r\n  }\r\n\r\n  /**\r\n   * Gets the unauthorized page returned by the server to display when the\r\n   * user does not have access to application.\r\n   */\r\n  public get unauthorizedPage(): SafeHtml {\r\n    return this.sanitizer\r\n               .bypassSecurityTrustHtml(\r\n                 this.state.unauthorizedPage ?? \"Not Authorized\" );\r\n  }\r\n\r\n  /** Gets the application state received from the server. */\r\n  public get state(): TbxAppStateModel { return this.internalState; }\r\n\r\n  /** Sets the application state and notifies the subscribers. */\r\n  public set state( state: TbxAppStateModel ) {\r\n    this.internalState = state;\r\n    this.stateSubject.next( state );\r\n  }\r\n\r\n  /**\r\n   * Initializes the default application state.\r\n   * @param unauthorizedPage The unauthorized page received from the server.\r\n   * @returns The initialized state.\r\n   */\r\n  public static initializeState( unauthorizedPage?: string ): TbxAppStateModel {\r\n    return {\r\n      application: {\r\n        name: \"\",\r\n        version: \"1.0.0\",\r\n        production: true,\r\n        region: 37,\r\n        regionLabel: \"PROD\",\r\n        sqlServer: \"SQLPROD.lacera.net\",\r\n        p8ServerUrl: \"\",\r\n        ssrsManager: \"\",\r\n        ssrsServer: \"\",\r\n        smtpServer: \"smtp.lacera.net\",\r\n        adminEmails: \"epaz@lacera.com\"\r\n      },\r\n      user: {\r\n        userId: 0,\r\n        employeeId: 0,\r\n        userName: \"\",\r\n        fullName: \"\",\r\n        displayName: \"\",\r\n        firstName: \"\",\r\n        initials: \"\",\r\n        lastName: \"\",\r\n        email: \"\",\r\n        identity: \"\",\r\n        extension: \"\",\r\n        divisionId: 16,\r\n        divisionName: \"Systems\",\r\n        divisionNameLong: \"Systems Division\",\r\n        suiteNumber: \"750\",\r\n        supervisorId: 0,\r\n        supervisor: \"\",\r\n        bigPictureUrl: \"\",\r\n        smallPictureUrl: \"\",\r\n        addedDate: null,\r\n        isSsoAdmin: false,\r\n        permissions: []\r\n      },\r\n      routes: [],\r\n      userToken: \"\",\r\n      unauthorizedPage\r\n    };\r\n  }\r\n}\r\n","import { isDevMode } from \"@angular/core\";\r\nimport { Location } from \"@angular/common\";\r\n\r\nimport { TbxEnvironment } from \"../state/environment.model\";\r\n\r\n/**\r\n * Writes the message to the log if in development mode.\r\n * @param message The message to write.\r\n */\r\nexport const writeLog = ( message: string ): void => {\r\n  if( isDevMode() ) {\r\n    console.group( \"ToolBox\" );\r\n    console.log( message );\r\n    console.groupEnd();\r\n  }\r\n};\r\n\r\n/**\r\n * Gets the URL to the ToolBox application startup API.\r\n * @param environment The application configuration.\r\n * @param location The Angular location utility.\r\n * @returns The URL to use.\r\n */\r\nexport const getToolBoxApiUrl =\r\n  ( environment: TbxEnvironment, location?: Location ): string => {\r\n    // If we're given the API in the settings, use that\r\n    const startupUrl = environment?.startupApiUrl ?? \"\";\r\n\r\n    if( startupUrl.length > 0 ) {\r\n      writeLog( `Using the environment.startupApiUrl: ${startupUrl}` );\r\n\r\n      return startupUrl;\r\n    }\r\n\r\n    // No leading slash\r\n    const APP_API_URL = \"api/toolbox/application\";\r\n\r\n    const baseUrl = getEnvBaseUrl( environment );\r\n\r\n    if( baseUrl.length > 0 ) {\r\n      return `${baseUrl}/${APP_API_URL}`;\r\n    }\r\n\r\n    // Prepare the URL using the base HREF from Angular\r\n    return location ? location.prepareExternalUrl( APP_API_URL ) : APP_API_URL;\r\n  };\r\n\r\n/**\r\n* Gets the base URL from the environment of Angular.\r\n* @param environment The application environment\r\n* @return The base URL for the application.\r\n*/\r\nexport const getEnvBaseUrl = ( environment: TbxEnvironment ): string => {\r\n  // If asked not to use it, nothing else to do\r\n  if( !( environment.useBaseHref ?? false ) )\r\n  {\r\n    return \"\";\r\n  }\r\n\r\n  // Asked to use it, but do we have one\r\n  let baseHref = environment.baseHref ?? \"\";\r\n\r\n  if( baseHref.length === 0 ) {\r\n    return \"\";\r\n  }\r\n\r\n  // Make sure we remove the leading slash if any\r\n  if( baseHref.charAt( baseHref.length - 1 ) === \"/\" ) {\r\n    baseHref = baseHref.substring( 0, baseHref.length - 1 );\r\n  }\r\n\r\n  writeLog( `Using the environment base HREF URL: ${baseHref}` );\r\n\r\n  return baseHref;\r\n};\r\n","import { Injectable, isDevMode } from \"@angular/core\";\r\nimport { HttpClient, HttpErrorResponse } from \"@angular/common/http\";\r\nimport { Location } from \"@angular/common\";\r\nimport { firstValueFrom } from \"rxjs\";\r\nimport { retry } from \"rxjs/operators\";\r\n\r\nimport { TbxSsoAuthService } from \"@lacera/ngx-toolbox/sso\";\r\nimport { TbxUrlService, TbxHttpClient } from \"@lacera/ngx-toolbox/http\";\r\n\r\nimport { TbxAppStateService } from \"../state/app-state.service\";\r\nimport { TbxEnvironment } from \"../state/environment.model\";\r\nimport { TbxAppStateModel } from \"../state/app-state.model\";\r\nimport { writeLog, getToolBoxApiUrl, getEnvBaseUrl } from \"./app.utils\";\r\n\r\n/**\r\n * Retrieves critical information from the back-end on application startup.\r\n */\r\n@Injectable( { providedIn: \"root\" } )\r\nexport class TbxAppStartup {\r\n  /**\r\n   * The number of times to try to get application details from the server.\r\n   */\r\n  public retryCount = 3;\r\n\r\n  public constructor(\r\n    private readonly http: HttpClient,\r\n    private readonly location: Location,\r\n    private readonly urlService: TbxUrlService,\r\n    private readonly ssoService: TbxSsoAuthService,\r\n    private readonly stateService: TbxAppStateService ) {\r\n  }\r\n\r\n  /**\r\n   * Initializes the ToolBox services by retrieving application information,\r\n   * user permissions, and all available endpoints (URLs).\r\n   *\r\n   * @param environment The application environment definitions.\r\n   * @returns A Promise from the HTTP call.\r\n   */\r\n  public async init( environment: TbxEnvironment ): Promise<void> {\r\n    if( environment == null || environment.production == null ) {\r\n      throw new Error(\r\n        \"The environment must be provided when application initializes \" +\r\n        \"including the 'production' property.\" );\r\n    }\r\n\r\n    // Get the ToolBox API URL to get the application details\r\n    const apiUrl = getToolBoxApiUrl( environment, this.location );\r\n\r\n    // Check if withCredentials should be excluded\r\n    TbxHttpClient.withCredentials = environment.withCredentials ?? true;\r\n\r\n    // We should retry since IIS may be asleep, and it takes some time\r\n    // to spin up the application\r\n    await firstValueFrom(\r\n      this.http\r\n        .get<TbxAppStateModel>(\r\n          apiUrl, { withCredentials: TbxHttpClient.withCredentials } )\r\n        .pipe( retry( this.retryCount ) ) )\r\n      .then( ( config: TbxAppStateModel ) => this.setServices( environment, config ) )\r\n      .catch( error => this.handleError( error ) );\r\n  }\r\n\r\n  /**\r\n   * Updates the services with the information retrieved from the server.\r\n   * @param environment The application environment definitions.\r\n   * @param config The configuration retrieved from the server.\r\n   */\r\n  private setServices( environment: TbxEnvironment, config: TbxAppStateModel ): void {\r\n    TbxAppStateService.environment = environment;\r\n    TbxAppStateService.clientProduction = environment.production ?? true;\r\n\r\n    this.stateService.state = {\r\n      application: config.application,\r\n      user: config.user,\r\n      routes: config.routes,\r\n      userToken: config.userToken,\r\n      unauthorizedPage: config.unauthorizedPage\r\n    };\r\n\r\n    this.ssoService.user = config.user;\r\n    this.urlService.routes = config.routes;\r\n\r\n    this.urlService.baseHref = getEnvBaseUrl( environment );\r\n    this.urlService.includeBaseHref = environment.useBaseHref ?? false;\r\n\r\n    if( isDevMode() ) {\r\n      console.group( \"ToolBox\" );\r\n      console.log( \"state\", this.stateService.state );\r\n      console.log(\r\n        `%c toolbox - successful startup`, \"color: blue; font-weight: bold;\" );\r\n      console.groupEnd();\r\n    }\r\n  }\r\n\r\n  private handleError( error: HttpErrorResponse ): void {\r\n    if( isDevMode() ) {\r\n      console.group( \"ToolBox\" );\r\n      console.error( \"Startup error\", error );\r\n      console.groupEnd();\r\n    }\r\n\r\n    if( error.status === 401 || error.status === 403 ) {\r\n      // Nothing to do if unauthorized. Grab the error which should be the\r\n      // unauthorized page to display and let the app component deal with it\r\n      const unauthorized = error.error != null ? error.error : \"Unauthorized\";\r\n\r\n      this.stateService.state = TbxAppStateService.initializeState( unauthorized );\r\n\r\n      if( isDevMode() ) {\r\n        writeLog( `Received a ${error.status} error on startup` );\r\n        writeLog( `Setting unauthorized: ${this.stateService.state.unauthorizedPage}` );\r\n      }\r\n    }\r\n    else {\r\n      const message =\r\n        \"The application encountered a fatal error while getting \" +\r\n        \"information from the server and it cannot continue: \\n\\n\" +\r\n        `${error.status} - ${error.statusText}\\n\\n` +\r\n        \"Please contact the HelpDesk for assistance.\";\r\n\r\n      alert( message );\r\n\r\n      throw new Error( message );\r\n    }\r\n  }\r\n}\r\n","export * from \"./state/app.model\";\r\nexport * from \"./state/app-state.model\";\r\nexport * from \"./state/app-state.service\";\r\nexport * from \"./state/environment.model\";\r\nexport * from \"./startup/app.startup\";\r\n\r\nimport { inject, provideAppInitializer } from \"@angular/core\";\r\nimport { TbxAppStartup } from \"./startup/app.startup\";\r\nimport { TbxEnvironment } from \"./state/environment.model\";\r\n\r\nexport const tbxAppInitializer =\r\n  ( environment: TbxEnvironment ) => ( provideAppInitializer( () => {\r\n    const initializerFn =\r\n      ( ( as: TbxAppStartup ) => async() => as.init( environment ) ) (\r\n      inject( TbxAppStartup ) );\r\n\r\n    return initializerFn();\r\n  } ) );\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1","i5.TbxAppStateService"],"mappings":"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"}