{"version":3,"file":"main.7fe5bb2efd9e0f83.js","mappings":"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ACPC,KAAM,CAAC9Z,MAEX,CAAEmW,QAAS4D,MAAc1D,SAAUpQ,GACnC+T,KACA,CAAE7D,QAAS8D,KAAgCT,SAAUjB,IACrD,CAAEpC,QAAS+D,KAAiBV,SAAUd,IACtC,CAAEvC,QAASgE,KAA+BX,SAAUZ,IACpD,CAAEzC,QAASiE,KAAqCZ,SAAUV,KAC7DxC,SA1BG+D,KACAC,KACAtxB,KACAuxB,KACArxB,KACAH,IACAmtB,GACAsE,oBAqBKtB,CAAS,KAGhB,SAAUU,GAAepqB,GAC3B,MAAO,IACIA,EAAmBiQ,YAElC,CAEM,SAAU4Z,KACZ,OAAOrlB,SAASymB,qBAAqB,QAAQ,GAAGnM,IACpD,CAEA,SAASgL,KAOL,OAAOhb,OAAOoc,SAASC,MAC3B,CChGA,MAAMC,GAAY,CAChB,CAAEzE,QAAS,WAAYiD,WALnB,SAAUC,KACd,OAAOrlB,SAASymB,qBAAqB,QAAQ,GAAGnM,IAClD,EAGiDwL,KAAM,MAGnD5iB,EACF2jB,SAGFC,KAAuBF,IAAWG,gBAAgB7B,IAC/C8B,MAAMC,GAAOnV,QAAQoV,IAAID,qBCnB5B,OACA,aACA,gBACA,aACA,gBACA,mBACA,gBACA,mBACA,gBACA,mBACA,gBACA,mBACA,gBACA,mBACA,gBACA,mBACA,gBACA,aACA,gBACA,YACA,eACA,aACA,gBACA,aACA,gBACA,aACA,gBACA,mBACA,gBACA,aACA,gBACA,aACA,gBACA,aACA,gBACA,aACA,gBACA,aACA,gBACA,aACA,gBACA,aACA,gBACA,aACA,gBACA,aACA,gBACA,mBACA,gBACA,mBACA,gBACA,aACA,gBACA,YACA,eACA,gBACA,mBACA,gBACA,mBACA,gBACA,mBACA,gBACA,mBACA,gBACA,mBACA,gBACA,mBACA,gBACA,mBACA,gBACA,mBACA,aACA,gBACA,aACA,gBACA,mBACA,gBACA,mBACA,gBACA,mBACA,gBACA,aACA,gBACA,aACA,gBACA,aACA,gBACA,aACA,gBACA,cACA,iBACA,aACA,gBACA,aACA,gBACA,mBACA,gBACA,mBACA,gBACA,aACA,gBACA,YACA,eACA,aACA,gBACA,aACA,gBACA,mBACA,sBACA,mBACA,sBACA,aACA,gBACA,aACA,gBACA,aACA,gBACA,aACA,gBACA,aACA,gBACA,gBACA,mBACA,aACA,gBACA,aACA,gBACA,aACA,gBACA,mBACA,gBACA,aACA,gBACA,aACA,gBACA,aACA,gBACA,YACA,eACA,aACA,gBACA,aACA,gBACA,aACA,gBACA,aACA,gBACA,aACA,gBACA,aACA,gBACA,aACA,gBACA,aACA,gBACA,aACA,gBACA,aACA,gBACA,aACA,gBACA,aACA,gBACA,aACA,gBACA,aACA,gBACA,aACA,gBACA,aACA,gBACA,mBACA,gBACA,aACA,gBACA,aACA,gBACA,aACA,gBACA,aACA,gBACA,aACA,gBACA,mBACA,gBACA,aACA,gBACA,iBACA,oBACA,gBACA,mBACA,YACA,eACA,aACA,gBACA,mBACA,gBACA,aACA,gBACA,aACA,gBACA,aACA,gBACA,aACA,gBACA,aACA,gBACA,aACA,gBACA,aACA,gBACA,aACA,gBACA,aACA,kBACA,qBACA,gBACA,aACA,gBACA,aACA,gBACA,aACA,gBACA,aACA,gBACA,aACA,gBACA,cACA,iBACA,aACA,gBACA,aACA,gBACA,aACA,gBACA,eACA,kBACA,aACA,gBACA,aACA,gBACA,aACA,gBACA,cACA,mBACA,sBACA,iBACA,gBACA,mBACA,aACA,gBACA,aACA,gBACA,aACA,kBACA,qBACA,gBACA,aACA,gBACA,kBACA,qBACA,aACA,gBACA,gBACA,mBACA,gBACA,mBACA,gBACA,mBACA,gBACA,oBAIA,cACA,WACA,WACA,CACA,cACA,cACA,8CACA,gCACArlB,EAEA,WACA,CACAulB,kBACA,qBACA,EACAA,YACAC,YACAD","names":["GetStylingService","constructor","_concurrentRequestHandlingService","this","getStyling","options","callApi","url","body","sendCredentials","_angular_core__WEBPACK_IMPORTED_MODULE_2__","factory","PowerBIReportTypeEnum","StingrayCommonModule","CommonModule","ReactiveFormsModule","RouterModule","MatButtonModule","MatDialogModule","MatFormFieldModule","MatInputModule","MatSelectModule","MatSnackBarModule","MatSortModule","MatTableModule","MatPaginatorModule","MatTooltipModule","MatIconModule","MatRadioModule","MatPseudoCheckboxModule","MatRippleModule","i0","CopyrightComponent","Date","getFullYear","selectors","trigger","state","style","opacity","transition","animate","CountdownComponent","EventEmitter","countdownTo","targetTime","seconds","getRemainingSeconds","Math","floor","max","getTime","displayValue","observableTimer","pipe","take","map","x","tap","fireCompletedIfDone","getDisplayValue","remainingSeconds","completed","emit","padNumber","n","s","toString","length","ConcurrentRequestHandlingEnum","ApiRootService","_appBaseHref","getApiRoot","core","APP_BASE_HREF","ApiCallUrlService","_apiRootService","_currentCaseService","_currentEnvironmentService","getUrl","path","includeEnvironmentAndCase","addUrlSegment","getCurrentEnvironmentName","getCurrentCaseName","substr","encodeURI","replace","newSegment","appendSlash","AuthenticationTokenService","_userSessionService","_refreshSessionService","_httpErrorService","getAuthenticationToken","session","getUserSession","isValid","requiresRefresh","refreshSession","authenticationToken","token","refreshToken","handleHttpError","result","setUserSession","observableOf","hasValidAuthenticationToken","issuedAt","expiresAt","moment","diff","validTimespan","_angular_core__WEBPACK_IMPORTED_MODULE_6__","GetClientsService","getClients","CachedCaseListService","getClientsService","userSessionService","currentEnvironmentService","ReplaySubject","merge","userSessionChanged","environmentChanged","subscribe","userSession","restrictedToCase","_subject","next","clientCode","code","clientName","name","cachedCaseListChanged","CaseEnvChangeRedirectService","getCaseEnvChangeRedirectUrl","caseEnvChangeRedirectUrl","newCaseName","newEnvironmentName","split","filter","ApiCallService","httpClient","_apiCallUrlService","_authenticationTokenService","_redirectToLoginService","_isLoadingService","validate","getOptionsWithDefaultValues","httpHeaders","FormData","authTokenObservable","subject","Subject","useLoadingIndicator","setLoading","finalize","clearLoading","error","Authorization","post","redirectToLogin","complete","headers","HttpHeaders","Object","assign","Error","ConcurrentRequestHandlingService","_apiCallService","proxyName","apiCallOptions","apiProxyOptions","getDefaultApiProxyOptions","getAdjustedApiCallOptions","concurrentRequestHandling","existingRequest","_observables","subjects","subscription","unsubscribe","createSubscription","asObservable","clearObservablesList","handleApiCallCompleted","data","CopyToClipboardService","copyToClipboard","text","el","document","createElement","value","setAttribute","position","left","appendChild","select","execCommand","removeChild","CurrentAdminPortalConfigService","_getStylingService","BehaviorSubject","undefined","caseChanged","onCasechanged","currentCaseName","_currentCaseName","refresh","_configChangedSubject","configChanged","_angular_core__WEBPACK_IMPORTED_MODULE_4__","CurrentCaseService","_router","_currentRouteService","_replaceRouteParameterService","_caseEnvChangeRedirectService","events","e","NavigationEnd","onNavigation","getCurrentRoute","params","setCurrentCase","navigate","getUpdatedUrl","_caseChangedSubject","getValue","currentRoute","currentEnvironmentName","caseEnvChangeRedirect","replaceRouteParameter","route","paramName","paramValue","leaveOutEmptyParameter","splice","CurrentEnvironmentService","environmentChangedSubject","_environmentChangedSubject","environment","setCurrentEnvironment","CurrentRouteService","_routeModelService","getRouteModel","routerState","snapshot","root","_angular_core__WEBPACK_IMPORTED_MODULE_1__","EnvironmentListService","environments","allowedEnvironments","sort","a","b","localeCompare","isDefault","environmentListChanged","getEnvironmentList","ErrorDialogComponent","_dialogRef","_snackbarService","_copyToClipboardService","errorDetails","getFullErrorString","close","copyErrorDetails","open","message","errorMessage","ipAddress","referrer","username","logReferenceId","format","stackTrace","MAT_DIALOG_DATA","ctx","ErrorService","_dialog","registerError","GetDynamicMenusService","getDynamicMenus","GetCurrentUserDynamicMenusService","_getDynamicMenusService","_permissionService","updateMenus","permissionsChanged","verifyPermission","_pending","_dashboardsSubject","dashboards","_powerBIReportsSubject","powerBIReports","powerBIReportType","_powerBIPaginatedReportsSubject","_administrationMenusSubject","administrationMenus","getCurrentUserDashboards","getCurrentUserPowerBIReports","getCurrentUserPowerBIPaginatedReports","getAdministrationMenus","HomeUrlService","updateUrl","newUrl","urlChanged","getHomeUrl","HttpErrorService","_errorService","status","hasOwnProperty","IsLoadingService","observable","_counter","setTimeout","PermissionService","_permissions","permissions","permission","_permissionsChangedSubject","permissionName","RedirectToLoginService","redirectedFromRoute","_redirectedFromUrl","routeModel","fromUrl","urlWithPopulatedParameters","indexOf","slice","k","urlWithParameterPlaceholders","push","_queryParams","queryParams","caseName","getRedirectedFromUrl","getQueryParams","clearRedirectedFromUrl","RefreshSessionService","_httpClient","args","getHeaders","ReplaceRouteParameterService","i","startsWith","substring","RouteModelService","activatedRouteSnapshot","parent","routeConfig","firstChild","SnackbarService","_matSnackBar","action","duration","CrossTabCommunicationService","window","addEventListener","onStorage","attachEvent","register","handler","_handlers","key","sendMessage","msg","json","JSON","stringify","localStorage","setItem","removeItem","event","handlers","TabRegistrationService","initialize","_initialized","unregister","getInstanceCount","serializedCount","getItem","parseInt","UserSessionService","_crossTabCommunicationService","_tabRegistrationService","wireupCrossTabCommunications","loadSavedUserSession","_userSession","Promise","resolve","_initializationPromiseResolver","_initializationTimeout","_userSessionSubject","sessionStorage","jsonParse","newValue","internalSetUserSession","signOut","broadcast","clearTimeout","parse","ParticipantPhoneCallIsVerifiedDialogComponent","currentPhoneCallService","isVerified","isParticipantVerified","participantName","currentPhoneCallChanged","phoneCall","dateOfBirth","ssnLastFour","address","UpdatePhoneCallService","updatePhoneCall","GetPhoneCallParticipantInfoService","getPhoneCallParticipantInfo","GetParticipantIdFromRouteService","getParticipantIdFromRoute","participantIdString","participantId","MostRecentParticipantIdService","_getParticipantIdFromRouteService","router","_mostRecentParticipantId","currentParticipantId","_participantIdChangedSubject","getMostRecentParticipantId","participantIdChanged","CurrentPhoneCallService","_updatePhoneCallService","_getPhoneCallParticipantInfoService","_mostRecentParticipantIdService","isCurrentlyInPhoneCall","_subscriptions","createSubscriptions","phoneCallParticipantInfo","emitParticipantInfo","callHistoryId","_phoneCallParticipantInfoSubject","setCurrentPhoneCall","piiMatches","verifiedParticipantId","updateParticipantInfoAndShowVerificationDialog","setAndEmitParticipantInfo","employeeId","createParticipantIdChangedSubscription","createUserSessionChangedSubscription","createEnvironmentChangedSubscription","handleParticipantIdChanged","handleUserSessionChanged","endPhoneCall","skip","handleEnvironmentChanged","removeSessionStorageData","getSessionStorageData","updateSessionStorageData","sessionStorageData","serializedSessionStorageData","_sessionStorageKey","update","APPLICATION_INSIGHTS_CONNECTION_STRING","AppInsightsService","_appInsights","ApplicationInsights","config","connectionString","extensionConfig","AppInsightsCfgSyncPlugin","cfgUrl","loadAppInsights","addTelemetryInitializer","envelope","UserId_CF","userInfo","id","Email_CF","emailAddress","console","trackException","exception","ErrorHandlerService","_appInsightsService","handleError","MomentUtcDateAdapter","MomentDateAdapter","dateLocale","super","createDate","year","month","date","locale","parseFormat","today","deserialize","MAT_DATE_LOCALE","NavigationModule","FormsModule","MatMenuModule","NotFoundComponent","_location","copyrightYear","navigateBack","back","STORAGE_KEY","NavSidebarExpandedService","toggleExpanded","toggled","NoCaseSelectedOverlayComponent","LogoutService","logout","NavUserMenuComponent","_logoutService","ngOnInit","userDisplayName","displayName","accountSettingsUrl","NavHeaderComponent","_environmentListService","updateEnvironment","environmentName","toLowerCase","nonDefaultEnvironmentSelected","ADMINISTRATION_TITLE","NavSidebarMenuService","_getCurrentUserDynamicMenuService","getMenus","getMenuModel","menus","getPopulatedMenuData","menu","icon","title","menuItems","item","join","groupedMenus","groupedMenu","header","zip","dashboardsAndPowerBI","routeParams","getRawMenuData","requiredParams","every","p","hasParam","requiredPermissions","some","groupedItem","populateDynamicMenu","addDynamicAdminMenuItemsToStaticMenu","menuItem","populateUrlParams","addDynamicMenuItemsToStaticMenu","menuTitle","o","paginatedReportMenuItems","concat","adminMenuItems","friendlyName","baseUrlSegment","routeParam","param","ctx_r36","ctx_r39","NavSidebarComponent","navSidebarMenuService","_homeUrlService","_navSidebarExpandedService","Map","expanded","isNavSidebarExpanded","_resizeObserver","ResizeObserver","entries","target","scrollHeight","clientHeight","classList","contains","add","remove","homeUrl","isExpandedInitially","isOverflowScroll","ngAfterViewInit","observeResize","_parentElement","nativeElement","_activeLinkItem","forEach","scrollToItem","onCollapseButtonClick","_overflowTimer","_scrollTimer","_menuItemSubscription","model","activeMenu","getActiveMenu","changes","totalMenus","found","index","isActive","_activeURL","_openedMenus","_menuHeight","set","container","pathname","decodeURIComponent","URL","href","itemDistanceFromTop","getBoundingClientRect","top","containerHeight","scroll","behavior","expand","indexOfMenu","height","_menuItem","toArray","delete","isMenuOpen","includes","getHeight","get","setMouseOver","mouseOver","mouseOverString","_collapsedMenuActiveLink","_collapsedMenu","setMouseLeave","changeScrollbar","element","unobserve","observe","ngOnDestroy","clearInterval","disconnect","NavClientPickerComponent","_cachedCaseListService","_formBuilder","form","group","valueChanges","clients","NavNewTabComponent","currentUrl","decodeURI","NavEnvPickerComponent","selectedEnvironment","selectEnvironment","NavEnvMessageComponent","updateEnvironmentMessage","environmentMessage","description","NavPhoneCallBannerComponent","NavLayoutComponent","_currentAdminPortalConfigService","navSidebarExpandedService","navSidebarToggleSubscription","showPhoneCallBanner","customRouteData","requiresCaseSelection","adminPortalConfigChangedSubscription","headingColor","clientPickerCtrStyle","RouteGuardService","canActivate","canActivateChild","getRoutesWithEnvironmentAndClient","loadChildren","ROUTES","pathMatch","redirectTo","then","LoginModule","component","children","__webpack_require__","ParticipantModule","PortalConfigModule","TitaniaNavigationModule","ReportingModule","PowerBIModule","UsersModule","ExpressionRulesModule","PermissionsModule","AdminPortalConfigModule","EnvironmentsModule","PublishingModule","DashboardModule","DataRefreshModule","CensusConfigModule","CasePlanGroupsModule","ApplicationQuestionsModule","CasePlanAttachmentsModule","EligibilityWindowsModule","EnrollmentBuilderModule","GlobalCreditConfigurationModule","DashboardConfigurationModule","RolloverModule","InstructionCaseConfigModule","InstructionFileSetupModule","RemittanceFileDefinitionGroupModule","RemittanceCaseFileDefinitionGroupModule","FilesModule","DeductionCodesModule","ParticipantTransactionsModule","DependentVerificationModule","DependentVerificationRulesModule","CensusReportsModule","IssueTrackerModule","AutoCommitCancelTransactionModule","DataIntegrityModule","TierStructureGlobalModule","TierStructureCaseLevelModule","PaymentFileConfigurationModule","CaseSSOServiceProvidersModule","CaseSSOModule","VideoConfigModule","WexSSOModule","StingrayRouteReuseStrategy","shouldDetach","store","handle","shouldAttach","retrieve","shouldReuseRoute","future","curr","nonReuseProperties","allowRouteReuse","StingrayRoutingModule","provide","RouteReuseStrategy","useClass","imports","SessionExpirationDialogComponent","_args","countdownComponent","expirationDate","_userSessionChangedSubscription","expire","UserSessionTimeoutService","_sessionExpirationTimeout","setSessionTimeout","timeoutDuration","SHOW_MODAL_THRESHHOLD","disableClose","afterClosed","LoadingOverlayComponent","isLoading","AppComponent","userSessionTimeoutService","appInsightsService","isLoadingService","matDialog","NavigationStart","closeAll","RouteConfigLoadStart","RouteConfigLoadEnd","NavigationCancel","onDrag","DOCUMENT","dataTransfer","dropEffect","effectAllowed","preventDefault","stopPropagation","MAT_FORM_FIELD_OPTIONS","appearance","floatLabel","MAT_TAB_GROUP_OPTIONS","animationDuration","MAT_PAGINATOR_OPTIONS","formFieldAppearance","MAT_EXPANSION_PANEL_OPTIONS","hideToggle","collapsedHeight","expandedHeight","AppModule","bootstrap","useFactory","getBaseUrl","getBaseHref","MAT_DATE_FORMATS","useValue","MAT_MOMENT_DATE_FORMATS","DateAdapter","APP_INITIALIZER","appInitializer","multi","deps","ErrorHandler","CurrencyPipe","MAT_FORM_FIELD_DEFAULT_OPTIONS","MAT_TABS_CONFIG","MAT_PAGINATOR_DEFAULT_OPTIONS","MAT_EXPANSION_PANEL_DEFAULT_OPTIONS","BrowserModule","BrowserAnimationsModule","HttpClientModule","DragulaModule","getElementsByTagName","location","origin","providers","enableProdMode","__NgCli_bootstrap_1","bootstrapModule","catch","err","log","webpackContext","module"],"sourceRoot":"webpack:///","sources":["./src/app/modules/api/get-styling.service.generated.ts","./src/app/modules/api/power-bi-report-type-enum.generated.ts","./src/app/modules/common/common.module.ts","./src/app/modules/common/components/copyright/copyright.component.html","./src/app/modules/common/components/copyright/copyright.component.ts","./src/app/modules/common/components/countdown/countdown.component.ts","./src/app/modules/common/components/countdown/countdown.component.html","./src/app/modules/common/enums/concurrent-request-handling-enum.ts","./src/app/modules/common/services/api-root.service.ts","./src/app/modules/common/services/api-call-url.service.ts","./src/app/modules/common/services/authentication-token.service.ts","./src/app/modules/api/get-clients.service.generated.ts","./src/app/modules/common/services/cached-case-list.service.ts","./src/app/modules/common/services/case-env-change-redirect.service.ts","./src/app/modules/common/services/api-call.service.ts","./src/app/modules/common/services/concurrent-request-handling.service.ts","./src/app/modules/common/services/copy-to-clipboard.service.ts","./src/app/modules/common/services/current-admin-portal-config.service.ts","./src/app/modules/common/services/current-case.service.ts","./src/app/modules/common/services/current-environment.service.ts","./src/app/modules/common/services/current-route.service.ts","./src/app/modules/common/services/environment-list.service.ts","./src/app/modules/common/components/error-dialog/error-dialog.component.ts","./src/app/modules/common/components/error-dialog/error-dialog.component.html","./src/app/modules/common/services/error.service.ts","./src/app/modules/api/get-dynamic-menus.service.generated.ts","./src/app/modules/common/services/get-current-user-dynamic-menus.service.ts","./src/app/modules/common/services/home-url.service.ts","./src/app/modules/common/services/http-error.service.ts","./src/app/modules/common/services/is-loading.service.ts","./src/app/modules/common/services/permission.service.ts","./src/app/modules/common/services/redirect-to-login.service.ts","./src/app/modules/common/services/refresh-session.service.ts","./src/app/modules/common/services/replace-route-parameter.service.ts","./src/app/modules/common/services/route-model.service.ts","./src/app/modules/common/services/snackbar.service.ts","./src/app/modules/common/services/cross-tab-communication.service.ts","./src/app/modules/common/services/tab-registration.service.ts","./src/app/modules/common/services/user-session.service.ts","./src/app/modules/participant-shared/components/participant-phone-call-is-verified-dialog/participant-phone-call-is-verified-dialog.component.html","./src/app/modules/participant-shared/components/participant-phone-call-is-verified-dialog/participant-phone-call-is-verified-dialog.component.ts","./src/app/modules/api/update-phone-call.service.generated.ts","./src/app/modules/api/get-phone-call-participant-info.service.generated.ts","./src/app/modules/participant-shared/services/get-participant-id-from-route.service.ts","./src/app/modules/participant-shared/services/most-recent-participant-id.service.ts","./src/app/modules/participant-shared/services/current-phone-call.service.ts","./src/environments/environment.live.ts","./src/app/modules/common/services/app-insights.service.ts","./src/app/modules/common/services/error-handler.service.ts","./src/app/modules/common/services/moment-utc-date-adapter.ts","./src/app/modules/navigation/navigation.module.ts","./src/app/modules/common/components/not-found/not-found.component.ts","./src/app/modules/common/components/not-found/not-found.component.html","./src/app/modules/navigation/services/nav-sidebar-expanded.service.ts","./src/app/modules/common/components/no-case-selected-overlay/no-case-selected-overlay.component.ts","./src/app/modules/common/components/no-case-selected-overlay/no-case-selected-overlay.component.html","./src/app/modules/common/services/logout.service.ts","./src/app/modules/navigation/components/nav-user-menu/nav-user-menu.component.ts","./src/app/modules/navigation/components/nav-user-menu/nav-user-menu.component.html","./src/app/modules/navigation/components/nav-header/nav-header.component.html","./src/app/modules/navigation/components/nav-header/nav-header.component.ts","./src/app/modules/navigation/services/nav-sidebar-menu.service.ts","./src/app/modules/navigation/components/nav-sidebar/nav-sidebar.component.html","./src/app/modules/navigation/components/nav-sidebar/nav-sidebar.component.ts","./src/app/modules/navigation/components/nav-client-picker/nav-client-picker.component.html","./src/app/modules/navigation/components/nav-client-picker/nav-client-picker.component.ts","./src/app/modules/navigation/components/nav-new-tab/nav-new-tab.component.ts","./src/app/modules/navigation/components/nav-new-tab/nav-new-tab.component.html","./src/app/modules/navigation/components/nav-env-picker/nav-env-picker.component.html","./src/app/modules/navigation/components/nav-env-picker/nav-env-picker.component.ts","./src/app/modules/navigation/components/nav-env-message/nav-env-message.component.html","./src/app/modules/navigation/components/nav-env-message/nav-env-message.component.ts","./src/app/modules/navigation/components/nav-phone-call-banner/nav-phone-call-banner.component.ts","./src/app/modules/navigation/components/nav-phone-call-banner/nav-phone-call-banner.component.html","./src/app/modules/navigation/components/nav-layout/nav-layout.component.html","./src/app/modules/navigation/components/nav-layout/nav-layout.component.ts","./src/app/modules/routing/services/route-guard.service.ts","./src/app/modules/routing/routes.ts","./src/app/modules/routing/services/stingray-route-reuse-strategy.ts","./src/app/modules/routing/routing.module.ts","./src/app/modules/common/components/session-expiration-dialog/session-expiration-dialog.component.ts","./src/app/modules/common/components/session-expiration-dialog/session-expiration-dialog.component.html","./src/app/modules/common/services/user-session-timeout.service.ts","./src/app/modules/common/components/loading-overlay/loading-overlay.component.ts","./src/app/modules/common/components/loading-overlay/loading-overlay.component.html","./src/app/app.component.ts","./src/app/app.module.ts","./src/main.ts","./.yarn/cache/moment-npm-2.29.4-902943305d-0ec3f9c2bc.zip/node_modules/moment/locale/ sync ^\\.\\/.*$"],"sourcesContent":["import { Injectable } from '@angular/core';\r\nimport { Observable } from 'rxjs';\r\nimport { ConcurrentRequestHandlingService } from '@modules/common/services/concurrent-request-handling.service';\r\nimport { ApiProxyOptions } from '@modules/common/models/api-proxy-options';\r\nimport { AdminPortalStylingViewModel } from './admin-portal-styling-view-model.generated';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class GetStylingService {\r\n constructor(private _concurrentRequestHandlingService: ConcurrentRequestHandlingService) { }\r\n\r\n public getStyling(options?: ApiProxyOptions): Observable {\r\n return this._concurrentRequestHandlingService.callApi(\r\n \"GetStylingService_getStyling\",\r\n {\r\n url: '/AdminPortalConfig/GetStyling/GetStyling',\r\n body: {},\r\n sendCredentials: true\r\n }, options\r\n );\r\n }\r\n}\r\n","export enum PowerBIReportTypeEnum {\r\n Report = 0,\r\n PaginatedReport = 1,\r\n}\r\n","import { CommonModule } from '@angular/common';\r\nimport { NgModule } from '@angular/core';\r\nimport { ReactiveFormsModule } from '@angular/forms';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatDialogModule } from '@angular/material/dialog';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { MatPaginatorModule } from '@angular/material/paginator';\r\nimport { MatSelectModule } from '@angular/material/select';\r\nimport { MatSnackBarModule } from '@angular/material/snack-bar';\r\nimport { MatSortModule } from '@angular/material/sort';\r\nimport { MatTableModule } from '@angular/material/table';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\nimport { RouterModule } from '@angular/router';\r\nimport { AgGridComponent } from '@modules/common/components/ag-grid/ag-grid.component';\r\nimport { AlertErrorComponent } from '@modules/common/components/alert-error/alert-error.component';\r\nimport { AlertSuccessComponent } from '@modules/common/components/alert-success/alert-success.component';\r\nimport { AlertWarningComponent } from '@modules/common/components/alert-warning/alert-warning.component';\r\nimport { AlertComponent } from '@modules/common/components/alert/alert.component';\r\nimport { AreYouSureDialogComponent } from '@modules/common/components/are-you-sure-dialog/are-you-sure-dialog';\r\nimport { BreadcrumbsComponent } from '@modules/common/components/breadcrumbs/breadcrumbs.component';\r\nimport { CopyrightComponent } from '@modules/common/components/copyright/copyright.component';\r\nimport { CountdownComponent } from '@modules/common/components/countdown/countdown.component';\r\nimport { DragHandleComponent } from '@modules/common/components/drag-handle/drag-handle.component';\r\nimport { ErrorDialogComponent } from '@modules/common/components/error-dialog/error-dialog.component';\r\nimport { FileFormControlComponent } from '@modules/common/components/file-form-control/file-form-control.component';\r\nimport { FileSearchDialogComponent } from '@modules/common/components/file-search-dialog/file-search-dialog.component';\r\nimport { FileSearchComponent } from '@modules/common/components/file-search/file-search.component';\r\nimport { LabeledListItemComponent } from '@modules/common/components/labeled-list-item/labeled-list-item.component';\r\nimport { LoadingOverlayComponent } from '@modules/common/components/loading-overlay/loading-overlay.component';\r\nimport { NoCaseSelectedOverlayComponent } from '@modules/common/components/no-case-selected-overlay/no-case-selected-overlay.component';\r\nimport { NotFoundComponent } from '@modules/common/components/not-found/not-found.component';\r\nimport { ObscuredInputComponent } from '@modules/common/components/obscured-input/obscured-input.component';\r\nimport { ParticipantBenefitsComparisonGridComponent } from '@modules/common/components/participant-benefits-comparison-grid/participant-benefits-comparison-grid.component';\r\nimport { PasswordRequirementsComponent } from '@modules/common/components/password-requirements/password-requirements.component';\r\nimport { ProcessExecutionStatusComponent } from '@modules/common/components/process-execution-status/process-execution-status.component';\r\nimport { RichEditorComponent } from '@modules/common/components/rich-editor/rich-editor.component';\r\nimport { SessionExpirationDialogComponent } from '@modules/common/components/session-expiration-dialog/session-expiration-dialog.component';\r\nimport { TableLoadingOverlayComponent } from '@modules/common/components/table-loading-overlay/table-loading-overlay.component';\r\nimport { TimePickerComponent } from '@modules/common/components/time-picker/time-picker.component';\r\nimport { ValueMaskingComponent } from '@modules/common/components/value-masking/value-masking.component';\r\nimport { DashedInputDirective } from '@modules/common/directives/dashed-input/dashed-input.directive';\r\nimport { ExpandableTableDetailRowDirective } from '@modules/common/directives/expandable-table-detail-row/expandable-table-detail-row.directive';\r\nimport { ScrollToDirective } from '@modules/common/directives/scrollTo/scroll-to.directive';\r\nimport { PhoneNumberPipe } from '@modules/common/pipes/phone-number.pipe';\r\nimport { TrustHtmlPipe } from '@modules/common/pipes/trust-html.pipe';\r\nimport { TooltipDirective } from '@modules/common/directives/tooltip/tooltip.directive';\r\nimport { CustomToolTipComponent } from '@modules/common/components/custom-tooltip/custom-tooltip.component';\r\nimport { ErrorIndicatorComponent } from './components/error-indicator/error-indicator.component';\r\nimport { FormBottomToolbarComponent } from './components/form-bottom-toolbar/form-bottom-toolbar.component';\r\nimport { PublishLinkComponent } from './components/publish-link/publish-link.component';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { ExpansionIndicatorComponent } from '@modules/common/components/expansion-indicator/expansion-indicator.component';\r\nimport { ErrorSummaryComponent } from './components/error-summary/error-summary.component';\r\nimport { RadioGroupYesNoComponent } from './components/radio-group-yes-no/radio-group-yes-no.component';\r\nimport { MultiSelectComponent } from './components/multi-select/multi-select.component';\r\nimport { MatRadioModule } from '@angular/material/radio';\r\nimport { NumberInputDirective } from '@modules/common/directives/number-input/number-input.directive';\r\nimport { WarningSummaryComponent } from '@modules/common/components/warning-summary/warning-summary.component';\r\nimport { MatPseudoCheckboxModule, MatRippleModule } from '@angular/material/core';\r\nimport { FormatEmptyDataPipe } from '@modules/common/pipes/format-empty-data.pipe';\r\nimport { AlertInfoComponent } from '@modules/common/components/alert-info/alert-info.component';\r\n\r\n@NgModule({\r\n declarations: [\r\n RichEditorComponent,\r\n DragHandleComponent,\r\n ExpandableTableDetailRowDirective,\r\n ScrollToDirective,\r\n AlertComponent,\r\n AlertErrorComponent,\r\n AlertInfoComponent,\r\n AlertSuccessComponent,\r\n AlertWarningComponent,\r\n LoadingOverlayComponent,\r\n TableLoadingOverlayComponent,\r\n CopyrightComponent,\r\n LabeledListItemComponent,\r\n BreadcrumbsComponent,\r\n TrustHtmlPipe,\r\n PasswordRequirementsComponent,\r\n ErrorDialogComponent,\r\n NoCaseSelectedOverlayComponent,\r\n SessionExpirationDialogComponent,\r\n ValueMaskingComponent,\r\n CountdownComponent,\r\n NotFoundComponent,\r\n FileSearchComponent,\r\n FileSearchDialogComponent,\r\n FileFormControlComponent,\r\n AreYouSureDialogComponent,\r\n\t\tTimePickerComponent,\r\n\t\tAgGridComponent,\r\n\t\tObscuredInputComponent,\r\n ProcessExecutionStatusComponent,\r\n PhoneNumberPipe,\r\n DashedInputDirective,\r\n ParticipantBenefitsComparisonGridComponent,\r\n TooltipDirective,\r\n CustomToolTipComponent,\r\n ErrorIndicatorComponent,\r\n FormBottomToolbarComponent,\r\n PublishLinkComponent,\r\n ExpansionIndicatorComponent,\r\n ErrorSummaryComponent,\r\n RadioGroupYesNoComponent,\r\n MultiSelectComponent,\r\n NumberInputDirective,\r\n WarningSummaryComponent,\r\n FormatEmptyDataPipe,\r\n ],\r\n imports: [\r\n CommonModule,\r\n ReactiveFormsModule,\r\n RouterModule,\r\n MatButtonModule,\r\n MatDialogModule,\r\n MatFormFieldModule,\r\n MatInputModule,\r\n MatSelectModule,\r\n MatSnackBarModule,\r\n MatSortModule,\r\n MatTableModule, \r\n MatPaginatorModule,\r\n MatTooltipModule,\r\n MatInputModule,\r\n MatIconModule,\r\n MatRadioModule,\r\n MatPseudoCheckboxModule,\r\n MatRippleModule,\r\n ],\r\n exports: [\r\n RichEditorComponent,\r\n DragHandleComponent,\r\n ExpandableTableDetailRowDirective,\r\n ScrollToDirective,\r\n AlertErrorComponent,\r\n AlertInfoComponent,\r\n AlertSuccessComponent,\r\n AlertWarningComponent,\r\n CopyrightComponent,\r\n LoadingOverlayComponent,\r\n TableLoadingOverlayComponent,\r\n LabeledListItemComponent,\r\n BreadcrumbsComponent,\r\n TrustHtmlPipe,\r\n PasswordRequirementsComponent,\r\n NoCaseSelectedOverlayComponent,\r\n SessionExpirationDialogComponent,\r\n ValueMaskingComponent,\r\n CountdownComponent,\r\n NotFoundComponent,\r\n FileFormControlComponent,\r\n\t\tTimePickerComponent,\r\n\t\tAgGridComponent,\r\n\t\tObscuredInputComponent,\r\n ProcessExecutionStatusComponent,\r\n PhoneNumberPipe,\r\n DashedInputDirective,\r\n ParticipantBenefitsComparisonGridComponent,\r\n TooltipDirective,\r\n CustomToolTipComponent,\r\n ErrorIndicatorComponent,\r\n FormBottomToolbarComponent,\r\n PublishLinkComponent,\r\n FormatEmptyDataPipe,\r\n ExpansionIndicatorComponent,\r\n ErrorSummaryComponent,\r\n RadioGroupYesNoComponent,\r\n MultiSelectComponent,\r\n NumberInputDirective,\r\n WarningSummaryComponent,\r\n ]\r\n})\r\nexport class StingrayCommonModule {\r\n}\r\n","
\r\n © {{currentYear}} \r\n \r\n Winston. All Rights Reserved.\r\n \r\n
","import { Component, Input } from '@angular/core';\r\nimport { animate, state, style, transition, trigger } from '@angular/animations';\r\n\r\n@Component({\r\n selector: 'app-copyright',\r\n templateUrl: './copyright.component.html',\r\n styleUrls: ['./copyright.component.scss'],\r\n animations: [\r\n trigger('fade', [\r\n state('void', style({opacity: 0})),\r\n transition('void <=> *', [\r\n animate(300)\r\n ])\r\n ])]\r\n})\r\nexport class CopyrightComponent {\r\n @Input()\r\n public shouldShowFull: boolean = true;\r\n public currentYear: number = new Date().getFullYear();\r\n}\r\n","\r\nimport {timer as observableTimer, Observable } from 'rxjs';\r\n\r\nimport {tap, map, take} from 'rxjs/operators';\r\nimport { Component, Output, EventEmitter } from '@angular/core';\r\n\r\n\r\n\r\n\r\n\r\n@Component({\r\n selector: 'app-countdown',\r\n templateUrl: './countdown.component.html',\r\n styleUrls: ['./countdown.component.scss']\r\n})\r\nexport class CountdownComponent {\r\n public displayValue!: Observable;\r\n\r\n @Output()\r\n public completed = new EventEmitter();\r\n\r\n public countdownTo(targetTime: Date): void {\r\n let seconds = getRemainingSeconds(targetTime);\r\n this.displayValue =\r\n observableTimer(0, 1000).pipe(\r\n take(seconds + 1),\r\n map(x => Math.floor(seconds - x)),\r\n tap(x => this.fireCompletedIfDone(x)),\r\n map(getDisplayValue),);\r\n }\r\n\r\n private fireCompletedIfDone(remainingSeconds: number): void {\r\n if (remainingSeconds <= 0) {\r\n this.completed.emit();\r\n }\r\n }\r\n}\r\n\r\nfunction getRemainingSeconds(targetTime: Date): number {\r\n if (!(targetTime instanceof Date)) {\r\n targetTime = new Date(targetTime);\r\n }\r\n return Math.floor(Math.max(0, targetTime.getTime() - new Date().getTime())) / 1000;\r\n}\r\n\r\nfunction getDisplayValue(remainingSeconds: number): string {\r\n let minutes = Math.floor(remainingSeconds / 60);\r\n let seconds = remainingSeconds % 60;\r\n return padNumber(minutes) + ':' + padNumber(seconds);\r\n};\r\n\r\nfunction padNumber(n: number): string {\r\n let s = n.toString();\r\n while (s.length < 2) {\r\n s = '0' + s;\r\n }\r\n return s;\r\n}","{{displayValue | async}}\r\n","export enum ConcurrentRequestHandlingEnum {\r\n FirstOnly,\r\n AllowAll,\r\n LastOnly\r\n}","import { APP_BASE_HREF } from '@angular/common';\r\nimport { Inject, Injectable } from '@angular/core';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class ApiRootService {\r\n constructor(\r\n @Inject(APP_BASE_HREF) private readonly _appBaseHref: string\r\n ) { }\r\n\r\n /**\r\n * Return the base url to use when making API calls.\r\n */\r\n public getApiRoot(): string {\r\n return this._appBaseHref;\r\n }\r\n}\r\n","import { Injectable } from \"@angular/core\";\r\nimport { ApiRootService } from \"@modules/common/services/api-root.service\";\r\nimport { CurrentCaseService } from \"@modules/common/services/current-case.service\";\r\nimport { CurrentEnvironmentService } from '@modules/common/services/current-environment.service';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class ApiCallUrlService {\r\n constructor(\r\n private _apiRootService: ApiRootService,\r\n private _currentCaseService: CurrentCaseService,\r\n private _currentEnvironmentService: CurrentEnvironmentService\r\n ) { }\r\n\r\n public getUrl(path: string, includeEnvironmentAndCase: boolean = true): string {\r\n var url = this._apiRootService.getApiRoot();\r\n\r\n if (includeEnvironmentAndCase) {\r\n url = this.addUrlSegment(url, this._currentEnvironmentService.getCurrentEnvironmentName());\r\n url = this.addUrlSegment(url, this._currentCaseService.getCurrentCaseName());\r\n }\r\n\r\n if (url[url.length - 1] !== '/' && path[0] !== '/') {\r\n url += '/';\r\n }\r\n\r\n if (url[url.length - 1] === '/' && path[0] === '/') {\r\n path = path.substr(1);\r\n }\r\n\r\n url += path;\r\n url = encodeURI(url);\r\n return url.replace(\"'\", \"%27\");\r\n }\r\n\r\n private addUrlSegment(url: string, newSegment: string): string {\r\n url = this.appendSlash(url);\r\n\r\n url += newSegment || '';\r\n\r\n url = this.appendSlash(url);\r\n\r\n if (url.length > 1 && url[0] === '/' && url[1] === '/') {\r\n url = url.substr(1);\r\n }\r\n\r\n return url;\r\n }\r\n\r\n private appendSlash(url: string): string {\r\n if (url[url.length - 1] !== '/') {\r\n url += '/';\r\n }\r\n\r\n return url;\r\n }\r\n}\r\n","import { Injectable } from \"@angular/core\";\r\nimport { UserSession } from \"@modules/api/user-session.generated\";\r\nimport { HttpErrorService } from \"@modules/common/services/http-error.service\";\r\nimport { RefreshSessionService } from '@modules/common/services/refresh-session.service';\r\nimport { UserSessionService } from \"@modules/common/services/user-session.service\";\r\nimport * as moment from 'moment';\r\nimport { Observable, of as observableOf } from 'rxjs';\r\nimport { map, tap } from 'rxjs/operators';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class AuthenticationTokenService {\r\n constructor(\r\n private _userSessionService: UserSessionService,\r\n private _refreshSessionService: RefreshSessionService,\r\n private _httpErrorService: HttpErrorService\r\n ) { }\r\n\r\n public getAuthenticationToken(): Observable | undefined {\r\n let session = this._userSessionService.getUserSession();\r\n if (this.isValid(session)) {\r\n if (this.requiresRefresh(session!)) {\r\n return this._refreshSessionService.refreshSession({\r\n authenticationToken: session!.authenticationToken!.token!,\r\n refreshToken: session!.refreshToken!\r\n }).pipe(tap(() => { }, x => {\r\n this._httpErrorService.handleHttpError(x);\r\n }),map((result: UserSession) => {\r\n if (result) {\r\n this._userSessionService.setUserSession(result);\r\n } else {\r\n //One of the reasons refreshSession() can return null\r\n //is that a different tab tried to refresh the token\r\n //at the same time (this happens a lot when debugging).\r\n //In that case, it's cross your fingers time and we\r\n // try to get the session from the other tab.\r\n session = this._userSessionService.getUserSession();\r\n }\r\n return result && result.authenticationToken && result.authenticationToken.token;\r\n }),);\r\n }\r\n\r\n return observableOf(session!.authenticationToken!.token!);\r\n }\r\n }\r\n\r\n public hasValidAuthenticationToken(): boolean {\r\n return this.isValid(this._userSessionService.getUserSession());\r\n }\r\n\r\n private isValid(session?: UserSession): boolean {\r\n return !!(session\r\n && session.authenticationToken\r\n && session.authenticationToken.issuedAt\r\n && session.authenticationToken.expiresAt\r\n && moment.utc(session.authenticationToken.expiresAt).diff(moment.utc()) > 0);\r\n }\r\n\r\n private requiresRefresh(session: UserSession): boolean {\r\n let validTimespan = moment.utc(session.authenticationToken!.expiresAt).diff(moment.utc(session.authenticationToken!.issuedAt));\r\n return moment.utc().diff(moment.utc(session.authenticationToken!.issuedAt)) > validTimespan / 2;\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { Observable } from 'rxjs';\r\nimport { ConcurrentRequestHandlingService } from '@modules/common/services/concurrent-request-handling.service';\r\nimport { ApiProxyOptions } from '@modules/common/models/api-proxy-options';\r\nimport { ClientsModel } from './clients-model.generated';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class GetClientsService {\r\n constructor(private _concurrentRequestHandlingService: ConcurrentRequestHandlingService) { }\r\n\r\n public getClients(options?: ApiProxyOptions): Observable {\r\n return this._concurrentRequestHandlingService.callApi(\r\n \"GetClientsService_getClients\",\r\n {\r\n url: '/Navigation/GetClients/GetClients',\r\n body: {},\r\n sendCredentials: true\r\n }, options\r\n );\r\n }\r\n}\r\n","import { Injectable } from \"@angular/core\";\r\nimport { ClientsModel } from \"@modules/api/clients-model.generated\";\r\nimport { GetClientsService } from \"@modules/api/get-clients.service.generated\";\r\nimport { CurrentEnvironmentService } from '@modules/common/services/current-environment.service';\r\nimport { UserSessionService } from \"@modules/common/services/user-session.service\";\r\nimport { merge, Observable, ReplaySubject } from \"rxjs\";\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class CachedCaseListService {\r\n private _subject = new ReplaySubject(1);\r\n\r\n constructor(\r\n getClientsService: GetClientsService,\r\n userSessionService: UserSessionService,\r\n currentEnvironmentService: CurrentEnvironmentService\r\n ) {\r\n merge(\r\n userSessionService.userSessionChanged(),\r\n currentEnvironmentService.environmentChanged\r\n ).subscribe(() => {\r\n const userSession = userSessionService.getUserSession();\r\n if (userSession) {\r\n if (userSession.restrictedToCase) {\r\n this._subject.next([{\r\n clientCode: userSession.restrictedToCase.code,\r\n clientName: userSession.restrictedToCase.name\r\n }]);\r\n } else {\r\n getClientsService.getClients().subscribe(result => {\r\n this._subject.next(result);\r\n });\r\n }\r\n }\r\n });\r\n }\r\n\r\n public get cachedCaseListChanged(): Observable {\r\n return this._subject;\r\n }\r\n}\r\n","import { Injectable } from \"@angular/core\";\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class CaseEnvChangeRedirectService {\r\n public getCaseEnvChangeRedirectUrl(caseEnvChangeRedirectUrl: string, newCaseName: string, newEnvironmentName: string): string[] {\r\n return caseEnvChangeRedirectUrl\r\n .split('/')\r\n .map(x => x.replace(':clientName', newCaseName).replace(':environment', newEnvironmentName))\r\n .filter(x => x);\r\n }\r\n}\r\n","import { HttpClient, HttpHeaders } from '@angular/common/http';\r\nimport { Injectable } from '@angular/core';\r\nimport { ApiCallOptions } from '@modules/common/models/api-call-options';\r\nimport { ApiCallUrlService } from '@modules/common/services/api-call-url.service';\r\nimport { AuthenticationTokenService } from '@modules/common/services/authentication-token.service';\r\nimport { HttpErrorService } from '@modules/common/services/http-error.service';\r\nimport { IsLoadingService } from '@modules/common/services/is-loading.service';\r\nimport { RedirectToLoginService } from '@modules/common/services/redirect-to-login.service';\r\nimport { Observable, Subject } from 'rxjs';\r\nimport { finalize, tap } from 'rxjs/operators';\r\n\r\n/**\r\n * Service used to make calls into the Web API. This service\r\n * should be used for all API calls, NEVER use Angular's\r\n * Http or HttpClient directly.\r\n */\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class ApiCallService {\r\n constructor(\r\n private httpClient: HttpClient,\r\n private _apiCallUrlService: ApiCallUrlService,\r\n private _authenticationTokenService: AuthenticationTokenService,\r\n private _redirectToLoginService: RedirectToLoginService,\r\n private _httpErrorService: HttpErrorService,\r\n private _isLoadingService: IsLoadingService\r\n ) {\r\n }\r\n\r\n /**\r\n * Make an API call to the given API url w/ the given request body. This\r\n * function returns an observable that provides the result data of the API call.\r\n * @param options The url, body, and other options used to make the call.\r\n */\r\n public callApi(options: ApiCallOptions): Observable {\r\n this.validate(options);\r\n options = this.getOptionsWithDefaultValues(options);\r\n\r\n const httpHeaders: { [key: string]: string } = {};\r\n\r\n if (!(options.body instanceof FormData)) {\r\n httpHeaders['Content-Type'] = 'application/json';\r\n }\r\n\r\n if (options.sendCredentials) {\r\n let authTokenObservable = this._authenticationTokenService.getAuthenticationToken();\r\n const subject = new Subject();\r\n if (authTokenObservable) {\r\n if (options.useLoadingIndicator) {\r\n this._isLoadingService.setLoading();\r\n authTokenObservable = authTokenObservable.pipe(finalize(() => this._isLoadingService.clearLoading()));\r\n }\r\n\r\n authTokenObservable.pipe(tap(() => { }, x => {\r\n subject.error(x);\r\n })).subscribe(token => {\r\n if (token) {\r\n httpHeaders['Authorization'] = 'Bearer ' + token;\r\n this.post(options, httpHeaders).pipe(\r\n tap(() => { }, x => {\r\n this._httpErrorService.handleHttpError(x);\r\n subject.error(x);\r\n })).subscribe(result =>\r\n subject.next(result)\r\n );\r\n } else {\r\n this._redirectToLoginService.redirectToLogin();\r\n subject.complete();\r\n }\r\n });\r\n\r\n return subject;\r\n }\r\n\r\n this._redirectToLoginService.redirectToLogin();\r\n subject.complete();\r\n return subject;\r\n }\r\n\r\n return this.post(options, httpHeaders).pipe(\r\n tap(() => { }, x => {\r\n this._httpErrorService.handleHttpError(x);\r\n }));\r\n }\r\n\r\n private post(options: ApiCallOptions, httpHeaders: { [key: string]: string }): Observable {\r\n let result = this.httpClient.post(\r\n this._apiCallUrlService.getUrl(options.url, options.includeEnvironmentAndCase),\r\n options.body,\r\n { headers: new HttpHeaders(httpHeaders) }\r\n );\r\n\r\n if (options.useLoadingIndicator) {\r\n this._isLoadingService.setLoading();\r\n result = result.pipe(finalize(() => this._isLoadingService.clearLoading()));\r\n }\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * Return a copy of the options object w/ default values \r\n * @param options\r\n */\r\n private getOptionsWithDefaultValues(options: ApiCallOptions): ApiCallOptions {\r\n options = Object.assign({}, options);\r\n if (typeof options.sendCredentials !== \"boolean\") {\r\n options.sendCredentials = true;\r\n }\r\n\r\n if (typeof options.useLoadingIndicator !== \"boolean\") {\r\n options.useLoadingIndicator = true;\r\n }\r\n\r\n return options;\r\n }\r\n\r\n private validate(options: ApiCallOptions): void {\r\n if (!options) {\r\n throw new Error(\"ApiCallOptions are required\");\r\n }\r\n\r\n if (!options.url) {\r\n throw new Error(\"ApiCallOptions.url is required\");\r\n }\r\n }\r\n}\r\n","import { Injectable } from \"@angular/core\";\r\nimport { ConcurrentRequestHandlingEnum } from \"@modules/common/enums/concurrent-request-handling-enum\";\r\nimport { ApiCallOptions } from \"@modules/common/models/api-call-options\";\r\nimport { ApiProxyOptions } from \"@modules/common/models/api-proxy-options\";\r\nimport { ApiCallService } from \"@modules/common/services/api-call.service\";\r\nimport { Observable, Subject, Subscription } from \"rxjs\";\r\nimport { finalize } from 'rxjs/operators';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class ConcurrentRequestHandlingService {\r\n constructor(private _apiCallService: ApiCallService) { }\r\n\r\n private _observables: { [proxyName: string]: PendingApiCall } = {};\r\n\r\n public callApi(\r\n proxyName: string,\r\n apiCallOptions: ApiCallOptions,\r\n apiProxyOptions?: ApiProxyOptions\r\n ): Observable {\r\n apiProxyOptions = this.getDefaultApiProxyOptions(apiProxyOptions);\r\n apiCallOptions = this.getAdjustedApiCallOptions(apiCallOptions, apiProxyOptions);\r\n\r\n if (apiProxyOptions.concurrentRequestHandling == ConcurrentRequestHandlingEnum.AllowAll) {\r\n return this._apiCallService.callApi(apiCallOptions);\r\n }\r\n\r\n if (apiProxyOptions.concurrentRequestHandling == ConcurrentRequestHandlingEnum.FirstOnly) {\r\n const existingRequest = this._observables[proxyName];\r\n if (existingRequest) {\r\n return existingRequest.subjects[0];\r\n } \r\n }\r\n\r\n if (apiProxyOptions.concurrentRequestHandling == ConcurrentRequestHandlingEnum.LastOnly) {\r\n const existingRequest = this._observables[proxyName];\r\n if (existingRequest) {\r\n existingRequest.subscription.unsubscribe();\r\n }\r\n }\r\n\r\n const subject = new Subject();\r\n this._observables[proxyName] = {\r\n subscription: this.createSubscription(proxyName, apiCallOptions),\r\n subjects: [subject]\r\n };\r\n\r\n return subject.asObservable();\r\n }\r\n\r\n private createSubscription(proxyName: string, apiCallOptions: ApiCallOptions): Subscription {\r\n return this._apiCallService\r\n .callApi(apiCallOptions).pipe(\r\n finalize(() => this.clearObservablesList(proxyName)))\r\n .subscribe(x => this.handleApiCallCompleted(x, proxyName));\r\n }\r\n\r\n private handleApiCallCompleted(data: T, proxyName: string): void {\r\n const existingRequest = this._observables[proxyName];\r\n if (existingRequest) {\r\n for (let subject of existingRequest.subjects) {\r\n subject.next(data);\r\n }\r\n }\r\n this.clearObservablesList(proxyName);\r\n }\r\n\r\n private clearObservablesList(proxyName: string): void {\r\n delete this._observables[proxyName];\r\n }\r\n\r\n private getDefaultApiProxyOptions(apiProxyOptions?: ApiProxyOptions): ApiProxyOptions {\r\n apiProxyOptions = Object.assign({}, apiProxyOptions || {});\r\n\r\n if (typeof apiProxyOptions.concurrentRequestHandling === 'undefined') {\r\n apiProxyOptions.concurrentRequestHandling = ConcurrentRequestHandlingEnum.FirstOnly;\r\n }\r\n\r\n if (typeof apiProxyOptions.useLoadingIndicator !== 'boolean') {\r\n apiProxyOptions.useLoadingIndicator = true;\r\n }\r\n\r\n if (typeof apiProxyOptions.includeEnvironmentAndCase !== 'boolean') {\r\n apiProxyOptions.includeEnvironmentAndCase = true;\r\n }\r\n\r\n return apiProxyOptions;\r\n }\r\n\r\n private getAdjustedApiCallOptions(apiCallOptions: ApiCallOptions, apiProxyOptions: ApiProxyOptions): ApiCallOptions {\r\n apiCallOptions = Object.assign({}, apiCallOptions);\r\n\r\n if (typeof apiCallOptions.useLoadingIndicator !== 'boolean') {\r\n apiCallOptions.useLoadingIndicator = apiProxyOptions.useLoadingIndicator;\r\n }\r\n\r\n if (typeof apiCallOptions.includeEnvironmentAndCase !== 'boolean') {\r\n apiCallOptions.includeEnvironmentAndCase = apiProxyOptions.includeEnvironmentAndCase;\r\n }\r\n\r\n return apiCallOptions;\r\n }\r\n}\r\n\r\ninterface PendingApiCall {\r\n subscription: Subscription;\r\n subjects: Subject[];\r\n}\r\n","import { Injectable } from \"@angular/core\";\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class CopyToClipboardService {\r\n /**\r\n * Copy the given text to the OS clipboard\r\n */\r\n public copyToClipboard(text: string): void {\r\n const el = document.createElement('textarea');\r\n el.value = text;\r\n el.setAttribute('readonly', '');\r\n el.style.position = 'absolute';\r\n el.style.left = '-9999px';\r\n document.body.appendChild(el);\r\n el.select();\r\n document.execCommand('copy');\r\n document.body.removeChild(el);\r\n }\r\n}\r\n","import { Injectable } from \"@angular/core\";\r\nimport { AdminPortalStylingViewModel } from \"@modules/api/admin-portal-styling-view-model.generated\";\r\nimport { GetStylingService } from \"@modules/api/get-styling.service.generated\";\r\nimport { ConcurrentRequestHandlingEnum } from \"@modules/common/enums/concurrent-request-handling-enum\";\r\nimport { CurrentCaseService } from \"@modules/common/services/current-case.service\";\r\nimport { BehaviorSubject, Observable } from \"rxjs\";\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class CurrentAdminPortalConfigService {\r\n constructor(\r\n private _currentCaseService: CurrentCaseService,\r\n private _getStylingService: GetStylingService\r\n ) {\r\n this._currentCaseService.caseChanged.subscribe(x => this.onCasechanged(x));\r\n }\r\n\r\n private _configChangedSubject = new BehaviorSubject(undefined);\r\n private _currentCaseName = '';\r\n\r\n private onCasechanged(currentCaseName: string): void {\r\n if (this._currentCaseName != currentCaseName && (this._currentCaseName || currentCaseName)) {\r\n this._currentCaseName = currentCaseName;\r\n this.refresh();\r\n }\r\n }\r\n\r\n public refresh(): void {\r\n if (this._currentCaseName) {\r\n this._getStylingService.getStyling({\r\n concurrentRequestHandling: ConcurrentRequestHandlingEnum.LastOnly,\r\n useLoadingIndicator: false\r\n }).subscribe(result =>\r\n this._configChangedSubject.next(result)\r\n );\r\n } else {\r\n this._configChangedSubject.next(undefined);\r\n }\r\n }\r\n\r\n public get configChanged(): Observable {\r\n return this._configChangedSubject;\r\n }\r\n}\r\n","import { Injectable } from \"@angular/core\";\r\nimport { NavigationEnd, Router } from \"@angular/router\";\r\nimport { CaseEnvChangeRedirectService } from '@modules/common/services/case-env-change-redirect.service';\r\nimport { CurrentEnvironmentService } from '@modules/common/services/current-environment.service';\r\nimport { CurrentRouteService } from \"@modules/common/services/current-route.service\";\r\nimport { ReplaceRouteParameterService } from '@modules/common/services/replace-route-parameter.service';\r\nimport { BehaviorSubject, Observable } from \"rxjs\";\r\nimport { filter } from 'rxjs/operators';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class CurrentCaseService {\r\n constructor(\r\n private _router: Router,\r\n private _currentRouteService: CurrentRouteService,\r\n private _replaceRouteParameterService: ReplaceRouteParameterService,\r\n private _currentEnvironmentService: CurrentEnvironmentService,\r\n private _caseEnvChangeRedirectService: CaseEnvChangeRedirectService\r\n ) {\r\n this._router\r\n .events\r\n .pipe(filter(e => e instanceof NavigationEnd))\r\n .subscribe(() => this.onNavigation());\r\n }\r\n\r\n private _caseChangedSubject = new BehaviorSubject('');\r\n\r\n public getCurrentCaseName(): string {\r\n return this._currentRouteService.getCurrentRoute().params['clientName'] || '';\r\n }\r\n\r\n public setCurrentCase(newCaseName: string): void {\r\n this._router.navigate(this.getUpdatedUrl(newCaseName));\r\n }\r\n\r\n public get caseChanged(): Observable {\r\n return this._caseChangedSubject;\r\n }\r\n\r\n private onNavigation(): void {\r\n const newCaseName = this.getCurrentCaseName();\r\n if (newCaseName != this._caseChangedSubject.getValue()) {\r\n this._caseChangedSubject.next(newCaseName);\r\n }\r\n }\r\n\r\n private getUpdatedUrl(newCaseName: string): string[] {\r\n const currentRoute = this._currentRouteService.getCurrentRoute();\r\n const currentEnvironmentName = this._currentEnvironmentService.getCurrentEnvironmentName();\r\n\r\n if (currentRoute.data && currentRoute.data.caseEnvChangeRedirect) {\r\n return this._caseEnvChangeRedirectService.getCaseEnvChangeRedirectUrl(currentRoute.data.caseEnvChangeRedirect, newCaseName, currentEnvironmentName);\r\n }\r\n\r\n const result = this._replaceRouteParameterService.replaceRouteParameter({\r\n route: currentRoute,\r\n paramName: 'clientName',\r\n paramValue: newCaseName,\r\n leaveOutEmptyParameter: true\r\n });\r\n\r\n if (!this.getCurrentCaseName() && newCaseName) {\r\n result.splice(currentEnvironmentName ? 1 : 0, 0, newCaseName);\r\n }\r\n\r\n return result;\r\n }\r\n}\r\n","import { Injectable } from \"@angular/core\";\r\nimport { NavigationEnd, Router } from \"@angular/router\";\r\nimport { CaseEnvChangeRedirectService } from '@modules/common/services/case-env-change-redirect.service';\r\nimport { CurrentRouteService } from \"@modules/common/services/current-route.service\";\r\nimport { ReplaceRouteParameterService } from '@modules/common/services/replace-route-parameter.service';\r\nimport { BehaviorSubject, Observable } from \"rxjs\";\r\nimport { filter } from 'rxjs/operators';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class CurrentEnvironmentService {\r\n constructor(\r\n private _router: Router,\r\n private _currentRouteService: CurrentRouteService,\r\n private _replaceRouteParameterService: ReplaceRouteParameterService,\r\n private _caseEnvChangeRedirectService: CaseEnvChangeRedirectService\r\n ) {\r\n this._router\r\n .events\r\n .pipe(filter(e => e instanceof NavigationEnd))\r\n .subscribe(() => this.onNavigation());\r\n }\r\n\r\n private _environmentChangedSubject?: BehaviorSubject;\r\n\r\n private get environmentChangedSubject(): BehaviorSubject {\r\n //Lazily populate this subject here instead of in the constructor because the current route is not available\r\n //during app startup, when this service is first constructed\r\n if (!this._environmentChangedSubject) {\r\n this._environmentChangedSubject = new BehaviorSubject(this.getCurrentEnvironmentName());\r\n }\r\n\r\n return this._environmentChangedSubject;\r\n }\r\n\r\n public getCurrentEnvironmentName(): string {\r\n return this._currentRouteService.getCurrentRoute().params['environment'] || '';\r\n }\r\n\r\n public setCurrentEnvironment(newEnvironmentName: string | undefined | null): void {\r\n this._router.navigate(this.getUpdatedUrl(newEnvironmentName || ''));\r\n }\r\n\r\n public get environmentChanged(): Observable {\r\n return this.environmentChangedSubject;\r\n }\r\n\r\n private onNavigation(): void {\r\n const newEnvironmentName = this.getCurrentEnvironmentName();\r\n if (newEnvironmentName != this.environmentChangedSubject.getValue()) {\r\n this.environmentChangedSubject.next(newEnvironmentName);\r\n }\r\n }\r\n\r\n private getUpdatedUrl(newEnvironmentName: string): string[] {\r\n const currentRoute = this._currentRouteService.getCurrentRoute();\r\n\r\n if (currentRoute.data && currentRoute.data.caseEnvChangeRedirect) {\r\n return this._caseEnvChangeRedirectService.getCaseEnvChangeRedirectUrl(currentRoute.data.caseEnvChangeRedirect, currentRoute.params['clientName'] || '', newEnvironmentName);\r\n }\r\n\r\n const result = this._replaceRouteParameterService.replaceRouteParameter({\r\n route: this._currentRouteService.getCurrentRoute(),\r\n paramName: 'environment',\r\n paramValue: newEnvironmentName,\r\n leaveOutEmptyParameter: true\r\n });\r\n\r\n if (!this.getCurrentEnvironmentName() && newEnvironmentName) {\r\n result.splice(0, 0, newEnvironmentName);\r\n }\r\n\r\n return result;\r\n }\r\n}\r\n","import { Injectable } from \"@angular/core\";\r\nimport { Router } from \"@angular/router\";\r\nimport { ActivatedRouteModel } from '@modules/common/models/activated-route-model';\r\nimport { RouteModelService } from '@modules/common/services/route-model.service';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class CurrentRouteService {\r\n constructor(\r\n private _router: Router,\r\n private _routeModelService: RouteModelService\r\n ) { }\r\n\r\n public getCurrentRoute(): ActivatedRouteModel {\r\n return this._routeModelService.getRouteModel(this._router.routerState.snapshot.root);\r\n }\r\n}\r\n","import { Injectable } from \"@angular/core\";\r\nimport { EnvironmentModel } from '@modules/common/models/environment-model';\r\nimport { UserSessionService } from \"@modules/common/services/user-session.service\";\r\nimport { BehaviorSubject, Observable } from \"rxjs\";\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class EnvironmentListService {\r\n private _subject = new BehaviorSubject([]);\r\n\r\n constructor(\r\n userSessionService: UserSessionService\r\n ) {\r\n userSessionService.userSessionChanged().subscribe(result => {\r\n const environments = result && result.allowedEnvironments as EnvironmentModel[] || [];\r\n environments.sort((a, b) => (a.name || '').localeCompare(b.name || ''));\r\n environments.sort((a, b) => a.isDefault === b.isDefault ? 0 : a.isDefault ? -1 : 1);\r\n this._subject.next(environments);\r\n });\r\n }\r\n\r\n public get environmentListChanged(): Observable {\r\n return this._subject;\r\n }\r\n\r\n public getEnvironmentList(): EnvironmentModel[] {\r\n return this._subject.value;\r\n }\r\n}\r\n","import { Component, Inject } from '@angular/core';\r\nimport { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog';\r\nimport { ErrorDetails } from '@modules/common/models/error-details';\r\nimport { SnackbarService } from '@modules/common/services/snackbar.service';\r\nimport { CopyToClipboardService } from '@modules/common/services/copy-to-clipboard.service';\r\nimport * as moment from 'moment';\r\n\r\n@Component({\r\n selector: 'app-error-dialog',\r\n templateUrl: './error-dialog.component.html',\r\n styleUrls: ['./error-dialog.component.scss']\r\n})\r\nexport class ErrorDialogComponent {\r\n public errorDetails: string;\r\n\r\n constructor(\r\n public _dialogRef: MatDialogRef,\r\n private _snackbarService: SnackbarService,\r\n private _copyToClipboardService: CopyToClipboardService,\r\n @Inject(MAT_DIALOG_DATA) error: ErrorDetails\r\n ) {\r\n this.errorDetails = this.getFullErrorString(error);\r\n }\r\n\r\n public close(): void {\r\n this._dialogRef.close();\r\n }\r\n\r\n public copyErrorDetails(): void {\r\n this._copyToClipboardService.copyToClipboard(this.errorDetails);\r\n this._snackbarService.open({\r\n message: 'ERROR DETAILS COPIED TO CLIPBOARD'\r\n });\r\n }\r\n\r\n private getFullErrorString(error?: ErrorDetails): string {\r\n if (!error || !error.errorMessage) {\r\n return '';\r\n }\r\n\r\n let result = 'ERROR MESSAGE: ' + error.errorMessage + '\\r\\n\\r\\n';\r\n\r\n\r\n if (error.ipAddress) {\r\n result += 'IP Address: ' + error.ipAddress + '\\r\\n';\r\n }\r\n\r\n if (error.referrer) {\r\n result += 'Page URL: ' + error.referrer + '\\r\\n';\r\n }\r\n\r\n if (error.url) {\r\n result += 'URL: ' + error.url + '\\r\\n';\r\n }\r\n\r\n if (error.username) {\r\n result += 'Username: ' + error.username + '\\r\\n';\r\n }\r\n\r\n if (error.logReferenceId) {\r\n result += 'Log ID: ' + error.logReferenceId + '\\r\\n';\r\n }\r\n\r\n result += 'Timestamp: ' + moment().format(\"dddd, MMMM Do YYYY, h:mm:ss a ZZ\") + '\\r\\n';\r\n\r\n if (error.stackTrace) {\r\n result += '\\r\\n\\r\\nSTACK TRACE:\\r\\n' + error.stackTrace;\r\n }\r\n\r\n\r\n return result;\r\n }\r\n}\r\n","\r\n
\r\n
\r\n
\r\n An Error Has Occurred\r\n
\r\n \r\n
\r\n
\r\n

\r\n Please copy the error details and report this issue to IT and try again later.\r\n

\r\n

\r\n \r\n

\r\n

{{errorDetails}}

\r\n
\r\n
\r\n
\r\n","import { Injectable } from \"@angular/core\";\r\nimport { MatDialog } from \"@angular/material/dialog\";\r\nimport { ErrorDialogComponent } from \"@modules/common/components/error-dialog/error-dialog.component\";\r\nimport { ErrorDetails } from \"@modules/common/models/error-details\";\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class ErrorService {\r\n constructor(private _dialog: MatDialog) { }\r\n\r\n public registerError(error: ErrorDetails): void {\r\n this._dialog.open(ErrorDialogComponent, {\r\n data: error\r\n });\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { Observable } from 'rxjs';\r\nimport { ConcurrentRequestHandlingService } from '@modules/common/services/concurrent-request-handling.service';\r\nimport { ApiProxyOptions } from '@modules/common/models/api-proxy-options';\r\nimport { GetDynamicMenusResult } from './get-dynamic-menus-result.generated';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class GetDynamicMenusService {\r\n constructor(private _concurrentRequestHandlingService: ConcurrentRequestHandlingService) { }\r\n\r\n public getDynamicMenus(options?: ApiProxyOptions): Observable {\r\n return this._concurrentRequestHandlingService.callApi(\r\n \"GetDynamicMenusService_getDynamicMenus\",\r\n {\r\n url: '/DynamicMenus/GetDynamicMenus/GetDynamicMenus',\r\n body: {},\r\n sendCredentials: true\r\n }, options\r\n );\r\n }\r\n}\r\n","import { Injectable } from \"@angular/core\";\r\nimport { AdministrationMenuViewModel } from \"@modules/api/administration-menu-view-model.generated\";\r\nimport { DashboardViewModel } from \"@modules/api/dashboard-view-model.generated\";\r\nimport { GetDynamicMenusService } from \"@modules/api/get-dynamic-menus.service.generated\";\r\nimport { PowerBIReportTypeEnum } from \"@modules/api/power-bi-report-type-enum.generated\";\r\nimport { PowerBIViewModel } from \"@modules/api/power-bi-view-model.generated\";\r\nimport { ConcurrentRequestHandlingEnum } from \"@modules/common/enums/concurrent-request-handling-enum\";\r\nimport { CurrentCaseService } from \"@modules/common/services/current-case.service\";\r\nimport { CurrentEnvironmentService } from '@modules/common/services/current-environment.service';\r\nimport { PermissionService } from \"@modules/common/services/permission.service\";\r\nimport { filter, Observable, ReplaySubject } from \"rxjs\";\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class GetCurrentUserDynamicMenusService {\r\n\r\n private readonly _dashboardsSubject = new ReplaySubject(1);\r\n private readonly _powerBIReportsSubject = new ReplaySubject(1);\r\n private readonly _powerBIPaginatedReportsSubject = new ReplaySubject(1);\r\n private readonly _administrationMenusSubject = new ReplaySubject(1);\r\n private _pending = false;\r\n\r\n constructor(\r\n private readonly _currentCaseService: CurrentCaseService,\r\n private readonly _currentEnvironmentService: CurrentEnvironmentService,\r\n private readonly _getDynamicMenusService: GetDynamicMenusService,\r\n private readonly _permissionService: PermissionService\r\n ) {\r\n this._currentCaseService.caseChanged.subscribe(() => this.updateMenus());\r\n this._currentEnvironmentService.environmentChanged.subscribe(() => this.updateMenus());\r\n this._permissionService.permissionsChanged.subscribe(() => this.updateMenus());\r\n }\r\n\r\n private updateMenus(): void {\r\n if (this._permissionService.verifyPermission('SSO into WEX')\r\n || this._currentCaseService.getCurrentCaseName() \r\n && this._currentEnvironmentService.getCurrentEnvironmentName() \r\n && (this._permissionService.verifyPermission('View Dashboards') \r\n || this._permissionService.verifyPermission('View Power BI Reports'))) {\r\n\r\n this._pending = true;\r\n\r\n this._getDynamicMenusService.getDynamicMenus({\r\n concurrentRequestHandling: ConcurrentRequestHandlingEnum.LastOnly\r\n }).subscribe(result => {\r\n this._pending = false;\r\n this._dashboardsSubject.next(result && result.dashboards || []);\r\n this._powerBIReportsSubject.next(result && result.powerBIReports?.filter(x => x.powerBIReportType == PowerBIReportTypeEnum.Report) || []);\r\n this._powerBIPaginatedReportsSubject.next(result && result.powerBIReports?.filter(x => x.powerBIReportType == PowerBIReportTypeEnum.PaginatedReport) || []);\r\n this._administrationMenusSubject.next(result && result.administrationMenus || []);\r\n\r\n });\r\n } else {\r\n this._dashboardsSubject.next([]);\r\n this._powerBIReportsSubject.next([]);\r\n this._powerBIPaginatedReportsSubject.next([]);\r\n this._administrationMenusSubject.next([]);\r\n }\r\n }\r\n\r\n public getCurrentUserDashboards(): Observable {\r\n return this._dashboardsSubject.pipe(filter(x => !this._pending)); //Force new subscribers to wait for the new result if the service is pending, instead of getting the replay value\r\n }\r\n\r\n public getCurrentUserPowerBIReports(): Observable {\r\n return this._powerBIReportsSubject.pipe(filter(x => !this._pending)); //Force new subscribers to wait for the new result if the service is pending, instead of getting the replay value\r\n }\r\n\r\n public getCurrentUserPowerBIPaginatedReports(): Observable {\r\n return this._powerBIPaginatedReportsSubject.pipe(filter(x => !this._pending)); //Force new subscribers to wait for the new result if the service is pending, instead of getting the replay value\r\n }\r\n\r\n public getAdministrationMenus() : Observable {\r\n return this._administrationMenusSubject.pipe(filter(x => !this._pending)); //Force new subscribers to wait for the new result if the service is pending, instead of getting the replay value\r\n }\r\n}","import { Injectable } from \"@angular/core\";\r\nimport { CurrentCaseService } from \"@modules/common/services/current-case.service\";\r\nimport { CurrentEnvironmentService } from '@modules/common/services/current-environment.service';\r\nimport { BehaviorSubject, Observable } from \"rxjs\";\r\n\r\n/** \r\n * Service to get the url of the homepage\r\n */\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class HomeUrlService {\r\n constructor(\r\n\t\tprivate _currentCaseService: CurrentCaseService,\r\n\t\tprivate _currentEnvironmentService: CurrentEnvironmentService\r\n ) {\r\n\t\tthis._currentCaseService.caseChanged.subscribe(() => this.updateUrl());\r\n\t\tthis._currentEnvironmentService.environmentChanged.subscribe(() => this.updateUrl());\r\n }\r\n\r\n\tprivate _subject = new BehaviorSubject('');\r\n\r\n\tprivate updateUrl(): void {\r\n\t\tlet newUrl = '';\r\n\t\tif (this._currentEnvironmentService.getCurrentEnvironmentName())\r\n\t\t\tnewUrl += '/' + this._currentEnvironmentService.getCurrentEnvironmentName();\r\n\t\tif (this._currentCaseService.getCurrentCaseName())\r\n\t\t\tnewUrl += '/' + this._currentCaseService.getCurrentCaseName();\r\n\t\tnewUrl += '/Dashboards';\r\n\r\n\t\tif (newUrl !== this._subject.getValue()) {\r\n\t\t\tthis._subject.next(newUrl);\r\n\t\t}\r\n\t}\r\n\r\n public get urlChanged(): Observable {\r\n return this._subject;\r\n }\r\n\r\n public getHomeUrl(): string {\r\n return this._subject.getValue();\r\n }\r\n}\r\n","import { HttpErrorResponse } from \"@angular/common/http\";\r\nimport { Injectable } from \"@angular/core\";\r\nimport { ErrorService } from \"@modules/common/services/error.service\";\r\nimport { RedirectToLoginService } from \"@modules/common/services/redirect-to-login.service\";\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class HttpErrorService {\r\n constructor(\r\n private _redirectToLoginService: RedirectToLoginService,\r\n private _errorService: ErrorService\r\n ) { }\r\n\r\n public handleHttpError(error: HttpErrorResponse) : void {\r\n if (error.error instanceof Error) {\r\n this._errorService.registerError({\r\n errorMessage: error.error.toString()\r\n });\r\n } else {\r\n if (Math.floor(error.status) == 401) {\r\n this._redirectToLoginService.redirectToLogin();\r\n } else {\r\n //Here the error.error property should be the response body,\r\n //which is a serialized ApiCallError, which matches the\r\n //ErrorDetails interface.\r\n if (error.error && error.error.hasOwnProperty('errorMessage')) {\r\n this._errorService.registerError(error.error);\r\n } else {\r\n this._errorService.registerError({\r\n errorMessage: error.message\r\n })\r\n }\r\n }\r\n }\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { Observable, Subject } from 'rxjs';\r\n\r\n/**\r\n * Service that indicates whether or not the app is currently changing pages.\r\n */\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class IsLoadingService {\r\n private _counter: number = 0;\r\n private _subject = new Subject();\r\n public get observable(): Observable {\r\n return this._subject;\r\n }\r\n\r\n public setLoading(): void {\r\n this._counter++;\r\n if (this._counter === 1) {\r\n this._subject.next(true);\r\n }\r\n }\r\n\r\n public clearLoading(): void {\r\n setTimeout(() => {\r\n this._counter = Math.max(0, this._counter - 1);\r\n if (this._counter === 0) {\r\n this._subject.next(false);\r\n }\r\n });\r\n }\r\n}\r\n","import { Injectable } from \"@angular/core\";\r\nimport { UserSessionService } from \"@modules/common/services/user-session.service\";\r\nimport { Observable, ReplaySubject } from \"rxjs\";\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class PermissionService {\r\n private _permissions: { [key: string]: undefined } = {};\r\n\r\n constructor(\r\n userSessionService: UserSessionService\r\n ) {\r\n userSessionService.userSessionChanged()\r\n .subscribe(result => {\r\n this._permissions = {};\r\n if (result && result.permissions) {\r\n for (let permission of result.permissions) {\r\n this._permissions[permission.name!] = undefined;\r\n }\r\n }\r\n this._permissionsChangedSubject.next({});\r\n })\r\n }\r\n\r\n public verifyPermission(permissionName: string): boolean {\r\n return this._permissions.hasOwnProperty(permissionName);\r\n }\r\n\r\n public get permissionsChanged(): Observable {\r\n return this._permissionsChangedSubject;\r\n }\r\n\r\n private _permissionsChangedSubject = new ReplaySubject(1);\r\n}\r\n","import { Injectable } from \"@angular/core\";\r\nimport { ActivatedRouteSnapshot, Router } from \"@angular/router\";\r\nimport { ActivatedRouteModel } from \"@modules/common/models/activated-route-model\";\r\nimport { CurrentCaseService } from \"@modules/common/services/current-case.service\";\r\nimport { RouteModelService } from '@modules/common/services/route-model.service';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class RedirectToLoginService {\r\n constructor(\r\n private _router: Router,\r\n private _currentCaseService: CurrentCaseService,\r\n private _routeModelService: RouteModelService\r\n ) { }\r\n\r\n private _redirectedFromUrl: any[] | undefined;\r\n private _queryParams: { [key: string]: string } | undefined;\r\n\r\n public redirectToLogin(redirectedFromRoute?: ActivatedRouteSnapshot): void {\r\n this._redirectedFromUrl = undefined;\r\n\r\n const routeModel = this.getRouteModel(redirectedFromRoute);\r\n const fromUrl = routeModel?.urlWithPopulatedParameters;\r\n\r\n //We only want to do the redirect if the page we're coming from isn't a login page, unless\r\n //that page is the AccountSettings page\r\n if (fromUrl && (fromUrl.indexOf('Login') === -1 || fromUrl.indexOf('AccountSettings') !== -1)) {\r\n this._redirectedFromUrl = fromUrl.slice();\r\n //Add an extra element to the URL containing Angular's custom query params (the ; separated parts)\r\n for (let k in routeModel.params) {\r\n if (routeModel.urlWithParameterPlaceholders.indexOf(':' + k) == -1) {\r\n if (this._redirectedFromUrl.length == routeModel.urlWithParameterPlaceholders.length) {\r\n this._redirectedFromUrl.push({});\r\n }\r\n\r\n this._redirectedFromUrl[this._redirectedFromUrl.length - 1][k] = routeModel.params[k];\r\n }\r\n }\r\n this._queryParams = routeModel?.queryParams;\r\n }\r\n\r\n //We only want to use the case branding for the login page\r\n //if the user isn't in the main Stingray site. If the user\r\n //is in Stingray, then we have to use Winston branding.\r\n if (fromUrl && fromUrl.indexOf('Login') !== -1) {\r\n const caseName = this._currentCaseService.getCurrentCaseName();\r\n\r\n if (caseName) {\r\n this._router.navigate(['/' + caseName + '/Login']);\r\n return;\r\n }\r\n }\r\n\r\n this._router.navigate(['/Login']);\r\n }\r\n\r\n public getRedirectedFromUrl(): any[] | undefined {\r\n return this._redirectedFromUrl;\r\n }\r\n\r\n public getQueryParams(): { [key: string]: string } | undefined {\r\n return this._queryParams;\r\n }\r\n\r\n public clearRedirectedFromUrl(): void {\r\n this._redirectedFromUrl = undefined;\r\n this._queryParams = undefined;\r\n }\r\n\r\n private getRouteModel(redirectedFromRoute?: ActivatedRouteSnapshot): ActivatedRouteModel | undefined {\r\n return this._routeModelService.getRouteModel(redirectedFromRoute || this._router.routerState.snapshot.root);\r\n }\r\n}\r\n\r\n\r\n","import { HttpClient, HttpHeaders } from \"@angular/common/http\";\r\nimport { Injectable } from \"@angular/core\";\r\nimport { RefreshTokenModel } from \"@modules/api/refresh-token-model.generated\";\r\nimport { UserSession } from \"@modules/api/user-session.generated\";\r\nimport { ApiCallUrlService } from \"@modules/common/services/api-call-url.service\";\r\nimport { Observable } from \"rxjs\";\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class RefreshSessionService {\r\n constructor(\r\n private _httpClient: HttpClient,\r\n private _apiCallUrlService: ApiCallUrlService\r\n ) { }\r\n\r\n public refreshSession(args: { authenticationToken: string, refreshToken: RefreshTokenModel }): Observable {\r\n return this._httpClient.post(\r\n this._apiCallUrlService.getUrl('/Login/RefreshSession/RefreshSession', false),\r\n args.refreshToken,\r\n { headers: this.getHeaders(args.authenticationToken) }\r\n );\r\n }\r\n\r\n private getHeaders(authenticationToken: string): HttpHeaders {\r\n const headers: any = {};\r\n headers['Content-Type'] = 'Application/json';\r\n headers['Authorization'] = 'Bearer ' + authenticationToken;\r\n return new HttpHeaders(headers);\r\n }\r\n}\r\n","import { Injectable } from \"@angular/core\";\r\nimport { ActivatedRouteModel } from '@modules/common/models/activated-route-model';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class ReplaceRouteParameterService {\r\n public replaceRouteParameter(args: { route: ActivatedRouteModel, paramName: string, paramValue: string, leaveOutEmptyParameter?: boolean }): string[] {\r\n const result: string[] = [];\r\n for (let i = 0; i < args.route.urlWithParameterPlaceholders.length; i++) {\r\n if (args.route.urlWithParameterPlaceholders[i].startsWith(':')) {\r\n if (args.paramName == args.route.urlWithParameterPlaceholders[i].substring(1)) {\r\n if (args.paramValue || !args.leaveOutEmptyParameter) {\r\n result.push(args.paramValue);\r\n }\r\n } else {\r\n result.push(args.route.params[args.route.urlWithParameterPlaceholders[i].substring(1)]);\r\n }\r\n } else {\r\n result.push(args.route.urlWithParameterPlaceholders[i]);\r\n }\r\n }\r\n\r\n return result;\r\n }\r\n}\r\n","import { Injectable } from \"@angular/core\";\r\nimport { ActivatedRouteSnapshot } from \"@angular/router\";\r\nimport { ActivatedRouteModel } from '@modules/common/models/activated-route-model';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class RouteModelService {\r\n /**\r\n * Transform an Angular ActivatedRouteSnapshot\r\n * into the custom ActivatedRouteModel\r\n */\r\n public getRouteModel(activatedRouteSnapshot: ActivatedRouteSnapshot): ActivatedRouteModel {\r\n let route: ActivatedRouteSnapshot | null = activatedRouteSnapshot;\r\n\r\n const result = {\r\n params: {},\r\n queryParams: {},\r\n urlWithParameterPlaceholders: [],\r\n urlWithPopulatedParameters: [],\r\n };\r\n\r\n if (route && route!.queryParams!) {\r\n for (let k in route!.queryParams!) {\r\n result.queryParams[k] = route!.queryParams[k];\r\n }\r\n }\r\n\r\n while (route && route.parent) {\r\n route = route.parent;\r\n }\r\n\r\n while (route) {\r\n var split = route.routeConfig\r\n && route.routeConfig.path\r\n && route.routeConfig.path.split('/');\r\n\r\n if (split && split.length && route.url && route.url.length == split.length) {\r\n for (let i = 0; i < split.length; i++) {\r\n result.urlWithParameterPlaceholders.push(split[i]);\r\n result.urlWithPopulatedParameters.push(route.url[i].path);\r\n }\r\n }\r\n\r\n if (route.params) {\r\n for (let k in route.params) {\r\n result.params[k] = route.params[k];\r\n }\r\n }\r\n\r\n if (route.data) {\r\n result.data = Object.assign(result.data || {}, route.data);\r\n }\r\n\r\n route = route.firstChild;\r\n }\r\n\r\n return result;\r\n }\r\n}\r\n","import { Injectable } from \"@angular/core\";\r\nimport { MatSnackBar, MatSnackBarRef, TextOnlySnackBar } from \"@angular/material/snack-bar\";\r\nimport { ShowSnackbarArgs } from \"@modules/common/models/show-snackbar-args\";\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class SnackbarService {\r\n constructor(private _matSnackBar: MatSnackBar) { }\r\n\r\n public open(args: ShowSnackbarArgs): MatSnackBarRef {\r\n return this._matSnackBar.open(args.message, args.action || 'GOT IT', {\r\n duration: args.duration || 60000\r\n });\r\n }\r\n}\r\n","import { Injectable } from \"@angular/core\";\r\nimport { CrossTabCommunicationHandler } from \"@modules/common/models/cross-tab-communication-handler\";\r\n\r\ndeclare global {\r\n interface Window {\r\n attachEvent: (eventName: string, callback: (e: StorageEvent) => void) => void;\r\n }\r\n}\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class CrossTabCommunicationService {\r\n constructor() {\r\n if (window.addEventListener) {\r\n window.addEventListener('storage', e => this.onStorage(e));\r\n } else if (window.attachEvent) {\r\n window.attachEvent('onStorage', e => this.onStorage(e));\r\n }\r\n }\r\n\r\n public register(handler: CrossTabCommunicationHandler): void {\r\n this._handlers[handler.key] = this._handlers[handler.key] || [];\r\n this._handlers[handler.key].push(handler);\r\n }\r\n\r\n public sendMessage(msg: { key: string, msg: any }): void {\r\n let json = JSON.stringify(msg.msg);\r\n localStorage.setItem(msg.key, json);\r\n localStorage.removeItem(msg.key);\r\n }\r\n\r\n private onStorage(e: StorageEvent): void {\r\n e = e || window.event as StorageEvent;\r\n if (e && e.key) {\r\n let handlers = this._handlers[e.key];\r\n if (handlers) {\r\n for (let handler of handlers) {\r\n handler.handler(e);\r\n }\r\n }\r\n }\r\n }\r\n\r\n private _handlers: { [key: string]: CrossTabCommunicationHandler[] } = {};\r\n}\r\n","import { Injectable } from \"@angular/core\";\r\n\r\nconst key = 'tabcount';\r\n\r\n/**\r\n * Service to keep track of how many browser tabs the\r\n * user has open.\r\n */\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class TabRegistrationService {\r\n /**\r\n * Initialize the tab registration service.\r\n */\r\n public initialize(): void {\r\n if (!this._initialized) {\r\n this.register();\r\n window.addEventListener('unload', () => this.unregister());\r\n this._initialized = true;\r\n }\r\n }\r\n\r\n private _initialized = false;\r\n\r\n /**\r\n * Record the fact that the user has opened the current tab.\r\n */\r\n private register(): void {\r\n localStorage.setItem(key, (this.getInstanceCount() + 1).toString());\r\n }\r\n\r\n /**\r\n * Record the fact that the user is closing this tab.\r\n */\r\n private unregister(): void {\r\n localStorage.setItem(key, (Math.max(this.getInstanceCount() - 1, 0)).toString());\r\n }\r\n\r\n /**\r\n * Get the number of browser tabs the user has open, including\r\n * the current tab. If this is the only tab, this function\r\n * returns 1. If this function returns 0, then you probably\r\n * forgot to call initialize(), or localStorage is disabled.\r\n */\r\n public getInstanceCount(): number {\r\n let serializedCount = localStorage.getItem(key);\r\n return serializedCount ? parseInt(serializedCount) : 0;\r\n }\r\n}\r\n","import { Injectable } from \"@angular/core\";\r\nimport { UserSession } from \"@modules/api/user-session.generated\";\r\nimport { CrossTabCommunicationService } from \"@modules/common/services/cross-tab-communication.service\";\r\nimport { TabRegistrationService } from \"@modules/common/services/tab-registration.service\";\r\nimport { Observable, of as observableOf, ReplaySubject } from 'rxjs';\r\n\r\n/**\r\n * Service to maintain the client-side copy of \r\n * the user's session information.\r\n */\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class UserSessionService {\r\n constructor(\r\n private _crossTabCommunicationService: CrossTabCommunicationService,\r\n private _tabRegistrationService: TabRegistrationService\r\n ) { }\r\n\r\n /**\r\n * Initialize the user session service. Called during app start.\r\n * This function loads the user session stored in sessionStorage\r\n * and initializes all of the mechanisms used to synchronize\r\n * sessions across browser tabs.\r\n */\r\n public initialize(): Promise {\r\n this._tabRegistrationService.initialize();\r\n this.wireupCrossTabCommunications();\r\n this.loadSavedUserSession();\r\n //If we couldn't load a user session from session storage\r\n //and there's more than one tab open, then let's wait a\r\n //little while to see if the other tab will send us the\r\n //session info, which was requested in loadSavedUserSession().\r\n if (!this._userSession\r\n && this._tabRegistrationService.getInstanceCount() > 1\r\n && localStorage.getItem('is-user-logged-in')) { \r\n return new Promise(resolve => {\r\n this._initializationPromiseResolver = resolve;\r\n\r\n //Give the other tabs 10 seconds to send us the session info\r\n //and if we don't have it by then then just give up.\r\n\r\n if (!this._initializationTimeout) {\r\n this._initializationTimeout = setTimeout(() => {\r\n if (this._initializationPromiseResolver) {\r\n this._initializationPromiseResolver(undefined);\r\n }\r\n\r\n this._initializationTimeout = undefined;\r\n this._userSessionSubject.next(this._userSession);\r\n\r\n }, 10000); // 10 seconds\r\n }\r\n }); \r\n } else {\r\n this._userSessionSubject.next(this._userSession);\r\n }\r\n\r\n return new Promise(resolve => resolve(undefined));\r\n }\r\n\r\n private _initializationPromiseResolver?: (value: any) => void;\r\n private _initializationTimeout: any;\r\n private _userSession?: UserSession;\r\n\r\n /**\r\n * Load the user session saved in session storage\r\n * and if it doesn't exist then send a cross tab\r\n * request to get the info from another tab.\r\n */\r\n private loadSavedUserSession(): void {\r\n\r\n const json = sessionStorage.getItem('userSession');\r\n this._userSession = json && this.jsonParse(json);\r\n\r\n if (!this._userSession) {\r\n this._crossTabCommunicationService.sendMessage({\r\n key: 'GET_SESSION',\r\n msg: {}\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Register event handlers for cross tab commmunications.\r\n */\r\n private wireupCrossTabCommunications(): void {\r\n this._crossTabCommunicationService.register({\r\n key: 'GET_SESSION',\r\n handler: () => this._crossTabCommunicationService.sendMessage({\r\n key: 'SET_SESSION',\r\n msg: this.getUserSession()\r\n })\r\n });\r\n\r\n this._crossTabCommunicationService.register({\r\n key: 'SET_SESSION',\r\n handler: e => e.newValue && this.internalSetUserSession(this.jsonParse(e.newValue), false)\r\n });\r\n }\r\n\r\n /**\r\n * Retrieve the current UserSession instance, if\r\n * there is one. Returns undefined if no session\r\n * info exists. Not that this function still\r\n * returns the session even if it's expired.\r\n */\r\n public getUserSession(): UserSession | undefined {\r\n return this._userSession;\r\n }\r\n\r\n /**\r\n * A subscribable version of getUserSession()\r\n */\r\n public userSessionChanged(): Observable {\r\n return this._userSessionSubject;\r\n }\r\n\r\n /**\r\n * Updates the global UserSession object.\r\n * @param userSession The new UserSession object.\r\n */\r\n public setUserSession(userSession: UserSession): void {\r\n this.internalSetUserSession(userSession, true);\r\n }\r\n\r\n /**\r\n * Signs out the current user and destroys their session.\r\n */\r\n public signOut(): Observable {\r\n this.internalSetUserSession(undefined, true);\r\n return observableOf([]);\r\n }\r\n\r\n private internalSetUserSession(userSession?: UserSession, broadcast?: boolean) {\r\n this._userSession = userSession;\r\n if (userSession) {\r\n localStorage.setItem('is-user-logged-in', 'true');\r\n sessionStorage.setItem('userSession', JSON.stringify(userSession));\r\n } else {\r\n localStorage.removeItem('is-user-logged-in');\r\n sessionStorage.removeItem('userSession');\r\n }\r\n if (broadcast) {\r\n this._crossTabCommunicationService.sendMessage({\r\n key: 'SET_SESSION',\r\n msg: this._userSession\r\n });\r\n }\r\n\r\n //If this function is being called during initialize()\r\n //then we also need to resolve the initializer promise.\r\n if (this._initializationPromiseResolver) {\r\n this._initializationPromiseResolver(undefined);\r\n this._initializationPromiseResolver = undefined;\r\n }\r\n //and cancel the initialize() timeout.\r\n if (this._initializationTimeout) {\r\n clearTimeout(this._initializationTimeout);\r\n this._initializationTimeout = undefined;\r\n }\r\n\r\n this._userSessionSubject.next(userSession);\r\n }\r\n\r\n private jsonParse(json: string): any {\r\n try {\r\n return JSON.parse(json);\r\n } catch (ex) { }\r\n }\r\n\r\n private _userSessionSubject = new ReplaySubject(1);\r\n}\r\n","
\r\n
\r\n \r\n {{isVerified ? 'Participant Authenticated' : 'Participant NOT Authenticated'}}\r\n \r\n \r\n \r\n \r\n
\r\n \r\n
\r\n \r\n {{participantName | async}}\r\n \r\n \r\n has successfully been pre authenticated.\r\n \r\n
\r\n
\r\n
\r\n
\r\n \r\n {{participantName | async}}\r\n \r\n \r\n has NOT been authenticated.\r\n \r\n
\r\n
\r\n Identity verification is required before providing assistance.\r\n
\r\n
\r\n
\r\n
\r\n Employee Authentication Information\r\n
\r\n
\r\n Date of Birth - {{(dateOfBirth | async) | date:'MM/dd/yyyy'}}\r\n
\r\n
\r\n Last 4 SSN - {{ssnLastFour | async}}\r\n
\r\n
\r\n Address - {{address | async}}\r\n
\r\n
\r\n
\r\n
\r\n \r\n \r\n \r\n
","import { Component } from \"@angular/core\";\r\nimport { CurrentPhoneCallService } from \"@modules/participant-shared/services/current-phone-call.service\";\r\nimport { map, Observable } from \"rxjs\";\r\n\r\n/**\r\n * Dialog component to show the user whether the current participant is verified during a phone call.\r\n */\r\n@Component({\r\n selector: 'app-participant-phone-call-is-verified-dialog',\r\n templateUrl: './participant-phone-call-is-verified-dialog.component.html',\r\n styleUrls: ['./participant-phone-call-is-verified-dialog.component.scss'],\r\n})\r\nexport class ParticipantPhoneCallIsVerifiedDialogComponent {\r\n public readonly isVerified: boolean;\r\n public readonly participantName: Observable;\r\n public readonly dateOfBirth: Observable;\r\n public readonly ssnLastFour: Observable;\r\n public readonly address: Observable;\r\n\r\n constructor(\r\n currentPhoneCallService: CurrentPhoneCallService,\r\n ) {\r\n this.isVerified = currentPhoneCallService.isParticipantVerified();\r\n\r\n this.participantName = currentPhoneCallService.currentPhoneCallChanged()\r\n .pipe(map(phoneCall => phoneCall?.participantName));\r\n this.dateOfBirth = currentPhoneCallService.currentPhoneCallChanged()\r\n .pipe(map(phoneCall => phoneCall?.dateOfBirth));\r\n this.ssnLastFour = currentPhoneCallService.currentPhoneCallChanged()\r\n .pipe(map(phoneCall => phoneCall?.ssnLastFour));\r\n this.address = currentPhoneCallService.currentPhoneCallChanged()\r\n .pipe(map(phoneCall => phoneCall?.address));\r\n }\r\n}","import { Injectable } from '@angular/core';\r\nimport { Observable } from 'rxjs';\r\nimport { ConcurrentRequestHandlingService } from '@modules/common/services/concurrent-request-handling.service';\r\nimport { ApiProxyOptions } from '@modules/common/models/api-proxy-options';\r\nimport { UpdatePhoneCallArgs } from './update-phone-call-args.generated';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class UpdatePhoneCallService {\r\n constructor(private _concurrentRequestHandlingService: ConcurrentRequestHandlingService) { }\r\n\r\n public updatePhoneCall(args: UpdatePhoneCallArgs, options?: ApiProxyOptions): Observable {\r\n return this._concurrentRequestHandlingService.callApi(\r\n \"UpdatePhoneCallService_updatePhoneCall\",\r\n {\r\n url: '/Participant/UpdatePhoneCall/UpdatePhoneCall',\r\n body: typeof args === 'undefined' || args === null ? {} : args,\r\n sendCredentials: true\r\n }, options\r\n );\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { Observable } from 'rxjs';\r\nimport { ConcurrentRequestHandlingService } from '@modules/common/services/concurrent-request-handling.service';\r\nimport { ApiProxyOptions } from '@modules/common/models/api-proxy-options';\r\nimport { GetPhoneCallParticipantInfoArgs } from './get-phone-call-participant-info-args.generated';\r\nimport { GetPhoneCallParticipantInfoResult } from './get-phone-call-participant-info-result.generated';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class GetPhoneCallParticipantInfoService {\r\n constructor(private _concurrentRequestHandlingService: ConcurrentRequestHandlingService) { }\r\n\r\n public getPhoneCallParticipantInfo(args: GetPhoneCallParticipantInfoArgs, options?: ApiProxyOptions): Observable {\r\n return this._concurrentRequestHandlingService.callApi(\r\n \"GetPhoneCallParticipantInfoService_getPhoneCallParticipantInfo\",\r\n {\r\n url: '/Participant/GetPhoneCallParticipantInfo/GetPhoneCallParticipantInfo',\r\n body: typeof args === 'undefined' || args === null ? {} : args,\r\n sendCredentials: true\r\n }, options\r\n );\r\n }\r\n}\r\n","import { Injectable } from \"@angular/core\";\r\nimport { CurrentRouteService } from \"@modules/common/services/current-route.service\";\r\n\r\n/**\r\n * Service to get the participant id from the current route, if there is one.\r\n */\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class GetParticipantIdFromRouteService {\r\n constructor(private readonly _currentRouteService: CurrentRouteService) { }\r\n\r\n /**\r\n * Returns the participant id from the current route, or undefined if the current route\r\n * does not have a participant id.\r\n */\r\n public getParticipantIdFromRoute(): number | undefined {\r\n const participantIdString = this._currentRouteService.getCurrentRoute().params.participantId;\r\n if (!participantIdString) {\r\n return undefined;\r\n }\r\n return parseInt(participantIdString);\r\n }\r\n}","import { Injectable } from \"@angular/core\";\r\nimport { NavigationEnd, Router } from \"@angular/router\";\r\nimport { GetParticipantIdFromRouteService } from \"@modules/participant-shared/services/get-participant-id-from-route.service\";\r\nimport { filter, map, Observable, Subject, tap } from \"rxjs\";\r\n\r\n/**\r\n * Service to track the most recent participant id based on the route.\r\n */\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class MostRecentParticipantIdService {\r\n /**\r\n * Subject to emit participant id changes.\r\n */\r\n private readonly _participantIdChangedSubject: Subject = new Subject();\r\n \r\n /**\r\n * The most recent participant id based on the route, or undefined if the route\r\n * has never had a participant id in it. Only changes if the new route has a\r\n * participant id in it.\r\n */\r\n private _mostRecentParticipantId: number | undefined;\r\n \r\n constructor(\r\n private readonly _getParticipantIdFromRouteService: GetParticipantIdFromRouteService,\r\n router: Router,\r\n ) {\r\n this._mostRecentParticipantId = this._getParticipantIdFromRouteService.getParticipantIdFromRoute();\r\n\r\n //Subscribe to route changes that have a participant id, and emit the participant id\r\n //whenever it is different from the most recent participant id.\r\n router\r\n .events\r\n .pipe(\r\n filter(event => event instanceof NavigationEnd),\r\n map(() => this._getParticipantIdFromRouteService.getParticipantIdFromRoute()),\r\n filter(currentParticipantId => !!currentParticipantId && currentParticipantId != this._mostRecentParticipantId),\r\n map(currentParticipantId => currentParticipantId!),\r\n tap(currentParticipantId => this._mostRecentParticipantId = currentParticipantId)\r\n )\r\n .subscribe(this._participantIdChangedSubject);\r\n }\r\n\r\n /**\r\n * Returns the most recent participant id based on the route, or undefined if the\r\n * route has never had a participant id in it. Only changes if the new route has\r\n * a participant id in it.\r\n */\r\n public getMostRecentParticipantId(): number | undefined {\r\n return this._mostRecentParticipantId;\r\n }\r\n\r\n /**\r\n * Returns an observable that emits the most recent participant id based on the route\r\n * whenever it changes. Only emits if the new route has a participant id in it.\r\n */\r\n public participantIdChanged(): Observable {\r\n return this._participantIdChangedSubject.asObservable();\r\n }\r\n}","import { Injectable } from \"@angular/core\";\r\nimport { MatDialog } from \"@angular/material/dialog\";\r\nimport { GetPhoneCallParticipantInfoService } from \"@modules/api/get-phone-call-participant-info.service.generated\";\r\nimport { UpdatePhoneCallService } from \"@modules/api/update-phone-call.service.generated\";\r\nimport { UserSession } from \"@modules/api/user-session.generated\";\r\nimport { CurrentEnvironmentService } from \"@modules/common/services/current-environment.service\";\r\nimport { UserSessionService } from \"@modules/common/services/user-session.service\";\r\nimport { ParticipantPhoneCallIsVerifiedDialogComponent } from \"@modules/participant-shared/components/participant-phone-call-is-verified-dialog/participant-phone-call-is-verified-dialog.component\";\r\nimport { PhoneCallParticipantInfo } from \"@modules/participant-shared/models/phone-call-participant-info\";\r\nimport { SetCurrentPhoneCallArgs } from \"@modules/participant-shared/models/set-current-phone-call-args\";\r\nimport { MostRecentParticipantIdService } from \"@modules/participant-shared/services/most-recent-participant-id.service\";\r\nimport { BehaviorSubject, Observable, skip, Subscription } from \"rxjs\";\r\n\r\n/**\r\n * Service to keep track of information related to the current phone call.\r\n * The user can be considered to be in a phone call if they arrive at Stingray from Five9.\r\n * Information is stored in sessionStorage to keep it scoped to one browser tab and\r\n * persist across page refreshes.\r\n */\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class CurrentPhoneCallService {\r\n /**\r\n * Key for sessionStorage data.\r\n */\r\n private readonly _sessionStorageKey: string = 'CurrentPhoneCallService';\r\n\r\n /**\r\n * Subject that emits the phone call info.\r\n */\r\n private readonly _phoneCallParticipantInfoSubject = new BehaviorSubject(undefined);\r\n\r\n private _subscriptions: Subscription[] = [];\r\n\r\n constructor(\r\n private readonly _updatePhoneCallService: UpdatePhoneCallService,\r\n private readonly _getPhoneCallParticipantInfoService: GetPhoneCallParticipantInfoService,\r\n private readonly _mostRecentParticipantIdService: MostRecentParticipantIdService,\r\n private readonly _dialog: MatDialog,\r\n private readonly _userSessionService: UserSessionService,\r\n private readonly _currentEnvironmentService: CurrentEnvironmentService,\r\n ) {\r\n //Handle initialization that only needs to happen when the page is refreshed during a phone call.\r\n //This would otherwise be handled in setCurrentPhoneCall.\r\n if (this.isCurrentlyInPhoneCall()) {\r\n //Create subscriptions to handle changes as needed.\r\n this._subscriptions = this.createSubscriptions();\r\n\r\n //If there is phone call info in session storage, initialize the subject with it.\r\n if (this.phoneCallParticipantInfo) {\r\n this.emitParticipantInfo(this.phoneCallParticipantInfo);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Returns whether the user is currently in a phone call.\r\n */\r\n public isCurrentlyInPhoneCall(): boolean {\r\n return !!this.callHistoryId;\r\n }\r\n\r\n /**\r\n * Returns an observable that emits information for the current phone call, or undefined if\r\n * there is no current phone call. Emits once upon subscription and once every time the\r\n * current phone call information changes. The current phone call information changes when\r\n * the phone call starts, when the user navigates to a page for a different participant\r\n * while on a phone call, and when the phone call ends (in this context, \"ends\" just means\r\n * that Stingray is no longer able to track the phone call, not necessarily that either\r\n * party has hung up the actual phone call).\r\n */\r\n public currentPhoneCallChanged(): Observable {\r\n return this._phoneCallParticipantInfoSubject.asObservable();\r\n }\r\n\r\n /**\r\n * Sets the current phone call using the given information. This method should only be called once,\r\n * when the site first becomes aware that the user is in a phone call.\r\n */\r\n public setCurrentPhoneCall(args: SetCurrentPhoneCallArgs): void {\r\n if (this.isCurrentlyInPhoneCall()) {\r\n return; //This shouldn't happen, but let's prevent it anyway\r\n }\r\n\r\n this.callHistoryId = args.callHistoryId;\r\n this.participantId = args.participantId;\r\n if (args.piiMatches) {\r\n this.verifiedParticipantId = args.participantId;\r\n }\r\n\r\n //Create subscriptions to handle changes as needed.\r\n this._subscriptions = this.createSubscriptions();\r\n \r\n //Initialize the participant info if possible. Otherwise, just emit empty participant info.\r\n if (this.participantId) {\r\n this.updateParticipantInfoAndShowVerificationDialog(this.participantId);\r\n } else {\r\n this.setAndEmitParticipantInfo({\r\n participantName: undefined,\r\n employeeId: undefined,\r\n dateOfBirth: undefined,\r\n ssnLastFour: undefined,\r\n address: undefined,\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Returns true if the current phone call participant is verified, false if they are\r\n * not verified or if there is no current phone call participant.\r\n * A verified participant is one that correctly provided their PII when calling in.\r\n */\r\n public isParticipantVerified(): boolean {\r\n return !!this.participantId && !!this.verifiedParticipantId && this.participantId == this.verifiedParticipantId;\r\n }\r\n\r\n private createSubscriptions(): Subscription[] {\r\n return [\r\n this.createParticipantIdChangedSubscription(),\r\n this.createUserSessionChangedSubscription(),\r\n this.createEnvironmentChangedSubscription(),\r\n ];\r\n }\r\n\r\n private createParticipantIdChangedSubscription(): Subscription {\r\n return this._mostRecentParticipantIdService.participantIdChanged()\r\n .subscribe(participantId => this.handleParticipantIdChanged(participantId));\r\n }\r\n\r\n private handleParticipantIdChanged(participantId: number): void {\r\n //Check that the new participant is actually different from the phone call participant id.\r\n //Note that storing the phone call participant id separately is only necessary because\r\n //this service may become aware of the participant id BEFORE it gets put in the URL, and\r\n //we don't want to update the phone call info twice on the first navigation.\r\n if (this.participantId == participantId) {\r\n return;\r\n }\r\n\r\n //The participant id is being changed. Associate this phone call with the new participant,\r\n //emit the new participant info, and show the verification dialog.\r\n\r\n this.participantId = participantId;\r\n\r\n this._updatePhoneCallService.updatePhoneCall({\r\n callHistoryId: this.callHistoryId!,\r\n participantId: this.participantId,\r\n });\r\n\r\n this.updateParticipantInfoAndShowVerificationDialog(this.participantId);\r\n }\r\n\r\n private updateParticipantInfoAndShowVerificationDialog(participantId: number): void {\r\n //Fetch the participant info from the database.\r\n this._getPhoneCallParticipantInfoService.getPhoneCallParticipantInfo({\r\n participantId: participantId,\r\n }).subscribe(result => {\r\n //Emit the new participant info.\r\n this.setAndEmitParticipantInfo({\r\n participantName: result.participantName,\r\n employeeId: result.employeeId,\r\n dateOfBirth: result.dateOfBirth,\r\n ssnLastFour: result.ssnLastFour,\r\n address: result.address,\r\n });\r\n\r\n //Show the dialog that shows the user whether the new participant is verified.\r\n this._dialog.open(ParticipantPhoneCallIsVerifiedDialogComponent);\r\n });\r\n }\r\n\r\n private setAndEmitParticipantInfo(phoneCallParticipantInfo: PhoneCallParticipantInfo | undefined): void {\r\n this.phoneCallParticipantInfo = phoneCallParticipantInfo;\r\n this.emitParticipantInfo(phoneCallParticipantInfo);\r\n }\r\n\r\n private emitParticipantInfo(phoneCallParticipantInfo: PhoneCallParticipantInfo | undefined): void {\r\n this._phoneCallParticipantInfoSubject.next(phoneCallParticipantInfo);\r\n }\r\n\r\n private createUserSessionChangedSubscription(): Subscription {\r\n return this._userSessionService.userSessionChanged()\r\n .subscribe(userSession => this.handleUserSessionChanged(userSession));\r\n }\r\n\r\n private handleUserSessionChanged(userSession: UserSession | undefined): void {\r\n //End the phone call if the user logs out.\r\n if (!userSession) {\r\n this.endPhoneCall();\r\n }\r\n }\r\n\r\n private createEnvironmentChangedSubscription(): Subscription {\r\n return this._currentEnvironmentService.environmentChanged\r\n .pipe(skip(1)) //environmentChanged emits on subscription, ignore that\r\n .subscribe(() => this.handleEnvironmentChanged());\r\n }\r\n\r\n private handleEnvironmentChanged(): void {\r\n //The current phone call info is only valid for the current environment,\r\n //so end the phone call if the environment changes.\r\n this.endPhoneCall();\r\n }\r\n\r\n private endPhoneCall(): void {\r\n //Remove all session storage data and emit the end of the phone call.\r\n this.removeSessionStorageData();\r\n this.emitParticipantInfo(this.phoneCallParticipantInfo);\r\n\r\n //Clean up subscriptions.\r\n for (let subscription of this._subscriptions) {\r\n subscription.unsubscribe();\r\n }\r\n this._subscriptions = [];\r\n }\r\n\r\n /**\r\n * Session storage for call history id.\r\n * See {@link CurrentPhoneCallServiceSessionStorageData.callHistoryId}.\r\n */\r\n private get callHistoryId(): number | undefined {\r\n return this.getSessionStorageData()?.callHistoryId;\r\n }\r\n\r\n private set callHistoryId(callHistoryId: number | undefined) {\r\n this.updateSessionStorageData(sessionStorageData => sessionStorageData.callHistoryId = callHistoryId);\r\n }\r\n\r\n /**\r\n * Session storage for participant id.\r\n * See {@link CurrentPhoneCallServiceSessionStorageData.participantId}.\r\n */\r\n private get participantId(): number | undefined {\r\n return this.getSessionStorageData()?.participantId;\r\n }\r\n\r\n private set participantId(participantId: number | undefined) {\r\n this.updateSessionStorageData(sessionStorageData => sessionStorageData.participantId = participantId);\r\n }\r\n\r\n /**\r\n * Session storage for verified participant id.\r\n * See {@link CurrentPhoneCallServiceSessionStorageData.verifiedParticipantId}.\r\n */\r\n private get verifiedParticipantId(): number | undefined {\r\n return this.getSessionStorageData()?.verifiedParticipantId;\r\n }\r\n\r\n private set verifiedParticipantId(verifiedParticipantId: number | undefined) {\r\n this.updateSessionStorageData(sessionStorageData => sessionStorageData.verifiedParticipantId = verifiedParticipantId);\r\n }\r\n\r\n /**\r\n * Session storage for participant info.\r\n * See {@link CurrentPhoneCallServiceSessionStorageData.phoneCallParticipantInfo}.\r\n */\r\n private get phoneCallParticipantInfo(): PhoneCallParticipantInfo | undefined {\r\n return this.getSessionStorageData()?.phoneCallParticipantInfo;\r\n }\r\n\r\n private set phoneCallParticipantInfo(phoneCallParticipantInfo: PhoneCallParticipantInfo | undefined) {\r\n this.updateSessionStorageData(sessionStorageData => sessionStorageData.phoneCallParticipantInfo = phoneCallParticipantInfo);\r\n }\r\n\r\n private getSessionStorageData(): CurrentPhoneCallServiceSessionStorageData | undefined {\r\n const serializedSessionStorageData = sessionStorage.getItem(this._sessionStorageKey);\r\n return serializedSessionStorageData ? JSON.parse(serializedSessionStorageData) : undefined;\r\n }\r\n\r\n private updateSessionStorageData(update: (sessionStorageData: CurrentPhoneCallServiceSessionStorageData) => void): void {\r\n //Get the session storage data, or create it if it doesn't exist yet.\r\n let sessionStorageData = this.getSessionStorageData();\r\n if (!sessionStorageData) {\r\n sessionStorageData = {\r\n callHistoryId: undefined,\r\n participantId: undefined,\r\n verifiedParticipantId: undefined,\r\n phoneCallParticipantInfo: undefined,\r\n };\r\n }\r\n\r\n //Apply the given update to the session storage data, then save it in session storage.\r\n update(sessionStorageData);\r\n sessionStorage.setItem(this._sessionStorageKey, JSON.stringify(sessionStorageData));\r\n }\r\n\r\n private removeSessionStorageData(): void {\r\n sessionStorage.removeItem(this._sessionStorageKey);\r\n }\r\n}\r\n\r\ninterface CurrentPhoneCallServiceSessionStorageData {\r\n /**\r\n * The id of the current phone call, or undefined if there is no current phone call.\r\n */\r\n callHistoryId: number | undefined,\r\n \r\n /**\r\n * The id of the participant of the current phone call, or undefined if we don't yet\r\n * know who the participant is, or if there is no current phone call.\r\n */\r\n participantId: number | undefined,\r\n\r\n /**\r\n * The id of the verified participant, or undefined if no participant was verified.\r\n */\r\n verifiedParticipantId: number | undefined,\r\n\r\n /**\r\n * Info for the participant of the current phone call, or undefined if the info has not\r\n * yet been fetched, or if there is no current phone call.\r\n */\r\n phoneCallParticipantInfo: PhoneCallParticipantInfo | undefined,\r\n}","export const environment = {\r\n production: true\r\n};\r\n\r\nexport const APPLICATION_INSIGHTS_CONNECTION_STRING = 'InstrumentationKey=00000000-0000-0000-0000-000000000004;IngestionEndpoint=https://telemetry.winstonfinancial.com/';\r\n","import { Injectable } from '@angular/core';\r\nimport { ApplicationInsights } from '@microsoft/applicationinsights-web';\r\nimport { APPLICATION_INSIGHTS_CONNECTION_STRING } from 'src/environments/environment';\r\nimport { UserSessionService } from '@modules/common/services/user-session.service';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class AppInsightsService {\r\n private _appInsights?: ApplicationInsights;\r\n\r\n constructor(private readonly _userSessionService: UserSessionService) { }\r\n\r\n public initialize(): void {\r\n try {\r\n if (APPLICATION_INSIGHTS_CONNECTION_STRING) {\r\n this._appInsights = new ApplicationInsights({\r\n config: {\r\n connectionString: APPLICATION_INSIGHTS_CONNECTION_STRING,\r\n extensionConfig: {\r\n AppInsightsCfgSyncPlugin: {\r\n cfgUrl: '' //Prevent loading a file from MS CDN - https://github.com/microsoft/ApplicationInsights-JS/blob/main/docs/WebConfig.md#disable-fetching-from-cdn\r\n }\r\n }\r\n }\r\n });\r\n\r\n this._appInsights.loadAppInsights();\r\n\r\n this._appInsights.addTelemetryInitializer(envelope => {\r\n envelope.data ||= {};\r\n envelope.data.UserId_CF = this._userSessionService.getUserSession()?.userInfo?.id?.toString();\r\n envelope.data.Email_CF = this._userSessionService.getUserSession()?.userInfo?.emailAddress;\r\n });\r\n }\r\n } catch (e) {\r\n console.error('Application Insights failed to start ' + e);\r\n this._appInsights = undefined;\r\n }\r\n }\r\n\r\n public trackException(exception: Error): void {\r\n this._appInsights?.trackException({\r\n exception: exception\r\n });\r\n }\r\n}\r\n","import { ErrorHandler, Injectable } from \"@angular/core\";\r\nimport { AppInsightsService } from \"@modules/common/services/app-insights.service\";\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class ErrorHandlerService implements ErrorHandler {\r\n constructor(\r\n private readonly _appInsightsService: AppInsightsService\r\n ) { }\r\n\r\n public handleError(error: any): void {\r\n console.error(error);\r\n this._appInsightsService.trackException(error);\r\n }\r\n}","/*\r\n * THIS IS A WORKAROUND. This fixes the stupid angular material datepicker\r\n * including a time in the date. Replace this with the useUtc option\r\n * once we have a version with this fix (looks like it's 6.3+).\r\n * https://github.com/angular/material2/issues/7167\r\n*/\r\n\r\nimport { Inject, Injectable, Optional } from '@angular/core';\r\nimport { MomentDateAdapter } from '@angular/material-moment-adapter';\r\nimport { MAT_DATE_LOCALE } from '@angular/material/core';\r\nimport * as moment from 'moment';\r\nimport { Moment } from 'moment';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class MomentUtcDateAdapter extends MomentDateAdapter {\r\n\r\n constructor(@Optional() @Inject(MAT_DATE_LOCALE) dateLocale: string) {\r\n super(dateLocale);\r\n }\r\n\r\n createDate(year: number, month: number, date: number): Moment {\r\n // Moment.js will create an invalid date if any of the components are out of bounds, but we\r\n // explicitly check each case so we can throw more descriptive errors.\r\n if (month < 0 || month > 11) {\r\n throw Error(`Invalid month index \"${month}\". Month index has to be between 0 and 11.`);\r\n }\r\n\r\n if (date < 1) {\r\n throw Error(`Invalid date \"${date}\". Date has to be greater than 0.`);\r\n }\r\n\r\n let result = moment.utc({ year, month, date }).locale(this.locale);\r\n\r\n // If the result isn't valid, the date must have been out of bounds for this month.\r\n if (!result.isValid()) {\r\n throw Error(`Invalid date \"${date}\" for month with index \"${month}\".`);\r\n }\r\n\r\n return result;\r\n }\r\n\r\n parse(value: any, parseFormat: string | string[]): Moment | null {\r\n if (value && typeof value == 'string') {\r\n return moment.utc(value, parseFormat).locale(this.locale);\r\n }\r\n return value ? moment.utc(value).locale(this.locale) : null;\r\n }\r\n\r\n today(): Moment {\r\n return moment.utc().locale(this.locale);\r\n }\r\n\r\n deserialize(value: any): Moment | null {\r\n let date;\r\n if (value instanceof Date) {\r\n date = moment(value);\r\n }\r\n if (typeof value === 'string') {\r\n if (!value) {\r\n return null;\r\n }\r\n date = moment.utc(value, moment.ISO_8601).locale(this.locale);\r\n }\r\n if (date && this.isValid(date)) {\r\n return date;\r\n }\r\n return super.deserialize(value);\r\n }\r\n}\r\n","import { CommonModule } from '@angular/common';\r\nimport { NgModule } from '@angular/core';\r\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { MatMenuModule } from '@angular/material/menu';\r\nimport { MatSelectModule } from '@angular/material/select';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\nimport { RouterModule } from '@angular/router';\r\nimport { StingrayCommonModule } from '@modules/common/common.module';\r\nimport { NavClientPickerComponent } from '@modules/navigation/components/nav-client-picker/nav-client-picker.component';\r\nimport { NavEnvMessageComponent } from '@modules/navigation/components/nav-env-message/nav-env-message.component';\r\nimport { NavEnvPickerComponent } from '@modules/navigation/components/nav-env-picker/nav-env-picker.component';\r\nimport { NavHeaderComponent } from '@modules/navigation/components/nav-header/nav-header.component';\r\nimport { NavLayoutComponent } from '@modules/navigation/components/nav-layout/nav-layout.component';\r\nimport { NavNewTabComponent } from '@modules/navigation/components/nav-new-tab/nav-new-tab.component';\r\nimport { NavPhoneCallBannerComponent } from '@modules/navigation/components/nav-phone-call-banner/nav-phone-call-banner.component';\r\nimport { NavSidebarComponent } from '@modules/navigation/components/nav-sidebar/nav-sidebar.component';\r\nimport { NavUserMenuComponent } from '@modules/navigation/components/nav-user-menu/nav-user-menu.component';\r\n\r\n@NgModule({\r\n declarations: [\r\n NavLayoutComponent,\r\n NavHeaderComponent,\r\n NavSidebarComponent,\r\n NavClientPickerComponent,\r\n NavNewTabComponent,\r\n NavUserMenuComponent,\r\n NavEnvPickerComponent,\r\n NavEnvMessageComponent,\r\n NavPhoneCallBannerComponent,\r\n ],\r\n imports: [\r\n CommonModule,\r\n FormsModule,\r\n ReactiveFormsModule,\r\n //Start Angular Material\r\n MatButtonModule,\r\n MatFormFieldModule,\r\n MatInputModule,\r\n MatMenuModule,\r\n MatSelectModule,\r\n MatTooltipModule,\r\n MatIconModule,\r\n //End Angular Material\r\n RouterModule,\r\n StingrayCommonModule\r\n ]\r\n})\r\nexport class NavigationModule {\r\n}\r\n","import { Component } from '@angular/core';\r\nimport { Location } from '@angular/common';\r\n\r\n@Component({\r\n selector: 'app-not-found',\r\n templateUrl: './not-found.component.html',\r\n styleUrls: ['./not-found.component.scss']\r\n})\r\n\r\nexport class NotFoundComponent { \r\n public copyrightYear: number;\r\n \r\n constructor(\r\n private _location: Location\r\n ) {\r\n\r\n this.copyrightYear = new Date().getFullYear();\r\n }\r\n\r\n public navigateBack(): void {\r\n this._location.back();\r\n }\r\n}","
\r\n
\r\n \"404\r\n\r\n
\r\n
\r\n\r\n \r\n\r\n
\r\n
\r\n
\r\n
\r\n","import { Injectable } from '@angular/core';\r\nimport { BehaviorSubject, Observable } from 'rxjs';\r\n\r\nconst STORAGE_KEY = 'ExpandNavSideBar';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class NavSidebarExpandedService {\r\n private _subject = new BehaviorSubject(this.getValue());\r\n\r\n constructor() { }\r\n\r\n public toggleExpanded(): void {\r\n const newValue = !this.getValue();\r\n localStorage.setItem(STORAGE_KEY, JSON.stringify(newValue));\r\n this._subject.next(newValue);\r\n }\r\n\r\n public get toggled(): Observable {\r\n return this._subject;\r\n }\r\n\r\n private getValue(): boolean {\r\n return JSON.parse(localStorage.getItem(STORAGE_KEY) || 'true');\r\n }\r\n\r\n\r\n}\r\n","import { Component } from '@angular/core';\r\n\r\n@Component({\r\n selector: 'app-no-case-selected-overlay',\r\n templateUrl: './no-case-selected-overlay.component.html',\r\n styleUrls: ['./no-case-selected-overlay.component.scss']\r\n})\r\nexport class NoCaseSelectedOverlayComponent {\r\n constructor() { }\r\n}\r\n","
\r\n
Select a Client
\r\n

To continue, select a client from the dropdown at the top of the page.

\r\n
","import { Injectable } from \"@angular/core\";\r\nimport { RedirectToLoginService } from \"@modules/common/services/redirect-to-login.service\";\r\nimport { UserSessionService } from \"@modules/common/services/user-session.service\";\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class LogoutService {\r\n constructor(\r\n private _userSessionService: UserSessionService,\r\n private _redirectToLoginService: RedirectToLoginService\r\n ) { }\r\n\r\n public logout(clearRedirectedFromUrl: boolean = true): void {\r\n this._userSessionService.signOut().subscribe(() => {\r\n this._redirectToLoginService.redirectToLogin();\r\n if (clearRedirectedFromUrl) {\r\n this._redirectToLoginService.clearRedirectedFromUrl();\r\n }\r\n });\r\n }\r\n}\r\n","import { Component, OnInit } from '@angular/core';\r\nimport { UserSessionService } from '@modules/common/services/user-session.service';\r\nimport { CurrentCaseService } from '@modules/common/services/current-case.service';\r\nimport { LogoutService } from '@modules/common/services/logout.service';\r\nimport { CurrentEnvironmentService } from '../../../common/services/current-environment.service';\r\n\r\n@Component({\r\n selector: 'app-nav-user-menu',\r\n templateUrl: './nav-user-menu.component.html',\r\n styleUrls: ['./nav-user-menu.component.scss']\r\n})\r\nexport class NavUserMenuComponent implements OnInit {\r\n constructor(\r\n private _userSessionService: UserSessionService,\r\n private _currentCaseService: CurrentCaseService,\r\n private _logoutService: LogoutService,\r\n private _currentEnvironmentService: CurrentEnvironmentService\r\n ) { }\r\n\r\n public userDisplayName?: string;\r\n public accountSettingsUrl!: string;\r\n\r\n public ngOnInit(): void {\r\n const session = this._userSessionService.getUserSession();\r\n this.userDisplayName = session && session.userInfo && session.userInfo.displayName;\r\n\r\n this.accountSettingsUrl = (this._currentEnvironmentService.getCurrentEnvironmentName() ? '/' + this._currentEnvironmentService.getCurrentEnvironmentName() : '')\r\n + (this._currentCaseService.getCurrentCaseName() ? '/' + this._currentCaseService.getCurrentCaseName() : '')\r\n + '/Users/AccountSettings';\r\n }\r\n\r\n public signOut(): void {\r\n this._logoutService.logout();\r\n }\r\n}","\r\n\r\n \r\n \r\n","
\r\n \r\n \r\n \r\n
","import { Component } from '@angular/core';\r\nimport { EnvironmentListService } from '@modules/common/services/environment-list.service';\r\nimport { CurrentEnvironmentService } from '@modules/common/services/current-environment.service';\r\n\r\n@Component({\r\n selector: 'app-nav-header',\r\n templateUrl: './nav-header.component.html',\r\n styleUrls: ['./nav-header.component.scss']\r\n})\r\nexport class NavHeaderComponent {\r\n public nonDefaultEnvironmentSelected = false;\r\n\r\n constructor(\r\n private _environmentListService: EnvironmentListService,\r\n private _currentEnvironmentService: CurrentEnvironmentService\r\n ) {\r\n this._currentEnvironmentService.environmentChanged.subscribe(() => this.updateEnvironment());\r\n this._environmentListService.environmentListChanged.subscribe(() => this.updateEnvironment());\r\n }\r\n\r\n private updateEnvironment(): void {\r\n const environmentName = this._currentEnvironmentService.getCurrentEnvironmentName();\r\n const environment = this._environmentListService.getEnvironmentList().filter(x => x.name.toLowerCase() == environmentName.toLowerCase())[0];\r\n this.nonDefaultEnvironmentSelected = environment && !environment.isDefault;\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { map, Observable, ReplaySubject, zip } from 'rxjs';\r\nimport { DashboardViewModel } from '@modules/api/dashboard-view-model.generated';\r\nimport { PowerBIViewModel } from '@modules/api/power-bi-view-model.generated';\r\nimport { CurrentRouteService } from '@modules/common/services/current-route.service';\r\nimport { GetCurrentUserDynamicMenusService } from '@modules/common/services/get-current-user-dynamic-menus.service';\r\nimport { PermissionService } from '@modules/common/services/permission.service';\r\nimport { NavSidebarMenu } from '@modules/navigation/models/nav-sidebar-menu';\r\nimport { NavSidebarMenuItem } from '@modules/navigation/models/nav-sidebar-menu-item';\r\nimport { NavSidebarGroupedMenuItem } from '@modules/navigation/models/nav-sidebar-grouped-menu-item';\r\nimport { AdministrationMenuViewModel } from '@modules/api/administration-menu-view-model.generated';\r\n\r\nconst DASHBOARDS_TITLE = 'DASHBOARDS';\r\nconst REPORTING_TITLE = 'REPORTING';\r\nconst ANALYTICS_TITLE = 'ANALYTICS';\r\nconst ADMINISTRATION_TITLE = \"ADMINISTRATION\";\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class NavSidebarMenuService {\r\n constructor(\r\n private _currentRouteService: CurrentRouteService,\r\n private _permissionService: PermissionService,\r\n private _getCurrentUserDynamicMenuService: GetCurrentUserDynamicMenusService\r\n ) { }\r\n\r\n public getMenus(): Observable {\r\n const result = new ReplaySubject(1);\r\n this._permissionService.permissionsChanged.subscribe(() => {\r\n this.getMenuModel().subscribe(menus => {\r\n result.next(menus);\r\n });\r\n });\r\n return result;\r\n }\r\n\r\n private getMenuModel(): Observable {\r\n return this.getPopulatedMenuData().pipe(map(menus =>\r\n menus.map(menu => {\r\n return {\r\n icon: menu.icon,\r\n title: menu.title,\r\n menuItems: menu.menuItems && menu.menuItems.length && menu.menuItems.map(item => {\r\n title: item.title,\r\n url: '/' + item.url.join('/')\r\n }),\r\n groupedMenus: menu.groupedMenus?.map(groupedMenu => {\r\n header: groupedMenu.header,\r\n menuItems: groupedMenu.menuItems?.map(item => {\r\n title: item.title,\r\n url: '/' + item.url.join('/')\r\n })\r\n })\r\n \r\n }})\r\n ));\r\n }\r\n\r\n private getPopulatedMenuData(): Observable {\r\n return zip(\r\n this._getCurrentUserDynamicMenuService.getCurrentUserDashboards(),\r\n this._getCurrentUserDynamicMenuService.getCurrentUserPowerBIReports(),\r\n this._getCurrentUserDynamicMenuService.getCurrentUserPowerBIPaginatedReports(),\r\n this._getCurrentUserDynamicMenuService.getAdministrationMenus())\r\n .pipe(map(dashboardsAndPowerBI => {\r\n const routeParams = this._currentRouteService.getCurrentRoute().params;\r\n const menus = this.getRawMenuData().filter(menu =>\r\n !menu.requiredParams || !menu.requiredParams.length || menu.requiredParams.every(p => hasParam(routeParams, p))\r\n );\r\n\r\n for (let menu of menus) {\r\n menu.menuItems = menu.menuItems && menu.menuItems\r\n .filter(item => !item.requiredParams || !item.requiredParams.length || item.requiredParams.every(p => hasParam(routeParams, p)))\r\n .filter(item => !item.requiredPermissions || !item.requiredPermissions.length || item.requiredPermissions.some(p => this._permissionService.verifyPermission(p)));\r\n\r\n if(menu.groupedMenus) {\r\n for(let groupedItem of menu.groupedMenus) {\r\n groupedItem.menuItems = groupedItem.menuItems && groupedItem.menuItems\r\n .filter(item => !item.requiredParams || !item.requiredParams.length || item.requiredParams.every(p => hasParam(routeParams, p)))\r\n .filter(item => !item.requiredPermissions || !item.requiredPermissions.length || item.requiredPermissions.some(p => this._permissionService.verifyPermission(p)));\r\n }\r\n }\r\n\r\n if (menu.title == DASHBOARDS_TITLE) {\r\n this.populateDynamicMenu('Dashboards', menu, dashboardsAndPowerBI[0]);\r\n }\r\n\r\n if (menu.title == ADMINISTRATION_TITLE) {\r\n this.addDynamicAdminMenuItemsToStaticMenu(menu, dashboardsAndPowerBI[3]);\r\n }\r\n\r\n if (menu.menuItems) {\r\n for (let menuItem of menu.menuItems) {\r\n if (menuItem.url) {\r\n this.populateUrlParams(menuItem.url, routeParams);\r\n }\r\n }\r\n }\r\n\r\n if(menu.groupedMenus) {\r\n for(let groupedItem of menu.groupedMenus) {\r\n if (groupedItem.header == ANALYTICS_TITLE) {\r\n this.populateDynamicMenu('Analytics', groupedItem, dashboardsAndPowerBI[1]);\r\n }\r\n \r\n if (groupedItem.header == REPORTING_TITLE) {\r\n this.addDynamicMenuItemsToStaticMenu('Analytics', groupedItem, dashboardsAndPowerBI[2]);\r\n }\r\n \r\n for (let menuItem of groupedItem.menuItems!) {\r\n if (menuItem.url) {\r\n this.populateUrlParams(menuItem.url, routeParams);\r\n }\r\n }\r\n }\r\n menu.groupedMenus = menu.groupedMenus.filter(x => x.menuItems!.length) \r\n }\r\n }\r\n\r\n return menus.filter(menu => menu.menuItems?.length || menu.groupedMenus?.some(groupedItem => groupedItem.menuItems?.length));\r\n }));\r\n }\r\n\r\n private populateDynamicMenu(menuTitle: string, menu: FilterableMenu | FilterableGroupMenu, o: DashboardViewModel[] | PowerBIViewModel[]): void {\r\n menu.menuItems = o && o.map(x => {\r\n return {\r\n title: x.name!,\r\n url: [':environment', ':clientName', menuTitle, x.name!]\r\n }\r\n }) || [];\r\n }\r\n\r\n private addDynamicMenuItemsToStaticMenu(menuTitle: string, menu: FilterableGroupMenu, o: PowerBIViewModel[]): void {\r\n const paginatedReportMenuItems: FilterableMenuItem[] = o.map(x => {\r\n return {\r\n title: x.name!,\r\n url: [':environment', ':clientName', menuTitle, x.name!]\r\n }\r\n });\r\n\r\n menu.menuItems = menu.menuItems?.concat(paginatedReportMenuItems).sort((a, b) => a.title.localeCompare(b.title))\r\n }\r\n\r\n private addDynamicAdminMenuItemsToStaticMenu(menu: FilterableMenu | FilterableGroupMenu, administrationMenus: AdministrationMenuViewModel[]): void {\r\n const adminMenuItems: FilterableMenuItem[] = administrationMenus.map(x => ({\r\n title: x.friendlyName || x.name!,\r\n url: [':environment', ':clientName', x.baseUrlSegment!, x.name!]\r\n }));\r\n\r\n menu.menuItems = menu.menuItems!.concat(adminMenuItems).sort((a, b) => a.title.localeCompare(b.title));\r\n }\r\n\r\n private populateUrlParams(url: string[], routeParams: { [key: string]: any }): void {\r\n for (let i = url.length - 1; i >= 0; i--) {\r\n if (url[i].startsWith(':')) {\r\n let routeParam = routeParams[url[i].substr(1)];\r\n if (routeParam) {\r\n url[i] = routeParam;\r\n } else {\r\n url.splice(i, 1);\r\n }\r\n }\r\n }\r\n }\r\n\r\n private getRawMenuData(): FilterableMenu[] {\r\n return [\r\n {\r\n icon: 'fa-desktop',\r\n title: 'DASHBOARDS',\r\n menuItems: []\r\n },\r\n {\r\n icon: 'fa-circle-user',\r\n title: 'PARTICIPANT',\r\n groupedMenus: [\r\n {\r\n header: 'SEARCH',\r\n menuItems: [\r\n {\r\n title: 'Search',\r\n url: [':environment', ':clientName', 'Participant/Search'],\r\n requiredPermissions: ['View Participant Profile']\r\n }\r\n ]\r\n },\r\n {\r\n header: 'PROFILE',\r\n menuItems: [\r\n {\r\n title: 'Profile',\r\n url: [':environment', ':clientName', 'Participant', ':participantId'],\r\n requiredParams: [':participantId'],\r\n requiredPermissions: ['View Participant Profile']\r\n },\r\n {\r\n title: 'Benefits',\r\n url: [':environment', ':clientName', 'Participant', ':participantId', 'Benefits'],\r\n requiredParams: [':participantId'],\r\n requiredPermissions: ['View Participant Profile']\r\n },\r\n {\r\n title: 'Dependents & Beneficiaries',\r\n url: [':environment', ':clientName', 'Participant', ':participantId', 'Dependents'],\r\n requiredParams: [':participantId'],\r\n requiredPermissions: ['View Participant Profile']\r\n },\r\n {\r\n title: 'Notes',\r\n url: [':environment', ':clientName', 'Participant', ':participantId', 'Notes'],\r\n requiredParams: [':participantId'],\r\n requiredPermissions: ['View Participant Profile']\r\n },\r\n {\r\n title: 'Documents',\r\n url: [':environment', ':clientName', 'Participant', ':participantId', 'Documents'],\r\n requiredParams: [':participantId'],\r\n requiredPermissions: ['View Participant Profile']\r\n },\r\n {\r\n title: 'Deductions',\r\n url: [':environment', ':clientName', 'Participant', ':participantId', 'Deductions'],\r\n requiredParams: [':participantId'],\r\n requiredPermissions: ['View Participant Deduction List']\r\n },\r\n {\r\n title: 'Instruction History',\r\n url: [':environment', ':clientName', 'Participant', ':participantId', 'Instructions'],\r\n requiredParams: [':participantId'],\r\n requiredPermissions: ['View Participant Instruction History']\r\n },\r\n ]\r\n }\r\n ]\r\n },\r\n {\r\n icon: 'fa-briefcase',\r\n title: ADMINISTRATION_TITLE,\r\n menuItems: [\r\n {\r\n title: 'Census Load Reports',\r\n url: [':environment', ':clientName', 'CensusReports/Dashboard'],\r\n requiredPermissions: ['View Census Reports']\r\n },\r\n {\r\n title: 'Data Integrity Errors',\r\n url: [':environment', ':clientName', 'DataIntegrity/DataIntegrityErrors'],\r\n requiredPermissions: ['View Data Integrity Errors']\r\n },\r\n {\r\n title: 'Issue Tracker',\r\n url: [':environment', ':clientName', 'IssueTracker/SSO']\r\n },\r\n {\r\n title: 'Outstanding Enrollments',\r\n url: [':environment', ':clientName', 'Administration/ParticipantTransactions'],\r\n requiredPermissions: ['View Participant Transactions']\r\n },\r\n {\r\n title: 'Verifications',\r\n url: [':environment', ':clientName', 'DependentVerification/Verifications'],\r\n requiredPermissions: ['Edit Dependent Verification']\r\n },\r\n ]\r\n },\r\n {\r\n icon: 'fa-file-pen',\r\n title: 'REPORTINGS & ANALYTICS',\r\n groupedMenus: [\r\n {\r\n header: 'REPORTING',\r\n menuItems: [\r\n {\r\n title: 'Ad Hoc Reports',\r\n url: [':environment', ':clientName', 'Reporting/AdHocReports'],\r\n requiredPermissions: ['View Ad Hoc Reports']\r\n },\r\n {\r\n title: 'Standard Reports',\r\n url: [':environment', ':clientName', 'Reporting/Reports'],\r\n requiredPermissions: ['View Standard Reports']\r\n },\r\n ]\r\n },\r\n {\r\n header: 'ANALYTICS',\r\n menuItems: []\r\n }\r\n ]\r\n },\r\n {\r\n icon: 'fa-cog',\r\n title: 'CONFIGURATION',\r\n groupedMenus: [\r\n {\r\n header: 'LOGIN',\r\n menuItems: [\r\n {\r\n title: 'Login Personal Identifiable Information',\r\n url: [':environment', ':clientName', 'AdminPortalConfig/PersonalInfo'],\r\n requiredPermissions: ['View Login PII']\r\n },\r\n {\r\n title: 'Login Styling',\r\n url: [':environment', ':clientName', 'PortalConfig/LoginStyling'],\r\n requiredPermissions: ['Edit Login Styling']\r\n },\r\n {\r\n title: 'Sign Up & Password Reset Emails',\r\n url: [':environment', ':clientName', 'AdminPortalConfig/SignUpAndPasswordResetEmails'],\r\n requiredPermissions: ['View Case Email Configuration']\r\n },\r\n ]\r\n },\r\n {\r\n header: 'PORTAL',\r\n menuItems: [\r\n {\r\n title: 'Available Benefits',\r\n url: [':environment', ':clientName', 'PortalConfig/AvailableBenefits'],\r\n requiredPermissions: ['View Available Benefits']\r\n },\r\n {\r\n title: 'FAQs',\r\n url: [':environment', ':clientName', 'PortalConfig/FAQ'],\r\n requiredPermissions: ['View FAQs']\r\n },\r\n {\r\n title: 'Forms',\r\n url: [':environment', ':clientName', 'PortalConfig/Forms'],\r\n requiredPermissions: ['View Forms']\r\n },\r\n {\r\n title: 'Mobile App Information',\r\n url: [':environment', ':clientName', 'PortalConfig/MobileAppInfo'],\r\n requiredPermissions: ['Edit Mobile App Info']\r\n },\r\n {\r\n title: 'Navigation',\r\n url: [':environment', ':clientName', 'TitaniaNavigation/Navigation'],\r\n requiredPermissions: ['View Titania Menus']\r\n },\r\n {\r\n title: 'Plan Details',\r\n url: [':environment', ':clientName', 'PortalConfig/PlanDetails'],\r\n requiredPermissions: ['View Plan Details']\r\n }\r\n ]\r\n },\r\n {\r\n header: 'ENROLLMENT BUILDER',\r\n menuItems: [\r\n {\r\n title: 'Enrollments',\r\n url: [':environment', ':clientName', 'EnrollmentBuilder/Enrollments'],\r\n requiredPermissions: ['View Transactions']\r\n },\r\n {\r\n title: 'Evidence of Insurability Text',\r\n url: [':environment', ':clientName', 'EnrollmentBuilder/EOITextConfig'],\r\n requiredPermissions: ['View Transactions']\r\n }\r\n ]\r\n },\r\n {\r\n header: 'BENEFIT PLANS',\r\n menuItems: [\r\n {\r\n title: 'Application Questions',\r\n url: [':environment', ':clientName', 'ApplicationQuestions'],\r\n requiredPermissions: ['View Case Application Questions']\r\n },\r\n {\r\n title: 'Benefit Plan Documents',\r\n url: [':environment', ':clientName', 'BenefitPlanDocuments'],\r\n requiredPermissions: ['View Benefit Plan Documents']\r\n },\r\n {\r\n title: 'Case Plan Groups',\r\n url: [':environment', ':clientName', 'CasePlanGroups'],\r\n requiredPermissions: ['View Benefit Plan Groups']\r\n },\r\n {\r\n title: 'Global Credit Configuration',\r\n url: [':environment', ':clientName', 'CaseConfig/GlobalCreditConfiguration'],\r\n requiredPermissions: ['View Global Credit Configuration']\r\n },\r\n ]\r\n },\r\n {\r\n header: 'CASE LEVEL CONFIGURATION',\r\n menuItems: [\r\n {\r\n title: 'Administration Portal Styling',\r\n url: [':environment', ':clientName', 'AdminPortalConfig/Styling'],\r\n requiredPermissions: ['Edit Admin Portal Styling']\r\n },\r\n {\r\n title: 'Case Report',\r\n url: [':environment', ':clientName', 'Reporting/CaseReport'],\r\n requiredPermissions: ['View Case Report Config']\r\n },\r\n {\r\n title: 'Data Integrity Exclusions',\r\n url: [':environment', ':clientName', 'DataIntegrity/Exclusions'],\r\n requiredPermissions: ['View Data Integrity Exclusions']\r\n },\r\n {\r\n title: 'Dependent Verification Rules',\r\n url: [':environment', ':clientName', 'DependentVerificationRules/DependentVerificationRules'],\r\n requiredPermissions: ['View Dependent Verification Rules']\r\n },\r\n {\r\n title: 'Eligibility Windows',\r\n url: [':environment', ':clientName', 'EligibilityWindows'],\r\n requiredPermissions: ['View Eligibility Windows']\r\n },\r\n {\r\n title: 'Enrollment Commit Rules',\r\n url: [':environment', ':clientName', 'AutoCommitCancelTransaction/EnrollmentCommitRules'],\r\n requiredPermissions: ['View Auto Commit Cancel Transaction Configuration']\r\n },\r\n {\r\n title: 'Tier Structures',\r\n url: [':environment', ':clientName', 'TierStructure/CaseLevel/TierStructures'],\r\n requiredPermissions: ['View Case Tier Structures']\r\n }\r\n ]\r\n },\r\n {\r\n header: 'COMMUNICATION',\r\n menuItems: [\r\n {\r\n title: 'Email Configuration',\r\n url: [':environment', ':clientName', 'AdminPortalConfig/EmailConfiguration'],\r\n requiredPermissions: ['View Default Email Configuration']\r\n },\r\n ]\r\n },\r\n {\r\n header: 'SYSTEM SETTINGS',\r\n menuItems: [\r\n {\r\n title: 'Ad Hoc Reports Editor',\r\n url: [':environment', ':clientName', 'Reporting/AdHocReportEditor'],\r\n requiredPermissions: ['Edit Ad Hoc Reports']\r\n },\r\n {\r\n title: 'Analytics Configuration',\r\n url: [':environment', ':clientName', 'Analytics', 'Configuration'],\r\n requiredPermissions: ['View Power BI Report Configuration']\r\n },\r\n {\r\n title: 'Dashboard Editor',\r\n url: [':environment', ':clientName', 'DashboardConfiguration/DashboardEditor'],\r\n requiredPermissions: ['Edit Dashboards']\r\n },\r\n {\r\n title: 'Data Integrity Primary Fixers',\r\n url: [':environment', ':clientName', 'DataIntegrity/PrimaryFixers'],\r\n requiredPermissions: ['View Primary Fixers']\r\n },\r\n {\r\n title: 'Data Integrity Validator Configuration',\r\n url: [':environment', ':clientName', 'DataIntegrity/ValidatorConfiguration'],\r\n requiredPermissions: ['View Data Integrity Validator Info']\r\n },\r\n {\r\n title: 'Enrollment Sub Step Types',\r\n url: [':environment', ':clientName', 'EnrollmentBuilder/SubStepTypes'],\r\n requiredPermissions: ['View Transactions']\r\n },\r\n {\r\n title: 'Standard Reports Editor',\r\n url: [':environment', ':clientName', 'Reporting/ReportEditor'],\r\n requiredPermissions: ['Edit Standard Reports']\r\n },\r\n {\r\n title: 'Tier Structures',\r\n url: [':environment', ':clientName', 'TierStructure/Global/TierStructures'],\r\n requiredPermissions: ['View Global Tier Structures']\r\n },\r\n {\r\n title: 'Video Configuration',\r\n url: [':environment', ':clientName', 'VideoConfiguration'],\r\n requiredPermissions: ['View Global Videos']\r\n }\r\n ]\r\n }\r\n ]\r\n },\r\n {\r\n icon: 'fa-screwdriver-wrench',\r\n title: 'TOOLS',\r\n groupedMenus: [\r\n {\r\n header: 'CENSUS',\r\n menuItems: [\r\n {\r\n title: 'Census List',\r\n url: [':environment', ':clientName', 'Census/List'],\r\n requiredPermissions: ['View Census']\r\n }\r\n ]\r\n },\r\n {\r\n header: 'FILES',\r\n menuItems: [\r\n {\r\n title: 'Case Remittance File Configuration',\r\n url: [':environment', ':clientName', 'RemittanceCaseFileDefinitionGroups'],\r\n requiredPermissions: [\"View Case Remit File Configuration\"]\r\n },\r\n {\r\n title: 'Deduction Code Setup',\r\n url: [':environment', ':clientName', 'DeductionCodes'],\r\n requiredPermissions: ['View Deduction Codes']\r\n },\r\n {\r\n title: 'Instruction File Configuration',\r\n url: [':environment', ':clientName', 'InstructionCaseConfig'],\r\n requiredPermissions: [\"View Instruction File Configuration\"]\r\n },\r\n {\r\n title: 'Instruction File Setups',\r\n url: [':environment', ':clientName', 'InstructionFileSetup'],\r\n requiredPermissions: [\"View Instruction File Setup\"]\r\n },\r\n {\r\n title: 'Payment File Configuration',\r\n url: [':environment', ':clientName', 'PaymentFileConfiguration'],\r\n requiredPermissions: ['View Payment File Configuration']\r\n },\r\n {\r\n title: 'Remittance File Configuration',\r\n url: [':environment', ':clientName', 'RemittanceFileDefinitionGroups'],\r\n requiredPermissions: [\"View Remit File Configuration\"]\r\n }\r\n ]\r\n },\r\n {\r\n header: 'RULES',\r\n menuItems: [\r\n {\r\n title: 'New Rule',\r\n url: [':environment', ':clientName', 'ExpressionRules/Edit'],\r\n requiredPermissions: ['View Rules']\r\n },\r\n {\r\n title: 'Search',\r\n url: [':environment', ':clientName', 'ExpressionRules/Search'],\r\n requiredPermissions: ['View Rules']\r\n },\r\n ]\r\n },\r\n {\r\n header: 'PUBLISH CENTER',\r\n menuItems: [\r\n {\r\n title: 'Publish',\r\n url: [':environment', ':clientName', 'PublishingCenter/Publish'],\r\n requiredPermissions: ['Run Publish']\r\n },\r\n {\r\n title: 'Publish History',\r\n url: [':environment', ':clientName', 'PublishingCenter/PublishHistory'],\r\n requiredPermissions: ['View Publish']\r\n }\r\n ]\r\n },\r\n {\r\n header: 'DATA REFRESH',\r\n menuItems: [\r\n {\r\n title: 'History',\r\n url: [':environment', ':clientName', 'DataRefresh/RefreshDataHistory'],\r\n requiredPermissions: ['View Data Refresh']\r\n },\r\n {\r\n title: 'Queue',\r\n url: [':environment', ':clientName', 'DataRefresh/RefreshDataQueue'],\r\n requiredPermissions: ['View Data Refresh Queue']\r\n },\r\n {\r\n title: 'Refresh',\r\n url: [':environment', ':clientName', 'DataRefresh/RefreshData'],\r\n requiredPermissions: ['Run Data Refresh']\r\n },\r\n ]\r\n },\r\n {\r\n header: 'UTILITIES',\r\n menuItems: [\r\n {\r\n title: 'Bulk Document Uploader',\r\n url: [':environment', ':clientName', 'Files', 'Loader'],\r\n requiredPermissions: [\"View Upload Batch Files\"]\r\n },\r\n {\r\n title: 'Rollovers',\r\n url: [':environment', ':clientName', 'Rollover'],\r\n requiredPermissions: ['View Rollovers']\r\n },\r\n ]\r\n }\r\n ]\r\n },\r\n {\r\n icon: 'fa-shield-halved',\r\n title: 'SECURITY',\r\n menuItems: [\r\n {\r\n title: \"Environments\",\r\n url: [':environment', ':clientName', 'Environments'],\r\n requiredPermissions: [\"View Environments\"]\r\n },\r\n {\r\n title: 'Filter Sets',\r\n url: [':environment', ':clientName', 'Users/UserEntityFilterConfigurationList'],\r\n requiredPermissions: ['View Filter Sets']\r\n },\r\n {\r\n title: 'Incoming SSO',\r\n url: [':environment', ':clientName', 'CaseSSO'],\r\n requiredPermissions: ['View Case SSO']\r\n },\r\n {\r\n title: 'Outgoing SSO',\r\n url: [':environment', ':clientName', 'CaseSSOServiceProviders'],\r\n requiredPermissions: ['View Case SSO Service Providers']\r\n },\r\n {\r\n title: 'Permissions',\r\n url: [':environment', ':clientName', 'Permissions/Tree'],\r\n requiredPermissions: ['View Permissions']\r\n },\r\n {\r\n title: 'Permission Sets',\r\n url: [':environment', ':clientName', 'Permissions/PermissionSets'],\r\n requiredPermissions: ['View Permission Sets']\r\n },\r\n {\r\n title: 'Publish Group',\r\n url: [':environment', ':clientName', 'PublishingCenter/PublishGroups'],\r\n requiredPermissions: ['View Publish Groups']\r\n },\r\n {\r\n title: 'Users',\r\n url: [':environment', ':clientName', 'Users/List'],\r\n requiredPermissions: ['View External Users', 'View Internal Users']\r\n },\r\n ]\r\n },\r\n ];\r\n }\r\n}\r\n\r\ninterface FilterableMenu {\r\n icon: string;\r\n title: string;\r\n requiredParams?: string[];\r\n menuItems?: FilterableMenuItem[];\r\n groupedMenus?: FilterableGroupMenu[];\r\n}\r\n\r\ninterface FilterableMenuItem {\r\n title: string;\r\n url: string[];\r\n requiredParams?: string[];\r\n requiredPermissions?: string[];\r\n}\r\n\r\ninterface FilterableGroupMenu {\r\n header: string;\r\n requiredParams?: string[];\r\n menuItems?: FilterableMenuItem[];\r\n}\r\n\r\nfunction hasParam(routeParams: { [key: string]: any }, param: string): boolean {\r\n return !!routeParams[param.substr(1)];\r\n}\r\n","
\r\n \r\n
\r\n \r\n
\r\n \r\n
\r\n
\r\n \r\n \r\n
{{groupedMenu.header}}
\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
{{groupedMenu.header}}
\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
\r\n
","import { Component, ElementRef, OnInit, QueryList, ViewChild, ViewChildren, AfterViewInit, OnDestroy } from '@angular/core';\r\nimport { animate, state, style, transition, trigger } from '@angular/animations';\r\nimport { NavSidebar } from '../../models/nav-sidebar';\r\nimport { NavSidebarMenuService } from '../../services/nav-sidebar-menu.service';\r\nimport { HomeUrlService } from '@modules/common/services/home-url.service';\r\nimport { NavSidebarExpandedService } from '@modules/navigation/services/nav-sidebar-expanded.service';\r\nimport { NavSidebarMenu } from '@modules/navigation/models/nav-sidebar-menu';\r\nimport { Router } from '@angular/router';\r\nimport { Subscription } from 'rxjs';\r\n\r\n@Component({\r\nselector: 'app-nav-sidebar',\r\ntemplateUrl: './nav-sidebar.component.html',\r\nstyleUrls: ['./nav-sidebar.component.scss'],\r\nanimations: [\r\n trigger('fade', [\r\n state('void', style({opacity: 0})),\r\n transition('void <=> *', [\r\n animate(200)\r\n ])\r\n ])]\r\n})\r\nexport class NavSidebarComponent implements OnInit, AfterViewInit, OnDestroy {\r\n public model: NavSidebar = { menus: [] };\r\n public isNavSidebarExpanded: boolean = true;\r\n public isExpandedInitially!: boolean; //Applies an appropriate class with a fixed width to prevent its initial transition\r\n public isOverflowScroll!: boolean;\r\n public mouseOverString: string = ''; //Keeps the collapsed menu open\r\n private _activeURL: string = ''; //Keeps track of which item is active to scroll to it if it is ouside of the view\r\n private readonly _openedMenus: number[] = [];\r\n private readonly _menuHeight = new Map;\r\n private _overflowTimer?: number;\r\n private _scrollTimer?: number;\r\n private _menuItemSubscription?: Subscription;\r\n private readonly _resizeObserver: ResizeObserver;\r\n\r\n @ViewChildren('menuItem')\r\n private _menuItem!: QueryList; \r\n @ViewChildren('activeLinkItem')\r\n private _activeLinkItem!: QueryList;\r\n @ViewChild('parentElement', { static: true }) \r\n private _parentElement!: ElementRef;\r\n @ViewChild('collapsedMenu') \r\n private _collapsedMenu: ElementRef = {} as ElementRef;\r\n @ViewChildren('collapsedMenuActiveLink') \r\n private _collapsedMenuActiveLink?: QueryList;\r\n\r\n public homeUrl!: string;\r\n\r\n constructor(\r\n private navSidebarMenuService: NavSidebarMenuService,\r\n private _homeUrlService: HomeUrlService,\r\n private _navSidebarExpandedService: NavSidebarExpandedService,\r\n private _router: Router\r\n ) {\r\n _navSidebarExpandedService.toggled.subscribe(expanded => this.isNavSidebarExpanded = expanded);\r\n\r\n this._resizeObserver = new ResizeObserver(entries => {\r\n const target = entries[0].target;\r\n const scrollHeight = target.scrollHeight;\r\n const clientHeight = target.clientHeight;\r\n \r\n if(scrollHeight > clientHeight) {\r\n if(!target.classList.contains('nav-sidebar-scroll-track')){\r\n target.classList.add('nav-sidebar-scroll-track');\r\n }\r\n }\r\n else {\r\n if(target.classList.contains('nav-sidebar-scroll-track')){\r\n target.classList.remove('nav-sidebar-scroll-track');\r\n }\r\n }\r\n });\r\n }\r\n\r\n public ngOnInit(): void {\r\n this._homeUrlService.urlChanged.subscribe(x => this.homeUrl = x);\r\n this.isExpandedInitially = this.isNavSidebarExpanded;\r\n this.isOverflowScroll = this.isNavSidebarExpanded;\r\n this.updateMenus();\r\n }\r\n\r\n public ngAfterViewInit(): void {\r\n this.observeResize(this._parentElement.nativeElement, false);\r\n //scroll on refresh\r\n this._activeLinkItem.forEach((item: ElementRef) => {\r\n this.scrollToItem(item, this._parentElement);\r\n });\r\n }\r\n\r\n public onCollapseButtonClick(): void {\r\n this._navSidebarExpandedService.toggleExpanded();\r\n clearTimeout(this._overflowTimer);\r\n clearTimeout(this._scrollTimer);\r\n\r\n this._overflowTimer = setTimeout(() => {\r\n this.isOverflowScroll= !this.isOverflowScroll;\r\n }, 200);\r\n\r\n if(this.isNavSidebarExpanded) {\r\n this._scrollTimer = setTimeout(() => {\r\n this._activeLinkItem.forEach((item: ElementRef) => {\r\n this.scrollToItem(item, this._parentElement);\r\n })\r\n }, 300);\r\n }\r\n }\r\n\r\n private updateMenus(): void {\r\n this._menuItemSubscription = this.navSidebarMenuService.getMenus().subscribe(x => {\r\n this.model = {\r\n menus: x,\r\n activeMenu: this.getActiveMenu(x)\r\n };\r\n\r\n if(this._activeLinkItem) {\r\n this._activeLinkItem.changes.subscribe(menuItem => {\r\n menuItem.forEach((item: ElementRef) => {\r\n this.scrollToItem(item, this._parentElement);\r\n });\r\n });\r\n }\r\n });\r\n }\r\n\r\n private getActiveMenu(menus: NavSidebarMenu[]): NavSidebarMenu | undefined {\r\n let activeMenu: NavSidebarMenu | undefined;\r\n let totalMenus = 0;\r\n let found = false;\r\n let index = 0;\r\n\r\n for (let menu of menus) {\r\n if(menu.groupedMenus){\r\n for(let groupedMenu of menu.groupedMenus){\r\n totalMenus += groupedMenu.menuItems.length + 1;\r\n if(groupedMenu.menuItems && groupedMenu.menuItems.some(x => this._router.isActive(x.url, false)) && !found) {\r\n found = true;\r\n activeMenu = menu;\r\n for(let menuItem of groupedMenu.menuItems) {\r\n if(this._router.isActive(menuItem.url, false)){\r\n this._activeURL = menuItem.url;\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (menu.menuItems && menu.menuItems.some(x => this._router.isActive(x.url, false))) {\r\n totalMenus = menu.menuItems.length;\r\n found = true;\r\n activeMenu = menu;\r\n for(let menuItem of menu.menuItems) {\r\n if(this._router.isActive(menuItem.url, false)){\r\n this._activeURL = menuItem.url;\r\n break;\r\n }\r\n }\r\n }\r\n\r\n if(found) {\r\n this._openedMenus.push(index);\r\n this._menuHeight.set(index, `${totalMenus * 50}px`);\r\n break;\r\n }\r\n \r\n index++;\r\n totalMenus = 0;\r\n }\r\n\r\n return activeMenu;\r\n }\r\n\r\n private scrollToItem(item: ElementRef, container: ElementRef): void {\r\n const pathname = decodeURIComponent(new URL(item.nativeElement.href).pathname);\r\n\r\n if(this._activeURL === pathname) {\r\n const itemDistanceFromTop = item.nativeElement.getBoundingClientRect().top;\r\n const containerDistanceFromTop = container.nativeElement.getBoundingClientRect().top;\r\n const diff = itemDistanceFromTop - containerDistanceFromTop;\r\n const containerHeight = container.nativeElement.clientHeight;\r\n\r\n if(this.isNavSidebarExpanded && itemDistanceFromTop > containerHeight) {\r\n container.nativeElement.scroll({\r\n top: itemDistanceFromTop - containerHeight/2,\r\n behavior: 'smooth'\r\n })\r\n }\r\n else if(!this.isNavSidebarExpanded && diff > containerHeight) {\r\n container.nativeElement.scroll({\r\n top: diff - containerHeight/2,\r\n behavior: 'smooth'\r\n })\r\n }\r\n }\r\n }\r\n\r\n public expand(index: number): void {\r\n const indexOfMenu = this._openedMenus.indexOf(index);\r\n const height = this._menuItem.toArray()[index].nativeElement.scrollHeight;\r\n\r\n if(indexOfMenu === -1) {\r\n this._openedMenus.push(index);\r\n this._menuHeight.set(index, `${height}px`);\r\n return;\r\n }\r\n\r\n this._openedMenus.splice(indexOfMenu, 1);\r\n this._menuHeight.delete(index);\r\n }\r\n\r\n public isMenuOpen(index: number): boolean {\r\n return this._openedMenus.includes(index);\r\n }\r\n\r\n public getHeight(index: number): string | undefined {\r\n return this._menuHeight.get(index);\r\n }\r\n\r\n public setMouseOver(mouseOver: string) :void {\r\n this.mouseOverString = mouseOver;\r\n\r\n this._scrollTimer = setTimeout(() => {\r\n this._collapsedMenuActiveLink!.forEach((item: ElementRef) => {\r\n this.scrollToItem(item, this._collapsedMenu);\r\n });\r\n }, 300);\r\n }\r\n\r\n public setMouseLeave(): void {\r\n this.mouseOverString = '';\r\n\r\n clearTimeout(this._scrollTimer);\r\n if(this._collapsedMenu) {\r\n this.observeResize(this._collapsedMenu.nativeElement, true);\r\n }\r\n }\r\n\r\n public changeScrollbar():void {\r\n if(this._collapsedMenu) {\r\n this.observeResize(this._collapsedMenu.nativeElement, false);\r\n }\r\n }\r\n\r\n private observeResize(element: HTMLElement, unobserve: boolean): void{\r\n if(unobserve) {\r\n this._resizeObserver.unobserve(element);\r\n return;\r\n }\r\n\r\n this._resizeObserver.observe(element);\r\n }\r\n\r\n public ngOnDestroy(): void {\r\n if(this._menuItemSubscription){\r\n this._menuItemSubscription.unsubscribe();\r\n }\r\n clearInterval(this._overflowTimer);\r\n clearTimeout(this._scrollTimer);\r\n this._resizeObserver.disconnect();\r\n }\r\n}","
\r\n 1\" class=\"nav-client-picker-ctr app-client-picker-form-field\">\r\n \r\n \r\n 1\">NONE\r\n \r\n {{ client.clientName }}\r\n \r\n \r\n \r\n
\r\n {{clients[0].clientName}}\r\n
\r\n
","import { Component, OnInit } from '@angular/core';\r\nimport { ClientsModel } from '@modules/api/clients-model.generated';\r\nimport { FormBuilder, FormGroup } from '@angular/forms';\r\nimport { CurrentCaseService } from '@modules/common/services/current-case.service';\r\nimport { CachedCaseListService } from '@modules/common/services/cached-case-list.service';\r\n\r\n@Component({\r\n selector: 'app-nav-client-picker',\r\n templateUrl: './nav-client-picker.component.html',\r\n styleUrls: ['./nav-client-picker.component.scss']\r\n})\r\nexport class NavClientPickerComponent implements OnInit {\r\n public clients?: ClientsModel[];\r\n public selectedClientName!: string;\r\n public form!: FormGroup;\r\n\r\n constructor(\r\n private _cachedCaseListService: CachedCaseListService,\r\n private _formBuilder: FormBuilder,\r\n private _currentCaseService: CurrentCaseService\r\n ) { }\r\n\r\n public ngOnInit(): void {\r\n this.form = this._formBuilder.group({\r\n clientName: [this._currentCaseService.getCurrentCaseName() || ''],\r\n });\r\n\r\n this.form.valueChanges.subscribe(() => {\r\n this._currentCaseService.setCurrentCase(this.form.get('clientName')!.value);\r\n })\r\n\r\n this._cachedCaseListService.cachedCaseListChanged.subscribe(result => {\r\n this.clients = result;\r\n if (this.clients && this.clients.length == 1 && this.clients[0].clientCode != this._currentCaseService.getCurrentCaseName()) {\r\n this._currentCaseService.setCurrentCase(this.clients[0].clientCode || '');\r\n } else if (this._currentCaseService.getCurrentCaseName() && !this.clients.some(x => x.clientCode == this._currentCaseService.getCurrentCaseName())) {\r\n this._currentCaseService.setCurrentCase('');\r\n }\r\n });\r\n }\r\n}","\r\nimport {filter} from 'rxjs/operators';\r\nimport { Component } from '@angular/core';\r\nimport { Router, NavigationEnd } from '@angular/router';\r\n\r\n\r\n@Component({\r\n selector: 'app-nav-new-tab',\r\n templateUrl: './nav-new-tab.component.html',\r\n styleUrls: ['./nav-new-tab.component.scss']\r\n})\r\nexport class NavNewTabComponent {\r\n constructor(router: Router) {\r\n router.events.pipe(\r\n filter(e => e instanceof NavigationEnd))\r\n .subscribe(e => {\r\n this.currentUrl = decodeURI((e).url);\r\n });\r\n }\r\n\r\n public currentUrl?: string;\r\n}\r\n","\r\n \r\n NEW\r\n","
1\">\r\n \r\n \r\n \r\n \r\n
\r\n","import { Component, OnInit } from '@angular/core';\r\nimport { CurrentEnvironmentService } from '@modules/common/services/current-environment.service';\r\nimport { EnvironmentListService } from '@modules/common/services/environment-list.service';\r\nimport { EnvironmentModel } from '@modules/common/models/environment-model';\r\n\r\n@Component({\r\n selector: 'app-nav-env-picker',\r\n templateUrl: './nav-env-picker.component.html',\r\n styleUrls: ['./nav-env-picker.component.scss']\r\n})\r\nexport class NavEnvPickerComponent implements OnInit {\r\n public environments?: EnvironmentModel[];\r\n public selectedEnvironment?: EnvironmentModel;\r\n\r\n constructor(\r\n private _environmentListService: EnvironmentListService,\r\n private _currentEnvironmentService: CurrentEnvironmentService\r\n ) { }\r\n\r\n public ngOnInit(): void {\r\n this._environmentListService.environmentListChanged.subscribe(result => {\r\n this.environments = result;\r\n\r\n if (this._currentEnvironmentService.getCurrentEnvironmentName()) {\r\n this.selectedEnvironment = this.environments.filter(x => x.name!.toLowerCase() == this._currentEnvironmentService.getCurrentEnvironmentName().toLowerCase())[0];\r\n if (this.selectedEnvironment && this.selectedEnvironment.name != this._currentEnvironmentService.getCurrentEnvironmentName()) {\r\n this.selectEnvironment(this.selectedEnvironment);\r\n }\r\n }\r\n\r\n if (!this.selectedEnvironment || !this.environments.some(x =>x.name!.toLowerCase() == this.selectedEnvironment!.name!.toLowerCase())) {\r\n this.selectedEnvironment = undefined;\r\n if (this.environments.length) {\r\n this.selectEnvironment(this.environments[0]);\r\n }\r\n }\r\n });\r\n }\r\n\r\n public selectEnvironment(environment?: EnvironmentModel): void {\r\n this._currentEnvironmentService.setCurrentEnvironment(environment && environment.name);\r\n this.selectedEnvironment = environment;\r\n }\r\n}","
\r\n
\r\n \r\n {{environmentMessage}}\r\n
\r\n
","import { Component } from '@angular/core';\r\nimport { CurrentEnvironmentService } from '@modules/common/services/current-environment.service';\r\nimport { EnvironmentListService } from '@modules/common/services/environment-list.service';\r\n\r\n@Component({\r\n selector: 'app-nav-env-message',\r\n templateUrl: './nav-env-message.component.html',\r\n styleUrls: ['./nav-env-message.component.scss']\r\n})\r\nexport class NavEnvMessageComponent {\r\n public environmentMessage?: string;\r\n\r\n constructor(\r\n private _environmentListService: EnvironmentListService,\r\n private _currentEnvironmentService: CurrentEnvironmentService\r\n ) {\r\n this._environmentListService.environmentListChanged.subscribe(() => this.updateEnvironmentMessage());\r\n this._currentEnvironmentService.environmentChanged.subscribe(() => this.updateEnvironmentMessage());\r\n }\r\n\r\n private updateEnvironmentMessage(): void {\r\n this.environmentMessage = undefined;\r\n const environmentName = this._currentEnvironmentService.getCurrentEnvironmentName();\r\n if (environmentName) {\r\n const environment = this._environmentListService.getEnvironmentList().filter(x => x.name.toLowerCase() == environmentName.toLowerCase())[0];\r\n\r\n if (environment && !environment.isDefault) {\r\n this.environmentMessage = environment.description;\r\n }\r\n }\r\n }\r\n}","import { Component } from \"@angular/core\";\r\nimport { CurrentPhoneCallService } from \"@modules/participant-shared/services/current-phone-call.service\";\r\nimport { map, Observable } from \"rxjs\";\r\n\r\n/**\r\n * Banner to show that the user is currently in a phone call.\r\n * The user can be considered to be in a phone call if they arrive at Stingray from Five9.\r\n */\r\n@Component({\r\n selector: 'app-nav-phone-call-banner',\r\n templateUrl: './nav-phone-call-banner.component.html',\r\n styleUrls: ['./nav-phone-call-banner.component.scss']\r\n})\r\nexport class NavPhoneCallBannerComponent {\r\n public readonly participantName: Observable;\r\n public readonly employeeId: Observable;\r\n\r\n constructor(currentPhoneCallService: CurrentPhoneCallService) {\r\n this.participantName = currentPhoneCallService.currentPhoneCallChanged()\r\n .pipe(map(phoneCall => phoneCall?.participantName));\r\n this.employeeId = currentPhoneCallService.currentPhoneCallChanged()\r\n .pipe(map(phoneCall => phoneCall?.employeeId));\r\n }\r\n}","
\r\n
\r\n \r\n
\r\n
\r\n ACTIVE PHONE CALL - \r\n
\r\n
\r\n {{participantName | async}} {{employeeId | async}}\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 \r\n
\r\n
\r\n
\r\n","import { Component, OnDestroy, OnInit } from '@angular/core';\r\nimport { CurrentAdminPortalConfigService } from '@modules/common/services/current-admin-portal-config.service';\r\nimport { CurrentCaseService } from '@modules/common/services/current-case.service';\r\nimport { CustomRouteData } from '@modules/common/models/custom-route-data';\r\nimport { CurrentRouteService } from '@modules/common/services/current-route.service';\r\nimport { NavSidebarExpandedService } from '@modules/navigation/services/nav-sidebar-expanded.service';\r\nimport { CurrentPhoneCallService } from '@modules/participant-shared/services/current-phone-call.service';\r\nimport { map, Observable, Subscription } from 'rxjs';\r\n\r\n@Component({\r\n selector: 'app-nav-layout',\r\n templateUrl: './nav-layout.component.html',\r\n styleUrls: ['./nav-layout.component.scss']\r\n})\r\nexport class NavLayoutComponent implements OnInit, OnDestroy {\r\n public readonly showPhoneCallBanner: Observable;\r\n\r\n public isNavSidebarExpanded = true;\r\n public clientPickerCtrStyle: any = {};\r\n public requiresCaseSelection?: boolean;\r\n public currentCaseName!: string;\r\n\r\n private readonly _subscriptions: Subscription[] = [];\r\n\r\n constructor(\r\n private readonly _currentAdminPortalConfigService: CurrentAdminPortalConfigService,\r\n private readonly _currentCaseService: CurrentCaseService,\r\n private readonly _currentRouteService: CurrentRouteService,\r\n navSidebarExpandedService: NavSidebarExpandedService,\r\n currentPhoneCallService: CurrentPhoneCallService,\r\n ) {\r\n const navSidebarToggleSubscription = navSidebarExpandedService.toggled.subscribe(expanded => this.isNavSidebarExpanded = expanded);\r\n this._subscriptions.push(navSidebarToggleSubscription);\r\n\r\n this.showPhoneCallBanner = currentPhoneCallService.currentPhoneCallChanged()\r\n .pipe(map(phoneCall => !!phoneCall));\r\n }\r\n\r\n public ngOnInit(): void {\r\n this.currentCaseName = this._currentCaseService.getCurrentCaseName();\r\n const customRouteData = this._currentRouteService.getCurrentRoute().data as CustomRouteData | undefined;\r\n if (customRouteData) {\r\n this.requiresCaseSelection = !!customRouteData.requiresCaseSelection;\r\n }\r\n const adminPortalConfigChangedSubscription = this._currentAdminPortalConfigService.configChanged.subscribe(result => {\r\n if (result && result.headingColor && result.headingColor.length) {\r\n this.clientPickerCtrStyle['background-color'] = '#' + result.headingColor;\r\n } else if (this.clientPickerCtrStyle.hasOwnProperty('background-color')) {\r\n delete this.clientPickerCtrStyle['background-color'];\r\n }\r\n });\r\n this._subscriptions.push(adminPortalConfigChangedSubscription);\r\n }\r\n\r\n public ngOnDestroy(): void {\r\n for (let subscription of this._subscriptions) {\r\n subscription.unsubscribe();\r\n }\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { ActivatedRouteSnapshot, CanActivate, CanActivateChild, Router } from '@angular/router';\r\nimport { CustomRouteData } from '@modules/common/models/custom-route-data';\r\nimport { AuthenticationTokenService } from '@modules/common/services/authentication-token.service';\r\nimport { PermissionService } from '@modules/common/services/permission.service';\r\nimport { RedirectToLoginService } from '@modules/common/services/redirect-to-login.service';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class RouteGuardService implements CanActivate, CanActivateChild {\r\n constructor(\r\n private _authenticationTokenService: AuthenticationTokenService,\r\n private _redirectToLoginService: RedirectToLoginService,\r\n private _permissionService: PermissionService,\r\n private _router: Router\r\n ) { }\r\n\r\n public canActivate(route: ActivatedRouteSnapshot): boolean {\r\n if (!this._authenticationTokenService.hasValidAuthenticationToken()) {\r\n this._redirectToLoginService.redirectToLogin(route);\r\n return false;\r\n }\r\n\r\n const customRouteData = route.data as CustomRouteData | undefined;\r\n if (customRouteData && customRouteData.requiredPermissions && customRouteData.requiredPermissions.length && !customRouteData.requiredPermissions.some(x => this._permissionService.verifyPermission(x))) {\r\n this._router.navigate(['/']);\r\n return false;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n public canActivateChild(route: ActivatedRouteSnapshot): boolean {\r\n return this.canActivate(route);\r\n }\r\n}\r\n","import { LoadChildren, Route } from '@angular/router';\r\nimport { NotFoundComponent } from '@modules/common/components/not-found/not-found.component';\r\nimport { NavLayoutComponent } from '@modules/navigation/components/nav-layout/nav-layout.component';\r\nimport { RouteGuardService } from '@modules/routing/services/route-guard.service';\r\n\r\nfunction getRoutesWithEnvironmentAndClient(baseUrlSegment: string, loadChildren: LoadChildren) : Route[] {\r\n return [\r\n baseUrlSegment,\r\n ':environment/' + baseUrlSegment,\r\n ':environment/:clientName/' + baseUrlSegment\r\n ].map(path => ({\r\n path: path,\r\n loadChildren: loadChildren\r\n }));\r\n}\r\n\r\nexport const ROUTES: Route[] = [\r\n {\r\n path: '',\r\n pathMatch: 'full',\r\n redirectTo: 'Dashboards'\r\n },\r\n {\r\n path: 'Login',\r\n loadChildren: () => import('@modules/login/login.module').then(x => x.LoginModule)\r\n },\r\n {\r\n path: ':clientName/Login',\r\n loadChildren: () => import('@modules/login/login.module').then(x => x.LoginModule)\r\n },\r\n {\r\n path: '',\r\n component: NavLayoutComponent,\r\n canActivate: [RouteGuardService],\r\n canActivateChild: [RouteGuardService],\r\n children: getRoutesWithEnvironmentAndClient('Participant', () => import('@modules/participant/participant.module').then(x => x.ParticipantModule))\r\n .concat(getRoutesWithEnvironmentAndClient('PortalConfig', () => import('@modules/portal-config/portal-config.module').then(x => x.PortalConfigModule)))\r\n .concat(getRoutesWithEnvironmentAndClient('TitaniaNavigation', () => import('@modules/titania-navigation/titania-navigation.module').then(x => x.TitaniaNavigationModule)))\r\n .concat(getRoutesWithEnvironmentAndClient('Reporting', () => import('@modules/reporting/reporting.module').then(x => x.ReportingModule)))\r\n .concat(getRoutesWithEnvironmentAndClient('Analytics', () => import('@modules/power-bi/power-bi.module').then(x => x.PowerBIModule)))\r\n .concat(getRoutesWithEnvironmentAndClient('Users', () => import('@modules/users/users.module').then(x => x.UsersModule)))\r\n .concat(getRoutesWithEnvironmentAndClient('ExpressionRules', () => import('@modules/expression-rules/expression-rules.module').then(x => x.ExpressionRulesModule)))\r\n .concat(getRoutesWithEnvironmentAndClient('Permissions', () => import('@modules/permissions/permissions.module').then(x => x.PermissionsModule)))\r\n .concat(getRoutesWithEnvironmentAndClient('AdminPortalConfig', () => import('@modules/admin-portal-config/admin-portal-config.module').then(x => x.AdminPortalConfigModule)))\r\n .concat(getRoutesWithEnvironmentAndClient('Environments', () => import('@modules/environments/environments.module').then(x => x.EnvironmentsModule)))\r\n .concat(getRoutesWithEnvironmentAndClient('PublishingCenter', () => import('@modules/publishing/publishing.module').then(x => x.PublishingModule)))\r\n .concat(getRoutesWithEnvironmentAndClient('Dashboards', () => import('@modules/dashboard/dashboard.module').then(x => x.DashboardModule)))\r\n .concat(getRoutesWithEnvironmentAndClient('DataRefresh', () => import('@modules/data-refresh/data-refresh.module').then(x => x.DataRefreshModule)))\r\n .concat(getRoutesWithEnvironmentAndClient('Census', () => import('@modules/census-config/census-config.module').then(x => x.CensusConfigModule)))\r\n .concat(getRoutesWithEnvironmentAndClient('CasePlanGroups', () => import('@modules/case-plan-groups/case-plan-groups.module').then(x => x.CasePlanGroupsModule)))\r\n .concat(getRoutesWithEnvironmentAndClient('ApplicationQuestions', () => import('@modules/application-questions/application-questions.module').then(x => x.ApplicationQuestionsModule)))\r\n .concat(getRoutesWithEnvironmentAndClient('BenefitPlanDocuments', () => import('@modules/case-plan-attachments/case-plan-attachments.module').then(x => x.CasePlanAttachmentsModule)))\r\n .concat(getRoutesWithEnvironmentAndClient('EligibilityWindows', () => import('@modules/eligibility-windows/eligibility-windows.module').then(x => x.EligibilityWindowsModule)))\r\n .concat(getRoutesWithEnvironmentAndClient('EnrollmentBuilder', () => import('@modules/enrollment-builder/enrollment-builder.module').then(x => x.EnrollmentBuilderModule)))\r\n .concat(getRoutesWithEnvironmentAndClient('CaseConfig/GlobalCreditConfiguration', () => import('@modules/global-credit-configuration/global-credit-configuration.module').then(x => x.GlobalCreditConfigurationModule)))\r\n .concat(getRoutesWithEnvironmentAndClient('DashboardConfiguration', () => import('@modules/dashboard-configuration/dashboard-configuration.module').then(x => x.DashboardConfigurationModule)))\r\n .concat(getRoutesWithEnvironmentAndClient('Rollover', () => import('@modules/rollover/rollover.module').then(x => x.RolloverModule)))\r\n .concat(getRoutesWithEnvironmentAndClient('InstructionCaseConfig', () => import('@modules/instruction-case-config/instruction-case-config.module').then(x => x.InstructionCaseConfigModule)))\r\n .concat(getRoutesWithEnvironmentAndClient('InstructionFileSetup', () => import('@modules/instruction-file-setup/instruction-file-setup.module').then(x => x.InstructionFileSetupModule)))\r\n .concat(getRoutesWithEnvironmentAndClient('RemittanceFileDefinitionGroups', () => import('@modules/remittance-file-definition-group/remittance-file-definition-group.module').then(x => x.RemittanceFileDefinitionGroupModule)))\r\n .concat(getRoutesWithEnvironmentAndClient('RemittanceCaseFileDefinitionGroups', () => import('@modules/remittance-case-file-definition-group/remittance-case-file-definition-group.module').then(x => x.RemittanceCaseFileDefinitionGroupModule)))\r\n .concat(getRoutesWithEnvironmentAndClient('Files', () => import('@modules/files/files.module').then(x => x.FilesModule)))\r\n .concat(getRoutesWithEnvironmentAndClient('DeductionCodes', () => import('@modules/deduction-codes/deduction-codes.module').then(x => x.DeductionCodesModule)))\r\n .concat(getRoutesWithEnvironmentAndClient('Administration/ParticipantTransactions', () => import('@modules/participant-transactions/participant-transactions.module').then(x => x.ParticipantTransactionsModule)))\r\n .concat(getRoutesWithEnvironmentAndClient('DependentVerification', () => import('@modules/dependent-verification/dependent-verification.module').then(x => x.DependentVerificationModule)))\r\n .concat(getRoutesWithEnvironmentAndClient('DependentVerificationRules', () => import('@modules/dependent-verification-rules/dependent-verification-rules.module').then(x => x.DependentVerificationRulesModule)))\r\n .concat(getRoutesWithEnvironmentAndClient('CensusReports', () => import('@modules/census-reports/census-reports.module').then(x => x.CensusReportsModule)))\r\n .concat(getRoutesWithEnvironmentAndClient('IssueTracker', () => import('@modules/issue-tracker/issue-tracker.module').then(x => x.IssueTrackerModule)))\r\n .concat(getRoutesWithEnvironmentAndClient('AutoCommitCancelTransaction', () => import('@modules/auto-commit-cancel-transaction/auto-commit-cancel-transaction.module').then(x => x.AutoCommitCancelTransactionModule)))\r\n .concat(getRoutesWithEnvironmentAndClient('DataIntegrity', () => import('@modules/data-integrity/data-integrity.module').then(x => x.DataIntegrityModule)))\r\n .concat(getRoutesWithEnvironmentAndClient('TierStructure/Global', () => import('@modules/tier-structure-global/tier-structure-global.module').then(x => x.TierStructureGlobalModule)))\r\n .concat(getRoutesWithEnvironmentAndClient('TierStructure/CaseLevel', () => import('@modules/tier-structure-case-level/tier-structure-case-level.module').then(x => x.TierStructureCaseLevelModule)))\r\n .concat(getRoutesWithEnvironmentAndClient('PaymentFileConfiguration', () => import('@modules/payment-file-configuration/payment-file-configuration.module').then(x => x.PaymentFileConfigurationModule)))\r\n .concat(getRoutesWithEnvironmentAndClient('CaseSSOServiceProviders', () => import('@modules/case-sso-service-providers/case-sso-service-providers.module').then(x => x.CaseSSOServiceProvidersModule)))\r\n .concat(getRoutesWithEnvironmentAndClient('CaseSSO', () => import('@modules/case-sso/case-sso.module').then(x => x.CaseSSOModule)))\r\n .concat(getRoutesWithEnvironmentAndClient('VideoConfiguration', () => import('@modules/video-config/video-config.module').then(x => x.VideoConfigModule)))\r\n .concat(getRoutesWithEnvironmentAndClient('WEX', () => import('@modules/wex-sso/wex-sso.module').then(x => x.WexSSOModule)))\r\n },\r\n //The following paths must stay at the end of this list,\r\n //so they do not take priority over other paths.\r\n {\r\n path: ':environment',\r\n pathMatch: 'full',\r\n redirectTo: ':environment/Dashboards'\r\n },\r\n {\r\n path: ':environment/:clientName',\r\n pathMatch: 'full',\r\n redirectTo: ':environment/:clientName/Dashboards'\r\n },\r\n {\r\n path: '**',\r\n component: NotFoundComponent,\r\n title: '404 Error - Page Not Found'\r\n }\r\n];\r\n","import { Injectable } from \"@angular/core\";\r\nimport { ActivatedRouteSnapshot, RouteReuseStrategy } from \"@angular/router\";\r\nimport { CustomRouteData } from \"@modules/common/models/custom-route-data\";\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class StingrayRouteReuseStrategy implements RouteReuseStrategy {\r\n shouldDetach(route: ActivatedRouteSnapshot): boolean {\r\n return false;\r\n }\r\n\r\n store(route: ActivatedRouteSnapshot, handle: {} | null): void {\r\n }\r\n\r\n shouldAttach(route: ActivatedRouteSnapshot): boolean {\r\n return false;\r\n }\r\n\r\n retrieve(route: ActivatedRouteSnapshot): {} | null {\r\n return null;\r\n }\r\n\r\n shouldReuseRoute(future: ActivatedRouteSnapshot, curr: ActivatedRouteSnapshot): boolean {\r\n while (future.firstChild) {\r\n future = future.firstChild;\r\n }\r\n\r\n while (curr.firstChild) {\r\n curr = curr.firstChild;\r\n }\r\n\r\n if (future.routeConfig?.data && curr.routeConfig && future.routeConfig.data == curr.routeConfig.data) {\r\n const nonReuseProperties = (future.routeConfig.data).allowRouteReuse;\r\n if (nonReuseProperties) {\r\n for (let i = 0; i < nonReuseProperties.length; i++) {\r\n if (curr.params[nonReuseProperties[i]] != 'NEW-RECORD' && future.params[nonReuseProperties[i]] != curr.params[nonReuseProperties[i]]) {\r\n break;\r\n }\r\n }\r\n return true;\r\n }\r\n }\r\n\r\n window.scroll(0, 0);\r\n return false;\r\n }\r\n}\r\n","import { CommonModule } from '@angular/common';\r\nimport { NgModule } from '@angular/core';\r\nimport { RouteReuseStrategy, RouterModule } from '@angular/router';\r\nimport { StingrayCommonModule } from '@modules/common/common.module';\r\nimport { NavigationModule } from '@modules/navigation/navigation.module';\r\nimport { ROUTES } from '@modules/routing/routes';\r\nimport { StingrayRouteReuseStrategy } from '@modules/routing/services/stingray-route-reuse-strategy';\r\n\r\n@NgModule({\r\n declarations: [\r\n ],\r\n imports: [\r\n CommonModule,\r\n StingrayCommonModule,\r\n NavigationModule,\r\n RouterModule.forRoot(ROUTES)\r\n ],\r\n providers: [\r\n {\r\n provide: RouteReuseStrategy,\r\n useClass: StingrayRouteReuseStrategy\r\n }\r\n ]\r\n})\r\nexport class StingrayRoutingModule {\r\n}\r\n","import { Component, Inject, OnDestroy, OnInit, ViewChild } from '@angular/core';\r\nimport { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog';\r\nimport { CountdownComponent } from '@modules/common/components/countdown/countdown.component';\r\nimport { SessionExpirationDialogArgs } from '@modules/common/models/session-expiration-dialog-args';\r\nimport { SessionExpirationDialogResult } from '@modules/common/models/session-expiration-dialog-result';\r\nimport { UserSessionService } from '@modules/common/services/user-session.service';\r\nimport { Subscription } from 'rxjs';\r\n\r\n@Component({\r\n selector: 'app-session-expiration-dialog',\r\n templateUrl: './session-expiration-dialog.component.html',\r\n styleUrls: ['./session-expiration-dialog.component.scss']\r\n})\r\nexport class SessionExpirationDialogComponent implements OnInit, OnDestroy {\r\n @ViewChild(CountdownComponent, { static: true })\r\n public countdownComponent!: CountdownComponent;\r\n\r\n private _userSessionChangedSubscription?: Subscription;\r\n\r\n constructor(\r\n private _dialogRef: MatDialogRef,\r\n @Inject(MAT_DIALOG_DATA) private _args: SessionExpirationDialogArgs,\r\n private _userSessionService: UserSessionService\r\n ) {}\r\n\r\n public ngOnInit(): void {\r\n this.countdownComponent.countdownTo(this._args.expirationDate);\r\n this._userSessionChangedSubscription = this._userSessionService.userSessionChanged().subscribe(result => {\r\n if (result && result.authenticationToken && result.authenticationToken!.token != this._args.token) {\r\n this._dialogRef.close();\r\n }\r\n })\r\n }\r\n\r\n public ngOnDestroy(): void {\r\n if (this._userSessionChangedSubscription) {\r\n this._userSessionChangedSubscription.unsubscribe();\r\n }\r\n }\r\n\r\n public signOut() {\r\n this._dialogRef.close({\r\n action: 'signOut',\r\n clearRedirectedFromUrl: true\r\n });\r\n }\r\n\r\n public refreshSession() {\r\n this._dialogRef.close({\r\n action: 'refresh'\r\n });\r\n }\r\n\r\n public expire() {\r\n this._dialogRef.close({\r\n action: 'signOut',\r\n clearRedirectedFromUrl: false\r\n });\r\n }\r\n}\r\n","\r\n
\r\n
\r\n

Session Expiration

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

Your session is about to expire. Would you like to stay logged in?

\r\n
\r\n \r\n
\r\n
\r\n \r\n \r\n
\r\n
\r\n
\r\n
\r\n","import { Injectable } from \"@angular/core\";\r\nimport { MatDialog } from \"@angular/material/dialog\";\r\nimport { UserSession } from \"@modules/api/user-session.generated\";\r\nimport { SessionExpirationDialogComponent } from \"@modules/common/components/session-expiration-dialog/session-expiration-dialog.component\";\r\nimport { SessionExpirationDialogArgs } from \"@modules/common/models/session-expiration-dialog-args\";\r\nimport { SessionExpirationDialogResult } from '@modules/common/models/session-expiration-dialog-result';\r\nimport { LogoutService } from \"@modules/common/services/logout.service\";\r\nimport { RefreshSessionService } from \"@modules/common/services/refresh-session.service\";\r\nimport { UserSessionService } from '@modules/common/services/user-session.service';\r\nimport * as moment from 'moment';\r\n\r\nconst SHOW_MODAL_THRESHHOLD = 180; //number of seconds before session expires to show the modal\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class UserSessionTimeoutService {\r\n constructor(\r\n private _userSessionService: UserSessionService,\r\n private _dialog: MatDialog,\r\n private _refreshSessionService: RefreshSessionService,\r\n private _logoutService: LogoutService\r\n ) { }\r\n\r\n public initialize() {\r\n this._userSessionService.userSessionChanged().subscribe(result => {\r\n if (this._sessionExpirationTimeout) {\r\n clearTimeout(this._sessionExpirationTimeout);\r\n }\r\n if (result && result.authenticationToken) {\r\n this.setSessionTimeout(moment.utc(this._userSessionService.getUserSession()!.authenticationToken!.expiresAt).diff(moment.utc(), 'seconds') - SHOW_MODAL_THRESHHOLD);\r\n }\r\n });\r\n }\r\n\r\n private _sessionExpirationTimeout?: number;\r\n\r\n\r\n private setSessionTimeout(timeoutDuration: number) {\r\n this._sessionExpirationTimeout = window.setTimeout(() => {\r\n const session = this._userSessionService.getUserSession();\r\n\r\n if (session\r\n && session.authenticationToken\r\n && session.authenticationToken.expiresAt\r\n && moment.utc(session.authenticationToken.expiresAt).diff(moment.utc(), 'seconds') <= SHOW_MODAL_THRESHHOLD + 2 //+2 is just for a little safety if the modal shows early (which should never happen)\r\n ) {\r\n this._dialog.open(SessionExpirationDialogComponent, {\r\n disableClose: true,\r\n data: {\r\n expirationDate: session.authenticationToken.expiresAt,\r\n token: session.authenticationToken.token\r\n }\r\n }).afterClosed().subscribe(result => {\r\n if (result) {\r\n if (result.action == 'signOut') {\r\n this._logoutService.logout(result.clearRedirectedFromUrl);\r\n } else if (result.action == 'refresh') {\r\n this.refreshSession();\r\n }\r\n }\r\n });\r\n }\r\n }, timeoutDuration * 1000);\r\n }\r\n\r\n private refreshSession() {\r\n this._refreshSessionService.refreshSession({\r\n authenticationToken: this._userSessionService.getUserSession()!.authenticationToken!.token!,\r\n refreshToken: this._userSessionService.getUserSession()!.refreshToken!\r\n }).subscribe((result?: UserSession) => {\r\n if (result) {\r\n this._userSessionService.setUserSession(result);\r\n }\r\n });\r\n }\r\n}\r\n","import { Component, OnInit } from '@angular/core';\r\nimport { IsLoadingService } from '@modules/common/services/is-loading.service';\r\n\r\n@Component({\r\n selector: 'app-loading-overlay',\r\n templateUrl: './loading-overlay.component.html',\r\n styleUrls: ['./loading-overlay.component.scss'],\r\n})\r\nexport class LoadingOverlayComponent implements OnInit {\r\n constructor(private _isLoadingService: IsLoadingService) { }\r\n\r\n public ngOnInit(): void {\r\n this._isLoadingService.observable.subscribe(x => {\r\n this.isLoading = x;\r\n });\r\n }\r\n\r\n public isLoading: boolean = false;\r\n}\r\n","
\r\n
","import { DOCUMENT } from '@angular/common';\r\nimport { Component, Inject } from '@angular/core';\r\nimport { MatDialog } from '@angular/material/dialog';\r\nimport { NavigationCancel, NavigationStart, RouteConfigLoadEnd, RouteConfigLoadStart, Router } from '@angular/router';\r\nimport { AppInsightsService } from '@modules/common/services/app-insights.service';\r\nimport { IsLoadingService } from '@modules/common/services/is-loading.service';\r\nimport { UserSessionTimeoutService } from '@modules/common/services/user-session-timeout.service';\r\nimport { filter } from 'rxjs/operators';\r\n\r\n@Component({\r\n selector: 'app-root',\r\n template: ''\r\n})\r\nexport class AppComponent {\r\n constructor(\r\n userSessionTimeoutService: UserSessionTimeoutService,\r\n appInsightsService: AppInsightsService,\r\n isLoadingService: IsLoadingService,\r\n @Inject(DOCUMENT) document: Document,\r\n private router: Router,\r\n private matDialog: MatDialog\r\n ) {\r\n userSessionTimeoutService.initialize();\r\n appInsightsService.initialize();\r\n\r\n this.router.events\r\n .pipe(filter(event => event instanceof NavigationStart))\r\n .subscribe(() => {\r\n this.matDialog.closeAll();\r\n });\r\n\r\n //Show spinner when lazy loading modules from routes\r\n let isLoading = false;\r\n this.router.events\r\n .pipe(filter(event => event instanceof RouteConfigLoadStart))\r\n .subscribe(() => {\r\n isLoading = true;\r\n isLoadingService.setLoading();\r\n });\r\n\r\n //Clear spinner when lazy loading is done\r\n this.router.events\r\n .pipe(filter(event => event instanceof RouteConfigLoadEnd || event instanceof NavigationCancel))\r\n .subscribe(() => {\r\n if (isLoading) {\r\n isLoadingService.clearLoading();\r\n isLoading = false;\r\n }\r\n });\r\n\r\n document.body.addEventListener('dragenter', onDrag);\r\n document.body.addEventListener('dragover', onDrag);\r\n document.body.addEventListener('drop', onDrag);\r\n }\r\n}\r\n\r\nfunction onDrag(e: DragEvent): void {\r\n if (e.dataTransfer) {\r\n e.dataTransfer.dropEffect = 'none';\r\n e.dataTransfer.effectAllowed = 'none';\r\n }\r\n e.preventDefault();\r\n e.stopPropagation();\r\n}\r\n","import { APP_BASE_HREF, CommonModule, CurrencyPipe } from '@angular/common';\r\nimport { HttpClientModule } from '@angular/common/http';\r\nimport { APP_INITIALIZER, ErrorHandler, NgModule } from '@angular/core';\r\nimport { MAT_MOMENT_DATE_FORMATS } from '@angular/material-moment-adapter';\r\nimport { DateAdapter, MAT_DATE_FORMATS } from '@angular/material/core';\r\nimport { MatExpansionPanelDefaultOptions, MAT_EXPANSION_PANEL_DEFAULT_OPTIONS } from '@angular/material/expansion';\r\nimport { MatFormFieldDefaultOptions, MAT_FORM_FIELD_DEFAULT_OPTIONS } from '@angular/material/form-field';\r\nimport { MatPaginatorDefaultOptions, MAT_PAGINATOR_DEFAULT_OPTIONS } from '@angular/material/paginator';\r\nimport { MatTabsConfig, MAT_TABS_CONFIG } from '@angular/material/tabs';\r\nimport { BrowserModule } from '@angular/platform-browser';\r\nimport { BrowserAnimationsModule } from '@angular/platform-browser/animations';\r\nimport { RouterModule } from '@angular/router';\r\nimport { StingrayCommonModule } from '@modules/common/common.module';\r\nimport { ErrorHandlerService } from '@modules/common/services/error-handler.service';\r\nimport { MomentUtcDateAdapter } from '@modules/common/services/moment-utc-date-adapter';\r\nimport { UserSessionService } from '@modules/common/services/user-session.service';\r\nimport { StingrayRoutingModule } from '@modules/routing/routing.module';\r\nimport { DragulaModule } from 'ng2-dragula';\r\nimport { AppComponent } from 'src/app/app.component';\r\n\r\n/**\r\n * Application-wide default options for mat-form-field elements.\r\n */\r\nconst MAT_FORM_FIELD_OPTIONS: MatFormFieldDefaultOptions = {\r\n appearance: 'fill',\r\n floatLabel: 'always'\r\n};\r\n\r\n/**\r\n * Application-wide default options for mat-tab-group elements.\r\n */\r\nconst MAT_TAB_GROUP_OPTIONS: MatTabsConfig = {\r\n animationDuration: '0ms'\r\n};\r\n\r\n/**\r\n * Application-wide default options for mat-paginator elements.\r\n */\r\nconst MAT_PAGINATOR_OPTIONS: MatPaginatorDefaultOptions = {\r\n formFieldAppearance: 'fill'\r\n};\r\n\r\n/**\r\n * Application-wide default options for mat-expansion-panel and related elements.\r\n */\r\nconst MAT_EXPANSION_PANEL_OPTIONS: MatExpansionPanelDefaultOptions = {\r\n hideToggle: true,\r\n collapsedHeight: '',\r\n expandedHeight: ''\r\n};\r\n\r\n@NgModule({\r\n bootstrap: [AppComponent],\r\n declarations: [\r\n AppComponent\r\n ],\r\n imports: [\r\n BrowserModule,\r\n BrowserAnimationsModule,\r\n CommonModule,\r\n HttpClientModule,\r\n RouterModule,\r\n StingrayCommonModule,\r\n StingrayRoutingModule,\r\n DragulaModule.forRoot()\r\n ],\r\n providers: [\r\n { provide: 'BASE_URL', useFactory: getBaseUrl },\r\n { provide: APP_BASE_HREF, useFactory: getBaseHref },\r\n { provide: MAT_DATE_FORMATS, useValue: MAT_MOMENT_DATE_FORMATS },\r\n { provide: DateAdapter, useClass: MomentUtcDateAdapter },\r\n {\r\n provide: APP_INITIALIZER,\r\n useFactory: appInitializer,\r\n multi: true,\r\n deps: [UserSessionService]\r\n },\r\n { provide: ErrorHandler, useClass: ErrorHandlerService },\r\n CurrencyPipe,\r\n { provide: MAT_FORM_FIELD_DEFAULT_OPTIONS, useValue: MAT_FORM_FIELD_OPTIONS },\r\n { provide: MAT_TABS_CONFIG, useValue: MAT_TAB_GROUP_OPTIONS },\r\n { provide: MAT_PAGINATOR_DEFAULT_OPTIONS, useValue: MAT_PAGINATOR_OPTIONS },\r\n { provide: MAT_EXPANSION_PANEL_DEFAULT_OPTIONS, useValue: MAT_EXPANSION_PANEL_OPTIONS }\r\n ]\r\n})\r\nexport class AppModule {\r\n}\r\n\r\nexport function appInitializer(userSessionService: UserSessionService): () => Promise {\r\n return (): Promise => {\r\n return userSessionService.initialize();\r\n };\r\n}\r\n\r\nexport function getBaseUrl() {\r\n return document.getElementsByTagName('base')[0].href;\r\n}\r\n\r\nfunction getBaseHref(): string {\r\n //The actual tag's href property is set by the --base-href option in ng build. That property\r\n //must be set to the CDN because that's where we upload all of the static assets (.js and .css files).\r\n //This function is to return the base used for routing. It has to include the scheme and authority\r\n //of the URL so that it works for both ng serve (development) and ng build (deployed site).\r\n //This functionality used to be provided by the --deploy-url option of ng build, but that property\r\n //was deprecated without a real replacement, so now we have to work around it.\r\n return window.location.origin;\r\n}\r\n","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\nexport function getBaseUrl() {\r\n return document.getElementsByTagName('base')[0].href;\r\n}\r\n\r\nconst providers = [\r\n { provide: 'BASE_URL', useFactory: getBaseUrl, deps: [] }\r\n];\r\n\r\nif (environment.production) {\r\n enableProdMode();\r\n}\r\n\r\nplatformBrowserDynamic(providers).bootstrapModule(AppModule)\r\n .catch(err => console.log(err));\r\n","var map = {\n\t\"./af\": 86054,\n\t\"./af.js\": 86054,\n\t\"./ar\": 92514,\n\t\"./ar-dz\": 40890,\n\t\"./ar-dz.js\": 40890,\n\t\"./ar-kw\": 70495,\n\t\"./ar-kw.js\": 70495,\n\t\"./ar-ly\": 85623,\n\t\"./ar-ly.js\": 85623,\n\t\"./ar-ma\": 25893,\n\t\"./ar-ma.js\": 25893,\n\t\"./ar-sa\": 42751,\n\t\"./ar-sa.js\": 42751,\n\t\"./ar-tn\": 85234,\n\t\"./ar-tn.js\": 85234,\n\t\"./ar.js\": 92514,\n\t\"./az\": 29861,\n\t\"./az.js\": 29861,\n\t\"./be\": 1406,\n\t\"./be.js\": 1406,\n\t\"./bg\": 11073,\n\t\"./bg.js\": 11073,\n\t\"./bm\": 73935,\n\t\"./bm.js\": 73935,\n\t\"./bn\": 69205,\n\t\"./bn-bd\": 25070,\n\t\"./bn-bd.js\": 25070,\n\t\"./bn.js\": 69205,\n\t\"./bo\": 83174,\n\t\"./bo.js\": 83174,\n\t\"./br\": 89498,\n\t\"./br.js\": 89498,\n\t\"./bs\": 65048,\n\t\"./bs.js\": 65048,\n\t\"./ca\": 16018,\n\t\"./ca.js\": 16018,\n\t\"./cs\": 97452,\n\t\"./cs.js\": 97452,\n\t\"./cv\": 66059,\n\t\"./cv.js\": 66059,\n\t\"./cy\": 11808,\n\t\"./cy.js\": 11808,\n\t\"./da\": 97424,\n\t\"./da.js\": 97424,\n\t\"./de\": 58431,\n\t\"./de-at\": 74889,\n\t\"./de-at.js\": 74889,\n\t\"./de-ch\": 79818,\n\t\"./de-ch.js\": 79818,\n\t\"./de.js\": 58431,\n\t\"./dv\": 22335,\n\t\"./dv.js\": 22335,\n\t\"./el\": 6669,\n\t\"./el.js\": 6669,\n\t\"./en-au\": 54531,\n\t\"./en-au.js\": 54531,\n\t\"./en-ca\": 60092,\n\t\"./en-ca.js\": 60092,\n\t\"./en-gb\": 11719,\n\t\"./en-gb.js\": 11719,\n\t\"./en-ie\": 51342,\n\t\"./en-ie.js\": 51342,\n\t\"./en-il\": 79043,\n\t\"./en-il.js\": 79043,\n\t\"./en-in\": 97588,\n\t\"./en-in.js\": 97588,\n\t\"./en-nz\": 66252,\n\t\"./en-nz.js\": 66252,\n\t\"./en-sg\": 84334,\n\t\"./en-sg.js\": 84334,\n\t\"./eo\": 60377,\n\t\"./eo.js\": 60377,\n\t\"./es\": 65919,\n\t\"./es-do\": 24717,\n\t\"./es-do.js\": 24717,\n\t\"./es-mx\": 39743,\n\t\"./es-mx.js\": 39743,\n\t\"./es-us\": 61224,\n\t\"./es-us.js\": 61224,\n\t\"./es.js\": 65919,\n\t\"./et\": 35441,\n\t\"./et.js\": 35441,\n\t\"./eu\": 97406,\n\t\"./eu.js\": 97406,\n\t\"./fa\": 40590,\n\t\"./fa.js\": 40590,\n\t\"./fi\": 62335,\n\t\"./fi.js\": 62335,\n\t\"./fil\": 98924,\n\t\"./fil.js\": 98924,\n\t\"./fo\": 79772,\n\t\"./fo.js\": 79772,\n\t\"./fr\": 94950,\n\t\"./fr-ca\": 53712,\n\t\"./fr-ca.js\": 53712,\n\t\"./fr-ch\": 47312,\n\t\"./fr-ch.js\": 47312,\n\t\"./fr.js\": 94950,\n\t\"./fy\": 99107,\n\t\"./fy.js\": 99107,\n\t\"./ga\": 1877,\n\t\"./ga.js\": 1877,\n\t\"./gd\": 22344,\n\t\"./gd.js\": 22344,\n\t\"./gl\": 43901,\n\t\"./gl.js\": 43901,\n\t\"./gom-deva\": 60407,\n\t\"./gom-deva.js\": 60407,\n\t\"./gom-latn\": 27122,\n\t\"./gom-latn.js\": 27122,\n\t\"./gu\": 60234,\n\t\"./gu.js\": 60234,\n\t\"./he\": 48763,\n\t\"./he.js\": 48763,\n\t\"./hi\": 17409,\n\t\"./hi.js\": 17409,\n\t\"./hr\": 93125,\n\t\"./hr.js\": 93125,\n\t\"./hu\": 23618,\n\t\"./hu.js\": 23618,\n\t\"./hy-am\": 55723,\n\t\"./hy-am.js\": 55723,\n\t\"./id\": 82879,\n\t\"./id.js\": 82879,\n\t\"./is\": 48486,\n\t\"./is.js\": 48486,\n\t\"./it\": 21823,\n\t\"./it-ch\": 86484,\n\t\"./it-ch.js\": 86484,\n\t\"./it.js\": 21823,\n\t\"./ja\": 44726,\n\t\"./ja.js\": 44726,\n\t\"./jv\": 67990,\n\t\"./jv.js\": 67990,\n\t\"./ka\": 74250,\n\t\"./ka.js\": 74250,\n\t\"./kk\": 6120,\n\t\"./kk.js\": 6120,\n\t\"./km\": 87976,\n\t\"./km.js\": 87976,\n\t\"./kn\": 60908,\n\t\"./kn.js\": 60908,\n\t\"./ko\": 17285,\n\t\"./ko.js\": 17285,\n\t\"./ku\": 19187,\n\t\"./ku.js\": 19187,\n\t\"./ky\": 52623,\n\t\"./ky.js\": 52623,\n\t\"./lb\": 38276,\n\t\"./lb.js\": 38276,\n\t\"./lo\": 90315,\n\t\"./lo.js\": 90315,\n\t\"./lt\": 56963,\n\t\"./lt.js\": 56963,\n\t\"./lv\": 50564,\n\t\"./lv.js\": 50564,\n\t\"./me\": 90570,\n\t\"./me.js\": 90570,\n\t\"./mi\": 24750,\n\t\"./mi.js\": 24750,\n\t\"./mk\": 15084,\n\t\"./mk.js\": 15084,\n\t\"./ml\": 80696,\n\t\"./ml.js\": 80696,\n\t\"./mn\": 50167,\n\t\"./mn.js\": 50167,\n\t\"./mr\": 62068,\n\t\"./mr.js\": 62068,\n\t\"./ms\": 89162,\n\t\"./ms-my\": 67123,\n\t\"./ms-my.js\": 67123,\n\t\"./ms.js\": 89162,\n\t\"./mt\": 29441,\n\t\"./mt.js\": 29441,\n\t\"./my\": 67976,\n\t\"./my.js\": 67976,\n\t\"./nb\": 90382,\n\t\"./nb.js\": 90382,\n\t\"./ne\": 72430,\n\t\"./ne.js\": 72430,\n\t\"./nl\": 66093,\n\t\"./nl-be\": 43698,\n\t\"./nl-be.js\": 43698,\n\t\"./nl.js\": 66093,\n\t\"./nn\": 43850,\n\t\"./nn.js\": 43850,\n\t\"./oc-lnc\": 39332,\n\t\"./oc-lnc.js\": 39332,\n\t\"./pa-in\": 88446,\n\t\"./pa-in.js\": 88446,\n\t\"./pl\": 4465,\n\t\"./pl.js\": 4465,\n\t\"./pt\": 93325,\n\t\"./pt-br\": 24562,\n\t\"./pt-br.js\": 24562,\n\t\"./pt.js\": 93325,\n\t\"./ro\": 35463,\n\t\"./ro.js\": 35463,\n\t\"./ru\": 57093,\n\t\"./ru.js\": 57093,\n\t\"./sd\": 62996,\n\t\"./sd.js\": 62996,\n\t\"./se\": 17191,\n\t\"./se.js\": 17191,\n\t\"./si\": 58047,\n\t\"./si.js\": 58047,\n\t\"./sk\": 14384,\n\t\"./sk.js\": 14384,\n\t\"./sl\": 41849,\n\t\"./sl.js\": 41849,\n\t\"./sq\": 60543,\n\t\"./sq.js\": 60543,\n\t\"./sr\": 24443,\n\t\"./sr-cyrl\": 82791,\n\t\"./sr-cyrl.js\": 82791,\n\t\"./sr.js\": 24443,\n\t\"./ss\": 26389,\n\t\"./ss.js\": 26389,\n\t\"./sv\": 65732,\n\t\"./sv.js\": 65732,\n\t\"./sw\": 58941,\n\t\"./sw.js\": 58941,\n\t\"./ta\": 23903,\n\t\"./ta.js\": 23903,\n\t\"./te\": 48192,\n\t\"./te.js\": 48192,\n\t\"./tet\": 39894,\n\t\"./tet.js\": 39894,\n\t\"./tg\": 72498,\n\t\"./tg.js\": 72498,\n\t\"./th\": 29035,\n\t\"./th.js\": 29035,\n\t\"./tk\": 29038,\n\t\"./tk.js\": 29038,\n\t\"./tl-ph\": 8023,\n\t\"./tl-ph.js\": 8023,\n\t\"./tlh\": 5971,\n\t\"./tlh.js\": 5971,\n\t\"./tr\": 23504,\n\t\"./tr.js\": 23504,\n\t\"./tzl\": 5340,\n\t\"./tzl.js\": 5340,\n\t\"./tzm\": 75575,\n\t\"./tzm-latn\": 46284,\n\t\"./tzm-latn.js\": 46284,\n\t\"./tzm.js\": 75575,\n\t\"./ug-cn\": 44926,\n\t\"./ug-cn.js\": 44926,\n\t\"./uk\": 69831,\n\t\"./uk.js\": 69831,\n\t\"./ur\": 39853,\n\t\"./ur.js\": 39853,\n\t\"./uz\": 61268,\n\t\"./uz-latn\": 22286,\n\t\"./uz-latn.js\": 22286,\n\t\"./uz.js\": 61268,\n\t\"./vi\": 33865,\n\t\"./vi.js\": 33865,\n\t\"./x-pseudo\": 7950,\n\t\"./x-pseudo.js\": 7950,\n\t\"./yo\": 38976,\n\t\"./yo.js\": 38976,\n\t\"./zh-cn\": 66842,\n\t\"./zh-cn.js\": 66842,\n\t\"./zh-hk\": 69114,\n\t\"./zh-hk.js\": 69114,\n\t\"./zh-mo\": 68043,\n\t\"./zh-mo.js\": 68043,\n\t\"./zh-tw\": 65228,\n\t\"./zh-tw.js\": 65228\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 = 73454;"],"x_google_ignoreList":[88]}