{"version":3,"file":"main.4d58cf486dfb1f2c.js","mappings":"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CAAEpD,QAASroB,KAAewrB,WAAYE,IACtC,CAAErD,QAASsD,KAAkBC,SAAUC,MACvC,CAAExD,QAASyD,KAAavD,SAAU3P,GAClC,CACIyP,QAAS0D,MACTP,WAAYQ,GACZC,OAAO,EACPC,KAAM,CAACjZ,MAEX,CAAEoV,QAAS8D,MAAc5D,SAAU9P,GACnC2T,KACA,CAAE/D,QAASgE,KAAgCT,SAAUjB,IACrD,CAAEtC,QAASiE,KAAiBV,SAAUd,IACtC,CAAEzC,QAASkE,KAA+BX,SAAUZ,IACpD,CAAE3C,QAASmE,KAAqCZ,SAAUV,KAC7D1C,SA5BGiE,KACAC,KACAtwB,KACAuwB,KACArwB,KACAH,IACAisB,GACAwE,gBACAC,cxC7DuC,gBwC8DvCC,UAqBKxB,CAAS,KAGhB,SAAUU,GAAeppB,GAC3B,MAAO,IACIA,EAAmB8P,YAElC,CAEM,SAAU+Y,KACZ,OAAOrkB,SAAS2lB,qBAAqB,QAAQ,GAAGrM,IACpD,CAEA,SAASgL,KAOL,OAAOna,OAAOyb,SAASC,MAC3B,CCpGA,MAAMC,GAAY,CAChB,CAAE7E,QAAS,WAAYmD,WALnB,SAAUC,KACd,OAAOrkB,SAAS2lB,qBAAqB,QAAQ,GAAGrM,IAClD,EAGiDwL,KAAM,MAGnD5hB,EACF6iB,SAGFC,KAAuBF,IAAWG,gBAAgB/B,IAC/CgC,MAAMC,GAAOjV,QAAQkV,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,gCACAvkB,EAEA,WACA,CACAykB,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","getCurrentUserDashboards","getCurrentUserPowerBIReports","getCurrentUserPowerBIPaginatedReports","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","loadAppInsights","trackPageView","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","userInfo","displayName","accountSettingsUrl","NavHeaderComponent","_environmentListService","updateEnvironment","environmentName","toLowerCase","nonDefaultEnvironmentSelected","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","menuItem","populateUrlParams","addDynamicMenuItemsToStaticMenu","menuTitle","o","paginatedReportMenuItems","concat","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","baseUrlSegment","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","FilesModule","DeductionCodesModule","ParticipantTransactionsModule","DependentVerificationModule","DependentVerificationRulesModule","CensusReportsModule","IssueTrackerModule","AutoCommitCancelTransactionModule","DataIntegrityModule","TierStructureGlobalModule","TierStructureCaseLevelModule","PaymentFileConfigurationModule","CaseSSOServiceProvidersModule","CaseSSOModule","VideoConfigModule","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","querySelectorAll","removeAttribute","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","NgxGoogleAnalyticsModule","NgxGoogleAnalyticsRouterModule","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\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 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 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 { 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 _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._currentCaseService.getCurrentCaseName() && this._currentEnvironmentService.getCurrentEnvironmentName() && \r\n (this._permissionService.verifyPermission('View Dashboards') || this._permissionService.verifyPermission('View Power BI Reports'))) {\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 });\r\n } else {\r\n this._dashboardsSubject.next([]);\r\n this._powerBIReportsSubject.next([]);\r\n this._powerBIPaginatedReportsSubject.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}","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=d526c307-992e-4b3a-950d-f91df61112b3;IngestionEndpoint=https://eastus-5.in.applicationinsights.azure.com/;LiveEndpoint=https://eastus.livediagnostics.monitor.azure.com/';\r\n\r\nexport const GOOGLE_ANALYTICS_MEASUREMENT_ID = 'G-F088M9H8MH';","import { Injectable } from '@angular/core';\r\nimport { ApplicationInsights } from '@microsoft/applicationinsights-web';\r\nimport { APPLICATION_INSIGHTS_CONNECTION_STRING } from 'src/environments/environment';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class AppInsightsService {\r\n private _appInsights?: ApplicationInsights;\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 }\r\n });\r\n this._appInsights.loadAppInsights();\r\n this._appInsights.trackPageView();\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\n\r\nconst DASHBOARDS_TITLE = 'DASHBOARDS';\r\nconst REPORTING_TITLE = 'REPORTING';\r\nconst ANALYTICS_TITLE = 'ANALYTICS';\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 .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.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 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',\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: '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 },\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('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 },\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, OnInit } 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 implements OnInit {\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 public ngOnInit(): void {\r\n document.addEventListener('DOMNodeInserted', function () {\r\n const elements = document.querySelectorAll('[aria-owns]');\r\n\r\n elements.forEach(element => {\r\n element.removeAttribute('aria-owns');\r\n });\r\n });\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 { NgxGoogleAnalyticsModule, NgxGoogleAnalyticsRouterModule } from 'ngx-google-analytics';\r\nimport { AppComponent } from 'src/app/app.component';\r\nimport { GOOGLE_ANALYTICS_MEASUREMENT_ID } from 'src/environments/environment';\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 NgxGoogleAnalyticsModule.forRoot(GOOGLE_ANALYTICS_MEASUREMENT_ID),\r\n NgxGoogleAnalyticsRouterModule\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]}