{"version":3,"file":"main.3532e56a99d8af4c.js","mappings":"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","names":["AuthGuard","constructor","router","sessionService","this","canLoad","route","segments","length","createUrlTree","canActivate","state","jtiFound","params","sessionID","validSession","checkForExistingSession","jti","getToken","_angular_core__WEBPACK_IMPORTED_MODULE_1__","factory","SKIP_LOGGING_ON_FAILURE","HttpContextToken","BusinessError","CategorizedError","title","description","data","super","handle","forwardError","errorLogString","JSON","stringify","console","error","Error","StorageError","shouldNotify","HttpLoaderFactory","http","TranslateHttpLoader","SharedModule","CommonModule","KendoModule","MatDatepickerModule","MatChipsModule","MatIconModule","MatInputModule","MatDialogModule","NgxDocViewerModule","ReactiveFormsModule","TranslateModule","loader","provide","TranslateLoader","useFactory","deps","HttpClient","DropDownsModule","DateInputsModule","ButtonsModule","InputsModule","IconsModule","ScrollViewModule","MenusModule","NotificationModule","ProgressBarModule","ChartsModule","FormsModule","IndicatorsModule","SchedulerModule","LayoutModule","TooltipModule","LabelModule","GridModule","WindowModule","ListViewModule","DialogsModule","UploadsModule","modules","DragDropModule","MatButtonModule","MatListModule","MatSidenavModule","MatToolbarModule","MatCheckboxModule","MatCardModule","MatSelectModule","MatTabsModule","MatTableModule","MatNativeDateModule","MatPaginatorModule","MatSnackBarModule","MatProgressSpinnerModule","MatRadioModule","MatExpansionModule","MaterialModule","MAT_SNACK_BAR_DEFAULT_OPTIONS","useValue","horizontalPosition","verticalPosition","imports","AuthService","_appService","_cookieService","_encryptionService","_localStorageService","_userInfoService","_sessionService","_logService","_router","Buffer","from","toString","_authAPIDomain","getAppConfigs","AUTH","BaseUrl","_clientPortalAPIDomain","CLIENTPORTAL","_licenseAPIDomain","LICENSE","_uriAPIDomain","URI","isUserLoggedIn","_isUserLoggedIn","saveTokenAndJTIOnSystemStorage","token","createOrUpdateTokenEntry","saveNewTokensOnSystemStorage","checkLicenseExpiry","licenseDetails","AppIsLicenseExpired","getUserTypeDetailsByID","userID","startsWith","getClientDetails","includes","getProfessionalDetails","throwError","determineIfUserIsClient","userData","hasOwnProperty","performProfessionalActivationCheck","getClientList","pipe","map","clients","Data","of","saveLogoInBase64","logoInBase64","expiryTime","setLogo","logo","expiresAt","saveAllUserDataOnSystemStorage","userIsClient","userDetails","userLicenseDetails","refreshToken","getExpiryTime","commonData","license","timezone","Date","getTimezoneOffset","allData","allDataAsString","userDataWithoutLogo","ClientID","ClientName","ClientEmail","ClientGroupName","CLientGroupCode","LocTypeCode","LocTypeName","isAuthorizeTimesheetYN","isHideComplianceYN","dataWithoutLogo","dataWithoutLogoAsString","canStoreData","createEncryptedStorageMapping","ClientLogo","ProfessionalID","ProfessionalName","ProfessionalEmail","ProfessionalLevel","ProfessionalStatus","LevelName","ProfessionalLogo","saveAllDataInCookie","cookieDataAsString","encryptData","setKeepMeLoggedIn","date","setDate","getDate","_cookieOptions","expires","domain","window","location","hostname","secure","sameSite","storeUnencoded","hasKey","encodeBase64","removeKeepMeLoggedIN","put","remove","checkKeepMeLoggedIn","cookieData","obj","get","encData","decryptData","parse","navigateByUrl","resetStorageData","flushStorageData","triggerLogout","target","id","getJTIFromCurrentRoute","userType","isUserTypeClient","getClientInfo","getProfessionalInfo","updateLoginLogoutStatus","subscribe","next","_","appLogout","user_id","onMobileDevice","logoutUser","getLicenseInfo","checkAccessToken","payload","authAPI","Versions","V1","ACCESS","AccessCode","PATH","post","context","HttpContext","set","getTokenAndJTI","requestBody","CLIENTPORTALTOKEN","ClientLogin","getUserIDAndRefreshToken","userAuthAPI","USER","GetUserAuth","url","authHeaders","HttpHeaders","Authorization","headers","getUserIDAndRefreshTokenJti","getRefreshedToken","currentExpiredToken","userRefreshToken","refreshTokenAPI","CLIENTPORTALREFRESHTOKEN","RefreshToken","getLicenseDetails","userLicenseAPI","LOGGEDINUSERCOUNT","LoggedInUserCount","tokenAndJTI","clientAuthAPI","GetClientAuth","professionalAuthAPI","GetProfessionalAuth","recoverPassword","forgotPasswordAPI","FORGOTPASSWORD","forgotPassword","getCompleteUrl","ShortCode","uriDecodeAPI","URICODER","UriDecode","ApiKey","getAppSettings","apiCredentials","apiKey","AgentId","agentID","Base64ApiKey","Base64AgentId","stringSequence","Math","floor","random","clientId","userAuthAPIEndpoint","DASHBOARD","GetClientList","getOldPlientPortalLink","oldClientportalLinkAPIEndpoint","GetOldPlientPortalLink","status","loginLogoutStatusAPIEndpoint","LOGINLOGOUTSTATUS","loginLogoutStatus","UserLoginStatus","UserId","Portal","_angular_core__WEBPACK_IMPORTED_MODULE_10__","SessionService","encryptionService","appService","localStorage","createNewSession","TokenAndJTI","dataKey","expiry","userDataAsString","updateTokenAndJTIOnStorage","newJTI","newToken","split","undefined","key","tempKey","tokenEntry","storage","getItem","getData","setItem","debug","getLogo","logoEntry","mappingKey","encryptedToken","getDecryptedStorageValue","encryptedData","jwtBase64","tokenExpiry","decodeBase64","exp","tokenKey","tokenTempKey","encryptedTokenData","removeItem","removeExpiredEntries","updateRefreshToken","currentJTI","newRefreshToken","newData","updateLogoExpiry","existingLogoEntry","newLogoData","updateTokenAndRefreshTokenOnStorage","calculateTokenTimeout","jwtToken","timeout","getTime","now","setTimeout","getAndSetRefreshToken","getRefreshToken","storageData","encryptedDataString","decryptedData","authAPIDomain","refreshTokenResponse","tap","isNewTokenRequired","removeMappingFor","removeTokenCookie","currentTime","decryptedStorageValueAsString","entryType","value","Object","entries","slice","tokenData","logoData","_angular_core__WEBPACK_IMPORTED_MODULE_4__","UserInfoService","popup","_userInfo","storeData","closeAll","AppService","_appConfigs","setAppConfigs","config","APIs","_appSettings","setAppSettings","EncryptionService","_encryptionKey","encryptionSetting","secretKey","dataToEncrypt","CryptoJS","dataToDecrypt","LoadingService","BehaviorSubject","events","filter","event","NavigationStart","NavigationEnd","NavigationCancel","NavigationError","stopLoading","showLoading","isLoading","loadingStatus","asObservable","_angular_core__WEBPACK_IMPORTED_MODULE_3__","LocalStorageService","sessionJTI","initializeData","entireEncryptedData","keyName","getLoggedInUserType","getClientData","storageType","userDataSizeInKB","sufficientLocalStorageSpace","sufficientSessionStorageSpace","appMaxLocalStorageDataLimitInKB","maxLocalStorageSpaceAllowedInKB","occupiedSpaceInKB","getStorageSpaceInKB","remainingSpaceInKB","browserLimitInKB","UTF16Format","totalSize","sessionStorage","mappingSizeInKB","isNaN","ceil","LogLevel","LogEntry","level","screen_route","log_event","log_message","buildLogString","logString","basicLogDetails","extendedLogDetails","formatOptions","deviceLogDetails","optionalDetails","entryNumber","formattedString","entry","ConsoleLog","log","clear","LocalStorageLog","logEntry","includeEntries","entriesPresent","push","WebAPILog","endpoint","httpBackend","usingMobileDevice","jtiProvided","logRequestHeader","HttpRequest","response","HttpResponse","catchError","handleErrors","LogPublisherService","webAPI","pushLogAPIEndpoint","LOG","CLIENTLOGS","PostClientLogs","logPublishersConfig","buildPublishers","publishers","core","LogService","deviceInfoService","logPublisherService","defaultLevel","message","extendedLogs","createLog","info","msg","warn","fatal","appLogin","all","extended","shouldIncludeLogsOf","getDeviceInfo","device_type","deviceType","publisher","shouldInclude","PageTitleService","_route","_titleService","_translateService","setTitleBasedOnRoute","includePrefix","translationsBasePath","finalTitlePage","pageNamePart","pop","translationPathForPageTitle","translations$","forkJoin","prefix","pageTitle","translation","setTitle","toLowerCase","i0","NotificationComponent","snackBar","MAT_SNACK_BAR_DATA","selectors","SnackbarService","_snackBar","verticalPositionConfig","horizontalPositionConfig","timeoutConfig","initializeSnackBarConfigs","verticalPositionValid","defaultHorizontalPosition","defaultVerticalPosition","defaultTimeoutInMS","showSnackBar","openFromComponent","duration","afterDismissed","action","showWarningSnackBar","err","Success","showErrorSnackBar","showSuccessSnackBar","ThemeService","clientPortalDomain","getThemeDetail","THEME","ApplicationSetting","DashboardService","formPageRoutes","menuOptions","forEach","option","currentPageRoute","optionKeyword","cssClass","toUpperCase","o","parentId","optionPath","parentOptionIndex","findIndex","potentialParent","parentPageRoute","getMenuListData","clientTypeParameter","clientLoginParameter","professionalLevel","menuListEndpoint","GetMenuListData","queryArgs","getHomeSection","GetHomeSection","getQualifications","GetQualificationsList","getShiftWeek","GetShiftWeek","dateFrom","dateTo","getShiftCount","GetShiftCount","getShiftChart","GetShiftChart","getStaffSummary","GetStaffSummary","getAgencyFillRatio","GetAgencyFillRatio","getTimesheetApproval","GetTimesheetApproval","getShiftsInvoice","GetShiftsInvoice","getShiftsUnInvoice","GetShiftsUnInvoice","getServiceLocation","ClientId","ClientType","serviceLocationAPI","BOOKING","GetServiceLocation","AuthModule","CarouselModule","HttpClientModule","RouterModule","AppInitializationWithUriPage","_activeRoute","_authService","ngOnInit","_shortUrl","snapshot","queryParams","lk","completeUrlSubscription","showExpired","_completeUrl","href","ngOnDestroy","unsubscribe","AppInitializationPage","_dashboardService","_pageTitleService","_snackbarService","deviceDetectorService","_jtiProvided","args1","_tokenProvided","args2","_refreshTokenProvided","args3","_isLoggedIn","args4","activeUserLogo","defaultLogo","authenticateLoggedInUser","authenticateCredentials","currentToken","currentRefreshToken","forClient","authenticationSubscription","_newToken","_newRefreshToken","concatMap","userIDAndRefreshTokenResponse","licenseDetailsResponse","userDetailsResponse","userAllowedToLogin","saveUserData","mergeMap","getLandingPageRoute","landingPage","sessionCookie","isMobile","isTablet","join","_pageLoadTimeout","errorResponse","loginPageArgs","_subscriptions","tokenProvided","credentialSubscription","userLicense","page","landingPageRoute","subscription","TermsAndConditionsDialogComponent","NoWhiteSpaceDirective","formControl","onChange","inputText","valueWithoutSpaces","noWhiteSpace","replace","trim","control","setValue","ctx","demoAnimation","trigger","transition","style","transform","animate","LoginFormComponent","authService","loadingService","logService","snackbarService","dashboardService","matDialog","EventEmitter","FormGroup","FormControl","Validators","invalidLength","password","rememberMe","formValueChangesSubscription","loginForm","valueChanges","notify","login","code","accessCode","clientID","clientSecret","authSubscription","tokenAndJTIResponse","name","stack","rememberMeIsChecked","togglePasswordDisplay","hidePassword","togglePasswordFieldIcon","toggleIcon","pageSection","userTypeSection","showPasswordRecoveryForm","formChange","openTermsAndConditionsDialog","switchedOn","dialogRef","open","position","bottom","afterClosed","accepted","controls","PasswordRecoveryFormComponent","EmailId","passwordRecoveryForm","eitherFieldsAreFilled","emailValid","valid","emailProvided","usernameProvided","usernameValid","formIsValid","formResetted","setErrors","required","fieldUsedForRecovery","form","passwordRecoverySubscription","reset","disableAlternativeField","currentField","alternativeField","enable","disable","enableAllFields","emailField","clientIdField","touched","ShowcaseCarouselComponent","loop","autoplay","dots","responsive","items","nav","FieldLengthDirective","fieldValue","parseInt","appFieldLength","substring","AccessCodeFormComponent","proceedForLogin","accessCodeForm","result","clientLogo","FormNotificationComponent","Map","applyClass","type","closeNotification","close","routes","path","pathMatch","redirectTo","component","LoginPage","_qurParam","se","companyCode","ac","clearBackButtonHistory","authStatusType","authStatus","showNotificationFor","closeMessageBox","notClosed","toggleToForm","notificationShown","lastForm$","currentForm","toggleToPreviousForm","userLogo","updateData","notificationType","history","pushState","document","addEventListener","loadChildren","__webpack_require__","then","module","CoreModule","ErrorModule","AppRoutingModule","enableTracing","AppComponent","translateService","lang","language","browserLanguage","getBrowserLang","setDefaultLang","use","SpinnerService","Subject","_spinnerSubject","show","hide","AuthInterceptor","localStorageService","userInfoService","intercept","request","nextHandler","indexOf","tokenPresent","onMobileDevices","mobileDeviceSpecificHeader","originalReq","bypassSecurity","clone","request_data","request_endpoint","AllInterceptorProviders","HTTP_INTERCEPTORS","useClass","multi","ErrorInterceptor","cookieService","source","registerLog","statusText","checkForAuthErrorResponse","responseBody","body","httpStatusCode","response_data","cookieOptions","ErrorService","snackBService","handleError","AppModule","bootstrap","APP_INITIALIZER","inject","Promise","resolve","configs","appSettings","require","ErrorHandler","DatePipe","BrowserModule","BrowserAnimationsModule","CookieModule","PagerModule","BackButtonDisableModule","__NgCli_bootstrap_1","bootstrapModule","catch","e","webpackContext"],"sourceRoot":"webpack:///","sources":["./src/app/core/guards/auth.guard.ts","./src/app/core/tokens/meta-data.token.ts","./src/app/modules/error/classes/business.error.ts","./src/app/modules/error/classes/categorized.error.ts","./src/app/modules/error/classes/storage.error.ts","./src/app/modules/shared/shared.module.ts","./src/app/shared/kendo.module.ts","./src/app/shared/material.module.ts","./src/app/shared/services/auth/auth.service.ts","./src/app/shared/services/auth/session.service.ts","./src/app/shared/services/auth/user-info.service.ts","./src/app/shared/services/core/app.service.ts","./src/app/shared/services/core/encryption.service.ts","./src/app/shared/services/core/loading.service.ts","./src/app/shared/services/core/local-storage.service.ts","./src/app/shared/models/log.interface.ts","./src/app/core/classes/log-entry.class.ts","./src/app/core/classes/console-log.class.ts","./src/app/core/classes/local-storage.class.ts","./src/app/core/classes/web-api-log.class.ts","./src/app/shared/services/core/log-publisher.service.ts","./src/app/shared/services/core/log.service.ts","./src/app/shared/services/core/page-title.service.ts","./src/app/core/components/notification/notification.component.html","./src/app/core/components/notification/notification.component.ts","./src/app/shared/services/core/snackbar.service.ts","./src/app/shared/services/core/theme.service.ts","./src/app/shared/services/dashboard/dashboard.service.ts","./src/app/modules/auth/auth.module.ts","./src/app/pages/auth/app-initialization-with-uri.page.html","./src/app/pages/auth/app-initialization-with-uri.page.ts","./src/app/pages/auth/app-initialization.page.ts","./src/app/pages/auth/app-initialization.page.html","./src/app/core/components/terms-and-conditions-dialog/terms-and-conditions-dialog.component.ts","./src/app/core/components/terms-and-conditions-dialog/terms-and-conditions-dialog.component.html","./src/app/modules/shared/directives/no-white-space-input.directive.ts","./src/app/modules/auth/components/login-form/login-form.component.html","./src/app/modules/auth/components/login-form/login-form.component.ts","./src/app/modules/auth/components/password-recovery-form/password-recovery-form.component.html","./src/app/modules/auth/components/password-recovery-form/password-recovery-form.component.ts","./src/app/modules/auth/components/showcase-carousel/showcase-carousel.component.html","./src/app/modules/auth/components/showcase-carousel/showcase-carousel.component.ts","./src/app/modules/shared/directives/field-length.directive.ts","./src/app/modules/auth/components/access-code-form/access-code-form.component.html","./src/app/modules/auth/components/access-code-form/access-code-form.component.ts","./src/app/modules/auth/components/form-notification/form-notification.component.ts","./src/app/modules/auth/components/form-notification/form-notification.component.html","./src/app/pages/auth/login.page.html","./src/app/app-routing.module.ts","./src/app/pages/auth/login.page.ts","./src/app/app.component.html","./src/app/app.component.ts","./src/app/core/components/spinner/spinner.service.ts","./src/app/core/interceptors/auth.interceptor.ts","./src/app/core/interceptors/index.ts","./src/app/core/interceptors/error.interceptor.ts","./src/app/shared/services/core/error.service.ts","./src/app/app.module.ts","./src/main.ts","./src/assets/configs/ sync ^\\.\\/appSettings\\.config\\..*\\.json$","./src/assets/configs/ sync ^\\.\\/config\\..*\\.json$"],"sourcesContent":["import { Injectable } from '@angular/core';\r\nimport {\r\n ActivatedRouteSnapshot,\r\n CanActivate,\r\n CanLoad,\r\n Route,\r\n Router,\r\n RouterStateSnapshot,\r\n UrlSegment,\r\n UrlTree\r\n} from '@angular/router';\r\nimport { Observable } from 'rxjs';\r\nimport { SessionService } from '@shared/services/auth/session.service';\r\n\r\ntype GuardResponse = Observable | Promise | boolean | UrlTree;\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class AuthGuard implements CanActivate, CanLoad {\r\n\r\n constructor(private router: Router, private sessionService: SessionService) {}\r\n\r\n canLoad(route: Route, segments: UrlSegment[]): GuardResponse {\r\n if (segments.length > 1) {\r\n return true;\r\n } else {\r\n return this.router.createUrlTree(['/error/unauthorized']);\r\n }\r\n }\r\n\r\n canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): GuardResponse {\r\n const jtiFound = route.params[\"sessionID\"];\r\n const validSession = this.checkForExistingSession(jtiFound);\r\n\r\n if (jtiFound && validSession) {\r\n return true;\r\n } else {\r\n return this.router.createUrlTree(['/error/unauthorized']);\r\n }\r\n }\r\n\r\n checkForExistingSession(jti: string) {\r\n const valideJTIFound = this.sessionService.getToken(jti);\r\n return valideJTIFound;\r\n }\r\n}\r\n","import { HttpContextToken } from \"@angular/common/http\";\r\n\r\nexport const SKIP_LOGGING_ON_FAILURE = new HttpContextToken(() => false);","import { CategorizedError } from \"@modules/error/classes\";\r\nimport { BusinessOperationErrorTypes } from \"@shared/models/error.interface\";\r\n\r\nexport class BusinessError extends CategorizedError {\r\n\r\n constructor(title: BusinessOperationErrorTypes, description: string, data?: T) {\r\n super(title as string, description, data);\r\n }\r\n\r\n handle(forwardError: boolean = false): void {\r\n // HERE: create error log via Logging Service.\r\n const errorLogString = `[${this.title}] ${this.description}: ${JSON.stringify(this.data)}`;\r\n console.error(errorLogString);\r\n\r\n if (forwardError) throw new Error(this.title);\r\n \r\n }\r\n\r\n}","export abstract class CategorizedError {\r\n\r\n constructor(public title: string, public description: string, public data?: T) { }\r\n\r\n abstract handle(shouldNotify: boolean): void;\r\n}","import { CategorizedError } from \"@modules/error/classes\";\r\nimport { StorageErrorTypes } from \"@shared/models/error.interface\";\r\n\r\nexport class StorageError extends CategorizedError {\r\n constructor(public override title: StorageErrorTypes, public override description: string, public override data?: T) {\r\n super(title as string, description, data);\r\n }\r\n\r\n handle(shouldNotify: boolean = false): void {\r\n const errorLogString = `[${this.title}] ${this.description}: ${JSON.stringify(this.data)}`;\r\n console.error(errorLogString);\r\n }\r\n\r\n}","import { NgModule } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { ReactiveFormsModule } from '@angular/forms';\r\nimport { DeliveryComponent } from './components/delivery/delivery.component';\r\nimport { ServiceComponent } from './components/service/service.component';\r\nimport { KendoModule } from '@shared/kendo.module';\r\nimport { QualificationComponent } from './components/qualification/qualification.component';\r\nimport { ShiftTypeComponent } from './components/shift-type/shift-type.component';\r\nimport { OrderByComponent } from './components/order-by/order-by.component';\r\nimport { ExpertiseComponent } from './components/expertise/expertise.component';\r\nimport { SubExpertiseComponent } from './components/sub-expertise/sub-expertise.component';\r\nimport { ShiftDocumentComponent } from './components/shift-document/shift-document.component';\r\nimport { ShiftInfectionComponent } from './components/shift-infection/shift-infection.component';\r\nimport { DatepickerComponent } from './components/datepicker/datepicker.component';\r\nimport { MatDatepickerModule } from '@angular/material/datepicker';\r\nimport { MatChipsModule } from '@angular/material/chips';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { MatDialogModule } from '@angular/material/dialog';\r\nimport { DocViewerComponent } from './components/doc-viewer/doc-viewer.component';\r\nimport { NgxDocViewerModule } from 'ngx-doc-viewer';\r\nimport { ImageViewerComponent } from './components/image-viewer/image-viewer.component';\r\nimport { PreferredPersonnelComponent } from './components/preferred-personnel/preferred-personnel.component';\r\nimport { CancelBookingComponent } from './components/cancel-booking/cancel-booking.component';\r\nimport { ReasonComponent } from './components/reason/reason.component';\r\nimport { DaterangePickerComponent } from './components/daterange-picker/daterange-picker.component';\r\nimport { StaffRequestTypeComponent } from './components/staff-request-type/staff-request-type.component';\r\nimport { StaffRequestReasonComponent } from './components/staff-request-reason/staff-request-reason.component';\r\nimport { PersonnelNameComponent } from './components/personnel-name/personnel-name.component';\r\nimport { MemberCardComponent } from '@modules/booking/components/member-card/member-card.component';\r\nimport { NoWhiteSpaceDirective } from './directives/no-white-space-input.directive';\r\nimport { FieldLengthDirective } from './directives/field-length.directive';\r\nimport { TranslateModule, TranslateLoader } from '@ngx-translate/core';\r\nimport { HttpClient } from '@angular/common/http';\r\nimport { TranslateHttpLoader } from '@ngx-translate/http-loader';\r\nimport { CustomDropdownComponent } from './components/custom-dropdown/custom-dropdown.component';\r\nimport { SelectionPopupComponent } from './components/selection-popup/selection-popup.component';\r\n\r\n\r\nexport function HttpLoaderFactory(http: HttpClient) {\r\n return new TranslateHttpLoader(http);\r\n}\r\n\r\n\r\n@NgModule({\r\n declarations: [\r\n DeliveryComponent,\r\n ServiceComponent,\r\n QualificationComponent,\r\n ShiftTypeComponent,\r\n OrderByComponent,\r\n ExpertiseComponent,\r\n SubExpertiseComponent,\r\n ShiftDocumentComponent,\r\n ShiftInfectionComponent,\r\n DatepickerComponent,\r\n DocViewerComponent,\r\n ImageViewerComponent,\r\n PreferredPersonnelComponent,\r\n CancelBookingComponent,\r\n ReasonComponent,\r\n DaterangePickerComponent,\r\n StaffRequestTypeComponent,\r\n StaffRequestReasonComponent,\r\n PersonnelNameComponent, \r\n MemberCardComponent,\r\n NoWhiteSpaceDirective,\r\n FieldLengthDirective,\r\n CustomDropdownComponent,\r\n SelectionPopupComponent\r\n ],\r\n imports: [\r\n CommonModule,\r\n KendoModule,\r\n MatDatepickerModule,\r\n MatChipsModule,\r\n MatIconModule,\r\n MatInputModule,\r\n MatDialogModule,\r\n NgxDocViewerModule,\r\n ReactiveFormsModule,\r\n TranslateModule.forChild({\r\n loader: {\r\n provide: TranslateLoader,\r\n useFactory: HttpLoaderFactory,\r\n deps: [HttpClient]\r\n }\r\n })\r\n ],\r\n exports:[\r\n DeliveryComponent,\r\n ServiceComponent,\r\n QualificationComponent,\r\n ShiftTypeComponent,\r\n OrderByComponent,\r\n ExpertiseComponent,\r\n SubExpertiseComponent,\r\n ShiftDocumentComponent,\r\n ShiftInfectionComponent,\r\n DatepickerComponent,\r\n DocViewerComponent,\r\n ImageViewerComponent,\r\n PreferredPersonnelComponent,\r\n CancelBookingComponent,\r\n DaterangePickerComponent,\r\n ReasonComponent,\r\n StaffRequestTypeComponent,\r\n StaffRequestReasonComponent,\r\n PersonnelNameComponent,\r\n MemberCardComponent,\r\n NoWhiteSpaceDirective,\r\n CustomDropdownComponent,\r\n SelectionPopupComponent,\r\n FieldLengthDirective\r\n\t]\r\n})\r\nexport class SharedModule { }\r\n","import { NgModule } from '@angular/core';\r\nimport { DropDownsModule } from \"@progress/kendo-angular-dropdowns\";\r\nimport { DateInputsModule } from '@progress/kendo-angular-dateinputs';\r\nimport { ButtonsModule } from \"@progress/kendo-angular-buttons\";\r\nimport { InputsModule } from \"@progress/kendo-angular-inputs\";\r\nimport { IconsModule } from \"@progress/kendo-angular-icons\";\r\nimport { ScrollViewModule } from \"@progress/kendo-angular-scrollview\";\r\nimport { MenusModule } from \"@progress/kendo-angular-menu\";\r\nimport { NotificationModule } from \"@progress/kendo-angular-notification\";\r\nimport { ProgressBarModule } from \"@progress/kendo-angular-progressbar\";\r\nimport { ChartsModule } from '@progress/kendo-angular-charts';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { IndicatorsModule } from \"@progress/kendo-angular-indicators\";\r\nimport { SchedulerModule } from '@progress/kendo-angular-scheduler';\r\nimport { LayoutModule } from '@progress/kendo-angular-layout';\r\nimport { LabelModule } from '@progress/kendo-angular-label';\r\nimport { TooltipModule } from '@progress/kendo-angular-tooltip';\r\nimport { GridModule } from '@progress/kendo-angular-grid';\r\nimport { WindowModule } from \"@progress/kendo-angular-dialog\";\r\nimport { ListViewModule } from \"@progress/kendo-angular-listview\";\r\nimport { DialogsModule } from \"@progress/kendo-angular-dialog\";\r\nimport { UploadsModule } from \"@progress/kendo-angular-upload\";\r\n\r\nconst modules: any[] = [\r\n DropDownsModule,\r\n DateInputsModule,\r\n ButtonsModule,\r\n InputsModule,\r\n IconsModule,\r\n ScrollViewModule,\r\n MenusModule,\r\n NotificationModule,\r\n ProgressBarModule,\r\n ChartsModule,\r\n FormsModule,\r\n IndicatorsModule,\r\n SchedulerModule,\r\n LayoutModule,\r\n TooltipModule,\r\n LabelModule,\r\n GridModule,\r\n WindowModule,\r\n ListViewModule,\r\n DialogsModule,\r\n UploadsModule,\r\n]\r\n\r\n@NgModule({\r\n exports: modules\r\n})\r\nexport class KendoModule { }\r\n","import { NgModule } from '@angular/core';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { MatListModule } from '@angular/material/list';\r\nimport { MatSidenavModule } from '@angular/material/sidenav';\r\nimport { MatToolbarModule } from '@angular/material/toolbar';\r\nimport { MatCheckboxModule } from '@angular/material/checkbox';\r\nimport { MatCardModule } from '@angular/material/card';\r\nimport { MatSelectModule } from '@angular/material/select';\r\nimport { MatTabsModule } from '@angular/material/tabs';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatTableModule } from '@angular/material/table';\r\nimport { MatPaginatorModule } from '@angular/material/paginator';\r\nimport { MatDatepickerModule } from '@angular/material/datepicker';\r\nimport { MatNativeDateModule } from '@angular/material/core';\r\nimport { MAT_SNACK_BAR_DEFAULT_OPTIONS, MatSnackBarModule } from '@angular/material/snack-bar';\r\nimport { MatProgressSpinnerModule } from '@angular/material/progress-spinner';\r\nimport { MatExpansionModule } from '@angular/material/expansion';\r\nimport { MatRadioModule } from '@angular/material/radio';\r\nimport { MatChipsModule } from '@angular/material/chips';\r\nimport { MatDialogModule } from '@angular/material/dialog';\r\nimport { DragDropModule } from '@angular/cdk/drag-drop';\r\n\r\nconst modules: any[] = [\r\n DragDropModule,\r\n MatButtonModule,\r\n MatInputModule,\r\n MatListModule,\r\n MatSidenavModule,\r\n MatToolbarModule,\r\n MatCheckboxModule,\r\n MatCardModule,\r\n MatSelectModule,\r\n MatTabsModule,\r\n MatIconModule,\r\n MatTableModule,\r\n MatDatepickerModule,\r\n MatNativeDateModule,\r\n MatPaginatorModule,\r\n MatSnackBarModule,\r\n MatProgressSpinnerModule,\r\n MatRadioModule,\r\n MatExpansionModule,\r\n MatDialogModule,\r\n MatChipsModule\r\n]\r\n\r\n@NgModule({\r\n imports: modules,\r\n exports: modules,\r\n providers: [\r\n { provide: MAT_SNACK_BAR_DEFAULT_OPTIONS, useValue: { horizontalPosition: 'end', verticalPosition: 'bottom' } }\r\n ]\r\n})\r\nexport class MaterialModule { }\r\n","import { Injectable } from '@angular/core';\r\nimport { HttpClient, HttpContext, HttpHeaders } from '@angular/common/http';\r\nimport { Router } from '@angular/router';\r\nimport { map, of, tap, throwError } from 'rxjs';\r\nimport { CookieService, CookieOptions } from 'ngx-cookie';\r\n\r\nimport { SessionService } from '@shared/services/auth/session.service';\r\nimport { AppService, LocalStorageService, EncryptionService } from '@shared/services/core';\r\nimport { LogService } from '@shared/services/core/log.service';\r\n\r\nimport { AccessCodeAndClientSecret, AccessCodeAndID, ClientUserData, ClientUserDataWithoutLogo, LogoEntryModel, ProfessionalUserData, ProfessionalUserDataWithoutLogo } from '@shared/models/auth.interface';\r\n\r\nimport {\r\n APIResponse,\r\n AuthAPIResponse,\r\n CookieData,\r\n LoginCredentialWithClientSecret,\r\n RefreshedToken,\r\n StorageData,\r\n TokenAndJTI,\r\n UnspecifiedUserTypeData,\r\n UserInfo,\r\n UserLicenseDetail,\r\n} from '@shared/models/auth.interface';\r\nimport { Observable } from 'rxjs';\r\n\r\nimport { BusinessError, StorageError } from '@modules/error/classes';\r\nimport { ClientList } from '@shared/models/dashboard.interface';\r\nimport { UserInfoService } from './user-info.service';\r\nimport { SKIP_LOGGING_ON_FAILURE } from '@core/tokens/meta-data.token';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class AuthService {\r\n private _authAPIDomain!: string;\r\n private _clientPortalAPIDomain!: string;\r\n private _uriAPIDomain!: string;\r\n private _licenseAPIDomain!: string;\r\n private _cookieOptions: CookieOptions = {};\r\n private _isUserLoggedIn: \"y\" = \"y\";\r\n\r\n constructor(\r\n private _appService: AppService,\r\n private _cookieService: CookieService,\r\n private _encryptionService: EncryptionService,\r\n private _localStorageService: LocalStorageService,\r\n private _userInfoService: UserInfoService,\r\n private _sessionService: SessionService,\r\n private _logService: LogService,\r\n private _router: Router,\r\n private http: HttpClient\r\n ) {\r\n this._authAPIDomain = this._appService.getAppConfigs()[\"AUTH\"].BaseUrl;\r\n this._clientPortalAPIDomain = this._appService.getAppConfigs()[\"CLIENTPORTAL\"].BaseUrl;\r\n this._licenseAPIDomain = this._appService.getAppConfigs()[\"LICENSE\"].BaseUrl;\r\n this._uriAPIDomain = this._appService.getAppConfigs()[\"URI\"].BaseUrl;\r\n }\r\n\r\n public get isUserLoggedIn() {\r\n return this._isUserLoggedIn;\r\n }\r\n \r\n /*****************************************************/\r\n /************ DECORATOR/HELPER FUNCTIONS *************/\r\n /*****************************************************/\r\n public saveTokenAndJTIOnSystemStorage(jti: string, token: string): void {\r\n this._sessionService.createOrUpdateTokenEntry(jti, token);\r\n }\r\n\r\n public saveNewTokensOnSystemStorage(jti: string, token: string): void {\r\n this._sessionService.createOrUpdateTokenEntry(jti, token);\r\n }\r\n\r\n public checkLicenseExpiry(licenseDetails: UserLicenseDetail): void {\r\n const licenseExpired: boolean = (licenseDetails.AppIsLicenseExpired === \"True\");\r\n if (licenseExpired) throw new BusinessError('USER_LICENSE_EXPIRED', \"Some Description\");\r\n }\r\n\r\n public getUserTypeDetailsByID(userID: string, jti: string, token: string): Observable> {\r\n if (userID.startsWith('CLT')) return this.getClientDetails(userID, { token, jti });\r\n else if (userID.includes('PRF')) return this.getProfessionalDetails(userID, { token, jti });\r\n else return throwError(() => new BusinessError('UNABLE_TO_DETERMINE_USER_TYPE', 'Some Description'));\r\n }\r\n\r\n public determineIfUserIsClient(userData: ClientUserData | ProfessionalUserData): boolean {\r\n return userData.hasOwnProperty('ClientID');\r\n }\r\n\r\n public performProfessionalActivationCheck(userID: string, token: string, jti: string) {\r\n // HERE: make sure that the list of clients does not include inactive clients.\r\n if (userID.includes('PRF')) {\r\n return this.getClientList(userID, token, jti).pipe(map(clients=>clients.Data.length>0));\r\n\r\n // return this.getClientList(userID, token, jti).pipe(\r\n // map(clients => (clients.Data.length > 0) ? true : throwError(() => new BusinessError('USER_NOT_LINKED_WITH_CLIENTS', 'Professional not linked with any active clients.'))),\r\n // );\r\n }\r\n else return of(true);\r\n }\r\n\r\n public saveLogoInBase64(jti: string, logoInBase64: string, expiryTime: Date) {\r\n if (logoInBase64) {\r\n const logoEntry: LogoEntryModel = {\r\n logo: 'data:image/jpg;base64, ' + logoInBase64,\r\n expiresAt: expiryTime\r\n }\r\n this._sessionService.setLogo(jti, JSON.stringify(logoEntry));\r\n }\r\n }\r\n\r\n public saveAllUserDataOnSystemStorage(\r\n userIsClient: boolean,\r\n userDetails: unknown,\r\n userLicenseDetails: UserLicenseDetail,\r\n token: string,\r\n refreshToken: string,\r\n jti: string\r\n ): void {\r\n const expiryTime = this._sessionService.getExpiryTime(token);;\r\n\r\n let dataAsString: string = '';\r\n let commonData: Omit, \"userData\"> = {\r\n license: userLicenseDetails,\r\n refreshToken: refreshToken,\r\n timezone: new Date().getTimezoneOffset(),\r\n userIsClient,\r\n expiresAt: expiryTime\r\n };\r\n\r\n try {\r\n if (userIsClient) {\r\n let allData: StorageData = { ...commonData, userData: userDetails as ClientUserData }\r\n let allDataAsString = JSON.stringify(allData);\r\n\r\n let userDataWithoutLogo: ClientUserDataWithoutLogo = {\r\n ClientID: allData.userData.ClientID,\r\n ClientName: allData.userData.ClientName,\r\n ClientEmail: allData.userData.ClientEmail,\r\n ClientGroupName: allData.userData.ClientGroupName,\r\n CLientGroupCode: allData.userData.CLientGroupCode,\r\n LocTypeCode: allData.userData.LocTypeCode,\r\n LocTypeName: allData.userData.LocTypeName,\r\n isAuthorizeTimesheetYN: allData.userData.isAuthorizeTimesheetYN,\r\n isHideComplianceYN: allData.userData.isHideComplianceYN\r\n }\r\n\r\n let dataWithoutLogo: StorageData = { ...commonData, userData: userDataWithoutLogo };\r\n let dataWithoutLogoAsString = JSON.stringify(dataWithoutLogo);\r\n\r\n const sufficientSpace = this._localStorageService.canStoreData(\"LOCAL\", allDataAsString);\r\n if (sufficientSpace) {\r\n this._sessionService.createEncryptedStorageMapping(`data:${jti}`, dataWithoutLogoAsString);\r\n this.saveLogoInBase64(jti, (userDetails as ClientUserData).ClientLogo, expiryTime);\r\n }\r\n } else {\r\n let allData: StorageData = { ...commonData, userData: userDetails as ProfessionalUserData }\r\n let allDataAsString = JSON.stringify(allData);\r\n\r\n let userDataWithoutLogo: ProfessionalUserDataWithoutLogo = {\r\n ProfessionalID: allData.userData.ProfessionalID,\r\n ProfessionalName: allData.userData.ProfessionalName,\r\n ProfessionalEmail: allData.userData.ProfessionalEmail,\r\n ProfessionalLevel: allData.userData.ProfessionalLevel,\r\n ProfessionalStatus: allData.userData.ProfessionalStatus,\r\n LevelName: allData.userData.LevelName,\r\n }\r\n\r\n let dataWithoutLogo: StorageData = { ...commonData, userData: userDataWithoutLogo };\r\n let dataWithoutLogoAsString = JSON.stringify(dataWithoutLogo);\r\n\r\n const sufficientSpace = this._localStorageService.canStoreData(\"LOCAL\", allDataAsString);\r\n if (sufficientSpace) {\r\n this._sessionService.createEncryptedStorageMapping(`data:${jti}`, dataWithoutLogoAsString);\r\n this.saveLogoInBase64(jti, (userDetails as ProfessionalUserData).ProfessionalLogo, expiryTime);\r\n }\r\n }\r\n } catch(error) {\r\n if (error instanceof StorageError) {\r\n throw new StorageError(error.title, error.description);\r\n } else {\r\n console.error(error);\r\n }\r\n }\r\n\r\n }\r\n\r\n public saveAllDataInCookie(jti: string, token: string, refreshToken: string): string {\r\n const cookieData: CookieData = { jti, token, refreshToken };\r\n const cookieDataAsString = JSON.stringify(cookieData);\r\n this._encryptionService.encryptData(cookieDataAsString);\r\n return cookieDataAsString;\r\n }\r\n\r\n setKeepMeLoggedIn(data: string) {\r\n let date: Date = new Date();\r\n date.setDate(date.getDate() + 30);\r\n \r\n this._cookieOptions.expires = date;\r\n this._cookieOptions.domain = window.location.hostname;\r\n this._cookieOptions.secure = true;\r\n this._cookieOptions.sameSite = 'lax';\r\n this._cookieOptions.storeUnencoded = true;\r\n\r\n if(this._cookieService.hasKey(this.encodeBase64(\"EntireClientPortal\")) === false) {\r\n this._cookieService.put(this.encodeBase64(\"EntireClientPortal\"), data, this._cookieOptions);\r\n } else {\r\n this.removeKeepMeLoggedIN();\r\n this._cookieService.put(this.encodeBase64(\"EntireClientPortal\"), data, this._cookieOptions);\r\n }\r\n }\r\n\r\n removeKeepMeLoggedIN() {\r\n if(this._cookieService.hasKey(this.encodeBase64(\"EntireClientPortal\")) === true) {\r\n let date: Date = new Date();\r\n date.setDate(date.getDate() + 30);\r\n \r\n this._cookieOptions.expires = date;\r\n this._cookieOptions.domain = window.location.hostname;\r\n this._cookieOptions.secure = true;\r\n this._cookieOptions.sameSite = 'lax';\r\n this._cookieOptions.storeUnencoded = true;\r\n this._cookieService.remove(this.encodeBase64(\"EntireClientPortal\"), this._cookieOptions);\r\n }\r\n }\r\n\r\n checkKeepMeLoggedIn() {\r\n if(this._cookieService.hasKey(this.encodeBase64(\"EntireClientPortal\")) === true) {\r\n let cookieData = {} as CookieData;\r\n let obj: string = this._cookieService.get(this.encodeBase64(\"EntireClientPortal\")) || '';\r\n let encData: string = this._encryptionService.decryptData(obj);\r\n cookieData = JSON.parse(encData);\r\n\r\n this._router.navigateByUrl('/app-initialization?args4=y');\r\n }\r\n }\r\n\r\n resetStorageData() {\r\n this._localStorageService.flushStorageData();\r\n }\r\n\r\n triggerLogout(target: \"GROUP\" | \"USER\", id: string) {\r\n const onMobileDevice: boolean = false;\r\n const jti = this._sessionService.getJTIFromCurrentRoute();\r\n const token = this._sessionService.getToken(jti);\r\n \r\n let userType: \"CLT\" | \"PRF\" = \"CLT\";\r\n let userID: string | undefined = undefined;\r\n\r\n if (this._userInfoService.isUserTypeClient()) {\r\n userType = \"CLT\";\r\n userID = this._userInfoService.getClientInfo()?.ClientID;\r\n } else {\r\n userType = \"PRF\";\r\n userID = this._userInfoService.getProfessionalInfo()?.ProfessionalID;\r\n }\r\n \r\n if (target === \"USER\") {\r\n // don't need to verify ID once the connection is managed on the server side (e.g. key-value pair of userid-connectionString).\r\n if (userID === id) {\r\n this.updateLoginLogoutStatus(token, jti, userID || \"\", userType, \"N\").subscribe({\r\n next: (_) => {\r\n this._logService.appLogout(\"LoggedOut\", { jti, user_id: userID }, onMobileDevice, token, jti);\r\n this.removeKeepMeLoggedIN();\r\n this._userInfoService.logoutUser();\r\n this._router.navigateByUrl(`/login?authStatus=LOGOUT`);\r\n },\r\n error: () => {}\r\n });\r\n }\r\n } else {\r\n const companyCode = this._localStorageService.getLicenseInfo(\"CompanyCode\");\r\n // don't need to verify ID once the connection is managed on the server side (e.g. key-value pair of userid-connectionString).\r\n if (companyCode === id) {\r\n this.updateLoginLogoutStatus(token, jti, userID || \"\", userType, \"N\").subscribe({\r\n next: (_) => {\r\n this._logService.appLogout(\"LoggedOut\", { jti, user_id: userID }, onMobileDevice, token, jti);\r\n this.removeKeepMeLoggedIN();\r\n this._userInfoService.logoutUser();\r\n this._router.navigateByUrl(`/login?authStatus=LOGOUT_FORCEFULLY`);\r\n },\r\n error: () => {}\r\n });\r\n }\r\n }\r\n }\r\n \r\n /*****************************************/\r\n /*************** API CALLS ***************/\r\n /*****************************************/\r\n checkAccessToken(payload: AccessCodeAndClientSecret): Observable> {\r\n const authAPI = this._appService.getAppConfigs()[\"AUTH\"].Versions.V1[\"ACCESS\"][\"AccessCode\"].PATH;\r\n return this.http.post>(\r\n `${this._authAPIDomain}${authAPI}`,\r\n payload,\r\n { context: new HttpContext().set(SKIP_LOGGING_ON_FAILURE, true) }\r\n );\r\n }\r\n\r\n getTokenAndJTI(requestBody: LoginCredentialWithClientSecret): Observable> {\r\n const authAPI = this._appService.getAppConfigs()[\"AUTH\"].Versions.V1[\"CLIENTPORTALTOKEN\"][\"ClientLogin\"].PATH;\r\n return this.http.post>(`${this._authAPIDomain}${authAPI}`, requestBody);\r\n }\r\n\r\n getUserIDAndRefreshToken(requestBody: TokenAndJTI): Observable> {\r\n const userAuthAPI = this._appService.getAppConfigs()[\"CLIENTPORTAL\"].Versions.V1[\"USER\"][\"GetUserAuth\"].PATH;\r\n const url = this._clientPortalAPIDomain + userAuthAPI;\r\n // const authHeaders = new HttpHeaders({ 'Authorization': `Bearer ${requestBody.token}` });\r\n const authHeaders = new HttpHeaders({ 'Authorization': `Bearer ${requestBody.token}`, 'X-Er-Type': `${requestBody.jti}` });\r\n\r\n return this.http.get>( `${url}?UserKey=${requestBody.jti}`, { headers: authHeaders })\r\n }\r\n\r\n getUserIDAndRefreshTokenJti(requestBody: TokenAndJTI): Observable> {\r\n const userAuthAPI = this._appService.getAppConfigs()[\"CLIENTPORTAL\"].Versions.V1[\"USER\"][\"GetUserAuth\"].PATH;\r\n const url = this._clientPortalAPIDomain + userAuthAPI;\r\n const authHeaders = new HttpHeaders({ 'Authorization': `Bearer ${requestBody.token}`, 'X-Er-Type': `${requestBody.jti}` });\r\n\r\n return this.http.get>( `${url}?UserKey=${requestBody.jti}`, { headers: authHeaders })\r\n }\r\n\r\n getRefreshedToken(currentExpiredToken: string, userRefreshToken: string): Observable> {\r\n const refreshTokenAPI = this._appService.getAppConfigs()[\"AUTH\"].Versions.V1[\"CLIENTPORTALREFRESHTOKEN\"][\"RefreshToken\"].PATH;\r\n const url = this._authAPIDomain + refreshTokenAPI;\r\n return this.http.post>(url, { token: currentExpiredToken, refreshToken: userRefreshToken });\r\n }\r\n\r\n getLicenseDetails(token: string, jti: string) {\r\n const userLicenseAPI = this._appService.getAppConfigs()[\"LICENSE\"].Versions.V1[\"LOGGEDINUSERCOUNT\"][\"LoggedInUserCount\"].PATH;\r\n const url = this._licenseAPIDomain + userLicenseAPI;\r\n const authHeaders = new HttpHeaders({ 'Authorization': `Bearer ${token}`, 'X-Er-Type': `${jti}` });\r\n return this.http.get>(url, { headers: authHeaders })\r\n }\r\n\r\n getClientDetails(userID: string, tokenAndJTI: TokenAndJTI) {\r\n const clientAuthAPI = this._appService.getAppConfigs()[\"CLIENTPORTAL\"].Versions.V1[\"USER\"][\"GetClientAuth\"].PATH;\r\n const url = this._clientPortalAPIDomain + clientAuthAPI;\r\n const authHeaders = new HttpHeaders({ 'Authorization': `Bearer ${tokenAndJTI.token}`, 'X-Er-Type': `${tokenAndJTI.jti}` });\r\n return this.http.get>(`${url}?UserKey=${tokenAndJTI.jti}&ClientId=${userID}`, { headers: authHeaders })\r\n }\r\n\r\n getProfessionalDetails(userID: string, tokenAndJTI: TokenAndJTI) {\r\n const professionalAuthAPI = this._appService.getAppConfigs()[\"CLIENTPORTAL\"].Versions.V1[\"USER\"][\"GetProfessionalAuth\"].PATH;\r\n const url = this._clientPortalAPIDomain + professionalAuthAPI;\r\n const authHeaders = new HttpHeaders({ 'Authorization': `Bearer ${tokenAndJTI.token}`, 'X-Er-Type': `${tokenAndJTI.jti}` });\r\n return this.http.get>(`${url}?UserKey=${tokenAndJTI.jti}&ProfessionalId=${userID}`, { headers: authHeaders });\r\n }\r\n\r\n recoverPassword(requestBody: AccessCodeAndID) {\r\n const forgotPasswordAPI = this._appService.getAppConfigs()[\"CLIENTPORTAL\"].Versions.V1[\"FORGOTPASSWORD\"][\"forgotPassword\"].PATH;\r\n const url = this._clientPortalAPIDomain + forgotPasswordAPI;\r\n return this.http.post>(url, requestBody);\r\n }\r\n\r\n getCompleteUrl(ShortCode: string) {\r\n const uriDecodeAPI = this._appService.getAppConfigs()[\"URI\"].Versions.V1[\"URICODER\"][\"UriDecode\"].PATH;\r\n const url = this._uriAPIDomain + uriDecodeAPI;\r\n\r\n const ApiKey=this._appService.getAppSettings().apiCredentials.apiKey;\r\n // HERE: create dot separated value random(apiKey,agentID).\r\n const AgentId=this._appService.getAppSettings().apiCredentials.agentID;\r\n const Base64ApiKey=this.encodeBase64(ApiKey);\r\n const Base64AgentId=this.encodeBase64(AgentId);\r\n\r\n const stringSequence = (Math.floor(Math.random() * 10) > 5) ? `${Base64AgentId}.${Base64ApiKey}` : `${Base64ApiKey}.${Base64AgentId}`;\r\n\r\n const authHeaders = new HttpHeaders({ 'ApiKey': `${stringSequence}` });\r\n return this.http.post>(url, { ShortCode:ShortCode}, { headers: authHeaders });\r\n }\r\n\r\n public getClientList(clientId: string, token: string, jti: string) {\r\n const userAuthAPIEndpoint = this._appService.getAppConfigs()[\"CLIENTPORTAL\"].Versions[\"V1\"][\"DASHBOARD\"][\"GetClientList\"].PATH;\r\n const url = this._clientPortalAPIDomain + userAuthAPIEndpoint;\r\n const authHeaders = new HttpHeaders({ 'Authorization': `Bearer ${token}`, 'X-Er-Type': `${jti}` });\r\n return this.http.get>(`${url}?ProfessionalId=${clientId}`, { headers: authHeaders });\r\n }\r\n\r\n getOldPlientPortalLink() {\r\n const oldClientportalLinkAPIEndpoint =\r\n this._appService.getAppConfigs()['CLIENTPORTAL'].Versions['V1']['USER']['GetOldPlientPortalLink'].PATH;\r\n const url = this._clientPortalAPIDomain + oldClientportalLinkAPIEndpoint;\r\n return this.http.get>(`${url}`);\r\n }\r\n\r\n updateLoginLogoutStatus(token: string, jti: string, userID:string, userType:\"CLT\"|\"PRF\", status:\"Y\"|\"N\") {\r\n const loginLogoutStatusAPIEndpoint = this._appService.getAppConfigs()['CLIENTPORTAL'].Versions['V1']['LOGINLOGOUTSTATUS']['loginLogoutStatus'].PATH;\r\n const url = this._clientPortalAPIDomain + loginLogoutStatusAPIEndpoint;\r\n const authHeaders = new HttpHeaders({ 'Authorization': `Bearer ${token}`, 'X-Er-Type': `${jti}` });\r\n return this.http.post>(url, { UserLoginStatus:status, UserId:userID, Portal:userType}, { headers: authHeaders });\r\n }\r\n\r\n encodeBase64 = (data: any) => {\r\n return Buffer.from(data).toString('base64');\r\n }\r\n\r\n private decodeBase64 = (data: any) => {\r\n return Buffer.from(data, 'base64').toString('ascii');\r\n }\r\n\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { HttpClient } from '@angular/common/http';\r\nimport { EncryptionService } from '../core/encryption.service';\r\nimport { ClientUserData, StorageData, TokenAndJTI, ProfessionalUserData, AuthAPIResponse, RefreshedToken, TokenEntryModel, LogoEntryModel } from '@shared/models/auth.interface';\r\nimport { Router } from '@angular/router';\r\nimport { map, tap } from 'rxjs';\r\nimport { AppService } from '../core/app.service';\r\nimport { StorageError } from '@modules/error/classes';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class SessionService {\r\n storage: Storage = localStorage;\r\n \r\n constructor(\r\n private http: HttpClient,\r\n private router: Router, \r\n private encryptionService: EncryptionService, \r\n private appService: AppService,\r\n ) {}\r\n\r\n createNewSession(TokenAndJTI: TokenAndJTI, userData: ClientUserData | ProfessionalUserData): string {\r\n this.createOrUpdateTokenEntry(TokenAndJTI.jti, TokenAndJTI.token);\r\n\r\n const dataKey = `data:${TokenAndJTI.jti}` // data:JTI => \r\n const expiry = this.getExpiryTime(TokenAndJTI.token);\r\n const userDataAsString = JSON.stringify({ ...userData, expiresAt: expiry }); \r\n\r\n this.createEncryptedStorageMapping(dataKey, userDataAsString);\r\n return TokenAndJTI.jti;\r\n }\r\n\r\n updateTokenAndJTIOnStorage(newJTI: string, newToken: string) {\r\n this.createOrUpdateTokenEntry(newJTI, newToken);\r\n //this.calculateTokenTimeout(newToken);\r\n }\r\n\r\n getJTIFromCurrentRoute() {\r\n let fullUrl = this.router.url\r\n let jti: string = fullUrl.split('/')[2];// get current jti from route.\r\n return jti;\r\n }\r\n\r\n getToken(jti: string): string {\r\n if(jti === undefined || jti === \"\") {\r\n return \"\";\r\n }\r\n\r\n const key = `sid:${this.encodeBase64(jti)}`;\r\n const tempKey = `sid:${this.encodeBase64(jti + ':temp')}`;\r\n\r\n let tokenEntry: TokenEntryModel = { token: \"\", expiresAt: new Date(0) };\r\n if(this.storage.getItem(key)) {\r\n let encData: string = this.encryptionService.decryptData(this.storage.getItem(key) || '');\r\n tokenEntry = JSON.parse(encData);\r\n return tokenEntry.token;\r\n }\r\n\r\n if(this.storage.getItem(tempKey)) {\r\n let encData: string = this.storage.getItem(tempKey) || '';\r\n tokenEntry = JSON.parse(encData);\r\n return tokenEntry.token;\r\n }\r\n\r\n return tokenEntry.token;\r\n }\r\n\r\n getData(jti: string): string | null {\r\n return this.storage.getItem(`data:${jti}`);\r\n }\r\n\r\n setLogo(jti: string, logo: string) {\r\n try {\r\n this.storage.setItem(`logo:${jti}`, logo);\r\n } catch (error) {\r\n console.debug(error);\r\n throw new StorageError('STORAGE DATA CANNOT BE SAVED', \"The logo size of this client’s storage data exceeds the allowed limit. Please contact agency staff to upload the logo again.\");\r\n }\r\n }\r\n\r\n getLogo() {\r\n const jti = this.getJTIFromCurrentRoute();\r\n const logoEntry = this.storage.getItem(`logo:${jti}`);\r\n if (logoEntry)\r\n return (JSON.parse(logoEntry) as LogoEntryModel).logo;\r\n else\r\n return null;\r\n }\r\n\r\n createEncryptedStorageMapping(mappingKey: string, data: string) {\r\n const encryptedToken = this.encryptionService.encryptData(data);\r\n try {\r\n this.storage.setItem(mappingKey, encryptedToken);\r\n } catch (error) {\r\n console.debug(error);\r\n throw new StorageError('STORAGE DATA CANNOT BE SAVED', ('localstorage'));\r\n }\r\n }\r\n\r\n getDecryptedStorageValue(mappingKey: string): string {\r\n const encryptedData = this.storage.getItem(mappingKey);\r\n\r\n if (encryptedData) {\r\n const decryptedData = this.encryptionService.decryptData(encryptedData);\r\n return decryptedData;\r\n }\r\n\r\n return '';\r\n }\r\n\r\n getExpiryTime(token: string): Date {\r\n const jwtBase64 = token.split('.')[1];\r\n const jwtToken = JSON.parse(this.decodeBase64(jwtBase64));\r\n const tokenExpiry = jwtToken.exp * 1000;\r\n let date: Date = new Date(tokenExpiry);\r\n // date.setDate(jwtToken.exp * 1000);\r\n\r\n return date;\r\n }\r\n\r\n createOrUpdateTokenEntry(jti: string, token: string) {\r\n const tokenExpiry = this.getExpiryTime(token);\r\n let tokenEntry: TokenEntryModel = {\r\n token: token,\r\n expiresAt: tokenExpiry\r\n };\r\n\r\n const tokenKey = `sid:${this.encodeBase64(jti)}`;\r\n const tokenTempKey = `sid:${this.encodeBase64(jti + ':temp')}`;\r\n const encryptedTokenData = this.encryptionService.encryptData(JSON.stringify(tokenEntry));\r\n\r\n try {\r\n if(!this.storage.getItem(tokenKey)) {\r\n this.storage.setItem(tokenKey, encryptedTokenData);\r\n }\r\n else {\r\n this.storage.setItem(tokenTempKey, encryptedTokenData);\r\n this.storage.removeItem(tokenKey);\r\n this.storage.setItem(tokenKey, encryptedTokenData);\r\n this.storage.removeItem(tokenTempKey);\r\n }\r\n } catch (error) {\r\n throw new StorageError('UNABLE TO SET TOKEN OR JTI', ('localstorage'));\r\n }\r\n\r\n this.removeExpiredEntries(this.storage);\r\n }\r\n\r\n updateRefreshToken(currentJTI: string, newRefreshToken: string, newToken: string) {\r\n const newData = JSON.parse(this.getDecryptedStorageValue(`data:${currentJTI}`)) as StorageData;\r\n newData.refreshToken = newRefreshToken;\r\n newData.expiresAt = this.getExpiryTime(newToken);\r\n this.createEncryptedStorageMapping(`data:${currentJTI}`, JSON.stringify(newData))\r\n }\r\n\r\n updateLogoExpiry(currentJTI: string, newToken: string) {\r\n const existingLogoEntry = this.storage.getItem(`logo:${currentJTI}`);\r\n if (existingLogoEntry) {\r\n const newLogoData = JSON.parse(existingLogoEntry) as LogoEntryModel;\r\n newLogoData.expiresAt = this.getExpiryTime(newToken);\r\n this.setLogo(currentJTI, JSON.stringify(newLogoData));\r\n }\r\n }\r\n\r\n updateTokenAndRefreshTokenOnStorage(newToken: string, newRefreshToken: string) {\r\n const currentJTI = this.getJTIFromCurrentRoute();\r\n this.createOrUpdateTokenEntry(currentJTI, newToken);\r\n this.updateRefreshToken(currentJTI, newRefreshToken, newToken);\r\n this.updateLogoExpiry(currentJTI, newToken);\r\n\r\n this.calculateTokenTimeout(newToken);\r\n }\r\n\r\n private encodeBase64 = (data: any) => {\r\n return Buffer.from(data).toString('base64');\r\n }\r\n private decodeBase64 = (data: any) => {\r\n return Buffer.from(data, 'base64').toString('ascii');\r\n }\r\n\r\n calculateTokenTimeout(token: string) {\r\n const jwtBase64 = token.split('.')[1];\r\n const jwtToken = JSON.parse(this.decodeBase64(jwtBase64));\r\n\r\n const expires = new Date(jwtToken.exp * 1000);\r\n const timeout = expires.getTime() - Date.now() - (300 * 1000);\r\n setTimeout(() => this.getAndSetRefreshToken(token), timeout);\r\n }\r\n\r\n getRefreshToken(jti: string) {\r\n let storageData = undefined;\r\n const encryptedDataString = this.storage.getItem(`data:${jti}`);\r\n if (encryptedDataString) {\r\n const decryptedData: string = this.encryptionService.decryptData(encryptedDataString);\r\n storageData = JSON.parse(decryptedData);\r\n }\r\n return storageData?.refreshToken;\r\n }\r\n\r\n getAndSetRefreshToken(token: string) {\r\n const jti = this.getJTIFromCurrentRoute() || '';\r\n const refreshToken = this.getRefreshToken(jti);\r\n \r\n if(jti != '') {\r\n const authAPIDomain = this.appService.getAppConfigs()[\"AUTH\"].BaseUrl;\r\n const refreshTokenAPI = this.appService.getAppConfigs()[\"AUTH\"].Versions.V1[\"CLIENTPORTALREFRESHTOKEN\"][\"RefreshToken\"].PATH;\r\n const url = authAPIDomain + refreshTokenAPI;\r\n\r\n this.http.post>(url, { token, refreshToken }).pipe(\r\n map(refreshTokenResponse => refreshTokenResponse.data),\r\n tap(token => {\r\n let refreshToken = token.refreshToken;\r\n let tokenProvided = token.token;\r\n this.updateTokenAndRefreshTokenOnStorage(tokenProvided, refreshToken);\r\n })\r\n ).subscribe();\r\n }\r\n }\r\n\r\n isNewTokenRequired(token: string) {\r\n const jwtBase64 = token.split('.')[1];\r\n const jwtToken = JSON.parse(this.decodeBase64(jwtBase64));\r\n\r\n const expires = new Date(jwtToken.exp * 1000);\r\n const timeout = expires.getTime() - Date.now() - (60 * 1000);\r\n const minTime = 60 * 1000;\r\n\r\n return (timeout <= minTime);\r\n }\r\n\r\n removeMappingFor(jti: string) {\r\n // storage.removeItem(`sid:${jti}`); moved to localstorage.\r\n this.storage.removeItem(`data:${jti}`);\r\n this.storage.removeItem(`logo:${jti}`);\r\n this.removeTokenCookie(jti);\r\n }\r\n\r\n removeTokenCookie(jti: string) {\r\n const key = `sid:${this.encodeBase64(jti)}`;\r\n const tempKey = `sid:${this.encodeBase64(jti + ':temp')}`;\r\n\r\n if(this.storage.getItem(key)) {\r\n this.storage.removeItem(key);\r\n }\r\n\r\n if(this.storage.getItem(tempKey)) {\r\n this.storage.removeItem(tempKey);\r\n }\r\n\r\n this.removeExpiredEntries(this.storage);\r\n }\r\n\r\n removeExpiredEntries(storage: Storage) {\r\n const currentTime: Date = new Date();\r\n let decryptedStorageValueAsString: string = '';\r\n\r\n let entryType: 'TOKEN' | 'DATA' | 'LOGO' | 'NONE' = 'NONE';\r\n\r\n for (let [key, value] of Object.entries(storage)) {\r\n if (key.slice(0,3) === 'sid') entryType = 'TOKEN';\r\n else if (key.slice(0,4) === 'data') entryType = 'DATA';\r\n else if (key.slice(0,4) === 'logo') entryType = 'LOGO';\r\n else entryType = 'NONE';\r\n\r\n try {\r\n // let encData: string = this.encryptionService.decryptData(storage.getItem(key) || '');\r\n // let cookieData: TokenCookie = { token: \"\", expiresAt: 0 };\r\n // cookieData = JSON.parse(encData);\r\n\r\n\r\n switch(entryType) {\r\n case 'TOKEN':\r\n decryptedStorageValueAsString = this.encryptionService.decryptData(value || '');\r\n let tokenData: TokenEntryModel = JSON.parse(decryptedStorageValueAsString);\r\n const tokenExpiryTime = new Date(tokenData.expiresAt);\r\n const tokenExpired = currentTime > tokenExpiryTime;\r\n\r\n if(tokenExpired) storage.removeItem(key);\r\n break;\r\n\r\n case 'DATA':\r\n decryptedStorageValueAsString = this.encryptionService.decryptData(value || '');\r\n let userData: StorageData = JSON.parse(decryptedStorageValueAsString);\r\n const userDataExpiryTime = new Date (userData.expiresAt);\r\n const userDataExpired = currentTime > userDataExpiryTime;\r\n\r\n if(userDataExpired) storage.removeItem(key);\r\n break;\r\n\r\n case 'LOGO':\r\n decryptedStorageValueAsString = value || '';\r\n let logoData: LogoEntryModel = JSON.parse(decryptedStorageValueAsString);\r\n const logoDataExpiryTime = new Date(logoData.expiresAt);\r\n const logoDataExpired = currentTime > logoDataExpiryTime;\r\n\r\n if(logoDataExpired) storage.removeItem(key);\r\n break;\r\n\r\n case 'NONE':\r\n default:\r\n console.debug(\"No entry Matched\");\r\n break;\r\n }\r\n\r\n }\r\n catch (error) {\r\n console.debug(error);\r\n throw new StorageError('STORAGE DATA CANNOT BE SAVED', ('localstorage'));\r\n }\r\n }\r\n }\r\n\r\n}\r\n","import { Injectable } from '@angular/core';\r\n\r\nimport { SessionService } from './session.service';\r\n\r\nimport { ClientUserData, ProfessionalUserData } from '@shared/models/auth.interface';\r\n\r\nimport { MatDialog, MatDialogRef } from '@angular/material/dialog';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class UserInfoService {\r\n private _userInfo: ClientUserData | undefined;\r\n\r\n constructor(private sessionService: SessionService, private popup: MatDialog,) { }\r\n\r\n getClientInfo(): ClientUserData | null {\r\n try {\r\n if (this._userInfo) return this._userInfo;\r\n\r\n // if user info is not set yet.\r\n const jtiFound = this.sessionService.getJTIFromCurrentRoute();\r\n if (jtiFound) {\r\n const userDataAsString = this.sessionService.getDecryptedStorageValue(`data:${jtiFound}`);\r\n let storeData = JSON.parse(userDataAsString);\r\n if (storeData.userIsClient === true) {\r\n return storeData.userData;\r\n }\r\n }\r\n }\r\n catch\r\n {\r\n }\r\n\r\n return null;\r\n }\r\n\r\n getProfessionalInfo(): ProfessionalUserData | null {\r\n try {\r\n // if (this._userInfo) return this._userInfo;\r\n\r\n // if user info is not set yet.\r\n const jtiFound = this.sessionService.getJTIFromCurrentRoute();\r\n if (jtiFound) {\r\n const userDataAsString = this.sessionService.getDecryptedStorageValue(`data:${jtiFound}`);\r\n let storeData = JSON.parse(userDataAsString);\r\n if (storeData.userIsClient === false) {\r\n return storeData.userData;\r\n }\r\n }\r\n }\r\n catch\r\n {\r\n }\r\n\r\n return null;\r\n }\r\n\r\n isUserTypeClient(): boolean | null {\r\n try {\r\n const jtiFound = this.sessionService.getJTIFromCurrentRoute();\r\n if (jtiFound) {\r\n const userDataAsString = this.sessionService.getDecryptedStorageValue(`data:${jtiFound}`);\r\n let storeData = JSON.parse(userDataAsString);\r\n return storeData.userIsClient;\r\n }\r\n }\r\n catch\r\n {\r\n }\r\n\r\n return null;\r\n }\r\n\r\n logoutUser() {\r\n this.popup.closeAll();\r\n const jtiFound = this.sessionService.getJTIFromCurrentRoute();\r\n if (jtiFound) {\r\n this.sessionService.removeMappingFor(jtiFound);\r\n }\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { Endpoint } from '@shared/models/app-config.interface';\r\nimport { AppSettings } from '@shared/models/app-settings.inteface';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class AppService {\r\n private _appConfigs!: Endpoint;\r\n private _appSettings!: AppSettings;\r\n\r\n getAppConfigs(): Endpoint {\r\n return this._appConfigs;\r\n }\r\n\r\n setAppConfigs(config: any) {\r\n this._appConfigs = JSON.parse(config.toString()).APIs as Endpoint;\r\n }\r\n\r\n getAppSettings(): AppSettings {\r\n return this._appSettings;\r\n }\r\n\r\n setAppSettings(config: any) {\r\n this._appSettings = JSON.parse(config.toString()) as AppSettings;\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport * as CryptoJS from 'crypto-js';\r\n\r\nimport { AppService } from './app.service';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class EncryptionService {\r\n private _encryptionKey = '';\r\n\r\n constructor(private appService: AppService) {\r\n this._encryptionKey = this.appService.getAppSettings().encryptionSetting.secretKey;\r\n }\r\n\r\n encryptData(dataToEncrypt: string): string {\r\n const encryptedData = CryptoJS.AES.encrypt(dataToEncrypt, this._encryptionKey).toString();\r\n return encryptedData;\r\n }\r\n\r\n decryptData(dataToDecrypt: string) {\r\n const decryptedDataBytes = CryptoJS.AES.decrypt(dataToDecrypt, this._encryptionKey).toString(CryptoJS.enc.Utf8);\r\n return decryptedDataBytes;\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { NavigationCancel, NavigationEnd, NavigationError, NavigationStart, Router } from '@angular/router';\r\nimport { BehaviorSubject, filter, Subject } from 'rxjs';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class LoadingService {\r\n isLoading = new BehaviorSubject(false);\r\n \r\n constructor(private router: Router) {\r\n this.router.events.pipe(filter(event => \r\n event instanceof NavigationStart ||\r\n event instanceof NavigationEnd ||\r\n event instanceof NavigationCancel ||\r\n event instanceof NavigationError\r\n )).subscribe(event => {\r\n if (event instanceof NavigationStart) {\r\n let fullUrl = this.router.url\r\n let path: string = fullUrl.split('/')[1].split('?')[0];// get current jti from route.\r\n if (path === 'app-initialization') this.stopLoading();\r\n else this.showLoading();\r\n }\r\n else if (event instanceof NavigationEnd || event instanceof NavigationCancel) {\r\n this.stopLoading();\r\n return;\r\n }\r\n else {\r\n this.stopLoading();\r\n return;\r\n }\r\n });\r\n } \r\n\r\n showLoading() {\r\n // logic\r\n this.isLoading.next(true);\r\n }\r\n\r\n stopLoading() {\r\n this.isLoading.next(false);\r\n }\r\n\r\n loadingStatus() {\r\n return this.isLoading.asObservable();\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { StorageError } from '@modules/error/classes';\r\n\r\nimport { StorageData, ClientUserData, ProfessionalUserData, UserLicenseDetail } from '@shared/models/auth.interface';\r\nimport { SessionService } from '@shared/services/auth/session.service';\r\nimport { AppService } from './app.service';\r\nimport { EncryptionService } from './encryption.service';\r\nimport { StorageType, StorageTypeChoice } from '@shared/models/core.interface';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class LocalStorageService {\r\n storageData: StorageData | undefined = undefined;\r\n sessionJTI: string | undefined;\r\n\r\n constructor(\r\n private _appService: AppService,\r\n private sessionService: SessionService,\r\n private encryptionService: EncryptionService\r\n ) {\r\n this.sessionJTI = this.sessionService.getJTIFromCurrentRoute();\r\n this.initializeData(this.sessionJTI);\r\n }\r\n\r\n flushStorageData() {\r\n this.storageData = undefined;\r\n this.sessionJTI = undefined;\r\n }\r\n\r\n initializeData(jti: string): boolean {\r\n this.flushStorageData();\r\n const entireEncryptedData = this.sessionService.getData(jti);\r\n if (entireEncryptedData) {\r\n const decryptedData: string = this.encryptionService.decryptData(entireEncryptedData);\r\n this.storageData = JSON.parse(decryptedData);\r\n return true;\r\n }\r\n return false;\r\n }\r\n\r\n getLicenseInfo(keyName: keyof UserLicenseDetail) {\r\n return this.storageData?.license[keyName];\r\n }\r\n\r\n getClientInfo(keyName: keyof ClientUserData): string {\r\n const data = this.storageData?.userData as ClientUserData;\r\n const value = data[keyName];\r\n return (value && typeof value !== 'boolean') ? value : '';\r\n }\r\n\r\n getProfessionalInfo(keyName: keyof ProfessionalUserData) {\r\n const data = this.storageData?.userData as ProfessionalUserData;\r\n const value = data[keyName];\r\n return (value && typeof value !== 'boolean') ? value : '';\r\n }\r\n\r\n getLoggedInUserType(): \"CLIENT\" | \"PROFESSIONAL\" {\r\n this.sessionJTI = this.sessionService.getJTIFromCurrentRoute()\r\n const initialized = this.initializeData(this.sessionJTI);\r\n if (initialized)\r\n return (this.storageData!.userIsClient) ? \"CLIENT\" : \"PROFESSIONAL\";\r\n else\r\n throw new StorageError(\"NO DATA FOR CURRENT SESSION\", \"No data found against current session ID.\");\r\n }\r\n\r\n getClientData() {\r\n let data: ClientUserData;\r\n data = this.storageData?.userData as ClientUserData;\r\n return data;\r\n }\r\n\r\n getRefreshToken() {\r\n return this.storageData?.refreshToken;\r\n }\r\n\r\n canStoreData(storageType: StorageTypeChoice, data: string): boolean {\r\n const browserLimitInKB = 5 * 1024;\r\n const userDataSizeInKB = (data.length) / 1024;\r\n console.debug(\"User Data: \", userDataSizeInKB);\r\n\r\n let sufficientLocalStorageSpace = false;\r\n let sufficientSessionStorageSpace = false;\r\n\r\n const appMaxLocalStorageDataLimitInKB = this._appService.getAppSettings().maxLocalStorageSpaceAllowedInKB;\r\n const userDataSizeWithinAllowedRange = appMaxLocalStorageDataLimitInKB > userDataSizeInKB;\r\n\r\n if (!userDataSizeWithinAllowedRange)\r\n throw new StorageError('USER DATA EXCEEDS ALLOWED LIMIT', `The application requires the data to be smaller than ${appMaxLocalStorageDataLimitInKB}KB`);\r\n\r\n // For Local Storage //\r\n if (storageType === \"LOCAL\" || storageType === \"BOTH\") {\r\n const occupiedSpaceInKB = this.getStorageSpaceInKB(\"LOCAL\");\r\n const remainingSpaceInKB = (browserLimitInKB - occupiedSpaceInKB);\r\n sufficientLocalStorageSpace = remainingSpaceInKB > userDataSizeInKB;\r\n\r\n console.debug(\"Occupied: \", occupiedSpaceInKB);\r\n console.debug(\"Remaining: \", remainingSpaceInKB);\r\n\r\n if (!sufficientLocalStorageSpace)\r\n throw new StorageError('INSUFFICIENT LOCAL STORAGE SPACE', 'User data cannot be saved on browser. Please clear browser cache.'); \r\n\r\n if (storageType !== 'BOTH') return sufficientLocalStorageSpace;\r\n }\r\n\r\n // For Session Storage //\r\n if (storageType === \"SESSION\" || storageType === \"BOTH\") {\r\n const occupiedSpaceInKB = this.getStorageSpaceInKB(\"SESSION\");\r\n const remainingSpaceInKB = (browserLimitInKB - occupiedSpaceInKB);\r\n\r\n sufficientSessionStorageSpace = remainingSpaceInKB > userDataSizeInKB;\r\n\r\n if (!sufficientSessionStorageSpace)\r\n throw new StorageError('INSUFFICIENT SESSION STORAGE SPACE', 'User data cannot be saved on browser. Please clear browser cache.'); \r\n\r\n if (storageType !== 'BOTH') return sufficientSessionStorageSpace;\r\n }\r\n\r\n if (sufficientLocalStorageSpace && sufficientSessionStorageSpace) return true;\r\n else \r\n throw new StorageError('INSUFFICIENT STORAGE SPACE', 'User data cannot be saved on browser. Please clear browser cache.'); \r\n }\r\n\r\n getStorageSpaceInKB(storageType: StorageType, UTF16Format: boolean = true): number {\r\n let totalSize = 0;\r\n const storage = (storageType === \"LOCAL\") ? localStorage : sessionStorage;\r\n\r\n for (let key in storage) {\r\n let mappingSizeInKB = (storage[key].length) / 1024;\r\n\r\n if (!isNaN(mappingSizeInKB) && storage.hasOwnProperty(key)) {\r\n totalSize += mappingSizeInKB;\r\n }\r\n }\r\n return Math.ceil(totalSize);\r\n }\r\n\r\n}\r\n","import { Observable } from \"rxjs\"\r\nimport { LogEntry } from \"@core/classes\"\r\n\r\nexport enum LogLevel {\r\n ALL = 0,\r\n DEBUG,\r\n INFO,\r\n WARN,\r\n ERROR,\r\n FATAL,\r\n APPLOGIN,\r\n APPLOGOUT,\r\n OFF\r\n}\r\n\r\nexport interface BasicLogDetails {\r\n level: LogLevel,\r\n screen_route: string,\r\n log_event: string,\r\n log_message: string\r\n}\r\n\r\nexport interface ExtendedLogDetails {\r\n jti?: string,\r\n user_id?: string,\r\n log_error?: string,\r\n request_endpoint?: string,\r\n request_data?: string,\r\n response_data?: string,\r\n}\r\n\r\nexport interface DeviceLogDetails {\r\n browser: string,\r\n browser_version: string,\r\n device: string,\r\n device_type: string,\r\n orientation: string,\r\n os: string,\r\n os_version: string,\r\n userAgent: string,\r\n}\r\n\r\nexport interface LogPublisher {\r\n location: string,\r\n log(logEntry: LogEntry, usingMobileDevice: boolean, token?: string, jti?: string): Observable,\r\n clear(logEntry: LogEntry): Observable\r\n}\r\n\r\nexport interface WebAPILogData {\r\n user_id: string,\r\n screen_route?: string,\r\n log_event?: string,\r\n log_message: string\r\n jti?: string,\r\n log_error?: string,\r\n request_endpoint?: string,\r\n request_data?: string,\r\n response_data?: string,\r\n browser?: string,\r\n browser_version?: string,\r\n device?: string,\r\n device_type?: string,\r\n orientation?: string,\r\n os?: string,\r\n os_version?: string,\r\n userAgent?: string,\r\n}\r\n","import { BasicLogDetails, DeviceLogDetails, ExtendedLogDetails, LogLevel } from '@shared/models/log.interface';\r\n\r\nexport class LogEntry {\r\n entryDate: Date = new Date();\r\n extendedLogDetails: ExtendedLogDetails | undefined;\r\n deviceLogDetails!: DeviceLogDetails | undefined;\r\n basicLogDetails: BasicLogDetails = {\r\n level: LogLevel.ALL,\r\n screen_route: 'UNDEFINED',\r\n log_event: 'UNDEFINED',\r\n log_message: 'UNDEFINED'\r\n };\r\n \r\n constructor() {}\r\n \r\n buildLogString(): string {\r\n let logString = \"\";\r\n\r\n // [Basic Logs]\r\n logString = `${new Date()}: `;\r\n logString += `[${LogLevel[this.basicLogDetails.level]}] `;\r\n logString += `${this.basicLogDetails.screen_route}.`;\r\n logString += `${this.basicLogDetails.log_message}.`;\r\n\r\n if (this.extendedLogDetails) logString += ` [Extended]: ${this.formatOptions(this.extendedLogDetails)}.`;\r\n if (this.deviceLogDetails) logString += ` [Device]: ${this.formatOptions(this.deviceLogDetails)}.`;\r\n \r\n return logString;\r\n }\r\n \r\n private formatOptions(optionalDetails: unknown): string {\r\n let entryNumber: number = 0;\r\n let formattedString: string = '';\r\n \r\n const entries = Object.entries(optionalDetails as Object);\r\n for (let entry of entries) {\r\n entryNumber += 1;\r\n formattedString += `${entry[0]}=${entry[1]}`;\r\n \r\n // appending comma and whitespace after each property except for last.\r\n if (entryNumber === entries.length) formattedString += ``;\r\n else formattedString += ', ';\r\n }\r\n\r\n return formattedString;\r\n }\r\n}\r\n","import { Observable, of } from \"rxjs\";\r\n\r\nimport { LogEntry } from \"@core/classes\";\r\nimport { LogPublisher } from \"@shared/models/log.interface\";\r\n\r\nexport class ConsoleLog implements LogPublisher {\r\n location: string = '';\r\n\r\n constructor() {}\r\n\r\n log (entry: LogEntry): Observable {\r\n console.log(entry.buildLogString());\r\n return of(true);\r\n }\r\n\r\n clear(): Observable {\r\n console.clear();\r\n return of(true);\r\n }\r\n}\r\n","import { Observable, of } from 'rxjs';\r\n\r\nimport { LogEntry } from \"@core/classes\";\r\nimport { LogPublisher } from '@shared/models/log.interface';\r\n\r\nexport class LocalStorageLog implements LogPublisher {\r\n location = \"app-logs\";\r\n \r\n constructor() {}\r\n\r\n log(logEntry: LogEntry): Observable {\r\n let includeEntries = false;\r\n let entries: Array = [];\r\n\r\n try {\r\n let entriesPresent = localStorage.getItem(this.location);\r\n if (entriesPresent)\r\n entries = JSON.parse(entriesPresent) || []\r\n\r\n entries.push(logEntry);\r\n localStorage.setItem(this.location, JSON.stringify(entries))\r\n includeEntries = true;\r\n } catch(error) {\r\n console.error(entries);\r\n }\r\n\r\n return of(includeEntries);\r\n };\r\n\r\n clear() {\r\n localStorage.removeItem('app-logs');\r\n return of(true);\r\n }\r\n}\r\n","import { HttpBackend, HttpErrorResponse, HttpHeaders, HttpRequest, HttpResponse } from '@angular/common/http';\r\nimport { catchError, map, Observable, of, throwError } from 'rxjs';\r\n\r\nimport { LogEntry } from \"@core/classes\";\r\nimport { LogPublisher, WebAPILogData } from '@shared/models/log.interface';\r\n\r\n\r\nexport class WebAPILog implements LogPublisher {\r\n location = '';\r\n\r\n constructor(endpoint: string, private httpBackend: HttpBackend) {\r\n this.location = endpoint;\r\n }\r\n\r\n log(logEntry: LogEntry, usingMobileDevice: boolean, token: string, jtiProvided: string = ''): Observable {\r\n let payload: WebAPILogData = {\r\n ...logEntry.basicLogDetails,\r\n ...logEntry.deviceLogDetails,\r\n ...logEntry.extendedLogDetails,\r\n user_id: logEntry.extendedLogDetails?.user_id || 'anonymous',\r\n };\r\n\r\n let logRequestHeader: HttpHeaders;\r\n // if (usingMobileDevice && jtiProvided) {\r\n logRequestHeader = new HttpHeaders({ 'Authorization': `Bearer ${token}`, 'X-Er-Type': jtiProvided });\r\n /*\r\n }\r\n else {\r\n logRequestHeader = new HttpHeaders({ 'Authorization': `Bearer ${token}` });\r\n }\r\n */\r\n return this.httpBackend.handle(new HttpRequest(\"POST\", this.location, payload, { headers: logRequestHeader })).pipe(\r\n map(response => {\r\n if (response instanceof HttpResponse && response.status === 200)\r\n return true;\r\n return false;\r\n }),\r\n catchError(this.handleErrors)\r\n )\r\n }\r\n\r\n clear(logEntry: LogEntry): Observable {\r\n return of(false);\r\n }\r\n\r\n private handleErrors(error: any): Observable {\r\n /* let errors: string[] = [];\r\n let message: string = \"\";\r\n \r\n message = \"Status: \" + error.status;\r\n message += \" - Status Text: \" + error.statusText;\r\n if (error instanceof HttpErrorResponse) {\r\n message += \" - Exception Message: \" + error.error.title;\r\n }\r\n errors.push(message); */\r\n \r\n /* console.error('An error occurred', errors);\r\n return throwError(() => errors); */\r\n console.error('An error occurred', error);\r\n return throwError(() => error);\r\n }\r\n}\r\n","import { HttpBackend } from '@angular/common/http';\r\nimport { Injectable } from '@angular/core';\r\n\r\nimport { APIResponse } from '@shared/models/auth.interface';\r\nimport { AppService } from './app.service';\r\n\r\nimport { LogPublishersConfig } from '@shared/models/app-settings.inteface';\r\nimport { ConsoleLog, LocalStorageLog, WebAPILog } from '@core/classes';\r\nimport { LogPublisher } from '@shared/models/log.interface';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class LogPublisherService {\r\n pushLogAPIEndpoint: string = '';\r\n publishers: Array = [];\r\n logPublishersConfig: LogPublishersConfig = {\r\n console: true,\r\n localStorage: false,\r\n webAPI: false\r\n };\r\n\r\n constructor(private httpBackend: HttpBackend, private appService: AppService) {\r\n this.pushLogAPIEndpoint = this.appService.getAppConfigs()[\"LOG\"].BaseUrl + this.appService.getAppConfigs()[\"LOG\"].Versions.V1[\"CLIENTLOGS\"][\"PostClientLogs\"].PATH;\r\n this.logPublishersConfig = this.appService.getAppSettings().log.logPublishersConfig || this.logPublishersConfig;\r\n this.buildPublishers();\r\n }\r\n\r\n buildPublishers(): void {\r\n if (this.logPublishersConfig.console) this.publishers.push(new ConsoleLog());\r\n if (this.logPublishersConfig.localStorage) this.publishers.push(new LocalStorageLog());\r\n if (this.logPublishersConfig.webAPI) this.publishers.push(new WebAPILog>(this.pushLogAPIEndpoint, this.httpBackend));\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { Router } from '@angular/router';\r\nimport { DeviceDetectorService } from 'ngx-device-detector';\r\n\r\nimport { LogEntry } from '@core/classes';\r\nimport { ExtendedLogDetails, LogLevel, LogPublisher } from '@shared/models/log.interface';\r\n\r\nimport { AppService } from '@shared/services/core/app.service';\r\nimport { LogPublisherService } from '@shared/services/core/log-publisher.service';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class LogService {\r\n level: LogLevel = LogLevel.ALL;\r\n publishers: Array = [];\r\n\r\n constructor(\r\n private router: Router,\r\n private appService: AppService,\r\n private deviceInfoService: DeviceDetectorService,\r\n private logPublisherService: LogPublisherService\r\n ) {\r\n this.level = this.appService.getAppSettings().log.defaultLevel;\r\n this.publishers = this.logPublisherService.publishers;\r\n }\r\n\r\n debug(message: string, extendedLogs?: ExtendedLogDetails, usingMobileDevice: boolean = false, token?: string, jti?: string) {\r\n this.createLog(message, LogLevel.DEBUG, extendedLogs, usingMobileDevice, token, jti);\r\n }\r\n\r\n info(msg: string, extendedLogs?: ExtendedLogDetails, usingMobileDevice: boolean = false, token?: string, jti?: string) {\r\n this.createLog(msg, LogLevel.INFO, extendedLogs, usingMobileDevice, token, jti);\r\n }\r\n\r\n warn(msg: string, extendedLogs?: ExtendedLogDetails, usingMobileDevice: boolean = false, token?: string, jti?: string) {\r\n this.createLog(msg, LogLevel.WARN, extendedLogs, usingMobileDevice, token, jti);\r\n }\r\n\r\n error(msg: string, extendedLogs?: ExtendedLogDetails, usingMobileDevice: boolean = false, token?: string, jti?: string) {\r\n this.createLog(msg, LogLevel.ERROR, extendedLogs, usingMobileDevice, token, jti);\r\n }\r\n\r\n fatal(msg: string, extendedLogs?: ExtendedLogDetails, usingMobileDevice: boolean = false, token?: string, jti?: string) {\r\n this.createLog(msg, LogLevel.FATAL, extendedLogs, usingMobileDevice, token, jti);\r\n }\r\n\r\n appLogin(msg: string, extendedLogs?: ExtendedLogDetails, usingMobileDevice: boolean = false, token?: string, jti?: string) {\r\n this.createLog(msg, LogLevel.APPLOGIN, extendedLogs, usingMobileDevice, token, jti);\r\n }\r\n\r\n appLogout(msg: string, extendedLogs?: ExtendedLogDetails, usingMobileDevice: boolean = false, token?: string, jti?: string) {\r\n this.createLog(msg, LogLevel.APPLOGOUT, extendedLogs, usingMobileDevice, token, jti);\r\n }\r\n\r\n all(msg: string, extendedLogs?: ExtendedLogDetails, usingMobileDevice: boolean = false, token?: string, jti?: string) {\r\n this.createLog(msg, LogLevel.ALL, extendedLogs, usingMobileDevice, token, jti);\r\n }\r\n\r\n private createLog(message: string, level: LogLevel, extended?: ExtendedLogDetails, usingMobileDevice: boolean = false, token?: string, jti?: string) {\r\n if (this.shouldIncludeLogsOf(level)) {\r\n let logEntry = new LogEntry();\r\n logEntry.basicLogDetails.screen_route = this.router.url.split(\"?\")[0];\r\n logEntry.basicLogDetails.log_message = message;\r\n logEntry.basicLogDetails.level = level;\r\n logEntry.extendedLogDetails = extended;\r\n const info = this.deviceInfoService.getDeviceInfo();\r\n logEntry.deviceLogDetails = { ...info, device_type: info.deviceType };\r\n\r\n for (let publisher of this.publishers) {\r\n publisher.log(logEntry, usingMobileDevice, token, jti).subscribe();\r\n }\r\n }\r\n }\r\n\r\n private shouldIncludeLogsOf(level: LogLevel) {\r\n let shouldInclude: boolean = false;\r\n\r\n if ((level >= this.level && level !== LogLevel.OFF) || (this.level === LogLevel.ALL)) {\r\n shouldInclude = true;\r\n }\r\n return shouldInclude;\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { Router } from '@angular/router';\r\nimport { Title } from '@angular/platform-browser'\r\nimport { TranslateService } from '@ngx-translate/core';\r\nimport { forkJoin } from 'rxjs';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class PageTitleService {\r\n\r\n constructor(\r\n private _route: Router,\r\n private _titleService: Title,\r\n private _translateService: TranslateService\r\n ) { }\r\n\r\n setTitleBasedOnRoute(includePrefix: boolean = true, translationsBasePath: string = 'pageTitles') {\r\n let finalTitlePage = '';\r\n let pageNamePart = this._route.url.split('/').pop();\r\n pageNamePart = (pageNamePart!.split('?').length > 1) ? pageNamePart?.split('?')[0] : pageNamePart;\r\n if (pageNamePart) {\r\n let translationPathForPageTitle = `${translationsBasePath}.${pageNamePart}`;\r\n\r\n const translations$ = forkJoin({\r\n prefix: this._translateService.get(`${translationsBasePath}.prefix`),\r\n pageTitle: this._translateService.get(translationPathForPageTitle)\r\n });\r\n\r\n translations$.subscribe(translation => {\r\n finalTitlePage = translation.pageTitle;\r\n if (includePrefix) finalTitlePage = `${translation.prefix} - ${finalTitlePage}`;\r\n this._titleService.setTitle(finalTitlePage);\r\n });\r\n }\r\n else {\r\n this._titleService.setTitle(`Client Portal - ${pageNamePart?.toLowerCase()}`);\r\n }\r\n }\r\n}\r\n","
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n

{{ data.title }}

\r\n

{{ data.message }}

\r\n
\r\n
\r\n
\r\n
\r\n
\r\n\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n

{{ data.title }}

\r\n

{{ data.message }}

\r\n
\r\n
\r\n
\r\n
\r\n
\r\n\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n

{{ data.title }}

\r\n

{{ data.message }}

\r\n
\r\n
\r\n
\r\n
\r\n
\r\n\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n

{{ data.title }}

\r\n

{{ data.message }}

\r\n
\r\n
\r\n
\r\n
\r\n
\r\n","import { Component, OnInit, Injectable, Inject } from '@angular/core';\r\nimport {MatSnackBar, MAT_SNACK_BAR_DATA} from '@angular/material/snack-bar';\r\n\r\n@Component({\r\n selector: 'app-notification',\r\n templateUrl: './notification.component.html',\r\n styleUrls: ['./notification.component.scss']\r\n})\r\nexport class NotificationComponent {\r\n activeStyle: string = \"INFO\";\r\n showSnackBar: boolean = true;\r\n\r\n constructor(@Inject(MAT_SNACK_BAR_DATA) public data: any, public snackBar:\r\n MatSnackBar) { }\r\n\r\n}","import { Injectable } from '@angular/core';\r\nimport { MatSnackBar, MatSnackBarHorizontalPosition, MatSnackBarVerticalPosition } from '@angular/material/snack-bar';\r\nimport { NotificationComponent } from '@core/components/notification/notification.component';\r\nimport { SnackBarConfig } from '@shared/models/core.interface';\r\nimport { AppService } from './app.service';\r\n\r\n@Injectable()\r\nexport class SnackbarService {\r\n private defaultTimeoutInMS: number = 10000; \r\n private defaultHorizontalPosition: MatSnackBarHorizontalPosition = 'end';\r\n private defaultVerticalPosition: MatSnackBarVerticalPosition = 'bottom';\r\n\r\n constructor(private _appService: AppService, private _snackBar: MatSnackBar) {\r\n const verticalPositionConfig = this._appService.getAppSettings()?.snackBar.verticalPosition;\r\n const horizontalPositionConfig = this._appService.getAppSettings()?.snackBar.horizontalPosition;\r\n const timeoutConfig = this._appService.getAppSettings()?.snackBar.timeout;\r\n this.initializeSnackBarConfigs(timeoutConfig, horizontalPositionConfig, verticalPositionConfig);\r\n }\r\n\r\n private initializeSnackBarConfigs(timeout: number, horizontalPosition: string, verticalPosition: string) {\r\n // Resolving position.\r\n const horizontalPositionValid = (horizontalPosition === 'start' || 'center' || 'end' || 'left' || 'right');\r\n const verticalPositionValid = (verticalPosition === 'top' || 'bottom');\r\n\r\n if (horizontalPositionValid) this.defaultHorizontalPosition = horizontalPosition as MatSnackBarHorizontalPosition;\r\n if (verticalPositionValid) this.defaultVerticalPosition = verticalPosition as MatSnackBarVerticalPosition;\r\n\r\n // Resolving timeout.\r\n this.defaultTimeoutInMS = (timeout) ?? this.defaultTimeoutInMS;\r\n }\r\n\r\n showSnackBar(data: SnackBarConfig) {\r\n let snackBarRef = this._snackBar.openFromComponent(NotificationComponent, {\r\n duration: this.defaultTimeoutInMS,\r\n horizontalPosition: this.defaultHorizontalPosition,\r\n verticalPosition: this.defaultVerticalPosition,\r\n data: data\r\n });\r\n\r\n snackBarRef.afterDismissed().subscribe(action => {\r\n // console.debug(\"Action: \", action);\r\n })\r\n }\r\n\r\n showWarningSnackBar(title: string, message: string, action: string) {\r\n let snackBarRef = this._snackBar.openFromComponent(NotificationComponent, {\r\n duration: 5000,\r\n horizontalPosition: this.defaultHorizontalPosition,\r\n verticalPosition: this.defaultVerticalPosition,\r\n data: {\r\n title: title,\r\n message: message,\r\n info: false,\r\n warn: true,\r\n err: false,\r\n Success: false\r\n }\r\n });\r\n snackBarRef.afterDismissed().subscribe(() => {\r\n });\r\n }\r\n\r\n showErrorSnackBar(title: string, message: string, action: string) {\r\n let snackBarRef = this._snackBar.openFromComponent(NotificationComponent, {\r\n duration: 5000,\r\n horizontalPosition: this.defaultHorizontalPosition,\r\n verticalPosition: this.defaultVerticalPosition,\r\n data: {\r\n title: title,\r\n message: message,\r\n info: false,\r\n warn: false,\r\n err: true,\r\n Success: false\r\n }\r\n });\r\n snackBarRef.afterDismissed().subscribe(() => {\r\n });\r\n }\r\n\r\n showSuccessSnackBar(title: string, message: string, action: string) {\r\n let snackBarRef = this._snackBar.openFromComponent(NotificationComponent, {\r\n duration: 5000,\r\n horizontalPosition: this.defaultHorizontalPosition,\r\n verticalPosition: this.defaultVerticalPosition,\r\n data: {\r\n title: title,\r\n message: message,\r\n info: false,\r\n warn: false,\r\n err: false,\r\n Success: true\r\n }\r\n });\r\n snackBarRef.afterDismissed().subscribe(() => {\r\n });\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { HttpClient, HttpHeaders } from '@angular/common/http';\r\nimport {\r\n of,\r\n throwError\r\n} from 'rxjs';\r\nimport { AppService } from '@shared/services/core/app.service';\r\nimport { LocalStorageService } from './local-storage.service';\r\nimport { APIResponse } from '@shared/models/auth.interface';\r\nimport { Theme } from '@shared/models/theme.interface';\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class ThemeService {\r\n private clientPortalDomain!: string;\r\n\r\n constructor(private _appService: AppService, private http: HttpClient, private _localStorageService: LocalStorageService,) {\r\n this.clientPortalDomain = this._appService.getAppConfigs()[\"URI\"].BaseUrl;\r\n }\r\n\r\n getThemeDetail() {\r\n const userAuthAPIEndpoint = this._appService.getAppConfigs()[\"CLIENTPORTAL\"].Versions[\"V1\"][\"THEME\"][\"ApplicationSetting\"].PATH;\r\n const url = this.clientPortalDomain + userAuthAPIEndpoint;\r\n return this.http.get>(`${url}`);;\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { HttpClient, HttpHeaders } from '@angular/common/http';\r\nimport { AppService } from '@shared/services/core/app.service';\r\nimport { map } from 'rxjs';\r\n\r\nimport {\r\n APIResponse,\r\n ShiftSummaryModel,\r\n WeekShifts,\r\n TotalShift,\r\n ChartData,\r\n HomeSection,\r\n QualificationList,\r\n StaffSummary,\r\n TimesheetApproval,\r\n ShiftInvoice,\r\n ClientList,\r\n ServiceLocation \r\n} from '@shared/models/dashboard.interface';\r\nimport { Menu } from '@shared/models/sidenav.interface';\r\nimport { BusinessError } from '@modules/error/classes';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class DashboardService {\r\n clientPortalDomain!: string;\r\n isAuthorized: boolean = true;\r\n\r\n constructor(private appService: AppService, private http: HttpClient) {\r\n this.clientPortalDomain = this.appService.getAppConfigs()[\"CLIENTPORTAL\"].BaseUrl;\r\n }\r\n\r\n formPageRoutes(menuOptions: Array): Array {\r\n menuOptions.forEach(option => {\r\n const currentPageRoute = option.optionKeyword.toLowerCase();\r\n \r\n // making CamelCase class names.\r\n option.cssClass = option.optionKeyword.slice(0, 1).toUpperCase() + option.optionKeyword.toLowerCase().slice(1);\r\n option.cssClass[0].toUpperCase(); // making the 1st letter uppercase.\r\n\r\n const hasChildren = menuOptions.filter(o => o.parentId && o.parentId === option.id);\r\n if (hasChildren.length > 0) option.cssClass += ' hasChildren';\r\n\r\n if (option.parentId === 0) {\r\n option.parentId = undefined;\r\n option.optionPath = `${currentPageRoute}`\r\n }\r\n else {\r\n const parentOptionIndex = menuOptions.findIndex(potentialParent => potentialParent.id === option.parentId);\r\n if (parentOptionIndex !== -1) {\r\n const parentPageRoute = menuOptions[parentOptionIndex].optionKeyword.toLowerCase();\r\n option.optionPath = `${parentPageRoute}/${currentPageRoute}`\r\n }\r\n }\r\n });\r\n\r\n return menuOptions;\r\n }\r\n\r\n getMenuListData(clientTypeParameter: string, clientLoginParameter: string, token: string, jti: string, professionalLevel: string = '') {\r\n const menuListEndpoint = this.appService.getAppConfigs()[\"CLIENTPORTAL\"].Versions[\"V1\"][\"DASHBOARD\"][\"GetMenuListData\"].PATH;\r\n const url = this.clientPortalDomain + menuListEndpoint;\r\n \r\n // Preparing query parameters.\r\n let queryArgs: string = `ClientType=${clientTypeParameter}&ClientLogin=${clientLoginParameter}`;\r\n if (professionalLevel) queryArgs +=`&ClientLevel=${professionalLevel}`;\r\n\r\n // converting the menu details response into kendo drawer friendly format.\r\n const authHeaders = new HttpHeaders({ 'Authorization': `Bearer ${token}`, 'X-Er-Type': `${jti}` });\r\n return this.http.get>>(`${url}?${queryArgs}`, { headers: authHeaders }).pipe(\r\n map(response => {\r\n if (response.Data.length > 0) {\r\n return response.Data;\r\n } else {\r\n throw new BusinessError(\"PORTAL_UNAVAILABLE\", \"You don’t have access to the portal. Please contact the agency staff\");\r\n }\r\n }),\r\n map(menuOptions => this.formPageRoutes(menuOptions))\r\n );\r\n }\r\n\r\n getHomeSection() {\r\n const userAuthAPIEndpoint = this.appService.getAppConfigs()[\"CLIENTPORTAL\"].Versions[\"V1\"][\"DASHBOARD\"][\"GetHomeSection\"].PATH;\r\n const url = this.clientPortalDomain + userAuthAPIEndpoint;\r\n return this.http.get>(`${url}`);\r\n }\r\n\r\n getQualifications(clientId: string) {\r\n const userAuthAPIEndpoint = this.appService.getAppConfigs()[\"CLIENTPORTAL\"].Versions[\"V1\"][\"DASHBOARD\"][\"GetQualificationsList\"].PATH;\r\n const url = this.clientPortalDomain + userAuthAPIEndpoint;\r\n return this.http.get>(`${url}?ClientId=${clientId}`);\r\n }\r\n\r\n getShiftWeek(requestBody: ShiftSummaryModel) {\r\n const userAuthAPIEndpoint = this.appService.getAppConfigs()[\"CLIENTPORTAL\"].Versions[\"V1\"][\"DASHBOARD\"][\"GetShiftWeek\"].PATH;\r\n const url = this.clientPortalDomain + userAuthAPIEndpoint;\r\n return this.http.get>(`${url}?DateFrom=${requestBody.dateFrom}&DateTo=${requestBody.dateTo}&ClientId=${requestBody.clientId}`);\r\n }\r\n\r\n getShiftCount(requestBody: ShiftSummaryModel) {\r\n const userAuthAPIEndpoint = this.appService.getAppConfigs()[\"CLIENTPORTAL\"].Versions[\"V1\"][\"DASHBOARD\"][\"GetShiftCount\"].PATH;\r\n const url = this.clientPortalDomain + userAuthAPIEndpoint;\r\n return this.http.get>(`${url}?DateFrom=${requestBody.dateFrom}&DateTo=${requestBody.dateTo}&ClientId=${requestBody.clientId}`);\r\n }\r\n\r\n getShiftChart(requestBody: ShiftSummaryModel) {\r\n const userAuthAPIEndpoint = this.appService.getAppConfigs()[\"CLIENTPORTAL\"].Versions[\"V1\"][\"DASHBOARD\"][\"GetShiftChart\"].PATH;\r\n const url = this.clientPortalDomain + userAuthAPIEndpoint;\r\n return this.http.get>(`${url}?DateFrom=${requestBody.dateFrom}&DateTo=${requestBody.dateTo}&ClientId=${requestBody.clientId}`);\r\n }\r\n\r\n getStaffSummary(clientId: string) {\r\n const userAuthAPIEndpoint = this.appService.getAppConfigs()[\"CLIENTPORTAL\"].Versions[\"V1\"][\"DASHBOARD\"][\"GetStaffSummary\"].PATH;\r\n const url = this.clientPortalDomain + userAuthAPIEndpoint;\r\n return this.http.get>(`${url}?ClientId=${clientId}`);\r\n }\r\n\r\n getAgencyFillRatio(requestBody: ShiftSummaryModel) {\r\n const userAuthAPIEndpoint = this.appService.getAppConfigs()[\"CLIENTPORTAL\"].Versions[\"V1\"][\"DASHBOARD\"][\"GetAgencyFillRatio\"].PATH;\r\n const url = this.clientPortalDomain + userAuthAPIEndpoint;\r\n return this.http.get>(`${url}?DateFrom=${requestBody.dateFrom}&DateTo=${requestBody.dateTo}&ClientId=${requestBody.clientId}`);\r\n }\r\n\r\n getTimesheetApproval(requestBody: ShiftSummaryModel) {\r\n const userAuthAPIEndpoint = this.appService.getAppConfigs()[\"CLIENTPORTAL\"].Versions[\"V1\"][\"DASHBOARD\"][\"GetTimesheetApproval\"].PATH;\r\n const url = this.clientPortalDomain + userAuthAPIEndpoint;\r\n return this.http.get>(`${url}?DateFrom=${requestBody.dateFrom}&DateTo=${requestBody.dateTo}&ClientId=${requestBody.clientId}`);\r\n }\r\n\r\n getShiftsInvoice(requestBody: ShiftSummaryModel) {\r\n const userAuthAPIEndpoint = this.appService.getAppConfigs()[\"CLIENTPORTAL\"].Versions[\"V1\"][\"DASHBOARD\"][\"GetShiftsInvoice\"].PATH;\r\n const url = this.clientPortalDomain + userAuthAPIEndpoint;\r\n return this.http.get>(`${url}?DateFrom=${requestBody.dateFrom}&DateTo=${requestBody.dateTo}&ClientId=${requestBody.clientId}`);\r\n }\r\n\r\n getShiftsUnInvoice(requestBody: ShiftSummaryModel) {\r\n const userAuthAPIEndpoint = this.appService.getAppConfigs()[\"CLIENTPORTAL\"].Versions[\"V1\"][\"DASHBOARD\"][\"GetShiftsUnInvoice\"].PATH;\r\n const url = this.clientPortalDomain + userAuthAPIEndpoint;\r\n return this.http.get>(`${url}?DateFrom=${requestBody.dateFrom}&DateTo=${requestBody.dateTo}&ClientId=${requestBody.clientId}`);\r\n }\r\n\r\n getClientList(clientId: string) {\r\n const userAuthAPIEndpoint = this.appService.getAppConfigs()[\"CLIENTPORTAL\"].Versions[\"V1\"][\"DASHBOARD\"][\"GetClientList\"].PATH;\r\n const url = this.clientPortalDomain + userAuthAPIEndpoint;\r\n return this.http.get>(`${url}?ProfessionalId=${clientId}`);\r\n }\r\n\r\n getServiceLocation(ClientId: string, ClientType: string) {\r\n const serviceLocationAPI = this.appService.getAppConfigs()[\"CLIENTPORTAL\"].Versions.V1[\"BOOKING\"][\"GetServiceLocation\"].PATH;\r\n const url = this.clientPortalDomain + serviceLocationAPI;\r\n return this.http.get>(`${url}?ClientId=${ClientId}&ClientType=${ClientType}`);\r\n }\r\n}","import { NgModule } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { HttpClientModule, HttpClient } from '@angular/common/http';\r\nimport { RouterModule } from '@angular/router';\r\nimport { ReactiveFormsModule } from '@angular/forms';\r\nimport { KendoModule } from '@shared/kendo.module';\r\nimport { MaterialModule } from '@shared/material.module';\r\nimport { TranslateModule, TranslateLoader } from '@ngx-translate/core';\r\nimport { TranslateHttpLoader } from '@ngx-translate/http-loader';\r\nimport { CarouselModule } from 'ngx-owl-carousel-o';\r\nimport { SharedModule } from '../shared/shared.module';\r\n\r\nimport { LoginPage } from '@pages/auth/login.page';\r\nimport { AppInitializationPage } from '@pages/auth/app-initialization.page';\r\nimport { LoginFormComponent } from './components/login-form/login-form.component';\r\nimport { PasswordRecoveryFormComponent } from './components/password-recovery-form/password-recovery-form.component';\r\nimport { ExclusiveFormFieldDirective } from './directives/exclusive-form-field.directive';\r\nimport { ShowcaseCarouselComponent } from './components/showcase-carousel/showcase-carousel.component';\r\nimport { AccessCodeFormComponent } from './components/access-code-form/access-code-form.component';\r\nimport { FormNotificationComponent } from './components/form-notification/form-notification.component';\r\n\r\n\r\nexport function HttpLoaderFactory(http: HttpClient) {\r\n return new TranslateHttpLoader(http);\r\n}\r\n\r\n@NgModule({\r\n declarations: [\r\n LoginPage,\r\n AppInitializationPage,\r\n LoginFormComponent,\r\n PasswordRecoveryFormComponent,\r\n ExclusiveFormFieldDirective,\r\n ShowcaseCarouselComponent,\r\n AccessCodeFormComponent,\r\n FormNotificationComponent\r\n ],\r\n imports: [\r\n SharedModule,\r\n CarouselModule,\r\n CommonModule,\r\n HttpClientModule,\r\n KendoModule,\r\n MaterialModule,\r\n ReactiveFormsModule,\r\n RouterModule,\r\n TranslateModule.forChild({\r\n loader: {\r\n provide: TranslateLoader,\r\n useFactory: HttpLoaderFactory,\r\n deps: [HttpClient]\r\n }\r\n }),\r\n ]\r\n})\r\nexport class AuthModule { }\r\n","
\r\n \r\n
\r\n
\r\n
\r\n
\r\n \"\"\r\n
\r\n
\r\n

{{ 'page.appInitialization.pageHeading' | translate }}

\r\n

{{ 'page.appInitialization.linkExpiredMessage' | translate }}

\r\n \r\n
\r\n
\r\n
\r\n\r\n\r\n
\r\n \r\n \r\n \r\n \r\n
\r\n

{{ 'page.appInitialization.waitMessage' | translate }}

\r\n
","import { Component, OnInit, OnDestroy } from '@angular/core';\r\nimport { ActivatedRoute, Router } from '@angular/router';\r\nimport { Subscription } from 'rxjs';\r\n\r\nimport { AuthService } from '@shared/services/auth/auth.service';\r\n@Component({\r\n selector: 'app-app-initialization-with-uri',\r\n templateUrl: './app-initialization-with-uri.page.html',\r\n styleUrls: ['./app-initialization-with-uri.page.scss']\r\n})\r\nexport class AppInitializationWithUriPage implements OnInit, OnDestroy {\r\n private _shortUrl: string = '';\r\n private _completeUrl: string = '';\r\n private completeUrlSubscription: Subscription | undefined;\r\n\r\n public showExpired: boolean = false;\r\n\r\n constructor(private _activeRoute: ActivatedRoute, private _authService: AuthService) { }\r\n\r\n ngOnInit(): void {\r\n this._shortUrl = this._activeRoute.snapshot.queryParams[\"lk\"];\r\n this.completeUrlSubscription = this._authService.getCompleteUrl(this._shortUrl).subscribe(response => {\r\n if (response.Data == null) {\r\n this.showExpired = true;\r\n }\r\n else {\r\n this.showExpired = false;\r\n this._completeUrl = response.Data\r\n setTimeout(() => { // <<<---using ()=> syntax\r\n window.location.href = this._completeUrl;\r\n }, 3000);\r\n }\r\n });\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.completeUrlSubscription?.unsubscribe();\r\n }\r\n}\r\n","import { Component, OnInit, OnDestroy } from '@angular/core';\r\nimport { ActivatedRoute, Router } from '@angular/router';\r\nimport { tap, concatMap, Subscription, map, mergeMap } from 'rxjs';\r\nimport { CookieService } from 'ngx-cookie';\r\n\r\nimport { AuthService } from '@shared/services/auth/auth.service';\r\nimport { SessionService } from '@shared/services/auth/session.service';\r\nimport { PageTitleService } from '@shared/services/core/page-title.service';\r\nimport { EncryptionService } from '@shared/services/core/encryption.service';\r\nimport { LogService } from '@shared/services/core/log.service';\r\n\r\nimport {\r\n ClientUserData,\r\n ProfessionalUserData,\r\n UserLicenseDetail,\r\n CookieData,\r\n UnspecifiedUserTypeData\r\n} from '@shared/models/auth.interface';\r\nimport { DashboardService } from '@shared/services/dashboard/dashboard.service';\r\nimport { BusinessError, CategorizedError } from '@modules/error/classes';\r\nimport { SnackbarService } from '@shared/services/core';\r\nimport { DeviceDetectorService } from 'ngx-device-detector';\r\nimport { Menu } from '@shared/models/sidenav.interface';\r\n\r\n\r\n@Component({\r\n selector: 'app-app-initialization',\r\n templateUrl: './app-initialization.page.html',\r\n styleUrls: ['./app-initialization.page.scss']\r\n})\r\nexport class AppInitializationPage implements OnInit, OnDestroy {\r\n private _subscriptions: Array = [];\r\n private _jtiProvided: string = '';\r\n private _tokenProvided: string = '';\r\n private _refreshTokenProvided: string = '';\r\n private _newToken: string = '';\r\n private _newRefreshToken: string = '';\r\n private _isLoggedIn: boolean = false;\r\n private _pageLoadTimeout: number = 3000;\r\n activeUserLogo!: string;\r\n defaultLogo: string = '/assets/images/entireonhire-logo.svg';\r\n\r\n\r\n constructor(\r\n private _router: Router,\r\n private _activeRoute: ActivatedRoute,\r\n private _authService: AuthService,\r\n private _cookieService: CookieService,\r\n private _sessionService: SessionService,\r\n private _dashboardService: DashboardService,\r\n private _encryptionService: EncryptionService,\r\n private _logService: LogService,\r\n private _pageTitleService: PageTitleService,\r\n private _snackbarService: SnackbarService,\r\n private deviceDetectorService: DeviceDetectorService\r\n ) { }\r\n\r\n ngOnInit(): void {\r\n this._pageTitleService.setTitleBasedOnRoute();\r\n this._jtiProvided = this._activeRoute.snapshot.queryParams[\"args1\"];\r\n this._tokenProvided = this._activeRoute.snapshot.queryParams[\"args2\"];\r\n this._refreshTokenProvided = this._activeRoute.snapshot.queryParams[\"args3\"];\r\n this._isLoggedIn = (this._activeRoute.snapshot.queryParams[\"args4\"] === \"y\");\r\n\r\n let logo = this._sessionService.getLogo();\r\n this.activeUserLogo = (logo) ?? this.defaultLogo;\r\n\r\n if(this._isLoggedIn) this.checkKeepMeLoggedIn();\r\n\r\n if(this._jtiProvided && this._tokenProvided && this._refreshTokenProvided && this._isLoggedIn) {\r\n this.authenticateLoggedInUser(this._jtiProvided, this._tokenProvided, this._refreshTokenProvided);\r\n }\r\n else if (this._jtiProvided && this._tokenProvided) {\r\n this.authenticateCredentials(this._jtiProvided, this._tokenProvided);\r\n } else {\r\n this._authService.removeKeepMeLoggedIN();\r\n this._router.navigateByUrl(\"/login\");\r\n }\r\n }\r\n\r\n authenticateLoggedInUser(jti: string, currentToken: string, currentRefreshToken: string) {\r\n let userID: string = '';\r\n let userLicenseDetails: UserLicenseDetail;\r\n let userType:\"CLT\"|\"PRF\" = \"CLT\";\r\n let forClient = true;\r\n let userDetails: UnspecifiedUserTypeData;\r\n\r\n const authenticationSubscription = this._authService.getRefreshedToken(currentToken, currentRefreshToken).pipe(\r\n tap(refreshTokenResponse => {\r\n this._newToken = refreshTokenResponse.data.token;\r\n this._newRefreshToken = refreshTokenResponse.data.refreshToken;\r\n this._sessionService.updateTokenAndJTIOnStorage(jti, this._newToken);\r\n }),\r\n concatMap(_ => this._authService.getUserIDAndRefreshToken({ jti, token: this._newToken })),\r\n tap(userIDAndRefreshTokenResponse => { \r\n userID = userIDAndRefreshTokenResponse.Data.UserId; // and we already have refreshed token.\r\n }),\r\n concatMap(_ => this._authService.getLicenseDetails(this._newToken, this._jtiProvided)),\r\n tap(licenseDetailsResponse => { \r\n this._authService.checkLicenseExpiry(licenseDetailsResponse.Data);\r\n userLicenseDetails = licenseDetailsResponse.Data;\r\n }),\r\n concatMap(_ => this._authService.getUserTypeDetailsByID(userID, jti, this._newToken)),\r\n tap(userDetailsResponse => userDetails = userDetailsResponse.Data),\r\n concatMap(_ => this._authService.performProfessionalActivationCheck(userID, this._newToken, jti)),\r\n concatMap(userAllowedToLogin => {\r\n if (!userAllowedToLogin) throw new BusinessError('USER_NOT_LINKED_WITH_CLIENTS', 'Professional not linked with any active clients.');\r\n\r\n if (userDetails.hasOwnProperty('ClientID')) {\r\n forClient = true;\r\n userType = 'CLT';\r\n this.saveUserData(true, userDetails, userLicenseDetails, this._newToken, this._newRefreshToken, jti);\r\n return this._authService.updateLoginLogoutStatus(this._newToken, this._jtiProvided, userID, userType, \"Y\").pipe(\r\n mergeMap(_ => this._dashboardService.getMenuListData(userType, \"1\", this._newToken, this._jtiProvided))\r\n );\r\n }\r\n else {\r\n forClient = false;\r\n userType = 'PRF';\r\n this.saveUserData(false, userDetails, userLicenseDetails, this._newToken, this._newRefreshToken, jti);\r\n return this._authService.updateLoginLogoutStatus(this._newToken, this._jtiProvided, userID, userType, \"Y\").pipe(\r\n mergeMap(_ => this._dashboardService.getMenuListData(userType, \"0\", this._newToken, (userDetails as ProfessionalUserData).LevelName))\r\n );\r\n }\r\n }),\r\n // map(menuListDataResponse => menuListDataResponse.Data), // returning the 1st element as the list comes already sorted.\r\n map((menuOptions: Array) => this.getLandingPageRoute(forClient, this._jtiProvided, menuOptions[0].optionPath))\r\n )\r\n .subscribe({\r\n next: (landingPage) => {\r\n if(this._isLoggedIn) {\r\n this._authService.removeKeepMeLoggedIN();\r\n const sessionCookie = this._authService.saveAllDataInCookie(jti, this._newToken, this._newRefreshToken);\r\n this._authService.setKeepMeLoggedIn(this._encryptionService.encryptData(sessionCookie));\r\n }\r\n else this._authService.removeKeepMeLoggedIN();\r\n\r\n setTimeout(() => {\r\n const usingMobileDevice = this.deviceDetectorService.isMobile() || this.deviceDetectorService.isTablet();\r\n this._logService.appLogin(\"LoggedIn\", { jti: this._jtiProvided, user_id: userID }, usingMobileDevice, this._newToken, this._jtiProvided);\r\n this._router.navigateByUrl(`/${(landingPage as string[]).join('/')}`);\r\n }, this._pageLoadTimeout);\r\n },\r\n\r\n error: (errorResponse) => {\r\n this._authService.removeKeepMeLoggedIN();\r\n\r\n let loginPageArgs = '';\r\n if (errorResponse instanceof BusinessError) loginPageArgs = `?authStatus=${errorResponse.title}`;\r\n else if (errorResponse instanceof CategorizedError) {\r\n this._snackbarService.showErrorSnackBar(errorResponse.title, errorResponse.description, 'none');\r\n } else loginPageArgs = '?authStatus=UNKNOWN_ERROR';\r\n setTimeout(()=> this._router.navigateByUrl('/login' + loginPageArgs), this._pageLoadTimeout);\r\n }\r\n });\r\n\r\n this._subscriptions.push(authenticationSubscription);\r\n }\r\n\r\n authenticateCredentials(jti: string, tokenProvided: string) {\r\n let refreshToken: string = '';\r\n let userID: string = '';\r\n let userType:\"CLT\"|\"PRF\" = \"CLT\";\r\n let forClient = true;\r\n let userLicenseDetails: UserLicenseDetail;\r\n let userDetails: UnspecifiedUserTypeData;\r\n\r\n const credentialSubscription = this._authService.getUserIDAndRefreshTokenJti({ jti, token: tokenProvided }).pipe(\r\n tap(userIDAndRefreshTokenResponse => {\r\n refreshToken = userIDAndRefreshTokenResponse.Data.RefreshToken;\r\n userID = userIDAndRefreshTokenResponse.Data.UserId;\r\n }),\r\n concatMap( _ => this._authService.getRefreshedToken(tokenProvided, refreshToken)),\r\n tap(refreshTokenResponse => {\r\n this._newToken = refreshTokenResponse.data.token;\r\n this._newRefreshToken = refreshTokenResponse.data.refreshToken;\r\n this._sessionService.updateTokenAndJTIOnStorage(jti, this._newToken);\r\n }),\r\n concatMap(_ => this._authService.getLicenseDetails(this._newToken, this._jtiProvided)),\r\n tap(licenseDetailsResponse => {\r\n this._authService.checkLicenseExpiry(licenseDetailsResponse.Data);\r\n userLicenseDetails = licenseDetailsResponse.Data;\r\n }),\r\n concatMap(_ => this._authService.getUserTypeDetailsByID(userID, jti, this._newToken)),\r\n tap(userDetailsResponse => userDetails = userDetailsResponse.Data),\r\n concatMap(_ => this._authService.performProfessionalActivationCheck(userID, this._newToken, jti)),\r\n concatMap(userAllowedToLogin => {\r\n if (!userAllowedToLogin) throw new BusinessError('USER_NOT_LINKED_WITH_CLIENTS', 'Professional not linked with any active clients.');\r\n\r\n if (userDetails.hasOwnProperty('ClientID')) {\r\n forClient = true;\r\n userType = 'CLT';\r\n this.saveUserData(true, userDetails, userLicenseDetails, this._newToken, refreshToken, jti);\r\n return this._authService.updateLoginLogoutStatus(this._newToken, this._jtiProvided, userID, userType, \"Y\").pipe(\r\n mergeMap(_ =>this._dashboardService.getMenuListData(userType, \"1\", this._newToken, this._jtiProvided))\r\n );\r\n }\r\n else {\r\n forClient = false;\r\n userType = 'PRF';\r\n this.saveUserData(false, userDetails, userLicenseDetails, this._newToken, refreshToken, jti);\r\n return this._authService.updateLoginLogoutStatus(this._newToken, this._jtiProvided, userID, userType, \"Y\").pipe(\r\n mergeMap(_ =>this._dashboardService.getMenuListData(userType, \"0\", this._newToken, this._jtiProvided, (userDetails as ProfessionalUserData).LevelName))\r\n );\r\n }\r\n }),\r\n // map(menuListDataResponse => menuListDataResponse.Data), // returning the 1st element as the list comes already sorted.\r\n map((menuOptions: Array) => this.getLandingPageRoute(forClient, this._jtiProvided, menuOptions[0].optionPath))\r\n )\r\n .subscribe({\r\n next: (landingPage) => {\r\n this._authService.removeKeepMeLoggedIN();\r\n\r\n setTimeout(() => {\r\n const usingMobileDevice = this.deviceDetectorService.isMobile() || this.deviceDetectorService.isTablet();\r\n this._logService.appLogin(\"LoggedIn\", { jti: this._jtiProvided, user_id: userID }, usingMobileDevice, this._newToken, this._jtiProvided);\r\n this._router.navigateByUrl(`/${(landingPage as string[]).join('/')}`);\r\n }, this._pageLoadTimeout);\r\n },\r\n\r\n error: (errorResponse) => {\r\n this._authService.removeKeepMeLoggedIN();\r\n\r\n let loginPageArgs = '';\r\n if (errorResponse instanceof BusinessError) loginPageArgs = `?authStatus=${errorResponse.title}`;\r\n else if (errorResponse instanceof CategorizedError) {\r\n this._snackbarService.showErrorSnackBar(errorResponse.title, errorResponse.description, 'none');\r\n } else loginPageArgs = '?authStatus=UNKNOWN_ERROR';\r\n setTimeout(()=> this._router.navigateByUrl('/login' + loginPageArgs), this._pageLoadTimeout);\r\n }\r\n });\r\n\r\n this._subscriptions.push(credentialSubscription);\r\n }\r\n\r\n checkKeepMeLoggedIn() {\r\n if(this._cookieService.hasKey(this._authService.encodeBase64(\"EntireClientPortal\")) === true) {\r\n let cookieData = {} as CookieData;\r\n\r\n let obj: string = this._cookieService.get(this._authService.encodeBase64(\"EntireClientPortal\")) || '';\r\n let encData: string = this._encryptionService.decryptData(obj);\r\n\r\n cookieData = JSON.parse(encData);\r\n\r\n this._jtiProvided = cookieData.jti;\r\n this._tokenProvided = cookieData.token;\r\n this._refreshTokenProvided = cookieData.refreshToken;\r\n }\r\n }\r\n\r\n saveUserData(forClient: boolean, userDetails: UnspecifiedUserTypeData, userLicense: UserLicenseDetail, token: string, refreshToken: string, jti: string) {\r\n // userIsClient = this.authService.determineIfUserIsClient(userDetails);\r\n if (forClient) {\r\n userDetails = userDetails as Exclude;\r\n this._authService.saveAllUserDataOnSystemStorage(forClient, userDetails, userLicense, token, refreshToken, jti);\r\n } else {\r\n userDetails = userDetails as Exclude;\r\n this._authService.saveAllUserDataOnSystemStorage(forClient, userDetails, userLicense, token, refreshToken, jti);\r\n }\r\n }\r\n\r\n getLandingPageRoute(forClient: boolean, jti: string, page: string): Array {\r\n let landingPageRoute = ['userType', jti, page ];\r\n landingPageRoute[0] = (forClient) ? 'client': 'professional';\r\n return landingPageRoute;\r\n }\r\n\r\n\r\n ngOnDestroy(): void {\r\n this._subscriptions.forEach(subscription => subscription.unsubscribe());\r\n }\r\n}\r\n","
\r\n \r\n
\r\n
\r\n
\r\n \r\n \r\n \r\n \r\n
\r\n

{{ 'page.appInitialization.waitMessage' | translate }}

\r\n
\r\n","import { Component, OnInit } from '@angular/core';\r\n\r\n@Component({\r\n selector: 'app-terms-and-conditions-dialog',\r\n templateUrl: './terms-and-conditions-dialog.component.html',\r\n styleUrls: ['./terms-and-conditions-dialog.component.scss']\r\n})\r\nexport class TermsAndConditionsDialogComponent implements OnInit {\r\n readonly message: string = 'We use cookies to improve your user experience and journey with us. By clicking \"Accept\", you agree Entire OnHire can store cookies on your device with the user\\'s non-sensitive information for auto-login to retain your session.';\r\n\r\n constructor() { }\r\n\r\n ngOnInit(): void {\r\n }\r\n\r\n}\r\n","

Your Choice for Privacy Policy

\r\n
\r\n

{{ message }}

\r\n
\r\n
\r\n \r\n \r\n
\r\n","import { Directive, Input, HostListener } from '@angular/core';\r\nimport { NgControl } from '@angular/forms';\r\n\r\n@Directive({\r\n selector: 'input[type=text][noWhiteSpace]'\r\n})\r\nexport class NoWhiteSpaceDirective {\r\n @Input() noWhiteSpace: \"WIPE\" | \"TRIM\" = \"TRIM\";\r\n\r\n constructor(private formControl: NgControl) { }\r\n\r\n @HostListener('keyup', ['$event.target'])\r\n onChange(inputText: HTMLInputElement) {\r\n const value = inputText.value;\r\n let valueWithoutSpaces = '';\r\n \r\n if (this.noWhiteSpace === \"WIPE\") {\r\n valueWithoutSpaces = value.replace(/\\s/g, '');\r\n }\r\n else valueWithoutSpaces = value.trim();\r\n\r\n this.formControl.control?.setValue(valueWithoutSpaces);\r\n }\r\n}\r\n","\r\n \r\n {{ \"page.login.form.login.usernameField.label\" | translate }}\r\n \r\n {{ \"page.login.form.login.usernameField.requiredMessage\" | translate }}\r\n \r\n {{ \"page.login.form.login.usernameField.invalidLengthMessage\" | translate }}\r\n \r\n \r\n\r\n \r\n {{ \"page.login.form.login.passwordField.label\" | translate }}\r\n \r\n \r\n {{ \"page.login.form.login.passwordField.requiredMessage\" | translate }}\r\n \r\n\r\n
\r\n
\r\n \r\n \r\n \r\n
\r\n \r\n {{ \"page.login.form.login.forgotPasswordButton\" | translate }}\r\n \r\n
\r\n
\r\n \r\n {{ \"page.login.form.login.loginButton\" | translate }}\r\n \r\n
\r\n
\r\n \r\n {{ \"page.login.form.login.forgotPasswordButton\" | translate }}\r\n \r\n
\r\n\r\n","import { animate, style, transition, trigger } from '@angular/animations';\r\nimport { Component, EventEmitter, Input, OnInit, OnDestroy, Output } from '@angular/core';\r\nimport { FormGroup, FormControl, Validators, ValidatorFn, ValidationErrors, AbstractControl } from '@angular/forms';\r\nimport { Router } from '@angular/router';\r\nimport { concatMap, map, tap, Subscription, BehaviorSubject, catchError, mergeMap } from 'rxjs';\r\nimport { MatDialog, MatDialogConfig, MatDialogRef } from '@angular/material/dialog';\r\n\r\nimport { AuthService } from '@shared/services/auth/auth.service';\r\nimport { AppService, EncryptionService, SnackbarService, LoadingService } from '@shared/services/core';\r\n\r\nimport {\r\n LoginCredentialWithClientSecret,\r\n ClientUserData,\r\n UserLicenseDetail,\r\n ProfessionalUserData,\r\n CookieData,\r\n AuthFormNotificationType,\r\n AuthFormType,\r\n UnspecifiedUserTypeData\r\n} from '@shared/models/auth.interface';\r\nimport { BusinessError, CategorizedError } from '@modules/error/classes';\r\nimport { DashboardService } from '@shared/services/dashboard/dashboard.service';\r\nimport { LogService } from '@shared/services/core/log.service';\r\nimport { TermsAndConditionsDialogComponent } from '@core/components/terms-and-conditions-dialog/terms-and-conditions-dialog.component';\r\nimport { BusinessOperationErrorTypes } from '@shared/models/error.interface';\r\nimport { DeviceDetectorService } from 'ngx-device-detector';\r\nimport { Menu } from '@shared/models/sidenav.interface';\r\n\r\nconst demoAnimation = trigger('demoAnimation', [\r\n transition(':enter', [\r\n style({ transform: 'translateX({{ from }})' }),\r\n animate('200ms', style({ transform: 'translateX(0%)' }))\r\n ]),\r\n])\r\n\r\n@Component({\r\n selector: 'app-login-form',\r\n templateUrl: './login-form.component.html',\r\n styleUrls: ['./login-form.component.scss'],\r\n animations: [demoAnimation]\r\n})\r\nexport class LoginFormComponent implements OnInit, OnDestroy {\r\n @Output() notify = new EventEmitter();\r\n @Output() formChange = new EventEmitter();\r\n @Input() accessCode: string = '';\r\n @Input() lastFormTracker = new BehaviorSubject(\"ACCESSCODE\");\r\n\r\n authSubscription: Subscription | undefined;\r\n formValueChangesSubscription!: Subscription;\r\n hidePassword: boolean = true;\r\n toggleIcon: 'fa-eye' | 'fa-eye-slash' = 'fa-eye';\r\n\r\n public isPasswordVisible: boolean = false;\r\n loginForm: FormGroup = new FormGroup({\r\n userID: new FormControl('', [Validators.required, Validators.maxLength(10), clientIdFieldValidator()]),\r\n password: new FormControl('', Validators.required),\r\n rememberMe: new FormControl(false)\r\n })\r\n\r\n constructor(\r\n private authService: AuthService,\r\n private appService: AppService,\r\n private loadingService: LoadingService,\r\n private logService: LogService,\r\n private snackbarService: SnackbarService,\r\n private dashboardService: DashboardService,\r\n private matDialog: MatDialog,\r\n private router: Router,\r\n private encryptionService: EncryptionService,\r\n private deviceDetectorService: DeviceDetectorService\r\n ) { }\r\n\r\n ngOnInit(): void {\r\n this.formValueChangesSubscription = this.loginForm.valueChanges\r\n .subscribe(_ => this.notify.next(null));\r\n }\r\n\r\n login() {\r\n \r\n let newJTI: string = '';\r\n let newToken: string = '';\r\n let userID: string = '';\r\n let forClient = true;\r\n let userType: \"CLT\" | \"PRF\" | \"STF\" = \"CLT\";\r\n\r\n let refreshToken: string = '';\r\n let userLicenseDetails: UserLicenseDetail;\r\n let userDetails: UnspecifiedUserTypeData;\r\n\r\n this.notify.next(null);\r\n this.loadingService.showLoading();\r\n\r\n const requestBody: LoginCredentialWithClientSecret = {\r\n code: this.accessCode,\r\n userID: this.loginForm.get('userID')!.value,\r\n password: this.authService.encodeBase64(this.loginForm.get('password')?.value),\r\n clientId: this.appService.getAppSettings().apiCredentials.clientID,\r\n clientSecret: this.appService.getAppSettings().apiCredentials.clientSecret\r\n }\r\n\r\n this.authSubscription = this.authService.getTokenAndJTI(requestBody).pipe(\r\n tap(tokenAndJTIResponse => {\r\n newJTI = tokenAndJTIResponse.data.jti;\r\n newToken = tokenAndJTIResponse.data.token;\r\n this.authService.saveTokenAndJTIOnSystemStorage(tokenAndJTIResponse.data.jti, tokenAndJTIResponse.data.token);\r\n }),\r\n catchError(error => {\r\n console.log('Error Name:');\r\n console.log(error.name);\r\n console.log('Error Message:');\r\n console.log(error.message);\r\n console.log('Error Stack:');\r\n console.log(error.stack);\r\n if (error instanceof BusinessError)\r\n throw new BusinessError(error.title as BusinessOperationErrorTypes, error.description);\r\n else\r\n throw new BusinessError('LOGIN_ERROR', 'Something went wrong.');\r\n }),\r\n concatMap(tokenAndJTIResponse => this.authService.getUserIDAndRefreshToken(tokenAndJTIResponse.data)),\r\n tap(userIDAndRefreshTokenResponse => {\r\n userID = userIDAndRefreshTokenResponse.Data.UserId;\r\n refreshToken = userIDAndRefreshTokenResponse.Data.RefreshToken;\r\n }),\r\n concatMap(_ => this.authService.getLicenseDetails(newToken, newJTI)),\r\n tap(licenseDetailsResponse => {\r\n this.authService.checkLicenseExpiry(licenseDetailsResponse.Data);\r\n userLicenseDetails = licenseDetailsResponse.Data;\r\n }),\r\n concatMap(_ => this.authService.getUserTypeDetailsByID(userID, newJTI, newToken)),\r\n tap(userDetailsResponse => userDetails = userDetailsResponse.Data),\r\n concatMap(_ => this.authService.performProfessionalActivationCheck(userID, newToken, newJTI)),\r\n concatMap(userAllowedToLogin => {\r\n if (!userAllowedToLogin) throw new BusinessError('USER_NOT_LINKED_WITH_CLIENTS', 'Professional not linked with any active clients.');\r\n \r\n if (userDetails.hasOwnProperty('ClientID')) {\r\n userType = 'CLT';\r\n this.saveUserData(forClient, userDetails, userLicenseDetails, newToken, refreshToken, newJTI);\r\n return this.authService.updateLoginLogoutStatus(newToken, newJTI, userID, userType, \"Y\").pipe(\r\n mergeMap(_ => this.dashboardService.getMenuListData(userType, \"1\", newToken, newJTI))\r\n );\r\n }\r\n else {\r\n userType = 'PRF';\r\n forClient = false;\r\n this.saveUserData(forClient, userDetails, userLicenseDetails, newToken, refreshToken, newJTI);\r\n return this.authService.updateLoginLogoutStatus(newToken, newJTI, userID, userType, \"Y\").pipe(\r\n mergeMap(_ =>this.dashboardService.getMenuListData(userType, \"0\", newToken, newJTI, (userDetails as ProfessionalUserData).LevelName))\r\n );\r\n }\r\n }),\r\n map((menuOptions: Array) => this.getLandingPageRoute(userType, menuOptions[0].optionPath, newJTI))\r\n ).subscribe({\r\n next: (landingPageRoute) => {\r\n // COOKIES SETTINGS.\r\n const rememberMeIsChecked = this.loginForm.value.rememberMe;\r\n const usingMobileDevice = this.deviceDetectorService.isMobile() || this.deviceDetectorService.isTablet();\r\n if (rememberMeIsChecked) {\r\n let cookieData = {} as CookieData;\r\n cookieData.jti = newJTI;\r\n cookieData.token = newToken;\r\n cookieData.refreshToken = refreshToken;\r\n this.authService.setKeepMeLoggedIn(this.encryptionService.encryptData(JSON.stringify(cookieData)));\r\n }\r\n else {\r\n this.authService.removeKeepMeLoggedIN();\r\n }\r\n\r\n this.logService.appLogin(\"LoggedIn\", { jti: newJTI, user_id: userID }, usingMobileDevice, newToken, newJTI);\r\n this.router.navigateByUrl(landingPageRoute as string);\r\n },\r\n\r\n error: (error) => {\r\n console.log('Error Name:');\r\n console.log(error.name);\r\n console.log('Error Message:');\r\n console.log(error.message);\r\n console.log('Error Stack:');\r\n console.log(error.stack);\r\n if (error instanceof BusinessError) {\r\n this.notify.next(error.title as AuthFormNotificationType);\r\n }\r\n else if (error instanceof CategorizedError) {\r\n this.snackbarService.showErrorSnackBar(error.title, error.description, 'none');\r\n }\r\n else {\r\n this.notify.next('LOGIN_ERROR');\r\n }\r\n this.loadingService.stopLoading();\r\n }\r\n });\r\n }\r\n\r\n togglePasswordDisplay() {\r\n this.hidePassword = !this.hidePassword;\r\n this.togglePasswordFieldIcon();\r\n }\r\n\r\n togglePasswordFieldIcon() {\r\n this.toggleIcon = (this.toggleIcon === 'fa-eye-slash') ? 'fa-eye' : 'fa-eye-slash';\r\n }\r\n\r\n saveUserData(forClient: boolean, userDetails: UnspecifiedUserTypeData, userLicense: UserLicenseDetail, token: string, refreshToken: string, jti: string) {\r\n // userIsClient = this.authService.determineIfUserIsClient(userDetails);\r\n if (forClient) {\r\n userDetails = userDetails as Exclude;\r\n this.authService.saveAllUserDataOnSystemStorage(forClient, userDetails, userLicense, token, refreshToken, jti);\r\n } else {\r\n userDetails = userDetails as Exclude;\r\n this.authService.saveAllUserDataOnSystemStorage(forClient, userDetails, userLicense, token, refreshToken, jti);\r\n }\r\n }\r\n\r\n getLandingPageRoute(userType: \"CLT\" | \"PRF\" | \"STF\", pageSection: string, jti: string): string {\r\n let userTypeSection = '';\r\n\r\n switch(userType) {\r\n case \"CLT\":\r\n userTypeSection = 'client';\r\n break;\r\n\r\n case \"PRF\":\r\n userTypeSection = 'professional';\r\n break;\r\n\r\n case \"STF\":\r\n userTypeSection = 'staff';\r\n break;\r\n\r\n default:\r\n userTypeSection = 'unknown';\r\n break;\r\n }\r\n\r\n const route = `/${userTypeSection}/${jti}/${pageSection}`;\r\n return route;\r\n }\r\n\r\n showPasswordRecoveryForm() {\r\n this.formChange.next(\"RECOVERY\");\r\n }\r\n\r\n openTermsAndConditionsDialog(switchedOn: boolean) {\r\n let dialogRef: MatDialogRef;\r\n if (switchedOn) {\r\n const dialogConfigs: MatDialogConfig = {\r\n id: 'privacy-policy-dialog',\r\n position: {\r\n bottom: '5vh'\r\n }\r\n };\r\n\r\n dialogRef = this.matDialog.open(TermsAndConditionsDialogComponent, dialogConfigs);\r\n dialogRef.afterClosed().subscribe(accepted => {\r\n if (!accepted) {\r\n this.loginForm.controls['rememberMe'].setValue(false);\r\n }\r\n })\r\n }\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.authSubscription?.unsubscribe();\r\n this.formValueChangesSubscription.unsubscribe();\r\n }\r\n}\r\n\r\nfunction clientIdFieldValidator(): ValidatorFn {\r\n return (control: AbstractControl): ValidationErrors | null => {\r\n const clientId = control.value;\r\n\r\n if (clientId.length > 0 && clientId.length < 10) return { invalidLength: true }\r\n else return null;\r\n }\r\n}","
\r\n {{ \"page.login.form.passwordRecovery.info\" | translate }}\r\n
\r\n
\r\n \r\n {{ \"page.login.form.passwordRecovery.emailField.label\" | translate }}\r\n \r\n \r\n {{ \"page.login.form.passwordRecovery.emailField.invalidMail\" | translate }}\r\n \r\n \r\n {{ \"page.login.form.passwordRecovery.requiredMutuallyExclusiveFieldMessage\" | translate }}\r\n \r\n \r\n\r\n
OR
\r\n\r\n \r\n {{ \"page.login.form.passwordRecovery.usernameField.label\" | translate }}\r\n \r\n \r\n {{ \"page.login.form.passwordRecovery.requiredMutuallyExclusiveFieldMessage\" | translate }}\r\n \r\n \r\n {{ \"page.login.form.passwordRecovery.usernameField.invalidLengthMessage\" | translate }}\r\n \r\n \r\n\r\n
\r\n \r\n {{ \"page.login.form.passwordRecovery.recoverButton\" | translate }}\r\n \r\n
\r\n
\r\n","import { animate, state, style, transition, trigger } from '@angular/animations';\r\nimport { Component, EventEmitter, Input, OnDestroy, OnInit, Output } from '@angular/core';\r\nimport { FormGroup, FormControl, Validators, ValidatorFn, ValidationErrors, AbstractControl } from '@angular/forms';\r\nimport { AuthFormNotificationType, AuthFormType } from '@shared/models/auth.interface';\r\n\r\nimport { AuthService } from '@shared/services/auth/auth.service';\r\nimport { LoadingService } from '@shared/services/core/loading.service';\r\nimport { Subscription } from 'rxjs';\r\n\r\nconst demoAnimation = trigger('demoAnimation', [\r\n transition(':enter', [\r\n style({ transform: 'translateX(40%)' }),\r\n animate('200ms', style({ transform: 'translateX(0%)' }))\r\n ]),\r\n])\r\n\r\n@Component({\r\n selector: 'app-password-recovery-form',\r\n templateUrl: './password-recovery-form.component.html',\r\n styleUrls: ['./password-recovery-form.component.scss'],\r\n animations: [demoAnimation]\r\n})\r\nexport class PasswordRecoveryFormComponent implements OnInit, OnDestroy {\r\n @Input() accessCode: string = '';\r\n @Output() notify = new EventEmitter();\r\n @Output() formChange = new EventEmitter();\r\n\r\n passwordRecoverySubscription: Subscription | undefined;\r\n formValueChangesSubscription!: Subscription;\r\n fieldUsedForRecovery: \"EMAILID\" | \"USERNAME\" | undefined;\r\n formResetted: boolean = false;\r\n\r\n // using a separate flag for validation because the condition for form validity is a bit different (i.e. mutually exclusive fields).\r\n formIsValid: boolean = false;\r\n passwordRecoveryForm: FormGroup = new FormGroup({\r\n EmailId: new FormControl('', [Validators.email]),\r\n ClientId: new FormControl('', [clientIdFieldValidator()])\r\n })\r\n\r\n\r\n constructor(private authService: AuthService, private loadingService: LoadingService) { }\r\n\r\n ngOnInit(): void {\r\n this.formValueChangesSubscription = this.passwordRecoveryForm.valueChanges\r\n .subscribe(_ => {\r\n let eitherFieldsAreFilled = (!!this.passwordRecoveryForm.get('EmailId')?.value) || (!!this.passwordRecoveryForm.get('ClientId')?.value);\r\n let emailValid = !!this.passwordRecoveryForm.get('EmailId')?.valid \r\n let emailProvided = !!(this.passwordRecoveryForm.get('EmailId')?.value);\r\n let usernameProvided = !!(this.passwordRecoveryForm.get('ClientId')?.value);\r\n let usernameValid = !!(this.passwordRecoveryForm.get('ClientId')?.valid);\r\n this.formIsValid = eitherFieldsAreFilled && ((emailProvided && emailValid) || (usernameProvided && usernameValid));\r\n\r\n if (this.formResetted) this.formResetted = false;\r\n else this.notify.next(null);\r\n });\r\n }\r\n\r\n recoverPassword() {\r\n if(!this.passwordRecoveryForm.get(\"EmailId\")?.value && !this.passwordRecoveryForm.get(\"ClientId\")?.value){ \r\n this.passwordRecoveryForm.get(\"EmailId\")?.setErrors({ required: true });\r\n this.passwordRecoveryForm.get(\"ClientId\")?.setErrors({ required: true });\r\n return;\r\n } else if (this.passwordRecoveryForm.get(\"EmailId\")?.value) {\r\n this.fieldUsedForRecovery = \"EMAILID\";\r\n } else {\r\n this.fieldUsedForRecovery = \"USERNAME\";\r\n }\r\n\r\n this.notify.next(null);\r\n const form = this.passwordRecoveryForm.value;\r\n this.loadingService.showLoading();\r\n\r\n this.passwordRecoverySubscription = this.authService.recoverPassword({ ...form, AccessCode: this.accessCode }).subscribe(response => {\r\n if (response?.Data) {\r\n this.notify.next(\"PASS_RECOVERY_SUCCESS\");\r\n this.formResetted = true;\r\n this.passwordRecoveryForm.reset();\r\n } else {\r\n if(this.fieldUsedForRecovery === \"EMAILID\") this.notify.next('PASS_RECOVERY_ERROR_WITH_EMAIL')\r\n else if(this.fieldUsedForRecovery === \"USERNAME\") this.notify.next('PASS_RECOVERY_ERROR_WITH_USERNAME')\r\n else this.notify.next(\"UNKNOWN_ERROR\");\r\n }\r\n this.loadingService.stopLoading();\r\n });\r\n }\r\n\r\n disableAlternativeField(currentField: string, alternativeField: string) {\r\n this.passwordRecoveryForm.controls[currentField].enable();\r\n this.passwordRecoveryForm.controls[alternativeField].reset();\r\n this.passwordRecoveryForm.controls[alternativeField].disable();\r\n }\r\n\r\n enableAllFields() {\r\n this.passwordRecoveryForm.enable();\r\n\r\n const emailField = this.passwordRecoveryForm.controls['EmailId'];\r\n const clientIdField = this.passwordRecoveryForm.controls['ClientId'];\r\n\r\n if (emailField.touched && !emailField.value)\r\n this.passwordRecoveryForm.get(\"EmailId\")?.setErrors({ required: true });\r\n if (clientIdField.touched && !clientIdField.value)\r\n this.passwordRecoveryForm.get(\"ClientId\")?.setErrors({ required: true });\r\n\r\n this.passwordRecoveryForm.touched\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.formValueChangesSubscription.unsubscribe();\r\n this.passwordRecoverySubscription?.unsubscribe();\r\n }\r\n}\r\n\r\nfunction clientIdFieldValidator(): ValidatorFn {\r\n return (control: AbstractControl): ValidationErrors | null => {\r\n const clientId = control.value;\r\n\r\n if (clientId && clientId.length > 0 && clientId.length < 10) return { invalidLength: true }\r\n else return null;\r\n }\r\n}","\r\n \r\n \r\n
\r\n

{{ carouselText['heading'] | translate }}

\r\n

{{ carouselText['description'] | translate }}

\r\n
\r\n
\r\n
\r\n
","import { Component, OnInit } from '@angular/core';\r\nimport { OwlOptions } from 'ngx-owl-carousel-o/public_api';\r\n\r\n@Component({\r\n selector: 'app-showcase-carousel',\r\n templateUrl: './showcase-carousel.component.html',\r\n styleUrls: ['./showcase-carousel.component.scss']\r\n})\r\nexport class ShowcaseCarouselComponent implements OnInit {\r\n carouselImages: Array = [\r\n '/assets/images/ClientPortalVector.png',\r\n '/assets/images/DashboardVector.png',\r\n '/assets/images/BookingsVector.png',\r\n '/assets/images/PrefrencesVector.png',\r\n '/assets/images/LoginVector2.png',\r\n ]\r\n\r\n constructor() { }\r\n\r\n ngOnInit(): void {\r\n }\r\n \r\n customOptions: OwlOptions = {\r\n loop: true,\r\n autoplay: true,\r\n dots: true,\r\n responsive: {\r\n 0: {\r\n items: 1\r\n },\r\n 400: {\r\n items: 1\r\n },\r\n 740: {\r\n items: 1\r\n },\r\n 940: {\r\n items: 1\r\n }\r\n },\r\n nav: true\r\n }\r\n}\r\n","import { Directive, Input, HostListener } from '@angular/core';\r\nimport { NgControl } from '@angular/forms';\r\n\r\n@Directive({\r\n selector: 'input[appFieldLength]'\r\n})\r\nexport class FieldLengthDirective {\r\n @Input() appFieldLength: string = '50';\r\n\r\n constructor(private formControl: NgControl) { }\r\n\r\n @HostListener('keyup', ['$event.target'])\r\n onChange(inputText: HTMLInputElement) {\r\n const fieldValue = inputText.value;\r\n if (fieldValue.length > parseInt(this.appFieldLength))\r\n this.formControl.control?.setValue(fieldValue.substring(0, 3));\r\n }\r\n}\r\n","\r\n \r\n {{ 'page.login.form.accessCode.accessCodeField.label' | translate }}\r\n \r\n \r\n {{ 'page.login.form.accessCode.accessCodeField.requiredMessage' | translate }}\r\n \r\n \r\n {{ 'page.login.form.accessCode.accessCodeField.maxLengthMessage' | translate }}\r\n \r\n \r\n\r\n
\r\n \r\n {{ 'page.login.form.accessCode.proceedButton' | translate }}\r\n \r\n
\r\n\r\n","import { animate, state, style, transition, trigger } from '@angular/animations';\r\nimport { Component, EventEmitter, Input, OnInit, Output } from '@angular/core';\r\nimport { AbstractControl, FormControl, FormGroup, ValidationErrors, ValidatorFn, Validators } from '@angular/forms';\r\nimport { BusinessError } from '@modules/error/classes';\r\nimport { AccessCodeAndClientSecret, AuthFormNotificationType, AuthFormType } from '@shared/models/auth.interface';\r\nimport { BusinessOperationErrorTypes } from '@shared/models/error.interface';\r\n\r\nimport { AuthService } from '@shared/services/auth/auth.service';\r\nimport { AppService, LoadingService } from '@shared/services/core';\r\nimport { BehaviorSubject } from 'rxjs';\r\n\r\nconst demoAnimation = trigger('demoAnimation', [\r\n transition(':enter', [\r\n style({ transform: 'translateX({{ from }})' }),\r\n animate('{{ time }}', style({ transform: 'translateX(0%)' }))\r\n ]),\r\n])\r\n\r\n@Component({\r\n selector: 'app-access-code-form',\r\n templateUrl: './access-code-form.component.html',\r\n styleUrls: ['./access-code-form.component.scss'],\r\n animations: [demoAnimation]\r\n})\r\nexport class AccessCodeFormComponent implements OnInit {\r\n @Input() lastFormTracker = new BehaviorSubject(\"ACCESSCODE\");\r\n @Output() notify = new EventEmitter();\r\n @Output() result = new EventEmitter<{ code: string, logo: string} | undefined>();\r\n\r\n accessCodeForm: FormGroup = new FormGroup({\r\n code: new FormControl('', [Validators.required, Validators.maxLength(3), accessCodeValidator()]),\r\n });\r\n\r\n constructor(\r\n private authService: AuthService,\r\n private appService: AppService,\r\n private loadingService: LoadingService,\r\n ) { }\r\n\r\n ngOnInit(): void {\r\n this.authService.checkKeepMeLoggedIn();\r\n }\r\n\r\n proceedForLogin() {\r\n const requestBody: AccessCodeAndClientSecret = {\r\n code: this.accessCodeForm.get('code')!.value,\r\n clientId: this.appService.getAppSettings().apiCredentials.clientID,\r\n clientSecret: this.appService.getAppSettings().apiCredentials.clientSecret\r\n }\r\n\r\n console.log('Request body generated for access code.');\r\n\r\n this.loadingService.showLoading();\r\n this.authService.checkAccessToken(requestBody).pipe()\r\n .subscribe({\r\n next: (response) => {\r\n if (response && response.data) this.result.next({ code: requestBody.code, logo: `data:image/jpg;base64, ${response.data.clientLogo}` });\r\n this.loadingService.stopLoading();\r\n },\r\n error: (err: Error) => {\r\n console.log('Error Name:');\r\n console.log(err.name);\r\n console.log('Error Message:');\r\n console.log(err.message);\r\n console.log('Error Stack:');\r\n console.log(err.stack);\r\n if (err instanceof BusinessError && (err.title as BusinessOperationErrorTypes) === \"PORTAL_UNAVAILABLE\") {\r\n this.notify.next(\"ACCESS_DENIED\");\r\n } else if (err instanceof BusinessError && (err.title as BusinessOperationErrorTypes) === \"INVALID_ACCESSCODE\") {\r\n this.notify.next(\"ACCESSCODE_ERROR\");\r\n } else \r\n this.notify.next(\"ACCESS_DENIED\");\r\n this.loadingService.stopLoading();\r\n },\r\n });\r\n }\r\n}\r\n\r\nfunction accessCodeValidator(): ValidatorFn {\r\n return (control: AbstractControl): ValidationErrors | null => {\r\n const accessCode = control.value;\r\n\r\n if (accessCode.length > 0 && accessCode.length < 3) return { invalidLength: true }\r\n else return null;\r\n }\r\n}","import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core';\r\nimport { AuthFormNotificationType } from '@shared/models/auth.interface';\r\n\r\n@Component({\r\n selector: 'app-form-notification',\r\n templateUrl: './form-notification.component.html',\r\n styleUrls: ['./form-notification.component.scss']\r\n})\r\nexport class FormNotificationComponent implements OnInit {\r\n @Output() close = new EventEmitter();\r\n @Input() type: AuthFormNotificationType = 'ACCESSCODE_ERROR';\r\n\r\n readonly notificationMessage = new Map([\r\n [\"LOGOUT\", 'page.login.form.accessCode.logoutSuccessfulMessage'],\r\n [\"LOGOUT_FORCEFULLY\", 'page.login.form.accessCode.logoutForcefullyMessage'],\r\n [\"UNKNOWN_ERROR\", 'Unknown Error Occurred.'],\r\n [\"ACCESS_DENIED\", 'page.login.form.accessCode.accessDeniedMessage'],\r\n [\"ACCESSCODE_ERROR\", 'page.login.form.accessCode.invalidAccessCodeMessage'],\r\n [\"LOGIN_ERROR\", 'page.login.form.login.invalidLoginMessage'],\r\n [\"USER_INACTIVE\", 'page.login.form.login.userInactiveMessage'],\r\n [\"USER_LOGIN_INACTIVE\", 'page.login.form.login.userInactiveMessage'],\r\n [\"USER_NOT_LINKED_WITH_CLIENTS\", 'page.login.form.login.noClientsLinkedMessage'],\r\n [\"LICENSE_ERROR\", 'page.login.form.login.invalidLicenseMessage'],\r\n [\"PORTAL_UNAVAILABLE\", 'page.login.form.login.noPagesAvailableMessage'],\r\n [\"PASS_RECOVERY_SUCCESS\", 'page.login.form.passwordRecovery.recoverySuccessMessage'],\r\n [\"PASS_RECOVERY_ERROR_WITH_EMAIL\", 'page.login.form.passwordRecovery.recoveryFailureUsingEmailIDMessage'],\r\n [\"PASS_RECOVERY_ERROR_WITH_USERNAME\", 'page.login.form.passwordRecovery.recoveryFailureUsingUsernameMessage'],\r\n [\"ADMIN_TYPE_LOCATION_DOES_NOT_HAVE_CHILDS\", 'page.login.form.login.adminWithNoChildMessage'],\r\n ]);\r\n\r\n constructor() { }\r\n\r\n ngOnInit(): void {\r\n }\r\n\r\n applyClass() {\r\n return (this.type === \"PASS_RECOVERY_SUCCESS\" || this.type === \"LOGOUT\") ? 'SuccessMessage' : 'InvalidMessage';\r\n }\r\n\r\n closeNotification() {\r\n this.close.next(true);\r\n }\r\n}\r\n","
\r\n
\r\n
\r\n \r\n {{ notificationMessage.get(type)! | translate }}\r\n
\r\n
\r\n
\r\n
\r\n","
\r\n \r\n
\r\n
\r\n \r\n
\r\n
\r\n

Lorem Ipsum is simply dummy texts of the printing

\r\n

Orem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type Changed.

\r\n Learn More\r\n \r\n
\r\n \r\n
\r\n
{{ 'page.login.heading' | translate }}
\r\n\r\n \r\n
\r\n
\r\n \r\n
\r\n
{{ 'page.login.heading' | translate }}
\r\n

Access Code: {{ accessCode.toUpperCase() }}

\r\n\r\n \r\n\r\n
\r\n \r\n \r\n \r\n\r\n \r\n \r\n\r\n \r\n \r\n\r\n

Sorry, Something went wrong there!

\r\n
\r\n
\r\n
\r\n \r\n
\r\n
\r\n
\r\n
{{\"page.login.version\"|translate}}
\r\n
\r\n
\r\n
\r\n
\r\n","import { NgModule } from '@angular/core';\r\nimport { RouterModule, Route } from '@angular/router';\r\nimport { AuthGuard } from '@core/guards/auth.guard';\r\nimport { AppInitializationWithUriPage } from '@pages/auth/app-initialization-with-uri.page';\r\n\r\nimport { AppInitializationPage } from '@pages/auth/app-initialization.page';\r\nimport { LoginPage } from '@pages/auth/login.page';\r\n\r\nconst routes: Route[] = [\r\n {\r\n path: '',\r\n pathMatch: 'full',\r\n redirectTo: 'login'\r\n },\r\n {\r\n path: 'login',\r\n title: 'Entire OnHire - Client Portal',\r\n component: LoginPage\r\n },\r\n {\r\n path: 'app-initialization',\r\n title: 'Entire OnHire - Client Portal',\r\n component: AppInitializationPage\r\n },\r\n {\r\n path: 'uri',\r\n title: 'Entire OnHire - Client Portal',\r\n component: AppInitializationWithUriPage\r\n },\r\n {\r\n path: 'client',\r\n canLoad: [AuthGuard],\r\n loadChildren: () => import('@core/core.module').then(module => module.CoreModule)\r\n },\r\n {\r\n path: 'professional',\r\n canLoad: [AuthGuard],\r\n loadChildren: () => import('@core/core.module').then(module => module.CoreModule)\r\n },\r\n {\r\n path: 'error',\r\n loadChildren: () => import('@modules/error/error.module').then(module => module.ErrorModule)\r\n },\r\n {\r\n path: '**',\r\n redirectTo: 'error/404'\r\n }\r\n]\r\n\r\n@NgModule({\r\n imports: [RouterModule.forRoot(routes, { enableTracing: false })],\r\n exports: [RouterModule]\r\n})\r\nexport class AppRoutingModule { }","import { Component, OnInit, Output, EventEmitter } from '@angular/core';\r\nimport {\r\n AccessCodeAndClientSecret,\r\n AuthFormNotificationType,\r\n AuthFormType,\r\n} from '@shared/models/auth.interface';\r\nimport { AppService, LoadingService } from '@shared/services/core';\r\nimport { AuthService } from '@shared/services/auth/auth.service';\r\nimport { BehaviorSubject} from 'rxjs';\r\nimport { ActivatedRoute } from '@angular/router';\r\nimport { SnackbarService } from '@shared/services/core/snackbar.service';\r\n\r\n@Component({\r\n selector: 'app-other-login',\r\n templateUrl: './login.page.html',\r\n styleUrls: ['./login.page.scss'],\r\n})\r\nexport class LoginPage implements OnInit {\r\n @Output() notify = new EventEmitter();\r\n @Output() result = new EventEmitter<\r\n { code: string; logo: string } | undefined\r\n >();\r\n notClosed: boolean = false;\r\n notificationShown: boolean = false;\r\n notificationType: AuthFormNotificationType = 'ACCESSCODE_ERROR';\r\n currentForm: AuthFormType = 'ACCESSCODE';\r\n lastForm$ = new BehaviorSubject('ACCESSCODE');\r\n readonly defaultLogo: string = '/assets/images/entireonhire-logo.svg';\r\n userLogo: string = this.defaultLogo;\r\n accessCode: string = '';\r\n companyCode: string | undefined;\r\n\r\n private _qurParam: string = '';\r\n\r\n constructor(\r\n private loadingService: LoadingService,\r\n private appService: AppService,\r\n private authService: AuthService,\r\n private _activeRoute: ActivatedRoute,\r\n private snackbarService: SnackbarService\r\n ) {\r\n this.loadingService.showLoading();\r\n }\r\n\r\n ngOnInit(): void {\r\n this._qurParam = this._activeRoute.snapshot.queryParams['se'];\r\n this.companyCode = this._activeRoute.snapshot.queryParams['ac'];\r\n this.loadingService.stopLoading();\r\n this.clearBackButtonHistory();\r\n\r\n let authStatusType = this._activeRoute.snapshot.queryParams['authStatus'];\r\n if (authStatusType) {\r\n this.showNotificationFor(authStatusType);\r\n }\r\n\r\n if (this._qurParam) {\r\n this.snackbarService.showErrorSnackBar(\r\n 'Session Expired',\r\n 'We apologize for the inconvenience, but your session has ended. Please log in again.',\r\n ''\r\n );\r\n }\r\n if (this.companyCode) {\r\n this.proceedForLogin();\r\n }\r\n }\r\n\r\n closeMessageBox() {\r\n this.notClosed = false;\r\n }\r\n\r\n toggleToForm(form: AuthFormType) {\r\n this.notificationShown = false;\r\n this.lastForm$.next(this.currentForm); // for animation.\r\n this.currentForm = form;\r\n }\r\n\r\n toggleToPreviousForm() {\r\n this.notificationShown = false;\r\n this.lastForm$.next(this.currentForm); // for animation.\r\n\r\n if (this.currentForm === 'LOGIN') {\r\n this.accessCode = '';\r\n this.userLogo = this.defaultLogo;\r\n this.currentForm = 'ACCESSCODE';\r\n } else {\r\n this.currentForm = 'LOGIN';\r\n }\r\n }\r\n\r\n updateData(data?: { code: string; logo: string }) {\r\n this.userLogo = data?.logo ?? this.defaultLogo;\r\n this.accessCode = data?.code || '';\r\n if (this.notificationShown) this.notificationShown = false;\r\n this.lastForm$.next('ACCESSCODE');\r\n this.currentForm = 'LOGIN';\r\n }\r\n\r\n showNotificationFor(notificationType: AuthFormNotificationType | null) {\r\n if (notificationType === null) this.notificationShown = false;\r\n else {\r\n this.notificationType = notificationType;\r\n this.notificationShown = true;\r\n }\r\n }\r\n\r\n clearBackButtonHistory() {\r\n history.pushState(null, document.title, location.href);\r\n window.addEventListener('popstate', function () {\r\n history.pushState(null, document.title, location.href);\r\n });\r\n }\r\n\r\n proceedForLogin() {\r\n const requestBody: AccessCodeAndClientSecret = {\r\n code: this.companyCode!,\r\n clientId: this.appService.getAppSettings().apiCredentials.clientID,\r\n clientSecret:\r\n this.appService.getAppSettings().apiCredentials.clientSecret,\r\n };\r\n this.loadingService.showLoading();\r\n this.authService\r\n .checkAccessToken(requestBody)\r\n .pipe()\r\n .subscribe({\r\n next: (response) => {\r\n if (response && response.data) {\r\n this.accessCode=this.companyCode||\"\";\r\n this.userLogo=`data:image/jpg;base64, ${response.data.clientLogo}`\r\n this.toggleToForm('LOGIN')\r\n // this.result.next({\r\n // code: requestBody.code,\r\n // logo: `data:image/jpg;base64, ${response.data.clientLogo}`,\r\n // });\r\n }\r\n this.loadingService.stopLoading();\r\n },\r\n error: (err: Error) => {\r\n if (err.message === 'Unauthorized') {\r\n this.showNotificationFor('ACCESS_DENIED');\r\n } else this.showNotificationFor('ACCESSCODE_ERROR');\r\n this.loadingService.stopLoading();\r\n },\r\n });\r\n }\r\n}\r\n","
\r\n \r\n
\r\n
\r\n
\r\n
\r\n
\r\n \r\n
\r\n
\r\n","import { Component, OnInit } from '@angular/core';\r\nimport { TranslateService } from '@ngx-translate/core';\r\n\r\nimport { AppService } from '@shared/services/core/app.service';\r\nimport { LoadingService } from '@shared/services/core/loading.service';\r\n\r\n@Component({\r\n selector: 'app-root',\r\n templateUrl: './app.component.html',\r\n styleUrls: ['./app.component.scss']\r\n})\r\nexport class AppComponent {\r\n lang = 'en';\r\n loading = false;\r\n\r\n showLoader = false;\r\n\r\n constructor(\r\n private translateService: TranslateService,\r\n private appService: AppService,\r\n public loadingService: LoadingService\r\n ) {\r\n this.lang = this.appService.getAppSettings().language;\r\n // const supportedLanguages = this.appService.getAppSettings().supportedLanguages;\r\n // this.translateService.addLangs(supportedLanguages);\r\n\r\n const browserLanguage = this.translateService.getBrowserLang() || this.lang;\r\n this.translateService.setDefaultLang(browserLanguage);\r\n\r\n this.translateService.use(this.lang);\r\n }\r\n\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { Observable, Subject } from 'rxjs';\r\n\r\nexport interface ISpinnerState {\r\n show: boolean\r\n}\r\n\r\n@Injectable()\r\nexport class SpinnerService {\r\n private _spinnerSubject = new Subject();\r\n\r\n spinnerState = >this._spinnerSubject;\r\n\r\n show() {\r\n this._spinnerSubject.next({ show: true });\r\n }\r\n\r\n hide() {\r\n this._spinnerSubject.next({ show: false });\r\n }\r\n}","import { Injectable } from '@angular/core';\r\nimport {\r\n HttpRequest,\r\n HttpHandler,\r\n HttpEvent,\r\n HttpInterceptor,\r\n} from '@angular/common/http';\r\nimport { Observable, switchMap, throwError } from 'rxjs';\r\nimport { DeviceDetectorService } from 'ngx-device-detector';\r\n\r\nimport { AuthService } from '@shared/services/auth/auth.service';\r\nimport { SessionService } from '@shared/services/auth/session.service';\r\nimport { LocalStorageService } from '@shared/services/core/local-storage.service';\r\nimport { UserInfoService } from '@shared/services/auth/user-info.service';\r\nimport { AppService } from '@shared/services/core/app.service';\r\nimport { LogService } from '@shared/services/core/log.service';\r\n\r\n@Injectable()\r\nexport class AuthInterceptor implements HttpInterceptor {\r\n totalRetries: number = 0;\r\n static isRefreshing: boolean = false;\r\n\r\n constructor(\r\n private authService: AuthService,\r\n private sessionService: SessionService,\r\n private localStorageService: LocalStorageService,\r\n private logService: LogService,\r\n private userInfoService: UserInfoService,\r\n private appService: AppService,\r\n private deviceDetectorService: DeviceDetectorService\r\n ) { }\r\n\r\n intercept(request: HttpRequest, nextHandler: HttpHandler): Observable> {\r\n const authAPI = this.appService.getAppConfigs()[\"AUTH\"].Versions.V1[\"CLIENTPORTALTOKEN\"][\"ClientLogin\"].PATH;\r\n const refreshTokenAPI = this.appService.getAppConfigs()[\"AUTH\"].Versions.V1[\"CLIENTPORTALREFRESHTOKEN\"][\"RefreshToken\"].PATH;\r\n\r\n if (request.url.indexOf(authAPI) > -1 || request.url.indexOf(refreshTokenAPI) > -1) {\r\n return nextHandler.handle(request);\r\n }\r\n // look for exisitng session from route.\r\n const jti = this.sessionService.getJTIFromCurrentRoute();\r\n const tokenPresent = this.sessionService.getToken(jti);\r\n const onMobileDevices = this.deviceDetectorService.isMobile() || this.deviceDetectorService.isTablet();\r\n const mobileDeviceSpecificHeader = 'X-Er-Type';\r\n if(!tokenPresent) return nextHandler.handle(request);\r\n\r\n if (tokenPresent) {\r\n const isNewTokenRequired = false; //this.sessionService.isNewTokenRequired(tokenPresent);\r\n let originalReq: HttpRequest;\r\n if (!isNewTokenRequired) {\r\n if (this.appService.getAppSettings().bypassSecurity) {\r\n originalReq = request.clone({ headers: request.headers.set('Authorization', `Bearer ${tokenPresent}`).set(mobileDeviceSpecificHeader, jti)});\r\n }\r\n else {\r\n if (onMobileDevices)\r\n originalReq = request.clone({ headers: request.headers.set('Authorization', `Bearer ${tokenPresent}`).set(mobileDeviceSpecificHeader, jti)});\r\n else \r\n originalReq = request.clone({ headers: request.headers.set('Authorization', `Bearer ${tokenPresent}`)});\r\n }\r\n\r\n const userType: string = this.localStorageService.getLoggedInUserType();\r\n const userID: string = (userType === \"CLIENT\") ? this.localStorageService.getClientInfo('ClientID') : this.localStorageService.getProfessionalInfo(\"ProfessionalID\");\r\n\r\n const request_data = JSON.stringify(originalReq);\r\n this.logService.info('Using Exisitng Token', { jti, user_id: userID, request_data, request_endpoint: request.url }, onMobileDevices, tokenPresent, jti);\r\n return nextHandler.handle(originalReq);\r\n } else {\r\n if (AuthInterceptor.isRefreshing) {\r\n if (this.appService.getAppSettings().bypassSecurity) {\r\n originalReq = request.clone({ headers: request.headers.set('Authorization', `Bearer ${tokenPresent}`).set(mobileDeviceSpecificHeader, jti)});\r\n }\r\n else {\r\n if (onMobileDevices)\r\n originalReq = request.clone({ headers: request.headers.set('Authorization', `Bearer ${tokenPresent}`).set(mobileDeviceSpecificHeader, jti)});\r\n else \r\n originalReq = request.clone({ headers: request.headers.set('Authorization', `Bearer ${tokenPresent}`)});\r\n }\r\n\r\n const request_data = JSON.stringify(originalReq);\r\n this.logService.info('Refreshing Token', { jti, request_data, request_endpoint: request.url }, onMobileDevices, tokenPresent, jti);\r\n return nextHandler.handle(originalReq);\r\n }\r\n else {\r\n AuthInterceptor.isRefreshing = true;\r\n let currentRefreshToken = this.localStorageService.getRefreshToken() || '';\r\n if (!currentRefreshToken) {\r\n this.localStorageService.initializeData(jti);\r\n currentRefreshToken = this.localStorageService.storageData?.refreshToken || '';\r\n }\r\n\r\n return this.authService.getRefreshedToken(tokenPresent, currentRefreshToken).pipe(\r\n switchMap(refreshTokenResponse => {\r\n if (refreshTokenResponse?.httpStatusCode === 200) {\r\n let refreshToken = refreshTokenResponse.data.refreshToken;\r\n let tokenProvided = refreshTokenResponse.data.token;\r\n tokenProvided = refreshTokenResponse.data.token;\r\n\r\n this.sessionService.updateTokenAndRefreshTokenOnStorage(tokenProvided, refreshToken);\r\n \r\n AuthInterceptor.isRefreshing = false;\r\n\r\n if (this.appService.getAppSettings().bypassSecurity) {\r\n originalReq = request.clone({ headers: request.headers.set('Authorization', `Bearer ${tokenPresent}`).set(mobileDeviceSpecificHeader, jti)});\r\n }\r\n else {\r\n if (onMobileDevices)\r\n originalReq = request.clone({ headers: request.headers.set('Authorization', `Bearer ${tokenPresent}`).set(mobileDeviceSpecificHeader, jti)});\r\n else \r\n originalReq = request.clone({ headers: request.headers.set('Authorization', `Bearer ${tokenPresent}`)});\r\n }\r\n\r\n const request_data = JSON.stringify(originalReq);\r\n this.logService.info(\"Using New Token\", { jti, request_data, request_endpoint: originalReq.url }, onMobileDevices, tokenPresent, jti);\r\n return nextHandler.handle(originalReq);\r\n }\r\n else {\r\n this.userInfoService.logoutUser();\r\n return throwError(() => 'Invalid call');\r\n }\r\n })\r\n );\r\n }\r\n }\r\n }\r\n\r\n this.userInfoService.logoutUser();\r\n return throwError(() => 'Invalid call');\r\n }\r\n}","import { HTTP_INTERCEPTORS } from \"@angular/common/http\";\r\n\r\nimport { AuthInterceptor } from \"./auth.interceptor\";\r\nimport { ErrorInterceptor } from \"./error.interceptor\";\r\n\r\nexport const AllInterceptorProviders = [\r\n { provide: HTTP_INTERCEPTORS, useClass: AuthInterceptor, multi: true },\r\n { provide: HTTP_INTERCEPTORS, useClass: ErrorInterceptor, multi: true },\r\n];\r\n\r\n","import { Injectable } from '@angular/core';\r\nimport {\r\n HttpRequest,\r\n HttpResponse,\r\n HttpHandler,\r\n HttpEvent,\r\n HttpInterceptor,\r\n HttpErrorResponse\r\n} from '@angular/common/http';\r\nimport { map, catchError, Observable, throwError } from 'rxjs';\r\nimport { CookieService, CookieOptions } from 'ngx-cookie';\r\nimport { Router } from '@angular/router';\r\n\r\nimport { LogService } from '@shared/services/core/log.service';\r\n\r\nimport { AuthAPIResponse } from '@shared/models/auth.interface';\r\nimport { SessionService } from '@shared/services/auth/session.service';\r\nimport { ExtendedLogDetails } from '@shared/models/log.interface';\r\nimport { UserInfoService } from '@shared/services/auth/user-info.service';\r\nimport { BusinessError } from '@modules/error/classes';\r\nimport { DeviceDetectorService } from 'ngx-device-detector';\r\nimport { SKIP_LOGGING_ON_FAILURE } from '@core/tokens/meta-data.token';\r\n\r\n@Injectable()\r\nexport class ErrorInterceptor implements HttpInterceptor {\r\n private cookieOptions = {} as CookieOptions\r\n constructor(\r\n private logService: LogService,\r\n private sessionService: SessionService,\r\n private userInfoService: UserInfoService,\r\n private cookieService: CookieService,\r\n private router: Router,\r\n private deviceDetectorService: DeviceDetectorService\r\n ) {}\r\n\r\n intercept(request: HttpRequest, next: HttpHandler): Observable> {\r\n return next.handle(request).pipe(\r\n catchError((error, source) => { \r\n console.log('(Error Interceptor) Error Name:');\r\n console.log(error.name);\r\n console.log('(Error Interceptor) Error Message:');\r\n console.log(error.message);\r\n console.log('(Error Interceptor) Error Stack:');\r\n console.log(error.stack);\r\n if(error.status === 401) {\r\n this.userInfoService.logoutUser();\r\n this.removeKeepMeLoggedIN();\r\n this.router.navigateByUrl('/login?se=1');\r\n //return throwError(() => new Error((error as HttpErrorResponse).statusText));\r\n }\r\n this.registerLog(request, error);\r\n return throwError(() => new Error((error as HttpErrorResponse).statusText))\r\n }),\r\n map(response => this.checkForAuthErrorResponse(request, response))\r\n );\r\n }\r\n\r\n checkForAuthErrorResponse(request: HttpRequest, event: HttpEvent) {\r\n const responseBody = (event as HttpResponse>).body;\r\n console.log('(Error Interceptor) response body:');\r\n console.log(responseBody);\r\n console.log(event);\r\n if (event instanceof HttpResponse && responseBody!.httpStatusCode === 401) {\r\n this.registerLog(request, event);\r\n throw Error('Unauthorized');\r\n }\r\n\r\n if (event instanceof HttpResponse && responseBody!.httpStatusCode === 400) {\r\n const skipLogging = request.context.get(SKIP_LOGGING_ON_FAILURE);\r\n if (!skipLogging) this.registerLog(request, event);\r\n\r\n if (responseBody?.message.slice(0, 4) === '-100') throw new BusinessError(\"LOGIN_ERROR\", 'Incorrect User Credentials.');\r\n else if (responseBody?.message.slice(0, 4) === '-200') throw new BusinessError('USER_INACTIVE', 'User is deactivated.');\r\n else if (responseBody?.message.slice(0, 4) === '-300') throw new BusinessError(\"LOGIN_ERROR\", 'Incorrect User Credentials.');\r\n else if (responseBody?.message.slice(0, 4) === '-400') throw new BusinessError(\"INVALID_ACCESSCODE\", 'Invalid Access Code.');\r\n else if (responseBody?.message.slice(0, 4) === '-604') throw new BusinessError(\"ADMIN_TYPE_LOCATION_DOES_NOT_HAVE_CHILDS\", 'Invalid Client Type.');\r\n else throw Error('Unauthorized');\r\n }\r\n\r\n return event;\r\n }\r\n\r\n registerLog(request : HttpRequest, response: HttpEvent) {\r\n const jti = this.sessionService.getJTIFromCurrentRoute();\r\n const token = this.sessionService.getToken(jti);\r\n\r\n const user_id = this.userInfoService.isUserTypeClient() ? this.userInfoService.getClientInfo()?.ClientID : this.userInfoService.getProfessionalInfo()?.ProfessionalID;\r\n const extendedLogDetails: ExtendedLogDetails = { jti, user_id, request_endpoint: request.url, response_data: JSON.stringify(response) };\r\n\r\n const onMobileDevices = this.deviceDetectorService.isMobile() || this.deviceDetectorService.isTablet();\r\n this.logService.error('(API Calling Failed)', extendedLogDetails, onMobileDevices, token || undefined, jti);\r\n }\r\n\r\n removeKeepMeLoggedIN() {\r\n let jti: string = this.router.url.split('/')[2];\r\n if(this.cookieService.hasKey(this.encodeBase64(jti)) === true) {\r\n let date: Date = new Date();\r\n\r\n this.cookieOptions.expires = date;\r\n this.cookieOptions.domain = window.location.hostname;\r\n this.cookieOptions.secure = true;\r\n this.cookieOptions.sameSite = 'lax'; \r\n this.cookieOptions.storeUnencoded = true;\r\n\r\n this.cookieService.remove(this.encodeBase64(jti), this.cookieOptions);\r\n }\r\n if(this.cookieService.hasKey(this.encodeBase64(jti + \":temp\")) === true) {\r\n let date: Date = new Date();\r\n\r\n this.cookieOptions.expires = date;\r\n this.cookieOptions.domain = window.location.hostname;\r\n this.cookieOptions.secure = true;\r\n this.cookieOptions.sameSite = 'lax';\r\n this.cookieOptions.storeUnencoded = true;\r\n\r\n this.cookieService.remove(this.encodeBase64(jti + \":temp\"), this.cookieOptions);\r\n }\r\n }\r\n\r\n private encodeBase64 = (data: any) => {\r\n return Buffer.from(data).toString('base64');\r\n }\r\n private decodeBase64 = (data: any) => {\r\n return Buffer.from(data, 'base64').toString('ascii');\r\n }\r\n}\r\n","import { ErrorHandler, Injectable } from '@angular/core';\r\nimport { SnackbarService } from '@shared/services/core/snackbar.service';\r\n\r\n@Injectable()\r\nexport class ErrorService implements ErrorHandler {\r\n\r\n constructor(private snackBService: SnackbarService) { }\r\n\r\n handleError(error: unknown): void {\r\n if (error instanceof Error) {\r\n //debugger;\r\n //console.error(`[App Error Handler] `, error.name, error.message);\r\n console.error(error);\r\n // HERE: Call the log service and create a log entry.\r\n // this.snackBService.showErrorSnackBar(error.name, error.message, 'none' );\r\n }\r\n }\r\n}\r\n","import { APP_INITIALIZER, ErrorHandler, inject, NgModule } from '@angular/core';\r\nimport { LayoutModule } from '@angular/cdk/layout';\r\nimport { HttpClientModule, HttpClient } from '@angular/common/http';\r\nimport { BrowserModule } from '@angular/platform-browser';\r\nimport { BrowserAnimationsModule } from '@angular/platform-browser/animations';\r\nimport { TranslateModule, TranslateLoader } from '@ngx-translate/core';\r\nimport { TranslateHttpLoader } from '@ngx-translate/http-loader';\r\n\r\nimport { environment } from 'src/environments/environment';\r\n\r\n/* MODULES */\r\nimport { AuthModule } from '@modules/auth/auth.module';\r\nimport { AppRoutingModule } from './app-routing.module';\r\nimport { MatSnackBarModule } from '@angular/material/snack-bar';\r\n\r\n/* COMPONENTS */\r\nimport { AppComponent } from './app.component';\r\nimport { AppService } from '@shared/services/core/app.service';\r\nimport { SnackbarService } from '@shared/services/core/snackbar.service';\r\nimport { SpinnerService } from '@core/components/spinner/spinner.service';\r\n\r\n/* INTERCEPTORS */\r\nimport { AllInterceptorProviders } from '@core/interceptors';\r\n\r\nimport { CookieModule } from 'ngx-cookie';\r\nimport { DatePipe } from '@angular/common';\r\nimport { IndicatorsModule } from '@progress/kendo-angular-indicators';\r\nimport { ErrorService } from '@shared/services/core/error.service';\r\nimport { AppInitializationWithUriPage } from './pages/auth/app-initialization-with-uri.page';\r\nimport { ChartsModule } from '@progress/kendo-angular-charts';\r\nimport { ButtonsModule } from '@progress/kendo-angular-buttons';\r\nimport { SchedulerModule } from '@progress/kendo-angular-scheduler';\r\nimport { ListViewModule } from \"@progress/kendo-angular-listview\";\r\nimport 'hammerjs';\r\nimport { SharedModule } from './modules/shared/shared.module';\r\nimport { PagerModule } from '@progress/kendo-angular-pager';\r\nimport { BackButtonDisableModule } from 'angular-disable-browser-back-button';\r\n\r\n\r\n\r\n\r\nexport function HttpLoaderFactory(http: HttpClient) {\r\n return new TranslateHttpLoader(http);\r\n}\r\n\r\n@NgModule({\r\n declarations: [\r\n AppComponent,\r\n AppInitializationWithUriPage\r\n ],\r\n imports: [\r\n AppRoutingModule,\r\n AuthModule,\r\n BrowserModule,\r\n BrowserAnimationsModule,\r\n HttpClientModule,\r\n SharedModule,\r\n ListViewModule,\r\n TranslateModule.forRoot({\r\n loader: {\r\n provide: TranslateLoader,\r\n useFactory: HttpLoaderFactory,\r\n deps: [HttpClient]\r\n }\r\n }),\r\n CookieModule.withOptions(),\r\n MatSnackBarModule,\r\n IndicatorsModule,\r\n ChartsModule,\r\n ButtonsModule,\r\n LayoutModule,\r\n SchedulerModule,\r\n PagerModule,\r\n BackButtonDisableModule.forRoot()\r\n ],\r\n providers: [\r\n AllInterceptorProviders, {\r\n provide: APP_INITIALIZER,\r\n useFactory: () => {\r\n const appService = inject(AppService);\r\n return () => new Promise((resolve) => {\r\n let configs!: unknown;\r\n let appSettings!: unknown;\r\n // loading file based on environment.· · · · · \r\n configs = require(`../assets/configs/config.${environment.name}.json`);\r\n appSettings = require(`../assets/configs/appSettings.config.${environment.name}.json`);\r\n appService.setAppConfigs(JSON.stringify(configs));\r\n appService.setAppSettings(JSON.stringify(appSettings));\r\n resolve(true);\r\n });\r\n }, multi: true\r\n }, {\r\n provide: ErrorHandler,\r\n useClass: ErrorService\r\n },\r\n DatePipe,\r\n SnackbarService,\r\n SpinnerService\r\n ],\r\n bootstrap: [AppComponent]\r\n})\r\n\r\nexport class AppModule { }","import { enableProdMode } from '@angular/core';\r\nimport { platformBrowserDynamic } from '@angular/platform-browser-dynamic';\r\n\r\nimport { AppModule } from './app/app.module';\r\nimport { environment } from './environments/environment';\r\n\r\nif (environment.production) {\r\n enableProdMode();\r\n}\r\n\r\nplatformBrowserDynamic().bootstrapModule(AppModule)\r\n .catch(err => console.error(err));\r\n","var map = {\n\t\"./appSettings.config.dev.json\": 7283,\n\t\"./appSettings.config.loc.json\": 5350,\n\t\"./appSettings.config.prod.json\": 3632,\n\t\"./appSettings.config.qa.json\": 233,\n\t\"./appSettings.config.stg.json\": 7718\n};\n\n\nfunction webpackContext(req) {\n\tvar id = webpackContextResolve(req);\n\treturn __webpack_require__(id);\n}\nfunction webpackContextResolve(req) {\n\tif(!__webpack_require__.o(map, req)) {\n\t\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\t\te.code = 'MODULE_NOT_FOUND';\n\t\tthrow e;\n\t}\n\treturn map[req];\n}\nwebpackContext.keys = function webpackContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackContext.resolve = webpackContextResolve;\nmodule.exports = webpackContext;\nwebpackContext.id = 593;","var map = {\n\t\"./config.dev.json\": 5674,\n\t\"./config.loc.json\": 9623,\n\t\"./config.prod.json\": 9638,\n\t\"./config.qa.json\": 7427,\n\t\"./config.stg.json\": 3982\n};\n\n\nfunction webpackContext(req) {\n\tvar id = webpackContextResolve(req);\n\treturn __webpack_require__(id);\n}\nfunction webpackContextResolve(req) {\n\tif(!__webpack_require__.o(map, req)) {\n\t\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\t\te.code = 'MODULE_NOT_FOUND';\n\t\tthrow e;\n\t}\n\treturn map[req];\n}\nwebpackContext.keys = function webpackContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackContext.resolve = webpackContextResolve;\nmodule.exports = webpackContext;\nwebpackContext.id = 778;"],"x_google_ignoreList":[]}