@koalarx/ui
Version:
Koala UI is a Design System developed in Angular whose objective is to facilitate and make your development faster and simpler, making this framework your greatest ally.
1 lines • 122 kB
Source Map (JSON)
{"version":3,"file":"koalarx-ui-core.mjs","sources":["../../../projects/core/src/lib/loader/loader-bar-page.component.ts","../../../projects/core/src/lib/loader/loader-bar-page.component.html","../../../projects/core/src/lib/page/notifications/notification.component.ts","../../../projects/core/src/lib/page/notifications/notification.component.html","../../../projects/core/src/lib/page/koala-language.helper.ts","../../../projects/core/src/lib/environments/koalaEnvironment.ts","../../../projects/core/src/lib/services/token/token.factory.ts","../../../projects/core/src/lib/helpers/mat-form-field.helper.ts","../../../projects/core/src/lib/services/token/koala.token.service.ts","../../../projects/core/src/lib/services/openid/koala.oauth.config.ts","../../../projects/core/src/lib/services/loader/koala.loader.service.ts","../../../projects/core/src/lib/services/openid/koala.oauth2.service.ts","../../../projects/core/src/lib/page/page.component.ts","../../../projects/core/src/lib/page/page.component.html","../../../projects/core/src/lib/page/koala.page.module.ts","../../../projects/core/src/lib/router/koala.parameter-hash-location-stategy.ts","../../../projects/core/src/lib/services/api-requester/helpers/error/koala.not-found.error.ts","../../../projects/core/src/lib/services/api-requester/helpers/error/koala.unhautorized.error.ts","../../../projects/core/src/lib/services/api-requester/helpers/error/koala.client.error.ts","../../../projects/core/src/lib/services/api-requester/helpers/error/koala.success.error.ts","../../../projects/core/src/lib/services/api-requester/helpers/error/koala.errors.helper.ts","../../../projects/core/src/lib/services/api-requester/helpers/service/koala.request-header.helper.ts","../../../projects/core/src/lib/services/api-requester/factory/koala.response.factory.ts","../../../projects/core/src/lib/services/api-requester/koala.api-requester.service.ts","../../../projects/core/src/lib/services/api-requester/koala.api-requester.cache.ts","../../../projects/core/src/lib/services/api-requester/koala.api-requester.base.ts","../../../projects/core/src/lib/services/request/koala.request.service.ts","../../../projects/core/src/lib/ngx-koala.module.ts","../../../projects/core/src/index.ts","../../../projects/core/src/koalarx-ui-core.ts"],"sourcesContent":["import { ChangeDetectionStrategy, Component, Input } from '@angular/core';\nimport { ProgressBarMode } from '@angular/material/progress-bar';\n\n@Component({\n selector: 'app-loader-page',\n templateUrl: 'loader-bar-page.component.html',\n styleUrls: ['loader-bar-page.component.css'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class LoaderBarPageComponent {\n @Input() show: boolean = false;\n @Input() progress: number = 0;\n @Input() typeLoader: ProgressBarMode = 'indeterminate';\n}\n","<div [ngClass]=\"{'bouncedInDown d-block': show}\" class=\"animated loader-bar-page\">\n <mat-progress-bar\n [bufferValue]=\"progress\"\n [mode]=\"typeLoader\"\n [value]=\"progress\"\n color=\"primary\">\n </mat-progress-bar>\n</div>\n","import { ChangeDetectionStrategy, Component, EventEmitter, Input, OnChanges, Output, SimpleChanges } from '@angular/core';\nimport { KoalaNotificationInterface } from './koala.notification.interface';\n\n@Component({\n selector: 'koala-notification-list',\n templateUrl: 'notification.component.html',\n styleUrls: ['notification.component.css'],\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class NotificationComponent implements OnChanges {\n @Input() notifications: KoalaNotificationInterface[];\n @Output() deleteAll = new EventEmitter<boolean>(false);\n @Output() delete = new EventEmitter<KoalaNotificationInterface>(null);\n\n private appName: string;\n\n constructor() {}\n\n ngOnChanges(changes: SimpleChanges) {\n this.appName = document.title.indexOf(') ') >= 0 ? document.title.split(') ')[1] : document.title;\n if (changes.notifications && this.notifications.length > 0) {\n document.title = `(${this.notifications.length}) ${this.appName}`;\n } else {\n document.title = this.appName;\n }\n }\n\n public deleteAllNotifications() {\n this.deleteAll.emit(true);\n }\n\n public deleteNotification(notification: KoalaNotificationInterface) {\n this.delete.emit(notification);\n }\n}\n","<div (click)=\"$event.stopPropagation()\" class=\"notifications-content\">\n <div class=\"title\">\n <mat-icon>info</mat-icon>\n <h2>Notificações</h2>\n <span class=\"spacer\"></span>\n <button (click)=\"deleteAllNotifications()\" *ngIf=\"notifications.length > 0\" class=\"btn-delete-all\"\n mat-icon-button\n matTooltip=\"Excluir Todas\" matTooltipPosition=\"above\">\n <mat-icon>delete_sweep</mat-icon>\n </button>\n </div>\n <mat-action-list *ngIf=\"notifications.length > 0 else noNotifications\">\n <mat-list-item *ngFor=\"let notification of notifications\" [routerLink]=\"notification.redirectTo\" class=\"itemList\">\n <button (click)=\"deleteNotification(notification)\" class=\"delete-notification\" color=\"warn\" mat-icon-button\n matTooltip=\"Excluir\" matTooltipPosition=\"above\"\n mat-list-icon>\n <mat-icon>delete</mat-icon>\n </button>\n <mat-icon class=\"iconList\" mat-list-icon>announcement</mat-icon>\n <h4 class=\"titleList\" mat-line>{{notification.title}}</h4>\n <p [innerHTML]=\"notification.text\" class=\"textList\" mat-line></p>\n </mat-list-item>\n </mat-action-list>\n <ng-template #noNotifications>\n <div class=\"empty\">\n <mat-icon>mood</mat-icon>\n <p>Tudo certo por aqui!</p>\n </div>\n </ng-template>\n</div>\n","export type KoalaLanguageType = 'ptBr'|'enUs';\n\n// @dynamic\nexport class KoalaLanguageHelper {\n private static language: KoalaLanguageType\n\n public static setLanguage(language: KoalaLanguageType) {\n this.language = language;\n }\n\n public static getLanguage() {\n return this.language;\n }\n\n public static getBtnLabel() {\n switch (this.language) {\n case \"enUs\":\n return 'Send';\n default:\n return 'Enviar';\n }\n }\n\n public static getYesMessage() {\n switch (this.language) {\n case \"enUs\":\n return 'Yes';\n default:\n return 'Sim';\n }\n }\n\n public static getNoMessage() {\n switch (this.language) {\n case \"enUs\":\n return 'No';\n default:\n return 'Não';\n }\n }\n\n public static getInternalServerErrorMessage() {\n switch (this.language) {\n case \"enUs\":\n return 'We had a problem with your request.<br/>Sorry for the inconvenience.<br/><br/>Please try again later.';\n default:\n return 'Tivemos um problema com sua requisição.<br/>Sinto muito pelo transtorno.<br/><br/>Gentileza tentar novamente mais tarde.';\n }\n }\n\n public static getRequiredMessage(label: string) {\n switch (this.language) {\n case \"enUs\":\n return `${label} is required.`;\n default:\n return `Nenhum valor informado.`;\n }\n }\n\n public static getInvalidMessage(label: string) {\n switch (this.language) {\n case \"enUs\":\n return `${label} is invalid.`;\n default:\n return `Registro inválido.`;\n }\n }\n\n public static getMinMessage(min: string) {\n switch (this.language) {\n case \"enUs\":\n return `Inform at least the value of ${min}.`;\n default:\n return `Informe no mínimo o valor de ${min}.`\n }\n }\n\n public static getMaxMessage(max: string) {\n switch (this.language) {\n case \"enUs\":\n return `Inform at most the value of ${max}.`;\n default:\n return `Informe no máximo o valor de ${max}.`\n }\n }\n\n public static getMinLengthMessage(minLength: string) {\n switch (this.language) {\n case \"enUs\":\n return `Enter a value with at least ${minLength} characters.`;\n default:\n return `Informe um valor com no mínimo ${minLength} caracteres.`\n }\n }\n\n public static getMaxLengthMessage(maxLength: string) {\n switch (this.language) {\n case \"enUs\":\n return `Enter a value with at most ${maxLength} characters.`;\n default:\n return `Informe um valor com no máximo ${maxLength} caracteres.`\n }\n }\n\n public static getDateMinMessage() {\n switch (this.language) {\n case \"enUs\":\n return `Inform at least the date of `;\n default:\n return `Informe no mínimo a data de `\n }\n }\n\n public static getDateMaxMessage() {\n switch (this.language) {\n case \"enUs\":\n return `Inform at most the date of `;\n default:\n return `Informe no máximo a data de `\n }\n }\n\n public static getAutocompleteMessage(label: string) {\n switch (this.language) {\n case \"enUs\":\n return `You must select a option.`;\n default:\n return `Você deve selecionar uma opção.`;\n }\n }\n}\n","import { KoalaOauth2ConfigInterface } from \"../services/openid/koala-oauth2-config.interface\";\n\nexport interface KoalaEnvironmentOAuthInterface extends KoalaOauth2ConfigInterface {\n name: string;\n}\n\nexport interface KoalaEnvironmentInterface {\n production: boolean;\n storageTokenName?: string;\n storageOAuthTypeName?: string;\n endpointApi?: string;\n authenticator?: string;\n oauthConfig?: KoalaEnvironmentOAuthInterface[];\n}\n\n// @dynamic\nexport class KoalaEnvironment {\n public static environment: KoalaEnvironmentInterface;\n}\n","import { KoalaEnvironment } from \"../../environments/koalaEnvironment\";\n\n// @dynamic\nexport class TokenFactory {\n private static token?: string;\n\n public static init() {\n if (!!localStorage.getItem(KoalaEnvironment.environment?.storageTokenName)) {\n TokenFactory.setToken(localStorage.getItem(KoalaEnvironment.environment?.storageTokenName));\n }\n }\n\n public static setToken(token: string) {\n localStorage.setItem(KoalaEnvironment.environment?.storageTokenName, token);\n this.token = token;\n }\n\n public static getToken() {\n return this.token;\n }\n\n public static removeToken() {\n localStorage.removeItem(KoalaEnvironment.environment?.storageTokenName);\n this.token = null;\n }\n\n public static hasToken() {\n return !!this.token && !!localStorage.getItem(KoalaEnvironment.environment?.storageTokenName);\n }\n\n public static logout() {\n this.removeToken();\n }\n}\n","export class MatFormFieldHelper {\n // Devido a mudanças constantes de estado dos campos de formulário, em certos casos o componente do Material Angular não se comporta conforme o esperado, devido a isso, este Helper tem essa função\n public static fixDisabledStateForDisabledFields() {\n document.querySelectorAll(\".mat-form-field input:disabled\").forEach(inputEl => {\n let matFormFieldElement: HTMLDivElement;\n let tmpElement: Element;\n\n do {\n tmpElement = tmpElement ? tmpElement.parentElement : inputEl.parentElement;\n if (tmpElement.classList.contains('mat-form-field')) {\n matFormFieldElement = tmpElement as HTMLDivElement;\n }\n } while (!matFormFieldElement);\n\n matFormFieldElement?.classList.add('mat-form-field-disabled');\n });\n }\n}\n","import jwt from 'jwt-decode';\n\nimport { Injectable, OnDestroy } from '@angular/core';\nimport { BehaviorSubject, interval, Subscription } from 'rxjs';\nimport { TokenFactory } from \"./token.factory\";\nimport { MatFormFieldHelper } from \"../../helpers/mat-form-field.helper\";\n\nexport interface KoalaOAuth2TokenInterface {\n accessToken: string;\n idToken: string;\n refreshToken: string;\n login: string;\n expired: number;\n code: string;\n}\n\n@Injectable({providedIn: \"any\"})\nexport class KoalaTokenService implements OnDestroy {\n private token$ = new BehaviorSubject<string>(null);\n private intervalToken: Subscription;\n private intervalFixMatFormField: Subscription;\n\n constructor() {\n this.verifySession();\n }\n\n ngOnDestroy() {\n this.intervalToken?.unsubscribe();\n this.intervalFixMatFormField?.unsubscribe();\n }\n\n public setToken(token: string) {\n if (TokenFactory.hasToken()) { this.token$.next(token); }\n TokenFactory.setToken(token);\n\n this.intervalFixMatFormField = interval(1000).subscribe(() => MatFormFieldHelper.fixDisabledStateForDisabledFields());\n }\n\n public getToken(): BehaviorSubject<string> {\n return this.token$;\n }\n\n public getDecodedToken<T>(): T|null {\n return (TokenFactory.hasToken() ? jwt(TokenFactory.getToken()) : null);\n }\n\n public getOAuth2Token(): KoalaOAuth2TokenInterface|null {\n return (TokenFactory.hasToken() ? jwt(TokenFactory.getToken()) : null);\n }\n\n public removeToken() {\n TokenFactory.removeToken();\n this.intervalFixMatFormField?.unsubscribe();\n }\n\n private verifySession() {\n TokenFactory.init();\n this.token$.next(TokenFactory.getToken());\n this.intervalToken = interval(300).subscribe(() => {\n if (!TokenFactory.hasToken() && this.token$.getValue()) {\n this.token$.next(null);\n } else if (TokenFactory.hasToken() && !this.token$.getValue()) {\n this.token$.next(TokenFactory.getToken());\n }\n });\n }\n}\n","import { BehaviorSubject } from \"rxjs\";\nimport { KoalaOauth2ConfigInterface } from \"./koala-oauth2-config.interface\";\nimport { KoalaEnvironment } from \"../../environments/koalaEnvironment\";\n\n// @dynamic\nexport class KoalaOauthConfig {\n public static config = new BehaviorSubject<KoalaOauth2ConfigInterface>(\n KoalaOauthConfig.getOAuthConfig(KoalaOauthConfig.getConfig())\n );\n\n public static getConfig() {\n return localStorage.getItem(KoalaEnvironment.environment?.storageOAuthTypeName);\n }\n\n public static hasConfig() {\n return !!this.getConfig();\n }\n\n public static setConfig(type: string) {\n localStorage.setItem(KoalaEnvironment.environment?.storageOAuthTypeName, type);\n this.config.next(this.getOAuthConfig(type));\n }\n\n private static getOAuthConfig(type?: string) {\n const environment = KoalaEnvironment.environment?.oauthConfig?.find(config => config.name === type) ?? null;\n\n return environment ?? {\n customQueryParams: {\n client_secret: null\n },\n clientId: null,\n scope: null,\n domain: null,\n strictDiscoveryDocumentValidation: false,\n indexLoginName: 'name'\n };\n }\n}\n","import { Injectable } from \"@angular/core\";\nimport { BehaviorSubject } from 'rxjs';\nimport { LoaderBarPageInterface } from '../../loader/loader-bar-page.interface';\n\nexport const KOALA_LOADER_SUBJECT = new BehaviorSubject<LoaderBarPageInterface>({\n typeLoader: 'indeterminate',\n progress: 0,\n show: false\n});\n\n@Injectable({providedIn: \"any\"})\nexport class KoalaLoaderService {\n\n public getLoaderSubject() {\n return KOALA_LOADER_SUBJECT;\n }\n\n public create(loaderConfig?: {\n progress?: number;\n typeLoader?: \"buffer\" | \"determinate\" | \"query\" | \"indeterminate\"\n }) {\n KOALA_LOADER_SUBJECT.next({\n show: true,\n progress: loaderConfig.progress ? loaderConfig.progress : 0,\n typeLoader: loaderConfig.typeLoader ? loaderConfig.typeLoader : 'indeterminate'\n });\n }\n\n public dismiss() {\n KOALA_LOADER_SUBJECT.next({\n show: false,\n progress: 0,\n typeLoader: 'indeterminate'\n });\n }\n}\n","import { Injectable, OnDestroy } from '@angular/core';\nimport { BehaviorSubject, interval, Subscription } from 'rxjs';\nimport { HttpClient } from '@angular/common/http';\nimport { koala } from \"@koalarx/utils\";\nimport { Router } from \"@angular/router\";\nimport { KoalaTokenService } from \"../token/koala.token.service\";\nimport { KoalaOauthConfig } from \"./koala.oauth.config\";\nimport { delay } from \"@koalarx/utils/operators/delay\";\nimport { randomString } from \"@koalarx/utils/operators/string\";\n\nexport interface KoalaOAuth2Config {\n redirectUri: string;\n responseType: string;\n clientId: string;\n scope: string;\n issuer: string;\n redirectUriAfterAuth?: string;\n customQueryParams?: object;\n endpointToken?: string;\n endpointClaims?: string;\n}\n\nexport interface KoalaOpenIdConfig {\n authorization_endpoint: string;\n check_session_iframe: string;\n claim_types_supported: string[];\n claims_parameter_supported: boolean;\n claims_supported: string[];\n code_challenge_methods_supported: string[];\n end_session_endpoint: string;\n grant_types_supported: string[];\n id_token_encryption_alg_values_supported: string[];\n id_token_encryption_enc_values_supported: string[];\n id_token_signing_alg_values_supported: string[];\n introspection_endpoint: string;\n issuer: string;\n jwks_uri: string;\n registration_endpoint: string;\n request_object_signing_alg_values_supported: string[];\n request_parameter_supported: boolean;\n request_uri_parameter_supported: boolean;\n response_modes_supported: string[];\n response_types_supported: string[];\n scopes_supported: string[];\n subject_types_supported: string[];\n tls_client_certificate_bound_access_tokens: boolean;\n token_endpoint: string;\n token_endpoint_auth_methods_supported: string[];\n token_endpoint_auth_signing_alg_values_supported: string[];\n token_introspection_endpoint: string;\n userinfo_endpoint: string;\n userinfo_signing_alg_values_supported: string[];\n}\n\nexport type EventType =\n 'loadedConfig'\n | 'getToken'\n | 'getTokenError'\n | 'refreshToken'\n | 'getClaims'\n | 'userAuthenticated'\n | 'authenticate'\n | 'logout'\n | 'errorLoadConfig';\n\nconst STATE_STORAGE_NAME = 'koala_openid_state';\n\n@Injectable()\nexport class KoalaOAuth2Service implements OnDestroy {\n public events = new BehaviorSubject<EventType>(null);\n private config: KoalaOAuth2Config;\n private openIdOptions: KoalaOpenIdConfig;\n private eventSubscription: Subscription;\n private state?: string;\n private code?: string;\n private token?: any = {};\n private claims?: any;\n private refreshTokenInterval?: Subscription;\n\n constructor(\n private http: HttpClient,\n private router: Router,\n private tokenService: KoalaTokenService\n ) {\n this.generateState();\n }\n\n ngOnDestroy() {\n this.eventSubscription?.unsubscribe();\n this.refreshTokenInterval?.unsubscribe();\n }\n\n public hasOpenIdConfig() {\n return !!this.openIdOptions;\n }\n\n public configure(options: KoalaOAuth2Config) {\n this.config = options;\n }\n\n public loadDiscoveryDocumentAndTryLogin() {\n\n if (this.eventSubscription) {\n this.eventSubscription.unsubscribe();\n }\n this.eventSubscription = this.events.subscribe(event => {\n if (event === 'authenticate') {\n this.generateState();\n localStorage.setItem(STATE_STORAGE_NAME, this.state);\n window.location.href = `${this.openIdOptions.authorization_endpoint}?response_type=${this.config.responseType}&client_id=${this.config.clientId}&state=${this.state}&redirect_uri=${this.config.redirectUri}&scope=${this.config.scope}`;\n } else if (event === 'getToken') {\n const urlParams = new URLSearchParams(window.location.search);\n const state = urlParams.get('state');\n if (state === this.state) {\n const code = urlParams.get('code');\n this.getToken(code);\n } else {\n this.logout();\n }\n } else if (event === 'getClaims' || (event === 'refreshToken' && !this.claims)) {\n this.getClaims();\n }\n });\n\n return new Promise((resolve, reject) => {\n this.http.get<KoalaOpenIdConfig>(`${this.config.issuer}/.well-known/openid-configuration`).subscribe(options => {\n this.openIdOptions = options;\n if (window.location.href.indexOf(`state=${this.state}`) >= 0) {\n this.events.next('getToken');\n } else if (!this.tokenService.getOAuth2Token()) {\n this.events.next('loadedConfig');\n }\n resolve(true);\n }, e => {\n console.error(e);\n this.events.next('errorLoadConfig');\n reject(e);\n });\n });\n }\n\n public async initLoginFlow(name?: string) {\n if (name) {\n KoalaOauthConfig.setConfig(name);\n await delay(1000);\n }\n\n this.events.next('authenticate');\n }\n\n public getIdentityClaims() {\n return this.claims;\n }\n\n public getAccessToken() {\n return this.token.access_token;\n }\n\n public getIdToken() {\n return this.token.id_token;\n }\n\n public getRefreshToken() {\n return this.token.refresh_token;\n }\n\n public getAccessTokenExpiration() {\n const expires_in = new Date();\n expires_in.setSeconds(this.token.expires_in);\n return expires_in.toString();\n }\n\n public getCode() {\n return this.code;\n }\n\n public logout() {\n const logoutInterval = setInterval(() => {\n if (this.hasOpenIdConfig()) {\n if (this.openIdOptions.end_session_endpoint) {\n this.claims = null;\n this.token = null;\n const iframeLogout = document.createElement('iframe');\n iframeLogout.style.display = 'none';\n iframeLogout.src = this.openIdOptions.end_session_endpoint;\n document.querySelector('body').appendChild(iframeLogout);\n }\n this.events.next('logout');\n clearInterval(logoutInterval);\n }\n }, 300);\n }\n\n public initRefreshTokenInterval(code: string, refreshToken: string) {\n this.refreshTokenInterval?.unsubscribe();\n this.refreshTokenInterval = interval(1000).subscribe(() => {\n const refreshTokenDate = new Date();\n refreshTokenDate.setMinutes(refreshTokenDate.getMinutes() + 1);\n const token = this.tokenService.getOAuth2Token();\n if (token) {\n const expires_in = token.expired;\n if (expires_in) {\n if (new Date(expires_in) <= refreshTokenDate) {\n this.getToken(code, refreshToken);\n }\n }\n }\n });\n }\n\n private getToken(code: string, refreshToken?: string) {\n if (refreshToken) {\n this.refreshTokenInterval?.unsubscribe();\n }\n\n const formData = new URLSearchParams();\n let data = koala({\n grant_type: (refreshToken ? 'refresh_token' : 'authorization_code'),\n code,\n redirect_uri: this.config.redirectUri,\n client_id: this.config.clientId\n }).object().merge(this.config.customQueryParams ?? {}).getValue();\n\n if (refreshToken) {\n data = koala(data).object().merge({refresh_token: refreshToken}).getValue();\n }\n\n if (!this.code) {\n this.code = code;\n }\n\n Object.keys(data).forEach(indexName => {\n formData.append(indexName, data[indexName]);\n });\n\n this.http.post(this.config.endpointToken ?? this.openIdOptions.token_endpoint, formData.toString(), {\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded'\n }\n }).subscribe((token: any) => {\n this.token = token;\n this.events.next((refreshToken ? 'refreshToken' : 'getClaims'));\n }, () => this.events.next('getTokenError'));\n }\n\n private getClaims() {\n this.http.get((this.config.endpointClaims ?? this.openIdOptions.userinfo_endpoint), {\n headers: {\n Authorization: `Bearer ${this.getAccessToken()}`\n }\n }).subscribe(userInfo => {\n this.claims = userInfo;\n this.state = null;\n localStorage.removeItem(STATE_STORAGE_NAME);\n this.events.next(this.events.getValue() === 'refreshToken' ? 'refreshToken' : 'userAuthenticated');\n }, () => this.events.next('loadedConfig'));\n }\n\n private generateState() {\n this.state = localStorage.getItem(STATE_STORAGE_NAME) ?\n localStorage.getItem(STATE_STORAGE_NAME) :\n randomString(30, {\n numbers: true,\n uppercase: true,\n lowercase: true\n });\n }\n}\n","import { ChangeDetectionStrategy, Component, EventEmitter, Input, OnInit, Output, ViewChild } from '@angular/core';\nimport { ThemePalette } from '@angular/material/core';\nimport { NavigationCancel, NavigationEnd, NavigationError, NavigationStart, Router } from '@angular/router';\nimport { LoaderBarPageInterface } from '../loader/loader-bar-page.interface';\nimport { BehaviorSubject, Subscription } from 'rxjs';\nimport { KoalaTokenService } from '../services/token/koala.token.service';\nimport { KoalaLoaderService } from '../services/loader/koala.loader.service';\nimport { KoalaNotificationInterface } from './notifications/koala.notification.interface';\nimport { KoalaUserMenuOptionsInterface } from './koala.user-menu-options.interface';\nimport { KoalaPagePalletColorsInterface } from './koala-page-pallet-colors.interface';\nimport { MatDrawer } from '@angular/material/sidenav';\nimport { KoalaMenuService, menuStateSubject } from '@koalarx/ui/menu';\nimport jwtEncode from \"jwt-encode\";\nimport { TokenFactory } from \"../services/token/token.factory\";\nimport { KoalaOAuth2Service } from \"../services/openid/koala.oauth2.service\";\nimport { KoalaEnvironment } from \"../environments/koalaEnvironment\";\nimport { KoalaOauthConfig } from \"../services/openid/koala.oauth.config\";\nimport { KoalaOauth2ConfigInterface } from \"../services/openid/koala-oauth2-config.interface\";\nimport { KoalaLanguageHelper, KoalaLanguageType } from \"./koala-language.helper\";\nimport { DeviceDetectorService } from \"ngx-device-detector\";\n\n@Component({\n selector: 'koala-page',\n templateUrl: 'page.component.html',\n styleUrls: ['page.component.css'],\n providers: [KoalaTokenService],\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class PageComponent implements OnInit {\n @Input() showMenu: boolean = true;\n @Input() color: ThemePalette;\n @Input() logo: string;\n @Input() startMenuOpened = true;\n @Input() showLoaderPage: BehaviorSubject<boolean>;\n @Input() messageLoaderPage: BehaviorSubject<string>;\n @Input() defaultPage: string;\n @Input() openPages: string[];\n @Input() notifications: BehaviorSubject<KoalaNotificationInterface[]>;\n @Input() userMenuOptions: KoalaUserMenuOptionsInterface[] = [];\n @Input() palletColors: KoalaPagePalletColorsInterface;\n @Input() language: KoalaLanguageType = 'ptBr';\n @Output() validatingScope = new EventEmitter<boolean>(false);\n @Output() logoutEmitter = new EventEmitter<boolean>(false);\n @Output() deleteAllNotifications = new EventEmitter<boolean>(false);\n @Output() deleteNotification = new EventEmitter<KoalaNotificationInterface>(null);\n\n public loaderSubject: BehaviorSubject<LoaderBarPageInterface>;\n public username$ = new BehaviorSubject<string>('');\n public firstUserLetter$ = new BehaviorSubject<string>('');\n public currentUrl: string;\n public logged$ = new BehaviorSubject<boolean>(false);\n public validationScope$ = new BehaviorSubject<boolean>(false);\n public isMobile: boolean = this.deviceService.isMobile();\n\n private defaultPalletColors: KoalaPagePalletColorsInterface = {\n scrollbarColor: '#1976D2',\n scrollbarColorHover: '#1565C0',\n userPresentationBackground: '#f1f1f1',\n userPresentationUserBackground: '#1976D2',\n userPresentationUserFontColor: '#fff',\n firstColor: '#fff',\n secondColor: '#F1F1F1',\n bodyBackground: '#eeeeee',\n checkboxBackground: '#1976d2',\n checkboxColor: '#ffffff',\n fontColor: '#1976D2',\n fontHoverColor: '#1976D2',\n fontActiveColor: '#1565C0',\n menuTitleBackground: 'rgba(0,0,0,.1)',\n menuTitleColor: 'rgba(0,0,0,.3)',\n menuBackground: '#fafafa',\n menuOptionsBackground: '#eaeaea',\n menuOptionsColor: '#a5a5a5',\n menuOptionsColorHover: '#1976D2',\n menuOptionsColorActive: '#1565c0',\n toolbarBackground: '#ffffff',\n toolbarColor: '#1976d2',\n listBackground: '#fff',\n listContentBackground: '#fff',\n listTitleItemColor: '#838383',\n listItemColor: '#3e3e3e',\n listItemBackgroudHover: '#F1F1F1',\n listItemBackgroundActive: '#EEE',\n shadowColorTableList: 'rgba(25, 118, 210, .4)'\n };\n private oauthEventsSubscription: Subscription;\n\n @ViewChild('drawer', {static: true}) private menu: MatDrawer;\n\n constructor(\n private tokenService: KoalaTokenService,\n private router: Router,\n private loaderService: KoalaLoaderService,\n private menuService: KoalaMenuService,\n private oauth2Service: KoalaOAuth2Service,\n private deviceService: DeviceDetectorService,\n ) {\n this.loaderSubject = loaderService.getLoaderSubject();\n }\n\n ngOnInit() {\n KoalaLanguageHelper.setLanguage(this.language);\n this.initOAuth2();\n if (this.openPages) {\n if (this.openPages.indexOf('/') < 0) {\n this.openPages.push('/');\n }\n if (this.openPages.indexOf('/login') < 0) {\n this.openPages.push('/login');\n }\n } else {\n this.openPages = [\n '/',\n '/login'\n ];\n }\n\n this.tokenService.getToken()?.subscribe(token => {\n this.logged$.next(!!token);\n if (this.logged$.getValue()) {\n const decodedToken = this.tokenService.getDecodedToken<{ login: string }>();\n this.username$.next(decodedToken.login);\n this.firstUserLetter$.next(decodedToken.login.charAt(0).toUpperCase());\n if (!this.isMobile) {\n this.menuService.open();\n }\n }\n if (this.logged$.getValue() && this.openPages?.indexOf(this.currentUrl) >= 0 && this.defaultPage) {\n this.router.navigate([this.defaultPage]).then();\n } else if (!this.logged$.getValue() && this.currentUrl && this.openPages?.indexOf(this.currentUrl) < 0) {\n this.router.navigate(['login']).then();\n return false;\n }\n });\n this.router.events.subscribe(event => {\n switch (true) {\n case event instanceof NavigationStart: {\n this.loaderService.create({typeLoader: 'indeterminate'});\n break;\n }\n\n case event instanceof NavigationEnd:\n case event instanceof NavigationCancel:\n case event instanceof NavigationError: {\n this.loaderService.dismiss();\n if (event instanceof NavigationEnd) {\n if (this.isMobile) {\n this.menuService.close();\n }\n\n this.currentUrl = event.url.split('?')[0];\n\n if (event.url.indexOf('/login?clientId=') < 0) {\n if (this.logged$.getValue() && this.defaultPage && this.openPages?.indexOf(this.currentUrl) >= 0) {\n this.router.navigate([this.defaultPage]).then();\n return false;\n } else if (!this.logged$.getValue() && this.openPages?.indexOf(this.currentUrl) < 0) {\n this.router.navigate(['login']).then();\n return false;\n }\n }\n }\n break;\n }\n default: {\n break;\n }\n }\n });\n if (this.palletColors) {\n Object.keys(this.defaultPalletColors).forEach(indexName => {\n if (\n !this.palletColors.hasOwnProperty(indexName) ||\n !this.palletColors[indexName]\n ) {\n this.palletColors[indexName] = this.defaultPalletColors[indexName];\n }\n });\n } else {\n this.palletColors = this.defaultPalletColors;\n }\n this.defineColor();\n\n if (this.showMenu) {\n menuStateSubject.subscribe(async (state) => {\n if (this.menu) {\n if (state === 'close') {\n if (this.menu.opened) {\n await this.menu.close();\n }\n } else if (state === 'open') {\n if (!this.menu.opened) {\n await this.menu.open();\n }\n }\n }\n });\n if (this.startMenuOpened && this.logged$.getValue()) {\n if (!this.isMobile) {\n this.menuService.open();\n }\n } else {\n this.menuService.close();\n }\n } else {\n this.menuService.close();\n }\n\n this.validationScope$.subscribe(scope => this.validatingScope.emit(scope));\n }\n\n public async toogleMenu() {\n this.menuService.clearConfig();\n if (this.menu) {\n await this.menu.toggle();\n }\n }\n\n public async logout() {\n if (KoalaEnvironment.environment?.oauthConfig) {\n this.oauth2Service.logout();\n }\n this.menuService.close();\n this.tokenService.removeToken();\n this.tokenService.getToken().next(null);\n this.logoutEmitter.emit(true);\n }\n\n public defineColor() {\n const css = `\n*::-webkit-scrollbar-thumb {background: ${this.palletColors.scrollbarColor};width: 2px;}\n*::-webkit-scrollbar-thumb:hover {background: ${this.palletColors.scrollbarColorHover};}\ninput:-webkit-autofill, input:-webkit-autofill:focus, input:-webkit-autofill:hover {color: ${this.palletColors.fontColor}!important;}\n.menu-container,\nbody {background: ${this.palletColors.bodyBackground}!important;}\ninput:-webkit-autofill, input:-webkit-autofill:focus, input:-webkit-autofill:hover {-webkit-box-shadow: 0 0 0 1000px ${this.palletColors.firstColor} inset !important;}\n.mat-button-disabled,\ninput::placeholder,\n.mat-form-field-appearance-outline .mat-form-field-outline {color: ${this.palletColors.fontColor}!important;opacity: .6;}\n.mat-hint,\n.mat-expansion-indicator::after,\n.more-items-content .items .titleForm,\nfieldset legend,\n.mat-paginator-container,\n.mat-form-field-flex mat-icon {color: ${this.palletColors.fontColor}!important;}\n.mat-paginator-container,\n.mat-card,\n.mat-expansion-panel,\n.mat-select-panel,\n.mat-autocomplete-panel,\n.mat-menu-panel {background: ${this.palletColors.firstColor}}\n.mat-selected {background-color: rgba(0,0,0,.3)!important;}\n.question p,\n.alert-message,\n.mat-action-row,\n.mat-option,\n.mat-menu-item,\n.mat-menu-item mat-icon {color: ${this.palletColors.fontColor}!important}\n.mat-select-value,\n.mat-select-arrow,\n.mat-form-field input,\n.mat-form-field textarea,\n.mat-form-field-appearance-outline:not(.mat-form-field-invalid) .mat-form-field-outline-thick,\n.mat-form-field label,\n.select-multiple-native select {color: ${this.palletColors.fontColor}!important;caret-color: ${this.palletColors.fontColor}!important;}\n.mat-form-field-underline,\n.mat-form-field-appearance-fill .mat-form-field-underline::before,\n.mat-form-field-ripple {background: ${this.palletColors.fontColor}!important;}\n.mat-checkbox-checked.mat-accent .mat-checkbox-background, .mat-checkbox-indeterminate.mat-accent .mat-checkbox-background,\n.mat-checkbox:not(.mat-checkbox-disabled).mat-accent .mat-checkbox-ripple .mat-ripple-element {background-color: ${this.palletColors.checkboxBackground} !important;}\n.mat-checkbox-checkmark-path {stroke: ${this.palletColors.checkboxColor} !important;}\n.mat-checkbox-checkmark {fill: ${this.palletColors.checkboxColor} !important;}\n.mat-checkbox-mixedmark {background-color: ${this.palletColors.checkboxColor} !important;}\n.mat-checkbox-frame {border-color: ${this.palletColors.checkboxOutlineColor}!important;}\n.mat-checkbox-label {color: ${this.palletColors.fontColor}!important;}\n.mat-radio-outer-circle {border-color: ${this.palletColors.checkboxBackground}!important;}\n.mat-radio-ripple .mat-ripple-element, .mat-radio-inner-circle {background-color: ${this.palletColors.checkboxBackground} !important;}\n.home-list-cards .list .mat-list-item-content .mat-icon {color: ${this.palletColors.fontColor};}\n.home-list-cards .list button .mat-badge-content {background: ${this.palletColors.fontColor};}\n.koala-dialog .mat-dialog-title h2 {color: ${this.palletColors.fontColor};}\n.koala-dialog .mat-dialog-title mat-icon {color: ${this.palletColors.fontColor}!important;}\n.koala-dialog .mat-dialog-container {background: ${this.palletColors.firstColor}}\n.list-filter mat-icon {color: ${this.palletColors.filterIconColor}!important;}\nkoala-page .menu-options {background: ${this.palletColors.menuBackground};}\nkoala-page .toolbar {background: ${this.palletColors.toolbarBackground};}\nkoala-page .toolbar .btn-collapse-menu,\nkoala-page .btn-toolbar span{color: ${this.palletColors.toolbarColor};}\nkoala-page .btn-toolbar span.icon-user,\n.user-presentation span.icon-user {background: ${this.palletColors.userPresentationUserBackground};color: ${this.palletColors.userPresentationUserFontColor};}\n.user-presentation {background: ${this.palletColors.userPresentationBackground};}\n.user-presentation span.username {color: ${this.palletColors.toolbarColor};}\n.mat-drawer.mat-drawer-push {background-color: ${this.palletColors.bodyBackground};}\nkoala-menu .title {background: ${this.palletColors.menuTitleBackground};color: ${this.palletColors.menuTitleColor};}\nkoala-menu ul li,\nkoala-menu ul li a {color: ${this.palletColors.menuOptionsColor};}\nkoala-menu ul li:hover,\nkoala-menu ul li:hover a {color: ${this.palletColors.menuOptionsColorHover} !important;}\nkoala-menu ul li.active,\nkoala-menu ul li.expanded {color: ${this.palletColors.menuOptionsColorActive} !important;border-left: 4px solid ${this.palletColors.menuOptionsColorActive} !important;background: ${this.palletColors.menuOptionsBackground} !important;}\nkoala-menu ul li.active a,\nkoala-menu ul li.expanded a {color: ${this.palletColors.menuOptionsColorActive} !important;background: ${this.palletColors.menuOptionsBackground} !important;}\nkoala-menu ul li li:hover,\nkoala-menu ul li li:hover a {color: ${this.palletColors.menuOptionsColorHover} !important;}\nkoala-menu ul li li.active,\nkoala-menu ul li li.active a {color: ${this.palletColors.menuOptionsColorActive} !important;}\nkoala-menu ul li koala-icon svg *,\nkoala-menu ul li a koala-icon svg * {fill: ${this.palletColors.menuOptionsColor};}\nkoala-menu ul li:hover koala-icon svg *,\nkoala-menu ul li:hover a koala-icon svg * {fill: ${this.palletColors.menuOptionsColorHover} !important;}\nkoala-menu ul li.active koala-icon *,\nkoala-menu ul li.expanded koala-icon * {fill: ${this.palletColors.menuOptionsColorActive} !important;}\nkoala-menu ul li li:hover koala-icon *,\nkoala-menu ul li li:hover a koala-icon * {fill: ${this.palletColors.menuOptionsColorHover} !important;}\nkoala-menu ul li li.active koala-icon *,\nkoala-menu ul li li.active a koala-icon * {fill: ${this.palletColors.menuOptionsColorActive}!important;}\n.notifications-content .title {color: ${this.palletColors.notificationTitleColor}!important;}\n.notifications-content .empty,\n.notifications-content .titleList {color: ${this.palletColors.notificationContentTitleColor}!important;}\n.notifications-content .iconList {color: ${this.palletColors.notificationContentIconColor}!important;}\n.notifications-content .textList {color: ${this.palletColors.notificationTitleColor}!important;}\n.list-container {box-shadow: 0 1px 3px ${this.palletColors.shadowColorTableList};}\n.list-container .list table.table-hover tr:hover {background: ${this.palletColors.listItemBackgroudHover};}\n.list-container .list table.table-hover tr:active {background: ${this.palletColors.listItemBackgroundActive};}\n.list-container .list-filter .advanced {background: ${this.palletColors.firstColor};}\n.list-container nav.menu-list {background: ${this.palletColors.firstColor};color: rgba(25, 118, 210, .3);}\n.content {background: ${this.palletColors.listContentBackground};}\n.mat-tab-group .mat-tab-label {color: ${this.palletColors.fontColor};}\n.mat-tab-group .mat-ink-bar {background-color: ${this.palletColors.fontColor}!important;}\n.mat-table {background: ${this.palletColors.listBackground};color: ${this.palletColors.fontColor};}\n.mat-table th {color: ${this.palletColors.listTitleItemColor}!important;}\n.mat-sort-header-arrow {color: ${this.palletColors.listItemColor}!important;}\n.mat-table td {color: ${this.palletColors.listItemColor}!important;}`;\n const head = document.head || document.getElementsByTagName('head')[0];\n const style = document.createElement('style');\n head.appendChild(style);\n style.appendChild(document.createTextNode(css));\n }\n\n private initOAuth2() {\n KoalaOauthConfig.config.subscribe(config => this.startConfig(config));\n if (KoalaOauthConfig.hasConfig()) {\n KoalaOauthConfig.setConfig(KoalaOauthConfig.getConfig());\n }\n }\n\n private startConfig(config: KoalaOauth2ConfigInterface) {\n if (config.clientId) {\n this.oauth2Service.configure({\n redirectUri: window.location.origin,\n redirectUriAfterAuth: this.defaultPage,\n responseType: 'code',\n clientId: config.clientId,\n scope: config.scope,\n issuer: config.domain,\n customQueryParams: config.customQueryParams,\n endpointToken: config.endpointToken ?? null,\n endpointClaims: config.endpointClaims ?? null\n });\n this.oauth2Service.loadDiscoveryDocumentAndTryLogin().then();\n\n if (this.oauthEventsSubscription) {\n this.oauthEventsSubscription.unsubscribe();\n }\n this.oauthEventsSubscription = this.oauth2Service.events.subscribe(event => {\n if (event === 'userAuthenticated' || event === 'refreshToken') {\n const claims = this.oauth2Service.getIdentityClaims();\n if (claims && (\n !TokenFactory.hasToken() ||\n (TokenFactory.hasToken() && event === 'refreshToken')\n )) {\n this.tokenService.setToken(jwtEncode({\n accessToken: this.oauth2Service.getAccessToken(),\n idToken: this.oauth2Service.getIdToken(),\n refreshToken: this.oauth2Service.getRefreshToken(),\n login: claims[config.indexLoginName] ?? 'Undefined',\n expired: this.oauth2Service.getAccessTokenExpiration(),\n code: this.oauth2Service.getCode()\n }, 'secret'))\n }\n\n if (event === 'userAuthenticated') {\n setTimeout(() => this.validationScope$.next(false), 300);\n }\n } else if (event === 'getToken') {\n this.validationScope$.next(true);\n }\n });\n }\n }\n}\n","<div *ngIf=\"showLoaderPage | async\" class=\"koala-loader-pg\">\n <div class=\"loader-content\">\n <figure>\n <img [src]=\"logo\" alt=\"Logotipo\"/>\n <figcaption *ngIf=\"(messageLoaderPage | async) as messageLoader\" [innerHTML]=\"messageLoader\"></figcaption>\n </figure>\n <mat-spinner></mat-spinner>\n </div>\n</div>\n<app-loader-page *ngIf=\"(loaderSubject | async) as loader\" [progress]=\"loader.progress\" [show]=\"loader.show\"\n [typeLoader]=\"loader.typeLoader\"></app-loader-page>\n<mat-drawer-container autosize class=\"menu-container\">\n <mat-drawer #drawer class=\"menu-options\" [mode]=\"isMobile ? 'push' : 'side'\">\n <img [src]=\"logo\" alt=\"Logotipo\" id=\"logotipo\"/>\n <ng-content *ngIf=\"showMenu\" select=\"[menu-options]\"></ng-content>\n </mat-drawer>\n\n <mat-toolbar *ngIf=\"!!(logged$ | async) && (username$ | async)\" class=\"toolbar\">\n <img *ngIf=\"!showMenu\" [src]=\"logo\" alt=\"Logotipo Toolbar\" id=\"logotipo-toolbar\"/>\n <button (click)=\"toogleMenu()\" *ngIf=\"showMenu\" [color]=\"color\" class=\"btn-collapse-menu\" mat-icon-button>\n <mat-icon>menu</mat-icon>\n </button>\n <span class=\"spacer\"></span>\n\t <div class=\"menu-toolbar\">\n\t\t <ng-content select=\"[menu-toolbar]\"></ng-content>\n\t </div>\n <div *ngIf=\"(notifications | async) as notificationList\">\n <button *ngIf=\"notifications\" [color]=\"color\" [matMenuTriggerFor]=\"notificationsMenu\" class=\"btn-toolbar\"\n mat-icon-button>\n <mat-icon\n\t [matBadgeHidden]=\"notificationList.length === 0\"\n\t [matBadge]=\"notificationList.length.toString()\"\n\t matBadgeColor=\"warn\">notifications\n </mat-icon>\n </button>\n <mat-menu #notificationsMenu=\"matMenu\" class=\"menu-list\" yPosition=\"below\">\n <koala-notification-list\n (delete)=\"deleteNotification.emit($event)\"\n (deleteAll)=\"deleteAllNotifications.emit($event)\"\n [notifications]=\"notificationList\">\n </koala-notification-list>\n </mat-menu>\n </div>\n <button [color]=\"color\" [matMenuTriggerFor]=\"userOptions\" class=\"btn-toolbar\" mat-button>\n <span>{{username$ | async}}</span>\n <span class=\"icon-user\">{{firstUserLetter$ | async}}</span>\n </button>\n <mat-menu #userOptions=\"matMenu\" class=\"user-menu menu-list\" yPosition=\"below\">\n <div class=\"user-presentation\">\n <span class=\"icon-user\">{{firstUserLetter$ | async}}</span><br/>\n <span class=\"username\">{{username$ | async}}</span>\n </div>\n <button (click)=\"btn.action()\" *ngFor=\"let btn of userMenuOptions\" mat-menu-item>\n <mat-icon>{{btn.icon}}</mat-icon>\n <span>{{btn.name}}</span>\n </button>\n <button (click)=\"logout()\" mat-menu-item>\n <mat-icon>exit_to_app</mat-icon>\n <span>{{language === 'ptBr' ? 'Sair' : 'Logout'}}</span>\n </button>\n </mat-menu>\n </mat-toolbar>\n\n <ng-content class=\"page-content\" select=\"[page-content]\"></ng-content>\n\n</mat-drawer-container>\n\n<ng-content class=\"loading-info-content\" select=\"[loading-info-content]\"></ng-content>\n","import { NgModule } from \"@angular/core\";\nimport { CommonModule } from \"@angular/common\";\nimport { PageComponent } from \"./page.component\";\nimport { NotificationComponent } from \"./notifications/notification.component\";\nimport { LoaderBarPageComponent } from \"../loader/loader-bar-page.component\";\nimport { MatBadgeModule } from \"@angular/material/badge\";\nimport { MatProgressBarModule } from \"@angular/material/progress-bar\";\nimport { MatToolbarModule } from \"@angular/material/toolbar\";\nimport { MatTooltipModule } from \"@angular/material/tooltip\";\nimport { MatButtonModule } from \"@angular/material/button\";\nimport { MatIconModule } from \"@angular/material/icon\";\nimport { MatSidenavModule } from \"@angular/material/sidenav\";\nimport { MatListModule } from \"@angular/material/list\";\nimport { MatMenuModule } from \"@angular/material/menu\";\nimport { MatProgressSpinnerModule } from \"@angular/material/progress-spinner\";\nimport { RouterModule } from \"@angular/router\";\n\n@NgModule({\n declarations: [\n PageComponent,\n NotificationComponent,\n LoaderBarPageComponent\n ],\n exports: [\n PageComponent,\n RouterModule\n ],\n imports: [\n CommonModule,\n RouterModule,\n MatBadgeModule,\n MatProgressSpinnerModule,\n MatProgressBarModule,\n MatToolbarModule,\n MatTooltipModule,\n MatButtonModule,\n MatIconModule,\n MatSidenavModule,\n MatListModule,\n MatMenuModule\n ]\n})\nexport class KoalaPageModule {}\n","import { Injectable } from \"@angular/core\";\nimport { HashLocationStrategy } from \"@angular/common\";\nimport { KoalaEnvironment } from \"../environments/koalaEnvironment\";\n\n@Injectable()\nexport class KoalaParameterHashLocationStrategy extends HashLocationStrategy {\n prepareExternalUrl(internal: string): string {\n const hasToken = !!localStorage.getItem(KoalaEnvironment.environment?.storageTokenName);\n return !hasToken ?\n window.location.search + super.prepareExternalUrl(internal) :\n super.prepareExternalUrl(internal);\n }\n}\n","export class KoalaNotFoundError extends Error {\n}\n","export class KoalaUnhautorizedError extends Error {\n}\n","export class KoalaClientError extends Error {\n}\n","export class KoalaSuccessError extends Error {\n}\n","import { KoalaNotFoundError } from \"./koala.not-found.error\";\nimport { KoalaUnhautorizedError } from \"./koala.unhautorized.error\";\nimport { KoalaClientError } from \"./koala.client.error\";\nimport { KoalaSuccessError } from \"./koala.success.error\";\nimport { HttpErrorResponse } from \"@angular/common/http\";\nimport { KoalaAlertEnum } from \"@koalarx/ui/alert\";\n\nexport interface KoalaResponseInterface {\n error: boolean;\n alertEnum: KoalaAlertEnum;\n statusCode?: number;\n urlRequest?: string;\n message: string;\n data?: any;\n}\n\nexport class KoalaErrorsHelper {\n public static generate(e: Error | HttpErrorResponse, urlRequest?: string, customMessage?: string): KoalaResponseInterface {\n\n let errorMessage = {\n error: true,\n message: (customMessage ? customMessage : e.message),\n urlRequest\n } as KoalaResponseInterface;\n\n if (e instanceof KoalaSuccessError) {\n errorMessage.error = false;\n errorMessage.statusCode = 200;\n errorMessage.alertEnum = KoalaAlertEnum.success;\n } else if (e instanceof KoalaNotFoundError) {\n errorMessage.statusCode = 404;\n errorMessage.alertEnum = KoalaAlertEnum.notFound;\n } else if (e instanceof KoalaUnhautorizedError) {\n errorMessage.statusCode = 401;\n errorMessage.alertEnum = KoalaAlertEnum.unhautorized;\n } else if (e instanceof KoalaClientError) {\n errorMessage.statusCode = 400;\n errorMessage.alertEnum = KoalaAlertEnum.badRequest;\n } else if (e instanceof HttpErrorResponse) {\n errorMessage.urlRequest = e.url;\n errorMessage.statusCode = e.status;\n errorMessage.alertEnum = KoalaAlertEnum.internalServerError;\n if (e.error && e.error.message) {\n errorMessage.message = e.error.message;\n }\n } else {\n errorMessage.statusCode = 500;\n errorMessage.alertEnum = KoalaAlertEnum.internalServerError;\n }\n\n return errorMessage;\n }\n}\n","import { koala } from \"@koalarx/utils\";\nimport { HttpHeaders } from \"@angular/common/http\";\nimport {