{"version":3,"sources":["./src/$_lazy_route_resource lazy namespace object","./src/app/adminTiles/AdminLandingController.ts","./src/app/adminTiles/AdminLandingService.ts","./src/app/adminTiles/adminTile.action.ts","./src/app/adminTiles/adminTile.action.types.ts","./src/app/adminTiles/adminTiles.reducer.ts","./src/app/banner/FxpMessageService.ts","./src/app/banner/banner.action.ts","./src/app/banner/banner.action.types.ts","./src/app/banner/banner.reducer.ts","./src/app/claims/claims.action.ts","./src/app/claims/claims.action.types.ts","./src/app/claims/claims.reducer.ts","./src/app/components/fxpbot/fxpbot.component.ts","./src/app/components/pageTour-Component/pageTour.component.ts","./src/app/components/partnerContainer-component/partnerContainer-component.ts","./src/app/components/partnerContainer-component/partnerStateService.ts","./src/app/components/powerbi-component/powerbi-container-component.ts","./src/app/components/reactContainer-component/reactpartner-component.ts","./src/app/flighting/featureFlags.action.types.ts","./src/app/flighting/featureFlags.actions.ts","./src/app/flighting/flighting.reducer.ts","./src/app/fxplazyloader.ts","./src/app/init/app.status.action.creators.ts","./src/app/init/app.status.action.types.ts","./src/app/init/app.status.reducer.ts","./src/app/leftNavigation/leftNavController.ts","./src/app/leftNavigation/leftNavigation.action.ts","./src/app/leftNavigation/leftNavigation.action.types.ts","./src/app/leftNavigation/leftNavigation.reducer.ts","./src/app/loader/UILoader.constants.ts","./src/app/loader/loader.actions.ts","./src/app/loader/loader.actions.types.ts","./src/app/loader/loader.reducer.ts","./src/app/loader/pageLoaderService.ts","./src/app/notifications/notifications.action.ts","./src/app/notifications/notifications.action.type.ts","./src/app/notifications/notifications.reducer.ts","./src/app/obo/obo.action.ts","./src/app/obo/obo.action.types.ts","./src/app/obo/obo.reducer.ts","./src/app/profile/profile.action.ts","./src/app/profile/profile.action.types.ts","./src/app/profile/profile.reducer.ts","./src/app/store/action.logger.adaptor.ts","./src/app/store/platform.reducer.ts","./src/app/store/platform.store.factory.ts","./src/app/systemMessages/PlannedDownTimeService.ts","./src/app/systemMessages/SystemMessagesService.ts","./src/app/systemMessages/systemMessage.action.ts","./src/app/systemMessages/systemMessage.action.types.ts","./src/app/systemMessages/systemMessage.reducer.ts","./src/app/systemMessages/systemMessagesController.ts","./src/app/user/user.reducer.ts","./src/fxptemplates.ts","./src/js/app.ts","./src/js/boot/fxpboot.ts","./src/js/common/ApplicationConstants.ts","./src/js/common/FxpBaseController.ts","./src/js/common/FxpWorkerActions.ts","./src/js/common/NotificationAPI.ts","./src/js/common/PouchDBProvider.ts","./src/js/common/PouchDbConnection.ts","./src/js/common/PouchDbService.ts","./src/js/common/SettingsType.ts","./src/js/common/UserInfo.ts","./src/js/common/enum/ComponentFramework.ts","./src/js/common/enum/Feedback.enum.ts","./src/js/common/enum/environment.enum.ts","./src/js/constants/AuthorNotification.constants.ts","./src/js/constants/BrowserExperienceConstants.ts","./src/js/constants/CreateAskOpsRequest.constants.ts","./src/js/constants/FxPModal.constants.ts","./src/js/constants/HelpArticle.constants.ts","./src/js/constants/SessionTimeoutModal.constants.ts","./src/js/constants/createSupportTicketRequest.constants.ts","./src/js/constants/errorCodes.ts","./src/js/constants/systemMessages.constants.ts","./src/js/context/FxpContext.ts","./src/js/controllers/HelpArticleImageController.ts","./src/js/controllers/SessionTimeoutModalController.ts","./src/js/controllers/actOnBehalfOfController.ts","./src/js/controllers/appCntrl.ts","./src/js/controllers/authorNotificationController.ts","./src/js/controllers/createAskOpsController.ts","./src/js/controllers/createSupportTicketController.ts","./src/js/controllers/dashBoardController.ts","./src/js/controllers/footerController.ts","./src/js/controllers/fxpWelcomeController.ts","./src/js/controllers/helpController.ts","./src/js/controllers/leftNavPersonalizationController.ts","./src/js/controllers/notificationController.ts","./src/js/controllers/powerBIPageController.ts","./src/js/controllers/roleNavPersonalizationController.ts","./src/js/controllers/toastNotificationController.ts","./src/js/controllers/userLookupPersonalizationController.ts","./src/js/core/RouteConfig.ts","./src/js/directives/AppDirectives.ts","./src/js/directives/adminLanding.directive.ts","./src/js/directives/changeTabIndexByClass.ts","./src/js/directives/fxpAuthorNotification.directive.ts","./src/js/directives/fxpAuthorNotificationList.directives.ts","./src/js/directives/fxpBreadcrumbLink.ts","./src/js/directives/fxpChoiceControl.directive.ts","./src/js/directives/fxpGoToTop.directive.ts","./src/js/directives/fxpHelpEvents.ts","./src/js/directives/fxpIncludeStaticTemplate.ts","./src/js/directives/fxpItems.directive.ts","./src/js/directives/fxpKeyDown.derective.ts","./src/js/directives/fxpLeftnavLink.ts","./src/js/directives/fxpNotificationKeyEventHandler.directive.ts","./src/js/directives/fxpNotificationSetFocus.directive.ts","./src/js/directives/fxpSetFocus.ts","./src/js/directives/fxpShowIfDevice.ts","./src/js/directives/fxpSkipToMainContent.directive.ts","./src/js/directives/fxpSystemMessage.directives.ts","./src/js/directives/fxpbreadcrumb.directive.ts","./src/js/directives/fxpleftnavkeydown.ts","./src/js/directives/fxptoastnotification.directive.ts","./src/js/directives/leftNavOutsideClick.ts","./src/js/directives/leftNavPersonalization.directive.ts","./src/js/directives/leftNavPersonalizationAdjustScroll.directive.ts","./src/js/directives/leftNavPersonalizationPopUp.directive.ts","./src/js/directives/leftNavPersonalizationScreenReader.ts","./src/js/directives/leftNavPersonalizationScrollToActive.ts","./src/js/directives/multilineEllipsisWithAccordion.ts","./src/js/directives/multilineellipsis.ts","./src/js/directives/ngLongPress.ts","./src/js/directives/ngRightClick.ts","./src/js/directives/scrolltotopdirective.ts","./src/js/factory/ActOnBehalfOfHelper.ts","./src/js/factory/AppControllerHelper.ts","./src/js/factory/AuthorNotificationRoleGroupHelper.ts","./src/js/factory/DashBoardHelper.ts","./src/js/factory/FxpHttpInterceptorFactory.ts","./src/js/factory/FxpPartnerHttpInterceptorHandler.ts","./src/js/factory/FxpUIDataFactory.ts","./src/js/factory/SessionTimeoutModalFactory.ts","./src/js/filters/unCamelCase.filter.ts","./src/js/iframeAppSDK/iframeAppSdk.ts","./src/js/iframeAppSDK/iframeAppSdkInferfaces.ts","./src/js/iframe_app/iframeAppConstants.ts","./src/js/iframe_app/iframeAppController.ts","./src/js/iframe_app/iframeBridgeService.ts","./src/js/module-declarations.ts","./src/js/provider/CorrelationProvider.ts","./src/js/provider/FxpBotServiceProvider.ts","./src/js/provider/SettingsServiceProvider.ts","./src/js/provider/UIStateHelperProvider.ts","./src/js/resiliency/FxpResiliency.ts","./src/js/services/AdalLoginHelperService.ts","./src/js/services/BroadCastingService.ts","./src/js/services/BrowserExperience.ts","./src/js/services/DataService.ts","./src/js/services/FxpAuthorizationService.ts","./src/js/services/FxpBreadcrumbService.ts","./src/js/services/FxpBroadcastedEvents.ts","./src/js/services/FxpComponentRegistrationService.ts","./src/js/services/FxpConfiguration.ts","./src/js/services/FxpFeedbackService.ts","./src/js/services/FxpHttpService.ts","./src/js/services/FxpIrisBotService.ts","./src/js/services/FxpOCVFeedbackService.ts","./src/js/services/FxpPartnerHttpInterceptorHooks.ts","./src/js/services/FxpRouteService.ts","./src/js/services/FxpSignalRClient.ts","./src/js/services/FxpStateTransitionService.ts","./src/js/services/FxpStorageService.ts","./src/js/services/HelpCentralService.ts","./src/js/services/MsalAuthenticationService.ts","./src/js/services/NotificationActionCenter.ts","./src/js/services/NotificationService.ts","./src/js/services/NotificationStore.ts","./src/js/services/OBOUserService.ts","./src/js/services/PartnerAppRegistrationService.ts","./src/js/services/PersonalizationService.ts","./src/js/services/TimeZoneHelper.ts","./src/js/services/UserAnnouncementUIService.ts","./src/js/services/UserClaimsService.ts","./src/js/services/UserFeedbackUIService.ts","./src/js/services/UserInfoService.ts","./src/js/services/dashboardService.ts","./src/js/services/fxp.global.store.service.ts","./src/js/services/lazyLoaderService.ts","./src/js/services/pageTourEventService.ts","./src/js/services/userProfileService.ts","./src/js/telemetry/BusinessProcessEvent.ts","./src/js/telemetry/ComponentType.ts","./src/js/telemetry/EnvironmentData.ts","./src/js/telemetry/ErrorSeverityLevel.ts","./src/js/telemetry/EventData.ts","./src/js/telemetry/EventTypes.ts","./src/js/telemetry/FeatureUsageEvent.ts","./src/js/telemetry/FxpLogHelper.ts","./src/js/telemetry/FxpLogger.ts","./src/js/telemetry/FxpLoggerServiceExtension.ts","./src/js/telemetry/FxpTelemEnumExtensions.ts","./src/js/telemetry/FxpTelemGuid.ts","./src/js/telemetry/GlobalExceptionHandler.ts","./src/js/telemetry/LogMetricBag.ts","./src/js/telemetry/LogPropertyBag.ts","./src/js/telemetry/SystemEvent.ts","./src/js/telemetry/TelemetryConfiguration.ts","./src/js/telemetry/TelemetryConst.ts","./src/js/telemetry/TelemetryData.ts","./src/js/telemetry/UserInfo.ts","./src/js/telemetry/fxpLogger.ts","./src/js/telemetry/network-connection.ts","./src/js/telemetry/telemetrycontext.ts","./src/js/utils/CommonUtils.ts","./src/js/utils/devicefactoryService.ts","./src/js/utils/systemDownOverlay.ts","external \"angular\""],"names":["webpackEmptyAsyncContext","req","Promise","resolve","then","e","Error","code","keys","module","exports","id","$rootScope","$scope","adminLandingService","fxpMessage","fxpLoggerService","fxpAuthorizationService","fxpBroadCast","fxpGlobalStoreService","telemetrySource","FXP_TELEMETRY_BASE_NAME","this","On","evnt","arg","alert","GetAdminTiles","self","DispatchGlobalAction","name","FXP_LOADERS","ADMIN_LANDING_LOADER","loadingText","GetAdminTileDetails","response","length","adminTileGroup","redirectToUnauthorizedState","preventDefault","error","addMessage","fxpUIConstants","UIMessages","AdminLandingServiceCallFailedError","ErrorMessage","messageType","bag","createPropertyBag","addToBag","objectToString","logError","ErrorMessageTitle","OnGetAdminTilesFailure","undefined","Medium","setTimeout","AdminLandingController","$inject","$http","$q","$timeout","fxpConfiguration","loggerService","msalAuthenticationService","userClaimsService","userInfoService","$base64","globalStoreService","iCount","iReqCount","iUCount","sourceForTelemetry","http","q","rootScope","timeout","sleepInterval","fxplogger","fxpServiceEndPoint","FxpAppSettings","FxpServiceEndPoint","fxpMessageSvc","GetAdminDataFromServer","source","deferred","defer","getUserRoles","userResouces","getUserAdminResources","toString","userRoles","encode","encodedUserResources","url","startTrackPerformance","accessTokenRequestInProgress","GetAdminDataFailureError","OnGetAdminDataFromServerFailure","GetAdminDataAuthFailureError","logTrace","requestHeaders","XUserClaimsToken","XTenantId","window","TenantId","XResources","method","headers","data","JSON","stringify","GetPlatformStore","dispatch","parse","sessionStorageKey","FxpAdminData","getCurrentUser","sessionStorage","reject","stopTrackPerformance","promise","isRefresh","adminTilesData","Object","GetPlatformState","AdminTiles","GetAdminDataFromCache","adminData","getItem","setAdminTiles","payload","type","SET_ADMIN_TILES","removeOboContext","REMOVE_OBO_CONTEXT","Actions","defaultState","AdminTileReducer","state","action","$interval","fxpConfigurationService","message","doNotAutoClose","trackingId","messageID","focusControlIdOnClose","controlIdToFocusOnClose","showBanner","msgTrackId","trackIdLabel","msgID","msgIDLabel","messages","some","item","MessageType","Message","trackId","uniqueTransactionId","msg","msgDate","Date","info","show","success","propbag","errorMessageWithTrackingId","location","hash","logEvent","messageClass","isAnyBlockingMessageVisible","$","activeElement","messagecontainers","msgContainer","className","first","focus","clearTimeout","monitorMessages","closeMessage","cancel","msgInterval","clearAndReload","clear","reload","msgTimeout","FxpMessageTimeout","isNaN","bind","FxpBaseConfiguration","FxpConfigurationStrings","UIStrings","MessageToasterTrackId","MessageID","CreateIfNotExist","SubscribeToPlatformState","platformState","updateBanners","Banners","push","i","indexOf","splice","dt","messageExists","toLowerCase","AddBanner","ADD_BANNER_MESSAGE","CloseBanner","CLOSE_BANNER_MESSAGE","BannerActionTypes","BannerReducer","index","slice","AddLoggedInUserClaims","userClaims","ADD_LOGGED_IN_USER_CLAIMS","logEnabled","AddCurrentUserClaims","ADD_CURRENT_USER_CLAIMS","ClaimsActionTypes","defaultClaims","ClaimsReducer","pageLoaderService","lazyLoadingService","fxpEventBroadCastService","stateService","showVirtualAssistant","renewCorrelationId","fnShowPageLoader","moduleBundle","IrisModuleBundle","bundle","IrisBundle","getInstance","load","serie","route","get","ngComponent","childComponent","ngModule","_ngModuleDefFactory","ngModuelRef","instantiateModule","loadComponent","compileAndLoadModule","ngModuleRef","catch","console","log","fnHidePageLoader","ngOnInit","OnLaunchIrisBot","moduleRef","component","componentFactory","componentFactoryResolver","resolveComponentFactory","entry","createComponent","injector","showCountClass","initPageTourComponent","pageTourComponent","pageTourBundle","getBundlesForSharedComponent","getSharedComponentDetails","bindEventListeners","OnPageTourFlyoutOpened","setPageTourFlyoutState","OnPageTourFlyoutClosed","event","props","unViewedTourCount","isOpen","isPageTourFlyoutOpen","togglePageTour","hidePageTourFlyout","showPageTourFlyout","broadCast","ShowPageTour","HidePageTour","fxpLoaderService","fxpMessageService","fxpPartnerStateService","compilerFactory","setCompilerFactory","ngOnDestroy","componentRef","remove","currentStateName","currentState","$current","addEventListener","returnValue","path","forEach","partnerAppName","routeInfo","getRegisteredAppRoute","sticky","views","currentStateHandle","timerLabel","moduleType","parent","contains","addState","time","timeEnd","properties","logException","Critical","ModuleCompilationError","label","includeRootModule","instance","constructor","ErrorInstantiatingComponent","_currentStateName","stateName","filter","PowerBiFeatureName","preReportRender","embededReportId","params","reportId","embededDashboardId","dashboardId","powerBiBaseUrl","PowerBiReportBaseUrl","powerBiService","Service","hpmFactory","wpmpFactory","routerFactory","isNullOrEmpty","showError","showDashBoard","showReport","powerBiBaseURL","powerBiFeatureUsageEvent","User","PageLoad","Web","startFeatureUsageEvent","config","embedUrl","filters","settings","getReportSettings","getAccessToken","token","accessToken","reportContainer","nativeElement","reset","powerBiReport","embed","attachEventHandlers","finally","embededDashBoardId","dashBoardContainer","powerBiDashBoard","PowerBI_Invalid_Configuration","High","powerBiComponent","featureUsageEvent","handlePowerBiLoaded","handlePowerBiRendered","handlePowerBiError","off","on","getFilters","updatedFilters","getUpdatedFilters","setFilters","propForEvents","clone","propForFeature","ActionStatus","Succeeded","endFeatureUsageEvent","accessRequestUrl","detail","errorMessage","PowerBI_OnError","Failed","filterPaneEnabled","navContentPaneEnabled","existingFilters","newFilter","existingFilterIndex","findIndex","existingFilter","target","table","column","getNewFilters","profile","getCurrentUserProfile","newFilters","operator","values","displaySettings","value","getValueForFilter","$schema","PowerBiFilterSchemaUrl","displayName","filterType","FilterType","Basic","filterValueRegExp","RegExp","PowerBiFilterValueRegularExpression","test","exec","powerBITokenURL","PowerBiEndpoint","acquireTokenAsPromise","PowerBI_Token_Failure","globalStore","stateChangeUnsubscribeCaller","unloadComponent","ngAfterViewInit","SubscribeToPartnerState","routeState","ErrorLoadingReactComponent","ErrorUnloadingReactComponent","warning","FlightingActions","UpsertFeatureFlags","UPSERT_FEATURE_FLAG","FeatureFlagReducer","setRootModuleReference","parentModuleRef","_fxprootModule","_compilerFactory","_compiler","createCompiler","useJit","jitModuleRef","compileModuleAndAllComponentsAsync","factory","partnerModule","ngModuleFactory","create","aotModuleFactoryRef","StartAppInitialization","START_APP_INITIALIZATION","CompleteAppInitialization","COMPLETE_APP_INITIALIZATION","AuthenticateUser","AUTHENTICATE_USER","FailAuthentication","FAIL_AUTHENTICATION","UpdateCounter","count","UPDATE_COUNTER","AppStatusActionTypes","Initialization","Authentication","HitCounter","AppStatusReducer","$state","dashboardService","$window","$document","deviceFactory","fxpRouteService","userProfileService","settingsService","fxpContext","fxpTelemetryContext","deviceDetector","fxpBroadCastService","currentUserDefaultState","CurrentSelectedLeftNavItem","sortObject","srtObject","srtElement","sort","a","b","expandLeftNav","OnLeftNavToggleExpandedState","isLeftNavExpanded","expandLeftNavEventHandler","isLeftNavOpen","setFocusToHamburger","resetLeftNavFocus","angular","leftNavData","internalLinks","selectedLeftNavItemLinkId","externalLinks","collapseLeftNav","$event","keyCode","keyCodes","escapeKey","enterKey","spaceBar","collapseLeftNavEventHandler","onPinFlyoutClick","uiPinUnpinActionDuration","leftNavPinUnPinActionStartTime","performance","now","isLeftNavPinned","OnLeftNavTogglePinState","element","saveLeftNavPinSetting","onPinFlyoutKeyDown","tabKey","shiftKey","visibleMenuItems","closest","find","isActingOnBehalfOf","getLoggedInUser","UserPreferencesStorageKey","replace","readContext","FxPDbName","context","userPreferences","Result","strUserPreferences","saveSettingsAPIStartTime","saveSettings","UserPreferencesSettings","saveSettingsAPIDuration","logTelemetryForPinAction","saveContext","metricConstants","RequestedUserAlias","ScreenRoute","current","Geography","getGeography","BrowserType","browser","Status","status","StatusText","statusText","getBasicProfileByAlias","loggedInUserInfo","UserBusinessRole","businessRole","SaveSettingsServiceCallFailedError","SaveLeftNavPinSetting_Error","headerMenuChange","parentId","hasChildren","_showPageDirtyPopup","setSelectedLeftNavIds","sequence","targetUIStateName","saveLeftNavToContext","stopPropagation","openFlyoutOnClick","ctrlKey","$emit","onMenuItemClick","innerItem","attr","leftNavKeydown","allMenuItems","currentMenuItemIndex","arrowDownKey","arrowUpKey","expandLeftNavEvent","leftNavItemClick","dependenciesMissing","highlightLeftNavItem","parentSequence","isMoreLinkActive","isNavLinkFocused","loggedInUserLeftNavData","oboUserLeftNavData","userAlias","getLeftNavigationData","$on","OnLeftNavHighlightByStateName","filterGLNItemForHighlight","OnUserContextChanged","currentUserChangedUserAlias","currentUserChangedRoleGroupId","currentUserChangedRoleId","fxpBreadcrumb","Array","deleteContext","onSuccessGetLeftNav","leftNavDataExists","getLeftNav","setLoggedInUserPreferences","resizeWindow","resizeLeftNavHeight","unbind","tenantId","noRoleAppRoleName","NoRole_RoleName","getUserConsolidatedRoles","roles","visibleLinksCount","getVisibleLinksCount","internalLinksCount","getArrayLength","externalLinksCount","settingLinksCount","linksCount","isMoreButtonVisible","selectedLeftNavItemSequence","visibleInternalLinksCount","Math","min","visibleExternalLinksCount","visibleSettingLinksCount","leftNavHeight","getLeftNavHeight","menuIconHeight","outerHeight","floor","headerHeight","height","footerHeight","moreHeight","innerHeight","logSystemEvent","sytemEventName","systemMessage","methodName","currentProcessName","eventData","cachedResponse","getCurrentUserFlighitngContext","flightingContext","encodedBasicProfileContext","getLeftNavData","FXP_TELEMETRY_PLATFORM_BOOTSTRAP","LeftNavServiceCallFailedError","GetLeftNavData_Failure","cachedData","saveSettingsResponseDuration","leftNavPinStatus","uiPinUnpinDurationKey","LeftNavPinStatus","SaveSettingsAPIResponseDuration","logUserAction","getDefaultStateName","copy","AdminLeftNav","LeftNavAdminData","RMDashboard","rmDashboard","FxpCapabilities","fxpCapabilities","ProfileComponent","profileComponent","getDeviceSpecificLeftNavItems","checkLinksWithMissingModules","setSequence","appLoaded","findActiveLeftNavItem","GeneralExceptionError","isMobile","applicableDevice","mobile","all","desktop","children","j","linkId","selectedLeftNavItemId","navList","leftNavItems","getGLNFlatDataStructure","clickedItem","parentItem","links","l","leftNavLink","statesWithMissingModules","LeftNavController","setLeftnav","SET_LEFTNAV","LeftNavigationReducer","ACT_ON_BEHALF_OF_LOADER","AUTHOR_NOTIFICATION_LOADER","AUTHOR_NOTIFICATION_PUBLISH_NOTIFICATION_LOADER","LEFT_NAV_PERSONALIZATION_LOADER","ROLE_NAV_PERSONALIZATION_LOADER","SYSTEM_MESSAGE_POPULATE_MESSAGE_LOADER","SYSTEM_MESSAGE_ADD_MESSAGE_LOADER","SYSTEM_MESSAGE_UPDATE_MESSAGE_LOADER","SYSTEM_MESSAGE_DELETE_MESSAGE_LOADER","FXP_BOOT_LOADER","ShowLoader","showLoader","timeoutCallback","SHOW_LOADER","HideLoader","HIDE_LOADER","ShowSpecificLoader","SHOW_SPECIFIC_LOADER","HideSpecificLoader","HIDE_SPECIFIC_LOADER","LoaderActionTypes","LoaderReducer","loader","defaultLoaderName","timeoutIntervalInMs","PageLoadTimeOut","pageLoadTimers","PageLoaderService","_instance","incomingLoaderState","Loader","showOrHideLoaders","currentLoaderState","loaderToShow","entries","fnChangeLoaderState","disablePageLoaderTimers","setPageLoadTimer","loaderToHide","currentLoader","incomingLoader","timeOutCallback","pageLoadTimer","fnCreateLoaderData","fnShowPageLoaderStep","currentStepIndex","totalStepsCount","loadingTextWithStep","fnShowInlineLoader","loaderName","fnBroadcastInlineLoading","fnHideInlineLoader","fnShowFlyoutInlineLoader","loaderTooltip","fnCreateFlyoutLoaderData","fnHideFlyoutInlineLoader","fnShowSpecificPageLoader","fnHideSpecificPageLoader","extend","flyout","loaderInstance","Spinner","lines","width","radius","scale","corners","color","opacity","rotate","direction","speed","trail","fps","spin","document","getElementById","$broadcast","OnShowHideInlineLoader","timer","PushNotification","Push_Notification","MarkNotification","Mark_Notification","DismissNotification","Dismiss_Notification","ResetNotificationCollection","Reset_Notification_Collection","NotificationActionTypes","UserNotifications","UnreadNotificationCount","NotificationReducer","AddOBOEntity","ADD_OBO_ENTITY","RemoveOBOEntity","REMOVE_OBO_ENTITY","OBOActionTypes","defaultOBOEntity","OBOReducer","AddLoggedInUserProfile","userProfile","ADD_LOGGED_IN_USER_PROFILE","AddCurrentUserProfile","ADD_CURRENT_USER_PROFILE","ProfileActionTypes","defaultProfile","ProfileReducer","_fxpLogger","_source","_eventBase","processEvent","eventName","propertyBag","CreatePropertyBag","processException","ReduxStoreException","key","PlatformReducer","LoggedInUser","CurrentUser","OBO","LeftNavigation","SystemMessages","FeatureFlags","Notifications","fxpLogger","PlatformStoreFactory","FxpStore","Create","actionLoggerAdaptor","debugMode","EnvironmentName","Get","SetLogger","CreateStore","Platform","AllowAll","SystemMessagesService","TimeZoneHelper","moment","UiString","logger","fxpSignalRService","fxpGlobalStore","errorCount","plannedDownTimeCollection","systemAnnouncementCollection","isFlashVisible","flashMessages","dismissedSysMessageIds","isSystemAnnouncementVisible","timeFormat","signalREventName","signalRTenant","onMessageFromSignalR","operation","x","payLoadObject","cleanSysMessageIdsInLocalStorage","concat","_","each","startTime","convertUtcToLocal","utc","endTime","updateFlash","intervalTimeMinutes","FlashPollingIntervalInMinutes","displayFlashBeforeMinutes","DisplayFlashBeforeMinutes","localStorage","systemMessagesInState","subscribeToSignalREvent","unsubscribeFunction","subscribe","unsubscribeSignalREvent","GetSystemAnnouncementMessageandUpdateFlash","onSystemAnnouncementSuccess","onRejected","getSystemAnnoucementCollection","updateSystemAnnouncementFlash","pollForPlannedDownTimesandUpdateFlash","onSuccess","getPlannedDownTimeCollection","nextLoad","pollForUpdateFlash","cancelNextLoad","loadPromise","pausePlannedDownTimesPoll","resumePlannedDownTimesPoll","currentLeftNavItem","downTime","isDownTimeConfigured","tempTime","isSystemDown","tz","guess","format","systemDownMessage","isSameOrAfter","subtract","isSameOrBefore","includes","PlannedDownTime_UpdateFlash_Failure","systemAnnouncementMesage","concatenateFlashMessage","PlannedDownTime_UpdateSystemAccouncement_Failure","businessCapability","isMessageConfiguredOnLeftNav","leftNavLinks","getCachedLeftNavForCurrentUser","dashboardItem","leftNavItemsWithCurrentState","leftNav","selectedItem","businessFunction","isAfter","tempMessage","isStateDown","systemDown","downStateName","targetURL","targetEventName","closeSystemAnnouncement","closeSystemMessage","messageId","sysMessage","getSystemMessagesCollectionAsync","messageCount","pageOffset","sortOrder","systemMessagesEndPoint","saveSystemMessageAsync","post","deleteSystemMessageAsync","systemMessageId","delete","promises","allSystemMessagesEndpoint","endpoint","getSystemMessages","results","reduce","acc","val","allSystemAnnouncementEndpoints","SystemMessageEndpoints","split","SystemAnnouncementEndpoints","systemMessages","UpsertSystemMessage","UPSERT_SYSTEM_MESSAGE","RemoveSystemMessage","REMOVE_SYSTEM_MESSAGE","SystemMessageActions","SystemMessageReducer","SystemMessageFeature","SystemMessageFeatureActions","scope","PersonalizationService","UserInfoService","addMessageButton","startDateModel","startTimeModel","endDateModel","endTimeModel","systemMessageCollection","messageCountCollection","messagePerPageCount","pageCount","currentPage","validPreviousPageNumber","modalType","systemMessageDateStringFormat","maxMessageLength","minDateTime","systemMessageTimeZone","Intl","DateTimeFormat","resolvedOptions","timeZone","startDatePopup","opened","endDatePopup","startDatepickerOptions","showWeeks","minDate","endDatepickerOptions","datePickerFormat","populateSystemMessagesCollection","reason","ERRORS","CANNOT_FETCH_SYSTEM_MESSAGE","SystemMessage_Read_Collection_Rejection","LOADING_TEXTS","FETCHING_MESSAGES","recordCount","ceil","convertToLocal","convertMessageUtcTimeZoneToPacificTime","toLocaleLowerCase","messageTypeDisplayText","mapMessageTypeToDisplayText","systemMessageFeatureEvent","logFeatureUsageEvent","cacheBusinessCapabilityL0List","onError","CANNOT_FETCH_BBUSINESS_WORKFLOW","SystemMessage_Fetch_Business_Workflow","getMasterLeftNavItems","businessCapabilityCollection","L0Collection","map","result","L0Mapper","obj1","obj2","unshift","businessFunctionCollection","L0","L1Collection","L1","getL1Collection","addSystemMessage","createdBy","lastModifiedBy","loggedInUser","request","convertToUtc","timeBuilder","ADDING_MESSAGE","successMessage","SUCCESS","SYSTEM_MESSAGE_ADDED","CANNOT_ADD_SYSTEM_MESSAGE","SystemMessage_Save_Failure","hideModal","updateSystemMessage","endTimeString","startTimeString","UPDATING_MESSAGE","SYSTEM_MESSAGE_UPDATED","logInformation","CANNOT_UPDATE_SYSTEM_MESSAGE","SystemMessage_Update_Failure","deleteSystemMessage","DELETING_MESSAGE","SYSTEM_MESSAGE_DELETED","areAllMessagesOfCurrentPageDeleted","changePage","CANNOT_DELETE_SYSTEM_MESSAGE","SystemMessage_Delete_Failure","updateBusinessFunctionCollection","updateMessagePerPageCount","loadNextPage","position","loadPrevPage","smCtrl","getLoggedInUserUpn","systemMessageTimeZoneCode","getCurrentTimeZoneCode","getActionNameForFeatureUsage","showModal","renewSubCorrelationId","ButtonClick","defaults","getCurrentLocalDateTime","addHoursToLocalUtcDateTime","formatDates","mapDisplayTextToMessageType","setDefaultValues","updateBusinessFunctionL1Collection","controlToFocus","changePageOnKeydown","isDefined","resetPageNumberOnBlur","resetFocus","toggleSortOrder","getStatusText","ACTIVE","EXPIRED","keyPressOnAddMessage","startDateOpen","endDateOpen","date","toISOString","updateEndDateMinValue","timepickerSpinnersFocusable","querySelectorAll","spinner","setAttribute","defaultUser","Profile","Claims","LoggedInUserReducer","CurrentUserReducer","ModuleName","run","$templateCache","put","registerModule","di","ConfitNg1ModuleName","FlightingNg1ModuleName","PartnerModules","PreLoadModules","TenantConfiguration","ocLazyLoadDebugFlag","service","fxpModule","constant","ConfitServiceEndPoint","appName","ApplicationName","envName","FlightingEnvironmentName","featureNames","FlightingConfiguration","provider","UIStateHelperProvider","appControllerHelperFactory","getUIDataFactoryObj","DashBoardHelperFactory","ActOnBehalfOfHelperFactory","AuthorNotificationRoleGroupHelper","controller","msalAuthenticationServiceProvider","configure","auth","clientId","FxpAppClientId","authority","redirectUri","origin","cache","cacheLocation","storeAuthStateInCookie","system","FxpBotServiceProvider","AppID","ConnectMeBotAppId","TopicID","ConnectMeBotTopicId","Url","ConnectMeBotEndpoint","fxpConfigInit","setSanitizedWhitelist","authenticationInit","configHttpProvider","registerRoutes","$sceProvider","enabled","SettingsServiceProvider","settingsServiceBaseUrl","FeatureFlagServiceProvider","ServiceEndpoint","FlightingServiceEndpoint","$ocLazyLoadProvider","$uiRouterProvider","plugin","$ocLazyLoad","setLazyLoader","InitializeStore","fxpRunInit","rootScopeEventHandler","BuildNumber","fxpKeyDownDirective","fxpEnterKeyPressDirective","setToFocusDirective","fxpSetFocus","clickDirective","fxpClickDirective","directive","fxpfooter","fxpheader","fxpleftnavigation","fxpOboHeader","fxpLoader","fxpbreadcrumb","fxphelpmenu","fxpnotification","fxpsystemupdatemsg","fxptoastnotification","populateNotification","getDirective","changeTabIndexByClass","authorNotificationContent","fxpAuthorNotificationRow","renderFxpBreadcrumb","breadcrumbFocusContentAria","fxpBreadcrumbLinksDirective","fxpGoToTop","fxpHelpEvents","fxpHelp","fxpHelpArticle","fxpHelpOutsideClick","fxpLeftnavLinkDirective","fxpNotificationDirective","fxpNotificationSetFocus","fxpShowIfDevice","fxpToastNotification","fxpToastNotificationContainer","leftNavOutsideClick","renderNavElementsForKeydown","leftNavPrsonalizationAdjustScroll","renderPopUpForKeydown","leftNavPersonalizationScreenReader","leftNavPersonalizationScrollToActive","multilineEllipsis","multilineEllipsisWithAccordion","intervalFlip","feedbackFlyout","getSpacedString","adminLanding","CorrelationProvider","getCommonProperties","customProperties","CLASSNAME","METHODNAME","FxpBaseUrl","evaluateFaultFeatureFlag","userName","flightingHeader","username","FaultFeatureFlagName","isAuthenticated","onLoginFailure","appControllerHelper","errorDesc","processName","errorDetails","errorDesciption","errorSource","currentTime","toLocaleString","FxpBootstrap","OnMsalLoginFailure","eventMessage","showModalPopupWindow","login","setTelemetryUserContext","onloginSuccessSubcription","$provide","decorator","$delegate","$injector","FxpTelemetryContext","fxpContextService","environmentData","ModelConfiguration","ServiceOffering","ServiceLine","ComponentId","ComponentName","IctoId","BusinessProcessName","setEnvironmentDetails","PartnerTelemetryEnvironments","setPartnerEnvironmentDetails","BaseUrl","AssetsUrl","BaseConfigDBName","onerror","lineNo","columnNo","GlobalExceptionHandler","stack","exception","cause","GlobalExceptionHandler_AngularJs","Init","$compileProvider","imgSrcSanitizationWhitelist","aHrefSanitizationWhitelist","$httpProvider","useXDomain","common","interceptors","$stateProvider","$urlRouterProvider","RequestStateName","substring","otherwise","requireADLogin","headerName","partnerTelemetryName","pageTitle","appNameForTelemetry","pageNameForTelemetry","featureName","actionName","telemetryConfig","partnerEnpoints","getRegisterEndpoints","endpoints","eval","Endpoints","jsonConcat","$cookies","oboUserService","actOnBehalfOfUserActive","isUserInfoAvailable","appBooted","LoadingStrings","Authenticating","handleAdalErrorsAuthenticating","setCurrentUser","getAccount","setCurrentUserOID","localAccountId","setCurrentUserUpn","onLoginSuccess","MakeFaultFeatureFlagEvaluateCall","getCurrentUserData","source_telemetry","loginFailureHandler","error_code","acquiretokenFailure","err","resource","OnMsalTokenFailure","ACQUIRE_TOKEN_FAILURE","isLoginRequired","AcquireTokenFailure_UnKnown_Reason","FxpLoad","PreDashboardLoad","requestedUrlCookie","sessionId","sessionIdCached","FxpSessionKey","setNewUserSession","setItem","plannedDownTimeService","fxpStateTransitionService","onStateChangeStart","stateChangeStartTime","currentPath","fromState","nextPath","toState","propBag","parseFloat","preStateDuration","pageLoadMetrics","pageTransitionStatus","sourceRoute","destinationRoute","pageDisplayName","sourceRouteURL","templateUrl","destinationRouteURL","checkStatePermission","go","errorProperites","OnStateChangeStartException","UserSessionCreated","FxpAppLaunched","StartUpFlagRetrieved","PageTourFlagRetrieved","SkypeBotInit","ProfileNotFound","RedirectedToSales","OnProfileFromGraphAPI","Application","Global","GlobalContextDBName","BootApiUrl","WorkerFilepath","PersonaConfigByRoleGroupId","PartnerDomain","PartnerDomainIss","UserProfile","UIConfigDB","UserInfo","UserClaims","host","ProfileStateName","ErrorStateNames","RequiredMessage","CouchBaseLoginContract","FxpApplaunchedKey","FxpBreadcrumbStorageKey","PageTourFeature","FxPAppName","PageTourLoggerService","SnowRequestTypeSettings","ESTenanatUrlString","SalesTenantUrlString","GraphApiProfileUrl","DefaultHelpLink","AdalLoginError","AdalLoginRequest","XUserProfileToken","FlightingStatusHeader","PIIFilterRegex","ProfileFlyoutConfig","CONST","fxpUserClaimsSession","String","StateEvents","OnStart","onInvalid","GetBasicProfileSvcName","GetUserClaimsSvcName","FXPApplicationLaunchMetric","FXPApplicationLaunchTimeMetric","UserClaimsResponseTime","UserClaimsResponseTimeError","CurrentTime","StartTime","EndTime","ServiceName","ServiceURL","UserAgent","UserProfileService","FxpAppLaunch","SessionId","UserUPN","BrowserAgent","SearchProfileServiceTime","SearchProfileServiceErrorTime","AdminPersonalizationUserNavLinksCount","FxpLoadDuration","searchProfileSvcName","TimeStamp","L0BusinessProcessName","L0Name","L0Name_L1Name","UserRoleGroup","LeftNavigationClickCountbyRoleGroup","LeftNavigationClickCountbyRole","RequestedUserRoleGroupId","FeedbackType","Action","UserFeedback","UserFeedbackErrorMessage","OBOUserRoleGroupName","OBOUserBusinessRole","OBOUserUPN","BreadcrumbString","BrowserPageTitle","LoggedinUserName","OBOUserName","OperatingSystem","BrowserVersion","DeviceType","TotalDuration","UIRenderDuration","GetSettingsAPIResponseDuration","ModifiedRoleGroupName","ModifiedRoleGroupID","ModifiedBusinessRoleName","ModifiedBusinessRoleID","OBOUserAlias","LeftNavLinksValueBeforeModification","LeftNavLinksValueAfterModification","ErrorUrl","GlobalErrorDetail","FooterLinkUrl","FooterLinkName","HeaderClickNavigatedStateName","HeaderClickNavigatedStateTemplateURL","MiniProfileIconClick","ProfileLinkClick","ChatIconClick","MailIconClick","HelpLinkParent","HelpLinkChild","HelpIconClicked","HelpView","ErrorText","UserPorfileServiceEndPoint","IsLoginRequired","IsCSABlockedUser","ModuleBootstrapping","OBOConstants","OnBehalfOfUserName","OnBehalfOfUserAlias","OnBehalfOfUserUpn","ActonBehalfMode","OnBehalfOfUserBusinessRoleId","OnBehalfOfUserBusinessRole","OnBehalfOfUserRoleGroup","AdminActOnBehaflOfDuratoin","ActonBehalfofAdminStartTime","ActonBehalfofAdminEndTime","ActionTypes","Add","Save","Submit","Remove","Cancel","Click","arrowRightKey","arrowLeftKey","BreadcrumbEventType","BreadcrumbLoad","BreadcrumbClick","askOps","createLink","viewLink","GetUserClaims","GetUserThumbnail","GetBasicProfileWithAdal","AdalTimeGetBasicProfile","DashboardLoad","LoadRoutes","SavePersonalizedNavItems","SaveRoleGroupPersonalizedNavItems","GetPersonalizedNavItems","GetMasterLeftNavItems","SendUserFeedback","GetRoleGroupDetails","GetLeftNavData","GetTenantClaims","RoleGroupId","RoleGroupName","TenantKey","TenantName","isFxpLoadedWithClaims","OnFxpLoadedHandler","OnFxpLoadCompleted","onFxpLoaded","FxpWorkerActions","_fxpouchdbworker","getWorkerInstance","startFxpWebWorker","pcworker","Worker","sendMessage","postMessage","stopFxpWebWorker","terminate","ShowNotification","title","getDBConnection","applicationName","DbConnection","createDatabase","destroy","localDatabaseName","PouchDB","getDatabase","pouchDbConnection","_docId","_localDbName","_database","save","jsonDocument","jsonDoc","documentId","documentRevision","saveUpdateDocument","getAllDocuments","options","allDocs","SettingsType","aadObjectId","alias","firstName","lastName","middleName","fullName","businessDomain","reportsTo","reportsToDisplayName","businessRoleId","seniority","standardTitle","addressBookTitleDesc","email","resourceImage","reportsToFullName","preferredFirstName","businessRoleDisplayName","roleGroupId","roleGroupName","isDefaultProfile","domain","personnelNumber","primaryTool","costCenterCode","hiringDate","terminationDate","serviceJobTitle","resourceType","alignmentType","companyCode","subAreaCode","countryCode","homeLocationNotFoundInd","timeZoneId","standardTimeZone","resourceStatus","resourceCategory","resumeUrl","functionHierarchyCode","ComponentFramework","IOCVSource","IOCVFeedbackType","IOCVManifestType","Environment","ConfirmationOptions","timeLeft","ModalOptions","windowClass","keyboard","backdrop","controllerAs","size","HelpArticleTitles","HELP_RELATED_TO_THIS_PAGE","ModuleBoostrapFailure","ModuleBoostrapFailureRequireJS","OnTelemetryContextError","OnSettingsServiceError","OBO_User_Already_Active","Get_OBO_User_Configuration_Failure","OBO_User_Search_Failure","State_Not_Found","State_Change_Failure","Msal_ResourceTokenAcuqisition_Failure","SkypeBotInit_Failure","API_Threshold_Crossed","InitializeFeedback_Failure","Error_SubmittingFeedback","Error_LoadingFeedback","GetRoleGroupDetails_Failure","PublishNotifications_Failure","PublishNotificationsRolesRoleGroup_Failure","GetRequestTypeData_Failure","CloseActOnBehalofUser_Failure","GetContextualHelpArticles_Failure","GetArticleData_Failure","SaveHelpFeedback_Failure","SearchSuggestions_Failure","SaveViewCount_Failure","ShowErrorMsgNavigateToUserLookUp","GetNotifications_Failure","GetUnreadNotificationCount_Failure","MarkAllNotificationsAsRead_Failure","DismissAllNotifications_Failure","ReadNotification_Failure","DeleteNotification_Failure","SaveNotificationDNDSetting","ErrorLoadingDashboard","ErrorFetchingTokenForPowerBI","ErrorLoadingPowerBiDashboard","SubmitRoleGroupNavPresonalization_Failure","GetRoleGroupDetailsPersonalization_Failure","GetGlobalNavMasterList_Failure","GetRoleGroupNavList_Failure","ReadToastNotification_Failure","MarkNotificationAsRead_Failure","UserLookUpSearchUser_Failure","SetSelectedUser_Failure","NavigateToPersonalizationView_Failure","ErrorOnLeftNavClick","HandleProfileServiceResponse","AdalOnError","AdalOnErrorWithErrorCode","DefaultStateNotConfigured","ErrorRegisteringRoute","ErrorInLazyLoading","ErrorUpdatingStateObject","RouteResolveException","HttpInterceptorResponseError","DashboardService_GetLeftNavDataFailure","FxPConfigurationFailure","StartUpFlagRetrieveError","DataService_TokenFailure","FeedbackService_Error","CheckToastNotifications_Failure","SharedComponentNotRegistered","LazyLoadingFailedForSharedComponent","PersonalizationService_GetMasterLeftNav_Failure","PersonalizationService_GetPersonalizedLeftNav_Failure","PersonalizationSerivce_SavePersonalizedNavItems_Failure","PersonalizationSerivce_GetRoleGroupDetails_Failure","PersonalizationSerivce_GetRoleGroupDetailsForNotification_Failure","PersonalizationSerivce_GetRolePersonalizedNavItems_Failure","PersonalizationSerivce_GetRoleGroupPersonalizedList_Failure","PersonalizationSerivce_SaveRoleGroupPersonalizedNavItems_Failure","AuthSerive_UserClaimsEmptyInLocalStorage","AuthSerive_MissingApplicationObjectInClaims","AuthSerive_MissingRolesObjectInClaims","AuthSerive_TenantClaimsEmptyInLocalStorage","AuthSerive_TenantObjectMissingInClaims","AuthSerive_ClaimsMissingInTenantObject","AuthService_TokenAcquisitionInProgress","AuthService_TokenAcquisitionInProgress_TenantClaims","AuthService_TenantClaimsObjectMissingInClaims","AuthService_APICallFailedWithUnknownReason","AuthService_ErrorNotifyingCachedClaims","AuthService_UnknownException","AuthService_GetClaimsFailure","GetUserThumbnail_TokenNotFound","GetBasicProfile_TokenNotFound","GetBasicProfile_BusinessRoleMissing","GetBasicProfile_RoleGroupMissing","GetBasicProfile_ProfileNotFound","BasicProfile_UnknownError","SearchProfile_TokenMissing","ProfileServiceFailure","ProfileService_ErrorNotifyingCachedProfile","ErrorOnProfileSearch","Resiliency_ExternalResourceLoadingError","Resiliency_ModuleLoadingError","SignalR_ErrorOnDisconnect","SignalR_ErrorOnMessageSend","SignalR_ErrorOnJoinGroup","SignalR_ErrorOnLeaveGroup","SignalR_ErrorOnConnection","PartnerAppRegistrationService_ErrorOnAppRegistration","PartnerAppRegistrationService_ErrorOnSharedComponentRegistration","SYSTEM_MESSAGE","SYSTEM_MESSAGES","ADD","EDIT","SAVE","DELETE","CANCEL","ADD_MESSAGES","SYSTEM_MESSAGE_UI","SYSTEM_MESSAGE_DESC","ITEMS_TO_DISPLAY","MESSAGE","TYPE","WORKFLOW","FUNCTION","START","END","STATUS","EXPAND_MESSAGE","BANNER","MAINTENANCE_PAGE","BUSINESS_CAPABILITY","BUSINESS_FUNCTION","MESSAGE_TO_USER","ADD_SYSTEM_MESSAGE","EDIT_SYSTEM_MESSAGE","DELETE_SYSTEM_MESSAGE","DELETE_CONFIRMATION","CANNOT_FETCH_PLANEDDOWNTIME","BUSINESS_CAPABILITY_REQUIRED","BUSINESS_FUNCTION_REQUIRED","MESSAGE_REQUIRED","START_DATE_REQUIRED","END_DATE_REQUIRED","END_DATE_MIN","PAGINATION","PREV","NEXT","iPouchDBProvider","FxpContext","_iPouchDBProvider","pouchService","GetInstance","saveData","readData","getDocumentKeys","getDocumentKeysData","db","getDBService","doc","_rev","getFxpBaseUrl","getAssetLibraryUrl","getCurrentSessionId","PropBagInternal","JSONData","include_docs","rows","row","$uibModalInstance","closeModal","dismiss","reLaunch","getNewSessionId","ActOnBehalfOfFeatureName","ActOnBehalfOfHelper","OBOUserService","pageLoadStartTime","fxpErrorConstants","oboMetric","getPropBag","footerdata","FxpFooterData","oboUIStrings","OBOUIStrings","displayErrorMessage","searchUsersList","selectedUser","selectedUserObject","isValidUserSelected","showViewFullProfileLink","ShowFullProfile","profileStateName","ViewProfileUrl","actOnBehalfOfFeature","handleEnterKeyOnSearchUserInput","actOnBehalfOfUserClick","OBOAdminstratorClick","searchUser","onSelect","createProfile","pullFocusToElement","OBOUserActive","getOBOUser","Low","pageLoadDuration","logPageLoadMetrics","userProfileDoesNotExist","oboFormControl","Alias","RoleGroupID","getUserProfileAndClaims","selectedUserData","getCurrentUserClaims","Applications","SelectedProfileRoles","getLoggedInUserOID","setActingOnBehalfOfFlag","setCurrentUserStateFromLoggedInUserState","OBOUser","DisplayName","href","defaultAppRole","AadObjectId","getObOUserConfiguration","onbehalfUserRoutes","UiConfiguration","oboUserSessionInfo","OBOEntity","OBOUserStatus","OBOUserRoutes","OBOUserSessionInfo","saveOBOEntityInContext","addToGlobalPropertyBag","upn","oboStartTime","getTime","removeOBOUserContext","OBOUserUIConfigurationError","UserProfileBusinessRoleFailureError","logWarning","SelectedUserisCurrentLoggedInUserError","ex","navigateToLandingPage","startDate","searchProfile","usersList","endDate","responseTime","getMetricPropBag","logMetric","notificaitonMsg","ErrorCode","innerHTML","SearchProfileSvcReturnsError","ErrorRetrieving","SearchProfileSvcNotWorkingError","startsWith","$item","profileStatename","CreateProfileStateName","CreateProfileState","ActOnBehalfOfController","$location","fxpUIData","fxpBreadcrumbService","fxpBotService","featureFlagService","startUpFlightConfig","sessionTimeoutModalFactory","pageTourEventService","enableFxpBotWindow","isFeedbackDialogOpen","getPageLoadPropertyBag","pageLoadData","stateChangeDuration","pageLoadError","totalDuration","threshold","thresholdCrossed","thresholdValue","renderBreadcrumb","initialFlags","breadcrumbEnabled","setBreadcrumbFromRoute","renderHeaderForClick","animate","scrollTop","featureFlagJson","featureflags","isDefaultLinkEnabled","profileFlyoutConfig","featureFlag","experience","link","isEnabled","manageProfileFlight","hasClass","removeClass","addClass","screenX","screenY","renderNotificationButtonForClick","buttonDom","renderHeaderForKeydown","renderHeaderForFocusout","renderHeaderMenuForKeydown","targetMenu","targetMenuToggleBtnId","targetMenuToggleBtn","fxpConstants","renderSideBarForKeydown","menuItems","currentIndex","previousItem","previousItemId","onMessageKeyDown","targetMessage","allMessages","currentMessageIndex","targetType","tagName","isFirstMessageFocused","isLastMessageFocused","isForwardNavigation","isBackwardNavigation","onNavigationClick","menuItem","onNavigationClickWithParams","getLandingPage","absolute","landingState","defaultStateName","logHeaderClickTelemetryInfo","onLeftNavHighlighted","flashEnabled","initialFlagsResponseHandler","OnUserSessionTimeout","warn","unsubscribeAll","init","CceGceFlagEnabled","EnableCceGceUIRing1","hasCSARoles","pageTourResponseHandler","pageTourEnabled","unregisterEvents","handler","flightHandler","isHelpOpen","IsModelOpen","device","pageLoadThreshold","PageLoadDurationThreshold","sessionTimeOutModalFactory","$onloginSuccessSubcription","isBotEnabled","IsBotEnabled","pageTransitionState","stateNotFound","stateChangeError","stateChangeSuccess","viewContentLoading","viewContentLoaded","ShowPopupOnPageDirty","flag","toParams","fromParams","showPageDirtyPopupToUser","getUrlForDashboard","evt","viewLoadDuration","preViewLoadingDuration","OnPageLoadComplete","pageName","OnPageLoadCompleteEventHandler","fxpheaderdata","ElementType","DisplayText","Name","Email","Role","leftNavConfig","theme","axis","scrollButtons","enable","scrollAmount","isFullScreen","ViewFullProfile","OnNavigationClick","OnNavigationClickWithParams","logMiniProfileTelemetryInfo","initializeFeedback","getApplicationNameForDisplay","viewProfileUrl","copyToClipboard","OnAppHeaderChanged","headerText","OnPageTitleChanged","onStateNotFound","_identifier","finalDuration","DataStore","LoadingProfile","handleAdalErrorsLoadingProfile","postLoginSuccess","initializeOBOEntityFromContext","getBasicProfile","currentUserClaims","currentProfile","onStateChangeFailure","logStateChange","ERROR","StateChangeErrorException","setPageLoadMetrics","viewContentDuration","logBreadcrumbTelemetryInfo","getStartTime","checkIfThresholdCrossed","onStateChangeSuccess","stateSuccessTime","setAppHeaderFromRoute","setPageTitleFromRoute","isFullScreenEnabled","fullScreenEnabled","viewConfig","userThumbnailPhoto","reportsToThumbnailPhoto","setUserContext","open","FxpBotSetContextFailedError","subscribeSharedComponentEvents","loadGraphToolkit","confirm","PageDirtyMessages","UnsavedChangesMessage","SharedComponentLoadComplete","onSharedComponentLoadComplete","SharedComponentLoaderUpdated","onSharedComponentLoaderUpdated","SharedComponentCallBackInvoked","onSharedComponentCallBackInvoked","SharedComponentOnDestroyInvoked","onSharedComponentOnDestroyInvoked","eventArgs","logSharedComponentFeatureUsage","eventPayload","sharedComponentFeature","SharedComponentFeatureName","System","isObject","property","isIframe","moduleName","timeTaken","isFxPBoostrapTimeIncluded","removeItem","startTimeProps","toFixed","getAppNameForCSARoles","getAppNameForNonCSARoles","isTablet","GlobalCustomerExperienceApplicationNameForTablet","GlobalCustomerExperienceApplicationName","AppHeaderAlias","AppHeader","csaRoles","AppRolesForGlobalCustomerExperienceApplicationName","isModalOpen","viewProfileFeatureUsageEvent","viewProfileFeature","prop","LinkClicked","restore","maximize","toggleOCV","rootscopestartTime","getPartnerName","stateDetails","ocvAreaName","currentUserData","initOptions","appId","OCVAppId","stylesUrl","intlUrl","environment","OCVEnvironment","primaryColour","secondaryColour","userEmailConsentDefault","userEmail","EmailName","build","locale","transitionEnabled","onDismiss","submitted","onCancel","LaunchFeedback","launchOptions","webGroup","navigator","browserVersion","version","sourcePageName","getElementsByTagName","sourcePageURI","telemetryGroup","platform","featureArea","loggableUserId","handlePromise","multiFeedback","feedbackFeature","copyText","esxpBaseURLindex","baseURI","clipboard","writeText","blur","onblur","onmouseup","AppController","AuthorNotficationFeatureName","$uibModal","notificationStore","fxpGlobalStoreServices","authorNotificationConstants","personalizationService","authorNotificationRoleGroupHelper","originalRoleGroupDetails","roleGroupDetails","anCtrl","authorNotificationFeature","resetToIntialState","notificationMessage","ifNotificationDataAvailable","confirmNavigation","onbeforeunload","getIdOfElement","roleGroupItem","prefix","BusinessRoleId","selectedUsers","resetSelectedRolesRoleGroupArray","typeAheadValue","typeAheadHasError","typeAheadErrorMessage","selectedAudienceType","previousAudienceType","selectedRolesRoleGroupItems","roleItem","isAddButtonEnabled","isRolesRoleGroupAvailableToAdd","getRoleGroupDetails","getRoleGroupDetailsAPIStartTime","getRoleGroupDetailsForNotification","RoleGroupsPersonalisationExceptionError","addRolesRoleGroupNotification","addBtnClickStartTime","addRemoveRolesRoleGroup","selectedRolesforAddButton","changeTabIndexOfUserList","removeRolesRoleGroupNotification","removeBtnClickStartTime","isRemoveButtonEnabled","selectedRolesforRemoveButton","selectedRoleGroupRecepientsItems","isRolesRoleGroupAvailableToRemove","containerId","allMenuElements","isRolesInReciepientList","itemType","isFocusedElement","isFocused","AuthorNotificationProfileMissing","addUser","user","removeUser","modalInstance","elementToFocus","stayInAuthorNotification","leaveAuthorNotification","Type","navigatetoSpecificState","publishNotification","publishNotificationUsers","publishNotificationRolesRoleGroup","loggedinuser","currentUserAlias","to","generateUPN","notificationArray","EventName","EventType","EventSubject","Properties","Payload","Publisher","Id","Notification","WebNotification","Enabled","Channel","SenderAddress","FxPAdminName","Subject","Content","ReceiverAddresses","ActionName","publishNotifications","AuthorNotificationStrings","SuccessMessage","EventId","PublishedUtcDate","AuthorNotificationPublishServiceError","ifSelectedRolesRoleGroup","RoleGroupIdList","RoleIdList","selectedRoleGroups","selectedRoles","publishNotificationsRolesRoleGroup","join","uiErrorMessage","AuthorNotificationPublishUnauthorizedError","AuthorNotificationPublishRoleGroupServiceError","leave","stay","close","defaultRequestType","currentRequestType","modalStrings","CreateAskOpsModalStrings","getRequestTypeData","getSettings","App","requestTypeData","settingValue","selectDefaultRequestType","GetSettingsServiceCallFailedError","requestType","openPage","LongURL","CreateSupportTicketModalStrings","tenantConfiguration","HelpConfiguration","FxpHelpLinks","HelpLinks","HelpLinkData","Href","UIStateHelper","dashBoardHelper","fxpFeedbackService","fxpErrorMessages","leftnavigationdata","browserExperience","closeActOnBehalofUserClick","onSendUserFeedbackInfo","onSendUserFeedbackInfoError","logFooterUsageTelemetryInfo","currentRoutes","getOBOUserRoutes","OBOUserAliasUndefined","setTenantConfiguration","fillRoutes","enableFeedback","OnFeedbackContextChanged","feedbackContextItem","getFeedbackPropBagItems","OnFeedbackConfigurationChanged","feedbackConfiguration","feedbackItemCollection","getFeedbackItemCollection","feedbackSubscriptionId","getSubscriprtionId","feedbackServiceEndpoint","getFeedbackEndpoint","$watch","newValue","oldValue","getOBOUserTenantConfiguration","feedbackEnabled","setUserDetailsToFeedback","fxpConfigurationFailed","FeedbackItemCollection","setFeedbackItemCollection","setFeedbackEndpoint","FeedbackServiceEndpoint","setSubscriprtionId","FeedbackSubscriptionId","tenantConfig","setUIStrings","updateHeaderLogo","FxpHeaderLogo","uiStrings","uiStringsInternal","filterUIStringsForOBO","OBOTenantUIStrings","toggleLeftNavExpandedState","feedbackResponse","tags","logFeedbackInformation","FeedbackUIMessages","ActOnBehalfClosed","oboUserEndTime","parseInt","oboUserMetric","createMetricBag","removeFromGlobalPropertyBag","setOBOUserContext","isObo","footerItem","headerLogo","updateCopyRightDataWithCurrentYear","copyRightData","LeftAlignedLinks","TabIndex","currentYear","getFullYear","signalRService","signalRSubscriptionHandle","fxpWelcomeFeature","globalState","GetGlobalState","globalCounter","helloWorldNgState","GetPartnerState","ng2localCounter","counter","IncreaseCount","DecreaseCount","SubscribeToGlobalState","HelloWorld","IncreaseNg1Count","DecreaseNg1Count","AddNg1Todo","task","isCompleted","tenantName","singalRResponse","onSignalREventSubscribe","unSubscribeCallBack","signalRCallBackHandler","unsubscribe","feature","Device","onSignalREventUnSubscribe","shift","completeFeature","FxpWelcomeController","helpCentralService","logFxpHelpEvent","helpItem","view","logHelpIconEvent","defaultHelpArticleLimit","DefaultHelpArticleLimit","helpCentralUrl","HelpCentralUrl","toggleHelp","stateSpecificHelpLinks","pullFocus","navigateToArticle","navigateToPreviousState","setFocusToNextElement","navigateToNextState","navigateToHome","showMoreContextualHelpLinks","expandArticleImage","saveHelpFeedback","navigateToHelpCentral","onPinHelpFlyoutClick","helpArticleTitles","searchValue","searchSuggestions","onSearchKeyDown","searchHelpArticles","onSearchSuggestionSelect","templateCheck","resetNavigation","fxpDefaultHelp","FxpHelp","fxpHelpWithoutFlighting","flightHandlerCleanUp","createAskOpsRequestCleanUp","openCreateAskOpsModal","ticketsCreationRequestCleanUp","openCreateSupportTicketModal","setContextAndLaunchBot","launchHelpSection","LaunchHelpSection","clearSearch","botEnabled","removeBotLink","askOpsEnabled","removeAskOpslinks","helpSections","isAdded","linksWithoutAuthorStates","AuthorStateNames","findNextTabStop","focusableElements","prototype","call","tabIndex","FxpRouteCollection","focusElement","contextualHelpEnabled","isHelpFlyoutPinned","isCurrentLeftNavItemModified","contextualHelp","getArticles","navigationCollection","currentNavigationIndex","enableShowMoreLink","isContextualFilterRequired","searchedHelp","isSearchFilterRequired","topArticles","isShowAll","businessFunctions","searchString","contextualHelpFeature","getContextualHelpArticles","categoryDisplayText","hideShowMoreLink","HelpCentralGetArticlesSvcError","getArticleData","articleId","article","getContextualHelpArticleContent","articleContent","saveViewCount","HelpCentralGetArticleDataSvcError","selectedArticle","isHelpful","feedback","IsHelpful","saveArticleFeedback","feedbackId","HelpCentralSaveArticleFeedbackSvcError","searchPhrase","getSuggestions","HelpCentralGetSuggestionsError","saveArticleViewCount","HelpCentralSaveArticleViewCountSvcError","showHelpLoader","isLeftNavModified","equals","leftNavItem","is","setFocus","controlId","userNavPersonalizationList","globalNavMasterList","personalizationUser","getUserPersonalization","adminUIStrings","AdminUIStrings","buttonStrings","ButtonStrings","personalizedUserNav","isStateChanged","selectedGlobalLeftNavItems","addToUserNavPersonalizationList","removeUserNavPresonalization","submitUserNavPresonalization","selectedUserNavItems","navigateToUserLookup","showConfirmPopup","hideConfirmPopup","parallelRequsetCounter","userInfo","getBasicUserProfile","getGlobalNavMasterList","getUserNavList","showErrorMsgNavigateToUserLookUp","AddedItems","RemovedItems","displayPopup","persistedSelectedUser","getPersistedPersonalization","removePersistedUserPersonalization","mergeGlobalAndUserPreferenceNavigationList","userRoleId","getPersonalizedNavItems","navigationList","userNavlength","globalNavIndex","getIndexOfObject","isPersonaDefault","isUserRoleDefault","isUserLeftNavItem","userChildNavLength","globalNavChildIndex","setFocusToGlobalNavMasterItem","logPageLoadMetricsForCurrentPage","exceptionMessage","childItem","isChildSelected","isParentSelected","every","isAddPersonalizeAllow","isItemAllowToAdd","navigationListLength","parentItemChildrenLength","isParentToAdd","childLength","childNav","manageUserNavChildItem","isHideButtonVisible","manageUserNavParentItem","isRemovePersonalizeAllow","isSelected","navItem","isParent","isItemAllowToRemove","telemetry_source","savePersonalizedUserNav","userUpn","savePersonalizedNavItems","logAdminTelemetry","UserNavigationListSaved","BusinessRole","UserNavigationListNotSavedForOBOUser","UserNavigationListNotSaved","personalizationUserList","userNavPersonalizationListLength","compareKey","childrenLength","constantActions","oldAction","LeftNavPersonalizationController","notificationActionCenter","unreadNotificationTimerValue","notificationFeatureName","getNotifications","setFocusToFirstElement","getNotificationsFeature","appendPropertiesToNotifications","moreNotificationsAvailable","unreadNotifications","DispatchLocalAction","removeErrorMessage","logFeatureUsageEventObject","NotificationGetServiceError","deleteNotification","deleteNotificationFeature","notificationId","itemIndex","notificationCollection","dismissNotification","subject","eventId","senderAddress","NotificationDeleteServiceError","setErrorMessage","hasNotificationError","notificationErrorMsg","unreadNotificationCount","SignalREventWebNotificationName","isNotificationFlyoutOpen","notifcationCountPollInterval","NotificationConfiguration","PollingInterval","offsetExpirationInterval","OffsetExpirationInterval","notificationLimit","DefaultNotificationLimit","subscribeToSignalR","updateNotifications","unsubscribeSignalRHandler","onNotificationReceived","unsubscribeToSignalR","NotificationsReceived","notification","isToastNotificationNeeded","OnNewNotificationsRecieved","closeNotificationFlyout","experienceResult","getStoredNotification","isNotificationDNDEnabled","markAllNotificationsAsRead","markAllFeature","markNotificationAsRead","markNotifications","description","NotificationReadServiceError","dismissAllNotifications","dismisAllFeature","loadMore","totalNotificationCount","setFocusOnNotification","notificationItemIndex","notificationList","readNotification","readNotificationFeature","excecuteNotificationAction","notificationIndex","markNotification","onDNDValueChange","saveNotificationDNDSetting","userPreferencesStorageKey","notificationDNDStatus","DNDSaveSettingsFailedError","$stateParams","powerBIBaseURL","powerBIDashboardAPI","fxpUIStrings","groupId","PowerBiPageStrings","OBOError","logPageLoadMetric","LoadingDashboard","accessTok","getCachedToken","powerBiAdalLogin","dashboardContainer","dashboard","powerbi","dashboardContainerIframe","querySelector","hideLoader","DashboardRenderError","iframe","createElement","reportEmbedUrl","appendChild","m","contentWindow","TokenFetchError","ConfigError","errorCode","PowerBiPageController","isRoleGroupPersonalizedListChanged","roleGroupNavPersonalizationList","personalizedRoleGroupNav","addToRoleNavPersonalizationList","removeRoleGroupNavPresonalization","submitRoleGroupNavPresonalization","selectedRoleGroupNavItems","isParentLinkEnabled","showConfirmSavePopup","hideConfirmSavePopup","hideUnsavedConfirmPopup","leaveConfirmPopup","submitButtonDisabled","onRoleGroupChange","defaultRoleGroup","DefaultRoleGroup","LoadingMessage","displayUnsavedChangesPopup","selectedRoleGroup","resetNavigationLists","logTelemetryForRolePersonalization","tenantRoles","showAndLoggingErrorMsg","getRoleDetailsStartTime","previousSelectedRoleGroup","resetRolePersonalization","getRoleGroupNavList","getMasterLeftNavAPIStartTime","mergeGlobalAndRolePreferenceNavigationList","RoleGroupsMasterListExceptionError","getRoleGroupNavListAPIStartTime","getRoleGroupPersonalizedList","roleName","RoleGroupsDefaultListExceptionError","renderMasterAndRoleGroupListStartTime","isRoleGroupLeftNavItem","roleGroupChildNavLength","selectedRoleOrRoleGroup","manageRoleGroupNavChildItem","manageRoleGroupParentItem","savePersonalizedRoleGroupNav","submitRoleGroupNavPresonalizationAPISatrtTime","saveRoleGroupPersonalizedNavItems","displaySavePopup","role","RoleGroupNavigationListSaved","auditLogRoleGroupOrRolePersonalization","RoleGroupPersonalizationSubmitUnAuthorization","RoleGroupPersonalizationSubmitError","roleGroupNavPersonalizationListLength","getTimeStamp","leftNavLinksValuesBeforeModification","getRoleGroupFlatDataStructure","leftNavLinksValueAfterModification","list","L0length","L1length","childlength","selectedRole","previousSelectedRole","actionType","RoleNavPersonalizationController","readToastNotification","NotificationNavigationError","WebNotificationId","closeToastNotification","ToastNotificationReadError","toastNotifications","toastNotificationLimit","ToastNotificationLimit","notifications","AdminPersonalizeHelper","searchfocused","resetfocused","isSelectedUserProfile","setSelectedUser","resetSelectedUser","navigateToPersonalizationView","onUserChanged","UserProfileDoesNotExist","isBusinessRoleIdFlag","isRoleGroupIdFlag","UserProfileBusinessRoleIdErrorMessage","getRoleGroup","persistUserPersonalization","UserLookupPersonalizationController","routeService","routeData","fetchRoutes","routes","fromJson","elem","which","$apply","$eval","fxpClick","restrict","firstAdminTab","changeTabIndexHandler","changeTabIndex","resizeHandler","attributes","tabindex","modifyTabindex","ChangeTabIndexByClassDirective","columns","isShowToggle","toArray","offsetWidth","scrollWidth","hide","FxpAuthorNotificationListDirective","fxpBreadcrumbLink","attrs","elementClickHandler","breadcrumbLastItem","breadcrumbItem","fxpChoiceItem","choiceCloseButtons","currentItemIndex","currentScope","$index","focuson","OpenInline","firstTabbleElement","LastTabbleElement","helpItems","helpCentralElement","prevElement","onkeydown","windowProperties","onHelpItemClicked","windowName","scrollToHelpItem","activeElem","helpContentItems","next","scrollElement","pageTop","pageBottom","elementTop","offset","top","elementBottom","scrollIntoView","helpButton","fxpKeyCodes","pullFocusToHelpButton","keyDown","click","toggleGoToTop","helpContainer","hasScrollbar","scrollHeight","clientHeight","image","onImageClick","onImageEnterPress","$observe","wrap","insertAfter","$parse","outSideClickHandler","FxpHelpDirectives","template","fxpIncludeStaticTemplate","getEmptyDirective","headerdirective","ready","windowHeight","css","FxpComponentDirectives","bindToController","fxpbotmenu","fxppagetour","fxpKeyDown","FxpMessageService","FxpBreadcrumbService","OcLazyLoad","businessProcessNameL0","displayNameL0","fxpLeftnavLink","openInline","businessProcessName","initiateClickStartTime","StateChangeErrorDueToMissingModules","linkName","classNameFxpLeftnavLink","userAgent","logLeftNavLoadFailEvent","captureChildLinkName","leftNavClickCount","logLeftNavActivity","isLeftnavItem","isLeftNavItemClicked","targetUIState_config","user_TenantRoutes","StateName","enableLazyLoading","LazyLoad","errMessage","stackTrace","Routes","AdditionalConfigurationContainer","EnableLazyLoading","LeftnavLink","notificationViewLink","notificationIcon","notificationButton","keyBoardEventHandlerForFlyOut","stopDefaultBehavior","globalKeyEventHandler","viewLinkHandler","keyEventHandlerForNotificatonIcon","notificationButtonClick","FxpNotification","notificationAction","keyBoardEventHandler","notificationSubjectHandler","FxpNotificationSetFocusDirective","DeviceFactory","$element","$attr","updateVisibilityBasedOnDevice","isDesktop","OnLayoutChanged","SkipToMainContent","fxpSystemMessageRow","fxpSystemMessagePopupDirective","dialog","fxpRenderBreadcrumb","bcContainer","breadcrumbHeight","bcList","lastElement","last","isMultiLiner","focusPartenerAria","parentAllMenuItems","focusEventHandler","ele","BreadcrumbDirectives","fxpLeftNavKeydown","ensureElementInViewAfterFocus","containerElem","container","activeMenuItem","activeMenuItemTop","activeMenuItemBottom","leftNavTopOffset","leftNavBottomOffset","top_delta","bottom_delta","isElementAboveViewport","isElementBelowViewport","isPreviousSiblilingAvailable","prev","mCustomScrollbar","ensureElementInView","targetItem","leftNavKeyDown","removeToolTip","showTooltipForElipse","elementKeydownHandler","targetElem","$tempElem","display","visibility","appendTo","tempElemWidth","notificationLink","closeButton","notificationToastTimeoutLimit","toastNotificationController","ToastNotificationTimeout","autoClosePromise","closeButtonClickHandler","notificationCloseButtons","notificationLinks","onMouseOver","offsetTop","onMouseOut","autoCloseStart","keydownEventHandler","el","fxpNavElement","enableAddOrRemove","globalNavItem","childrenNavItem","userNavItem","childrenUserNavItem","accordionState","keyBoardEventsHandler","chagneTabIndex","parents","parentElement","l1Container","siblings","checkBoxElem","isRecepientsParentSelected","isRecepientsChildSelected","clickEventsHandler","elemList","focuableElemIndex","RenderNavElementsForKeydownDirective","scrollLeft","fxpPopupNavigation","actionOnEscKeydown","eleType","ariaLabel","fxpKeyCodesArray","getElementTop","contentTop","elemTop","previousElementSibling","viewFocusElement","keyPressHandler","LeftNavPersonalizationScrollToActiveDirective","accordionExpandCollapse","accpdrionBtn","resetEllipsis","textBeforeEllipsis","ellipsedText","text","lineHeight","divHeight","getLastWordRegex","round","actualText","containerHeight","applyMultiLineEllipsis","MultilineEllipsisWithAccordionDirective","notificationIconHandler","notificationLoadMore","notificationDismissAll","notificationDelete","MultilineEllipsisDirective","$elm","$attrs","longPress","ngLongPress","onTouchEnd","fn","ngRightClick","ScrollToTopDirective","scrollToTop","oboUserProfile","aadobjectId","oboUserInfo","getCalimsSvc","claimasData","SelectedUserProfileInformation","appRole","getCurrentUserUpn","toUTCString","FxpModalConstant","pageTourWaitTime","userThumbnailWaitTime","AppControllerHelper","handleServiceWorkerUpdateEvent","showReloadModalWithCancel","setLoggedInUserOID","isAppLaunched","aadOID","fxpAppLaunched","setLoggedInUserUpn","profileCacheDefer","handleProfileServiceResponse","apiResponse","checkOneProfileAndCalimStatus","cachedProfile","claims","handleClaimServiceResponse","cachedRoles","getRoles","apiRoles","cachedResources","getResources","apiResources","hasRolesChanged","sortJsonObj","hasResourcesChanged","hasClaimsChanged","changeSummary","cachedClaims","getUserThumbnailTimeoutHandle","getUserThumbnail","blob","Blob","URL","createObjectURL","getReportsToThumbnailTimeoutHandle","reportsToUpn","onClaimsSuccess","roleGroupIdInternal","setDefaultAppRole","tenantClaims","npd","delegatedClaims","resources","resourcePermissions","hasProfileCacheChanged","profileCache","showReloadModal","setLoggedInUserContext","hasCacheChanged","claimsCache","showNoAppRoleErrorMessage","setUserRole","defaultAppRoleInternal","buttonText","modalProps","Title","ButtonText","onClick","okButtonText","callback","getTenantURLSpecificPageTitle","InvalidRoleGroupID","descriptionText","hyperlinkText","HyperlinkText","hyperlinkUrl","HyperlinkUrl","PagetTitle","profileStore","ProfileStore","authStore","AuthStore","ProfileAPIEndPoint","getBasicProfileFailed","BasicProfileMissing","PageTitle","logFxpBootFailure","getDefaultPropertyBagValues","UserClaimsEndPoint","TenantClaimsEndPoint","getClaimsFailed","BasicProfileAPIFailed","isBlockedCSAUser","errorMessageTitleForCSAUser","errorMessageForCSAUser","pageTitleCSABlockedUser","CSABlockedUser","statusCode","ClaimsAPIFailed","NoClaims","eventSubscription","getUserPreferenceSettings","getInitialFeatureFlagsForPlatform","getSettingsSvc","userUPN","userAliasFromUPN","userOID","getSettingsAPIStartTime","getSettingsAPIResponseDuration","userSettings","setDefaultUserPreferences","triggerGetBasicProfileByOID","getBasicProfileByOID","handleAdalErrors","handleAdalErrorsLoadingDashboard","pageLoaderEvent","telemtry_source","adalErrorMessage","adalErrorDescription","LoadTimeOutGenericError","trustedSiteIssue","adalError","LoadTimeAdalError","DashboardService","BusinessRoles","isRecipientsItem","setAddButtonState","roleItemIndex","setRemoveButtonState","manageRoleGroupItems","roleGroupindex","manageRoleItems","removeRoleItems","pushRoleItems","roleGroupsListLength","isRoleGroupToAdd","addRolesToRecepientsList","roleIndex","roleGroupIndex","removeRolesFromRecepientsList","removeDisplayRoleGroupInRecepientsList","rolesCount","availableRolesCount","addRemoveRoles","roleLength","isAccordianExpanded","displayRoleGroupInRecepientsList","addRemoveRoleGroup","addRoleGroupsToRecepientsList","removeRoleGroupsFromRecepientsList","setFocusToRoleGroupItem","feedbackService","announcementService","maxWaitTimeInMs","lazyLoadconfig","fxpConfig","stateConfigCollection","updateStateConfiguration","fxpAppContext","UserContext","getCurrentUserContext","partnerRoutes","getRegisteredRoutes","getFxpWelcomeRoute","addAngularPartnerAppRoutes","configRouteStates","receiveDate","getUserID","getUserRole","oldFlightState","newFlightState","claimdata","DefaultRoutes","AppRole","getStateName","setRoute","flightstate","States","DefaultStateName","FeatureName","landingPage","EnableFxPWelcomePage","dhref","setDefaultStateName","loadOCVScripts","shellLoadCompleteEvent","collectFeedback","d","s","js","fjs","ocvFileName","ocvFloodgateFileName","src","onload","parentNode","insertBefore","showUserAnnouncement","collectGCEFeedback","configRoutes","routeInfoList","RouteConfig","routeConfig","currentStateObj","powerbiReportConfig","breadcrumbText","BreadcrumbText","PartnerTelemetryName","requiredModules","stateModulesMissing","extendable","subFeatureName","SubFeatureName","PageNameForTelemetry","AppNameForTelemetry","registerRoute","sharedBundles","componentFramework","routesData","updateResolveObjects","UnavailablePartnerModules","reqModules","getResolveMembers","resolveObjects","promiseObjects","Function","uirouteConfigObjects","lazyLoadModules","ocResolve","getFlightingInfo","pgldrService","lazyLoad","handleRouteResolveException","stateViews","GetFilghtingFeatures","angularPartnerStateConfig","partnerStateConfig","addRouteConfigurationAction","partnerRoute","redirectTo","authorizationRules","style","getLazyLoadBundles","specificBundles","generatedBundle","commonBundles","totalBundles","DashBoardHelper","FxpConfigurationService","arrFeatureFlag","isFeatureFlagExists","HttpInterceptorTelemetrySource","httpCorrelationInterceptor","grmInterceptorConfig","authExcludeExtnPat","AdalAuthExcludeExtn","simpleEndpoints","CorsExcludedDomains","excludedDomains","isAddHeaders","InterceptGRMCalls","GRM_APIMServiceUrl","GRM_APIM_SubscriptionKey","transactionId","getCorrelationId","getCurrentUserOID","httpRetryInterceptor","requestURL","retries","waitBetweenErrors","HttpRetryWaitTime","maxRetries","HttpRetryCount","excludedHttpStatusCodesForLogging","ExcludeHttpStatusCodesFromLogging","beginTimeStamp","logPerfMetric","responseError","httpConfig","specificError","EnableHttpTransactionTimeLogging","resourcePerf","getEntries","dns","domainLookupEnd","domainLookupStart","tcp","connectEnd","connectStart","ttfb","responseStart","transfer","responseEnd","total","logResourceTiming","retryForUrlCount","retryEnabled","customStatus","responseData","Authorization","MsalHttpRequestInterceptor","requestError","rejection","FxpPartnerHttpRequestInterceptor","fxpPartnerHttpInterceptorHooks","requestInterceptors","getRegisteredInterceptorHooks","interceptor","updatedConfig","getHeaderText","setHeaderText","getPageTitle","setPageTitle","setScreenRoute","setBrowserTitle","FxpUIData","SessionTimeoutModalConstant","ActivityMonitor","showSessionTimeoutModal","inactive","SessionTimeoutDurationInSeconds","SessionTimeoutModalFactory","str","toUpperCase","callbackMap","initCallbackId","trustedOrigin","sendInitAck","InitAckRequest","initCallback","receivedMessageHandler","callNgServiceFunc","serviceName","serviceFuncName","callbackId","getUniqueId","fxpRequestMessage","ServiceFuncRequest","onInit","isConnected","contextInfo","ALPHABET","rtn","charAt","random","RequestMessageType","IframeAppRequestType","FailedToLoadMessage","IframeBridgeService","iframeElement","iframeWindow","initSuccess","iframeMessageEventHandler","iframeAppUrl","handleInitAck","handleServiceFuncRequest","iframeAppTitle","pathUrl","baseUrl","checkInitSuccess","getContextInfo","getClonableMessage","stringFormat","clonableMessage","getOwnPropertyNames","getObjectClone","obj","objClone","correlationId","correlator","NonFxpApp","IframeAppController","has","apply","Fxp","FxpSDK","Resiliency","Telemetry","BusinessProcessEvent","FeatureUsageEvent","SystemEvent","ComponentType","EnvironmentData","EventData","EventTypes","FxpLoggerService","FxpLoggerServiceExtension","TelemetryConfiguration","TelemetryContext","ErrorSeverityLevel","FxpTelemActionType","FxpTelemEventName","FxpTelemActionStatus","FxpTelemGuid","Helper","FxpLogHelper","LogPropertyBag","LogMetricBag","TelemetryData","Common","FxpBaseController","PouchDbConnection","PouchDBProvider","PouchDbService","HomeLocation","WorkLocation","NotificationAPI","Constants","TelemetryConstants","TelemetryEventType","TelemetryConfigDefaults","TracingLevel","PouchSyncMode","DiagnosticLevel","EventDataProperties","RoleGroupDetails","TenantDetails","CustomEvents","ApplicationConstants","FxpConstants","PerfMarkers","RoleGroupInfo","TenantInfo","AuthorNotificationConstant","CreateAskOpsModalConstant","CreateTicketModalConstant","helpArticleImageModalConstant","Context","Core","Utils","CommonUtils","DeviceFactoryProvider","Services","DataService","AdalLoginHelperService","FxpHttpService","FxpBroadcastedEvents","FxpEventBroadCastService","FxpStateTransitionService","AdminLandingService","FxpAuthorizationService","FxpFeedbackService","FxpRouteService","FxpStorageService","HelpCentralService","NotificationActionCenter","NotificationService","NotificationStore","PlannedDownTimeService","UserClaimsService","FxpBotService","FxpComponentRegistrationService","PartnerAppRegistrationService","ConFitService","FeatureFlagService","FxpPartnerHttpInterceptorHooks","FxpGlobalStoreService","FxpIrisBotService","FxpOCVFeedbackService","FxpSignalRService","Boot","Filters","UnCamelCase","External","IframeAppMessage","Factory","FxpIframeClient","$get","CorrelationManager","botContext","_botContext","otherData","UserAlias","OtherData","requestUrl","input","settingsServiceConfig","settingsSeerviceConfig","settingType","settingId","settingNames","settingName","getPathUrl","setting","saveSettingsSvc","UIStateManager","controllerUrl","angularAMD","unavailablePartnerModules","externalResourceLoadFailed","scriptName","logMsg","getResilientModules","modules","resilientModules","failedModules","checkModuleResiliency","logFailedModulesInfo","app","requires","reverse","$resource","serviceEndpoints","registerEndPoint","applicationId","acquireToken","authResult","isTokenRetrievalStarted","subjects","broadCastSubject","eventIndex","onNext","getSubjectInstance","subscribeToSubject","unsubscribeSubject","callBack","emit","isBannerHidden","topMargin","timeLimit","setMarginZero","setBrowserExperienceObject","browserExperienceObject","timestamp","noThanksFlag","noThanksClick","remindMeLaterClick","buttonLogic","browserExperienceJson","checkBrowser","fxploggerService","retryCount","parentDeferred","getWithAdalTokenSync","getAsObservable","observer","complete","retryCountForUrl","states","stateGo","object","isStateAuthorized","trim","telemetrymsg","UnauthorizedUIString","isAuthorized","stateConfig","appConfig","r","isAppAdmin","adminPermissionsRules","getAppAdminRules","hasUserPermissions","hasUserRoles","hasRoles","allRolesMandatory","AllRolesMandatory","Value","getClaimsList","checkRoleFunc","hasResourcePermissions","userResourcePermissions","areResourcesAuthorized","allResourcePermissionsMandatory","AllResourcesMandatory","p","checkResourcePermissionFunc","allowedPermissions","authorizeRolesAndResources","AuthorizeRolesAndResources","Roles","ResourcePermissions","areRolesAuthorized","getStateAuthorizationRules","AllowedPermissions","IsRestrictedInObo","authRules","AuthorizationRules","adminRules","getAppList","getUserTenantClaims","apps","permission","Resource","NPDClaims","hasOwnProperty","hasPermissions","Permissions","AllPermissionsMandatory","permissions","fxpStorageService","setCurrentPageBreadcrumb","startNewBreadcrumbOnSpecificState","setBreadcrumb","setBreadcrumbItem","storageKey","userNavigatedStatesWithBreadcrumb","getFromLocalStorage","newTabBreadcrumbStorageKey","hashCode","prevSessionBreadcrumbArray","deleteFromLocalStorage","expectedBreadcrumbForCurrentState","getExpectedBreadcrumbForCurrentState","breadcrumbArraySearchKey","storedBreadcrumbForCurrentState","saveInLocalStorage","updateBreadcrumb","breadcrumbList","breadcrumbItemIndex","NonGLNStateCollectionForBreadcrumb","breadcrumbString","loginUserInfo","oboUserData","breadcrumbFeature","setTempBreadcrumbArray","overrideBreadcrumbText","updateDisplayNameForCurrentBreadcrumbItem","getBreadcrumbItemIndex","fxpBreadcrumbContext","breadcrumbName","saveBreadcrumbContextForCurrentState","updateBreadcrumbUrlByName","newUrl","registerEndpoints","_partnerEndpoints","_partnerRoutes","isValidRoute","registerAngular1Module","_registeredNG1Modules","registerAngular2Module","isModuleAlreadyRegistered","_registeredNG2Modules","getRegisteredAngular2Modules","hasValue","logToConsole","propertyName","configObject","fxpAppSettings","fxpBaseConfiguration","modelConfiguration","GetConfiguration","rootscope","feedbackRouteData","feedbackPropBag","_feedbackItemCollection","_userId","_subscriprtionId","_feedbackServiceEndpoint","setUserId","userId","itemCollection","subscriprtionId","addToFeedbackPropBag","addFeedbackPropBagRange","removeFeedbackPropBagRange","removeFromFeedbackPropBag","browserTitle","currentRoute","setFeedbackServiceProperties","usersDetails","getEnvironmentDetails","feedbackEnvData","EnvironmetName","userDetails","oboUserBasicInfo","loginUserBasicInfo","UserId","UserName","feedbackInfo","feedbackStatusInfo","feedbackType","toEs6Promise","qPromise","responseType","patch","jsonp","head","launchIrisBot","hideIrisBot","OnHideIrisBot","fxpHttpService","fxpConfigService","SubmitFeedback","feedbackMessage","feedbackPayload","manifestType","feedbackManifestType","submitTime","Client","rating","clientFeedbackId","getNewGuId","comment","application","appData","telemetry","partnerName","officeBuild","survey","surveyId","web","sendFeedback","FeedbackOCVEndpoint","_interceptorHooks","RegisterInterceptorHook","httpInterceptorHookInstance","UnRegisterInterceptorHook","getAllStates","statesList","getURLfromState","statename","navigatetoState","navigatetoNewWindow","screen","transitionOptions","navigateToSpecificUrl","features","navigateToUrl","getStateDetails","getCurrentStateDetails","isNewTabAllowed","listeners","connectionPromise","pingTimeOutRef","pingInterval","signalRServiceEndPoint","SignalRPlatformEndPoint","Number","isInteger","SignalRPlatformPingIntervalInMinutes","setupPingForSignalServer","ping","connect","connection","Connected","setupConnection","disconnect","stop","send","args","joinGroup","groupName","leaveGroup","onMessageFromServer","messageData","callBackFunctions","callbackFunc","SignalRPlatformClientId","withUrl","accessTokenFactory","getTokenForAppIdAsync","accesstoken","withAutomaticReconnect","onreconnecting","Reconnecting","onreconnected","connectionId","onclose","Disconnected","start","$transitions","onStart","onStartStateChangeHandler","onSuccessStateChangeHandler","onErrorStateChangeHandler","onInvalidStateHandler","transition","getStateInfo","syncRouteAction","logFeatureUsageEventForState","logPageView","telemetryName","displayNameForPageView","duration","measurements","LOGGING_SOURCE","from","previousFeatureName","displayFeatureName","offStateChangeStart","observers","offStateChangeSuccess","offStateChangeFailure","offStateNotFound","helpCentralServiceEndPoint","HelpCentralServiceEndpoint","helpCentralServiceAppId","HelpCentralAppId","MappedTenantName","deviceType","urlGetArticle","publicClientApplication","anonymousEndpointList","anonEndpoints","AuthExcludedDomains","initializeAuthentication","configuration","accounts","getAllAccounts","setActiveAccount","addEventCallback","eventType","LOGIN_SUCCESS","account","LOGIN_FAILURE","localPublicClientApplication","handleRedirectPromise","loginResponse","getActiveAccount","loginRedirect","idToken","silentRequest","scopes","forceRefresh","loginHint","acquireTokenSilent","INVALID_GRANT_ERROR","errorCodes","isServerError","isInteractionRequiredError","isRefreshTokenError","acquireTokenRedirect","isInvalidGrantError","tokenResponse","getTokenRedirect","getTokenRedirectAsync","redirectRequest","authExceptionEndpoints","addAuthenticationExceptionEndpoints","getResourceForEndpoint","redirectStartPage","_msalEndpoints","loginResource","bestMatchedConfigEndpoint","configEndpoint","trimStart","_getHostFromUri","uri","extractedUri","_config","_msalService","MsalAuthenticationService","notificationActions","ActionConfiguration","iconConfiguration","IconConfiguration","actions","content","OpenInNewTab","ActionType","registerNotificationAction","openInNewTab","icon","From","Icon","hasAction","publishedOn","notificationApiWebNotifResourceUrl","notificationApiBaseUrl","NotificationServiceEndpoint","startIndex","channel","urlGetNotiicationsByPage","requestConfig","webNotificationId","urlDeleteNotification","deleteAllNotification","urlDeleteAllNotification","urlMarkAsRead","urlMarkAllAsRead","publishEventUrl","To","urlPublish","notificationService","defered","OBOUserTenantConfiguration","isOBOAsNewTab","initilizeOBOEntity","setOBOUserSessionInfo","udata","IsError","oboData","$$phase","lazyLoaderInstance","lazyLoader","registerPartnerEndpoints","partnerRegisteredEndpoints","getRegisteredEndPointsFromPartnerAppRegistrationClass","getAuthExcpetionFromPartnerAppRegistrationClass","addApplicationWithStores","applicationsWithStore","isStoreRegistered","registerPartnerApp","appInstance","registeredApps","getRoutes","registerPartnerAppRoutes","updateStateObject","body","React","stateInfo","updateRouteConfiguration","routesInfo","registeredRoutes","registerLazyLoadedApp","registryInstance","registry","updateAppName","bundles","getBundles","getGeneratedBundles","registerPartnerAppBundles","registerPartnerAppEndpoints","getServiceEndPoints","getAuthExceptionEndpoints","registerAuthExceptionEndpoints","getSharedComponentsInfo","registerAngularSharedComponents","sharedComponentsInfo","disableSharing","angularPartnerSharedComponents","ocBundles","ocBundle","files","sequentialLoading","serviceEndPoint","updateSharedComponentDetails","compName","components","componentName","partnerApp","sharedComponents","comp","getSharedComponentReference","sharedComponentConfig","sharedComponentReference","sharedComponent","Angular","getSharedComponentFactory","oneProfileEndPoint","rolePersonalizationStore","RolePersonalizationStore","tenantClaimsApiEndpoint","tenantRolesApiEndpoint","TenantRolesEndPoint","tenantNPD","NPD","NotificationApiEndpoint","NotificationApiEndPoint","keyContext","selectedUserPersonalization","AADAuthFailureError","savedUserPrefNavList","shouldAssignRoles","ShouldAssignRoles","getRolePersonalizedNavItems","savedRoleGroupPrefNavList","PacificRegion","getCurrentUtcDateTime","addHoursToCurrentUtcDateTime","hours","add","local","getCurrentPacificDateTime","AddHoursToCurrentPacificDateTime","convertToPacific","isMoment","changeTimeZoneComponentToPacific","utcOffset","changeTimeZoneComponentToUniversal","timeUtc","timezone","userFeedbackUIService","showAnnouncement","DelayFeedbackPoupInSeconds","showGCEAnnouncementDialog","ShowSystemAnnouncementFeatureFlagName","GCEFeedbackDialogFeatureFlag","GCERingReleaseFeatureFlagName","isAnnouncementShown","AnnouncementPopupMessages","ContentMessage","iTenantReqCount","fxpcontext","loggedInUserAlias","claimsApiEndpoint","getLoggedInUserClaims","getUserClaimsForAlias","getLoggedInUserTenantClaims","getUserClaims","getUserClaimsForScopes","scopeDirection","getClaimsForUserAlias","accumulator","filteredClaims","filterRolesBasedOnScopes","inputClaims","tenants","tenantScopesMap","formTenantScopeMapping","tenant","tenantScopes","filteredScopes","roleObj","Scopes","roleScopes","roleScope","tenantScope","filterScope","existingPermission","Set","DefaultPermisssions","modifiedScope","tenantMatch","tenantTrimmedScope","headerScope","roleParts","headerParts","getUserTenatClaimsByObjectId","objectId","userClaimsLocalStorage","getClaimsFromLocalStorage","genericPropBag","getClaimsPropertyBag","AuthServiceReturnsBlankAppError","AuthServiceReturnsBlankAppRoleError","entityId","entityType","localStorageValue","claimsData","ErrorInfo","claimsLocalStorage","isV2ClaimsTenantId","createClaimsPropertyBag","claimId","getTenatClaimsSvc","objectID","areHeadersAvailable","TenantClaimsHeaders","getUserClaimsSvc","getObjectIdFromIdentifier","OID","useridentifier","isGuid","userinfo","telmetry_source","oid","parsedClaims","getClaimsFromGlobalStore","claimsEndpoint","tenantheaders","systemEvent","dispatchClaimsAction","getClaimsByObjectId","userIdentifier","sendDate","claimData","setUserInfo","localStorageClaims","notify","tResponse","logClaimsMetrics","getDefaultAppRole","saveClaimsData","logClaimsException","IsAuthorizationRequired","responseCode","GetUserClaimsSvcReturnsError","currentClaims","strCalimsData","getAliasFromOID","logInfo","AuthzServiceReturnsError","listOfRoles","RoleName","DefaultAppRole","getUserDelegatedRoles","promiseList","userDelegatedRoles","consolidatedRoles","union","getUserResources","listOfResources","FxpNpd","lstClaims","isDefaultRole","claimsStorageKey","getSessionStorageUserClaimsKey","fxpOCVFeedbackService","showFeedbackPopup","feedbackData","disableButton","onSubmit","submitFeedback","feedbackRating","feedbackUserEmail","emailIsChecked","ratingSelected","showGCEFeedbackDialog","ShowGCEFeedbackDialogFeatureFlagName","isFeedbackSubmitted","LastFeedbackLaunchTimeStamp","canShowFeedbackModal","ShowGCEFeedbackAfterInterval_InHours","FeedbackPopupMessages","HeaderMessage","FeedbackMessage","SendGCEFeedackToOCVFlag","SendGCEFeedackToOCV","feedbackMessagesEndPoint","Fps","Survey","GCEFeedbackSurveyPartnerName","GCEFeedbackDialogSurveyId","currentUser","currentUserUpn","loggedInUserUpn","loggedInUserOID","currentUserOID","getLoggedInUserProfile","setLoggedInUser","setUpAjaxCallsHeaders","getAADObjectIDFromAlias","OBOUserSession","isOboActive","aadObjectID","ajaxSetup","userData","userClaimsData","leftNavDataKey","GetLeftNavAuthFailureError","UserRoleGroupFxpConfigNotFoundError","featureFlagPromise","eventNames","getLoggedInUserFlighitngContext","getFeatureFlags","InitialFeatureFlags","_logger","appReducer","middlewares","globalActions","shouldReplace","shouldUpdate","_globalStore","RegisterStore","store","RegisterGlobalActions","DispatchAction","Subscribe","partner","eager","AddSelectors","selectors","mergeSelectors","SelectPartnerState","selector","defaultReturn","isPageTourInProgress","currentLeftNavPinState","responseStartTime","isBasicProfileRefreshed","telemetryContext","graphAPIProfileUrl","GraphAdEndPoint","graphAPIUserProfileUrl","GraphApiUserProfileUrl","graphAPIUserThumbnailUrl","GraphApiUserThumbnailUrl","profileApiEndpoint","searchProfileApiEndpoint","SearchAPIEndPoint","isProfileRequired","IsProfileRequired","pDeferred","refreshBasicUserProfileInContext","includeInactiveUser","getBasicProfileByAliasIncludingInActiveUser","getFlightingContext","roleGroupIdInternalId","getPropertyValueCaseInsensitive","resourceCategoryInternalId","sDODomainInternalId","opFieldsArray","LeftNavFlightingContextProperties","field","fieldName","getBasicUserProfileLoggedInUser","getProfileURL","userIdentifierType","getBasicProfileSvc","getShowBannerValue","localStorageProfile","getProfileFromLocalStorage","dispatchProfileActions","BusinessDomain","SDODomain","AddressBookTitleDesc","FullName","MiddleName","LastName","Seniority","BusinessRoleDisplayName","IsDefaultProfile","UserProfileBusinessRoleMissingError","tenantMapping","newTenant","UserProfileRoleGroupMissingError","getProfileDataFromGraphResponse","setLocalStorageProfile","OnBasicUserProfileRefresh","UserProfileNotFoundError","CSAErrorCode","logBasicProfileFailureError","ProfileServiceCallFailedError","getDeafultUserInfo","getSessionStorageUserInfoKey","profileStorageKey","parentDiffered","SearchAPIHeaders","FirstName","givenName","surname","userPrincipalName","mailNickname","PersonnelNumber","immutableId","jobTitle","ReportsToDisplayName","ReportsToFullName","aadBasicUserInfo","getAADBasicInfoFromLocalStorage","userProfileAAD","componentType","startDateTime","endDateTime","templateType","environmentName","serviceOffering","serviceLine","componentId","ictoId","AppName","getTaskName","TaskName","setTaskName","getTaskStatus","TaskStatus","setTaskStatus","getCapabilityType","CapabilityType","setCapabilityType","getEmbeddedExpereinceName","EmbeddedExpereinceName","setEmbeddedExpereinceName","setIsEmbeddedExperience","IsEmbeddedExperience","getIsEmbeddedExperience","getEventName","getEventType","setEventType","getDuration","Duration","setDuration","getFeatureName","getSubFeatureName","setSubFeatureName","getActionName","getActionType","setExperimentationConfigId","ExperimentationConfigId","getExperimentationConfigId","setExperimentationConfigName","ExperimentationConfigName","getExperimentationConfigName","setExperimentationConfigResult","ExperimentationConfigResult","getExperimentationConfigResult","getTemplateType","TemplateType","getComponentType","getUserRoleName","UserRoleName","setUserRoleName","getStartDateTime","StartDateTime","setStartDateTime","getEndDateTime","EndDateTime","setEndDateTime","getComponentUri","ComponentUri","setComponentUri","getEntityId","EntityId","setEntityId","getActionStatus","setActionStatus","currentDate","day","getDate","month","getMonth","year","getHours","minutes","getMinutes","seconds","getSeconds","suffix","getTelemetryUniqueKey","pad2","c","getAppNameFromSource","addEnvironmentDetails","eventProperties","aiInstrumentKey","telemetryAppName","CurrentContext","globalProperties","getGlobalPropertyBag","addRange","ENVIRONMENTNAME","SERVICEOFFERING","SERVICELINE","SERVICE","COMPONENTID","COMPONENTNAME","XCV","AIAPPKEY","LOGGEDFROM","ICTOID","BUSINESSPROCESSNAME","n","_appInsight","_events","instrumentationKey","InstrumentationKey","clickPluginInstance","configObj","extensions","extensionConfig","identifier","autoCapture","dataTags","useDefaultContentNameOrId","captureAllMetaDataContent","_environmentValues","InitializeTelemetryWithConfiguration","_context","initUserSession","setContextInfo","addContextChangeListener","_correlator","telemetryInitializer","envelope","telemetryItem","baseData","telemetryInitializerInit","appInsights","addTelemetryInitializer","AddMsitTelemetryInitializers","_loggerServiceExtenstion","_loggerServiceInstance","session","getSessionID","ver","getAppVersion","getCurrentPartnerTelemetryName","finalProperties","assign","getItems","ngInjector","severityLevel","removePII","internalCustomLog","setTransactionIdAndCommonProperties","TrackException","TrackEvent","pageViewTelemetry","refUri","pageType","isLoggedIn","trackPageView","metricName","metricValue","metricTelemetry","average","trackMetric","logBusinessProcessEvent","TrackTrace","setCorrelationProvider","correlationProvider","getPageLoadMetrics","pageLoadMetric","pageLoadTime","pageLoadMetricsCalled","loggedInUserRoleId","loggedInUserRoleName","isOBO","loggedInUserTenantKey","loggedInUserTenantName","loggedInUserContext","OBOUserRoleId","OBOUserRoleName","OBOUserTenantKey","OBOUserTenantName","OBOUserContext","TrackSystemEvent","setTransactionId","subCorrelationId","getSubCorrelationId","telemetryTrace","traceID","parentID","addPropertyBagValues","buildCommonLogProperties","logProperties","getValue","removeFromBag","addUserRoleGroupDetails","addUserTenantDetails","getCurrentNetworkSpeed","LOGGEDINUSERROLEGROUPID","LOGGEDINUSERROLEGROUPNAME","OBOROLEGROUPID","OBOROLEGROUPNAME","LOGGEDINUSERTENANTKEY","LOGGEDINUSERTENANTNAME","OBOTENANTKEY","OBOTENANTNAME","ERRORPREFIX","appIngisht","appIngishtInstance","fxpLoggerServiceExtension","TrackBusinessProcessEvent","TrackFeatureUsageEventV2","StartFeatureUsageEvent","EndFeatureUsageEvent","logTrackSystemEvent","generateNumber","empty","isCSABlockedUser","sourceName","FxPLoggerService","metricBagInternal","propBagInternal","stringVal","EventEnabled","PerformanceMetricEnabled","PerfMarkersEnabled","DebugEnabled","EndPointUrl","getDefaultConfiguration","PAGENAME","PAGEVISITED","USER_ALIAS","AIFeatureUsageEvent","AIBusinessProcessEvent","Metric","WARNING","TRACE","INFORMATION","CUSTOMEVENT","ACTIONURI","APPACTION","COMPONENTTYPE","EVENTTYPE","TARGETENTITYKEY","USERROLENAME","COMPONENTURI","DURATION","logType","errorMsg","warnMsg","traceMsg","infoMsg","metricBag","transactionID","toJsonString","jsonObject","toJson","LogData","LogInfo","TransactionId","TransactionTime","LogId","UserRole","getAppName","AppVersion","TelemetryInfo","Metrics","ErrorMsg","WarnMsg","TraceMsg","InfoMsg","MetricName","MetricValue","_userRole","userRole","_connection","mozConnection","webkitConnection","broadcastNetworkChange","_networkConnection","NetworkConnection","_effectiveType","effectiveType","newEffectiveType","networkChangeCustomEvent","CustomEvent","bubbles","cancelable","dispatchEvent","_appName","_appVersion","_sessionId","_geography","_envData","_globalPropertyBag","contextChangeListeners","setAppContext","_currentContext","setUserID","userID","appVersion","notifyContextChangeListeners","setSessionID","sessionID","setGeography","geo","envData","partnersTelmetryInfo","partnerTelmetryInfo","listener","jQuery","isEmptyObject","elementId","angularInherits","ctor","superCtor","super_","enumerable","charCodeAt","arrayCollection","UPN","Domain","UpnCorpnet","UpnPartner","match","number","isObjectAnArray","isPlainObject","k","inputJson","isArray","inputObject","v","getQueryString","string","getScriptBaseUrl","currentScriptUrl","currentScript","lastIndexOf","endsWith","PIIRegex","regexp","getWindowSize","innerWidth","updateType","resolution","types","tablet","isSmallScreen","devicePixelRatio","lazyUpdate","throttle","showSystemDownOverlay","supportLinkText","supportLink","showSupportLinks"],"mappings":"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","file":"ngbase.bundle.js","sourcesContent":["function webpackEmptyAsyncContext(req) {\n\t// Here Promise.resolve().then() is used instead of new Promise() to prevent\n\t// uncaught exception popping up in devtools\n\treturn Promise.resolve().then(function() {\n\t\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\t\te.code = 'MODULE_NOT_FOUND';\n\t\tthrow e;\n\t});\n}\nwebpackEmptyAsyncContext.keys = function() { return []; };\nwebpackEmptyAsyncContext.resolve = webpackEmptyAsyncContext;\nmodule.exports = webpackEmptyAsyncContext;\nwebpackEmptyAsyncContext.id = \"F6A22FA4/./src/$$_lazy_route_resource lazy recursive\";","/**\r\n * @application Fxp\r\n */\r\n/**\r\n * @module Fxp.Controllers\r\n */\r\nimport { ILogger } from \"../../js/interfaces/ILogger\";\r\nimport { FxpMessageService } from \"../banner/FxpMessageService\";\r\nimport { IRootScope } from \"../../js/interfaces/IRootScope\";\r\nimport { AdminLandingService } from \"./AdminLandingService\";\r\nimport { FxpAuthorizationService } from \"../../js/services/FxpAuthorizationService\";\r\nimport { FxpConstants } from \"../../js/common/ApplicationConstants\";\r\nimport { FxpEventBroadCastService } from \"../../js/services/BroadCastingService\";\r\nimport { CommonUtils } from \"../../js/utils/CommonUtils\";\r\nimport { FxpGlobalStoreService } from \"../../js/services/fxp.global.store.service\";\r\nimport { HideLoader, HideSpecificLoader, ShowLoader, ShowSpecificLoader } from \"../loader/loader.actions\";\r\nimport { UI_LOADER_NAMES } from \"../loader/UILoader.constants\";\r\nimport { TelemetryConstants } from \"../../js/telemetry/TelemetryConst\";\r\nimport { ErrorCodes } from \"../../js/constants/errorCodes\";\r\nimport { ErrorSeverityLevel } from \"../../js/telemetry/ErrorSeverityLevel\";\r\n//import { AngularDirective } from \"../../decorators\";\r\n\r\n/**\r\n* This is the controller to fetch and update the Admin data .\r\n* @class Fxp.Controllers.AdminLandingController\r\n* @classdesc A main controller for AdminLanding of FxpApp module\r\n* @example \r\n* //To Use AdminLandingController\r\n* angular.module('FxPApp').controller('AdminLandingController', ['AnyDependency', AdminLandingController]);\r\n* function AdminLandingController(AnyDependency){ AnyDependency.doSomething(); }\r\n*/\r\n//@AngularDirective(\"AdminLandingController\", AdminLandingController, \"FxPApp\", ['$rootScope', '$scope', 'AdminLandingService', 'FxpMessageService', 'FxpLoggerService', 'FxpAuthorizationService'])\r\nexport class AdminLandingController {\r\n\tprivate $rootScope: IRootScope;\r\n\tprivate $scope: any;\r\n\tprivate adminLandingService: AdminLandingService;\r\n\tprivate fxpMessage: FxpMessageService;\r\n\tprivate fxpLoggerService: ILogger;\r\n\tprivate fxpAuthorizationService: FxpAuthorizationService;\r\n\tprivate telemetrySource: string = `${TelemetryConstants.FXP_TELEMETRY_BASE_NAME}.AdminLandingController`;\r\n\r\n\r\n\tconstructor($rootScope: IRootScope,\r\n\t\t$scope: any,\r\n\t\tadminLandingService: AdminLandingService,\r\n\t\tfxpMessage: FxpMessageService,\r\n\t\tfxpLoggerService: ILogger,\r\n\t\tfxpAuthorizationService: FxpAuthorizationService,\r\n\t\tprivate fxpBroadCast: FxpEventBroadCastService,\r\n\t\tprivate fxpGlobalStoreService : FxpGlobalStoreService) {\r\n\t\tvar self = this;\r\n\t\tself.$scope = $scope;\r\n\t\tself.$rootScope = $rootScope;\r\n\t\tself.adminLandingService = adminLandingService;\r\n\t\tself.fxpMessage = fxpMessage;\r\n\t\tself.fxpLoggerService = fxpLoggerService;\r\n\t\tself.fxpAuthorizationService = fxpAuthorizationService;\r\n\t\tself.fxpBroadCast.On(\"testBroadCast\", function (evnt, arg) {\r\n\t\t\talert(arg);\r\n\t\t});\r\n\t\tself.GetAdminTiles();\r\n\t}\r\n\r\n\tGetAdminTiles() {\r\n\t\tvar self = this;\r\n\t\tself.fxpGlobalStoreService.DispatchGlobalAction(\"Platform\", ShowSpecificLoader({name: UI_LOADER_NAMES.FXP_LOADERS.ADMIN_LANDING_LOADER, loadingText: \"Admin Page Loading...\"}));\r\n\t\tself.adminLandingService.GetAdminTileDetails(false).then(function (response) {\r\n\t\t\tif (response && response.length > 0) {\r\n\t\t\t\tself.$scope.adminTileGroup = response;\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\tvar event = { preventDefault: function () { } };\r\n\t\t\t\tself.fxpAuthorizationService.redirectToUnauthorizedState(event, \"Administration\");\r\n\t\t\t}\r\n\t\t}, function (error) {\r\n\t\t\tself.fxpMessage.addMessage(self.$rootScope.fxpUIConstants.UIMessages.AdminLandingServiceCallFailedError.ErrorMessage, FxpConstants.messageType.error);\r\n\t\t\tlet bag = self.fxpLoggerService.createPropertyBag();\r\n\t\t\tbag.addToBag('Error', CommonUtils.objectToString(error));\r\n\t\t\tbag.addToBag('RedBannerDisplayed', 'Yes');\r\n\t\t\tself.fxpLoggerService.logError(`${self.telemetrySource}.GetAdminTiles`, \r\n\t\t\t\t\t\t\t\t\t\t\tself.$rootScope.fxpUIConstants.UIMessages.AdminLandingServiceCallFailedError.ErrorMessageTitle, \r\n\t\t\t\t\t\t\t\t\t\t\tErrorCodes.OnGetAdminTilesFailure, \r\n\t\t\t\t\t\t\t\t\t\t\tnull, \r\n\t\t\t\t\t\t\t\t\t\t\tbag, undefined, undefined, ErrorSeverityLevel.Medium);\r\n\t\t}\r\n\t\t);\r\n\t\tsetTimeout(function () {\r\n\t\t\tself.fxpGlobalStoreService.DispatchGlobalAction(\"Platform\", HideSpecificLoader({name: UI_LOADER_NAMES.FXP_LOADERS.ADMIN_LANDING_LOADER}));\r\n\t\t}, 100);\r\n\r\n\r\n\t}\r\n}\r\n\r\nAdminLandingController.$inject = ['$rootScope', '$scope', 'AdminLandingService', 'FxpMessageService', 'FxpLoggerService', 'FxpAuthorizationService', 'FxpEventBroadCastService', 'FxpGlobalStoreService'];","import { IRootScope } from \"../../js/interfaces/IRootScope\";\r\nimport { ILogger } from \"../../js/interfaces/ILogger\";\r\nimport { FxpConstants, PerfMarkers, ApplicationConstants } from \"../../js/common/ApplicationConstants\";\r\nimport { FxpMessageService } from \"../banner/FxpMessageService\";\r\nimport { FxpConfigurationService } from \"../../js/services/FxpConfiguration\";\r\nimport { UserClaimsService } from \"../../js/services/UserClaimsService\"\r\nimport { UserInfoService } from \"../../js/services/UserInfoService\";\r\nimport { IFxPService } from \"../../js/interfaces/IFxpService\";\r\nimport { FxpGlobalStoreService } from \"../../js/services/fxp.global.store.service\";\r\nimport { setAdminTiles } from \"./adminTile.action\";\r\nimport { TelemetryConstants } from \"../../js/telemetry/TelemetryConst\";\r\nimport { ErrorCodes } from \"../../js/constants/errorCodes\";\r\nimport { ErrorSeverityLevel } from \"../../js/telemetry/ErrorSeverityLevel\";\r\nimport { MsalAuthenticationService } from \"../../js/services/MsalAuthenticationService\";\r\ndeclare var _: any; \r\n/**\r\n * @application Fxp\r\n */\r\n/**\r\n * @module Fxp.Services\r\n */\r\n\r\nexport class AdminLandingService implements IFxPService {\r\n\tprivate http: angular.IHttpService;\r\n\tprivate q: angular.IQService;\r\n\tprivate rootScope: IRootScope;\r\n\tprivate timeout: angular.ITimeoutService;\r\n\tprivate sleepInterval: number;\r\n\tprivate userAlias: string;\r\n\tprivate fxpConfiguration: FxpConfigurationService;\r\n\tprivate fxplogger: ILogger;\r\n\tprivate fxpServiceEndPoint: string;\r\n\tprivate msalAuthenticationService: MsalAuthenticationService;\r\n\tprivate iCount: number = 0;\r\n\tprivate iReqCount: number = 0;\r\n\tprivate iUCount: number = 0;\r\n\tprivate sourceForTelemetry = `${TelemetryConstants.FXP_TELEMETRY_BASE_NAME}.AdminLandingService`;\r\n\tprivate fxpMessageSvc: FxpMessageService;\r\n\r\n\tconstructor(\r\n\t\t$http: angular.IHttpService, \r\n\t\t$q: angular.IQService, \r\n\t\t$rootScope: IRootScope, \r\n\t\t$timeout: angular.ITimeoutService, \r\n\t\tfxpConfiguration: FxpConfigurationService, \r\n\t\tloggerService: ILogger, \r\n\t\tmsalAuthenticationService: MsalAuthenticationService, \r\n\t\tfxpMessage: FxpMessageService, \r\n\t\tprivate userClaimsService: UserClaimsService, \r\n\t\tprivate userInfoService: UserInfoService, \r\n\t\tprivate $base64: any,\r\n\t\tprivate globalStoreService: FxpGlobalStoreService) \r\n\t{\r\n\t\tthis.http = $http;\r\n\t\tthis.q = $q;\r\n\t\tthis.rootScope = $rootScope;\r\n\t\tthis.timeout = $timeout;\r\n\t\tthis.sleepInterval = 100;\r\n\t\tthis.fxpConfiguration = fxpConfiguration;\r\n\t\tthis.fxplogger = loggerService;\r\n\t\tthis.fxpServiceEndPoint = this.fxpConfiguration.FxpAppSettings.FxpServiceEndPoint;\r\n\t\tthis.msalAuthenticationService = msalAuthenticationService;\r\n\t\tthis.fxpMessageSvc = fxpMessage;\r\n\t}\r\n\r\n\tGetAdminDataFromServer(): angular.IPromise {\r\n\t\tlet source = `${this.sourceForTelemetry}.GetAdminDataFromServer`;\r\n\t\tvar deferred = this.q.defer();\r\n\t\tvar self = this;\r\n\t\tself.userClaimsService.getUserRoles()\r\n\t\t\t.then(function (response) {\r\n\t\t\t\tlet userResouces = self.userClaimsService.getUserAdminResources();\r\n\t\t\t\t\r\n\t\t\t\tif (userResouces.toString() == \"\") {\r\n\t\t\t\t\treturn deferred.resolve([]);\r\n\t\t\t\t}\r\n\r\n\t\t\t\tlet userRoles = self.$base64.encode(response).toString();\r\n\t\t\t\tlet encodedUserResources = self.$base64.encode(userResouces).toString();\r\n\t\t\t\tvar url = self.fxpServiceEndPoint + \"/adminTiles/\";\r\n\t\t\t\tself.fxplogger.startTrackPerformance(PerfMarkers.GetAdminDataFromServer);\r\n\t\t\t\tif (self.msalAuthenticationService.accessTokenRequestInProgress(url)) {\r\n\t\t\t\t\tself.iReqCount++;\r\n\t\t\t\t\tif (self.iReqCount == 5) {\r\n\t\t\t\t\t\tself.fxplogger.logError(source, \r\n\t\t\t\t\t\t\t\t\t\t\t\tself.rootScope.fxpUIConstants.UIMessages.GetAdminDataFailureError.ErrorMessageTitle, \r\n\t\t\t\t\t\t\t\t\t\t\t\tErrorCodes.OnGetAdminDataFromServerFailure,\r\n\t\t\t\t\t\t\t\t\t\t\t\tnull,\r\n\t\t\t\t\t\t\t\t\t\t\t\tnull,\r\n\t\t\t\t\t\t\t\t\t\t\t\tnull,\r\n\t\t\t\t\t\t\t\t\t\t\t\tnull,\r\n\t\t\t\t\t\t\t\t\t\t\t\tErrorSeverityLevel.Medium);\r\n\t\t\t\t\t\tself.fxpMessageSvc.addMessage(self.rootScope.fxpUIConstants.UIMessages.GetAdminDataAuthFailureError.ErrorMessage, FxpConstants.messageType.error);\r\n\t\t\t\t\t}\r\n\t\t\t\t\tself.timeout(function () {\r\n\t\t\t\t\t\tself.GetAdminDataFromServer();\r\n\t\t\t\t\t}, self.sleepInterval);\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\tself.iReqCount = 0;\r\n\t\t\t\t\tself.fxplogger.logTrace(source, \"getAdminDataFromServer\");\r\n\r\n\t\t\t\t\tlet requestHeaders = {};\r\n\t\t\t\t\trequestHeaders[ApplicationConstants.XUserClaimsToken] = userRoles;\r\n\t\t\t\t\trequestHeaders[ApplicationConstants.XTenantId] = window[\"tenantConfiguration\"].TenantId;\r\n\t\t\t\t\trequestHeaders[ApplicationConstants.XResources] = encodedUserResources;\r\n\t\t\t\t\tself.http({\r\n\t\t\t\t\t\tmethod: \"GET\",\r\n\t\t\t\t\t\turl: url,\r\n\t\t\t\t\t\theaders: requestHeaders\r\n\t\t\t\t\t}).then(function (response) {\r\n\t\t\t\t\t\tvar data = JSON.stringify(response.data);\r\n\t\t\t\t\t\tself.globalStoreService.GetPlatformStore().dispatch(setAdminTiles(JSON.parse(data)));\r\n\t\t\t\t\t\tvar sessionStorageKey = ApplicationConstants.FxpAdminData + \"_\" + self.userInfoService.getCurrentUser();\r\n\t\t\t\t\t\tsessionStorage[sessionStorageKey] = data;\r\n\t\t\t\t\t\tdeferred.resolve(response);\r\n\t\t\t\t\t}, function (error) {\r\n\t\t\t\t\t\tdeferred.reject(error);\r\n\t\t\t\t\t});\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\tself.fxplogger.stopTrackPerformance(PerfMarkers.GetAdminDataFromServer);\r\n\r\n\t\treturn deferred.promise;\r\n\t}\r\n\r\n\tGetAdminTileDetails(isRefresh: boolean): angular.IPromise {\r\n\t\tvar deferred = this.q.defer();\r\n\t\tvar self = this;\r\n\t\tvar adminTilesData;\r\n\t\tif (!isRefresh) {\r\n\t\t\tadminTilesData = !Object.keys(self.globalStoreService.GetPlatformState().AdminTiles).length ? self.GetAdminDataFromCache() : self.globalStoreService.GetPlatformState().AdminTiles;\r\n\t\t}\r\n\t\tif (adminTilesData == null) {\r\n\t\t\tself.GetAdminDataFromServer().then(function (response) {\r\n\t\t\t\tdeferred.resolve(response.data);\r\n\t\t\t}, function (error) {\r\n\t\t\t\tdeferred.reject(error);\r\n\t\t\t});\r\n\t\t} else {\r\n\t\t\tdeferred.resolve(adminTilesData);\r\n\t\t}\r\n\r\n\t\treturn deferred.promise;\r\n\t}\r\n\r\n\tGetAdminDataFromCache(): any {\r\n\t\tvar self = this;\r\n\t\tvar sessionStorageKey = ApplicationConstants.FxpAdminData + \"_\" + self.userInfoService.getCurrentUser();\r\n\t\tvar adminData = JSON.parse(window.sessionStorage.getItem(sessionStorageKey));\r\n\t\tself.globalStoreService.GetPlatformStore().dispatch(setAdminTiles(adminData));\r\n\t\treturn adminData;\r\n\t}\r\n\r\n}\r\n","import { IAdminTileGroup } from './adminTiles.model';\r\nimport { IAction } from 'redux-micro-frontend';\r\nimport { Actions } from './adminTile.action.types';\r\n\r\nexport const setAdminTiles = (payload: Array): IAction> => {\r\n return {\r\n type: Actions.SET_ADMIN_TILES,\r\n payload: payload\r\n }\r\n}\r\n\r\nexport const removeOboContext = (): IAction> => {\r\n return {\r\n type: Actions.REMOVE_OBO_CONTEXT,\r\n payload: []\r\n }\r\n}","export enum Actions {\r\n SET_ADMIN_TILES = \"SET_ADMIN_TILE\",\r\n REMOVE_OBO_CONTEXT= \"REMOVE_OBO_CONTEXT\"\r\n}","import { Reducer } from 'redux';\r\nimport { IAction } from 'redux-micro-frontend';\r\nimport { Actions } from './adminTile.action.types';\r\nimport { IAdminTileGroup } from './adminTiles.model';\r\n\r\nconst defaultState: Array = [];\r\n\r\nexport const AdminTileReducer: Reducer, IAction> = (\r\n state: Array = defaultState,\r\n action: IAction\r\n): Array => {\r\n\r\n switch(action.type) {\r\n case Actions.SET_ADMIN_TILES : {\r\n return action.payload;\r\n }\r\n case Actions.REMOVE_OBO_CONTEXT : {\r\n return defaultState;\r\n }\r\n }\r\n \r\n return state;\r\n}\r\n\r\n","import { IRootScope } from \"../../js/interfaces/IRootScope\";\r\nimport { FxpConfigurationService } from \"../../js/services/FxpConfiguration\";\r\nimport { ILogger } from \"../../js/interfaces/ILogger\";\r\nimport { FxpConstants } from \"../../js/common/ApplicationConstants\";\r\nimport { IFxPService } from \"../../js/interfaces/IFxpService\";\r\nimport { AddBanner, CloseBanner } from './banner.action';\r\nimport { IPlatformState } from '../store/platform.state.model';\r\nimport { FxpGlobalStoreService } from \"../../js/services/fxp.global.store.service\";\r\nimport { PlatformStoreFactory } from '../store/platform.store.factory';\r\nimport { TelemetryConstants } from \"../../js/telemetry/TelemetryConst\";\r\n/**\r\n * @application Fxp\r\n */\r\n/**\r\n * @module Fxp.Services\r\n */\r\n/**\r\n * A service to display all types of Messages like Error, Warning, Information\r\n * @class Fxp.Services.fxpMessageService\r\n * @classdesc A service to display all types of Messages like Error, Warning, Information\r\n * @example Example to create an instance of Fxp Message Service \r\n * //Initializing Fxp Message\r\n * angular.module('FxPApp').controller('AppController', ['fxpMessageService', AppController]);\r\n * function AppController(fxpMessageService, fxpConstants){ fxpMessageService.addMessage('message from FXP', Fxp.Common.Constants.FxpConstants.messageType.error); }\r\n */\r\nexport class FxpMessageService implements IFxPService {\r\n\tprivate $rootScope: IRootScope;\r\n\tprivate msgTimeout;\r\n\tprivate msgInterval;\r\n\tprivate $interval: angular.IIntervalService;\r\n\tprivate $timeout: any;\r\n\tprivate fxpConfigurationService: FxpConfigurationService;\r\n\tprivate trackIdLabel;\r\n\tprivate msgIDLabel;\r\n\tprivate controlIdToFocusOnClose: any;\r\n\tpublic showBanner: boolean;\r\n\r\n\tconstructor($rootScope: IRootScope, $interval: angular.IIntervalService, $timeout, fxpConfigurationService: FxpConfigurationService,\r\n\t\tprivate fxpLoggerService: ILogger, private globalStoreService: FxpGlobalStoreService) {\r\n\t\tthis.$rootScope = $rootScope;\r\n\t\tthis.$timeout = $timeout;\r\n\t\tthis.$rootScope.messages = [];\r\n\t\tthis.$rootScope.messageClass = \"modal-hide\";\r\n\t\tthis.$interval = $interval;\r\n\t\tthis.msgTimeout = fxpConfigurationService.FxpAppSettings.FxpMessageTimeout;\r\n\t\tif (this.msgTimeout == \"\" || this.msgTimeout == null || isNaN(this.msgTimeout))\r\n\t\t\tthis.msgTimeout = 2000;\r\n\t\tthis.$rootScope.closeMessage = this.closeMessage.bind(this);\r\n\t\tthis.$rootScope.clearAndReload = this.clearAndReload.bind(this);\r\n\t\tthis.trackIdLabel = fxpConfigurationService.FxpBaseConfiguration.FxpConfigurationStrings.UIStrings.MessageToasterTrackId;\r\n\t\tthis.msgIDLabel = fxpConfigurationService.FxpBaseConfiguration.FxpConfigurationStrings.UIStrings.MessageID;\r\n\t\tthis.showBanner = true;\r\n\r\n\t\tPlatformStoreFactory.CreateIfNotExist(fxpLoggerService);\r\n\r\n\t\tthis.globalStoreService.SubscribeToPlatformState(\"Platform\", (platformState: IPlatformState) => {\r\n\t\t\tthis.updateBanners(platformState);\r\n\t\t});\r\n\t}\r\n\tprivate updateBanners(platformState: IPlatformState) {\r\n\t\tif (platformState.Banners && platformState.Banners.length != this.$rootScope.messages.length) {\r\n\t\t\tvar isNewMessageAdded = platformState.Banners.length > this.$rootScope.messages.length\r\n\t\t\tif (isNewMessageAdded) {\r\n\t\t\t\tvar msg = platformState.Banners[platformState.Banners.length - 1];\r\n\t\t\t\tthis.$rootScope.messages.push(msg);\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\tfor (var i = 0; i < this.$rootScope.messages.length; i++) {\r\n\t\t\t\t\tvar index = platformState.Banners.indexOf(this.$rootScope.messages[i]);\r\n\t\t\t\t\tif (index == -1) {\r\n\t\t\t\t\t\tthis.$rootScope.messages.splice(i, 1);\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t}\r\n\t}\r\n\t/**\r\n\t* Displays Error/Warning/Information messages on FXP and Focus\r\n\t* @method Fxp.Services.fxpMessageService.addMessage \r\n\t* @param {string} a mandatory string value which contains Error/Warning/Information. \r\n\t* @param {string} a mandatory string value determing type of messsage Error/Warning/Information. \r\n\t* @example Example to invoke addMessage\r\n\t* fxpMessageService.addMessage('Error from FXP', fxpConstants.messageType.error);\r\n\t*/\r\n\taddMessage = function (message: any, messageType: string, doNotAutoClose?: boolean, trackingId?: string, messageID?: string, focusControlIdOnClose?: any) {\r\n\t\tvar self = this;\r\n\t\tthis.controlIdToFocusOnClose = focusControlIdOnClose;\r\n\t\tif (!this.showBanner) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tif (!message || message.length === 0) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tvar $rootScope = this.$rootScope;\r\n\t\tvar msgTrackId = trackingId ? this.trackIdLabel + trackingId : \"\";\r\n\t\tvar msgID = messageID ? this.msgIDLabel + messageID : \"\";\r\n\r\n\t\tvar isMsgItemExist = $rootScope.messages.some(function (item) {\r\n\r\n\t\t\treturn item.MessageType == messageType && item.Message == message && item.trackId == msgTrackId && item.uniqueTransactionId == msgID;\r\n\t\t});\r\n\t\tif (isMsgItemExist) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tvar msg: any = {};\r\n\t\tmsg.msgDate = new Date();\r\n\t\tmsg.MessageType = messageType || FxpConstants.messageType.info;\r\n\t\tmsg.Message = message;\r\n\t\tmsg.show = true;\r\n\t\tmsg.trackId = msgTrackId;\r\n\t\tmsg.uniqueTransactionId = msgID;\r\n\r\n\t\tswitch (msg.MessageType) {\r\n\t\t\tcase FxpConstants.messageType.success:\r\n\t\t\t\tmsg.doNotAutoClose = (doNotAutoClose !== undefined && doNotAutoClose !== null) ? doNotAutoClose : false;\r\n\t\t\t\tbreak;\r\n\t\t\tcase FxpConstants.messageType.error:\r\n\t\t\t\tmsg.doNotAutoClose = true; // Never auto close\r\n\t\t\t\tvar propbag = this.fxpLoggerService.createPropertyBag();\r\n\t\t\t\tvar errorMessageWithTrackingId = trackingId ? message + \" \" + trackingId : message;\r\n\t\t\t\tpropbag.addToBag(\"ErrorMessage\", errorMessageWithTrackingId);\r\n\t\t\t\tpropbag.addToBag(\"Location\", window.location.hash);\r\n\t\t\t\tthis.fxpLoggerService.logEvent(`${TelemetryConstants.FXP_TELEMETRY_BASE_NAME}.FxpMessageService.addMessage`, `${TelemetryConstants.FXP_TELEMETRY_BASE_NAME}.ErrorDisplayed`, propbag);\r\n\r\n\t\t\t\tbreak;\r\n\t\t\tdefault:\r\n\t\t\t\t// Do not auotoclose unless it is asked explicitly\r\n\t\t\t\tmsg.doNotAutoClose = (doNotAutoClose !== undefined && doNotAutoClose !== null) ? doNotAutoClose : true;\r\n\t\t\t\tbreak;\r\n\t\t}\r\n\r\n\t\t//Dispatch action to add banner\r\n\t\tself.globalStoreService.DispatchGlobalAction(\"Platform\", AddBanner(msg));\r\n\t\tthis.$rootScope.messageClass = this.$rootScope.messages.length > 0 ? \"modal-show\" : \"modal-hide\";\r\n\r\n\t\tif (this.isAnyBlockingMessageVisible())\r\n\t\t\tthis.$rootScope.messageClass += \" modal-blocker\";\r\n\r\n\t\tif (this.$rootScope.messages.length == 1 && $(\":focus\").length > 0) {\r\n\t\t\tthis.$rootScope.activeElement = $(\":focus\");\r\n\t\t}\r\n\r\n\t\tif (this.$rootScope.messages.length > 0) {\r\n\t\t\tlet timeout = setTimeout(function () {\r\n\t\t\t\tvar messagecontainers = $(\".message-container\");\r\n\t\t\t\tif (messagecontainers.length) {\r\n\t\t\t\t\tlet msgContainer = messagecontainers[$rootScope.messages.length - 1];\r\n\t\t\t\t\t$(\".\" + msgContainer.className + \" > button\").first().focus();\r\n\t\t\t\t}\r\n\t\t\t\tclearTimeout(timeout);\r\n\t\t\t}, 100);\r\n\t\t}\r\n\t\tif (!msg.doNotAutoClose) {\r\n\t\t\tthis.monitorMessages();\r\n\t\t}\r\n\t}\r\n\r\n\tprivate monitorMessages() {\r\n\t\tif (this.msgInterval) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tlet $timeout = this.$timeout;\r\n\t\tlet timeout = this.msgTimeout;\r\n\t\tlet $rootScope = this.$rootScope;\r\n\t\tlet self = this;\r\n\t\tthis.msgInterval = this.$interval(function () {\r\n\t\t\tlet dt: any = new Date();\r\n\t\t\tlet diff: number;\r\n\t\t\tlet messageExists = false;\r\n\t\t\tfor (var i = self.globalStoreService.GetPlatformState().Banners.length - 1; i >= 0; i--) {\r\n\t\t\t\tvar message = self.globalStoreService.GetPlatformState().Banners[i];\r\n\t\t\t\tvar messageType = message.MessageType.toLowerCase();\r\n\r\n\t\t\t\tif ((messageType == \"success\" || messageType == \"warning\" || messageType == \"info\") && (!$rootScope.messages[i].doNotAutoClose)) {\r\n\t\t\t\t\tmessageExists = true;\r\n\t\t\t\t\tdiff = dt - message.msgDate;\r\n\t\t\t\t\tif (diff >= timeout)\r\n\t\t\t\t\t\tself.globalStoreService.DispatchGlobalAction(\"Platform\", CloseBanner(message));\r\n\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tif (!messageExists) {\r\n\t\t\t\tself.$interval.cancel(self.msgInterval);\r\n\t\t\t\tself.msgInterval = null;\r\n\t\t\t}\r\n\t\t\tif ($rootScope.messages.length == 0) {\r\n\t\t\t\t$rootScope.messageClass = \"modal-hide\";\r\n\t\t\t\tif ($rootScope.activeElement) {\r\n\t\t\t\t\tlet timeout = $timeout(function () {\r\n\t\t\t\t\t\tif ($rootScope.activeElement)\r\n\t\t\t\t\t\t\t$rootScope.activeElement.focus();\r\n\t\t\t\t\t\t$rootScope.activeElement = undefined;\r\n\t\t\t\t\t\t$timeout.cancel(timeout);\r\n\t\t\t\t\t}, 100);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}, 1000);\r\n\t}\r\n\r\n\t/**\r\n\t* An event handler whenever message close button is clicked.\r\n\t* @method Fxp.Services.fxpMessageService.closeMessage\r\n\t* @param {onject} message An object which is passed from the view.\r\n\t* @example Example to use closeMessage\r\n\t*
Close Message
;\r\n\t*
closeMessage
;\r\n\t*/\r\n\tcloseMessage = function (message) {\r\n\t\tvar self = this;\r\n\t\t//Dispatch action to close banner\r\n\t\tself.globalStoreService.DispatchGlobalAction(\"Platform\", CloseBanner(message));\r\n\t\tthis.$rootScope.messageClass = this.$rootScope.messages.length > 0 ? \"modal-show\" : \"modal-hide\";\r\n\t\tif (this.isAnyBlockingMessageVisible())\r\n\t\t\tthis.$rootScope.messageClass += \" modal-blocker\";\r\n\t\tif (this.$rootScope.messages.length == 0) {\r\n\t\t\tthis.$interval.cancel(this.msgInterval);\r\n\t\t\tsetTimeout(function () {\r\n\t\t\t\tif (!self.controlIdToFocusOnClose) {\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t\tif (self.controlIdToFocusOnClose.focus) {\r\n\t\t\t\t\tself.controlIdToFocusOnClose.focus();\r\n\t\t\t\t}\r\n\t\t\t\telse if (typeof (self.controlIdToFocusOnClose) === 'string') {\r\n\t\t\t\t\t$('#' + self.controlIdToFocusOnClose).focus();\r\n\t\t\t\t}\r\n\t\t\t}, 0);\r\n\t\t}\r\n\t\telse\r\n\t\t\tsetTimeout(function () {\r\n\t\t\t\tvar messagecontainers = $(\".message-container\");\r\n\t\t\t\tif (messagecontainers.length) {\r\n\t\t\t\t\tlet msgContainer = messagecontainers[messagecontainers.length - 1];\r\n\t\t\t\t\t$(\".\" + msgContainer.className + \" > button\").first().focus();\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t}, 100);\r\n\r\n\t}\r\n\r\n\tclearAndReload = function () {\r\n\t\tvar propbag = this.fxpLoggerService.createPropertyBag();\r\n\t\tpropbag.addToBag(\"Message\", \"User clicked reset application\");\r\n\t\tpropbag.addToBag(\"Location\", window.location.hash);\r\n\t\tthis.fxpLoggerService.logEvent(`${TelemetryConstants.FXP_TELEMETRY_BASE_NAME}.FxpMessageService.clearAndReload`, `${TelemetryConstants.FXP_TELEMETRY_BASE_NAME}.ResetApplication`, propbag);\r\n\t\twindow[\"localStorage\"].clear();\r\n\t\twindow[\"sessionStorage\"].clear();\r\n\t\twindow.location.reload();\r\n\t}\r\n\r\n\tprivate isAnyBlockingMessageVisible() {\r\n\r\n\t\treturn this.$rootScope.messages.some(e => e.MessageType == FxpConstants.messageType.error);\r\n\t}\r\n}\r\n","//action creators for Banner\r\nimport { IAction } from 'redux-micro-frontend';\r\nimport { Banner } from \"./banner.model\"\r\nimport { BannerActionTypes } from './banner.action.types';\r\n\r\nexport const AddBanner = (payload: Banner): IAction => {\r\n return {\r\n type: BannerActionTypes.ADD_BANNER_MESSAGE,\r\n payload: payload\r\n }\r\n}\r\nexport const CloseBanner = (payload: Banner): IAction => {\r\n return {\r\n type: BannerActionTypes.CLOSE_BANNER_MESSAGE,\r\n payload: payload\r\n }\r\n}","export enum BannerActionTypes {\r\n ADD_BANNER_MESSAGE = \"ADD_BANNER_MESSAGE\",\r\n CLOSE_BANNER_MESSAGE = \"CLOSE_BANNER_MESSAGE\",\r\n}","import { Reducer } from 'redux'\r\nimport { IAction } from 'redux-micro-frontend';\r\nimport { Banner } from \"./banner.model\"\r\nimport { BannerActionTypes } from './banner.action.types';\r\nconst defaultState: Array = [];\r\n\r\n\r\nexport const BannerReducer: Reducer, IAction> = (\r\n state: Array = defaultState,\r\n action: IAction\r\n): Array => {\r\n switch (action.type) {\r\n case BannerActionTypes.ADD_BANNER_MESSAGE: {\r\n return [...state, action.payload];\r\n }\r\n case BannerActionTypes.CLOSE_BANNER_MESSAGE: {\r\n var index = state.indexOf(action.payload);\r\n return [...state.slice(0, index), ...state.slice(index + 1)];\r\n }\r\n }\r\n\r\n return state;\r\n}","import { IAction } from 'redux-micro-frontend';\r\nimport { Claims } from '../claims/claims.model'\r\nimport { ClaimsActionTypes } from '../claims/claims.action.types';\r\nexport const AddLoggedInUserClaims = (userClaims: Claims): IAction => ({\r\n type: ClaimsActionTypes.ADD_LOGGED_IN_USER_CLAIMS,\r\n payload: userClaims,\r\n logEnabled: false\r\n});\r\n\r\nexport const AddCurrentUserClaims = (userClaims: Claims): IAction => ({\r\n type: ClaimsActionTypes.ADD_CURRENT_USER_CLAIMS,\r\n payload: userClaims,\r\n logEnabled: false\r\n});","export enum ClaimsActionTypes {\r\n ADD_CURRENT_USER_CLAIMS=\"ADD_CURRENT_USER_CLAIMS\",\r\n ADD_LOGGED_IN_USER_CLAIMS=\"ADD_LOGGED_IN_USER_CLAIMS\"\r\n}","import { Reducer } from 'redux';\r\nimport { IAction } from 'redux-micro-frontend';\r\nimport { Claims } from './claims.model';\r\nimport { ClaimsActionTypes } from './claims.action.types';\r\n\r\nconst defaultClaims: Claims = {} as Claims\r\n\r\nexport const ClaimsReducer: Reducer> = (\r\n state: Claims = defaultClaims,\r\n action: IAction): Claims => {\r\n\r\n if (action.type==ClaimsActionTypes.ADD_CURRENT_USER_CLAIMS || action.type == ClaimsActionTypes.ADD_LOGGED_IN_USER_CLAIMS) {\r\n return action.payload;\r\n }\r\n\r\n return state;\r\n}","import { Component, Inject, OnInit, ViewChild, ViewContainerRef, forwardRef } from '@angular/core';\r\nimport { StateService } from \"@uirouter/core\";\r\nimport { PartnerAppRegistrationService } from '../../../js/services/PartnerAppRegistrationService';\r\nimport { FxpLazyLoader } from '../../fxplazyloader';\r\nimport { LazyLoaderService } from \"../../../js/services/lazyLoaderService\";\r\nimport { PageLoaderService } from '../../loader/pageLoaderService';\r\nimport { FxpEventBroadCastService } from '../../../js/services/BroadCastingService';\r\nimport { FxpBroadcastedEvents } from '../../../js/services/FxpBroadcastedEvents';\r\nimport { FxpLoggerService } from '../../../js/telemetry/fxpLogger';\r\nimport { ComponentFramework } from '../../../js/common/enum/ComponentFramework';\r\nimport { ISharedComponentReference } from '../../../js/interfaces/ISharedComponentReference';\r\n\r\n@Component({\r\n selector: 'iris-launcher',\r\n templateUrl: './fxpbot.component.html'\r\n})\r\nexport class FxpBotLauncherComponent implements OnInit {\r\n\r\n constructor(\r\n @Inject(forwardRef(() => PageLoaderService)) public pageLoaderService: PageLoaderService,\r\n @Inject(forwardRef(() => LazyLoaderService)) public lazyLoadingService: LazyLoaderService,\r\n @Inject(forwardRef(() => FxpEventBroadCastService)) private fxpEventBroadCastService: FxpEventBroadCastService,\r\n @Inject(forwardRef(() => FxpLoggerService)) private fxpLoggerService: FxpLoggerService,\r\n @Inject(forwardRef(() => StateService)) private stateService: StateService,\r\n ) {\r\n\r\n }\r\n\r\n @ViewChild('container', { read: ViewContainerRef, static: false }) entry: ViewContainerRef;\r\n ngOnInit() {\r\n this.fxpEventBroadCastService.On(FxpBroadcastedEvents.OnLaunchIrisBot, this.showVirtualAssistant.bind(this));\r\n }\r\n\r\n showVirtualAssistant = function () {\r\n this.fxpLoggerService.renewCorrelationId();\r\n if (window[\"IsBotVisible\"] == undefined || !window[\"IsBotVisible\"]) {\r\n let self = this;\r\n this.pageLoaderService.fnShowPageLoader(\"Loading Bot...\");\r\n var FxpAppSettings = FxpAppSettings || window[\"FxpAppSettings\"] || {};\r\n const moduleBundle = FxpAppSettings.IrisModuleBundle;\r\n const bundle = FxpAppSettings.IrisBundle;\r\n this.lazyLoadingService.getInstance().load([moduleBundle, bundle], { serie: true }).then(function () {\r\n let route = self.stateService.get('iris-launcher');\r\n let ngComponent = route.childComponent;\r\n let ngModule = route.ngModule;\r\n\r\n setTimeout(function () {\r\n if (ngModule._ngModuleDefFactory) {\r\n //Module is AOT compiled\r\n let ngModuelRef = FxpLazyLoader.instantiateModule(ngModule);\r\n self.loadComponent(ngModuelRef, ngComponent);\r\n return;\r\n }\r\n\r\n FxpLazyLoader.compileAndLoadModule(ngModule).then(function (ngModuleRef) {\r\n self.loadComponent(ngModuleRef, ngComponent);\r\n }).catch((error) => {\r\n console.log(error);\r\n });\r\n }, 0);\r\n self.pageLoaderService.fnHidePageLoader();\r\n window[\"IsBotVisible\"] = true;\r\n });\r\n }\r\n }\r\n\r\n\r\n loadComponent(moduleRef: any, component: any): void {\r\n const self = this;\r\n try {\r\n let componentFactory = moduleRef.componentFactoryResolver.resolveComponentFactory(component);\r\n this.entry.createComponent(componentFactory, 0, moduleRef.injector);\r\n }\r\n catch (error) {\r\n console.error(error);\r\n }\r\n }\r\n}\r\n","import { Component, Inject, OnInit, ViewChild, ViewContainerRef, forwardRef, ComponentRef } from '@angular/core';\r\nimport { PartnerAppRegistrationService } from '../../../js/services/PartnerAppRegistrationService';\r\nimport { FxpLazyLoader } from '../../fxplazyloader';\r\nimport { LazyLoaderService } from \"../../../js/services/lazyLoaderService\";\r\nimport { PageLoaderService } from '../../loader/pageLoaderService';\r\nimport { FxpEventBroadCastService } from '../../../js/services/BroadCastingService';\r\nimport { FxpBroadcastedEvents } from '../../../js/services/FxpBroadcastedEvents';\r\nimport { FxpLoggerService } from '../../../js/telemetry/fxpLogger';\r\n\r\n@Component({\r\n selector: 'page-tour',\r\n templateUrl: './pageTour.component.html'\r\n})\r\nexport class PageTourLauncherComponent implements OnInit {\r\n private pageTourComponent;\r\n private isPageTourFlyoutOpen: boolean;\r\n public unViewedTourCount: number;\r\n public showCountClass: string = 'hideCount';\r\n constructor(@Inject(forwardRef(() => PageLoaderService)) public pageLoaderService: PageLoaderService,\r\n @Inject(forwardRef(() => LazyLoaderService)) public lazyLoadingService: LazyLoaderService,\r\n @Inject(forwardRef(() => FxpEventBroadCastService)) private fxpEventBroadCastService: FxpEventBroadCastService,\r\n @Inject(forwardRef(() => FxpLoggerService)) private fxpLoggerService: FxpLoggerService\r\n ) {\r\n\r\n }\r\n\r\n @ViewChild('container', { read: ViewContainerRef, static: false }) entry: ViewContainerRef;\r\n ngOnInit() {\r\n this.isPageTourFlyoutOpen = false;\r\n this.initPageTourComponent();\r\n this.bindEventListeners();\r\n\r\n }\r\n\r\n initPageTourComponent = () =>{\r\n this.fxpLoggerService.renewCorrelationId();\r\n if (this.pageTourComponent == null) {\r\n let self = this;\r\n let pageTourBundle = PartnerAppRegistrationService.getBundlesForSharedComponent('pagetour', \"pagetour-flyout\");\r\n this.lazyLoadingService.getInstance().load(pageTourBundle, { serie: true }).then(function(){\r\n let route = PartnerAppRegistrationService.getSharedComponentDetails('pagetour', \"pagetour-flyout\");\r\n let ngComponent = route.component;\r\n let ngModule = route.ngModule;\r\n let ngModuelRef = FxpLazyLoader.instantiateModule(ngModule);\r\n let componentFactory = ngModuelRef.componentFactoryResolver.resolveComponentFactory(ngComponent);\r\n self.pageTourComponent = self.entry.createComponent(componentFactory);\r\n });\r\n }\r\n }\r\n\r\n bindEventListeners = () => {\r\n let self = this;\r\n self.fxpEventBroadCastService.On(FxpBroadcastedEvents.OnPageTourFlyoutOpened, (state)=>this.setPageTourFlyoutState(true));\r\n self.fxpEventBroadCastService.On(FxpBroadcastedEvents.OnPageTourFlyoutClosed, (state)=>this.setPageTourFlyoutState(false));\r\n self.fxpEventBroadCastService.On(\"ShowUnviewedTourCount\", function (event, props) {\r\n self.unViewedTourCount = props.get(\"unviewedTourCount\");\r\n if(self.unViewedTourCount > 0)\r\n self.showCountClass = 'showCount';\r\n });\r\n }\r\n\r\n setPageTourFlyoutState = (isOpen: boolean) =>{\r\n this.isPageTourFlyoutOpen = isOpen;\r\n }\r\n\r\n togglePageTour = () => {\r\n if (!this.isPageTourFlyoutOpen)\r\n this.showPageTourFlyout();\r\n else\r\n this.hidePageTourFlyout();\r\n }\r\n\r\n showPageTourFlyout = function () {\r\n if(this.isPageTourFlyoutOpen) return;\r\n this.fxpEventBroadCastService.broadCast(FxpBroadcastedEvents.ShowPageTour, true);\r\n }\r\n\r\n hidePageTourFlyout = () => {\r\n if(!this.isPageTourFlyoutOpen) return;\r\n if (this.pageTourComponent != null) {\r\n this.fxpEventBroadCastService.broadCast(FxpBroadcastedEvents.HidePageTour, true);\r\n }\r\n }\r\n}\r\n","import { Component, OnInit, OnDestroy, ViewContainerRef, ViewChild, Inject, forwardRef, NgModuleFactory, CompilerFactory } from \"@angular/core\";\r\nimport { StateService } from \"@uirouter/core\";\r\nimport { FxpLazyLoader } from \"../../../app/fxplazyloader\"\r\nimport { PageLoaderService } from \"../../loader/pageLoaderService\";\r\nimport { PartnerStateService } from \"./partnerStateService\";\r\nimport { FxpMessageService } from \"../../banner/FxpMessageService\";\r\nimport { FxpConstants } from \"../../../js/common/ApplicationConstants\";\r\nimport { PartnerAppRegistrationService } from \"../../../js/services/PartnerAppRegistrationService\";\r\nimport { TelemetryConstants } from \"../../../js/telemetry/TelemetryConst\";\r\nimport { ErrorSeverityLevel } from \"../../../js/telemetry/ErrorSeverityLevel\";\r\nimport { ErrorCodes } from \"../../../js/constants/errorCodes\";\r\nimport { FxpLoggerService } from \"../../../js/telemetry/fxpLogger\";\r\n\r\n@Component({\r\n selector: 'fxp-app-partnerapp',\r\n templateUrl: \"./partnerContainer-component.html\"\r\n})\r\nexport class PartnerContainerComponent implements OnInit, OnDestroy {\r\n\r\n @ViewChild('container', { read: ViewContainerRef, static: false }) entry: ViewContainerRef;\r\n componentRef: any;\r\n\r\n currentStateName: string;\r\n sourceForTelemetry = `${TelemetryConstants.FXP_TELEMETRY_BASE_NAME}.PartnerContainerComponent`;\r\n\r\n constructor(\r\n @Inject(forwardRef(() => StateService)) private stateService: StateService,\r\n @Inject(forwardRef(() => PageLoaderService)) private fxpLoaderService: PageLoaderService,\r\n @Inject(forwardRef(() => FxpLoggerService)) private fxpLoggerService: FxpLoggerService,\r\n @Inject(forwardRef(() => FxpMessageService)) private fxpMessageService: FxpMessageService,\r\n @Inject(PartnerStateService) private fxpPartnerStateService: PartnerStateService,\r\n @Inject(CompilerFactory) private compilerFactory: CompilerFactory\r\n ) {\r\n FxpLazyLoader.setCompilerFactory(this.compilerFactory);\r\n }\r\n\r\n ngOnDestroy(): void {\r\n if (this.componentRef) {\r\n this.entry.clear();\r\n this.componentRef = null;\r\n }\r\n this.fxpPartnerStateService.remove(this.currentStateName);\r\n }\r\n\r\n ngOnInit(): void {\r\n const currentState: any = this.stateService.$current;\r\n\r\n window.addEventListener(\"beforeunload\", function (e) {\r\n if(window[\"_showPageDirtyPopup\"]){\r\n var confirmationMessage = \"\\o/\";\r\n e.returnValue = confirmationMessage; \r\n return confirmationMessage;\r\n }\r\n });\r\n\r\n if (!currentState.ngModule || !currentState.childComponent){\r\n currentState.path.forEach(path => {\r\n if (path.name && path.data && path.data.partnerAppName && (!path.childComponent || !path.ngModule)) {\r\n let routeInfo = PartnerAppRegistrationService.getRegisteredAppRoute(path.data.partnerAppName, path.name);\r\n if (routeInfo) {\r\n path.childComponent = routeInfo.component;\r\n path.ngModule = routeInfo.ngModule;\r\n \r\n if (routeInfo.sticky && routeInfo.views) {\r\n let name = Object.keys(routeInfo.views)[0]; // sticky:true requires there to be a named view in the `views` attribute\r\n path.childComponent = routeInfo.views[name].component;\r\n }\r\n }\r\n }\r\n });\r\n }\r\n \r\n\r\n let ngModule = currentState.ngModule;\r\n let component = currentState.childComponent;\r\n const self = this;\r\n\r\n if (!ngModule) {\r\n let message = \"Reference to module is misisng in route configuration. Please set ngModule property of route config.\";\r\n this.fxpMessageService.addMessage(message, FxpConstants.messageType.error, true);\r\n console.error(message);\r\n return;\r\n }\r\n const moduleName = (ngModule.moduleType && ngModule.moduleType.name)? ngModule.moduleType.name : ngModule.name;\r\n const timerLabel = \"PartnerModule \" + moduleName + \" compilation: \";\r\n this.fxpLoaderService.fnShowPageLoader(\"Loading...\");\r\n let currentStateHandle: any;\r\n currentStateHandle = currentState;\r\n\r\n while (currentStateHandle.parent && currentStateHandle.parent.childComponent && !this.fxpPartnerStateService.contains(currentStateHandle.parent.name)) {\r\n currentStateHandle = currentStateHandle.parent;\r\n }\r\n\r\n this.fxpPartnerStateService.addState(currentStateHandle.name);\r\n this.currentStateName = currentStateHandle.name;\r\n component = currentStateHandle.childComponent;\r\n ngModule = currentStateHandle.ngModule;\r\n\r\n setTimeout(function () {\r\n if (ngModule._ngModuleDefFactory) {\r\n //Module is AOT compiled\r\n let ngModuelRef = FxpLazyLoader.instantiateModule(ngModule);\r\n self.loadComponent(ngModuelRef, component);\r\n console.time(timerLabel);\r\n return;\r\n }\r\n\r\n FxpLazyLoader.compileAndLoadModule(ngModule).then(function (ngModuleRef) {\r\n console.timeEnd(timerLabel);\r\n self.loadComponent(ngModuleRef, component);\r\n }).catch((error) => {\r\n let message = \"An error occured while compiling angular module: \" + ngModule.name + \". Please see the browser console for more details. \";\r\n let properties = self.fxpLoggerService.createPropertyBag();\r\n properties.addToBag(\"ngModuleName\", ngModule.name);\r\n self.fxpLoggerService.logException(`${self.sourceForTelemetry}.NgOnInit`, error, properties, null, null, ErrorSeverityLevel.Critical, ErrorCodes.ModuleCompilationError);\r\n self.fxpMessageService.addMessage(message, FxpConstants.messageType.error, true);\r\n console.error(message);\r\n console.error(error);\r\n self.fxpLoaderService.fnHidePageLoader();\r\n });\r\n }, 0);\r\n }\r\n\r\n loadComponent(moduleRef: any, component: any): void {\r\n const self = this;\r\n try {\r\n const label = \"Loading partner component: \" + component.name;\r\n console.time(label);\r\n let componentFactory = moduleRef.componentFactoryResolver.resolveComponentFactory(component);\r\n const currentState: any = this.stateService.$current\r\n if (currentState.includeRootModule) {\r\n this.componentRef = this.entry.createComponent(componentFactory, 0, moduleRef.injector);\r\n }\r\n else {\r\n this.componentRef = this.entry.createComponent(componentFactory, undefined, undefined, undefined, moduleRef);\r\n }\r\n\r\n this.fxpLoaderService.fnHidePageLoader();\r\n console.timeEnd(label);\r\n }\r\n catch (error) {\r\n let message = \"An error occured while instantiating the component: \" + component.name + \" of Module: \" + moduleRef.instance.constructor.name + \". Please see the browser console for more details. \";\r\n let properties = self.fxpLoggerService.createPropertyBag();\r\n properties.addToBag(\"ComponentName\", component.name);\r\n self.fxpLoggerService.logException(`${self.sourceForTelemetry}.LoadComponent`, error, properties, null, null, ErrorSeverityLevel.Critical, ErrorCodes.ErrorInstantiatingComponent);\r\n self.fxpMessageService.addMessage(message, FxpConstants.messageType.error, true);\r\n console.error(message);\r\n console.error(error);\r\n self.fxpLoaderService.fnHidePageLoader();\r\n }\r\n }\r\n}\r\n","import { Injectable } from \"@angular/core\";\r\n\r\n@Injectable()\r\nexport class PartnerStateService {\r\n\r\n private _currentStateName: Array = [];\r\n\r\n public get RunningStates(){\r\n return this._currentStateName;\r\n }\r\n\r\n public addState(stateName:string){\r\n this._currentStateName.push(stateName);\r\n }\r\n\r\n public clear(){\r\n this._currentStateName = [];\r\n }\r\n\r\n public contains(stateName:string){\r\n return this._currentStateName.indexOf(stateName) != -1; \r\n }\r\n\r\n public remove(stateName:string){\r\n this._currentStateName = this._currentStateName.filter(function(item){\r\n return item !== stateName\r\n });\r\n }\r\n}\r\n","import {\r\n Component,\r\n ElementRef,\r\n forwardRef,\r\n Inject,\r\n OnDestroy,\r\n OnInit,\r\n ViewChild,\r\n} from \"@angular/core\";\r\nimport * as pbi from \"powerbi-client\";\r\n\r\nimport { StateService } from \"@uirouter/angular\";\r\nimport { CommonUtils } from \"../../../js/utils/CommonUtils\";\r\nimport { FxpMessageService } from \"../../banner/FxpMessageService\";\r\nimport { FxpConstants } from \"../../../js/common/ApplicationConstants\";\r\nimport { PageLoaderService } from \"../../loader/pageLoaderService\";\r\nimport { ErrorCodes } from \"../../../js/constants/errorCodes\";\r\nimport { ErrorSeverityLevel } from \"../../../js/telemetry/ErrorSeverityLevel\";\r\nimport { FxpLoggerService } from \"../../../js/telemetry/fxpLogger\";\r\nimport { TelemetryConstants } from \"../../../js/telemetry/TelemetryConst\";\r\nimport { FeatureUsageEvent } from \"../../../js/telemetry/FeatureUsageEvent\";\r\nimport {\r\n ActionStatus,\r\n ActionType,\r\n ComponentType,\r\n EventName,\r\n} from \"@microsoftit/telemetry-extensions-npm\";\r\nimport { FxpConfigurationService } from \"../../../js/services/FxpConfiguration\";\r\nimport { UserInfoService } from \"../../../js/services/UserInfoService\";\r\nimport { LogPropertyBag } from \"../../../js/telemetry/LogPropertyBag\";\r\nimport { MsalAuthenticationService } from \"../../../js/services/MsalAuthenticationService\";\r\n\r\nconst PowerBiFeatureName = `${TelemetryConstants.FXP_TELEMETRY_BASE_NAME}.FxPPowerBiIntegration`;\r\n@Component({\r\n selector: \"fxp-app-powerbi-container\",\r\n templateUrl: \"./powerbi-container-component.html\",\r\n})\r\nexport class PowerBIReportContainerComponent implements OnInit, OnDestroy {\r\n private sourceForTelemetry = `${TelemetryConstants.FXP_TELEMETRY_BASE_NAME}.PowerBIReportContainerComponent`;\r\n\r\n @ViewChild(\"reportContainer\", {\r\n static: false,\r\n })\r\n reportContainer: ElementRef;\r\n\r\n constructor(\r\n @Inject(forwardRef(() => MsalAuthenticationService))\r\n private msalAuthenticationService: MsalAuthenticationService,\r\n @Inject(forwardRef(() => FxpLoggerService))\r\n private fxpLoggerService: FxpLoggerService,\r\n @Inject(forwardRef(() => PageLoaderService))\r\n private pageLoaderService: PageLoaderService,\r\n @Inject(forwardRef(() => FxpMessageService))\r\n private fxpMessageService: FxpMessageService,\r\n @Inject(forwardRef(() => FxpConfigurationService))\r\n private fxpConfigurationService: FxpConfigurationService,\r\n @Inject(StateService) public stateService: StateService,\r\n @Inject(forwardRef(() => UserInfoService))\r\n private userInfoService: UserInfoService\r\n ) {}\r\n\r\n ngOnInit(): void {\r\n let self = this;\r\n self.preReportRender();\r\n\r\n const embededReportId = self.stateService.params.reportId\r\n ? self.stateService.params.reportId\r\n : \"\";\r\n const embededDashboardId = self.stateService.params.dashboardId\r\n ? self.stateService.params.dashboardId\r\n : \"\";\r\n let powerBiBaseUrl =\r\n self.fxpConfigurationService.FxpAppSettings.PowerBiReportBaseUrl;\r\n\r\n const powerBiService = new pbi.service.Service(\r\n pbi.factories.hpmFactory,\r\n pbi.factories.wpmpFactory,\r\n pbi.factories.routerFactory\r\n );\r\n const properties = self.fxpLoggerService.createPropertyBag();\r\n\r\n if (CommonUtils.isNullOrEmpty(powerBiBaseUrl)) {\r\n powerBiBaseUrl = \"https://app.powerbi.com\";\r\n }\r\n\r\n if (!CommonUtils.isNullOrEmpty(embededReportId)) {\r\n self.showReport(\r\n embededReportId,\r\n powerBiBaseUrl,\r\n powerBiService,\r\n properties\r\n );\r\n } else if (!CommonUtils.isNullOrEmpty(embededDashboardId)) {\r\n self.showDashBoard(\r\n embededReportId,\r\n powerBiBaseUrl,\r\n powerBiService,\r\n properties\r\n );\r\n } else {\r\n self.showError(properties);\r\n }\r\n }\r\n\r\n preReportRender() {\r\n let self = this;\r\n self.pageLoaderService.fnShowPageLoader(\"Loading...\");\r\n self.fxpLoggerService.renewCorrelationId();\r\n }\r\n\r\n showReport(\r\n embededReportId: string,\r\n powerBiBaseURL: string,\r\n powerBiService: pbi.service.Service,\r\n properties: LogPropertyBag\r\n ) {\r\n let self = this;\r\n const powerBiFeatureUsageEvent = new FeatureUsageEvent(\r\n `${PowerBiFeatureName}`,\r\n ActionType.User,\r\n \"PowerBIReportLoad\",\r\n EventName.PageLoad,\r\n ComponentType.Web\r\n );\r\n self.fxpLoggerService.startFeatureUsageEvent(powerBiFeatureUsageEvent);\r\n\r\n const source = `${self.sourceForTelemetry}.ShowReport`;\r\n const embededUrl = `${powerBiBaseURL}/reportEmbed?reportId=${embededReportId}`;\r\n const settings = self.getReportSettings();\r\n\r\n const config: pbi.IEmbedConfiguration = {\r\n type: \"report\",\r\n id: embededReportId,\r\n embedUrl: embededUrl,\r\n filters: [],\r\n settings: settings,\r\n };\r\n\r\n properties.addToBag(\"embededReportId\", embededReportId);\r\n\r\n self\r\n .getAccessToken()\r\n .then((token) => {\r\n config.accessToken = token;\r\n const reportContainer = this.reportContainer.nativeElement;\r\n powerBiService.reset(reportContainer);\r\n const powerBiReport = (\r\n powerBiService.embed(reportContainer, config)\r\n );\r\n self.attachEventHandlers(\r\n powerBiReport,\r\n source,\r\n powerBiFeatureUsageEvent,\r\n properties\r\n );\r\n })\r\n .finally(() => {\r\n setTimeout(function () {\r\n self.pageLoaderService.fnHidePageLoader();\r\n }, 0);\r\n });\r\n }\r\n\r\n showDashBoard(\r\n embededDashBoardId: string,\r\n powerBiBaseURL: string,\r\n powerBiService: pbi.service.Service,\r\n properties: LogPropertyBag\r\n ) {\r\n let self = this;\r\n const powerBiFeatureUsageEvent = new FeatureUsageEvent(\r\n `${PowerBiFeatureName}`,\r\n ActionType.User,\r\n \"PowerBIDashBoardLoad\",\r\n EventName.PageLoad,\r\n ComponentType.Web\r\n );\r\n self.fxpLoggerService.startFeatureUsageEvent(powerBiFeatureUsageEvent);\r\n\r\n const source = `${self.sourceForTelemetry}.ShowDashBoard`;\r\n const embededUrl = `${powerBiBaseURL}/dashboardEmbed?${embededDashBoardId}`;\r\n\r\n let config: pbi.IEmbedConfiguration = {\r\n type: \"dashboard\",\r\n id: embededDashBoardId,\r\n embedUrl: embededUrl,\r\n filters: [],\r\n };\r\n properties.addToBag(\"embededDashBoardId\", embededDashBoardId);\r\n self\r\n .getAccessToken()\r\n .then((token) => {\r\n config.accessToken = token;\r\n const dashBoardContainer = this.reportContainer.nativeElement;\r\n powerBiService.reset(dashBoardContainer);\r\n const powerBiDashBoard = (\r\n powerBiService.embed(dashBoardContainer, config)\r\n );\r\n self.attachEventHandlers(\r\n powerBiDashBoard,\r\n source,\r\n powerBiFeatureUsageEvent,\r\n properties\r\n );\r\n })\r\n .finally(() => {\r\n setTimeout(function () {\r\n self.pageLoaderService.fnHidePageLoader();\r\n }, 0);\r\n });\r\n }\r\n\r\n showError(properties: LogPropertyBag) {\r\n let self = this;\r\n const source = `${self.sourceForTelemetry}.ShowReport`;\r\n self.fxpLoggerService.logError(\r\n source,\r\n \"Invalid configuration for the report. Missing DashboardId and ReportId\",\r\n ErrorCodes.PowerBI_Invalid_Configuration,\r\n null,\r\n properties,\r\n null,\r\n null,\r\n ErrorSeverityLevel.High\r\n );\r\n self.fxpMessageService.addMessage(\r\n \"System Error has occurred. If the problem persists, please contact IT support.\",\r\n FxpConstants.messageType.error\r\n );\r\n return;\r\n }\r\n\r\n attachEventHandlers(\r\n powerBiComponent: pbi.Report | pbi.Dashboard,\r\n source: string,\r\n featureUsageEvent: FeatureUsageEvent,\r\n properties: LogPropertyBag\r\n ) {\r\n if (powerBiComponent instanceof pbi.Report) {\r\n this.handlePowerBiLoaded(powerBiComponent, source, properties);\r\n }\r\n this.handlePowerBiRendered(\r\n powerBiComponent,\r\n source,\r\n featureUsageEvent,\r\n properties\r\n );\r\n this.handlePowerBiError(\r\n powerBiComponent,\r\n source,\r\n featureUsageEvent,\r\n properties\r\n );\r\n }\r\n\r\n handlePowerBiLoaded(\r\n powerBiReport: pbi.Report,\r\n source: string,\r\n properties: LogPropertyBag\r\n ) {\r\n let self = this;\r\n powerBiReport.off(\"loaded\");\r\n powerBiReport.on(\"loaded\", (event) => {\r\n self.fxpLoggerService.logEvent(\r\n source,\r\n \"FxpPlatform.PowerBIModule.ReportLoaded\",\r\n properties\r\n );\r\n powerBiReport.getFilters().then((filters) => {\r\n const updatedFilters = self.getUpdatedFilters(filters);\r\n powerBiReport.setFilters(updatedFilters).then(() => {\r\n self.fxpLoggerService.logEvent(\r\n source,\r\n \"FxpPlatform.PowerBIModule.ReportFiltersUpdated\",\r\n properties\r\n );\r\n });\r\n });\r\n });\r\n }\r\n\r\n handlePowerBiRendered(\r\n powerBiComponent: pbi.Report | pbi.Dashboard,\r\n source: string,\r\n featureUsageEvent: FeatureUsageEvent,\r\n properties: LogPropertyBag\r\n ) {\r\n let self = this;\r\n powerBiComponent.off(\"rendered\");\r\n powerBiComponent.on(\"rendered\", (event) => {\r\n let propForEvents = CommonUtils.clone(properties);\r\n let propForFeature = CommonUtils.clone(properties);\r\n self.fxpLoggerService.logEvent(\r\n source,\r\n \"FxpPlatform.PowerBIModule.PowerBiRendered\",\r\n propForEvents\r\n );\r\n featureUsageEvent.ActionStatus = ActionStatus.Succeeded;\r\n self.fxpLoggerService.endFeatureUsageEvent(\r\n source,\r\n featureUsageEvent,\r\n propForFeature\r\n );\r\n });\r\n }\r\n\r\n handlePowerBiError(\r\n powerBiComponent: pbi.Report | pbi.Dashboard,\r\n source: string,\r\n featureUsageEvent: FeatureUsageEvent,\r\n properties: LogPropertyBag\r\n ) {\r\n let self = this;\r\n const accessRequestUrl = this.stateService.params.accessRequestUrl\r\n ? this.stateService.params.accessRequestUrl\r\n : \"\";\r\n\r\n powerBiComponent.off(\"error\");\r\n powerBiComponent.on(\"error\", (event) => {\r\n properties.addToBag(\"errorDetails\", JSON.stringify(event.detail));\r\n let errorMessage = \"\";\r\n if (event.detail && event.detail[\"message\"])\r\n errorMessage = event.detail[\"message\"];\r\n self.fxpLoggerService.logError(\r\n source,\r\n \"Error rendering powerbi component: \" + errorMessage,\r\n ErrorCodes.PowerBI_OnError,\r\n null,\r\n properties,\r\n null,\r\n null,\r\n ErrorSeverityLevel.Medium\r\n );\r\n featureUsageEvent.ActionStatus = ActionStatus.Failed;\r\n self.fxpLoggerService.endFeatureUsageEvent(\r\n source,\r\n featureUsageEvent,\r\n properties\r\n );\r\n if (accessRequestUrl && accessRequestUrl !== \"\")\r\n self.fxpMessageService.addMessage(\r\n `Seems you have insufficient access. Please visit [PSDL Portal](${accessRequestUrl}) to raise access`,\r\n FxpConstants.messageType.error\r\n );\r\n else\r\n self.fxpMessageService.addMessage(\r\n \"Error rendering powerbi component\",\r\n FxpConstants.messageType.error\r\n );\r\n this.pageLoaderService.fnHidePageLoader();\r\n });\r\n }\r\n\r\n getReportSettings(): pbi.IEmbedSettings {\r\n const settings: pbi.IEmbedSettings = {\r\n filterPaneEnabled: true,\r\n navContentPaneEnabled: true,\r\n };\r\n return settings;\r\n }\r\n\r\n getUpdatedFilters(\r\n existingFilters: pbi.models.IFilter[]\r\n ): pbi.models.IFilter[] {\r\n const newFilters = this.getNewFilters();\r\n\r\n for (const newFilter of newFilters) {\r\n let existingFilterIndex = existingFilters.findIndex((existingFilter) => {\r\n const target: any = existingFilter.target;\r\n return (\r\n newFilter.target.table == target.table &&\r\n newFilter.target.column == target.column\r\n );\r\n });\r\n\r\n if (existingFilterIndex == -1) existingFilters.push(newFilter);\r\n else existingFilters[existingFilterIndex] = newFilter;\r\n }\r\n return existingFilters;\r\n }\r\n\r\n getNewFilters(): any {\r\n const profile = this.userInfoService.getCurrentUserProfile();\r\n let filters = this.stateService.params.filters;\r\n let newFilters = [];\r\n\r\n for (const filter of filters) {\r\n if (\r\n filter.operator &&\r\n filter.values &&\r\n filter.target &&\r\n filter.displaySettings\r\n ) {\r\n let values = [];\r\n\r\n for (const value of filter.values) {\r\n values.push(this.getValueForFilter(value, profile));\r\n }\r\n\r\n newFilters.push({\r\n $schema:\r\n this.fxpConfigurationService.FxpAppSettings.PowerBiFilterSchemaUrl,\r\n displaySettings: {\r\n displayName: filter.displaySettings.displayName,\r\n },\r\n target: {\r\n table: filter.target.table,\r\n column: filter.target.column,\r\n },\r\n operator: filter.operator,\r\n values: values,\r\n filterType: pbi.models.FilterType.Basic,\r\n });\r\n }\r\n }\r\n return newFilters;\r\n }\r\n\r\n getValueForFilter(value: string, profile): string {\r\n const filterValueRegExp = new RegExp(\r\n this.fxpConfigurationService.FxpAppSettings.PowerBiFilterValueRegularExpression\r\n );\r\n if (filterValueRegExp.test(value)) {\r\n let result = filterValueRegExp.exec(value);\r\n return profile[result[1]];\r\n }\r\n return value;\r\n }\r\n\r\n getAccessToken(): Promise {\r\n let powerBITokenURL =\r\n this.fxpConfigurationService.FxpAppSettings.PowerBiEndpoint;\r\n if (CommonUtils.isNullOrEmpty(powerBITokenURL)) {\r\n powerBITokenURL = \"https://api.powerbi.com\";\r\n }\r\n\r\n const source = `${this.sourceForTelemetry}.GetAccessToken`;\r\n const self = this;\r\n return new Promise((resolve, reject) => {\r\n self.msalAuthenticationService\r\n .acquireTokenAsPromise(powerBITokenURL)\r\n .then((token) => {\r\n resolve(token.accessToken);\r\n })\r\n .catch((error) => {\r\n reject(error);\r\n const properties = self.fxpLoggerService.createPropertyBag();\r\n properties.addToBag(\"API\", powerBITokenURL);\r\n self.fxpLoggerService.logError(\r\n source,\r\n `Failed to acquire access token for ${powerBITokenURL}`,\r\n ErrorCodes.PowerBI_Token_Failure,\r\n null,\r\n properties,\r\n null,\r\n null,\r\n ErrorSeverityLevel.High\r\n );\r\n self.fxpMessageService.addMessage(\r\n \"System Error has occurred. Please try again. If the problem persists, please contact IT support.\",\r\n FxpConstants.messageType.error\r\n );\r\n });\r\n });\r\n }\r\n\r\n ngOnDestroy(): void {}\r\n}\r\n","import * as React from 'react';\r\nimport * as ReactDOM from 'react-dom';\r\nimport { UiView } from '@fxp/reactrouter';\r\nimport { StateService } from '@uirouter/core';\r\nimport { FxpLazyLoader } from \"../../../app/fxplazyloader\";\r\nimport { FxpMessageService } from \"../../banner/FxpMessageService\";\r\nimport { FxpConstants } from \"../../../js/common/ApplicationConstants\";\r\nimport { PageLoaderService } from \"../../loader/pageLoaderService\";\r\nimport { FxpGlobalStoreService } from \"../../../js/services/fxp.global.store.service\";\r\nimport { PartnerStateService } from \"../partnerContainer-component/partnerStateService\";\r\nimport { Component, ViewChild, Inject, forwardRef, CompilerFactory, ElementRef, AfterViewInit, OnInit } from \"@angular/core\";\r\nimport { TelemetryConstants } from '../../../js/telemetry/TelemetryConst';\r\nimport { FxpLoggerService } from '../../../js/telemetry/fxpLogger';\r\nimport { ErrorSeverityLevel } from '../../../js/telemetry/ErrorSeverityLevel';\r\nimport { ErrorCodes } from '../../../js/constants/errorCodes';\r\n\r\n@Component({\r\n selector: 'fxp-app-partnerreactapp',\r\n templateUrl: \"./reactpartner-component.html\"\r\n})\r\nexport class ReactPartnerContainerComponent implements AfterViewInit, OnInit {\r\n @ViewChild('container1', { read: ElementRef, static: false }) entry: ElementRef;\r\n componentRef: any;\r\n currentStateName: string;\r\n sourceForTelemetry = `${TelemetryConstants.FXP_TELEMETRY_BASE_NAME}.ReactPartnerContainerComponent`;\r\n stateChangeUnsubscribeCaller: () => void;\r\n\r\n constructor(\r\n @Inject(forwardRef(() => PageLoaderService)) private fxpLoaderService: PageLoaderService,\r\n @Inject(forwardRef(() => FxpLoggerService)) private fxpLoggerService: FxpLoggerService,\r\n @Inject(forwardRef(() => FxpMessageService)) private fxpMessageService: FxpMessageService,\r\n @Inject(forwardRef(() => FxpGlobalStoreService)) private globalStore: FxpGlobalStoreService,\r\n @Inject(forwardRef(() => StateService)) private stateService: StateService,\r\n @Inject(PartnerStateService) private fxpPartnerStateService: PartnerStateService,\r\n @Inject(CompilerFactory) private compilerFactory: CompilerFactory\r\n ) {\r\n FxpLazyLoader.setCompilerFactory(this.compilerFactory);\r\n }\r\n ngOnInit(): void {\r\n window.addEventListener(\"beforeunload\", function (e) {\r\n if(window[\"_showPageDirtyPopup\"]){\r\n var confirmationMessage = \"\\o/\";\r\n e.returnValue = confirmationMessage; \r\n return confirmationMessage;\r\n }\r\n });\r\n }\r\n ngOnDestroy(): void {\r\n this.fxpPartnerStateService.remove(this.currentStateName);\r\n if (this.stateChangeUnsubscribeCaller) {\r\n this.stateChangeUnsubscribeCaller();\r\n }\r\n this.unloadComponent(this.entry.nativeElement);\r\n }\r\n\r\n ngAfterViewInit(): void {\r\n const self = this;\r\n this.currentStateName = this.stateService.$current.name;\r\n this.fxpPartnerStateService.addState(this.currentStateName);\r\n this.loadComponent(self.entry.nativeElement);\r\n this.fxpLoaderService.fnHidePageLoader();\r\n\r\n this.stateChangeUnsubscribeCaller =\r\n this.globalStore.SubscribeToPartnerState(\"Fxp.ReactPartnerContainerComponent\", \"PLATFORM_ROUTER\", (routeState) => {\r\n if(window.location.hash === routeState[\"CurrentRoute\"][\"Url\"]){\r\n self.loadComponent(self.entry.nativeElement);\r\n }\r\n });\r\n }\r\n\r\n private loadComponent(nativeElement: any) {\r\n try {\r\n ReactDOM.render(\r\n React.createElement(UiView, null, null),\r\n nativeElement\r\n );\r\n } catch (error) {\r\n this.fxpLoggerService.logException(`${this.sourceForTelemetry}.LoadComponent`, error, null, null, null, ErrorSeverityLevel.Critical, ErrorCodes.ErrorLoadingReactComponent);\r\n this.fxpMessageService.addMessage(\"There was an error in loading the React Component\", FxpConstants.messageType.error);\r\n }\r\n }\r\n\r\n private unloadComponent(nativeElement: any) {\r\n try {\r\n ReactDOM.unmountComponentAtNode(nativeElement);\r\n } catch (error) {\r\n this.fxpLoggerService.logException(`${this.sourceForTelemetry}.UnLoadComponent`, error, null, null, null, ErrorSeverityLevel.Critical, ErrorCodes.ErrorUnloadingReactComponent);\r\n this.fxpMessageService.addMessage(\"There was an error in removing the React Component\", FxpConstants.messageType.warning);\r\n }\r\n }\r\n}\r\n","export enum FlightingActions {\r\n UPSERT_FEATURE_FLAG = \"UPSERT_FEATURE_FLAG\",\r\n}","import { FlightingActions } from \"./featureFlags.action.types\"\r\n\r\nexport const UpsertFeatureFlags = (payload: Record) => {\r\n return {\r\n type: FlightingActions.UPSERT_FEATURE_FLAG,\r\n payload: payload\r\n }\r\n}\r\n\r\n","import { IAction } from 'redux-micro-frontend';\r\nimport { Reducer } from \"redux\";\r\nimport { FlightingActions } from \"./featureFlags.action.types\";\r\n\r\nconst defaultState: Record = {};\r\n\r\nexport const FeatureFlagReducer: Reducer, IAction>> = (\r\n state: Record = defaultState,\r\n action: IAction>\r\n): Record => {\r\n\r\n switch(action.type) {\r\n case FlightingActions.UPSERT_FEATURE_FLAG : { \r\n return {...state, ...action.payload};\r\n }\r\n }\r\n\r\n return state;\r\n}","import { Compiler, NgModuleRef, CompilerFactory, NgModuleFactory } from \"@angular/core\";\r\nimport { AppModule } from \"./modules/app.module\";\r\nimport { PartnerContainerComponent } from \"./components/partnerContainer-component/partnerContainer-component\";\r\n\r\nexport class FxpLazyLoader {\r\n static _partnerModules:{};\r\n static _compiler: Compiler;\r\n static _fxprootModule: NgModuleRef;\r\n static _compilerFactory: CompilerFactory;\r\n\r\n static setRootModuleReference(parentModuleRef: NgModuleRef){\r\n \r\n this._fxprootModule = parentModuleRef;\r\n }\r\n static setCompilerFactory(compilerFactory: CompilerFactory){\r\n this._compilerFactory = compilerFactory;\r\n if (!this._compiler) {\r\n this._compiler = this._compilerFactory.createCompiler([{useJit:true}]);\r\n }\r\n }\r\n\r\n static compileAndLoadModule(jitModuleRef):Promise{\r\n let self = this;\r\n \r\n return new Promise(function(resolve, reject){\r\n self._compiler.compileModuleAndAllComponentsAsync(jitModuleRef).then((factory) => {\r\n let partnerModule = factory.ngModuleFactory.create(self._fxprootModule.injector);\r\n \r\n resolve(partnerModule);\r\n })\r\n .catch(function(e){\r\n reject(e);\r\n });\r\n \r\n });\r\n }\r\n\r\n static instantiateModule(aotModuleFactoryRef: any):any{\r\n return aotModuleFactoryRef.create(this._fxprootModule.injector);\r\n }\r\n \r\n \r\n}\r\n","import { IAction } from 'redux-micro-frontend';\r\nimport { AppStatusActionTypes } from './app.status.action.types';\r\n\r\nexport const StartAppInitialization = (): IAction => ({\r\n type: AppStatusActionTypes.START_APP_INITIALIZATION,\r\n payload: null,\r\n logEnabled: false\r\n});\r\n\r\nexport const CompleteAppInitialization = (): IAction => ({\r\n type: AppStatusActionTypes.COMPLETE_APP_INITIALIZATION,\r\n payload: null,\r\n logEnabled: false\r\n});\r\n\r\nexport const AuthenticateUser = (): IAction => ({\r\n type: AppStatusActionTypes.AUTHENTICATE_USER,\r\n payload: null,\r\n logEnabled: false\r\n});\r\n\r\nexport const FailAuthentication = (error: any): IAction => ({\r\n type: AppStatusActionTypes.FAIL_AUTHENTICATION,\r\n payload: error,\r\n logEnabled: false\r\n});\r\n\r\n// Test\r\nexport const UpdateCounter = (count: number): IAction => ({\r\n type: AppStatusActionTypes.UPDATE_COUNTER,\r\n payload: count,\r\n logEnabled: false\r\n});","export enum AppStatusActionTypes {\r\n START_APP_INITIALIZATION = \"START_APP_INITIALIZATION\",\r\n COMPLETE_APP_INITIALIZATION = \"COMPLETE_APP_INITIALIZATION\",\r\n AUTHENTICATE_USER = \"AUTHENTICATE_USER\",\r\n FAIL_AUTHENTICATION = \"FAIL_AUTHENTICATION\",\r\n\r\n // Test\r\n UPDATE_COUNTER = \"UPDATE_COUNTER\"\r\n}","import { Reducer } from 'redux';\r\nimport { IAction } from 'redux-micro-frontend';\r\nimport { AppStatus } from './app.status.model';\r\nimport { AppStatusActionTypes } from './app.status.action.types';\r\n\r\nconst defaultState: AppStatus = {\r\n Initialization: \"Not started\",\r\n Authentication: \"Unauhtenticated\",\r\n HitCounter: 0\r\n};\r\n\r\nexport const AppStatusReducer: Reducer> = (\r\n state: AppStatus = defaultState,\r\n action: IAction\r\n): AppStatus => {\r\n switch(action.type) {\r\n case AppStatusActionTypes.START_APP_INITIALIZATION: {\r\n return { ...state, Initialization: \"STARTED\" }\r\n }\r\n case AppStatusActionTypes.COMPLETE_APP_INITIALIZATION: {\r\n return { ...state, Initialization: \"COMPLETED\" }\r\n }\r\n case AppStatusActionTypes.AUTHENTICATE_USER: {\r\n return { ...state, Authentication: \"Authenticated\" }\r\n }\r\n case AppStatusActionTypes.FAIL_AUTHENTICATION: {\r\n return { ...state, Authentication: \"Failed\" }\r\n }\r\n // Test\r\n case AppStatusActionTypes.UPDATE_COUNTER: {\r\n return { ...state, HitCounter: state.HitCounter + action.payload }\r\n }\r\n }\r\n\r\n return state;\r\n}","/**\r\n* @application Fxp\r\n*/\r\n/**\r\n * @module Fxp.Controllers\r\n */\r\ndeclare type IStateService = any;\r\nimport { ILogger } from \"../../js/interfaces/ILogger\";\r\nimport { FxpMessageService } from \"../banner/FxpMessageService\";\r\nimport { FxpConstants, ApplicationConstants } from \"../../js/common/ApplicationConstants\";\r\nimport { IRootScope } from \"../../js/interfaces/IRootScope\";\r\nimport { UserProfileService } from \"../../js/services/userProfileService\";\r\nimport { UserInfoService } from \"../../js/services/UserInfoService\";\r\nimport { TelemetryContext } from \"../../js/telemetry/telemetrycontext\";\r\nimport { FxpConfigurationService } from \"../../js/services/FxpConfiguration\";\r\nimport { DashboardService } from \"../../js/services/dashboardService\";\r\nimport { CommonUtils } from \"../../js/utils/CommonUtils\";\r\nimport { ILeftNavControllerScope } from \"../../js/interfaces/ILeftNavControllerScope\";\r\nimport { FxpRouteService } from \"../../js/services/FxpRouteService\";\r\nimport { AdminLandingService } from \"../adminTiles/AdminLandingService\";\r\nimport { SettingsServiceProvider } from \"../../js/provider/SettingsServiceProvider\";\r\nimport { FxpContext } from \"../../js/context/FxpContext\";\r\nimport { SettingsType } from \"../../js/common/SettingsType\";\r\nimport { Resiliency } from \"../../js/resiliency/FxpResiliency\";\r\nimport { UserClaimsService } from \"../../js/services/UserClaimsService\";\r\nimport { FxpBroadcastedEvents } from \"../../js/services/FxpBroadcastedEvents\";\r\nimport { FxpEventBroadCastService } from \"../../js/services/BroadCastingService\";\r\nimport { ComponentType } from \"@microsoftit/telemetry-extensions-npm\";\r\nimport { SystemEvent } from \"@microsoftit/telemetry-extensions-npm\";\r\nimport { TelemetryConstants } from \"../../js/telemetry/TelemetryConst\";\r\nimport { ErrorCodes } from \"../../js/constants/errorCodes\";\r\nimport { ErrorSeverityLevel } from \"../../js/telemetry/ErrorSeverityLevel\";\r\n\r\n\r\n\r\n/**\r\n * This is the controller to fetch and update the leftnav data .\r\n * @class Fxp.Controllers.LeftNavController\r\n * @classdesc A main controller for leftnav of FxpApp module\r\n * @example \r\n * //To Use LeftNavController\r\n * angular.module('FxPApp').controller('LeftNavController', ['AnyDependency', LeftNavController]);\r\n * function LeftNavController(AnyDependency){ AnyDependency.doSomething(); }\r\n */\r\nexport class LeftNavController {\r\n\tprivate $rootScope: IRootScope;\r\n\tprivate $scope: ILeftNavControllerScope;\r\n\tprivate $state: IStateService;\r\n\tprivate timeout;\r\n\tprivate dashboardService: DashboardService;\r\n\tprivate adminLandingService: AdminLandingService;\r\n\tprivate fxpLoggerService: ILogger;\r\n\tprivate userInfoService: UserInfoService;\r\n\tprivate fxpMessage: FxpMessageService;\r\n\tprivate fxpRouteService: FxpRouteService;\r\n\tprivate fxpConfigurationService: FxpConfigurationService;\r\n\tprivate loggedInUserLeftNavData: any;\r\n\tprivate oboUserLeftNavData: any;\r\n\tprivate window;\r\n\tprivate isNavLinkFocused: any;\r\n\tprivate deviceFactory: any;\r\n\tprivate currentUserDefaultState = \"\";\r\n\tprivate userProfileService: UserProfileService;\r\n\tprivate settingsService: SettingsServiceProvider;\r\n\tprivate fxpContext: FxpContext;\r\n\tprivate fxpTelemetryContext: TelemetryContext;\r\n\tprivate deviceDetector: any;\r\n\tprivate $q: angular.IQService;\r\n\tprivate fxpEventBroadCastService: FxpEventBroadCastService;\r\n\tprivate CurrentSelectedLeftNavItem = \"CurrentSelectedLeftNavItem\";\r\n\tprivate sourceForTelemetry: string = `${TelemetryConstants.FXP_TELEMETRY_BASE_NAME}.LeftNavController`;\r\n\r\n\tconstructor($rootScope: IRootScope, $q: angular.IQService,\r\n\t\t$scope: ILeftNavControllerScope,\r\n\t\t$state: IStateService,\r\n\t\t$timeout,\r\n\t\tdashboardService: DashboardService, fxpLoggerService: ILogger, userInfoService: UserInfoService, fxpMessage: FxpMessageService, $window, $document, deviceFactory: any, fxpRouteService: FxpRouteService,\r\n\t\tfxpConfigurationService: FxpConfigurationService, userProfileService: UserProfileService, settingsService: SettingsServiceProvider, fxpContext: FxpContext, fxpTelemetryContext: TelemetryContext, deviceDetector: any,\r\n\t\tadminLandingService: AdminLandingService, private userClaimsService: UserClaimsService, private $base64: any, private fxpBroadCastService: FxpEventBroadCastService) {\r\n\t\tvar self = this;\r\n\t\tself.$rootScope = $rootScope;\r\n\t\tself.$scope = $scope;\r\n\t\tself.$q = $q;\r\n\t\tself.$state = $state;\r\n\t\tself.timeout = $timeout;\r\n\t\tself.window = $window;\r\n\t\tself.fxpLoggerService = fxpLoggerService;\r\n\t\tself.userInfoService = userInfoService;\r\n\t\tself.dashboardService = dashboardService;\r\n\t\tself.adminLandingService = adminLandingService;\r\n\t\tself.fxpMessage = fxpMessage;\r\n\t\tself.fxpRouteService = fxpRouteService;\r\n\t\tself.fxpConfigurationService = fxpConfigurationService;\r\n\t\tself.fxpEventBroadCastService = fxpBroadCastService;\r\n\r\n\t\tself.deviceFactory = deviceFactory;\r\n\t\tself.$scope.isMoreLinkActive = false;\r\n\t\tself.$scope.selectedLeftNavItemLinkId = -1;\r\n\t\tself.isNavLinkFocused = false;\r\n\t\tself.fxpContext = fxpContext;\r\n\t\tself.userProfileService = userProfileService;\r\n\t\tself.settingsService = settingsService;\r\n\t\tself.fxpTelemetryContext = fxpTelemetryContext;\r\n\t\tself.deviceDetector = deviceDetector;\r\n\t\tself.$scope.expandLeftNav = self.expandLeftNav.bind(self);\r\n\t\tself.$scope.expandLeftNavEventHandler = self.expandLeftNavEventHandler.bind(self);\r\n\t\tself.$scope.collapseLeftNav = self.collapseLeftNav.bind(self);\r\n\t\tself.$scope.collapseLeftNavEventHandler = self.collapseLeftNavEventHandler.bind(self);\r\n\t\tself.$scope.onPinFlyoutClick = self.onPinFlyoutClick.bind(self);\r\n\t\tself.$scope.onPinFlyoutKeyDown = self.onPinFlyoutKeyDown.bind(self);\r\n\r\n\t\tself.$scope.headerMenuChange = self.headerMenuChange.bind(self);\r\n\t\tself.$scope.openFlyoutOnClick = self.openFlyoutOnClick.bind(self);\r\n\t\tself.$scope.onMenuItemClick = self.onMenuItemClick.bind(self);\r\n\t\tself.$scope.resetLeftNavFocus = self.resetLeftNavFocus.bind(self);\r\n\t\tself.$scope.leftNavKeydown = self.leftNavKeydown.bind(self);\r\n\t\tself.$scope.setFocusToHamburger = self.setFocusToHamburger.bind(self);\r\n\t\tself.$scope.leftNavItemClick = self.leftNavItemClick.bind(self);\r\n\t\tself.loggedInUserLeftNavData = null;\r\n\t\tself.oboUserLeftNavData = null;\r\n\r\n\t\tvar userAlias = self.userInfoService.getCurrentUser();\r\n\t\tself.getLeftNavigationData(userAlias);\r\n\t\tthis.$scope.$on(FxpBroadcastedEvents.OnLeftNavHighlightByStateName, function (event, stateName) {\r\n\t\t\tif (self.$scope.leftNavData && self.$scope.leftNavData.internalLinks && stateName) {\r\n\t\t\t\tself.filterGLNItemForHighlight(self.$scope.leftNavData.internalLinks, stateName);\r\n\t\t\t}\r\n\t\t});\r\n\t\tthis.$scope.$on(FxpBroadcastedEvents.OnUserContextChanged, function (event, currentUserChangedUserAlias, currentUserChangedRoleGroupId, currentUserChangedRoleId) {\r\n\t\t\t// on close and open AOB , hightlight the default landing experience page \r\n\t\t\tself.$rootScope.fxpBreadcrumb = new Array();\r\n\t\t\tself.fxpContext.deleteContext(self.CurrentSelectedLeftNavItem, ApplicationConstants.FxPDbName).then(function (data) {\r\n\t\t\t\tconsole.log(self.CurrentSelectedLeftNavItem + \"- data deleted\" + data);\r\n\t\t\t});\r\n\t\t\tif (!self.userInfoService.isActingOnBehalfOf() && self.loggedInUserLeftNavData) {\r\n\t\t\t\tself.onSuccessGetLeftNav(self.loggedInUserLeftNavData, currentUserChangedUserAlias);\r\n\t\t\t} else {\r\n\t\t\t\tself.$scope.leftNavData = [];\r\n\t\t\t\tself.$scope.leftNavDataExists = false;\r\n\t\t\t\tself.getLeftNav(window[\"tenantConfiguration\"].TenantId, currentUserChangedUserAlias);\r\n\t\t\t}\r\n\t\t\tif (!self.userInfoService.isActingOnBehalfOf())\r\n\t\t\t\tself.setLoggedInUserPreferences();\r\n\t\t});\r\n\t\tthis.$scope.$on(FxpBroadcastedEvents.OnLeftNavToggleExpandedState, function () {\r\n\t\t\tif (self.$rootScope.isLeftNavOpen) {\r\n\t\t\t\tself.$scope.collapseLeftNavEventHandler();\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\tself.$scope.expandLeftNavEventHandler();\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\tvar resizeWindow = function () {\r\n\t\t\tself.timeout(function () {\r\n\t\t\t\tself.isNavLinkFocused = false;\r\n\t\t\t\tself.resizeLeftNavHeight();\r\n\t\t\t\tif (self.loggedInUserLeftNavData && !self.userInfoService.isActingOnBehalfOf()) {\r\n\t\t\t\t\tself.onSuccessGetLeftNav(self.loggedInUserLeftNavData, self.userInfoService.getLoggedInUser());\r\n\t\t\t\t} else if (self.oboUserLeftNavData && self.userInfoService.isActingOnBehalfOf()) {\r\n\t\t\t\t\tself.onSuccessGetLeftNav(self.oboUserLeftNavData, self.userInfoService.getCurrentUser());\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t}\r\n\t\t////event to handle window resize\r\n\t\tangular.element(self.window).bind('resize', resizeWindow);\r\n\t\t////event to handle $destroy window\r\n\t\tself.$scope.$on('$destroy', function () {\r\n\t\t\tangular.element(self.window).unbind('resize', resizeWindow);\r\n\t\t});\r\n\t}\r\n\r\n\tgetLeftNavigationData(userAlias) {\r\n\t\tconst self = this;\r\n\t\tlet tenantId = window[\"tenantConfiguration\"].TenantId;\r\n\t\tlet noRoleAppRoleName = 'norole';\r\n\t\tif (self.fxpConfigurationService.FxpAppSettings.NoRole_RoleName) {\r\n\t\t\tnoRoleAppRoleName = self.fxpConfigurationService.FxpAppSettings.NoRole_RoleName.toString().toLowerCase();\r\n\t\t}\r\n\r\n\t\tif (tenantId === \"ES\") {\r\n\t\t\tthis.userClaimsService.getUserConsolidatedRoles(userAlias)\r\n\t\t\t\t.then(function (roles: Array) {\r\n\t\t\t\t\tif (roles.findIndex(e => e.toLowerCase() === noRoleAppRoleName) >= 0) {\r\n\t\t\t\t\t\ttenantId = 'ES_NoRole';\r\n\t\t\t\t\t}\r\n\t\t\t\t\tself.getLeftNav(tenantId, userAlias);\r\n\t\t\t\t});\r\n\t\t}\r\n\t\telse {\r\n\t\t\tself.getLeftNav(tenantId, userAlias);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t* A method to calculate no of icons to show in ui based on window height\r\n\t* @method Fxp.Controllers.LeftNavController.resizeLeftnavHeight\r\n\t* @example Example to use resizeLeftnavHeight\r\n\t* LeftNavController.resizeLeftnavHeight()\r\n\t*/\r\n\tresizeLeftNavHeight(): void {\r\n\t\tvar visibleLinksCount = this.getVisibleLinksCount();\r\n\t\tvar self = this;\r\n\t\tif (!CommonUtils.isNullOrEmpty(self.$scope.leftNavData)) {\r\n\t\t\tvar internalLinksCount = CommonUtils.getArrayLength(self.$scope.leftNavData.internalLinks);\r\n\t\t\tvar externalLinksCount = CommonUtils.getArrayLength(self.$scope.leftNavData.externalLinks);\r\n\t\t\tvar settingLinksCount = CommonUtils.getArrayLength(self.$scope.leftNavData.settings);\r\n\r\n\t\t\tconst linksCount = internalLinksCount + externalLinksCount + settingLinksCount;\r\n\t\t\tself.$scope.isMoreButtonVisible = visibleLinksCount < linksCount;\r\n\t\t\tself.$scope.isMoreLinkActive = self.$scope.selectedLeftNavItemSequence > visibleLinksCount;\r\n\t\t\tself.$scope.visibleInternalLinksCount = Math.min(visibleLinksCount, internalLinksCount);\r\n\r\n\t\t\tvisibleLinksCount = visibleLinksCount - self.$scope.visibleInternalLinksCount;\r\n\t\t\tself.$scope.visibleExternalLinksCount = Math.min(visibleLinksCount, externalLinksCount);\r\n\r\n\t\t\tvisibleLinksCount = visibleLinksCount - self.$scope.visibleExternalLinksCount;\r\n\t\t\tself.$scope.visibleSettingLinksCount = Math.min(visibleLinksCount, settingLinksCount);\r\n\t\t}\r\n\t}\r\n\r\n\tsortObject = function (srtObject, srtElement) {\r\n\t\tsrtObject.sort(function (a, b) {\r\n\t\t\treturn a[srtElement] > b[srtElement] ? 1 : a[srtElement] < b[srtElement] ? -1 : 0;\r\n\t\t});\r\n\t};\r\n\r\n\t/**\r\n\t* A method to use to get the VisibleLinksCount\r\n\t* @method Fxp.Controllers.LeftNavController.VisibleLinksCount\r\n\t* @example Example to use VisibleLinksCount\r\n\t* LeftNavController.getVisibleLinksCount()\r\n\t*/\r\n\tgetVisibleLinksCount(): number {\r\n\t\tlet leftNavHeight = this.getLeftNavHeight();\r\n\t\tvar menuIconHeight = angular.element(\"#hamburger\").outerHeight();\r\n\t\tvar noOfIconsToShow = (Math.floor(leftNavHeight / menuIconHeight) - 1);\r\n\t\treturn noOfIconsToShow;\r\n\t}\r\n\r\n\t/**\r\n\t* A method to use to get the leftNAvHeight\r\n\t* @method Fxp.Controllers.LeftNavController.getLeftNavHeight\r\n\t* @example Example to use getLeftNavHeight\r\n\t* LeftNavController.getLeftNavHeight()\r\n\t*/\r\n\tgetLeftNavHeight(): number {\r\n\t\tvar headerHeight = angular.element(\"#header\").height();\r\n\t\tvar footerHeight = angular.element(\"#fxpfooter\").height();\r\n\t\tvar moreHeight = angular.element(\"#hamburger\").outerHeight();\r\n\t\tvar windowHeight = self.window.innerHeight;\r\n\t\tvar leftNavHeight = windowHeight - headerHeight - footerHeight - moreHeight;\r\n\t\treturn leftNavHeight;\r\n\t}\r\n\r\n\tlogSystemEvent(sytemEventName: string, systemMessage: string, methodName: string) {\r\n\t\tlet processName = 'FxpPlatform.LeftNavigation.';\r\n\t\tlet currentProcessName = processName + sytemEventName;\r\n\t\tlet eventData = new SystemEvent(currentProcessName, ComponentType.Web, systemMessage);\r\n\t\tthis.fxpLoggerService.logSystemEvent(`${this.sourceForTelemetry}.${methodName}`, eventData);\r\n\t}\r\n\r\n\t/** \r\n\t * A method to get the LeftNav data for the user\r\n\t * @method Fxp.Controllers.LeftNavController.getLeftNav\r\n\t * @example Example to use getLeftNav\r\n\t * LeftNavController.getLeftNav('tenantId','userAlias')\r\n\t */\r\n\tgetLeftNav(tenantId: string, userAlias: string) {\r\n\t\tconst source = `${this.sourceForTelemetry}.GetLeftNav`;\r\n\t\tlet self = this;\r\n\t\tlet cachedResponse = \"\";\r\n\t\tself.timeout(() => {\r\n\t\t\tself.adminLandingService.GetAdminTileDetails(true);\r\n\t\t}, 2000);\r\n\r\n\t\tvar deferred = self.$q.defer();\r\n\t\tself.userProfileService.getCurrentUserFlighitngContext().then((flightingContext) => {\r\n\t\t\tlet encodedBasicProfileContext = self.$base64.encode(JSON.stringify(flightingContext)).toString();\r\n\t\t\tself.dashboardService.getLeftNavData(tenantId, encodedBasicProfileContext).then((response) => {\r\n\t\t\t\tif (JSON.stringify(response.data) !== cachedResponse) {\r\n\t\t\t\t\tthis.logSystemEvent(TelemetryConstants.FXP_TELEMETRY_PLATFORM_BOOTSTRAP + '.LeftNavigation.FetchLefNavData', 'API Response of GetLeftNavData is different from Cached Data', 'getLeftNav');\r\n\t\t\t\t\tself.onSuccessGetLeftNav(response.data != undefined ? response.data : [], userAlias);\r\n\t\t\t\t}\r\n\t\t\t\tdeferred.resolve(response);\r\n\t\t\t}, (error) => {\r\n\t\t\t\tvar propbag = self.fxpLoggerService.createPropertyBag();\r\n\t\t\t\tpropbag.addToBag(FxpConstants.metricConstants.RequestedUserAlias, userAlias);\r\n\t\t\t\tpropbag.addToBag(FxpConstants.metricConstants.Status, error.status);\r\n\t\t\t\tpropbag.addToBag(FxpConstants.metricConstants.StatusText, error.statusText);\r\n\t\t\t\tpropbag.addToBag('RedBannerDisplayed', 'Yes');\r\n\t\t\t\tself.fxpMessage.addMessage(self.$rootScope.fxpUIConstants.UIMessages.LeftNavServiceCallFailedError.ErrorMessage, FxpConstants.messageType.error);\r\n\t\t\t\tself.fxpLoggerService.logError(source,\r\n\t\t\t\t\tself.$rootScope.fxpUIConstants.UIMessages.LeftNavServiceCallFailedError.ErrorMessageTitle,\r\n\t\t\t\t\tErrorCodes.GetLeftNavData_Failure,\r\n\t\t\t\t\tCommonUtils.objectToString(error),\r\n\t\t\t\t\tpropbag,\r\n\t\t\t\t\tundefined,\r\n\t\t\t\t\tundefined,\r\n\t\t\t\t\tErrorSeverityLevel.High);\r\n\t\t\t\tdeferred.reject(error);\r\n\t\t\t}, (cachedData) => {\r\n\t\t\t\tthis.logSystemEvent(TelemetryConstants.FXP_TELEMETRY_PLATFORM_BOOTSTRAP + '.LeftNavigation.LeftNavDataFromCache', 'Returning the previous cached results of GetLeftNavData API call.', 'getLeftNav');\r\n\t\t\t\tcachedResponse = JSON.stringify(cachedData);\r\n\t\t\t\tself.onSuccessGetLeftNav(cachedData != undefined ? cachedData : [], userAlias);\r\n\t\t\t}\r\n\t\t\t);\r\n\r\n\t\t});\r\n\t\treturn deferred.promise;\r\n\t}\r\n\r\n\texpandLeftNav = function () {\r\n\t\tthis.fxpEventBroadCastService.broadCast(FxpBroadcastedEvents.OnLeftNavToggleExpandedState, { isLeftNavExpanded: true });\r\n\t}\r\n\r\n\texpandLeftNavEventHandler = function () {\r\n\t\tvar self = this;\r\n\t\tself.$rootScope.isLeftNavOpen = true;\r\n\t\tself.setFocusToHamburger();\r\n\t\tself.resetLeftNavFocus();\r\n\t\tangular.forEach(self.$scope.leftNavData.internalLinks, function (item) {\r\n\t\t\titem.isOpen = (item.id === self.$scope.selectedLeftNavItemLinkId);\r\n\t\t});\r\n\t\tif (self.$scope.leftNavData.externalLinks) {\r\n\t\t\tangular.forEach(self.$scope.leftNavData.externalLinks, function (item) {\r\n\t\t\t\titem.isOpen = false;\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\tif (self.$scope.leftNavData.settings) {\r\n\t\t\tangular.forEach(self.$scope.leftNavData.settings, function (item) {\r\n\t\t\t\titem.isOpen = false;\r\n\t\t\t});\r\n\t\t}\r\n\t}\r\n\r\n\tcollapseLeftNav = function ($event) {\r\n\t\tvar self = this;\r\n\t\tif (!$event || $event.keyCode == FxpConstants.keyCodes.escapeKey || $event.keyCode == FxpConstants.keyCodes.enterKey || $event.keyCode == FxpConstants.keyCodes.spaceBar) {\r\n\t\t\tself.fxpEventBroadCastService.broadCast(FxpBroadcastedEvents.OnLeftNavToggleExpandedState, { isLeftNavExpanded: false });\r\n\t\t}\r\n\t}\r\n\r\n\tcollapseLeftNavEventHandler = function ($event) {\r\n\t\tvar self = this;\r\n\t\tif (!$event || $event.keyCode == FxpConstants.keyCodes.escapeKey || $event.keyCode == FxpConstants.keyCodes.enterKey || $event.keyCode == FxpConstants.keyCodes.spaceBar) {\r\n\t\t\tself.$rootScope.isLeftNavOpen = false;\r\n\t\t\tself.setFocusToHamburger();\r\n\t\t}\r\n\t}\r\n\r\n\tonPinFlyoutClick = function ($event) {\r\n\t\tvar leftNavPinUnPinActionStartTime = performance.now();\r\n\t\tvar uiPinUnpinActionDuration;\r\n\t\tvar self = this;\r\n\t\tif (!self.$rootScope.isLeftNavPinned) {\r\n\t\t\tself.$rootScope.isLeftNavPinned = true;\r\n\t\t\tangular.element('#pin').focus();\r\n\t\t\tself.fxpEventBroadCastService.broadCast(FxpBroadcastedEvents.OnLeftNavTogglePinState, { isLeftNavPinned: true });\r\n\t\t}\r\n\t\telse {\r\n\t\t\tself.$rootScope.isLeftNavPinned = false;\r\n\t\t\tself.$rootScope.isLeftNavOpen = false;\r\n\t\t\tself.fxpEventBroadCastService.broadCast(FxpBroadcastedEvents.OnLeftNavTogglePinState, { isLeftNavPinned: false });\r\n\t\t}\r\n\t\tuiPinUnpinActionDuration = performance.now() - leftNavPinUnPinActionStartTime;\r\n\t\tself.saveLeftNavPinSetting(uiPinUnpinActionDuration);\r\n\t}\r\n\r\n\tonPinFlyoutKeyDown = function ($event) {\r\n\t\tvar self = this;\r\n\t\tvar keyCode = ($event) ? $event.keyCode : FxpConstants.keyCodes.enterKey;\r\n\t\tswitch (keyCode) {\r\n\r\n\t\t\tcase FxpConstants.keyCodes.escapeKey:\r\n\t\t\t\tself.fxpEventBroadCastService.broadCast(FxpBroadcastedEvents.OnLeftNavToggleExpandedState, { isLeftNavExpanded: true });\r\n\t\t\t\tbreak;\r\n\t\t\tcase FxpConstants.keyCodes.tabKey:\r\n\t\t\t\tif (!$event.shiftKey) {\r\n\t\t\t\t\tvar targetMenu = $($event.target).closest(\".fxpLeftNavOpen\"),\r\n\t\t\t\t\t\tvisibleMenuItems = targetMenu.find(\".left-nav-menu-item a\").filter(':visible');\r\n\t\t\t\t\tthis.timeout(function () {\r\n\t\t\t\t\t\tif (visibleMenuItems[0])\r\n\t\t\t\t\t\t\tvisibleMenuItems[0].focus();\r\n\t\t\t\t\t}, 50);\r\n\t\t\t\t}\r\n\t\t\t\tbreak;\r\n\t\t}\r\n\t}\r\n\r\n\r\n\tlogTelemetryForPinAction(uiPinUnpinActionDuration, saveSettingsResponseDuration) {\r\n\t\tvar self = this;\r\n\t\tvar leftNavPinStatus = self.$rootScope.isLeftNavPinned ? \"LeftNavPinned\" : \"LeftNavUnPinned\";\r\n\t\tvar uiPinUnpinDurationKey = self.$rootScope.isLeftNavPinned ? \"UILeftNavPinnedDuration\" : \"UILeftNavUnPinnedDuration\";\r\n\t\tvar propbag = self.fxpLoggerService.createPropertyBag();\r\n\t\tpropbag.addToBag(uiPinUnpinDurationKey, uiPinUnpinActionDuration);\r\n\t\tpropbag.addToBag(FxpConstants.metricConstants.LeftNavPinStatus, leftNavPinStatus);\r\n\t\tpropbag.addToBag(FxpConstants.metricConstants.SaveSettingsAPIResponseDuration, saveSettingsResponseDuration);\r\n\t\tpropbag.addToBag(FxpConstants.metricConstants.ScreenRoute, self.$state.current.name);\r\n\t\tpropbag.addToBag(FxpConstants.metricConstants.Geography, self.fxpTelemetryContext.getGeography());\r\n\t\tpropbag.addToBag(FxpConstants.metricConstants.BrowserType, self.deviceDetector.browser);\r\n\t\tself.userProfileService.getBasicProfileByAlias(self.userInfoService.getLoggedInUser(), null).then(function (loggedInUserInfo) {\r\n\t\t\tpropbag.addToBag(FxpConstants.metricConstants.UserBusinessRole, loggedInUserInfo[\"businessRole\"]);\r\n\t\t\tself.fxpLoggerService.logUserAction(self.sourceForTelemetry, `${TelemetryConstants.FXP_TELEMETRY_BASE_NAME}.LeftNavigationPinAction`, 'LeftNavigation Pin State Toggled', propbag);\r\n\t\t});\r\n\t}\r\n\r\n\t/**\r\n\t* A method to save the LeftNav pin/unpin settings of the user preferences\r\n\t* @method Fxp.Controllers.LeftNavController.saveLeftNavPinSetting\r\n\t* @example Example to use getLeftNav\r\n\t* LeftNavController.saveLeftNavPinSetting()\r\n\t*/\r\n\tsaveLeftNavPinSetting = function (uiPinUnpinActionDuration) {\r\n\t\tlet self = this;\r\n\t\tif (!self.userInfoService.isActingOnBehalfOf()) {\r\n\t\t\tlet userAlias = self.userInfoService.getLoggedInUser();\r\n\t\t\tlet userPreferencesStorageKey = ApplicationConstants.UserPreferencesStorageKey.replace('{0}', userAlias);\r\n\t\t\tself.fxpContext.readContext(userPreferencesStorageKey, ApplicationConstants.FxPDbName).then(function (context) {\r\n\t\t\t\tlet userPreferences = (context && context.Result) ? JSON.parse(context.Result) : {};\r\n\t\t\t\tuserPreferences.isLeftNavPinned = self.$rootScope.isLeftNavPinned;\r\n\t\t\t\tlet strUserPreferences = JSON.stringify(userPreferences);\r\n\t\t\t\tvar saveSettingsAPIStartTime = performance.now();\r\n\t\t\t\tself.settingsService.saveSettings(SettingsType.User,\r\n\t\t\t\t\tuserAlias,\r\n\t\t\t\t\tApplicationConstants.UserPreferencesSettings,\r\n\t\t\t\t\tstrUserPreferences).then(function (response) {\r\n\t\t\t\t\t\tvar saveSettingsAPIDuration = performance.now() - saveSettingsAPIStartTime;\r\n\t\t\t\t\t\tself.logTelemetryForPinAction(uiPinUnpinActionDuration, saveSettingsAPIDuration);\r\n\t\t\t\t\t\tself.fxpContext.saveContext(userPreferencesStorageKey, strUserPreferences, ApplicationConstants.FxPDbName);\r\n\t\t\t\t\t}, function (error) {\r\n\t\t\t\t\t\tlet propbag = self.fxpLoggerService.createPropertyBag();\r\n\t\t\t\t\t\tpropbag.addToBag(FxpConstants.metricConstants.RequestedUserAlias, userAlias);\r\n\t\t\t\t\t\tpropbag.addToBag(FxpConstants.metricConstants.ScreenRoute, self.$state.current.name);\r\n\t\t\t\t\t\tpropbag.addToBag(FxpConstants.metricConstants.Geography, self.fxpTelemetryContext.getGeography());\r\n\t\t\t\t\t\tpropbag.addToBag(FxpConstants.metricConstants.BrowserType, self.deviceDetector.browser);\r\n\t\t\t\t\t\tpropbag.addToBag(FxpConstants.metricConstants.Status, error.status);\r\n\t\t\t\t\t\tpropbag.addToBag(FxpConstants.metricConstants.StatusText, error.statusText + ' ' + error.data);\r\n\t\t\t\t\t\tself.userProfileService.getBasicProfileByAlias(self.userInfoService.getLoggedInUser(), null).then(function (loggedInUserInfo) {\r\n\t\t\t\t\t\t\tpropbag.addToBag(FxpConstants.metricConstants.UserBusinessRole, loggedInUserInfo.businessRole);\r\n\t\t\t\t\t\t\tself.fxpLoggerService.logError(self.telemetrySource,\r\n\t\t\t\t\t\t\t\tself.$rootScope.fxpUIConstants.UIMessages.SaveSettingsServiceCallFailedError.ErrorMessageTitle,\r\n\t\t\t\t\t\t\t\tErrorCodes.SaveLeftNavPinSetting_Error,\r\n\t\t\t\t\t\t\t\tnull,\r\n\t\t\t\t\t\t\t\tpropbag,\r\n\t\t\t\t\t\t\t\tnull,\r\n\t\t\t\t\t\t\t\tnull,\r\n\t\t\t\t\t\t\t\tErrorSeverityLevel.High\r\n\t\t\t\t\t\t\t);\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t});\r\n\t\t\t});\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n * A method to get the Logged-in User preferences\r\n * @method Fxp.Controllers.LeftNavController.setLoggedInUserPreferences\r\n * @example Example to use setLoggedInUserPreferences \r\n * LeftNavController.setLoggedInUserPreferences ()\r\n */\r\n\tsetLoggedInUserPreferences(): void {\r\n\t\tlet self = this;\r\n\t\tself.fxpContext.readContext(ApplicationConstants.UserPreferencesStorageKey.replace('{0}', self.userInfoService.getLoggedInUser()),\r\n\t\t\tApplicationConstants.FxPDbName).then(function (context) {\r\n\t\t\t\tvar settings = (context && context.Result) ? JSON.parse(context.Result) : {};\r\n\t\t\t\tself.$rootScope.isLeftNavOpen = self.$rootScope.isLeftNavPinned = (settings.isLeftNavPinned === undefined) ? true : settings.isLeftNavPinned;\r\n\t\t\t});\r\n\t}\r\n\r\n\theaderMenuChange = function ($event, item) {\r\n\t\tvar self = this;\r\n\t\tif (!item.parentId && item.hasChildren === false) {\r\n\t\t\t//Highlight left navigation item only if page is not dirty.\r\n\t\t\tif (!window._showPageDirtyPopup) {\r\n\t\t\t\tself.setSelectedLeftNavIds(item.id, -1, item.sequence);\r\n\t\t\t}\r\n\t\t\t// when L0 item is clicked hide all L0 with child items\r\n\t\t\tangular.forEach(self.$scope.leftNavData.internalLinks, function (item) {\r\n\t\t\t\titem.isOpen = false;\r\n\t\t\t});\r\n\t\t}\r\n\t\tif (!item.hasChildren) {\r\n\t\t\tif (!self.$rootScope.isLeftNavPinned) {\r\n\t\t\t\tself.$rootScope.isLeftNavOpen = false;\r\n\t\t\t\tvar currentStateName = this.$state.current.name;\r\n\t\t\t\tif (item.targetUIStateName === currentStateName) {\r\n\t\t\t\t\tthis.timeout(function () {\r\n\t\t\t\t\t\tangular.element('#Fxpdashboard_LeftNavItem_' + item.id).focus();\r\n\t\t\t\t\t}, 50);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tself.saveLeftNavToContext(item);\r\n\t\t\t$event.stopPropagation();\r\n\t\t}\r\n\t}\r\n\tsaveLeftNavToContext = (item) =>{\r\n\t\tvar self = this\r\n\t\t//Save left navigation item to context only if page is not dirty.\r\n\t\tif (!window._showPageDirtyPopup) {\r\n\t\t\tself.fxpContext.saveContext(self.CurrentSelectedLeftNavItem, JSON.stringify(item), ApplicationConstants.FxPDbName);\r\n\t\t}\r\n\t}\r\n\r\n\topenFlyoutOnClick = function (item, $event) {\r\n\t\tvar self = this;\r\n\t\tif (!$event.ctrlKey && !$event.shiftKey) {\r\n\t\t\tif (!item.parentId && item.hasChildren === false) {\r\n\t\t\t\t//Highlight left navigation item only if page is not dirty.\r\n\t\t\t\tif (!window._showPageDirtyPopup) {\r\n\t\t\t\t\tself.setSelectedLeftNavIds(item.id, -1, item.sequence);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tangular.forEach(self.$scope.leftNavData.internalLinks, function (item) {\r\n\t\t\t\titem.isOpen = false;\r\n\t\t\t});\r\n\t\t\tif (self.$scope.leftNavData.externalLinks) {\r\n\t\t\t\tangular.forEach(self.$scope.leftNavData.externalLinks, function (item) {\r\n\t\t\t\t\titem.isOpen = false;\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t\tif (self.$scope.leftNavData.settings) {\r\n\t\t\t\tangular.forEach(self.$scope.leftNavData.settings, function (item) {\r\n\t\t\t\t\titem.isOpen = false;\r\n\t\t\t\t});\r\n\t\t\t}\r\n\r\n\t\t\tself.resetLeftNavFocus();\r\n\t\t\t//Highlight left navigation item only if page is not dirty.\r\n\t\t\tif (!item.hasChildren && !window._showPageDirtyPopup) {\r\n\t\t\t\tself.$rootScope.$emit('leftNavHighlighted', item);\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tself.$rootScope.isLeftNavOpen = true;\r\n\t\t\titem.isOpen = true;\r\n\t\t\tthis.timeout(function () {\r\n\t\t\t\tangular.element('#Fxpdashboard_LeftNavItem_' + item.id).focus();\r\n\t\t\t}, 50);\r\n\t\t}\r\n\t}\r\n\r\n\tonMenuItemClick = function (item, innerItem) {\r\n\t\tvar self = this;\r\n\t\tif (!self.$rootScope.isLeftNavPinned) {\r\n\t\t\tself.$rootScope.isLeftNavOpen = false;\r\n\t\t\tvar currentStateName = this.$state.current.name;\r\n\t\t\tif (innerItem.targetUIStateName === currentStateName) {\r\n\t\t\t\tthis.timeout(function () {\r\n\t\t\t\t\tangular.element('#Fxpdashboard_LeftNavItem_' + item.id).focus();\r\n\t\t\t\t}, 50)\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tresetLeftNavFocus = function () {\r\n\t\tthis.timeout(function () {\r\n\t\t\tangular.element('.mCustomScrollBox').attr(\"tabindex\", \"-1\");\r\n\t\t\tangular.element('.accordion-toggle').attr(\"tabindex\", \"-1\");\r\n\t\t}, 1000)\r\n\t}\r\n\r\n\tleftNavKeydown = function ($event) {\r\n\t\tvar self = this;\r\n\t\tvar targetMenu = $($event.target).closest(\"#fxp-sidebar\"),\r\n\t\t\tallMenuItems = targetMenu.find(\"li a\").filter(':visible'),\r\n\t\t\tcurrentMenuItemIndex = allMenuItems.index($event.target);\r\n\r\n\t\tswitch ($event.keyCode) {\r\n\t\t\tcase FxpConstants.keyCodes.arrowDownKey:\r\n\t\t\t\tif (currentMenuItemIndex < (allMenuItems.length - 1)) {\r\n\t\t\t\t\tallMenuItems[currentMenuItemIndex + 1].focus();\r\n\t\t\t\t}\r\n\t\t\t\tbreak;\r\n\t\t\tcase FxpConstants.keyCodes.arrowUpKey:\r\n\t\t\t\tif (currentMenuItemIndex > 0) {\r\n\t\t\t\t\tallMenuItems[currentMenuItemIndex - 1].focus();\r\n\t\t\t\t}\r\n\t\t\t\tbreak;\r\n\t\t\tcase FxpConstants.keyCodes.spaceBar:\r\n\t\t\t\tself.$scope.expandLeftNavEvent();\r\n\t\t\t\tbreak;\r\n\t\t}\r\n\t}\r\n\r\n\tsetFocusToHamburger = function () {\r\n\t\tthis.timeout(function () {\r\n\t\t\tangular.element('#hamburger').focus();\r\n\t\t}, 50)\r\n\t}\r\n\r\n\t/**\r\n\t* A method to update LeftNav data for the current user\r\n\t* @method Fxp.Controllers.LeftNavController.onSuccessGetLeftNav\r\n\t* @example Example to use onSuccessGetLeftNav\r\n\t* LeftNavController.onSuccessGetLeftNav(leftNavData,'alias')\r\n\t*/\r\n\tonSuccessGetLeftNav(leftNavData: any, userAlias: string) {\r\n\t\tvar self = this;\r\n\t\tif (leftNavData.internalLinks.length > 0 && leftNavData.internalLinks[0].displayName.toLowerCase() === \"dashboard\") {\r\n\t\t\tleftNavData.internalLinks[0].targetUIStateName = self.fxpRouteService.getDefaultStateName();\r\n\t\t}\r\n\t\tif (!self.userInfoService.isActingOnBehalfOf()) {\r\n\t\t\tself.loggedInUserLeftNavData = angular.copy(leftNavData);\r\n\t\t} else {\r\n\t\t\tself.oboUserLeftNavData = angular.copy(leftNavData);\r\n\t\t}\r\n\r\n\t\tself.userClaimsService.getUserConsolidatedRoles(userAlias)\r\n\t\t\t.then(function (roles: Array) {\r\n\t\t\t\tif (roles.findIndex(e => e == \"Admin\") >= 0) {\r\n\r\n\t\t\t\t\tif (self.fxpConfigurationService.FxpBaseConfiguration.AdminLeftNav) {\r\n\t\t\t\t\t\tvar LeftNavAdminData = self.fxpConfigurationService.FxpBaseConfiguration.AdminLeftNav;\r\n\t\t\t\t\t\tleftNavData.internalLinks.push(LeftNavAdminData);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\tif (self.fxpConfigurationService.FxpBaseConfiguration.RMDashboard) {\r\n\t\t\tvar rmDashboard = self.fxpConfigurationService.FxpBaseConfiguration.RMDashboard;\r\n\t\t\tleftNavData.internalLinks.push(rmDashboard);\r\n\t\t}\r\n\t\tif (self.fxpConfigurationService.FxpBaseConfiguration.FxpCapabilities) {\r\n\t\t\tvar fxpCapabilities = self.fxpConfigurationService.FxpBaseConfiguration.FxpCapabilities;\r\n\t\t\tleftNavData.internalLinks.push(fxpCapabilities);\r\n\t\t}\r\n\t\tif (self.fxpConfigurationService.FxpBaseConfiguration.ProfileComponent) {\r\n\t\t\tvar profileComponent = self.fxpConfigurationService.FxpBaseConfiguration.ProfileComponent;\r\n\t\t\tleftNavData.internalLinks.push(profileComponent);\r\n\t\t}\r\n\r\n\t\tself.$scope.leftNavData = self.getDeviceSpecificLeftNavItems(leftNavData);\r\n\r\n\r\n\t\tif (leftNavData.internalLinks && leftNavData.internalLinks.length > 0)\r\n\t\t\tself.checkLinksWithMissingModules(leftNavData.internalLinks);\r\n\r\n\t\tself.$scope.leftNavDataExists = self.$scope.leftNavData.internalLinks ? self.$scope.leftNavData.internalLinks.length > 0 : false;\r\n\t\tself.setSequence();\r\n\t\tself.$rootScope.appLoaded = true;\r\n\t\tif (!self.$scope.leftNavDataExists) {\r\n\t\t\tself.fxpMessage.addMessage(self.$rootScope.fxpUIConstants.UIMessages.GeneralExceptionError.ErrorMessage, FxpConstants.messageType.error);\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tself.timeout(function () {\r\n\t\t\tself.resizeLeftNavHeight();\r\n\t\t\tself.findActiveLeftNavItem(self.$scope.leftNavData.internalLinks);\r\n\t\t}, 1000);\r\n\t}\r\n\r\n\t/**\r\n\t* A method to get the leftNav items on device specific\r\n\t* @method Fxp.Controllers.LeftNavController.getDeviceSpecificLeftNavItems\r\n\t* @param {leftNavData } leftNavData leftnavdata returned by fxp service api.\r\n\t* @example Example to use getDeviceSpecificLeftNavItems\r\n\t* LeftNavController.getDeviceSpecificLeftNavItems(leftNavData)\r\n\t*/\r\n\tgetDeviceSpecificLeftNavItems(leftNavData: any): any {\r\n\t\tvar self = this;\r\n\t\tif (self.deviceFactory.isMobile()) {\r\n\t\t\tleftNavData.internalLinks = leftNavData.internalLinks.filter(function (item) {\r\n\t\t\t\treturn (item.applicableDevice == FxpConstants.applicableDevice.mobile || item.applicableDevice == FxpConstants.applicableDevice.all)\r\n\t\t\t});\r\n\t\t}\r\n\t\telse {\r\n\t\t\tleftNavData.internalLinks = leftNavData.internalLinks.filter(function (item) {\r\n\t\t\t\treturn (item.applicableDevice == FxpConstants.applicableDevice.desktop || item.applicableDevice == FxpConstants.applicableDevice.all)\r\n\t\t\t});\r\n\t\t}\r\n\t\treturn leftNavData;\r\n\t}\r\n\r\n\t/**\r\n\t* click GLN item/link and Highlight it\r\n\t* @method Fxp.Controllers.LeftNavController.leftNavItemClick\r\n\t* @param {item} item item is LeftNav Item.\r\n\t* @example Example to use leftNavItemClick\r\n\t* LeftNavController.leftNavItemClick(item)\r\n\t*/\r\n\tleftNavItemClick = function (item, $event) {\r\n\r\n\t\tif (item.dependenciesMissing && item.dependenciesMissing === true) {\r\n\t\t\t//Handle scenario when left nav click is restricted.\r\n\t\t}\r\n\t\telse {\r\n\t\t\tvar self = this;\r\n\t\t\tif ($event && !$event.ctrlKey && !$event.shiftKey) {\r\n\t\t\t\tself.highlightLeftNavItem(item);\r\n\t\t\t\tself.saveLeftNavToContext(item);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\thighlightLeftNavItem = function (item) {\r\n\t\tvar self = this;\r\n\t\t//Highlight left navigation item only if page is not dirty.\r\n\t\tif (!window._showPageDirtyPopup) {\r\n\t\t\tif (item.parentId) {\r\n\r\n\t\t\t\tself.setSelectedLeftNavIds(item.parentId, item.id, item.parentSequence);\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\tself.setSelectedLeftNavIds(item.id, -1, item.sequence);\r\n\t\t\t}\r\n\t\t\tself.$rootScope.$emit('leftNavHighlighted', item);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t* A method to set Sequence no to leftNav items\r\n\t* @method Fxp.Controllers.LeftNavController.setSequence\r\n\t* @example Example to use setSequence\r\n\t* LeftNavController.setSequence()\r\n\t*/\r\n\tprivate setSequence() {\r\n\t\tvar self = this;\r\n\t\tif (self.$scope.leftNavDataExists) {\r\n\t\t\tself.sortObject(self.$scope.leftNavData.internalLinks, \"sortOrder\");\r\n\t\t\tfor (var i = 0; i < self.$scope.leftNavData.internalLinks.length; i++) {\r\n\t\t\t\tself.$scope.leftNavData.internalLinks[i].sequence = i + 1;\r\n\t\t\t\tif (self.$scope.leftNavData.internalLinks[i].hasChildren) {\r\n\t\t\t\t\tvar children = self.$scope.leftNavData.internalLinks[i].children;\r\n\t\t\t\t\tfor (var j = 0; j < children.length; j++) {\r\n\t\t\t\t\t\tchildren[j].parentSequence = i + 1;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t* A method to set Selected LeftNav Id's\r\n\t* @method Fxp.Controllers.LeftNavController.setSelectedLeftNavIds\r\n\t* @param {linkId } linkId linkId is Parent Id of Left Nav Item.\r\n\t* @param {id } id id is the Left Nav Item.\r\n\t* @param {sequence } sequence sequence is the Left Nav Item sequential order no of Global Left Navigation List.\r\n\t* @example Example to use setSelectedLeftNavIds\r\n\t* LeftNavController.setSelectedLeftNavIds(linkId)\r\n\t*/\r\n\tprivate setSelectedLeftNavIds(linkId, id, sequence) {\r\n\t\tvar self = this;\r\n\t\tself.$scope.selectedLeftNavItemId = id;\r\n\t\tself.$scope.selectedLeftNavItemLinkId = linkId;\r\n\t\tself.$scope.selectedLeftNavItemSequence = sequence;\r\n\t}\r\n\r\n\t/**\r\n * A method to to hightlight GLN link on refresh, landing experience and on bookmark.\r\n * @method Fxp.Controllers.LeftNavController.findActiveLeftNavItem\r\n * @param {response } response leftNavItems\r\n * @example Example to use findActiveLeftNavItem\r\n * LeftNavController.findActiveLeftNavItem(response)\r\n */\r\n\tprivate findActiveLeftNavItem(response) {\r\n\t\tvar self = this;\r\n\t\tvar stateName = self.currentUserDefaultState ? self.currentUserDefaultState : self.$state.current.name;\r\n\t\tif (response) {\r\n\t\t\tself.filterGLNItemForHighlight(response, stateName);\r\n\t\t}\r\n\t}\r\n\r\n\tprivate filterGLNItemForHighlight(navList, stateName) {\r\n\t\tvar self = this;\r\n\t\tlet leftNavItems = self.dashboardService.getGLNFlatDataStructure(navList).filter(function (item) {\r\n\t\t\treturn (item.targetUIStateName && item.targetUIStateName.toLowerCase() === stateName.toLowerCase());\r\n\t\t});\r\n\t\tif (leftNavItems && leftNavItems.length >= 1) {\r\n\t\t\tvar clickedItem;\r\n\t\t\tself.fxpContext.readContext(self.CurrentSelectedLeftNavItem, ApplicationConstants.FxPDbName).then(function (context) {\r\n\t\t\t\tlet clickedItem = (context && context.Result) ? JSON.parse(context.Result) : {};\r\n\t\t\t\tif (clickedItem) {\r\n\t\t\t\t\tvar selectedItem = leftNavItems.find(item => item.id === clickedItem.id);\r\n\t\t\t\t\tif (selectedItem)\r\n\t\t\t\t\t\tself.highlightLeftNavItem(clickedItem);\r\n\t\t\t\t\telse\r\n\t\t\t\t\t\tself.highlightLeftNavItem(leftNavItems[0]);\r\n\t\t\t\t} else {\r\n\t\t\t\t\tself.highlightLeftNavItem(leftNavItems[0]);\r\n\t\t\t\t}\r\n\r\n\t\t\t\t//If parent item exist then expand it\r\n\t\t\t\tlet parentItem = navList.find(function (item) {\r\n\t\t\t\t\treturn item.id === leftNavItems[0].parentId;\r\n\t\t\t\t});\r\n\t\t\t\tif (parentItem)\r\n\t\t\t\t\tparentItem.isOpen = true;\r\n\t\t\t});\r\n\t\t}\r\n\t}\r\n\r\n\tprivate checkLinksWithMissingModules(links) {\r\n\t\t//Update Left nav data for states that are not available\r\n\t\tfor (var l = 0; l < links.length; l++) {\r\n\t\t\tvar leftNavLink = links[l];\r\n\t\t\tif (leftNavLink.hasChildren && leftNavLink.children && leftNavLink.children.length > 0) {\r\n\t\t\t\tthis.checkLinksWithMissingModules(leftNavLink.children);\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\tif (Resiliency.statesWithMissingModules.indexOf(leftNavLink.targetUIStateName) > -1) {\r\n\t\t\t\t\tleftNavLink.dependenciesMissing = true;\r\n\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n\r\nLeftNavController.$inject = ['$rootScope', '$q', '$scope', '$state', '$timeout', 'DashboardService', 'FxpLoggerService', 'UserInfoService', 'FxpMessageService', '$window', '$document', 'DeviceFactory', 'FxpRouteService', 'FxpConfigurationService', 'UserProfileService', 'SettingsService', 'FxpContextService', 'FxpTelemetryContext', 'deviceDetector', 'AdminLandingService', 'UserClaimsService', '$base64', 'FxpEventBroadCastService'];\r\n","import { IAction } from \"redux-micro-frontend\"\r\nimport { Actions } from \"./leftNavigation.action.types\"\r\nimport { ILeftNavigationGroup } from \"./leftNavigation.model\"\r\nexport const setLeftnav = (payload: ILeftNavigationGroup): IAction => {\r\n return {\r\n type: Actions.SET_LEFTNAV,\r\n payload: payload\r\n }\r\n}","export enum Actions {\r\n SET_LEFTNAV = \"SET_LEFTNAV\"\r\n}","import { IAction } from 'redux-micro-frontend';\r\nimport { Reducer } from \"redux\";\r\nimport { Actions } from './leftNavigation.action.types';\r\nimport { ILeftNavigationGroup } from './leftNavigation.model';\r\n\r\nconst defaultState: ILeftNavigationGroup = {} as ILeftNavigationGroup;\r\n\r\nexport const LeftNavigationReducer: Reducer> = (\r\n state: ILeftNavigationGroup = defaultState,\r\n action: IAction\r\n): ILeftNavigationGroup => {\r\n\r\n switch (action.type) {\r\n case Actions.SET_LEFTNAV: {\r\n return action.payload;\r\n }\r\n }\r\n\r\n return state;\r\n}","export class UI_LOADER_NAMES {\r\n \r\n\r\n /**\r\n * The Loader names are meant have to follow this convention\r\n * ---loader\r\n */\r\n public static FXP_LOADERS = { \r\n ADMIN_LANDING_LOADER: `fxp-AdminLanding-loader`,\r\n ACT_ON_BEHALF_OF_LOADER: `fxp-ActOnBehalfOf-loader`,\r\n AUTHOR_NOTIFICATION_LOADER: `fxp-AuthorNotification-loader`,\r\n AUTHOR_NOTIFICATION_PUBLISH_NOTIFICATION_LOADER: `fxp-AuthorNotification-PublishNotification-loader`,\r\n LEFT_NAV_PERSONALIZATION_LOADER: `fxp-LeftNavPersonalization-loader`,\r\n ROLE_NAV_PERSONALIZATION_LOADER: `fxp-RoleNavPersonalization-loader`,\r\n SYSTEM_MESSAGE_POPULATE_MESSAGE_LOADER: `fxp-SystemMessage-populate-loader`,\r\n SYSTEM_MESSAGE_ADD_MESSAGE_LOADER: `fxp-SystemMessage-addSystemMessage-loader`,\r\n SYSTEM_MESSAGE_UPDATE_MESSAGE_LOADER: `fxp-SystemMessage-updateSystemMessage-loader`,\r\n SYSTEM_MESSAGE_DELETE_MESSAGE_LOADER: `fxp-SystemMessage-deleteSystemMessage-loader`,\r\n FXP_BOOT_LOADER: `fxp-FxpBoot-Loader`\r\n }\r\n\r\n}","import { IAction } from 'redux-micro-frontend';\r\nimport { LoaderActionTypes } from \"./loader.actions.types\";\r\nimport { ILoader } from \"./loader.model\";\r\n\r\n\r\nexport const ShowLoader = (payload: ILoader): IAction => {\r\n if(!payload.showLoader) payload.showLoader = true;\r\n\tif(payload.timeoutCallback) payload.timeoutCallback = payload.timeoutCallback.bind(payload);\r\n return {\r\n type: LoaderActionTypes.SHOW_LOADER,\r\n payload: payload\r\n }\r\n}\r\n\r\nexport const HideLoader = (payload: Object): IAction => {\r\n return {\r\n type: LoaderActionTypes.HIDE_LOADER,\r\n payload: payload\r\n }\r\n}\r\n\r\nexport const ShowSpecificLoader = (payload: ILoader) : IAction => {\r\n if(!payload.name) payload.name = 'default-fxp-loader';\r\n if(!payload.showLoader) payload.showLoader = true;\r\n return {\r\n type: LoaderActionTypes.SHOW_SPECIFIC_LOADER,\r\n payload: payload\r\n }\r\n}\r\n\r\nexport const HideSpecificLoader = (payload: Object): IAction => {\r\n return {\r\n type: LoaderActionTypes.HIDE_SPECIFIC_LOADER,\r\n payload: payload\r\n }\r\n}\r\n\r\n","export enum LoaderActionTypes {\r\n SHOW_LOADER = \"SHOW_LOADER\",\r\n HIDE_LOADER = \"HIDE_LOADER\",\r\n SHOW_SPECIFIC_LOADER = \"SHOW_SPECIFIC_LOADER\",\r\n HIDE_SPECIFIC_LOADER = \"HIDE_SPECIFIC_LOADER\",\r\n}","import { IAction } from 'redux-micro-frontend';\r\nimport { Reducer } from \"redux\";\r\nimport { LoaderActionTypes } from \"./loader.actions.types\";\r\nimport { ILoader } from \"./loader.model\";\r\n\r\nconst defaultState: Array = [];\r\n\r\nexport const LoaderReducer: Reducer, IAction > = (\r\n state: Array = defaultState,\r\n action: IAction \r\n): Array => {\r\n switch (action.type) {\r\n case LoaderActionTypes.SHOW_LOADER : {\r\n return [...state, action.payload];\r\n }\r\n case LoaderActionTypes.HIDE_LOADER : {\r\n return defaultState;\r\n }\r\n case LoaderActionTypes.SHOW_SPECIFIC_LOADER : {\r\n return [...state, action.payload];\r\n }\r\n case LoaderActionTypes.HIDE_SPECIFIC_LOADER : {\r\n return action.payload.name ? state.filter(loader => loader.name != action.payload.name) : defaultState;\r\n }\r\n }\r\n\r\n return state;\r\n\r\n};","import { IRootScope } from \"../../js/interfaces/IRootScope\";\r\nimport { FxpConfigurationService } from \"../../js/services/FxpConfiguration\";\r\nimport { FxpBroadcastedEvents } from \"../../js/services/FxpBroadcastedEvents\";\r\nimport { IFxPService } from \"../../js/interfaces/IFxpService\";\r\nimport { FxpGlobalStoreService } from '../../js/services/fxp.global.store.service';\r\nimport { ShowLoader, HideLoader, ShowSpecificLoader, HideSpecificLoader } from './loader.actions';\r\nimport { ILoader } from \"./loader.model\";\r\n/**\r\n * @application Fxp\r\n */\r\n/**\r\n * @module Fxp.Services\r\n */\r\ndeclare var Spinner: any;\r\n\r\n/**\r\n * A service to connect to Page Loader Service to fetch the detaisl of page loader\r\n * @class Fxp.Services.PageLoaderService\r\n * @classdesc A service to connect to Page Loader service to fetch the page loader details\r\n * @example Example to create an instance of Page Loader Service\r\n * //Initializing Page Loader Service\r\n * angular.module('FxPApp').controller('AppController', ['PageLoaderService', AppController]);\r\n * function AppController(PageLoaderService){ PageLoaderService.fnHidePageLoader(); }\r\n */\r\nexport class PageLoaderService implements IFxPService {\r\n\r\n\tprivate http: angular.IHttpService;\r\n\tprivate rootScope: IRootScope;\r\n\tprivate timeout: angular.ITimeoutService;\r\n\tprivate static _instance: PageLoaderService;\r\n\tprivate defaultLoaderName = 'fxploader';\r\n\tprivate loaderInstance;\r\n\tprivate timeoutIntervalInMs;\r\n\tprivate timeOutCallback;\r\n\tprivate pageLoadTimers: Array>;\r\n\tprivate currentLoaderState: Array;\r\n\r\n\tconstructor($http: angular.IHttpService,\r\n\t\t$rootScope: IRootScope,\r\n\t\t$timeout: angular.ITimeoutService,\r\n\t\tfxpConfigurationService: FxpConfigurationService,\r\n\t\tprivate globalStoreService: FxpGlobalStoreService)\r\n\t{\r\n\t\tthis.http = $http;\r\n\t\tthis.rootScope = $rootScope;\r\n\t\tthis.timeout = $timeout;\r\n\t\tthis.timeoutIntervalInMs = fxpConfigurationService.FxpBaseConfiguration.PageLoadTimeOut || 30000;\r\n\t\tthis.pageLoadTimers = [];\r\n\r\n\t\tif (PageLoaderService._instance) {\r\n\t\t\treturn PageLoaderService._instance;\r\n\t\t}\r\n\t\tPageLoaderService._instance = this;\r\n\r\n\t\tthis.globalStoreService.SubscribeToPlatformState(\"Platform\", (state) => {\r\n\t\t\tlet incomingLoaderState = state.Loader;\r\n\t\t\tif(incomingLoaderState !== null && incomingLoaderState !== undefined) {\r\n\t\t\t\tthis.showOrHideLoaders(incomingLoaderState, this.currentLoaderState);\r\n\t\t\t\tthis.currentLoaderState = incomingLoaderState;\r\n\t\t\t}\r\n\t\t});\r\n\t}\r\n\r\n\t/**\r\n * Decides whether to hide/show loader based on difference of loaderState.\r\n */\r\n\tprivate showOrHideLoaders(incomingLoaderState, currentLoaderState = []) {\r\n\t\tif(incomingLoaderState.length > currentLoaderState.length) {\r\n\t\t\tlet loaderToShow = incomingLoaderState[incomingLoaderState.length ? incomingLoaderState.length - 1 : 0];\r\n\t\t\tif(Object.entries(loaderToShow).length !== 0 && loaderToShow[\"name\"] && loaderToShow[\"name\"] !== \"fxploader\") {\r\n\t\t\t\tthis.fnChangeLoaderState(loaderToShow);\r\n\t\t\t} else {\r\n\t\t\t\tthis.disablePageLoaderTimers();\r\n\t\t\t\tthis.fnChangeLoaderState(loaderToShow);\r\n\t\t\t\tthis.setPageLoadTimer(loaderToShow.timeoutCallback);\r\n\t\t\t}\r\n\t\t} else if (incomingLoaderState.length < currentLoaderState.length) {\r\n\t\t\tlet loaderToHide = currentLoaderState.filter(\r\n\t\t\t\tcurrentLoader =>\r\n\t\t\t\t !incomingLoaderState.some(\r\n\t\t\t\t\tincomingLoader => incomingLoader[\"name\"] === currentLoader[\"name\"]\r\n\t\t\t\t )\r\n\t\t\t);\r\n\r\n\t\t\tif(loaderToHide !== undefined && loaderToHide !== null && loaderToHide.length && loaderToHide[0][\"name\"] && loaderToHide[0][\"name\"] !== \"fxploader\") {\r\n\t\t\t\tthis.fnChangeLoaderState({showLoader: false});\r\n\t\t\t} else {\r\n\t\t\t\tthis.disablePageLoaderTimers();\r\n\t\t\t\tthis.fnChangeLoaderState({showLoader: false});\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Sets Page loading time to the PageLoadTimers\r\n\t * @method Fxp.Services.PageLoaderService.setPageLoadTimer \r\n\t * @example Example to invoke setPageLoadTimer \r\n\t * PageLoaderService.setPageLoadTimer(3000 // time in milliseconds); \r\n\t */\r\n\tprivate setPageLoadTimer(timeOutCallback?) {\r\n\t\tvar self = this;\r\n\t\tself.timeOutCallback = timeOutCallback;\r\n\t\tvar pageLoadTimer = self.timeout(function () {\r\n\t\t\tself.fnHidePageLoader();\r\n\t\t\tif (self.timeOutCallback)\r\n\t\t\t\tself.timeOutCallback();\r\n\t\t}, self.timeoutIntervalInMs);\r\n\t\t\r\n\t\t// Storing timers in collection to cancel all of them once hide event is called. \r\n\t\tself.pageLoadTimers.push(pageLoadTimer);\r\n\t}\r\n\r\n\t/**\r\n * Gets Show Page Loader from the Page Loader Service\r\n * @method Fxp.Services.PageLoaderService.fnShowPageLoader \r\n * @example Example to invoke fnShowPageLoader\r\n * PageLoaderService.fnShowPageLoader('loading text');\r\n */\r\n\tfnShowPageLoader(loadingText, timeoutCallback?) {\r\n\t\tvar loader = this.fnCreateLoaderData(true, this.defaultLoaderName, loadingText, timeoutCallback);\r\n\t\tthis.globalStoreService.DispatchGlobalAction(\"Platform\", ShowLoader(loader));\r\n\t}\r\n\r\n\t/**\r\n\t* A method to show page loader which are part of series of steps\r\n\t* @method Fxp.Services.PageLoaderService.fnShowPageLoaderStep\r\n\t* @example Example to invoke fnShowPageLoaderStep\r\n\t* PageLoaderService.fnShowPageLoaderStep('Authenticating', 1, 2); // Will have a string \"Authenticating (1/2)\"\r\n\t*/\r\n\tfnShowPageLoaderStep(loadingText: string, currentStepIndex: number, totalStepsCount: number, timeOutCallback?) {\r\n\t\tlet loadingTextWithStep = `${loadingText} (${currentStepIndex}/${totalStepsCount})`;\r\n\t\tthis.fnShowPageLoader(loadingTextWithStep, timeOutCallback);\r\n\t}\r\n\t/**\r\n\t* Gets Hide Page Loader from the Page Loader Service\r\n\t* @method Fxp.Services.PageLoaderService.fnHidePageLoader\r\n\t* @example Example to invoke fnHidePageLoader\r\n\t* PageLoaderService.fnHidePageLoader();\r\n\t*/\r\n\tfnHidePageLoader() {\r\n\t\tthis.globalStoreService.DispatchGlobalAction(\"Platform\", HideLoader({}));\r\n\t}\r\n\r\n\t/**\r\n * Gets Show In line Loader from the Page Loader Service\r\n * @method Fxp.Services.PageLoaderService.fnShowInlineLoader\r\n * @example Example to invoke fnShowInlineLoader\r\n * PageLoaderService.fnShowInlineLoader('loader name','loading text');\r\n */\r\n\tfnShowInlineLoader(loaderName, loadingText) {\r\n\t\tvar loader = this.fnCreateLoaderData(true, loaderName, loadingText);\r\n\t\tthis.fnBroadcastInlineLoading(loader)\r\n\t}\r\n\r\n\t/**\r\n\t* Gets Hide In line Loader from the Page Loader Service\r\n\t* @method Fxp.Services.PageLoaderService.fnHideInlineLoader\r\n\t* @example Example to invoke fnHideInlineLoader\r\n\t* PageLoaderService.fnHideInlineLoader('loader name');\r\n\t*/\r\n\tfnHideInlineLoader(loaderName) {\r\n\t\tvar loader = this.fnCreateLoaderData(false, loaderName, '');\r\n\t\tthis.fnBroadcastInlineLoading(loader)\r\n\t}\r\n\r\n\t/**\r\n\t* Gets Show Flyout Inline Loader from the Page Loader Service\r\n\t* @method Fxp.Services.PageLoaderService.fnShowFlyoutInlineLoader\r\n\t* @example Example to invoke fnShowFlyoutInlineLoader\r\n\t* PageLoaderService.fnShowFlyoutInlineLoader('loader name','loader tooltip');\r\n\t*/\r\n\tfnShowFlyoutInlineLoader(loaderName, loaderTooltip) {\r\n\t\tvar loader = this.fnCreateFlyoutLoaderData(true, loaderName, loaderTooltip);\r\n\t\tthis.fnBroadcastInlineLoading(loader);\r\n\t}\r\n\r\n\t/**\r\n\t* Gets Hide Flyout Inline Loader from the Page Loader Service\r\n\t* @method Fxp.Services.PageLoaderService.fnHideFlyoutInlineLoader\r\n\t* @example Example to invoke fnHideFlyoutInlineLoader\r\n\t* PageLoaderService.fnHideFlyoutInlineLoader('loader name');\r\n\t*/\r\n\tfnHideFlyoutInlineLoader(loaderName) {\r\n\t\tvar loader = this.fnCreateFlyoutLoaderData(false, loaderName, '');\r\n\t\tthis.fnBroadcastInlineLoading(loader)\r\n\t}\r\n\r\n\t/**\r\n\t* Gets Show Specific Page Loader from the Page Loader Service\r\n\t* @method Fxp.Services.PageLoaderService.fnShowSpecificPageLoader\r\n\t* @example Example to invoke fnShowSpecificPageLoader\r\n\t* PageLoaderService.fnShowSpecificPageLoader('loader name','loader text');\r\n\t*/\r\n\tfnShowSpecificPageLoader(loaderName, loadingText) {\r\n\t\tvar loader = this.fnCreateLoaderData(true, loaderName, loadingText);\r\n\t\tthis.globalStoreService.DispatchGlobalAction(\"Platform\", ShowSpecificLoader(loader));\r\n\t}\r\n\r\n\t/**\r\n\t* Gets Hide Specific Page Loader from the Page Loader Service\r\n\t* @method Fxp.Services.PageLoaderService.fnHideSpecificPageLoader\r\n\t* @example Example to invoke fnHideSpecificPageLoader\r\n\t* PageLoaderService.fnHideSpecificPageLoader('loader name');\r\n\t*/\r\n\tfnHideSpecificPageLoader(loaderName) {\r\n\t\tthis.globalStoreService.DispatchGlobalAction(\"Platform\", HideSpecificLoader({name: loaderName}));\r\n\t}\r\n\r\n\t/**\r\n * Gets Create Loader Data from the Page Loader Service\r\n * @method Fxp.Services.PageLoaderService.fnCreateLoaderData\r\n * @example Example to invoke fnCreateLoaderData\r\n * PageLoaderService.fnCreateLoaderData('show loader','loader name','loading text');\r\n */\r\n\tfnCreateLoaderData(showLoader, loaderName, loadingText, timeOutCallback?) {\r\n\t\treturn { name: loaderName, showLoader: showLoader, loadingText: loadingText, timeoutCallback: timeOutCallback};\r\n\t}\r\n\r\n\t/**\r\n\t* Gets Create Flyout Loader Data from the Page Loader Service\r\n\t* @method Fxp.Services.PageLoaderService.fnCreateFlyoutLoaderData\r\n\t* @example Example to invoke fnCreateFlyoutLoaderData\r\n\t* PageLoaderService.fnCreateFlyoutLoaderData('show loader','loader name','loading text');\r\n\t*/\r\n\tfnCreateFlyoutLoaderData(showLoader, loaderName, loadingText) {\r\n\t\treturn angular.extend(this.fnCreateLoaderData(showLoader, loaderName, loadingText), { flyout: true });\r\n\t}\r\n\r\n\t/**\r\n\t* Gets Broadcast Loading from the Page Loader Service\r\n\t* @method Fxp.Services.PageLoaderService.fnChangeLoaderState\r\n\t* @example Example to invoke fnChangeLoaderState\r\n\t* PageLoaderService.fnChangeLoaderState('loader');\r\n\t*/\r\n\tfnChangeLoaderState(loader) {\r\n\t\tlet self = this;\r\n\t\tself.rootScope.showLoader = loader.showLoader;\r\n\t\tif (loader.showLoader) {\r\n\t\t\t//Timeout to make sure angular digest runs for the above \r\n\t\t\t//statement after which the spinContainer is available.\r\n\t\t\tself.timeout(function () {\r\n\t\t\t\t//Add spinner if not exists already.\r\n\t\t\t\tif (!self.loaderInstance) {\r\n\t\t\t\t\tvar spinConfig = {\r\n\t\t\t\t\t\tlines: 8 // The number of lines to draw\r\n\t\t\t\t\t\t, length: 0 // The length of each line\r\n\t\t\t\t\t\t, width: 8 // The line thickness\r\n\t\t\t\t\t\t, radius: 10 // The radius of the inner circle\r\n\t\t\t\t\t\t, scale: 1.5 // Scales overall size of the spinner\r\n\t\t\t\t\t\t, corners: 1 // Corner roundness (0..1)\r\n\t\t\t\t\t\t, color: '#0063b1' // #rgb or #rrggbb or array of colors\r\n\t\t\t\t\t\t, opacity: 0.25 // Opacity of the lines\r\n\t\t\t\t\t\t, rotate: 0 // The rotation offset\r\n\t\t\t\t\t\t, direction: 1 // 1: clockwise, -1: counterclockwise\r\n\t\t\t\t\t\t, speed: 1.9 // Rounds per second\r\n\t\t\t\t\t\t, trail: 60 // Afterglow percentage\r\n\t\t\t\t\t\t, fps: 20 // Frames per second when using setTimeout() as a fallback for CSS \r\n\t\t\t\t\t\t, className: 'spinner' // The CSS class to assign to the spinner\r\n\t\t\t\t\t};\r\n\t\t\t\t\tself.loaderInstance = new Spinner(spinConfig).spin(document.getElementById('fxp_loadercontainer'));\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t\tself.rootScope.loadingText = loader.loadingText || \"Loading\";\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n * Gets Broadcast Inline Loading from the Page Loader Service\r\n * @method Fxp.Services.PageLoaderService.fnBroadcastInlineLoading\r\n * @example Example to invoke fnBroadcastInlineLoading\r\n * PageLoaderService.fnBroadcastInlineLoading('loader');\r\n */\r\n\tfnBroadcastInlineLoading(loader) {\r\n\t\tthis.rootScope.$broadcast(FxpBroadcastedEvents.OnShowHideInlineLoader, loader);\r\n\t}\r\n\r\n\tprivate disablePageLoaderTimers() {\r\n\t\tthis.pageLoadTimers.forEach((timer) => this.timeout.cancel(timer));\r\n\t\tthis.pageLoadTimers = [];\r\n\t}\r\n}\r\n\r\n","//action creators for Banner\r\nimport { IAction } from 'redux-micro-frontend';\r\nimport { Notification, NotificationDTO } from \"./notifications.model\"\r\nimport { NotificationActionTypes } from './notifications.action.type';\r\n\r\nexport const PushNotification = (payload: Notification): IAction => {\r\n return {\r\n type: NotificationActionTypes.Push_Notification,\r\n payload: payload\r\n }\r\n}\r\nexport const MarkNotification = (payload: Notification): IAction => {\r\n return {\r\n type: NotificationActionTypes.Mark_Notification,\r\n payload: payload\r\n }\r\n}\r\nexport const DismissNotification = (payload: Notification): IAction => {\r\n return {\r\n type: NotificationActionTypes.Dismiss_Notification,\r\n payload: payload\r\n }\r\n}\r\nexport const ResetNotificationCollection = (payload: NotificationDTO): IAction => {\r\n return {\r\n type: NotificationActionTypes.Reset_Notification_Collection,\r\n payload: payload\r\n }\r\n}","export enum NotificationActionTypes {\r\n Push_Notification= \"Push_Notification\",\r\n Mark_Notification = \"Mark_Notification\",\r\n Dismiss_Notification = \"Dismiss_Notification\",\r\n Reset_Notification_Collection = \"Reset_Notification_Collection\"\r\n}","import { Reducer } from 'redux'\r\nimport { IAction } from 'redux-micro-frontend';\r\nimport { Notification, NotificationDTO } from \"./notifications.model\"\r\nimport { NotificationActionTypes } from './notifications.action.type';\r\nconst defaultState: NotificationDTO = {UserNotifications:[],UnreadNotificationCount:0};\r\n\r\n\r\nexport const NotificationReducer: Reducer> = (\r\n state: NotificationDTO = defaultState,\r\n action: IAction\r\n): NotificationDTO => {\r\n switch (action.type) {\r\n case NotificationActionTypes.Push_Notification: {\r\n return {UserNotifications:[action.payload,...state.UserNotifications],UnreadNotificationCount:state.UnreadNotificationCount+1};\r\n }\r\n case NotificationActionTypes.Dismiss_Notification: {\r\n var index = state.UserNotifications.indexOf(action.payload);\r\n var UserNotifications=[...state.UserNotifications.slice(0, index), ...state.UserNotifications.slice(index + 1)];\r\n if(action.payload.status.name==\"Read\")\r\n return {UserNotifications:UserNotifications,UnreadNotificationCount:state.UnreadNotificationCount}\r\n return {UserNotifications:UserNotifications,UnreadNotificationCount:state.UnreadNotificationCount-1}\r\n \r\n }\r\n case NotificationActionTypes.Mark_Notification: {\r\n var index = state.UserNotifications.indexOf(action.payload);\r\n var notifications= [...state.UserNotifications.slice(0, index),action.payload, ...state.UserNotifications.slice(index + 1)];\r\n return {UserNotifications:notifications,UnreadNotificationCount:state.UnreadNotificationCount-1};\r\n }\r\n case NotificationActionTypes.Reset_Notification_Collection: {\r\n return action.payload;\r\n }\r\n }\r\n\r\n return state;\r\n}","//action creators for OBO Entity\r\nimport { IAction } from 'redux-micro-frontend';\r\nimport { OBOEntity } from \"./obo.model\"\r\nimport { OBOActionTypes } from './obo.action.types';\r\n\r\nexport const AddOBOEntity = (payload: OBOEntity): IAction => {\r\n return {\r\n type: OBOActionTypes.ADD_OBO_ENTITY,\r\n payload: payload\r\n }\r\n}\r\nexport const RemoveOBOEntity = (): IAction => {\r\n return {\r\n type: OBOActionTypes.REMOVE_OBO_ENTITY,\r\n payload: {} as OBOEntity\r\n }\r\n}","export enum OBOActionTypes {\r\n ADD_OBO_ENTITY=\"ADD_OBO_ENTITY\",\r\n REMOVE_OBO_ENTITY=\"REMOVE_OBO_ENTITY\",\r\n \r\n}","import { Reducer } from 'redux';\r\nimport { IAction } from 'redux-micro-frontend';\r\nimport { OBOEntity } from './obo.model';\r\nimport { OBOActionTypes } from './obo.action.types';\r\n\r\nconst defaultOBOEntity: OBOEntity = {} as OBOEntity\r\n\r\nexport const OBOReducer: Reducer> = (\r\n state: OBOEntity = defaultOBOEntity,\r\n action: IAction): OBOEntity => {\r\n switch (action.type) {\r\n case OBOActionTypes.ADD_OBO_ENTITY :{\r\n return action.payload\r\n \r\n }\r\n case OBOActionTypes.REMOVE_OBO_ENTITY:{\r\n return {} as OBOEntity\r\n }\r\n }\r\n return state;\r\n}","import { ProfileActionTypes } from './profile.action.types';\r\nimport {Profile} from './profile.model';\r\nimport { IAction } from 'redux-micro-frontend';\r\nexport const AddLoggedInUserProfile = (userProfile: Profile): IAction => ({\r\n type: ProfileActionTypes.ADD_LOGGED_IN_USER_PROFILE,\r\n payload: userProfile,\r\n logEnabled: false\r\n});\r\nexport const AddCurrentUserProfile = (userProfile: Profile): IAction => ({\r\n type: ProfileActionTypes.ADD_CURRENT_USER_PROFILE,\r\n payload: userProfile,\r\n logEnabled: false\r\n});","export enum ProfileActionTypes {\r\n ADD_CURRENT_USER_PROFILE=\"ADD_CURRENT_USER_PROFILE\",\r\n ADD_LOGGED_IN_USER_PROFILE=\"ADD_LOGGED_IN_USER_PROFILE\"\r\n}","import { Reducer } from 'redux';\r\nimport { IAction } from 'redux-micro-frontend';\r\nimport { Profile } from './profile.model';\r\nimport { ProfileActionTypes } from './profile.action.types';\r\n\r\nconst defaultProfile: Profile = {} as Profile\r\n\r\nexport const ProfileReducer: Reducer> = (\r\n state: Profile = defaultProfile,\r\n action: IAction): Profile => {\r\n\r\n if (action.type == ProfileActionTypes.ADD_CURRENT_USER_PROFILE || action.type == ProfileActionTypes.ADD_LOGGED_IN_USER_PROFILE) {\r\n return action.payload\r\n\r\n }\r\n return state;\r\n}","import { AbstractLogger } from 'redux-micro-frontend';\r\nimport { LogPropertyBag } from '../../js/telemetry/LogPropertyBag';\r\nimport { ILogger as IFxpLogger } from '../../js/interfaces/ILogger';\r\nimport { ErrorSeverityLevel } from '../../js/telemetry/ErrorSeverityLevel';\r\nimport { ErrorCodes } from '../../js/constants/errorCodes';\r\nimport { TelemetryConstants } from '../../js/telemetry/TelemetryConst';\r\n\r\nexport class ActionLoggerAdapter extends AbstractLogger {\r\n private _source: string = `${TelemetryConstants.FXP_TELEMETRY_BASE_NAME}.Store.ActionLogger`;\r\n private _eventBase: string =`${TelemetryConstants.FXP_TELEMETRY_BASE_NAME}.Store`; \r\n\r\n constructor(private _fxpLogger: IFxpLogger) {\r\n super(\"FXP_APP_INSIGHTS_LOGGER\");\r\n }\r\n\r\n processEvent(source: string, eventName: string, properties: any): void {\r\n let propertyBag = this.CreatePropertyBag(properties);\r\n this._fxpLogger.logEvent(this._source, `${this._eventBase}.${eventName}`, propertyBag);\r\n }\r\n\r\n processException(source: string, error: Error, properties: any): void {\r\n let propertyBag = this.CreatePropertyBag(properties);\r\n this._fxpLogger.logException(this._source, error, propertyBag, null, null, ErrorSeverityLevel.Medium, ErrorCodes.ReduxStoreException);\r\n }\r\n\r\n private CreatePropertyBag(properties: any): LogPropertyBag {\r\n let propertyBag = this._fxpLogger.createPropertyBag();\r\n if (properties !== undefined && properties !== null && Object.keys(properties).length) {\r\n Object.keys(properties).forEach(key => {\r\n propertyBag.addToBag(key, properties[key]);\r\n });\r\n }\r\n return propertyBag;\r\n }\r\n}","import { AppStatusReducer } from '../init/app.status.reducer';\r\nimport { AdminTileReducer } from '../adminTiles/adminTiles.reducer';\r\nimport {BannerReducer} from '../banner/banner.reducer'\r\nimport { Reducer, combineReducers } from 'redux';\r\nimport { LoaderReducer } from '../loader/loader.reducer';\r\nimport { LoggedInUserReducer,CurrentUserReducer } from '../user/user.reducer';\r\nimport { OBOReducer } from '../obo/obo.reducer';\r\nimport { LeftNavigationReducer } from '../leftNavigation/leftNavigation.reducer';\r\nimport { FeatureFlagReducer } from '../flighting/flighting.reducer';\r\nimport { SystemMessageReducer } from '../systemMessages/systemMessage.reducer';\r\nimport { NotificationReducer } from '../notifications/notifications.reducer';\r\n\r\nexport const PlatformReducer: Reducer = combineReducers({\r\n Status: AppStatusReducer,\r\n Banners: BannerReducer,\r\n LoggedInUser: LoggedInUserReducer,\r\n CurrentUser: CurrentUserReducer,\r\n OBO:OBOReducer,\r\n AdminTiles: AdminTileReducer,\r\n LeftNavigation: LeftNavigationReducer,\r\n SystemMessages: SystemMessageReducer,\r\n Loader: LoaderReducer,\r\n FeatureFlags: FeatureFlagReducer,\r\n Notifications: NotificationReducer\r\n});","import { Store } from 'redux';\r\nimport { GlobalStore } from 'redux-micro-frontend';\r\nimport { PlatformReducer } from './platform.reducer';\r\nimport { IPlatformState } from './platform.state.model'\r\nimport { ActionLoggerAdapter } from './action.logger.adaptor';\r\nimport { ILogger as IFxpLogger } from '../../js/interfaces/ILogger';\r\nexport class PlatformStoreFactory {\r\n \r\n public static FxpStore: Store;\r\n static CreateIfNotExist(fxpLogger: IFxpLogger): Store {\r\n if (PlatformStoreFactory.FxpStore !== undefined && PlatformStoreFactory.FxpStore !== null) {\r\n return PlatformStoreFactory.FxpStore;\r\n }\r\n return this.Create(fxpLogger);\r\n }\r\n static Create(fxpLogger: IFxpLogger): Store {\r\n let actionLoggerAdaptor = fxpLogger !== undefined && fxpLogger !== null \r\n ? new ActionLoggerAdapter(fxpLogger)\r\n : null;\r\n \r\n let environment = window[\"FxpAppSettings\"].EnvironmentName;\r\n let debugMode = environment !== \"Production\";\r\n let globalStore = GlobalStore.Get(debugMode, actionLoggerAdaptor);\r\n if (actionLoggerAdaptor)\r\n globalStore.SetLogger(actionLoggerAdaptor);\r\n PlatformStoreFactory.FxpStore = globalStore.CreateStore(GlobalStore.Platform, PlatformReducer, [], [GlobalStore.AllowAll], false, true);\r\n return PlatformStoreFactory.FxpStore;\r\n }\r\n\r\n static Get(): Store {\r\n if (PlatformStoreFactory.FxpStore !== undefined && PlatformStoreFactory.FxpStore !== null) {\r\n return PlatformStoreFactory.FxpStore;\r\n }\r\n throw new Error(\"FXP Store hasn't been created\");\r\n }\r\n}","import { ISystemMessage } from \"./systemMessage.model\";\r\nimport { FxpConstants } from \"../../js/common/ApplicationConstants\";\r\nimport { FxpConfigurationService } from \"../../js/services/FxpConfiguration\";\r\nimport { SYSTEM_MESSAGE_UI } from \"../../js/constants/systemMessages.constants\";\r\nimport { ILogger } from \"../../js/interfaces/ILogger\";\r\nimport { TimeZoneHelper } from \"../../js/services/TimeZoneHelper\";\r\nimport { SystemMessagesService } from \"./SystemMessagesService\";\r\nimport { IRootScope } from \"../../js/interfaces/IRootScope\";\r\nimport { IFxPService } from \"../../js/interfaces/IFxpService\";\r\nimport { FxpSignalRService } from \"../../js/services/FxpSignalRClient\";\r\nimport { DashboardService } from \"../../js/services/dashboardService\";\r\nimport { FxpRouteService } from \"../../js/services/FxpRouteService\";\r\nimport { FxpGlobalStoreService } from \"../../js/services/fxp.global.store.service\";\r\nimport { IPlatformState } from \"../store/platform.state.model\";\r\nimport { TelemetryConstants } from \"../../js/telemetry/TelemetryConst\";\r\nimport { RemoveSystemMessage, UpsertSystemMessage } from \"./systemMessage.action\";\r\nimport { ErrorSeverityLevel } from \"../../js/telemetry/ErrorSeverityLevel\";\r\nimport { ErrorCodes } from \"../../js/constants/errorCodes\";\r\n\r\ndeclare var _: any;\r\n\r\nexport class PlannedDownTimeService implements IFxPService {\r\n\tprivate intervalTimeMinutes: number;\r\n\tprivate displayFlashBeforeMinutes: number;\r\n\tprivate errorCount = 0;\r\n\tprivate loadPromise: angular.IPromise;\r\n\tprivate plannedDownTimeCollection: Array = [];\r\n\r\n\tprivate systemAnnouncementCollection: Array = [];\r\n\tprivate isFlashVisible: boolean = false;\r\n\tprivate flashMessages: Array = [];\r\n\tprivate dismissedSysMessageIds: Array = [];\r\n\r\n\tpublic isSystemAnnouncementVisible: boolean = false;\r\n\tprivate systemAnnouncementMesage: string;\r\n\tprivate currentLeftNavItem: any;\r\n\tprivate systemDownMessage: string;\r\n\tprivate timeFormat = \"MM/DD/YYYY h:mm a z\";\r\n\tprivate unsubscribeFunction: any;\r\n\tprivate readonly signalREventName = \"onSystemMessageChange\";\r\n\tprivate readonly signalRTenant = \"FXP\";\r\n\tsourceForTelemetry: string = `${TelemetryConstants.FXP_TELEMETRY_BASE_NAME}.PlannedDownTimeService`;\r\n\r\n\tconstructor(private $timeout: any,\r\n\t\tprivate fxpConfiguration: FxpConfigurationService,\r\n\t\tprivate SystemMessagesService: SystemMessagesService,\r\n\t\tprivate TimeZoneHelper: TimeZoneHelper,\r\n\t\tprivate moment: any,\r\n\t\tprivate UiString: SYSTEM_MESSAGE_UI,\r\n\t\tprivate logger: ILogger,\r\n\t\tprivate $window: angular.IWindowService,\r\n\t\tprivate fxpSignalRService: FxpSignalRService,\r\n\t\tprivate dashboardService: DashboardService,\r\n\t\tprivate $rootScope: IRootScope,\r\n\t\tprivate fxpRouteService: FxpRouteService,\r\n\t\tprivate fxpGlobalStore: FxpGlobalStoreService) {\r\n\r\n\t\tthis.intervalTimeMinutes = fxpConfiguration.FxpAppSettings.FlashPollingIntervalInMinutes;\r\n\t\tthis.displayFlashBeforeMinutes = fxpConfiguration.FxpAppSettings.DisplayFlashBeforeMinutes;\r\n\t\t\r\n\t\tthis.dismissedSysMessageIds = localStorage['DismissedSystemMessages'] ? JSON.parse(localStorage['DismissedSystemMessages']) : [];\r\n\r\n\t\t// subscribe to platform state\r\n\t\tthis.fxpGlobalStore.SubscribeToPlatformState(\"Platform\", (platformState : IPlatformState) => {\r\n\t\t\tlet systemMessagesInState = platformState.SystemMessages;\r\n\t\t\tif(systemMessagesInState.length > 0) {\t\t\r\n\t\t\t\tthis.flashMessages = systemMessagesInState;\r\n\t\t\t\tthis.isFlashVisible = true;\r\n\t\t\t} else {\r\n\t\t\t\tthis.isFlashVisible = false;\r\n\t\t\t}\r\n\t\t});\r\n\t}\r\n\r\n\r\n\tpublic subscribeToSignalREvent() {\r\n\t\tif (!this.unsubscribeFunction) {\r\n\t\t\tthis.unsubscribeFunction = this.fxpSignalRService.subscribe(this.signalREventName, this.signalRTenant, this.onMessageFromSignalR.bind(this));\r\n\t\t}\r\n\t}\r\n\r\n\tpublic unsubscribeSignalREvent() {\r\n\t\tif (this.unsubscribeFunction) {\r\n\t\t\tthis.unsubscribeFunction();\r\n\t\t\tthis.unsubscribeFunction = null;\r\n\t\t}\r\n\t}\r\n\r\n\tprivate onMessageFromSignalR = function (response: any) {\r\n\t\tif (!response)\r\n\t\t\treturn;\r\n\r\n\t\tif (response.operation === \"edit\" || response.operation === \"delete\")\r\n\t\t\tthis.plannedDownTimeCollection = this.plannedDownTimeCollection.filter(x => x.id !== response.payLoadObject.id);\r\n\r\n\t\tthis.cleanSysMessageIdsInLocalStorage();\r\n\r\n\t\tif (response.operation === \"add\" || response.operation === \"edit\")\r\n\t\t\tthis.plannedDownTimeCollection = this.plannedDownTimeCollection.concat(response.payLoadObject);\r\n\r\n\t\t_.each(this.plannedDownTimeCollection, (item: ISystemMessage) => {\r\n\t\t\titem.startTime = this.TimeZoneHelper.convertUtcToLocal(this.moment.utc(item.startTime));\r\n\t\t\titem.endTime = this.TimeZoneHelper.convertUtcToLocal(this.moment.utc(item.endTime));\r\n\t\t});\r\n\r\n\t\tthis.updateFlash();\r\n\t}\r\n\r\n\tGetSystemAnnouncementMessageandUpdateFlash() {\r\n\t\tlet self = this;\r\n\t\tconst tenSeconds = 10000;\r\n\t\tself.$timeout(function () {\r\n\t\t\tself.SystemMessagesService.getSystemAnnoucementCollection()\r\n\t\t\t\t.then(onSystemAnnouncementSuccess.bind(self))\r\n\t\t\t\t.then(self.updateSystemAnnouncementFlash.bind(self))\r\n\t\t\t\t.catch(onRejected.bind(self));\r\n\t\t}, tenSeconds);\r\n\r\n\t\tfunction onSystemAnnouncementSuccess(response) {\r\n\t\t\tlet self = this;\r\n\r\n\t\t\tif (!response)\r\n\t\t\t\treturn;\r\n\r\n\t\t\tself.systemAnnouncementCollection = response;\r\n\r\n\t\t\t_.each(self.systemAnnouncementCollection, (item: ISystemMessage) => {\r\n\t\t\t\titem.startTime = self.TimeZoneHelper.convertUtcToLocal(self.moment.utc(item.startTime));\r\n\t\t\t\titem.endTime = self.TimeZoneHelper.convertUtcToLocal(self.moment.utc(item.endTime));\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\tfunction onRejected(error) {\r\n\t\t}\r\n\t}\r\n\r\n\tpollForPlannedDownTimesandUpdateFlash() {\r\n\t\tlet self = this;\r\n\t\tconst tenSeconds = 10000;\r\n\t\tself.$timeout(function () {\r\n\t\t\tself.SystemMessagesService.getPlannedDownTimeCollection()\r\n\t\t\t\t.then(onSuccess.bind(self))\r\n\t\t\t\t.then(self.updateFlash.bind(self))\r\n\t\t\t\t.catch(onRejected.bind(self))\r\n\t\t\t\t.finally(self.nextLoad.bind(self));\r\n\t\t}, tenSeconds);\r\n\r\n\t\tfunction onSuccess(response) {\r\n\t\t\tlet self = this;\r\n\r\n\t\t\tif (!response)\r\n\t\t\t\treturn;\r\n\r\n\t\t\tself.plannedDownTimeCollection = response;\r\n\r\n\t\t\t_.each(self.plannedDownTimeCollection, (item: ISystemMessage) => {\r\n\t\t\t\titem.startTime = self.TimeZoneHelper.convertUtcToLocal(self.moment.utc(item.startTime));\r\n\t\t\t\titem.endTime = self.TimeZoneHelper.convertUtcToLocal(self.moment.utc(item.endTime));\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\tfunction onRejected(error) {\r\n\t\t}\r\n\t};\r\n\r\n\tprivate pollForUpdateFlash() {\r\n\t\tlet self = this;\r\n\t\tself.updateFlash();\r\n\t\tself.nextLoad();\r\n\t}\r\n\r\n\tcancelNextLoad() {\r\n\t\tlet self = this;\r\n\t\tself.$timeout.cancel(self.loadPromise);\r\n\t};\r\n\r\n\tnextLoad() {\r\n\t\tlet self = this;\r\n\t\tself.cancelNextLoad();\r\n\t\tself.loadPromise = self.$timeout(self.pollForUpdateFlash.bind(self), self.intervalTimeMinutes * 60 * 1000);\r\n\t};\r\n\r\n\tpausePlannedDownTimesPoll() {\r\n\t\tvar self = this;\r\n\t\tif (self.loadPromise) {\r\n\t\t\tself.cancelNextLoad();\r\n\t\t}\r\n\t};\r\n\r\n\tresumePlannedDownTimesPoll() {\r\n\t\tvar self = this;\r\n\t\tself.pollForPlannedDownTimesandUpdateFlash();\r\n\t};\r\n\r\n\tupdateFlash() {\r\n\t\tlet self = this;\r\n\t\tif (!self.plannedDownTimeCollection || !self.currentLeftNavItem)\r\n\t\t\treturn;\r\n\r\n\t\tvar item = self.currentLeftNavItem;\r\n\t\tthis.isFlashVisible = false;\r\n\r\n\t\ttry {\r\n\t\t\tlet messagesToFlash: Array = [];\r\n\t\t\t_.each(self.plannedDownTimeCollection, (downTime: ISystemMessage) => {\r\n\t\t\t\tvar now = this.moment();\r\n\r\n\t\t\t\tif (self.isDownTimeConfigured(item, downTime)) {\r\n\t\t\t\t\t//Intermittent Message or Flash\r\n\t\t\t\t\tvar tempTime = downTime.startTime.clone();\r\n\t\t\t\t\tif (self.isSystemDown(downTime)) {\r\n\t\t\t\t\t\tthis.isFlashVisible = false;\r\n\t\t\t\t\t\tvar end = this.moment.tz(downTime.endTime, this.moment.tz.guess()).format(this.timeFormat);\r\n\t\t\t\t\t\tthis.systemDownMessage = downTime.message;\r\n\t\t\t\t\t\t//If any of the system down time message is active then break the loop.\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse if (now.isSameOrAfter(tempTime.subtract(self.displayFlashBeforeMinutes, \"minutes\"))\r\n\t\t\t\t\t\t&& now.isSameOrBefore(downTime.endTime)) {\r\n\t\t\t\t\t\t// check for the messageId in the localStorage, push if the id is not found.\r\n\t\t\t\t\t\tif(!this.dismissedSysMessageIds.includes(downTime.id)) {\r\n\t\t\t\t\t\t\tmessagesToFlash.push(downTime);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t};\r\n\t\t\t});\r\n\t\t\tthis.fxpGlobalStore.DispatchGlobalAction(\"Platform\", UpsertSystemMessage(messagesToFlash));\r\n\t\t}\r\n\t\tcatch (e) {\r\n \t\tself.logger.logException(`${this.sourceForTelemetry}.UpdateFlash`, e, null, null, null, ErrorSeverityLevel.Medium, ErrorCodes.PlannedDownTime_UpdateFlash_Failure);\r\n\t\t}\r\n\r\n\t};\r\n\r\n\tupdateSystemAnnouncementFlash() {\r\n\t\tlet self = this;\r\n\t\tif (!self.systemAnnouncementCollection || !self.currentLeftNavItem)\r\n\t\t\treturn;\r\n\r\n\t\tvar item = self.currentLeftNavItem;\r\n\t\tthis.systemAnnouncementMesage = '';\r\n\t\tthis.isSystemAnnouncementVisible = false;\r\n\r\n\t\ttry {\r\n\t\t\t_.each(self.systemAnnouncementCollection, (downTime: ISystemMessage) => {\r\n\t\t\t\tvar now = this.moment();\r\n\r\n\t\t\t\tif (self.isDownTimeConfigured(item, downTime)) {\r\n\t\t\t\t\t//Intermittent Message or Flash\r\n\t\t\t\t\tvar tempTime = downTime.startTime.clone();\r\n\t\t\t\t\tif (now.isSameOrAfter(tempTime.subtract(self.displayFlashBeforeMinutes, \"minutes\"))\r\n\t\t\t\t\t\t&& now.isSameOrBefore(downTime.endTime)) {\r\n\r\n\t\t\t\t\t\tthis.systemAnnouncementMesage = self.concatenateFlashMessage(this.systemAnnouncementMesage, downTime);\r\n\t\t\t\t\t\tthis.isSystemAnnouncementVisible = true;\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t}\r\n\t\tcatch (e) {\r\n\t\t\tself.logger.logException(`${this.sourceForTelemetry}.UpdateSystemAnnouncementFlash`, e, null, null, null, ErrorSeverityLevel.Medium, ErrorCodes.PlannedDownTime_UpdateSystemAccouncement_Failure);\r\n\t\t}\r\n\t};\r\n\r\n\tisDownTimeConfigured(item: any, downTime: ISystemMessage) {\r\n\r\n\t\t//Return true when capability is All. Id for All is 0.\r\n\t\tif (downTime.businessCapability[0].id == 0) {\r\n\t\t\treturn true;\r\n\t\t} else if (this.isMessageConfiguredOnLeftNav(item, downTime)) {\r\n\t\t\treturn true;\r\n\t\t} else {\r\n\t\t\tvar leftNavLinks = this.dashboardService.getCachedLeftNavForCurrentUser();\r\n\t\t\tif (leftNavLinks === undefined || leftNavLinks === null || leftNavLinks.length <= 0)\r\n\t\t\t\treturn false;\r\n\t\t\tvar dashboardItem = leftNavLinks.find(item => item.id == 100);\r\n\t\t\tif(dashboardItem)\r\n\t\t\t\tdashboardItem.targetUIStateName = this.fxpRouteService.getDefaultStateName();\r\n\t\t\t\r\n\t\t\tvar leftNavItemsWithCurrentState = leftNavLinks.filter(function (leftNav) {\r\n\t\t\t\treturn (leftNav.targetUIStateName && leftNav.targetUIStateName.toLowerCase() === item.targetUIStateName.toLowerCase());\r\n\t\t\t});\r\n\t\t\tif (leftNavItemsWithCurrentState === undefined || leftNavItemsWithCurrentState === null || leftNavItemsWithCurrentState.length <= 0)\r\n\t\t\t\treturn false;\r\n\t\t\tlet isSystemMessageVisible = false;\r\n\t\t\tleftNavItemsWithCurrentState.forEach(selectedItem => {\r\n\t\t\t\tif (this.isMessageConfiguredOnLeftNav(selectedItem, downTime))\r\n\t\t\t\t\tisSystemMessageVisible = true;\r\n\t\t\t});\r\n\t\t\treturn isSystemMessageVisible;\r\n\t\t}\r\n\t}\r\n\r\n\tprivate isMessageConfiguredOnLeftNav(item: any, downTime: ISystemMessage) {\r\n\t\treturn (item.id == downTime.businessCapability[0].id\r\n\t\t\t|| (downTime.businessFunction.length > 0\r\n\t\t\t\t&& item.id == downTime.businessFunction[0].id)\r\n\t\t\t|| (item.parentId == downTime.businessCapability[0].id\r\n\t\t\t\t&& downTime.businessFunction[0].id == 0));\r\n\t}\r\n\r\n\tisSystemDown(downTime: ISystemMessage) {\r\n\t\tvar now = this.moment();\r\n\r\n\t\tif (downTime.messageType == \"SystemDown\"\r\n\t\t\t&& now.isAfter(downTime.startTime)\r\n\t\t\t&& now.isSameOrBefore(downTime.endTime))\r\n\t\t\treturn true;\r\n\r\n\t\treturn false;\r\n\t}\r\n\r\n\tconcatenateFlashMessage(message: string, downTime: ISystemMessage) {\r\n\t\tlet tempMessage = message;\r\n\r\n\t\tif (tempMessage != '')\r\n\t\t\ttempMessage = tempMessage + '
';\r\n\r\n\t\ttempMessage = tempMessage + downTime.message;\r\n\r\n\t\treturn tempMessage;\r\n\t}\r\n\r\n\tisStateDown(stateName) {\r\n\t\tvar self = this;\r\n\r\n\t\tif (!self.plannedDownTimeCollection || !self.currentLeftNavItem)\r\n\t\t\treturn false;\r\n\r\n\t\tvar item = self.currentLeftNavItem;\r\n\t\tvar systemDown = false;\r\n\r\n\t\t_.each(self.plannedDownTimeCollection, (downTime: ISystemMessage) => {\r\n\r\n\t\t\tif (self.isDownTimeConfigured(item, downTime)) {\r\n\t\t\t\tif (self.isSystemDown(downTime)) {\r\n\r\n\t\t\t\t\tvar downStateName = item.targetUIStateName || item.targetURL || item.targetEventName;\r\n\r\n\t\t\t\t\tif (stateName == downStateName) {\r\n\t\t\t\t\t\tsystemDown = true;\r\n\t\t\t\t\t\treturn true;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t});\r\n\t\treturn systemDown;\r\n\t}\r\n\r\n\tcloseSystemAnnouncement() {\r\n\t\tvar self = this;\r\n\t\tself.isSystemAnnouncementVisible = false;\r\n\t\tself.$rootScope.isSystemAnnouncementVisible = false;\r\n\t}\r\n\r\n\t/**\r\n\t * Closes the specific SytemMessage when dismissed. \r\n\t * @param messageId - id of the System Message to be removed\r\n\t */\r\n\tprivate closeSystemMessage(messageId) {\r\n\t\tvar self = this;\r\n\t\t// push the messageId to the dismissedSystemMessages in local storage.\r\n\t\tthis.dismissedSysMessageIds.push(messageId)\r\n\t\tlocalStorage['DismissedSystemMessages'] = JSON.stringify(this.dismissedSysMessageIds);\r\n\t\tself.fxpGlobalStore.DispatchGlobalAction(\"Platform\", RemoveSystemMessage(messageId));\r\n\t}\r\n\r\n\t/**\r\n\t * Cleans the dismissedSysMessageId in local storage by comparing with plannedDownTimeCollection. \r\n\t */\r\n\tprivate cleanSysMessageIdsInLocalStorage() {\r\n\t\tthis.dismissedSysMessageIds = this.dismissedSysMessageIds.filter(id => this.plannedDownTimeCollection.some(sysMessage => sysMessage.id === id));\r\n\t\tlocalStorage['DismissedSystemMessages'] = JSON.stringify(this.dismissedSysMessageIds);\r\n\t}\r\n}\r\n","import { ISystemMessagesService } from \"./ISystemMessagesService\";\r\nimport { FxpConfigurationService } from \"../../js/services/FxpConfiguration\";\r\nimport { ISystemMessage } from \"./systemMessage.model\";\r\nimport { UserInfoService } from \"../../js/services/UserInfoService\";\r\nimport { IHttpPromise, IPromise } from \"angular\";\r\nimport { IFxPService } from \"../../js/interfaces/IFxpService\";\r\n\r\nexport class SystemMessagesService implements ISystemMessagesService,IFxPService {\r\n\tprivate systemMessagesEndPoint: string;\r\n\tprivate allSystemMessagesEndpoint: string[];\r\n\r\n\tprivate allSystemAnnouncementEndpoints: string[];\r\n\r\n\tconstructor(private http: angular.IHttpService,\r\n\t\tprivate fxpConfiguration: FxpConfigurationService, private $q: angular.IQService, private userInfoService: UserInfoService) {\r\n\t\tthis.systemMessagesEndPoint = this.fxpConfiguration.FxpAppSettings.FxpServiceEndPoint + \"/systemmessages\";\r\n\t\tthis.allSystemMessagesEndpoint = this.fxpConfiguration.FxpAppSettings.SystemMessageEndpoints.split(',');\r\n\t\tthis.allSystemAnnouncementEndpoints = this.fxpConfiguration.FxpAppSettings.SystemAnnouncementEndpoints.split(',');\r\n\t}\r\n\r\n\tgetSystemMessagesCollectionAsync = (messageCount: number, pageOffset: number, sortOrder: string): IHttpPromise> => {\r\n\t\tlet params = {\r\n\t\t\t'pageSize': messageCount,\r\n\t\t\t'pageNo': pageOffset,\r\n\t\t\t'sortOrder': sortOrder\r\n\t\t};\r\n\t\treturn this.http.get(this.systemMessagesEndPoint, { params: params });\r\n\t}\r\n\r\n\tsaveSystemMessageAsync = (systemMessage: ISystemMessage): IPromise => {\r\n\t\treturn this.http.post(this.systemMessagesEndPoint, systemMessage, { headers: { 'Content-Type': 'application/json' } });\r\n\t}\r\n\r\n\tdeleteSystemMessageAsync = (systemMessageId: string): IPromise => {\r\n\t\tlet params = { 'id': systemMessageId };\r\n\t\treturn this.http.delete(this.systemMessagesEndPoint, { params: params });\r\n\t}\r\n\r\n\tgetPlannedDownTimeCollection = (): IPromise> => {\r\n\t\tlet promises : Array>> = [];\r\n\t\tlet self = this;\r\n\t\tself.allSystemMessagesEndpoint.forEach(endpoint => { promises.push(this.getSystemMessages(endpoint))})\r\n\t\treturn this.$q.all(promises).then((results: Array>) => {\r\n\t\t\treturn results.reduce((acc, val) => acc.concat(val), []);\r\n\t\t});\r\n\t}\r\n\r\n\tgetSystemAnnoucementCollection = (): IPromise> => {\r\n\t\tlet promises : Array>> = [];\r\n\t\tlet self = this;\r\n\t\tlet userAlias = self.userInfoService.getLoggedInUser();\r\n\t\tlet requestHeaders = {};\r\n\t\trequestHeaders[\"x-alias\"] = userAlias;\r\n\t\tself.allSystemAnnouncementEndpoints.forEach(endpoint => { promises.push(this.getSystemMessages(endpoint, requestHeaders))})\r\n\t\treturn this.$q.all(promises).then((results: Array>) => {\r\n\t\t\t// append all the api results in a single array\r\n\t\t\treturn results.reduce((acc, val) => acc.concat(val), []);\r\n\t\t});\r\n\t}\r\n\r\n\tgetSystemMessages(url: string, headers?: any) : IPromise> {\r\n\t\treturn this.http.get(url, { headers: headers })\r\n\t\t\t.then(response => (response.data).systemMessages);\r\n\t}\r\n}","import { IAction } from 'redux-micro-frontend';\r\nimport { SystemMessageActions } from \"./systemMessage.action.types\";\r\nimport { ISystemMessage } from \"./systemMessage.model\";\r\n\r\nexport const UpsertSystemMessage = (payload: Array): IAction> => {\r\n return { \r\n type: SystemMessageActions.UPSERT_SYSTEM_MESSAGE,\r\n payload: payload\r\n } \r\n}\r\n\r\nexport const RemoveSystemMessage = (payload: string): IAction => {\r\n return {\r\n type: SystemMessageActions.REMOVE_SYSTEM_MESSAGE,\r\n payload: payload\r\n }\r\n}","export enum SystemMessageActions {\r\n UPSERT_SYSTEM_MESSAGE = \"UPSERT_SYSTEM_MESSAGE\",\r\n REMOVE_SYSTEM_MESSAGE = \"REMOVE_SYSTEM_MESSAGE\"\r\n}","import { IAction } from 'redux-micro-frontend';\r\nimport { Reducer } from \"redux\";\r\nimport { SystemMessageActions } from \"./systemMessage.action.types\";\r\nimport { ISystemMessage } from \"./systemMessage.model\";\r\n\r\n\r\nlet defaultState: Array = [];\r\n\r\nexport const SystemMessageReducer: Reducer, IAction | string>> = (\r\n state: Array = defaultState,\r\n action: IAction\r\n): Array => {\r\n\r\n switch(action.type) {\r\n case SystemMessageActions.UPSERT_SYSTEM_MESSAGE: {\r\n return (action.payload === undefined || action.payload === null) ? defaultState : action.payload; \r\n }\r\n case SystemMessageActions.REMOVE_SYSTEM_MESSAGE: {\r\n return state.filter(message => message.id !== action.payload)\r\n }\r\n }\r\n return state;\r\n}\r\n","declare type moment = any;\r\ndeclare type IStateService = any;\r\nimport { IActOnBehalfOfControllerScope } from \"../../js/interfaces/IActOnBehalfOfControllerScope\";\r\nimport { ILogger } from \"../../js/interfaces/ILogger\";\r\nimport { FxpMessageService } from \"../banner/FxpMessageService\";\r\nimport {\r\n FxpConstants,\r\n ApplicationConstants,\r\n} from \"../../js/common/ApplicationConstants\";\r\nimport { OBOUserService } from \"../../js/services/OBOUserService\";\r\nimport { IFxpContext } from \"../../js/interfaces/IFxpContext\";\r\nimport { IRootScope } from \"../../js/interfaces/IRootScope\";\r\nimport { UserProfileService } from \"../../js/services/userProfileService\";\r\nimport { UserInfoService } from \"../../js/services/UserInfoService\";\r\nimport { LogPropertyBag } from \"../../js/telemetry/LogPropertyBag\";\r\nimport { TelemetryContext } from \"../../js/telemetry/telemetrycontext\";\r\nimport { FxpConfigurationService } from \"../../js/services/FxpConfiguration\";\r\nimport { PageLoaderService } from \"../../app/loader/pageLoaderService\";\r\nimport { CommonUtils } from \"../../js/utils/CommonUtils\";\r\nimport { ActOnBehalfOfHelper } from \"../../js/factory/ActOnBehalfOfHelper\";\r\nimport { FxpRouteService } from \"../../js/services/FxpRouteService\";\r\nimport { SettingsServiceProvider } from \"../../js/provider/SettingsServiceProvider\";\r\nimport { FxpContext } from \"../../js/context/FxpContext\";\r\nimport { SettingsType } from \"../../js/common/SettingsType\";\r\nimport { Resiliency } from \"../../js/resiliency/FxpResiliency\";\r\nimport { SYSTEM_MESSAGE_UI } from \"../../js/constants/systemMessages.constants\";\r\nimport { IPersonalizationService } from \"../../js/interfaces/IPersonalizationService\";\r\nimport { TimeZoneHelper } from \"../../js/services/TimeZoneHelper\";\r\nimport { ISystemMessage } from \"./systemMessage.model\";\r\nimport { ISystemMessagesService } from \"./ISystemMessagesService\";\r\n\r\nimport ng = angular;\r\nimport {\r\n HideSpecificLoader,\r\n ShowSpecificLoader,\r\n} from \"../../app/loader/loader.actions\";\r\nimport { FxpGlobalStoreService } from \"../../js/services/fxp.global.store.service\";\r\nimport { UI_LOADER_NAMES } from \"../loader/UILoader.constants\";\r\nimport { TelemetryConstants } from \"../../js/telemetry/TelemetryConst\";\r\nimport { ErrorCodes } from \"../../js/constants/errorCodes\";\r\nimport { ErrorSeverityLevel } from \"../../js/telemetry/ErrorSeverityLevel\";\r\nimport { FeatureUsageEvent } from \"../../js/telemetry/FeatureUsageEvent\";\r\nimport {\r\n ActionStatus,\r\n ActionType,\r\n ComponentType,\r\n EventName,\r\n} from \"@microsoftit/telemetry-extensions-npm\";\r\ndeclare var _: any;\r\n\r\ntype SystemMessagesModalTypes = \"NONE\" | \"ADD\" | \"EDIT\" | \"DELETE\";\r\ntype SortOrder = \"ASC\" | \"DESC\";\r\n\r\nconst SystemMessageFeature = `${TelemetryConstants.FXP_TELEMETRY_BASE_NAME}.Administration.SystemMessage`;\r\nconst SystemMessageFeatureActions = {\r\n list: \"ViewSystemMessages\",\r\n add: \"AddSystemMessage\",\r\n update: \"UpdateSystemMessage\",\r\n delete: \"DeleteSystemMessage\",\r\n};\r\n\r\nexport class SystemMessagesController {\r\n startDateModel: Date = new Date();\r\n startTimeModel: Date = new Date();\r\n endDateModel: Date = new Date();\r\n endTimeModel: Date = new Date();\r\n name = \"Fxp.Controllers.SystemMessagesController\";\r\n systemMessageCollection: Array = [];\r\n systemMessage: ISystemMessage = null;\r\n messageCountCollection = [10, 20, 30];\r\n messageCount: number;\r\n messagePerPageCount = 10;\r\n pageCount: number = 1;\r\n currentPage: number = 1;\r\n validPreviousPageNumber: number = 1;\r\n sortOrder: SortOrder = \"DESC\";\r\n loggedInUser: string;\r\n modalType: SystemMessagesModalTypes = \"NONE\";\r\n businessCapabilityCollection: any;\r\n businessFunctionCollection: any;\r\n systemMessageDateStringFormat = \"MM/DD/YY H:mm A\";\r\n maxMessageLength: number = 1000;\r\n minDateTime: Date = new Date();\r\n systemMessageTimeZone = Intl.DateTimeFormat().resolvedOptions().timeZone;\r\n systemMessageTimeZoneCode: string;\r\n sourceForTelemetry: string = `${TelemetryConstants.FXP_TELEMETRY_BASE_NAME}.SystemMessagesController`;\r\n systemMessageFeatureEvent: FeatureUsageEvent;\r\n startDatePopup = {\r\n opened: false,\r\n };\r\n endDatePopup = {\r\n opened: false,\r\n };\r\n startDatepickerOptions = {\r\n showWeeks: false,\r\n minDate: new Date(),\r\n };\r\n endDatepickerOptions = {\r\n showWeeks: false,\r\n minDate: this.startDateModel,\r\n };\r\n datePickerFormat = \"MM-dd-yyyy\";\r\n constructor(\r\n private scope: any,\r\n private logger: ILogger,\r\n private fxpMessageService: FxpMessageService,\r\n private TimeZoneHelper: TimeZoneHelper,\r\n private SystemMessagesService: ISystemMessagesService,\r\n private PersonalizationService: IPersonalizationService,\r\n private fxpGlobalStoreService: FxpGlobalStoreService,\r\n private UserInfoService: UserInfoService,\r\n public UiString: SYSTEM_MESSAGE_UI,\r\n private $timeout: any\r\n ) {\r\n let addMessageButton: any;\r\n scope.smCtrl = this;\r\n logger.renewCorrelationId();\r\n this.loggedInUser = UserInfoService.getLoggedInUserUpn();\r\n this.populateSystemMessagesCollection();\r\n this.cacheBusinessCapabilityL0List();\r\n this.systemMessageTimeZoneCode = TimeZoneHelper.getCurrentTimeZoneCode(\r\n this.systemMessageTimeZone\r\n );\r\n addMessageButton = $(\".system-message-body .add-message\");\r\n if (addMessageButton) {\r\n addMessageButton.focus();\r\n }\r\n }\r\n\r\n private populateSystemMessagesCollection = (): void => {\r\n var self = this;\r\n self.fxpGlobalStoreService.DispatchGlobalAction(\r\n \"Platform\",\r\n ShowSpecificLoader({\r\n name: UI_LOADER_NAMES.FXP_LOADERS\r\n .SYSTEM_MESSAGE_POPULATE_MESSAGE_LOADER,\r\n loadingText: SYSTEM_MESSAGE_UI.LOADING_TEXTS.FETCHING_MESSAGES,\r\n })\r\n );\r\n self.SystemMessagesService.getSystemMessagesCollectionAsync(\r\n self.messagePerPageCount,\r\n self.currentPage,\r\n self.sortOrder\r\n )\r\n .then(onSuccess)\r\n .catch(onRejected)\r\n .finally(() => {\r\n self.fxpGlobalStoreService.DispatchGlobalAction(\r\n \"Platform\",\r\n HideSpecificLoader({\r\n name: UI_LOADER_NAMES.FXP_LOADERS\r\n .SYSTEM_MESSAGE_POPULATE_MESSAGE_LOADER,\r\n })\r\n );\r\n });\r\n\r\n function onSuccess(response) {\r\n try {\r\n self.systemMessageCollection = response.data.systemMessages;\r\n self.messageCount = response.data.recordCount;\r\n self.pageCount = calcuatePageCount();\r\n\r\n _.each(self.systemMessageCollection, (item: ISystemMessage) => {\r\n convertMessageUtcTimeZoneToPacificTime(item);\r\n mapMessageTypeToDisplayText(item);\r\n });\r\n\r\n self.systemMessageFeatureEvent = new FeatureUsageEvent(\r\n SystemMessageFeature,\r\n ActionType.User,\r\n SystemMessageFeatureActions.list,\r\n EventName.PageLoad,\r\n ComponentType.Web\r\n );\r\n self.logger.logFeatureUsageEvent(\r\n self.sourceForTelemetry,\r\n self.systemMessageFeatureEvent\r\n );\r\n } catch (error) {\r\n onRejected(error);\r\n }\r\n }\r\n function calcuatePageCount() {\r\n return Math.ceil(self.messageCount / self.messagePerPageCount);\r\n }\r\n\r\n function mapMessageTypeToDisplayText(item: ISystemMessage) {\r\n if (item.messageType.toLocaleLowerCase() === \"intermittent\")\r\n item.messageTypeDisplayText = \"Banner\";\r\n else item.messageTypeDisplayText = \"Maintenance Page\";\r\n }\r\n function convertMessageUtcTimeZoneToPacificTime(item: ISystemMessage) {\r\n item.startTime = self.TimeZoneHelper.convertToLocal(item.startTime);\r\n item.endTime = self.TimeZoneHelper.convertToLocal(item.endTime);\r\n }\r\n function updateStatus(item: ISystemMessage) {\r\n item.isActive = item.isActive\r\n ? SYSTEM_MESSAGE_UI.ACTIVE\r\n : SYSTEM_MESSAGE_UI.EXPIRED;\r\n }\r\n function onRejected(reason: any) {\r\n let errorMessage = SYSTEM_MESSAGE_UI.ERRORS.CANNOT_FETCH_SYSTEM_MESSAGE;\r\n self.fxpMessageService.addMessage(\r\n errorMessage,\r\n FxpConstants.messageType.error\r\n );\r\n self.logger.logError(\r\n `${self.sourceForTelemetry}.PopulateSystemMessagesCollection`,\r\n errorMessage,\r\n ErrorCodes.SystemMessage_Read_Collection_Rejection,\r\n reason,\r\n null,\r\n null,\r\n null,\r\n ErrorSeverityLevel.Medium\r\n );\r\n }\r\n };\r\n\r\n private cacheBusinessCapabilityL0List = (): void => {\r\n var self = this;\r\n self.PersonalizationService.getMasterLeftNavItems().then(\r\n onSuccess,\r\n onError\r\n );\r\n\r\n function onSuccess(response) {\r\n try {\r\n self.businessCapabilityCollection = getL0Collection();\r\n } catch (error) {\r\n onError(error);\r\n }\r\n\r\n function getL0Collection() {\r\n let L0Collection = _.map(response.data.result, L0Mapper);\r\n L0Collection = L0Collection.filter(function (element) {\r\n return element.name != \"Help\";\r\n });\r\n L0Collection.sort(function (obj1, obj2) {\r\n return obj1.name > obj2.name ? 1 : -1;\r\n });\r\n L0Collection.unshift({\r\n id: 0,\r\n name: \"All\",\r\n businessFunctionCollection: [{ id: 0, name: \"All\" }],\r\n });\r\n return L0Collection;\r\n }\r\n\r\n function L0Mapper(L0) {\r\n return {\r\n id: L0.id,\r\n name: L0.displayName,\r\n businessFunctionCollection: getL1Collection(L0),\r\n };\r\n\r\n function getL1Collection(L0) {\r\n let L1Collection = _.map(L0.children, forEachL1);\r\n L1Collection.unshift({ id: 0, name: \"All\" });\r\n return L1Collection;\r\n\r\n function forEachL1(L1) {\r\n return {\r\n id: L1.id,\r\n name: L1.displayName,\r\n };\r\n }\r\n }\r\n }\r\n }\r\n function onError(error) {\r\n let errorMessage =\r\n SYSTEM_MESSAGE_UI.ERRORS.CANNOT_FETCH_BBUSINESS_WORKFLOW;\r\n self.fxpMessageService.addMessage(\r\n errorMessage,\r\n FxpConstants.messageType.error\r\n );\r\n self.logger.logError(\r\n `${self.sourceForTelemetry}.CacheBusinessCapabilityL0List`,\r\n errorMessage,\r\n ErrorCodes.SystemMessage_Fetch_Business_Workflow,\r\n error,\r\n null,\r\n null,\r\n null,\r\n ErrorSeverityLevel.Medium\r\n );\r\n }\r\n };\r\n\r\n private getActionNameForFeatureUsage(modalType: SystemMessagesModalTypes) {\r\n switch (modalType) {\r\n case \"ADD\":\r\n return SystemMessageFeatureActions.add;\r\n case \"EDIT\":\r\n return SystemMessageFeatureActions.update;\r\n case \"DELETE\":\r\n return SystemMessageFeatureActions.delete;\r\n default:\r\n return \"\";\r\n }\r\n }\r\n showModal(\r\n modalType: SystemMessagesModalTypes,\r\n message: ISystemMessage = {} as any\r\n ): void {\r\n var self = this;\r\n this.logger.renewSubCorrelationId();\r\n self.systemMessageFeatureEvent = new FeatureUsageEvent(\r\n SystemMessageFeature,\r\n ActionType.User,\r\n self.getActionNameForFeatureUsage(modalType),\r\n EventName.ButtonClick,\r\n ComponentType.Web\r\n );\r\n self.logger.startFeatureUsageEvent(self.systemMessageFeatureEvent);\r\n self.systemMessage = setDefaultValues(message);\r\n self.modalType = modalType;\r\n updateBusinessFunctionL1Collection();\r\n\r\n setTimeout(function () {\r\n let controlToFocus = null;\r\n if (modalType == \"ADD\" || modalType == \"EDIT\") {\r\n controlToFocus = document.getElementById(\"addMessageClosePopup\");\r\n }\r\n if (modalType == \"DELETE\") {\r\n controlToFocus = document.getElementById(\"deleteMessageClosePopup\");\r\n }\r\n if (controlToFocus) {\r\n controlToFocus.focus();\r\n }\r\n }, 0);\r\n\r\n function setDefaultValues(message) {\r\n let systemMessage = _.defaults(angular.copy(message), getEmptyMessage());\r\n formatDates();\r\n mapDisplayTextToMessageType();\r\n return systemMessage;\r\n\r\n function getEmptyMessage() {\r\n return {\r\n id: \"\",\r\n messageTypeDisplayText: \"Banner\",\r\n startTime: self.TimeZoneHelper.getCurrentLocalDateTime(),\r\n endTime: self.TimeZoneHelper.addHoursToLocalUtcDateTime(1),\r\n businessCapability: [],\r\n businessFunction: [],\r\n startTimeString: \"\",\r\n endTimeString: \"\",\r\n };\r\n }\r\n\r\n function formatDates() {\r\n systemMessage.startTimeString = systemMessage.startTime.format(\r\n self.systemMessageDateStringFormat\r\n );\r\n systemMessage.endTimeString = systemMessage.endTime.format(\r\n self.systemMessageDateStringFormat\r\n );\r\n }\r\n\r\n function mapDisplayTextToMessageType() {\r\n if (\r\n systemMessage.messageTypeDisplayText.toLocaleLowerCase() === \"banner\"\r\n )\r\n systemMessage.messageType = \"Intermittent\";\r\n else systemMessage.messageType = \"SystemDown\";\r\n }\r\n }\r\n\r\n function updateBusinessFunctionL1Collection() {\r\n if (self.systemMessage.businessCapability.length > 0) {\r\n var businessCapability: any = _.find(\r\n self.businessCapabilityCollection,\r\n (item) => {\r\n return item.id == self.systemMessage.businessCapability[0].id;\r\n }\r\n );\r\n if (\r\n businessCapability &&\r\n businessCapability.businessFunctionCollection\r\n ) {\r\n self.businessFunctionCollection =\r\n businessCapability.businessFunctionCollection;\r\n }\r\n }\r\n }\r\n }\r\n hideModal(): void {\r\n this.modalType = \"NONE\";\r\n this.systemMessage = null;\r\n }\r\n addSystemMessage = (): void => {\r\n var self = this;\r\n\r\n self.systemMessage.createdBy = self.systemMessage.lastModifiedBy =\r\n this.loggedInUser;\r\n delete self.systemMessage.businessCapability[0].businessFunctionCollection;\r\n var request = angular.copy(self.systemMessage);\r\n request.startTime = self.TimeZoneHelper.convertToUtc(\r\n this.timeBuilder(this.startDateModel, this.startTimeModel)\r\n );\r\n request.endTime = self.TimeZoneHelper.convertToUtc(\r\n this.timeBuilder(this.endDateModel, this.endTimeModel)\r\n );\r\n self.fxpGlobalStoreService.DispatchGlobalAction(\r\n \"Platform\",\r\n ShowSpecificLoader({\r\n name: UI_LOADER_NAMES.FXP_LOADERS.SYSTEM_MESSAGE_ADD_MESSAGE_LOADER,\r\n loadingText: SYSTEM_MESSAGE_UI.LOADING_TEXTS.ADDING_MESSAGE,\r\n })\r\n );\r\n self.SystemMessagesService.saveSystemMessageAsync(request)\r\n .then(successCallback, onRejected)\r\n .finally(popupDestroy);\r\n\r\n function successCallback(response: any) {\r\n let successMessage = SYSTEM_MESSAGE_UI.SUCCESS.SYSTEM_MESSAGE_ADDED;\r\n self.$timeout(function () {\r\n self.fxpMessageService.addMessage(\r\n successMessage,\r\n FxpConstants.messageType.success\r\n );\r\n });\r\n let properties = self.logger.createPropertyBag();\r\n properties.addToBag(\r\n \"Message\",\r\n `System Messages successfully added with id: ${response.data.id}`\r\n );\r\n self.populateSystemMessagesCollection();\r\n self.systemMessageFeatureEvent.ActionStatus = ActionStatus.Succeeded;\r\n self.logger.endFeatureUsageEvent(\r\n `${self.sourceForTelemetry}.addSystemMessage.successCallback`,\r\n self.systemMessageFeatureEvent,\r\n properties\r\n );\r\n }\r\n\r\n function onRejected(reason: any) {\r\n let errorMessage = SYSTEM_MESSAGE_UI.ERRORS.CANNOT_ADD_SYSTEM_MESSAGE;\r\n self.fxpMessageService.addMessage(\r\n errorMessage,\r\n FxpConstants.messageType.error\r\n );\r\n self.logger.logError(\r\n `${self.sourceForTelemetry}.AddSystemMessage`,\r\n errorMessage,\r\n ErrorCodes.SystemMessage_Save_Failure,\r\n reason,\r\n null,\r\n null,\r\n null,\r\n ErrorSeverityLevel.Medium\r\n );\r\n self.systemMessageFeatureEvent.ActionStatus = ActionStatus.Failed;\r\n self.logger.endFeatureUsageEvent(\r\n `${self.sourceForTelemetry}.addSystemMessage.successCallback`,\r\n self.systemMessageFeatureEvent\r\n );\r\n }\r\n function popupDestroy() {\r\n self.hideModal.bind(self)();\r\n self.fxpGlobalStoreService.DispatchGlobalAction(\r\n \"Platform\",\r\n HideSpecificLoader({\r\n name: UI_LOADER_NAMES.FXP_LOADERS.SYSTEM_MESSAGE_ADD_MESSAGE_LOADER,\r\n })\r\n );\r\n }\r\n };\r\n updateSystemMessage = (): void => {\r\n var self = this;\r\n self.systemMessage.lastModifiedBy = this.loggedInUser;\r\n\r\n var request = angular.copy(self.systemMessage);\r\n delete request.businessCapability[0].businessFunctionCollection;\r\n delete request.endTimeString;\r\n delete request.startTimeString;\r\n\r\n request.startTime = self.TimeZoneHelper.convertToUtc(\r\n this.timeBuilder(this.startDateModel, this.startTimeModel)\r\n );\r\n request.endTime = self.TimeZoneHelper.convertToUtc(\r\n this.timeBuilder(this.endDateModel, this.endTimeModel)\r\n );\r\n\r\n self.fxpGlobalStoreService.DispatchGlobalAction(\r\n \"Platform\",\r\n ShowSpecificLoader({\r\n name: UI_LOADER_NAMES.FXP_LOADERS.SYSTEM_MESSAGE_UPDATE_MESSAGE_LOADER,\r\n loadingText: SYSTEM_MESSAGE_UI.LOADING_TEXTS.UPDATING_MESSAGE,\r\n })\r\n );\r\n self.SystemMessagesService.saveSystemMessageAsync(request)\r\n .then(successCallback, onRejected)\r\n .finally(popupDestroy);\r\n\r\n function successCallback(response: any) {\r\n let successMessage = SYSTEM_MESSAGE_UI.SUCCESS.SYSTEM_MESSAGE_UPDATED;\r\n self.$timeout(function () {\r\n self.fxpMessageService.addMessage(\r\n successMessage,\r\n FxpConstants.messageType.success\r\n );\r\n });\r\n let properties = self.logger.createPropertyBag();\r\n properties.addToBag(\r\n \"Message\",\r\n `System Message with id: ${response.data.id} updated`\r\n );\r\n self.logger.logInformation(\r\n `${self.sourceForTelemetry}.UpdateSystemMessage`,\r\n `${TelemetryConstants.FXP_TELEMETRY_BASE_NAME}.SystemMessageUpdated`\r\n );\r\n self.populateSystemMessagesCollection();\r\n self.systemMessageFeatureEvent.ActionStatus = ActionStatus.Succeeded;\r\n self.logger.endFeatureUsageEvent(\r\n `${self.sourceForTelemetry}.updateSystemMessage.successCallback`,\r\n self.systemMessageFeatureEvent,\r\n properties\r\n );\r\n }\r\n function onRejected(reason: any) {\r\n let errorMessage = SYSTEM_MESSAGE_UI.ERRORS.CANNOT_UPDATE_SYSTEM_MESSAGE;\r\n self.fxpMessageService.addMessage(\r\n errorMessage,\r\n FxpConstants.messageType.error\r\n );\r\n self.logger.logError(\r\n `${self.sourceForTelemetry}.UpdateSystemMessage`,\r\n errorMessage,\r\n ErrorCodes.SystemMessage_Update_Failure,\r\n reason,\r\n null,\r\n null,\r\n null,\r\n ErrorSeverityLevel.Medium\r\n );\r\n self.systemMessageFeatureEvent.ActionStatus = ActionStatus.Succeeded;\r\n self.logger.endFeatureUsageEvent(\r\n `${self.sourceForTelemetry}.updateSystemMessage.onRejected`,\r\n self.systemMessageFeatureEvent\r\n );\r\n }\r\n\r\n function popupDestroy() {\r\n self.hideModal.bind(self)();\r\n self.fxpGlobalStoreService.DispatchGlobalAction(\r\n \"Platform\",\r\n HideSpecificLoader({\r\n name: UI_LOADER_NAMES.FXP_LOADERS\r\n .SYSTEM_MESSAGE_UPDATE_MESSAGE_LOADER,\r\n })\r\n );\r\n }\r\n };\r\n deleteSystemMessage = (): void => {\r\n var self = this;\r\n self.fxpGlobalStoreService.DispatchGlobalAction(\r\n \"Platform\",\r\n ShowSpecificLoader({\r\n name: UI_LOADER_NAMES.FXP_LOADERS.SYSTEM_MESSAGE_DELETE_MESSAGE_LOADER,\r\n loadingText: SYSTEM_MESSAGE_UI.LOADING_TEXTS.DELETING_MESSAGE,\r\n })\r\n );\r\n self.SystemMessagesService.deleteSystemMessageAsync(self.systemMessage.id)\r\n .then(successCallback, onRejected)\r\n .finally(popupDestroy);\r\n\r\n function successCallback() {\r\n let successMessage = SYSTEM_MESSAGE_UI.SUCCESS.SYSTEM_MESSAGE_DELETED;\r\n self.$timeout(function () {\r\n self.fxpMessageService.addMessage(\r\n successMessage,\r\n FxpConstants.messageType.success\r\n );\r\n });\r\n let properties = self.logger.createPropertyBag();\r\n properties.addToBag(\r\n \"Message\",\r\n `System Message with ${self.systemMessage.id} Deleted Successfuly`\r\n );\r\n self.logger.logInformation(\r\n `${self.sourceForTelemetry}.DeleteSystemMessage`,\r\n `${TelemetryConstants.FXP_TELEMETRY_BASE_NAME}.SystemMessageDeleted`\r\n );\r\n if (areAllMessagesOfCurrentPageDeleted()) {\r\n self.currentPage--;\r\n self.changePage();\r\n }\r\n self.populateSystemMessagesCollection();\r\n\r\n self.systemMessageFeatureEvent.ActionStatus = ActionStatus.Succeeded;\r\n self.logger.endFeatureUsageEvent(\r\n `${self.sourceForTelemetry}.deleteSystemMessage.successCallback`,\r\n self.systemMessageFeatureEvent\r\n );\r\n\r\n function areAllMessagesOfCurrentPageDeleted() {\r\n return (\r\n self.currentPage >\r\n Math.ceil((self.messageCount - 1) / self.messagePerPageCount) &&\r\n self.currentPage > 1\r\n );\r\n }\r\n }\r\n function onRejected(reason: any) {\r\n let errorMessage = SYSTEM_MESSAGE_UI.ERRORS.CANNOT_DELETE_SYSTEM_MESSAGE;\r\n self.fxpMessageService.addMessage(\r\n errorMessage,\r\n FxpConstants.messageType.error\r\n );\r\n self.logger.logError(\r\n `${self.sourceForTelemetry}.DeleteSystemMessage`,\r\n errorMessage,\r\n ErrorCodes.SystemMessage_Delete_Failure,\r\n reason,\r\n null,\r\n null,\r\n null,\r\n ErrorSeverityLevel.Medium\r\n );\r\n self.systemMessageFeatureEvent.ActionStatus = ActionStatus.Failed;\r\n self.logger.endFeatureUsageEvent(\r\n `${self.sourceForTelemetry}.deleteSystemMessage.onRejected`,\r\n self.systemMessageFeatureEvent\r\n );\r\n }\r\n\r\n function popupDestroy() {\r\n self.hideModal.bind(self)();\r\n self.fxpGlobalStoreService.DispatchGlobalAction(\r\n \"Platform\",\r\n HideSpecificLoader({\r\n name: UI_LOADER_NAMES.FXP_LOADERS\r\n .SYSTEM_MESSAGE_DELETE_MESSAGE_LOADER,\r\n })\r\n );\r\n }\r\n };\r\n updateBusinessFunctionCollection = (): void => {\r\n if (this.systemMessage.businessCapability[0]) {\r\n this.businessFunctionCollection = angular.copy(\r\n this.systemMessage.businessCapability[0].businessFunctionCollection\r\n );\r\n this.systemMessage.businessFunction[0] =\r\n this.businessFunctionCollection[0];\r\n } else {\r\n this.businessFunctionCollection = this.systemMessage.businessFunction[0] =\r\n [];\r\n }\r\n };\r\n updateMessagePerPageCount = (): void => {\r\n this.currentPage = this.validPreviousPageNumber = 1;\r\n this.populateSystemMessagesCollection();\r\n };\r\n\r\n changePageOnKeydown(position: string) {\r\n if (\r\n angular.isDefined(this.currentPage) &&\r\n this.currentPage !== null &&\r\n this.currentPage > 0\r\n ) {\r\n this.changePage(false, position);\r\n }\r\n }\r\n resetPageNumberOnBlur() {\r\n if (this.currentPage != this.validPreviousPageNumber) {\r\n this.currentPage = this.validPreviousPageNumber;\r\n }\r\n }\r\n\r\n changePage(resetFocus: boolean = true, position: string = \"header\") {\r\n if (this.currentPage > this.pageCount) {\r\n this.currentPage = this.pageCount;\r\n }\r\n this.validPreviousPageNumber = this.currentPage;\r\n this.populateSystemMessagesCollection();\r\n\r\n if (!resetFocus) return;\r\n\r\n if (this.currentPage == 1) {\r\n setTimeout(() => {\r\n $(\"#pagination_nextpage_\" + position).focus();\r\n }, 0);\r\n }\r\n if (this.currentPage == this.pageCount) {\r\n setTimeout(() => {\r\n $(\"#pagination_previouspage_\" + position).focus();\r\n }, 0);\r\n }\r\n }\r\n\r\n loadNextPage = (position: string) => {\r\n this.currentPage = this.currentPage + 1;\r\n this.changePage(true, position);\r\n };\r\n\r\n loadPrevPage = (position: string) => {\r\n this.currentPage = this.currentPage - 1;\r\n this.changePage(true, position);\r\n };\r\n toggleSortOrder() {\r\n this.sortOrder = this.sortOrder == \"DESC\" ? \"ASC\" : \"DESC\";\r\n this.populateSystemMessagesCollection();\r\n }\r\n getStatusText(status) {\r\n return status ? SYSTEM_MESSAGE_UI.ACTIVE : SYSTEM_MESSAGE_UI.EXPIRED;\r\n }\r\n\r\n keyPressOnAddMessage(event: KeyboardEvent) {\r\n if (event.keyCode === 27) {\r\n this.hideModal();\r\n event.stopPropagation();\r\n }\r\n }\r\n\r\n startDateOpen() {\r\n this.startDatePopup.opened = true;\r\n }\r\n endDateOpen() {\r\n this.endDatePopup.opened = true;\r\n }\r\n timeBuilder(date: Date, time: Date): any {\r\n var dateValue = date.toISOString().split(\"T\")[0];\r\n var timeValue = time.toISOString().split(\"T\")[1];\r\n return dateValue + \"T\" + timeValue;\r\n }\r\n updateEndDateMinValue() {\r\n this.endDatepickerOptions.minDate = this.startDateModel;\r\n this.endDateModel = this.startDateModel;\r\n }\r\n\r\n timepickerSpinnersFocusable() {\r\n var spinners = document.querySelectorAll(\".fxp-timepicker a\");\r\n spinners.forEach((spinner) => {\r\n spinner.setAttribute(\"href\", \"\");\r\n });\r\n }\r\n}\r\n","import { ProfileReducer } from '../profile/profile.reducer';\r\nimport { Reducer, combineReducers } from 'redux';\r\nimport { ClaimsReducer } from '../claims/claims.reducer';\r\nimport { User } from './user.state.model';\r\nimport { IAction } from 'redux-micro-frontend';\r\nimport { Claims } from '../claims/claims.model';\r\nimport { ClaimsActionTypes } from '../claims/claims.action.types';\r\nimport { ProfileActionTypes } from '../profile/profile.action.types';\r\nimport { Profile } from '../profile/profile.model';\r\nvar defaultUser: User = {\r\n Profile: {} as Profile,\r\n Claims: {} as Claims\r\n}\r\nexport const LoggedInUserReducer: Reducer> = (\r\n state: User = defaultUser,\r\n action: IAction): User => {\r\n if (action.type == ClaimsActionTypes.ADD_LOGGED_IN_USER_CLAIMS || action.type == ProfileActionTypes.ADD_LOGGED_IN_USER_PROFILE) {\r\n\r\n return {\r\n Profile: ProfileReducer(state.Profile, action),\r\n Claims: ClaimsReducer(state.Claims, action)\r\n }\r\n }\r\n return state;\r\n}\r\nexport const CurrentUserReducer: Reducer> = (\r\n state: User = defaultUser,\r\n action: IAction): User => {\r\n if (action.type == ClaimsActionTypes.ADD_CURRENT_USER_CLAIMS || action.type ==ProfileActionTypes.ADD_CURRENT_USER_PROFILE) {\r\n\r\n return {\r\n Profile: ProfileReducer(state.Profile, action),\r\n Claims: ClaimsReducer(state.Claims, action)\r\n }\r\n }\r\n return state;\r\n}","export var ModuleName='fxptemplates';angular.module('fxptemplates', []).run(['$templateCache', function($templateCache) {$templateCache.put('actobo-header.html','
\\r\\n
    \\r\\n
  • {{oboUIStrings.ActingOnBehalfOf}}
  • \\r\\n
  • \\r\\n {{OBOUser.name}}\\r\\n {{OBOUser.name}}\\r\\n
  • \\r\\n
\\r\\n \\r\\n
');\n$templateCache.put('admin-landing.html','
\\r\\n\\t
\\r\\n\\t\\t
\\r\\n\\t\\t\\t

Welcome to ESXP

\\r\\n\\t\\t\\t

Administration

\\r\\n\\t\\t
\\r\\n\\t
\\r\\n\\t
\\r\\n\\t\\t\\r\\n\\t\\t\\t\\r\\n\\t\\t\\t\\t{{tabItem.tileGroupName}}\\r\\n\\t\\t\\t\\t
\\r\\n\\t\\t\\t\\t\\t\\r\\n\\t\\t\\t\\t
\\r\\n\\t\\t\\t
\\r\\n\\t\\t
\\r\\n\\t
\\r\\n
');\n$templateCache.put('author-notifications-list.html','
\\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 \\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 \\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 \\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 \\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 This is a much much longer notification which also has no re This is a much much longer notification which also has no re\\r\\n \\r\\n Thomas Jack, Ram Kanagala, Karthikeyan Ramakrishnan, Jumesh Sankar, Jan Smith, Fred Thomas\\r\\n 06/16/17 9:00am PSTActive
\\r\\n \\r\\n \\r\\n This is the body of the notification message\\r\\n \\r\\n All Role Groups\\r\\n 06/15/17 9:00am PSTActive
\\r\\n \\r\\n \\r\\n lorem ipsum dolor sit amet consectetur adipiscing elit sed do lorem ipsum dolor sit amet consectetur adipiscing elit sed do\\r\\n \\r\\n Relationship Manager (TAM, EM), Resources (Consultant, Delivery Manager,) Relationship Manager (TAM, EM), Resources (Consultant, Delivery Manager,)\\r\\n 06/13/17 9:00am PSTActive
\\r\\n \\r\\n \\r\\n This is the body of the notification message\\r\\n \\r\\n Relationship Manager (TAM, EM), Resources (Consultant, Delivery Manager,) Relationship Manager (TAM, EM), Resources (Consultant, Delivery Manager,)\\r\\n 06/12/17 9:00am PSTExpired
\\r\\n \\r\\n \\r\\n lorem ipsum dolor sit amet consectetur adipiscing elit sed do lorem ipsum dolor sit amet consectetur adipiscing elit sed do\\r\\n \\r\\n Thomas Jack, Ram Kanagala, Karthikeyan Ramakrishnan, Jumesh Sankar, Jan Smith, Fred Thomas\\r\\n 06/11/17 9:00am PSTExpired
\\r\\n \\r\\n \\r\\n lorem ipsum dolor sit amet consectetur adipiscing elit sed do lorem ipsum dolor sit amet consectetur adipiscing elit sed do\\r\\n \\r\\n Thomas Jack, Ram Kanagala, Karthikeyan Ramakrishnan, Jumesh Sankar, Jan Smith, Fred Thomas\\r\\n 06/10/17 9:00am PSTExpired
\\r\\n \\r\\n \\r\\n lorem ipsum dolor sit amet\\r\\n \\r\\n All Role Groups\\r\\n 06/09/17 9:00am PSTExpired
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n\\r\\n\\r\\n');\n$templateCache.put('browserExperience.html','\\r\\n\\r\\n
\\r\\n
\\r\\n\\t
\\r\\n\\t\\t
\\r\\n
\\r\\n \"New\\r\\n\\t\\t\\t\\t {{browserExperience.message}}\\r\\n
\\r\\n \\r\\n\\t\\t
\\r\\n\\t
\\r\\n
');\n$templateCache.put('footer.html','
\\r\\n
    \\r\\n
  • \\r\\n {{item.DisplayText}}\\r\\n \"{{item.DisplayText}}\"\\r\\n {{item.DisplayText}}\\r\\n {{item.DisplayText}}{{$eval(item.ExpressionName)}}\\r\\n
  • \\r\\n
\\r\\n
');\n$templateCache.put('fxpAuthorNotification.html','
\\r\\n\\t
\\r\\n\\t\\t
\\r\\n\\t\\t\\t

\\r\\n\\t\\t\\t

\\r\\n\\t\\t
\\r\\n\\t\\t
\\r\\n\\t\\t\\t
\\r\\n\\t\\t\\t\\t\\r\\n\\t\\t\\t\\t
\\r\\n\\t\\t\\t\\t\\t\\r\\n\\t\\t\\t\\t
\\r\\n\\t\\t\\t
\\r\\n\\t\\t\\t
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n

{{fxpUIConstants.UIStrings.AuthorNotificationStrings.NotificationMessageMaxLength - anCtrl.notificationMessage.length}}/{{::fxpUIConstants.UIStrings.AuthorNotificationStrings.NotificationMessageMaxLength}} characters remaining.

\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n\\t\\t\\t\\t
\\r\\n\\t\\t\\t
\\r\\n\\t\\t
\\r\\n\\t
\\r\\n
\\r\\n');\n$templateCache.put('fxpbreadcrumb.html','
\\r\\n \\r\\n
');\n$templateCache.put('fxpheader.html','
\\r\\n\\t
\\r\\n\\t\\t

\\r\\n\\t\\t\\t\\r\\n\\t\\t

\\r\\n\\t\\t\\r\\n\\t\\t

\\r\\n\\t\\t\\t\\t{{fxpheaderdata.DisplayText}}\\r\\n\\t\\t

\\r\\n\\t
\\r\\n\\t
\\r\\n\\t
\\r\\n\\r\\n\\t\\t
\\r\\n\\t\\t\\t\\r\\n\\t\\t
\\r\\n\\t\\t
\\r\\n\\t\\t\\t\\r\\n\\t\\t
\\r\\n\\t\\t
\\t\\t\\t\\r\\n\\t\\t\\t\\t\\t\\r\\n\\t\\t
\\r\\n\\t\\t
\\r\\n\\t\\t\\t\\r\\n\\t\\t
\\r\\n\\t\\t
\\r\\n\\t\\t\\t\\r\\n\\t\\t
\\r\\n\\t\\t
\\t\\t\\t\\t\\r\\n\\t\\t\\t
\\r\\n\\t\\t\\t\\t\\r\\n\\t\\t\\t\\t
\\r\\n\\t\\t\\t\\t
    \\r\\n\\t\\t\\t\\t\\t
  • \\r\\n\\r\\n\\t\\t\\t\\t\\t\\t
    \\r\\n\\t\\t\\t\\t\\t\\t\\t
    \\r\\n\\t\\t\\t\\t\\t\\t\\t\\t\"{{userProfile.displayName}}\"\\r\\n\\t\\t\\t\\t\\t\\t\\t
    \\r\\n\\t\\t\\t\\t\\t\\t\\t
    \\r\\n\\t\\t\\t\\t\\t\\t\\t\\t\\r\\n\\t\\t\\t\\t\\t\\t\\t\\t\\r\\n\\t\\t\\t\\t\\t\\t\\t\\t\\r\\n\\t\\t\\t\\t\\t\\t\\t
    \\r\\n\\t\\t\\t\\t\\t\\t
    \\r\\n\\t\\t\\t\\t\\t\\t
    \\t\\t\\t\\t\\t\\t\\t\\r\\n\\t\\t\\t\\t\\t\\t\\t
    \\r\\n\\t\\t\\t\\t\\t\\t\\t\\t{{config.displayName}}\\r\\n\\t\\t\\t\\t\\t\\t\\t\\t\\r\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\r\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\r\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\r\\n\\t\\t\\t\\t\\t\\t\\t\\t\\r\\n\\t\\t\\t\\t\\t\\t\\t
    \\r\\n\\r\\n\\t\\t\\t\\t\\t\\t\\t\\t\\r\\n\\t\\t\\t\\t\\t\\t\\t
    Copy Profile URL
    \\t\\t\\r\\n\\t\\t\\t\\t\\t\\t\\t\\r\\n\\t\\t\\t\\t\\t\\t
    \\r\\n\\t\\t\\t\\t\\t\\t\\r\\n\\t\\t\\t\\t\\t\\t
    \\r\\n\\t\\t\\t\\t\\t\\t\\r\\n\\t\\t\\t\\t\\t\\t
    \\r\\n\\t\\t\\t\\t\\t\\t\\t\\r\\n\\t\\t\\t\\t\\t\\t\\t
    \\r\\n\\t\\t\\t\\t\\t\\t\\t\\t\"{{userProfile.reportsToDisplayName}}\"\\r\\n\\t\\t\\t\\t\\t\\t\\t
    \\r\\n\\t\\t\\t\\t\\t\\t\\t
    \\r\\n\\t\\t\\t\\t\\t\\t\\t\\t\\r\\n\\t\\t\\t\\t\\t\\t\\t\\t
    \\r\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\r\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\r\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\r\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\r\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\r\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\r\\n\\t\\t\\t\\t\\t\\t\\t\\t
    \\r\\n\\t\\t\\t\\t\\t\\t\\t
    \\r\\n
    \\r\\n
    \\r\\n \\r\\n \\r\\n
    \\r\\n
    \\r\\n\\t\\t\\t\\t\\t\\t
    \\r\\n \\r\\n\\t\\t\\t\\t\\t
  • \\r\\n\\t\\t\\t\\t
\\r\\n\\t\\t\\t
\\r\\n\\t\\t
\\r\\n\\t\\t\\r\\n\\t
\\r\\n\\t
\\r\\n
\\r\\n\\r\\n');\n$templateCache.put('fxphelp.html','
\\r\\n\\t
\\r\\n\\t\\t
\\r\\n\\t\\t\\t
\\r\\n\\t\\t\\t
\\r\\n\\t\\t\\t\\t\\r\\n\\t\\t\\t\\t
\\r\\n\\t\\t\\t
\\r\\n\\t\\t
\\r\\n\\t
\\r\\n
\\r\\n');\n$templateCache.put('fxphelpmenu.html','
\\r\\n\\t\\r\\n\\t\\r\\n\\t
\\r\\n\\t\\t\\r\\n\\t\\t
\\r\\n\\t\\t
\\r\\n\\t\\t\\t
\\r\\n\\t\\t
\\r\\n\\t
\\r\\n\\r\\n\\t\\r\\n\\t\\r\\n\\t
\\r\\n\\t\\t\\r\\n\\t\\t
\\r\\n\\t\\t\\t
\\r\\n\\t\\t
\\r\\n\\t
\\r\\n
\\r\\n');\n$templateCache.put('fxpmessage.html','
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n      \\r\\n ({{message.trackId}})     \\r\\n \\r\\n ({{message.uniqueTransactionId}})\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n');\n$templateCache.put('fxpmodal-announcement.html','
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
');\n$templateCache.put('fxpmodal-cancellable.html','
\\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
');\n$templateCache.put('fxpmodal-feedback.html','
\\r\\n
\\r\\n
\\r\\n
\\r\\n

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

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

Have additional feedback or suggestions? (Do not include any personal or confidential information.)

\\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
');\n$templateCache.put('fxpmodal.html','
\\r\\n
\\r\\n
\\r\\n

\\r\\n
\\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
');\n$templateCache.put('fxpnotification.html','
\\r\\n
\\r\\n \\r\\n
\\r\\n
\\r\\n
    \\r\\n \\t
  • \\r\\n\\t\\t\\t\\t\\t

    \\r\\n\\t\\t\\t\\t\\t\\tNotifications\\r\\n\\t\\t\\t\\t\\t\\t
    \\r\\n\\t\\t\\t\\t\\t

    \\r\\n\\t\\t\\t\\t\\t
    \\r\\n\\t\\t\\t\\t\\t\\t
    Do not disturb
    \\r\\n\\t\\t\\t\\t\\t\\t
    \\r\\n\\t\\t\\t\\t\\t\\t\\t\\r\\n\\t\\t\\t\\t\\t\\t\\t
    \\r\\n\\t\\t\\t\\t\\t\\t\\t\\t\\r\\n\\t\\t\\t\\t\\t\\t\\t\\t|\\r\\n\\t\\t\\t\\t\\t\\t\\t\\t\\r\\n\\t\\t\\t\\t\\t\\t\\t
    \\r\\n\\t\\t\\t\\t\\t\\t\\t
    \\r\\n\\t\\t\\t\\t\\t\\t\\t\\r\\n\\t\\t\\t\\t\\t\\t
    \\r\\n\\t\\t\\t\\t\\t
    \\r\\n\\t\\t\\t\\t
  • \\r\\n\\t\\t\\t\\t
  • \\r\\n\\t\\t\\t\\t\\t
    \\r\\n\\t\\t\\t\\t\\t\\t\\r\\n\\t\\t\\t\\t\\t
    \\r\\n\\t\\t\\t\\t\\t
    \\r\\n\\t\\t\\t\\t\\t\\t
    \\r\\n\\t\\t\\t\\t\\t\\t\\t
    \\r\\n\\t\\t\\t\\t\\t\\t\\t\\t

    {{item.subject}}

    \\r\\n\\t\\t\\t\\t\\t\\t\\t\\t
    {{item.content}}
    \\r\\n\\t\\t\\t\\t\\t\\t\\t
    \\r\\n\\t\\t\\t\\t\\t\\t\\t

    \\r\\n\\t\\t\\t\\t\\t\\t
    \\r\\n\\t\\t\\t\\t\\t
    \\r\\n\\t\\t\\t\\t\\t
    \\r\\n\\t\\t\\t\\t\\t\\t\\r\\n\\t\\t\\t\\t\\t
    \\r\\n\\t\\t\\t\\t
  • \\r\\n\\t\\t\\t\\t
  • \\r\\n\\t\\t\\t\\t\\t
    \\r\\n\\t\\t\\t\\t\\t\\t
    \\r\\n\\t\\t\\t\\t\\t\\t
    {{notifications.notificationErrorMsg}}
    \\r\\n\\t\\t\\t\\t\\t
    \\r\\n\\t\\t\\t\\t
  • \\r\\n\\t\\t\\t\\t
  • \\r\\n\\t\\t\\t\\t\\t
    Nothing new right now.
    \\r\\n\\t\\t\\t\\t\\t
    \\r\\n\\t\\t\\t\\t\\t\\t\\r\\n\\t\\t\\t\\t\\t\\t\\tLoad More\\r\\n\\t\\t\\t\\t\\t\\t\\r\\n\\t\\t\\t\\t\\t
    \\r\\n \\t
  • \\r\\n \\t
\\r\\n\\t\\t
\\r\\n
\\r\\n
');\n$templateCache.put('fxpPopupRequestModal.html','
\\r\\n\\t
\\r\\n\\t\\t

\\r\\n\\t\\t

\\r\\n\\t\\t\\r\\n\\t
\\r\\n\\t
\\r\\n\\t\\t\\r\\n\\t\\t
\\r\\n\\t\\t\\t\\r\\n\\t\\t
\\r\\n\\t
\\r\\n\\t
\\r\\n\\t\\t

\\r\\n\\t\\t\\t{{aoCtrl.currentRequestType.Description }}\\r\\n\\t\\t

\\r\\n\\t\\t

\\r\\n\\t\\t\\t{{aoCtrl.modalStrings.ModalDescription}}\\r\\n\\t\\t

\\r\\n\\t
\\r\\n\\t
\\r\\n\\t\\t\\r\\n\\t\\t\\t\\t\\r\\n\\t\\t\\t\\t\\r\\n\\t\\t\\r\\n\\t
\\r\\n
');\n$templateCache.put('fxpsessiontimeout.html','
\\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');\n$templateCache.put('fxptoastnotification.html','
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n \\r\\n
\\r\\n
\\r\\n');\n$templateCache.put('leftnavigation.html','
\\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');\n$templateCache.put('leftNavMenuItem.html','
  • \\r\\n
    \\r\\n
    \\r\\n

    {{heading}}

    \\r\\n
    \\r\\n
    \\r\\n
    \\r\\n
    \\r\\n
    \\r\\n
  • ');\n$templateCache.put('leftNavMenuItemAccordion.html','
      ');\n$templateCache.put('leftNavPersonalization.html','
      \\r\\n
      \\r\\n

      {{::adminUIStrings.PersonalizeUserNavigation}}

      : {{::personalizationUser.DisplayName}} - {{::personalizationUser.BusinessRole}} ({{personalizationUser.RoleGroupName}})
      \\r\\n
      {{::adminUIStrings.InstructionalTextPersonalizeScreen}}
      \\r\\n
      \\r\\n
      \\r\\n
      \\r\\n
      \\r\\n
      {{::adminUIStrings.GlobalNavigationMasterList}}
      \\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
      \\r\\n
      \\r\\n
      \\r\\n \\r\\n
      {{::buttonStrings.Add}}
      \\r\\n \\r\\n
      {{::buttonStrings.Remove}}
      \\r\\n
      \\r\\n
      \\r\\n
      \\r\\n
      \\r\\n
      \\r\\n
      {{::adminUIStrings.UserNavigationList}}
      \\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 \\r\\n \\r\\n
      \\r\\n
      \\r\\n
      \\r\\n
      \\r\\n
      \\r\\n
      \\r\\n
      \\r\\n

      \\r\\n {{::fxpUIConstants.UIStrings.AdminUIStrings.UnsavedChangesPopupHeader}}\\r\\n \\r\\n

      \\r\\n
      \\r\\n
      \\r\\n
      \\r\\n {{::fxpUIConstants.UIStrings.AdminUIStrings.UnsavedChangesPopupDescription}}\\r\\n
      \\r\\n
      \\r\\n \\r\\n \\r\\n
      \\r\\n
      \\r\\n
      \\r\\n
      \\r\\n
      \\r\\n');\n$templateCache.put('OnBehalfOf.html','
      \\r\\n
      \\r\\n

      {{oboUIStrings.ActingOnBehalfOf}}

      \\r\\n
      \\r\\n
      \\r\\n \\r\\n
      \\r\\n \\r\\n \\r\\n
      \\r\\n {{errorMessage}}\\r\\n
      \\r\\n
      \\r\\n \\r\\n
      \\r\\n
      \\r\\n
      \\r\\n
      \\r\\n
      \\r\\n\\t\\t\\t\\t\\t\\r\\n \\r\\n
      \\r\\n
      \\r\\n \\r\\n
      \\r\\n
      \\r\\n
      \\r\\n');\n$templateCache.put('pageLoader.template.html','\\r\\n
      \\r\\n 0\" ng-bind=\"loadingText\">\\r\\n
      ');\n$templateCache.put('powerBi.html','
      \\r\\n
      \\r\\n');\n$templateCache.put('ResManagement.html','\\r\\n \\r\\n Requestor view\\'\">\\r\\n \\r\\n \\r\\n');\n$templateCache.put('roleNavPersonalization.html','
      \\r\\n
      \\r\\n

      {{::fxpUIConstants.UIStrings.AdminUIStrings.ManageRolePageHeader}}

      \\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
      \\r\\n
      \\r\\n
      \\r\\n
      \\r\\n
      \\r\\n
      {{::fxpUIConstants.UIStrings.AdminUIStrings.MasterNavigation}}
      \\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
      \\r\\n
      \\r\\n
      \\r\\n
      \\r\\n
      \\r\\n
      \\r\\n \\r\\n
      {{::fxpUIConstants.UIStrings.ButtonStrings.Add}}
      \\r\\n \\r\\n
      {{::fxpUIConstants.UIStrings.ButtonStrings.Remove}}
      \\r\\n
      \\r\\n
      \\r\\n
      \\r\\n
      \\r\\n
      \\r\\n
      {{::fxpUIConstants.UIStrings.AdminUIStrings.NavigationFor}} {{selectedRoleGroup.RoleGroupName}} {{::fxpUIConstants.UIStrings.AdminUIStrings.NavigationForRoleGroupLabel}}
      \\r\\n
      {{::fxpUIConstants.UIStrings.AdminUIStrings.NavigationFor}} {{selectedRole.BusinessRoleName}} {{::fxpUIConstants.UIStrings.AdminUIStrings.NavigationForRoleLabel}}
      \\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
      \\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 {{::fxpUIConstants.UIStrings.AdminUIStrings.UnsavedChangesPopupHeader}}\\r\\n \\r\\n

      \\r\\n
      \\r\\n
      \\r\\n
      \\r\\n {{::fxpUIConstants.UIStrings.AdminUIStrings.UnsavedChangesPopupDescription}}\\r\\n
      \\r\\n
      \\r\\n \\r\\n \\r\\n
      \\r\\n
      \\r\\n
      \\r\\n
      \\r\\n
      \\r\\n
      \\r\\n
      \\r\\n

      {{::fxpUIConstants.UIStrings.AdminUIStrings.ConfirmPopupHeader}}

      \\r\\n
      \\r\\n
      \\r\\n
      \\r\\n {{::fxpUIConstants.UIStrings.AdminUIStrings.ConfirmPopupDescription}}\\r\\n
      \\r\\n
      \\r\\n \\r\\n \\r\\n
      \\r\\n
      \\r\\n
      \\r\\n
      \\r\\n');\n$templateCache.put('system-down-div.html','
      \\r\\n
      \\r\\n
      \\r\\n
      \\r\\n

      System Down

      \\r\\n

      We are sorry, we couldn\\u2019t load your experience. For Further details refer

      \\r\\n

      \\r\\n Create Ticket\\r\\n

      \\r\\n
      \\r\\n
      \\r\\n
      \\r\\n
      \\r\\n');\n$templateCache.put('system-down-layout.html','\\r\\n\\r\\n\\r\\n ESXP System Down\\r\\n \\r\\n \\r\\n\\r\\n\\r\\n
      \\r\\n \\r\\n\\r\\n');\n$templateCache.put('system-message-manage.html','
      \\r\\n
      \\r\\n
      \\r\\n \\r\\n

      \\r\\n

      \\r\\n
      \\r\\n
      0\">\\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 \\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\\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');\n$templateCache.put('system-update-msg-banner.html','
      \\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
      \\r\\n \\r\\n
      \\r\\n
      \\r\\n
      \\r\\n \\r\\n \\r\\n
      \\r\\n
      \\r\\n \\r\\n
      \\r\\n
      ');\n$templateCache.put('system_down.template.html','
      \\r\\n
      \\r\\n
      \\r\\n

      System Update

      \\r\\n

      \\r\\n
      \\r\\n
      \\r\\n
      ');\n$templateCache.put('unauthorized.template.html','
      \\r\\n
      \\r\\n
      \\r\\n
      \\r\\n

      Unauthorized Access

      \\r\\n

      You are not authorized to view this page. If you believe you should have had access, contact your administrator for assistance.

      \\r\\n
      \\r\\n
      \\r\\n
      \\r\\n
      ');\n$templateCache.put('userLookupPersonalization.html','
      \\r\\n
      \\r\\n

      {{adminUIStrings.PersonalizeUserNavigation}}

      \\r\\n
      \\r\\n
      \\r\\n \\r\\n
      \\r\\n 0, \\'resetActiveState\\':activestate, \\'resetInActiveState\\':!activestate }\" />\\r\\n \\r\\n
      \\r\\n {{errorMessage}}\\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');\n$templateCache.put('welcome.html','
      \\r\\n

      Welcome to Field Experience Platform.

      \\r\\n

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

      This is a temporary page added to the platform only for the lower environment. Please click on the Dashboard\\r\\n link in left navigation to continue.

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

      Global Counter

      \\r\\n {{globalCounter}}\\r\\n \\r\\n \\r\\n
      \\r\\n
      \\r\\n\\r\\n
      \\r\\n

      NG-2 Local Counter (Hello World)

      \\r\\n {{ng2localCounter}}\\r\\n \\r\\n \\r\\n\\r\\n
      \\r\\n \\r\\n
      \\r\\n\\r\\n
      \\r\\n

      \\r\\n Global State\\r\\n

      \\r\\n
      \\r\\n      {{globalState}}\\r\\n    
      \\r\\n
      \\r\\n
      \\r\\n

      SignalR Client

      \\r\\n \\r\\n \\r\\n\\r\\n \\r\\n \\r\\n\\r\\n \\r\\n \\r\\n From SignalR Server: {{ singalRResponse }}\\r\\n
      \\r\\n
      \\r\\n \\r\\n
      \\r\\n
      \\r\\n');\n$templateCache.put('author_notification/confirmationPopup.html','
      \\r\\n\\t
      \\r\\n\\t\\t

      \\r\\n\\t\\t

      \\r\\n\\t\\t\\r\\n\\t
      \\r\\n\\t
      \\r\\n\\t\\t

      \\r\\n\\t
      \\r\\n\\t
      \\r\\n\\t\\t\\r\\n\\t\\t\\r\\n\\t
      \\r\\n
      ');\n$templateCache.put('author_notification/pagination.html','\\r\\n\\r\\n\\r\\n\\r\\nof\\r\\n2\\r\\n\\r\\n');\n$templateCache.put('author_notification/rolesRoleGroupNotification.html','
      \\r\\n
      \\r\\n
      \\r\\n
      \\r\\n
      \\r\\n
      \\r\\n
      \\r\\n
      {{::fxpUIConstants.UIStrings.AuthorNotificationStrings.RoleGroupandRoles}}
      \\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
      \\r\\n
      \\r\\n
      \\r\\n
      \\r\\n \\r\\n
      \\r\\n {{::fxpUIConstants.UIStrings.ButtonStrings.Add}}\\r\\n
      \\r\\n \\r\\n
      \\r\\n {{::fxpUIConstants.UIStrings.ButtonStrings.Remove}}\\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
        \\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');\n$templateCache.put('author_notification/userLevelNotification.html','\\r\\n
      \\r\\n \\r\\n\\t
      \\r\\n\\t\\t

      {{::anCtrl.typeAheadErrorMessage}}

      \\r\\n\\t
      \\r\\n
      \\r\\n
        \\r\\n
      • \\r\\n \\r\\n \\r\\n
      • \\r\\n
      \\r\\n\\r\\n');\n$templateCache.put('help/help-article-image-modal.html',' \\r\\n');\n$templateCache.put('help/help-article.html','
      \\r\\n\\t
      \\r\\n\\t\\t{{article.title}} \\r\\n\\t\\t\\r\\n\\t\\t\\t\\r\\n\\t\\t\\r\\n\\t
      \\r\\n\\t
      \\r\\n\\r\\n\\t
      \\r\\n\\t
      \\r\\n\\t\\t
      Was this article helpful?
      \\r\\n\\t\\t
      \\r\\n\\t\\t\\t\\r\\n\\t\\t\\t\\r\\n\\t\\t
      \\r\\n\\t
      \\r\\n\\t\\r\\n\\t
      \\r\\n\\t\\tGo to top\\r\\n\\t
      \\r\\n
      ');\n$templateCache.put('help/help-content.html','
      \\r\\n\\t
      \\r\\n\\t\\t\\r\\n\\t\\t\\r\\n\\t\\t\\r\\n\\t\\t \\r\\n \\r\\n\\t\\t
      \\r\\n\\t\\t\\t
      \\r\\n\\t\\t
      \\r\\n\\t
      \\r\\n\\t
      Help
      \\r\\n\\t
      \\r\\n\\t
      \\r\\n\\t\\r\\n\\t
      \\t\\t\\r\\n\\t
      \\r\\n\\t
      \\r\\n\\t
      \\r\\n
      \\r\\n Loading\\r\\n
      \\r\\n
      \\r\\n');\n$templateCache.put('help/help-links.html','
      \\r\\n\\r\\n\\t

      \\r\\n\\r\\n\\t
      \\r\\n\\r\\n\\t\\t
      \\r\\n\\t\\t\\t\\r\\n\\t\\t\\t\\r\\n\\t\\t\\t\\r\\n\\t\\t\\t\\t\\r\\n\\t\\t\\t\\r\\n\\t\\t
      \\r\\n\\t\\t
      \\r\\n\\t
      \\r\\n\\t
      \\r\\n\\t\\t
      \\r\\n\\t\\t\\t... Show all related articles\\r\\n\\t\\t
      \\r\\n\\t
      \\r\\n
      ');\n$templateCache.put('help/search-control.html','
      \\r\\n\\t\\r\\n\\t\\r\\n\\t\\r\\n
      \\r\\n\\r\\n\\r\\n\\r\\n');\n$templateCache.put('help/search-links.html','
      \\r\\n\\t
      Articles
      \\r\\n\\t
      \\r\\n\\t\\t
      \\r\\n\\t\\t\\t\\r\\n\\t\\t\\t\\r\\n\\t\\t\\t\\t\\r\\n\\t\\t\\t\\r\\n\\t\\t
      \\r\\n\\t\\t
      \\r\\n\\t
      \\r\\n\\t
      \\r\\n\\t\\t
      \\r\\n\\t\\t\\t... Show all articles\\r\\n\\t\\t\\t | \\r\\n\\t\\t\\tView in Help Central\\r\\n\\t\\t
      \\r\\n\\t
      \\r\\n
      ');\n$templateCache.put('iframe_app/iframe_app.html','
      \\r\\n \\r\\n \\r\\n
      ');\n$templateCache.put('system_messages/add-edit-modal.html','
      \\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
      {{::smCtrl.UiString.ERRORS.BUSINESS_CAPABILITY_REQUIRED}}
      \\r\\n
      \\r\\n
      \\r\\n
      \\r\\n
      \\r\\n \\r\\n :
      \\r\\n
      \\r\\n \\r\\n
      \\r\\n
      {{::smCtrl.UiString.ERRORS.BUSINESS_FUNCTION_REQUIRED}}
      \\r\\n
      \\r\\n
      \\r\\n
      \\r\\n
      \\r\\n
      \\r\\n \\r\\n
      \\r\\n {{smCtrl.systemMessage.message.length}}\\r\\n / {{smCtrl.maxMessageLength}}\\r\\n \\r\\n = smCtrl.maxMessageLength\" class=\"sr-only\" >You\\'ve reached the maximum description length\\r\\n \\r\\n
      \\r\\n
      \\r\\n
      {{::smCtrl.UiString.ERRORS.MESSAGE_REQUIRED}}
      \\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
      {{::smCtrl.UiString.ERRORS.START_DATE_REQUIRED}}
      \\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
      {{::smCtrl.UiString.ERRORS.END_DATE_REQUIRED}}
      \\r\\n
      {{::smCtrl.UiString.ERRORS.END_DATE_MIN}}
      \\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
      \\r\\n
      \\r\\n');\n$templateCache.put('system_messages/delete-modal.html','
      \\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
      ');\n$templateCache.put('system_messages/pagination-footer.html','\\r\\n\\r\\n\\r\\n\\r\\nof\\r\\n\\r\\n\\r\\n');\n$templateCache.put('system_messages/pagination-header.html','\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n');}]);","import { FxpBootstrap } from \"./boot/fxpboot\";\r\nimport { ISettingsServiceProvider } from \"./interfaces/ISettingsServiceProvider\";\r\nimport { FxpBotServiceProvider } from \"./provider/FxpBotServiceProvider\";\r\nimport { GlobalExceptionHandler } from \"./telemetry/GlobalExceptionHandler\";\r\nimport { SettingsServiceProvider } from \"./provider/SettingsServiceProvider\";\r\nimport { NonFxpApp } from \"./iframe_app/iframeAppController\";\r\nimport { Fxp } from \"./module-declarations\";\r\nimport { FxpConfigurationService } from \"./services/FxpConfiguration\";\r\nimport { FxpStateTransitionService } from \"./services/FxpStateTransitionService\";\r\nimport { FxpLoggerServiceExtension } from \"./telemetry/FxpLoggerServiceExtension\";\r\nimport { UserProfileService } from \"./services/userProfileService\";\r\nimport { UserClaimsService } from \"./services/UserClaimsService\";\r\nimport { UserInfoService } from \"./services/UserInfoService\";\r\nimport { TimeZoneHelper } from \"./services/TimeZoneHelper\";\r\nimport { SystemMessagesService } from \"../app/systemMessages/SystemMessagesService\";\r\nimport { PlannedDownTimeService } from \"../app/systemMessages/PlannedDownTimeService\";\r\nimport { PersonalizationService } from \"./services/PersonalizationService\";\r\nimport { pageTourEventService } from \"./services/pageTourEventService\";\r\nimport { PageLoaderService } from \"../app/loader/pageLoaderService\";\r\nimport { OBOUserService } from \"./services/OBOUserService\";\r\nimport { NotificationStore } from \"./services/NotificationStore\";\r\nimport { NotificationService } from \"./services/NotificationService\";\r\nimport { NotificationActionCenter } from \"./services/NotificationActionCenter\";\r\nimport { HelpCentralService } from \"./services/HelpCentralService\";\r\nimport { FxpStorageService } from \"./services/FxpStorageService\";\r\nimport { LazyLoaderService } from \"./services/lazyLoaderService\";\r\nimport { FxpRouteService } from \"./services/FxpRouteService\";\r\nimport { FxpMessageService } from \"../app/banner/FxpMessageService\";\r\nimport { FxpFeedbackService } from \"./services/FxpFeedbackService\";\r\nimport { FxpBreadcrumbService } from \"./services/FxpBreadcrumbService\";\r\nimport { FxpAuthorizationService } from \"./services/FxpAuthorizationService\";\r\nimport { DashboardService } from \"./services/dashboardService\";\r\nimport { AdminLandingService } from \"../app/adminTiles/AdminLandingService\";\r\nimport { TelemetryConfiguration } from \"./telemetry/TelemetryConfiguration\";\r\nimport { TelemetryContext } from \"./telemetry/telemetrycontext\";\r\nimport { PouchDBProvider } from \"./common/PouchDBProvider\";\r\nimport { FxpContext } from \"./context/FxpContext\";\r\nimport { httpCorrelationInterceptor, httpRetryInterceptor, MsalHttpRequestInterceptor } from \"./factory/FxpHttpInterceptorFactory\";\r\nimport { AppControllerHelper } from \"./factory/AppControllerHelper\";\r\nimport { DeviceFactoryProvider } from \"./utils/devicefactoryService\";\r\nimport { SYSTEM_MESSAGE_UI } from \"./constants/systemMessages.constants\";\r\nimport { AppController } from \"./controllers/appCntrl\";\r\nimport { FxpUIData } from \"./factory/FxpUIDataFactory\";\r\nimport { SessionTimeoutModalFactory } from \"./factory/SessionTimeoutModalFactory\";\r\nimport { SessionTimeoutModalConstant } from \"./constants/SessionTimeoutModal.constants\";\r\nimport { FxpModalConstant } from \"./constants/FxPModal.constants\";\r\nimport { ToastNotificationController } from \"./controllers/toastNotificationController\";\r\nimport { DataService } from \"./services/DataService\";\r\nimport { FxpHttpService } from \"./services/FxpHttpService\";\r\nimport { ActOnBehalfOfController } from \"./controllers/actOnBehalfOfController\";\r\nimport { AdminLandingController } from \"../app/adminTiles/AdminLandingController\";\r\nimport { CreateAskOpsController } from \"./controllers/createAskOpsController\";\r\nimport { CreateSupportTicketController } from \"./controllers/createSupportTicketController\";\r\nimport { DashBoardController } from \"./controllers/dashBoardController\";\r\nimport { FooterController } from \"./controllers/footerController\";\r\nimport { HelpArticleImageController } from \"./controllers/HelpArticleImageController\";\r\nimport { HelpController } from \"./controllers/helpController\";\r\nimport { LeftNavController } from \"../app/leftNavigation/leftNavController\";\r\nimport { LeftNavPersonalizationController } from \"./controllers/leftNavPersonalizationController\";\r\nimport { NotificationsController } from \"./controllers/notificationController\";\r\nimport { PowerBiPageController } from \"./controllers/powerBIPageController\";\r\nimport { RoleNavPersonalizationController } from \"./controllers/roleNavPersonalizationController\";\r\nimport { SessionTimeoutModalController } from \"./controllers/SessionTimeoutModalController\";\r\nimport { SystemMessagesController } from \"../app/systemMessages/systemMessagesController\";\r\nimport { UserLookupPersonalizationController } from \"./controllers/userLookupPersonalizationController\";\r\nimport { CreateAskOpsModalConstant } from \"./constants/CreateAskOpsRequest.constants\";\r\nimport { CreateSupportTicketModalConstant } from \"./constants/createSupportTicketRequest.constants\";\r\nimport { AuthorNotificationConstant } from \"./constants/AuthorNotification.constants\";\r\nimport { HelpArticleImageModalConstant } from \"./constants/HelpArticle.constants\";\r\nimport { SkipToMainContent } from \"./directives/fxpSkipToMainContent.directive\";\r\nimport { AuthorNotificationConfirmationController, AuthorNotificationController } from \"./controllers/authorNotificationController\";\r\nimport { FxpUIStateHelperProvider } from \"./provider/UIStateHelperProvider\";\r\nimport { DashBoardHelper } from \"./factory/DashBoardHelper\";\r\nimport { ActOnBehalfOfHelper } from \"./factory/ActOnBehalfOfHelper\";\r\nimport { AuthorNotificationRoleGroupHelper } from \"./factory/AuthorNotificationRoleGroupHelper\";\r\nimport { ChangeTabIndexByClassDirective } from \"./directives/changeTabIndexByClass\";\r\nimport { AuthorNotificationContentDirective } from \"./directives/fxpAuthorNotification.directive\";\r\nimport { FxpAuthorNotificationListDirective } from \"./directives/fxpAuthorNotificationList.directives\";\r\nimport { BreadcrumbDirectives } from \"./directives/fxpbreadcrumb.directive\";\r\nimport { fxpBreadcrumbLink } from \"./directives/fxpBreadcrumbLink\";\r\nimport { fxpChoiceItem } from \"./directives/fxpChoiceControl.directive\";\r\nimport { FxpGoToTopDirective } from \"./directives/fxpGoToTop.directive\";\r\nimport { FxpHelpDirectives } from \"./directives/fxpHelpEvents\";\r\nimport { FxpIncludeStaticTemplate } from \"./directives/fxpIncludeStaticTemplate\";\r\nimport { FxpComponentDirectives } from \"./directives/fxpItems.directive\";\r\nimport { FxpKeyDownDirective } from \"./directives/fxpKeyDown.derective\";\r\nimport { fxpLeftNavKeydown } from \"./directives/fxpleftnavkeydown\";\r\nimport { LeftnavLink } from \"./directives/fxpLeftnavLink\";\r\nimport { FxpNotification } from \"./directives/fxpNotificationKeyEventHandler.directive\";\r\nimport { FxpNotificationSetFocusDirective } from \"./directives/fxpNotificationSetFocus.directive\";\r\nimport { FxpSetFocusToElement } from \"./directives/fxpSetFocus\";\r\nimport { FxpShowIfDeviceDirective } from \"./directives/fxpShowIfDevice\";\r\nimport { fxpSystemMessageRow, fxpSystemMessagePopupDirective } from \"./directives/fxpSystemMessage.directives\";\r\nimport { FxpToastNotificationDirectives } from \"./directives/fxptoastnotification.directive\";\r\nimport { LeftNavOutsideClickDirective } from \"./directives/leftNavOutsideClick\";\r\nimport { RenderNavElementsForKeydownDirective } from \"./directives/leftNavPersonalization.directive\";\r\nimport { LeftNavPrsonalizationAdjustScrollDirective } from \"./directives/leftNavPersonalizationAdjustScroll.directive\";\r\nimport { RenderPopUpForKeydownDirective } from \"./directives/leftNavPersonalizationPopUp.directive\";\r\nimport { LeftNavPersonalizationScreenReaderDirective } from \"./directives/leftNavPersonalizationScreenReader\";\r\nimport { LeftNavPersonalizationScrollToActiveDirective } from \"./directives/leftNavPersonalizationScrollToActive\";\r\nimport { MultilineEllipsisDirective } from \"./directives/multilineellipsis\";\r\nimport { MultilineEllipsisWithAccordionDirective } from \"./directives/multilineEllipsisWithAccordion\";\r\nimport { IntervalFlipDirective } from \"./directives/ngLongPress\";\r\nimport { FeedbackFlyoutDirective } from \"./directives/ngRightClick\";\r\nimport { ScrollToTopDirective } from \"./directives/scrolltotopdirective\";\r\nimport { Resiliency } from \"./resiliency/FxpResiliency\";\r\nimport { UnCamelCase } from \"./filters/unCamelCase.filter\";\r\nimport { AppDirectives } from \"./directives/AppDirectives\";\r\nimport { AdminLandingDirective } from \"./directives/adminLanding.directive\";\r\nimport { FxpProviders } from \"./provider/CorrelationProvider\";\r\nimport { Subject } from \"rxjs\";\r\nimport { FeatureFlagAngular1Module } from \"@fxp/flightingsdk\";\r\nimport { ConfitAngular1Module } from \"@fxp/confitsdk\";\r\nimport { FxpEventBroadCastService } from \"./services/BroadCastingService\";\r\nimport { FxpWelcomeController } from \"./controllers/fxpWelcomeController\";\r\nimport { ModuleName } from './../fxptemplates';\r\nimport { StickyStatesPlugin } from \"@uirouter/sticky-states\";\r\nimport { FxpPartnerHttpInterceptorHooks } from \"./services/FxpPartnerHttpInterceptorHooks\";\r\nimport { FxpPartnerHttpRequestInterceptor } from \"./factory/FxpPartnerHttpInterceptorHandler\";\r\nimport { FxpBotLauncherComponent } from './../../src/app/components/fxpbot/fxpbot.component';\r\nimport { downgradeComponent } from '@angular/upgrade/static';\r\nimport { FxpGlobalStoreService } from \"./services/fxp.global.store.service\";\r\nimport { FxpIrisBotService } from './services/FxpIrisBotService';\r\nimport { Environment } from \"./common/enum/environment.enum\";\r\nimport { PartnerAppRegistrationService } from \"./services/PartnerAppRegistrationService\";\r\nimport { FxpOCVFeedbackService } from \"./services/FxpOCVFeedbackService\";\r\nimport { FxpSignalRService } from \"./services/FxpSignalRClient\";\r\nimport { FxpSharedComponentLoader } from '@fxp/fxpsharedcomponentloader'\r\nimport { FxpLoggerService } from \"./telemetry/fxpLogger\";\r\nimport { UserFeedbackUIService } from \"./services/UserFeedbackUIService\";\r\nimport { LogLevel } from \"@azure/msal-browser\";\r\nimport { AdalLoginHelperService } from \"./services/AdalLoginHelperService\";\r\nimport { MsalAuthenticationServiceProvider } from \"./services/MsalAuthenticationService\";\r\nimport { UserAnnouncementUIService } from \"./services/UserAnnouncementUIService\";\r\nimport { PageTourLauncherComponent } from \"../app/components/pageTour-Component/pageTour.component\";\r\nimport { SharedComponentLoader } from \"@fxp/angularcontrols\";\r\n\r\nFeatureFlagAngular1Module.registerModule();\r\n\r\nConfitAngular1Module.registerModule();\r\n\r\ndeclare type FeatureFlagServiceProvider = any;\r\n\r\nvar di = [ModuleName, 'oc.lazyLoad', NonFxpApp, 'vx.grid.modules', 'AdalAngular', 'ui.router', 'ui.bootstrap', 'ngAnimate', 'ngResource', 'ngSanitize',\r\n 'ngRoute', 'FXPComponents', 'FxpUtils', 'Telemetry', 'ngCookies', ConfitAngular1Module.ConfitNg1ModuleName, 'angularCSS', 'angularMoment', 'moment-picker',\r\n 'ngMessages', 'ngScrollbars', 'Microsoft.PS.Feedback', FeatureFlagAngular1Module.FlightingNg1ModuleName, 'ActivityMonitor', 'base64', 'ng-showdown', 'ng.deviceDetector', 'ui.router.state.events'];\r\n\r\n//To remove cannot find name error\r\nvar PartnerModules = PartnerModules || window[\"PartnerModules\"] || [];\r\nvar FxpAppSettings = FxpAppSettings || window[\"FxpAppSettings\"] || {};\r\nvar PreLoadModules = PreLoadModules || window[\"PreLoadModules\"] || [];\r\nvar TenantConfiguration = TenantConfiguration || window[\"tenantConfiguration\"] || {};\r\nvar ocLazyLoadDebugFlag = window.localStorage[\"ShowLazyLoadLogs\"] || false;\r\nif (PartnerModules)\r\n di = di.concat(PartnerModules);\r\n\r\nangular\r\n .module('FxpUtils', [])\r\n .service('AdalLoginHelperService', ['$q', '$resource', 'MsalAuthenticationService', AdalLoginHelperService]);\r\n\r\n\r\nexport var fxpModule = angular.module('FxPApp', di)\r\n .constant('confitRootUrl', FxpAppSettings.ConfitServiceEndPoint)\r\n .constant('StartUpFlightConfig', {\r\n appName: FxpAppSettings.ApplicationName,\r\n envName: FxpAppSettings.FlightingEnvironmentName,\r\n featureNames: TenantConfiguration.FlightingConfiguration.FeatureFlags\r\n })\r\n .constant('CreateAskOpsModalConstant', CreateAskOpsModalConstant)\r\n .constant('CreateTicketModalConstant', CreateSupportTicketModalConstant)\r\n .constant('AuthorNotificationConstant', AuthorNotificationConstant)\r\n .constant('Environment', Environment)\r\n .constant('HelpArticleImageModalConstant', HelpArticleImageModalConstant);\r\n\r\n\r\n// Providers\r\n\r\n/* Naming the service as \"fxpLoggerService\" since the same is is exposed to partner apps\r\n * Should change it to FxpLoggerService to be in sync with other service names\r\n */\r\nangular.module('Telemetry', [])\r\n .service('TelemetryConfiguration', [TelemetryConfiguration])\r\n //.service('fxpLoggerService', ['TelemetryConfiguration', 'FxpLoggingStrategyFactory', 'FxpConfigurationService', 'FxpLoggerServiceExtension', FxPLoggerServiceBase]) // for Backward Compatibility\r\n //.service('FxpLoggerService', [FxPLoggerServiceBase])\r\n //.service('FxpOnlineLoggingStrategy', ['$state', 'TelemetryConfiguration', 'Microsoft.ApplicationInsights.AppInsights', 'FxpTelemetryContext', FxpOnlineLoggingStrategy])\r\n //.service('FxpLoggerServiceExtension', [FxpLoggerServiceExtension])\r\n .factory('FxpLoggerServiceExtension', () =>{\r\n return FxpLoggerServiceExtension.getInstance();\r\n })\r\n .factory('FxpLoggerService', () => {\r\n return FxpLoggerService.getInstance();\r\n })\r\n .factory('fxpLoggerService', () => {\r\n return FxpLoggerService.getInstance();\r\n });\r\n // .provider('fxpLoggerService', () => {\r\n // this.$get = [function(){\r\n // return FxPLoggerServiceBase.getInstance();\r\n // }]\r\n\r\n // });\r\n\r\nfxpModule\r\n .provider('SettingsService', SettingsServiceProvider)\r\n .provider('FxpBotService', FxpBotServiceProvider)\r\n .provider('MsalAuthenticationService', MsalAuthenticationServiceProvider)\r\n .provider('UIStateHelper', ['$stateProvider', '$urlRouterProvider', FxpUIStateHelperProvider.UIStateHelperProvider]);\r\n\r\nfxpModule\r\n .constant('SYSTEM_MESSAGE_UI', SYSTEM_MESSAGE_UI)\r\n .constant('SessionTimeoutModalConstant', SessionTimeoutModalConstant)\r\n .constant('FxpModalConstant', FxpModalConstant);\r\n\r\nfxpModule\r\n .service('FxpConfigurationService', [FxpConfigurationService])\r\n .service('FxpHttpService', ['$http', FxpHttpService])\r\n .service('DeviceFactory', ['$window', '$rootScope', '$timeout', DeviceFactoryProvider])\r\n .service('FxpEventBroadCastService', ['$rootScope', FxpEventBroadCastService])\r\n .service('FxpGlobalStoreService', ['FxpLoggerService', FxpGlobalStoreService])\r\n .service('FxpStateTransitionService', ['$rootScope','$injector', '$state', 'FxpGlobalStoreService', 'FxpLoggerService', FxpStateTransitionService])\r\n .service('UserProfileService', ['$http', '$q', '$rootScope', '$timeout', 'FxpLoggerService', 'MsalAuthenticationService', 'FxpMessageService', 'FxpContextService', 'FxpConfigurationService', 'FxpTelemetryContext', 'UserInfoService', 'FxpGlobalStoreService',UserProfileService])\r\n .service('UserClaimsService', ['$http', '$q', '$rootScope', '$timeout', 'FxpLoggerService', 'MsalAuthenticationService', 'FxpMessageService', 'FxpContextService', 'UserInfoService', 'FxpConfigurationService','FxpGlobalStoreService','UserProfileService', UserClaimsService])\r\n .service('UserInfoService', ['FxpGlobalStoreService',UserInfoService])\r\n .service('TimeZoneHelper', ['moment', TimeZoneHelper])\r\n .service('SystemMessagesService', ['$http', 'FxpConfigurationService','$q', 'UserInfoService', SystemMessagesService])\r\n .service('PlannedDownTimeService', ['$timeout', 'FxpConfigurationService', 'SystemMessagesService', 'TimeZoneHelper', 'moment', 'SYSTEM_MESSAGE_UI', 'FxpLoggerService', '$window', 'FxpSignalRService', 'DashboardService', '$rootScope', 'FxpRouteService', 'FxpGlobalStoreService', PlannedDownTimeService])\r\n .service('PersonalizationService', ['$http', '$q', '$rootScope', 'FxpConfigurationService', '$timeout', 'FxpLoggerService', 'MsalAuthenticationService', 'FxpMessageService', PersonalizationService])\r\n .service('PageTourEventService', ['$rootScope', 'UserProfileService', pageTourEventService])\r\n .service('PageLoaderService', ['$http', '$rootScope', '$timeout', 'FxpConfigurationService', 'FxpGlobalStoreService',PageLoaderService])\r\n .service('OBOUserService', ['$rootScope', 'FxpContextService', '$q', 'FxpMessageService', 'UserInfoService', 'UserProfileService', 'UserClaimsService','FxpGlobalStoreService', OBOUserService])\r\n .service('NotificationStore', [\r\n '$rootScope',\r\n '$q',\r\n 'NotificationService',\r\n NotificationStore\r\n ]\r\n )\r\n .service('NotificationService', ['$http', 'FxpConfigurationService', 'UserInfoService', NotificationService])\r\n .service('NotificationActionCenter', [\r\n '$rootScope',\r\n '$state',\r\n 'FxpConfigurationService',\r\n 'FxpRouteService',\r\n NotificationActionCenter\r\n ]\r\n )\r\n .service('HelpCentralService', ['$http', 'FxpConfigurationService', 'UserInfoService', 'DeviceFactory', HelpCentralService])\r\n .service('FxpStorageService', ['$window', FxpStorageService])\r\n .service('fxpRouteService', ['$state', '$rootScope', 'FxpLoggerService', 'UserProfileService', 'UserInfoService', 'FxpBreadcrumbService', FxpRouteService]) //for backward compatibility\r\n .service('FxpRouteService', ['$state', '$rootScope', 'FxpLoggerService', 'UserProfileService', 'UserInfoService', 'FxpBreadcrumbService', FxpRouteService])\r\n .service('fxpMessage', ['$rootScope', '$interval', '$timeout', 'FxpConfigurationService', 'FxpLoggerService','FxpGlobalStoreService', FxpMessageService]) //For backward compatibility\r\n .service('FxpMessageService', ['$rootScope', '$interval', '$timeout', 'FxpConfigurationService', 'FxpLoggerService','FxpGlobalStoreService', FxpMessageService])\r\n .service('FxpFeedbackService', ['FxpLoggerService', '$rootScope', 'UserInfoService', 'FxpTelemetryContext', 'UserProfileService', FxpFeedbackService])\r\n .service('FxpBreadcrumbService', ['$state', '$q', '$rootScope', 'FxpStorageService', 'UserInfoService', 'DashboardService', 'FxpConfigurationService', 'FxpLoggerService', 'FxpTelemetryContext','FxpGlobalStoreService', FxpBreadcrumbService])\r\n .service('FxpAuthorizationService', ['$state', '$rootScope', 'FxpLoggerService', 'UserClaimsService', 'UserInfoService', 'FxpConfigurationService', FxpAuthorizationService])\r\n .service('DashboardService', ['$http', '$q', '$rootScope', 'FxpConfigurationService', '$timeout', 'FxpLoggerService', 'MsalAuthenticationService', 'FxpMessageService', 'UserInfoService', 'FxpTelemetryContext', 'UserProfileService' , 'FeatureFlagService',\r\n 'StartUpFlightConfig', 'FxpGlobalStoreService', DashboardService])\r\n .service('AdminLandingService', ['$http', '$q', '$rootScope', '$timeout', 'FxpConfigurationService', 'FxpLoggerService', 'MsalAuthenticationService', 'FxpMessageService', 'UserClaimsService', 'UserInfoService', '$base64','FxpGlobalStoreService', AdminLandingService])\r\n .factory('FxpTelemetryContext', () => {\r\n return TelemetryContext.getInstance();\r\n })\r\n .service('PouchDBProvider', [PouchDBProvider])\r\n .service('FxpContextService', ['PouchDBProvider', FxpContext])\r\n .service('DataService', ['$http', '$q', '$timeout', 'MsalAuthenticationService', 'FxpLoggerService', DataService])\r\n .service('FxpPartnerHttpInterceptorHooks',[FxpPartnerHttpInterceptorHooks])\r\n .service('LazyLoaderService', ['$ocLazyLoad', LazyLoaderService])\r\n .service('FxpIrisBotService', ['FxpEventBroadCastService', FxpIrisBotService])\r\n .service('FxpOCVFeedbackService', ['FxpLoggerService', 'FxpGlobalStoreService', 'FxpHttpService', 'FxpConfigurationService', FxpOCVFeedbackService])\r\n .service('FxpSignalRService', ['FxpLoggerService', 'FxpConfigurationService', 'MsalAuthenticationService', FxpSignalRService])\r\n .service('UserFeedbackUIService', ['$http','FxpOCVFeedbackService', 'UserInfoService', 'FxpConfigurationService', '$uibModal','FxpLoggerService','FxpMessageService','FxpGlobalStoreService', '$rootScope', UserFeedbackUIService])\r\n .service('UserAnnouncementUIService', ['$uibModal','FxpLoggerService','FxpConfigurationService', 'FxpGlobalStoreService', '$rootScope', 'UserFeedbackUIService', UserAnnouncementUIService]);\r\n\r\nfxpModule\r\n .factory('FxpHttpCorrelationInterceptor', ['UserInfoService', 'FxpConfigurationService', 'FxpLoggerService', 'FxpGlobalStoreService', httpCorrelationInterceptor])\r\n .factory('FxpHttpRetryInterceptor', ['$q', '$injector', '$timeout', 'FxpConfigurationService', 'FxpLoggerService', '$rootScope', httpRetryInterceptor])\r\n .factory('MsalHttpRequestInterceptor', ['$q' ,'MsalAuthenticationService', MsalHttpRequestInterceptor])\r\n .factory('FxpPartnerHttpRequestInterceptor', ['$q','FxpPartnerHttpInterceptorHooks', FxpPartnerHttpRequestInterceptor])\r\n .factory('AppControllerHelper', [\r\n '$q',\r\n '$rootScope',\r\n 'UserProfileService',\r\n 'FxpGlobalStoreService',\r\n 'FxpTelemetryContext',\r\n 'FxpLoggerService',\r\n 'UserInfoService',\r\n 'FeatureFlagService',\r\n 'StartUpFlightConfig',\r\n 'SettingsService',\r\n 'FxpContextService',\r\n 'FxpMessageService',\r\n 'DeviceFactory',\r\n 'deviceDetector',\r\n 'PlannedDownTimeService',\r\n 'FxpConfigurationService',\r\n 'UserClaimsService',\r\n '$uibModal',\r\n 'FxpModalConstant',\r\n 'DashboardService',\r\n 'MsalAuthenticationService',\r\n AppControllerHelper.appControllerHelperFactory\r\n ])\r\n .factory('FxpUIData', ['$rootScope', 'FxpFeedbackService', FxpUIData.getUIDataFactoryObj])\r\n .factory('SessionTimeoutModalFactory', ['$uibModal', 'FxpConfigurationService', 'FxpLoggerService', 'SessionTimeoutModalConstant', 'ActivityMonitor', '$rootScope', SessionTimeoutModalFactory.getUIDataFactoryObj])\r\n .factory('DashBoardHelper', ['$rootScope', '$state', 'UIStateHelper', 'FxpLoggerService', 'FxpTelemetryContext',\r\n 'FxpContextService', 'FxpRouteService', '$location', 'PageLoaderService', 'FxpConfigurationService', '$injector', 'AppControllerHelper', 'UserInfoService', 'FxpMessageService', '$interval', '$q', 'DashboardService', 'FxpGlobalStoreService','UserFeedbackUIService', 'UserAnnouncementUIService', DashBoardHelper.DashBoardHelperFactory])\r\n\r\n .factory(\"ActOnBehalfOfHelper\", ['$rootScope', '$http', '$q', 'UserProfileService', 'FxpLoggerService', 'FxpMessageService', 'FxpContextService', 'FxpTelemetryContext', 'UserInfoService','UserClaimsService', ActOnBehalfOfHelper.ActOnBehalfOfHelperFactory])\r\n .factory('AuthorNotificationRoleGroupHelper', [AuthorNotificationRoleGroupHelper.AuthorNotificationRoleGroupHelper]);\r\n\r\nfxpModule.controller('AppController', AppController)\r\n .controller('ToastNotificationController', [\r\n \"$scope\",\r\n \"$rootScope\",\r\n \"$window\",\r\n \"$timeout\",\r\n \"FxpConfigurationService\",\r\n \"NotificationStore\",\r\n \"NotificationActionCenter\",\r\n \"FxpMessageService\",\r\n 'FxpLoggerService',\r\n ToastNotificationController\r\n ])\r\n .controller('ActOnBehalfOfController', ActOnBehalfOfController)\r\n .controller('AdminLandingController', AdminLandingController)\r\n .controller('AuthorNotificationConfirmationController', ['$uibModalInstance', AuthorNotificationConfirmationController])\r\n .controller('AuthorNotificationController', ['$scope', '$rootScope', '$uibModal', '$state', '$timeout', 'UserProfileService', 'FxpLoggerService', 'FxpRouteService', 'NotificationStore', 'FxpMessageService', 'FxpConfigurationService', 'FxpGlobalStoreService', 'AuthorNotificationConstant', 'PersonalizationService', 'AuthorNotificationRoleGroupHelper', '$window', 'FxpEventBroadCastService', AuthorNotificationController])\r\n .controller('CreateAskOpsController', [\r\n '$rootScope',\r\n '$window',\r\n '$uibModalInstance',\r\n 'FxpLoggerService',\r\n 'SettingsService',\r\n 'FxpMessageService',\r\n 'defaultRequestType',\r\n CreateAskOpsController\r\n ])\r\n .controller('CreateTicketController', [\r\n '$rootScope',\r\n '$window',\r\n '$uibModalInstance',\r\n 'FxpLoggerService',\r\n 'defaultRequestType',\r\n CreateSupportTicketController\r\n ])\r\n .controller('DashBoardController', ['$scope', 'UIStateHelper', '$rootScope', 'FxpLoggerService', 'UserProfileService', 'UserInfoService', 'FxpMessageService', 'OBOUserService', 'DashBoardHelper', 'FxpTelemetryContext', 'FxpContextService', 'FxpConfigurationService', 'FxpEventBroadCastService', 'DashboardService', 'FxpFeedbackService', '$state', DashBoardController])\r\n .controller('FooterController', ['$scope', 'FxpLoggerService', 'FxpConfigurationService', FooterController])\r\n .controller('HelpArticleImageController', ['$uibModalInstance', 'source', HelpArticleImageController])\r\n .controller('HelpController',\r\n [\r\n '$scope',\r\n '$rootScope',\r\n 'FxpConfigurationService',\r\n 'FxpGlobalStoreService',\r\n 'FxpLoggerService',\r\n '$state',\r\n '$timeout',\r\n '$window',\r\n '$uibModal',\r\n 'HelpCentralService',\r\n 'FxpContextService',\r\n 'FxpEventBroadCastService',\r\n HelpController\r\n ])\r\n .controller('LeftNavController', LeftNavController)\r\n .controller('LeftNavPersonalizationController', LeftNavPersonalizationController)\r\n .controller('NotificationsController', [\r\n '$rootScope',\r\n '$scope',\r\n '$window',\r\n '$interval',\r\n 'FxpConfigurationService',\r\n '$timeout',\r\n 'NotificationStore',\r\n 'NotificationActionCenter',\r\n 'FxpLoggerService',\r\n 'SettingsService',\r\n 'UserInfoService',\r\n 'FxpMessageService',\r\n 'FxpContextService',\r\n 'DeviceFactory',\r\n 'FxpGlobalStoreService',\r\n 'FxpSignalRService',\r\n NotificationsController])\r\n .controller('PowerBiPageController', PowerBiPageController)\r\n .controller('RoleNavPersonalizationController', RoleNavPersonalizationController)\r\n .controller('SessionTimeoutModalController', ['FxpLoggerService', SessionTimeoutModalController])\r\n .controller('SystemMessagesController', ['$scope', 'FxpLoggerService', 'FxpMessageService', 'TimeZoneHelper', 'SystemMessagesService', 'PersonalizationService', 'FxpGlobalStoreService', 'UserInfoService', 'SYSTEM_MESSAGE_UI', '$timeout', SystemMessagesController])\r\n .controller('UserLookupPersonalizationController', UserLookupPersonalizationController)\r\n .controller('FxpWelcomeController', FxpWelcomeController);\r\nfxpModule\r\n .config(['MsalAuthenticationServiceProvider', function(msalAuthenticationServiceProvider: MsalAuthenticationServiceProvider){\r\n msalAuthenticationServiceProvider.configure({\r\n auth: {\r\n // clientId: \"853531f8-add1-44d2-824b-b4a2790b08ac\",\r\n clientId: FxpAppSettings.FxpAppClientId,\r\n authority: \"https://login.microsoftonline.com/microsoft.onmicrosoft.com\",\r\n redirectUri: window.location.origin,\r\n // navigateToLoginRequestUrl: false\r\n },\r\n cache: {\r\n cacheLocation: \"localStorage\",\r\n storeAuthStateInCookie: false, // Set this to \"true\" if you are having issues on IE11 or Edge\r\n },\r\n system: {\r\n // loggerOptions: {\r\n // loggerCallback: (level, message, containsPii) => {\r\n // if (containsPii) {\r\n // return;\r\n // }\r\n // switch (level) {\r\n // case LogLevel.Error:\r\n // console.error(message);\r\n // return;\r\n // case LogLevel.Info:\r\n // console.info(message);\r\n // return;\r\n // case LogLevel.Verbose:\r\n // console.debug(message);\r\n // return;\r\n // case LogLevel.Warning:\r\n // console.warn(message);\r\n // return;\r\n // }\r\n // },\r\n // },\r\n },\r\n });\r\n }])\r\n .config(['FxpBotServiceProvider', function (FxpBotServiceProvider: FxpBotServiceProvider) {\r\n FxpBotServiceProvider.configure({\r\n AppID: FxpAppSettings.ConnectMeBotAppId,\r\n TopicID: FxpAppSettings.ConnectMeBotTopicId,\r\n Url: FxpAppSettings.ConnectMeBotEndpoint\r\n });\r\n }])\r\n .config(['$provide', FxpBootstrap.fxpConfigInit])\r\n .config(['$compileProvider', FxpBootstrap.setSanitizedWhitelist])\r\n .config(['$httpProvider', FxpBootstrap.authenticationInit])\r\n .config(['$httpProvider', FxpBootstrap.configHttpProvider])\r\n .config(['$stateProvider', '$urlRouterProvider', FxpBootstrap.registerRoutes])\r\n .config(['$sceProvider', function ($sceProvider: angular.ISCEProvider) {\r\n $sceProvider.enabled(false);\r\n }])\r\n .config(['SettingsServiceProvider', function (SettingsServiceProvider: ISettingsServiceProvider) {\r\n SettingsServiceProvider.configure({ settingsServiceBaseUrl: FxpAppSettings.FxpServiceEndPoint });\r\n }])\r\n .config(['FeatureFlagServiceProvider', function (FeatureFlagServiceProvider: FeatureFlagServiceProvider) {\r\n FeatureFlagServiceProvider.configure({\r\n ServiceEndpoint: FxpAppSettings.FlightingServiceEndpoint\r\n }, {});\r\n }])\r\n .config(['$ocLazyLoadProvider', function ($ocLazyLoadProvider) {\r\n $ocLazyLoadProvider.config({\r\n 'debug': ocLazyLoadDebugFlag,\r\n 'events': true,\r\n 'modules': window[\"OcModules\"] || [],\r\n 'loadedModules': di,\r\n 'serie': true\r\n });\r\n }])\r\n .config(['$uiRouterProvider', function($uiRouterProvider) {\r\n $uiRouterProvider.plugin(StickyStatesPlugin);\r\n }])\r\n .run(['$ocLazyLoad', function ($ocLazyLoad) {\r\n PartnerAppRegistrationService.setLazyLoader($ocLazyLoad);\r\n }])\r\n .run(['FxpLoggerService', FxpBootstrap.InitializeStore])\r\n .run(['$cookies', '$rootScope', 'UserInfoService', 'FxpMessageService', 'FxpConfigurationService', 'FxpContextService', 'FxpTelemetryContext', 'FxpLoggerService', 'OBOUserService', 'FxpGlobalStoreService', '$timeout', 'AppControllerHelper', '$http', 'MsalAuthenticationService', FxpBootstrap.fxpRunInit])\r\n .run(['$rootScope', 'FxpAuthorizationService', 'FxpConfigurationService', 'PlannedDownTimeService', '$state', 'FxpStateTransitionService', 'FxpLoggerService', FxpBootstrap.rootScopeEventHandler])\r\n .run(['$rootScope', function ($rootScope) {\r\n $rootScope.BuildNumber = FxpAppSettings.BuildNumber;\r\n }]);\r\n\r\nlet fxpKeyDownDirective: any = FxpKeyDownDirective.fxpEnterKeyPressDirective;\r\nlet setToFocusDirective: any = FxpSetFocusToElement.fxpSetFocus;\r\nvar clickDirective: any = AppDirectives.fxpClickDirective;\r\n\r\nangular\r\n .module('FXPComponents', [])\r\n .directive('fxpfooter', FxpComponentDirectives.fxpfooter)\r\n .directive('fxpheader', FxpComponentDirectives.fxpheader)\r\n .directive('fxpleftnavigation', FxpComponentDirectives.fxpleftnavigation)\r\n .directive('actOboHeader', FxpComponentDirectives.fxpOboHeader)\r\n .directive('fxpLoader', FxpComponentDirectives.fxpLoader)\r\n .directive('fxpbreadcrumb', FxpComponentDirectives.fxpbreadcrumb)\r\n .directive('fxphelpmenu', FxpComponentDirectives.fxphelpmenu)\r\n .directive('fxpnotification', FxpComponentDirectives.fxpnotification)\r\n .directive('fxpsystemupdatemsg', FxpComponentDirectives.fxpsystemupdatemsg)\r\n .directive('fxptoastnotification', FxpComponentDirectives.fxptoastnotification)\r\n .directive('browserExperience' , FxpComponentDirectives.populateNotification)\r\n .directive('fxpbotmenu', downgradeComponent({ component: FxpBotLauncherComponent }) as angular.IDirectiveFactory)\r\n .directive('ngfxpsharedcomponent', downgradeComponent({ component: FxpSharedComponentLoader }) as angular.IDirectiveFactory)\r\n .directive('ngsharedcomponent', downgradeComponent({ component: SharedComponentLoader }) as angular.IDirectiveFactory)\r\n .directive('fxppagetour', downgradeComponent({ component: PageTourLauncherComponent }) as angular.IDirectiveFactory)\r\n\r\nfxpModule\r\n .directive('skipToMainContent', SkipToMainContent.getDirective)\r\n .directive('changeTabIndexByClass', ChangeTabIndexByClassDirective.changeTabIndexByClass)\r\n .directive('authorNotificationContent', AuthorNotificationContentDirective.authorNotificationContent)\r\n .directive('fxpAuthorNotificationRow', FxpAuthorNotificationListDirective.fxpAuthorNotificationRow)\r\n .directive('renderFxpBreadcrumb', BreadcrumbDirectives.renderFxpBreadcrumb)\r\n .directive('breadcrumbFocusContentAria', BreadcrumbDirectives.breadcrumbFocusContentAria)\r\n .directive('fxpBreadcrumbLink', fxpBreadcrumbLink.fxpBreadcrumbLinksDirective)\r\n .directive('fxpChoiceItem', fxpChoiceItem)\r\n .directive('fxpGoToTop', FxpGoToTopDirective.fxpGoToTop)\r\n .directive('fxpHelpEvents', FxpHelpDirectives.fxpHelpEvents)\r\n .directive('fxpHelp', FxpHelpDirectives.fxpHelp)\r\n .directive('fxpHelpArticle', FxpHelpDirectives.fxpHelpArticle)\r\n .directive('fxpHelpOutsideClick', FxpHelpDirectives.fxpHelpOutsideClick)\r\n .directive('fxpIncludeStaticTemplate', ['$templateCache', ($templateCache) => new FxpIncludeStaticTemplate($templateCache)])\r\n .directive('fxpKeyDown', fxpKeyDownDirective)\r\n .directive('fxpLeftNavKeydown', fxpLeftNavKeydown)\r\n .directive('fxpLeftnavLink', LeftnavLink.fxpLeftnavLinkDirective)\r\n .directive('fxpNotificationDirective', FxpNotification.fxpNotificationDirective)\r\n .directive('fxpNotificationSetFocus', FxpNotificationSetFocusDirective.fxpNotificationSetFocus)\r\n .directive('fxpSetFocus', setToFocusDirective)\r\n .directive('fxpShowIfDevice', ['$parse', '$rootScope', 'DeviceFactory', FxpShowIfDeviceDirective.fxpShowIfDevice])\r\n .directive('fxpSystemMessageRow', fxpSystemMessageRow)\r\n .directive('fxpSystemMessagePopupDirective', fxpSystemMessagePopupDirective)\r\n .directive('fxpToastNotification', FxpToastNotificationDirectives.fxpToastNotification)\r\n .directive('fxpToastNotificationContainer', FxpToastNotificationDirectives.fxpToastNotificationContainer)\r\n .directive('leftNavOutsideClick', ['$rootScope', '$document', '$parse', LeftNavOutsideClickDirective.leftNavOutsideClick])\r\n .directive('renderNavElementsForKeydown', RenderNavElementsForKeydownDirective.renderNavElementsForKeydown)\r\n .directive('leftNavPrsonalizationAdjustScroll', LeftNavPrsonalizationAdjustScrollDirective.leftNavPrsonalizationAdjustScroll)\r\n .directive('renderPopUpForKeydown', RenderPopUpForKeydownDirective.renderPopUpForKeydown)\r\n .directive('leftNavPersonalizationScreenReader', LeftNavPersonalizationScreenReaderDirective.leftNavPersonalizationScreenReader)\r\n .directive('leftNavPersonalizationScrollToActive', LeftNavPersonalizationScrollToActiveDirective.leftNavPersonalizationScrollToActive)\r\n .directive('multilineEllipsis', MultilineEllipsisDirective.multilineEllipsis)\r\n .directive('multilineEllipsisWithAccordion', MultilineEllipsisWithAccordionDirective.multilineEllipsisWithAccordion)\r\n .directive('ngLongPress', ['$timeout', IntervalFlipDirective.intervalFlip])\r\n .directive('ngRightClick', ['$parse', FeedbackFlyoutDirective.feedbackFlyout])\r\n .directive('scrollToTop', ScrollToTopDirective)\r\n .directive('fxpClick', clickDirective);\r\n\r\nfxpModule.filter('unCamelCase', [UnCamelCase.getSpacedString]);\r\n\r\nfxpModule\r\n .directive('adminLanding', AdminLandingDirective.adminLanding)\r\nAdminLandingDirective.adminLanding.$inject = [\"$timeout\"];\r\n\r\n\r\nfxpModule\r\n .provider('FxpCorrelationProvider', [FxpProviders.CorrelationProvider])\r\n\r\n// This must be imported in the end\r\nimport \"./module-declarations\";\r\n\r\n\r\n\r\n\r\n","/// \r\n/// \r\nimport { CommonUtils } from \"../utils/CommonUtils\";\r\nimport { EnvironmentData } from \"../telemetry/EnvironmentData\";\r\nimport {\r\n PerfMarkers,\r\n ApplicationConstants,\r\n CustomEvents,\r\n FxpConstants,\r\n} from \"../common/ApplicationConstants\";\r\nimport { IRootScope } from \"../interfaces/IRootScope\";\r\nimport { FxpAuthorizationService } from \"../services/FxpAuthorizationService\";\r\nimport { FxpConfigurationService } from \"../services/FxpConfiguration\";\r\nimport { FxpMessageService } from \"../../app/banner/FxpMessageService\";\r\nimport { FxpContext } from \"../context/FxpContext\";\r\nimport { TelemetryContext } from \"../telemetry/telemetrycontext\";\r\nimport { ILogger } from \"../interfaces/ILogger\";\r\nimport { PlannedDownTimeService } from \"../../app/systemMessages/PlannedDownTimeService\";\r\nimport { UserProfileService } from \"../services/userProfileService\";\r\nimport { OBOUserService } from \"../services/OBOUserService\";\r\nimport { FxpGlobalStoreService } from \"../services/fxp.global.store.service\";\r\nimport { FxpStateTransitionService } from \"../services/FxpStateTransitionService\";\r\nimport { AppControllerHelper } from \"../factory/AppControllerHelper\";\r\nimport { PartnerAppRegistrationService } from \"../services/PartnerAppRegistrationService\";\r\nimport { PlatformStateRouter } from \"@fxp/staterouter\";\r\nimport { PlatformStoreFactory } from \"../../app/store/platform.store.factory\";\r\nimport { ShowLoader } from \"../../app/loader/loader.actions\";\r\nimport { TelemetryConstants } from \"../telemetry/TelemetryConst\";\r\nimport { EventData } from \"../telemetry/EventData\";\r\nimport { SystemEvent } from \"../telemetry/SystemEvent\";\r\nimport { ComponentType } from \"@microsoftit/telemetry-extensions-npm\";\r\nimport { PageLoaderService } from \"../../app/loader/pageLoaderService\";\r\nimport { FxpLogHelper } from \"./../telemetry/FxpLogHelper\";\r\nimport { ErrorCodes } from \"../constants/errorCodes\";\r\nimport { ErrorSeverityLevel } from \"../telemetry/ErrorSeverityLevel\";\r\nimport { UpsertFeatureFlags } from \"../../app/flighting/featureFlags.actions\";\r\nimport {\r\n Configuration,\r\n LogLevel,\r\n PublicClientApplication,\r\n EventType,\r\n AuthenticationResult,\r\n AccountInfo,\r\n} from \"@azure/msal-browser\";\r\nimport { error } from \"jquery\";\r\nimport {\r\n MsalAuthenticationService,\r\n MsalAuthenticationServiceProvider,\r\n} from \"../services/MsalAuthenticationService\";\r\nimport { FxpRouteService } from \"../services/FxpRouteService\";\r\nimport { UserInfoService } from \"../services/UserInfoService\";\r\n\r\ndeclare type IStateService = any;\r\ndeclare type IStateProvider = any;\r\ndeclare type IUrlRouterProvider = any;\r\n\r\n/**\r\n * @application Fxp\r\n */\r\n\r\n/**\r\n * A class that contains angular configurations for FXP app\r\n * @class Fxp.Boot.FxpBootstrap\r\n * @classdesc A class that contains angular configurations for FXP app,\r\n */\r\nexport class FxpBootstrap {\r\n /**\r\n * An angular configuration for Initializing context and window error handler\r\n * @method Fxp.Boot.FxpBootstrap.fxpInit\r\n */\r\n static onloginSuccessSubcription = null;\r\n static sourceForTelemetry = `${TelemetryConstants.FXP_TELEMETRY_BASE_NAME}.FxpBootStrap`;\r\n public static msalPublicClient: PublicClientApplication;\r\n private static getCommonProperties() {\r\n let customProperties = FxpLogHelper.createPropertyBag();\r\n customProperties.addToBag(TelemetryConstants.CLASSNAME, \"FxpBootstrap\");\r\n customProperties.addToBag(TelemetryConstants.METHODNAME, \"fxpConfigInit\");\r\n customProperties.addToBag(\"BaseUrl\", ApplicationConstants.FxpBaseUrl);\r\n return customProperties;\r\n }\r\n\r\n public static fxpConfigInit = function (\r\n $provide: angular.auto.IProvideService\r\n ) {\r\n const source = `${FxpBootstrap.sourceForTelemetry}.FxpConfigInit`;\r\n if (CommonUtils.isNullOrEmpty(sessionStorage[\"startTime\"]))\r\n sessionStorage[\"startTime\"] = new Date();\r\n\r\n $provide.decorator(\"$exceptionHandler\", [\r\n \"$delegate\",\r\n \"$injector\",\r\n \"$window\",\r\n \"FxpConfigurationService\",\r\n \"FxpLoggerService\",\r\n \"FxpTelemetryContext\",\r\n \"FxpContextService\",\r\n function (\r\n $delegate,\r\n $injector: angular.auto.IInjectorService,\r\n $window: angular.IWindowService,\r\n fxpConfiguration: FxpConfigurationService,\r\n fxpLoggerService: ILogger,\r\n FxpTelemetryContext: TelemetryContext,\r\n fxpContextService: FxpContext\r\n ) {\r\n var environmentData = new EnvironmentData(\r\n fxpConfiguration.ModelConfiguration.EnvironmentName,\r\n fxpConfiguration.ModelConfiguration.ServiceOffering,\r\n fxpConfiguration.ModelConfiguration.ServiceLine,\r\n fxpConfiguration.ModelConfiguration.Service,\r\n fxpConfiguration.ModelConfiguration.ComponentId,\r\n fxpConfiguration.ModelConfiguration.ComponentName,\r\n fxpConfiguration.FxpAppSettings.ApplicationName,\r\n fxpConfiguration.ModelConfiguration.IctoId,\r\n fxpConfiguration.ModelConfiguration.BusinessProcessName\r\n );\r\n FxpTelemetryContext.setEnvironmentDetails(\"FXP\", environmentData);\r\n if (\r\n fxpConfiguration.FxpBaseConfiguration != null &&\r\n fxpConfiguration.FxpBaseConfiguration.PartnerTelemetryEnvironments !=\r\n null\r\n ) {\r\n FxpTelemetryContext.setPartnerEnvironmentDetails(\r\n fxpConfiguration.ModelConfiguration.EnvironmentName,\r\n fxpConfiguration.FxpBaseConfiguration.PartnerTelemetryEnvironments\r\n );\r\n }\r\n fxpContextService.saveContext(\r\n ApplicationConstants.BaseUrl,\r\n ApplicationConstants.FxpBaseUrl\r\n );\r\n fxpContextService.saveContext(\r\n ApplicationConstants.AssetsUrl,\r\n fxpConfiguration.FxpAppSettings.AssetsUrl\r\n );\r\n fxpContextService.saveContext(\r\n ApplicationConstants.BaseConfigDBName,\r\n fxpConfiguration.FxpBaseConfiguration\r\n );\r\n\r\n window[\"fxpLogger\"] = fxpLoggerService; //adding for backward compatibility\r\n\r\n let eventData = new SystemEvent(\r\n TelemetryConstants.FXP_TELEMETRY_PLATFORM_BOOTSTRAP +\r\n \".ConfigurationInitialization\",\r\n ComponentType.Web,\r\n \"Initializing FxP Boot Configuration\"\r\n );\r\n let customProperties = FxpBootstrap.getCommonProperties();\r\n customProperties.addToBag(\r\n \"EnvironmentName\",\r\n fxpConfiguration.ModelConfiguration.EnvironmentName\r\n );\r\n fxpLoggerService.logSystemEvent(source, eventData, customProperties);\r\n\r\n var windowOnError = function (msg, url, lineNo, columnNo, error) {\r\n var propbag = fxpLoggerService.createPropertyBag();\r\n try {\r\n propbag.addToBag(\"Url\", url);\r\n propbag.addToBag(\"LineNo\", lineNo);\r\n propbag.addToBag(\"ColumnNo\", columnNo);\r\n propbag.addToBag(\"Type\", \"javascript\");\r\n propbag.addToBag(\"Location\", window.location.hash);\r\n propbag.addToBag(\"Message\", msg);\r\n propbag.addToBag(\"ErrorObject\", CommonUtils.objectToString(error));\r\n } finally {\r\n fxpLoggerService.logError(\r\n source,\r\n `${CommonUtils.objectToString(msg)}`,\r\n ErrorCodes.GlobalExceptionHandler,\r\n error ? CommonUtils.objectToString(error.stack) : null,\r\n propbag,\r\n null,\r\n null\r\n );\r\n }\r\n };\r\n\r\n $window.onerror = windowOnError;\r\n return function (exception, cause) {\r\n $delegate(exception, cause);\r\n var propbag = fxpLoggerService.createPropertyBag();\r\n propbag.addToBag(\"Type\", \"angularjs\");\r\n propbag.addToBag(\"Location\", window.location.hash);\r\n propbag.addToBag(\"Cause\", CommonUtils.objectToString(cause));\r\n fxpLoggerService.logError(\r\n source,\r\n `${CommonUtils.objectToString(exception.message)}`,\r\n ErrorCodes.GlobalExceptionHandler_AngularJs,\r\n CommonUtils.objectToString(exception.stack),\r\n propbag\r\n );\r\n };\r\n },\r\n ]);\r\n };\r\n\r\n public static InitializeStore = function (fxpLoggerService: ILogger) {\r\n PlatformStoreFactory.CreateIfNotExist(fxpLoggerService);\r\n PlatformStateRouter.Get().Init();\r\n let properties = FxpBootstrap.getCommonProperties();\r\n properties.addToBag(TelemetryConstants.METHODNAME, \"InitializeStore\");\r\n fxpLoggerService.logTrace(\r\n `${FxpBootstrap.sourceForTelemetry}.InitializeStore`,\r\n \"Global Platform Store and Router Store has been initialized\"\r\n );\r\n };\r\n\r\n /**\r\n * An angular configuration method for setting Application theme\r\n * @method Fxp.Boot.FxpBootstrap.setSanitizedWhitelist\r\n */\r\n public static setSanitizedWhitelist = function (\r\n $compileProvider: angular.ICompileProvider\r\n ) {\r\n $compileProvider\r\n .imgSrcSanitizationWhitelist(\r\n /^\\s*(https?|http|ms-appx|ms-appx-web|data|blob):/\r\n )\r\n .aHrefSanitizationWhitelist(\r\n /^\\s*(https?|ftp|mailto|chrome-extension|sip):/\r\n );\r\n };\r\n\r\n /**\r\n * An angular configuration method for settingdefault behaviour of httpProvider\r\n * @method Fxp.Boot.FxpBootstrap.configHttpProvider\r\n */\r\n public static configHttpProvider = function (\r\n $httpProvider: angular.IHttpProvider\r\n ) {\r\n var token;\r\n\r\n // if (sessionStorage['adal.idtoken']) {\r\n // \ttoken = 'Bearer ' + sessionStorage['adal.idtoken'];\r\n // }\r\n $httpProvider.defaults.useXDomain = true;\r\n $httpProvider.defaults.headers.post[\"Content-Type\"] =\r\n \"application/x-www-form-urlencoded; charset=utf-8\";\r\n $httpProvider.defaults.headers.common[\"Authorization\"] = token;\r\n $httpProvider.interceptors.push(\r\n \"FxpPartnerHttpRequestInterceptor\",\r\n \"FxpHttpCorrelationInterceptor\",\r\n \"FxpHttpRetryInterceptor\",\r\n \"MsalHttpRequestInterceptor\"\r\n );\r\n delete $httpProvider.defaults.headers.common[\"X-Requested-With\"];\r\n };\r\n\r\n /**\r\n * An angular configuration method to register states\r\n * @method Fxp.Boot.FxpBootstrap.registerRoutes\r\n */\r\n public static registerRoutes = function (\r\n $stateProvider: IStateProvider,\r\n $urlRouterProvider: IUrlRouterProvider\r\n ) {\r\n //TODO: Record the current Route and set it later\r\n if (\r\n window.location.hash.indexOf(\"#code\") == -1 &&\r\n window.location.hash != \"#/\"\r\n ) {\r\n sessionStorage[ApplicationConstants.RequestStateName] =\r\n window.location.hash.substring(1, window.location.hash.length);\r\n }\r\n\r\n $urlRouterProvider.otherwise(\"/\");\r\n\r\n $stateProvider.state(\"Home\", {\r\n url: \"/\",\r\n requireADLogin: true,\r\n data: {\r\n headerName: \"Home\",\r\n partnerTelemetryName: \"FXP\",\r\n pageTitle: \"Home\",\r\n appNameForTelemetry: \"FxpPlatform\",\r\n pageNameForTelemetry: \"Home\",\r\n featureName: \"FxPHomePage\",\r\n actionName: \"Login\",\r\n },\r\n telemetryConfig: {\r\n pageNameForTelemetry: \"Home\",\r\n },\r\n });\r\n };\r\n\r\n /**\r\n * An angular configuration method to initialize adalAuthenticationServiceProvider\r\n * @method Fxp.Boot.FxpBootstrap.authenticationInit\r\n */\r\n public static authenticationInit = function (\r\n $httpProvider: angular.IHttpProvider\r\n ) {\r\n var config = window[\"ModelConfiguration\"];\r\n var partnerEnpoints = PartnerAppRegistrationService.getRegisterEndpoints();\r\n var endpoints = JSON.parse(\r\n JSON.stringify(eval(\"(\" + \"{\" + config.Endpoints + \"}\" + \")\")) // CodeQL [SM04509] Intent is to set a config value \r\n );\r\n endpoints = CommonUtils.jsonConcat(endpoints, partnerEnpoints);\r\n };\r\n // adalAuthenticationServiceProvider.init(\r\n // \t{\r\n // \t\tinstance: config.Instance,\r\n // \t\ttenant: config.Tenant,\r\n // \t\tclientId: config.ClientId,\r\n // \t\textraQueryParameter: 'nux=1',\r\n // \t\tendpoints: endpoints,\r\n // \t\tcacheLocation: 'localStorage',\r\n // \t\tframeRedirectUri: window.location.protocol + \"//\" + location.host + \"/AdalIFrame.html?v=1\"\r\n // \t}, $httpProvider);\r\n // };\r\n\r\n // private static loginEvent = function($cookies: angular.cookies.ICookiesService, $rootScope: IRootScope, adalAuthenticationService: adal.AdalAuthenticationService, userProfileService: UserProfileService, fxpMessage: FxpMessageService, fxpConfiguration: FxpConfigurationService, fxpContextService: FxpContext, fxpTelemetryContext: TelemetryContext, fxpLoggerService: ILogger, oboUserService: OBOUserService, fxpGlobalStoreService: FxpGlobalStoreService, timeout, appControllerHelper: AppControllerHelper, $http: angular.IHttpService) {\r\n // \tfxpLoggerService.logTrace(TelemetryConstants.FXP_TELEMETRY_BASE_NAME + \".FxpBoot\", \"Login succeeded. \");\r\n // \t \tlet currentTime = new Date().toLocaleString();\r\n // \t\tlet propbag = fxpLoggerService.createPropertyBag();\r\n // \t\tpropbag.addToBag('OnSuccessGetAdalTokenTime', `${currentTime}`);\r\n // \t\tlet eventMessage = 'Fxp adal authentication completed successfully';\r\n\r\n // \t\tlet eventData = new SystemEvent(\".OnMsalLoginSuccess\", ComponentType.Web, eventMessage);\r\n // \t\tfxpLoggerService.logSystemEvent(TelemetryConstants.FXP_TELEMETRY_BASE_NAME + \".FxpBootstrap\", eventData, propbag);\r\n\r\n // \t\tFxpBootstrap.onloginSuccessSubcription();\r\n // \t\tFxpBootstrap.onLoginSuccess($cookies, adalAuthenticationService, fxpMessage, $rootScope, fxpContextService, fxpTelemetryContext, fxpLoggerService, oboUserService, appControllerHelper, fxpConfiguration);\r\n // \t\tFxpBootstrap.evaluateFaultFeatureFlag($http, fxpConfiguration, $rootScope, fxpGlobalStoreService, adalAuthenticationService.userInfo.userName)\r\n // }\r\n\r\n /**\r\n * An angular Run for Initializing FXP APP\r\n * @method Fxp.Boot.FxpBootstrap.init\r\n */\r\n public static fxpRunInit = function (\r\n $cookies: angular.cookies.ICookiesService,\r\n $rootScope: IRootScope,\r\n userInfoService: UserInfoService,\r\n fxpMessage: FxpMessageService,\r\n fxpConfiguration: FxpConfigurationService,\r\n fxpContextService: FxpContext,\r\n fxpTelemetryContext: TelemetryContext,\r\n fxpLoggerService: ILogger,\r\n oboUserService: OBOUserService,\r\n fxpGlobalStoreService: FxpGlobalStoreService,\r\n timeout,\r\n appControllerHelper: AppControllerHelper,\r\n $http: angular.IHttpService,\r\n msalAuthenticationService: MsalAuthenticationService\r\n ) {\r\n const processName =\r\n TelemetryConstants.FXP_TELEMETRY_PLATFORM_BOOTSTRAP + \".FxPInitProcess\";\r\n $rootScope.isAuthenticated = false;\r\n $rootScope.actOnBehalfOfUserActive = false;\r\n $rootScope.isUserInfoAvailable = false;\r\n $rootScope.fxpUIConstants =\r\n fxpConfiguration.FxpBaseConfiguration.FxpConfigurationStrings;\r\n $rootScope.appBooted = true;\r\n fxpGlobalStoreService.DispatchGlobalAction(\r\n \"Platform\",\r\n ShowLoader({\r\n loadingText:\r\n $rootScope.fxpUIConstants.UIStrings.LoadingStrings.Authenticating,\r\n timeoutCallback: appControllerHelper.handleAdalErrorsAuthenticating,\r\n })\r\n );\r\n // localStorage[\"adalConfig\"] = JSON.stringify(adalAuthenticationService.config);\r\n if (sessionStorage[ApplicationConstants.RequestStateName] != undefined) {\r\n $cookies.put(\r\n \"requestedUrl\",\r\n sessionStorage[ApplicationConstants.RequestStateName]\r\n );\r\n }\r\n let customProperties = FxpBootstrap.getCommonProperties();\r\n customProperties.addToBag(TelemetryConstants.METHODNAME, \"fxpRunInit\");\r\n let eventData = new SystemEvent(\r\n processName,\r\n ComponentType.Web,\r\n \"Authentication Process Started\"\r\n );\r\n fxpLoggerService.logSystemEvent(\r\n TelemetryConstants.FXP_TELEMETRY_BASE_NAME + \".FxpBoot\",\r\n eventData,\r\n customProperties\r\n );\r\n\r\n FxpBootstrap.onloginSuccessSubcription = $rootScope.$on(\r\n \"msal:loginSuccess\",\r\n function () {\r\n fxpLoggerService.logTrace(\r\n TelemetryConstants.FXP_TELEMETRY_BASE_NAME + \".FxpBoot\",\r\n \"Login succeeded. \"\r\n );\r\n let currentTime = new Date().toLocaleString();\r\n let propbag = fxpLoggerService.createPropertyBag();\r\n propbag.addToBag(\"OnSuccessGetAdalTokenTime\", `${currentTime}`);\r\n let eventMessage = \"Fxp adal authentication completed successfully\";\r\n\r\n let eventData = new SystemEvent(\r\n \".OnMsalLoginSuccess\",\r\n ComponentType.Web,\r\n eventMessage\r\n );\r\n fxpLoggerService.logSystemEvent(\r\n TelemetryConstants.FXP_TELEMETRY_BASE_NAME + \".FxpBootstrap\",\r\n eventData,\r\n propbag\r\n );\r\n console.log(\"Logged in\");\r\n userInfoService.setCurrentUser(\r\n msalAuthenticationService.getAccount().username\r\n );\r\n userInfoService.setCurrentUserOID(\r\n msalAuthenticationService.getAccount().localAccountId\r\n );\r\n userInfoService.setCurrentUserUpn(\r\n msalAuthenticationService.getAccount().username\r\n );\r\n FxpBootstrap.onLoginSuccess(\r\n $cookies,\r\n fxpMessage,\r\n $rootScope,\r\n fxpContextService,\r\n fxpTelemetryContext,\r\n fxpLoggerService,\r\n oboUserService,\r\n appControllerHelper,\r\n fxpConfiguration,\r\n msalAuthenticationService\r\n );\r\n if (fxpConfiguration.FxpAppSettings.MakeFaultFeatureFlagEvaluateCall && JSON.parse(fxpConfiguration.FxpAppSettings.MakeFaultFeatureFlagEvaluateCall)) {\r\n FxpBootstrap.evaluateFaultFeatureFlag(\r\n $http,\r\n fxpConfiguration,\r\n $rootScope,\r\n fxpGlobalStoreService,\r\n userInfoService.getCurrentUserData()\r\n );\r\n }\r\n else {\r\n $rootScope.isAuthenticated = true;\r\n $rootScope.$broadcast(\"fxp:loginSuccess\");\r\n }\r\n\r\n }\r\n );\r\n\r\n msalAuthenticationService.login($rootScope);\r\n };\r\n\r\n public static evaluateFaultFeatureFlag(\r\n $http,\r\n fxpConfiguration,\r\n $rootScope,\r\n globalStoreService,\r\n userName\r\n ) {\r\n var flightingHeader = {\r\n headers: {\r\n \"x-FlightContext\": JSON.stringify({ username: userName }),\r\n \"x-application\": fxpConfiguration.FxpAppSettings.ApplicationName,\r\n \"x-environment\":\r\n fxpConfiguration.FxpAppSettings.FlightingEnvironmentName,\r\n },\r\n };\r\n $http\r\n .get(\r\n `${fxpConfiguration.FxpAppSettings.FlightingServiceEndpoint}/Evaluate?featureNames=${fxpConfiguration.FxpAppSettings.FaultFeatureFlagName}`,\r\n flightingHeader\r\n )\r\n .then(function (response) {\r\n globalStoreService.DispatchGlobalAction(\r\n \"Platform\",\r\n UpsertFeatureFlags(response.data)\r\n );\r\n $rootScope.isAuthenticated = true;\r\n $rootScope.$broadcast(\"fxp:loginSuccess\");\r\n });\r\n }\r\n\r\n public static onLoginFailure(\r\n fxpLoggerService: ILogger,\r\n msalAuthenticationService,\r\n error,\r\n appControllerHelper: AppControllerHelper,\r\n source,\r\n errorDesc: any,\r\n $rootScope: angular.IRootScopeService\r\n ) {\r\n const processName =\r\n TelemetryConstants.FXP_TELEMETRY_PLATFORM_BOOTSTRAP +\r\n \".AuthenticationProcess\";\r\n try {\r\n let errorDetails = CommonUtils.objectToString(error);\r\n let errorDesciption = CommonUtils.objectToString(errorDesc);\r\n let errorSource = CommonUtils.objectToString(source);\r\n if (!errorDetails) {\r\n errorDetails = \"Session timed out. \";\r\n }\r\n\r\n let currentTime = new Date().toLocaleString();\r\n let propbag = fxpLoggerService.createPropertyBag();\r\n propbag.addToBag(\"ErrorDesc\", errorDesciption);\r\n propbag.addToBag(\"OnFailureGetMsalTokenTime\", `${currentTime}`);\r\n propbag.addToBag(\"ErrorSource\", errorSource);\r\n propbag.addToBag(\r\n \"LocalStorage-ErrorDes\",\r\n localStorage[\"msal.error.description\"]\r\n );\r\n\r\n let message = `Fxp msal login failure with error - ${errorDetails}`;\r\n fxpLoggerService.logError(\r\n `${FxpBootstrap.sourceForTelemetry}.OnLoginFailure`,\r\n message,\r\n ErrorCodes.OnMsalLoginFailure,\r\n errorDesciption,\r\n propbag,\r\n null,\r\n null,\r\n ErrorSeverityLevel.Critical\r\n );\r\n\r\n console.error(errorDetails);\r\n\r\n let eventMessage = `Fxp msal login failure with error - ${errorDetails} and login popup displayed.`;\r\n let eventData = new SystemEvent(\r\n processName + \".LoginFailed\",\r\n ComponentType.Web,\r\n eventMessage\r\n );\r\n fxpLoggerService.logSystemEvent(\r\n TelemetryConstants.FXP_TELEMETRY_BASE_NAME + \".FxpBootstrap\",\r\n eventData,\r\n propbag\r\n );\r\n } catch (e) {\r\n // LogEvent will fail if the user session is expired.\r\n console.error(\r\n \"An error occurred while executing msal:loginFailure event\"\r\n );\r\n console.error(e);\r\n } finally {\r\n console.error(\r\n \"Login Expired from onLoginFailure method.. Triggering login.\"\r\n );\r\n let eventMessage = ``;\r\n let eventData = new SystemEvent(\r\n processName + \".LoginExpiredPopupDisplayed\",\r\n ComponentType.Web,\r\n eventMessage\r\n );\r\n fxpLoggerService.logSystemEvent(\r\n TelemetryConstants.FXP_TELEMETRY_BASE_NAME + \".FxpBootstrap\",\r\n eventData\r\n );\r\n\r\n // check below message and also check why automatic relogin happens without button click\r\n appControllerHelper.showModalPopupWindow(\r\n \"Login Expired\",\r\n \"Login expired due to the session timeout. Please login again.\",\r\n \"Login\",\r\n function () {\r\n fxpLoggerService.logUserAction(\r\n TelemetryConstants.FXP_TELEMETRY_BASE_NAME + \".FxpBootstrap\",\r\n \"Re-Login button click\",\r\n \"User clicked Relogin button. Triggered re-login process.\"\r\n );\r\n msalAuthenticationService.login($rootScope);\r\n }\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * A method that is called on every success login. sets the user contexts\r\n * @method Fxp.Boot.FxpBootstrap.onLoginSuccess\r\n */\r\n public static onLoginSuccess = function (\r\n $cookies: angular.cookies.ICookiesService,\r\n fxpMessage: FxpMessageService,\r\n $rootScope: IRootScope,\r\n fxpContextService: FxpContext,\r\n fxpTelemetryContext: TelemetryContext,\r\n fxpLoggerService: ILogger,\r\n oboUserService: OBOUserService,\r\n appControllerHelper: AppControllerHelper,\r\n fxpConfiguration: FxpConfigurationService,\r\n msalAuthenticationService: MsalAuthenticationService\r\n ) {\r\n const processName =\r\n TelemetryConstants.FXP_TELEMETRY_PLATFORM_BOOTSTRAP +\r\n \".AuthenticationProcess\";\r\n const source_telemetry: string = `${FxpBootstrap.sourceForTelemetry}.OnLoginSuccess`;\r\n if (FxpBootstrap.onloginSuccessSubcription) {\r\n // unsubscribe the 'adal:loginSuccess' event.\r\n FxpBootstrap.onloginSuccessSubcription();\r\n }\r\n\r\n let loginFailureHandler = $rootScope.$on(\r\n \"msal:loginFailure\",\r\n function (source, errorDesc, error, error_code) {\r\n loginFailureHandler(); //unsubscribe the event.\r\n fxpMessage.showBanner = false;\r\n FxpBootstrap.onLoginFailure(\r\n fxpLoggerService,\r\n msalAuthenticationService,\r\n error,\r\n appControllerHelper,\r\n source,\r\n errorDesc,\r\n $rootScope\r\n );\r\n }\r\n );\r\n\r\n let acquiretokenFailure = $rootScope.$on(\r\n \"msal:acquireTokenFailure\",\r\n function (source, errorDesc, err, resource, error_code) {\r\n let error = CommonUtils.objectToString(err);\r\n let bag = fxpLoggerService.createPropertyBag();\r\n bag.addToBag(\"ErrorDesc\", CommonUtils.objectToString(errorDesc));\r\n bag.addToBag(\"ErrorResource\", CommonUtils.objectToString(resource));\r\n bag.addToBag(\"ErrorSource\", CommonUtils.objectToString(source));\r\n bag.addToBag(\"MsalError\", error);\r\n bag.addToBag(\r\n \"LocalStorage-ErrorDes\",\r\n localStorage[\"Msal.error.description\"]\r\n );\r\n fxpLoggerService.logException(\r\n source_telemetry,\r\n new Error(`TokenAcquisitionFailed with error ${error}`),\r\n bag,\r\n null,\r\n null,\r\n ErrorSeverityLevel.Medium,\r\n ErrorCodes.OnMsalTokenFailure\r\n );\r\n\r\n if (err === EventType.ACQUIRE_TOKEN_FAILURE) {\r\n $rootScope.isLoginRequired = true;\r\n fxpMessage.showBanner = true;\r\n acquiretokenFailure(); // unsubscribe\r\n let eventData = new SystemEvent(\r\n processName + \".LoginRequired\",\r\n ComponentType.Web,\r\n \"Login Required by Msal. Diplayed Login Expired popup window. \"\r\n );\r\n fxpLoggerService.logSystemEvent(\r\n TelemetryConstants.FXP_TELEMETRY_BASE_NAME + \".FxpBootstrap\",\r\n eventData\r\n );\r\n console.error(\r\n \"Login expired during token acquisition. Invoking login from Msal:acquireTokenFailure handler\"\r\n );\r\n\r\n if (error_code === undefined || (error_code !== \"monitor_window_timeout\")) {\r\n fxpMessage.addMessage(\r\n \"Authorization failed. Please contact IT Support.\",\r\n FxpConstants.messageType.error,\r\n true\r\n );\r\n }\r\n else if (error_code !== undefined && error_code === \"monitor_window_timeout\") {\r\n fxpLoggerService.logEvent(`${TelemetryConstants.FXP_TELEMETRY_BASE_NAME}.Monitor_Timeout_Window_Error`, 'Monitor_Timeout_Window_Error', bag);\r\n\r\n appControllerHelper.showModalPopupWindow(\r\n \"Login Expired\",\r\n \"Login expired due to the session timeout. Please login again.\",\r\n \"Login\",\r\n function () {\r\n fxpLoggerService.logUserAction(\r\n TelemetryConstants.FXP_TELEMETRY_BASE_NAME + \".FxpBootstrap\",\r\n \"Re-Login button click\",\r\n \"User clicked Relogin button. Triggered re-login process.\"\r\n );\r\n const self = this;\r\n self.fxplogger.logEvent(`${TelemetryConstants.FXP_TELEMETRY_BASE_NAME}.Monitor_Timeout_Window.reLaunch`, `${TelemetryConstants.FXP_TELEMETRY_BASE_NAME}.SessionTimeoutModal.RelaunchButtonClicked`);\r\n localStorage.clear();\r\n window.location.reload();\r\n }\r\n );\r\n }\r\n } else {\r\n let message = `AcquireTokenFailure with error ${err}`;\r\n fxpLoggerService.logError(\r\n source_telemetry,\r\n message,\r\n ErrorCodes.AcquireTokenFailure_UnKnown_Reason,\r\n errorDesc,\r\n bag,\r\n null,\r\n null,\r\n ErrorSeverityLevel.Medium\r\n );\r\n fxpMessage.addMessage(\r\n \"Authorization failed. Please contact IT Support.\",\r\n FxpConstants.messageType.error,\r\n true\r\n );\r\n // msalAuthenticationService.login($rootScope);\r\n }\r\n }\r\n );\r\n\r\n // localStorage.setItem(\"AADBasicInfo\", JSON.stringify(adalAuthenticationService.userInfo));\r\n\r\n FxpBootstrap.setTelemetryUserContext(\r\n fxpLoggerService,\r\n fxpConfiguration,\r\n msalAuthenticationService\r\n );\r\n let eventData = new SystemEvent(\r\n processName + \".LoginProcessCompleted\",\r\n ComponentType.Web,\r\n \"Login succeded.\"\r\n );\r\n fxpLoggerService.logSystemEvent(\r\n TelemetryConstants.FXP_TELEMETRY_BASE_NAME + \".FxpBootstrap\",\r\n eventData\r\n );\r\n\r\n fxpLoggerService.startTrackPerformance(PerfMarkers.FxpLoad);\r\n fxpLoggerService.startTrackPerformance(PerfMarkers.PreDashboardLoad);\r\n var requestedUrlCookie = $cookies.get(\"requestedUrl\");\r\n sessionStorage[ApplicationConstants.RequestStateName] = requestedUrlCookie;\r\n\r\n $cookies.remove(\"requestedUrl\");\r\n\r\n // if (msalAuthenticationService.getAccount().userInfo &&\r\n // \tmsalAuthenticationService.getAccount().userInfo.profile &&\r\n // \tmsalAuthenticationService.getAccount().userInfo.profile.ipaddr) {\r\n // \tfxpTelemetryContext.setGeography(adalAuthenticationService.userInfo.profile.ipaddr);\r\n // }\r\n\r\n var sessionIdCached = window.sessionStorage.getItem(\r\n ApplicationConstants.FxpSessionKey\r\n );\r\n var sessionId: any;\r\n if (CommonUtils.isNullOrEmpty(sessionIdCached)) {\r\n sessionId = fxpTelemetryContext.setNewUserSession(\r\n msalAuthenticationService.getAccount().username\r\n );\r\n window.sessionStorage.setItem(\r\n ApplicationConstants.FxpSessionKey,\r\n sessionId\r\n );\r\n\r\n var propbag = fxpLoggerService.createPropertyBag();\r\n propbag.addToBag(\r\n \"UserId\",\r\n msalAuthenticationService.getAccount().username\r\n );\r\n propbag.addToBag(\"SessionId\", sessionId);\r\n let eventData = new SystemEvent(\r\n processName + \".UserSessionCreated\",\r\n ComponentType.Web,\r\n \"Login succeded.\"\r\n );\r\n fxpLoggerService.logSystemEvent(\r\n TelemetryConstants.FXP_TELEMETRY_BASE_NAME + \".FxpBootstrap\",\r\n eventData,\r\n propbag\r\n );\r\n } else {\r\n sessionId = fxpTelemetryContext.setNewUserSession(\r\n msalAuthenticationService.getAccount().username,\r\n sessionIdCached\r\n );\r\n }\r\n\r\n fxpContextService.saveContext(\"sessionId\", sessionId);\r\n $rootScope.sessionId = sessionId;\r\n };\r\n\r\n public static setTelemetryUserContext(\r\n fxpLoggerService: ILogger,\r\n fxpConfiguration: FxpConfigurationService,\r\n msalAuthenticationService: MsalAuthenticationService\r\n ) {\r\n // Below code commented after utp app id deletion\r\n /* const utpApiClientId = fxpConfiguration.FxpAppSettings.UTP_API_ClientId;\r\n msalAuthenticationService.getTokenForAppIdAsync(utpApiClientId).then(\r\n (token) => {\r\n //fxpLoggerService.setLoggedInUserContextInUTP(token);\r\n },\r\n (error) => {\r\n fxpLoggerService.logException(\r\n `${FxpBootstrap.sourceForTelemetry}.SetTelemetryUserContext`,\r\n error,\r\n null,\r\n null,\r\n null,\r\n ErrorSeverityLevel.Medium,\r\n ErrorCodes.OnTelemetryContextError\r\n );\r\n }\r\n ); */\r\n }\r\n\r\n /**\r\n * An angular Run for assigning rootScope Event handlers\r\n * @method Fxp.Boot.FxpBootstrap.rootScopeEventHandler\r\n */\r\n public static rootScopeEventHandler = function (\r\n $rootScope: IRootScope,\r\n fxpAuthorizationService: FxpAuthorizationService,\r\n fxpConfigurationService: FxpConfigurationService,\r\n plannedDownTimeService: PlannedDownTimeService,\r\n $state: IStateService,\r\n fxpStateTransitionService: FxpStateTransitionService,\r\n fxpLoggerService: ILogger\r\n ) {\r\n fxpStateTransitionService.onStateChangeStart((item) => {\r\n // next is an object that is the route that we are starting to go to\r\n // current is an object that is the route where we are currently\r\n\r\n const source = `${TelemetryConstants.FXP_TELEMETRY_BASE_NAME}.FxpStateTransitionService.onStateChangeStart`;\r\n try {\r\n $rootScope.stateChangeStartTime = performance.now();\r\n var currentPath = item.fromState.name;\r\n var nextPath = item.toState.name;\r\n let propBag = fxpLoggerService.createPropertyBag();\r\n propBag.addToBag(\"CurrentState\", currentPath);\r\n propBag.addToBag(\"DestinationState\", nextPath);\r\n propBag.addToBag(\r\n \"StateChangeStartTime\",\r\n parseFloat($rootScope.stateChangeStartTime).toString()\r\n );\r\n fxpLoggerService.logEvent(\r\n source,\r\n `${TelemetryConstants.FXP_TELEMETRY_BASE_NAME}.StateChange.Started`,\r\n propBag\r\n );\r\n\r\n var preStateDuration = 0;\r\n var displayName = \"\";\r\n if (currentPath == nextPath) {\r\n $rootScope.startTime = 0;\r\n }\r\n\r\n if ($rootScope.startTime) {\r\n preStateDuration =\r\n $rootScope.stateChangeStartTime - $rootScope.startTime;\r\n displayName = $rootScope.displayName || \"\";\r\n }\r\n\r\n $rootScope.$emit(\"resetPageLoadMetrics\");\r\n $rootScope.pageLoadMetrics.pageTransitionStatus = \"stateChangeStart\";\r\n $rootScope.pageLoadMetrics.sourceRoute = currentPath;\r\n $rootScope.pageLoadMetrics.destinationRoute = nextPath;\r\n $rootScope.pageLoadMetrics.preStateDuration = preStateDuration;\r\n $rootScope.pageLoadMetrics.pageDisplayName = displayName;\r\n $rootScope.pageLoadMetrics.sourceRouteURL = item.fromState.templateUrl;\r\n $rootScope.pageLoadMetrics.destinationRouteURL =\r\n item.toState.templateUrl;\r\n\r\n fxpAuthorizationService.checkStatePermission(event, item.toState);\r\n\r\n if (plannedDownTimeService.isStateDown(nextPath)) {\r\n if (event) {\r\n event.preventDefault();\r\n }\r\n $state.go(\"SystemDown\");\r\n }\r\n } catch (err) {\r\n const errorProperites = fxpLoggerService.createPropertyBag();\r\n errorProperites.addToBag(\"Message\", err.message);\r\n errorProperites.addToBag(\r\n \"ErrorCode\",\r\n ErrorCodes.OnStateChangeStartException\r\n );\r\n\r\n fxpLoggerService.logException(\r\n source,\r\n err,\r\n errorProperites,\r\n undefined,\r\n undefined,\r\n ErrorSeverityLevel.Critical\r\n );\r\n }\r\n });\r\n };\r\n}\r\n","import { TelemetryConstants } from \"../telemetry/TelemetryConst\";\r\n\r\nexport class CustomEvents {\r\n\tpublic static UserSessionCreated: string = 'UserSessionCreated';\r\n\tpublic static FxpAppLaunched: string = 'FxpAppLaunched';\r\n\tpublic static StartUpFlagRetrieved = 'StartUpFlagRetrieved';\r\n\tpublic static PageTourFlagRetrieved = 'PageTourFlagRetrieved';\r\n\tpublic static SkypeBotInit = 'SkypeBotInit';\r\n\tpublic static ProfileNotFound = 'ProfileNotFound';\r\n\tpublic static RedirectedToSales = 'RedirectedToSales';\r\n\tpublic static OnProfileFromGraphAPI = 'OnProfileFromGraphAPI';\r\n}\r\n\r\nexport class ApplicationConstants {\r\n\tpublic static Application = \"Application\";\r\n\tpublic static Global = \"Global\";\r\n\tpublic static GlobalContextDBName: string = 'globalV3';\r\n\tpublic static BootApiUrl = \"/Home/GetClientSideConfiguration\";\r\n\tpublic static WorkerFilepath = \"../js/webworker/fxpwebworker.js\";\r\n\tpublic static BaseConfigDBName = \"BaseConfigDB\";\r\n\tpublic static PersonaConfigByRoleGroupId = \"/Home/GetConfiguration\";\r\n\t/*Added for partner Login : OPS is expecting \"Partners~user\" for getBasicprofile api */\r\n\tpublic static PartnerDomain = \"Partners~\";\r\n\tpublic static PartnerDomainIss = \"https://sts.windows.net/a5f51bc5-4d47-4954-a546-bafe55e8db16/\";\r\n\tpublic static UserProfile = \"UserInfo\";\r\n\tpublic static UIConfigDB = \"UIConfigDB\";\r\n\tpublic static UserInfo = \"userInfo\";\r\n\tpublic static UserClaims = \"userClaims\";\r\n\tpublic static BaseUrl = \"BaseUrl\";\r\n\tpublic static FxpBaseUrl = \"https://\" + window.location.host;\r\n\tpublic static AssetsUrl = \"AssetsUrl\";\r\n\tpublic static ProfileStateName = \"profile\";\r\n\tpublic static ErrorStateNames = [\"oneprofile.customErrorPage\", \"unauthorized\"];\r\n\tpublic static RequiredMessage = \"{0} is required\";\r\n\tpublic static CouchBaseLoginContract = \"api/Login?dbName=\";\r\n\tpublic static FxpSessionKey = \"FxpSessionId\";\r\n\tpublic static FxpApplaunchedKey = \"FxpAppLaunched\";\r\n\tpublic static RequestStateName = \"REQSTATE\";\r\n\tpublic static FxpBreadcrumbStorageKey = \"FxpBreadCrumb\";\r\n\tpublic static PageTourFeature = \"PageTour\";\r\n\tpublic static UserPreferencesSettings = \"UserPreferences\";\r\n\tpublic static FxPAppName = \"FxP\";\r\n\tpublic static FxPDbName = \"FxPV2\";\r\n\tpublic static UserPreferencesStorageKey = \"{0}-preferences\";\r\n\tpublic static PageTourLoggerService = \"FxpLoggerService\";\r\n\tpublic static FxpAdminData = \"AdminTilesData\";\r\n\tpublic static SnowRequestTypeSettings = \"SnowRequestType\";\r\n\tpublic static ESTenanatUrlString = \"ESXP\";\r\n\tpublic static SalesTenantUrlString = \"li360\";\r\n\tpublic static XUserClaimsToken = \"X-UserClaimsToken\";\r\n\tpublic static XTenantId = \"X-TenantId\";\r\n\tpublic static XResources = \"X-Resources\";\r\n\tpublic static GraphApiProfileUrl = \"myorganization/me?api-version=1.6\";\r\n\tpublic static DefaultHelpLink = \"Default\";\r\n\tpublic static AdalLoginError = \"AdalLoginError\";\r\n\tpublic static AdalLoginRequest = \"AdalLoginRequest\";\r\n\tpublic static XUserProfileToken =\"X-UserProfileToken\";\r\n\tpublic static FlightingStatusHeader =\"X-Flighting-Call-Status\";\r\n\tpublic static signalRTenant = \"FXP\";\r\n\tpublic static PIIFilterRegex = `[\"Bearer\\\\\\\\sey[^\\\\\"'\\\\\\\\s,]+\"]`\r\n\tpublic static ProfileFlyoutConfig = \"[{\\\"experience\\\":\\\"r360wbExperience\\\",\\\"featureFlag\\\":\\\"VERGE__R360wbflag\\\",\\\"link\\\":\\\"#/myprofile\\\",\\\"displayName\\\":\\\"Manage Profile\\\",\\\"tooltip\\\":\\\"Click to manage profile\\\",\\\"isEnabled\\\":false,\\\"target\\\":\\\"_self\\\",\\\"popoutIcon\\\":false},{\\\"experience\\\":\\\"basicProfileExperience\\\",\\\"featureFlag\\\":\\\"VERGE__R360wbflag\\\",\\\"link\\\":\\\"#/profile/{userAlias}/basic\\\",\\\"displayName\\\":\\\"View Full Profile\\\",\\\"tooltip\\\":\\\"Click to view profile\\\",\\\"isEnabled\\\":false,\\\"target\\\":\\\"_self\\\",\\\"popoutIcon\\\":false}]\";\r\n}\r\n\r\nexport class FxpConstants {\r\n\tpublic static messageType = {\r\n\t\terror: \"error\",\r\n\t\twarning: \"warning\",\r\n\t\tinfo: \"info\",\r\n\t\tsuccess: \"success\",\r\n\t\treload: \"reload\"\r\n\t};\r\n\r\n\tpublic static CONST = {\r\n\t\tfxpUserClaimsSession: \"fxpUserClaims\",\r\n\t\tString: \"string\" \r\n\t};\r\n\r\n\tpublic static StateEvents = {\r\n\t\tOnStart: 1,\r\n\t\tonSuccess: 2,\r\n\t\tonError: 3,\r\n\t\tonInvalid: 4\r\n\t}\r\n\r\n\tpublic static metricConstants = {\r\n\t\tGetBasicProfileSvcName: \"Get Basic Profile Service\",\r\n\t\tGetUserClaimsSvcName: \"Get User Claims Service\",\r\n\t\tFXPApplicationLaunchMetric: \"FXP Application Launch Metric\",\r\n\t\tFXPApplicationLaunchTimeMetric: `${TelemetryConstants.FXP_TELEMETRY_BASE_NAME}.FXPApplicationLaunchMetric`,\r\n\t\tUserClaimsResponseTime: `${TelemetryConstants.FXP_TELEMETRY_BASE_NAME}.UserClaimsResponseTime`,\r\n\t\tUserClaimsResponseTimeError: `${TelemetryConstants.FXP_TELEMETRY_BASE_NAME}.UserClaimsResponseTimeError`,\r\n\t\tStatus: \"Status\",\r\n\t\tCurrentTime: \"CurrentTime\",\r\n\t\tStatusText: \"StatusText\",\r\n\t\tStartTime: \"StartTime\",\r\n\t\tEndTime: \"EndTime\",\r\n\t\tServiceName: \"ServiceName\",\r\n\t\tServiceURL: \"ServiceURL\",\r\n\t\tUserAgent: \"UserAgent\",\r\n\t\tUserProfileService: `${TelemetryConstants.FXP_TELEMETRY_BASE_NAME}.UserProfileService`,\r\n\t\tFxpAppLaunch: \"Fxp.AppLaunch\",\r\n\t\tSessionId: \"SessionId\",\r\n\t\tUserUPN: \"UserUPN\",\r\n\t\tUserBusinessRole: \"UserBusinessRole\",\r\n\t\tGeography: \"Geography\",\r\n\t\tBrowserAgent: \"BrowserAgent\",\r\n\t\tSearchProfileServiceTime: `${TelemetryConstants.FXP_TELEMETRY_BASE_NAME}.SearchProfileServiceResponseTime`,\r\n\t\tSearchProfileServiceErrorTime: `${TelemetryConstants.FXP_TELEMETRY_BASE_NAME}.SearchProfileServiceResponseTime-Error`,\r\n\t\tAdminPersonalizationUserNavLinksCount: `${TelemetryConstants.FXP_TELEMETRY_BASE_NAME}.AdminPersonalizationUserNavLinksCount`,\r\n\t\tFxpLoadDuration: `${TelemetryConstants.FXP_TELEMETRY_BASE_NAME}.FxpLoadDuration`,\r\n\t\tsearchProfileSvcName: \"Search Profile Service\",\r\n\t\tTimeStamp: \"TimeStamp\",\r\n\t\tL0BusinessProcessName: \"L0BusinessProcessName\",\r\n\t\tL0Name: \"L0Name\",\r\n\t\tL0Name_L1Name: \"L0Name_L1Name\",\r\n\t\tUserRoleGroup: \"UserRoleGroup\",\r\n\t\tLeftNavigationClickCountbyRoleGroup: `${TelemetryConstants.FXP_TELEMETRY_BASE_NAME}.LeftNavigationClickCountbyRoleGroup`,\r\n\t\tLeftNavigationClickCountbyRole: `${TelemetryConstants.FXP_TELEMETRY_BASE_NAME}.LeftNavigationClickCountbyRole`,\r\n\t\tRequestedUserAlias: \"RequestedUserAlias\",\r\n\t\tRequestedUserRoleGroupId: \"RequestedUserRoleGroupId\",\r\n\t\tScreenRoute: \"ScreenRoute\",\r\n\t\tFeedbackType: \"FeedbackType\",\r\n\t\tAction: \"Action\",\r\n\t\tUserFeedback: \"UserFeedback\",\r\n\t\tUserFeedbackErrorMessage: \"UserFeedbackErrorMessage\",\r\n\t\tOBOUserRoleGroupName: \"OBOUserRoleGroupName\",\r\n\t\tOBOUserBusinessRole: \"OBOUserBusinessRole\",\r\n\t\tOBOUserUPN: \"OBOUserUPN\",\r\n\t\tBreadcrumbString: \"BreadcrumbString\",\r\n\t\tBrowserPageTitle: \"BrowserPageTitle\",\r\n\t\tLoggedinUserName: \"UserName\",\r\n\t\tOBOUserName: \"OBOUserName\",\r\n\t\tOperatingSystem: \"OperatingSystem\",\r\n\t\tBrowserType: \"BrowserType\",\r\n\t\tBrowserVersion: \"BrowserVersion\",\r\n\t\tDeviceType: \"DeviceType\",\r\n\t\tTotalDuration: \"TotalDuration\",\r\n\t\tUIRenderDuration: \"UIRenderDuration\",\r\n\t\tLeftNavPinStatus: \"LeftNavPinStatus\",\r\n\t\tGetSettingsAPIResponseDuration: \"GetSettingsAPIResponseDuration\",\r\n\t\tSaveSettingsAPIResponseDuration: \"SaveSettingsAPIResponseDuration\",\r\n\t\tModifiedRoleGroupName: \"ModifiedRoleGroupName\",\r\n\t\tModifiedRoleGroupID: \"ModifiedRoleGroupID\",\r\n\t\tModifiedBusinessRoleName: \"ModifiedBusinessRoleName\",\r\n\t\tModifiedBusinessRoleID: \"ModifiedBusinessRoleID\",\r\n\t\tOBOUserAlias: \"OBOUserAlias\",\r\n\t\tLeftNavLinksValueBeforeModification: \"LeftNavLinksValueBeforeModification\",\r\n\t\tLeftNavLinksValueAfterModification: \"LeftNavLinksValueAfterModification\",\r\n\t\tErrorUrl: \"ErrorUrl\",\r\n\t\tGlobalErrorDetail: \"ErrorDetails\",\r\n\t\tFooterLinkUrl: \"FooterLinkUrl\",\r\n\t\tFooterLinkName: \"FooterLinkName\",\r\n\t\tHeaderClickNavigatedStateName: \"NavigatedStateName\",\r\n\t\tHeaderClickNavigatedStateTemplateURL: \"NavigatedStateTemplateURL\",\r\n\t\tMiniProfileIconClick: \"MiniProfileIconClick\",\r\n\t\tProfileLinkClick: \"ProfileLinkClick\",\r\n\t\tChatIconClick: \"ChatIconClick\",\r\n\t\tMailIconClick: \"MailIconClick\",\r\n\t\tHelpLinkParent: \"HelpLinkParent\",\r\n\t\tHelpLinkChild: \"HelpLinkChild\",\r\n\t\tHelpIconClicked: \"HelpIconClicked\",\r\n\t\tHelpView: \"HelpView\",\r\n\t\tErrorText: \"ErrorText\",\r\n\t\tUserPorfileServiceEndPoint:\"User Porfile Service EndPoint\",\r\n\t\tIsLoginRequired: \"IsLoginRequired\",\r\n\t\tError: \"Error\",\r\n\t\tIsCSABlockedUser: \"IsCSABlockedUser\",\r\n\t\tModuleBootstrapping: `${TelemetryConstants.FXP_TELEMETRY_BASE_NAME}.ModuleBootstrapping`\r\n\t};\r\n\r\n\tpublic static OBOConstants =\r\n\t\t{\r\n\t\t\tOnBehalfOfUserName: \"OnBehalfOfUserName\",\r\n\t\t\tOnBehalfOfUserAlias: \"OnBehalfOfUserAlias\",\r\n\t\t\tOnBehalfOfUserUpn: \"OnBehalfOfUserUpn\",\r\n\t\t\tActonBehalfMode: \"ActonBehalfMode\",\r\n\t\t\tOnBehalfOfUserBusinessRoleId: \"OnBehalfOfUserBusinessRoleId\",\r\n\t\t\tOnBehalfOfUserBusinessRole: \"OnBehalfOfUserBusinessRole\",\r\n\t\t\tOnBehalfOfUserRoleGroup: \"OnBehalfOfUserRoleGroup\",\r\n\t\t\tAdminActOnBehaflOfDuratoin: \"AdminActOnBehaflOfDuratoin\",\r\n\t\t\tActonBehalfofAdminStartTime: \"ActonBehalfofAdminStartTime\",\r\n\t\t\tActonBehalfofAdminEndTime: \"ActonBehalfofAdminEndTime\"\r\n\t\t};\r\n\tpublic static ActionTypes =\r\n\t\t{\r\n\t\t\tAdd: \"AddedItems\",\r\n\t\t\tSave: \"Save\",\r\n\t\t\tSubmit: \"Submit\",\r\n\t\t\tRemove: \"RemovedItems\",\r\n\t\t\tCancel: \"Cancel\",\r\n\t\t\tClick: \"Click\"\r\n\t\t};\r\n\tpublic static keyCodes =\r\n\t\t{\r\n\t\t\tescapeKey: 27,\r\n\t\t\tarrowRightKey: 39,\r\n\t\t\tarrowLeftKey: 37,\r\n\t\t\tarrowDownKey: 40,\r\n\t\t\tarrowUpKey: 38,\r\n\t\t\tenterKey: 13,\r\n\t\t\ttabKey: 9,\r\n\t\t\tspaceBar: 32\r\n\t\t};\r\n\tpublic static applicableDevice = {\r\n\t\tdesktop: \"Desktop\",\r\n\t\tmobile: \"Mobile\",\r\n\t\tall: \"All\"\r\n\t};\r\n\tpublic static BreadcrumbEventType = {\r\n\t\tBreadcrumbLoad: \"BreadcrumbLoad\",\r\n\t\tBreadcrumbClick: \"BreadcrumbClick\"\r\n\t};\r\n\tpublic static askOps = {\r\n\t\tcreateLink: \"createAskOpsRequest\",\r\n\t\tviewLink: \"https://microsoft.service-now.com/it/my_items.do?view=open_items\"\r\n\t};\r\n}\r\n\r\nexport class PerfMarkers {\r\n\tpublic static FxpLoad = `${TelemetryConstants.FXP_TELEMETRY_BASE_NAME}.FxpLoad`;\r\n\tpublic static GetUserClaims = `${TelemetryConstants.FXP_TELEMETRY_BASE_NAME}.GetUserClaims`;\r\n\tpublic static GetUserThumbnail = `${TelemetryConstants.FXP_TELEMETRY_BASE_NAME}.GetUserThumbnail`;\r\n\tpublic static GetBasicProfileWithAdal = `${TelemetryConstants.FXP_TELEMETRY_BASE_NAME}.GetBasicProfileWithAdal`;\r\n\tpublic static AdalTimeGetBasicProfile = `${TelemetryConstants.FXP_TELEMETRY_BASE_NAME}.AdalTimeGetBasicProfile`;\r\n\tpublic static DashboardLoad = `${TelemetryConstants.FXP_TELEMETRY_BASE_NAME}.DashboardLoad`;\r\n\tpublic static LoadRoutes = `${TelemetryConstants.FXP_TELEMETRY_BASE_NAME}.LoadRoutes`;\r\n\tpublic static PreDashboardLoad = `${TelemetryConstants.FXP_TELEMETRY_BASE_NAME}.PreDashboardLoad`;\r\n\tpublic static SavePersonalizedNavItems = `${TelemetryConstants.FXP_TELEMETRY_BASE_NAME}.SavePersonalizedNavItems`;\r\n\tpublic static SaveRoleGroupPersonalizedNavItems = `${TelemetryConstants.FXP_TELEMETRY_BASE_NAME}.SaveRoleGroupPersonalizedNavItems`;\r\n\tpublic static GetPersonalizedNavItems = `${TelemetryConstants.FXP_TELEMETRY_BASE_NAME}.GetPersonalizedNavItems`;\r\n\tpublic static GetMasterLeftNavItems = `${TelemetryConstants.FXP_TELEMETRY_BASE_NAME}.GetMasterLeftNavItems`;\r\n\tpublic static SendUserFeedback = `${TelemetryConstants.FXP_TELEMETRY_BASE_NAME}.SendUserFeedback`;\r\n\tpublic static GetRoleGroupDetails = `${TelemetryConstants.FXP_TELEMETRY_BASE_NAME}.GetRoleGroupDetails`;\r\n\r\n\tpublic static GetLeftNavData = `${TelemetryConstants.FXP_TELEMETRY_BASE_NAME}.GetLeftNavData`;\r\n\tpublic static GetAdminDataFromServer = `${TelemetryConstants.FXP_TELEMETRY_BASE_NAME}.GetAdminDataFromServer` ;\r\n\tpublic static GetTenantClaims = `${TelemetryConstants.FXP_TELEMETRY_BASE_NAME}.GetTenantClaims`;\r\n}\r\n\r\nexport class RoleGroupInfo {\r\n\tpublic static RoleGroupId = \"RoleGroupId\";\r\n\tpublic static RoleGroupName = \"RoleGroupName\";\r\n}\r\n\r\nexport class TenantInfo {\r\n\tpublic static TenantKey = \"TenantKey\";\r\n\tpublic static TenantName = \"TenantName\";\r\n}","import { IRootScope } from \"../interfaces/IRootScope\";\r\nimport { IAppControllerScope } from \"../interfaces/IAppControllerScope\";\r\nimport { FxpBroadcastedEvents } from \"../services/FxpBroadcastedEvents\";\r\n\r\nexport abstract class FxpBaseController {\r\n\r\n\tprivate $rootScope: IRootScope;\r\n\tprivate $scope: IAppControllerScope;\r\n\tconstructor($rootScope: IRootScope, $scope: IAppControllerScope) {\r\n\t\tthis.$rootScope = $rootScope;\r\n\t\tthis.$scope = $scope;\r\n\t\tif (this.$rootScope.isFxpLoadedWithClaims) {\r\n\t\t\tthis.OnFxpLoadedHandler();\r\n\t\t}\r\n\t\telse {\r\n\t\t\tthis.$scope.$on(FxpBroadcastedEvents.OnFxpLoadCompleted, this.OnFxpLoadedHandler.bind(this));\r\n\t\t}\r\n\t}\r\n\r\n\tprivate OnFxpLoadedHandler() {\r\n\t\tif (this.$scope.onFxpLoaded) {\r\n\t\t\tthis.$scope.onFxpLoaded();\r\n\t\t}\r\n\t\telse {\r\n\t\t\tconsole.log(\"No Functionality defined for FXP load\");\r\n\t\t}\r\n\t}\r\n\tabstract onFxpLoaded();\r\n}","import { ApplicationConstants } from \"./ApplicationConstants\";\r\nimport { CommonUtils } from \"../utils/CommonUtils\";\r\n\r\nexport class FxpWorkerActions {\r\n\r\n\tprivate static _fxpouchdbworker: FxpWorkerActions;\r\n\tpublic pcworker;\r\n\r\n\tconstructor() {\r\n\t\tFxpWorkerActions._fxpouchdbworker = this;\r\n\t}\r\n\r\n\tpublic static getWorkerInstance(): FxpWorkerActions {\r\n\t\tif (CommonUtils.isNullOrEmpty(this._fxpouchdbworker)) {\r\n\t\t\tthis._fxpouchdbworker = new FxpWorkerActions();\r\n\t\t}\r\n\t\treturn this._fxpouchdbworker;\r\n\t}\r\n\r\n\tpublic startFxpWebWorker(): void {\r\n\t\tif (typeof (Worker) !== \"undefined\" && typeof (this.pcworker) == \"undefined\") {\r\n\t\t\tthis.pcworker = new Worker(ApplicationConstants.WorkerFilepath);\r\n\t\t}\r\n\t\telse {\r\n\t\t\tconsole.log(\"Worker is not supported \");\r\n\t\t}\r\n\t}\r\n\r\n\tpublic sendMessage(data): void {\r\n\t\tif (this.pcworker != undefined) {\r\n\t\t\tthis.pcworker.postMessage(data) // Start worker with sync \r\n\t\t}\r\n\t\telse {\r\n\t\t\tthis.startFxpWebWorker();\r\n\t\t\tthis.pcworker.postMessage(data)\r\n\t\t}\r\n\t}\r\n\r\n\tpublic stopFxpWebWorker(): void {\r\n\t\t//Stop the web worker\r\n\t\tif (this.pcworker != undefined) {\r\n\t\t\tthis.pcworker.terminate();\r\n\t\t}\r\n\t}\r\n\r\n}","import { INotification } from \"../interfaces/INotification\";\r\n\r\nexport class NotificationAPI implements INotification {\r\n\tconstructor() { }\r\n\r\n\tShowNotification(message: string, title: string, type: string) {\r\n\r\n\t\talert(message);\r\n\r\n\t}\r\n}","import { IPouchDbService } from \"../interfaces/ipouchdbservice\";\r\nimport { PouchDbConnection } from \"./PouchDbConnection\";\r\nimport { IPouchDBProvider } from \"../interfaces/IPouchDBProvider\";\r\nimport { PouchDbService } from \"./PouchDbService\";\r\n\r\n\r\n/**\r\n* A service which provides PouchDb Connection\r\n* @class Fxp.Common.PouchDBProvider\r\n* @classdesc A service which provides PouchDb Connection\r\n* @example Example to create an instance of Fxp PouchDBProvider \r\n* //Initializing Fxp Message\r\n* angular.module('FxPApp').service('FxpContextService', ['PouchDBProvider', FxpContext]);\r\n* function FxpContext(PouchDBProvider){ PouchDBProvider.getDBConnection(Fxp.Common.Constants.ApplicationConstants.GlobalContextDBName)}\r\n*/\r\nexport class PouchDBProvider implements IPouchDBProvider {\r\n\r\n\tconstructor() { }\r\n\r\n\t/**\r\n * Saves the current value in PouchDB using specified key and returns a Javascript Promise\r\n * @method Fxp.Context.FxpContext#saveContext\r\n * @param {string} applicationName The name of the DB for which connection object has to be fetched \r\n * @example Example to use getDBConnection\r\n * PouchDBProvider.getDBConnection(Fxp.Common.Constants.ApplicationConstants.GlobalContextDBName)\r\n */\r\n\tgetDBConnection(applicationName: string): IPouchDbService {\r\n\t\tvar DbConnection = new PouchDbConnection();\r\n\t\tDbConnection.createDatabase(applicationName);\r\n\t\treturn new PouchDbService(applicationName, DbConnection);\r\n\t}\r\n}","import { IPouchDbConnection } from \"../interfaces/IPouchDbConnection\";\r\n\r\ndeclare var PouchDB: any;\r\n\r\nexport class PouchDbConnection implements IPouchDbConnection {\r\n\r\n\tpublic destroy(localDatabaseName: string) {\r\n\t\tvar database = new PouchDB(localDatabaseName);\r\n\t\tdatabase.destroy();\r\n\t};\r\n\r\n\tpublic createDatabase(localDatabaseName: string) {\r\n\t\tvar database = new PouchDB(localDatabaseName);\r\n\t};\r\n\r\n\tpublic getDatabase(localDatabaseName: string): any {\r\n\t\tvar database = new PouchDB(localDatabaseName);\r\n\t\treturn database;\r\n\t};\r\n\r\n\r\n}","import { IPouchDbService } from \"../interfaces/ipouchdbservice\";\r\nimport { IPouchDbConnection } from \"../interfaces/IPouchDbConnection\";\r\n\r\nexport class PouchDbService implements IPouchDbService {\r\n\tprivate _database: any;\r\n\tprivate _localDbName: string;\r\n\tprivate _docId: string = \"\";\r\n\r\n\tconstructor(localDatabaseName: string, pouchDbConnection: IPouchDbConnection) {\r\n\t\tthis._localDbName = localDatabaseName;\r\n\t\tthis._database = pouchDbConnection.getDatabase(localDatabaseName);\r\n\t}\r\n\r\n\tpublic save(jsonDocument: string): angular.IPromise {\r\n\t\tvar jsonDoc = JSON.parse(jsonDocument);\r\n\t\treturn this._database.post(jsonDoc);\r\n\t};\r\n\r\n\tpublic delete(documentId: string, documentRevision: string) {\r\n\t\treturn this._database.remove(documentId, documentRevision);\r\n\t};\r\n\r\n\tpublic saveUpdateDocument(jsonDocument: string, documentId: string): angular.IPromise {\r\n\t\tvar jsonDoc = JSON.parse(jsonDocument);\r\n\t\treturn this._database.put(jsonDoc, documentId);\r\n\t};\r\n\r\n\tpublic getAllDocuments(options: any = {}): angular.IPromise {\r\n\t\treturn this._database.allDocs(options);\r\n\t};\r\n\r\n\tpublic get(documentId: string): angular.IPromise {\r\n\t\treturn this._database.get(documentId);\r\n\t};\r\n}","export enum SettingsType {\r\n\tUser,\r\n\tUserGroup,\r\n\tApp\r\n}","\r\nexport class HomeLocation {\r\n\tHomeCountry: string;\r\n\tHomeCountryName: string;\r\n\tHomeState: string;\r\n\tHomeCity: string;\r\n\tHomeLocLongitude: string;\r\n\tHomeLocLatitude: string;\r\n}\r\n\r\nexport class WorkLocation {\r\n\tWorkCountryCode: string;\r\n\tWorkCountry: string;\r\n\tWorkState: string;\r\n\tWorkCity: string;\r\n\tWorkLocLatitude: string;\r\n\tWorkLocLogitude: string;\r\n}\r\n\r\nexport class UserInfo {\r\n\tprivate firstName: string;\r\n\tprivate lastName: string;\r\n\tprivate middleName: string;\r\n\tprivate fullName: string;\r\n\tprivate displayName: string;\r\n\tprivate businessDomain: string;\r\n\tprivate reportsTo: string;\r\n\tprivate reportsToDisplayName: string;\r\n\tprivate businessRole: string;\r\n\tprivate addressBookTitleDesc: string;\r\n\tprivate standardTitle: string;\r\n\tprivate email: string;\r\n\tprivate resourceImage: string;\r\n\tprivate businessRoleId: number;\r\n\tprivate reportsToFullName: string;\r\n\tprivate alias: string;\r\n\tprivate preferredFirstName: string;\r\n\tprivate seniority: string;\r\n\tprivate businessRoleDisplayName: string;\r\n\tprivate roleGroupId: number;\r\n\tprivate roleGroupName: string;\r\n\tprivate isDefaultProfile: boolean;\r\n\tprivate domain: string;\r\n\tprivate personnelNumber: number;\r\n\tprivate primaryTool: string;\r\n\tprivate costCenterCode: string;\r\n\tprivate hiringDate: any;\r\n\tprivate terminationDate: any;\r\n\tprivate serviceJobTitle: string;\r\n\tprivate resourceType: string;\r\n\tprivate alignmentType: string;\r\n\tprivate companyCode: number;\r\n\tprivate subAreaCode: number;\r\n\tprivate countryCode: any;\r\n\tprivate homeLocationNotFoundInd: boolean;\r\n\tprivate timeZoneId: number;\r\n\tprivate standardTimeZone: string;\r\n\tprivate resourceStatus: string;\r\n\tprivate resourceCategory: string;\r\n\tprivate resumeUrl: any;\r\n\tprivate functionHierarchyCode: string;\r\n\tprivate aadObjectId: string;\r\n\r\n\tconstructor() {\r\n\t}\r\n\tget AadObjectId(): string {\r\n\t\treturn this.aadObjectId;\r\n\t}\r\n\tset AadObjectId(value: string) {\r\n\t\tthis.aadObjectId = value;\r\n\t}\r\n\tget Alias(): string {\r\n\t\treturn this.alias;\r\n\t}\r\n\tset Alias(value: string) {\r\n\t\tthis.alias = value;\r\n\t}\r\n\tget FirstName(): string {\r\n\t\treturn this.firstName;\r\n\t}\r\n\tset FirstName(value: string) {\r\n\t\tthis.firstName = value;\r\n\t}\r\n\tget LastName(): string {\r\n\t\treturn this.lastName;\r\n\t}\r\n\tset LastName(value: string) {\r\n\t\tthis.lastName = value;\r\n\t}\r\n\tget MiddleName(): string {\r\n\t\treturn this.middleName;\r\n\t}\r\n\tset MiddleName(value: string) {\r\n\t\tthis.middleName = value;\r\n\t}\r\n\tget FullName(): string {\r\n\t\treturn this.fullName;\r\n\t}\r\n\tset FullName(value: string) {\r\n\t\tthis.fullName = value;\r\n\t}\r\n\tget DisplayName(): string {\r\n\t\treturn this.displayName;\r\n\t}\r\n\tset DisplayName(value: string) {\r\n\t\tthis.displayName = value;\r\n\t}\r\n\tget BusinessDomain(): string {\r\n\t\treturn this.businessDomain;\r\n\t}\r\n\tset BusinessDomain(value: string) {\r\n\t\tthis.businessDomain = value;\r\n\t}\r\n\tget ReportsTo(): string {\r\n\t\treturn this.reportsTo;\r\n\t}\r\n\tset ReportsTo(value: string) {\r\n\t\tthis.reportsTo = value;\r\n\t}\r\n\tget ReportsToDisplayName(): string {\r\n\t\treturn this.reportsToDisplayName;\r\n\t}\r\n\tset ReportsToDisplayName(value: string) {\r\n\t\tthis.reportsToDisplayName = value;\r\n\t}\r\n\tget BusinessRoleId(): number {\r\n\t\treturn this.businessRoleId;\r\n\t}\r\n\tset BusinessRoleId(value: number) {\r\n\t\tthis.businessRoleId = value;\r\n\t}\r\n\tget Seniority(): string {\r\n\t\treturn this.seniority;\r\n\t}\r\n\tset Seniority(value: string) {\r\n\t\tthis.seniority = value;\r\n\t}\r\n\tget BusinessRole(): string {\r\n\t\treturn this.businessRole;\r\n\t}\r\n\tset BusinessRole(value: string) {\r\n\t\tthis.businessRole = value;\r\n\t}\r\n\tget StandardTitle(): string {\r\n\t\treturn this.standardTitle;\r\n\t}\r\n\tset StandardTitle(value: string) {\r\n\t\tthis.standardTitle = value;\r\n\t}\r\n\tget AddressBookTitleDesc(): string {\r\n\t\treturn this.addressBookTitleDesc;\r\n\t}\r\n\tset AddressBookTitleDesc(value:string) {\r\n\t\tthis.addressBookTitleDesc = value;\r\n\t}\r\n\tget Email(): string {\r\n\t\treturn this.email;\r\n\t}\r\n\tset Email(value: string) {\r\n\t\tthis.email = value;\r\n\t}\r\n\tget ResourceImage(): string {\r\n\t\treturn this.resourceImage;\r\n\t}\r\n\tset ResourceImage(resourceImage: string) {\r\n\t\tthis.resourceImage = resourceImage;\r\n\t}\r\n\tget ReportsToFullName(): string {\r\n\t\treturn this.reportsToFullName;\r\n\t}\r\n\tset ReportsToFullName(reportsToFullName: string) {\r\n\t\tthis.reportsToFullName = reportsToFullName;\r\n\t}\r\n\tget PreferredFirstName(): string {\r\n\t\treturn this.preferredFirstName;\r\n\t}\r\n\tset PreferredFirstName(value: string) {\r\n\t\tthis.preferredFirstName = value;\r\n\t}\r\n\tget BusinessRoleDisplayName(): string {\r\n\t\treturn this.businessRoleDisplayName;\r\n\t}\r\n\tset BusinessRoleDisplayName(value: string) {\r\n\t\tthis.businessRoleDisplayName = value;\r\n\t}\r\n\tget RoleGroupId(): number {\r\n\t\treturn this.roleGroupId;\r\n\t}\r\n\tset RoleGroupId(value: number) {\r\n\t\tthis.roleGroupId = value;\r\n\t}\r\n\tget RoleGroupName(): string {\r\n\t\treturn this.roleGroupName;\r\n\t}\r\n\tset RoleGroupName(value: string) {\r\n\t\tthis.roleGroupName = value;\r\n\t}\r\n\tget IsDefaultProfile(): boolean {\r\n\t\treturn this.isDefaultProfile;\r\n\t}\r\n\tset IsDefaultProfile(value: boolean) {\r\n\t\tthis.isDefaultProfile = value;\r\n\t}\r\n\tget Domain(): string {\r\n\t\treturn this.domain;\r\n\t}\r\n\tset Domain(value: string) {\r\n\t\tthis.domain = value;\r\n\t}\r\n\tget PersonnelNumber(): number {\r\n\t\treturn this.personnelNumber;\r\n\t}\r\n\tset PersonnelNumber(value: number) {\r\n\t\tthis.personnelNumber = value;\r\n\t}\r\n\tget PrimaryTool(): string {\r\n\t\treturn this.primaryTool;\r\n\t}\r\n\tset PrimaryTool(value: string) {\r\n\t\tthis.primaryTool = value;\r\n\t}\r\n\tget CostCenterCode(): string {\r\n\t\treturn this.costCenterCode;\r\n\t}\r\n\tset CostCenterCode(value: string) {\r\n\t\tthis.costCenterCode = value;\r\n\t}\r\n\tget HiringDate(): any {\r\n\t\treturn this.hiringDate;\r\n\t}\r\n\tset HiringDate(value: any) {\r\n\t\tthis.hiringDate = value;\r\n\t}\r\n\tget TerminationDate(): any {\r\n\t\treturn this.terminationDate;\r\n\t}\r\n\tset TerminationDate(value: any) {\r\n\t\tthis.terminationDate = value;\r\n\t}\r\n\tget ServiceJobTitle(): string {\r\n\t\treturn this.serviceJobTitle;\r\n\t}\r\n\tset ServiceJobTitle(value: string) {\r\n\t\tthis.serviceJobTitle = value;\r\n\t}\r\n\tget ResourceType(): string {\r\n\t\treturn this.resourceType;\r\n\t}\r\n\tset ResourceType(value: string) {\r\n\t\tthis.resourceType = value;\r\n\t}\r\n\tget AlignmentType(): string {\r\n\t\treturn this.alignmentType;\r\n\t}\r\n\tset AlignmentType(value: string) {\r\n\t\tthis.alignmentType = value;\r\n\t}\r\n\tget CompanyCode(): number {\r\n\t\treturn this.companyCode;\r\n\t}\r\n\tset CompanyCode(value: number) {\r\n\t\tthis.companyCode = value;\r\n\t}\r\n\tget SubAreaCode(): number {\r\n\t\treturn this.subAreaCode;\r\n\t}\r\n\tset SubAreaCode(value: number) {\r\n\t\tthis.subAreaCode = value;\r\n\t}\r\n\tget CountryCode(): any {\r\n\t\treturn this.countryCode;\r\n\t}\r\n\tset CountryCode(value: any) {\r\n\t\tthis.countryCode = value;\r\n\t}\r\n\tget HomeLocationNotFoundInd(): boolean {\r\n\t\treturn this.homeLocationNotFoundInd;\r\n\t}\r\n\tset HomeLocationNotFoundInd(value: boolean) {\r\n\t\tthis.homeLocationNotFoundInd = value;\r\n\t}\r\n\tget TimeZoneId(): number {\r\n\t\treturn this.timeZoneId;\r\n\t}\r\n\tset TimeZoneId(value: number) {\r\n\t\tthis.timeZoneId = value;\r\n\t}\r\n\tget StandardTimeZone(): string {\r\n\t\treturn this.standardTimeZone;\r\n\t}\r\n\tset StandardTimeZone(value: string) {\r\n\t\tthis.standardTimeZone = value;\r\n\t}\r\n\tget ResourceStatus(): string {\r\n\t\treturn this.resourceStatus;\r\n\t}\r\n\tset ResourceStatus(value: string) {\r\n\t\tthis.resourceStatus = value;\r\n\t}\r\n\tget ResourceCategory(): string {\r\n\t\treturn this.resourceCategory;\r\n\t}\r\n\tset ResourceCategory(value: string) {\r\n\t\tthis.resourceCategory = value;\r\n\t}\r\n\tget ResumeUrl(): any {\r\n\t\treturn this.resumeUrl;\r\n\t}\r\n\tset ResumeUrl(value: any) {\r\n\t\tthis.resumeUrl = value;\r\n\t}\r\n\tget FunctionHierarchyCode(): string {\r\n\t\treturn this.functionHierarchyCode;\r\n\t}\r\n\tset FunctionHierarchyCode(value: string) {\r\n\t\tthis.functionHierarchyCode = value;\r\n\t}\r\n\tHomeLocation: HomeLocation;\r\n\tWorkLocation: WorkLocation;\r\n\tWeekdays: string[];\r\n\tTenantName: string;\r\n\tMappedTenantName: string;\r\n}","export enum ComponentFramework {\r\n React = \"React\",\r\n Angular = \"Angular\"\r\n}","export enum IOCVSource {\r\n Client = \"Client\",\r\n }\r\n \r\n export enum IOCVFeedbackType {\r\n Smile = \"Smile\",\r\n Frown = \"Frown\",\r\n Idea = \"Idea\",\r\n Survey = \"Survey\",\r\n Bug = \"Bug\",\r\n }\r\n \r\n export enum IOCVManifestType {\r\n Sas = \"Sas\",\r\n Nps = \"Nps\",\r\n Nlqs = \"Nlqs\",\r\n Psat = \"Psat\",\r\n Bps = \"Bps\",\r\n Fps = \"Fps\",\r\n }","export enum Environment {\r\n Dev = \"Development\",\r\n Sit = \"SIT\",\r\n AuroraSit = \"AuroraSit\",\r\n Uat = \"UAT\",\r\n Prod = \"Production\",\r\n Perf = \"Perf\"\r\n}\r\n","export class AuthorNotificationConstant {\r\n\tpublic static ConfirmationOptions = {\r\n\t\t\"templateUrl\": \"../../templates/author_notification/confirmationPopup.html\",\r\n\t\t\"windowClass\": \"author-notification-confirmation-popup\",\r\n\t\t\"keyboard\": false,\r\n\t\t\"backdrop\": \"static\",\r\n\t\t\"controller\": \"AuthorNotificationConfirmationController\",\r\n\t\t\"controllerAs\": \"ctrl\",\r\n\t\t\"bindToController\": true\r\n\t};\r\n}","export class BrowserExperienceConstants\r\n{\r\n public static message:string = \"We recommend new Microsoft Edge Browser for better performance.\";\r\n public static timeLeft:number = 15*24*60*60*1000;\r\n}","export class CreateAskOpsModalConstant {\r\n\tpublic static ModalOptions = {\r\n\t\t\"templateUrl\": \"../../templates/fxpPopupRequestModal.html\",\r\n\t\t\"windowClass\": \"create-askops-request-modal contextual-help\",\r\n\t\t\"keyboard\": true,\r\n\t\t\"backdrop\": \"static\",\r\n\t\t\"controller\": \"CreateAskOpsController\",\r\n\t\t\"controllerAs\": \"aoCtrl\",\r\n\t\t\"bindToController\": true,\r\n\t\t\"ariaLabelledBy\": \"modal-title\",\r\n\t\t\"ariaDescribedBy\": \"modal-description\",\r\n\t\t\"resolve\": {}\r\n\t};\r\n}","export class FxpModalConstant {\r\n public static options = {\r\n templateUrl: \"../../templates/fxpmodal.html\",\r\n windowClass: \"fxp-modal-popup\",\r\n keyboard: false,\r\n backdrop: \"static\",\r\n controllerAs: \"fxpModal\"\r\n };\r\n}\r\n\r\nexport class FxpCancellableModalConstant {\r\n public static options = {\r\n templateUrl: \"../../templates/fxpmodal-cancellable.html\",\r\n windowClass: \"fxp-modal-popup\",\r\n keyboard: false,\r\n backdrop: \"static\",\r\n controllerAs: \"fxpModal\"\r\n };\r\n}\r\n\r\nexport class FxpFeedbackModalConstant {\r\n public static options = {\r\n templateUrl: \"../../templates/fxpmodal-feedback.html\",\r\n windowClass: \"fxp-modal-popup\",\r\n keyboard: true,\r\n backdrop: \"static\",\r\n controllerAs: \"fxpModal\",\r\n size: 'feedback'\r\n };\r\n}\r\n\r\nexport class FxpAnnouncementModalConstant {\r\n public static options = {\r\n templateUrl: \"../../templates/fxpmodal-announcement.html\",\r\n windowClass: \"fxp-modal-popup\",\r\n keyboard: true,\r\n backdrop: \"static\",\r\n controllerAs: \"fxpModal\",\r\n size: 'feedback'\r\n };\r\n}","export class HelpArticleImageModalConstant {\r\n\tpublic static ModalOptions = {\r\n\t\t\"templateUrl\": \"../../templates/help/help-article-image-modal.html\",\r\n\t\t\"windowClass\": \"help-article-image-modal contextual-help\",\r\n\t\t\"keyboard\": true,\r\n\t\t\"backdrop\": \"static\",\r\n\t\t\"controller\": \"HelpArticleImageController\",\r\n\t\t\"controllerAs\": \"haiCtrl\",\r\n\t\t\"bindToController\": true,\r\n\t\t\"resolve\": {}\r\n\t};\r\n}\r\n\r\nexport class HelpArticleConstants {\r\n\tpublic static HelpArticleTitles = {\r\n\t\tHELP_RELATED_TO_THIS_PAGE: \"Help related to this page\"\r\n\t}\r\n}","export class SessionTimeoutModalConstant {\r\n\tpublic static options = {\r\n\t\t\"templateUrl\": \"../../templates/fxpsessiontimeout.html\",\r\n\t\t\"windowClass\": \"session-timeout-popup\",\r\n\t\t\"keyboard\": false,\r\n\t\t\"backdrop\": \"static\",\r\n\t\t\"controller\": 'SessionTimeoutModalController',\r\n\t\t\"controllerAs\": \"systemTimeout\"\r\n\t};\r\n}","export class CreateSupportTicketModalConstant {\r\n\tpublic static ModalOptions = {\r\n\t\t\"templateUrl\": \"../../templates/fxpPopupRequestModal.html\",\r\n\t\t\"windowClass\": \"create-askops-request-modal contextual-help\",\r\n\t\t\"keyboard\": true,\r\n\t\t\"backdrop\": \"static\",\r\n\t\t\"controller\": \"CreateTicketController\",\r\n\t\t\"controllerAs\": \"aoCtrl\",\r\n\t\t\"bindToController\": true,\r\n\t\t\"ariaLabelledBy\": \"modal-title\",\r\n\t\t\"ariaDescribedBy\": \"modal-description\",\r\n\t\t\"resolve\": {}\r\n\t};\r\n}","import { ErrorSeverityLevel } from \"../telemetry/ErrorSeverityLevel\";\r\nimport { LogPropertyBag } from \"../telemetry/LogPropertyBag\";\r\n\r\nexport class ErrorCodes {\r\n public static readonly ModuleBoostrapFailure = '3012'; \r\n public static readonly ModuleBoostrapFailureRequireJS = '3013';\r\n public static readonly GlobalExceptionHandler = '3301';\r\n public static readonly GlobalExceptionHandler_AngularJs = '3300';\r\n public static readonly OnMsalLoginFailure = '3303';\r\n public static readonly OnMsalTokenFailure = '3305';\r\n public static readonly OnTelemetryContextError = '3306';\r\n public static readonly OnSettingsServiceError = '3307';\r\n\tpublic static readonly OnGetAdminTilesFailure = '2702';\r\n public static readonly OnGetAdminDataFromServerFailure = '2701';\r\n public static readonly PowerBI_Invalid_Configuration = '50003';\r\n public static readonly PowerBI_OnError = '50001'; \r\n public static readonly PowerBI_Token_Failure = '50002';\r\n public static readonly GetLeftNavData_Failure = '1801';\r\n public static readonly SaveLeftNavPinSetting_Error = '3502';\r\n public static readonly PlannedDownTime_UpdateFlash_Failure = '2931'; \r\n public static readonly PlannedDownTime_UpdateSystemAccouncement_Failure = '2932'; \r\n public static readonly SystemMessage_Read_Collection_Rejection = '2916';\r\n public static readonly SystemMessage_Fetch_Business_Workflow = '2917';\r\n public static readonly SystemMessage_Save_Failure = '2918';\r\n public static readonly SystemMessage_Update_Failure = '2918';\r\n public static readonly SystemMessage_Delete_Failure = '2920';\r\n public static readonly AcquireTokenFailure_UnKnown_Reason = '3304';\r\n public static readonly OBO_User_Already_Active = '2907';\r\n public static readonly Get_OBO_User_Configuration_Failure = '2906'; \r\n public static readonly OBO_User_Search_Failure = '2602';\r\n public static readonly State_Not_Found = '2908';\r\n public static readonly State_Change_Failure = '2909';\r\n public static readonly Msal_ResourceTokenAcuqisition_Failure = '3302';\r\n public static readonly SkypeBotInit_Failure = '2911';\r\n public static readonly API_Threshold_Crossed = '2910';\r\n public static readonly InitializeFeedback_Failure = '3400';\r\n public static readonly Error_SubmittingFeedback = '3401';\r\n public static readonly Error_LoadingFeedback = '3402';\r\n public static readonly GetRoleGroupDetails_Failure = '3452';\r\n public static readonly PublishNotifications_Failure = '3451';\r\n public static readonly PublishNotificationsRolesRoleGroup_Failure = '3453';\r\n public static readonly GetRequestTypeData_Failure = '3501';\r\n public static readonly CloseActOnBehalofUser_Failure = '3502';\r\n public static readonly GetContextualHelpArticles_Failure = '4001'; \r\n public static readonly GetArticleData_Failure = '4002';\r\n public static readonly SaveHelpFeedback_Failure = '4003';\r\n public static readonly SearchSuggestions_Failure = '4004';\r\n public static readonly SaveViewCount_Failure = '4005';\r\n public static readonly ShowErrorMsgNavigateToUserLookUp = '4006'; \r\n public static readonly SavePersonalizedNavItems = '4007';\r\n public static readonly GetNotifications_Failure = '2940';\r\n public static readonly GetUnreadNotificationCount_Failure = '2941';\r\n public static readonly MarkAllNotificationsAsRead_Failure = '2943';\r\n public static readonly DismissAllNotifications_Failure = '2942';\r\n public static readonly ReadNotification_Failure = '2943';\r\n public static readonly DeleteNotification_Failure = '2942';\r\n public static readonly SaveNotificationDNDSetting = '3503';\r\n public static readonly ErrorLoadingDashboard = '2913'; \r\n public static readonly ErrorFetchingTokenForPowerBI = '2914';\r\n public static readonly ErrorLoadingPowerBiDashboard = '2915';\r\n public static readonly SubmitRoleGroupNavPresonalization_Failure = '2921';\r\n public static readonly GetRoleGroupDetailsPersonalization_Failure = '2921';\r\n public static readonly GetGlobalNavMasterList_Failure = '2917';\r\n public static readonly GetRoleGroupNavList_Failure = '2916';\r\n public static readonly ReadToastNotification_Failure = '2943';\r\n public static readonly MarkNotificationAsRead_Failure = '2944';\r\n public static readonly UserLookUpSearchUser_Failure = '2945';\r\n public static readonly SetSelectedUser_Failure = '2946';\r\n public static readonly NavigateToPersonalizationView_Failure = '2947';\r\n public static readonly ErrorOnLeftNavClick = '2948';\r\n public static readonly HandleProfileServiceResponse = '2949';\r\n public static readonly AdalOnError = '0001';\r\n public static readonly AdalOnErrorWithErrorCode = '0002';\r\n public static readonly DefaultStateNotConfigured = '2905';\r\n public static readonly ErrorRegisteringRoute = '2904';\r\n public static readonly ErrorInLazyLoading = '2906';\r\n public static readonly ErrorUpdatingStateObject = '2907';\r\n public static readonly RouteResolveException = '2908';\r\n public static readonly HttpInterceptorResponseError = '2500';\r\n public static readonly DashboardService_GetLeftNavDataFailure = '2603';\r\n public static readonly FxPConfigurationFailure = '2604'\r\n public static readonly StartUpFlagRetrieveError = '2912';\r\n public static readonly DataService_TokenFailure = '5001';\r\n public static readonly FeedbackService_Error = '3401';\r\n public static readonly CheckToastNotifications_Failure = '2940';\r\n public static readonly SharedComponentNotRegistered = '2941';\r\n public static readonly LazyLoadingFailedForSharedComponent = '2942';\r\n public static readonly PersonalizationService_GetMasterLeftNav_Failure = '2605'; \r\n public static readonly PersonalizationService_GetPersonalizedLeftNav_Failure = '2606';\r\n public static readonly PersonalizationSerivce_SavePersonalizedNavItems_Failure = '2607';\r\n public static readonly PersonalizationSerivce_GetRoleGroupDetails_Failure = '2608';\r\n public static readonly PersonalizationSerivce_GetRoleGroupDetailsForNotification_Failure = '2609';\r\n public static readonly PersonalizationSerivce_GetRolePersonalizedNavItems_Failure = '2610';\r\n public static readonly PersonalizationSerivce_GetRoleGroupPersonalizedList_Failure = '2611';\r\n public static readonly PersonalizationSerivce_SaveRoleGroupPersonalizedNavItems_Failure = '2612';\r\n public static readonly AuthSerive_UserClaimsEmptyInLocalStorage = \"2804\";\r\n public static readonly AuthSerive_MissingApplicationObjectInClaims = \"2805\";\r\n public static readonly AuthSerive_MissingRolesObjectInClaims = \"2806\";\r\n public static readonly AuthSerive_TenantClaimsEmptyInLocalStorage = \"2801\";\r\n public static readonly AuthSerive_TenantObjectMissingInClaims = \"2802\";\r\n public static readonly AuthSerive_ClaimsMissingInTenantObject = \"2803\";\r\n public static readonly AuthService_TokenAcquisitionInProgress = '2804';\r\n public static readonly AuthService_TokenAcquisitionInProgress_TenantClaims = '2805';\r\n public static readonly AuthService_TenantClaimsObjectMissingInClaims = '2806';\r\n public static readonly AuthService_APICallFailedWithUnknownReason = '2807';\r\n public static readonly AuthService_ErrorNotifyingCachedClaims = '2809';\r\n public static readonly AuthService_UnknownException = '2808';\r\n public static readonly AuthService_GetClaimsFailure = '2810';\r\n public static readonly GetUserThumbnail_TokenNotFound = '2901';\r\n public static readonly GetBasicProfile_TokenNotFound = '2902';\r\n public static readonly GetBasicProfile_BusinessRoleMissing = '2903';\r\n public static readonly GetBasicProfile_RoleGroupMissing = '2904';\r\n public static readonly GetBasicProfile_ProfileNotFound = '2905';\r\n public static readonly BasicProfile_UnknownError = '2906';\r\n public static readonly SearchProfile_TokenMissing = '2908'\r\n public static readonly ProfileServiceFailure = '2909';\r\n public static readonly ProfileService_ErrorNotifyingCachedProfile = '2910';\r\n public static readonly ErrorOnProfileSearch = '2911';\r\n public static readonly ModuleCompilationError = '5000';\r\n public static readonly ErrorInstantiatingComponent = '5001';\r\n public static readonly ErrorLoadingReactComponent = '5002';\r\n public static readonly ErrorUnloadingReactComponent = '5003';\r\n public static readonly Resiliency_ExternalResourceLoadingError = '1800';\r\n public static readonly Resiliency_ModuleLoadingError = '1800';\r\n public static readonly SignalR_ErrorOnDisconnect = '1900';\r\n public static readonly SignalR_ErrorOnMessageSend = '1901';\r\n public static readonly SignalR_ErrorOnJoinGroup = '1902';\r\n public static readonly SignalR_ErrorOnLeaveGroup = '1903';\r\n public static readonly SignalR_ErrorOnConnection = '1904';\r\n public static readonly PartnerAppRegistrationService_ErrorOnAppRegistration = '2001';\r\n public static readonly PartnerAppRegistrationService_ErrorOnSharedComponentRegistration = '2002';\r\n public static readonly ReduxStoreException = '6000';\t\r\n\r\n public static readonly OnStateChangeStartException = '3701'; \r\n\r\n}\r\n","export class SYSTEM_MESSAGE_UI {\r\n\tpublic static SYSTEM_MESSAGE = `System Message`;\r\n\tpublic static SYSTEM_MESSAGES = `System Messages`;\r\n\tpublic static ADD = `Add`;\r\n\tpublic static EDIT = `Edit`;\r\n\tpublic static SAVE = `Save`;\r\n\tpublic static DELETE = `Delete`;\r\n\tpublic static CANCEL = `Cancel`;\r\n\tpublic static ACTIVE = `Active`;\r\n\tpublic static EXPIRED = `Expired`;\r\n\tpublic static ADD_MESSAGES = `${SYSTEM_MESSAGE_UI.ADD} Message`;\r\n\tpublic static SYSTEM_MESSAGE_DESC = `Create and manage ${SYSTEM_MESSAGE_UI.SYSTEM_MESSAGES}. The alert messages can be set to show up for all pages or only on a specified page.`;\r\n\tpublic static ITEMS_TO_DISPLAY = `Items to display:`;\r\n\tpublic static MESSAGE = {\r\n\t\tTYPE: `Type`,\r\n\t\tMESSAGE: `Message`,\r\n\t\tWORKFLOW: `Workflow(L0)`,\r\n\t\tFUNCTION: `Function(L1)`,\r\n\t\tSTART: `Start Date/Time`,\r\n\t\tEND: `End Date/Time`,\r\n\t\tSTATUS: `Status`,\r\n\t\tEXPAND_MESSAGE: `Expand or Collapse Message`\r\n\t};\r\n\r\n\tpublic static TYPE = {\r\n\t\tBANNER: `Banner`,\r\n\t\tMAINTENANCE_PAGE: `Maintenance page`\r\n\t};\r\n\tpublic static BUSINESS_CAPABILITY = `Business Capability (L0)`;\r\n\tpublic static BUSINESS_FUNCTION = `Business Function (L1)`;\r\n\tpublic static MESSAGE_TO_USER = `Message to User`;\r\n\tpublic static ADD_SYSTEM_MESSAGE = `${SYSTEM_MESSAGE_UI.ADD} ${SYSTEM_MESSAGE_UI.SYSTEM_MESSAGE}`;\r\n\tpublic static EDIT_SYSTEM_MESSAGE = `${SYSTEM_MESSAGE_UI.EDIT} ${SYSTEM_MESSAGE_UI.SYSTEM_MESSAGE}`;\r\n\tpublic static DELETE_SYSTEM_MESSAGE = `${SYSTEM_MESSAGE_UI.DELETE} ${SYSTEM_MESSAGE_UI.SYSTEM_MESSAGE}`;\r\n\r\n\tpublic static DELETE_CONFIRMATION = `Are you sure you want to delete this ${SYSTEM_MESSAGE_UI.SYSTEM_MESSAGES}?`;\r\n\r\n\tpublic static ERRORS: any = {\r\n\t\tCANNOT_FETCH_SYSTEM_MESSAGE: `The ${SYSTEM_MESSAGE_UI.SYSTEM_MESSAGES}s could not be fetched.`,\r\n\t\tCANNOT_FETCH_BBUSINESS_WORKFLOW: `The business Workflows could not be fetched.`,\r\n\t\tCANNOT_ADD_SYSTEM_MESSAGE: `The ${SYSTEM_MESSAGE_UI.SYSTEM_MESSAGE} could not be added.`,\r\n\t\tCANNOT_UPDATE_SYSTEM_MESSAGE: `The ${SYSTEM_MESSAGE_UI.SYSTEM_MESSAGE} could not be updated.`,\r\n\t\tCANNOT_DELETE_SYSTEM_MESSAGE: `The ${SYSTEM_MESSAGE_UI.SYSTEM_MESSAGE} could not be deleted.`,\r\n\t\tCANNOT_FETCH_PLANEDDOWNTIME: \"The planned downtime messages could not be fetched.\",\r\n\r\n\t\tBUSINESS_CAPABILITY_REQUIRED: `${SYSTEM_MESSAGE_UI.BUSINESS_CAPABILITY} is Required.`,\r\n\t\tBUSINESS_FUNCTION_REQUIRED: `${SYSTEM_MESSAGE_UI.BUSINESS_FUNCTION} is Required.`,\r\n\t\tMESSAGE_REQUIRED: `${SYSTEM_MESSAGE_UI.MESSAGE_TO_USER} is Required.`,\r\n\t\tSTART_DATE_REQUIRED: `${SYSTEM_MESSAGE_UI.MESSAGE.START} is Required.`,\r\n\t\tEND_DATE_REQUIRED: `${SYSTEM_MESSAGE_UI.MESSAGE.END} is Required.`,\r\n\t\tEND_DATE_MIN: `${SYSTEM_MESSAGE_UI.MESSAGE.END} must be after ${SYSTEM_MESSAGE_UI.MESSAGE.START}.`\r\n\t}\r\n\r\n\tpublic static SUCCESS = {\r\n\t\tSYSTEM_MESSAGE_ADDED: `The ${SYSTEM_MESSAGE_UI.SYSTEM_MESSAGE} was successfully added.`,\r\n\t\tSYSTEM_MESSAGE_UPDATED: `The ${SYSTEM_MESSAGE_UI.SYSTEM_MESSAGE} was successfully updated.`,\r\n\t\tSYSTEM_MESSAGE_DELETED: `The ${SYSTEM_MESSAGE_UI.SYSTEM_MESSAGE} was successfully deleted.`\r\n\t}\r\n\r\n\tpublic static LOADING_TEXTS = {\r\n\t\tFETCHING_MESSAGES: `Loading ${SYSTEM_MESSAGE_UI.SYSTEM_MESSAGES}`,\r\n\t\tADDING_MESSAGE: `Adding ${SYSTEM_MESSAGE_UI.SYSTEM_MESSAGE}`,\r\n\t\tUPDATING_MESSAGE: `Updating ${SYSTEM_MESSAGE_UI.SYSTEM_MESSAGE}`,\r\n\t\tDELETING_MESSAGE: `Deleting ${SYSTEM_MESSAGE_UI.SYSTEM_MESSAGE}`\r\n\t}\r\n\r\n\tpublic static PAGINATION = { PREV: `Prev`, NEXT: `Next` }\r\n}","import { IFxpContext } from \"../interfaces/IFxpContext\";\r\nimport { IPouchDbService } from \"../interfaces/ipouchdbservice\";\r\nimport { IPouchDBProvider } from \"../interfaces/IPouchDBProvider\";\r\nimport { ApplicationConstants } from \"../common/ApplicationConstants\";\r\nimport { PouchDBProvider } from \"../common/PouchDBProvider\";\r\nimport { IFxPService } from \"../interfaces/IFxpService\";\r\n\r\ndeclare var Promise: any;\r\n/**\r\n * @module Fxp.Context\r\n */\r\n\r\n/**\r\n * Represents an FxpContext\r\n * @class Fxp.Context.FxpContext\r\n * @example Example to create an object of FxpContext \r\n * //Initializing FxpContext\r\n * var fxpContext = new Fxp.Context.FxpContext(); \r\n */\r\nexport class FxpContext implements IFxpContext,IFxPService {\r\n\tprivate static _instance: FxpContext;\r\n\tprivate pouchService: IPouchDbService;\r\n\tprivate _iPouchDBProvider: IPouchDBProvider;\r\n\r\n\tconstructor(iPouchDBProvider: IPouchDBProvider) {\r\n\t\tif (FxpContext._instance) {\r\n\t\t\treturn FxpContext._instance;\r\n\t\t}\r\n\t\tthis._iPouchDBProvider = iPouchDBProvider;\r\n\t\tthis.pouchService = this._iPouchDBProvider.getDBConnection(ApplicationConstants.GlobalContextDBName);\r\n\r\n\t\tFxpContext._instance = this;\r\n\t}\r\n\r\n\t//Keeping this function as is for backward Compatibility\r\n\tpublic static GetInstance(): FxpContext {\r\n\t\tif (!FxpContext._instance) {\r\n\t\t\tFxpContext._instance = new FxpContext(new PouchDBProvider());\r\n\t\t}\r\n\r\n\t\treturn FxpContext._instance;\r\n\t}\r\n\r\n\t/**\r\n * Saves the current value in PouchDB using specified key and returns a Javascript Promise\r\n * @method Fxp.Context.FxpContext#saveContext\r\n * @param {string} key A key which will be identifier of the value of the data to be saved in PouchDB \r\n * @param {string} value The value that needs to be saved\r\n * @param {string} applicationName The name of application. It is optional.\r\n * @example Example to use saveContext\r\n * var fxpContext = Fxp.Context.FxpContext.GetInstance()\r\n * fxpContext.saveContext(\"UIConfigDB\",\"UIConfigDBName\");\r\n * fxpContext.saveContext(\"UIConfigDB\",\"UIConfigDBName\", \"ApplicationName\");\r\n */\r\n\r\n\tpublic saveContext(key: string, value: string, applicationName?: string): Promise {\r\n\t\treturn this.saveData(key, value, applicationName);\r\n\t}\r\n\r\n\t/**\r\n\t* Read Data from Context using specified key and application name. If application name is null then it will fetch data from Global context otherwise ApplicationContext. \r\n\t* It returns a Javascript Promise\r\n\t* @method Fxp.Context.FxpContext#readContext\r\n\t* @param {string} key A key which will be identifier of the value of the data that needs to be fetched from PouchDB \r\n\t* @param {string} applicationName The name of application. It is optional parameter.\r\n\t* @example Example to use readContext\r\n\t* var fxpContext = Fxp.Context.FxpContext.GetInstance()\r\n\t* fxpContext.readContext(\"sessionId\", \"FXP\");\r\n\t* fxpContext.readContext(\"sessionId\");\r\n\t*/\r\n\tpublic readContext(key: string, applicationName?: string): Promise {\r\n\t\treturn this.readData(key, applicationName);\r\n\t}\r\n\r\n\t /**\r\n * Read Document Keys from Context using specified application name.\r\n * It returns a Javascript Promise\r\n * @method Fxp.Context.FxpContext#readApplicationKeyIDs\r\n * @param {string} applicationName The name of application. \r\n * @example Example to use readApplicationKeyIDs\r\n * var fxpContext = Fxp.Context.FxpContext.GetInstance()\r\n * fxpContext.readApplicationKeyIDs(\"sessionId\");\r\n */\r\n\tpublic getDocumentKeys(applicationName: string): Promise {\r\n\t\treturn this.getDocumentKeysData( applicationName);\r\n\t}\r\n\t/**\r\n * Delete data from context using specified key and application name. If application name is null then it will delete data from Global context otherwise ApplicationContext. \r\n * It returns a Javascript Promise\r\n * @method Fxp.Context.FxpContext#deleteContext\r\n * @param {string} key A key which will be identifier of the value of the data that needs to be fetched from PouchDB \r\n * @param {string} applicationName The name of application. It is optional parameter.\r\n * @example Example to use deleteContext\r\n * var fxpContext = new Fxp.Context.deleteContext()\r\n * fxpContext.deleteContext(\"sessionId\", \"FXP\");\r\n * fxpContext.deleteContext(\"sessionId\");\r\n */\r\n\tpublic deleteContext(key: string, applicationName?: string): Promise {\r\n\t\ttry {\r\n\t\t\tvar db: IPouchDbService = this.getDBService(applicationName);\r\n\r\n\t\t\treturn new Promise(function (resolve, reject) {\r\n\t\t\t\tdb.get(key).then(function (doc) {\r\n\t\t\t\t\tdb.delete(key, doc._rev).\r\n\t\t\t\t\t\tthen(function (doc) {\r\n\t\t\t\t\t\t\tresolve(doc)\r\n\t\t\t\t\t\t}).catch(function (err) {\r\n\t\t\t\t\t\t\tdb.get(key).then(function (doc) {\r\n\t\t\t\t\t\t\t\tdb.delete(key, doc._rev).then(function () {\r\n\t\t\t\t\t\t\t\t\tresolve(doc)\r\n\t\t\t\t\t\t\t\t}).catch(function (err) {\r\n\t\t\t\t\t\t\t\t\tconsole.log(err);\r\n\t\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t});\r\n\t\t\t\t}).catch(function (err) {\r\n\t\t\t\t\tif (err.name == \"not_found\") {\r\n\t\t\t\t\t\tconsole.log(\"not-found\");\r\n\t\t\t\t\t}\r\n\t\t\t\t});\r\n\t\t\t});\r\n\t\t}\r\n\t\tcatch (exception) {\r\n\t\t\t//TODO: REVISIT THE scenario where exception occurs\r\n\t\t}\r\n\t}\r\n\r\n\r\n\t/**\r\n\t* Get FxpBaseUrl from FxpContext. It returns a Javascript Promise.\r\n\t* @method Fxp.Context.FxpContext#getFxpBaseUrl\r\n\t* @example Example to use getFxpBaseUrl\r\n\t* var fxpContext = Fxp.Context.FxpContext.GetInstance()\r\n\t* fxpContext.getFxpBaseUrl();\r\n\t*/\r\n\tpublic getFxpBaseUrl(): Promise {\r\n\t\treturn this.readData(ApplicationConstants.BaseUrl);\r\n\t}\r\n\r\n\t/**\r\n\t* Get SessionId from FxpContext. It returns a Javascript Promise.\r\n\t* @method Fxp.Context.FxpContext#getAssetLibraryUrl\r\n\t* @example Example to use getAssetLibraryUrl\r\n\t* var fxpContext = Fxp.Context.FxpContext.GetInstance()\r\n\t* fxpContext.getAssetLibraryUrl();\r\n\t*/\r\n\tpublic getAssetLibraryUrl(): Promise {\r\n\t\treturn this.readData(ApplicationConstants.AssetsUrl);\r\n\t}\r\n\r\n\t/**\r\n\t* Get SessionId from FxpContext. It returns a Javascript Promise.\r\n\t* @method Fxp.Context.FxpContext#getCurrentSessionId\r\n\t* @example Example to use getCurrentSessionId\r\n\t* var fxpContext = new Fxp.Context.FxpContext()\r\n\t* fxpContext.getCurrentSessionId();\r\n\t*/\r\n\tpublic getCurrentSessionId(): Promise {\r\n\t\treturn this.readData(\"sessionId\");\r\n\t}\r\n\r\n\t/**\r\n * Saves the current value in PouchDB using specified key and returns a Javascript Promise\r\n * @method Fxp.Context.FxpContext#saveData\r\n * @param {string} key A key which will be identifier of the value of the data to be saved in PouchDB \r\n * @param {string} value The value that needs to be saved\r\n * @param {string} applicationName The name of application. It is optional. \r\n */\r\n\tprivate saveData(key: string, value: string, applicationName?: string): Promise {\r\n\r\n\t\tvar saveUpdateDocument = this.saveUpdateDocument;\r\n\r\n\t\ttry {\r\n\t\t\tvar db: IPouchDbService = this.getDBService(applicationName);\r\n\r\n\t\t\treturn new Promise(function (resolve, reject) {\r\n\t\t\t\tdb.get(key).then(function (doc) {\r\n\t\t\t\t\tdoc[key] = value;\r\n\t\t\t\t\tresolve(saveUpdateDocument(db, JSON.stringify(doc), key, value));\r\n\t\t\t\t}).catch(function (err) {\r\n\t\t\t\t\tif (err.name == \"not_found\") {\r\n\t\t\t\t\t\tvar PropBagInternal: any = {};\r\n\t\t\t\t\t\tPropBagInternal[key] = value;\r\n\t\t\t\t\t\tvar JSONData = JSON.stringify(PropBagInternal);\r\n\t\t\t\t\t\tresolve(saveUpdateDocument(db, JSONData, key, value));\r\n\t\t\t\t\t}\r\n\t\t\t\t});\r\n\t\t\t});\r\n\t\t}\r\n\t\tcatch (exception) { }\r\n\t}\r\n\r\n\t/**\r\n\t* Saves Data to Context\r\n\t* It returns a any\r\n\t* @method Fxp.Context.FxpContext#saveUpdateDocument\r\n\t* @param {Fxp.Interfaces.IPouchDbService} db PouchDB Connnection Object\r\n\t* @param {string} document Json Document to be saved in PouchDB. \r\n\t* @param {string} key A key which will be identifier of the value of the data to be saved in PouchDB \r\n\t* @param {string} value The value that needs to be saved\r\n\t*/\r\n\tprivate saveUpdateDocument(db: IPouchDbService, document: string, key: string, value: string): any {\r\n\t\tdb.saveUpdateDocument(document, key).\r\n\t\t\tthen(function (doc) {\r\n\t\t\t\treturn (doc)\r\n\t\t\t}).catch(function (err) {\r\n\t\t\t\tconsole.log(err);\r\n\t\t\t});\r\n\t}\r\n\r\n\t/**\r\n\t* Read Data from Context using specified key and application name. If application name is null then it will fetch data from Global context otherwise ApplicationContext. \r\n\t* It returns a Javascript Promise\r\n\t* @method Fxp.Context.FxpContext#readData\r\n\t* @param {string} key A key which will be identifier of the value of the data that needs to be fetched from PouchDB \r\n\t* @param {string} applicationName The name of application. It is optional parameter. \r\n\t*/\r\n\tprivate readData(key: string, applicationName?: string): Promise {\r\n\t\ttry {\r\n\t\t\tvar db: IPouchDbService = this.getDBService(applicationName);\r\n\t\t\tvar PropBagInternal: any = {};\r\n\t\t\treturn new Promise(function (resolve, reject) {\r\n\t\t\t\tdb.get(key).then(function (doc) {\r\n\t\t\t\t\tPropBagInternal[\"IsError\"] = false;\r\n\t\t\t\t\tPropBagInternal[\"Result\"] = doc[key];\r\n\t\t\t\t\tPropBagInternal[\"Error\"] = null;\r\n\t\t\t\t\tresolve(PropBagInternal);\r\n\t\t\t\t}).catch(function (err) {\r\n\t\t\t\t\tPropBagInternal[\"IsError\"] = true;\r\n\t\t\t\t\tPropBagInternal[\"Result\"] = null;\r\n\t\t\t\t\tPropBagInternal[\"Error\"] = err;\r\n\t\t\t\t\tresolve(PropBagInternal);\r\n\t\t\t\t});\r\n\t\t\t});\t\t\t\r\n\t\t}\r\n\t\tcatch (exception) {\r\n\t\t\tconsole.log(`Error while reading ${key} from context` + exception);\r\n\t\t }\r\n\t}\r\n\r\n\t /**\r\n * Read Keys of documents from Context using specified application name.\r\n * It returns a Javascript Promise\r\n * @method Fxp.Context.FxpContext#readApplicationKeyIDsData\r\n * @param {string} applicationName The name of application for which keys will be returned.\r\n */\r\n\tprivate getDocumentKeysData(applicationName: string): Promise {\r\n\t\ttry {\r\n\t\tvar db: IPouchDbService = this.getDBService(applicationName);\r\n\t\tvar PropBagInternal: any = {};\r\n\t\treturn new Promise(function (resolve, reject) {\r\n\t\t\tdb.getAllDocuments({ include_docs :false})\r\n\t\t\t.then(function (doc) {\r\n\t\t\t\tPropBagInternal[\"IsError\"] = false;\r\n\t\t\t\tPropBagInternal[\"Result\"] = doc.rows.map(row=>row.key);\r\n\t\t\t\tPropBagInternal[\"Error\"] = null;\r\n\t\t\t\tresolve(PropBagInternal);\r\n\t\t\t})\r\n\t\t\t.catch(function (err) {\r\n\t\t\t\tPropBagInternal[\"IsError\"] = true;\r\n\t\t\t\tPropBagInternal[\"Result\"] = null;\r\n\t\t\t\tPropBagInternal[\"Error\"] = err;\r\n\t\t\t\tresolve(PropBagInternal);\r\n\t\t\t});\r\n\t\t});\r\n\t\t} catch (exception) {\r\n\t\tconsole.log(`Error while reading keys from context` + exception);\r\n\t\t}\r\n\t}\r\n\t/**\r\n\t* Get DB Connetion Object\r\n\t* It returns a Fxp.Interfaces.IPouchDbService\r\n\t* @method Fxp.Context.FxpContext#getDBService \r\n\t* @param {string} applicationName The name of application. It is optional parameter. \r\n\t*/\r\n\tprivate getDBService(applicationName?: string): IPouchDbService {\r\n\t\ttry {\r\n\t\t\tvar db: IPouchDbService;\r\n\t\t\tswitch (applicationName) {\r\n\t\t\t\tcase \"\":\r\n\t\t\t\tcase null:\r\n\t\t\t\tcase undefined:\r\n\t\t\t\t\tdb = this.pouchService;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tdefault:\r\n\t\t\t\t\tdb = this._iPouchDBProvider.getDBConnection(applicationName);\r\n\t\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t\treturn db;\r\n\t\t}\r\n\t\tcatch (exception) { }\r\n\t}\r\n}","export class HelpArticleImageController {\r\n\tconstructor(\r\n\t\tprivate $uibModalInstance: any,\r\n\t\tprivate source: any\r\n\t) { }\r\n\r\n\tcloseModal() {\r\n\t\tvar self = this;\r\n\t\tself.$uibModalInstance.dismiss()\r\n\t}\r\n}","\r\nimport { ApplicationConstants } from \"../common/ApplicationConstants\";\r\nimport { ILogger } from \"../interfaces/ILogger\";\r\nimport { FxpLogHelper } from \"../telemetry/FxpLogHelper\";\r\nimport { TelemetryConstants } from \"../telemetry/TelemetryConst\";\r\n\r\n\r\nexport class SessionTimeoutModalController {\r\n\tconstructor(\r\n\t\tprivate fxplogger: ILogger,\r\n\r\n\t) { }\r\n\tpublic reLaunch() {\r\n\t\tconst self = this;\r\n\t\tself.fxplogger.logEvent(`${TelemetryConstants.FXP_TELEMETRY_BASE_NAME}.SessionTimeoutModalController.reLaunch`, `${TelemetryConstants.FXP_TELEMETRY_BASE_NAME}.SessionTimeoutModal.RelaunchButtonClicked`);\r\n\t\tconst sessionId = FxpLogHelper.getNewSessionId(); /* CodeQL [SM01527] It is used only for tracking */\r\n window.sessionStorage.setItem(ApplicationConstants.FxpSessionKey, sessionId);\r\n\t\tdocument.location.reload(true);\r\n\t}\r\n}\r\n","declare type IStateService = any;\r\nimport { IActOnBehalfOfControllerScope } from \"../interfaces/IActOnBehalfOfControllerScope\";\r\nimport { ILogger } from \"../interfaces/ILogger\";\r\nimport { FxpMessageService } from \"../../app/banner/FxpMessageService\";\r\nimport { FxpConstants } from \"../common/ApplicationConstants\";\r\nimport { OBOUserService } from \"../services/OBOUserService\";\r\nimport { IFxpContext } from \"../interfaces/IFxpContext\";\r\nimport { IRootScope } from \"../interfaces/IRootScope\";\r\nimport { UserProfileService } from \"../services/userProfileService\";\r\nimport { UserInfoService } from \"../services/UserInfoService\";\r\nimport { LogPropertyBag } from \"../telemetry/LogPropertyBag\";\r\nimport { TelemetryContext } from \"../telemetry/telemetrycontext\";\r\nimport { FxpConfigurationService } from \"../services/FxpConfiguration\";\r\nimport { DashboardService } from \"../services/dashboardService\";\r\nimport { CommonUtils } from \"../utils/CommonUtils\";\r\nimport { ActOnBehalfOfHelper } from \"../factory/ActOnBehalfOfHelper\";\r\nimport { FxpBroadcastedEvents } from \"../services/FxpBroadcastedEvents\";\r\nimport { FxpGlobalStoreService } from \"../services/fxp.global.store.service\";\r\nimport { UI_LOADER_NAMES } from \"../../app/loader/UILoader.constants\";\r\nimport {\r\n HideSpecificLoader,\r\n ShowSpecificLoader,\r\n} from \"../../app/loader/loader.actions\";\r\nimport { TelemetryConstants } from \"../telemetry/TelemetryConst\";\r\nimport { ErrorCodes } from \"../constants/errorCodes\";\r\nimport { ErrorSeverityLevel } from \"../telemetry/ErrorSeverityLevel\";\r\nimport { FeatureUsageEvent } from \"../telemetry/FeatureUsageEvent\";\r\nimport {\r\n ActionStatus,\r\n ActionType,\r\n ComponentType,\r\n EventName,\r\n} from \"@microsoftit/telemetry-extensions-npm\";\r\n\r\nconst ActOnBehalfOfFeatureName = `${TelemetryConstants.FXP_TELEMETRY_BASE_NAME}.ActOnBehalfOf`;\r\nexport class ActOnBehalfOfController {\r\n private $state: IStateService;\r\n private $rootScope: IRootScope;\r\n private $scope: IActOnBehalfOfControllerScope;\r\n private userProfileService: UserProfileService;\r\n private userInfoService: UserInfoService;\r\n private fxpLoggerService: ILogger;\r\n private fxpMessage: FxpMessageService;\r\n private ActOnBehalfOfHelper: ActOnBehalfOfHelper;\r\n private OBOUserService: OBOUserService;\r\n private fxpContext: IFxpContext;\r\n private fxpErrorConstants: any;\r\n private loggedInUser: string;\r\n private oboMetric: LogPropertyBag;\r\n private currentDate: Date;\r\n private fxpTelemetryContext: TelemetryContext;\r\n private fxpConfigurationService: FxpConfigurationService;\r\n private dashboardService: DashboardService;\r\n private sourceForTelemetry: string = `${TelemetryConstants.FXP_TELEMETRY_BASE_NAME}.ActOnBehalfOfController`;\r\n private actOnBehalfOfFeature: FeatureUsageEvent;\r\n\r\n constructor(\r\n $state: IStateService,\r\n $rootScope: IRootScope,\r\n $scope: IActOnBehalfOfControllerScope,\r\n userProfileService: UserProfileService,\r\n userInfoService: UserInfoService,\r\n fxpLoggerService: ILogger,\r\n fxpMessage: FxpMessageService,\r\n ActOnBehalfOfHelper: ActOnBehalfOfHelper,\r\n OBOUserService: OBOUserService,\r\n fxpContext: IFxpContext,\r\n fxpTelemetryContext: TelemetryContext,\r\n fxpConfigurationService: FxpConfigurationService,\r\n dashboardService: DashboardService,\r\n private fxpGlobalStoreService: FxpGlobalStoreService\r\n ) {\r\n var pageLoadStartTime = performance.now();\r\n this.$state = $state;\r\n this.$rootScope = $rootScope;\r\n this.$scope = $scope;\r\n this.userProfileService = userProfileService;\r\n this.userInfoService = userInfoService;\r\n this.fxpLoggerService = fxpLoggerService;\r\n this.fxpMessage = fxpMessage;\r\n this.ActOnBehalfOfHelper = ActOnBehalfOfHelper;\r\n this.OBOUserService = OBOUserService;\r\n this.fxpContext = fxpContext;\r\n this.fxpErrorConstants = $rootScope.fxpUIConstants.UIMessages;\r\n this.loggedInUser = userInfoService.getLoggedInUser();\r\n this.oboMetric = ActOnBehalfOfHelper.getPropBag();\r\n this.fxpTelemetryContext = fxpTelemetryContext;\r\n this.fxpConfigurationService = fxpConfigurationService;\r\n this.dashboardService = dashboardService;\r\n\r\n //Initializes value\r\n this.$scope.footerdata =\r\n this.fxpConfigurationService.FxpBaseConfiguration.FxpFooterData;\r\n this.$scope.oboUIStrings =\r\n this.$rootScope.fxpUIConstants.UIStrings.OBOUIStrings;\r\n\r\n this.$scope.displayErrorMessage = false;\r\n this.$scope.searchUsersList = [];\r\n this.$scope.errorMessage = \"\";\r\n this.$scope.selectedUser = \"\";\r\n this.$scope.selectedUserObject = {};\r\n this.$scope.isValidUserSelected = false;\r\n this.$scope.showViewFullProfileLink =\r\n window[\"tenantConfiguration\"].ShowFullProfile;\r\n this.$scope.profileStateName = window[\"tenantConfiguration\"].ViewProfileUrl;\r\n this.fxpLoggerService.renewCorrelationId();\r\n this.actOnBehalfOfFeature = new FeatureUsageEvent(\r\n ActOnBehalfOfFeatureName,\r\n ActionType.User,\r\n \"ActivateOBO\",\r\n EventName.ButtonClick,\r\n ComponentType.Web\r\n );\r\n this.fxpLoggerService.startFeatureUsageEvent(this.actOnBehalfOfFeature);\r\n\r\n this.$scope.reset = this.reset.bind(this);\r\n this.$scope.handleEnterKeyOnSearchUserInput =\r\n this.handleEnterKeyOnSearchUserInput.bind(this);\r\n this.$scope.actOnBehalfOfUserClick = this.actOnBehalfOfUserClick.bind(this);\r\n this.$scope.OBOAdminstratorClick = this.OBOAdminstratorClick.bind(this);\r\n this.$scope.searchUser = this.searchUser.bind(this);\r\n this.$scope.onSelect = this.onSelect.bind(this);\r\n this.$scope.createProfile = this.createProfile.bind(this);\r\n this.$scope.pullFocusToElement = CommonUtils.pullFocusToElement.bind(this);\r\n\r\n if ($rootScope.actOnBehalfOfUserActive) {\r\n var msg = this.fxpErrorConstants.OBOUserActive.ErrorMessage;\r\n msg = msg.replace(\r\n \"OBOusername\",\r\n this.OBOUserService.getOBOUser().fullName\r\n );\r\n\r\n this.fxpMessage.addMessage(\r\n msg,\r\n FxpConstants.messageType.error,\r\n undefined,\r\n undefined,\r\n undefined,\r\n \"OBO_FormControl\"\r\n );\r\n this.fxpLoggerService.logError(\r\n `${this.sourceForTelemetry}.Constructor`,\r\n this.fxpErrorConstants.OBOUserActive.ErrorMessage,\r\n ErrorCodes.OBO_User_Already_Active,\r\n null,\r\n null,\r\n null,\r\n null,\r\n ErrorSeverityLevel.Low\r\n );\r\n }\r\n var pageLoadEndTime = performance.now();\r\n var pageLoadDuration = pageLoadEndTime - pageLoadStartTime;\r\n this.fxpLoggerService.logPageLoadMetrics(pageLoadDuration);\r\n $(\"ul.dropdown-menu\").attr(\"aria-label\", \"User Search Results\");\r\n }\r\n\r\n reset() {\r\n var self = this;\r\n var propBag = self.ActOnBehalfOfHelper.getPropBag();\r\n self.fxpLoggerService.logEvent(\r\n `${TelemetryConstants.FXP_TELEMETRY_BASE_NAME}.ActOnBehalfOfController.reset`,\r\n `${TelemetryConstants.FXP_TELEMETRY_BASE_NAME}.OBOResetClickEvent`,\r\n propBag\r\n );\r\n self.$scope.selectedUser = \"\";\r\n self.$scope.displayErrorMessage = false;\r\n self.$scope.userProfileDoesNotExist = false;\r\n self.$scope.isValidUserSelected = false;\r\n self.$scope.selectedUserObject = {};\r\n /*using tab and Enter using Enter Key on reset Button shifting focusing to Type ahead Search Box. */\r\n var oboFormControl = $(\"#OBO_FormControl\");\r\n if (!CommonUtils.isNullOrEmpty(oboFormControl)) {\r\n oboFormControl.focus();\r\n }\r\n }\r\n\r\n actOnBehalfOfUserClick() {\r\n var self = this;\r\n const source = `${this.sourceForTelemetry}.ActOnBehalfOfUserClick`;\r\n if (!self.$scope.userProfileDoesNotExist) {\r\n self.fxpLoggerService.logTrace(\r\n source,\r\n \"actOnBehalfofuser(alias) Started\"\r\n );\r\n var propbag = self.fxpLoggerService.createPropertyBag();\r\n try {\r\n var selectedUser = self.$scope.selectedUserObject;\r\n if (selectedUser) {\r\n if (selectedUser.Alias != self.loggedInUser) {\r\n if (selectedUser.RoleGroupID > 0) {\r\n self.fxpGlobalStoreService.DispatchGlobalAction(\r\n \"Platform\",\r\n ShowSpecificLoader({\r\n name: UI_LOADER_NAMES.FXP_LOADERS.ACT_ON_BEHALF_OF_LOADER,\r\n loadingText: \"Loading\",\r\n })\r\n );\r\n return self.ActOnBehalfOfHelper.getUserProfileAndClaims(\r\n selectedUser\r\n )\r\n .then(function (selectedUserData) {\r\n var userClaims = self.userInfoService.getCurrentUserClaims();\r\n if (\r\n userClaims == undefined ||\r\n (userClaims.Applications != undefined &&\r\n Object.keys(userClaims.Applications).length <= 0)\r\n ) {\r\n self.fxpMessage.addMessage(\r\n self.fxpErrorConstants.SelectedProfileRoles.ErrorMessage,\r\n FxpConstants.messageType.error,\r\n undefined,\r\n undefined,\r\n undefined,\r\n \"OBO_FormControl\"\r\n );\r\n self.userInfoService.setCurrentUserOID(\r\n self.userInfoService.getLoggedInUserOID()\r\n );\r\n self.userProfileService.setCurrentUser(self.loggedInUser);\r\n self.userInfoService.setCurrentUserUpn(\r\n self.userInfoService.getLoggedInUserUpn()\r\n );\r\n self.userInfoService.setActingOnBehalfOfFlag(false);\r\n self.fxpGlobalStoreService.DispatchGlobalAction(\r\n \"Platform\",\r\n HideSpecificLoader({\r\n name: UI_LOADER_NAMES.FXP_LOADERS\r\n .ACT_ON_BEHALF_OF_LOADER,\r\n })\r\n );\r\n self.OBOUserService.setCurrentUserStateFromLoggedInUserState();\r\n return;\r\n }\r\n\r\n var OBOUser = {\r\n fullName: selectedUserData.fullName,\r\n displayName: selectedUserData.DisplayName,\r\n alias: selectedUserData.alias,\r\n href:\r\n self.$scope.profileStateName +\r\n \"/\" +\r\n selectedUserData.alias +\r\n \"/basic\",\r\n businessRoleId: selectedUserData.businessRoleId,\r\n businessRole: selectedUserData.businessRole,\r\n roleGroupId: selectedUserData.roleGroupId,\r\n roleGroupName: selectedUserData.roleGroupName,\r\n defaultAppRole: userClaims.defaultAppRole,\r\n aadObjectId: selectedUserData.AadObjectId,\r\n };\r\n\r\n self.ActOnBehalfOfHelper.getObOUserConfiguration(\r\n userClaims.defaultAppRole\r\n ).then(\r\n function success(response) {\r\n var onbehalfUserRoutes = response.data.UiConfiguration;\r\n var oboUserSessionInfo = JSON.stringify(\r\n self.userInfoService.getCurrentUserProfile()\r\n );\r\n var OBOEntity = {\r\n OBOUserStatus: true,\r\n OBOUserRoutes: onbehalfUserRoutes,\r\n OBOUser: OBOUser,\r\n OBOUserSessionInfo: oboUserSessionInfo,\r\n };\r\n self.OBOUserService.saveOBOEntityInContext(OBOEntity);\r\n self.$scope.OBOUser = OBOUser;\r\n //Telemetry\r\n self.fxpTelemetryContext.addToGlobalPropertyBag(\r\n FxpConstants.OBOConstants.ActonBehalfMode,\r\n \"true\"\r\n );\r\n self.fxpTelemetryContext.addToGlobalPropertyBag(\r\n FxpConstants.OBOConstants.OnBehalfOfUserUpn,\r\n userClaims.upn\r\n );\r\n self.fxpTelemetryContext.addToGlobalPropertyBag(\r\n FxpConstants.OBOConstants.OnBehalfOfUserBusinessRole,\r\n selectedUserData.businessRole\r\n );\r\n self.fxpTelemetryContext.addToGlobalPropertyBag(\r\n FxpConstants.OBOConstants.OnBehalfOfUserRoleGroup,\r\n selectedUserData.roleGroupName\r\n );\r\n var oboStartTime = new Date().getTime().toString();\r\n localStorage.setItem(\r\n FxpConstants.OBOConstants.ActonBehalfofAdminStartTime.toString(),\r\n oboStartTime\r\n );\r\n propbag.addToBag(\r\n FxpConstants.OBOConstants.ActonBehalfofAdminStartTime,\r\n oboStartTime\r\n );\r\n self.fxpGlobalStoreService.DispatchGlobalAction(\r\n \"Platform\",\r\n HideSpecificLoader({\r\n name: UI_LOADER_NAMES.FXP_LOADERS\r\n .ACT_ON_BEHALF_OF_LOADER,\r\n })\r\n );\r\n self.fxpLoggerService.logEvent(\r\n source,\r\n `${TelemetryConstants.FXP_TELEMETRY_BASE_NAME}.AdminOnBehalfOfStart`,\r\n propbag\r\n );\r\n self.fxpLoggerService.logTrace(\r\n source,\r\n \"actOnBehalfofuserclick End\"\r\n );\r\n //if obo user fxp configuration is loaded then broadcast the UserContextChanged\r\n self.$rootScope.$broadcast(\r\n FxpBroadcastedEvents.OnUserContextChanged,\r\n OBOUser.alias,\r\n OBOUser.roleGroupId,\r\n OBOUser.businessRoleId\r\n );\r\n self.$rootScope.fxpBreadcrumb = [];\r\n self.actOnBehalfOfFeature.ActionStatus =\r\n ActionStatus.Succeeded;\r\n self.fxpLoggerService.endFeatureUsageEvent(\r\n source,\r\n self.actOnBehalfOfFeature\r\n );\r\n },\r\n function errorCallback(response) {\r\n propbag.addToBag(\"Error\", response);\r\n self.fxpGlobalStoreService.DispatchGlobalAction(\r\n \"Platform\",\r\n HideSpecificLoader({\r\n name: UI_LOADER_NAMES.FXP_LOADERS\r\n .ACT_ON_BEHALF_OF_LOADER,\r\n })\r\n );\r\n self.OBOUserService.removeOBOUserContext();\r\n self.userInfoService.setCurrentUserOID(\r\n self.userInfoService.getLoggedInUserOID()\r\n );\r\n self.userProfileService.setCurrentUser(self.loggedInUser);\r\n self.userInfoService.setCurrentUserUpn(\r\n self.userInfoService.getLoggedInUserUpn()\r\n );\r\n self.userInfoService.setActingOnBehalfOfFlag(false);\r\n self.fxpMessage.addMessage(\r\n self.fxpErrorConstants.OBOUserUIConfigurationError\r\n .ErrorMessage,\r\n FxpConstants.messageType.error,\r\n undefined,\r\n undefined,\r\n undefined,\r\n \"OBO_FormControl\"\r\n );\r\n self.fxpLoggerService.logError(\r\n source,\r\n self.fxpErrorConstants.OBOUserUIConfigurationError\r\n .ErrorMessage,\r\n ErrorCodes.Get_OBO_User_Configuration_Failure,\r\n null,\r\n propbag,\r\n null,\r\n null,\r\n ErrorSeverityLevel.Medium\r\n );\r\n self.$rootScope.$broadcast(\r\n FxpBroadcastedEvents.OnUserContextChanged,\r\n self.userInfoService.getLoggedInUser(),\r\n self.userInfoService.getCurrentUserData().roleGroupId,\r\n self.userInfoService.getCurrentUserData().businessRoleId\r\n );\r\n self.actOnBehalfOfFeature.ActionStatus =\r\n ActionStatus.Failed;\r\n self.fxpLoggerService.endFeatureUsageEvent(\r\n source,\r\n self.actOnBehalfOfFeature\r\n );\r\n }\r\n );\r\n })\r\n .catch(function (err) {\r\n self.userInfoService.setCurrentUserOID(\r\n self.userInfoService.getLoggedInUserOID()\r\n );\r\n self.userProfileService.setCurrentUser(self.loggedInUser);\r\n self.userInfoService.setCurrentUserUpn(\r\n self.userInfoService.getLoggedInUserUpn()\r\n );\r\n self.userInfoService.setActingOnBehalfOfFlag(false);\r\n self.fxpGlobalStoreService.DispatchGlobalAction(\r\n \"Platform\",\r\n HideSpecificLoader({\r\n name: UI_LOADER_NAMES.FXP_LOADERS.ACT_ON_BEHALF_OF_LOADER,\r\n })\r\n );\r\n self.actOnBehalfOfFeature.ActionStatus = ActionStatus.Failed;\r\n self.fxpLoggerService.endFeatureUsageEvent(\r\n source,\r\n self.actOnBehalfOfFeature\r\n );\r\n });\r\n } else {\r\n self.userInfoService.setCurrentUserOID(\r\n self.userInfoService.getLoggedInUserOID()\r\n );\r\n self.userProfileService.setCurrentUser(self.loggedInUser);\r\n self.userInfoService.setCurrentUserUpn(\r\n self.userInfoService.getLoggedInUserUpn()\r\n );\r\n self.userInfoService.setActingOnBehalfOfFlag(false);\r\n self.fxpMessage.addMessage(\r\n self.fxpErrorConstants.UserProfileBusinessRoleFailureError\r\n .ErrorMessage,\r\n FxpConstants.messageType.error,\r\n undefined,\r\n undefined,\r\n undefined,\r\n \"OBO_FormControl\"\r\n );\r\n self.fxpLoggerService.logWarning(\r\n source,\r\n self.fxpErrorConstants.UserProfileBusinessRoleFailureError\r\n .ErrorMessage\r\n );\r\n self.actOnBehalfOfFeature.ActionStatus = ActionStatus.Failed;\r\n self.fxpLoggerService.endFeatureUsageEvent(\r\n source,\r\n self.actOnBehalfOfFeature\r\n );\r\n }\r\n } else {\r\n self.$scope.errorMessage =\r\n self.$rootScope.fxpUIConstants.UIStrings.SelectedUserisCurrentLoggedInUserError;\r\n self.$scope.displayErrorMessage = true;\r\n }\r\n } else {\r\n self.$scope.userProfileDoesNotExist = true;\r\n self.$scope.errorMessage =\r\n self.$rootScope.fxpUIConstants.UIStrings.ProfileNotFound;\r\n }\r\n } catch (ex) {\r\n self.fxpGlobalStoreService.DispatchGlobalAction(\r\n \"Platform\",\r\n HideSpecificLoader({\r\n name: UI_LOADER_NAMES.FXP_LOADERS.ACT_ON_BEHALF_OF_LOADER,\r\n })\r\n );\r\n self.fxpMessage.addMessage(\r\n self.fxpErrorConstants.GeneralExceptionError.ErrorMessage,\r\n FxpConstants.messageType.error,\r\n undefined,\r\n undefined,\r\n undefined,\r\n \"OBO_FormControl\"\r\n );\r\n self.userInfoService.setCurrentUserOID(\r\n self.userInfoService.getLoggedInUserOID()\r\n );\r\n self.userProfileService.setCurrentUser(self.loggedInUser);\r\n self.userInfoService.setCurrentUserUpn(\r\n self.userInfoService.getLoggedInUserUpn()\r\n );\r\n self.userInfoService.setActingOnBehalfOfFlag(false);\r\n self.actOnBehalfOfFeature.ActionStatus = ActionStatus.Failed;\r\n self.fxpLoggerService.endFeatureUsageEvent(\r\n source,\r\n self.actOnBehalfOfFeature\r\n );\r\n }\r\n }\r\n }\r\n\r\n OBOAdminstratorClick() {\r\n var self = this;\r\n //Reset and move to landing page\r\n self.OBOUserService.removeOBOUserContext();\r\n self.$rootScope.navigateToLandingPage();\r\n }\r\n\r\n searchUser(value: string) {\r\n var self = this;\r\n const source = `${this.sourceForTelemetry}.SearchUser`;\r\n var rootScope = self.$rootScope;\r\n var startDate = new Date();\r\n return self.userProfileService.searchProfile(value).then(\r\n (data) => {\r\n var usersList = [];\r\n var endDate = new Date();\r\n if (data.data && data.data.length > 0) {\r\n self.$scope.displayErrorMessage = false;\r\n self.$scope.errorMessage = \"\";\r\n usersList = data.data;\r\n } else {\r\n self.$scope.displayErrorMessage = false;\r\n self.$scope.selectedUserObject = {};\r\n self.$scope.errorMessage =\r\n rootScope.fxpUIConstants.UIStrings.ProfileNotFound;\r\n }\r\n var responseTime = endDate.getTime() - startDate.getTime();\r\n var propbag = self.ActOnBehalfOfHelper.getMetricPropBag(\r\n startDate,\r\n endDate\r\n );\r\n self.fxpLoggerService.logMetric(\r\n source,\r\n FxpConstants.metricConstants.SearchProfileServiceTime,\r\n responseTime,\r\n propbag\r\n );\r\n return usersList;\r\n },\r\n (err) => {\r\n self.$scope.selectedUserObject = {};\r\n var endDate = new Date();\r\n var propbag: any;\r\n var notificaitonMsg = (\r\n document.getElementById(\"searchErrorMessage\")\r\n );\r\n if (err.data.ErrorCode == 112) {\r\n self.$scope.errorMessage =\r\n rootScope.fxpUIConstants.UIStrings.ProfileNotFound;\r\n propbag = self.fxpLoggerService.createPropertyBag();\r\n propbag.addToBag(\"SearchUser\", self.$scope.selectedUser);\r\n if (notificaitonMsg) {\r\n notificaitonMsg.innerHTML =\r\n \"
      \" + self.$scope.errorMessage + \"
      \";\r\n }\r\n self.fxpLoggerService.logInformation(\r\n source,\r\n rootScope.fxpUIConstants.UIMessages.SearchProfileSvcReturnsError\r\n .ErrorMessage,\r\n propbag\r\n );\r\n } else {\r\n self.$scope.errorMessage =\r\n rootScope.fxpUIConstants.UIStrings.ErrorRetrieving;\r\n if (notificaitonMsg) {\r\n notificaitonMsg.innerHTML =\r\n \"
      \" + self.$scope.errorMessage + \"
      \";\r\n }\r\n self.fxpLoggerService.logError(\r\n source,\r\n rootScope.fxpUIConstants.UIMessages.SearchProfileSvcNotWorkingError\r\n .ErrorMessage,\r\n ErrorCodes.OBO_User_Search_Failure,\r\n null,\r\n null,\r\n null,\r\n null,\r\n ErrorSeverityLevel.Medium\r\n );\r\n }\r\n\r\n var responseTime = endDate.getTime() - startDate.getTime();\r\n propbag = self.ActOnBehalfOfHelper.getMetricPropBag(startDate, endDate);\r\n self.fxpLoggerService.logMetric(\r\n source,\r\n FxpConstants.metricConstants.SearchProfileServiceErrorTime,\r\n responseTime,\r\n propbag\r\n );\r\n }\r\n );\r\n }\r\n\r\n handleEnterKeyOnSearchUserInput(event: KeyboardEvent) {\r\n var self = this;\r\n self.$scope.isValidUserSelected = false;\r\n if (event.key.toLowerCase() == \"enter\") {\r\n self.$scope.isValidUserSelected = true;\r\n } else if (\r\n (event.key == \"Tab\" || event.key.startsWith(\"Arrow\")) &&\r\n self.$scope.selectedUserObject.Alias\r\n ) {\r\n self.$scope.isValidUserSelected = true;\r\n }\r\n }\r\n\r\n onSelect($item) {\r\n var self = this;\r\n self.$scope.selectedUserObject = $item;\r\n self.$scope.isValidUserSelected = true;\r\n }\r\n\r\n createProfile() {\r\n const source = `${this.sourceForTelemetry}.createProfile`;\r\n var self = this;\r\n var propBag = self.ActOnBehalfOfHelper.getPropBag();\r\n self.fxpLoggerService.logEvent(\r\n source,\r\n `${TelemetryConstants.FXP_TELEMETRY_BASE_NAME}.CreateProfile`,\r\n propBag\r\n );\r\n\r\n var profileStatename =\r\n self.$rootScope.fxpUIConstants.UIStrings.CreateProfileStateName;\r\n var profileState = self.$state.get(profileStatename);\r\n if (profileState) self.$state.go(profileStatename);\r\n else {\r\n self.fxpMessage.addMessage(\r\n self.fxpErrorConstants.CreateProfileState.ErrorMessage,\r\n FxpConstants.messageType.error,\r\n undefined,\r\n undefined,\r\n undefined,\r\n \"OBO_FormControl\"\r\n );\r\n }\r\n }\r\n}\r\n\r\nActOnBehalfOfController.$inject = [\r\n \"$state\",\r\n \"$rootScope\",\r\n \"$scope\",\r\n \"UserProfileService\",\r\n \"UserInfoService\",\r\n \"FxpLoggerService\",\r\n \"FxpMessageService\",\r\n \"ActOnBehalfOfHelper\",\r\n \"OBOUserService\",\r\n \"FxpContextService\",\r\n \"FxpTelemetryContext\",\r\n \"FxpConfigurationService\",\r\n \"DashboardService\",\r\n \"FxpGlobalStoreService\",\r\n];\r\n","/**\r\n * @application Fxp\r\n */\r\n/**\r\n * @module Fxp.Controllers\r\n */\r\ndeclare type IStateService = any;\r\nimport { ILogger } from \"../interfaces/ILogger\";\r\nimport { FxpMessageService } from \"../../app/banner/FxpMessageService\";\r\nimport {\r\n FxpConstants,\r\n CustomEvents,\r\n ApplicationConstants,\r\n} from \"../common/ApplicationConstants\";\r\nimport { OBOUserService } from \"../services/OBOUserService\";\r\nimport { IRootScope } from \"../interfaces/IRootScope\";\r\nimport { UserProfileService } from \"../services/userProfileService\";\r\nimport { FxpConfigurationService } from \"../services/FxpConfiguration\";\r\nimport { FxpStateTransitionService } from \"../services/FxpStateTransitionService\";\r\nimport { CommonUtils } from \"../utils/CommonUtils\";\r\nimport { IAppControllerScope } from \"../interfaces/IAppControllerScope\";\r\nimport { FxpBreadcrumbService } from \"../services/FxpBreadcrumbService\";\r\nimport { pageTourEventService } from \"../services/pageTourEventService\";\r\nimport { FxpBotService } from \"../provider/FxpBotServiceProvider\";\r\nimport { PlannedDownTimeService } from \"../../app/systemMessages/PlannedDownTimeService\";\r\nimport { FxpUIData } from \"../factory/FxpUIDataFactory\";\r\nimport { AppControllerHelper } from \"../factory/AppControllerHelper\";\r\nimport { SessionTimeoutModalFactory } from \"../factory/SessionTimeoutModalFactory\";\r\nimport { FxpBroadcastedEvents } from \"../services/FxpBroadcastedEvents\";\r\nimport { RejectType } from \"@uirouter/core\";\r\nimport { UserInfoService } from \"./../services/UserInfoService\";\r\nimport { IfObservable } from \"rxjs/observable/IfObservable\";\r\nimport { FxpSignalRService } from \"../services/FxpSignalRClient\";\r\nimport {\r\n ActionStatus,\r\n ActionType,\r\n ComponentType,\r\n EventName,\r\n} from \"@microsoftit/telemetry-extensions-npm\";\r\nimport { SystemEvent } from \"../telemetry/SystemEvent\";\r\nimport { TelemetryConstants } from \"../telemetry/TelemetryConst\";\r\nimport { FxpGlobalStoreService } from \"../services/fxp.global.store.service\";\r\nimport { ShowLoader } from \"../../app/loader/loader.actions\";\r\nimport { SimpleProvider } from \"@microsoft/mgt\";\r\nimport { ErrorCodes } from \"../constants/errorCodes\";\r\nimport { ErrorSeverityLevel } from \"../telemetry/ErrorSeverityLevel\";\r\nimport { FeatureUsageEvent } from \"../telemetry/FeatureUsageEvent\";\r\nimport { SharedComponentLoaderCustomEvents } from \"@fxp/fxpsharedcomponentloader\";\r\nimport { LogPropertyBag } from \"../telemetry/LogPropertyBag\";\r\n\r\n//import { AngularDirective } from \"../../decorators\";\r\ndeclare type FeatureFlagService = any;\r\n\r\n/**\r\n * A main controller for FxpApp module. This is the controller having basic models and events.\r\n * @class Fxp.Controllers.AppController\r\n * @classdesc A main controller of FxpApp module\r\n * @example \r\n * //To Use AppController\r\n * angular.module('FxPApp').controller('AppController', ['AnyDependency', AppController]);\r\n * function AppController(AnyDependency){ AnyDependency.doSomething(); }\r\n */\r\n//@AngularDirective(\"appcontroller\", AppController, \"FxpApp\", ['$rootScope', '$scope', '$location', '$state', 'FxpUIData', 'FxpLoggerService', 'UserProfileService', 'adalAuthenticationService', 'PageLoaderService', 'AppControllerHelper', 'DeviceFactory', 'FxpConfigurationService', 'FxpBreadcrumbService', 'FxpMessageService', 'FxpBotService', '$window', 'FeatureFlagService', 'StartUpFlightConfig', 'PlannedDownTimeService', 'SessionTimeoutModalFactory', 'PageTourEventService'])\r\nexport class AppController {\r\n private $rootScope: IRootScope;\r\n private $scope: IAppControllerScope;\r\n private $state: IStateService;\r\n private $location: angular.ILocationService;\r\n private fxpUIData: FxpUIData;\r\n private fxpLogger: ILogger;\r\n private fxpConstants: FxpConstants;\r\n private userProfileService: UserProfileService;\r\n private appControllerHelper: AppControllerHelper;\r\n private fxpConfigurationService: FxpConfigurationService;\r\n private fxpBreadcrumbService: FxpBreadcrumbService;\r\n private fxpMessage: FxpMessageService;\r\n private sessionTimeOutModalFactory: SessionTimeoutModalFactory;\r\n private device: any;\r\n private pageLoadThreshold: any;\r\n private stateSuccessTime: any;\r\n private $onloginSuccessSubcription: any;\r\n private enableFxpBotWindow: boolean = true;\r\n private isFeedbackDialogOpen: boolean = false;\r\n\r\n private readonly sourceForTelemetry = `${TelemetryConstants.FXP_TELEMETRY_BASE_NAME}.AppController`;\r\n\r\n constructor(\r\n $rootScope: IRootScope,\r\n $scope: IAppControllerScope,\r\n $location: angular.ILocationService,\r\n $state: IStateService,\r\n fxpUIData: FxpUIData,\r\n fxpLoggerService: ILogger,\r\n userProfileService: UserProfileService,\r\n appControllerHelper: AppControllerHelper,\r\n deviceFactory: any,\r\n fxpConfigurationService: FxpConfigurationService,\r\n fxpBreadcrumbService: FxpBreadcrumbService,\r\n fxpMessage: FxpMessageService,\r\n fxpBotService: FxpBotService,\r\n $window: angular.IWindowService,\r\n private featureFlagService: FeatureFlagService,\r\n private startUpFlightConfig: any,\r\n private plannedDownTimeService: PlannedDownTimeService,\r\n private sessionTimeoutModalFactory: SessionTimeoutModalFactory,\r\n private pageTourEventService: pageTourEventService,\r\n private fxpStateTransitionService: FxpStateTransitionService,\r\n private oboUserService: OBOUserService,\r\n private userInfoService: UserInfoService,\r\n private fxpSignalRService: FxpSignalRService,\r\n private fxpGlobalStoreService: FxpGlobalStoreService\r\n ) {\r\n const source_telemetry = `${this.sourceForTelemetry}.Constructor`;\r\n this.$rootScope = $rootScope;\r\n this.$rootScope.showLoader = true;\r\n this.$rootScope.isHelpOpen = false;\r\n this.$rootScope.IsModelOpen = false;\r\n this.$scope = $scope;\r\n this.$state = $state;\r\n this.device = deviceFactory;\r\n this.$location = $location;\r\n this.fxpUIData = fxpUIData;\r\n this.fxpLogger = fxpLoggerService;\r\n this.fxpConstants = FxpConstants;\r\n this.userProfileService = userProfileService;\r\n this.fxpBreadcrumbService = fxpBreadcrumbService;\r\n this.appControllerHelper = appControllerHelper;\r\n this.fxpMessage = fxpMessage;\r\n this.pageLoadThreshold = parseFloat(\r\n fxpConfigurationService.FxpAppSettings.PageLoadDurationThreshold\r\n );\r\n this.sessionTimeOutModalFactory = sessionTimeoutModalFactory;\r\n this.pageTourEventService = pageTourEventService;\r\n this.$onloginSuccessSubcription = null;\r\n this.$rootScope.isBotEnabled =\r\n fxpConfigurationService.FxpAppSettings.IsBotEnabled;\r\n this.fxpConfigurationService = fxpConfigurationService;\r\n this.$scope.profileFlyoutConfig = \r\n CommonUtils.isNullOrEmpty(fxpConfigurationService?.FxpAppSettings?.ProfileFlyoutConfig)\r\n ? JSON.parse(ApplicationConstants?.ProfileFlyoutConfig)\r\n : JSON.parse(fxpConfigurationService?.FxpAppSettings?.ProfileFlyoutConfig);\r\n\r\n var self = this;\r\n\r\n //ENUM to represent the last route transition status.\r\n var pageTransitionState = {\r\n stateNotFound: \"stateNotFound\",\r\n stateChangeError: \"stateChangeError\",\r\n stateChangeSuccess: \"stateChangeSuccess\",\r\n viewContentLoading: \"viewContentLoading\",\r\n viewContentLoaded: \"viewContentLoaded\",\r\n };\r\n $rootScope.$on(FxpBroadcastedEvents.ShowPopupOnPageDirty, function (event, flag) {\r\n\t\t\twindow._showPageDirtyPopup = flag;\r\n\t\t});\r\n $rootScope.$on('$stateChangeStart', function (event, toState, toParams, fromState, fromParams) {\r\n //Show popup to user if page is dirty.\r\n self.showPageDirtyPopupToUser(event);\r\n\t\t});\r\n $rootScope.$on('$stateChangeSuccess', function (event, toState, toParams, fromState, fromParams) {\r\n\t\t\tif(window._showPageDirtyPopup){\r\n window._showPageDirtyPopup = false;\r\n\t\t\t}\r\n\t\t});\r\n $rootScope.getUrlForDashboard = this.getUrlForDashboard.bind(this);\r\n //Holds the last route load metrics and details\r\n $rootScope.$on(\"resetPageLoadMetrics\", function (evt) {\r\n $rootScope.pageLoadMetrics = {\r\n sourceRoute: \"\",\r\n destinationRoute: \"\", //Holds the route name.\r\n pageTransitionStatus: \"\", //holds the page transition end state from the pageTransitionState enumeration.\r\n stateChangeDuration: 0, //Duration taken within state change events.\r\n viewLoadDuration: 0, //Duration taken within view content loading events.\r\n preViewLoadingDuration: 0,\r\n pageLoadError: \"\",\r\n pageLoadDuration: 0,\r\n totalDuration: 0,\r\n preStateDuration: 0,\r\n pageDisplayName: \"\",\r\n startTime: 0,\r\n threshold: {\r\n thresholdCrossed: false,\r\n thresholdValue: 0,\r\n },\r\n };\r\n });\r\n\r\n $rootScope.$on(\r\n FxpBroadcastedEvents.OnPageLoadComplete,\r\n function (event, pageName) {\r\n self.OnPageLoadCompleteEventHandler(event, pageName);\r\n }\r\n );\r\n // Intialization of scopes and rootscopes\r\n\r\n this.$scope.fxpheaderdata = {\r\n ElementType: \"span\",\r\n DisplayText: \"\",\r\n Name: \"\",\r\n Email: \"\",\r\n Role: \"\",\r\n };\r\n\r\n // custom scroll config\r\n this.$scope.leftNavConfig = {\r\n theme: \"dark\",\r\n axis: \"y\",\r\n scrollButtons: {\r\n enable: false,\r\n },\r\n keyboard: { scrollAmount: 5 },\r\n };\r\n this.$rootScope.isFullScreen = false;\r\n // it contains ui string of view full profile text\r\n this.$scope.ViewFullProfile =\r\n this.$rootScope.fxpUIConstants.UIStrings.ViewFullProfile;\r\n this.$scope.renderHeaderForClick = this.renderHeaderForClick.bind(this);\r\n this.$scope.renderHeaderForKeydown = this.renderHeaderForKeydown.bind(this);\r\n this.$scope.renderHeaderForFocusout =\r\n this.renderHeaderForFocusout.bind(this);\r\n this.$scope.renderHeaderMenuForKeydown =\r\n this.renderHeaderMenuForKeydown.bind(this);\r\n this.$scope.renderSideBarForKeydown =\r\n this.renderSideBarForKeydown.bind(this);\r\n this.$scope.onMessageKeyDown = this.onMessageKeyDown.bind(this);\r\n this.$scope.OnNavigationClick = this.onNavigationClick.bind(this);\r\n this.$scope.OnNavigationClickWithParams =\r\n this.onNavigationClickWithParams.bind(this);\r\n this.$scope.getPageLoadPropertyBag = this.getPageLoadPropertyBag.bind(this);\r\n this.$scope.logMiniProfileTelemetryInfo =\r\n this.logMiniProfileTelemetryInfo.bind(this);\r\n this.$scope.initializeFeedback = this.initializeFeedback.bind(this);\r\n this.$scope.getApplicationNameForDisplay =\r\n this.getApplicationNameForDisplay.bind(this);\r\n this.$scope.showViewFullProfileLink =\r\n window[\"tenantConfiguration\"].ShowFullProfile;\r\n this.$scope.viewProfileUrl = window[\"tenantConfiguration\"].ViewProfileUrl;\r\n this.$scope.copyToClipboard = this.copyToClipboard.bind(this);\r\n this.$rootScope.$on(CustomEvents.OnProfileFromGraphAPI, function () {\r\n self.$scope.showViewFullProfileLink = false;\r\n });\r\n\r\n this.$rootScope.$on(\r\n \"leftNavHighlighted\",\r\n this.onLeftNavHighlighted.bind(this)\r\n );\r\n this.$rootScope.$on(\r\n CustomEvents.StartUpFlagRetrieved,\r\n this.initialFlagsResponseHandler.bind(this)\r\n );\r\n this.$rootScope.$on(\r\n CustomEvents.PageTourFlagRetrieved,\r\n this.pageTourResponseHandler.bind(this)\r\n );\r\n this.$scope.$on(\"destroy\", this.unregisterEvents);\r\n\r\n this.$scope.$on(\r\n FxpBroadcastedEvents.OnAppHeaderChanged,\r\n function (event, headerText) {\r\n self.$scope.fxpheaderdata.DisplayText = headerText;\r\n }\r\n );\r\n\r\n this.$scope.$on(\r\n FxpBroadcastedEvents.OnPageTitleChanged,\r\n function (event, pageTitle) {\r\n self.$scope.pageTitle = pageTitle;\r\n }\r\n );\r\n\r\n this.fxpStateTransitionService.onStateNotFound((item) => {\r\n console.log(\r\n \"Fired UI-Router StateNotFound event. UnfoundState: \" +\r\n item.toState._identifier.name +\r\n \" from state :\" +\r\n item.fromState._identifier.name\r\n );\r\n $rootScope.pageLoadMetrics.pageTransitionStatus =\r\n pageTransitionState.stateNotFound;\r\n var stateDuration = performance.now();\r\n var finalDuration = stateDuration - $rootScope.startTime;\r\n $rootScope.pageLoadMetrics.stateChangeDuration = finalDuration;\r\n let message = `The State (${item.toState._identifier.name}) you were navigating to was not found.`;\r\n $rootScope.pageLoadMetrics.pageLoadError = message;\r\n var propBag = self.getPageLoadPropertyBag($rootScope.pageLoadMetrics);\r\n self.fxpLogger.logError(\r\n source_telemetry,\r\n message,\r\n ErrorCodes.State_Not_Found,\r\n null,\r\n propBag,\r\n null,\r\n null,\r\n ErrorSeverityLevel.High\r\n );\r\n $rootScope.startTime = 0;\r\n });\r\n\r\n let startTime = performance.now();\r\n\r\n this.fxpStateTransitionService.onStateChangeFailure((item) => {\r\n self.logStateChange(startTime, item, \"onStateChangeFailure\");\r\n if (item.fromState.name && item.error.type == RejectType.ERROR) {\r\n $rootScope.pageLoadMetrics.pageTransitionStatus =\r\n pageTransitionState.stateChangeError;\r\n var msg;\r\n var stateDuration = performance.now();\r\n var finalDuration = stateDuration - $rootScope.startTime;\r\n $rootScope.pageLoadMetrics.stateChangeDuration = finalDuration;\r\n msg =\r\n self.$rootScope.fxpUIConstants.UIMessages.StateChangeErrorException.ErrorMessageTitle.replace(\r\n \"{0}\",\r\n item.toState.name\r\n );\r\n $rootScope.pageLoadMetrics.pageLoadError = msg;\r\n\r\n self.fxpMessage.addMessage(msg, FxpConstants.messageType.error);\r\n\r\n var propBag = self.getPageLoadPropertyBag($rootScope.pageLoadMetrics);\r\n var errorDetails = \"\";\r\n try {\r\n errorDetails = JSON.stringify(item.error);\r\n } catch (e) {\r\n errorDetails =\r\n \"From State: \" +\r\n item.fromState.name +\r\n \" To State: \" +\r\n item.toState.name +\r\n \" Description: \";\r\n if (item.error) {\r\n errorDetails = errorDetails + item.error.message;\r\n }\r\n }\r\n self.fxpLogger.logError(\r\n source_telemetry,\r\n msg,\r\n ErrorCodes.State_Change_Failure,\r\n errorDetails,\r\n propBag,\r\n null,\r\n null,\r\n ErrorSeverityLevel.High\r\n );\r\n self.fxpLogger.setPageLoadMetrics($rootScope.pageLoadMetrics);\r\n $rootScope.startTime = 0;\r\n }\r\n });\r\n\r\n this.$scope.$on(\"$viewContentLoaded\", function (event) {\r\n console.log(\"Fired UI-Router $viewContentLoaded event.\");\r\n var viewContentDuration = performance.now();\r\n $rootScope.pageLoadMetrics.pageTransitionStatus =\r\n pageTransitionState.viewContentLoaded;\r\n self.fxpBreadcrumbService.logBreadcrumbTelemetryInfo(\r\n FxpConstants.BreadcrumbEventType.BreadcrumbLoad,\r\n null\r\n );\r\n\r\n if (!CommonUtils.isNullOrEmpty($rootScope.pageLoadMetrics.sourceRoute)) {\r\n if ($rootScope.pageLoadMetrics.startTime == 0) {\r\n $rootScope.pageLoadMetrics.startTime = self.getStartTime();\r\n }\r\n\r\n var totalDuration =\r\n viewContentDuration - $rootScope.pageLoadMetrics.startTime;\r\n self.checkIfThresholdCrossed(totalDuration);\r\n }\r\n\r\n self.fxpLogger.setPageLoadMetrics($rootScope.pageLoadMetrics);\r\n $rootScope.startTime = 0;\r\n });\r\n\r\n this.fxpStateTransitionService.onStateChangeSuccess((item) => {\r\n self.logStateChange(startTime, item, \"onStateChangeSuccess\");\r\n self.stateSuccessTime = performance.now();\r\n var finalDuration =\r\n self.stateSuccessTime - $rootScope.stateChangeStartTime;\r\n // Setting app header.\r\n self.fxpUIData.setAppHeaderFromRoute(item.toState);\r\n // Setting pagetitle.\r\n self.fxpUIData.setPageTitleFromRoute(item.toState);\r\n //logging from here\r\n $rootScope.pageLoadMetrics.pageTransitionStatus =\r\n pageTransitionState.stateChangeSuccess;\r\n $rootScope.pageLoadMetrics.stateChangeDuration = finalDuration;\r\n self.fxpLogger.setPageLoadMetrics($rootScope.pageLoadMetrics);\r\n\r\n $rootScope.isFullScreenEnabled = item.toParams\r\n ? item.toParams.fullScreenEnabled\r\n : false;\r\n if (!$rootScope.isFullScreenEnabled) $rootScope.isFullScreen = false;\r\n if (CommonUtils.isNullOrEmpty(self.$rootScope.initialFlags)) {\r\n let flightHandler = function () {\r\n self.renderBreadcrumb(item.toState);\r\n flightHandlerCleanUp();\r\n };\r\n let flightHandlerCleanUp = self.$rootScope.$on(\r\n CustomEvents.StartUpFlagRetrieved,\r\n flightHandler\r\n );\r\n }\r\n self.renderBreadcrumb(item.toState);\r\n });\r\n\r\n this.fxpStateTransitionService.onStateChangeStart((item) => {\r\n self.logStateChange(startTime, item, \"onStateChangeStart\");\r\n });\r\n\r\n $rootScope.$on(\"$viewContentLoading\", function (event, viewConfig) {\r\n // What's the use of this log?\r\n console.log(\"Fired $viewContentLoading event. \");\r\n });\r\n\r\n $rootScope.$on(\r\n \"adal:failedResourceTokenAcuqisition\",\r\n function (source, error) {\r\n let errorDetails = CommonUtils.objectToString(error);\r\n if (!errorDetails) {\r\n errorDetails = \"Failed to acquire resource token: \";\r\n }\r\n console.log(errorDetails);\r\n var propbag = fxpLoggerService.createPropertyBag();\r\n propbag.addToBag(\"Type\", \"adal-angular\");\r\n propbag.addToBag(\"Location\", window.location.hash);\r\n let message = `Adal resource token acquisition failure with error ${errorDetails}`;\r\n self.fxpLogger.logError(\r\n source_telemetry,\r\n message,\r\n ErrorCodes.Msal_ResourceTokenAcuqisition_Failure,\r\n CommonUtils.objectToString(source),\r\n propbag,\r\n null,\r\n null,\r\n ErrorSeverityLevel.Medium\r\n );\r\n }\r\n );\r\n\r\n this.$scope.userThumbnailPhoto = \"/assets/pictures/User.png\";\r\n this.$scope.reportsToThumbnailPhoto = \"/assets/pictures/User.png\";\r\n this.$rootScope.getLandingPage = this.getLandingPage.bind(this);\r\n this.$rootScope.navigateToLandingPage =\r\n this.navigateToLandingPage.bind(this);\r\n\r\n if (!this.$rootScope.isAuthenticated) {\r\n //this.$rootScope.$on('adal:loginSuccess', onLoginSuccess);\r\n this.$onloginSuccessSubcription = this.$rootScope.$on(\r\n \"fxp:loginSuccess\",\r\n onLoginSuccess\r\n );\r\n } else {\r\n console.log(\r\n \"appCntrl: Already logged in. Will continue to load the application. \"\r\n );\r\n onLoginSuccess();\r\n }\r\n\r\n function onLoginSuccess() {\r\n if (self.$onloginSuccessSubcription) {\r\n self.$onloginSuccessSubcription();\r\n }\r\n\r\n let currentProcessName =\r\n TelemetryConstants.FXP_TELEMETRY_PLATFORM_BOOTSTRAP +\r\n \".AuthenticationProcess.PostLoginSucessBegin\";\r\n let eventData = new SystemEvent(\r\n currentProcessName,\r\n ComponentType.DataStore,\r\n \"Loading FxP post login\"\r\n );\r\n self.fxpLogger.logSystemEvent(source_telemetry, eventData);\r\n self.$rootScope.appBooted = true;\r\n self.fxpGlobalStoreService.DispatchGlobalAction(\r\n \"Platform\",\r\n ShowLoader({\r\n loadingText:\r\n $rootScope.fxpUIConstants.UIStrings.LoadingStrings.LoadingProfile,\r\n timeoutCallback: appControllerHelper.handleAdalErrorsLoadingProfile,\r\n })\r\n );\r\n self.appControllerHelper.postLoginSuccess();\r\n\r\n self.oboUserService.initializeOBOEntityFromContext().then(function () {\r\n // check this call with other getBasicProfile\r\n self.appControllerHelper.getBasicProfile($scope);\r\n var currentUserClaims = self.userInfoService.getCurrentUserClaims();\r\n var currentProfile = self.userInfoService.getCurrentUserProfile();\r\n if (\r\n CommonUtils.isNullOrEmpty(currentUserClaims) &&\r\n CommonUtils.isNullOrEmpty(currentProfile)\r\n ) {\r\n self.oboUserService.setCurrentUserStateFromLoggedInUserState();\r\n }\r\n });\r\n\r\n currentProcessName =\r\n TelemetryConstants.FXP_TELEMETRY_PLATFORM_BOOTSTRAP +\r\n \".AuthenticationProcess.PostLoginSucessEnd\";\r\n eventData = new SystemEvent(\r\n currentProcessName,\r\n ComponentType.DataStore,\r\n \".AuthenticationProcess.Post Login steps completed\"\r\n );\r\n\r\n self.fxpLogger.logSystemEvent(source_telemetry, eventData);\r\n }\r\n\r\n //Handle skype bot link\r\n $rootScope.$on(CustomEvents.SkypeBotInit, function (e, url, target) {\r\n fxpBotService.setUserContext().then(\r\n function (response) {\r\n if (self.enableFxpBotWindow) {\r\n $window.open(url, target);\r\n }\r\n },\r\n function (error) {\r\n self.fxpMessage.addMessage(\r\n $rootScope.fxpUIConstants.UIMessages.FxpBotSetContextFailedError\r\n .ErrorMessage,\r\n FxpConstants.messageType.error\r\n );\r\n //Handling data undefined\r\n error.data = error.data || \"\";\r\n //TODO replace error code\r\n let message = `Skype bot service failure with error ${error.data}`;\r\n self.fxpLogger.logError(\r\n source_telemetry,\r\n message,\r\n ErrorCodes.SkypeBotInit_Failure,\r\n null,\r\n null,\r\n null,\r\n null,\r\n ErrorSeverityLevel.Medium\r\n );\r\n }\r\n );\r\n });\r\n\r\n this.subscribeSharedComponentEvents();\r\n this.loadGraphToolkit();\r\n }\r\n showPageDirtyPopupToUser(event: any){\r\n var self = this;\r\n if(window._showPageDirtyPopup){\r\n if(!confirm(self.$rootScope.fxpUIConstants.UIMessages.PageDirtyMessages.UnsavedChangesMessage)){\r\n event.preventDefault();\r\n }\r\n else{\r\n window._showPageDirtyPopup = false;\r\n }\r\n }\r\n }\r\n subscribeSharedComponentEvents() {\r\n window.addEventListener(\r\n SharedComponentLoaderCustomEvents.SharedComponentLoadComplete,\r\n this.onSharedComponentLoadComplete.bind(this)\r\n );\r\n window.addEventListener(\r\n SharedComponentLoaderCustomEvents.SharedComponentLoaderUpdated,\r\n this.onSharedComponentLoaderUpdated.bind(this)\r\n );\r\n window.addEventListener(\r\n SharedComponentLoaderCustomEvents.SharedComponentCallBackInvoked,\r\n this.onSharedComponentCallBackInvoked.bind(this)\r\n );\r\n window.addEventListener(\r\n SharedComponentLoaderCustomEvents.SharedComponentOnDestroyInvoked,\r\n this.onSharedComponentOnDestroyInvoked.bind(this)\r\n );\r\n }\r\n\r\n private get SharedComponentFeatureName(): string {\r\n return `${TelemetryConstants.FXP_TELEMETRY_BASE_NAME}.SharedComponent`;\r\n }\r\n\r\n onSharedComponentLoadComplete(eventArgs: any) {\r\n this.logSharedComponentFeatureUsage(\r\n \"SharedComponentLoadComplete\",\r\n eventArgs.detail\r\n );\r\n }\r\n\r\n onSharedComponentLoaderUpdated(eventArgs: any) {\r\n this.logSharedComponentFeatureUsage(\r\n \"SharedComponentUpdated\",\r\n eventArgs.detail\r\n );\r\n }\r\n\r\n onSharedComponentCallBackInvoked(eventArgs: any) {\r\n this.logSharedComponentFeatureUsage(\r\n \"SharedComponentCallBackInvoked\",\r\n eventArgs.detail\r\n );\r\n }\r\n\r\n onSharedComponentOnDestroyInvoked(eventArgs: any) {\r\n this.logSharedComponentFeatureUsage(\r\n \"SharedComponentUnloaded\",\r\n eventArgs.detail\r\n );\r\n }\r\n\r\n logSharedComponentFeatureUsage(actionName: string, eventPayload: any) {\r\n const source_telemetry = `${this.sourceForTelemetry}.onSharedComponentLoadComplete`;\r\n const sharedComponentFeature = new FeatureUsageEvent(\r\n this.SharedComponentFeatureName,\r\n ActionType.System,\r\n actionName,\r\n EventName.PageLoad,\r\n ComponentType.Web\r\n );\r\n const props = this.fxpLogger.createPropertyBag();\r\n if (eventPayload && CommonUtils.isObject(eventPayload)) {\r\n const payload = eventPayload;\r\n Object.keys(payload).forEach((property) => {\r\n props.addToBag(property, payload[property]);\r\n });\r\n }\r\n this.fxpLogger.logFeatureUsageEvent(\r\n source_telemetry,\r\n sharedComponentFeature,\r\n props\r\n );\r\n }\r\n\r\n getUrlForDashboard() {\r\n const isIframe = sessionStorage[\"isIFrame\"];\r\n if (isIframe) {\r\n return `/Home/Dashboard/${this.$rootScope.defaultAppRole}?isIframe=${isIframe}`;\r\n }\r\n return `/Home/Dashboard/${this.$rootScope.defaultAppRole}`;\r\n }\r\n\r\n private logStateChange(\r\n startTime: number,\r\n item: any,\r\n moduleName: string\r\n ): void {\r\n const source_telemetry = `${this.sourceForTelemetry}.LogStateChange`;\r\n let timeTaken = performance.now() - startTime;\r\n let currentTime = new Date().toLocaleString();\r\n let propbag = this.fxpLogger.createPropertyBag();\r\n propbag.addToBag(`${moduleName} current time - `, `${currentTime}`);\r\n propbag.addToBag(`${moduleName} time taken - `, `${timeTaken} ms`);\r\n propbag.addToBag(`FromState-Url`, item.fromState.url);\r\n propbag.addToBag(`ToState-Url`, item.toState.url);\r\n propbag.addToBag(\"FromState\", item.fromState.name);\r\n propbag.addToBag(\"ToState\", item.toState.name);\r\n if (item.error) {\r\n propbag.addToBag(\"ErrorType\", item.error.type);\r\n }\r\n\r\n let currentProcessName =\r\n TelemetryConstants.FXP_TELEMETRY_BASE_NAME + \".StateTransition\";\r\n let eventData = new SystemEvent(\r\n currentProcessName,\r\n ComponentType.DataStore,\r\n `State changed to ${item.toState.name} from ${item.fromState.name}.`\r\n );\r\n\r\n this.fxpLogger.logSystemEvent(source_telemetry, eventData, propbag);\r\n }\r\n\r\n private OnPageLoadCompleteEventHandler(event, pageName) {\r\n const endTime = performance.now();\r\n const source_telemetry = `${this.sourceForTelemetry}.OnPageLoadCompleteEventHandler`;\r\n let startTime = 0;\r\n let isFxPBoostrapTimeIncluded = false;\r\n\r\n if (sessionStorage[\"LoadStartedTime\"]) {\r\n startTime = parseFloat(sessionStorage[\"LoadStartedTime\"]);\r\n sessionStorage.removeItem(\"LoadStartedTime\");\r\n isFxPBoostrapTimeIncluded = true;\r\n } else {\r\n startTime = parseFloat(this.$rootScope.stateChangeStartTime);\r\n if (isNaN(startTime) || startTime == 0) {\r\n return;\r\n }\r\n this.$rootScope.stateChangeStartTime = 0;\r\n let startTimeProps = this.fxpLogger.createPropertyBag();\r\n startTimeProps.addToBag(\"StateChangeStartTime\", startTime.toString());\r\n startTimeProps.addToBag(\"PageName\", pageName);\r\n startTimeProps.addToBag(\"CurrentState\", this.$state.current.name);\r\n this.fxpLogger.logEvent(\r\n source_telemetry,\r\n `${TelemetryConstants.FXP_TELEMETRY_BASE_NAME}.PageLoad.Completed`,\r\n startTimeProps\r\n );\r\n }\r\n\r\n const pageLoadDuration = parseFloat(\r\n ((endTime - startTime) / 1000).toFixed(1)\r\n );\r\n const isActingOnBehalfOf = this.userInfoService.isActingOnBehalfOf();\r\n const properties = this.fxpLogger.createPropertyBag();\r\n\r\n properties.addToBag(\"LoadDuration\", pageLoadDuration.toString());\r\n properties.addToBag(\"IsOBOMode\", isActingOnBehalfOf.toString());\r\n properties.addToBag(\"PageName\", pageName);\r\n properties.addToBag(\"Unit\", \"seconds\");\r\n properties.addToBag(\r\n \"IsFxPBoostrapTimeIncluded\",\r\n isFxPBoostrapTimeIncluded.toString()\r\n );\r\n if (sessionStorage[\"AppCacheReset\"]) {\r\n properties.addToBag(\"AppCacheReset\", \"true\");\r\n console.log(\"AppCacheReset - true\");\r\n sessionStorage.removeItem(\"AppCacheReset\");\r\n }\r\n const eventName = pageName + \"-LoadComplete\";\r\n this.fxpLogger.logMetric(\r\n source_telemetry,\r\n eventName,\r\n pageLoadDuration,\r\n properties\r\n );\r\n sessionStorage[eventName] = pageLoadDuration.toString();\r\n console.log(eventName + \" - \" + pageLoadDuration);\r\n }\r\n\r\n /**\r\n *an internal method to populate propertyBag values.\r\n */\r\n getPageLoadPropertyBag = function (pageLoadData: any) {\r\n const self = this;\r\n const propBag = self.fxpLogger.createPropertyBag();\r\n propBag.addToBag(\"sourceRoute\", pageLoadData.sourceRoute);\r\n propBag.addToBag(\"pageDisplayName\", pageLoadData.pageDisplayName);\r\n propBag.addToBag(\"destinationRoute\", pageLoadData.destinationRoute);\r\n propBag.addToBag(\"pageTransitionStatus\", pageLoadData.pageTransitionStatus);\r\n propBag.addToBag(\r\n \"stateChangeDuration\",\r\n pageLoadData.stateChangeDuration.toString()\r\n );\r\n propBag.addToBag(\"error\", pageLoadData.pageLoadError);\r\n propBag.addToBag(\r\n \"partnerPageLoadDuration\",\r\n pageLoadData.pageLoadDuration.toString()\r\n );\r\n propBag.addToBag(\"totalDuration\", pageLoadData.totalDuration.toString());\r\n propBag.addToBag(\r\n \"preStateDuration\",\r\n pageLoadData.preStateDuration.toString()\r\n );\r\n propBag.addToBag(\r\n \"thresholdCrossed\",\r\n pageLoadData.threshold.thresholdCrossed.toString()\r\n );\r\n propBag.addToBag(\r\n \"thresholdValue\",\r\n pageLoadData.threshold.thresholdValue.toString()\r\n );\r\n return propBag;\r\n };\r\n /**\r\n *an internal method to check EnableBreadcrumb status on success calls breadcrumbservice\r\n */\r\n renderBreadcrumb = function (toState) {\r\n const self = this;\r\n if (\r\n self.$rootScope.initialFlags &&\r\n self.$rootScope.initialFlags.breadcrumbEnabled\r\n ) {\r\n self.fxpBreadcrumbService.setBreadcrumbFromRoute(toState);\r\n }\r\n };\r\n /**\r\n * An event handler whenever header is clicked.\r\n * @method Fxp.Controllers.AppController.renderHeaderForClick\r\n * @param {Event} $event An event object which is passed from the view.\r\n * @example Example to use renderHeaderForClick\r\n *
      Render header
      ;\r\n *
      Render header
      ;\r\n */\r\n renderHeaderForClick = function ($event) {\r\n $(\".helpflyoutmenu ul.dropdown-menu\").animate({ scrollTop: 0 }, \"fast\");\r\n var featureFlagJson = localStorage[\"FeatureFlags\"];\r\n var featureflags = {};\r\n var isDefaultLinkEnabled = true;\r\n if (featureFlagJson) {\r\n featureflags = JSON.parse(featureFlagJson);\r\n for(let i=0; i Example to use renderHeaderForKeydown\r\n *
      Render header
      ;\r\n *
      Render header
      ;\r\n */\r\n renderHeaderForKeydown = function ($event) {\r\n var target = $($event.target);\r\n if ($event.key == \"Tab\" && $event.shiftKey) {\r\n target.parent().removeClass(\"open\");\r\n target.attr(\"aria-expanded\", \"false\");\r\n } else if ($event.key == \"Down\" && target.parent().hasClass(\"open\")) {\r\n var menuItems = target.parent().find(\"[uib-dropdown-menu] li a\");\r\n menuItems[0].focus();\r\n }\r\n };\r\n\r\n /**\r\n * An event handler whenever focus is lost from header.\r\n * @method Fxp.Controllers.AppController.renderHeaderForFocusout\r\n * @param {Event} $event An event object which is passed from the view.\r\n * @example Example to use renderHeaderForFocusout\r\n *
      Focus out header
      ;\r\n *
      Focus out header
      ;\r\n */\r\n renderHeaderForFocusout = function ($event) {\r\n var target = $($event.target);\r\n target.removeClass(\"focus-removed\");\r\n };\r\n\r\n /**\r\n * An event handler whenever a key is pressed on header menu.\r\n * @method Fxp.Controllers.AppController.renderHeaderMenuForKeydown\r\n * @param {Event} $event An event object which is passed from the view.\r\n * @example Example to use renderHeaderMenuForKeydown\r\n *
      Render header menu
      ;\r\n *
      Render header menu
      ;\r\n */\r\n renderHeaderMenuForKeydown = function ($event) {\r\n var targetMenu = $($event.target).closest(\"[uib-dropdown-menu]\"),\r\n targetMenuToggleBtnId = targetMenu.attr(\"aria-labelledby\"),\r\n targetMenuToggleBtn = $(\"#\" + targetMenuToggleBtnId),\r\n allMenuItems = targetMenu.find(\"li a\"),\r\n currentMenuItemIndex = allMenuItems.index($event.target);\r\n\r\n if ($event.keyCode == this.fxpConstants.keyCodes.escapeKey) {\r\n targetMenuToggleBtn.focus();\r\n if (targetMenuToggleBtnId.indexOf(\"Fxpdashboard_LeftNavItem\") != -1) {\r\n targetMenu.parent().removeClass(\"open\");\r\n targetMenuToggleBtn.attr(\"aria-expanded\", \"false\");\r\n }\r\n } else if (\r\n $event.keyCode == this.fxpConstants.keyCodes.tabKey &&\r\n !$event.shiftKey &&\r\n currentMenuItemIndex == allMenuItems.length - 1\r\n ) {\r\n targetMenuToggleBtn.focus();\r\n targetMenu.parent().removeClass(\"open\");\r\n targetMenuToggleBtn.attr(\"aria-expanded\", \"false\");\r\n } else if (\r\n $event.keyCode == this.fxpConstants.keyCodes.tabKey &&\r\n $event.shiftKey &&\r\n currentMenuItemIndex == 0\r\n ) {\r\n $event.preventDefault();\r\n $event.stopPropagation();\r\n targetMenuToggleBtn.focus();\r\n } else if ($event.keyCode == this.fxpConstants.keyCodes.arrowDownKey) {\r\n $event.preventDefault();\r\n $event.stopPropagation();\r\n if (currentMenuItemIndex < allMenuItems.length - 1) {\r\n allMenuItems[currentMenuItemIndex + 1].focus();\r\n } else {\r\n allMenuItems[0].focus();\r\n }\r\n } else if ($event.keyCode == this.fxpConstants.keyCodes.arrowUpKey) {\r\n $event.preventDefault();\r\n $event.stopPropagation();\r\n if (currentMenuItemIndex > 0) {\r\n allMenuItems[currentMenuItemIndex - 1].focus();\r\n } else {\r\n allMenuItems[allMenuItems.length - 1].focus();\r\n }\r\n }\r\n };\r\n\r\n /**\r\n * An event handler whenever header is clicked.\r\n * @method Fxp.Controllers.AppController.renderHeaderForKeydown\r\n * @param {Event} $event An event object which is passed from the view.\r\n * @example Example to use renderHeaderForKeydown\r\n *
      Render header
      ;\r\n *
      Render header
      ;\r\n */\r\n renderSideBarForKeydown = function ($event) {\r\n var target = $($event.target),\r\n currentIndex = $(\".left-nav-menu\").index(target.parent()),\r\n previousItem = currentIndex\r\n ? $(\".left-nav-menu\")[currentIndex - 1]\r\n : null,\r\n previousItemId = previousItem ? $(previousItem).find(\"a\")[0].id : \"\";\r\n var menuItems: any;\r\n if (\r\n ($event.key == \"Down\" || ($event.key == \"Tab\" && !$event.shiftKey)) &&\r\n target.parent().hasClass(\"open\")\r\n ) {\r\n menuItems = document.querySelectorAll(\r\n \"[aria-labelledby=\" + target[0].id + \"] li a\"\r\n );\r\n $event.preventDefault();\r\n $event.stopPropagation();\r\n menuItems[0].focus();\r\n } else if (\r\n $event.key == \"Tab\" &&\r\n $event.shiftKey &&\r\n previousItem &&\r\n $(previousItem).hasClass(\"open\")\r\n ) {\r\n menuItems = document.querySelectorAll(\r\n \"[aria-labelledby=\" + previousItemId + \"] li a\"\r\n );\r\n $event.preventDefault();\r\n $event.stopPropagation();\r\n menuItems[menuItems.length - 1].focus();\r\n }\r\n };\r\n /**\r\n * An event handler whenever a key is pressed on Message.\r\n * @method Fxp.Controllers.AppController.onMessageKeyDown\r\n * @param {Event} $event An event object which is passed from the view.\r\n * @example Example to use onMessageKeyDown\r\n *
      Fxp Message
      ;\r\n *
      Focus out
      ;\r\n */\r\n onMessageKeyDown = function ($event) {\r\n if ($event.key == \"Tab\") {\r\n var targetMessage = $($event.target).closest(\".message\"),\r\n allMessages = $(\".message\"),\r\n currentMessageIndex = allMessages.index(targetMessage),\r\n targetType = $event.target.tagName.toLowerCase(),\r\n isFirstMessageFocused = currentMessageIndex == 0 && targetType == \"div\",\r\n isLastMessageFocused =\r\n currentMessageIndex == allMessages.length - 1 &&\r\n targetType == \"button\",\r\n isForwardNavigation = !$event.shiftKey,\r\n isBackwardNavigation = $event.shiftKey;\r\n if (isForwardNavigation && isLastMessageFocused) {\r\n $event.preventDefault();\r\n $event.stopPropagation();\r\n $(allMessages[0]).find(\".message-content\").focus();\r\n } else if (isBackwardNavigation && isFirstMessageFocused) {\r\n $event.preventDefault();\r\n $event.stopPropagation();\r\n $(allMessages[allMessages.length - 1])\r\n .find(\"button\")\r\n .focus();\r\n }\r\n }\r\n };\r\n\r\n /**\r\n * A click handler when a navigation button is clicked.\r\n * @method Fxp.Controllers.AppController.onNavigationClick\r\n * @param {object} menuItem An object which is passed from the view.\r\n * @example Example to use onNavigationClick\r\n *
      Navigation Button
      ;\r\n *
      Navigation Button
      ;\r\n */\r\n onNavigationClick = function (menuItem) {\r\n this.$state.go(menuItem);\r\n };\r\n\r\n /**\r\n * A click handler when a navigation button is clicked.\r\n * @method Fxp.Controllers.AppController.onNavigationClickWithParams\r\n * @param {object} menuItem An object which is passed from the view.\r\n * @example Example to use onNavigationClickWithParams\r\n *
      Navigation Button
      ;\r\n *
      Navigation Button
      ;\r\n */\r\n\r\n onNavigationClickWithParams = function (menuItem, params) {\r\n this.$state.go(\r\n menuItem,\r\n JSON.parse(JSON.stringify(eval(\"(\" + params + \")\"))) // CodeQL[SM04509] Genuine use.\r\n );\r\n };\r\n /**\r\n * An method to get the default landing page.\r\n * @method Fxp.Controllers.AppController.getLandingPage\r\n * @example Example to use getLandingPage\r\n *
      Get Landing Page
      ;\r\n *
      getLandingPage
      ;\r\n */\r\n getLandingPage = function () {\r\n if (this.$state.get(\"DashBoard\")) {\r\n return this.$state.href(\"DashBoard\", {}, { absolute: true });\r\n } else {\r\n return this.$state.href(\r\n this.$state.get()[1].name,\r\n {},\r\n { absolute: true }\r\n );\r\n }\r\n };\r\n\r\n /**\r\n * A method to navigate to landing page.\r\n * @method Fxp.Controllers.AppController.navigateToLandingPage\r\n * @example Example to use navigateToLandingPage\r\n *
      Navigate to landing page
      ;\r\n *
      Navigate to landing page
      ;\r\n */\r\n navigateToLandingPage = function () {\r\n var landingState = this.$state.get(\"Dashboard\");\r\n if (CommonUtils.isNullOrEmpty(landingState)) {\r\n landingState = this.$rootScope.defaultStateName;\r\n }\r\n this.logHeaderClickTelemetryInfo(landingState);\r\n return this.$state.current.name === landingState\r\n ? this.$state.reload()\r\n : this.$state.go(landingState, {}, { location: \"replace\" });\r\n };\r\n\r\n getApplicationNameForDisplay() {\r\n const hasCSARoles = this.hasCSARoles();\r\n if (hasCSARoles) {\r\n return this.getAppNameForCSARoles();\r\n }\r\n return this.getAppNameForNonCSARoles();\r\n }\r\n\r\n getAppNameForCSARoles() {\r\n if (this.device.isTablet() || this.device.isMobile()) {\r\n return this.fxpConfigurationService.FxpAppSettings\r\n .GlobalCustomerExperienceApplicationNameForTablet;\r\n }\r\n return this.fxpConfigurationService.FxpAppSettings\r\n .GlobalCustomerExperienceApplicationName;\r\n }\r\n\r\n getAppNameForNonCSARoles() {\r\n if (this.device.isTablet() || this.device.isMobile()) {\r\n return this.$rootScope.fxpUIConstants.UIStrings.AppHeaderAlias;\r\n }\r\n return this.$rootScope.fxpUIConstants.UIStrings.AppHeader;\r\n }\r\n\r\n hasCSARoles(): boolean {\r\n const defaultAppRole =\r\n this.userInfoService.getCurrentUserClaims().defaultAppRole;\r\n const csaRoles =\r\n this.fxpConfigurationService.FxpAppSettings\r\n .AppRolesForGlobalCustomerExperienceApplicationName;\r\n if (\r\n CommonUtils.isNullOrEmpty(defaultAppRole) ||\r\n CommonUtils.isNullOrEmpty(csaRoles)\r\n )\r\n return false;\r\n return csaRoles === \"*\" || csaRoles.split(\",\").indexOf(defaultAppRole) >= 0;\r\n }\r\n\r\n onLeftNavHighlighted = function (event, item) {\r\n this.plannedDownTimeService.currentLeftNavItem = item;\r\n this.$rootScope.currentLeftNavItem = item;\r\n //prevent undefined issue\r\n this.$rootScope.initialFlags = this.$rootScope.initialFlags || {};\r\n\r\n if (this.$rootScope.initialFlags.flashEnabled) {\r\n this.plannedDownTimeService.updateFlash();\r\n if (this.$rootScope.isSystemAnnouncementVisible) {\r\n this.plannedDownTimeService.updateSystemAnnouncementFlash();\r\n }\r\n }\r\n };\r\n\r\n initialFlagsResponseHandler = function () {\r\n //prevent undefined issue\r\n let self = this;\r\n this.$rootScope.initialFlags = this.$rootScope.initialFlags || {};\r\n this.$rootScope.isSystemAnnouncementVisible = true;\r\n if (this.$rootScope.initialFlags.flashEnabled) {\r\n this.plannedDownTimeService.pollForPlannedDownTimesandUpdateFlash();\r\n this.plannedDownTimeService.subscribeToSignalREvent();\r\n this.plannedDownTimeService.GetSystemAnnouncementMessageandUpdateFlash();\r\n this.$rootScope.$on(\r\n FxpBroadcastedEvents.OnUserSessionTimeout,\r\n function () {\r\n console.warn(\r\n \"Cancelling the poll for getdowntime method call because of session timeout.\"\r\n );\r\n self.plannedDownTimeService.pausePlannedDownTimesPoll();\r\n self.plannedDownTimeService.unsubscribeSignalREvent();\r\n\r\n self.fxpSignalRService.unsubscribeAll();\r\n }\r\n );\r\n }\r\n this.sessionTimeoutModalFactory.init();\r\n\r\n let CceGceFlagEnabled =\r\n this.fxpGlobalStoreService.GetPlatformState().FeatureFlags[\r\n this.fxpConfigurationService.FxpAppSettings.EnableCceGceUIRing1\r\n ];\r\n if (this.hasCSARoles() && CceGceFlagEnabled)\r\n this.$scope.showViewFullProfileLink = false;\r\n };\r\n\r\n pageTourResponseHandler = function () {\r\n if (this.$rootScope.initialFlags.pageTourEnabled) {\r\n this.pageTourEventService.init();\r\n }\r\n };\r\n\r\n unregisterEvents = function () {\r\n this.handler();\r\n this.flightHandler();\r\n };\r\n\r\n logHeaderClickTelemetryInfo(state: any): void {\r\n var self = this,\r\n propBag;\r\n propBag = self.fxpLogger.createPropertyBag();\r\n propBag.addToBag(\r\n FxpConstants.metricConstants.HeaderClickNavigatedStateName,\r\n state.name\r\n );\r\n propBag.addToBag(\r\n FxpConstants.metricConstants.HeaderClickNavigatedStateTemplateURL,\r\n state.templateUrl\r\n );\r\n self.fxpLogger.logEvent(\r\n `${TelemetryConstants.FXP_TELEMETRY_BASE_NAME}.appCntrl.logHeaderClickTelemetryInfo`,\r\n `${TelemetryConstants.FXP_TELEMETRY_BASE_NAME}.HeaderClick`,\r\n propBag\r\n );\r\n }\r\n /**\r\n * An event handler to log Telemetry when mini profile icon is clicked.\r\n * @method Fxp.Controllers.AppController.logMiniProfileTelemetryInfo\r\n * @param {string} action action to decide whether it is profile icon click or manage profile click.\r\n * @param {boolean} isModalOpen flag to decide if uib dropdown is open or closed.\r\n */\r\n\r\n logMiniProfileTelemetryInfo(action: string, isModalOpen: boolean, properties?: any): void {\r\n const viewProfileFeature = `${TelemetryConstants.FXP_TELEMETRY_BASE_NAME}.ViewProfile`;\r\n let viewProfileFeatureUsageEvent: FeatureUsageEvent;\r\n\r\n let source = `${this.sourceForTelemetry}.logMiniProfileTelemetryInfo`;\r\n if (isModalOpen) {\r\n var propBag: LogPropertyBag;\r\n var self = this;\r\n propBag = self.fxpLogger.createPropertyBag();\r\n for(let prop in properties){\r\n propBag.addToBag(prop, properties[prop]);\r\n }\r\n switch (action) {\r\n case \"ProfileIconClick\":\r\n self.fxpLogger.renewCorrelationId();\r\n propBag.addToBag(\r\n FxpConstants.metricConstants.MiniProfileIconClick,\r\n \"Yes\"\r\n );\r\n viewProfileFeatureUsageEvent = new FeatureUsageEvent(\r\n viewProfileFeature,\r\n ActionType.User,\r\n \"MiniProfileIconClicked\",\r\n EventName.ButtonClick,\r\n ComponentType.Web\r\n );\r\n break;\r\n case \"ProfileLinkClick\":\r\n self.fxpLogger.renewSubCorrelationId();\r\n propBag.addToBag(\r\n FxpConstants.metricConstants.ProfileLinkClick,\r\n \"Yes\"\r\n );\r\n viewProfileFeatureUsageEvent = new FeatureUsageEvent(\r\n viewProfileFeature,\r\n ActionType.User,\r\n \"ProfileLinkClicked\",\r\n EventName.LinkClicked,\r\n ComponentType.Web\r\n );\r\n break;\r\n case \"ChatIconClick\":\r\n self.fxpLogger.renewSubCorrelationId();\r\n propBag.addToBag(FxpConstants.metricConstants.ChatIconClick, \"Yes\");\r\n viewProfileFeatureUsageEvent = new FeatureUsageEvent(\r\n viewProfileFeature,\r\n ActionType.User,\r\n \"ChatIconClicked\",\r\n EventName.ButtonClick,\r\n ComponentType.Web\r\n );\r\n break;\r\n case \"MailIconClick\":\r\n self.fxpLogger.renewSubCorrelationId();\r\n propBag.addToBag(FxpConstants.metricConstants.MailIconClick, \"Yes\");\r\n viewProfileFeatureUsageEvent = new FeatureUsageEvent(\r\n viewProfileFeature,\r\n ActionType.User,\r\n \"MailIconClicked\",\r\n EventName.ButtonClick,\r\n ComponentType.Web\r\n );\r\n }\r\n self.fxpLogger.logEvent(\r\n source,\r\n `${this.sourceForTelemetry}.MiniProfileClick`,\r\n propBag\r\n );\r\n self.fxpLogger.logFeatureUsageEvent(\r\n source,\r\n viewProfileFeatureUsageEvent,\r\n propBag\r\n );\r\n }\r\n }\r\n\r\n restore() {\r\n this.$rootScope.isFullScreen = false;\r\n }\r\n\r\n maximize() {\r\n this.$rootScope.isFullScreen = true;\r\n }\r\n\r\n toggleOCV(){\r\n return window[\"fxpOcvLoaded\"] && window[\"fxpOcvFloodGateLoaded\"];\r\n }\r\n\r\n getStartTime() {\r\n this.$rootScope.pageLoadMetrics.stateChangeStartTime =\r\n this.$rootScope.stateChangeStartTime;\r\n this.$rootScope.pageLoadMetrics.rootscopestartTime =\r\n this.$rootScope.startTime;\r\n\r\n if (\r\n this.$rootScope.startTime != undefined &&\r\n this.$rootScope.startTime != 0\r\n )\r\n return this.$rootScope.startTime;\r\n\r\n return this.$rootScope.stateChangeStartTime;\r\n }\r\n\r\n checkIfThresholdCrossed(totalDuration) {\r\n if (\r\n totalDuration >= this.pageLoadThreshold * 1000 &&\r\n !this.$rootScope.pageLoadMetrics.threshold.thresholdCrossed\r\n ) {\r\n var msg, propBag;\r\n msg =\r\n \"Threshold value of \" + this.pageLoadThreshold + \" second(s) crossed.\";\r\n this.$rootScope.pageLoadMetrics.threshold.thresholdCrossed = true;\r\n this.$rootScope.pageLoadMetrics.threshold.thresholdValue =\r\n this.pageLoadThreshold;\r\n this.$rootScope.pageLoadMetrics.pageLoadError = msg;\r\n\r\n propBag = this.$scope.getPageLoadPropertyBag(\r\n this.$rootScope.pageLoadMetrics\r\n );\r\n propBag.addToBag(\"viewContentLoadDuration\", totalDuration.toString());\r\n\r\n this.fxpLogger.logError(\r\n `${this.sourceForTelemetry}.CheckfThresholdCrossed`,\r\n msg,\r\n ErrorCodes.API_Threshold_Crossed,\r\n null,\r\n propBag,\r\n null,\r\n null,\r\n ErrorSeverityLevel.Low\r\n );\r\n }\r\n }\r\n\r\n getPartnerName(stateName: string): string {\r\n let stateDetails = this.$state.get(stateName);\r\n if (!stateDetails || !stateDetails.data) {\r\n return \"\";\r\n }\r\n if (stateDetails.data.ocvAreaName) {\r\n return stateDetails.data.ocvAreaName;\r\n }\r\n if (stateDetails.data.partnerTelemetryName)\r\n return stateDetails.data.partnerTelemetryName;\r\n\r\n return \"\";\r\n }\r\n\r\n initializeFeedback() {\r\n let self = this;\r\n const source_telemetry = `${this.sourceForTelemetry}.InitializeFeedback`;\r\n const currentUserData = self.userInfoService.getCurrentUserData();\r\n window[\"OfficeBrowserFeedback\"] =\r\n window[\"OfficeBrowserFeedback\"] || {};\r\n window[\"OfficeBrowserFeedback\"].initOptions = {\r\n appId: self.fxpConfigurationService.FxpAppSettings.OCVAppId, // Replace by your own app id\r\n stylesUrl: \"lib/OCV/styles/officebrowserfeedback_fxp.css\", // Replace by where you have hosted the .css\r\n intlUrl: \"lib/OCV/intl/\", // Replace by where you have hosted the intl files.\r\n // intlFilename is an optional property for using a custom filename for the internationalized strings, the default filename will be used if it is not specified\r\n environment: self.fxpConfigurationService.FxpAppSettings.OCVEnvironment, // 0 - Prod, 1 - Int\r\n primaryColour: \"#0078d6\", // Replace by a colour which goes with your website.\r\n secondaryColour: \"#0078D4\", // Replace by a colour which goes with your website.\r\n userEmailConsentDefault: false,\r\n userEmail: currentUserData.EmailName || currentUserData.email,\r\n build: self.fxpConfigurationService.FxpAppSettings.BuildNumber, // (optional) Another example: 99.1.1.123456789\r\n locale: \"en\",\r\n transitionEnabled: false,\r\n onError: function onError(err) {\r\n self.fxpLogger.logError(\r\n source_telemetry,\r\n \"Feedback OCV SDK encountered error: \" + err,\r\n ErrorCodes.InitializeFeedback_Failure,\r\n null,\r\n null,\r\n null,\r\n null,\r\n ErrorSeverityLevel.Low\r\n );\r\n }, // (optional) Callback which gets executed when SDK errors\r\n onDismiss: function dismissed(submitted) {\r\n self.isFeedbackDialogOpen = false;\r\n if (submitted) {\r\n self.fxpLogger.logEvent(\r\n source_telemetry,\r\n `${TelemetryConstants.FXP_TELEMETRY_BASE_NAME}.FeedbackSubmitted`\r\n );\r\n self.fxpMessage.addMessage(\r\n \"Your feedback has been submitted\",\r\n \"success\"\r\n );\r\n } else {\r\n self.fxpLogger.logError(\r\n source_telemetry,\r\n \"Error while submitting the feedback.\",\r\n ErrorCodes.Error_SubmittingFeedback,\r\n null\r\n );\r\n self.fxpMessage.addMessage(\r\n \"Error while submitting the feedback.\",\r\n \"error\"\r\n );\r\n }\r\n },\r\n onCancel: function cancel() {\r\n $(\"#feedback-open\").focus();\r\n self.isFeedbackDialogOpen = false;\r\n },\r\n };\r\n this.LaunchFeedback();\r\n }\r\n\r\n LaunchFeedback() {\r\n var launchOptions = {\r\n webGroup: {\r\n browser: navigator[\"browserDetails\"]\r\n ? navigator[\"browserDetails\"].name\r\n : \"\",\r\n browserVersion: navigator[\"browserDetails\"]\r\n ? navigator[\"browserDetails\"].version\r\n : \"\",\r\n sourcePageName: document.getElementsByTagName(\"title\")[0].innerHTML,\r\n sourcePageURI: window.location.href,\r\n },\r\n telemetryGroup: {\r\n platform: navigator[\"deviceDetails\"],\r\n featureArea: this.getPartnerName(this.$state.current.name),\r\n loggableUserId:\r\n this.fxpGlobalStoreService.GetPlatformState().CurrentUser.Claims\r\n .aadObjectId,\r\n tenantId: this.fxpConfigurationService.FxpAppSettings.TenantId,\r\n },\r\n };\r\n this.handlePromise(\r\n window[\"OfficeBrowserFeedback\"].multiFeedback(launchOptions)\r\n );\r\n }\r\n\r\n handlePromise(promise) {\r\n let self = this;\r\n const source_telemetry = `${this.sourceForTelemetry}.HandlePromise`;\r\n const feedbackFeature = new FeatureUsageEvent(\r\n `${TelemetryConstants.FXP_TELEMETRY_BASE_NAME}.OCVFeedback`,\r\n ActionType.User,\r\n \"FeedbackComponentLoad\",\r\n EventName.ButtonClick,\r\n ComponentType.Web\r\n );\r\n promise\r\n .then(function onFulfilled() {\r\n self.isFeedbackDialogOpen = true;\r\n feedbackFeature.ActionStatus = ActionStatus.Succeeded;\r\n self.fxpLogger.logFeatureUsageEvent(source_telemetry, feedbackFeature);\r\n })\r\n .catch(function onRejected(err) {\r\n self.fxpLogger.logError(\r\n source_telemetry,\r\n \"Error while loading feedback UI. Error: \" + err,\r\n ErrorCodes.Error_LoadingFeedback,\r\n null,\r\n null,\r\n null,\r\n null,\r\n ErrorSeverityLevel.Medium\r\n );\r\n self.isFeedbackDialogOpen = false;\r\n feedbackFeature.ActionStatus = ActionStatus.Failed;\r\n self.fxpLogger.logFeatureUsageEvent(source_telemetry, feedbackFeature);\r\n });\r\n }\r\n\r\n protected loadGraphToolkit() {\r\n try {\r\n SimpleProvider.name;\r\n } catch {}\r\n }\r\n\r\n copyToClipboard() {\r\n let copyText: string = \"\";\r\n for(var experience of this.$scope.profileFlyoutConfig){\r\n if(experience.isEnabled){\r\n if(experience.link.includes(\"engage360\")){ //TODO: add to application constants\r\n copyText = experience.link;\r\n \r\n }\r\n else{\r\n const esxpBaseURLindex = document.baseURI.indexOf(\"#\");\r\n copyText = document.baseURI.slice(0, esxpBaseURLindex) + experience.link;\r\n }\r\n break;\r\n }\r\n }\r\n navigator.clipboard.writeText(copyText).then(\r\n function () {\r\n document.getElementById(\"copytooltip\").innerHTML = \"Copied!\";\r\n document.getElementById(\"copyicon\").blur;\r\n },\r\n function () {\r\n document.getElementById(\"copytooltip\").innerHTML = \"Could not copy\";\r\n }\r\n );\r\n document.getElementById(\"copyicon\").onblur = () =>\r\n (document.getElementById(\"copytooltip\").innerHTML = \"Copy profile URL\");\r\n document.getElementById(\"copyicon\").onmouseup = () =>\r\n (document.getElementById(\"copytooltip\").innerHTML = \"Copy profile URL\");\r\n }\r\n}\r\n\r\nAppController.$inject = [\r\n \"$rootScope\",\r\n \"$scope\",\r\n \"$location\",\r\n \"$state\",\r\n \"FxpUIData\",\r\n \"FxpLoggerService\",\r\n \"UserProfileService\",\r\n \"AppControllerHelper\",\r\n \"DeviceFactory\",\r\n \"FxpConfigurationService\",\r\n \"FxpBreadcrumbService\",\r\n \"FxpMessageService\",\r\n \"FxpBotService\",\r\n \"$window\",\r\n \"FeatureFlagService\",\r\n \"StartUpFlightConfig\",\r\n \"PlannedDownTimeService\",\r\n \"SessionTimeoutModalFactory\",\r\n \"PageTourEventService\",\r\n \"FxpStateTransitionService\",\r\n \"OBOUserService\",\r\n \"UserInfoService\",\r\n \"FxpSignalRService\",\r\n \"FxpGlobalStoreService\",\r\n];\r\n","/**\r\n * @application Fxp\r\n */\r\n/**\r\n * @module Fxp.Controllers\r\n */\r\ndeclare type IStateService = any;\r\nimport { IActOnBehalfOfControllerScope } from \"../interfaces/IActOnBehalfOfControllerScope\";\r\nimport { ILogger } from \"../interfaces/ILogger\";\r\nimport { FxpMessageService } from \"../../app/banner/FxpMessageService\";\r\nimport { IRootScope } from \"../interfaces/IRootScope\";\r\nimport { UserProfileService } from \"../services/userProfileService\";\r\nimport { LogPropertyBag } from \"../telemetry/LogPropertyBag\";\r\nimport { TelemetryContext } from \"../telemetry/telemetrycontext\";\r\nimport { FxpConfigurationService } from \"../services/FxpConfiguration\";\r\nimport { CommonUtils } from \"../utils/CommonUtils\";\r\nimport { FxpRouteService } from \"../services/FxpRouteService\";\r\nimport { FxpContext } from \"../context/FxpContext\";\r\nimport { SettingsType } from \"../common/SettingsType\";\r\nimport { Resiliency } from \"../resiliency/FxpResiliency\";\r\nimport { NotificationStore } from \"../services/NotificationStore\";\r\nimport { PersonalizationService } from \"../services/PersonalizationService\";\r\nimport { AuthorNotificationConstant } from \"../constants/AuthorNotification.constants\";\r\nimport { FxpConstants } from \"../common/ApplicationConstants\";\r\nimport { AuthorNotificationRoleGroupHelper } from \"../factory/AuthorNotificationRoleGroupHelper\";\r\nimport { FxpBroadcastedEvents } from \"../services/FxpBroadcastedEvents\";\r\nimport { FxpGlobalStoreService } from \"../services/fxp.global.store.service\";\r\nimport {\r\n HideSpecificLoader,\r\n ShowSpecificLoader,\r\n HideLoader,\r\n} from \"../../app/loader/loader.actions\";\r\nimport { UI_LOADER_NAMES } from \"../../app/loader/UILoader.constants\";\r\nimport { TelemetryConstants } from \"../telemetry/TelemetryConst\";\r\nimport { ErrorCodes } from \"../constants/errorCodes\";\r\nimport { ErrorSeverityLevel } from \"../telemetry/ErrorSeverityLevel\";\r\nimport { FeatureUsageEvent } from \"../telemetry/FeatureUsageEvent\";\r\nimport {\r\n ActionStatus,\r\n ActionType,\r\n ComponentType,\r\n EventName,\r\n} from \"@microsoftit/telemetry-extensions-npm\";\r\n\r\nconst AuthorNotficationFeatureName = `${TelemetryConstants.FXP_TELEMETRY_BASE_NAME}.AuthorNotification`;\r\n/**\r\n * This is the controller having functionality and data for Author Notifications.\r\n * @class Fxp.Controllers.AuthorNotificationController\r\n * @classdesc A controller of FxpApp module\r\n * @example \r\n * //To Use AuthorNotificationController\r\n * angular.module('FxPApp').controller('AuthorNotificationController', ['AnyDependency', NotificationsController]);\r\n * function AuthorNotificationController(AnyDependency){ AnyDependency.doSomething(); }\r\n */\r\nexport class AuthorNotificationController {\r\n // Private variables.\r\n private typeAheadValue: string;\r\n private typeAheadErrorMessage: string;\r\n private typeAheadHasError: boolean;\r\n private selectedUsers: any;\r\n private notificationMessage: string;\r\n private selectedAudienceType: any;\r\n private previousAudienceType: any;\r\n private toState: any;\r\n private toParams: any;\r\n private fxpConstants: any;\r\n private originalRoleGroupDetails: any = [];\r\n private roleGroupDetails: any = [];\r\n private isAddButtonEnabled: boolean;\r\n private isRemoveButtonEnabled: boolean;\r\n private sourceForTelemetry = `${TelemetryConstants.FXP_TELEMETRY_BASE_NAME}.AuthorNotificationController`;\r\n private authorNotificationFeature: FeatureUsageEvent;\r\n // Constructor.\r\n constructor(\r\n $scope: any,\r\n private $rootScope: any,\r\n private $uibModal: any,\r\n private $state: IStateService,\r\n private $timeout: any,\r\n private userProfileService: UserProfileService,\r\n private fxpLoggerService: ILogger,\r\n private fxpRouteService: FxpRouteService,\r\n private notificationStore: NotificationStore,\r\n private fxpMessage: FxpMessageService,\r\n private fxpConfigurationService: FxpConfigurationService,\r\n private fxpGlobalStoreServices: FxpGlobalStoreService,\r\n private authorNotificationConstants: AuthorNotificationConstant,\r\n private personalizationService: PersonalizationService,\r\n private authorNotificationRoleGroupHelper: AuthorNotificationRoleGroupHelper,\r\n $window: angular.IWindowService\r\n ) {\r\n let pageLoadStartTime = performance.now(),\r\n self = this,\r\n pageLoadEndTime,\r\n pageLoadDuration;\r\n $scope.anCtrl = self;\r\n // Initialization.\r\n self.fxpLoggerService.renewCorrelationId();\r\n self.authorNotificationFeature = new FeatureUsageEvent(\r\n AuthorNotficationFeatureName,\r\n ActionType.User,\r\n \"SendNotification\",\r\n EventName.ButtonClick,\r\n ComponentType.Web\r\n );\r\n self.fxpLoggerService.startFeatureUsageEvent(\r\n self.authorNotificationFeature\r\n );\r\n self.resetToIntialState();\r\n // Binding function on state change start.\r\n $scope.$on(\r\n \"$stateChangeStart\",\r\n function (event, toState, toParams, fromState, fromParams) {\r\n if (self.notificationMessage || self.ifNotificationDataAvailable()) {\r\n self.toState = toState;\r\n self.toParams = toParams;\r\n self.confirmNavigation(event);\r\n }\r\n }\r\n );\r\n //exit Scenario when browser is closed or refreshed\r\n $window.onbeforeunload = function (event) {\r\n //check if notification message is there or any data is there is roles rolegroup array\r\n if (self.notificationMessage || self.ifNotificationDataAvailable()) {\r\n return \"\";\r\n }\r\n };\r\n self.fxpGlobalStoreServices.DispatchGlobalAction(\r\n \"Platform\",\r\n HideLoader({})\r\n );\r\n // Logging page load metrics.\r\n self.fxpConstants = FxpConstants;\r\n pageLoadEndTime = performance.now();\r\n pageLoadDuration = pageLoadEndTime - pageLoadStartTime;\r\n self.fxpLoggerService.logPageLoadMetrics(pageLoadDuration);\r\n\r\n if ($(\"#audience-type\")) {\r\n $(\"#audience-type\").focus();\r\n }\r\n }\r\n\r\n getIdOfElement(roleGroupItem: any, prefix: string = \"\") {\r\n const controlId = `${prefix}-${roleGroupItem.RoleGroupId}-${\r\n roleGroupItem.BusinessRoleId\r\n }${roleGroupItem.TenantKey ? \"-\" + roleGroupItem.TenantKey : \"\"}`;\r\n return controlId;\r\n }\r\n\r\n /**\r\n * A method to reset variables to default state and switch screens based on audience type\r\n * @method Fxp.Controllers.AuthorNotificationController.resetToIntialState\r\n * @example Example to use resetToIntialState\r\n * NotificationsController.resetToIntialState()\r\n */\r\n resetToIntialState() {\r\n var self = this;\r\n self.selectedUsers = [];\r\n self.authorNotificationRoleGroupHelper.resetSelectedRolesRoleGroupArray();\r\n self.notificationMessage = \"\";\r\n self.typeAheadValue = \"\";\r\n // Remove typeahead error.\r\n self.typeAheadHasError = false;\r\n self.typeAheadErrorMessage = \"\";\r\n //whenever we cancel or leave the existing audience type setting the audience type to null then\r\n if (self.selectedAudienceType == self.previousAudienceType)\r\n self.selectedAudienceType = null;\r\n self.previousAudienceType = self.selectedAudienceType;\r\n $(\"ul.dropdown-menu\").attr(\"aria-label\", \"User Search Results\");\r\n }\r\n\r\n /**\r\n *A method to use Add/Remove Selected Roles Role Group Items.\r\n * @method Fxp.Controllers.AuthorNotificationController.selectedRolesRoleGroupItems\r\n * @param {any} roleGroupItem selected roleGroupItem item\r\n * @param {any} roleItem selected roleItem item\r\n * @example Example to use selectedRolesRoleGroupItems\r\n * AuthorNotificationController.selectedRolesRoleGroupItems(roleGroupItem, roleItem)\r\n */\r\n selectedRolesRoleGroupItems(roleGroupItem, roleItem): void {\r\n let self = this;\r\n self.isAddButtonEnabled =\r\n self.authorNotificationRoleGroupHelper.isRolesRoleGroupAvailableToAdd(\r\n roleGroupItem,\r\n roleItem\r\n );\r\n }\r\n\r\n /**\r\n * Fetch all role group to send notification based on drop down selection\r\n * @method Fxp.Controllers.AuthorNotificationController.getRoleGroupDetails\r\n * @example Example to use getRoleGroupDetails\r\n * AuthorNotificationController.getRoleGroupDetails()\r\n */\r\n getRoleGroupDetails(): void {\r\n var self = this;\r\n const source_telemetry = `${this.sourceForTelemetry}.GetRoleGroupDetails`;\r\n //if data is available no need to call api\r\n if (self.roleGroupDetails.length > 0) {\r\n self.resetToIntialState();\r\n return;\r\n }\r\n self.fxpGlobalStoreServices.DispatchGlobalAction(\r\n \"Platform\",\r\n ShowSpecificLoader({\r\n name: UI_LOADER_NAMES.FXP_LOADERS.AUTHOR_NOTIFICATION_LOADER,\r\n loadingText: \"Loading...\",\r\n })\r\n );\r\n var getRoleGroupDetailsAPIStartTime = performance.now();\r\n self.personalizationService.getRoleGroupDetailsForNotification().then(\r\n function (response) {\r\n if (!CommonUtils.isNullOrEmpty(response.data)) {\r\n //make a copy of original item to reset\r\n self.originalRoleGroupDetails = angular.copy(response.data);\r\n self.roleGroupDetails = response.data;\r\n self.resetToIntialState();\r\n self.fxpGlobalStoreServices.DispatchGlobalAction(\r\n \"Platform\",\r\n HideSpecificLoader({\r\n name: UI_LOADER_NAMES.FXP_LOADERS.AUTHOR_NOTIFICATION_LOADER,\r\n })\r\n );\r\n var propbag = self.fxpLoggerService.createPropertyBag();\r\n propbag.addToBag(\r\n \"GetRoleGroupDetailsTime\",\r\n (performance.now() - getRoleGroupDetailsAPIStartTime).toString()\r\n );\r\n self.fxpLoggerService.logEvent(\r\n source_telemetry,\r\n \"OnSuccessGetRoleGroupDetails\",\r\n propbag\r\n );\r\n }\r\n },\r\n function (error) {\r\n self.fxpGlobalStoreServices.DispatchGlobalAction(\r\n \"Platform\",\r\n HideSpecificLoader({\r\n name: UI_LOADER_NAMES.FXP_LOADERS.AUTHOR_NOTIFICATION_LOADER,\r\n })\r\n );\r\n self.fxpMessage.addMessage(\r\n self.$rootScope.fxpUIConstants.UIMessages.GeneralExceptionError\r\n .ErrorMessage,\r\n FxpConstants.messageType.error\r\n );\r\n //logging in AI\r\n var propbag = self.fxpLoggerService.createPropertyBag();\r\n propbag.addToBag(\r\n self.fxpConstants.metricConstants.Status,\r\n error.status\r\n );\r\n propbag.addToBag(\r\n self.fxpConstants.metricConstants.StatusText,\r\n error.statusText\r\n );\r\n propbag.addToBag(\r\n self.fxpConstants.metricConstants.ErrorUrl,\r\n error.config ? error.config.url : \"\"\r\n );\r\n propbag.addToBag(\r\n TelemetryConstants.METHODNAME,\r\n \"GetRoleGroupDetails()\"\r\n );\r\n self.fxpLoggerService.logError(\r\n source_telemetry,\r\n self.$rootScope.fxpUIConstants.UIMessages\r\n .RoleGroupsPersonalisationExceptionError.ErrorMessageTitle,\r\n ErrorCodes.GetRoleGroupDetails_Failure,\r\n null,\r\n propbag,\r\n null,\r\n null,\r\n ErrorSeverityLevel.Medium\r\n );\r\n }\r\n );\r\n }\r\n\r\n /**\r\n *A method to use Add selected roles, role groups to recepients list\r\n * @method Fxp.Controllers.AuthorNotificationController.addRolesRoleGroupNotification\r\n * @example Example to use addRolesRoleGroupNotification\r\n * AuthorNotificationController.addRolesRoleGroupNotification()\r\n */\r\n addRolesRoleGroupNotification(): void {\r\n var self = this;\r\n //common function to add/Remove roles/RoleGroup\r\n var addBtnClickStartTime = performance.now();\r\n self.roleGroupDetails =\r\n self.authorNotificationRoleGroupHelper.addRemoveRolesRoleGroup(\r\n self.roleGroupDetails,\r\n \"Add\"\r\n );\r\n console.log(\r\n \"AuthorNotificationRoleGroupAddBtnClickTime\",\r\n performance.now() - addBtnClickStartTime\r\n );\r\n //reset add button array and flag\r\n self.isAddButtonEnabled = false;\r\n self.authorNotificationRoleGroupHelper.selectedRolesforAddButton = [];\r\n self.changeTabIndexOfUserList(\"#role-group-master-navigation-list\");\r\n }\r\n /**\r\n *A method to use Add selected roles role groups to receipts list\r\n * @method Fxp.Controllers.AuthorNotificationController.removeRolesRoleGroupNotification\r\n * @example Example to use removeRolesRoleGroupNotification\r\n * AuthorNotificationController.removeRolesRoleGroupNotification()\r\n */\r\n removeRolesRoleGroupNotification(): void {\r\n var self = this;\r\n //common function to add/Remove roles/RoleGroup\r\n var removeBtnClickStartTime = performance.now();\r\n self.roleGroupDetails =\r\n self.authorNotificationRoleGroupHelper.addRemoveRolesRoleGroup(\r\n self.roleGroupDetails,\r\n \"Remove\"\r\n );\r\n console.log(\r\n \"AuthorNotificationRoleGroupRemoveBtnClickTime\",\r\n performance.now() - removeBtnClickStartTime\r\n );\r\n //reset remove button array and flag\r\n self.isRemoveButtonEnabled = false;\r\n self.authorNotificationRoleGroupHelper.selectedRolesforRemoveButton = [];\r\n self.changeTabIndexOfUserList(\"#default-navigation-container\");\r\n }\r\n\r\n /**\r\n *A method to use Select/Unselect from Recepients List\r\n * @method Fxp.Controllers.AuthorNotificationController.selectedRoleGroupRecepientsItems\r\n * @param {any} roleGroupItem contains role group item\r\n * @param {boolean} roleItem contains role item\r\n * @example Example to use selectedRoleGroupRecepientsItems\r\n * AuthorNotificationController. selectedRoleGroupRecepientsItems(roleGroupItem, roleItem)\r\n */\r\n selectedRoleGroupRecepientsItems(roleGroupItem, roleItem): void {\r\n var self = this;\r\n self.isRemoveButtonEnabled =\r\n self.authorNotificationRoleGroupHelper.isRolesRoleGroupAvailableToRemove(\r\n roleGroupItem,\r\n roleItem\r\n );\r\n }\r\n\r\n /**\r\n *A method is used to set the tabindex of first elements of recepients list to 0\r\n * @method Fxp.Controllers.AuthorNotificationController.changeTabIndexOfUserList\r\n * @param {string} containerId contains id of an element\r\n * AuthorNotificationController.changeTabIndexOfUserList()\r\n */\r\n changeTabIndexOfUserList(containerId): void {\r\n var allMenuElements = $(containerId).find(\".fxpTabbableElem\");\r\n if (allMenuElements.length > 0) {\r\n $(allMenuElements[0]).attr(\"tabindex\", 0);\r\n }\r\n }\r\n /**\r\n *A method to use Enable/Disable the Parent Link in roles Role group list based on items in recepients list\r\n * @method Fxp.Controllers.AuthorNotificationController.isRolesInReciepientList\r\n * @param {any} roleGroupItem object whichj we are going to dispaly in UI\r\n * @example Example to use isRolesInReciepientList\r\n * AuthorNotificationController.isRolesInReciepientList(roleGroupItem)\r\n */\r\n isRolesInReciepientList(roleGroupItem): boolean {\r\n //check if all child item of parent is added to recepients list\r\n var self = this;\r\n return self.authorNotificationRoleGroupHelper.isRolesInReciepientList(\r\n roleGroupItem\r\n );\r\n }\r\n /**\r\n *A method to use reset focus of selected item\r\n * @method Fxp.Controllers.AuthorNotificationController.pullFocusToElement\r\n * @param {string} element which element to focus\r\n * @param {any} notifyItem object which we are going to dispaly in UI\r\n * @param {string} itemType is master or role/Rolegroup\r\n * @example Example to use pullFocusToElement\r\n * AuthorNotificationController.pullFocusToElement(element,notifyItem)\r\n */\r\n pullFocusToElement(element, roleGroupItem, itemType): void {\r\n if (\r\n itemType.toLowerCase() === \"recipients\" &&\r\n roleGroupItem.isFocusedElement\r\n ) {\r\n CommonUtils.pullFocusToElement(element);\r\n roleGroupItem.isFocusedElement = false;\r\n } else if (\r\n itemType.toLowerCase() === \"rolegrouplist\" &&\r\n roleGroupItem.isFocused\r\n ) {\r\n roleGroupItem.isFocused = false;\r\n }\r\n }\r\n\r\n /**\r\n * A method to search users.\r\n * @method Fxp.Controllers.AuthorNotificationController.searchUser\r\n * @param {string} value is a name/id to be serched for.\r\n * @example Example to use searchUser\r\n * AuthorNotificationController.searchUser(\"abc\")\r\n */\r\n searchUser(value: string) {\r\n const source = `${this.sourceForTelemetry}.searchUser`;\r\n let startTime = performance.now(),\r\n self = this,\r\n propbag = self.fxpLoggerService.createPropertyBag();\r\n // Calling service to search for users.\r\n return self.userProfileService.searchProfile(value).then(\r\n (data) => {\r\n var usersList = [];\r\n // Checking if service has returned data.\r\n if (data.data && data.data.length > 0) {\r\n // Remove error.\r\n self.typeAheadHasError = false;\r\n self.typeAheadErrorMessage = \"\";\r\n // Assign data.\r\n usersList = data.data;\r\n } else {\r\n // Show error if no data is returned.\r\n self.typeAheadHasError = true;\r\n self.typeAheadErrorMessage =\r\n self.$rootScope.fxpUIConstants.UIMessages.AuthorNotificationProfileMissing.ErrorMessage;\r\n }\r\n // Logging info.\r\n propbag.addToBag(\r\n \"Total Time\",\r\n (performance.now() - startTime).toString()\r\n );\r\n self.fxpLoggerService.logEvent(\r\n source,\r\n `${TelemetryConstants.FXP_TELEMETRY_BASE_NAME}.SearchUser`,\r\n propbag\r\n );\r\n return usersList;\r\n },\r\n (err) => {\r\n self.typeAheadHasError = true;\r\n // Check if user profile didn't exist.\r\n if (err.data.ErrorCode == 112) {\r\n // Show error.\r\n self.typeAheadErrorMessage =\r\n self.$rootScope.fxpUIConstants.UIMessages.AuthorNotificationProfileMissing.ErrorMessage;\r\n // Logging info.\r\n propbag.addToBag(\r\n \"Total Time\",\r\n (performance.now() - startTime).toString()\r\n );\r\n propbag.addToBag(\"API_ErrorCode\", \"112\");\r\n propbag.addToBag(\"Message\", self.typeAheadErrorMessage);\r\n self.fxpLoggerService.logEvent(\r\n source,\r\n \"SearchUser.ProfileNotFound\",\r\n propbag\r\n );\r\n }\r\n // else {\r\n // Show error.\r\n // self.typeAheadErrorMessage = self.$rootScope.fxpUIConstants.UIMessages.AuthorNotificationProfileServiceError.ErrorMessage;\r\n // // Log error.\r\n // self.fxpLoggerService.logError(\"Fxp.Controllers.AuthorNotificationController\", self.$rootScope.fxpUIConstants.UIMessages.AuthorNotificationProfileServiceError.ErrorMessageTitle, \"3450\", null);\r\n // }\r\n }\r\n );\r\n }\r\n\r\n /**\r\n * A method to add users to list.\r\n * @method Fxp.Controllers.AuthorNotificationController.addUser\r\n * @param {any} user is a object containeing user info.\r\n * @example Example to use addUser\r\n * AuthorNotificationController.addUser({})\r\n */\r\n addUser(user: any) {\r\n let self = this,\r\n // Check if user is already added.\r\n userExist = self.selectedUsers.some(function (item) {\r\n return item.EmailName.toLowerCase() == user.EmailName.toLowerCase();\r\n });\r\n // If user is not added, add user.\r\n if (!userExist) {\r\n self.selectedUsers.push(user);\r\n }\r\n // Make type ahead empty.\r\n self.typeAheadValue = \"\";\r\n }\r\n\r\n /**\r\n * A method to add users to list.\r\n * @method Fxp.Controllers.AuthorNotificationController.removeUser\r\n * @param {number} index of user to be removed.\r\n * @example Example to use removeUser\r\n * AuthorNotificationController.removeUser({})\r\n */\r\n removeUser(index: number) {\r\n let self = this;\r\n // Remove user.\r\n self.selectedUsers.splice(index, 1);\r\n }\r\n\r\n /**\r\n * A method confirm whether to navigate from page or not.\r\n * @method Fxp.Controllers.AuthorNotificationController.confirmNavigation\r\n * @param {any} event is event data.\r\n * @example Example to use confirmNavigation\r\n * AuthorNotificationController.confirmNavigation(\"abc\")\r\n */\r\n confirmNavigation(event) {\r\n let self = this,\r\n options = AuthorNotificationConstant.ConfirmationOptions;\r\n // Check for changes.\r\n if (self.notificationMessage || self.ifNotificationDataAvailable()) {\r\n // Check if event is there then stop it.\r\n if (event) event.preventDefault();\r\n // Show popup.\r\n let modalInstance = self.$uibModal.open(options);\r\n setTimeout(() => {\r\n let elementToFocus = document.getElementById(\r\n \"authorNotificationConfirmationCancel\"\r\n );\r\n if (elementToFocus) {\r\n elementToFocus.focus();\r\n }\r\n }, 0);\r\n\r\n // Bind methods to popup.\r\n modalInstance.result.then(\r\n () => {\r\n self.stayInAuthorNotification();\r\n },\r\n () => {\r\n self.leaveAuthorNotification();\r\n }\r\n );\r\n } else {\r\n //sceen is switched based on audience type i.e either users or roleGroup\r\n if (self.selectedAudienceType && self.selectedAudienceType.Type == \"Role\")\r\n self.getRoleGroupDetails();\r\n // Reset to default.\r\n else self.resetToIntialState();\r\n }\r\n }\r\n\r\n /**\r\n * A method to leave/reset page.\r\n * @method Fxp.Controllers.AuthorNotificationController.leaveAuthorNotification\r\n * @example Example to use leaveAuthorNotification\r\n * AuthorNotificationController.leaveAuthorNotification()\r\n */\r\n leaveAuthorNotification() {\r\n let self = this;\r\n // Reset.\r\n self.resetToIntialState();\r\n self.roleGroupDetails = angular.copy(self.originalRoleGroupDetails);\r\n // Check if navigation is needed.\r\n if (self.toState && self.toParams) {\r\n // Navigate.\r\n self.fxpRouteService.navigatetoSpecificState(\r\n self.toState.name,\r\n self.toParams\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * A method to stay in page.\r\n * @method Fxp.Controllers.AuthorNotificationController.stayInAuthorNotification\r\n * @example Example to use stayInAuthorNotification\r\n * AuthorNotificationController.stayInAuthorNotification()\r\n */\r\n stayInAuthorNotification() {\r\n let self = this;\r\n // Reset state variables.\r\n self.toState = null;\r\n self.toParams = null;\r\n // Reset Audience type.\r\n self.selectedAudienceType = self.previousAudienceType;\r\n self.$rootScope.$broadcast(\r\n FxpBroadcastedEvents.OnLeftNavHighlightByStateName,\r\n self.$state.current.name\r\n );\r\n }\r\n\r\n /**\r\n * A method to publish notification.\r\n * @method Fxp.Controllers.AuthorNotificationController.publishNotification\r\n * @example Example to use publishNotification\r\n * AuthorNotificationController.publishNotification()\r\n */\r\n publishNotification() {\r\n this.fxpGlobalStoreServices.DispatchGlobalAction(\r\n \"Platform\",\r\n ShowSpecificLoader({\r\n name: UI_LOADER_NAMES.FXP_LOADERS\r\n .AUTHOR_NOTIFICATION_PUBLISH_NOTIFICATION_LOADER,\r\n loadingText: \"Publishing Notification...\",\r\n })\r\n );\r\n let self = this;\r\n switch (self.selectedAudienceType.Type) {\r\n case \"User\":\r\n self.publishNotificationUsers();\r\n break;\r\n case \"Role\":\r\n self.publishNotificationRolesRoleGroup();\r\n break;\r\n }\r\n }\r\n /**\r\n * A method to publish notification for Users.\r\n * @method Fxp.Controllers.AuthorNotificationController.publishNotificationUsers\r\n * @example Example to use publishNotification\r\n * AuthorNotificationController.publishNotificationUsers()\r\n */\r\n publishNotificationUsers(): void {\r\n const source_telemetry = `${this.sourceForTelemetry}.PublishNotificationUsers`;\r\n let self = this,\r\n startTime = performance.now(),\r\n propbag = self.fxpLoggerService.createPropertyBag();\r\n // Comma (,) seperated to list.\r\n var loggedinuser = self.userProfileService.currentUserAlias;\r\n let to = self.selectedUsers.map(function (item) {\r\n return CommonUtils.generateUPN(\r\n item,\r\n self.fxpConfigurationService.FxpAppSettings\r\n );\r\n }),\r\n // Notification Object.\r\n notificationArray = {\r\n EventName: \"TEvent\",\r\n EventType: \"notification\",\r\n EventSubject: \"TestSubject-1\",\r\n Properties: {\r\n \"x-loggedinuser-alias\": loggedinuser,\r\n },\r\n Payload: \"test payload\",\r\n Publisher: {\r\n Id: \"TPUBLISHER\",\r\n Name: \"Test Publisher\",\r\n },\r\n Notification: {\r\n WebNotification: {\r\n Enabled: true,\r\n Channel: \"ESXP\",\r\n Notifications: [\r\n {\r\n SenderAddress:\r\n self.fxpConfigurationService.FxpAppSettings.FxPAdminName,\r\n Subject: self.notificationMessage,\r\n Content: self.notificationMessage,\r\n ReceiverAddresses: to,\r\n },\r\n ],\r\n },\r\n },\r\n\r\n // \"Status\": \"UnRead\",\r\n // \"IsGroup\": false,\r\n // \"Type\": \"PullOnly\",\r\n // \"From\": self.fxpConfigurationService.FxpAppSettings.FxPAdminName,\r\n // \"To\": to,\r\n // \"Subject\": self.notificationMessage,\r\n // \"Content\": self.notificationMessage\r\n };\r\n self.authorNotificationFeature.ActionName = \"PublishNotificationToUser\";\r\n // Calling service to publish notification.\r\n self.notificationStore.publishNotifications(notificationArray).then(\r\n (result) => {\r\n let message = angular.copy(self.notificationMessage);\r\n self.fxpGlobalStoreServices.DispatchGlobalAction(\r\n \"Platform\",\r\n HideSpecificLoader({\r\n name: UI_LOADER_NAMES.FXP_LOADERS\r\n .AUTHOR_NOTIFICATION_PUBLISH_NOTIFICATION_LOADER,\r\n })\r\n );\r\n // Reset to initial state.\r\n self.resetToIntialState();\r\n // Show success message\r\n self.$timeout(function () {\r\n self.fxpMessage.addMessage(\r\n self.$rootScope.fxpUIConstants.UIStrings.AuthorNotificationStrings\r\n .SuccessMessage,\r\n FxpConstants.messageType.success\r\n );\r\n });\r\n // Logging Notification and event info.\r\n propbag.addToBag(\"EventId\", result.data[0].EventId);\r\n propbag.addToBag(\"NotificationMessage\", message);\r\n propbag.addToBag(\"To\", to);\r\n propbag.addToBag(\r\n \"From\",\r\n self.fxpConfigurationService.FxpAppSettings.FxPAdminName\r\n );\r\n propbag.addToBag(\"PublishedUtcDate\", result.data[0].PublishedUtcDate);\r\n propbag.addToBag(\r\n \"PublishNotificationUsersApiTime\",\r\n (performance.now() - startTime).toString()\r\n );\r\n self.fxpLoggerService.logEvent(\r\n source_telemetry,\r\n \"PublishNotification\",\r\n propbag\r\n );\r\n self.authorNotificationFeature.ActionStatus = ActionStatus.Succeeded;\r\n self.fxpLoggerService.endFeatureUsageEvent(\r\n source_telemetry,\r\n self.authorNotificationFeature,\r\n propbag\r\n );\r\n },\r\n (error) => {\r\n self.fxpGlobalStoreServices.DispatchGlobalAction(\r\n \"Platform\",\r\n HideSpecificLoader({\r\n name: UI_LOADER_NAMES.FXP_LOADERS\r\n .AUTHOR_NOTIFICATION_PUBLISH_NOTIFICATION_LOADER,\r\n })\r\n );\r\n // Show error.\r\n self.fxpMessage.addMessage(\r\n self.$rootScope.fxpUIConstants.UIMessages\r\n .AuthorNotificationPublishServiceError.ErrorMessage,\r\n FxpConstants.messageType.error\r\n );\r\n // Log error.\r\n self.fxpLoggerService.logError(\r\n source_telemetry,\r\n self.$rootScope.fxpUIConstants.UIMessages\r\n .AuthorNotificationPublishServiceError.ErrorMessageTitle,\r\n ErrorCodes.PublishNotifications_Failure,\r\n null,\r\n null,\r\n null,\r\n null,\r\n ErrorSeverityLevel.Medium\r\n );\r\n self.authorNotificationFeature.ActionStatus = ActionStatus.Failed;\r\n self.fxpLoggerService.endFeatureUsageEvent(\r\n source_telemetry,\r\n self.authorNotificationFeature,\r\n propbag\r\n );\r\n }\r\n );\r\n }\r\n\r\n /**\r\n * A method to publish notification for Roles and Role Groups.\r\n * @method Fxp.Controllers.AuthorNotificationController.publishNotificationRolesRoleGroup\r\n * @example Example to use publishNotification\r\n * AuthorNotificationController.publishNotificationRolesRoleGroup()\r\n */\r\n publishNotificationRolesRoleGroup(): void {\r\n const source_telemetry = `${this.sourceForTelemetry}.PublishNotificationRolesRoleGroup`;\r\n var self = this,\r\n startTime = performance.now(),\r\n propbag = self.fxpLoggerService.createPropertyBag();\r\n\r\n self.authorNotificationFeature.ActionName =\r\n \"PublishNotificationToRoleGroup\";\r\n if (self.ifSelectedRolesRoleGroup()) {\r\n //notificationArray which consist id of Roles and RoleGroups and message\r\n var notificationArray = {\r\n RoleGroupIdList: [],\r\n RoleIdList: [],\r\n Message: \"\",\r\n };\r\n //extract only role group IDs\r\n notificationArray.RoleGroupIdList =\r\n self.authorNotificationRoleGroupHelper.selectedRoleGroups.map(function (\r\n item\r\n ) {\r\n return item.RoleGroupId;\r\n });\r\n //extract only role IDs\r\n notificationArray.RoleIdList =\r\n self.authorNotificationRoleGroupHelper.selectedRoles.map(function (\r\n item\r\n ) {\r\n return item.BusinessRoleId;\r\n });\r\n notificationArray.Message = self.notificationMessage;\r\n console.log(\"PublishNotificationRolesRoleGroupObj\", notificationArray);\r\n self.notificationStore\r\n .publishNotificationsRolesRoleGroup(notificationArray)\r\n .then(\r\n (result) => {\r\n self.fxpGlobalStoreServices.DispatchGlobalAction(\r\n \"Platform\",\r\n HideSpecificLoader({\r\n name: UI_LOADER_NAMES.FXP_LOADERS\r\n .AUTHOR_NOTIFICATION_PUBLISH_NOTIFICATION_LOADER,\r\n })\r\n );\r\n self.resetToIntialState();\r\n //reset collection\r\n self.roleGroupDetails = angular.copy(self.originalRoleGroupDetails);\r\n //using timeout to send focus back to drop down after success message is displayed\r\n self.$timeout(function () {\r\n self.fxpMessage.addMessage(\r\n self.$rootScope.fxpUIConstants.UIStrings\r\n .AuthorNotificationStrings.SuccessMessage,\r\n FxpConstants.messageType.success\r\n );\r\n });\r\n //logging time and usage of publish button\r\n console.log(\r\n \"PublishNotificationRolesRoleGroupTime\",\r\n (performance.now() - startTime).toString()\r\n );\r\n propbag.addToBag(\r\n \"PublishNotificationRolesRoleGroupTime\",\r\n (performance.now() - startTime).toString()\r\n );\r\n propbag.addToBag(\"NotificationMessage\", self.notificationMessage);\r\n propbag.addToBag(\r\n \"RoleGroupIds\",\r\n notificationArray.RoleGroupIdList.join(\",\")\r\n );\r\n propbag.addToBag(\"RoleIds\", notificationArray.RoleIdList.join(\",\"));\r\n self.fxpLoggerService.logEvent(\r\n source_telemetry,\r\n \"PublishNotificationRolesRoleGroup\",\r\n propbag\r\n );\r\n self.authorNotificationFeature.ActionStatus =\r\n ActionStatus.Succeeded;\r\n self.fxpLoggerService.endFeatureUsageEvent(\r\n source_telemetry,\r\n self.authorNotificationFeature,\r\n propbag\r\n );\r\n },\r\n (error) => {\r\n // Log error.\r\n self.fxpGlobalStoreServices.DispatchGlobalAction(\r\n \"Platform\",\r\n HideSpecificLoader({\r\n name: UI_LOADER_NAMES.FXP_LOADERS\r\n .AUTHOR_NOTIFICATION_PUBLISH_NOTIFICATION_LOADER,\r\n })\r\n );\r\n self.resetToIntialState();\r\n //reset collection\r\n self.roleGroupDetails = angular.copy(self.originalRoleGroupDetails);\r\n propbag.addToBag(\r\n self.fxpConstants.metricConstants.Status,\r\n error.status ? error.status : \"\"\r\n );\r\n propbag.addToBag(\r\n self.fxpConstants.metricConstants.StatusText,\r\n error.statusText ? error.statusText : \"\"\r\n );\r\n propbag.addToBag(\r\n self.fxpConstants.metricConstants.ErrorUrl,\r\n error.config ? (error.config.url ? error.config.url : \"\") : \"\"\r\n );\r\n if (error.status && error.status == 500)\r\n propbag.addToBag(\r\n self.fxpConstants.metricConstants.ErrorText,\r\n error.data ? error.data : \"\"\r\n );\r\n var uiErrorMessage =\r\n error.status == 403\r\n ? self.$rootScope.fxpUIConstants.UIMessages\r\n .AuthorNotificationPublishUnauthorizedError.ErrorMessage\r\n : self.$rootScope.fxpUIConstants.UIMessages\r\n .AuthorNotificationPublishRoleGroupServiceError\r\n .ErrorMessage;\r\n self.fxpMessage.addMessage(\r\n uiErrorMessage,\r\n FxpConstants.messageType.error\r\n );\r\n self.fxpLoggerService.logError(\r\n source_telemetry,\r\n self.$rootScope.fxpUIConstants.UIMessages\r\n .AuthorNotificationPublishRoleGroupServiceError\r\n .ErrorMessageTitle,\r\n ErrorCodes.PublishNotificationsRolesRoleGroup_Failure,\r\n error.stack ? error.stack : null,\r\n propbag,\r\n null,\r\n null,\r\n ErrorSeverityLevel.Medium\r\n );\r\n self.authorNotificationFeature.ActionStatus = ActionStatus.Failed;\r\n self.fxpLoggerService.endFeatureUsageEvent(\r\n source_telemetry,\r\n self.authorNotificationFeature,\r\n propbag\r\n );\r\n }\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * A method to see if the roles and roleGroup arrays are empty or not.\r\n * @method Fxp.Controllers.AuthorNotificationController.ifSelectedRolesRoleGroup\r\n * AuthorNotificationController.ifSelectedRolesRoleGroup()\r\n */\r\n ifSelectedRolesRoleGroup(): boolean {\r\n var self = this;\r\n if (\r\n !CommonUtils.isNullOrEmpty(\r\n self.authorNotificationRoleGroupHelper.selectedRoleGroups\r\n ) ||\r\n !CommonUtils.isNullOrEmpty(\r\n self.authorNotificationRoleGroupHelper.selectedRoles\r\n )\r\n )\r\n return true;\r\n else return false;\r\n }\r\n\r\n /**\r\n * A method to see if the notification message,userslist, roles and roleGroup arrays are empty or not.\r\n * @method Fxp.Controllers.AuthorNotificationController.ifNotificationDataAvailable\r\n * AuthorNotificationController.ifNotificationDataAvailable()\r\n */\r\n ifNotificationDataAvailable(): boolean {\r\n var self = this;\r\n if (self.selectedUsers.length || self.ifSelectedRolesRoleGroup())\r\n return true;\r\n else return false;\r\n }\r\n}\r\n\r\n/**\r\n * This is the controller having functionality and data for Author Notifications Confirmation popup.\r\n * @class Fxp.Controllers.AuthorNotificationConfirmationController\r\n * @classdesc A controller of FxpApp module\r\n * @example \r\n * //To Use AuthorNotificationConfirmationController\r\n * angular.module('FxPApp').controller('AuthorNotificationConfirmationController', ['AnyDependency', AuthorNotificationConfirmationController]);\r\n * function AuthorNotificationConfirmationController(AnyDependency){ AnyDependency.doSomething(); }\r\n */\r\nexport class AuthorNotificationConfirmationController {\r\n constructor(private $uibModalInstance: any) {}\r\n leave() {\r\n this.$uibModalInstance.dismiss();\r\n }\r\n stay() {\r\n this.$uibModalInstance.close();\r\n }\r\n keyPressOnAddMessage(event: KeyboardEvent) {\r\n if (event.keyCode === 27) {\r\n this.stay();\r\n event.stopPropagation();\r\n }\r\n }\r\n}\r\n","/**\r\n * @application Fxp\r\n */\r\n/**\r\n * @namespace Fxp.Controllers\r\n */\r\nimport { IRootScope } from \"../interfaces/IRootScope\";\r\nimport { ILogger } from \"../interfaces/ILogger\";\r\nimport { FxpMessageService } from \"../../app/banner/FxpMessageService\";\r\nimport { SettingsType } from \"../common/SettingsType\";\r\nimport { ApplicationConstants, FxpConstants } from \"../common/ApplicationConstants\";\r\nimport { ISettingsService } from \"../interfaces/ISettingsService\";\r\nimport { TelemetryConstants } from \"../telemetry/TelemetryConst\";\r\nimport { ErrorCodes } from \"../constants/errorCodes\";\r\nimport { ErrorSeverityLevel } from \"../telemetry/ErrorSeverityLevel\";\r\n\r\n/**\r\n * A main controller for FxpApp module. This is the controller having basic scopes and events.\r\n * @class Fxp.Controllers.CreateAskOpsController\r\n * @classdesc A main controller to handle Create Ask Ops Modal functionality.\r\n * @example \r\n * //To Use CreateAskOpsController\r\n * angular.module('FxPApp').controller('CreateAskOpsController', ['AnyDependency', CreateAskOpsController]);\r\n * function CreateAskOpsController(AnyDependency){ AnyDependency.doSomething(); }\r\n */\r\nexport class CreateAskOpsController {\r\n\tprivate currentRequestType: any;\r\n\tprivate requestTypeData: any;\r\n\tprivate modalStrings:any;\r\n\tprivate readonly sourceForTelemetry = `${TelemetryConstants.FXP_TELEMETRY_BASE_NAME}.CreateAskOpsController`;\r\n\tconstructor(\r\n\t\tprivate $rootScope: IRootScope,\r\n\t\tprivate $window: angular.IWindowService,\r\n\t\tprivate $uibModalInstance: any,\r\n\t\tprivate fxpLoggerService: ILogger,\r\n\t\tprivate settingsService: ISettingsService,\r\n\t\tprivate fxpMessage: FxpMessageService,\r\n\t\tprivate defaultRequestType: any\r\n\t) {\r\n\t\tvar self = this;\r\n\t\tself.currentRequestType = \"\";\r\n\t\tthis.modalStrings = this.$rootScope.fxpUIConstants.UIStrings.CreateAskOpsModalStrings;\r\n\t\t// Get Request Types data.\r\n\t\tself.getRequestTypeData();\r\n\t}\r\n\r\n\t/**\r\n\t* Method to call settingssService for getting data for Request Types.\r\n\t* @method Fxp.Controllers.CreateAskOpsController.getRequestTypeData\r\n\t* @example Example to use getRequestTypeData\r\n\t* this.getRequestTypeData();\r\n\t*/\r\n\tgetRequestTypeData() {\r\n\t\tconst source_telemetry = `${this.sourceForTelemetry}.GetRequestTypeData`; \r\n\t\tvar startTime = performance.now(),\r\n\t\t\tself = this,\r\n\t\t\tpropBag = self.fxpLoggerService.createPropertyBag();\r\n\t\t// Call setting service to get Request Types data.\r\n\t\tself.settingsService.getSettings(SettingsType.App, \"Fxp\", ApplicationConstants.SnowRequestTypeSettings).then(\r\n\t\t\tfunction (response:any) {\r\n\t\t\t\t// Check if data is present.\r\n\t\t\t\tif (response.data.length > 0) {\r\n\t\t\t\t\t// Assign data.\r\n\t\t\t\t\tself.requestTypeData = JSON.parse(response.data[0].settingValue);\r\n\t\t\t\t\t// Select default Request Type\r\n\t\t\t\t\tself.selectDefaultRequestType();\r\n\t\t\t\t}\r\n\t\t\t\t// Log time taken by API.\r\n\t\t\t\tpropBag.addToBag(\"TotalTime\", (performance.now() - startTime).toString());\r\n\t\t\t\tself.fxpLoggerService.logEvent(source_telemetry, \"getRequestTypeData\", propBag);\r\n\t\t\t},\r\n\t\t\tfunction (error) {\r\n\t\t\t\t// Display and log error if service fails.\r\n\t\t\t\tpropBag.addToBag(FxpConstants.metricConstants.Status, error.status);\r\n\t\t\t\tpropBag.addToBag(FxpConstants.metricConstants.StatusText, error.statusText + ' ' + error.data);\r\n\t\t\t\tself.fxpMessage.addMessage(self.$rootScope.fxpUIConstants.UIMessages.GeneralExceptionError.ErrorMessage, FxpConstants.messageType.error);\r\n\t\t\t\tself.fxpLoggerService.logError(\r\n\t\t\t\t\t\t\t\t\t\t\t\tsource_telemetry,\r\n\t\t\t\t\t\t\t\t\t\t\t\tself.$rootScope.fxpUIConstants.UIMessages.GetSettingsServiceCallFailedError.ErrorMessageTitle,\r\n\t\t\t\t\t\t\t\t\t\t\t\tErrorCodes.GetRequestTypeData_Failure,\r\n\t\t\t\t\t\t\t\t\t\t\t\tnull,\r\n\t\t\t\t\t\t\t\t\t\t\t\tpropBag,\r\n\t\t\t\t\t\t\t\t\t\t\t\tnull,\r\n\t\t\t\t\t\t\t\t\t\t\t\tnull,\r\n\t\t\t\t\t\t\t\t\t\t\t\tErrorSeverityLevel.Medium\r\n\t\t\t\t\t\t\t\t\t\t\t );\r\n\t\t\t}\r\n\t\t);\r\n\t}\r\n\r\n\t/**\r\n\t* Method to select default request type.\r\n\t* @method Fxp.Controllers.CreateAskOpsController.selectDefaultRequestType\r\n\t* @example Example to use selectDefaultRequestType\r\n\t* this.selectDefaultRequestType();\r\n\t*/\r\n\tselectDefaultRequestType() {\r\n\t\tvar self = this;\r\n\t\tif (self.defaultRequestType) {\r\n\t\t\tself.currentRequestType = self.requestTypeData.filter(function (requestType) {\r\n\t\t\t\treturn requestType.DisplayText == self.defaultRequestType;\r\n\t\t\t})[0];\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t* Method to open snow link in new tab and log the event.\r\n\t* @method Fxp.Controllers.CreateAskOpsController.openPage\r\n\t* @example Example to use openPage\r\n\t* this.openPage();\r\n\t*/\r\n\topenPage() {\r\n\t\tvar self = this,\r\n\t\t\tpropBag = self.fxpLoggerService.createPropertyBag();\r\n\t\t// Open link in new tab.\r\n\t\tself.$window.open(self.currentRequestType.LongURL, \"_blank\");\r\n\t\t// Log event.\r\n\t\tpropBag.addToBag(\"RequestType\", self.currentRequestType.DisplayText);\r\n\t\tpropBag.addToBag(\"SnowLink\", self.currentRequestType.LongURL);\r\n\t\tself.fxpLoggerService.logEvent(`${self.sourceForTelemetry}.openPage`, `${TelemetryConstants.FXP_TELEMETRY_BASE_NAME}.CreateAskOpsRequest`, propBag);\r\n\t\t// Close Modal.\r\n\t\tself.closeModal();\r\n\t}\r\n\r\n\t/**\r\n\t* Method to close createAskOpsModal.\r\n\t* @method Fxp.Controllers.CreateAskOpsController.closeModal\r\n\t* @example Example to use closeModal\r\n\t* this.closeModal();\r\n\t*/\r\n\tcloseModal() {\r\n\t\tvar self = this;\r\n\t\tself.$uibModalInstance.dismiss()\r\n\t}\r\n\r\n}","/**\r\n * @application Fxp\r\n */\r\n/**\r\n * @namespace Fxp.Controllers\r\n */\r\nimport { ILogger } from \"../interfaces/ILogger\";\r\nimport { IRootScope } from \"../interfaces/IRootScope\";\r\nimport { TelemetryConstants } from \"../telemetry/TelemetryConst\";\r\n\r\n/**\r\n * A controller for FxpApp Support Ticket functionality.\r\n * @class Fxp.Controllers.CreateSupportTicketController\r\n * @classdesc A controller for FxpApp Support Ticket functionality.\r\n * @example \r\n * //To Use CreateSupportTicketController\r\n * angular.module('FxPApp').controller('CreateSupportTicketController', ['AnyDependency', CreateSupportTicketController]);\r\n * function CreateSupportTicketController(AnyDependency){ AnyDependency.doSomething(); }\r\n */\r\nexport class CreateSupportTicketController {\r\n\tprivate currentRequestType: any;\r\n\tprivate requestTypeData: any;\r\n\tprivate modalStrings:any;\r\n\tprivate readonly sourceForTelemetry = `${TelemetryConstants.FXP_TELEMETRY_BASE_NAME}.CreateSupportTicketController`;\r\n\tconstructor(\r\n\t\tprivate $rootScope: IRootScope,\r\n\t\tprivate $window: angular.IWindowService,\r\n\t\tprivate $uibModalInstance: any,\r\n\t\tprivate fxpLoggerService: ILogger,\r\n\t\tprivate defaultRequestType: any\r\n\t) {\r\n\t\tthis.currentRequestType = \"\";\r\n\t\tthis.modalStrings = this.$rootScope.fxpUIConstants.UIStrings.CreateSupportTicketModalStrings;\r\n\t\t// Get Request Types data.\r\n\t\tthis.getRequestTypeData();\r\n\t}\r\n\r\n\t/**\r\n\t* Method to set requestTypeData.\r\n\t* @method Fxp.Controllers.CreateSupportTicketController.getRequestTypeData\r\n\t* @example Example to use getRequestTypeData\r\n\t* this.getRequestTypeData();\r\n\t*/\r\n\tprivate getRequestTypeData(): void {\r\n\t\tthis.requestTypeData = this.$window.tenantConfiguration.HelpConfiguration.FxpHelpLinks[1].HelpLinks[0].HelpLinkData\r\n\t\t// Select default Request Type\r\n\t\tthis.selectDefaultRequestType();\r\n\t}\r\n\r\n\t/**\r\n\t* Method to select default request type.\r\n\t* @method Fxp.Controllers.CreateSupportTicketController.selectDefaultRequestType\r\n\t* @example Example to use selectDefaultRequestType\r\n\t* this.selectDefaultRequestType();\r\n\t*/\r\n\tprivate selectDefaultRequestType(): void {\r\n\t\tif (this.defaultRequestType) {\r\n\t\t\tthis.currentRequestType = this.requestTypeData.filter((requestType) => {\r\n\t\t\t\treturn requestType.DisplayText == this.defaultRequestType;\r\n\t\t\t})[0];\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t* Method to open support ticket in new tab and log the event.\r\n\t* @method Fxp.Controllers.CreateSupportTicketController.openPage\r\n\t* @example Example to use openPage\r\n\t* this.openPage();\r\n\t*/\r\n\tpublic openPage(): void {\r\n\t\tlet propBag = this.fxpLoggerService.createPropertyBag();\r\n\t\t// Open link in new tab.\r\n\t\tthis.$window.open(this.currentRequestType.Href, \"_blank\");\r\n\t\t// Log event.\r\n\t\tpropBag.addToBag(\"RequestType\", this.currentRequestType.DisplayText);\r\n\t\tpropBag.addToBag(\"SnowLink\", this.currentRequestType.Href);\r\n\t\tthis.fxpLoggerService.logEvent(`${this.sourceForTelemetry}.openPage`, `${TelemetryConstants.FXP_TELEMETRY_BASE_NAME}.CreateSupportTicketRequest`, propBag);\r\n\t\t// Close Modal.\r\n\t\tthis.closeModal();\r\n\t}\r\n\r\n\t/**\r\n\t* Method to close Modal.\r\n\t* @method Fxp.Controllers.CreateSupportTicketController.closeModal\r\n\t* @example Example to use closeModal\r\n\t* this.closeModal();\r\n\t*/\r\n\tpublic closeModal(): void {\r\n\t\tthis.$uibModalInstance.dismiss()\r\n\t}\r\n}","\r\n/**\r\n * @application Fxp\r\n */\r\n/**\r\n * @module Fxp.Controllers\r\n */\r\ndeclare type IStateService = any;\r\nimport { ILogger } from \"../interfaces/ILogger\";\r\nimport { FxpMessageService } from \"../../app/banner/FxpMessageService\";\r\nimport { FxpConstants, CustomEvents } from \"../common/ApplicationConstants\";\r\nimport { OBOUserService } from \"../services/OBOUserService\";\r\nimport { IFxpContext } from \"../interfaces/IFxpContext\";\r\nimport { IRootScope } from \"../interfaces/IRootScope\";\r\nimport { UserProfileService } from \"../services/userProfileService\";\r\nimport { UserInfoService } from \"../services/UserInfoService\";\r\nimport { TelemetryContext } from \"../telemetry/telemetrycontext\";\r\nimport { FxpConfigurationService } from \"../services/FxpConfiguration\";\r\nimport { DashboardService } from \"../services/dashboardService\";\r\nimport { CommonUtils } from \"../utils/CommonUtils\";\r\nimport { FxpContext } from \"../context/FxpContext\";\r\nimport { IDashBoardControllerScope } from \"../interfaces/IDashBoardControllerScope\";\r\nimport { FxpFeedbackService } from \"../services/FxpFeedbackService\";\r\nimport { DashBoardHelper } from \"../factory/DashBoardHelper\";\r\nimport { FxpBroadcastedEvents } from \"../services/FxpBroadcastedEvents\";\r\nimport { FxpEventBroadCastService } from \"../services/BroadCastingService\";\r\nimport { BrowserExperience } from \"../services/BrowserExperience\";\r\nimport { FxpGlobalStoreService } from \"../services/fxp.global.store.service\";\r\nimport { TelemetryConstants } from \"../telemetry/TelemetryConst\";\r\nimport { ComponentType } from \"@microsoftit/telemetry-extensions-npm\";\r\nimport { SystemEvent } from \"../telemetry/SystemEvent\";\r\nimport { ErrorSeverityLevel } from \"../telemetry/ErrorSeverityLevel\";\r\nimport { ErrorCodes } from \"../constants/errorCodes\";\r\n/**\r\n * A main controller for FxpApp module. This is the controller having basic scopes and events.\r\n * @class Fxp.Controllers.DashBoardController\r\n * @classdesc A main controller of FxpApp module\r\n * @example \r\n * //To Use DashBoardController\r\n * // angular.module('FxPApp').controller('DashBoardController', ['AnyDependency', DashBoardController]);\r\n * // function DashBoardController(AnyDependency){ AnyDependency.doSomething(); }\r\n */\r\nexport class DashBoardController {\r\n\tprivate $state: IStateService;\r\n\r\n\tprivate $rootScope: IRootScope;\r\n\tprivate $scope: IDashBoardControllerScope;\r\n\tprivate userProfileService: UserProfileService;\r\n\tprivate userInfoService: UserInfoService;\r\n\tprivate fxpLoggerService: ILogger;\r\n\tprivate fxpMessage: FxpMessageService;\r\n\tprivate fxpConstants: FxpConstants;\r\n\tprivate OBOUserService: OBOUserService;\r\n\tprivate fxpContext: IFxpContext;\r\n\tprivate dashBoardHelper: DashBoardHelper;\r\n\tprivate fxpTelemetryContext: TelemetryContext;\r\n\tprivate fxpConfigurationService: FxpConfigurationService;\r\n\tprivate dashboardService: DashboardService;\r\n\tprivate fxpFeedbackService: FxpFeedbackService;\r\n\tprivate fxpErrorMessages: any;\r\n\tprivate leftnavigationdata: any;\r\n\tprivate browserExperience: BrowserExperience;\r\n\tprivate fxpEventBroadCastService: FxpEventBroadCastService;\r\n\tprivate sourceForTelemetry = `${TelemetryConstants.FXP_TELEMETRY_BASE_NAME}.DashBoardController`;\r\n\tconstructor($scope: IDashBoardControllerScope,\r\n\t\tUIStateHelper, $rootScope: IRootScope,\r\n\t\tfxpLoggerService: ILogger,\r\n\t\tuserProfileService: UserProfileService,\r\n\t\tuserInfoService: UserInfoService,\r\n\t\tfxpMessage: FxpMessageService,\r\n\t\tOBOUserService: OBOUserService,\r\n\t\tdashBoardHelper: DashBoardHelper,\r\n\t\tfxpTelemetryContext: TelemetryContext,\r\n\t\tfxpContextService: IFxpContext,\r\n\t\tfxpConfigurationService: FxpConfigurationService,\r\n\t\tfxpEventBroadCastService: FxpEventBroadCastService,\r\n\t\tdashboardService: DashboardService,\r\n\t\tfxpFeedbackService: FxpFeedbackService,\r\n\t\t$state: IStateService,\r\n\t\tprivate globalStore: FxpGlobalStoreService\r\n\t) {\r\n\r\n\t\tlet startTime = performance.now();\r\n\t\tthis.$rootScope = $rootScope;\r\n\t\tthis.$state = $state;\r\n\r\n\t\tthis.$scope = $scope;\r\n\t\tthis.userProfileService = userProfileService;\r\n\t\tthis.userInfoService = userInfoService;\r\n\t\tthis.fxpLoggerService = fxpLoggerService;\r\n\t\tthis.fxpMessage = fxpMessage;\r\n\t\tthis.fxpConstants = FxpConstants;\r\n\t\tthis.OBOUserService = OBOUserService;\r\n\t\tthis.dashBoardHelper = dashBoardHelper;\r\n\t\tthis.fxpErrorMessages = $rootScope.fxpUIConstants.UIMessages;\r\n\t\tthis.fxpTelemetryContext = fxpTelemetryContext;\r\n\t\tthis.fxpContext = fxpContextService;\r\n\t\tthis.dashboardService = dashboardService;\r\n\t\tthis.fxpFeedbackService = fxpFeedbackService;\r\n\t\tthis.leftnavigationdata = [];\r\n\t\tthis.fxpConfigurationService = fxpConfigurationService;\r\n\t\tthis.browserExperience = new BrowserExperience(userInfoService);\r\n\t\tthis.$scope.browserExperience = this.browserExperience;\r\n\t\tthis.$scope.footerdata = fxpConfigurationService.FxpBaseConfiguration.FxpFooterData;\r\n\t\tthis.$scope.oboUIStrings = this.$rootScope.fxpUIConstants.UIStrings.OBOUIStrings;\r\n\t\tthis.$scope.OBOUser = {};\r\n\t\tthis.fxpEventBroadCastService = fxpEventBroadCastService;\r\n\r\n\t\t//Initializes value\r\n\t\tvar self = this;\r\n\r\n\t\tif (!window[\"isFxpConfigFetched\"]) {\r\n\t\t\tthis.dashboardService.fxpConfigurationFailed();\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tthis.$scope.closeActOnBehalofUserClick = this.closeActOnBehalofUserClick.bind(this);\r\n\t\tthis.$scope.pullFocusToElement = CommonUtils.pullFocusToElement.bind(this);\r\n\t\tthis.$scope.onSendUserFeedbackInfo = this.onSendUserFeedbackInfo.bind(this);\r\n\t\tthis.$scope.onSendUserFeedbackInfoError = this.onSendUserFeedbackInfoError.bind(this);\r\n\t\tthis.$scope.logFooterUsageTelemetryInfo = this.logFooterUsageTelemetryInfo.bind(this);\r\n\r\n\t\tif (this.$rootScope.actOnBehalfOfUserActive) {\r\n\t\t\tthis.$rootScope.currentRoutes = this.OBOUserService.getOBOUserRoutes();\r\n\t\t\tthis.$scope.OBOUser.name = this.OBOUserService.getOBOUser().displayName;\r\n\t\t\tthis.$scope.OBOUser.href = this.OBOUserService.getOBOUser().href;\r\n\t\t\tthis.$scope.OBOUser.alias = this.OBOUserService.getOBOUser().alias;\r\n\t\t\tif (!$scope.OBOUser.alias) {\r\n\t\t\t\tself.fxpMessage.addMessage(self.fxpErrorMessages.OBOUserAliasUndefined.ErrorMessage, FxpConstants.messageType.error);\r\n\t\t\t}\r\n\t\t}\r\n\t\telse {\r\n\t\t\tthis.$rootScope.currentRoutes = window[\"loggedInUserConfig\"]; // loggedinUserConfig is coming from DashBoard.cshtml\r\n\t\t\tself.setTenantConfiguration(window[\"tenantConfiguration\"]);\r\n\t\t}\r\n\t\tconsole.log(\"Dashboard Fill Routes\");\r\n\t\tself.dashBoardHelper.fillRoutes(self.$rootScope.currentRoutes);\r\n\r\n\t\t// Feedback\r\n\t\tif (CommonUtils.isNullOrEmpty(self.$rootScope.initialFlags)) {\r\n\t\t\tlet flightHandler = function () {\r\n\t\t\t\tself.enableFeedback();\r\n\t\t\t\tflightHandlerCleanUp();\r\n\t\t\t};\r\n\t\t\tlet flightHandlerCleanUp = self.$rootScope.$on(CustomEvents.StartUpFlagRetrieved, flightHandler);\r\n\t\t}\r\n\t\tself.enableFeedback();\r\n\t\tself.$scope.$on(FxpBroadcastedEvents.OnFeedbackContextChanged, function () {\r\n\t\t\tself.$scope.feedbackContextItem = fxpFeedbackService.getFeedbackPropBagItems();\r\n\t\t});\r\n\r\n\t\tself.$scope.$on(FxpBroadcastedEvents.OnFeedbackConfigurationChanged, function () {\r\n\t\t\tself.$scope.feedbackConfiguration =\r\n\t\t\t{\r\n\t\t\t\tfeedbackItemCollection: fxpFeedbackService.getFeedbackItemCollection(),\r\n\t\t\t\tfeedbackSubscriptionId: fxpFeedbackService.getSubscriprtionId(),\r\n\t\t\t\tfeedbackServiceEndpoint: fxpFeedbackService.getFeedbackEndpoint()\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\tthis.$rootScope.$watch('actOnBehalfOfUserActive', function (newValue, oldValue) {\r\n\t\t\tif (newValue !== oldValue) {\r\n\t\t\t\tif (newValue) {\r\n\t\t\t\t\tself.$rootScope.currentRoutes = self.OBOUserService.getOBOUserRoutes();\r\n\t\t\t\t\tself.$scope.OBOUser.name = self.OBOUserService.getOBOUser().displayName;\r\n\t\t\t\t\tself.$scope.OBOUser.href = self.OBOUserService.getOBOUser().href;\r\n\t\t\t\t\tself.$scope.OBOUser.alias = self.OBOUserService.getOBOUser().alias;\r\n\t\t\t\t\tif (!CommonUtils.isNullOrEmpty(self.OBOUserService.getOBOUserTenantConfiguration())) {\r\n\t\t\t\t\t\tself.setTenantConfiguration(self.OBOUserService.getOBOUserTenantConfiguration());\r\n\t\t\t\t\t}\r\n\t\t\t\t\tconsole.log(\"OBO Routes Filling\");\r\n\t\t\t\t} else {\r\n\t\t\t\t\tself.OBOUserService.removeOBOUserContext();\r\n\t\t\t\t\tself.$rootScope.currentRoutes = window[\"loggedInUserConfig\"];\r\n\t\t\t\t\tself.setTenantConfiguration(window[\"tenantConfiguration\"]);\r\n\t\t\t\t\tconsole.log(\"Logged in Routes Filling\");\r\n\t\t\t\t}\r\n\t\t\t\tself.dashBoardHelper.fillRoutes(self.$rootScope.currentRoutes);\r\n\t\t\t}\r\n\r\n\t\t\tif (self.$rootScope.initialFlags.feedbackEnabled)\r\n\t\t\t\tself.fxpFeedbackService.setUserDetailsToFeedback();\r\n\t\t});\r\n\t\tlet timeTaken = performance.now() - startTime;\r\n\t\tlet currentTime = new Date().toLocaleString();\r\n\t\tlet bag = this.fxpLoggerService.createPropertyBag();\r\n\t\tlet currentProcessName = TelemetryConstants.FXP_TELEMETRY_PLATFORM_BOOTSTRAP + '.LandingExperience.FxPLoadComplete';\r\n\t\tlet eventData = new SystemEvent(currentProcessName, ComponentType.DataStore, 'Basic Profile api call');\r\n\t\tbag.addToBag('Time', `${currentTime}`);\r\n\t\tbag.addToBag('TimeTaken', `${timeTaken}`);\r\n\t\tthis.fxpLoggerService.logSystemEvent(TelemetryConstants.FXP_TELEMETRY_BASE_NAME + \".DashBoardController\", eventData, bag);\r\n\t}\r\n\r\n\tprivate enableFeedback(): void {\r\n\t\tvar self = this;\r\n\t\tself.$rootScope.initialFlags = self.$rootScope.initialFlags || {};\r\n\t\tif (self.$rootScope.initialFlags && self.$rootScope.initialFlags.feedbackEnabled) {\r\n\t\t\ttry {\r\n\t\t\t\tvar feedbackItemCollection = typeof self.fxpConfigurationService.FxpBaseConfiguration.FeedbackItemCollection != FxpConstants.CONST.String ? self.fxpConfigurationService.FxpBaseConfiguration.FeedbackItemCollection : JSON.parse(self.fxpConfigurationService.FxpBaseConfiguration.FeedbackItemCollection);\r\n\t\t\t\tself.fxpFeedbackService.setFeedbackItemCollection(feedbackItemCollection);\r\n\t\t\t} catch (e) {\r\n\t\t\t\tself.fxpFeedbackService.setFeedbackItemCollection([]);\r\n\t\t\t}\r\n\t\t\tself.fxpFeedbackService.setFeedbackEndpoint(self.fxpConfigurationService.FxpAppSettings.FeedbackServiceEndpoint);\r\n\t\t\tself.fxpFeedbackService.setSubscriprtionId(self.fxpConfigurationService.FxpAppSettings.FeedbackSubscriptionId);\r\n\t\t\tself.fxpFeedbackService.setUserDetailsToFeedback();\r\n\t\t}\r\n\t}\r\n\r\n\tprivate setTenantConfiguration(tenantConfig: any): void {\r\n\t\tvar self = this;\r\n\t\tself.setUIStrings(tenantConfig.UIStrings);\r\n\t\tself.updateHeaderLogo(tenantConfig.FxpHeaderLogo);\r\n\t}\r\n\r\n\tprivate setUIStrings(uiStrings: any): void {\r\n\t\tvar self = this;\r\n\t\tvar uiStringsInternal = self.userInfoService.isActingOnBehalfOf() ? self.filterUIStringsForOBO(uiStrings) : uiStrings;\r\n\r\n\t\tangular.forEach(uiStringsInternal, function (value, key) {\r\n\t\t\tself.$rootScope.fxpUIConstants.UIStrings[key] = value;\r\n\t\t});\r\n\t}\r\n\r\n\tprivate filterUIStringsForOBO(uiStrings: any): any {\r\n\t\tvar self = this;\r\n\t\tvar uiStringsInternal = {};\r\n\r\n\t\tself.fxpConfigurationService.FxpBaseConfiguration.OBOTenantUIStrings.map(function (item) {\r\n\t\t\tif (uiStrings[item] !== undefined) {\r\n\t\t\t\tuiStringsInternal[item] = uiStrings[item];\r\n\t\t\t}\r\n\t\t});\r\n\t\treturn uiStringsInternal;\r\n\t}\r\n\r\n\ttoggleLeftNavExpandedState(): void {\r\n\t\tvar self = this;\r\n\t\tself.$rootScope.$broadcast(FxpBroadcastedEvents.OnLeftNavToggleExpandedState);\r\n\t}\r\n\r\n\tonSendUserFeedbackInfoError(feedbackResponse): any {\r\n\t\tvar self = this;\r\n\t\tswitch (feedbackResponse.tags.Action) {\r\n\t\t\tcase FxpConstants.ActionTypes.Submit:\r\n\t\t\t\tself.fxpFeedbackService.logFeedbackInformation(feedbackResponse, `${TelemetryConstants.FXP_TELEMETRY_BASE_NAME}.UserFeedbackSubmissionFailed`, FxpConstants.messageType.error, feedbackResponse.error);\r\n\t\t\t\tself.fxpMessage.addMessage(self.$rootScope.fxpUIConstants.UIStrings.FeedbackUIMessages.ErrorMessage, FxpConstants.messageType.error);\r\n\t\t\t\t// To pull focus back to Feedback button after closing message\r\n\t\t\t\tself.$rootScope.activeElement = $(\"#feedback-control\");\r\n\t\t\t\tbreak;\r\n\t\t\tcase FxpConstants.ActionTypes.Cancel:\r\n\t\t\t\tself.fxpFeedbackService.logFeedbackInformation(feedbackResponse, `${TelemetryConstants.FXP_TELEMETRY_BASE_NAME}.UserFeedbackCancelFailed`, FxpConstants.messageType.error, feedbackResponse.error);\r\n\t\t\t\tbreak;\r\n\t\t\tcase FxpConstants.ActionTypes.Click:\r\n\t\t\t\tself.fxpFeedbackService.logFeedbackInformation(feedbackResponse, `${TelemetryConstants.FXP_TELEMETRY_BASE_NAME}.UserFeedbackClickFailed`, FxpConstants.messageType.error, feedbackResponse.error);\r\n\t\t\t\tbreak;\r\n\t\t}\r\n\t}\r\n\r\n\tonSendUserFeedbackInfo(feedbackResponse): any {\r\n\t\tvar self = this;\r\n\t\tswitch (feedbackResponse.tags.Action) {\r\n\t\t\tcase FxpConstants.ActionTypes.Submit:\r\n\t\t\t\tself.fxpFeedbackService.logFeedbackInformation(feedbackResponse, `${TelemetryConstants.FXP_TELEMETRY_BASE_NAME}.UserFeedbackSubmissionSuccess`, FxpConstants.messageType.success, null);\r\n\t\t\t\tself.fxpMessage.addMessage(self.$rootScope.fxpUIConstants.UIStrings.FeedbackUIMessages.SuccessMessage, FxpConstants.messageType.success, null);\r\n\t\t\t\t// To pull focus back to Feedback button after closing message\r\n\t\t\t\tself.$rootScope.activeElement = $(\"#feedback-control\");\r\n\t\t\t\tbreak;\r\n\t\t\tcase FxpConstants.ActionTypes.Cancel:\r\n\t\t\t\tself.fxpFeedbackService.logFeedbackInformation(feedbackResponse, `${TelemetryConstants.FXP_TELEMETRY_BASE_NAME}.UserFeedbackCancelSuccess`, FxpConstants.messageType.success, null);\r\n\t\t\t\tbreak;\r\n\t\t\tcase FxpConstants.ActionTypes.Click:\r\n\t\t\t\tself.fxpFeedbackService.logFeedbackInformation(feedbackResponse, `${TelemetryConstants.FXP_TELEMETRY_BASE_NAME}.UserFeedbackClickSuccess`, FxpConstants.messageType.success, null);\r\n\t\t\t\tbreak;\r\n\t\t}\r\n\t}\r\n\r\n\tcloseActOnBehalofUserClick($event): void {\r\n\t\tvar self = this;\r\n\r\n\t\tif (window._showPageDirtyPopup) {\r\n\t\t\tif (!confirm(self.$rootScope.fxpUIConstants.UIMessages.PageDirtyMessages.UnsavedChangesMessage)) {\r\n\t\t\t\t$event.preventDefault();\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\twindow._showPageDirtyPopup = false;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tconst source_telemetry = `${this.sourceForTelemetry}.CloseActOnBehalfOfUserClick`;\r\n\t\tvar propbag = self.fxpLoggerService.createPropertyBag();\r\n\r\n\t\ttry {\r\n\t\t\tself.fxpLoggerService.renewCorrelationId();\r\n\t\t\tself.fxpLoggerService.logTrace('Fxp.closeactOnBehalfofuser', \"close actOnBehalfOfUser Started\");\r\n\t\t\tself.userInfoService.setCurrentUserOID(self.userInfoService.getLoggedInUserOID());\r\n\t\t\tself.userProfileService.setCurrentUser(self.userInfoService.getLoggedInUser());\r\n\t\t\tself.OBOUserService.setCurrentUserStateFromLoggedInUserState();\r\n\r\n\t\t\tself.OBOUserService.removeOBOUserContext();\r\n\t\t\t//when obo user session closed\r\n\t\t\tself.$rootScope.$broadcast(FxpBroadcastedEvents.OnUserContextChanged, self.userInfoService.getCurrentUser(), self.userInfoService.getCurrentUserData().roleGroupId, self.userInfoService.getCurrentUserData().businessRoleId);\r\n\t\t\tself.$rootScope.$broadcast(FxpBroadcastedEvents.ActOnBehalfClosed, self.userInfoService.getCurrentUser(), self.userInfoService.getCurrentUserData().roleGroupId, self.userInfoService.getCurrentUserData().businessRoleId);\r\n\t\t\t//Telemetry\r\n\t\t\tvar oboUserEndTime = new Date().getTime().toString();\r\n\t\t\tpropbag.addToBag(FxpConstants.OBOConstants.ActonBehalfofAdminEndTime, oboUserEndTime);\r\n\t\t\tvar startTime = localStorage.getItem(FxpConstants.OBOConstants.ActonBehalfofAdminStartTime.toString());\r\n\t\t\tvar responseTime = (parseInt(oboUserEndTime) - parseInt(startTime));\r\n\t\t\tvar oboUserMetric = self.fxpLoggerService.createMetricBag();\r\n\t\t\toboUserMetric.addToBag(FxpConstants.OBOConstants.AdminActOnBehaflOfDuratoin, responseTime);\r\n\t\t\tself.fxpLoggerService.logEvent(source_telemetry, 'Closing of actOnBehalfOfUser completed.', propbag, oboUserMetric);\r\n\t\t\t//Remove global properties\r\n\t\t\tself.fxpTelemetryContext.removeFromGlobalPropertyBag(FxpConstants.OBOConstants.OnBehalfOfUserUpn);\r\n\t\t\tself.fxpTelemetryContext.removeFromGlobalPropertyBag(FxpConstants.OBOConstants.ActonBehalfMode);\r\n\t\t\tself.fxpTelemetryContext.removeFromGlobalPropertyBag(FxpConstants.OBOConstants.OnBehalfOfUserBusinessRoleId);\r\n\t\t\tself.fxpTelemetryContext.removeFromGlobalPropertyBag(FxpConstants.OBOConstants.OnBehalfOfUserBusinessRole);\r\n\t\t\tself.fxpLoggerService.setOBOUserContext(null, null, self.userProfileService.isObo(), null, null);\r\n\t\t\tself.fxpLoggerService.logTrace(source_telemetry, \"closeactOnBehalfofuser end\");\r\n\t\t\tif (self.$rootScope.initialFlags.feedbackEnabled)\r\n\t\t\t\tself.fxpFeedbackService.setUserDetailsToFeedback();\r\n\t\t}\r\n\t\tcatch (e) {\r\n\t\t\tpropbag.addToBag(\"OBOCloseError\", e);\r\n\t\t\tself.fxpMessage.addMessage(self.$rootScope.fxpUIConstants.UIMessages.GeneralExceptionError.ErrorMessage, FxpConstants.messageType.error);\r\n\t\t\tself.fxpLoggerService.logError(source_telemetry,\r\n\t\t\t\tself.$rootScope.fxpUIConstants.UIMessages.GeneralExceptionError.ErrorMessage,\r\n\t\t\t\tErrorCodes.CloseActOnBehalofUser_Failure,\r\n\t\t\t\tnull,\r\n\t\t\t\tpropbag,\r\n\t\t\t\tnull,\r\n\t\t\t\tnull,\r\n\t\t\t\tErrorSeverityLevel.Medium\r\n\t\t\t);\r\n\t\t}\r\n\r\n\t}\r\n\r\n\tlogFooterUsageTelemetryInfo(footerItem: any): void {\r\n\t\tvar self = this, propBag;\r\n\r\n\t\tpropBag = self.fxpLoggerService.createPropertyBag();\r\n\t\tpropBag.addToBag(FxpConstants.metricConstants.FooterLinkUrl, footerItem.href);\r\n\t\tpropBag.addToBag(FxpConstants.metricConstants.FooterLinkName, footerItem.DisplayText);\r\n\r\n\t\tself.fxpLoggerService.logInformation(`${this.sourceForTelemetry}.LogFooterUsageTelemetryInfo`, `${this.sourceForTelemetry}.FooterLinkClick`, propBag);\r\n\t}\r\n\r\n\r\n\tprivate updateHeaderLogo(headerLogo: any): void {\r\n\t\tvar self = this;\r\n\t\tif (CommonUtils.isNullOrEmpty(headerLogo)) {\r\n\t\t\tself.$scope.headerLogo = self.fxpConfigurationService.FxpBaseConfiguration.FxpHeaderLogo;\r\n\t\t}\r\n\t\telse {\r\n\t\t\tself.$scope.headerLogo = headerLogo;\r\n\t\t}\r\n\t}\r\n\r\n}\r\n","/**\r\n * @application Fxp\r\n */\r\n/**\r\n * @module Fxp.Controllers\r\n */\r\nimport { ILogger } from \"../interfaces/ILogger\";\r\nimport { FxpConstants } from \"../common/ApplicationConstants\";\r\nimport { FxpConfigurationService } from \"../services/FxpConfiguration\";\r\nimport { TelemetryConstants } from \"../telemetry/TelemetryConst\";\r\n/**\r\n * Footer Controller. Used to display footer links and captures telemetry around it\r\n * @class Fxp.Controllers.FooterController\r\n * @classdesc FooterController of FxpApp module\r\n * @example \r\n * //To Use FooterController\r\n * angular.module('FxPApp').controller('FooterController', ['AnyDependency', FooterController]);\r\n * function FooterController(AnyDependency){ AnyDependency.doSomething(); }\r\n */\r\nexport class FooterController {\r\n\tprivate readonly sourceForTelemetry = `${TelemetryConstants.FXP_TELEMETRY_BASE_NAME}.FooterController`;\r\n\tconstructor(\r\n\t\tprivate $scope: any,\r\n\t\tprivate fxpLoggerService: ILogger,\r\n\t\tprivate fxpConfigurationService: FxpConfigurationService,\r\n\t) {\r\n\t\tthis.$scope.footerdata = fxpConfigurationService.FxpBaseConfiguration.FxpFooterData;\r\n\t\tthis.updateCopyRightDataWithCurrentYear();\r\n\t\t//Initializes value\r\n\t\t//updating userInfo session for logged in user only if RoleGroup Configuration is missing\r\n\t\tthis.$scope.logFooterUsageTelemetryInfo = this.logFooterUsageTelemetryInfo.bind(this);\r\n\t}\r\n\r\n\tlogFooterUsageTelemetryInfo(footerItem: any): void {\r\n\t\tvar propBag = this.fxpLoggerService.createPropertyBag();\r\n\t\tpropBag.addToBag(FxpConstants.metricConstants.FooterLinkUrl, footerItem.href);\r\n\t\tpropBag.addToBag(FxpConstants.metricConstants.FooterLinkName, footerItem.DisplayText);\r\n\t\tthis.fxpLoggerService.logUserAction(this.sourceForTelemetry, `${TelemetryConstants.FXP_TELEMETRY_BASE_NAME}.FooterLinkClick`, \"Footer link clicked by user\", propBag); \r\n\t}\r\n\r\n\tprivate updateCopyRightDataWithCurrentYear(): void {\r\n\t\tlet copyRightData = this.$scope.footerdata.LeftAlignedLinks.find(data => { return data.TabIndex == '401' });\r\n\t\tlet currentYear = new Date().getFullYear();\r\n\t\tcopyRightData.DisplayText = `©${currentYear} ${copyRightData.DisplayText} `;\r\n\t}\r\n}\r\n","import {\r\n IRootScope\r\n} from \"../interfaces/IRootScope\";\r\nimport {\r\n ILogger\r\n} from \"../interfaces/ILogger\";\r\nimport { UserInfoService } from \"../services/UserInfoService\";\r\nimport { FxpEventBroadCastService } from \"../services/BroadCastingService\";\r\nimport { FxpBroadcastedEvents } from \"../services/FxpBroadcastedEvents\";\r\nimport { IScope } from \"angular\";\r\nimport { UpdateCounter } from '../../app/init/app.status.action.creators';\r\nimport { IPlatformState } from '../../app/store/platform.state.model';\r\nimport { FxpGlobalStoreService } from \"../services/fxp.global.store.service\";\r\nimport { FxpSignalRService } from \"../services/FxpSignalRClient\";\r\nimport { FeatureUsageEvent } from \"../telemetry/FeatureUsageEvent\";\r\nimport { ActionType, ComponentType, EventName } from \"@microsoftit/telemetry-extensions-npm\";\r\nimport { TelemetryConstants } from \"../telemetry/TelemetryConst\";\r\nimport { HideLoader } from \"../../app/loader/loader.actions\";\r\n\r\nexport class FxpWelcomeController {\r\n private signalRSubscriptionHandle: Array; \r\n constructor(\r\n private $rootScope: IRootScope,\r\n private $scope: IScope,\r\n private fxpLoggerService: ILogger,\r\n private userInfoService: UserInfoService,\r\n private fxpBroadCastService: FxpEventBroadCastService,\r\n private globalStore: FxpGlobalStoreService,\r\n private signalRService: FxpSignalRService,\r\n ) {\r\n let self = this;\r\n const source = `${TelemetryConstants.FXP_TELEMETRY_BASE_NAME}.FxpWelcomeController`; \r\n this.signalRSubscriptionHandle = new Array();\r\n let fxpWelcomeFeature = new FeatureUsageEvent(\"FxpWelcomeFeature\", ActionType.User, \"Load\", EventName.PageLoad, ComponentType.Web);\r\n fxpLoggerService.startFeatureUsageEvent(fxpWelcomeFeature); \r\n this.fxpBroadCastService.broadCast(FxpBroadcastedEvents.OnPageLoadComplete, \"FxpWelcomePage\");\r\n setTimeout(function () {\r\n self.globalStore.DispatchGlobalAction(\"Platform\", HideLoader({}));\r\n }, 100);\r\n let globalState = this.globalStore.GetGlobalState();\r\n $scope.globalState = globalState;\r\n $scope.globalCounter = this.globalStore.GetPlatformState().Status.HitCounter;\r\n\r\n let helloWorldNgState = this.globalStore.GetPartnerState(\"HelloWorld\");\r\n\r\n\r\n $scope.ng2localCounter = 0;\r\n if (helloWorldNgState) {\r\n $scope.ng2localCounter = helloWorldNgState.counter.counter;\r\n }\r\n\r\n $scope.IncreaseCount = () => {\r\n console.log(\"Updating global counter by +1\");\r\n // Send action using Global Dispatcher\r\n // this.globalStore.DispatchGlobalAction(\"Platform\", UpdateCounter(1));\r\n \r\n // Send action to the platform Store directly\r\n let store = this.globalStore.GetPlatformStore();\r\n store.dispatch(UpdateCounter(1));\r\n }\r\n\r\n $scope.DecreaseCount = () => {\r\n console.log(\"Updating global counter by -1\");\r\n this.globalStore.DispatchGlobalAction(\"Platform\", UpdateCounter(-1));\r\n }\r\n\r\n this.globalStore.SubscribeToPlatformState(\"Platform\", (platformState: IPlatformState) => {\r\n $scope.globalCounter = platformState.Status.HitCounter;\r\n });\r\n\r\n this.globalStore.SubscribeToGlobalState(\"Platform\", (globalState) => {\r\n $scope.globalState = globalState;\r\n if (globalState.HelloWorld) {\r\n $scope.ng2localCounter = globalState.HelloWorld.counter.counter;\r\n }\r\n });\r\n\r\n $scope.IncreaseNg1Count = () => {\r\n this.globalStore.DispatchGlobalAction(\"Platform\", { type: \"CHANGE_COUNTER\", payload: 1 });\r\n }\r\n\r\n $scope.DecreaseNg1Count = () => {\r\n this.globalStore.DispatchGlobalAction(\"Platform\", { type: \"CHANGE_COUNTER\", payload: -1 });\r\n }\r\n\r\n $scope.AddNg1Todo = () => {\r\n this.globalStore.DispatchGlobalAction(\"Platform\", { type: \"ADD_TODO\", payload: { id: 1000, task: 'Globally Added', isCompleted: false } });\r\n }\r\n\r\n $scope.eventName = \"\"; \r\n $scope.tenantName = \"\";\r\n $scope.singalRResponse = \"\";\r\n const callBackFunction = function(data){\r\n $scope.singalRResponse = JSON.stringify(data); \r\n }\r\n $scope.onSignalREventSubscribe = () => {\r\n let unSubscribeCallBack = this.signalRService.subscribe($scope.eventName, $scope.tenantName, this.signalRCallBackHandler.bind(this));\r\n this.signalRSubscriptionHandle.push({eventName: $scope.eventName, unsubscribe: unSubscribeCallBack});\r\n let feature = new FeatureUsageEvent(\"SignalREventSubscribe\", ActionType.User, \"SubscribeToEvent\", EventName.ButtonClick, ComponentType.Device);\r\n fxpLoggerService.logFeatureUsageEvent(source, feature, undefined, undefined);\r\n }\r\n $scope.onSignalREventUnSubscribe = () => {\r\n let unsubscribe = this.signalRSubscriptionHandle.filter(item=> item.eventName == $scope.eventName)\r\n if (unsubscribe && unsubscribe.length > 0){\r\n unsubscribe[0].unsubscribe ();\r\n unsubscribe.shift();\r\n this.signalRSubscriptionHandle = [...this.signalRSubscriptionHandle.filter(item=> item.eventName != $scope.eventName), ...unsubscribe];\r\n let feature = new FeatureUsageEvent(\"SignalREventUnSubscribe\", ActionType.User, \"UnSubscribeToEvent\", EventName.ButtonClick, ComponentType.Device);\r\n fxpLoggerService.logFeatureUsageEvent(source, feature, undefined, undefined); \r\n }\r\n }\r\n\r\n $scope.completeFeature = ()=>{\r\n fxpLoggerService.endFeatureUsageEvent(`${TelemetryConstants.FXP_TELEMETRY_BASE_NAME}.FxpWelcomeController`, fxpWelcomeFeature); \r\n }\r\n\r\n \r\n \r\n }\r\n\r\n signalRCallBackHandler(data: any):void{\r\n \r\n this.$scope.singalRResponse = JSON.stringify(data); \r\n }\r\n}\r\n\r\nFxpWelcomeController.$inject = ['$rootScope', '$scope', 'FxpLoggerService', 'UserInfoService', 'FxpEventBroadCastService', 'FxpGlobalStoreService', 'FxpSignalRService'];\r\n","/**\r\n * @application Fxp\r\n */\r\n/**\r\n * @module Fxp.Controllers\r\n */\r\ndeclare type IStateService = any;\r\nimport { IHelpControllerScope } from \"../interfaces/IHelpControllerScope\";\r\nimport { CreateAskOpsModalConstant } from \"../constants/CreateAskOpsRequest.constants\";\r\nimport { IHelpCentralService } from \"../interfaces/IHelpCentralService\";\r\nimport {\r\n HelpArticleImageModalConstant,\r\n HelpArticleConstants,\r\n} from \"../constants/HelpArticle.constants\";\r\nimport { FxpConfigurationService } from \"../services/FxpConfiguration\";\r\nimport { IRootScope } from \"../interfaces/IRootScope\";\r\nimport { FxpGlobalStoreService } from \"../services/fxp.global.store.service\";\r\nimport {\r\n FxpConstants,\r\n CustomEvents,\r\n ApplicationConstants,\r\n} from \"../common/ApplicationConstants\";\r\nimport { ILogger } from \"../interfaces/ILogger\";\r\nimport { CommonUtils } from \"../utils/CommonUtils\";\r\nimport { CreateSupportTicketModalConstant } from \"../constants/createSupportTicketRequest.constants\";\r\nimport { HideLoader } from \"../../app/loader/loader.actions\";\r\nimport { IFxpContext } from \"../interfaces/IFxpContext\";\r\nimport { FxpBroadcastedEvents } from \"../services/FxpBroadcastedEvents\";\r\nimport { FxpEventBroadCastService } from \"../services/BroadCastingService\";\r\nimport { TelemetryConstants } from \"../telemetry/TelemetryConst\";\r\nimport { ErrorCodes } from \"../constants/errorCodes\";\r\nimport { FeatureUsageEvent } from \"../telemetry/FeatureUsageEvent\";\r\nimport {\r\n ActionStatus,\r\n ActionType,\r\n ComponentType,\r\n EventName,\r\n} from \"@microsoftit/telemetry-extensions-npm\";\r\n\r\n/**\r\n * A main controller for FxpApp module. This is the controller having basic scopes and events.\r\n * @class Fxp.Controllers.HelpController\r\n * @classdesc A main controller of FxpApp module\r\n * @example \r\n * //To Use HelpController\r\n * angular.module('FxPApp').controller('HelpController', ['AnyDependency', HelpController]);\r\n * function HelpController(AnyDependency){ AnyDependency.doSomething(); }\r\n */\r\n\r\nexport class HelpController {\r\n private fxpDefaultHelp: {};\r\n\r\n //Flighting variables\r\n private fxpHelpWithoutFlighting: any;\r\n private leftNavItem: any;\r\n private fxpContext: any;\r\n private fxpBroadCast: any;\r\n private readonly sourceForTelemetry = `${TelemetryConstants.FXP_TELEMETRY_BASE_NAME}.HelpController`;\r\n constructor(\r\n private $scope: IHelpControllerScope,\r\n private $rootScope: IRootScope,\r\n private fxpConfigurationService: FxpConfigurationService,\r\n private fxpGlobalStoreService: FxpGlobalStoreService,\r\n private fxpLoggerService: ILogger,\r\n private $state: IStateService,\r\n private $timeout: any,\r\n private $window: angular.IWindowService,\r\n private $uibModal: any,\r\n private helpCentralService: IHelpCentralService,\r\n private fxpContextService: IFxpContext,\r\n private fxpEventBroadCastService: FxpEventBroadCastService\r\n ) {\r\n // Start time for performance calculation.\r\n var startTime = performance.now();\r\n //Initializes value\r\n var self = this;\r\n self.$scope.defaultHelpArticleLimit =\r\n fxpConfigurationService.FxpAppSettings.DefaultHelpArticleLimit;\r\n var helpCentralUrl =\r\n fxpConfigurationService.FxpAppSettings.HelpCentralUrl.replace(/\\/$/, \"\"); //removing last slash\r\n self.$scope.helpCentralUrl =\r\n helpCentralUrl + \"/tenant/\" + window[\"tenantConfiguration\"].TenantId;\r\n self.$scope.toggleHelp = self.toggleHelp.bind(self);\r\n self.$scope.stateSpecificHelpLinks = self.stateSpecificHelpLinks.bind(self);\r\n self.$scope.pullFocus = self.pullFocus.bind(self);\r\n self.$scope.logFxpHelpEvent = self.logFxpHelpEvent.bind(self);\r\n self.$scope.logHelpIconEvent = self.logHelpIconEvent.bind(self);\r\n self.$scope.navigateToArticle = self.navigateToArticle.bind(self);\r\n self.$scope.navigateToPreviousState =\r\n self.navigateToPreviousState.bind(self);\r\n self.$scope.setFocusToNextElement = self.setFocusToNextElement.bind(self);\r\n self.$scope.navigateToNextState = self.navigateToNextState.bind(self);\r\n self.$scope.navigateToHome = self.navigateToHome.bind(self);\r\n self.$scope.showMoreContextualHelpLinks =\r\n self.showMoreContextualHelpLinks.bind(self);\r\n self.$scope.expandArticleImage = self.expandArticleImage.bind(self);\r\n self.$scope.saveHelpFeedback = self.saveHelpFeedback.bind(self);\r\n self.$scope.navigateToHelpCentral = self.navigateToHelpCentral.bind(self);\r\n self.$scope.onPinHelpFlyoutClick = self.onPinHelpFlyoutClick.bind(self);\r\n self.$scope.helpArticleTitles = HelpArticleConstants.HelpArticleTitles;\r\n\r\n // Search\r\n self.$scope.searchValue = \"\";\r\n self.$scope.searchSuggestions = self.searchSuggestions.bind(self);\r\n self.$scope.onSearchKeyDown = self.onSearchKeyDown.bind(self);\r\n self.$scope.searchHelpArticles = self.searchHelpArticles.bind(self);\r\n self.$scope.onSearchSuggestionSelect =\r\n self.onSearchSuggestionSelect.bind(self);\r\n self.$scope.templateCheck = self.templateCheck.bind(self);\r\n\r\n self.fxpGlobalStoreService.DispatchGlobalAction(\"Platform\", HideLoader({}));\r\n self.$rootScope.appLoaded = true;\r\n self.fxpContext = fxpContextService;\r\n self.fxpBroadCast = fxpEventBroadCastService;\r\n\r\n self.resetNavigation();\r\n\r\n try {\r\n self.fxpDefaultHelp = JSON.parse(\r\n fxpConfigurationService.FxpAppSettings.FxpHelp\r\n );\r\n } catch (e) {\r\n self.fxpDefaultHelp = {};\r\n }\r\n self.fxpHelpWithoutFlighting = CommonUtils.isNullOrEmpty(\r\n window[\"tenantConfiguration\"].HelpConfiguration\r\n )\r\n ? self.fxpDefaultHelp\r\n : window[\"tenantConfiguration\"].HelpConfiguration;\r\n\r\n //flighting code\r\n self.flightHandler();\r\n var flightHandlerCleanUp = self.$rootScope.$on(\r\n CustomEvents.StartUpFlagRetrieved,\r\n self.flightHandler.bind(this)\r\n );\r\n var createAskOpsRequestCleanUp = $rootScope.$on(\r\n \"createAskOpsRequest\",\r\n self.openCreateAskOpsModal.bind(this)\r\n );\r\n var ticketsCreationRequestCleanUp = $rootScope.$on(\r\n \"createSupportTicketRequest\",\r\n self.openCreateSupportTicketModal.bind(this)\r\n );\r\n var setContextAndLaunchBot = $rootScope.$on(\r\n \"SetContextAndLaunchBot\",\r\n self.setContextAndLaunchBot.bind(this)\r\n );\r\n var launchHelpSection = self.$rootScope.$on(\r\n FxpBroadcastedEvents.LaunchHelpSection,\r\n function (event, open: boolean) {\r\n self.toggleHelp(open);\r\n }\r\n );\r\n $scope.$on(\"$destroy\", function () {\r\n flightHandlerCleanUp();\r\n createAskOpsRequestCleanUp();\r\n ticketsCreationRequestCleanUp();\r\n setContextAndLaunchBot();\r\n launchHelpSection();\r\n });\r\n\r\n // Logging pageload metrics.\r\n self.fxpLoggerService.logPageLoadMetrics(performance.now() - startTime);\r\n\r\n // clearSearch\r\n self.$scope.clearSearch = self.clearSearch.bind(self);\r\n }\r\n\r\n clearSearch() {\r\n $(\"#HelpSearch_FormControl\").focus();\r\n }\r\n\r\n flightHandler(): void {\r\n this.$scope.fxpHelp = angular.copy(this.fxpHelpWithoutFlighting);\r\n //prevent undefined issue\r\n this.$rootScope.initialFlags = this.$rootScope.initialFlags || {};\r\n if (\r\n !(this.$rootScope.initialFlags && this.$rootScope.initialFlags.botEnabled)\r\n )\r\n this.removeBotLink();\r\n if (\r\n !(\r\n this.$rootScope.initialFlags &&\r\n this.$rootScope.initialFlags.askOpsEnabled\r\n )\r\n )\r\n this.removeAskOpslinks();\r\n }\r\n\r\n removeAskOpslinks(): void {\r\n let helpSections = this.$scope.fxpHelp.FxpHelpLinks;\r\n for (let i = 0; i < helpSections.length; i++) {\r\n helpSections[i].HelpLinks = helpSections[i].HelpLinks.filter(function (\r\n link\r\n ) {\r\n return !(\r\n link.EventName == FxpConstants.askOps.createLink ||\r\n link.Href == FxpConstants.askOps.viewLink\r\n );\r\n });\r\n }\r\n }\r\n\r\n removeBotLink(): void {\r\n let helpSections = this.$scope.fxpHelp.FxpHelpLinks;\r\n for (let i = 0; i < helpSections.length; i++) {\r\n helpSections[i].HelpLinks = helpSections[i].HelpLinks.filter(function (\r\n link\r\n ) {\r\n return link.EventName != CustomEvents.SkypeBotInit;\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * A function to update user help links based on the state.\r\n * @method Fxp.Controllers.HelpController.stateSpecificHelpLinks\r\n * this.stateSpecificHelpLinks();\r\n */\r\n stateSpecificHelpLinks() {\r\n let self = this;\r\n let isAdded = false;\r\n var linksWithoutAuthorStates = [];\r\n this.flightHandler();\r\n let helpSections = this.$scope.fxpHelp.FxpHelpLinks[1]; //Get Assisted helplinks\r\n for (let i = 0; i < helpSections.HelpLinks.length; i++) {\r\n helpSections.HelpLinks = helpSections.HelpLinks.filter(function (link) {\r\n //verify if the current state is present in AuthorStateNames in tenant configuration\r\n if (\r\n link.AuthorStateNames &&\r\n //verify if the current state is present in AuthorStateNames\r\n (link.AuthorStateNames.indexOf(self.$state.$current.name) > -1 ||\r\n //verify if the current state is unauthorized in which case get previous state\r\n (link.AuthorStateNames.indexOf(\r\n self.$rootScope.pageLoadMetrics.sourceRoute\r\n ) > -1 &&\r\n ApplicationConstants.ErrorStateNames.indexOf(\r\n self.$state.$current.name\r\n ) > -1))\r\n ) {\r\n isAdded = true;\r\n return link;\r\n }\r\n //if the current state is not present in tenant configuration get all the help links which are default or has no AuthorStateNames\r\n else if (\r\n !link.AuthorStateNames ||\r\n (link.AuthorStateNames && link.AuthorStateNames.length === 0) ||\r\n (link.AuthorStateNames &&\r\n link.AuthorStateNames.indexOf(\r\n ApplicationConstants.DefaultHelpLink\r\n ) > -1)\r\n ) {\r\n linksWithoutAuthorStates.push(link);\r\n }\r\n });\r\n }\r\n //in case no configured help link is shown, display the default help links\r\n if (!isAdded && linksWithoutAuthorStates) {\r\n helpSections.HelpLinks = linksWithoutAuthorStates;\r\n }\r\n }\r\n\r\n /**\r\n * An event handler whenever header is clicked.\r\n * @method Fxp.Controllers.HelpController.logFxpHelpEvent\r\n * @param {object} helpItem An object which is passed from the view.\r\n * @param {object} parent An object which is passed from the view.\r\n * @param {string} type A value which determines if its clicked from child help link\r\n * @example Example to use logFxpHelpEvent\r\n *
      Log Fxp Help
      ;\r\n */\r\n logFxpHelpEvent = function (helpItem, parent, view) {\r\n var self = this;\r\n\r\n var propBag = self.fxpLoggerService.createPropertyBag();\r\n propBag.addToBag(FxpConstants.metricConstants.HelpLinkParent, parent);\r\n propBag.addToBag(\r\n FxpConstants.metricConstants.HelpLinkChild,\r\n helpItem.title\r\n );\r\n if (view == \"FlyoutView\")\r\n propBag.addToBag(FxpConstants.metricConstants.HelpView, view);\r\n self.fxpLoggerService.logUserAction(\r\n `${self.sourceForTelemetry}.logFxpHelpEvent`,\r\n `${TelemetryConstants.FXP_TELEMETRY_BASE_NAME}.FxpHelpLinkAccessed`,\r\n \"Help link clicked by user\",\r\n propBag\r\n );\r\n };\r\n /**\r\n * An event handler whenever header is clicked.\r\n * @method Fxp.Controllers.HelpController.logHelpIconEvent\r\n * @param {boolean} isModalOpen a flag which states if modal is open/close\r\n * @example Example to use logHelpIconEvent\r\n *
      Log Fxp Help
      ;\r\n */\r\n logHelpIconEvent = function (isModalOpen) {\r\n if (isModalOpen) {\r\n var self = this;\r\n var propBag = self.fxpLoggerService.createPropertyBag();\r\n propBag.addToBag(FxpConstants.metricConstants.HelpIconClicked, \"Yes\");\r\n self.fxpLoggerService.logUserAction(\r\n `${self.sourceForTelemetry}.logHelpIconEvent`,\r\n `${TelemetryConstants.FXP_TELEMETRY_BASE_NAME}.FxpHelpIconClick`,\r\n \"Help icon clicked by user\",\r\n propBag\r\n );\r\n }\r\n };\r\n\r\n /**\r\n * An event handler called whenever pullFocus function is called on loading of Help page .\r\n * @method Fxp.Controllers.HelpController.findNextTabStop\r\n * @example Example to use findNextTabStop\r\n *
      Select all interactive elements present in partner app
      ;\r\n */\r\n findNextTabStop(): void {\r\n var focusableElements = $(\".partner-app\").find(\r\n \"input, button, select, textarea, a[href], details, div[tabindex]\"\r\n );\r\n var list = Array.prototype.filter.call(focusableElements, function (item) {\r\n return item.tabIndex == 0;\r\n });\r\n\r\n return list[0];\r\n }\r\n\r\n /**\r\n * An event handler whenever Help page is loaded.\r\n * @method Fxp.Controllers.HelpController.pullFocus\r\n * @example Example to use pullFocus\r\n *
      Pull Focus to first active element
      ;\r\n */\r\n pullFocus(): void {\r\n var self = this;\r\n if (\r\n self.fxpConfigurationService.FxpBaseConfiguration.FxpRouteCollection.indexOf(\r\n self.$state.current.name\r\n ) === -1\r\n ) {\r\n self.$timeout(function () {\r\n var activeElement: any = self.findNextTabStop();\r\n activeElement.focus();\r\n }, 100);\r\n }\r\n }\r\n\r\n /**\r\n * A function to open Create Ask Ops Modal.\r\n * @method Fxp.Controllers.HelpController.openCreateAskOpsModal\r\n * @example Example to use openCreateAskOpsModal\r\n * this.openCreateAskOpsModal();\r\n */\r\n openCreateAskOpsModal(event, requestType) {\r\n // Show popup.\r\n let self = this,\r\n options = CreateAskOpsModalConstant.ModalOptions;\r\n options.resolve = {\r\n defaultRequestType: function () {\r\n return requestType;\r\n },\r\n };\r\n self.$timeout(function () {\r\n self.$uibModal.open(options);\r\n }, 200);\r\n }\r\n\r\n /**\r\n * A function to open support ticket Modal.\r\n * @method Fxp.Controllers.HelpController.openCreateSupportTicketModal\r\n * @example Example to use openCreateSupportTicketModal\r\n * this.openCreateSupportTicketModal();\r\n */\r\n openCreateSupportTicketModal(event, requestType) {\r\n let self = this,\r\n options = CreateSupportTicketModalConstant.ModalOptions;\r\n options.resolve = {\r\n defaultRequestType: function () {\r\n return requestType;\r\n },\r\n };\r\n self.$timeout(function () {\r\n let modalInstance = self.$uibModal.open(options);\r\n modalInstance.opened.then(() => {\r\n self.$timeout(() => {\r\n let focusElement = $(\"#modal-close-button\");\r\n if (focusElement) {\r\n focusElement.focus();\r\n }\r\n }, 0);\r\n });\r\n }, 200);\r\n }\r\n\r\n setContextAndLaunchBot() {\r\n this.fxpContext.saveContext(\"activityKey\", \"Create Support Ticket\");\r\n this.fxpBroadCast.broadCast(\r\n FxpBroadcastedEvents.OnLaunchIrisBot,\r\n \"Launch Bot\"\r\n );\r\n }\r\n\r\n toggleHelp(open) {\r\n let self = this;\r\n if (\r\n self.$rootScope.initialFlags &&\r\n self.$rootScope.initialFlags.contextualHelpEnabled\r\n ) {\r\n if (open) {\r\n self.fxpLoggerService.renewSubCorrelationId();\r\n self.$rootScope.isHelpFlyoutPinned = false;\r\n self.resetNavigation();\r\n if (\r\n self.isCurrentLeftNavItemModified() ||\r\n !self.$scope.contextualHelp\r\n ) {\r\n self.showLoader(true);\r\n self.getArticles(self.$scope.defaultHelpArticleLimit, false);\r\n }\r\n self.$timeout(function () {\r\n $(\"#open-help-central\").focus();\r\n }, 1000);\r\n }\r\n self.$rootScope.isHelpOpen = open;\r\n }\r\n }\r\n\r\n resetNavigation() {\r\n let self = this;\r\n self.$scope.navigationCollection = [];\r\n self.$scope.currentNavigationIndex = 0;\r\n self.$scope.navigationCollection[0] = \"home\";\r\n self.$scope.searchValue = \"\";\r\n self.enableShowMoreLink();\r\n }\r\n\r\n enableShowMoreLink() {\r\n var self = this;\r\n if (self.$scope.contextualHelp && !self.$scope.searchValue)\r\n self.$scope.isContextualFilterRequired =\r\n self.$scope.contextualHelp[\r\n HelpArticleConstants.HelpArticleTitles.HELP_RELATED_TO_THIS_PAGE\r\n ].length >= self.$scope.defaultHelpArticleLimit;\r\n if (self.$scope.searchedHelp && self.$scope.searchValue)\r\n self.$scope.isSearchFilterRequired =\r\n self.$scope.searchedHelp.length >= self.$scope.defaultHelpArticleLimit;\r\n }\r\n\r\n /**\r\n * A function to get contextual help article.\r\n * @method Fxp.Controllers.HelpController.getArticles\r\n * @param {number} topArticles which is passed for howmany articles to get\r\n * @param {boolean} isShowAll a flag for which states if call for show more\r\n * @example Example to use getArticles\r\n * this.getArticles();\r\n */\r\n getArticles(topArticles, isShowAll) {\r\n var self = this,\r\n businessCapability,\r\n businessFunctions,\r\n route,\r\n searchString,\r\n startTime = performance.now(),\r\n propbag = self.fxpLoggerService.createPropertyBag();\r\n const source = `${self.sourceForTelemetry}.getArticles`;\r\n const contextualHelpFeature = new FeatureUsageEvent(\r\n `${TelemetryConstants.FXP_TELEMETRY_BASE_NAME}.ContextualHelp`,\r\n ActionType.User,\r\n \"ViewContexualHelp\",\r\n EventName.ButtonClick,\r\n ComponentType.Web\r\n );\r\n contextualHelpFeature.ActionStatus = ActionStatus.Succeeded;\r\n if (self.$scope.searchValue) {\r\n searchString = self.$scope.searchValue;\r\n } else {\r\n if (self.$rootScope.currentLeftNavItem) {\r\n //finding currentLeftNavItem is L0 or L1 based on parentId\r\n businessCapability = !self.$rootScope.currentLeftNavItem.parentId\r\n ? self.$rootScope.currentLeftNavItem.id\r\n : self.$rootScope.currentLeftNavItem.parentId;\r\n businessFunctions = self.$rootScope.currentLeftNavItem.parentId\r\n ? self.$rootScope.currentLeftNavItem.id\r\n : null;\r\n }\r\n if (self.$window.location.hash) {\r\n route = (self.$window.location.hash) ? self.$window.location.hash.substring(1) : null;\r\n }\r\n }\r\n self.helpCentralService\r\n .getContextualHelpArticles(\r\n topArticles,\r\n businessCapability,\r\n businessFunctions,\r\n searchString,\r\n route\r\n )\r\n .then(\r\n (response) => {\r\n if (searchString) {\r\n self.$scope.searchedHelp = response.data.result;\r\n } else {\r\n self.$scope.contextualHelp = {\r\n \"Help related to this page\": [],\r\n };\r\n response.data.result.map((item) => {\r\n if (!self.$scope.contextualHelp[item.categoryDisplayText]) {\r\n self.$scope.contextualHelp[item.categoryDisplayText] = [];\r\n }\r\n self.$scope.contextualHelp[item.categoryDisplayText].push(item);\r\n });\r\n }\r\n\r\n if (isShowAll) {\r\n self.hideShowMoreLink();\r\n } else {\r\n self.enableShowMoreLink();\r\n }\r\n self.showLoader(false);\r\n propbag.addToBag(\"BusinessCapability\", businessCapability);\r\n propbag.addToBag(\"BusinessFunctions\", businessFunctions);\r\n propbag.addToBag(\"Route\", route);\r\n propbag.addToBag(\"TopArticles\", topArticles);\r\n propbag.addToBag(\r\n \"TotalTime\",\r\n (performance.now() - startTime).toString()\r\n );\r\n self.fxpLoggerService.logEvent(\r\n source,\r\n `${TelemetryConstants.FXP_TELEMETRY_BASE_NAME}.GetContextualHelpArticles`,\r\n propbag\r\n );\r\n self.fxpLoggerService.logFeatureUsageEvent(\r\n source,\r\n contextualHelpFeature,\r\n propbag\r\n );\r\n },\r\n (error) => {\r\n contextualHelpFeature.ActionStatus = ActionStatus.Failed;\r\n self.showLoader(false);\r\n self.logError(\r\n error,\r\n self.$rootScope.fxpUIConstants.UIMessages\r\n .HelpCentralGetArticlesSvcError,\r\n ErrorCodes.GetContextualHelpArticles_Failure\r\n );\r\n self.fxpLoggerService.logFeatureUsageEvent(\r\n source,\r\n contextualHelpFeature,\r\n propbag\r\n );\r\n }\r\n );\r\n }\r\n\r\n getArticleData(articleId) {\r\n var self = this,\r\n startTime = performance.now(),\r\n propbag = self.fxpLoggerService.createPropertyBag();\r\n self.$scope.article = {};\r\n self.helpCentralService.getContextualHelpArticleContent(articleId).then(\r\n (response) => {\r\n self.$scope.article = response.data;\r\n if (self.$scope.article.articleContent) {\r\n self.$scope.article.articleContent =\r\n self.$scope.article.articleContent.replace(/ /g, \" \");\r\n }\r\n\r\n self.showLoader(false);\r\n propbag.addToBag(\"ArticleId\", articleId);\r\n propbag.addToBag(\r\n \"TotalTime\",\r\n (performance.now() - startTime).toString()\r\n );\r\n self.fxpLoggerService.logEvent(\r\n `${self.sourceForTelemetry}.getArticleData`,\r\n `${TelemetryConstants.FXP_TELEMETRY_BASE_NAME}.GetContextualHelpArticleContent`,\r\n propbag\r\n );\r\n self.saveViewCount(articleId);\r\n },\r\n (error) => {\r\n self.showLoader(false);\r\n self.logError(\r\n error,\r\n self.$rootScope.fxpUIConstants.UIMessages\r\n .HelpCentralGetArticleDataSvcError,\r\n ErrorCodes.GetArticleData_Failure\r\n );\r\n }\r\n );\r\n }\r\n\r\n /**\r\n * A function to navigate to article.\r\n * @method Fxp.Controllers.HelpController.navigateToArticle\r\n * @example Example to use navigateToArticle\r\n * this.navigateToArticle(1);\r\n */\r\n navigateToArticle(articleId) {\r\n let self = this;\r\n self.showLoader(true);\r\n self.getArticleData(articleId);\r\n // Add current article to Navigation collection. So that it can be visited again.\r\n self.$scope.currentNavigationIndex++;\r\n self.$scope.navigationCollection.splice(self.$scope.currentNavigationIndex);\r\n self.$scope.navigationCollection[self.$scope.currentNavigationIndex] =\r\n \"article?\" + articleId;\r\n }\r\n\r\n navigateToPreviousState() {\r\n let self = this;\r\n if (\r\n self.$scope.navigationCollection[\r\n self.$scope.currentNavigationIndex - 1\r\n ] == \"home\"\r\n ) {\r\n let selectedArticle = self.$scope.contextualHelp[\r\n HelpArticleConstants.HelpArticleTitles.HELP_RELATED_TO_THIS_PAGE\r\n ].filter(function (article) {\r\n let result = false;\r\n if (\r\n article.id ==\r\n self.$scope.navigationCollection[\r\n self.$scope.currentNavigationIndex\r\n ].split(\"?\")[1]\r\n ) {\r\n result = true;\r\n } else {\r\n article.pullFocus = \"false\";\r\n result = false;\r\n }\r\n return result;\r\n });\r\n if (selectedArticle.length) {\r\n selectedArticle[0].pullFocus = \"true\";\r\n } else {\r\n self.$scope.contextualHelp[\r\n HelpArticleConstants.HelpArticleTitles.HELP_RELATED_TO_THIS_PAGE\r\n ][0].pullFocus = \"true\";\r\n }\r\n } else if (\r\n self.$scope.navigationCollection[\r\n self.$scope.currentNavigationIndex - 1\r\n ].indexOf(\"article\") != -1\r\n ) {\r\n self.showLoader(true);\r\n self.getArticleData(\r\n self.$scope.navigationCollection[\r\n self.$scope.currentNavigationIndex - 1\r\n ].split(\"?\")[1]\r\n );\r\n } else {\r\n self.showLoader(true);\r\n self.$scope.searchValue =\r\n self.$scope.navigationCollection[\r\n self.$scope.currentNavigationIndex - 1\r\n ].split(\"?\")[1];\r\n self.getArticles(self.$scope.defaultHelpArticleLimit, false);\r\n }\r\n self.$scope.currentNavigationIndex--;\r\n }\r\n\r\n navigateToNextState() {\r\n let self = this;\r\n self.showLoader(true);\r\n self.$scope.currentNavigationIndex++;\r\n if (\r\n self.$scope.navigationCollection[\r\n self.$scope.currentNavigationIndex\r\n ].indexOf(\"article\") != -1\r\n ) {\r\n self.getArticleData(\r\n self.$scope.navigationCollection[\r\n self.$scope.currentNavigationIndex\r\n ].split(\"?\")[1]\r\n );\r\n } else if (\r\n self.$scope.navigationCollection[\r\n self.$scope.currentNavigationIndex\r\n ].indexOf(\"search\") != -1\r\n ) {\r\n self.searchHelpArticles(\r\n self.$scope.navigationCollection[\r\n self.$scope.currentNavigationIndex\r\n ].split(\"?\")[1]\r\n );\r\n }\r\n }\r\n\r\n navigateToHome() {\r\n let self = this;\r\n self.$scope.currentNavigationIndex = 0;\r\n self.$scope.navigationCollection.splice(self.$scope.currentNavigationIndex);\r\n self.$scope.navigationCollection[self.$scope.currentNavigationIndex] =\r\n \"home\";\r\n self.$scope.searchValue = \"\";\r\n if (self.isCurrentLeftNavItemModified()) {\r\n self.showLoader(true);\r\n self.getArticles(self.$scope.defaultHelpArticleLimit, false);\r\n }\r\n self.$scope.contextualHelp[\r\n HelpArticleConstants.HelpArticleTitles.HELP_RELATED_TO_THIS_PAGE\r\n ].forEach(function (article) {\r\n article.pullFocus = \"false\";\r\n });\r\n self.$scope.contextualHelp[\r\n HelpArticleConstants.HelpArticleTitles.HELP_RELATED_TO_THIS_PAGE\r\n ][0].pullFocus = \"true\";\r\n }\r\n\r\n showMoreContextualHelpLinks() {\r\n let self = this;\r\n self.showLoader(true);\r\n self.getArticles(0, true);\r\n }\r\n\r\n saveHelpFeedback(articleId, isHelpful) {\r\n var self = this,\r\n startTime = performance.now(),\r\n propbag = self.fxpLoggerService.createPropertyBag();\r\n self.showLoader(true);\r\n var feedback = {\r\n articleId: articleId,\r\n IsHelpful: isHelpful,\r\n };\r\n self.helpCentralService.saveArticleFeedback(feedback).then(\r\n (response) => {\r\n propbag.addToBag(\"ArticleId\", articleId);\r\n propbag.addToBag(\"IsHelpFul\", isHelpful);\r\n propbag.addToBag(\r\n \"TotalTime\",\r\n (performance.now() - startTime).toString()\r\n );\r\n self.fxpLoggerService.logEvent(\r\n `${self.sourceForTelemetry}.saveHelpFeedback`,\r\n `${TelemetryConstants.FXP_TELEMETRY_BASE_NAME}.SaveHelpFeedback`,\r\n propbag\r\n );\r\n self.$scope.feedbackId = response.data;\r\n self.showLoader(false);\r\n },\r\n (error) => {\r\n self.showLoader(false);\r\n self.logError(\r\n error,\r\n self.$rootScope.fxpUIConstants.UIMessages\r\n .HelpCentralSaveArticleFeedbackSvcError,\r\n ErrorCodes.SaveHelpFeedback_Failure\r\n );\r\n }\r\n );\r\n }\r\n\r\n hideShowMoreLink() {\r\n var self = this;\r\n // hide \"show more\" link in contextual help\r\n if (self.$scope.contextualHelp && !self.$scope.searchValue) {\r\n self.$scope.isContextualFilterRequired = false;\r\n self.$scope.contextualHelp[\r\n HelpArticleConstants.HelpArticleTitles.HELP_RELATED_TO_THIS_PAGE\r\n ].forEach(function (article) {\r\n article.pullFocus = \"false\";\r\n });\r\n if (\r\n self.$scope.contextualHelp[\r\n HelpArticleConstants.HelpArticleTitles.HELP_RELATED_TO_THIS_PAGE\r\n ][self.$scope.defaultHelpArticleLimit]\r\n )\r\n self.$scope.contextualHelp[\r\n HelpArticleConstants.HelpArticleTitles.HELP_RELATED_TO_THIS_PAGE\r\n ][self.$scope.defaultHelpArticleLimit].pullFocus = \"true\";\r\n else\r\n self.$scope.contextualHelp[\r\n HelpArticleConstants.HelpArticleTitles.HELP_RELATED_TO_THIS_PAGE\r\n ][\r\n self.$scope.contextualHelp[\r\n HelpArticleConstants.HelpArticleTitles.HELP_RELATED_TO_THIS_PAGE\r\n ].length - 1\r\n ].pullFocus = \"true\";\r\n }\r\n // hide \"show more\" link in search\r\n if (self.$scope.searchedHelp && self.$scope.searchValue) {\r\n self.$scope.isSearchFilterRequired = false;\r\n self.$scope.searchedHelp.forEach(function (article) {\r\n article.pullFocus = \"false\";\r\n });\r\n if (self.$scope.searchedHelp[self.$scope.defaultHelpArticleLimit])\r\n self.$scope.searchedHelp[\r\n self.$scope.defaultHelpArticleLimit\r\n ].pullFocus = \"true\";\r\n else\r\n self.$scope.searchedHelp[\r\n self.$scope.searchedHelp.length - 1\r\n ].pullFocus = \"true\";\r\n }\r\n }\r\n\r\n expandArticleImage(source) {\r\n // Show modal.\r\n let self = this,\r\n options = HelpArticleImageModalConstant.ModalOptions;\r\n options.resolve = {\r\n source: function () {\r\n return source;\r\n },\r\n };\r\n self.$timeout(function () {\r\n let modalInstance = self.$uibModal.open(options);\r\n modalInstance.opened.then(() => {\r\n self.$timeout(function () {\r\n var focusElement = $(\"#btnImageCloseModal\");\r\n if (focusElement) focusElement.focus();\r\n }, 0);\r\n });\r\n }, 200);\r\n }\r\n\r\n /**\r\n * A method called when search suggestions are to be provided.\r\n * @method Fxp.Controllers.HelpController.searchSuggestions\r\n * @param {string} value is a string on which suggestion will be based\r\n * @example Example to use searchSuggestions\r\n * HelpController.searchSuggestions('new')\r\n */\r\n searchSuggestions(searchPhrase) {\r\n let self = this;\r\n return self.helpCentralService.getSuggestions(searchPhrase).then(\r\n (response) => {\r\n return response.data;\r\n },\r\n (reject) => {\r\n self.logError(\r\n reject,\r\n self.$rootScope.fxpUIConstants.UIMessages\r\n .HelpCentralGetSuggestionsError,\r\n ErrorCodes.SearchSuggestions_Failure\r\n );\r\n }\r\n );\r\n }\r\n\r\n /**\r\n * A method called when help article are to be searched\r\n * @method Fxp.Controllers.HelpController.searchHelpArticles\r\n * @param {string} searchString is a string to be searched\r\n * @example Example to use searchHelpArticles\r\n * HelpController.searchHelpArticles('new')\r\n */\r\n searchHelpArticles(searchString) {\r\n let self = this;\r\n self.showLoader(true);\r\n self.$scope.searchValue = searchString;\r\n self.getArticles(self.$scope.defaultHelpArticleLimit, false);\r\n\r\n // Add current search to Navigation collection. So that it can be visited again.\r\n self.$scope.currentNavigationIndex++;\r\n self.$scope.navigationCollection.splice(self.$scope.currentNavigationIndex);\r\n self.$scope.navigationCollection[self.$scope.currentNavigationIndex] =\r\n \"search?\" + searchString;\r\n }\r\n\r\n saveViewCount(articleId) {\r\n var self = this,\r\n startTime = performance.now(),\r\n propbag = self.fxpLoggerService.createPropertyBag();\r\n self.helpCentralService.saveArticleViewCount(articleId).then(\r\n (response) => {\r\n propbag.addToBag(\"ArticleId\", articleId);\r\n propbag.addToBag(\r\n \"TotalTime\",\r\n (performance.now() - startTime).toString()\r\n );\r\n self.fxpLoggerService.logEvent(\r\n `${self.sourceForTelemetry}.saveViewCount`,\r\n `${TelemetryConstants.FXP_TELEMETRY_BASE_NAME}.SaveHelpFeedback`,\r\n propbag\r\n );\r\n },\r\n (error) => {\r\n self.logError(\r\n error,\r\n self.$rootScope.fxpUIConstants.UIMessages\r\n .HelpCentralSaveArticleViewCountSvcError,\r\n ErrorCodes.SaveViewCount_Failure\r\n );\r\n }\r\n );\r\n }\r\n\r\n /**\r\n * A method called when search suggestion is selected\r\n * @method Fxp.Controllers.HelpController.onSearchKeyDown\r\n * @param {any} item is a selected object\r\n * @example Example to use onSearchKeyDown\r\n * HelpController.onSearchKeyDown(event, 'new')\r\n */\r\n onSearchKeyDown(event, searchString) {\r\n var self = this;\r\n if (event.keyCode == 13) {\r\n self.searchHelpArticles(searchString);\r\n }\r\n }\r\n\r\n /**\r\n * A method called when search suggestion is selected\r\n * @method Fxp.Controllers.HelpController.onSearchSuggestionSelect\r\n * @param {any} item is a selected object\r\n * @example Example to use onSearchSuggestionSelect\r\n * HelpController.onSearchSuggestionSelect(item)\r\n */\r\n onSearchSuggestionSelect(item) {\r\n var self = this;\r\n self.searchHelpArticles(item);\r\n }\r\n\r\n /**\r\n * A method to log error\r\n * @method Fxp.Controllers.HelpController.logError\r\n * @param {any} error is a error object\r\n * @example Example to use sortObject\r\n * HelpController.logError(error)\r\n */\r\n logError(error, message, code): void {\r\n var self = this;\r\n var propbag = self.fxpLoggerService.createPropertyBag();\r\n propbag.addToBag(FxpConstants.metricConstants.Status, error.status);\r\n propbag.addToBag(FxpConstants.metricConstants.StatusText, error.statusText);\r\n self.fxpLoggerService.logError(\r\n `${this.sourceForTelemetry}.LogError`,\r\n message.ErrorMessageTitle,\r\n code,\r\n null,\r\n propbag\r\n );\r\n }\r\n\r\n onPinHelpFlyoutClick() {\r\n this.$rootScope.isHelpFlyoutPinned = !this.$rootScope.isHelpFlyoutPinned;\r\n }\r\n\r\n /**\r\n * A method to show hide loader in help flyout\r\n * @example Example to use showLoader\r\n * HelpController.showLoader(true)\r\n */\r\n showLoader(status) {\r\n var self = this;\r\n self.$scope.showHelpLoader = status;\r\n }\r\n\r\n navigateToHelpCentral() {\r\n var self = this;\r\n self.$window.open(self.$scope.helpCentralUrl, \"_blank\");\r\n }\r\n\r\n isCurrentLeftNavItemModified() {\r\n var self = this,\r\n isLeftNavModified;\r\n isLeftNavModified = !angular.equals(\r\n self.leftNavItem,\r\n self.$rootScope.currentLeftNavItem\r\n );\r\n if (isLeftNavModified) {\r\n self.leftNavItem = angular.copy(self.$rootScope.currentLeftNavItem);\r\n }\r\n return isLeftNavModified;\r\n }\r\n\r\n templateCheck(name) {\r\n let self = this,\r\n result = false;\r\n if (\r\n self.$scope.initialFlags.contextualHelpEnabled &&\r\n self.$scope.navigationCollection[\r\n self.$scope.currentNavigationIndex\r\n ].indexOf(name) != -1\r\n ) {\r\n result = true;\r\n }\r\n return result;\r\n }\r\n\r\n setFocusToNextElement(event) {\r\n var focusElement = $(event.target)[0];\r\n if (event.shiftKey && event.keyCode == 9) {\r\n if (focusElement.id === \"help-back-button\") {\r\n if ($(\"#help-gotop-button\").is(\":visible\")) {\r\n this.setFocus(\"#help-gotop-button\");\r\n } else {\r\n this.setFocus(\"#view-helpcentral-button\");\r\n }\r\n }\r\n } else if (event.keyCode == 9) {\r\n if (focusElement.id === \"view-helpcentral-button\") {\r\n if (!$(\"#help-gotop-button\").is(\":visible\")) {\r\n this.setFocus(\"#help-back-button\");\r\n }\r\n } else if (focusElement.id === \"help-gotop-button\") {\r\n this.setFocus(\"#help-back-button\");\r\n }\r\n }\r\n }\r\n\r\n private setFocus(controlId) {\r\n setTimeout(() => {\r\n $(controlId).focus();\r\n }, 0);\r\n return;\r\n }\r\n}\r\n","/**\r\n * @application Fxp\r\n */\r\n/**\r\n * @module Fxp.Controllers\r\n */\r\ndeclare type IStateService = any;\r\nimport { IActOnBehalfOfControllerScope } from \"../interfaces/IActOnBehalfOfControllerScope\";\r\nimport { ILogger } from \"../interfaces/ILogger\";\r\nimport { FxpMessageService } from \"../../app/banner/FxpMessageService\";\r\nimport { FxpConstants, ApplicationConstants } from \"../common/ApplicationConstants\";\r\nimport { OBOUserService } from \"../services/OBOUserService\";\r\nimport { IFxpContext } from \"../interfaces/IFxpContext\";\r\nimport { IRootScope } from \"../interfaces/IRootScope\";\r\nimport { UserProfileService } from \"../services/userProfileService\";\r\nimport { UserInfoService } from \"../services/UserInfoService\";\r\nimport { LogPropertyBag } from \"../telemetry/LogPropertyBag\";\r\nimport { TelemetryContext } from \"../telemetry/telemetrycontext\";\r\nimport { FxpConfigurationService } from \"../services/FxpConfiguration\";\r\nimport { FxpGlobalStoreService } from \"../services/fxp.global.store.service\";\r\nimport { CommonUtils } from \"../utils/CommonUtils\";\r\nimport { ILeftNavControllerScope } from \"../interfaces/ILeftNavControllerScope\";\r\nimport { FxpRouteService } from \"../services/FxpRouteService\";\r\nimport { SettingsServiceProvider } from \"../provider/SettingsServiceProvider\";\r\nimport { FxpContext } from \"../context/FxpContext\";\r\nimport { SettingsType } from \"../common/SettingsType\";\r\nimport { Resiliency } from \"../resiliency/FxpResiliency\";\r\nimport { ILeftNavPersonalizationControllerScope } from \"../interfaces/ILeftNavPersonalizationControllerScope\";\r\nimport { NotificationStore } from \"../services/NotificationStore\";\r\nimport { PersonalizationService } from \"../services/PersonalizationService\";\r\nimport { FxpBroadcastedEvents } from \"../services/FxpBroadcastedEvents\";\r\nimport { HideLoader, HideSpecificLoader, ShowLoader, ShowSpecificLoader } from \"../../app/loader/loader.actions\";\r\nimport { UI_LOADER_NAMES } from \"../../app/loader/UILoader.constants\";\r\nimport { ErrorCodes } from \"../constants/errorCodes\";\r\nimport { ErrorSeverityLevel } from \"../telemetry/ErrorSeverityLevel\";\r\nimport { TelemetryConstants } from \"../telemetry/TelemetryConst\";\r\n\r\n/**\r\n* A main controller for FxpApp module. This is the controller having basic models and events.\r\n* @class Fxp.Controllers.LeftNavPersonalizationController\r\n* @classdesc A Left Navigation Personlization controller of FxpApp module\r\n* @example \r\n* //To Use AppController\r\n* angular.module('FxPApp').controller('LeftNavPersonalizationController', ['AnyDependency']);\r\n* function LeftNavPersonalizationController(AnyDependency){ AnyDependency.doSomething(); }\r\n*/\r\nexport class LeftNavPersonalizationController {\r\n\tprivate $rootScope: IRootScope;\r\n\tprivate $scope: ILeftNavPersonalizationControllerScope;\r\n\tprivate $state: IStateService;\r\n\tprivate fxpLogger: ILogger;\r\n\tprivate fxpConstants: FxpConstants;\r\n\tprivate personalizationService: PersonalizationService;\r\n\tprivate fxpMessage: FxpMessageService;\r\n\tprivate personalizedUserNav: any;\r\n\tprivate userNavPersonalizationList: any;\r\n\tprivate globalNavMasterList: any;\r\n\tprivate parallelRequsetCounter: number;\r\n\tprivate userInfo: any;\r\n\tprivate userProfileService: UserProfileService;\r\n\tprivate timeout: any;\r\n\tprivate pageLoadStartTime: number;\r\n\tprivate $window: angular.IWindowService;\r\n\tprivate fxpRouteService: FxpRouteService;\r\n\tprivate isStateChanged: boolean;\r\n\tprivate toState: any;\r\n\tprivate toParams: any;\r\n\tprivate notificationStore: NotificationStore;\r\n\tprivate fxpConfigurationService: FxpConfigurationService;\r\n\tprivate sourceForTelemetry = `${TelemetryConstants.FXP_TELEMETRY_BASE_NAME}.LeftNavPersonalizationController`;\r\n\r\n\tconstructor($rootScope: IRootScope, $scope: ILeftNavPersonalizationControllerScope, $state: IStateService, $timeout, fxpLoggerService: ILogger,\r\n\t\tprivate fxpGlobalStoreService: FxpGlobalStoreService, fxpMessage: FxpMessageService, personalizationService: PersonalizationService, userProfileService: UserProfileService, $window: angular.IWindowService, fxpRouteService: FxpRouteService, notificationStore: NotificationStore, fxpConfigurationService: FxpConfigurationService) {\r\n\t\tthis.pageLoadStartTime = performance.now();\r\n\t\tthis.$rootScope = $rootScope;\r\n\t\tthis.$rootScope.showLoader = true;\r\n\t\tthis.$scope = $scope;\r\n\t\tthis.$state = $state;\r\n\t\tthis.timeout = $timeout;\r\n\t\tthis.fxpLogger = fxpLoggerService;\r\n\t\tthis.notificationStore = notificationStore;\r\n\t\tthis.fxpConfigurationService = fxpConfigurationService;\r\n\t\tthis.$window = $window;\r\n\t\tthis.fxpRouteService = fxpRouteService;\r\n\t\tthis.fxpConstants = FxpConstants;\r\n\t\tthis.userNavPersonalizationList = [];\r\n\t\tthis.globalNavMasterList = [];\r\n\t\tthis.fxpMessage = fxpMessage;\r\n\t\tthis.personalizationService = personalizationService;\r\n\t\tthis.$scope.personalizationUser = this.getUserPersonalization();\r\n\t\tif (CommonUtils.isNullOrEmpty(this.$scope.personalizationUser)) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tthis.$scope.adminUIStrings = this.$rootScope.fxpUIConstants.UIStrings.AdminUIStrings;\r\n\t\tthis.$scope.buttonStrings = this.$rootScope.fxpUIConstants.UIStrings.ButtonStrings;\r\n\t\tthis.personalizedUserNav = { \"AddedItems\": [], \"RemovedItems\": [] };\r\n\t\tthis.isStateChanged = false;\r\n\t\tthis.$scope.selectedGlobalLeftNavItems = this.selectedGlobalLeftNavItems.bind(this);\r\n\t\tthis.$scope.addToUserNavPersonalizationList = this.addToUserNavPersonalizationList.bind(this);\r\n\t\tthis.$scope.removeUserNavPresonalization = this.removeUserNavPresonalization.bind(this);\r\n\t\tthis.$scope.submitUserNavPresonalization = this.submitUserNavPresonalization.bind(this);\r\n\t\tthis.$scope.selectedUserNavItems = this.selectedUserNavItems.bind(this);\r\n\t\tthis.$scope.navigateToUserLookup = this.navigateToUserLookup.bind(this);\r\n\t\tthis.$scope.showConfirmPopup = this.showConfirmPopup.bind(this);\r\n\t\tthis.$scope.hideConfirmPopup = this.hideConfirmPopup.bind(this);\r\n\t\tthis.$scope.pullFocusToElement = this.pullFocusToElement.bind(this);\r\n\t\tthis.parallelRequsetCounter = 0;\r\n\t\tthis.userInfo = {};\r\n\t\tthis.userProfileService = userProfileService;\r\n\t\tthis.fxpGlobalStoreService.DispatchGlobalAction(\"Platform\", ShowLoader({loadingText: \"Loading...\"}));\r\n\t\tvar self = this;\r\n\t\tself.userProfileService.getBasicUserProfile(false).then(function (response) {\r\n\t\t\tself.userInfo = response;\r\n\t\t\tself.getGlobalNavMasterList();\r\n\t\t\tself.getUserNavList();\r\n\t\t}, function (exception) {\r\n\t\t\tself.showErrorMsgNavigateToUserLookUp(exception, self.$rootScope.fxpUIConstants.UIMessages.GeneralExceptionError);\r\n\t\t});\r\n\t\tself.$scope.$on('$stateChangeStart', function (event, toState, toParams, fromState, fromParams) {\r\n\t\t\tif (!CommonUtils.isNullOrEmpty(self.personalizedUserNav.AddedItems) || !CommonUtils.isNullOrEmpty(self.personalizedUserNav.RemovedItems)) {\r\n\t\t\t\tself.$scope.displayPopup = true;\r\n\t\t\t\tself.isStateChanged = true;\r\n\t\t\t\tself.toState = toState;\r\n\t\t\t\tself.toParams = toParams;\r\n\t\t\t\tevent.preventDefault();\r\n\t\t\t\tsetTimeout(function () { CommonUtils.pullFocusToElement('role-group-popup'); }, 100);\r\n\t\t\t}\r\n\t\t});\r\n\t\tself.$window.onbeforeunload = function (event) {\r\n\t\t\tif (!CommonUtils.isNullOrEmpty(self.personalizedUserNav.AddedItems) || !CommonUtils.isNullOrEmpty(self.personalizedUserNav.RemovedItems)) {\r\n\t\t\t\treturn \"\";\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t* A method to Get the Pesanalization User Informantion\r\n\t* @method Fxp.Controllers.LeftNavPersonalizationController.getUserPersonalization\r\n\t* @example Example to use getUserPersonalization\r\n\t* LeftNavPersonalizationController.getUserPersonalization()\r\n\t*/\r\n\tgetUserPersonalization(): any {\r\n\t\tlet self = this;\r\n\t\tlet persistedSelectedUser = self.personalizationService.getPersistedPersonalization();\r\n\t\tlet selectedUser = null;\r\n\t\tif (!CommonUtils.isNullOrEmpty(persistedSelectedUser)) {\r\n\t\t\tselectedUser = persistedSelectedUser;\r\n\t\t\tself.personalizationService.removePersistedUserPersonalization();\r\n\t\t} else {\r\n\t\t\t//user is null then navigate to user lookup state\r\n\t\t\tself.navigateToUserLookup();\r\n\t\t}\r\n\t\treturn selectedUser;\r\n\t}\r\n\r\n\t/**\r\n\t* A method to Get the GlobalNavMasterList for FxpAdmin User\r\n\t* @method Fxp.Controllers.LeftNavPersonalizationController.getGlobalNavMasterList\r\n\t* @example Example to use getGlobalNavMasterList\r\n\t* LeftNavPersonalizationController.getGlobalNavMasterList()\r\n\t*/\r\n\tgetGlobalNavMasterList(): void {\r\n\t\tlet self = this;\r\n\t\tself.parallelRequsetCounter++;\r\n\t\tself.personalizationService.getMasterLeftNavItems().then(function (response) {\r\n\t\t\tif (!CommonUtils.isNullOrEmpty(response.data.result)) {\r\n\t\t\t\tself.globalNavMasterList = response.data.result;\r\n\t\t\t\tself.fxpLogger.logInformation(`${self.sourceForTelemetry}.getGlobalNavMasterList`, `${TelemetryConstants.FXP_TELEMETRY_BASE_NAME}.GetMasterLeftNavItemsSuccess`);\r\n\t\t\t\tself.parallelRequsetCounter--;\r\n\t\t\t\tif (self.parallelRequsetCounter == 0) {\r\n\t\t\t\t\tself.mergeGlobalAndUserPreferenceNavigationList();\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}, function (exception) {\r\n\t\t\tself.showErrorMsgNavigateToUserLookUp(exception, self.$rootScope.fxpUIConstants.UIMessages.GeneralExceptionError);\r\n\t\t});\r\n\t}\r\n\r\n\t/**\r\n\t* A method to navigate To UserLookup screen\r\n\t* @method Fxp.Controllers.LeftNavPersonalizationController.navigateToUserLookup\r\n\t* @example Example to use navigateToUserLookup\r\n\t* LeftNavPersonalizationController.navigateToUserLookup()\r\n\t*/\r\n\tnavigateToUserLookup(): void {\r\n\t\tvar self = this;\r\n\t\tself.personalizedUserNav = { \"AddedItems\": [], \"RemovedItems\": [] };\r\n\t\tif (self.isStateChanged) {\r\n\t\t\tself.fxpRouteService.navigatetoSpecificState(self.toState.name, self.toParams);\r\n\t\t} else {\r\n\t\t\tself.personalizationService.removePersistedUserPersonalization();\r\n\t\t\tself.fxpRouteService.navigatetoSpecificState(\"UserLookupPersonalization\");\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t* A method to Get the UserNavList\r\n\t* @method Fxp.Controllers.LeftNavPersonalizationController.getUserNavList\r\n\t* @example Example to use getUserNavList\r\n\t* LeftNavPersonalizationController.getUserNavList()\r\n\t*/\r\n\tgetUserNavList(): void {\r\n\t\tlet self = this;\r\n\t\tself.parallelRequsetCounter++;\r\n\t\tlet userAlias = self.$scope.personalizationUser.Alias;\r\n\t\tlet roleGroupId = self.$scope.personalizationUser.RoleGroupID.toString();\r\n\t\tlet userRoleId = self.$scope.personalizationUser.BusinessRoleId.toString();\r\n\t\tself.personalizationService.getPersonalizedNavItems(userAlias, roleGroupId, userRoleId)\r\n\t\t\t.then(function (response) {\r\n\t\t\t\tself.fxpGlobalStoreService.DispatchGlobalAction(\"Platform\", HideLoader({}));\r\n\t\t\t\tif (!CommonUtils.isNullOrEmpty(response.data.result)) {\r\n\t\t\t\t\tself.fxpLogger.logInformation(`${self.sourceForTelemetry}.getUserNavList`,\r\n\t\t\t\t\t\t`${TelemetryConstants.FXP_TELEMETRY_BASE_NAME}.GetPersonalizedNavItemsSuccess`);\r\n\t\t\t\t\tself.userNavPersonalizationList = response.data.result;\r\n\t\t\t\t\tself.parallelRequsetCounter--;\r\n\t\t\t\t\tif (self.parallelRequsetCounter == 0) {\r\n\t\t\t\t\t\tself.mergeGlobalAndUserPreferenceNavigationList();\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t},\r\n\t\t\tfunction (exception) {\r\n\t\t\t\tself.showErrorMsgNavigateToUserLookUp(exception, self.$rootScope.fxpUIConstants.UIMessages.GeneralExceptionError);\r\n\t\t\t});\r\n\t}\r\n\r\n\t/**\r\n\t* A method used to merge Global And User Preference Navigation List\r\n\t* @method Fxp.Controllers.LeftNavPersonalizationController.mergeGlobalAndUserPreferenceNavigationList\r\n\t* @example Example to use mergeGlobalAndUserPreferenceNavigationList\r\n\t* LeftNavPersonalizationController.mergeGlobalAndUserPreferenceNavigationList()\r\n\t*/\r\n\tmergeGlobalAndUserPreferenceNavigationList(): void {\r\n\t\tlet self = this;\r\n\t\tself.$scope.navigationList = angular.copy(self.globalNavMasterList);\r\n\t\tconsole.log(self.$scope.navigationList);\r\n\t\tlet userNavlength = self.userNavPersonalizationList.length;\r\n\t\tfor (let i = 0; i < userNavlength; i++) {\r\n\t\t\tlet globalNavIndex = self.getIndexOfObject(self.$scope.navigationList, \"id\", self.userNavPersonalizationList[i].id);\r\n\t\t\t//if applicableDevice of any item in userNavPersonalizationList is mobile then no need to add into the User Navigation List\r\n\t\t\tif (globalNavIndex > -1 && self.userNavPersonalizationList[i].applicableDevice != FxpConstants.applicableDevice.mobile) {\r\n\t\t\t\tself.$scope.navigationList[globalNavIndex].isPersonaDefault = self.userNavPersonalizationList[i].isPersonaDefault;\r\n\t\t\t\tself.$scope.navigationList[globalNavIndex].isUserRoleDefault = self.userNavPersonalizationList[i].isUserRoleDefault;\r\n\t\t\t\tself.$scope.navigationList[globalNavIndex].isUserLeftNavItem = true;\r\n\t\t\t\tif (self.userNavPersonalizationList[i].hasChildren && self.userNavPersonalizationList[i].children != null) {\r\n\t\t\t\t\tlet userChildNavLength = self.userNavPersonalizationList[i].children.length;\r\n\t\t\t\t\tfor (let j = 0; j < userChildNavLength; j++) {\r\n\t\t\t\t\t\tlet globalNavChildIndex = self.getIndexOfObject(self.$scope.navigationList[globalNavIndex].children, \"id\", self.userNavPersonalizationList[i].children[j].id);\r\n\t\t\t\t\t\tif (globalNavChildIndex > -1) {\r\n\t\t\t\t\t\t\tself.$scope.navigationList[globalNavIndex].children[globalNavChildIndex].isPersonaDefault = self.userNavPersonalizationList[i].children[j].isPersonaDefault;\r\n\t\t\t\t\t\t\tself.$scope.navigationList[globalNavIndex].children[globalNavChildIndex].isUserRoleDefault = self.userNavPersonalizationList[i].children[j].isUserRoleDefault;\r\n\t\t\t\t\t\t\tself.$scope.navigationList[globalNavIndex].children[globalNavChildIndex].isUserLeftNavItem = true;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\tself.setFocusToGlobalNavMasterItem(true);\r\n\t\tself.logPageLoadMetricsForCurrentPage();\r\n\t}\r\n\r\n\t/**\r\n\t* A method to use log Error And NavigateToUserSelectionPage\r\n\t* @method Fxp.Controllers.LeftNavPersonalizationController.showErrorMsgNavigateToUserLookUp\r\n\t* @example Example to use showErrorMsgNavigateToUserLookUp\r\n\t* LeftNavPersonalizationController.showErrorMsgNavigateToUserLookUp()\r\n\t*/\r\n\tshowErrorMsgNavigateToUserLookUp(exception, exceptionMessage): void {\r\n\t\tvar self = this;\r\n\t\tself.navigateToUserLookup();\r\n\t\tself.fxpMessage.addMessage(exceptionMessage.ErrorMessage, FxpConstants.messageType.error);\r\n\t\tif (exception == null) {\r\n\t\t\texception = {};\r\n\t\t\texception.message = exceptionMessage.ErrorMessage;\r\n\t\t}\r\n\t\tvar propbag = self.fxpLogger.createPropertyBag();\r\n\t\tpropbag.addToBag(\"exception\", exception.message);\r\n\t\tpropbag.addToBag(\"personalizationUser\", self.$scope.personalizationUser.Alias);\r\n\t\tself.fxpLogger.logError(`${self.sourceForTelemetry}.showErrorMsgNavigateToUserLookUp`, \r\n\t\t\t\t\t\t\t\texceptionMessage.ErrorMessageTitle,\r\n\t\t\t\t\t\t\t\tErrorCodes.ShowErrorMsgNavigateToUserLookUp,\r\n\t\t\t\t\t\t\t\tnull,\r\n\t\t\t\t\t\t\t\tpropbag,\r\n\t\t\t\t\t\t\t\tnull,\r\n\t\t\t\t\t\t\t\tnull,\r\n\t\t\t\t\t\t\t\tErrorSeverityLevel.Medium);\r\n\t}\r\n\r\n\r\n\t/**\r\n\t* A method to use Add/Remove Selected Global Left Nav Items. \r\n\t* @method Fxp.Controllers.LeftNavPersonalizationController.selectedGlobalLeftNavItems\r\n\t* @example Example to use selectedGlobalLeftNavItems\r\n\t* LeftNavPersonalizationController.selectedGlobalLeftNavItems(parentItem,childItem)\r\n\t*/\r\n\tselectedGlobalLeftNavItems(parentItem, childItem): void {\r\n\t\tlet self = this;\r\n\t\tlet isRemoveParent = false;\r\n\t\tif (CommonUtils.isNullOrEmpty(childItem)) {\r\n\t\t\tangular.forEach(parentItem.children, function (item) {\r\n\t\t\t\titem.isChildSelected = parentItem.isParentSelected;\r\n\t\t\t});\r\n\t\t} else {\r\n\t\t\tparentItem.isParentSelected = parentItem.children.every(function (item) { return item.isChildSelected; });\r\n\t\t}\r\n\t\tself.$scope.isAddPersonalizeAllow = self.isItemAllowToAdd();\r\n\t}\r\n\r\n\t/**\r\n\t* A method to use Enable/Disable Add Button. \r\n\t* @method Fxp.Controllers.LeftNavPersonalizationController.isItemAllowToAdd\r\n\t* @example Example to use isItemAllowToAdd\r\n\t* LeftNavPersonalizationController.isItemAllowToAdd()\r\n\t*/\r\n\tisItemAllowToAdd(): boolean {\r\n\t\tvar self = this;\r\n\t\tvar flag = false;\r\n\t\tvar navigationListLength = self.$scope.navigationList.length;\r\n\t\tfor (let i = 0; i < navigationListLength; i++) {\r\n\t\t\tvar parentItem = self.$scope.navigationList[i];\r\n\t\t\t// check if parent items are selected.\r\n\t\t\tif (parentItem.isParentSelected) {\r\n\t\t\t\tflag = true;\r\n\t\t\t\tbreak;\r\n\t\t\t} else {\r\n\t\t\t\t// check if child items are selected\r\n\t\t\t\tif (parentItem.hasChildren && parentItem.children != null) {\r\n\t\t\t\t\tvar parentItemChildrenLength = parentItem.children.length;\r\n\t\t\t\t\tfor (var j = 0; j < parentItemChildrenLength; j++) {\r\n\t\t\t\t\t\tvar childItem = parentItem.children[j];\r\n\t\t\t\t\t\tif (childItem.isChildSelected) {\r\n\t\t\t\t\t\t\tflag = true;\r\n\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn flag;\r\n\t}\r\n\r\n\t/**\r\n\t* A method to use Add selected Global Left Nav Items to User Navigation List\r\n\t* @method Fxp.Controllers.LeftNavPersonalizationController.selectedGlobalLeftNavItems\r\n\t* @example Example to use addToUserNavPersonalizationList\r\n\t* LeftNavPersonalizationController.addToUserNavPersonalizationList()\r\n\t*/\r\n\taddToUserNavPersonalizationList(): void {\r\n\t\tvar self = this;\r\n\t\tlet focusIndex = false;\r\n\t\tlet isFocusedElement = false;\r\n\t\t// sorting navigation list object\r\n\t\tself.sortObject(self.$scope.navigationList, \"sortOrder\");\r\n\t\tlet length = self.$scope.navigationList.length;\r\n\t\tlet isParentToAdd = false;\r\n\t\tfor (let i = 0; i < length; i++) {\r\n\t\t\tif (self.$scope.navigationList[i].hasChildren && self.$scope.navigationList[i].children != null) {\r\n\t\t\t\tlet childLength = self.$scope.navigationList[i].children.length;\r\n\t\t\t\tlet childNav = self.$scope.navigationList[i].children;\r\n\t\t\t\tisParentToAdd = false;\r\n\t\t\t\tfor (let j = 0; j < childLength; j++) {\r\n\t\t\t\t\tif ((childNav[j].isChildSelected) && (!angular.isDefined(childNav[j].isUserLeftNavItem))) {\r\n\t\t\t\t\t\tchildNav[j].isPersonaDefault = false;\r\n\t\t\t\t\t\tchildNav[j].isUserLeftNavItem = true;\r\n\t\t\t\t\t\tisParentToAdd = true;\r\n\t\t\t\t\t\tif (!isFocusedElement)\r\n\t\t\t\t\t\t\tself.$scope.navigationList[i].isFocusedElement = isFocusedElement = true;\r\n\t\t\t\t\t\tself.manageUserNavChildItem(childNav[j], FxpConstants.ActionTypes.Add);\r\n\t\t\t\t\t}\r\n\t\t\t\t\tchildNav[j].isChildSelected = false;\r\n\t\t\t\t}\r\n\t\t\t\tif (isParentToAdd) {\r\n\t\t\t\t\tif ((!angular.isDefined(self.$scope.navigationList[i].isUserLeftNavItem))) {\r\n\t\t\t\t\t\tself.$scope.navigationList[i].isPersonaDefault = false;\r\n\t\t\t\t\t\tself.$scope.navigationList[i].isUserLeftNavItem = true;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tself.$scope.navigationList[i].isHideButtonVisible = true;\r\n\t\t\t\t}\r\n\t\t\t} else {\r\n\t\t\t\tif ((self.$scope.navigationList[i].isParentSelected) && (self.$scope.navigationList[i].isPersonalizationAllowed) && (!angular.isDefined(self.$scope.navigationList[i].isUserLeftNavItem))) {\r\n\t\t\t\t\tself.$scope.navigationList[i].isPersonaDefault = false;\r\n\t\t\t\t\tself.$scope.navigationList[i].isUserLeftNavItem = true;\r\n\t\t\t\t\tself.$scope.navigationList[i].isHideButtonVisible = true;\r\n\t\t\t\t\tif (!isFocusedElement)\r\n\t\t\t\t\t\tself.$scope.navigationList[i].isFocusedElement = isFocusedElement = true;\r\n\r\n\t\t\t\t\tself.manageUserNavParentItem(self.$scope.navigationList[i], FxpConstants.ActionTypes.Add);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tself.$scope.navigationList[i].isParentSelected = false;\r\n\t\t}\r\n\t\tself.$scope.isAddPersonalizeAllow = false;\r\n\t\tif (!isFocusedElement)\r\n\t\t\tself.setFocusToGlobalNavMasterItem(true);\r\n\t}\r\n\r\n\t/**\r\n\t* A method to use Remove Selected Items from User Navigation List\r\n\t* @method Fxp.Controllers.LeftNavPersonalizationController.removeUserNavPresonalization\r\n\t* @example Example to use removeUserNavPresonalization\r\n\t* LeftNavPersonalizationController.removeUserNavPresonalization()\r\n\t*/\r\n\tremoveUserNavPresonalization(): void {\r\n\t\tvar self = this;\r\n\t\tself.$scope.isRemovePersonalizeAllow = false;\r\n\t\tlet navigationListLength = self.$scope.navigationList.length;\r\n\t\tfor (let i = 0; i < navigationListLength; i++) {\r\n\t\t\tif (self.$scope.navigationList[i].hasChildren && self.$scope.navigationList[i].children != null) {\r\n\t\t\t\tlet childLength = self.$scope.navigationList[i].children.length;\r\n\t\t\t\tlet childNav = self.$scope.navigationList[i].children;\r\n\t\t\t\tfor (let j = 0; j < childLength; j++) {\r\n\t\t\t\t\tif ((childNav[j].isSelected) && (angular.isDefined(childNav[j].isUserLeftNavItem)) && (!childNav[j].isPersonaDefault)) {\r\n\t\t\t\t\t\tdelete childNav[j].isUserLeftNavItem;\r\n\t\t\t\t\t\tself.manageUserNavChildItem(childNav[j], FxpConstants.ActionTypes.Remove);\r\n\t\t\t\t\t}\r\n\t\t\t\t\tchildNav[j].isSelected = false;\r\n\t\t\t\t}\r\n\t\t\t\tvar childlength = self.$scope.navigationList[i].children.reduce(function (item, navItem) {\r\n\t\t\t\t\treturn item + angular.isDefined(navItem.isUserLeftNavItem);\r\n\t\t\t\t}, 0);\r\n\t\t\t\tif (childlength === 0) {\r\n\t\t\t\t\tif (!self.$scope.navigationList[i].isPersonaDefault) {\r\n\t\t\t\t\t\tdelete self.$scope.navigationList[i].isUserLeftNavItem;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tself.$scope.navigationList[i].isSelected = false;\r\n\t\t\t} else {\r\n\t\t\t\tif ((self.$scope.navigationList[i].isSelected) && (!self.$scope.navigationList[i].isPersonaDefault)) {\r\n\t\t\t\t\tdelete self.$scope.navigationList[i].isUserLeftNavItem;\r\n\t\t\t\t\tself.$scope.navigationList[i].isSelected = false;\r\n\t\t\t\t\tself.manageUserNavParentItem(self.$scope.navigationList[i], FxpConstants.ActionTypes.Remove);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\tself.setFocusToGlobalNavMasterItem(true);\r\n\t\tself.changeTabIndexOfUserList();\r\n\t}\r\n\r\n\t/**\r\n\t* A method to use Select/Unselect from User Navigation List\r\n\t* @method Fxp.Controllers.LeftNavPersonalizationController.selectedUserNavItems\r\n\t* @example Example to use selectedUserNavItems\r\n\t* LeftNavPersonalizationController. selectedUserNavItems(parentItem, isParent)\r\n\t*/\r\n\tselectedUserNavItems(parentItem, isParent): void {\r\n\t\tvar self = this;\r\n\t\tif (isParent) {\r\n\t\t\tangular.forEach(parentItem.children, function (item, key) {\r\n\t\t\t\tif (!item.isPersonaDefault) {\r\n\t\t\t\t\titem.isSelected = parentItem.isSelected;\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t} else {\r\n\t\t\tparentItem.isSelected = (!parentItem.isPersonaDefault) ? parentItem.children.filter(function (item)\r\n\t\t\t{ return (angular.isDefined(item.isUserLeftNavItem) && (!item.isPersonaDefault)); }).every(function (item)\r\n\t\t\t{ return item.isSelected; }) : false;\r\n\t\t\t//parentItem.isSelected = parentItem.children.filter(function (item) { return (angular.isDefined(item.isUserLeftNavItem)&&(item.isPersonaDefault == false)); }).every(function (item) { return item.isSelected; });\r\n\t\t}\r\n\t\tself.$scope.isRemovePersonalizeAllow = self.isItemAllowToRemove();\r\n\t\t//removing/changing focus atrribute value of global nav list\r\n\t\tself.setFocusToGlobalNavMasterItem(false);\r\n\t}\r\n\r\n\t/**\r\n\t* A method to use submit User Navigation Preferences\r\n\t* @method Fxp.Controllers.LeftNavPersonalizationController.submitUserNavPresonalization\r\n\t* @example Example to use submitUserNavPresonalization\r\n\t* LeftNavPersonalizationController. submitUserNavPresonalization()\r\n\t*/\r\n\tsubmitUserNavPresonalization(): void {\r\n\t\tvar self = this;\r\n\t\tconst telemetry_source = `${this.sourceForTelemetry}.SubmitUserNavPresonalization`;\r\n\t\tif (!CommonUtils.isNullOrEmpty(self.personalizedUserNav.AddedItems) || !CommonUtils.isNullOrEmpty(self.personalizedUserNav.RemovedItems)) {\r\n\t\t\tself.fxpGlobalStoreService.DispatchGlobalAction(\"Platform\", ShowSpecificLoader({name:UI_LOADER_NAMES.FXP_LOADERS.LEFT_NAV_PERSONALIZATION_LOADER, loadingText: \"Loading...\"}));\r\n\t\t\tvar savePersonalizedUserNav = { \"AddedItems\": [], \"RemovedItems\": [] };\r\n\t\t\tsavePersonalizedUserNav.AddedItems = self.personalizedUserNav.AddedItems.map(function (result) {\r\n\t\t\t\treturn result.id;\r\n\t\t\t});\r\n\t\t\tsavePersonalizedUserNav.RemovedItems = self.personalizedUserNav.RemovedItems.map(function (result) {\r\n\t\t\t\treturn result.id;\r\n\t\t\t});\r\n\t\t\tvar userUpn = CommonUtils.generateUPN(self.$scope.personalizationUser, self.fxpConfigurationService.FxpAppSettings);\r\n\t\t\tself.personalizationService.savePersonalizedNavItems(userUpn, savePersonalizedUserNav, true).then(response => {\r\n\t\t\t\tvar successBannerTimeout = 1000;\r\n\t\t\t\tself.fxpLogger.logInformation(telemetry_source, `${TelemetryConstants.FXP_TELEMETRY_BASE_NAME}.SubmitUserNavPresonalizationSuccess`);\r\n\t\t\t\tself.fxpGlobalStoreService.DispatchGlobalAction(\"Platform\", HideSpecificLoader({name:UI_LOADER_NAMES.FXP_LOADERS.LEFT_NAV_PERSONALIZATION_LOADER}));\r\n\t\t\t\tself.logAdminTelemetry(self.personalizedUserNav.AddedItems, \"Added\");\r\n\t\t\t\tself.logAdminTelemetry(self.personalizedUserNav.RemovedItems, \"Remove\");\r\n\t\t\t\tself.personalizedUserNav = {};\r\n\r\n\t\t\t\tself.fxpMessage.addMessage(self.$rootScope.fxpUIConstants.UIMessages.UserNavigationListSaved.SuccessMessage + \" \" +\r\n\t\t\t\t\tself.$scope.personalizationUser.DisplayName + \" - \" + self.$scope.personalizationUser.BusinessRole, FxpConstants.messageType.success);\r\n\t\t\t\tthis.timeout(function () {\r\n\t\t\t\t\tself.navigateToUserLookup();\r\n\t\t\t\t}, successBannerTimeout);\r\n\r\n\t\t\t}, (exception) => {\r\n\t\t\t\tself.fxpGlobalStoreService.DispatchGlobalAction(\"Platform\", HideSpecificLoader({name:UI_LOADER_NAMES.FXP_LOADERS.LEFT_NAV_PERSONALIZATION_LOADER}));\r\n\t\t\t\tif (self.$rootScope.actOnBehalfOfUserActive)\r\n\t\t\t\t\tself.fxpMessage.addMessage(self.$rootScope.fxpUIConstants.UIMessages.UserNavigationListNotSavedForOBOUser.ErrorMessage, FxpConstants.messageType.error);\r\n\t\t\t\telse\r\n\t\t\t\t\tself.fxpMessage.addMessage(self.$rootScope.fxpUIConstants.UIMessages.UserNavigationListNotSaved.ErrorMessage, FxpConstants.messageType.error);\r\n\t\t\t\tvar propbag = self.fxpLogger.createPropertyBag();\r\n\t\t\t\tpropbag.addToBag(\"personalizationUser\", self.$scope.personalizationUser.Alias);\r\n\t\t\t\tpropbag.addToBag(\"exception\", exception.message);\r\n\t\t\t\tself.fxpLogger.logError(telemetry_source, \r\n\t\t\t\t\t\t\t\t\t\tself.$rootScope.fxpUIConstants.UIMessages.UserNavigationListNotSaved.ErrorMessageTitle, \r\n\t\t\t\t\t\t\t\t\t\tErrorCodes.SavePersonalizedNavItems,\r\n\t\t\t\t\t\t\t\t\t\tnull, \r\n\t\t\t\t\t\t\t\t\t\tpropbag,\r\n\t\t\t\t\t\t\t\t\t\tnull,\r\n\t\t\t\t\t\t\t\t\t\tnull,\r\n\t\t\t\t\t\t\t\t\t\tErrorSeverityLevel.Medium);\r\n\t\t\t});\r\n\t\t}\r\n\t}\r\n\r\n\tlogAdminTelemetry(personalizationUserList: any, action: string): void {\r\n\t\tif (personalizationUserList.length > 0) {\r\n\t\t\tvar self = this;\r\n\t\t\tvar propBag = self.fxpLogger.createPropertyBag();\r\n\t\t\tpropBag.addToBag(\"UserAlias\", self.userInfo.alias);\r\n\t\t\tpropBag.addToBag(\"RoleGroupName\", self.userInfo.roleGroupName);\r\n\t\t\tpropBag.addToBag(\"RoleGroupId\", self.userInfo.roleGroupId);\r\n\t\t\tpropBag.addToBag(\"PersonalizationUser\", self.$scope.personalizationUser.Alias);\r\n\t\t\tpropBag.addToBag(action + \"Count\", (personalizationUserList.length).toString());\r\n\t\t\tfor (let i = 0; i < personalizationUserList.length; i++) {\r\n\t\t\t\tpropBag.addToBag(\"L0\" + action, personalizationUserList[i].displayName);\r\n\t\t\t\tself.fxpLogger.logMetric(self.sourceForTelemetry, `${FxpConstants.metricConstants.AdminPersonalizationUserNavLinksCount}.${action}`, 1, propBag);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t* A method to use Enable/Disable remove Button\r\n\t* @method Fxp.Controllers.LeftNavPersonalizationController.isItemAllowToRemove\r\n\t* @example Example to use isItemAllowToRemove\r\n\t* LeftNavPersonalizationController.isItemAllowToRemove()\r\n\t*/\r\n\tisItemAllowToRemove(): boolean {\r\n\t\tvar self = this;\r\n\t\tvar flag;\r\n\t\tvar userNavPersonalizationListLength = self.$scope.navigationList.length;\r\n\t\tfor (let i = 0; i < userNavPersonalizationListLength; i++) {\r\n\t\t\tvar parentItem = self.$scope.navigationList[i];\r\n\t\t\t// check if parent items are selected.\r\n\t\t\tif (parentItem.isSelected) {\r\n\t\t\t\tflag = true;\r\n\t\t\t\tbreak;\r\n\t\t\t} else {\r\n\t\t\t\t// check if child items are selected\r\n\t\t\t\tif (parentItem.hasChildren && parentItem.children != null) {\r\n\t\t\t\t\tvar parentItemChildrenLength = parentItem.children.length;\r\n\t\t\t\t\tfor (var j = 0; j < parentItemChildrenLength; j++) {\r\n\t\t\t\t\t\tvar childItem = parentItem.children[j];\r\n\t\t\t\t\t\tif (childItem.isSelected) {\r\n\t\t\t\t\t\t\tflag = true;\r\n\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn flag;\r\n\t}\r\n\r\n\t/**\r\n\t* A method to use show Confirm Popup\r\n\t* @method Fxp.Controllers.LeftNavPersonalizationController.showConfirmPopup\r\n\t* @example Example to use showConfirmPopup\r\n\t* LeftNavPersonalizationController.showConfirmPopup()\r\n\t*/\r\n\tshowConfirmPopup(): void {\r\n\t\tvar self = this;\r\n\t\tif (!CommonUtils.isNullOrEmpty(self.personalizedUserNav.AddedItems) || !CommonUtils.isNullOrEmpty(self.personalizedUserNav.RemovedItems)) {\r\n\t\t\tthis.$scope.displayPopup = true;\r\n\t\t\tsetTimeout(function () { CommonUtils.pullFocusToElement('role-group-popup'); }, 100);\r\n\t\t} else\r\n\t\t\tself.navigateToUserLookup();\r\n\t}\r\n\r\n\t/**\r\n\t* A method to use hide Confirm Popup\r\n\t* @method Fxp.Controllers.LeftNavPersonalizationController.hideConfirmPopup\r\n\t* @example Example to use hideConfirmPopup\r\n\t* LeftNavPersonalizationController.hideConfirmPopup()\r\n\t*/\r\n\thideConfirmPopup(): void {\r\n\t\tvar self = this;\r\n\t\tthis.$scope.displayPopup = false;\r\n\t\tif (self.isStateChanged) {\r\n\t\t\tself.$rootScope.$broadcast(FxpBroadcastedEvents.OnLeftNavHighlightByStateName, \"UserLookupPersonalization\");\r\n\t\t}\r\n\t\tself.isStateChanged = false;\r\n\t\tsetTimeout(function () { CommonUtils.pullFocusToElement('secndryBtn'); }, 100);\r\n\t}\r\n\r\n\t/**\r\n\t* A method to use set focus the Selected Item\r\n\t* @method Fxp.Controllers.LeftNavPersonalizationController.setFocusToGlobalNavMasterItem\r\n\t* @example Example to use setFocusToGlobalNavMasterItem\r\n\t* LeftNavPersonalizationController.setFocusToGlobalNavMasterItem()\r\n\t*/\r\n\tsetFocusToGlobalNavMasterItem(status) {\r\n\t\tlet self = this;\r\n\t\tlet index = self.getIndexOfObject(this.$scope.navigationList, \"isPersonalizationAllowed\", true);\r\n\t\tif (index > -1) {\r\n\t\t\tthis.$scope.navigationList[index].isFocused = status;\r\n\t\t}\r\n\t};\r\n\r\n\t/**\r\n\t* A method to use set focus to the html element based on item \r\n\t* @method Fxp.Controllers.LeftNavPersonalizationController.pullFocusToElement\r\n\t* @example Example to use pullFocusToElement\r\n\t* LeftNavPersonalizationController.pullFocusToElement(element,navItem)\r\n\t*/\r\n\tpullFocusToElement(element, navItem, itemType): void {\r\n\t\tif (itemType.toLowerCase() === \"usernav\" && navItem.isFocusedElement) {\r\n\t\t\tCommonUtils.pullFocusToElement(element);\r\n\t\t\tnavItem.isFocusedElement = false;\r\n\t\t} else if (itemType.toLowerCase() === \"globalnav\" && navItem.isFocused) {\r\n\t\t\tnavItem.isFocused = false;\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t* A method is used to set the tabindex of first elements of User list to 0\r\n\t* @method Fxp.Controllers.LeftNavPersonalizationController.changeTabIndexOfUserList\r\n\t* LeftNavPersonalizationController.changeTabIndexOfUserList()\r\n\t*/\r\n\tchangeTabIndexOfUserList(): void {\r\n\t\tvar allMenuElements = $(\"#UserPersonalNavigationListForm\").find(\".fxpTabbableElem\");\r\n\t\tif (allMenuElements.length > 0) {\r\n\t\t\t$(allMenuElements[0]).attr('tabindex', 0);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t* A method to use sorting the list of Items from collection\r\n\t* @method Fxp.Controllers.LeftNavPersonalizationController.sortObject\r\n\t* @example Example to use sortObject\r\n\t* LeftNavPersonalizationController.sortObject(srtObject, srtElement)\r\n\t*/\r\n\tsortObject(srtObject, srtElement): void {\r\n\t\tsrtObject.sort(function (a, b) {\r\n\t\t\treturn a[srtElement] > b[srtElement] ? 1 : a[srtElement] < b[srtElement] ? -1 : 0;\r\n\t\t});\r\n\t};\r\n\r\n\t/**\r\n\t* A method to use sget the Index of the macthing Item in the List\r\n\t* @method Fxp.Controllers.LeftNavPersonalizationController.getIndexOfObject\r\n\t* @example Example to use getIndexOfObject\r\n\t* LeftNavPersonalizationController.getIndexOfObject(source, compareKey, value)\r\n\t*/\r\n\tgetIndexOfObject(source, compareKey, value): number {\r\n\t\tvar index = -1;\r\n\t\tvar length = source.length;\r\n\t\tfor (let i = 0; i < length; i++) {\r\n\t\t\tif (source[i][compareKey] === value) {\r\n\t\t\t\tindex = i;\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn index;\r\n\t}\r\n\r\n\t/**\r\n\t* A method to use maintain audit infromation of UserNavPrefList based on parent action track\r\n\t* @method Fxp.Controllers.LeftNavPersonalizationController.manageUserNavParentItem\r\n\t* @example Example to use manageUserNavParentItem\r\n\t* LeftNavPersonalizationController.manageUserNavParentItem(parent, action)\r\n\t*/\r\n\tmanageUserNavParentItem(parent, action): void {\r\n\t\tlet self = this;\r\n\t\tif (parent.hasChildren && parent.children != null) {\r\n\t\t\t//if parent have Childrens then we add childs\r\n\t\t\tlet childrenLength = parent.children.length;\r\n\t\t\tfor (let i = 0; i < childrenLength; i++) {\r\n\t\t\t\tself.manageUserNavChildItem(parent.children[i], action);\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\t//if parent does not have Childrens then we add parent\r\n\t\t\tself.manageUserNavChildItem(parent, action);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t* A method to use maintain audit infromation of UserNavPrefList based on Child action track\r\n\t* @method Fxp.Controllers.LeftNavPersonalizationController.manageUserNavChildItem\r\n\t* @example Example to use manageUserNavChildItem\r\n\t* LeftNavPersonalizationController.manageUserNavChildItem(id, action)\r\n\t*/\r\n\tmanageUserNavChildItem(item, action): void {\r\n\t\tlet self = this;\r\n\t\tlet constantActions = FxpConstants.ActionTypes;\r\n\t\tlet oldAction = (action == constantActions.Add) ? constantActions.Remove : constantActions.Add;\r\n\t\tlet index = self.getIndexOfObject(self.personalizedUserNav[oldAction], \"id\", item.id);\r\n\t\tif (index > -1) {\r\n\t\t\tself.personalizedUserNav[oldAction].splice(index, 1);\r\n\t\t} else {\r\n\t\t\tself.personalizedUserNav[action].push(angular.copy(item));\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t* A method to measure pageloadduration and log pageloadmetrics\r\n\t* @method Fxp.Controllers.LeftNavPersonalizationController.logPageLoadMetricsForCurrentPage\r\n\t* @example Example to use logPageLoadMetricsForCurrentPage\r\n\t* LeftNavPersonalizationController.logPageLoadMetricsForCurrentPage(id, action)\r\n\t*/\r\n\tlogPageLoadMetricsForCurrentPage(): void {\r\n\t\tvar self = this;\r\n\t\tvar pageLoadEndTime = performance.now();\r\n\t\tvar pageLoadDuration = pageLoadEndTime - self.pageLoadStartTime;\r\n\t\tself.fxpLogger.logPageLoadMetrics(pageLoadDuration);\r\n\t}\r\n\r\n}\r\nLeftNavPersonalizationController.$inject = ['$rootScope', '$scope', '$state', '$timeout', 'FxpLoggerService', 'FxpGlobalStoreService', 'FxpMessageService', 'PersonalizationService', 'UserProfileService', '$window', 'FxpRouteService', 'NotificationStore', 'FxpConfigurationService'];\r\n\r\n\r\n","/**\r\n * @application Fxp\r\n */\r\n/**\r\n * @module Fxp.Controllers\r\n */\r\nimport {\r\n FxpConstants,\r\n ApplicationConstants,\r\n} from \"../common/ApplicationConstants\";\r\nimport { IRootScope } from \"../interfaces/IRootScope\";\r\nimport { FxpConfigurationService } from \"../services/FxpConfiguration\";\r\nimport { NotificationStore } from \"../services/NotificationStore\";\r\nimport { NotificationActionCenter } from \"../services/NotificationActionCenter\";\r\nimport { ILogger } from \"../interfaces/ILogger\";\r\nimport { SettingsServiceProvider } from \"../provider/SettingsServiceProvider\";\r\nimport { UserInfoService } from \"../services/UserInfoService\";\r\nimport { FxpMessageService } from \"../../app/banner/FxpMessageService\";\r\nimport { FxpContext } from \"../context/FxpContext\";\r\nimport { CommonUtils } from \"../utils/CommonUtils\";\r\nimport { SettingsType } from \"../common/SettingsType\";\r\nimport { ISettingsService } from \"../interfaces/ISettingsService\";\r\nimport { FxpBroadcastedEvents } from \"../services/FxpBroadcastedEvents\";\r\nimport { TelemetryConstants } from \"../telemetry/TelemetryConst\";\r\nimport { ErrorCodes } from \"../constants/errorCodes\";\r\nimport { ErrorSeverityLevel } from \"../telemetry/ErrorSeverityLevel\";\r\nimport { FeatureUsageEvent } from \"../telemetry/FeatureUsageEvent\";\r\nimport {\r\n ActionStatus,\r\n ActionType,\r\n ComponentType,\r\n EventName,\r\n} from \"@microsoftit/telemetry-extensions-npm\";\r\nimport { LogPropertyBag } from \"../telemetry/LogPropertyBag\";\r\nimport { FxpGlobalStoreService } from \"../services/fxp.global.store.service\";\r\nimport { HideLoader, ShowLoader } from \"../../app/loader/loader.actions\";\r\nimport { FxpSignalRService } from \"../services/FxpSignalRClient\";\r\nimport {\r\n DismissNotification,\r\n MarkNotification,\r\n PushNotification,\r\n ResetNotificationCollection,\r\n} from \"../../app/notifications/notifications.action\";\r\nimport { IPlatformState } from \"../../app/store/platform.state.model\";\r\nimport { Notification } from \"../../app/notifications/notifications.model\";\r\n\r\n/**\r\n * This is the controller having functionality and data for Notifications.\r\n * @class Fxp.Controllers.NotificationsController\r\n * @classdesc A controller of FxpApp module\r\n * @example \r\n * //To Use NotificationsController\r\n * angular.module('FxPApp').controller('NotificationsController', ['AnyDependency', NotificationsController]);\r\n * function NotificationsController(AnyDependency){ AnyDependency.doSomething(); }\r\n */\r\nexport class NotificationsController {\r\n // Private variables\r\n private notificationLimit: number;\r\n private notificationList: any;\r\n private unreadNotificationCount: number;\r\n private notificationCollection: Array;\r\n private isNotificationFlyoutOpen: boolean;\r\n private hasNotificationError: boolean;\r\n private notificationErrorMsg: any;\r\n private fxpConstants: FxpConstants;\r\n private notifcationCountPollInterval: number;\r\n private offsetExpirationInterval: number;\r\n private moreNotificationsAvailable: boolean;\r\n private unreadNotificationTimerValue: number = 10000;\r\n private signalREventName;\r\n private signalRTenant = ApplicationConstants.signalRTenant;\r\n private unsubscribeSignalRHandler: any;\r\n private sourceForTelemetry = `${TelemetryConstants.FXP_TELEMETRY_BASE_NAME}.NotificationsController`;\r\n private notificationFeatureName = `${TelemetryConstants.FXP_TELEMETRY_BASE_NAME}.Notifications`;\r\n\r\n constructor(\r\n private $rootScope: IRootScope,\r\n private $scope: angular.IScope,\r\n private $window: angular.IWindowService,\r\n private $interval: angular.IIntervalService,\r\n private fxpConfigurationService: FxpConfigurationService,\r\n private $timeout: any,\r\n private notificationStore: NotificationStore,\r\n private notificationActionCenter: NotificationActionCenter,\r\n private fxpLoggerService: ILogger,\r\n private settingsService: ISettingsService,\r\n private userInfoService: UserInfoService,\r\n private fxpMessage: FxpMessageService,\r\n private fxpContext: FxpContext,\r\n private device: any,\r\n private fxpGlobalStoreService: FxpGlobalStoreService,\r\n private fxpSignalRService: FxpSignalRService\r\n ) {\r\n //Initializes value\r\n var self = this;\r\n self.unreadNotificationCount = 0;\r\n self.signalREventName =\r\n self.fxpConfigurationService.FxpAppSettings.SignalREventWebNotificationName;\r\n self.notificationCollection = [];\r\n self.isNotificationFlyoutOpen = false;\r\n self.hasNotificationError = false;\r\n self.notificationErrorMsg = \"\";\r\n self.moreNotificationsAvailable = false;\r\n self.notifcationCountPollInterval = self.fxpConfigurationService\r\n .FxpBaseConfiguration.NotificationConfiguration\r\n ? self.fxpConfigurationService.FxpBaseConfiguration\r\n .NotificationConfiguration.PollingInterval || 5000\r\n : 5000;\r\n self.offsetExpirationInterval = self.fxpConfigurationService\r\n .FxpBaseConfiguration.NotificationConfiguration\r\n ? self.fxpConfigurationService.FxpBaseConfiguration\r\n .NotificationConfiguration.OffsetExpirationInterval || 1800000\r\n : 1800000;\r\n self.notificationLimit = self.fxpConfigurationService.FxpBaseConfiguration\r\n .NotificationConfiguration\r\n ? self.fxpConfigurationService.FxpBaseConfiguration\r\n .NotificationConfiguration.DefaultNotificationLimit || 20\r\n : 20;\r\n self.getNotifications(0, self.notificationLimit);\r\n self.subscribeToSignalR();\r\n self.fxpGlobalStoreService.SubscribeToPlatformState(\r\n \"Platform\",\r\n (platformState: IPlatformState) => {\r\n self.updateNotifications(platformState);\r\n }\r\n );\r\n }\r\n private updateNotifications(platformState: IPlatformState) {\r\n var self = this;\r\n if (\r\n platformState.Notifications &&\r\n platformState.Notifications.UserNotifications.length !=\r\n self.notificationCollection.length\r\n ) {\r\n self.notificationCollection =\r\n platformState.Notifications.UserNotifications;\r\n }\r\n if (\r\n platformState.Notifications &&\r\n platformState.Notifications.UnreadNotificationCount !=\r\n self.unreadNotificationCount\r\n ) {\r\n self.unreadNotificationCount =\r\n platformState.Notifications.UnreadNotificationCount;\r\n }\r\n }\r\n private subscribeToSignalR() {\r\n if (!this.unsubscribeSignalRHandler)\r\n this.unsubscribeSignalRHandler = this.fxpSignalRService.subscribe(\r\n this.signalREventName,\r\n this.signalRTenant,\r\n this.onNotificationReceived.bind(this)\r\n );\r\n }\r\n public unsubscribeToSignalR() {\r\n if (this.unsubscribeSignalRHandler) this.unsubscribeSignalRHandler();\r\n this.unsubscribeSignalRHandler = null;\r\n }\r\n private onNotificationReceived(response: any): any {\r\n if (!response || this.$rootScope.actOnBehalfOfUserActive) return;\r\n var NotificationsReceived = this.notificationCollection.filter(\r\n (x) => x.notificationId === response.id\r\n );\r\n if (NotificationsReceived.length != 0) return;\r\n NotificationsReceived =\r\n this.notificationActionCenter.appendPropertiesToNotifications([response]);\r\n var notification = NotificationsReceived[0] as Notification;\r\n notification.notificationId = NotificationsReceived[0].id;\r\n this.fxpGlobalStoreService.DispatchLocalAction(\r\n \"Platform\",\r\n PushNotification(notification)\r\n );\r\n if (this.isToastNotificationNeeded())\r\n this.$rootScope.$broadcast(\r\n FxpBroadcastedEvents.OnNewNotificationsRecieved,\r\n [response]\r\n );\r\n }\r\n /**\r\n * An event handler whenever notification flyout is closed using close icon.\r\n * @method Fxp.Controllers.NotificationsController.closeNotificationFlyout\r\n * @example Example to use closeNotificationFlyout\r\n *
      Dropdown closed
      ;\r\n */\r\n closeNotificationFlyout(): void {\r\n var self = this;\r\n self.isNotificationFlyoutOpen = false;\r\n $(\"#notification-open\").focus();\r\n }\r\n\r\n private logFeatureUsageEventObject(\r\n source: string,\r\n featureUsageEvent: FeatureUsageEvent,\r\n experienceResult: ActionStatus,\r\n properties?: LogPropertyBag\r\n ) {\r\n featureUsageEvent.ActionStatus = experienceResult;\r\n this.fxpLoggerService.logFeatureUsageEvent(\r\n source,\r\n featureUsageEvent,\r\n properties\r\n );\r\n }\r\n\r\n /**\r\n *A method to Get the notifications\r\n * @method Fxp.Controllers.NotificationsController.getNotifications\r\n * @param {number} index is an index from where notifications are to be fetched.\r\n * @param {number} count is a number of records to be fetched.\r\n * @param {number?} currentIndex is an index where focus is now.\r\n * @example Example to use getNotifications\r\n * NotificationsController.getNotifications()\r\n */\r\n getNotifications = function (\r\n index,\r\n count,\r\n setFocusToFirstElement?,\r\n renewCorrelationId?: boolean\r\n ) {\r\n // Start time for performance calculation.\r\n const self = this;\r\n const startTime = performance.now(),\r\n propbag = self.fxpLoggerService.createPropertyBag();\r\n let actionName = \"ViewNotifications\";\r\n const source = `${self.sourceForTelemetry}.getNotifications`;\r\n\r\n if (!renewCorrelationId) {\r\n self.fxpLoggerService.renewCorrelationId();\r\n } else {\r\n self.fxpLoggerService.renewSubCorrelationId();\r\n actionName = \"ViewMoreNotifications\";\r\n }\r\n const getNotificationsFeature = new FeatureUsageEvent(\r\n self.notificationFeatureName,\r\n ActionType.User,\r\n actionName,\r\n EventName.ButtonClick,\r\n ComponentType.Web\r\n );\r\n self.notificationStore.getNotifications(index, count).then(\r\n (response) => {\r\n var data = response.data;\r\n data =\r\n self.notificationActionCenter.appendPropertiesToNotifications(data);\r\n self.moreNotificationsAvailable = data.length == count;\r\n var unreadNotifications = data.filter(\r\n (item) => item.status.name != \"Read\"\r\n );\r\n self.fxpGlobalStoreService.DispatchLocalAction(\r\n \"Platform\",\r\n ResetNotificationCollection({\r\n UserNotifications: data,\r\n UnreadNotificationCount: unreadNotifications.length,\r\n })\r\n );\r\n self.removeErrorMessage();\r\n if (setFocusToFirstElement) {\r\n $(\".notification-subject:first\").focus();\r\n } else {\r\n $(\"#closeNotification\").focus(); //focus will go to close button\r\n }\r\n\r\n propbag.addToBag(\"Total Time\", performance.now() - startTime);\r\n self.fxpLoggerService.logEvent(\r\n source,\r\n `${TelemetryConstants.FXP_TELEMETRY_BASE_NAME}.GetNotifications`,\r\n propbag\r\n );\r\n self.logFeatureUsageEventObject(\r\n source,\r\n getNotificationsFeature,\r\n ActionStatus.Succeeded,\r\n propbag\r\n );\r\n },\r\n (error) => {\r\n self.logError(\r\n error,\r\n self.$rootScope.fxpUIConstants.UIMessages.NotificationGetServiceError,\r\n ErrorCodes.GetNotifications_Failure\r\n );\r\n self.logFeatureUsageEventObject(\r\n source,\r\n getNotificationsFeature,\r\n ActionStatus.Failed,\r\n propbag\r\n );\r\n }\r\n );\r\n };\r\n\r\n getStoredNotification() {\r\n return this.fxpGlobalStoreService.GetPlatformState().Notifications\r\n .UserNotifications;\r\n }\r\n\r\n /**\r\n *A method to check whether toast notifications are needed\r\n * @method Fxp.Controllers.NotificationsController.isToastNotificationNeeded\r\n * @param {number} offset is an id last notifications fetched.\r\n * @example Example to use isToastNotificationNeeded\r\n * NotificationsController.isToastNotificationNeeded()\r\n */\r\n isToastNotificationNeeded(): boolean {\r\n var self = this,\r\n result =\r\n !self.device.isMobile() &&\r\n !self.isNotificationFlyoutOpen &&\r\n !self.$rootScope.isNotificationDNDEnabled &&\r\n !self.$rootScope.actOnBehalfOfUserActive;\r\n return result;\r\n }\r\n\r\n /**\r\n *A method to mark all notifications as read\r\n * @method Fxp.Controllers.NotificationsController.markAllNotificationsAsRead\r\n * @example Example to use markAllNotificationsAsRead\r\n *
      markAllNotificationsAsRead()
      \r\n */\r\n markAllNotificationsAsRead(): void {\r\n // Start time for performance calculation.\r\n const source = `${this.sourceForTelemetry}.markAllNotificationsAsRead`;\r\n const startTime = performance.now(),\r\n self = this,\r\n propbag = self.fxpLoggerService.createPropertyBag();\r\n\r\n self.fxpLoggerService.renewSubCorrelationId();\r\n const markAllFeature = new FeatureUsageEvent(\r\n self.notificationFeatureName,\r\n ActionType.User,\r\n \"MarkAllNotificationsAsRead\",\r\n EventName.LinkClicked,\r\n ComponentType.Web\r\n );\r\n self.fxpGlobalStoreService.DispatchGlobalAction(\r\n \"Platform\",\r\n ShowLoader({ loadingText: \"Marking All Notifications as Read\" })\r\n );\r\n self.notificationStore.markNotificationAsRead().then(\r\n (response) => {\r\n var markNotifications = self.notificationCollection;\r\n markNotifications.forEach(function (item) {\r\n item.status.id = 2;\r\n item.status.name = \"Read\";\r\n item.status.description = \"The notification has been read\";\r\n });\r\n self.fxpGlobalStoreService.DispatchLocalAction(\r\n \"Platform\",\r\n ResetNotificationCollection({\r\n UserNotifications: markNotifications,\r\n UnreadNotificationCount: 0,\r\n })\r\n );\r\n CommonUtils.pullFocusToElement(\"btn_dismissall\");\r\n self.fxpGlobalStoreService.DispatchGlobalAction(\r\n \"Platform\",\r\n HideLoader({})\r\n );\r\n propbag.addToBag(\r\n \"Total Time\",\r\n (performance.now() - startTime).toString()\r\n );\r\n self.fxpLoggerService.logEvent(\r\n `${self.sourceForTelemetry}.markAllNotificationsAsRead`,\r\n `${TelemetryConstants.FXP_TELEMETRY_BASE_NAME}.MarkAllNotificationsAsRead`,\r\n propbag\r\n );\r\n self.logFeatureUsageEventObject(\r\n source,\r\n markAllFeature,\r\n ActionStatus.Succeeded,\r\n propbag\r\n );\r\n },\r\n (error) => {\r\n self.logError(\r\n error,\r\n self.$rootScope.fxpUIConstants.UIMessages\r\n .NotificationReadServiceError,\r\n ErrorCodes.MarkAllNotificationsAsRead_Failure\r\n );\r\n self.logFeatureUsageEventObject(\r\n source,\r\n markAllFeature,\r\n ActionStatus.Failed,\r\n propbag\r\n );\r\n }\r\n );\r\n }\r\n /**\r\n *A method to delete all notifications\r\n * @method Fxp.Controllers.NotificationsController.dismissAllNotifications\r\n * @example Example to use dismissAllNotifications\r\n *
      dismissAll()
      \r\n */\r\n dismissAllNotifications(): void {\r\n // Start time for performance calculation.\r\n const startTime = performance.now(),\r\n self = this,\r\n propbag = self.fxpLoggerService.createPropertyBag();\r\n self.fxpLoggerService.renewSubCorrelationId();\r\n const dismisAllFeature = new FeatureUsageEvent(\r\n self.notificationFeatureName,\r\n ActionType.User,\r\n \"DismissAllNotifications\",\r\n EventName.LinkClicked,\r\n ComponentType.Web\r\n );\r\n self.fxpGlobalStoreService.DispatchGlobalAction(\r\n \"Platform\",\r\n ShowLoader({ loadingText: \"Dismissing All Notifications\" })\r\n );\r\n self.notificationStore.deleteNotification(-1).then(\r\n (response) => {\r\n self.moreNotificationsAvailable = false;\r\n self.fxpGlobalStoreService.DispatchLocalAction(\r\n \"Platform\",\r\n ResetNotificationCollection({\r\n UserNotifications: [],\r\n UnreadNotificationCount: 0,\r\n })\r\n );\r\n\r\n CommonUtils.pullFocusToElement(\"closeNotification\");\r\n self.fxpGlobalStoreService.DispatchGlobalAction(\r\n \"Platform\",\r\n HideLoader({})\r\n );\r\n propbag.addToBag(\r\n \"Total Time\",\r\n (performance.now() - startTime).toString()\r\n );\r\n self.fxpLoggerService.logEvent(\r\n `${self.sourceForTelemetry}.dismissAllNotifications`,\r\n `${TelemetryConstants.FXP_TELEMETRY_BASE_NAME}.DismissAllNotifications`,\r\n propbag\r\n );\r\n self.logFeatureUsageEventObject(\r\n `${self.sourceForTelemetry}.dismissAllNotifications`,\r\n dismisAllFeature,\r\n ActionStatus.Succeeded,\r\n propbag\r\n );\r\n },\r\n (error) => {\r\n self.logError(\r\n error,\r\n self.$rootScope.fxpUIConstants.UIMessages\r\n .NotificationDeleteServiceError,\r\n ErrorCodes.DismissAllNotifications_Failure\r\n );\r\n self.logFeatureUsageEventObject(\r\n `${self.sourceForTelemetry}.dismissAllNotifications`,\r\n dismisAllFeature,\r\n ActionStatus.Failed,\r\n propbag\r\n );\r\n }\r\n );\r\n }\r\n /**\r\n *A method to load notifications based on the default limit\r\n * @method Fxp.Controllers.NotificationsController.loadMore\r\n * @param {any} event is a DOM Object that generated on action.\r\n * @example Example to use loadMore\r\n *
      load More
      \r\n */\r\n loadMore(event): void {\r\n const self = this;\r\n event.stopPropagation();\r\n event.preventDefault();\r\n const totalNotificationCount = self.notificationCollection.length;\r\n self.getNotifications(\r\n totalNotificationCount,\r\n self.notificationLimit,\r\n true,\r\n false\r\n );\r\n }\r\n /**\r\n *A method to set the focus on available notification subject\r\n * @method Fxp.Controllers.NotificationsController.setFocusOnNotification\r\n * @param {number} notificationItemIndex is a notification number which specifies Notification limit before loading more.\r\n * @example Example to use setFocusOnNotification\r\n * NotificationsController.setFocusOnNotification(notificationItemIndex)\r\n */\r\n setFocusOnNotification(notificationItemIndex): void {\r\n const notificationList = $(\"li.notification\");\r\n notificationItemIndex =\r\n notificationItemIndex < notificationList.length\r\n ? notificationItemIndex\r\n : notificationList.length - 1;\r\n $(notificationList[notificationItemIndex])\r\n .find(\".notification-subject\")\r\n .focus();\r\n }\r\n\r\n /**\r\n *A method to make the unread notifications to read\r\n * @method Fxp.Controllers.NotificationsController.readNotification\r\n * @param {any} item is a notification object to be read.\r\n * @example Example to use readNotification\r\n *
      load More
      \r\n */\r\n readNotification(item): void {\r\n // Start time for performance calculation.\r\n const startTime = performance.now(),\r\n self = this,\r\n propbag = self.fxpLoggerService.createPropertyBag();\r\n self.fxpLoggerService.renewSubCorrelationId();\r\n const source = `${self.sourceForTelemetry}.readNotification`;\r\n const readNotificationFeature = new FeatureUsageEvent(\r\n self.notificationFeatureName,\r\n ActionType.User,\r\n \"MarkNotificationRead\",\r\n EventName.LinkClicked,\r\n ComponentType.Web\r\n );\r\n try {\r\n self.notificationActionCenter.excecuteNotificationAction(item);\r\n if (item != undefined && item != null && item.status.name == \"Sent\") {\r\n self.notificationStore.markNotificationAsRead(item.notificationId).then(\r\n (response) => {\r\n const notificationIndex = self.notificationCollection.indexOf(item);\r\n var markNotification =\r\n self.notificationCollection[notificationIndex];\r\n markNotification.status.name = \"Read\";\r\n var notificaitonMsg = (\r\n document.getElementById(\"notificationAssertMessage\")\r\n );\r\n notificaitonMsg.innerHTML =\r\n \"
      Marked notification as read\" +\r\n notificationIndex +\r\n 1 +\r\n \" of \" +\r\n self.notificationCollection.length +\r\n 1 +\r\n \"
      \";\r\n\r\n self.fxpGlobalStoreService.DispatchLocalAction(\r\n \"Platform\",\r\n MarkNotification(markNotification)\r\n );\r\n propbag.addToBag(\"EventId\", item.eventId);\r\n propbag.addToBag(\"Notification Id\", item.notificationId);\r\n propbag.addToBag(\"From\", item.senderAddress);\r\n propbag.addToBag(\r\n \"Total Time\",\r\n (performance.now() - startTime).toString()\r\n );\r\n self.fxpLoggerService.logEvent(\r\n source,\r\n `${TelemetryConstants.FXP_TELEMETRY_BASE_NAME}.ReadNotification`,\r\n propbag\r\n );\r\n self.logFeatureUsageEventObject(\r\n source,\r\n readNotificationFeature,\r\n ActionStatus.Succeeded,\r\n propbag\r\n );\r\n },\r\n (error) => {\r\n self.logError(\r\n error,\r\n self.$rootScope.fxpUIConstants.UIMessages\r\n .NotificationReadServiceError,\r\n ErrorCodes.ReadNotification_Failure\r\n );\r\n self.logFeatureUsageEventObject(\r\n source,\r\n readNotificationFeature,\r\n ActionStatus.Failed,\r\n propbag\r\n );\r\n }\r\n );\r\n }\r\n } catch (error) {\r\n self.logError(\r\n error,\r\n self.$rootScope.fxpUIConstants.UIMessages.NotificationReadServiceError,\r\n ErrorCodes.ReadNotification_Failure\r\n );\r\n }\r\n }\r\n\r\n /**\r\n *A method to delete the notificaiton based on the webnotification id\r\n * @method Fxp.Controllers.NotificationsController.deleteNotification\r\n * @param {any} item is a notification object to be deleted.\r\n * @param {any} event is a DOM Object that generated on action.\r\n * @example Example to use deleteNotification\r\n * NotificationsController.deleteNotification()\r\n */\r\n deleteNotification = function (item, event) {\r\n // Start time for performance calculation.\r\n const startTime = performance.now(),\r\n self = this;\r\n self.fxpLoggerService.renewSubCorrelationId();\r\n const source = `${self.sourceForTelemetry}.deleteNotification`;\r\n const deleteNotificationFeature = new FeatureUsageEvent(\r\n self.notificationFeatureName,\r\n ActionType.User,\r\n \"DeleteNotification\",\r\n EventName.ButtonClick,\r\n ComponentType.Web\r\n );\r\n event.stopPropagation();\r\n event.preventDefault();\r\n const propbag = self.fxpLoggerService.createPropertyBag();\r\n self.notificationStore.deleteNotification(item.notificationId).then(\r\n (response) => {\r\n var itemIndex = self.notificationCollection.indexOf(item);\r\n if (itemIndex >= 0) {\r\n var dismissNotification = self.notificationCollection[itemIndex];\r\n var deleteNotificationMsg = (\r\n document.getElementById(\"notificationAssertMessage\")\r\n );\r\n deleteNotificationMsg.innerHTML =\r\n \"
      Deleting notification message \" +\r\n item.subject +\r\n \" \" +\r\n itemIndex +\r\n 1 +\r\n \" of \" +\r\n self.notificationCollection.length +\r\n \"
      \";\r\n self.fxpGlobalStoreService.DispatchLocalAction(\r\n \"Platform\",\r\n DismissNotification(dismissNotification)\r\n );\r\n propbag.addToBag(\"EventId\", item.eventId);\r\n propbag.addToBag(\"Notification Id\", item.notificationId);\r\n propbag.addToBag(\"From\", item.senderAddress);\r\n propbag.addToBag(\"Total Time\", performance.now() - startTime);\r\n self.fxpLoggerService.logEvent(\r\n source,\r\n `${TelemetryConstants.FXP_TELEMETRY_BASE_NAME}.DeleteNotification`,\r\n propbag\r\n );\r\n self.logFeatureUsageEventObject(\r\n source,\r\n deleteNotificationFeature,\r\n true,\r\n propbag\r\n );\r\n }\r\n },\r\n (error) => {\r\n self.logError(\r\n error,\r\n self.$rootScope.fxpUIConstants.UIMessages\r\n .NotificationDeleteServiceError,\r\n ErrorCodes.DeleteNotification_Failure\r\n );\r\n self.logFeatureUsageEventObject(\r\n source,\r\n deleteNotificationFeature,\r\n false,\r\n propbag\r\n );\r\n }\r\n );\r\n };\r\n\r\n /**\r\n *A method to set the error message on notificaiton flyout\r\n * @method Fxp.Controllers.NotificationsController.setErrorMessage\r\n * @param {string} msg is a error message to be shown on notificaiton flyout\r\n * @example Example to use setErrorMessage\r\n * NotificationsController.setErrorMessage(msg)\r\n */\r\n setErrorMessage = function (msg) {\r\n var self = this;\r\n self.hasNotificationError = true;\r\n self.notificationErrorMsg = msg;\r\n };\r\n\r\n /**\r\n *A method to remove the error message on notificaiton flyout\r\n * @method Fxp.Controllers.NotificationsController.removeErrorMessage\r\n * @example Example to use removeErrorMessage\r\n * NotificationsController.removeErrorMessage(msg)\r\n */\r\n removeErrorMessage = function () {\r\n var self = this;\r\n self.hasNotificationError = false;\r\n self.notificationErrorMsg = \"\";\r\n };\r\n /**\r\n *A method to log error\r\n * @method Fxp.Controllers.NotificationsController.logError\r\n * @param {any} error is a error object\r\n * @example Example to use sortObject\r\n * NotificationsController.logError(error)\r\n */\r\n logError(error, message, code): void {\r\n var self = this;\r\n var propbag = self.fxpLoggerService.createPropertyBag();\r\n propbag.addToBag(FxpConstants.metricConstants.Status, error.status);\r\n propbag.addToBag(FxpConstants.metricConstants.StatusText, error.statusText);\r\n self.fxpLoggerService.logError(\r\n `${self.sourceForTelemetry}.LogError`,\r\n message.ErrorMessageTitle,\r\n code,\r\n null,\r\n propbag,\r\n null,\r\n null,\r\n ErrorSeverityLevel.Medium\r\n );\r\n self.setErrorMessage(message.ErrorMessage);\r\n }\r\n\r\n /**\r\n *A method on DND Setting value change\r\n * @method Fxp.Controllers.NotificationsController.onDNDValueChange\r\n * @param {boolean} value is a boolean value\r\n * @example Example to use onDNDValueChange\r\n * NotificationsController.onDNDValueChange(true)\r\n */\r\n onDNDValueChange(value: boolean): void {\r\n var self = this;\r\n self.$rootScope.isNotificationDNDEnabled = value;\r\n self.saveNotificationDNDSetting(value);\r\n }\r\n\r\n /**\r\n *A method to save the Notification DND Setting\r\n * @method Fxp.Controllers.NotificationsController.saveNotificationDNDSetting\r\n * @param {boolean} value is a boolean value\r\n * @example Example to use saveNotificationDNDSetting\r\n * NotificationsController.saveNotificationDNDSetting(true)\r\n */\r\n saveNotificationDNDSetting(value: boolean): void {\r\n let self = this;\r\n const source_telemetry = `${this.sourceForTelemetry}.SaveNotificationDNDSetting`;\r\n let userAlias = self.userInfoService.getLoggedInUser();\r\n var propbag = self.fxpLoggerService.createPropertyBag();\r\n let userPreferencesStorageKey =\r\n ApplicationConstants.UserPreferencesStorageKey.replace(\"{0}\", userAlias);\r\n self.fxpContext\r\n .readContext(userPreferencesStorageKey, ApplicationConstants.FxPDbName)\r\n .then(function (context) {\r\n let userPreferences =\r\n context && context.Result ? JSON.parse(context.Result) : {};\r\n userPreferences.isNotificationDNDEnabled = value;\r\n let strUserPreferences = JSON.stringify(userPreferences);\r\n let saveSettingsAPIStartTime = performance.now();\r\n self.settingsService\r\n .saveSettings(\r\n SettingsType.User,\r\n userAlias,\r\n ApplicationConstants.UserPreferencesSettings,\r\n strUserPreferences\r\n )\r\n .then(\r\n function (response) {\r\n var saveSettingsAPIDuration =\r\n performance.now() - saveSettingsAPIStartTime;\r\n var notificationDNDStatus =\r\n userPreferences.isNotificationDNDEnabled\r\n ? \"Enabled\"\r\n : \"Disabled\";\r\n propbag.addToBag(\"NotificationDNDStatus\", notificationDNDStatus);\r\n propbag.addToBag(\r\n FxpConstants.metricConstants.SaveSettingsAPIResponseDuration,\r\n saveSettingsAPIDuration.toString()\r\n );\r\n self.fxpLoggerService.logEvent(\r\n source_telemetry,\r\n `${TelemetryConstants.FXP_TELEMETRY_BASE_NAME}.NotificationDNDStatusChange`,\r\n propbag\r\n );\r\n self.fxpContext.saveContext(\r\n userPreferencesStorageKey,\r\n strUserPreferences,\r\n ApplicationConstants.FxPDbName\r\n );\r\n },\r\n function (error) {\r\n propbag.addToBag(\r\n FxpConstants.metricConstants.Status,\r\n error.status\r\n );\r\n propbag.addToBag(\r\n FxpConstants.metricConstants.StatusText,\r\n error.statusText + \" \" + error.data\r\n );\r\n self.fxpMessage.addMessage(\r\n self.$rootScope.fxpUIConstants.UIMessages\r\n .DNDSaveSettingsFailedError.ErrorMessage,\r\n FxpConstants.messageType.error\r\n );\r\n self.fxpLoggerService.logError(\r\n source_telemetry,\r\n self.$rootScope.fxpUIConstants.UIMessages\r\n .DNDSaveSettingsFailedError.ErrorMessageTitle,\r\n ErrorCodes.SaveNotificationDNDSetting,\r\n null,\r\n propbag\r\n );\r\n }\r\n );\r\n });\r\n }\r\n}\r\n","/**\r\n * @application Fxp\r\n */\r\n/**\r\n * @module Fxp.Controllers\r\n */\r\ndeclare var powerbi: any;\r\ndeclare type IStateService = any;\r\nimport { IActOnBehalfOfControllerScope } from \"../interfaces/IActOnBehalfOfControllerScope\";\r\nimport { ILogger } from \"../interfaces/ILogger\";\r\nimport { FxpMessageService } from \"../../app/banner/FxpMessageService\";\r\nimport { FxpConstants, ApplicationConstants } from \"../common/ApplicationConstants\";\r\nimport { OBOUserService } from \"../services/OBOUserService\";\r\nimport { IFxpContext } from \"../interfaces/IFxpContext\";\r\nimport { IRootScope } from \"../interfaces/IRootScope\";\r\nimport { UserProfileService } from \"../services/userProfileService\";\r\nimport { UserInfoService } from \"../services/UserInfoService\";\r\nimport { LogPropertyBag } from \"../telemetry/LogPropertyBag\";\r\nimport { TelemetryContext } from \"../telemetry/telemetrycontext\";\r\nimport { FxpConfigurationService } from \"../services/FxpConfiguration\";\r\nimport { FxpGlobalStoreService } from \"../services/fxp.global.store.service\";\r\nimport { DashboardService } from \"../services/dashboardService\";\r\nimport { CommonUtils } from \"../utils/CommonUtils\";\r\nimport { ActOnBehalfOfHelper } from \"../factory/ActOnBehalfOfHelper\";\r\nimport { ILeftNavControllerScope } from \"../interfaces/ILeftNavControllerScope\";\r\nimport { FxpRouteService } from \"../services/FxpRouteService\";\r\nimport { SettingsServiceProvider } from \"../provider/SettingsServiceProvider\";\r\nimport { FxpContext } from \"../context/FxpContext\";\r\nimport { SettingsType } from \"../common/SettingsType\";\r\nimport { Resiliency } from \"../resiliency/FxpResiliency\";\r\nimport { HideLoader, ShowLoader } from \"../../app/loader/loader.actions\";\r\nimport { TelemetryConstants } from \"../telemetry/TelemetryConst\";\r\nimport { ErrorCodes } from \"../constants/errorCodes\";\r\nimport { ErrorSeverityLevel } from \"../telemetry/ErrorSeverityLevel\";\r\nimport { MsalAuthenticationService } from \"../services/MsalAuthenticationService\";\r\n/**\r\n * This is page controller to render Power BI pages within FXP through configuration.\r\n * @class Fxp.Controllers.PowerBiPageController\r\n * @classdesc Page controller for Power BI dashboards\r\n * @example \r\n * //To render Power BI dashboards, configure route with below route config:\r\n * \"RouteConfig\": \"{\\\"url\\\":\\\"/PowerBi\\\",\\\"templateUrl\\\":\\\"/templates/powerBi.html\\\",\\\"controller\\\":\\\"PowerBiPageController\\\",\\\"requireADLogin\\\":\\\"true\\\"}\",\r\n */\r\nexport class PowerBiPageController {\r\n\tprivate $stateParams;\r\n\tprivate $scope: angular.IScope;\r\n\tprivate fxpLoggerService: ILogger;\r\n\tprivate fxpMessage: FxpMessageService;\r\n\tprivate fxpConstants: FxpConstants;\r\n\tprivate fxpRouteService: FxpRouteService;\r\n\tprivate msalAuthenticationService: MsalAuthenticationService;\r\n\tprivate http: any; //todo:use angular dt\r\n\tprivate stateParams: any; //todo:use angular dt \r\n\tprivate powerBITokenURL: string = \"https://api.powerbi.com\";\r\n\tprivate powerBIBaseURL: string = \"https://api.powerbi.com/beta/myorg/dashboards\"; //Move this to config or pick dynamically based on the endpoint.\r\n\tprivate powerBIDashboardAPI: string = \"https://app.powerbi.com/dashboardEmbed?dashboardId=&groupId=\";\r\n\tprivate window;\r\n\tprivate rootScope: IRootScope;\r\n\tprivate dashboardId: string;\r\n\tprivate groupId: string;\r\n\tprivate fxpUIStrings: any;\r\n\tprivate powerBiAdalLogin: any;\r\n\tprivate $timeout: any;\r\n\r\n\t//private powerBIDashboardAPI: any;\r\n\tprivate pageLoadStartTime: any;\r\n\tprivate sourceForTelemetry = `${TelemetryConstants.FXP_TELEMETRY_BASE_NAME}.PowerBiPageController`;\r\n\r\n\tconstructor($scope: angular.IScope, $rootScope,\r\n\t\t$stateParams,\r\n\t\t$http,\r\n\t\t$timeout: any,\r\n\t\tfxpLoggerService: ILogger,\r\n\t\tfxpMessage: FxpMessageService,\r\n\t\tmsalAuthenticationService: MsalAuthenticationService,\r\n\t\tprivate fxpGlobalStoreService: FxpGlobalStoreService,\r\n\t\tuserInfoService: UserInfoService) {\r\n\r\n\t\t//Initialize private vars\r\n\t\tvar self = this;\r\n\t\tself.$scope = $scope;\r\n\t\tself.rootScope = $rootScope;\r\n\t\tself.http = $http;\r\n\t\tself.$timeout = $timeout;\r\n\t\tself.fxpMessage = fxpMessage;\r\n\t\tself.msalAuthenticationService = msalAuthenticationService,\r\n\t\tself.fxpConstants = FxpConstants;\r\n\r\n\t\tself.fxpLoggerService = fxpLoggerService;\r\n\t\tself.fxpUIStrings = self.rootScope.fxpUIConstants.UIStrings;\r\n\t\tself.dashboardId = $stateParams.dashboardId;\r\n\t\tself.groupId = $stateParams.groupId;\r\n\t\tself.pageLoadStartTime = performance.now();\r\n\t\tif (userInfoService.isActingOnBehalfOf()) {\r\n\t\t\tfxpMessage.addMessage(self.fxpUIStrings.PowerBiPageStrings.OBOError, FxpConstants.messageType.info, true);\r\n\t\t\tself.logPageLoadMetric();\r\n\t\t}\r\n\t\telse {\r\n\t\t\tself.fxpGlobalStoreService.DispatchGlobalAction(\"Platform\", ShowLoader({loadingText: self.fxpUIStrings.PowerBiPageStrings.LoadingDashboard}));\r\n\r\n\t\t\tif (self.dashboardId != null && self.groupId != null) {\r\n\t\t\t\t//get ADAL token\r\n\t\t\t\tself.http.get(self.powerBIBaseURL).then(function () {\r\n\t\t\t\t\ttry {\r\n\t\t\t\t\t\t//Form the URL\r\n\t\t\t\t\t\tself.powerBIDashboardAPI = self.powerBIDashboardAPI.replace(\"\", self.dashboardId).replace(\"\", self.groupId);\r\n\r\n\t\t\t\t\t\tvar accessTok = msalAuthenticationService.getCachedToken(self.powerBITokenURL);\r\n\t\t\t\t\t\tself.powerBiAdalLogin = accessTok;\r\n\r\n\t\t\t\t\t\tvar config = {\r\n\t\t\t\t\t\t\ttype: 'dashboard',\r\n\t\t\t\t\t\t\taccessToken: accessTok,\r\n\t\t\t\t\t\t\tembedUrl: self.powerBIDashboardAPI\r\n\t\t\t\t\t\t};\r\n\r\n\t\t\t\t\t\tvar dashboardContainer = document.getElementById('dashboardContainer');\r\n\t\t\t\t\t\tvar dashboard = powerbi.embed(dashboardContainer, config);\r\n\t\t\t\t\t\tvar dashboardContainerIframe = angular.element(document.querySelector('#dashboardContainer iframe'));\r\n\r\n\t\t\t\t\t\tvar hideLoader = function () {\r\n\t\t\t\t\t\t\tself.$timeout(function () {\r\n\t\t\t\t\t\t\t\tself.fxpGlobalStoreService.DispatchGlobalAction(\"Platform\", HideLoader({}))\r\n\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t};\r\n\r\n\t\t\t\t\t\tdashboard.on(\"loaded\", function (event) {\r\n\t\t\t\t\t\t\tself.logPageLoadMetric();\r\n\t\t\t\t\t\t});\r\n\r\n\t\t\t\t\t\tdashboardContainerIframe.on('load', hideLoader);\r\n\r\n\t\t\t\t\t\tself.$scope.$on('$destroy', function () {\r\n\t\t\t\t\t\t\tdashboardContainerIframe.off('load', hideLoader)\r\n\t\t\t\t\t\t});\r\n\r\n\t\t\t\t\t\tdashboard.on(\"error\", function (event) {\r\n\t\t\t\t\t\t\tfxpMessage.addMessage(self.fxpUIStrings.PowerBiPageStrings.DashboardRenderError, FxpConstants.messageType.error);\r\n\t\t\t\t\t\t\tself.fxpGlobalStoreService.DispatchGlobalAction(\"Platform\", HideLoader({}));\r\n\t\t\t\t\t\t});\r\n\r\n\t\t\t\t\t\tdashboard.on(\"tileClicked\", function (event) {\r\n\t\t\t\t\t\t\tvar dashboardContainer = document.getElementById('dashboardContainer');\r\n\t\t\t\t\t\t\tdashboardContainer.innerHTML = ''; //Reset the DOM to avoid side effects\r\n\r\n\t\t\t\t\t\t\t//Create iFrame element\r\n\t\t\t\t\t\t\tvar iframe = document.createElement('iframe');\r\n\t\t\t\t\t\t\tiframe.id = \"iFrameEmbedReport\";\r\n\t\t\t\t\t\t\tiframe.width = \"100%\";\r\n\t\t\t\t\t\t\tiframe.height = \"100%\";\r\n\t\t\t\t\t\t\tiframe.setAttribute(\"src\", event.detail.reportEmbedUrl);\r\n\t\t\t\t\t\t\tdashboardContainer.appendChild(iframe);\r\n\t\t\t\t\t\t\tiframe.addEventListener(\"load\", function () {\r\n\t\t\t\t\t\t\t\ttry {\r\n\t\t\t\t\t\t\t\t\tvar accessTok = self.msalAuthenticationService.getCachedToken(self.powerBITokenURL);\r\n\t\t\t\t\t\t\t\t\tvar m = {\r\n\t\t\t\t\t\t\t\t\t\taction: \"loadReport\",\r\n\t\t\t\t\t\t\t\t\t\taccessToken: accessTok\r\n\t\t\t\t\t\t\t\t\t};\r\n\t\t\t\t\t\t\t\t\tvar message = JSON.stringify(m);\r\n\t\t\t\t\t\t\t\t\tvar ifr: any = document.getElementById('iFrameEmbedReport');\r\n\t\t\t\t\t\t\t\t\tifr.contentWindow.postMessage(message, \"*\");\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\tcatch (ex) {\r\n\t\t\t\t\t\t\t\t\t//suppressing the message as of now.\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t});\r\n\r\n\t\t\t\t\t}\r\n\t\t\t\t\tcatch (ex) {\r\n\t\t\t\t\t\tfxpMessage.addMessage(self.fxpUIStrings.PowerBiPageStrings.DashboardRenderError, FxpConstants.messageType.error);\r\n\t\t\t\t\t\tself.logError(self.fxpUIStrings.PowerBiPageStrings.DashboardRenderError, ErrorCodes.ErrorLoadingDashboard);\r\n\t\t\t\t\t\tself.logPageLoadMetric();\r\n\t\t\t\t\t\tself.fxpGlobalStoreService.DispatchGlobalAction(\"Platform\", HideLoader({}));\r\n\t\t\t\t\t}\r\n\t\t\t\t}, function errorCallback(response) {\r\n\t\t\t\t\tfxpMessage.addMessage(self.fxpUIStrings.PowerBiPageStrings.DashboardRenderError, FxpConstants.messageType.error);\r\n\t\t\t\t\tself.logError(self.fxpUIStrings.PowerBiPageStrings.TokenFetchError, ErrorCodes.ErrorFetchingTokenForPowerBI);\r\n\t\t\t\t\tself.logPageLoadMetric();\r\n\t\t\t\t\tself.fxpGlobalStoreService.DispatchGlobalAction(\"Platform\", HideLoader({}));\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\tfxpMessage.addMessage(self.fxpUIStrings.PowerBiPageStrings.DashboardRenderError, FxpConstants.messageType.error);\r\n\t\t\t\tself.logError(self.fxpUIStrings.PowerBiPageStrings.ConfigError, ErrorCodes.ErrorLoadingPowerBiDashboard);\r\n\t\t\t\tself.fxpGlobalStoreService.DispatchGlobalAction(\"Platform\", HideLoader({}));\r\n\t\t\t\tself.logPageLoadMetric();\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tlogError(errorMessage: string, errorCode: string): void {\r\n\t\tvar props = this.fxpLoggerService.createPropertyBag();\r\n\t\tprops.addToBag(\"PowerBiGroupId\", this.groupId);\r\n\t\tprops.addToBag(\"PowerBiDashboardId\", this.dashboardId);\r\n\t\tthis.fxpLoggerService.logError(`${this.sourceForTelemetry}.LogError`, errorMessage, errorCode, null, props, null, null, ErrorSeverityLevel.Medium);\r\n\t}\r\n\r\n\tlogPageLoadMetric(): void {\r\n\t\tvar pageLoadEndTime = performance.now();\r\n\t\tvar pageLoadDuration = pageLoadEndTime - this.pageLoadStartTime;\r\n\t\tthis.fxpLoggerService.logPageLoadMetrics(pageLoadDuration);\r\n\t}\r\n}\r\n\r\nPowerBiPageController.$inject = ['$scope', '$rootScope', '$stateParams', '$http', '$timeout', 'FxpLoggerService', 'FxpMessageService', 'MsalAuthenticationService', 'FxpGlobalStoreService', 'UserInfoService'];","/**\r\n * @application Fxp\r\n */\r\n/**\r\n * @module Fxp.Controllers\r\n */\r\ndeclare type IStateService = any;\r\nimport { IActOnBehalfOfControllerScope } from \"../interfaces/IActOnBehalfOfControllerScope\";\r\nimport { ILogger } from \"../interfaces/ILogger\";\r\nimport { FxpMessageService } from \"../../app/banner/FxpMessageService\";\r\nimport { FxpConstants, ApplicationConstants } from \"../common/ApplicationConstants\";\r\nimport { OBOUserService } from \"../services/OBOUserService\";\r\nimport { IFxpContext } from \"../interfaces/IFxpContext\";\r\nimport { IRootScope } from \"../interfaces/IRootScope\";\r\nimport { UserProfileService } from \"../services/userProfileService\";\r\nimport { UserInfoService } from \"../services/UserInfoService\";\r\nimport { LogPropertyBag } from \"../telemetry/LogPropertyBag\";\r\nimport { TelemetryContext } from \"../telemetry/telemetrycontext\";\r\nimport { FxpConfigurationService } from \"../services/FxpConfiguration\";\r\nimport { FxpGlobalStoreService } from \"../services/fxp.global.store.service\";\r\nimport { DashboardService } from \"../services/dashboardService\";\r\nimport { CommonUtils } from \"../utils/CommonUtils\";\r\nimport { ActOnBehalfOfHelper } from \"../factory/ActOnBehalfOfHelper\";\r\nimport { ILeftNavControllerScope } from \"../interfaces/ILeftNavControllerScope\";\r\nimport { FxpRouteService } from \"../services/FxpRouteService\";\r\nimport { SettingsServiceProvider } from \"../provider/SettingsServiceProvider\";\r\nimport { FxpContext } from \"../context/FxpContext\";\r\nimport { SettingsType } from \"../common/SettingsType\";\r\nimport { Resiliency } from \"../resiliency/FxpResiliency\";\r\nimport { IRoleNavPersonalizationController } from \"../interfaces/IRoleNavPersonalizationController\";\r\nimport { PersonalizationService } from \"../services/PersonalizationService\";\r\nimport { FxpLogHelper } from \"../telemetry/FxpLogHelper\";\r\nimport { FxpBroadcastedEvents } from \"../services/FxpBroadcastedEvents\";\r\nimport { HideLoader, HideSpecificLoader, ShowLoader, ShowSpecificLoader } from \"../../app/loader/loader.actions\";\r\nimport { UI_LOADER_NAMES } from \"../../app/loader/UILoader.constants\";\r\nimport { ErrorCodes } from \"../constants/errorCodes\";\r\nimport { ErrorSeverityLevel } from \"../telemetry/ErrorSeverityLevel\";\r\nimport { TelemetryConstants } from \"../telemetry/TelemetryConst\";\r\n\r\n/**\r\n * A main controller for FxpApp module. This is the controller having basic models and events.\r\n * @class Fxp.Controllers.RoleNavPersonalizationController\r\n * @classdesc A Manage RoleNav Personalization Controllercontroller of FxpApp module\r\n * @example \r\n * //To Use AppController\r\n * angular.module('FxPApp').controller('RoleNavPersonalizationController', ['AnyDependency']);\r\n * function RoleNavPersonalizationController(AnyDependency){ AnyDependency.doSomething(); }\r\n */\r\nexport class RoleNavPersonalizationController {\r\n\tprivate $rootScope: IRootScope;\r\n\tprivate $scope: IRoleNavPersonalizationController;\r\n\tprivate state: IStateService;\r\n\tprivate fxpLogger: ILogger;\r\n\tprivate personalizationService: PersonalizationService;\r\n\tprivate fxpMessage: FxpMessageService;\r\n\tprivate fxpConfiguration: any;\r\n\tprivate roleGroupNavPersonalizationList: any;\r\n\tprivate globalNavMasterList: any;\r\n\tprivate parallelRequsetCounter: number;\r\n\tprivate personalizationConstants: any;\r\n\tprivate fxpConstants: FxpConstants;\r\n\tprivate pageLoadStartTime: number;\r\n\tprivate personalizedRoleGroupNav: any;\r\n\tprivate previousSelectedRole: any;\r\n\tprivate isRoleGroupPersonalizedListChanged: boolean = false;\r\n\tprivate previousSelectedRoleGroup: any;\r\n\tprivate defaultRoleGroup: any;\r\n\tprivate timeout: any;\r\n\tprivate isStateChanged: boolean;\r\n\tprivate toState: any\r\n\tprivate toParams: any;\r\n\tprivate window: angular.IWindowService;\r\n\tprivate fxpRouteService: FxpRouteService;\r\n\tprivate sourceForTelemetry = `${TelemetryConstants.FXP_TELEMETRY_BASE_NAME}.RoleNavPersonalizationController`;\r\n\tconstructor($rootScope: IRootScope, $state: IStateService, $scope: IRoleNavPersonalizationController, fxpLoggerService: ILogger,\r\n\t\tprivate fxpGlobalStoreService: FxpGlobalStoreService, fxpMessage: FxpMessageService, personalizationService: PersonalizationService, fxpConfiguration: FxpConfigurationService, $timeout: any, $window: angular.IWindowService, fxpRouteService: FxpRouteService) {\r\n\t\tthis.pageLoadStartTime = performance.now();\r\n\t\tthis.$rootScope = $rootScope;\r\n\t\tthis.$scope = $scope;\r\n\t\tthis.state = $state;\r\n\t\tthis.timeout = $timeout;\r\n\t\tthis.window = $window;\r\n\t\tthis.fxpLogger = fxpLoggerService;\r\n\t\tthis.fxpConstants = FxpConstants;\r\n\t\tthis.roleGroupNavPersonalizationList = [];\r\n\t\tthis.globalNavMasterList = [];\r\n\t\tthis.personalizedRoleGroupNav = [];\r\n\t\tthis.fxpMessage = fxpMessage;\r\n\t\tthis.personalizationService = personalizationService;\r\n\t\tthis.fxpRouteService = fxpRouteService;\r\n\t\tthis.$scope.selectedGlobalLeftNavItems = this.selectedGlobalLeftNavItems.bind(this);\r\n\t\tthis.$scope.addToRoleNavPersonalizationList = this.addToRoleNavPersonalizationList.bind(this);\r\n\t\tthis.$scope.removeRoleGroupNavPresonalization = this.removeRoleGroupNavPresonalization.bind(this);\r\n\t\tthis.$scope.submitRoleGroupNavPresonalization = this.submitRoleGroupNavPresonalization.bind(this);\r\n\t\tthis.$scope.selectedRoleGroupNavItems = this.selectedRoleGroupNavItems.bind(this);\r\n\t\tthis.$scope.showConfirmPopup = this.showConfirmPopup.bind(this);\r\n\t\tthis.$scope.pullFocusToElement = this.pullFocusToElement.bind(this);\r\n\t\tthis.$scope.isParentLinkEnabled = this.isParentLinkEnabled.bind(this);\r\n\t\tthis.$scope.showConfirmSavePopup = this.showConfirmSavePopup.bind(this);\r\n\t\tthis.$scope.hideConfirmSavePopup = this.hideConfirmSavePopup.bind(this);\r\n\t\tthis.$scope.hideUnsavedConfirmPopup = this.hideUnsavedConfirmPopup.bind(this);\r\n\t\tthis.$scope.leaveConfirmPopup = this.leaveConfirmPopup.bind(this);\r\n\t\tthis.$scope.submitButtonDisabled = this.submitButtonDisabled.bind(this);\r\n\t\tthis.$scope.onRoleGroupChange = this.onRoleGroupChange.bind(this);\r\n\t\tthis.parallelRequsetCounter = 0;\r\n\t\tthis.defaultRoleGroup = fxpConfiguration.FxpBaseConfiguration.DefaultRoleGroup;\r\n\t\tthis.isStateChanged = false;\r\n\t\tthis.toState = null;\r\n\t\tthis.toParams = null;\r\n\t\tvar self = this;\r\n\t\tself.fxpGlobalStoreService.DispatchGlobalAction(\"Platform\", ShowLoader({loadingText: self.$rootScope.fxpUIConstants.UIMessages.LoadingMessage}));\r\n\t\tself.getRoleGroupDetails();\r\n\t\tself.$scope.$on('$stateChangeStart', function (event, toState, toParams, fromState, fromParams) {\r\n\t\t\tif (!CommonUtils.isNullOrEmpty(self.personalizedRoleGroupNav.AddedItems) || !CommonUtils.isNullOrEmpty(self.personalizedRoleGroupNav.RemovedItems)) {\r\n\t\t\t\tself.isRoleGroupPersonalizedListChanged = false;\r\n\t\t\t\tself.$scope.displayUnsavedChangesPopup = true;\r\n\t\t\t\tself.isStateChanged = true;\r\n\t\t\t\tself.toState = toState;\r\n\t\t\t\tself.toParams = toParams;\r\n\t\t\t\tevent.preventDefault();\r\n\t\t\t\tself.timeout(function () { CommonUtils.pullFocusToElement('role-group-popup'); });\r\n\t\t\t}\r\n\t\t});\r\n\t\tself.window.onbeforeunload = function (event) {\r\n\t\t\tif (!CommonUtils.isNullOrEmpty(self.personalizedRoleGroupNav.AddedItems) || !CommonUtils.isNullOrEmpty(self.personalizedRoleGroupNav.RemovedItems)) {\r\n\t\t\t\treturn \"\";\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t* A method to Get the getRoleGroupDetails\r\n\t* @method Fxp.Controllers.RoleNavPersonalizationController.getRoleGroupDetails\r\n\t* @example Example to use getRoleGroupDetails\r\n\t* RoleNavPersonalizationController.getRoleGroupDetails()\r\n\t*/\r\n\tgetRoleGroupDetails(): void {\r\n\t\tvar self = this;\r\n\t\tself.$scope.selectedRoleGroup = null;\r\n\t\tself.resetNavigationLists();\r\n\t\tif (!self.$scope.roleGroupDetails) {\r\n\t\t\tvar getRoleGroupDetailsAPIStartTime = performance.now();\r\n\t\t\tself.personalizationService.getRoleGroupDetails().then(function (response) {\r\n\t\t\t\tself.logTelemetryForRolePersonalization(`${TelemetryConstants.FXP_TELEMETRY_BASE_NAME}.GetRoleGroupDetailsAPIDuration`, getRoleGroupDetailsAPIStartTime);\r\n\t\t\t\tself.logTelemetryForRolePersonalization(\"ManageRoleNavigationPageLoadDuration\", self.pageLoadStartTime);\r\n\t\t\t\tif (!CommonUtils.isNullOrEmpty(response.data)) {\r\n\t\t\t\t\tself.$scope.roleGroupDetails = response.data.tenantRoles[Object.keys(response.data.tenantRoles)[0]].roles;\r\n\t\t\t\t\tself.fxpGlobalStoreService.DispatchGlobalAction(\"Platform\", HideLoader({}));\r\n\t\t\t\t}\r\n\t\t\t}, function (error) {\r\n\t\t\t\tself.logTelemetryForRolePersonalization(\"getRoleGroupDetailsAPIDuration\", getRoleGroupDetailsAPIStartTime);\r\n\t\t\t\tself.logTelemetryForRolePersonalization(\"ManageRoleNavigationPageLoadDuration\", self.pageLoadStartTime);\r\n\t\t\t\tvar exceptionMessage = {\r\n\t\t\t\t\tErrorMessage: self.$rootScope.fxpUIConstants.UIMessages.GeneralExceptionError.ErrorMessage,\r\n\t\t\t\t\tErrorMessageTitle: self.$rootScope.fxpUIConstants.UIMessages.RoleGroupsPersonalisationExceptionError.ErrorMessageTitle\r\n\t\t\t\t}\r\n\t\t\t\tself.showAndLoggingErrorMsg(error, exceptionMessage, ErrorCodes.GetRoleGroupDetailsPersonalization_Failure);\r\n\t\t\t});\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * A method to Get the Navigation list of the selected rolegroup\r\n\t * @method Fxp.Controllers.RoleNavPersonalizationController.onRoleGroupChange\r\n\t * @example Example to use onRoleGroupChange\r\n\t * RoleNavPersonalizationController.onRoleGroupChange()\r\n\t */\r\n\tonRoleGroupChange(): void {\r\n\t\tlet self = this, totalDuration;\r\n\t\tvar getRoleDetailsStartTime = performance.now();\r\n\t\tif (!CommonUtils.isNullOrEmpty(self.personalizedRoleGroupNav.AddedItems) || !CommonUtils.isNullOrEmpty(self.personalizedRoleGroupNav.RemovedItems)) {\r\n\t\t\tself.isRoleGroupPersonalizedListChanged = true;\r\n\t\t\tself.$scope.displayUnsavedChangesPopup = true;\r\n\t\t\tself.timeout(function () { CommonUtils.pullFocusToElement('role-group-popup'); });\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tself.previousSelectedRoleGroup = self.$scope.selectedRoleGroup;\r\n\t\tself.logTelemetryForRolePersonalization(\"RoleDetailsDropdownUIRenderDuration\", getRoleDetailsStartTime);\r\n\t\tself.resetRolePersonalization();\r\n\t}\r\n\r\n\t/**\r\n\t* A method to reset the Personalized Role Group Navigation\r\n\t* @method Fxp.Controllers.RoleNavPersonalizationController.resetRolePersonalization\r\n\t* @example Example to use resetRolePersonalization\r\n\t* RoleNavPersonalizationController.resetRolePersonalization()\r\n\t*/\r\n\tresetRolePersonalization(): void {\r\n\t\tvar self = this;\r\n\t\tself.parallelRequsetCounter = 0;\r\n\t\tself.resetNavigationLists();\r\n\t\tif (self.$scope.selectedRoleGroup) {\r\n\t\t\tself.fxpGlobalStoreService.DispatchGlobalAction(\"Platform\", ShowLoader({loadingText: self.$rootScope.fxpUIConstants.UIMessages.LoadingMessage}));\r\n\t\t\tif (self.globalNavMasterList.length == 0)\r\n\t\t\t\tself.getGlobalNavMasterList();\r\n\t\t\tself.getRoleGroupNavList();\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t* A method to reset the Personalized Role Group Navigation\r\n\t* @method Fxp.Controllers.RoleNavPersonalizationController.resetPersonalizedRoleGroupNav\r\n\t* @example Example to use resetPersonalizedRoleGroupNav\r\n\t* RoleNavPersonalizationController.resetPersonalizedRoleGroupNav()\r\n\t*/\r\n\tresetNavigationLists(): void {\r\n\t\tvar self = this;\r\n\t\tself.$scope.navigationList = [];\r\n\t\tself.personalizedRoleGroupNav = { \"AddedItems\": [], \"RemovedItems\": [] };\r\n\t\tself.$scope.isAddPersonalizeAllow = false;\r\n\t\tself.$scope.isRemovePersonalizeAllow = false;\r\n\t}\r\n\r\n\t/**\r\n\t* A method to Get the GlobalNavMasterList for FxpAdmin User\r\n\t* @method Fxp.Controllers.RoleNavPersonalizationController.getGlobalNavMasterList\r\n\t* @example Example to use getGlobalNavMasterList\r\n\t* RoleNavPersonalizationController.getGlobalNavMasterList()\r\n\t*/\r\n\tgetGlobalNavMasterList(): void {\r\n\t\tlet self = this;\r\n\t\tself.parallelRequsetCounter++;\r\n\t\tvar getMasterLeftNavAPIStartTime = performance.now();\r\n\t\tself.personalizationService.getMasterLeftNavItems().then(function (response) {\r\n\t\t\tself.logTelemetryForRolePersonalization(`${self.sourceForTelemetry}.getGlobalNavMasterListAPIDuration`, getMasterLeftNavAPIStartTime);\r\n\t\t\tif (!CommonUtils.isNullOrEmpty(response.data.result)) {\r\n\t\t\t\tself.globalNavMasterList = response.data.result;\r\n\t\t\t\tself.fxpLogger.logInformation(`${self.sourceForTelemetry}.GetGlobalNavMasterList`, `${TelemetryConstants.FXP_TELEMETRY_BASE_NAME}.GetMasterLeftNavItemsSuccess`);\r\n\t\t\t\tself.parallelRequsetCounter--;\r\n\t\t\t\tif (self.parallelRequsetCounter == 0) {\r\n\t\t\t\t\tself.mergeGlobalAndRolePreferenceNavigationList();\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}, function (exception) {\r\n\t\t\tself.logTelemetryForRolePersonalization(\"getGlobalNavMasterListAPIDuration\", getMasterLeftNavAPIStartTime);\r\n\t\t\tvar exceptionMessage = {\r\n\t\t\t\tErrorMessage: self.$rootScope.fxpUIConstants.UIMessages.GeneralExceptionError.ErrorMessage,\r\n\t\t\t\tErrorMessageTitle: self.$rootScope.fxpUIConstants.UIMessages.RoleGroupsMasterListExceptionError.ErrorMessageTitle\r\n\t\t\t}\r\n\t\t\tself.showAndLoggingErrorMsg(exception, exceptionMessage, ErrorCodes.GetGlobalNavMasterList_Failure);\r\n\t\t});\r\n\t}\r\n\r\n\t/**\r\n\t*A method to Get the RoleGroupNavList\r\n\t* @method Fxp.Controllers.RoleNavPersonalizationController.getUserNavList\r\n\t* @example Example to use getUserNavList\r\n\t* RoleNavPersonalizationController.getUserNavList()\r\n\t*/\r\n\tgetRoleGroupNavList(): void {\r\n\t\tlet self = this;\r\n\t\tself.parallelRequsetCounter++;\r\n\t\tvar getRoleGroupNavListAPIStartTime = performance.now();\r\n\t\tself.personalizationService.getRoleGroupPersonalizedList(self.$scope.selectedRoleGroup.roleName).then(function (response) {\r\n\t\t\tself.logTelemetryForRolePersonalization(\"getRoleGroupNavListAPIDuration\", getRoleGroupNavListAPIStartTime);\r\n\t\t\tif (!CommonUtils.isNullOrEmpty(response.data.result)) {\r\n\t\t\t\tself.fxpLogger.logInformation(`${self.sourceForTelemetry}.GetRoleGroupNavList`,\r\n\t\t\t\t\t`${TelemetryConstants.FXP_TELEMETRY_BASE_NAME}.GetPersonalizedRoleGroupNavItemsSuccess`);\r\n\t\t\t\tself.roleGroupNavPersonalizationList = response.data.result;\r\n\t\t\t\tself.parallelRequsetCounter--;\r\n\t\t\t\tif (self.parallelRequsetCounter == 0) {\r\n\t\t\t\t\tself.mergeGlobalAndRolePreferenceNavigationList();\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\tself.mergeGlobalAndRolePreferenceNavigationList();\r\n\t\t\t}\r\n\t\t}, function (exception) {\r\n\t\t\tself.logTelemetryForRolePersonalization(\"getRoleGroupNavListAPIDuration\", getRoleGroupNavListAPIStartTime);\r\n\t\t\tvar exceptionMessage = {\r\n\t\t\t\tErrorMessage: self.$rootScope.fxpUIConstants.UIMessages.GeneralExceptionError.ErrorMessage,\r\n\t\t\t\tErrorMessageTitle: self.$rootScope.fxpUIConstants.UIMessages.RoleGroupsDefaultListExceptionError.ErrorMessageTitle\r\n\t\t\t}\r\n\t\t\tself.showAndLoggingErrorMsg(exception, exceptionMessage, ErrorCodes.GetRoleGroupNavList_Failure);\r\n\t\t});\r\n\t}\r\n\r\n\t/**\r\n\t* A method used to merge Global And Role Preference Navigation List\r\n\t* @method Fxp.Controllers.RoleNavPersonalizationController.mergeGlobalAndRolePreferenceNavigationList\r\n\t* @example Example to use mergeGlobalAndRolePreferenceNavigationList\r\n\t* RoleNavPersonalizationController.mergeGlobalAndRolePreferenceNavigationList()\r\n\t*/\r\n\tmergeGlobalAndRolePreferenceNavigationList(): void {\r\n\t\tlet self = this;\r\n\t\tvar renderMasterAndRoleGroupListStartTime = performance.now();\r\n\t\tself.$scope.navigationList = angular.copy(self.globalNavMasterList);\r\n\t\tconsole.log(self.$scope.navigationList);\r\n\t\tlet userNavlength = self.roleGroupNavPersonalizationList.length;\r\n\t\tfor (let i = 0; i < userNavlength; i++) {\r\n\t\t\tlet globalNavIndex = self.getIndexOfObject(self.$scope.navigationList, \"id\", self.roleGroupNavPersonalizationList[i].id);\r\n\t\t\tif (globalNavIndex > -1 && self.roleGroupNavPersonalizationList[i].applicableDevice != FxpConstants.applicableDevice.mobile) {\r\n\t\t\t\tself.$scope.navigationList[globalNavIndex].isPersonaDefault = self.roleGroupNavPersonalizationList[i].isPersonaDefault;\r\n\t\t\t\tself.$scope.navigationList[globalNavIndex].isRoleGroupLeftNavItem = true;\r\n\t\t\t\tif (self.roleGroupNavPersonalizationList[i].hasChildren && self.roleGroupNavPersonalizationList[i].children != null) {\r\n\t\t\t\t\tlet roleGroupChildNavLength = self.roleGroupNavPersonalizationList[i].children.length;\r\n\t\t\t\t\tfor (let j = 0; j < roleGroupChildNavLength; j++) {\r\n\t\t\t\t\t\tlet globalNavChildIndex = self.getIndexOfObject(self.$scope.navigationList[globalNavIndex].children, \"id\", self.roleGroupNavPersonalizationList[i].children[j].id);\r\n\t\t\t\t\t\tif (globalNavChildIndex > -1) {\r\n\t\t\t\t\t\t\tself.$scope.navigationList[globalNavIndex].children[globalNavChildIndex].isPersonaDefault = self.roleGroupNavPersonalizationList[i].children[j].isPersonaDefault;\r\n\t\t\t\t\t\t\tself.$scope.navigationList[globalNavIndex].children[globalNavChildIndex].isRoleGroupLeftNavItem = true;\r\n\t\t\t\t\t\t\tself.$scope.navigationList[globalNavIndex].children[globalNavChildIndex].isChildSelected = true;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tself.fxpGlobalStoreService.DispatchGlobalAction(\"Platform\", HideLoader({}));\r\n\t\tself.logTelemetryForRolePersonalization(\"renderUIMasterAndRoleOrRoleGroupList\", renderMasterAndRoleGroupListStartTime);\r\n\t}\r\n\r\n\t/**\r\n\t *A method to use log Error And NavigateToUserSelectionPage\r\n\t * @method Fxp.Controllers.RoleNavPersonalizationController.showAndLoggingErrorMsg\r\n\t * @param {any} exception contains catch block exception\r\n\t * @param {any} exceptionMessage contains errorMessage and errorMessageTitle\r\n\t * @example Example to use showAndLoggingErrorMsg\r\n\t * RoleNavPersonalizationController.showAndLoggingErrorMsg()\r\n\t */\r\n\tshowAndLoggingErrorMsg(exception, exceptionMessage, errorCode): void {\r\n\t\tvar self = this;\r\n\t\tself.parallelRequsetCounter--;\r\n\t\tself.fxpGlobalStoreService.DispatchGlobalAction(\"Platform\", HideLoader({}));\r\n\t\tself.fxpMessage.addMessage(exceptionMessage.ErrorMessage, FxpConstants.messageType.error);\r\n\t\tvar propbag = self.fxpLogger.createPropertyBag();\r\n\t\tif (exception == null) {\r\n\t\t\texception = {};\r\n\t\t\texception.message = exceptionMessage.ErrorMessage;\r\n\t\t\tpropbag.addToBag(FxpConstants.metricConstants.ErrorText, exception.message);\r\n\t\t} else {\r\n\t\t\tpropbag.addToBag(FxpConstants.metricConstants.Status, exception.status);\r\n\t\t\tpropbag.addToBag(FxpConstants.metricConstants.StatusText, exception.statusText);\r\n\t\t\tpropbag.addToBag(FxpConstants.metricConstants.ErrorUrl, exception.config ? exception.config.url : '');\r\n\t\t}\r\n\r\n\t\tif (self.$scope.selectedRoleGroup){\r\n\t\t\tconst selectedRoleOrRoleGroup = self.$scope.selectedRoleGroup.roleName;\r\n\t\t\tpropbag.addToBag(\"personalizationRoleOrRoleGroup\", selectedRoleOrRoleGroup);\r\n\t\t}\r\n\t\tself.fxpLogger.logError(`${self.sourceForTelemetry}.ShowAndLoggingErrorMsg`, exceptionMessage.ErrorMessageTitle, errorCode, null, propbag, null, null, ErrorSeverityLevel.Medium);\r\n\t}\r\n\r\n\t/**\r\n\t*A method to use Add/Remove Selected Global Left Nav Items. \r\n\t* @method Fxp.Controllers.RoleNavPersonalizationController.selectedGlobalLeftNavItems\r\n\t* @param {any} parentItem selected parent item from master list \r\n\t* @param {any} childItem selected child item from master list\r\n\t* @example Example to use selectedGlobalLeftNavItems\r\n\t* RoleNavPersonalizationController.selectedGlobalLeftNavItems(parentItem,childItem)\r\n\t*/\r\n\tselectedGlobalLeftNavItems(parentItem, childItem): void {\r\n\t\tlet self = this;\r\n\t\tif (CommonUtils.isNullOrEmpty(childItem)) {\r\n\t\t\tangular.forEach(parentItem.children, function (item) {\r\n\t\t\t\tif (!angular.isDefined(item.isRoleGroupLeftNavItem)) {\r\n\t\t\t\t\titem.isChildSelected = parentItem.isParentSelected;\r\n\t\t\t\t}\r\n\t\t\t});\r\n\r\n\t\t} else {\r\n\t\t\t//length is verifying for if any element is checked under Lo if not splice Lo from selected list\r\n\t\t\tparentItem.isParentSelected = parentItem.children.every(function (item) { return item.isChildSelected; });\r\n\t\t}\r\n\t\tself.$scope.isAddPersonalizeAllow = self.isItemAllowToAdd();\r\n\r\n\t}\r\n\t/**\r\n\t* A method to use Enable/Disable Add Button. \r\n\t* @method Fxp.Controllers.RoleNavPersonalizationController.isItemAllowToAdd\r\n\t* @example Example to use isItemAllowToAdd\r\n\t* RoleNavPersonalizationController.isItemAllowToAdd()\r\n\t*/\r\n\tisItemAllowToAdd(): boolean {\r\n\t\tvar self = this;\r\n\t\tvar flag;\r\n\t\tvar navigationListLength = self.$scope.navigationList.length;\r\n\t\tfor (let i = 0; i < navigationListLength; i++) {\r\n\t\t\tvar parentItem = self.$scope.navigationList[i];\r\n\t\t\t// check if parent items are selected.\r\n\t\t\tif (parentItem.isParentSelected && !angular.isDefined(parentItem.isRoleGroupLeftNavItem)) {\r\n\t\t\t\tflag = true;\r\n\t\t\t\tbreak;\r\n\t\t\t} else {\r\n\t\t\t\t// check if child items are selected\r\n\t\t\t\tif (parentItem.hasChildren && parentItem.children != null) {\r\n\t\t\t\t\tvar parentItemChildrenLength = parentItem.children.length;\r\n\t\t\t\t\tfor (var j = 0; j < parentItemChildrenLength; j++) {\r\n\t\t\t\t\t\tvar childItem = parentItem.children[j];\r\n\t\t\t\t\t\tif (childItem.isChildSelected && !angular.isDefined(childItem.isRoleGroupLeftNavItem)) {\r\n\t\t\t\t\t\t\tflag = true;\r\n\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn flag;\r\n\t}\r\n\r\n\r\n\t/**\r\n\t*A method to use Add selected Global Left Nav Items to RoleGroup Navigation List\r\n\t* @method Fxp.Controllers.RoleNavPersonalizationController.selectedGlobalLeftNavItems\r\n\t* @example Example to use addToRoleNavPersonalizationList\r\n\t* RoleNavPersonalizationController.addToRoleNavPersonalizationList()\r\n\t*/\r\n\taddToRoleNavPersonalizationList(): void {\r\n\t\tvar self = this;\r\n\t\tlet focusIndex = false;\r\n\t\tlet isFocusedElement = false;\r\n\t\t// sorting navigation list object\r\n\t\tself.sortObject(self.$scope.navigationList, \"sortOrder\");\r\n\t\tlet navigationListLength = self.$scope.navigationList.length;\r\n\t\tlet isParentToAdd = false;\r\n\t\tfor (let i = 0; i < navigationListLength; i++) {\r\n\t\t\tif (self.$scope.navigationList[i].hasChildren && self.$scope.navigationList[i].children != null) {\r\n\t\t\t\tlet childLength = self.$scope.navigationList[i].children.length;\r\n\t\t\t\tlet childNav = self.$scope.navigationList[i].children;\r\n\t\t\t\tisParentToAdd = false;\r\n\t\t\t\tfor (let j = 0; j < childLength; j++) {\r\n\t\t\t\t\tif ((childNav[j].isChildSelected) && (!angular.isDefined(childNav[j].isRoleGroupLeftNavItem))) {\r\n\t\t\t\t\t\tchildNav[j].isPersonaDefault = false;\r\n\t\t\t\t\t\tchildNav[j].isRoleGroupLeftNavItem = true;\r\n\t\t\t\t\t\tisParentToAdd = true;\r\n\t\t\t\t\t\tif (!isFocusedElement)\r\n\t\t\t\t\t\t\tself.$scope.navigationList[i].isFocusedElement = isFocusedElement = true;\r\n\t\t\t\t\t\tself.manageRoleGroupNavChildItem(childNav[j], FxpConstants.ActionTypes.Add);\r\n\t\t\t\t\t}\r\n\t\t\t\t\tchildNav[j].isChildSelected = self.isParentLinkEnabled(childNav[j]);\r\n\t\t\t\t}\r\n\t\t\t\tif (isParentToAdd) {\r\n\t\t\t\t\tif ((!angular.isDefined(self.$scope.navigationList[i].isRoleGroupLeftNavItem))) {\r\n\t\t\t\t\t\tself.$scope.navigationList[i].isPersonaDefault = false;\r\n\t\t\t\t\t\tself.$scope.navigationList[i].isRoleGroupLeftNavItem = true;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tself.$scope.navigationList[i].isHideButtonVisible = true;\r\n\t\t\t\t}\r\n\t\t\t} else {\r\n\t\t\t\tif ((self.$scope.navigationList[i].isParentSelected) && (self.$scope.navigationList[i].isPersonalizationAllowed) && (!angular.isDefined(self.$scope.navigationList[i].isRoleGroupLeftNavItem))) {\r\n\t\t\t\t\tself.$scope.navigationList[i].isPersonaDefault = false;\r\n\t\t\t\t\tself.$scope.navigationList[i].isRoleGroupLeftNavItem = true;\r\n\t\t\t\t\tself.$scope.navigationList[i].isHideButtonVisible = true;\r\n\t\t\t\t\tif (!isFocusedElement)\r\n\t\t\t\t\t\tself.$scope.navigationList[i].isFocusedElement = isFocusedElement = true;\r\n\r\n\t\t\t\t\tself.manageRoleGroupParentItem(self.$scope.navigationList[i], FxpConstants.ActionTypes.Add);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tself.$scope.navigationList[i].isParentSelected = self.isParentLinkEnabled(self.$scope.navigationList[i]);\r\n\t\t}\r\n\t\tself.$scope.isAddPersonalizeAllow = false;\r\n\t\tif (!isFocusedElement)\r\n\t\t\tself.setFocusToGlobalNavMasterItem(true);\r\n\t\tself.changeTabIndexOfUserList(\"#role-group-master-navigation-list\");\r\n\t}\r\n\r\n\t/**\r\n\t *A method to use Remove Selected Items from RoleGroup Navigation List\r\n\t * @method Fxp.Controllers.RoleNavPersonalizationController.removeRoleGroupNavPresonalization\r\n\t * @example Example to use removeRoleGroupNavPresonalization\r\n\t * RoleNavPersonalizationController.removeRoleGroupNavPresonalization()\r\n\t */\r\n\tremoveRoleGroupNavPresonalization(): void {\r\n\t\tvar self = this;\r\n\t\tself.$scope.isRemovePersonalizeAllow = false;\r\n\t\tlet navigationListLength = self.$scope.navigationList.length;\r\n\t\tfor (let i = 0; i < navigationListLength; i++) {\r\n\t\t\tif (self.$scope.navigationList[i].hasChildren && self.$scope.navigationList[i].children != null) {\r\n\t\t\t\tlet childLength = self.$scope.navigationList[i].children.length;\r\n\t\t\t\tlet childNav = self.$scope.navigationList[i].children;\r\n\t\t\t\tfor (let j = 0; j < childLength; j++) {\r\n\t\t\t\t\tif ((childNav[j].isSelected) && (angular.isDefined(childNav[j].isRoleGroupLeftNavItem)) && (!childNav[j].isPersonaDefault)) {\r\n\t\t\t\t\t\tdelete childNav[j].isRoleGroupLeftNavItem;\r\n\t\t\t\t\t\tself.manageRoleGroupNavChildItem(childNav[j], FxpConstants.ActionTypes.Remove);\r\n\t\t\t\t\t}\r\n\t\t\t\t\tchildNav[j].isSelected = false;\r\n\t\t\t\t\tchildNav[j].isChildSelected = self.isParentLinkEnabled(childNav[j]);\r\n\t\t\t\t}\r\n\t\t\t\tvar childlength = self.$scope.navigationList[i].children.reduce(function (item, navItem) {\r\n\t\t\t\t\treturn item + angular.isDefined(navItem.isRoleGroupLeftNavItem);\r\n\t\t\t\t}, 0);\r\n\t\t\t\tif (childlength === 0) {\r\n\t\t\t\t\tif (!self.$scope.navigationList[i].isPersonaDefault) {\r\n\t\t\t\t\t\tdelete self.$scope.navigationList[i].isRoleGroupLeftNavItem;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tself.$scope.navigationList[i].isSelected = false;\r\n\t\t\t\tself.$scope.navigationList[i].isParentSelected = self.isParentLinkEnabled(self.$scope.navigationList[i]);\r\n\t\t\t} else {\r\n\t\t\t\tif ((self.$scope.navigationList[i].isSelected) && (!self.$scope.navigationList[i].isPersonaDefault)) {\r\n\t\t\t\t\tdelete self.$scope.navigationList[i].isRoleGroupLeftNavItem;\r\n\t\t\t\t\tself.$scope.navigationList[i].isSelected = false;\r\n\t\t\t\t\tself.$scope.navigationList[i].isParentSelected = self.isParentLinkEnabled(self.$scope.navigationList[i]);\r\n\t\t\t\t\tself.manageRoleGroupParentItem(self.$scope.navigationList[i], FxpConstants.ActionTypes.Remove);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\tself.setFocusToGlobalNavMasterItem(true);\r\n\t\tself.changeTabIndexOfUserList(\"#default-navigation-container\");\r\n\t}\r\n\r\n\t/**\r\n\t *A method to use Select/Unselect from User Navigation List\r\n\t * @method Fxp.Controllers.RoleNavPersonalizationController.selectedRoleGroupNavItems\r\n\t * @param {any} parentItem selected item from default rolegroup\r\n\t * @param {boolean} isParent selected item is parent or not\r\n\t * @example Example to use selectedRoleGroupNavItems\r\n\t * RoleNavPersonalizationController. selectedRoleGroupNavItems(parentItem, isParent)\r\n\t */\r\n\tselectedRoleGroupNavItems(parentItem, isParent): void {\r\n\t\tvar self = this;\r\n\t\tif (isParent) {\r\n\t\t\tangular.forEach(parentItem.children, function (item, key) {\r\n\t\t\t\tif (!item.isPersonaDefault) {\r\n\t\t\t\t\titem.isSelected = parentItem.isSelected;\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t} else {\r\n\t\t\tparentItem.isSelected = (!parentItem.isPersonaDefault) ? \r\n\t\t\t\tparentItem.children.filter(function (item) { \r\n\t\t\t\t\treturn (angular.isDefined(item.isRoleGroupLeftNavItem) && !item.isPersonaDefault); \r\n\t\t\t\t}).every(function (item) { \r\n\t\t\t\t\treturn item.isSelected; \r\n\t\t\t\t}) : false;\r\n\t\t}\r\n\t\tself.$scope.isRemovePersonalizeAllow = self.isItemAllowToRemove();\r\n\t\tself.setFocusToGlobalNavMasterItem(false);\r\n\t}\r\n\r\n\t/**\r\n\t*A method to use submit RoleGroup Navigation Preferences\r\n\t* @method Fxp.Controllers.RoleNavPersonalizationController.submitRoleGroupNavPresonalization\r\n\t* @example Example to use submitRoleGroupNavPresonalization\r\n\t* RoleNavPersonalizationController. submitRoleGroupNavPresonalization()\r\n\t*/\r\n\tsubmitRoleGroupNavPresonalization(): void {\r\n\t\tvar self = this, totalDuration;\r\n\t\tconst telemetry_source = `${self.sourceForTelemetry}.SubmitRoleGroupNavPresonalization`; \r\n\t\tif (!CommonUtils.isNullOrEmpty(self.personalizedRoleGroupNav.AddedItems) || !CommonUtils.isNullOrEmpty(self.personalizedRoleGroupNav.RemovedItems)) {\r\n\t\t\tself.fxpGlobalStoreService.DispatchGlobalAction(\"Platform\", ShowSpecificLoader({name: UI_LOADER_NAMES.FXP_LOADERS.ROLE_NAV_PERSONALIZATION_LOADER, loadingText: self.$rootScope.fxpUIConstants.UIMessages.LoadingMessage}));\r\n\t\t\tvar savePersonalizedRoleGroupNav = { \"AddedItems\": [], \"RemovedItems\": [], \"AppRole\": self.$scope.selectedRoleGroup.roleName };\r\n\t\t\tsavePersonalizedRoleGroupNav.AddedItems = self.personalizedRoleGroupNav.AddedItems.map(function (result) {\r\n\t\t\t\treturn result.id;\r\n\t\t\t});\r\n\t\t\tsavePersonalizedRoleGroupNav.RemovedItems = self.personalizedRoleGroupNav.RemovedItems.map(function (result) {\r\n\t\t\t\treturn result.id;\r\n\t\t\t});\r\n\r\n\t\t\tvar submitRoleGroupNavPresonalizationAPISatrtTime = performance.now()\r\n\t\t\tself.personalizationService.saveRoleGroupPersonalizedNavItems(savePersonalizedRoleGroupNav, true).then(response => {\r\n\t\t\t\tself.logTelemetryForRolePersonalization(telemetry_source, submitRoleGroupNavPresonalizationAPISatrtTime);\r\n\t\t\t\tself.fxpLogger.logInformation(telemetry_source, `${TelemetryConstants.FXP_TELEMETRY_BASE_NAME}.SubmitRoleGroupNavPresonalizationSuccess`);\r\n\t\t\t\tself.fxpGlobalStoreService.DispatchGlobalAction(\"Platform\", HideSpecificLoader({name: UI_LOADER_NAMES.FXP_LOADERS.ROLE_NAV_PERSONALIZATION_LOADER}));\r\n\t\t\t\tself.$scope.displaySavePopup = false;\r\n\t\t\t\tvar role = self.$scope.selectedRoleGroup.roleName;\r\n\t\t\t\tvar stringType = \" Role Group\";\r\n\t\t\t\tCommonUtils.pullFocusToElement('role-group-selection');\r\n\t\t\t\tself.fxpMessage.addMessage(self.$rootScope.fxpUIConstants.UIMessages.RoleGroupNavigationListSaved.SuccessMessage.replace('{0}', role).replace('{1}', stringType), FxpConstants.messageType.success);\r\n\t\t\t\tself.auditLogRoleGroupOrRolePersonalization();\r\n\t\t\t\tself.getRoleGroupDetails();\r\n\t\t\t}, (exception) => {\r\n\t\t\t\tself.logTelemetryForRolePersonalization(\"submitRoleGroupNavPresonalizationAPIDuartion\", submitRoleGroupNavPresonalizationAPISatrtTime);\r\n\t\t\t\tself.$scope.displaySavePopup = false;\r\n\t\t\t\tvar errorMessage;\r\n\t\t\t\tif (exception.status === 401) {\r\n\t\t\t\t\terrorMessage = self.$rootScope.fxpUIConstants.UIMessages.RoleGroupPersonalizationSubmitUnAuthorization;\r\n\t\t\t\t} else {\r\n\t\t\t\t\terrorMessage = self.$rootScope.fxpUIConstants.UIMessages.RoleGroupPersonalizationSubmitError;\r\n\t\t\t\t}\r\n\t\t\t\tself.showAndLoggingErrorMsg(exception, errorMessage, ErrorCodes.SubmitRoleGroupNavPresonalization_Failure);\r\n\t\t\t});\r\n\t\t}\r\n\t}\r\n\r\n\r\n\r\n\t/**\r\n\t*A method to use Enable/Disable remove Button\r\n\t* @method Fxp.Controllers.RoleNavPersonalizationController.isItemAllowToRemove\r\n\t* @example Example to use isItemAllowToRemove\r\n\t* RoleNavPersonalizationController.isItemAllowToRemove()\r\n\t*/\r\n\tisItemAllowToRemove(): boolean {\r\n\t\tvar self = this;\r\n\t\tvar flag;\r\n\t\tvar roleGroupNavPersonalizationListLength = self.$scope.navigationList.length;\r\n\t\tfor (let i = 0; i < roleGroupNavPersonalizationListLength; i++) {\r\n\t\t\tvar parentItem = self.$scope.navigationList[i];\r\n\t\t\t// check if parent items are selected.\r\n\t\t\tif (parentItem.isSelected) {\r\n\t\t\t\tflag = true;\r\n\t\t\t\tbreak;\r\n\t\t\t} else {\r\n\t\t\t\t// check if child items are selected\r\n\t\t\t\tif (parentItem.hasChildren && parentItem.children != null) {\r\n\t\t\t\t\tvar parentItemChildrenLength = parentItem.children.length;\r\n\t\t\t\t\tfor (var j = 0; j < parentItemChildrenLength; j++) {\r\n\t\t\t\t\t\tvar childItem = parentItem.children[j];\r\n\t\t\t\t\t\tif (childItem.isSelected) {\r\n\t\t\t\t\t\t\tflag = true;\r\n\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn flag;\r\n\t}\r\n\r\n\r\n\t/**\r\n\t*A method to use audit the personalized of Role/RoleGroup \r\n\t* @method Fxp.Controllers.RoleNavPersonalizationController.auditLogRoleGroupOrRolePersonalization\r\n\t* @example Example to use auditLogRoleGroupOrRolePersonalization\r\n\t* RoleNavPersonalizationController.auditLogRoleGroupOrRolePersonalization()\r\n\t*/\r\n\tauditLogRoleGroupOrRolePersonalization(): void {\r\n\t\tvar self = this;\r\n\t\tvar propBag = self.fxpLogger.createPropertyBag();\r\n\t\tpropBag.addToBag(FxpConstants.metricConstants.ModifiedBusinessRoleName, self.$scope.selectedRoleGroup.RoleGroupName);\r\n\t\tpropBag.addToBag(FxpConstants.metricConstants.TimeStamp, FxpLogHelper.getTimeStamp());\r\n\t\tvar leftNavLinksValuesBeforeModification = self.getRoleGroupFlatDataStructure(self.roleGroupNavPersonalizationList).filter(function (item) {\r\n\t\t\treturn item.applicableDevice != FxpConstants.applicableDevice.mobile;\r\n\t\t}).map(function (result) {\r\n\t\t\treturn result.id;\r\n\t\t});\r\n\t\tpropBag.addToBag(FxpConstants.metricConstants.LeftNavLinksValueBeforeModification, JSON.stringify(leftNavLinksValuesBeforeModification));\r\n\r\n\t\tvar leftNavLinksValueAfterModification = self.getRoleGroupFlatDataStructure(self.$scope.navigationList).filter(function (item) {\r\n\t\t\treturn angular.isDefined(item.isRoleGroupLeftNavItem);\r\n\t\t}).map(function (result) {\r\n\t\t\treturn result.id;\r\n\t\t});\r\n\r\n\t\tif (leftNavLinksValueAfterModification.length > 0) {\r\n\t\t\tpropBag.addToBag(FxpConstants.metricConstants.LeftNavLinksValueAfterModification, JSON.stringify(leftNavLinksValueAfterModification));\r\n\t\t}\r\n\t\tself.fxpLogger.logInformation(`${self.sourceForTelemetry}.AuditLogRoleGroupOrRolePersonalization`, `${TelemetryConstants.FXP_TELEMETRY_BASE_NAME}.ManageRoleNavPersonalizationController.AuditLogs`, propBag);\r\n\t}\r\n\r\n\r\n\t/**\r\n * Get the flat structure of getRoleGroupFlatDataStructure data\r\n * @method Fxp.Controllers.RoleNavPersonalizationController.getRoleGroupFlatDataStructure\r\n * @param {roleGroupNavPersonalizationList } roleGroupNavPersonalizationList roleGroupNavPersonalizationList data of the role/role group.\r\n * @example Example to invoke getRoleGroupFlatDataStructure\r\n * RoleNavPersonalizationController.getRoleGroupFlatDataStructure();\r\n */\r\n\tgetRoleGroupFlatDataStructure(roleGroupNavPersonalizationList: any) {\r\n\t\tvar list = new Array();\r\n\t\tfor (var i = 0, L0length = roleGroupNavPersonalizationList.length; i < L0length; i++) {\r\n\t\t\tif (roleGroupNavPersonalizationList[i].hasChildren) {\r\n\t\t\t\tlist.push(roleGroupNavPersonalizationList[i]);\r\n\t\t\t\tfor (var j = 0, L1length = roleGroupNavPersonalizationList[i].children.length; j < L1length; j++) {\r\n\t\t\t\t\tlist.push(roleGroupNavPersonalizationList[i].children[j]);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\tlist.push(roleGroupNavPersonalizationList[i]);\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn list;\r\n\t}\r\n\r\n\t/**\r\n\t*A method to use Enable/Disable the Parrent Link\r\n\t* @method Fxp.Controllers.RoleNavPersonalizationController.isParentLinkEnabled\r\n\t* @param {any} navItem object whichj we are going to dispaly in UI\r\n\t* @example Example to use isParentLinkEnabled\r\n\t* RoleNavPersonalizationController.isParentLinkEnabled()\r\n\t*/\r\n\tisParentLinkEnabled(navItem): boolean {\r\n\t\tif (!navItem.hasChildren) {\r\n\t\t\treturn angular.isDefined(navItem.isRoleGroupLeftNavItem);\r\n\t\t}\r\n\t\telse {\r\n\t\t\tvar childlength = navItem.children.reduce(function (item, childItem) {\r\n\t\t\t\treturn item + angular.isDefined(childItem.isRoleGroupLeftNavItem);\r\n\t\t\t}, 0);\r\n\t\t\treturn navItem.children.length === childlength;\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t*A method to use show Confirm Popup\r\n\t* @method Fxp.Controllers.RoleNavPersonalizationController.showConfirmPopup\r\n\t* @example Example to use showConfirmPopup\r\n\t* RoleNavPersonalizationController.showConfirmPopup()\r\n\t*/\r\n\tshowConfirmPopup(): void {\r\n\t\tvar self = this;\r\n\t\tif (CommonUtils.isNullOrEmpty(self.personalizedRoleGroupNav.AddedItems) && CommonUtils.isNullOrEmpty(self.personalizedRoleGroupNav.RemovedItems)) {\r\n\t\t\tself.getRoleGroupDetails();\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tself.$scope.displayUnsavedChangesPopup = true;\r\n\t\tself.timeout(function () { CommonUtils.pullFocusToElement('role-group-popup'); });\r\n\t}\r\n\r\n\t/**\r\n\t*A method to use show Confirm save popup\r\n\t* @method Fxp.Controllers.RoleNavPersonalizationController.showConfirmSavePopup\r\n\t* @example Example to use showConfirmSavePopup\r\n\t* RoleNavPersonalizationController.showConfirmSavePopup()\r\n\t*/\r\n\tshowConfirmSavePopup(): void {\r\n\t\tvar self = this;\r\n\t\tself.$scope.displaySavePopup = true;\r\n\t\tself.timeout(function () { CommonUtils.pullFocusToElement('savepopup'); });\r\n\t}\r\n\r\n\t/**\r\n\t*A method to use hide Confirm save popup\r\n\t* @method Fxp.Controllers.RoleNavPersonalizationController.hideConfirmSavePopup\r\n\t* @example Example to use hideConfirmSavePopup\r\n\t* RoleNavPersonalizationController.hideConfirmSavePopup()\r\n\t*/\r\n\thideConfirmSavePopup(): void {\r\n\t\tvar self = this;\r\n\t\tself.$scope.displaySavePopup = false;\r\n\t\tself.timeout(function () { CommonUtils.pullFocusToElement('role-group-save-btn'); });\r\n\t}\r\n\r\n\t/**\r\n\t*A method to use Leave Unsaved changes popup\r\n\t* @method Fxp.Controllers.RoleNavPersonalizationController.leaveConfirmPopup\r\n\t* @example Example to use leaveConfirmPopup\r\n\t* RoleNavPersonalizationController.leaveConfirmPopup()\r\n\t*/\r\n\tleaveConfirmPopup(): void {\r\n\t\tvar self = this, totalDuration;\r\n\t\tself.$scope.displayUnsavedChangesPopup = false;\r\n\t\t//this is triggered when there is any state changed and there is unsaved changes due to GLN click or Fxp Header click\r\n\t\tif (self.isStateChanged && self.toState.name != self.state.current.name) {\r\n\t\t\tself.resetNavigationLists();\r\n\t\t\tself.fxpRouteService.navigatetoSpecificState(self.toState.name, self.toParams);\r\n\t\t\treturn;\r\n\t\t} else {\r\n\t\t\tself.isStateChanged = false;\r\n\t\t\tif (self.isRoleGroupPersonalizedListChanged) {\r\n\t\t\t\tself.isRoleGroupPersonalizedListChanged = false;\r\n\t\t\t\tself.resetRolePersonalization();\r\n\t\t\t\tself.timeout(function () { CommonUtils.pullFocusToElement('role-group-selection'); });\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tself.getRoleGroupDetails();\r\n\t\t\tself.timeout(function () { CommonUtils.pullFocusToElement('role-group-cancel-btn'); });\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t*A method to use hide hide UnsavedConfirmPopup Popup\r\n\t* @method Fxp.Controllers.RoleNavPersonalizationController.hideUnsavedConfirmPopup\r\n\t* @example Example to use hideUnsavedConfirmPopup\r\n\t* RoleNavPersonalizationController.hideUnsavedConfirmPopup()\r\n\t*/\r\n\thideUnsavedConfirmPopup(): void {\r\n\t\tvar self = this;\r\n\t\tif (self.isStateChanged) {\r\n\t\t\t//when we click on GLN highlight changes to return back to the existing highlight we are broadcasting this method\r\n\t\t\tself.$rootScope.$broadcast(FxpBroadcastedEvents.OnLeftNavHighlightByStateName, self.state.current.name);\r\n\t\t}\r\n\t\tself.isStateChanged = false;\r\n\t\tself.$scope.displayUnsavedChangesPopup = false;\r\n\t\tif (self.isRoleGroupPersonalizedListChanged) {\r\n\t\t\tself.isRoleGroupPersonalizedListChanged = false;\r\n\t\t\tself.$scope.selectedRoleGroup = self.previousSelectedRoleGroup;\r\n\t\t\tself.$scope.selectedRole = self.previousSelectedRole;\r\n\t\t\tself.timeout(function () { CommonUtils.pullFocusToElement('role-group-selection'); });\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tself.timeout(function () { CommonUtils.pullFocusToElement('role-group-cancel-btn'); });\r\n\t}\r\n\r\n\t/**\r\n\t*A method to use hide hide UnsavedConfirmPopup Popup\r\n\t* @method Fxp.Controllers.RoleNavPersonalizationController.submitButtonDisabled\r\n\t* @example Example to use submitButtonDisabled\r\n\t* RoleNavPersonalizationController.submitButtonDisabled()\r\n\t*/\r\n\tsubmitButtonDisabled(): boolean {\r\n\t\tvar self = this;\r\n\t\treturn (CommonUtils.isNullOrEmpty(self.$scope.selectedRoleGroup)) || (self.personalizedRoleGroupNav.AddedItems.length === 0 && self.personalizedRoleGroupNav.RemovedItems.length == 0)\r\n\t}\r\n\r\n\t/**\r\n\t*A method to use set focus the Selected Item\r\n\t* @method Fxp.Controllers.RoleNavPersonalizationController.setFocusToGlobalNavMasterItem\r\n\t* @param {boolean} status \r\n\t* @example Example to use setFocusToGlobalNavMasterItem\r\n\t* RoleNavPersonalizationController.setFocusToGlobalNavMasterItem()\r\n\t*/\r\n\tsetFocusToGlobalNavMasterItem(status) {\r\n\t\tlet self = this;\r\n\t\tlet index = self.getIndexOfObject(this.$scope.navigationList, \"isPersonalizationAllowed\", true);\r\n\t\tif (index > -1) {\r\n\t\t\tthis.$scope.navigationList[index].isFocused = status;\r\n\t\t}\r\n\t};\r\n\r\n\t/**\r\n\t*A method to use set focus to the html element based on item \r\n\t* @method Fxp.Controllers.RoleNavPersonalizationController.pullFocusToElement\r\n\t* @param {string} element which element to focus\r\n\t* @param {any} navItem object whichj we are going to dispaly in UI\r\n\t* @param {string} itemType is master or role/Rolegroup\r\n\t* @example Example to use pullFocusToElement\r\n\t* RoleNavPersonalizationController.pullFocusToElement(element,navItem)\r\n\t*/\r\n\tpullFocusToElement(element, navItem, itemType): void {\r\n\t\tif (itemType.toLowerCase() === \"rolegroupnav\" && navItem.isFocusedElement) {\r\n\t\t\tCommonUtils.pullFocusToElement(element);\r\n\t\t\tnavItem.isFocusedElement = false;\r\n\t\t} else if (itemType.toLowerCase() === \"globalnav\" && navItem.isFocused) {\r\n\t\t\tnavItem.isFocused = false;\r\n\t\t}\r\n\t}\r\n\t/**\r\n\t*A method is used to set the tabindex of first elements of User list to 0\r\n\t* @method Fxp.Controllers.RoleNavPersonalizationController.changeTabIndexOfUserList\r\n\t* @param {string} containerId contains id of an element\r\n\t* RoleNavPersonalizationController.changeTabIndexOfUserList()\r\n\t*/\r\n\tchangeTabIndexOfUserList(containerId): void {\r\n\t\tvar allMenuElements = $(containerId).find(\".fxpTabbableElem\");\r\n\t\tif (allMenuElements.length > 0) {\r\n\t\t\t$(allMenuElements[0]).attr('tabindex', 0);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n *A method to use sorting the list of Items from collection\r\n * @method Fxp.Controllers.RoleNavPersonalizationController.sortObject\r\n * @param {any} srtObject contains a collection which we need to sort\r\n * @param {string} srtElement string based on which sort will be done\r\n * @example Example to use sortObject\r\n * RoleNavPersonalizationController.sortObject(srtObject, srtElement)\r\n */\r\n\tsortObject(srtObject, srtElement): void {\r\n\t\tsrtObject.sort(function (a, b) {\r\n\t\t\treturn a[srtElement] > b[srtElement] ? 1 : a[srtElement] < b[srtElement] ? -1 : 0;\r\n\t\t});\r\n\t};\r\n\r\n\t/**\r\n\t*A method to use sget the Index of the macthing Item in the List\r\n\t* @method Fxp.Controllers.RoleNavPersonalizationController.getIndexOfObject\r\n\t* @param {any} source pass source as a collection for comparision\r\n\t* @param {string} compareKey string based on which comaprison will be done\r\n\t* @param {string} value is an object with which we need to compare\r\n\t* @example Example to use getIndexOfObject\r\n\t* RoleNavPersonalizationController.getIndexOfObject(source, compareKey, value)\r\n\t*/\r\n\tgetIndexOfObject(source, compareKey, value): number {\r\n\t\tvar index = -1;\r\n\t\tvar length = source.length;\r\n\t\tfor (let i = 0; i < length; i++) {\r\n\t\t\tif (source[i][compareKey] === value) {\r\n\t\t\t\tindex = i;\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn index;\r\n\t}\r\n\t/**\r\n\t*A method to use maintain audit infromation of manageRoleGroupNavChildItem based on parent action track\r\n\t* @method Fxp.Controllers.RoleNavPersonalizationController.manageRoleGroupParentItem\r\n\t* @param {any} parent collection contains added and removed items\r\n\t* @param {string} action string that specifies add or remove\r\n\t* @example Example to use manageRoleGroupParentItem\r\n\t* RoleNavPersonalizationController.manageRoleGroupParentItem(parent, action)\r\n\t*/\r\n\tmanageRoleGroupParentItem(parent, action): void {\r\n\t\tlet self = this;\r\n\t\tif (parent.hasChildren && parent.children != null) {\r\n\t\t\t//if parent have Childrens then we add childs\r\n\t\t\tlet childrenLength = parent.children.length;\r\n\t\t\tfor (let i = 0; i < childrenLength; i++) {\r\n\t\t\t\tself.manageRoleGroupNavChildItem(parent.children[i], action);\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\t//if parent does not have Childrens then we add parent\r\n\t\t\tself.manageRoleGroupNavChildItem(parent, action);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t*A method to use maintain audit infromation of manageRoleGroupNavChildItem based on Child action track\r\n\t* @method Fxp.Controllers.RoleNavPersonalizationController.manageRoleGroupNavChildItem\r\n\t* @param {any} item collection contains added and removed items\r\n\t* @param {string} action string that specifies add or remove \r\n\t* @example Example to use manageRoleGroupNavChildItem\r\n\t* RoleNavPersonalizationController.manageRoleGroupNavChildItem(id, action)\r\n\t*/\r\n\tmanageRoleGroupNavChildItem(item, action): void {\r\n\t\tlet self = this;\r\n\t\tlet constantActions = FxpConstants.ActionTypes;\r\n\t\tlet oldAction = (action == constantActions.Add) ? constantActions.Remove : constantActions.Add;\r\n\t\tlet index = self.getIndexOfObject(self.personalizedRoleGroupNav[oldAction], \"id\", item.id);\r\n\t\tif (index > -1) {\r\n\t\t\tself.personalizedRoleGroupNav[oldAction].splice(index, 1);\r\n\t\t} else {\r\n\t\t\tself.personalizedRoleGroupNav[action].push(angular.copy(item));\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t*A method to measure pageloadduration and log pageloadmetrics\r\n\t* @method Fxp.Controllers.RoleNavPersonalizationController.logPageLoadMetricsForCurrentPage\r\n\t* @param {string} actionType string that specifies the action name performed by user\r\n\t* @param {string} totalDuration string that specifies totalDuration\r\n\t* @example Example to use logPageLoadMetricsForCurrentPage\r\n\t* RoleNavPersonalizationController.logPageLoadMetricsForCurrentPage(actionType, totalDuration)\r\n\t*/\r\n\tlogTelemetryForRolePersonalization(actionType, startTime): void {\r\n\t\tvar self = this, totalDuration;\r\n\t\ttotalDuration = performance.now() - startTime;\r\n\t\tvar propBag = self.fxpLogger.createPropertyBag();\r\n\t\tpropBag.addToBag(FxpConstants.metricConstants.ScreenRoute, self.state.current.name);\r\n\t\tpropBag.addToBag(actionType, totalDuration);\r\n\t\tself.fxpLogger.logInformation(`${this.sourceForTelemetry}.LogTelemetryForRolePersonalization`, `${TelemetryConstants.FXP_TELEMETRY_BASE_NAME}.ManageRoleNavPersonalizationController.ActionDuration`, propBag);\r\n\t}\r\n}\r\nRoleNavPersonalizationController.$inject = ['$rootScope', '$state', '$scope', 'FxpLoggerService', 'FxpGlobalStoreService', 'FxpMessageService', 'PersonalizationService', 'FxpConfigurationService', '$timeout', '$window', 'FxpRouteService'];\r\n","/**\r\n * @application Fxp\r\n */\r\n/**\r\n * @module Fxp.Controllers\r\n */\r\nimport { FxpConstants } from \"../common/ApplicationConstants\";\r\nimport { FxpConfigurationService } from \"../services/FxpConfiguration\";\r\nimport { IRootScope } from \"../interfaces/IRootScope\";\r\nimport { NotificationStore } from \"../services/NotificationStore\";\r\nimport { NotificationActionCenter } from \"../services/NotificationActionCenter\";\r\nimport { FxpMessageService } from \"../../app/banner/FxpMessageService\";\r\nimport { ILogger } from \"../interfaces/ILogger\";\r\nimport { CommonUtils } from \"../utils/CommonUtils\";\r\nimport { FxpBroadcastedEvents } from \"../services/FxpBroadcastedEvents\";\r\nimport { ErrorCodes } from \"../constants/errorCodes\";\r\nimport { TelemetryConstants } from \"../telemetry/TelemetryConst\";\r\nimport { ErrorSeverityLevel } from \"../telemetry/ErrorSeverityLevel\";\r\n\r\n/**\r\n * This is the controller having functionality and data for Toast Notifications.\r\n * @class Fxp.Controllers.ToastNotificationController\r\n * @classdesc A controller of FxpApp module\r\n * @example \r\n * //To Use ToastNotificationController\r\n * angular.module('FxPApp').controller('ToastNotificationController', ['AnyDependency', ToastNotificationController]);\r\n * function ToastNotificationController(AnyDependency){ AnyDependency.doSomething(); }\r\n */\r\nexport class ToastNotificationController {\r\n\tprivate toastNotifications: any;\r\n\tprivate toastNotificationLimit: number;\r\n\tprivate fxpConstants: FxpConstants;\r\n\tprivate sourceForTelemetry = `${TelemetryConstants.FXP_TELEMETRY_BASE_NAME}.ToastNotificationController`;\r\n\tconstructor(\r\n\t\t$scope: any,\r\n\t\tprivate $rootScope: IRootScope,\r\n\t\tprivate $window: angular.IWindowService,\r\n\t\tprivate $timeout: any,\r\n\t\tprivate fxpConfigurationService: FxpConfigurationService,\r\n\t\tprivate notificationStore: NotificationStore,\r\n\t\tprivate notificationActionCenter: NotificationActionCenter,\r\n\t\tprivate fxpMessage: FxpMessageService,\r\n\t\tprivate fxpLoggerService: ILogger\r\n\t) {\r\n\t\tvar self = this,\r\n\t\t\t// Callback method when new notifications arrive.\r\n\t\t\taddToastNotifications = function (event, notifications) {\r\n\t\t\t\t// Appending icons to new notifications\r\n\t\t\t\tnotifications = self.notificationActionCenter.appendPropertiesToNotifications(notifications);\r\n\t\t\t\t// Appending new notifications to collection.\r\n\t\t\t\tself.toastNotifications = self.toastNotifications.concat(notifications);\r\n\t\t\t};\r\n\t\tself.fxpConstants = FxpConstants;\r\n\t\t// Initialize collection.\r\n\t\tself.toastNotifications = [];\r\n\t\t// Set toast notification limit.\r\n\t\tself.toastNotificationLimit = CommonUtils.isNullOrEmpty(fxpConfigurationService.FxpBaseConfiguration.NotificationConfiguration.ToastNotificationLimit) ? 10 : parseInt(fxpConfigurationService.FxpAppSettings.ToastNotificationLimit);\r\n\t\t$scope.$on(FxpBroadcastedEvents.OnNewNotificationsRecieved, addToastNotifications);\r\n\t}\r\n\r\n\t/**\r\n * Method to read toast notification.\r\n * @method Fxp.Controllers.ToastNotificationController.readToastNotification\r\n * @param {any} notification is an object of containing details of notification.\r\n * @example Example to use readToastNotification\r\n *
      read notification
      ;\r\n */\r\n\treadToastNotification = function (notification) {\r\n\t\tconst self = this;\r\n\t\tconst telemetry_source = `${self.sourceForTelemetry}.ReadToastNotification`;\r\n\t\tlet startTime = performance.now(),\r\n\t\t\tpropbag = self.fxpLoggerService.createPropertyBag();\r\n\t\t// Perform Navigation.\r\n\t\ttry {\r\n\t\t\tself.notificationActionCenter.excecuteNotificationAction(notification);\r\n\t\t} catch (error) {\r\n\t\t\tvar message = self.$rootScope.fxpUIConstants.UIMessages.NotificationNavigationError;\r\n\t\t\t// Show error.\r\n\t\t\tself.fxpMessage.addMessage(message.ErrorMessage, self.fxpConstants.messageType.error);\r\n\t\t\t// Log error details.\r\n\t\t\tpropbag.addToBag(self.fxpConstants.metricConstants.Status, error.status);\r\n\t\t\tpropbag.addToBag(self.fxpConstants.metricConstants.StatusText, error.statusText);\r\n \t\tself.fxpLoggerService.logError(telemetry_source, message.ErrorMessageTitle, ErrorCodes.ReadToastNotification_Failure, null, propbag, null, null, ErrorSeverityLevel.Medium);\r\n\t\t}\r\n\t\t// Recreate property bag.\r\n\t\tpropbag = self.fxpLoggerService.createPropertyBag()\r\n\t\t// Mark Notification as read.\r\n\t\tself.notificationStore.markNotificationAsRead(notification.WebNotificationId).then((response) => {\r\n\t\t\t// Add notificaton EventId to prop bag.\r\n\t\t\tpropbag.addToBag(\"EventId\", notification.eventId);\r\n\t\t\t// Add notificaton id to prop bag.\r\n\t\t\tpropbag.addToBag(\"Notification Id\", notification.notificationId);\r\n\t\t\t// Add more notification info.\r\n\t\t\tpropbag.addToBag(\"From\", notification.senderAddress);\r\n\t\t\t// Closing Notification Toast.\r\n\t\t\tself.closeToastNotification(notification);\r\n\t\t\t// Log event.\r\n\t\t\tpropbag.addToBag(\"Total Time\", (performance.now() - startTime));\r\n\t\t\tself.fxpLoggerService.logEvent(telemetry_source, \"ReadNotification\", propbag);\r\n\t\t}, (error) => {\r\n\t\t\tvar message = self.$rootScope.fxpUIConstants.UIMessages.ToastNotificationReadError;\r\n\t\t\t// Show error.\r\n\t\t\tself.fxpMessage.addMessage(message.ErrorMessage, self.fxpConstants.messageType.error);\r\n\t\t\t// Log error details.\r\n\t\t\tpropbag.addToBag(self.fxpConstants.metricConstants.Status, error.status);\r\n\t\t\tpropbag.addToBag(self.fxpConstants.metricConstants.StatusText, error.statusText);\r\n\t\t\tself.fxpLoggerService.logError(telemetry_source, message.ErrorMessageTitle, ErrorCodes.MarkNotificationAsRead_Failure, null, propbag, null, null, ErrorSeverityLevel.Medium);\r\n\t\t});\r\n\t}\r\n\r\n\t/**\r\n * Method to read toast notification.\r\n * @method Fxp.Controllers.ToastNotificationController.closeToastNotification\r\n * @param {any} notification is an object of containing details of notification.\r\n * @example Example to use closeToastNotification\r\n *
      Close notification
      ;\r\n */\r\n\tcloseToastNotification = function (notification) {\r\n\t\tvar self = this,\r\n\t\t\t// Find index of current notification.\r\n\t\t\tindex = self.toastNotifications.indexOf(notification);\r\n\t\t// Remove notification from collection.\r\n\t\tself.toastNotifications.splice(index, 1);\r\n\t}\r\n}\r\n","declare type IStateService = any;\r\n\r\nimport { IActOnBehalfOfControllerScope } from \"../interfaces/IActOnBehalfOfControllerScope\";\r\nimport { ILogger } from \"../interfaces/ILogger\";\r\nimport { FxpMessageService } from \"../../app/banner/FxpMessageService\";\r\nimport { FxpConstants, ApplicationConstants } from \"../common/ApplicationConstants\";\r\nimport { IRootScope } from \"../interfaces/IRootScope\";\r\nimport { UserProfileService } from \"../services/userProfileService\";\r\nimport { LogPropertyBag } from \"../telemetry/LogPropertyBag\";\r\nimport { TelemetryContext } from \"../telemetry/telemetrycontext\";\r\nimport { FxpConfigurationService } from \"../services/FxpConfiguration\";\r\nimport { FxpGlobalStoreService } from \"../services/fxp.global.store.service\";\r\nimport { CommonUtils } from \"../utils/CommonUtils\";\r\nimport { ActOnBehalfOfHelper } from \"../factory/ActOnBehalfOfHelper\";\r\nimport { ILeftNavControllerScope } from \"../interfaces/ILeftNavControllerScope\";\r\nimport { FxpRouteService } from \"../services/FxpRouteService\";\r\nimport { SettingsServiceProvider } from \"../provider/SettingsServiceProvider\";\r\nimport { FxpContext } from \"../context/FxpContext\";\r\nimport { IUserLookupPersonalizationControllerScope } from \"../interfaces/IUserLeftNavPersonalizationControllerScope\";\r\nimport { PersonalizationService } from \"../services/PersonalizationService\";\r\nimport { HideLoader } from \"../../app/loader/loader.actions\";\r\nimport { ErrorCodes } from \"../constants/errorCodes\";\r\nimport { ErrorSeverityLevel } from \"../telemetry/ErrorSeverityLevel\";\r\nimport { TelemetryConstants } from \"../telemetry/TelemetryConst\";\r\n\r\nexport class UserLookupPersonalizationController {\r\n\tprivate $state: IStateService;\r\n\tprivate $rootScope: IRootScope;\r\n\tprivate $scope: IUserLookupPersonalizationControllerScope;\r\n\tprivate userProfileService: UserProfileService;\r\n\tprivate fxpLoggerService: ILogger;\r\n\tprivate fxpConstants: FxpConstants;\r\n\tprivate AdminPersonalizeHelper: ActOnBehalfOfHelper;\r\n\tprivate currentDate: Date;\r\n\tprivate fxpConfigurationService: FxpConfigurationService;\r\n\tprivate personalizationService: PersonalizationService;\r\n\tprivate readonly sourceForTelemetry = `${TelemetryConstants.FXP_TELEMETRY_BASE_NAME}.UserLookupPersonalizationController`;\r\n\tconstructor($state: IStateService, $rootScope: IRootScope, $scope: IUserLookupPersonalizationControllerScope,\r\n\t\tuserProfileService: UserProfileService,\r\n\t\tfxpLoggerService: ILogger, AdminPersonalizeHelper: ActOnBehalfOfHelper, private fxpGlobalStoreService: FxpGlobalStoreService, personalizationService: PersonalizationService) {\r\n\t\tvar pageLoadStartTime = performance.now();\r\n\t\tthis.$state = $state;\r\n\t\tthis.$rootScope = $rootScope;\r\n\t\tthis.$scope = $scope;\r\n\t\tthis.userProfileService = userProfileService;\r\n\t\tthis.fxpLoggerService = fxpLoggerService;\r\n\t\tthis.fxpConstants = FxpConstants;\r\n\t\tthis.AdminPersonalizeHelper = AdminPersonalizeHelper;\r\n\t\t//Initializes value\r\n\t\tthis.$scope.adminUIStrings = this.$rootScope.fxpUIConstants.UIStrings.AdminUIStrings;\r\n\t\tthis.$scope.buttonStrings = this.$rootScope.fxpUIConstants.UIStrings.ButtonStrings;\r\n\t\tthis.$scope.userProfileDoesNotExist = false;\r\n\t\tthis.$scope.errorMessage = \"\";\r\n\t\tthis.$scope.selectedUser = \"\";\r\n\t\tthis.$scope.searchfocused = true;\r\n\t\tthis.$scope.resetfocused = false;\r\n\t\tthis.$scope.isSelectedUserProfile = false;\r\n\t\tthis.$scope.selectedUserObject = {};\r\n\t\tthis.$scope.searchUser = this.searchUser.bind(this);\r\n\t\tthis.$scope.setSelectedUser = this.setSelectedUser.bind(this);\r\n\t\tthis.$scope.pullFocusToElement = CommonUtils.pullFocusToElement.bind(this);\r\n\t\tthis.$scope.resetSelectedUser = this.resetSelectedUser.bind(this);\r\n\t\tthis.$scope.navigateToPersonalizationView = this.navigateToPersonalizationView.bind(this);\r\n\t\tthis.$scope.onUserChanged = this.onUserChanged.bind(this);\r\n\t\tthis.fxpGlobalStoreService.DispatchGlobalAction(\"Platform\", HideLoader({}));\r\n\t\tthis.personalizationService = personalizationService;\r\n\t\tvar pageLoadEndTime = performance.now();\r\n\t\tvar pageLoadDuration = pageLoadEndTime - pageLoadStartTime;\r\n\t\tthis.fxpLoggerService.logPageLoadMetrics(pageLoadDuration);\r\n\t}\r\n\t/**\r\n\t* A method to use reset SelectedUser\r\n\t* @method Fxp.Controllers.UserLookupPersonalizationController.resetSelectedUser\r\n\t* @example Example to use isItemAllowToRemove\r\n\t* UserLookupPersonalizationController.resetSelectedUser()\r\n\t*/\r\n\tresetSelectedUser(): void {\r\n\t\tvar self = this;\r\n\t\tself.fxpLoggerService.logEvent(`${this.sourceForTelemetry}.ResetSelectedUser`, \"AdminResetClickEvent\");\r\n\t\tself.$scope.selectedUser = \"\";\r\n\t\tself.$scope.userProfileDoesNotExist = false;\r\n\t\tself.$scope.isSelectedUserProfile = false;\r\n\t\tsetTimeout(function () { CommonUtils.pullFocusToElement('PersnlztnAdmin_FormControl') }, 100);\r\n\t}\r\n\r\n\t/**\r\n\t* A method to use searchUser for persanalization\r\n\t* @method Fxp.Controllers.UserLookupPersonalizationController.searchUser\r\n\t* @example Example to use searchUser\r\n\t* UserLookupPersonalizationController.searchUser(value)\r\n\t*/\r\n\tsearchUser(value: string) {\r\n\t\tvar self = this;\r\n\t\tvar startDate = new Date();\r\n\t\tconst source_telemetry = `${self.sourceForTelemetry}.SearchUser`; \r\n\t\treturn self.userProfileService.searchProfile(value)\r\n\t\t\t.then(function (data) {\r\n\t\t\t\tvar usersList = [];\r\n\t\t\t\tvar endDate = new Date();\r\n\t\t\t\tif (data.data && data.data.length > 0) {\r\n\t\t\t\t\tself.$scope.userProfileDoesNotExist = false;\r\n\t\t\t\t\tself.$scope.errorMessage = \"\";\r\n\t\t\t\t\tusersList = data.data;\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\tself.$scope.userProfileDoesNotExist = true;\r\n\t\t\t\t\tself.$scope.selectedUserObject = {};\r\n\t\t\t\t\tself.$scope.errorMessage = self.$rootScope.fxpUIConstants.UIMessages.UserProfileDoesNotExist.ErrorMessage;\r\n\t\t\t\t}\r\n\t\t\t\tvar responseTime = endDate.getTime() - startDate.getTime();\r\n\t\t\t\tvar propbag = self.AdminPersonalizeHelper.getMetricPropBag(startDate, endDate);\r\n\t\t\t\tself.fxpLoggerService.logMetric(source_telemetry, `${TelemetryConstants.FXP_TELEMETRY_BASE_NAME}.SearchProfileResponseTime`, responseTime, propbag);\r\n\t\t\t\treturn usersList;\r\n\t\t\t})\r\n\t\t\t.catch(function (error) {\r\n\t\t\t\tif (error.status === 404) {\r\n\t\t\t\t\tself.$scope.errorMessage = self.$rootScope.fxpUIConstants.UIMessages.UserProfileDoesNotExist.ErrorMessage;\r\n\t\t\t\t} else {\r\n\t\t\t\t\tself.$scope.errorMessage = self.$rootScope.fxpUIConstants.UIMessages.GeneralExceptionError.ErrorMessage;\r\n\t\t\t\t}\r\n\t\t\t\tself.$scope.selectedUserObject = {};\r\n\t\t\t\tvar endDate = new Date();\r\n\t\t\t\tvar propbag = self.fxpLoggerService.createPropertyBag();\r\n\t\t\t\tpropbag.addToBag(\"SearchUser\", self.$scope.selectedUser);\r\n\t\t\t\tself.fxpLoggerService.logException(source_telemetry, error, propbag, null, null, ErrorSeverityLevel.Medium, ErrorCodes.UserLookUpSearchUser_Failure);\r\n\t\t\t\tvar responseTime = endDate.getTime() - startDate.getTime();\r\n\t\t\t\tpropbag = self.AdminPersonalizeHelper.getMetricPropBag(startDate, endDate);\r\n\t\t\t\tself.fxpLoggerService.logMetric(source_telemetry, `${TelemetryConstants.FXP_TELEMETRY_BASE_NAME}.SearchProfileResponseErrorTime`, responseTime, propbag);\r\n\t\t\t});\r\n\t}\r\n\t/**\r\n\t* A method to use SelectedUser\r\n\t* @method Fxp.Controllers.UserLookupPersonalizationController.setSelectedUser\r\n\t* @example Example to use setSelectedUser\r\n\t* UserLookupPersonalizationController.setSelectedUser(value)\r\n\t*/\r\n\tsetSelectedUser($item) {\r\n\t\tvar self = this;\r\n\t\tif (!CommonUtils.isNullOrEmpty($item)) {\r\n\t\t\tlet isBusinessRoleIdFlag = $item.BusinessRoleId != undefined && $item.BusinessRoleId != null && $item.BusinessRoleId > 0\r\n\t\t\tlet isRoleGroupIdFlag = $item.RoleGroupID != undefined && $item.RoleGroupID != null && $item.RoleGroupID > 0\r\n\t\t\tif (isBusinessRoleIdFlag && isRoleGroupIdFlag) {\r\n\t\t\t\tself.$scope.selectedUserObject = $item;\r\n\t\t\t\tself.$scope.isSelectedUserProfile = true;\r\n\t\t\t} else {\r\n\t\t\t\tself.$scope.userProfileDoesNotExist = true;\r\n\t\t\t\tself.$scope.isSelectedUserProfile = false;\r\n\t\t\t\tself.$scope.selectedUserObject = {};\r\n\t\t\t\tself.$scope.errorMessage = self.$rootScope.fxpUIConstants.UIMessages.UserProfileBusinessRoleIdErrorMessage.ErrorMessage;\r\n\t\t\t\tself.fxpLoggerService.logError(`${self.sourceForTelemetry}.SetSelectedUser`, self.$scope.errorMessage, ErrorCodes.SetSelectedUser_Failure, null, null, null, null, ErrorSeverityLevel.Medium);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t* A method to use navigate To Personalization View\r\n\t* @method Fxp.Controllers.UserLookupPersonalizationController.navigateToPersonalizationView\r\n\t* @example Example to use navigateToPersonalizationView\r\n\t* UserLookupPersonalizationController.navigateToPersonalizationView()\r\n\t*/\r\n\tnavigateToPersonalizationView(): void {\r\n\t\tvar self = this;\r\n\t\tconst source_telemetry = `${this.sourceForTelemetry}.NavigateToPersonalizationView`;\r\n\t\tif (!CommonUtils.isNullOrEmpty(self.$scope.selectedUserObject)) {\r\n\t\t\tself.personalizationService.getRoleGroup(self.$scope.selectedUserObject.RoleGroupID).then(function (response) {\r\n\t\t\t\tif (!CommonUtils.isNullOrEmpty(response.data)) {\r\n\t\t\t\t\tself.$scope.selectedUserObject.RoleGroupID = response.data.Id;\r\n\t\t\t\t}\r\n\t\t\t\tself.personalizationService.removePersistedUserPersonalization();\r\n\t\t\t\tself.personalizationService.persistUserPersonalization(self.$scope.selectedUserObject);\r\n\t\t\t\tself.$state.go(\"LeftNavPersonalization\");\r\n\t\t\t}, function (error) {\r\n\t\t\t\tself.fxpLoggerService.logException(source_telemetry, error, null, null, null, ErrorSeverityLevel.Medium, ErrorCodes.NavigateToPersonalizationView_Failure);\r\n\t\t\t});\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t*A method to use to change the Selected User\r\n\t* @method Fxp.Controllers.UserLookupPersonalizationController.onUserChanged\r\n\t* @example Example to use onUserChanged\r\n\t* UserLookupPersonalizationController.onUserChanged()\r\n\t*/\r\n\tonUserChanged(): void {\r\n\t\tvar self = this;\r\n\t\tself.$scope.isSelectedUserProfile = false;\r\n\t\tself.$scope.userProfileDoesNotExist = false;\r\n\t}\r\n}\r\n\r\nUserLookupPersonalizationController.$inject = ['$state', '$rootScope', '$scope', 'UserProfileService', 'FxpLoggerService', 'ActOnBehalfOfHelper', 'FxpGlobalStoreService', 'PersonalizationService'];","import { IRouteService } from \"../interfaces/IRouteService\";\r\n\r\ndeclare var $routeProvider:any;\r\n\r\nexport class RouteConfig {\r\n\r\n\tprivate routeService: any;\r\n\tpublic routes: any;\r\n\tstatic $inject = [\"RouteService\"];\r\n\tconstructor(routeService: IRouteService) {\r\n\r\n\t\tthis.routeService = routeService;\r\n\t\tvar routeData = routeService.fetchRoutes();\r\n\t\tthis.routes = angular.fromJson(routeData);\r\n\r\n\t}\r\n}","export class AppDirectives implements angular.IDirective{\r\n constructor() {\r\n\r\n }\r\n static fxpClickDirective() {\r\n return function (scope, elem, attr) {\r\n elem.bind(\"keydown keypress\", function (evt) {\r\n if (evt.which === 13) {\r\n scope.$apply(function () {\r\n scope.$eval(attr.fxpClick);\r\n });\r\n evt.preventDefault();\r\n }\r\n }).bind(\"click\", function (evt) {\r\n scope.$apply(function () {\r\n scope.$eval(attr.fxpClick);\r\n });\r\n });\r\n };\r\n }\r\n}\r\n\r\n\r\n\r\n","export class AdminLandingDirective implements angular.IDirective {\r\n\r\n\tstatic adminLanding($timeout): angular.IDirective {\r\n\t\treturn {\r\n\t\t\trestrict: 'A',\r\n\t\t\tlink: function (scope, elem, attr) {\r\n\t\t\t\t$timeout(function () {\r\n\t\t\t\t\tlet firstAdminTab = elem.find(\".uib-tab\")[0];\r\n\t\t\t\t\tif(firstAdminTab)\r\n\t\t\t\t\t\tfirstAdminTab.focus();\r\n\t\t\t\t}, 100);\r\n\t\t\t}\r\n\t\t};\r\n\t}\r\n}\r\n\r\n\r\n\r\n\r\n","export class ChangeTabIndexByClassDirective implements angular.IDirective {\r\n static changeTabIndexByClass($timeout, $window): angular.IDirective {\r\n var directive = {\r\n restrict: 'A',\r\n link: link\r\n\r\n }\r\n return directive;\r\n function link(scope, elem, attr) {\r\n\r\n var changeTabIndexHandler = function (e) {\r\n changeTabIndex(scope, attr);\r\n };\r\n elem.on('click keydown keypress', changeTabIndexHandler);\r\n\r\n var resizeHandler = function () {\r\n scope.$apply(function () {\r\n changeTabIndex(scope, attr);\r\n });\r\n }\r\n angular.element($window).bind('resize', resizeHandler);\r\n\r\n scope.$on('$destroy', function () {\r\n elem.off('click keydown keypress', changeTabIndexHandler);\r\n angular.element($window).unbind('resize', resizeHandler);\r\n });\r\n\r\n function changeTabIndex(scope, attr) {\r\n var attributes = scope.$eval(attr.changeTabIndexByClass);\r\n var className = attributes.className;\r\n var tabindex = attributes.tabindex;\r\n modifyTabindex(className, tabindex);\r\n $timeout(function () {\r\n modifyTabindex(className, tabindex);\r\n }, 1000);\r\n }\r\n\r\n function modifyTabindex(className, tabindex) {\r\n $(className).attr('tabindex', tabindex);\r\n }\r\n changeTabIndex(scope, attr);\r\n }\r\n }\r\n}\r\n\r\nChangeTabIndexByClassDirective.changeTabIndexByClass.$inject = [\"$timeout\", \"$window\"]\r\n","export class AuthorNotificationContentDirective implements angular.IDirective {\r\n\tstatic authorNotificationContent(): angular.IDirective {\r\n\t\treturn {\r\n\t\t\trestrict: 'A',\r\n\t\t\tlink: function (scope, elem) {\r\n\t\t\t\tvar cleanUp = function (event) {\r\n\t\t\t\t\t// Pull focus to audience type combo box.\r\n\t\t\t\t\tscope.anCtrl.$timeout(function () {\r\n\t\t\t\t\t\tscope.anCtrl.$rootScope.activeElement = $('#audience-type');\r\n\t\t\t\t\t\tscope.anCtrl.$rootScope.activeElement.focus();\r\n\t\t\t\t\t});\r\n\t\t\t\t};\r\n\t\t\t\tscope.$on('$destroy', cleanUp);\r\n\t\t\t}\r\n\t\t};\r\n\t}\r\n}","export class FxpAuthorNotificationListDirective implements angular.IDirective {\r\n\tstatic fxpAuthorNotificationRow($timeout): angular.IDirective {\r\n return {\r\n restrict: 'A',\r\n link: function (scope, elem, attr) {\r\n $timeout(function () {\r\n var showhideChevron = function () {\r\n var columns = elem.find(\"td[ellipses-element]\");\r\n var isShowToggle = false;\r\n if (columns.length > 0) {\r\n isShowToggle = columns.toArray().every(function (value, index) { return value.offsetWidth === value.scrollWidth; })\r\n }\r\n if (isShowToggle) {\r\n elem.find(\"td.chevron\").find(\"button\").hide();\r\n } else {\r\n elem.find(\"td.chevron\").find(\"button\").show();\r\n }\r\n };\r\n showhideChevron();\r\n });\r\n }\r\n }\r\n }\r\n}\r\nFxpAuthorNotificationListDirective.fxpAuthorNotificationRow.$inject = [\"$timeout\"];\r\n","import { IRootScope } from \"../interfaces/IRootScope\";\r\nimport { FxpBreadcrumbService } from \"../services/FxpBreadcrumbService\";\r\nimport { FxpConstants } from \"../common/ApplicationConstants\";\r\n\r\nexport class fxpBreadcrumbLink {\r\n\tstatic fxpBreadcrumbLinksDirective($rootScope: IRootScope, $window, fxpBreadcrumbService: FxpBreadcrumbService) {\r\n\t\tvar directive = {\r\n\t\t\tlink: link,\r\n\t\t\tscope: {\r\n\t\t\t\tbreadcrumbItem: \"=\"\r\n\t\t\t},\r\n\t\t\trestrict: 'A'\r\n\t\t};\r\n\t\treturn directive;\r\n\r\n\t\tfunction link(scope, element, attrs) {\r\n\t\t\tvar elementClickHandler = ($event) => {\r\n\t\t\t\tif ($event.shiftKey || $event.ctrlKey || $event.target.tagName != 'A')\r\n\t\t\t\t\treturn;\r\n\t\t\t\t// need to reload the page when partner used service to set breadcrumb, for example\r\n\t\t\t\t// Page A > Page B , when partner set Page B from service, url is same as A, so on click A, we need to use $window.location.reload()\r\n\t\t\t\tvar breadcrumbLastItem = $rootScope.fxpBreadcrumb[$rootScope.fxpBreadcrumb.length - 1];\r\n\t\t\t\tif (scope.breadcrumbItem.href === $window.location.hash && breadcrumbLastItem.displayName !== scope.breadcrumbItem.displayName)\r\n\t\t\t\t\t$window.location.reload();\r\n\t\t\t\t//Update breadcrumb display name and telemetry only if page is not dirty.\r\n\t\t\t\tif(!window._showPageDirtyPopup){\r\n\t\t\t\t\tif (breadcrumbLastItem.displayName !== scope.breadcrumbItem.displayName) {\r\n\t\t\t\t\t\tfxpBreadcrumbService.logBreadcrumbTelemetryInfo(FxpConstants.BreadcrumbEventType.BreadcrumbClick, scope.breadcrumbItem);\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (scope.breadcrumbItem.targetEventName)\r\n\t\t\t\t\t\t$rootScope.$emit(scope.breadcrumbItem.targetEventName);\r\n\t\t\t\t}\r\n\t\t\t\t\r\n\t\t\t};\r\n\t\t\telement.bind('click', elementClickHandler);\r\n\t\t\tscope.$on('$destroy', function () {\r\n\t\t\t\telement.unbind('click', elementClickHandler);\r\n\t\t\t});\r\n\t\t}\r\n\t}\r\n}\r\n\r\nfxpBreadcrumbLink.fxpBreadcrumbLinksDirective['$inject'] = ['$rootScope', \"$window\", 'FxpBreadcrumbService'];"," \r\n export var fxpChoiceItem = function () {\r\n return {\r\n restrict: 'A',\r\n link: function(scope, elem, attr) {\r\n // Event Handler for directive destroy.\r\n var destroyEventHandler = function(event) {\r\n var choiceContainer = $('.choice-summary'),\r\n // All close buttons of choices.\r\n choiceCloseButtons = choiceContainer.find('.choice-close'),\r\n // Index of current close button.\r\n currentItemIndex = event.currentScope.$index;\r\n // Check if more Choice are there.\r\n if (choiceCloseButtons.length > 1) {\r\n // Check which item is to be focused.\r\n if (currentItemIndex == (choiceCloseButtons.length - 1)) {\r\n // Focus previous Choice.\r\n choiceCloseButtons[currentItemIndex - 1].focus();\r\n } else {\r\n // Focus next Choice.\r\n choiceCloseButtons[currentItemIndex + 1].focus();\r\n }\r\n } else {\r\n // Focus typeahead when last choice is closed.\r\n $('#search-user').focus();\r\n }\r\n };\r\n //closeButton.on('click', closeButtonClickHandler);\r\n scope.$on('$destroy', destroyEventHandler);\r\n }\r\n };\r\n}\r\n\r\n","/* fxpGoToTop directive is used to scroll to top*/\r\n\r\nexport class FxpGoToTopDirective implements angular.IDirective {\r\n static fxpGoToTop(): angular.IDirective {\r\n var directive = {\r\n link: link,\r\n restrict: 'A'\r\n };\r\n return directive;\r\n\r\n function link(scope, element, attrs) {\r\n let onClick = function() {\r\n if (attrs.parent) {\r\n $(attrs.parent).scrollTop(0);\r\n }\r\n if (attrs.focuson) {\r\n $(attrs.focuson).focus();\r\n }\r\n },\r\n cleanUp = function() {\r\n element.off('click');\r\n };\r\n element.on('click', onClick);\r\n scope.$on('$destroy', cleanUp);\r\n }\r\n }\r\n}","/* fxpHelpEvents directive is used to reset the focus to help button */\r\n\r\nimport { FxpConstants } from \"../common/ApplicationConstants\";\r\n\r\nexport class FxpHelpDirectives implements angular.IDirective {\r\n static fxpHelpEvents($timeout, fxpConfigurationService): angular.IDirective {\r\n var directive = {\r\n link: link,\r\n restrict: 'A'\r\n };\r\n return directive;\r\n\r\n function link(scope, element, attrs) { \r\n if (!attrs.fxpHelpEvents)\r\n return;\r\n var item = JSON.parse(attrs.fxpHelpEvents);\r\n var url = item.href;\r\n var target = item.OpenInline == 'true' ? '_self' : '_blank';\r\n \r\n\r\n setTimeout(() => {\r\n var firstTabbleElement = $(\"#help-back-button\").prop('disabled') == false ? $(\"#help-back-button\") \r\n : ($(\"#help-forward-button\").prop('disabled') == false ? $(\"#help-forward-button\") : $(\"#open-help-central\") ),\r\n helpItems = $('.help-content').find(\"a\").filter(':visible'),\r\n LastTabbleElement = helpItems[helpItems.length - 1],\r\n helpCentralElement = $(\"#open-help-central\"),\r\n helpItems = $('.help-content').find(\"a\").filter(':visible');\r\n firstTabbleElement.on(\"keydown\", function(event){\r\n var keyCodes = FxpConstants.keyCodes;\r\n if (event.keyCode === keyCodes.tabKey && event.shiftKey) {\r\n event.preventDefault();\r\n LastTabbleElement.focus();\r\n }\r\n }); \r\n\r\n helpCentralElement.on(\"keydown\", function(event){\r\n var keyCodes = FxpConstants.keyCodes;\r\n if (event.keyCode === keyCodes.tabKey && event.shiftKey) {\r\n var prevElement = $(\"#help-home-button\").prop('disabled') == false ? $(\"#help-home-button\") \r\n : $(\"#help-back-button\").prop('disabled') == false ? $(\"#help-back-button\")\r\n : $(\"#help-forward-button\").prop('disabled') == false ? $(\"#help-forward-button\") \r\n : LastTabbleElement;\r\n event.preventDefault();\r\n prevElement.focus();\r\n }\r\n });\r\n \r\n LastTabbleElement.onkeydown = function(event){\r\n var keyCodes = FxpConstants.keyCodes;\r\n if (event.keyCode === keyCodes.tabKey && !event.shiftKey) {\r\n event.preventDefault();\r\n firstTabbleElement.focus();\r\n }\r\n };\r\n }, 0);\r\n\r\n \r\n \r\n if (!item.eventName && !item.windowProperties && item.href) {\r\n element.attr('href', url);\r\n element.attr('target', target);\r\n }\r\n\r\n element.on(\"click\", onHelpItemClicked);\r\n element.on(\"keyup\", scrollToHelpItem);\r\n\r\n scope.$on(\"$destroy\", function() {\r\n element.off(\"click\", onHelpItemClicked);\r\n element.off(\"keyup\", scrollToHelpItem);\r\n });\r\n\r\n function onHelpItemClicked() {\r\n if (item.eventName) {\r\n scope.$emit(item.eventName, url, target);\r\n }\r\n if (item.windowProperties) {\r\n window.open(item.href, item.windowName, item.windowProperties); \r\n }\r\n }\r\n function scrollToHelpItem(event) {\r\n var keyCodes = FxpConstants.keyCodes;\r\n if (event.keyCode == keyCodes.tabKey) {\r\n var activeElem = document.activeElement;\r\n if (activeElem != null && activeElem != undefined) {\r\n var helpContent = $(activeElem).closest('.help-content'),\r\n helpContentItems = helpContent.find(\"a\").filter(':visible'),\r\n currentMenuItemIndex = helpContentItems.index(activeElem);\r\n\r\n if (currentMenuItemIndex == 0) {\r\n $(\".help-content\").parent().scrollTop(0);\r\n }\r\n else if (currentMenuItemIndex == helpContentItems.length - 1) {\r\n $(\".help-content\").parent().scrollTop(10000);\r\n }\r\n else {\r\n var elem = $(document.activeElement).next(\"div\"),\r\n scrollElement = $(\".help-content\").parent(),\r\n pageTop = $(scrollElement).scrollTop(),\r\n pageBottom = pageTop + $(scrollElement).height(),\r\n elementTop = elem.offset() ? elem.offset().top : 0,\r\n elementBottom = elementTop + elem.height(),\r\n isScrolledIntoView = ((pageTop < elementTop) && (pageBottom > elementBottom));\r\n if (!isScrolledIntoView) {\r\n document.activeElement.scrollIntoView(true);\r\n scrollElement.scrollTop($(\".help-content\").parent().scrollTop() - 1);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n static fxpHelp($timeout, $document, $rootScope): angular.IDirective {\r\n let directive = {\r\n link: link,\r\n restrict: 'A'\r\n };\r\n return directive;\r\n\r\n function link(scope, element) {\r\n let helpButton,\r\n fxpKeyCodes = FxpConstants.keyCodes,\r\n pullFocusToHelpButton = function() {\r\n helpButton.focus();\r\n },\r\n keyDown = function(event) {\r\n if ((event.keyCode === fxpKeyCodes.escapeKey) && ($rootScope.isHelpOpen) && (!$rootScope.isHelpFlyoutPinned)) {\r\n $(\"#help-open\").click();\r\n pullFocusToHelpButton();\r\n }\r\n },\r\n toggleGoToTop = function() {\r\n let helpContainer = $(\".help-content\");\r\n $timeout(function() {\r\n if (helpContainer.length) {\r\n scope.hasScrollbar = helpContainer.get(0).scrollHeight > helpContainer.get(0).clientHeight;\r\n } else {\r\n scope.hasScrollbar = false;\r\n }\r\n }, 1000);\r\n },\r\n cleanUp = function() {\r\n pullFocusToHelpButton();\r\n };\r\n $timeout(function() {\r\n helpButton = $('#help-open');\r\n element.on('keydown', keyDown);\r\n scope.$watch(function() {\r\n let helpContainer = $(\".help-content\");\r\n if (helpContainer.length) {\r\n return helpContainer.get(0).scrollHeight;\r\n }\r\n }, toggleGoToTop);\r\n });\r\n scope.$on('$destroy', cleanUp);\r\n }\r\n }\r\n static fxpHelpArticle($timeout): angular.IDirective {\r\n let directive = {\r\n restrict: 'A',\r\n link: link\r\n };\r\n return directive;\r\n\r\n function link(scope, element, attr) {\r\n let image,\r\n onImageClick = function(event) {\r\n scope.expandArticleImage(event.target.attributes[\"src\"].value);\r\n },\r\n onImageEnterPress = function(event) {\r\n if (event.keyCode === 13) {\r\n scope.expandArticleImage(event.target.attributes[\"src\"].value);\r\n }\r\n },\r\n cleanUp = function() {\r\n image.off('click');\r\n };\r\n attr.$observe('fxpHelpArticle', function() {\r\n $timeout(function() {\r\n image = element.find(\"img\");\r\n image.wrap('
      ')\r\n image.attr('tabindex', 0);\r\n image.on('click', onImageClick);\r\n image.on('keydown', onImageEnterPress);\r\n $('').insertAfter(image);\r\n });\r\n });\r\n scope.$on('$destroy', cleanUp);\r\n }\r\n }\r\n static fxpHelpOutsideClick($rootScope, $document, $parse): angular.IDirective {\r\n return {\r\n restrict: 'A',\r\n link: function($scope, elem, attr) {\r\n if ($parse(attr.fxpHelpOutsideClick)($scope)) {\r\n var outSideClickHandler = function($event) {\r\n var el = $($event.target).closest(\".contextual-help\");\r\n if (el.length === 0) {\r\n if (!$rootScope.isHelpFlyoutPinned && $rootScope.isHelpOpen) {\r\n $rootScope.$apply(function() {\r\n $rootScope.isHelpOpen = false;\r\n });\r\n }\r\n }\r\n };\r\n $document.on('click', outSideClickHandler);\r\n $scope.$on('$destroy', function() {\r\n $document.off('click', outSideClickHandler);\r\n });\r\n }\r\n }\r\n };\r\n }\r\n}\r\n\r\nFxpHelpDirectives.fxpHelpEvents.$inject = ['$timeout', 'FxpConfigurationService'];\r\nFxpHelpDirectives.fxpHelp.$inject = ['$timeout', '$document', '$rootScope'];\r\nFxpHelpDirectives.fxpHelpArticle.$inject = ['$timeout'];\r\nFxpHelpDirectives.fxpHelpOutsideClick.$inject = ['$rootScope', '$document', '$parse'];\r\n","/*\r\n fxpIncludeStaticTemplate is an alternate to ng-include.\r\n But unlike ng-include it won't create a new scope while fetching the template.\r\n\r\n e.g.\r\n Usage
      \r\n*/\r\n\r\nexport class FxpIncludeStaticTemplate implements angular.IDirective {\r\n\tscope = false;\r\n\t\r\n constructor(private $templateCache:any){\r\n }\r\n \r\n template = (element: JQuery, attrs) => {\r\n return this.$templateCache.get(attrs.fxpIncludeStaticTemplate);\r\n } \r\n}\r\n","interface chromeUserExperienceObject {\r\n noThanksFlag: number;\r\n timestamp: number;\r\n userName: string;\r\n}\r\n\r\nexport class FxpComponentDirectives implements angular.IDirective {\r\n\r\n static getEmptyDirective(): angular.IDirective {\r\n var directive = {\r\n restrict: 'E',\r\n template: ''\r\n };\r\n return directive;\r\n }\r\n\r\n static fxpleftnavigation($templateCache): angular.IDirective {\r\n var directive: any = {};\r\n\r\n directive.restrict = 'AE';\r\n\r\n directive.template = $templateCache.get('leftnavigation.html')\r\n\r\n return directive;\r\n }\r\n\r\n static populateNotification($templateCache): angular.IDirective {\r\n var directive = {\r\n restrict: 'AE',\r\n template: $templateCache.get('browserExperience.html')\r\n };\r\n return directive;\r\n }\r\n\r\n static fxpheader($templateCache): angular.IDirective {\r\n var headerdirective: any = {};\r\n headerdirective.restrict = 'AE';\r\n headerdirective.template = $templateCache.get('fxpheader.html');\r\n\r\n return headerdirective;\r\n }\r\n\r\n static fxpfooter(deviceFactory, $templateCache): angular.IDirective {\r\n var directive: any = {};\r\n\r\n directive.restrict = 'AE';\r\n\r\n directive.template = $templateCache.get('footer.html');\r\n\r\n directive.link = function (scope, element, attr) {\r\n // Setting min-height of partner app\r\n element.ready(function () {\r\n if (deviceFactory.isMobile()) {\r\n var headerHeight = angular.element(\"#header\").height(),\r\n footerHeight = angular.element(\"#fxpfooter\").height(),\r\n windowHeight = self.window.innerHeight,\r\n partnerApp = angular.element(\".partner-app\");\r\n\r\n partnerApp.css('min-height', windowHeight - headerHeight - footerHeight);\r\n }\r\n });\r\n }\r\n\r\n return directive;\r\n }\r\n\r\n static fxpOboHeader($templateCache): angular.IDirective {\r\n return {\r\n restrict: 'E',\r\n template: $templateCache.get(\"actobo-header.html\"),\r\n }\r\n }\r\n\r\n static fxpLoader($window, $rootScope, $templateCache): angular.IDirective {\r\n var directive = {\r\n restrict: 'AE',\r\n replace: true,\r\n scope: true,\r\n template: $templateCache.get(\"pageLoader.template.html\")\r\n };\r\n return directive;\r\n }\r\n\r\n static fxpbreadcrumb($templateCache): angular.IDirective {\r\n var directive = FxpComponentDirectives.getEmptyDirective();\r\n directive.template = $templateCache.get(\"fxpbreadcrumb.html\");\r\n return directive;\r\n }\r\n\r\n static fxphelpmenu($templateCache): angular.IDirective {\r\n var directive = FxpComponentDirectives.getEmptyDirective();\r\n directive.template = $templateCache.get(\"fxphelpmenu.html\");\r\n return directive;\r\n }\r\n\r\n static fxpnotification($templateCache): angular.IDirective {\r\n var directive = FxpComponentDirectives.getEmptyDirective();\r\n directive.template = $templateCache.get(\"fxpnotification.html\")\r\n return directive;\r\n }\r\n\r\n static fxpsystemupdatemsg($templateCache): angular.IDirective {\r\n var directive = {\r\n restrict: 'E',\r\n template: $templateCache.get(\"system-update-msg-banner.html\"),\r\n\r\n };\r\n return directive;\r\n }\r\n\r\n static fxptoastnotification($templateCache): angular.IDirective {\r\n var directive = {\r\n restrict: 'E',\r\n controller: 'ToastNotificationController',\r\n controllerAs: 'toastNotificationController',\r\n bindToController: true,\r\n template: $templateCache.get(\"fxptoastnotification.html\")\r\n };\r\n return directive;\r\n }\r\n\r\n static fxpbotmenu($templateCache): angular.IDirective {\r\n var directive = FxpComponentDirectives.getEmptyDirective();\r\n directive.template = $templateCache.get(\"fxpbot.component.html\");\r\n return directive;\r\n }\r\n\r\n static fxppagetour($templateCache): angular.IDirective {\r\n var directive = FxpComponentDirectives.getEmptyDirective();\r\n directive.template = $templateCache.get(\"pageTour.component.html\");\r\n return directive;\r\n }\r\n}\r\nFxpComponentDirectives.fxpLoader.$inject = ['$window', '$rootScope', '$templateCache'];\r\nFxpComponentDirectives.fxpfooter.$inject = ['DeviceFactory', '$templateCache'];\r\nFxpComponentDirectives.fxpleftnavigation.$inject = ['$templateCache'];\r\nFxpComponentDirectives.fxpheader.$inject = ['$templateCache'];\r\nFxpComponentDirectives.fxpOboHeader.$inject = ['$templateCache'];\r\nFxpComponentDirectives.fxpbreadcrumb.$inject = ['$templateCache'];\r\nFxpComponentDirectives.fxphelpmenu.$inject = ['$templateCache'];\r\nFxpComponentDirectives.fxpnotification.$inject = ['$templateCache'];\r\nFxpComponentDirectives.fxpsystemupdatemsg.$inject = ['$templateCache'];\r\nFxpComponentDirectives.fxptoastnotification.$inject = ['$templateCache'];\r\nFxpComponentDirectives.fxpbotmenu.$inject = ['$templateCache'];\r\nFxpComponentDirectives.fxppagetour.$inject = ['$templateCache'];","export class FxpKeyDownDirective implements angular.IDirective {\r\n\tconstructor() {\r\n\r\n\t}\r\n\tstatic fxpEnterKeyPressDirective() {\r\n\t\treturn function (scope, elem, attr) {\r\n\t\t\telem.bind(\"keydown keypress\", function (evt) {\r\n\t\t\t\tif (evt.which === 13) {\r\n\t\t\t\t\tscope.$apply(function () {\r\n\t\t\t\t\t\tscope.$eval(attr.fxpKeyDown);\r\n\t\t\t\t\t});\r\n\t\t\t\t\tevt.preventDefault();\r\n\t\t\t\t}\r\n\t\t\t})\r\n\t\t};\r\n\t}\r\n}","import { ILogger } from \"../interfaces/ILogger\";\r\nimport { IRootScope } from \"../interfaces/IRootScope\";\r\nimport { FxpMessageService } from \"../../app/banner/FxpMessageService\";\r\nimport { OBOUserService } from \"../services/OBOUserService\";\r\nimport { FxpBreadcrumbService } from \"../services/FxpBreadcrumbService\";\r\nimport { UserInfoService } from \"../services/UserInfoService\";\r\nimport { TelemetryContext } from \"../telemetry/telemetrycontext\";\r\nimport { FxpConstants } from \"../common/ApplicationConstants\";\r\nimport {ILazyLoad} from \"oclazyload\";\r\nimport { FxpGlobalStoreService } from \"../services/fxp.global.store.service\";\r\nimport { CommonUtils } from '../utils/CommonUtils';\r\nimport { HideLoader, ShowLoader } from \"../../app/loader/loader.actions\";\r\nimport { TelemetryConstants } from \"../telemetry/TelemetryConst\";\r\nimport { ErrorCodes } from \"../constants/errorCodes\";\r\nimport { ErrorSeverityLevel } from \"../telemetry/ErrorSeverityLevel\";\r\ndeclare type IStateService = any; \r\ndeclare var _: any; \r\n\r\nexport class LeftnavLink {\r\n\tstatic fxpLeftnavLinkDirective($state: IStateService, $rootScope: IRootScope, fxplogger: ILogger, userInfoService: UserInfoService, fxpTelemetryContext: TelemetryContext, oboUserService: OBOUserService, FxpMessageService: FxpMessageService, FxpBreadcrumbService: FxpBreadcrumbService, OcLazyLoad: ILazyLoad, fxpGlobalStoreService: FxpGlobalStoreService ) {\r\n\t\tvar directive = {\r\n\t\t\tlink: link,\r\n\t\t\trestrict: 'A'\r\n\t\t};\r\n\t\tvar businessProcessNameL0, displayNameL0;\r\n\t\tvar user_TenantRoutes = window[\"loggedInUserConfig\"].Routes || [];\r\n\t\tvar lazyLoadconfig = window[\"tenantConfiguration\"].AdditionalConfigurationContainer || {};\r\n\t\tvar enableLazyLoading = lazyLoadconfig.EnableLazyLoading || false;\r\n\t\treturn directive;\r\n\r\n\t\tfunction logLeftNavActivity(captureChildLinkName) {\r\n\t\t\tconst leftNavClickCount = 1;\r\n\t\t\tvar userInfo = userInfoService.getCurrentUserData();\r\n\t\t\tconst classNameFxpLeftnavLink = `${TelemetryConstants.FXP_TELEMETRY_BASE_NAME}.LeftnavLink`;\r\n\t\t\tvar fxpConstants = FxpConstants;\r\n\r\n\t\t\t// Creating PropertyBag\r\n\t\t\tvar propbag = fxplogger.createPropertyBag();\r\n\r\n\t\t\t// Adding businessProcessNameL0 to propbag\r\n\t\t\tpropbag.addToBag(fxpConstants.metricConstants.L0BusinessProcessName, businessProcessNameL0);\r\n\r\n\t\t\t// Adding L0Name to propbag\r\n\t\t\tpropbag.addToBag(fxpConstants.metricConstants.L0Name, displayNameL0);\r\n\r\n\t\t\t// Adding L0Name_L1Name to propbag\r\n\t\t\tpropbag.addToBag(fxpConstants.metricConstants.L0Name_L1Name, captureChildLinkName);\r\n\r\n\t\t\t// Adding UserRoleGroup name to propbag\r\n\t\t\tpropbag.addToBag(fxpConstants.metricConstants.UserRoleGroup, userInfo.roleGroupName);\r\n\r\n\t\t\t// logging LeftNavigationClickCountbyRoleGroup metric data\r\n\t\t\tfxplogger.logMetric(classNameFxpLeftnavLink, fxpConstants.metricConstants.LeftNavigationClickCountbyRoleGroup, leftNavClickCount, propbag);\r\n\r\n\t\t\t// Adding UserBusinessRole to propbag\r\n\t\t\tpropbag.addToBag(fxpConstants.metricConstants.UserBusinessRole, userInfo.businessRole);\r\n\r\n\t\t\t// logging LeftNavigationClickCountbyRole metric data\r\n\t\t\tfxplogger.logMetric(classNameFxpLeftnavLink, fxpConstants.metricConstants.LeftNavigationClickCountbyRole, leftNavClickCount, propbag);\r\n\r\n\t\t\t// Adding UserAgent to propbag\r\n\t\t\tpropbag.addToBag(fxpConstants.metricConstants.UserAgent, navigator.userAgent);\r\n\r\n\t\t\t// Adding Geography to propbag\r\n\t\t\tpropbag.addToBag(fxpConstants.metricConstants.Geography, fxpTelemetryContext.getGeography());\r\n\r\n\t\t\t// logging LeftNavigationClick event\r\n\t\t\tfxplogger.logEvent(classNameFxpLeftnavLink, `${TelemetryConstants.FXP_TELEMETRY_BASE_NAME}.LeftNavigationClick`, propbag);\r\n\t\t}\r\n\r\n\t\t//ToDo:Refactor telemetry code in this file using common method.\r\n\t\tfunction logLeftNavLoadFailEvent(linkName) {\r\n\t\t\tvar userInfo = userInfoService.getCurrentUserData();\r\n\t\t\tconst classNameFxpLeftnavLink = `${TelemetryConstants.FXP_TELEMETRY_BASE_NAME}.LeftnavLink`;\r\n\t\t\tvar fxpConstants = FxpConstants;\r\n\r\n\t\t\t// Creating PropertyBag\r\n\t\t\tvar propbag = fxplogger.createPropertyBag();\r\n\r\n\t\t\t// Adding businessProcessNameL0 to propbag\r\n\t\t\tpropbag.addToBag(fxpConstants.metricConstants.L0BusinessProcessName, businessProcessNameL0);\r\n\r\n\t\t\t// Adding L0Name to propbag\r\n\t\t\tpropbag.addToBag(fxpConstants.metricConstants.L0Name, displayNameL0);\r\n\r\n\t\t\t// Adding L0Name_L1Name to propbag\r\n\t\t\tpropbag.addToBag(fxpConstants.metricConstants.L0Name_L1Name, linkName);\r\n\r\n\t\t\t// Adding UserRoleGroup name to propbag\r\n\t\t\tpropbag.addToBag(fxpConstants.metricConstants.UserRoleGroup, userInfo.roleGroupName);\r\n\r\n\t\t\t// Adding UserBusinessRole to propbag\r\n\t\t\tpropbag.addToBag(fxpConstants.metricConstants.UserBusinessRole, userInfo.businessRole);\r\n\r\n\t\t\t// Adding UserAgent to propbag\r\n\t\t\tpropbag.addToBag(fxpConstants.metricConstants.UserAgent, navigator.userAgent);\r\n\r\n\t\t\t// Adding Geography to propbag\r\n\t\t\tpropbag.addToBag(fxpConstants.metricConstants.Geography, fxpTelemetryContext.getGeography());\r\n\r\n\t\t\t// logging LeftNavigationClick event\r\n\t\t\tfxplogger.logEvent(classNameFxpLeftnavLink, `${TelemetryConstants.FXP_TELEMETRY_BASE_NAME}.LeftNavClickFailDueToMissingDependencies`, propbag);\r\n\t\t}\r\n\r\n\t\tfunction link(scope, element, attrs) {\r\n\t\t\tif (!attrs.fxpLeftnavLink)\r\n\t\t\t\treturn;\r\n\t\t\tvar item = JSON.parse(attrs.fxpLeftnavLink);\r\n\t\t\tvar url, target;\r\n\t\t\t// updating target value for link\r\n\t\t\ttarget = item.openInline === true ? '_self' : '_blank';\r\n\t\t\telement.attr('target', target);\r\n\t\t\t// when targetEventName set do not calculate href value.\r\n\t\t\tif (!item.targetEventName) {\r\n\r\n\r\n\t\t\t\turl = item.targetUIStateName ? $state.href(item.targetUIStateName) : item.targetURL;\r\n\r\n\t\t\t\tif (item.businessProcessName === \"Dashboard\"){\r\n\t\t\t\t\telement.attr('href', \"#/Dashboard\");\r\n\t\t\t\t\t\r\n\t\t\t\t}\r\n\t\t\t\telse if (url){\r\n\t\t\t\t\telement.attr('href', url);\r\n\t\t\t\t}\r\n\t\t\t\t\t\r\n\t\t\t}\r\n\r\n\t\t\tvar elementClickHandler = function ($event) {\r\n\r\n\t\t\t\tvar captureChildLinkName;\r\n\t\t\t\tvar item = JSON.parse(attrs.fxpLeftnavLink);\r\n\r\n\t\t\t\tvar initiateClickStartTime = function (displayName) {\r\n\t\t\t\t\t$rootScope.startTime = performance.now();\r\n\t\t\t\t\t$rootScope.displayName = displayName;\r\n\t\t\t\t}\r\n\r\n\t\t\t\t//If dependencies are missing stop further exeution and log event along with showing message in UI.\r\n\t\t\t\tif (item.dependenciesMissing && item.dependenciesMissing === true) {\r\n\t\t\t\t\tFxpMessageService.addMessage($rootScope.fxpUIConstants.UIMessages.StateChangeErrorDueToMissingModules.ErrorMessageTitle, FxpConstants.messageType.error);\r\n\r\n\t\t\t\t\t//Log a new event to notify that left nav click is restricted.\r\n\t\t\t\t\tvar linkName = item.parentId != null ? item.displayName : \"\";\r\n\t\t\t\t\tlogLeftNavLoadFailEvent(linkName);\r\n\r\n\t\t\t\t\t$event.preventDefault();\r\n\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\tif ($state.current.name == item.targetUIStateName)\r\n\t\t\t\t\t\t$state.reload();\r\n\t\t\t\t\tif (item.businessProcessName && item.parentId == null) {\r\n\t\t\t\t\t\t//capturing businessProcessName for L0 when we click on L0 Item\r\n\t\t\t\t\t\tbusinessProcessNameL0 = item.businessProcessName;\r\n\t\t\t\t\t\t//capturing displayName for L0 when we click on L0 Item\r\n\t\t\t\t\t\tdisplayNameL0 = item.displayName;\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse {\r\n\t\t\t\t\t\tbusinessProcessNameL0 = \"\";\r\n\t\t\t\t\t\tdisplayNameL0 = \"\";\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tif (element.attr('href') != \"\" && element.attr('href') != \"#\") {\r\n\t\t\t\t\t\tif (element.attr('target') === '_self' && !$event.ctrlKey && !$event.shiftKey)\r\n\t\t\t\t\t\t\tinitiateClickStartTime(item.displayName);\r\n\t\t\t\t\t\t//updating captureChildLinkName in L0Name_L1Name\r\n\t\t\t\t\t\tcaptureChildLinkName = item.parentId != null ? item.displayName : \"\";\r\n\t\t\t\t\t\t//method to log telemetry data\r\n\t\t\t\t\t\tlogLeftNavActivity(captureChildLinkName);\r\n\t\t\t\t\t\tif (attrs.isLeftnavItem)\r\n\t\t\t\t\t\t\tFxpBreadcrumbService.isLeftNavItemClicked = true;\r\n\t\t\t\t\t}\r\n\t\t\t\t\t// $emit targetEventName for subscribed at partners app\r\n\t\t\t\t\tif (item.targetEventName && item.targetUIStateName) \r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tvar targetUIState_config = _.find(user_TenantRoutes,(x)=>x.StateName == item.targetUIStateName);\r\n\t\t\t\t\t\tif(enableLazyLoading && targetUIState_config && targetUIState_config.LazyLoad)\r\n\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\tfxpGlobalStoreService.DispatchGlobalAction(\"Platform\", ShowLoader({loadingText: \"Loading...\"}));\r\n\t\t\t\t\t\t\tconsole.log(\"LazyLoad Start Timer for TargetState Bundle:\"+ targetUIState_config.LazyLoad.toString() + new Date());\r\n\t\t\t\t\t\t\t OcLazyLoad.load(targetUIState_config.LazyLoad, { serie: true}).then(function(){\r\n\t\t\t\t\t\t\t\tfxpGlobalStoreService.DispatchGlobalAction(\"Platform\", HideLoader({}));\r\n\t\t\t\t\t\t\t\tconsole.log(\"LazyLoad End Timer for TargetState Bundle:\"+ targetUIState_config.LazyLoad.toString() + new Date());\r\n\t\t\t\t\t\t\t\tif (!$event.ctrlKey && !$event.shiftKey){\r\n\t\t\t\t\t\t\t\t\t//Handle ctrl/Shift click for targetEvent\r\n\t\t\t\t\t\t\t\tinitiateClickStartTime(item.displayName);\r\n\t\t\t\t\t\t\t\t$rootScope.$emit(item.targetEventName);\t\r\n\t\t\t\t\t\t\tif (attrs.isLeftnavItem){\r\n\t\t\t\t\t\t\t\tFxpBreadcrumbService.isLeftNavItemClicked = true\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t} \t\t\t\t\t\r\n\t\t\t\t\t\t}).catch(function(err){\r\n\t\t\t\t\t\t\tfxpGlobalStoreService.DispatchGlobalAction(\"Platform\", HideLoader({}));\r\n\t\t\t\t\t\t\tconsole.error(\"error occurred while doing lazyloading \" + err);\r\n\t\t\t\t\t\t\tlet errMessage, stackTrace;\r\n\t\t\t\t\t\t\tif (err.message != undefined) {\r\n\t\t\t\t\t\t\t\terrMessage = err.message;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\tif (err.stack != undefined) {\r\n\t\t\t\t\t\t\t\tstackTrace = \" \" + err.stack;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\tfxplogger.logError(`${TelemetryConstants.FXP_TELEMETRY_BASE_NAME}.LeftnavLink`, errMessage, ErrorCodes.ErrorOnLeftNavClick, stackTrace, null, null, null, ErrorSeverityLevel.Medium);\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t}\r\n\t\t\t\t\t\telse\r\n\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t$rootScope.$emit(item.targetEventName);\t\r\n\t\t\t\t\t\t\tif (attrs.isLeftnavItem){\r\n\t\t\t\t\t\t\t\tFxpBreadcrumbService.isLeftNavItemClicked = true\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\telement.bind('click', elementClickHandler);\r\n\r\n\t\t\tscope.$on('$destroy', function () {\r\n\t\t\t\telement.unbind('click', elementClickHandler);\r\n\t\t\t});\r\n\t\t}\r\n\t}\r\n}\r\n\r\nLeftnavLink.fxpLeftnavLinkDirective['$inject'] = ['$state', '$rootScope', 'FxpLoggerService', 'UserInfoService', 'FxpTelemetryContext', 'OBOUserService', 'FxpMessageService', 'FxpBreadcrumbService','$ocLazyLoad','FxpGlobalStoreService'];\r\n","import { FxpConstants } from \"../common/ApplicationConstants\";\r\nimport { FxpBroadcastedEvents } from \"../services/FxpBroadcastedEvents\";\r\n\r\nexport class FxpNotification implements angular.IDirective {\r\n static fxpNotificationDirective($window, $timeout, $rootScope, deviceFactory): angular.IDirective {\r\n return {\r\n restrict: 'A',\r\n link: function (scope, elem, attr) {\r\n var fxpKeyCodes = FxpConstants.keyCodes;\r\n var keyBoardEventHandlerForFlyOut = function (event) {\r\n var allMenuItems = $(elem).find(\"ul\").find(\"li.notification .deleteNotification ,.notification-dnd ,.notificationClose\").filter(':visible');\r\n if (fxpKeyCodes.tabKey === event.keyCode && $(event.target)[0].id != \"notification-open\") {\r\n if (allMenuItems.length) {\r\n if (allMenuItems.length == 1) {\r\n stopDefaultBehavior(event);\r\n allMenuItems[0].focus();\r\n } else if (($(event.target)[0].id == \"loadMore\" && !event.shiftKey) || ($(event.target)[0].id == \"dndnotificaion\" && $(\".notification\").find(\".notification-body\").length === 0)) {\r\n stopDefaultBehavior(event);\r\n $(\"#closeNotification\").focus();\r\n } else if ($(event.target)[0].id == \"closeNotification\" && event.shiftKey) {\r\n stopDefaultBehavior(event);\r\n if (!$(\"#loadMore\").filter(\":visible\").length) {\r\n allMenuItems[allMenuItems.length - 1].focus();\r\n }\r\n else\r\n $(\"#loadMore\").focus();\r\n }\r\n }\r\n } else if (event.keyCode === fxpKeyCodes.arrowDownKey || event.keyCode === fxpKeyCodes.arrowUpKey) {\r\n stopDefaultBehavior(event);\r\n }\r\n };\r\n\r\n var globalKeyEventHandler = function (event) {\r\n if (scope.notifications.isNotificationFlyoutOpen && event.keyCode == fxpKeyCodes.escapeKey) {\r\n stopDefaultBehavior(event);\r\n closeNotificaitonFlyout();\r\n }\r\n };\r\n var viewLinkHandler = function (event) {\r\n if (event.keyCode === fxpKeyCodes.arrowDownKey || event.keyCode === fxpKeyCodes.arrowUpKey) {\r\n stopDefaultBehavior(event);\r\n }\r\n };\r\n var keyEventHandlerForNotificatonIcon = function (event) {\r\n if (event.keyCode === fxpKeyCodes.enterKey || event.type == \"click\") {\r\n $(\".notificationflyout ul.dropdown-menu\").animate({ scrollTop: 0 }, \"fast\");\r\n }\r\n };\r\n\r\n /* Fucntion to be called when Notification button is clicked.\r\n ** Closes GLN if it is open. */\r\n var notificationButtonClick = function (event) {\r\n if ($rootScope.isLeftNavOpen && deviceFactory.isMobile()) {\r\n $rootScope.$broadcast(FxpBroadcastedEvents.OnLeftNavToggleExpandedState);\r\n }\r\n };\r\n angular.element($window).on('keyup', globalKeyEventHandler);\r\n var notificationCloseIcon, notificationLoadMore, notificationViewLink, notificationIcon, notificationButton;\r\n $timeout(function () {\r\n notificationCloseIcon = $(elem).find(\"ul\").find(\"#closeNotification\");\r\n notificationLoadMore = $(elem).find(\"ul\").find(\"#loadMore\");\r\n notificationViewLink = $(elem).find(\"ul li a\");\r\n notificationIcon = $(elem).find(\"#notification-open\");\r\n notificationButton = $(elem).find(\"#notification-open\");\r\n $(elem).on(\"keydown\", keyBoardEventHandlerForFlyOut);\r\n notificationIcon.on(\"keydown click\", keyEventHandlerForNotificatonIcon);\r\n notificationViewLink.on(\"keydown\", viewLinkHandler);\r\n notificationButton.on(\"click\", notificationButtonClick);\r\n\r\n });\r\n scope.$on('$destroy', cleanUp);\r\n function cleanUp() {\r\n $(elem).off(\"keydown\");\r\n angular.element($window).off('keyup', globalKeyEventHandler);\r\n //notificationLoadMore.off(\"keydown\", keyBoardEventHandlerForLoadMore);\r\n notificationIcon.off(\"keydown click\", keyEventHandlerForNotificatonIcon);\r\n notificationViewLink.off(\"keydown\", viewLinkHandler);\r\n notificationButton.off(\"click\", notificationButtonClick);\r\n }\r\n function stopDefaultBehavior(event) {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n }\r\n function resetFocus() {\r\n $(\"#notification-open\").focus();\r\n }\r\n function closeNotificaitonFlyout() {\r\n scope.$apply(function () { scope.notifications.isNotificationFlyoutOpen = false; });\r\n resetFocus();\r\n }\r\n }\r\n\r\n };\r\n }\r\n}\r\nFxpNotification.fxpNotificationDirective.$inject = [\"$window\", \"$timeout\", \"$rootScope\", \"DeviceFactory\"];","import { FxpConstants } from \"../common/ApplicationConstants\";\r\n\r\nexport class FxpNotificationSetFocusDirective implements angular.IDirective {\r\n static fxpNotificationSetFocus($window, $timeout): angular.IDirective {\r\n return {\r\n restrict: 'A',\r\n scope: {\r\n notificationAction: '&'\r\n },\r\n link: function(scope, elem, attr) {\r\n var fxpKeyCodes = FxpConstants.keyCodes;\r\n var keyBoardEventHandler = function(event) {\r\n var allMenuItems = $(elem).closest(\"ul\").find(\"a, textarea:not([disabled]), button:not([disabled]), div[tabindex=0]\").filter(':visible'),\r\n currentMenuItemIndex = allMenuItems.index(event.target);\r\n switch (event.keyCode) {\r\n case fxpKeyCodes.tabKey:\r\n if (!event.shiftKey) {\r\n if (currentMenuItemIndex === allMenuItems.length - 1) {\r\n stopDefaultBehavior(event);\r\n allMenuItems[0].focus();\r\n }\r\n } else {\r\n if (currentMenuItemIndex === 0) {\r\n stopDefaultBehavior(event);\r\n allMenuItems[allMenuItems.length - 1].focus();\r\n }\r\n }\r\n break;\r\n case fxpKeyCodes.arrowDownKey:\r\n case fxpKeyCodes.arrowUpKey:\r\n case fxpKeyCodes.spaceBar:\r\n stopDefaultBehavior(event);\r\n break;\r\n }\r\n };\r\n\r\n var notificationSubjectHandler = function(event) {\r\n if (event.keyCode == fxpKeyCodes.enterKey)\r\n scope.$apply(function() { scope.notificationAction(); })\r\n else if (event.keyCode == fxpKeyCodes.arrowDownKey || event.keyCode == fxpKeyCodes.arrowUpKey || event.keyCode == fxpKeyCodes.spaceBar) {\r\n stopDefaultBehavior(event);\r\n }\r\n };\r\n\r\n\r\n $(elem).find(\"button.deleteNotification\").on(\"keydown\", keyBoardEventHandler);\r\n $(elem).find(\"div.notifi-subject\").on(\"click keydown\", notificationSubjectHandler);\r\n scope.$on('$destroy', cleanUp);\r\n function cleanUp() {\r\n $(elem).find(\"button.deleteNotification\").off(\"keydown\", keyBoardEventHandler);\r\n $(elem).find(\"div.notifi-subject\").off(\"click keydown\", notificationSubjectHandler);\r\n }\r\n function stopDefaultBehavior(event) {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n }\r\n function resetFocus() {\r\n $(\"#notification-open\").focus();\r\n }\r\n function closeNotificaitonFlyout() {\r\n scope.$apply(function() { scope.notifications.isNotificationFlyoutOpen = false; });\r\n resetFocus();\r\n }\r\n function setFocusToCloseBtn() {\r\n $(\".notificationClose\").focus();\r\n }\r\n\r\n }\r\n\r\n };\r\n }\r\n}\r\nFxpNotificationSetFocusDirective.fxpNotificationSetFocus.$inject = [\"$window\", \"$timeout\"];","export class FxpSetFocusToElement implements angular.IDirective {\r\n constructor() {\r\n }\r\n static fxpSetFocus() {\r\n return function(scope, elem, attr) {\r\n attr.$observe('fxpSetFocus', function() {\r\n if ((attr.fxpSetFocus) && attr.fxpSetFocus == 'true') {\r\n setTimeout(function() {\r\n elem[0].focus();\r\n }, 100);\r\n }\r\n });\r\n };\r\n }\r\n}","import { FxpBroadcastedEvents } from \"../services/FxpBroadcastedEvents\";\r\n\r\n/*\r\n * The `fxpShowIfDevice` directive shows or hides the given HTML element based on the expression provided to\r\n * the `fxp-show-if-device` attribute.\r\n * \r\n * Possible Values of `fxpShowIfDevice` are \r\n * Desktop - Would only Visible in Desktop Resolution\r\n * Blank - Would be visible in all resolutions.\r\n * \r\n * The element is shown or hidden by removing or adding the `.ng-hide` CSS class onto the element.\r\n * \r\n * Usage\r\n *
      \r\n */\r\nexport class FxpShowIfDeviceDirective implements angular.IDirective {\r\n static fxpShowIfDevice($parse, $rootScope, DeviceFactory): angular.IDirective {\r\n return {\r\n restrict: 'A',\r\n link: function ($scope, $element, $attr) {\r\n var DeviceType = $parse($attr.fxpShowIfDevice)($scope);\r\n if (DeviceType) {\r\n updateVisibilityBasedOnDevice();\r\n $rootScope.$on(FxpBroadcastedEvents.OnLayoutChanged, updateVisibilityBasedOnDevice);\r\n }\r\n\r\n function updateVisibilityBasedOnDevice() {\r\n if (DeviceType == 'Desktop') {\r\n if (DeviceFactory.isDesktop()) {\r\n $element.removeClass('ng-hide');\r\n }\r\n else {\r\n $element.addClass('ng-hide');\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n}","/**\r\n * @application Fxp\r\n */\r\n/**\r\n\t* Direstive to pull focus to content area\r\n * @class Fxp.Directives.SkipToMainContent\r\n * @example \r\n * To Use SkipToMainContent\r\n * angular.module('FxPApp').directive('skipToMainContent', SkipToMainContent.getDirective);\r\n */\r\nexport class SkipToMainContent {\r\n\tpublic restrict: string;\r\n\r\n\tconstructor() {\r\n\t\tthis.restrict = 'C';\r\n\t}\r\n\r\n\tlink(scope, element, attrs) {\r\n\t\tlet onClick = function () {\r\n\t\t\tlet allInteractiveElements = $(\".partner-app [ui-view]\").find(\"a:not([disabled]), input:not([disabled]), textbox:not([disabled]), select:not([disabled]), dropdown:not([disabled]), checkbox:not([disabled]), radio:not([disabled]), textarea:not([disabled]), button:not([disabled]), [tabindex=0]:not([disabled])\").filter(':visible');\r\n\t\t\tallInteractiveElements[0].focus();\r\n\t\t},\r\n\t\t\tcleanUp = function () {\r\n\t\t\t\telement.off('click');\r\n\t\t\t};\r\n\t\telement.on('click', onClick);\r\n\t\tscope.$on('$destroy', cleanUp);\r\n\t}\r\n\r\n\t// Factory method: Returns the object of SkipToMainContent directive.\r\n\tstatic getDirective() {\r\n\t\tlet directive = new SkipToMainContent();\r\n\t\treturn directive;\r\n\t}\r\n}","import { FxpConstants } from \"../common/ApplicationConstants\";\r\n\r\nfxpSystemMessageRow.$inject = [\"$rootScope\", \"$timeout\"];\r\nexport function fxpSystemMessageRow($rootScope, $timeout) {\r\n return {\r\n restrict: 'A',\r\n link: function(scope, elem, attr) {\r\n $timeout(function() {\r\n var showhideChevron = function() {\r\n var columns = elem.find(\"td\");\r\n if (columns[1].offsetWidth == columns[1].scrollWidth) {\r\n $(columns[0]).find(\"button\").hide();\r\n } else {\r\n $(columns[0]).find(\"button\").show();\r\n }\r\n };\r\n scope.$watch(function() { return scope.systemMessage.message; }, showhideChevron);\r\n });\r\n }\r\n }\r\n}\r\nexport function fxpSystemMessagePopupDirective() {\r\n return {\r\n restrict: 'A',\r\n link: function(scope, elem, attr) {\r\n var activeElement: any = $(\":focus\"),\r\n fxpKeyCodes = FxpConstants.keyCodes,\r\n dialog = elem.closest(\"[role='dialog']\");\r\n dialog.focus();\r\n var keyBoardEventHandler = function($event) {\r\n var allMenuItems = $(elem).find(\"button:not([disabled]), select, input, textarea, a\"),\r\n currentMenuItemIndex = allMenuItems.index($event.target);\r\n if ($event.keyCode === fxpKeyCodes.tabKey) {\r\n if (currentMenuItemIndex <= 0 && $event.shiftKey) {\r\n allMenuItems[allMenuItems.length - 1].focus();\r\n stopDefaultBehavior($event);\r\n } else if ((currentMenuItemIndex == (allMenuItems.length - 1) || currentMenuItemIndex < 0) && !$event.shiftKey) {\r\n allMenuItems[0].focus();\r\n stopDefaultBehavior($event);\r\n }\r\n }\r\n };\r\n var closePopup = function($event) {\r\n activeElement.focus();\r\n activeElement = null;\r\n };\r\n dialog.on(\"keydown keypress\", keyBoardEventHandler);\r\n scope.$on('$destroy', function($event) {\r\n dialog.off(\"keydown keypress\", keyBoardEventHandler);\r\n closePopup($event);\r\n });\r\n function stopDefaultBehavior(event) {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n }\r\n }\r\n\r\n };\r\n}","import { FxpConstants } from \"../common/ApplicationConstants\";\r\nexport class BreadcrumbDirectives implements angular.IDirective {\r\n static renderFxpBreadcrumb($window, $timeout, $rootScope): angular.IDirective {\r\n return {\r\n restrict: 'A',\r\n link: function(scope, elem, attr) {\r\n fxpRenderBreadcrumb();\r\n var renderBreadcrumb = function() {\r\n var bcContainer = $(\"#fxp_Breadcrumb\");\r\n var breadcrumbHeight = bcContainer.outerHeight();\r\n var bcList = $(\"#fxp_Breadcrumb ol li\");\r\n if (breadcrumbHeight != null && isMultiLiner(bcList)) {\r\n bcList.addClass('responsiveList');\r\n bcContainer.addClass('responsiveContainer');\r\n } else {\r\n bcList.removeClass('responsiveList');\r\n bcContainer.removeClass('responsiveContainer');\r\n }\r\n };\r\n angular.element($window).on('resize', renderBreadcrumb);\r\n scope.$on('$destroy', cleanUp);\r\n function cleanUp() {\r\n angular.element($window).off('resize', renderBreadcrumb);\r\n elem.off(\"keydown keypress click\", fxpRenderBreadcrumb);\r\n }\r\n elem.on(\"keydown keypress click\", function() {\r\n fxpRenderBreadcrumb();\r\n });\r\n $rootScope.$watch(\r\n 'fxpBreadcrumb',\r\n function() {\r\n fxpRenderBreadcrumb();\r\n }, true\r\n );\r\n function fxpRenderBreadcrumb() {\r\n $timeout(function() {\r\n renderBreadcrumb();\r\n });\r\n }\r\n }\r\n };\r\n\r\n function isMultiLiner(bcList) {\r\n var lastElement: any = false; var count = 1;\r\n bcList.removeClass(\"lastBreadcrumb\");\r\n bcList.each(function() {\r\n if (lastElement && lastElement.offset().top != $(this).offset().top) {\r\n lastElement.addClass(\"lastBreadcrumb\");\r\n count += 1;\r\n }\r\n lastElement = $(this);\r\n }).last().addClass(\"lastBreadcrumb\");\r\n return count > 1 ? true : false;\r\n }\r\n }\r\n static breadcrumbFocusContentAria($rootScope, $state, $timeout, fxpConfigurationService) {\r\n return {\r\n restrict: 'A',\r\n link: function(scope, elem, attr) {\r\n var focusPartenerAria = function(event) {\r\n var fxpKeyCodes = FxpConstants.keyCodes;\r\n $rootScope.$event = event.target;\r\n if ((event.keyCode == fxpKeyCodes.enterKey || event.type == \"click\") && attr.breadcrumbFocusContentAria)\r\n scope.$apply(function() { elem.attr(\"href\", attr.breadcrumbFocusContentAria) })\r\n }\r\n\r\n $rootScope.$on('$viewContentLoaded', function(event) {\r\n if (fxpConfigurationService.FxpBaseConfiguration.FxpRouteCollection.indexOf($state.current.name) === -1) {\r\n if ($rootScope.$event != null && $rootScope.$event != undefined) {\r\n $timeout(function() {\r\n var parentTargetMenu = angular.element('#fxp_Breadcrumb'),\r\n parentAllMenuItems = parentTargetMenu.find(\"li a\").filter(':visible'),\r\n parentCurrentMenuItemIndex = parentAllMenuItems.index($rootScope.$event);\r\n var activeElement = scope.findNextTabStop(parentAllMenuItems[parentAllMenuItems.length - 1]);\r\n activeElement.focus();\r\n $rootScope.$event = null;\r\n });\r\n };\r\n };\r\n });\r\n\r\n var focusEventHandler = function() {\r\n $(\".partner-app\").scrollTop(0);\r\n };\r\n\r\n scope.findNextTabStop = function(ele) {\r\n var focusableElements = document.querySelectorAll('input, button, select, textarea, a[href], details');\r\n var list = Array.prototype.filter.call(focusableElements, function(item) {\r\n return item.tabIndex == 0\r\n });\r\n var index = list.indexOf(ele);\r\n return list[index + 1] || list[0];\r\n }\r\n elem.on('keydown keypress click', focusPartenerAria);\r\n elem.on(\"focus\", focusEventHandler);\r\n scope.$on('$destroy', function() {\r\n elem.unbind('keydown keypress click', focusPartenerAria);\r\n elem.unbind(\"focus\", focusEventHandler);\r\n });\r\n }\r\n };\r\n }\r\n}\r\nBreadcrumbDirectives.breadcrumbFocusContentAria.$inject = ['$rootScope', '$state', '$timeout', 'FxpConfigurationService'];\r\nBreadcrumbDirectives.renderFxpBreadcrumb.$inject = ['$window', '$timeout', '$rootScope'];","import { FxpConstants } from \"../common/ApplicationConstants\";\r\n\r\n/* fxpLeftNavKeydown directive is used to navigate key events when LeftNav is open*/\r\n\r\n'use strict';\r\n\r\nfxpLeftNavKeydown.$inject = ['$rootScope', '$timeout', '$state', 'FxpConfigurationService', 'DeviceFactory'];\r\nexport function fxpLeftNavKeydown($rootScope, $timeout, $state, fxpConfigurationService, device) {\r\n var directive = {\r\n link: link,\r\n restrict: 'A',\r\n scope: {\r\n parentItem: '=',\r\n childItem: '='\r\n }\r\n };\r\n return directive;\r\n\r\n function link(scope, element, attrs) {\r\n var ensureElementInViewAfterFocus = function(containerElem) {\r\n $timeout(function() {\r\n ensureElementInView(containerElem);\r\n }, 100);\r\n }\r\n\r\n var elementKeydownHandler = function($event) {\r\n var self = this;\r\n var keyCodes = FxpConstants.keyCodes;\r\n var targetMenu = $($event.target).closest(\".fxpLeftNavOpen\"),\r\n visibleMenuItems = targetMenu.find(\".left-nav-menu-item a\").filter(':visible'),\r\n currentMenuItemIndex = visibleMenuItems.index($event.target);\r\n var containerElem = $($event.target).closest(\"div.fxp-left-nav-l1-menu\");\r\n\r\n switch ($event.keyCode) {\r\n case keyCodes.escapeKey:\r\n removeToolTip();\r\n $rootScope.isLeftNavOpen = false;\r\n $timeout(function() {\r\n angular.element('#Fxpdashboard_LeftNavItem_' + scope.parentItem.id).focus();\r\n }, 0, false);\r\n break;\r\n\r\n case keyCodes.arrowRightKey:\r\n if (!scope.childItem) {\r\n if (scope.parentItem.hasChildren) {\r\n if (!scope.parentItem.isOpen) {\r\n $timeout(function() {\r\n scope.parentItem.isOpen = true;\r\n }, 0)\r\n } else {\r\n angular.element('#Fxpdashboard_LeftNavItem_' + scope.parentItem.children[0].id).focus();\r\n }\r\n }\r\n\r\n }\r\n break;\r\n\r\n case keyCodes.arrowLeftKey:\r\n if (!scope.childItem) {\r\n if (scope.parentItem.hasChildren) {\r\n if (scope.parentItem.isOpen) {\r\n $timeout(function() {\r\n scope.parentItem.isOpen = false;\r\n });\r\n }\r\n }\r\n }\r\n else {\r\n angular.element('#Fxpdashboard_LeftNavItem_' + scope.parentItem.id).focus();\r\n ensureElementInViewAfterFocus(containerElem);\r\n }\r\n break;\r\n\r\n case keyCodes.arrowDownKey:\r\n if (currentMenuItemIndex < (visibleMenuItems.length - 1)) {\r\n visibleMenuItems[currentMenuItemIndex + 1].focus();\r\n ensureElementInViewAfterFocus(containerElem);\r\n removeToolTip();\r\n showTooltipForElipse(visibleMenuItems[currentMenuItemIndex + 1]);\r\n }\r\n break;\r\n\r\n case keyCodes.arrowUpKey:\r\n if (currentMenuItemIndex >= 1) {\r\n visibleMenuItems[currentMenuItemIndex - 1].focus();\r\n ensureElementInViewAfterFocus(containerElem);\r\n removeToolTip();\r\n showTooltipForElipse(visibleMenuItems[currentMenuItemIndex - 1]);\r\n }\r\n break;\r\n\r\n case keyCodes.enterKey:\r\n if (!$rootScope.isLeftNavPinned)\r\n $rootScope.targetItem = $event.target;\r\n\r\n if (!$rootScope.isLeftNavPinned && (scope.childItem || !scope.parentItem.hasChildren)) {\r\n $rootScope.isLeftNavOpen = false;\r\n }\r\n break;\r\n\r\n case keyCodes.tabKey:\r\n removeToolTip();\r\n if (!$event.shiftKey) {\r\n if (!$rootScope.isLeftNavPinned) {\r\n $rootScope.isLeftNavOpen = false;\r\n\r\n $timeout(function () {\r\n var parentTargetMenu = angular.element('#fxp-sidebar'),\r\n parentAllMenuItems = parentTargetMenu.find(\"li a\").filter(':visible'),\r\n parentCurrentMenuItemIndex = parentAllMenuItems.index($event.target),\r\n nextEl;\r\n\r\n if(device.isMobile()){\r\n nextEl = angular.element('#notification-open');\r\n } else {\r\n nextEl = scope.findNextTabStop(parentAllMenuItems[parentAllMenuItems.length - 1]);\r\n }\r\n nextEl.focus();\r\n }, 50)\r\n\r\n }\r\n } else {\r\n $event.stopPropagation();\r\n $timeout(function () {\r\n if(device.isMobile()){\r\n angular.element('.header_mobile_hamburger').focus();\r\n } else {\r\n angular.element('#pin').focus();\r\n }\r\n }, 0)\r\n }\r\n break;\r\n }\r\n }\r\n\r\n $rootScope.$on('$viewContentLoaded', function(event) {\r\n if (fxpConfigurationService.FxpBaseConfiguration.FxpRouteCollection.indexOf($state.current.name) === -1) {\r\n $timeout(function() {\r\n if ($rootScope.targetItem != null && $rootScope.targetItem != undefined) {\r\n var parentTargetMenu = angular.element('#fxp-sidebar'),\r\n parentAllMenuItems = parentTargetMenu.find(\"li a\").filter(':visible'),\r\n parentCurrentMenuItemIndex = parentAllMenuItems.index($rootScope.targetItem);\r\n var activeElement = scope.findNextTabStop(parentAllMenuItems[parentAllMenuItems.length - 1]);\r\n activeElement.focus();\r\n $rootScope.targetItem = null;\r\n };\r\n });\r\n\r\n };\r\n });\r\n\r\n var leftNavKeyDown = function($event) {\r\n $timeout(function() {\r\n elementKeydownHandler($event);\r\n });\r\n }\r\n\r\n element.bind('keydown keypress', leftNavKeyDown);\r\n scope.$on('$destroy', function() {\r\n element.unbind('keydown keypress', leftNavKeyDown);\r\n });\r\n\r\n\r\n\r\n /* findNextTabStop() function helps to find next tabbable element*/\r\n scope.findNextTabStop = function(ele) {\r\n var focusableElements = document.querySelectorAll('input, button, select, textarea, a[href], details');\r\n var list = Array.prototype.filter.call(focusableElements, function(item) {\r\n return item.tabIndex == 0\r\n });\r\n var index = list.indexOf(ele);\r\n\r\n return list[index + 1] || list[0];\r\n }\r\n }\r\n\r\n function showTooltipForElipse(targetElem) {\r\n\r\n\r\n var $tempElem = $($(targetElem).find(\".leftnavElement\")).clone()\r\n .css({ display: 'inline', width: 'auto', visibility: 'hidden' })\r\n .appendTo('body');\r\n var tempElemWidth = $tempElem.width();\r\n $tempElem.remove();\r\n var leftnavElemWith = $($(targetElem).find(\".leftnavElement\")).width()\r\n if (tempElemWidth > leftnavElemWith)\r\n $(targetElem).find(\".expandedtooltip\").css({ top: $(targetElem).offset().top }).show();\r\n\r\n }\r\n function removeToolTip() {\r\n $(\".expandedtooltip\").hide();\r\n }\r\n\r\n function ensureElementInView(container) {\r\n var activeMenuItem = $(document.activeElement).parent();\r\n var activeMenuItemTop = activeMenuItem.offset().top;\r\n var activeMenuItemBottom = activeMenuItemTop + activeMenuItem.height();\r\n var leftNavTopOffset = $(container).offset().top;\r\n var leftNavBottomOffset = $(container).height() + leftNavTopOffset;\r\n var elementToFocus: any = activeMenuItem;\r\n const top_delta = 16;\r\n const bottom_delta = 48;\r\n\r\n const isElementInViewport = !(isElementAboveViewport() || isElementBelowViewport());\r\n if (isElementInViewport) {\r\n return;\r\n }\r\n\r\n if (isElementAboveViewport()) {\r\n if (isPreviousSiblilingAvailable()) {\r\n elementToFocus = activeMenuItem.prev('.left-nav-menu-item');\r\n } else {\r\n const activeElementTopWithDelta = activeMenuItem.position().top - 30;\r\n elementToFocus = activeElementTopWithDelta;\r\n }\r\n }\r\n\r\n $(container).mCustomScrollbar(\"scrollTo\", elementToFocus);\r\n\r\n\r\n function isPreviousSiblilingAvailable() {\r\n return activeMenuItem.prev('.left-nav-menu-item').length > 0;\r\n }\r\n\r\n function isElementAboveViewport() {\r\n return leftNavTopOffset + top_delta > activeMenuItemTop;\r\n }\r\n\r\n function isElementBelowViewport() {\r\n return leftNavBottomOffset - bottom_delta < activeMenuItemBottom;\r\n }\r\n }\r\n}\r\n","import { FxpConstants } from \"../common/ApplicationConstants\";\r\nexport class FxpToastNotificationDirectives implements angular.IDirective {\r\n static fxpToastNotification(): angular.IDirective {\r\n return {\r\n restrict: 'A',\r\n link: function(scope, elem, attr) {\r\n // Link of current notification.\r\n var notificationLink = elem.find('.toast-content'),\r\n // Close button of current notification.\r\n closeButton = elem.find('.close-button'),\r\n // Time limit to auto close notification.\r\n notificationToastTimeoutLimit = parseInt(scope.toastNotificationController.fxpConfigurationService.FxpBaseConfiguration.NotificationConfiguration.ToastNotificationTimeout || 5000),\r\n // Current notification.\r\n notification = scope.notification,\r\n autoClosePromise = null,\r\n // Event Handler for close button.\r\n closeButtonClickHandler = function(event) {\r\n var toastContainer = $('.toast_container'),\r\n // All close buttons of Toast notifications.\r\n notificationCloseButtons = toastContainer.find('.close-button'),\r\n // All links of toast notifications.\r\n notificationLinks = $('.toast-content'),\r\n // Index of current close button.\r\n currentItemIndex = notificationCloseButtons.index(event.target);\r\n // Check if more notifications are there.\r\n if (notificationCloseButtons.length > 1) {\r\n // Check which item is to be focused.\r\n if (currentItemIndex == (notificationCloseButtons.length - 1)) {\r\n // Focus previous notification.\r\n notificationLinks[currentItemIndex - 1].focus();\r\n } else {\r\n // Focus next notification.\r\n notificationLinks[currentItemIndex + 1].focus();\r\n }\r\n }\r\n },\r\n // Method to perform cleanup.\r\n cleanUp = function() {\r\n closeButton.off('click', closeButtonClickHandler);\r\n elem.off('mouseover', onMouseOver);\r\n elem.off('mouseout', onMouseOut);\r\n },\r\n // Event handler for mouseover.\r\n onMouseOver = function(event) {\r\n // Fix the position.\r\n var toastNotifications = $(\".toast-notificaion\");\r\n for (var index = toastNotifications.length - 1; index >= 0; index--) {\r\n $(toastNotifications[index]).css('top', (toastNotifications[index].offsetTop + 48));\r\n $(toastNotifications[index]).css('position', 'fixed');\r\n }\r\n // Stop auto close timer.\r\n if (autoClosePromise) {\r\n scope.toastNotificationController.$timeout.cancel(autoClosePromise);\r\n autoClosePromise = null;\r\n }\r\n },\r\n // Event handler for mouseout.\r\n onMouseOut = function(event) {\r\n // Revert position to default.\r\n var toastNotifications = $(\".toast-notificaion\");\r\n for (var index = 0; index < toastNotifications.length; index++) {\r\n $(toastNotifications[index]).css('top', 'auto');\r\n $(toastNotifications[index]).css('position', 'relative');\r\n }\r\n // Start auto close timer.\r\n autoCloseStart();\r\n },\r\n // Method to start autoclose timer.\r\n autoCloseStart = function() {\r\n // Auto close notification.\r\n autoClosePromise = scope.toastNotificationController.$timeout(function() {\r\n scope.toastNotificationController.closeToastNotification(notification);\r\n }, notificationToastTimeoutLimit);\r\n };\r\n // Start autoclose timer.\r\n autoCloseStart();\r\n // Pull focus to current notification.\r\n notificationLink.focus();\r\n closeButton.on('click', closeButtonClickHandler);\r\n elem.on('mouseover', onMouseOver);\r\n elem.on('mouseout', onMouseOut);\r\n scope.$on('$destroy', cleanUp);\r\n }\r\n };\r\n }\r\n\r\n static fxpToastNotificationContainer(): angular.IDirective {\r\n return {\r\n restrict: 'A',\r\n link: function(scope, elem) {\r\n // Find current focused element.\r\n var activeElement = $(':focus'),\r\n // Key codes.\r\n fxpKeyCodes = FxpConstants.keyCodes,\r\n // Key Down Event handler.\r\n keydownEventHandler = function(event) {\r\n // Find all focusable elements.\r\n var focusableElements = elem.find('a, button'),\r\n // Find current index.\r\n currentItemIndex = focusableElements.index(event.target);\r\n // Check if tab key is pressed.\r\n if (event.keyCode === fxpKeyCodes.tabKey) {\r\n // Check if shift tab is pressed on first item.\r\n if (event.shiftKey && currentItemIndex == 0) {\r\n // Focus last element.\r\n focusableElements[focusableElements.length - 1].focus();\r\n // Stop default behavior.\r\n stopDefaultBehavior(event);\r\n }\r\n // Check if tab is pressed on last item.\r\n else if (!event.shiftKey && currentItemIndex == (focusableElements.length - 1)) {\r\n // Focus first element.\r\n focusableElements[0].focus();\r\n // Stop default behavior.\r\n stopDefaultBehavior(event);\r\n }\r\n }\r\n },\r\n // Method to stop default behavior.\r\n stopDefaultBehavior = function(event) {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n },\r\n // Method to perform cleanup.\r\n cleanUp = function() {\r\n elem.off('keydown', keydownEventHandler);\r\n // Put focus back to the element which had focus befre notification appeared.\r\n activeElement.focus();\r\n };\r\n elem.on('keydown', keydownEventHandler);\r\n scope.$on('$destroy', cleanUp);\r\n }\r\n };\r\n }\r\n}","export class LeftNavOutsideClickDirective implements angular.IDirective {\r\n static leftNavOutsideClick($rootScope, $document, $parse): angular.IDirective {\r\n return {\r\n restrict: 'A',\r\n link: function($scope, elem, attr) {\r\n\r\n\r\n if ($parse(attr.leftNavOutsideClick)($scope)) {\r\n var outSideClickHandler = function($event) {\r\n var el = $($event.target).closest(\".leftBar\");\r\n $(\".expandedtooltip\").hide();\r\n if (el.length === 0) {\r\n if ($rootScope.isLeftNavOpen && !$rootScope.isLeftNavPinned) {\r\n $rootScope.$apply(function() {\r\n $rootScope.isLeftNavOpen = false;\r\n });\r\n }\r\n }\r\n };\r\n\r\n $document.bind('click', outSideClickHandler);\r\n $scope.$on('$destroy', function() {\r\n $document.unbind('click', outSideClickHandler);\r\n });\r\n }\r\n }\r\n };\r\n }\r\n}\r\n","import { FxpConstants } from \"../common/ApplicationConstants\";\r\n\r\nexport class RenderNavElementsForKeydownDirective implements angular.IDirective {\r\n static renderNavElementsForKeydown($timeout): angular.IDirective {\r\n return {\r\n restrict: 'A',\r\n scope: {\r\n fxpNavElement: '@',\r\n isHideButtonVisible: \"=\",\r\n enableAddOrRemove: \"&\",\r\n globalNavItem: \"=\",\r\n childrenNavItem: \"=\",\r\n userNavItem: \"=\",\r\n childrenUserNavItem: \"=\"\r\n },\r\n link: function(scope, elem, attr) {\r\n var keyBoardEventsHandler = function($event) {\r\n var fxpKeyCodes = FxpConstants.keyCodes;\r\n var targetMenu: any = $($event.target).closest(scope.fxpNavElement),\r\n allMenuItems = targetMenu.find(\".fxpTabbableElem\").filter(':visible'),\r\n currentMenuItemIndex = allMenuItems.index($event.target);\r\n switch ($event.keyCode) {\r\n case fxpKeyCodes.arrowDownKey:\r\n stopDefaultBehavior($event);\r\n if (currentMenuItemIndex < (allMenuItems.length - 1)) {\r\n allMenuItems[currentMenuItemIndex + 1].focus();\r\n }\r\n else {\r\n allMenuItems[0].focus();\r\n }\r\n chagneTabIndex(allMenuItems, currentMenuItemIndex + 1);\r\n break;\r\n case fxpKeyCodes.arrowUpKey:\r\n stopDefaultBehavior($event);\r\n if (currentMenuItemIndex > 0) {\r\n allMenuItems[currentMenuItemIndex - 1].focus();\r\n }\r\n else {\r\n allMenuItems[allMenuItems.length - 1].focus();\r\n }\r\n chagneTabIndex(allMenuItems, currentMenuItemIndex - 1);\r\n break;\r\n case fxpKeyCodes.tabKey:\r\n\r\n if (currentMenuItemIndex < 0)\r\n currentMenuItemIndex = allMenuItems.index($($event.target).parents(\".fxpTabbableElem\"));\r\n\r\n chagneTabIndex(allMenuItems, currentMenuItemIndex);\r\n break;\r\n case fxpKeyCodes.arrowRightKey:\r\n stopDefaultBehavior($event);\r\n if (!scope.isHideButtonVisible) {\r\n scope.$apply(function() {\r\n scope.isHideButtonVisible = !scope.isHideButtonVisible;\r\n $(elem).attr(\"aria-label\", $(elem).attr(\"aria-text\") + \"Expanded\");\r\n });\r\n }\r\n break;\r\n case fxpKeyCodes.arrowLeftKey:\r\n stopDefaultBehavior($event);\r\n var l1Container = $($event.target).parents(\"ul\"), parentElement;\r\n if (l1Container && l1Container.length > 0) {\r\n parentElement = l1Container.siblings(\".fxpTabbableElem\");\r\n parentElement = ((parentElement) && (parentElement.length > 0)) ? parentElement : l1Container.parent().find(\"button\");\r\n parentElement.focus();\r\n } else {\r\n if (scope.isHideButtonVisible) {\r\n scope.$apply(function() {\r\n scope.isHideButtonVisible = false;\r\n $(elem).attr(\"aria-label\", $(elem).attr(\"aria-text\") + \"Collapsed\");\r\n });\r\n }\r\n }\r\n break;\r\n case fxpKeyCodes.spaceBar:\r\n var targetElem = $($event.target);\r\n var checkBoxElem;\r\n stopDefaultBehavior($event)\r\n if (targetElem.is(\"input:enabled\")) {\r\n checkBoxElem = targetElem;\r\n } else {\r\n checkBoxElem = targetElem.find(\"input:enabled\");\r\n }\r\n if (checkBoxElem.length > 0) {\r\n checkBoxElem.prop(\"checked\");\r\n scope.$apply(function() {\r\n if (scope.globalNavItem)\r\n scope.globalNavItem.isParentSelected = !scope.globalNavItem.isParentSelected;\r\n if (scope.childrenNavItem)\r\n scope.childrenNavItem.isChildSelected = !scope.childrenNavItem.isChildSelected;\r\n if (scope.userNavItem)\r\n scope.userNavItem.isSelected = !scope.userNavItem.isSelected;\r\n if (scope.childrenUserNavItem)\r\n scope.childrenUserNavItem.isSelected = !scope.childrenUserNavItem.isSelected;\r\n //this helps in select/unselect checkbox when space bar is pressed and also called controller function binded to the directive\r\n if (scope.userNavItem)\r\n scope.userNavItem.isRecepientsParentSelected = !scope.userNavItem.isRecepientsParentSelected;\r\n if (scope.childrenUserNavItem)\r\n scope.childrenUserNavItem.isRecepientsChildSelected = !scope.childrenUserNavItem.isRecepientsChildSelected;\r\n\r\n scope.enableAddOrRemove();\r\n });\r\n }\r\n break;\r\n case fxpKeyCodes.enterKey:\r\n stopDefaultBehavior($event)\r\n var accordionState;\r\n scope.$apply(function() {\r\n accordionState = scope.isHideButtonVisible ? \" Collapsed \" : \" Expanded \";\r\n scope.isHideButtonVisible = !scope.isHideButtonVisible;\r\n $(elem).attr(\"aria-label\", $(elem).attr(\"aria-text\") + accordionState);\r\n });\r\n break;\r\n }\r\n };\r\n var clickEventsHandler = function(event) {\r\n var target = $(event.target);\r\n var accordionState;\r\n if (target.hasClass(\"accordion-element\")) {\r\n scope.$apply(function() {\r\n accordionState = scope.isHideButtonVisible ? \" Expanded \" : \" Collapsed \";\r\n //scope.isHideButtonVisible = !scope.isHideButtonVisible;\r\n\r\n $(elem).attr(\"aria-label\", accordionState + \". \" + $(elem).attr(\"aria-text\"));\r\n });\r\n }\r\n };\r\n var accordionState;\r\n if ($(elem).get(0).tagName === \"DIV\") {\r\n $timeout(function() {\r\n accordionState = scope.isHideButtonVisible ? \" Expanded \" : \" Collapsed \";\r\n $(elem).attr('aria-label', $(elem).attr('aria-label') + accordionState);\r\n });\r\n }\r\n elem.bind(\"keydown keypress\", keyBoardEventsHandler);\r\n elem.bind(\"click\", clickEventsHandler);\r\n scope.$on('$destroy', function() {\r\n elem.unbind(\"keydown keypress\", keyBoardEventsHandler);\r\n elem.unbind(\"click\", clickEventsHandler);\r\n });\r\n }\r\n };\r\n function stopDefaultBehavior($event) {\r\n $event.preventDefault();\r\n $event.stopPropagation();\r\n }\r\n function chagneTabIndex(elemList, focuableElemIndex) {\r\n elemList.each(function(index) {\r\n if (index != focuableElemIndex) {\r\n $(elemList[index]).attr('tabindex', -1);\r\n } else {\r\n $(elemList[index]).attr('tabindex', 0);\r\n }\r\n });\r\n }\r\n }\r\n}\r\nRenderNavElementsForKeydownDirective.renderNavElementsForKeydown.$inject = ['$timeout'];","export class LeftNavPrsonalizationAdjustScrollDirective implements angular.IDirective {\r\n static leftNavPrsonalizationAdjustScroll(): angular.IDirective {\r\n return {\r\n restrict: 'A',\r\n\r\n link: function(scope, elem, attr) {\r\n var focusEventHandler = function($event) {\r\n $(\".partner-app\").scrollLeft(0);\r\n };\r\n elem.bind(\"focus\", focusEventHandler);\r\n scope.$on('$destroy', function() {\r\n elem.unbind(\"focus\", focusEventHandler);\r\n });\r\n }\r\n };\r\n }\r\n}\r\n","import { CommonUtils } from \"../utils/CommonUtils\";\r\n\r\nexport class RenderPopUpForKeydownDirective implements angular.IDirective {\r\n static renderPopUpForKeydown(): angular.IDirective {\r\n return {\r\n\r\n restrict: 'A',\r\n scope: {\r\n fxpPopupNavigation: '@',\r\n actionOnEscKeydown: '&'\r\n },\r\n link: function(scope, elem, attr) {\r\n var fxpKeyCodes = {\r\n escKey: 27,\r\n tabKey: 9\r\n }\r\n var keyBoardEventHandler = function($event) {\r\n var targetMenu: any = $($event.target).closest(scope.fxpPopupNavigation),\r\n allMenuItems = targetMenu.find(\"button[type=button]\"),\r\n currentMenuItemIndex = allMenuItems.index($event.target);\r\n var eleType = $event.target.tagName;\r\n if ($event.keyCode === fxpKeyCodes.escKey) {\r\n scope.$apply(function() {\r\n scope.actionOnEscKeydown();\r\n });\r\n setTimeout(function() { CommonUtils.pullFocusToElement('secndryBtn'); }, 100);\r\n } else if ($event.keyCode === fxpKeyCodes.tabKey) {\r\n $event.preventDefault();\r\n $event.stopPropagation();\r\n if (currentMenuItemIndex < (allMenuItems.length - 1)) {\r\n allMenuItems[currentMenuItemIndex + 1].focus();\r\n } else {\r\n allMenuItems[0].focus();\r\n }\r\n if ($event.shiftKey) {\r\n if (currentMenuItemIndex > 0) {\r\n allMenuItems[currentMenuItemIndex - 1].focus();\r\n } else {\r\n allMenuItems[allMenuItems.length - 1].focus();\r\n }\r\n }\r\n } else if ($event.shiftKey && eleType != \"BUTTON\") {\r\n $event.preventDefault();\r\n $event.stopPropagation();\r\n }\r\n };\r\n elem.bind(\"keydown keypress\", keyBoardEventHandler);\r\n scope.$on('$destroy', function() {\r\n elem.unbind(\"keydown keypress\", keyBoardEventHandler);\r\n });\r\n }\r\n };\r\n }\r\n}","export class LeftNavPersonalizationScreenReaderDirective implements angular.IDirective {\r\n static leftNavPersonalizationScreenReader(): angular.IDirective {\r\n return {\r\n restrict: 'A',\r\n link: function(scope, elem, attr) {\r\n var allMenuElements = $(\".manage-personalization\").find(\".fxpTabbableElem\");\r\n var ariaLabel = $(allMenuElements[0]).attr('aria-label');\r\n $(allMenuElements[0]).attr('aria-label', 'Use arrow keys to move through or expand collapse' + ariaLabel);\r\n }\r\n };\r\n }\r\n}\r\n","import { FxpConstants } from \"../common/ApplicationConstants\";\r\ndeclare var document: any;\r\nexport class LeftNavPersonalizationScrollToActiveDirective implements angular.IDirective {\r\n static leftNavPersonalizationScrollToActive($timeout): angular.IDirective {\r\n var ensureElementInView = function(container, $event, fxpKeyCodesArray) {\r\n var activeMenuItem = $(document.activeElement).is(\"input\") ? $(document.activeElement).parent() : $(document.activeElement);\r\n var activeMenuItemTop = activeMenuItem.offset().top;\r\n var activeMenuItemBottom = activeMenuItemTop + activeMenuItem.height();\r\n var leftNavTopOffset = $(container).offset().top;\r\n var leftNavBottomOffset = $(container).height() + leftNavTopOffset;\r\n const top_delta = 16; // delta represents mouse wheel position in JS, to denote mouse wheel postion from top using this variable \r\n const isElementInViewport = !(isElementAboveViewport() || isElementBelowViewport());\r\n if (isElementInViewport) {\r\n if ($(document.activeElement).is(\"button\")) {\r\n var allMenuItems = $(container).find(\"button\"),\r\n currentMenuItemIndex = allMenuItems.index($(document.activeElement));\r\n if ((allMenuItems.length - 1) === currentMenuItemIndex) {\r\n let contentTop = getElementTop($event, fxpKeyCodesArray);\r\n $(\".personalizationAdminUI\").scrollTop(contentTop);\r\n }\r\n }\r\n return;\r\n } else {\r\n $(container).mCustomScrollbar(\"scrollTo\", activeMenuItem);\r\n let contentTop = getElementTop($event, fxpKeyCodesArray);\r\n setTimeout(function() { $(\".personalizationAdminUI\").scrollTop(contentTop) }, 200);\r\n }\r\n function isElementAboveViewport() {\r\n return leftNavTopOffset + top_delta > activeMenuItemTop;\r\n }\r\n\r\n function isElementBelowViewport() {\r\n return leftNavBottomOffset < activeMenuItemBottom;\r\n }\r\n\r\n function getElementTop($event, fxpKeyCodesArray) {\r\n var elemTop = document.activeElement[\"offsetTop\"];\r\n if ($(document.activeElement).is(\"button\")) {\r\n var allMenuItems = $(container).find(\"button\"),\r\n currentMenuItemIndex = allMenuItems.index($(document.activeElement));\r\n if (document.activeElement && document.activeElement.previousElementSibling) {\r\n if ((allMenuItems.length - 1) === currentMenuItemIndex) {\r\n elemTop = (fxpKeyCodesArray.indexOf($event.keyCode) > -1) ? $(document.activeElement.previousElementSibling.getElementsByTagName(\"input\")[0]).offset().top :\r\n (document.activeElement).offset().top;\r\n } else {\r\n elemTop = document.activeElement.previousElementSibling.getElementsByTagName(\"input\")[0].offsetTop;\r\n }\r\n }\r\n }\r\n return elemTop;\r\n }\r\n }\r\n \r\n return {\r\n restrict: 'A',\r\n link: function(scope, elem, attr) {\r\n var fxpKeyCodes = FxpConstants.keyCodes;\r\n var fxpKeyCodesArray = [fxpKeyCodes.arrowRightKey, fxpKeyCodes.enterKey, fxpKeyCodes.arrowLeftKey];\r\n var ensureElementInViewAfterFocus = function(containerElem, $event) {\r\n $timeout(function() {\r\n ensureElementInView(containerElem, $event, fxpKeyCodesArray);\r\n }, 100);\r\n };\r\n var viewFocusElement = function($event) {\r\n if (attr.leftNavPersonalizationScrollToActive) {\r\n ensureElementInViewAfterFocus(attr.leftNavPersonalizationScrollToActive, $event);\r\n }\r\n };\r\n var keyPressHandler = function($event) {\r\n if (fxpKeyCodesArray.indexOf($event.keyCode) > -1) {\r\n $timeout(function() { viewFocusElement($event); });\r\n }\r\n };\r\n elem.bind(\"focus\", viewFocusElement);\r\n elem.bind(\"keydown keypress\", keyPressHandler);\r\n scope.$on('$destroy', function() {\r\n elem.unbind(\"focus\", viewFocusElement);\r\n elem.unbind(\"keydown keypress\", keyPressHandler);\r\n }); \r\n }\r\n };\r\n }\r\n}\r\nLeftNavPersonalizationScrollToActiveDirective.leftNavPersonalizationScrollToActive.$inject = ['$timeout'];\r\n\r\n\r\n","export class MultilineEllipsisWithAccordionDirective implements angular.IDirective {\r\n static multilineEllipsisWithAccordion($timeout, $rootScope): angular.IDirective {\r\n return {\r\n restrict: 'A',\r\n scope: {\r\n multilineEllipsisWithAccordion: \"=\",\r\n accordionExpandCollapse: \"=\"\r\n },\r\n link: function(scope, elem, attr) {\r\n var accpdrionBtn,\r\n applyMultiLineEllipsis = function() {\r\n var divHeight = elem.outerHeight();\r\n var getLastWordRegex = /\\W*\\s(\\S)*$/;\r\n var lineHeight;\r\n var lines;\r\n\r\n try {\r\n lineHeight = parseInt($(elem).css('line-height'));\r\n lines = Math.round(divHeight / lineHeight);\r\n var actualText = elem.text();\r\n $(elem).attr('text-before-ellipse', actualText);\r\n } catch (e) {\r\n\r\n }\r\n if (lines > scope.multilineEllipsisWithAccordion) {\r\n var containerHeight = lineHeight * scope.multilineEllipsisWithAccordion + 1;\r\n while (elem.outerHeight() > containerHeight) {\r\n elem.text(function(index, text) {\r\n return text.replace(getLastWordRegex, '...');\r\n });\r\n\r\n }\r\n $(elem).addClass(\"elipsis-applied\");\r\n } else if (lines == scope.multilineEllipsisWithAccordion && !$(elem).hasClass(\"elipsis-applied\")) {\r\n $(elem).parents('td').find('[multiline-ellipsis-button]').css('visibility', 'hidden');\r\n }\r\n };\r\n\r\n function multilineElipsis() { $timeout(function() { applyMultiLineEllipsis() }); }\r\n function resetEllipsis(event) {\r\n var target = $(event.target).parents('td').find('[multiline-ellipsis-with-accordion]');\r\n var textBeforeEllipsis = target.attr('text-before-ellipse');\r\n var ellipsedText = elem.text();\r\n if (textBeforeEllipsis) {\r\n target.text(textBeforeEllipsis);\r\n target.attr('text-before-ellipse', ellipsedText);\r\n scope.$apply(function() {\r\n scope.accordionExpandCollapse = !scope.accordionExpandCollapse\r\n });\r\n }\r\n }\r\n $timeout(function() {\r\n accpdrionBtn = $(elem).parents('td').find('button[multiline-ellipsis-button]');\r\n if (accpdrionBtn) {\r\n accpdrionBtn.on(\"click\", resetEllipsis);\r\n }\r\n });\r\n multilineElipsis();\r\n scope.$on('$destroy', cleanUp);\r\n function cleanUp() {\r\n accpdrionBtn.off(\"click\", resetEllipsis);\r\n\r\n }\r\n }\r\n };\r\n }\r\n}\r\nMultilineEllipsisWithAccordionDirective.multilineEllipsisWithAccordion.$inject = ['$timeout', '$rootScope'];\r\n\r\n","import { FxpBroadcastedEvents } from \"../services/FxpBroadcastedEvents\";\r\n\r\nexport class MultilineEllipsisDirective implements angular.IDirective {\r\n static multilineEllipsis($timeout, $rootScope): angular.IDirective {\r\n return {\r\n restrict: 'A',\r\n scope: {\r\n multilineEllipsis: \"=\"\r\n },\r\n link: function(scope, elem, attr) {\r\n var applyMultiLineEllipsis = function($event?) {\r\n var divHeight = elem.outerHeight();\r\n var getLastWordRegex = /\\W*\\s(\\S)*$/;\r\n var lineHeight;\r\n var lines;\r\n\r\n try {\r\n lineHeight = parseInt($(elem).css('line-height'));\r\n lines = Math.round(divHeight / lineHeight);\r\n } catch (e) {\r\n\r\n }\r\n if (lines > scope.multilineEllipsis) {\r\n var containerHeight = lineHeight * scope.multilineEllipsis + 1;\r\n while (elem.outerHeight() > containerHeight) {\r\n elem.text(function(index, text) {\r\n return text.replace(getLastWordRegex, '...');\r\n });\r\n\r\n }\r\n\r\n };\r\n\r\n };\r\n var notificationIconHandler = function(event) {\r\n $(\".notificationflyout ul.dropdown-menu\").scrollTop(0);\r\n applyMultiLineEllipsis(event);\r\n }\r\n $timeout(function() { applyMultiLineEllipsis(); });\r\n var notificationIcon = $(\"#notification-open\");\r\n var notificationLoadMore = $(\"#loadMore\");\r\n var notificationDismissAll = $(\".dismiss-all a\");\r\n var notificationDelete = $(\".deleteNotification\");\r\n $timeout(function() {\r\n notificationIcon.on(\"click\", notificationIconHandler);\r\n notificationDismissAll.on(\"click\", applyMultiLineEllipsis);\r\n notificationLoadMore.on(\"click\", applyMultiLineEllipsis);\r\n notificationDelete.on(\"click\", applyMultiLineEllipsis);\r\n });\r\n $rootScope.$on(FxpBroadcastedEvents.OnLayoutChanged, applyMultiLineEllipsis);\r\n scope.$on('$destroy', cleanUp);\r\n function cleanUp() {\r\n notificationIcon.off(\"click\", notificationIconHandler);\r\n notificationDismissAll.off(\"click\", applyMultiLineEllipsis);\r\n notificationLoadMore.off(\"click\", applyMultiLineEllipsis);\r\n notificationDelete.off(\"click\", applyMultiLineEllipsis);\r\n }\r\n\r\n }\r\n };\r\n }\r\n}\r\nMultilineEllipsisDirective.multilineEllipsis.$inject = ['$timeout', '$rootScope'];","export class IntervalFlipDirective {\r\n 'use strict';\r\n static intervalFlip($timeout): angular.IDirective {\r\n return {\r\n restrict: 'A',\r\n link: function($scope, $elm, $attrs) {\r\n $elm.bind('touchstart', function(evt) {\r\n // Locally scoped variable that will keep track of the long press \r\n $scope.longPress = true;\r\n\r\n // We'll set a timeout for 600 ms for a long press \r\n $timeout(function() {\r\n if ($scope.longPress) {\r\n // If the touchend event hasn't fired, \r\n // apply the function given in on the element's on-long-press attribute \r\n $scope.$apply(function() {\r\n $scope.$eval($attrs.ngLongPress)\r\n });\r\n }\r\n }, 600);\r\n });\r\n\r\n $elm.bind('touchend', function(evt) {\r\n // Prevent the onLongPress event from firing \r\n $scope.longPress = false;\r\n // If there is an on-touch-end function attached to this element, apply it \r\n if ($attrs.onTouchEnd) {\r\n $scope.$apply(function() {\r\n $scope.$eval($attrs.onTouchEnd);\r\n });\r\n }\r\n });\r\n }\r\n }\r\n }\r\n}","export class FeedbackFlyoutDirective {\r\n static feedbackFlyout($parse) {\r\n return function(scope, element, attrs) {\r\n var fn = $parse(attrs.ngRightClick);\r\n element.bind('contextmenu', function(event) {\r\n scope.$apply(function() {\r\n event.preventDefault();\r\n fn(scope, { $event: event });\r\n });\r\n });\r\n };\r\n }\r\n}","export function ScrollToTopDirective() {\r\n\r\n return {\r\n link: link,\r\n restrict: 'EA',\r\n template: ''\r\n }\r\n function link(scope, $elm) {\r\n function scrollToTop() {\r\n angular.element('.partner-app > div, .fxp-body').animate({ scrollTop: '0px' }, \"slow\");\r\n }\r\n\r\n $elm.on('click', scrollToTop);\r\n scope.$on('$destroy', function() {\r\n $elm.off('click', scrollToTop);\r\n });\r\n }\r\n\r\n}\r\n\r\n","import { IRootScope } from \"../interfaces/IRootScope\";\r\nimport { UserProfileService } from \"../services/userProfileService\";\r\nimport { FxpMessageService } from \"../../app/banner/FxpMessageService\";\r\nimport { ILogger } from \"../interfaces/ILogger\";\r\nimport { FxpConstants, ApplicationConstants } from \"../common/ApplicationConstants\";\r\nimport { IFxpContext } from \"../interfaces/IFxpContext\";\r\nimport { TelemetryContext } from \"../telemetry/telemetrycontext\";\r\nimport { UserInfoService } from \"../services/UserInfoService\";\r\nimport { LogPropertyBag } from \"../telemetry/LogPropertyBag\";\r\nimport { UserClaimsService } from \"../services/UserClaimsService\";\r\n\r\nexport class ActOnBehalfOfHelper {\r\n\tprivate $http: angular.IHttpService;\r\n\tprivate $rootScope: IRootScope;\r\n\tprivate $q: angular.IQService;\r\n\tprivate userProfileService: UserProfileService;\r\n\tprivate fxpLoggerService: ILogger;\r\n\tprivate fxpMessage: FxpMessageService;\r\n\tprivate fxpConstants: FxpConstants;\r\n\tprivate fxpContext: IFxpContext;\r\n\tprivate fxpErrorConstants: any;\r\n\tprivate fxpTelemetryContext: TelemetryContext\r\n\tprivate userInfoService: UserInfoService;\r\n\r\n\tconstructor($rootScope: IRootScope, $http: angular.IHttpService, $q: angular.IQService, userProfileService: UserProfileService, fxpLoggerService: ILogger, fxpMessage: FxpMessageService, fxpContextService: IFxpContext,\r\n\t\tfxpTelemetryContext: TelemetryContext, userInfoService: UserInfoService, private userClaimsService: UserClaimsService) {\r\n\t\tthis.fxpErrorConstants = $rootScope.fxpUIConstants.UIMessages;\r\n\t\tthis.$rootScope = $rootScope;\r\n\t\tthis.$http = $http;\r\n\t\tthis.$q = $q;\r\n\t\tthis.userProfileService = userProfileService;\r\n\t\tthis.fxpLoggerService = fxpLoggerService;\r\n\t\tthis.fxpMessage = fxpMessage;\r\n\t\tthis.fxpConstants = FxpConstants;\r\n\t\tthis.fxpContext = fxpContextService;\r\n\t\tthis.fxpTelemetryContext = fxpTelemetryContext;\r\n\t\tthis.userInfoService = userInfoService;\r\n\t}\r\n\r\n\tgetUserProfileAndClaims(oboUserProfile: any): angular.IPromise {\r\n\t\tvar self = this;\r\n\t\tvar deferred = self.$q.defer();\r\n\t\ttry {\r\n\t\t\tif (oboUserProfile) {\r\n\t\t\t\tvar alias = oboUserProfile.Alias;\r\n\t\t\t\tvar aadobjectId = oboUserProfile.AadObjectId;\r\n\t\t\t\tself.userInfoService.setCurrentUserOID(aadobjectId);\r\n\t\t\t\tself.userProfileService.setCurrentUser(alias);\r\n\t\t\t\tself.userProfileService.getBasicProfile(aadobjectId, true).then(function (oboUserInfo) {\r\n\r\n\t\t\t\t\tself.userInfoService.setCurrentUserUpn(oboUserInfo.upn);\r\n\t\t\t\t\tself.userInfoService.setActingOnBehalfOfFlag(true);\r\n\t\t\t\t\tself.fxpLoggerService.setOBOUserContext(oboUserInfo.roleGroupId, oboUserInfo.roleGroupName, self.userProfileService.isObo(), oboUserInfo.TenantKey, oboUserInfo.TenantName);\r\n\t\t\t\t\tself.userClaimsService.getCalimsSvc(alias).then(function (claimasData) {\r\n\t\t\t\t\t\tdeferred.resolve(oboUserInfo);\r\n\t\t\t\t\t}).catch(function (error) {\r\n\t\t\t\t\t\tdeferred.reject(error);\r\n\t\t\t\t\t});\r\n\r\n\t\t\t\t}).catch(function (response) {\r\n\t\t\t\t\tself.fxpMessage.addMessage(self.fxpErrorConstants.SelectedUserProfileInformation.ErrorMessage, FxpConstants.messageType.error);\r\n\t\t\t\t\tdeferred.reject(response);\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t}\r\n\t\tcatch (e) {\r\n\t\t\tself.fxpMessage.addMessage(self.fxpErrorConstants.SelectedUserProfileInformation.ErrorMessage, FxpConstants.messageType.error);\r\n\t\t}\r\n\r\n\t\treturn deferred.promise;\r\n\t}\r\n\r\n\tgetObOUserConfiguration(appRole: string): angular.IHttpPromise {\r\n\t\tvar self = this;\r\n\t\tif (appRole) {\r\n\t\t\treturn self.$http({\r\n\t\t\t\tmethod: 'GET',\r\n\t\t\t\turl: ApplicationConstants.PersonaConfigByRoleGroupId + '/' + appRole\r\n\t\t\t});\r\n\t\t}\r\n\t\telse {\r\n\t\t\tconsole.log(\"App Role is not available for selected user\");\r\n\t\t}\r\n\t}\r\n\r\n\tgetPropBag(): LogPropertyBag {\r\n\t\tvar self = this;\r\n\t\tvar propbag = self.fxpLoggerService.createPropertyBag();\r\n\t\tpropbag.addToBag(FxpConstants.metricConstants.UserAgent, navigator.userAgent);\r\n\t\tpropbag.addToBag(FxpConstants.metricConstants.SessionId, window[\"sessionId\"]);\r\n\t\tpropbag.addToBag(FxpConstants.metricConstants.UserUPN, self.userInfoService.getCurrentUserUpn());\r\n\t\tpropbag.addToBag(FxpConstants.metricConstants.Geography, self.fxpTelemetryContext.getGeography());\r\n\t\treturn propbag;\r\n\t}\r\n\r\n\tgetMetricPropBag(startDate: Date, endDate: Date): LogPropertyBag {\r\n\t\tvar self = this;\r\n\t\tvar propbag = self.fxpLoggerService.createPropertyBag();\r\n\t\tpropbag.addToBag(FxpConstants.metricConstants.StartTime, startDate.toUTCString());\r\n\t\tpropbag.addToBag(FxpConstants.metricConstants.EndTime, endDate.toUTCString());\r\n\t\tpropbag.addToBag(FxpConstants.metricConstants.ServiceName, FxpConstants.metricConstants.searchProfileSvcName);\r\n\t\tpropbag.addToBag(FxpConstants.metricConstants.UserAgent, navigator.userAgent);\r\n\t\tpropbag.addToBag(FxpConstants.metricConstants.SessionId, self.$rootScope.sessionId);\r\n\t\tpropbag.addToBag(FxpConstants.metricConstants.UserUPN, self.userInfoService.getCurrentUserUpn());\r\n\t\tpropbag.addToBag(FxpConstants.metricConstants.Geography, self.fxpTelemetryContext.getGeography());\r\n\t\treturn propbag;\r\n\t}\r\n\r\n\tstatic ActOnBehalfOfHelperFactory($rootScope, $http, $q, userProfileService, fxpLoggerService, fxpMessage, fxpContextService, fxpTelemetryContext, userInfoService, userClaimsService) {\r\n\t\treturn new ActOnBehalfOfHelper($rootScope, $http, $q, userProfileService, fxpLoggerService, fxpMessage, fxpContextService, fxpTelemetryContext, userInfoService, userClaimsService);\r\n\t}\r\n}\r\n","import { IRootScope } from \"../interfaces/IRootScope\";\r\nimport { UserProfileService } from \"../services/userProfileService\";\r\nimport { FxpGlobalStoreService } from \"../services/fxp.global.store.service\";\r\nimport { TelemetryContext } from \"../telemetry/telemetrycontext\";\r\nimport { UserInfoService } from \"../services/UserInfoService\";\r\nimport { FxpConfigurationService } from \"../services/FxpConfiguration\";\r\nimport { CustomEvents, FxpConstants, PerfMarkers, ApplicationConstants } from \"../common/ApplicationConstants\";\r\nimport { GlobalExceptionHandler } from \"../telemetry/GlobalExceptionHandler\";\r\nimport { CommonUtils } from \"../utils/CommonUtils\";\r\nimport { PlannedDownTimeService } from \"../../app/systemMessages/PlannedDownTimeService\";\r\nimport { FxpMessageService } from \"../../app/banner/FxpMessageService\";\r\nimport { FxpContext } from \"../context/FxpContext\";\r\nimport { SettingsType } from \"../common/SettingsType\";\r\nimport { ISettingsService } from \"../interfaces/ISettingsService\";\r\nimport { FeatureFlagService } from \"@fxp/flightingsdk\";\r\nimport { UserClaimsService } from \"../services/UserClaimsService\";\r\nimport { FxpBroadcastedEvents } from \"../services/FxpBroadcastedEvents\";\r\nimport { showSystemDownOverlay } from \"../utils/systemDownOverlay\";\r\nimport { FxpModalConstant, FxpCancellableModalConstant } from \"../constants/FxPModal.constants\";\r\nimport { DashboardService } from \"../services/dashboardService\";\r\nimport { TelemetryConstants } from \"../telemetry/TelemetryConst\";\r\nimport { ComponentType } from \"@microsoftit/telemetry-extensions-npm\";\r\nimport { SystemEvent } from \"../telemetry/SystemEvent\";\r\nimport { ILogger } from \"../interfaces/ILogger\";\r\nimport { HideLoader } from \"../../app/loader/loader.actions\";\r\nimport { ErrorSeverityLevel } from \"../telemetry/ErrorSeverityLevel\";\r\nimport { ErrorCodes } from \"../constants/errorCodes\";\r\nimport { FxpBootstrap } from \"../boot/fxpboot\";\r\nimport { MsalAuthenticationService } from \"../services/MsalAuthenticationService\";\r\n\r\n/**\r\n * @application Fxp\r\n */\r\n/**\r\n * A main factory which acts as an helper for AppController. This is the factory having common functionalities.\r\n * @class Fxp.Factory.AppControllerHelper\r\n * @classdesc An helper factory for AppController in FxPApp module\r\n * @example \r\n * //How To use this factory\r\n * angular.module('FxPApp').controller('AppController', ['AppControllerHelper', AppControllerHelper]);\r\n * function AppController(AnyDependency){ AppControllerHelper.getBasicProfile(); }\r\n */\r\n\r\ndeclare var _: any;\r\n\r\nexport class AppControllerHelper {\r\n private static _instance: AppControllerHelper;\r\n private $rootScope: IRootScope;\r\n private $q: angular.IQService;\r\n private userProfileService: UserProfileService;\r\n private fxpTelemetryContext: TelemetryContext;\r\n private fxpLoggerService: ILogger;\r\n private userInfoService: UserInfoService;\r\n private fxpConstants: FxpConstants;\r\n private fxpConfiguration: FxpConfigurationService;\r\n private deviceFactory: any;\r\n private deviceDetector: any;\r\n private userClaimsService: UserClaimsService;\r\n private claimsCache: any;\r\n private profileCache: any;\r\n private pageTourWaitTime: number = 2000;\r\n private userThumbnailWaitTime: number = 3000;\r\n private dashboardService: DashboardService;\r\n private readonly sourceForTelemetry: string = `${TelemetryConstants.FXP_TELEMETRY_BASE_NAME}.AppControllerHelper`;\r\n\r\n constructor($q: angular.IQService, $rootScope: IRootScope,\r\n userProfileService: UserProfileService, private fxpGlobalStoreService: FxpGlobalStoreService, fxpTelemetryContext: TelemetryContext,\r\n fxpLoggerService: ILogger, userInfoService: UserInfoService, private featureFlagService: FeatureFlagService, private startUpFlightConfig: any, private settingsService: ISettingsService, private fxpContext: FxpContext, private fxpMessage: FxpMessageService, deviceFactory: any, deviceDetector: any,\r\n private plannedDownTimeService: PlannedDownTimeService, fxpConfiguration: FxpConfigurationService, userClaimsService: UserClaimsService,\r\n private $uibModal: any,\r\n private FxpModalConstant: FxpModalConstant,\r\n dashboardService: DashboardService,\r\n private msalAuthenticationService: MsalAuthenticationService\r\n ) {\r\n this.$q = $q;\r\n this.$rootScope = $rootScope;\r\n this.userProfileService = userProfileService;\r\n this.fxpTelemetryContext = fxpTelemetryContext;\r\n this.fxpLoggerService = fxpLoggerService;\r\n this.userInfoService = userInfoService;\r\n this.fxpConstants = FxpConstants;\r\n this.fxpConfiguration = fxpConfiguration;\r\n this.$rootScope.isFxpLoadedWithClaims = false;\r\n this.deviceFactory = deviceFactory;\r\n this.deviceDetector = deviceDetector;\r\n this.userClaimsService = userClaimsService;\r\n this.dashboardService = dashboardService;\r\n\r\n if (AppControllerHelper._instance) {\r\n return AppControllerHelper._instance;\r\n }\r\n AppControllerHelper._instance = this;\r\n this.handleServiceWorkerUpdateEvent();\r\n }\r\n\r\n private handleServiceWorkerUpdateEvent() {\r\n const self = this;\r\n this.$rootScope.$on(\"ServiceWorkerUpdated\", function () {\r\n self.showReloadModalWithCancel(\"Application Updated\", \"Please click refresh to update to a new version of this application.\", \"Refresh\");\r\n });\r\n }\r\n\r\n private getLoggedInUserOID(): string {\r\n var aadObjectId = this.msalAuthenticationService.getAccount();\r\n this.setLoggedInUserOID(aadObjectId.localAccountId);\r\n return aadObjectId.localAccountId;\r\n }\r\n\r\n private setLoggedInUserOID(aadObjectId: string): void {\r\n this.userInfoService.setLoggedInUserOID(aadObjectId);\r\n if (!this.userProfileService.isObo()) {\r\n this.userInfoService.setCurrentUserOID(aadObjectId);\r\n\r\n }\r\n }\r\n /**\r\n * A method to get the basic profile.\r\n * @method Fxp.Factory.AppControllerHelper.getBasicProfile($scope, true)\r\n * @param {angular.IScope} $scope $scope from angular app view.\r\n * @param {Boolean} isRefresh A boolean which if false gets the data from fxpContext(global cache).\r\n * @example Example to use getBasicProfile\r\n * AppControllerHelper.getBasicProfile($scopem true);\r\n */\r\n getBasicProfile($scope: any): void {\r\n var upn = this.msalAuthenticationService.getAccount().username;\r\n var aadOID = this.getLoggedInUserOID();\r\n var self = this;\r\n var isAppLaunched = false;\r\n\r\n var fxpAppLaunched = window.sessionStorage.getItem(ApplicationConstants.FxpApplaunchedKey)\r\n\r\n isAppLaunched = (!CommonUtils.isNullOrEmpty(fxpAppLaunched) && fxpAppLaunched === \"true\");\r\n\r\n\r\n self.userInfoService.setLoggedInUserUpn(upn);\r\n\r\n self.fxpTelemetryContext.addToGlobalPropertyBag('LoggedInUser', upn);\r\n var profileCacheDefer = self.$q.defer();\r\n self.userProfileService.getBasicProfile(aadOID, isAppLaunched).then(\r\n (profile) => {\r\n self.handleProfileServiceResponse(profile, (cachedData, apiResponse) => {\r\n let result = cachedData && (cachedData.RoleGroupID != apiResponse.RoleGroupID || cachedData.TenantKey != apiResponse.TenantKey);\r\n if (result) {\r\n localStorage[\"loggedInUserInfo-Old\"] = JSON.stringify(cachedData);\r\n }\r\n\r\n self.$rootScope.isUserInfoAvailable = true;\r\n return result;\r\n });\r\n profileCacheDefer.resolve(profile);\r\n },\r\n err => {\r\n self.$rootScope.roleGroupId = -1;\r\n self.fxpGlobalStoreService.DispatchGlobalAction(\"Platform\", HideLoader({}));\r\n self.checkOneProfileAndCalimStatus(err);\r\n self.$rootScope.isFxpLoadedWithClaims = false;\r\n\r\n let currentTime = new Date().toLocaleString();\r\n console.log(`AppControllerHelper:BasicProfile Error Time- ${currentTime}`);\r\n let propbag = this.fxpLoggerService.createPropertyBag();\r\n propbag.addToBag('Time', `${currentTime}`);\r\n this.fxpLoggerService.logException(this.sourceForTelemetry, err, propbag, null, null, ErrorSeverityLevel.High, ErrorCodes.ProfileServiceFailure);\r\n\r\n },\r\n cachedProfile => {\r\n self.handleProfileServiceResponse(cachedProfile);\r\n profileCacheDefer.resolve(cachedProfile);\r\n self.$rootScope.isUserInfoAvailable = true;\r\n\r\n }\r\n );\r\n\r\n self.userClaimsService.getCalimsSvc(aadOID).then(\r\n function (claims) {\r\n self.handleClaimServiceResponse(claims, (cachedData, apiResponse) => {\r\n if (!cachedData)\r\n return false;\r\n\r\n let cachedRoles = self.getRoles(cachedData);\r\n let apiRoles = self.getRoles(apiResponse);\r\n\r\n let cachedResources = self.getResources(cachedData);\r\n let apiResources = self.getResources(apiResponse);\r\n\r\n let hasRolesChanged = JSON.stringify(CommonUtils.sortJsonObj(apiRoles)) !== JSON.stringify(CommonUtils.sortJsonObj(cachedRoles));\r\n let hasResourcesChanged = JSON.stringify(CommonUtils.sortJsonObj(apiResources)) !== JSON.stringify(CommonUtils.sortJsonObj(cachedResources));\r\n\r\n let hasClaimsChanged = hasRolesChanged || hasResourcesChanged;\r\n if (hasClaimsChanged) {\r\n localStorage[\"loggedInUserClaims-Old\"] = JSON.stringify(cachedData);\r\n \r\n // The below telemetry will be removed once the patch is stabilized\r\n let changeSummary = self.fxpLoggerService.createPropertyBag();\r\n changeSummary.addToBag(\"HasRolesChanged\", hasRolesChanged + \"\");\r\n changeSummary.addToBag(\"HasResourcesChanged\", hasResourcesChanged + \"\");\r\n changeSummary.addToBag(\"CachedRoles\", JSON.stringify(CommonUtils.sortJsonObj(cachedRoles)));\r\n changeSummary.addToBag(\"UpdatedServerRoles\", JSON.stringify(CommonUtils.sortJsonObj(apiRoles)));\r\n changeSummary.addToBag(\"CachedResources\", JSON.stringify(CommonUtils.sortJsonObj(cachedResources)));\r\n changeSummary.addToBag(\"UpdatedServerResources\", JSON.stringify(CommonUtils.sortJsonObj(apiResources)));\r\n self.fxpLoggerService.logEvent(self.sourceForTelemetry, \"UserClaims.Updated\", changeSummary);\r\n }\r\n\r\n return hasClaimsChanged;\r\n });\r\n },\r\n err => {\r\n let bag = self.fxpLoggerService.createPropertyBag();\r\n bag.addToBag('Error', CommonUtils.objectToString(err));\r\n self.$rootScope.roleGroupId = -1;\r\n self.fxpGlobalStoreService.DispatchGlobalAction(\"Platform\", HideLoader({}));\r\n self.checkOneProfileAndCalimStatus(err);\r\n self.$rootScope.isFxpLoadedWithClaims = false;\r\n this.fxpLoggerService.logException(this.sourceForTelemetry, err, bag, null, null, ErrorSeverityLevel.High, ErrorCodes.AuthService_GetClaimsFailure);\r\n },\r\n cachedClaims => {\r\n self.handleClaimServiceResponse(cachedClaims);\r\n }\r\n );\r\n\r\n let getUserThumbnailTimeoutHandle = setTimeout(() => {\r\n self.fxpLoggerService.startTrackPerformance(PerfMarkers.GetUserThumbnail);\r\n this.userProfileService.getUserThumbnail(upn, false).then(\r\n function (data) {\r\n var blob = new Blob([data.data], { type: \"JPEG\" });\r\n var url = (window.URL || window[\"webkitURL\"]).createObjectURL(blob);\r\n $scope.userThumbnailPhoto = url;\r\n self.fxpLoggerService.stopTrackPerformance(PerfMarkers.GetUserThumbnail);\r\n }, function (data) {\r\n $scope.userThumbnailPhoto = \"/assets/pictures/User.png\";\r\n self.fxpLoggerService.stopTrackPerformance(PerfMarkers.GetUserThumbnail);\r\n }\r\n );\r\n clearTimeout(getUserThumbnailTimeoutHandle);\r\n }, self.userThumbnailWaitTime);\r\n\r\n let getReportsToThumbnailTimeoutHandle = setTimeout(() => {\r\n self.fxpLoggerService.startTrackPerformance(PerfMarkers.GetUserThumbnail);\r\n var currentProfile = self.$rootScope.userProfile; \r\n if(currentProfile) {\r\n var reportsToAlias: string = currentProfile.reportsTo;\r\n var reportsToUpn:string = reportsToAlias + '@microsoft.com';\r\n this.userProfileService.getUserThumbnail(reportsToUpn, false).then(\r\n function(data) {\r\n var blob = new Blob([data.data], {type: 'JPEG'});\r\n var url = (window.URL || window[\"webkitURL\"]).createObjectURL(blob);\r\n $scope.reportsToThumbnailPhoto = url;\r\n self.fxpLoggerService.stopTrackPerformance(PerfMarkers.GetUserThumbnail);\r\n },\r\n function(data){\r\n $scope.reportsToThumbnailPhoto = \"/assets/pictures/User.png\"\r\n self.fxpLoggerService.stopTrackPerformance(PerfMarkers.GetUserThumbnail);\r\n }\r\n );\r\n }\r\n else{\r\n $scope.reportsToThumbnailPhoto = \"/assets/pictures/User.png\";\r\n self.fxpLoggerService.stopTrackPerformance(PerfMarkers.GetUserThumbnail);\r\n }\r\n\r\n clearTimeout(getReportsToThumbnailTimeoutHandle);\r\n }, self.userThumbnailWaitTime\r\n );\r\n }\r\n\r\n private onClaimsSuccess() {\r\n var self = this;\r\n var fxpLoggerService = this.fxpLoggerService;\r\n self.$rootScope.isFxpLoadedWithClaims = true;\r\n self.$rootScope.roleGroupId = self.$rootScope.roleGroupIdInternal || -1;\r\n self.setDefaultAppRole();\r\n fxpLoggerService.stopTrackPerformance(PerfMarkers.PreDashboardLoad);\r\n fxpLoggerService.startTrackPerformance(PerfMarkers.DashboardLoad);\r\n self.$rootScope.$broadcast(FxpBroadcastedEvents.OnFxpLoadCompleted);\r\n window.sessionStorage.setItem(ApplicationConstants.FxpApplaunchedKey, \"true\");\r\n\r\n fxpLoggerService.logSystemEvent(self.sourceForTelemetry,\r\n new SystemEvent(`${TelemetryConstants.FXP_TELEMETRY_BASE_NAME}.ClaimsSuccess`,\r\n ComponentType.Web,\r\n \"Claims call successful.\")\r\n );\r\n }\r\n\r\n private getRoles(claims) {\r\n let roles = [];\r\n if (claims === undefined || claims === null || claims.tenantClaims === undefined || claims.tenantClaims === null) {\r\n return roles;\r\n }\r\n\r\n for (let npd in claims.tenantClaims) {\r\n if (claims.tenantClaims[npd].claims !== undefined\r\n && claims.tenantClaims[npd].claims !== null) {\r\n _.each(claims.tenantClaims[npd].claims.roles, function (role) {\r\n roles.push(role);\r\n });\r\n }\r\n\r\n if (claims.tenantClaims[npd].delegatedClaims !== undefined\r\n && claims.tenantClaims[npd].delegatedClaims !== null) {\r\n _.each(claims.tenantClaims[npd].delegatedClaims.roles, function (role) {\r\n roles.push(role);\r\n });\r\n }\r\n }\r\n return roles;\r\n }\r\n\r\n private getResources(claims) {\r\n let resources = [];\r\n if (claims === undefined || claims === null || claims.tenantClaims === undefined || claims.tenantClaims === null) {\r\n return resources;\r\n }\r\n\r\n for (let npd in claims.tenantClaims) {\r\n if (claims.tenantClaims[npd].claims !== undefined\r\n && claims.tenantClaims[npd].claims !== null) {\r\n _.each(claims.tenantClaims[npd].claims.resourcePermissions, function (resourcePermissions) {\r\n resources.push(resourcePermissions);\r\n });\r\n }\r\n\r\n if (claims.tenantClaims[npd].delegatedClaims !== undefined\r\n && claims.tenantClaims[npd].delegatedClaims !== null) {\r\n _.each(claims.tenantClaims[npd].delegatedClaims.roles, function (resourcePermissions) {\r\n resources.push(resourcePermissions);\r\n });\r\n }\r\n }\r\n return resources;\r\n }\r\n\r\n private handleProfileServiceResponse(data: any, hasProfileCacheChanged: any = () => false) {\r\n const self = this;\r\n self.$rootScope.userProfile = data;\r\n if (data) {\r\n if (hasProfileCacheChanged.bind(self)(self.profileCache, data)) {\r\n this.showReloadModal(\"Profile Updated\", \"It looks like your profile was updated since you logged in last time, Reload to get the latest changes\");\r\n } else {\r\n self.profileCache = data;\r\n try {\r\n let Id = data.roleGroupId == undefined || data.roleGroupId == null || data.roleGroupId == 0 ? -1 : data.roleGroupId;\r\n self.$rootScope.roleGroupIdInternal = parseInt(Id);\r\n self.fxpLoggerService.setLoggedInUserContext(data.roleGroupId, data.roleGroupName, self.userProfileService.isObo(), data.TenantKey, data.TenantName);\r\n } catch (e) {\r\n self.$rootScope.roleGroupIdInternal = -1;\r\n self.fxpLoggerService.logException(`${self.sourceForTelemetry}.HandleProfileServiceResponse`, e, null, null, null, ErrorSeverityLevel.Medium, ErrorCodes.HandleProfileServiceResponse);\r\n }\r\n //Setting Tenant Name to the rootScope\r\n self.$rootScope.tenantId = data.TenantName ? data.TenantName : \"-1\";\r\n }\r\n } else {\r\n self.$rootScope.roleGroupId = -1;\r\n }\r\n }\r\n\r\n private handleClaimServiceResponse(data: any, hasCacheChanged: any = () => false) {\r\n const self = this;\r\n if (data) {\r\n if (hasCacheChanged.bind(self)(self.claimsCache, data)) {\r\n this.showReloadModal(\"Application Permission Updated\", \"It looks like your permissions were updated since you logged in last time, Reload to get the latest changes\");\r\n } else {\r\n self.claimsCache = data;\r\n let appRole = data.defaultAppRole || \"\";\r\n if (appRole == \"\") {\r\n this.showNoAppRoleErrorMessage.bind(self)();\r\n }\r\n self.fxpTelemetryContext.setUserRole(appRole);\r\n self.$rootScope.defaultAppRoleInternal = appRole;\r\n self.onClaimsSuccess();\r\n }\r\n } else {\r\n self.$rootScope.defaultAppRole = \"\";\r\n }\r\n\r\n }\r\n\r\n private showReloadModal(title: string, description: string, buttonText: string = \"Reload\") {\r\n const modalProps: any = FxpModalConstant.options;\r\n const self = this;\r\n modalProps.controller = function () {\r\n this.Title = title;\r\n this.Content = description;\r\n this.ButtonText = buttonText;\r\n this.onClick = _ => {\r\n self.fxpLoggerService.logEvent(`${self.sourceForTelemetry}.ShowReloadModal`, `User clicked on reload ${title}`);\r\n document.location.reload();\r\n };\r\n };\r\n\r\n this.$uibModal.open(modalProps);\r\n }\r\n\r\n private showReloadModalWithCancel(title: string, description: string, okButtonText: string = \"Reload\") {\r\n const modalProps: any = FxpCancellableModalConstant.options;\r\n const self = this;\r\n const telemetry_source = `${self.sourceForTelemetry}.ShowReloadModalWithCancel`;\r\n modalProps.controller = function ($scope, $uibModalInstance) {\r\n this.Title = title;\r\n this.Content = description;\r\n this.ButtonText = okButtonText;\r\n this.onClick = _ => {\r\n self.fxpLoggerService.logEvent(telemetry_source, `User clicked on reload ${title}`);\r\n document.location.reload();\r\n };\r\n this.onCancel = _ => {\r\n self.fxpLoggerService.logEvent(telemetry_source, `User clicked on cancel ${title}`);\r\n $uibModalInstance.dismiss('cancel');\r\n };\r\n };\r\n\r\n this.$uibModal.open(modalProps);\r\n }\r\n public showModalPopupWindow(title: string, description: string, buttonText: string, callback: any) {\r\n const modalProps: any = FxpModalConstant.options;\r\n modalProps.controller = function () {\r\n this.Title = title;\r\n this.Content = description;\r\n this.ButtonText = buttonText;\r\n this.onClick = _ => {\r\n callback();\r\n };\r\n };\r\n\r\n this.$uibModal.open(modalProps);\r\n }\r\n\r\n private showNoAppRoleErrorMessage() {\r\n let self = this;\r\n var headerText = CommonUtils.getTenantURLSpecificPageTitle(self.fxpConfiguration.FxpBaseConfiguration.FxpConfigurationStrings.UIMessages.InvalidRoleGroupID.ErrorMessageTitle);\r\n var descriptionText = self.fxpConfiguration.FxpBaseConfiguration.FxpConfigurationStrings.UIMessages.InvalidRoleGroupID.ErrorMessage;\r\n var hyperlinkText = CommonUtils.getTenantURLSpecificPageTitle(self.fxpConfiguration.FxpBaseConfiguration.FxpConfigurationStrings.UIMessages.InvalidRoleGroupID.HyperlinkText);\r\n var hyperlinkUrl = self.fxpConfiguration.FxpBaseConfiguration.FxpConfigurationStrings.UIMessages.InvalidRoleGroupID.HyperlinkUrl;\r\n var pageTitle = CommonUtils.getTenantURLSpecificPageTitle(self.fxpConfiguration.FxpBaseConfiguration.FxpConfigurationStrings.UIMessages.InvalidRoleGroupID.PagetTitle);\r\n showSystemDownOverlay(headerText, descriptionText, pageTitle, hyperlinkText, hyperlinkUrl, true);\r\n }\r\n\r\n /**\r\n * A method to use show the SystemDown/Profile error, if OneProfileAndCalims API falied.\r\n * @method Fxp.Controllers.AppController.checkOneProfileAndCalimStatus\r\n * @param {object} error A error Object need to send\r\n * @example Example to use checkOneProfileAndCalimStatus\r\n * AppControllerHelper.checkOneProfileAndCalimStatus(error)\r\n */\r\n checkOneProfileAndCalimStatus(err: any) {\r\n var self = this, headerText, descriptionText, pageTitle,\r\n profileStore = window[\"tenantConfiguration\"].ProfileStore || {},\r\n authStore = window[\"tenantConfiguration\"].AuthStore || {};\r\n var propBag = self.fxpLoggerService.createPropertyBag();\r\n propBag.addToBag(\"UserName\", self.userInfoService.getCurrentUserUpn());\r\n\r\n if (err && err.config) {\r\n propBag.addToBag(FxpConstants.metricConstants.Status, err.status);\r\n propBag.addToBag(FxpConstants.metricConstants.StatusText, err.statusText);\r\n propBag.addToBag(FxpConstants.metricConstants.ErrorUrl, err.config.url);\r\n }\r\n\r\n // if oneprofile basic API failed\r\n if (err && err.config && err.config.url.indexOf(profileStore.ProfileAPIEndPoint) > -1) {\r\n self.getBasicProfileFailed(propBag);\r\n // ErrorCode === 114 represents Not a valid user/ profile does'nt exist, which is return by basic profile API.\r\n if (err && err.data && err.data.ErrorCode === 114) {\r\n if (self.fxpConfiguration.FxpBaseConfiguration.FxpConfigurationStrings.UIMessages.BasicProfileMissing) {\r\n headerText = self.fxpConfiguration.FxpBaseConfiguration.FxpConfigurationStrings.UIMessages.BasicProfileMissing.ErrorMessageTitle;\r\n descriptionText = self.fxpConfiguration.FxpBaseConfiguration.FxpConfigurationStrings.UIMessages.BasicProfileMissing.ErrorMessage;\r\n pageTitle = CommonUtils.getTenantURLSpecificPageTitle(self.fxpConfiguration.FxpBaseConfiguration.FxpConfigurationStrings.UIMessages.BasicProfileMissing.PageTitle);\r\n } else {\r\n console.log(\"Failed to load BasicProfileMissing error string from UIMessages\");\r\n }\r\n propBag.addToBag(FxpConstants.metricConstants.GlobalErrorDetail, \"Basic Profile call Failure\");\r\n GlobalExceptionHandler.logFxpBootFailure(self.fxpLoggerService.getDefaultPropertyBagValues(propBag), `${self.sourceForTelemetry}.CheckOneProfileAndCalimStatus`, headerText, descriptionText, pageTitle);\r\n }\r\n }\r\n // if oneprofile claims API failed due to ITAuth Down or blank roles (for 500 and 404 httpresponses)\r\n if (err && err.config &&\r\n (err.config.url.indexOf(authStore.UserClaimsEndPoint) > -1 || err.config.url.indexOf(authStore.TenantClaimsEndPoint) > -1)) {\r\n self.getClaimsFailed(propBag, err.status);\r\n }\r\n }\r\n\r\n /**\r\n * A method to use log the Basic profile error\r\n * @method Fxp.Controllers.AppController.getBasicProfileFailed\r\n * @param {object} propBag A propBag Ojects need to send\r\n * @example Example to use getBasicProfileFailed\r\n * AppControllerHelper.getBasicProfileFailed(propBag)\r\n */\r\n getBasicProfileFailed(propBag: any) {\r\n var self = this, headerText, descriptionText, pageTitle;\r\n if (self.fxpConfiguration.FxpBaseConfiguration.FxpConfigurationStrings.UIMessages.BasicProfileAPIFailed) {\r\n headerText = self.fxpConfiguration.FxpBaseConfiguration.FxpConfigurationStrings.UIMessages.BasicProfileAPIFailed.ErrorMessageTitle;\r\n descriptionText = self.fxpConfiguration.FxpBaseConfiguration.FxpConfigurationStrings.UIMessages.BasicProfileAPIFailed.ErrorMessage;\r\n pageTitle = CommonUtils.getTenantURLSpecificPageTitle(self.fxpConfiguration.FxpBaseConfiguration.FxpConfigurationStrings.UIMessages.BasicProfileAPIFailed.PageTitle);\r\n } else {\r\n console.log(\"Failed to load BasicProfileAPIFailed error string from UIMessages\");\r\n }\r\n propBag.addToBag(FxpConstants.metricConstants.GlobalErrorDetail, \"User basic profile call Failure\");\r\n if (!self.$rootScope.isBlockedCSAUser) {\r\n GlobalExceptionHandler.logFxpBootFailure(self.fxpLoggerService.getDefaultPropertyBagValues(propBag), `${self.sourceForTelemetry}.getBasicProfileFailed`, headerText, descriptionText, pageTitle);\r\n return;\r\n }\r\n let errorMessageTitleForCSAUser, errorMessageForCSAUser, pageTitleCSABlockedUser = '';\r\n if (self.fxpConfiguration.FxpBaseConfiguration.FxpConfigurationStrings.UIMessages.CSABlockedUser &&\r\n self.fxpConfiguration.FxpBaseConfiguration.FxpConfigurationStrings.UIMessages.CSABlockedUser.ErrorMessageTitle) {\r\n errorMessageTitleForCSAUser = self.fxpConfiguration.FxpBaseConfiguration.FxpConfigurationStrings.UIMessages.CSABlockedUser.ErrorMessageTitle;\r\n }\r\n else {\r\n errorMessageTitleForCSAUser = 'Access Denied';\r\n }\r\n if (self.fxpConfiguration.FxpBaseConfiguration.FxpConfigurationStrings.UIMessages.CSABlockedUser &&\r\n self.fxpConfiguration.FxpBaseConfiguration.FxpConfigurationStrings.UIMessages.CSABlockedUser.ErrorMessage) {\r\n errorMessageForCSAUser = self.fxpConfiguration.FxpBaseConfiguration.FxpConfigurationStrings.UIMessages.CSABlockedUser.ErrorMessage;\r\n }\r\n else {\r\n errorMessageForCSAUser = 'You are not authorized to access ESXP by worker council.';\r\n }\r\n if (self.fxpConfiguration.FxpBaseConfiguration.FxpConfigurationStrings.UIMessages.CSABlockedUser &&\r\n self.fxpConfiguration.FxpBaseConfiguration.FxpConfigurationStrings.UIMessages.CSABlockedUser.PageTitle) {\r\n pageTitleCSABlockedUser = self.fxpConfiguration.FxpBaseConfiguration.FxpConfigurationStrings.UIMessages.CSABlockedUser.PageTitle;\r\n }\r\n else {\r\n pageTitleCSABlockedUser = 'ESXP Profile Error';\r\n }\r\n\r\n GlobalExceptionHandler.logFxpBootFailure(self.fxpLoggerService.getDefaultPropertyBagValues(propBag), `${self.sourceForTelemetry}.getBasicProfileFailed`, errorMessageTitleForCSAUser, errorMessageForCSAUser, pageTitleCSABlockedUser, true);\r\n\r\n }\r\n\r\n /**\r\n * A method to use log the User Claims call failure error\r\n * @method Fxp.Controllers.AppController.getClaimsFailed\r\n * @param {object} propBag A propBag Ojects need to send\r\n * @example Example to use getClaimsFailed\r\n * AppControllerHelper.getClaimsFailed(propBag)\r\n */\r\n getClaimsFailed(propBag: any, statusCode?: number) {\r\n propBag.addToBag(FxpConstants.metricConstants.GlobalErrorDetail, \"User Claims call Failure\");\r\n var self = this, headerText, descriptionText, pageTitle;\r\n //V1 claims --gives 400 and v2 gives 404 when no claims found\r\n if (statusCode && (statusCode === 404 || statusCode === 400)) {\r\n headerText = self.fxpConfiguration.FxpBaseConfiguration.FxpConfigurationStrings.UIMessages.NoClaims.ErrorMessageTitle;\r\n descriptionText = self.fxpConfiguration.FxpBaseConfiguration.FxpConfigurationStrings.UIMessages.NoClaims.ErrorMessage;\r\n pageTitle = self.fxpConfiguration.FxpBaseConfiguration.FxpConfigurationStrings.UIMessages.NoClaims.PageTitle;\r\n }\r\n else {\r\n if (self.fxpConfiguration.FxpBaseConfiguration.FxpConfigurationStrings.UIMessages.ClaimsAPIFailed) {\r\n headerText = self.fxpConfiguration.FxpBaseConfiguration.FxpConfigurationStrings.UIMessages.ClaimsAPIFailed.ErrorMessageTitle;\r\n descriptionText = self.fxpConfiguration.FxpBaseConfiguration.FxpConfigurationStrings.UIMessages.ClaimsAPIFailed.ErrorMessage;\r\n pageTitle = CommonUtils.getTenantURLSpecificPageTitle(self.fxpConfiguration.FxpBaseConfiguration.FxpConfigurationStrings.UIMessages.ClaimsAPIFailed.PageTitle);\r\n } else {\r\n console.log(\"Failed to load ClaimsAPIFailed error string from UIMessages\");\r\n }\r\n }\r\n GlobalExceptionHandler.logFxpBootFailure(self.fxpLoggerService.getDefaultPropertyBagValues(propBag), `${self.sourceForTelemetry}.getClaimsFailed`, headerText, descriptionText, pageTitle);\r\n }\r\n\r\n /**\r\n * A method to load data after login success\r\n * @method Fxp.Controllers.AppController.postLoginSuccess\r\n * @example Example to use postLoginSuccess\r\n * AppControllerHelper.postLoginSuccess()\r\n */\r\n postLoginSuccess(): void {\r\n let self = this;\r\n let eventSubscription = null;\r\n self.getUserPreferenceSettings();\r\n //make flighting service call after the get basic profile call is succeeeded\r\n eventSubscription = self.$rootScope.$on('OnFxpLoadedEvent', function () {\r\n self.dashboardService.getInitialFeatureFlagsForPlatform();\r\n eventSubscription();\r\n });\r\n }\r\n /**\r\n * A method to get the User Preferences Settings\r\n * @method Fxp.Controllers.AppController.getUserPreferenceSettings\r\n * @example Example to use getUserPreferenceSettings\r\n * AppControllerHelper.getUserPreferenceSettings()\r\n */\r\n getUserPreferenceSettings(): void {\r\n var self = this;\r\n if (self.deviceFactory.isMobile()) {\r\n /*In mobile view leftnav pinned by default status setting false.*/\r\n self.$rootScope.isLeftNavOpen = self.$rootScope.isLeftNavPinned = false;\r\n } else {\r\n self.getSettingsSvc();\r\n }\r\n }\r\n\r\n /**\r\n * A method to get the User Preferences Settings using settings provider service\r\n * @method Fxp.Controllers.AppControllerHelper.getSettingsSvc\r\n * @example Example to use getSettingsSvc\r\n * AppControllerHelper.getSettingsSvc()\r\n */\r\n\r\n private getSettingsSvc(): void {\r\n let self = this;\r\n const source_telemetry = `${this.sourceForTelemetry}.GetSettingsSvc`;\r\n var userUPN = self.userInfoService.getCurrentUserUpn();\r\n var userAliasFromUPN = userUPN.substring(0, userUPN.indexOf('@'));\r\n var userOID = this.getLoggedInUserOID();\r\n let userPreferencesStorageKey = ApplicationConstants.UserPreferencesStorageKey.replace('{0}', userAliasFromUPN);\r\n let getSettingsAPIStartTime = performance.now();\r\n self.settingsService.getSettings(SettingsType.User, userAliasFromUPN, ApplicationConstants.UserPreferencesSettings).then(function (response: any) {\r\n let getSettingsAPIResponseDuration = performance.now() - getSettingsAPIStartTime;\r\n let propbag = self.fxpLoggerService.createPropertyBag();\r\n propbag.addToBag(FxpConstants.metricConstants.GetSettingsAPIResponseDuration, `${getSettingsAPIResponseDuration}`);\r\n propbag.addToBag(FxpConstants.metricConstants.Geography, self.fxpTelemetryContext.getGeography());\r\n propbag.addToBag(FxpConstants.metricConstants.BrowserType, self.deviceDetector.browser);\r\n let currentProcessName = TelemetryConstants.FXP_TELEMETRY_PLATFORM_BOOTSTRAP + '.UserSettings.FetchUserSettings';\r\n let eventData = new SystemEvent(currentProcessName, ComponentType.DataStore, 'Get settings API call.');\r\n propbag.addToBag(TelemetryConstants.CLASSNAME, \"AppControllerHelper\");\r\n propbag.addToBag(TelemetryConstants.METHODNAME, \"getSettingsSvc\");\r\n self.fxpLoggerService.logSystemEvent(source_telemetry, eventData, propbag);\r\n\r\n if (response && (response.data.length > 0)) {\r\n var userSettings = JSON.parse(response.data[0].settingValue);\r\n self.$rootScope.isLeftNavOpen = self.$rootScope.isLeftNavPinned = userSettings.isLeftNavPinned;\r\n self.$rootScope.isNotificationDNDEnabled = userSettings.isNotificationDNDEnabled;\r\n self.fxpContext.saveContext(userPreferencesStorageKey, response.data[0].settingValue, ApplicationConstants.FxPDbName);\r\n } else {\r\n self.setDefaultUserPreferences('as no response');\r\n }\r\n self.triggerGetBasicProfileByOID(userOID);\r\n }, function (error) {\r\n self.setDefaultUserPreferences('as error occurred.');\r\n self.triggerGetBasicProfileByOID(userOID);\r\n let propbag = self.fxpLoggerService.createPropertyBag();\r\n propbag.addToBag(FxpConstants.metricConstants.RequestedUserAlias, userOID);\r\n propbag.addToBag(FxpConstants.metricConstants.Status, error.status);\r\n propbag.addToBag(FxpConstants.metricConstants.StatusText, error.statusText + ' ' + error.data);\r\n self.fxpLoggerService.logError(source_telemetry,\r\n self.$rootScope.fxpUIConstants.UIMessages.GetSettingsServiceCallFailedError.ErrorMessageTitle,\r\n \"3501\",\r\n CommonUtils.objectToString(error),\r\n propbag);\r\n self.fxpLoggerService.logException(source_telemetry, error, propbag, null, null, ErrorSeverityLevel.Medium, ErrorCodes.OnSettingsServiceError)\r\n });\r\n }\r\n\r\n private triggerGetBasicProfileByOID(userOID: string): void {\r\n this.userProfileService.getBasicProfileByOID(userOID, null).then((loggedInUserInfo: any) => {\r\n });\r\n }\r\n\r\n private setDefaultUserPreferences(reason: string): void {\r\n var self = this;\r\n self.$rootScope.isLeftNavOpen = self.$rootScope.isLeftNavPinned = true;\r\n self.$rootScope.isNotificationDNDEnabled = false;\r\n self.fxpLoggerService.logEvent(`${this.sourceForTelemetry}.SetDefaultUserPreferences`, `DefaultUserPreference:Set ${reason}`);\r\n }\r\n\r\n handleAdalErrorsAuthenticating(): void {\r\n var self = AppControllerHelper._instance;\r\n self.handleAdalErrors(\"Authenticating\");\r\n }\r\n handleAdalErrorsLoadingProfile(): void {\r\n var self = AppControllerHelper._instance;\r\n self.handleAdalErrors(\"LoadingProfile\");\r\n }\r\n handleAdalErrorsLoadingDashboard(): void {\r\n var self = AppControllerHelper._instance;\r\n self.handleAdalErrors(\"LoadingDashboard\");\r\n }\r\n private handleAdalErrors(pageLoaderEvent: string): void {\r\n var self = AppControllerHelper._instance;\r\n const telemtry_source = `${self.sourceForTelemetry}.HandleAdalErrors`;\r\n var propBag = self.fxpLoggerService.createPropertyBag();\r\n var adalErrorMessage = \"Page response time exceeded the set limit, please click Reset Application to resolve the issue. If the problem persists contact IT Support.\";\r\n propBag.addToBag(\"PageLoaderEvent\", pageLoaderEvent);\r\n propBag.addToBag(ApplicationConstants.RequestStateName, sessionStorage[ApplicationConstants.RequestStateName]);\r\n propBag.addToBag(ApplicationConstants.AdalLoginError, localStorage[\"adal.login.error\"]);\r\n propBag.addToBag(ApplicationConstants.AdalLoginRequest, localStorage[\"adal.login.request\"]);\r\n var adalErrorDescription = localStorage[\"adal.error.description\"];\r\n if (CommonUtils.isNullOrEmpty(adalErrorDescription)) {\r\n propBag.addToBag(\"Message\", self.$rootScope.fxpUIConstants.UIMessages.LoadTimeOutGenericError.ErrorMessage);\r\n self.fxpMessage.addMessage(adalErrorMessage, \"reload\");\r\n self.fxpLoggerService.logError(telemtry_source, \"FxpBootstrapAdalError\", ErrorCodes.AdalOnError, null, propBag, null, null, ErrorSeverityLevel.High);\r\n }\r\n else {\r\n var trustedSiteIssue = adalErrorDescription.indexOf(\"AADSTS50058\") == 0;\r\n var adalError = adalErrorDescription.indexOf(\"AADSTS50079\") == 0 ||\r\n adalErrorDescription.indexOf(\"AADSTS50001\") == 0 ||\r\n adalErrorDescription.indexOf(\"Nonce received:\") == 0;\r\n\r\n var errorMessage = \"\";\r\n var messageType = \"error\";\r\n\r\n if (trustedSiteIssue) {\r\n errorMessage = self.$rootScope.fxpUIConstants.UIMessages.LoadTimeAdalError.ErrorMessage;\r\n }\r\n else if (adalError) {\r\n errorMessage = \"Sorry, but we're having trouble signing you in. Please try refreshing the page. If this doesn't work contact support.\";\r\n messageType = \"reload\";\r\n }\r\n else {\r\n errorMessage = adalErrorMessage;\r\n messageType = \"reload\";\r\n }\r\n\r\n propBag.addToBag(\"Message\", errorMessage);\r\n propBag.addToBag(\"AdalError\", localStorage[\"adal.error\"]);\r\n propBag.addToBag(\"AdalErrorDescription\", adalErrorDescription);\r\n self.fxpMessage.addMessage(errorMessage, messageType);\r\n self.fxpLoggerService.logError(telemtry_source, \"FxpBootstrapAdalError\", ErrorCodes.AdalOnErrorWithErrorCode, null, propBag, null, null, ErrorSeverityLevel.High);\r\n }\r\n }\r\n\r\n private setDefaultAppRole() {\r\n this.$rootScope.defaultAppRole = \"\";\r\n let authStore = window[\"tenantConfiguration\"].AuthStore;\r\n if (this.$rootScope.defaultAppRoleInternal) {\r\n this.$rootScope.defaultAppRole = this.$rootScope.defaultAppRoleInternal;\r\n }\r\n else if (!(authStore) || !(authStore.TenantClaimsEndPoint)) {\r\n this.$rootScope.defaultAppRole = window[\"tenantConfiguration\"].defaultAppRole;\r\n }\r\n }\r\n\r\n static appControllerHelperFactory($q, $rootScope, userProfileService, fxpGlobalStoreService, fxpTelemetryContext, fxpLoggerService, userInfoService, featureFlagService, startUpFlightConfig, settingsService, fxpContext, fxpMessage, deviceFactory, deviceDetector, plannedDownTimeService, fxpConfiguration, userClaimsService,\r\n $uibModal,\r\n FxpModalConstant, DashboardService, msalAuthenticationService) {\r\n return new AppControllerHelper($q, $rootScope,userProfileService, fxpGlobalStoreService, fxpTelemetryContext, fxpLoggerService, userInfoService, featureFlagService, startUpFlightConfig, settingsService, fxpContext, fxpMessage, deviceFactory, deviceDetector, plannedDownTimeService, fxpConfiguration, userClaimsService,\r\n $uibModal,\r\n FxpModalConstant, DashboardService, msalAuthenticationService);\r\n }\r\n}\r\n","import { CommonUtils } from \"../utils/CommonUtils\";\r\nimport { FxpConstants } from \"../common/ApplicationConstants\";\r\n\r\n/**\r\n * @application Fxp\r\n */\r\n/**\r\n * @module Fxp.Factory\r\n */\r\n\r\n/**\r\n* A main factory which acts as an helper for AuthorNotificationController. This is the factory having common functionalities\r\nsuch as check uncheck test box, add and remove functionality.\r\n* @class Fxp.Factory.AuthorNotificationHelper\r\n* @classdesc An helper factory for AuthorNotificationController in FxPApp module\r\n* @example \r\n* //How To use this factory\r\n* angular.module('FxPApp').controller('AuthorNotificationController', ['AuthorNotificationRoleGroupHelper', AuthorNotificationRoleGroupHelper]);\r\n* function AuthorNotificationRoleGroupHelper(AnyDependency) }\r\n*/\r\nexport class AuthorNotificationRoleGroupHelper {\r\n\t//this array contains id which will determine whether to enable/disable add button\r\n\tselectedRolesforAddButton: any = [];\r\n\t//this array contains id which will determine whether to enable/disable remove button\r\n\tselectedRolesforRemoveButton: any = [];\r\n\t//contains the final list of roles which need to be published\r\n\tselectedRoles: any = [];\r\n\t//contains the final list of roleGroup which need to be published\r\n\tselectedRoleGroups: any = [];\r\n\tconstructor() {\r\n\t}\r\n\t/**\r\n\t*A method to check if roles or role group has been selected to Add to recepients list,\r\n\tthe return boolean value is decided if selectedRolesforAddButton array is empty or has value.\r\n\t* @method Fxp.Controllers.AuthorNotificationRoleGroupHelper.isRolesRoleGroupAvailableToAdd\r\n\t* @param {any} roleGroupItem selected parent item from master list\r\n\t* @param {any} roleItem selected child item from master list\r\n\t* @example Example to use isRolesRoleGroupAvailableToAdd\r\n\t* AuthorNotificationRoleGroupHelper.isRolesRoleGroupAvailableToAdd(roleGroupItem,roleItem)\r\n\t*/\r\n\tisRolesRoleGroupAvailableToAdd(roleGroupItem, roleItem): boolean {\r\n\t\tlet self = this;\r\n\t\t//if no child item and only parent is passed\r\n\t\tif (CommonUtils.isNullOrEmpty(roleItem)) {\r\n\t\t\tangular.forEach(roleGroupItem.BusinessRoles, function (item) {\r\n\t\t\t\tif (!angular.isDefined(item.isRecipientsItem)) {\r\n\t\t\t\t\titem.isChildSelected = roleGroupItem.isParentSelected;\r\n\t\t\t\t}\r\n\t\t\t\tself.setAddButtonState(item);\r\n\t\t\t});\r\n\t\t} else {\r\n\t\t\t//if child item is passed along with parent item\r\n\t\t\tself.setAddButtonState(roleItem);\r\n\t\t\troleGroupItem.isParentSelected = roleGroupItem.BusinessRoles.every(function (item) { return item.isChildSelected; });\r\n\t\t}\r\n\t\treturn self.selectedRolesforAddButton.length > 0;\r\n\t}\r\n\r\n\t/**\r\n *Based on this function we will populate the array and determine if any items are ready to\r\n\tadd or not based on array.\r\n * @method Fxp.Controllers.AuthorNotificationRoleGroupHelper.setAddButtonState\r\n * @param {any} roleItem child item from master list\r\n * @example Example to use setAddButtonState\r\n * AuthorNotificationRoleGroupHelper.setAddButtonState(roleItem)\r\n */\r\n\tsetAddButtonState(roleItem): void {\r\n\t\tvar self = this;\r\n\t\t//check index of item\r\n\t\tlet roleItemIndex = CommonUtils.getIndexOfObject(self.selectedRolesforAddButton, \"BusinessRoleId\", roleItem.BusinessRoleId);\r\n\t\t//push if item is selected and not available else if remove role an uncheck checkbox\r\n\t\tif (roleItem.isChildSelected && roleItemIndex == -1) {\r\n\t\t\tself.selectedRolesforAddButton.push(roleItem);\r\n\t\t} else if (!roleItem.isChildSelected && (roleItemIndex > -1)) {\r\n\t\t\tself.selectedRolesforAddButton.splice(roleItemIndex, 1);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t *A method to use Select/Unselect from Recepients List\r\n\t * @method Fxp.Controllers.AuthorNotificationRoleGroupHelper.selectedRoleGroupRecepientsItems\r\n\t * @param {any} roleGroupItem selected item is parent of recepients list\r\n\t * @param {any} roleItem selected item child in recepients list\r\n\t * @example Example to use selectedRoleGroupRecepientsItems\r\n\t * AuthorNotificationRoleGroupHelper. selectedRoleGroupRecepientsItems(roleGroupItem, roleItem)\r\n\t */\r\n\tisRolesRoleGroupAvailableToRemove(roleGroupItem, roleItem): boolean {\r\n\t\tvar self = this;\r\n\t\t//if no child item only parent is passed\r\n\t\tif (CommonUtils.isNullOrEmpty(roleItem)) {\r\n\t\t\tangular.forEach(roleGroupItem.BusinessRoles, function (item, key) {\r\n\t\t\t\titem.isRecepientsChildSelected = roleGroupItem.isRecepientsParentSelected;\r\n\t\t\t\tself.setRemoveButtonState(item);\r\n\t\t\t});\r\n\t\t} else {\r\n\t\t\t//if child item is passed along with parent item\r\n\t\t\tself.setRemoveButtonState(roleItem);\r\n\t\t\t//check roleGroupItem if all roles are selected\r\n\t\t\troleGroupItem.isRecepientsParentSelected = roleGroupItem.BusinessRoles.filter(function (roles) {\r\n\t\t\t\treturn (angular.isDefined(roles.isRecipientsItem));\r\n\t\t\t}).every(function (roles) {\r\n\t\t\t\treturn roles.isRecepientsChildSelected;\r\n\t\t\t});\r\n\t\t}\r\n\t\treturn self.selectedRolesforRemoveButton.length > 0;\r\n\t}\r\n\r\n\t/**\r\n *A method to use Enable/Disable remove Button based on selectedRolesforRemoveButton size we will enable Remove button\r\n * @method Fxp.Controllers.AuthorNotificationRoleGroupHelper.setRemoveButtonState\r\n * @example Example to use setRemoveButtonState\r\n * AuthorNotificationRoleGroupHelper.setRemoveButtonState()\r\n */\r\n\tsetRemoveButtonState(roleItem): void {\r\n\t\tvar self = this;\r\n\t\t//check index of item\r\n\t\tvar roleItemIndex = CommonUtils.getIndexOfObject(self.selectedRolesforRemoveButton, \"BusinessRoleId\", roleItem.BusinessRoleId);\r\n\t\t//push if item is selected and not available else remove id unchecked\r\n\t\tif (roleItem.isRecepientsChildSelected && roleItemIndex == -1) {\r\n\t\t\tself.selectedRolesforRemoveButton.push(roleItem);\r\n\t\t} else if (!roleItem.isRecepientsChildSelected && (roleItemIndex > -1)) {\r\n\t\t\tself.selectedRolesforRemoveButton.splice(roleItemIndex, 1);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t*A method to use maintain audit infromation of manageRoleGroupItem based on parent action track\r\n\t* @method Fxp.Controllers.AuthorNotificationRoleGroupHelper.manageRoleGroupItem\r\n\t* @param {any} parent collection contains added and removed items\r\n\t* @param {string} action whether it is add or remove\r\n\t* @example Example to use manageRoleGroupItem\r\n\t* AuthorNotificationRoleGroupHelper.manageRoleGroupItem(parent,action)\r\n\t*/\r\n\tmanageRoleGroupItems(roleGroupItem, action): void {\r\n\t\tlet self = this;\r\n\t\t//check if roleGroupItem item is available\r\n\t\tlet roleGroupindex = CommonUtils.getIndexOfObject(self.selectedRoleGroups, \"RoleGroupId\", roleGroupItem.RoleGroupId);\r\n\t\t//add roleGroupItem item\r\n\t\tif (action == FxpConstants.ActionTypes.Add) {\r\n\t\t\tif (roleGroupindex == -1)\r\n\t\t\t\tself.selectedRoleGroups.push(roleGroupItem);\r\n\t\t} else {\r\n\t\t\t//remove roleGroupItem \r\n\t\t\tif (roleGroupindex > -1)\r\n\t\t\t\tself.selectedRoleGroups.splice(roleGroupindex, 1);\r\n\t\t}\r\n\t}\r\n\t/**\r\n\t*A method to add or remove items from Roles and Role Group Array\r\n\t* @method Fxp.Controllers.AuthorNotificationRoleGroupHelper.manageRoleItem\r\n\t* @param {any} roleItem contains roleItem item\r\n\t* @param {string} action string that specifies add or remove\r\n\t* @param {int} roleGroupItem contains roleGroupItem item\r\n\t* @example Example to use manageRoleItem\r\n\t* AuthorNotificationRoleGroupHelper.manageRoleItem(roleItem, action, roleGroupItem)\r\n\t*/\r\n\tmanageRoleItems(roleItem, action, roleGroupItem): void {\r\n\t\tvar self = this;\r\n\t\troleItem.parentId = roleGroupItem.RoleGroupId;\r\n\t\t//remove roleGroupItems from selectedRoleGroups array\r\n\t\tvar removeRoleGroupItem = function removeRoleGroupItem(parentId) {\r\n\t\t\tlet index = CommonUtils.getIndexOfObject(self.selectedRoleGroups, \"RoleGroupId\", parentId);\r\n\t\t\tif (index > -1)\r\n\t\t\t\tself.selectedRoleGroups.splice(index, 1);\r\n\t\t}\r\n\t\t//remove role items from selectedRoles array\r\n\t\tvar removeRoleItems = function removeRoleItems(roleGroupItem) {\r\n\t\t\tself.selectedRoles = self.selectedRoles.filter(function (role) {\r\n\t\t\t\treturn role.parentId != roleGroupItem.RoleGroupId;\r\n\t\t\t});\r\n\t\t}\r\n\t\t//push role items in selectedRoles array\r\n\t\tvar pushRoleItems = function pushRoleItems(roleGroupItem) {\r\n\t\t\tfor (let i = 0; i < roleGroupItem.BusinessRoles.length; i++) {\r\n\t\t\t\tif (roleGroupItem.BusinessRoles[i].isRecipientsItem)\r\n\t\t\t\t\tself.selectedRoles.push(roleGroupItem.BusinessRoles[i]);\r\n\t\t\t}\r\n\t\t}\r\n\t\t//find index of child item in selectedRoles array\r\n\t\tlet roleItemIndex = CommonUtils.getIndexOfObject(self.selectedRoles, \"BusinessRoleId\", roleItem.BusinessRoleId);\r\n\t\tswitch (action) {\r\n\t\t\t//Add item from Role Group list to recepients list\r\n\t\t\tcase FxpConstants.ActionTypes.Add:\r\n\t\t\t\t//push if child item doesn't exist in selectedRoles array\r\n\t\t\t\tif (roleItemIndex == -1 && !roleGroupItem.isParentSelected)\r\n\t\t\t\t\tself.selectedRoles.push(roleItem);\r\n\t\t\t\telse {\r\n\t\t\t\t\t//find index of parent item in selectedRoleGroups array\r\n\t\t\t\t\tlet roleGroupItemIndex = CommonUtils.getIndexOfObject(self.selectedRoleGroups, \"RoleGroupId\", roleGroupItem.RoleGroupId);\r\n\t\t\t\t\t//add if parent item not there and remove child items from selectedRoles array\r\n\t\t\t\t\tif (roleGroupItemIndex == -1) {\r\n\t\t\t\t\t\tself.selectedRoleGroups.push(roleGroupItem);\r\n\t\t\t\t\t\tremoveRoleItems(roleGroupItem);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tbreak;\r\n\t\t\t//Remove item from recepients list\r\n\t\t\tcase FxpConstants.ActionTypes.Remove:\r\n\t\t\t\t//delete role item from selectedRoles if found\r\n\t\t\t\tif (roleItemIndex > -1) {\r\n\t\t\t\t\tself.selectedRoles.splice(roleItemIndex, 1);\r\n\t\t\t\t} else {\r\n\t\t\t\t\t//if no role item found in selectedRoles array delete parent Item from selectedRoleGroups array and push child item to selectedRoles array\r\n\t\t\t\t\tremoveRoleGroupItem(roleGroupItem.RoleGroupId);\r\n\t\t\t\t\tpushRoleItems(roleGroupItem);\r\n\t\t\t\t}\r\n\t\t\t\tbreak;\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n *A method to flush selectedRoleGroups and selectedRoles array\r\n * @method Fxp.Controllers.AuthorNotificationRoleGroupHelper.resetSelectedRolesRoleGroupArray\r\n * @example Example to use resetSelectedRolesRoleGroupArray\r\n * AuthorNotificationRoleGroupHelper.resetSelectedRolesRoleGroupArray()\r\n */\r\n\tresetSelectedRolesRoleGroupArray(): void {\r\n\t\tlet self = this;\r\n\t\tself.selectedRoleGroups = [];\r\n\t\tself.selectedRoles = [];\r\n\t}\r\n\r\n\taddRemoveRolesRoleGroup(roleGroupDetails, action): any {\r\n\t\tvar self = this;\r\n\t\tlet roleGroupsListLength = roleGroupDetails.length;\r\n\t\tlet focusIndex = false;\r\n\t\tlet isFocusedElement = false;\r\n\t\tlet isRoleGroupToAdd = false;\r\n\r\n\t\t//add Roles to recepients list\r\n\t\tvar addRolesToRecepientsList = function addRolesToRecepientsList(roles, roleIndex, roleGroupIndex) {\r\n\t\t\tif ((roles[roleIndex].isChildSelected) && (!angular.isDefined(roles[roleIndex].isRecipientsItem))) {\r\n\t\t\t\t// adding a flag to child item based on which it will b rendered in recepients list\r\n\t\t\t\troles[roleIndex].isRecipientsItem = true;\r\n\t\t\t\t//if any role is added set flag for rolegroup to be added in UI \r\n\t\t\t\tisRoleGroupToAdd = true;\r\n\t\t\t\t//set focus once on rolegroup item which is displayed in UI\r\n\t\t\t\tif (!isFocusedElement)\r\n\t\t\t\t\troleGroupDetails[roleGroupIndex].isFocusedElement = isFocusedElement = true;\r\n\t\t\t\t// if there are any roles to be added manageRoleItems will add roles to recepients list\r\n\t\t\t\tself.manageRoleItems(roles[roleIndex], FxpConstants.ActionTypes.Add, roleGroupDetails[roleGroupIndex]);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t//remove role from recepient list\r\n\t\tvar removeRolesFromRecepientsList = function removeRolesFromRecepientsList(roles, roleIndex, roleGroupIndex) {\r\n\t\t\tif ((roles[roleIndex].isRecepientsChildSelected) && (angular.isDefined(roles[roleIndex].isRecipientsItem))) {\r\n\t\t\t\tdelete roles[roleIndex].isRecipientsItem;\r\n\t\t\t\troles[roleIndex].isChildSelected = false;\r\n\t\t\t\tself.manageRoleItems(roles[roleIndex], FxpConstants.ActionTypes.Remove, roleGroupDetails[roleGroupIndex]);\r\n\t\t\t}\r\n\t\t\troles[roleIndex].isRecepientsChildSelected = false;\r\n\t\t}\r\n\r\n\t\t//display RoleGroup item on UI if any role is selected\r\n\t\tvar displayRoleGroupInRecepientsList = function displayRoleGroupInRecepientsList(roleGroupIndex) {\r\n\t\t\t//check if item is already not in recepients list\r\n\t\t\tif ((!angular.isDefined(roleGroupDetails[roleGroupIndex].isRecipientsItem))) {\r\n\t\t\t\troleGroupDetails[roleGroupIndex].isRecipientsItem = true;\r\n\t\t\t}\r\n\t\t\t//while displaying in recepients list expand the accordian\r\n\t\t\troleGroupDetails[roleGroupIndex].isAccordianExpanded = true;\r\n\t\t}\r\n\r\n\t\tvar availableRolesCount = function availableRolesCount(roleGroupIndex) {\r\n\t\t\tvar count = roleGroupDetails[roleGroupIndex].BusinessRoles.reduce(function (item, roleItem) {\r\n\t\t\t\treturn item + angular.isDefined(roleItem.isRecipientsItem);\r\n\t\t\t}, 0);\r\n\t\t\treturn count;\r\n\t\t}\r\n\r\n\t\t//reomve Role Group item from UI if all childs are removed\r\n\t\tvar removeDisplayRoleGroupInRecepientsList = function removeDisplayRoleGroupInRecepientsList(roleGroupIndex) {\r\n\t\t\tvar rolesCount = availableRolesCount(roleGroupIndex);\r\n\t\t\t//if there are no child available remove parent item from recepients list\r\n\t\t\tif (rolesCount === 0) {\r\n\t\t\t\tdelete roleGroupDetails[roleGroupIndex].isRecipientsItem;\r\n\t\t\t}\r\n\t\t\t//uncheck role group flag \r\n\t\t\troleGroupDetails[roleGroupIndex].isRecepientsParentSelected = false;\r\n\t\t\t//check/uncheck flag based how many role available on recepeints list \r\n\t\t\troleGroupDetails[roleGroupIndex].isParentSelected = self.isRolesInReciepientList(roleGroupDetails[roleGroupIndex]);\r\n\t\t}\r\n\r\n\t\t//common function to add/remove roles\r\n\t\tvar addRemoveRoles = function addRemoveRoles(roleGroupIndex, action) {\r\n\t\t\tlet roleLength = roleGroupDetails[roleGroupIndex].BusinessRoles.length;\r\n\t\t\tlet roles = roleGroupDetails[roleGroupIndex].BusinessRoles;\r\n\t\t\tisRoleGroupToAdd = false;\r\n\t\t\tfor (let roleIndex = 0; roleIndex < roleLength; roleIndex++) {\r\n\t\t\t\tif (action == \"Add\")\r\n\t\t\t\t\taddRolesToRecepientsList(roles, roleIndex, roleGroupIndex);\r\n\t\t\t\telse\r\n\t\t\t\t\tremoveRolesFromRecepientsList(roles, roleIndex, roleGroupIndex);\r\n\t\t\t}\r\n\t\t\t//show parentitem roleGroupIndex.e roleGroup in UI if any child is added to recepients list \r\n\t\t\tif (action == \"Add\" && isRoleGroupToAdd)\r\n\t\t\t\tdisplayRoleGroupInRecepientsList(roleGroupIndex);\r\n\t\t\t//remove role group item from UI if all child are unselected\r\n\t\t\tif (action == \"Remove\") {\r\n\t\t\t\tremoveDisplayRoleGroupInRecepientsList(roleGroupIndex);\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\t//add role group item to recepient list which doesnot have any roles\r\n\t\tvar addRoleGroupsToRecepientsList = function addRoleGroupsToRecepientsList(roleGroupIndex) {\r\n\t\t\tif ((roleGroupDetails[roleGroupIndex].isParentSelected) && (!angular.isDefined(roleGroupDetails[roleGroupIndex].isRecipientsItem))) {\r\n\t\t\t\troleGroupDetails[roleGroupIndex].isRecipientsItem = true;\r\n\t\t\t\troleGroupDetails[roleGroupIndex].isAccordianExpanded = true;\r\n\t\t\t\tif (!isFocusedElement)\r\n\t\t\t\t\troleGroupDetails[roleGroupIndex].isFocusedElement = isFocusedElement = true;\r\n\t\t\t\tself.manageRoleGroupItems(roleGroupDetails[roleGroupIndex], FxpConstants.ActionTypes.Add);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t//remove role group item from recepient list which doesnot have any roles\r\n\t\tvar removeRoleGroupsFromRecepientsList = function removeRoleGroupsFromRecepientsList(roleGroupIndex) {\r\n\t\t\tif ((roleGroupDetails[roleGroupIndex].isRecepientsParentSelected)) {\r\n\t\t\t\tdelete roleGroupDetails[roleGroupIndex].isRecipientsItem;\r\n\t\t\t\troleGroupDetails[roleGroupIndex].isRecepientsParentSelected = false;\r\n\t\t\t\troleGroupDetails[roleGroupIndex].isParentSelected = false\r\n\t\t\t\tself.manageRoleGroupItems(roleGroupDetails[roleGroupIndex], FxpConstants.ActionTypes.Remove);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t//common function to add/remove roleGroup item which doesnot have any roles\r\n\t\tvar addRemoveRoleGroup = function addRemoveRoleGroup(roleGroupIndex, action) {\r\n\t\t\tif (action == \"Add\")\r\n\t\t\t\taddRoleGroupsToRecepientsList(roleGroupIndex);\r\n\t\t\telse\r\n\t\t\t\tremoveRoleGroupsFromRecepientsList(roleGroupIndex)\r\n\t\t}\r\n\r\n\t\t// set focus on the role group item which is added or removed\r\n\t\tvar setFocusToRoleGroupItem = function setFocusToRoleGroupItem(status) {\r\n\t\t\tfor (let roleGroupIndex = 0; roleGroupIndex < roleGroupDetails.length; roleGroupIndex++) {\r\n\t\t\t\tif (!roleGroupDetails[roleGroupIndex].isParentSelected) {\r\n\t\t\t\t\troleGroupDetails[roleGroupIndex].isFocused = status;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t//iterate all roleGroups\r\n\t\tfor (let roleGroupIndex = 0; roleGroupIndex < roleGroupsListLength; roleGroupIndex++) {\r\n\t\t\t//if business Role available check if any item is selected to add\r\n\t\t\tif (roleGroupDetails[roleGroupIndex].BusinessRoles) {\r\n\t\t\t\t//add or Remove role \r\n\t\t\t\taddRemoveRoles(roleGroupIndex, action);\r\n\t\t\t} else {\r\n\t\t\t\t//add or Remove roleGroup\r\n\t\t\t\taddRemoveRoleGroup(roleGroupIndex, action);\r\n\r\n\t\t\t}\r\n\t\t}\r\n\t\tif (action == \"Add\" && !isFocusedElement)\r\n\t\t\tsetFocusToRoleGroupItem(true);\r\n\t\tif (action == \"Remove\")\r\n\t\t\tsetFocusToRoleGroupItem(true);\r\n\t\treturn roleGroupDetails;\r\n\t}\r\n\t/**\r\n\t*A method to use Enable/Disable the Parent Link in roles Role group list based on items in recepients list\r\n\t* @method Fxp.Controllers.AuthorNotificationController.isRolegroupInReciepientList\r\n\t* @param {any} roleGroupItem object whichj we are going to dispaly in UI\r\n\t* @example Example to use isRolegroupInReciepientList\r\n\t* AuthorNotificationController.isParentisRolegroupInReciepientListLinkEnabled(roleGroupItem)\r\n\t*/\r\n\tisRolesInReciepientList(roleGroupItem): boolean {\r\n\t\t//check how many roles added to recepients list\r\n\t\tvar roleLength = roleGroupItem.BusinessRoles.reduce(function (item, childItem) {\r\n\t\t\treturn item + angular.isDefined(childItem.isRecipientsItem);\r\n\t\t}, 0);\r\n\t\treturn roleGroupItem.BusinessRoles.length === roleLength;\r\n\t}\r\n\tstatic AuthorNotificationRoleGroupHelper() {\r\n\t\treturn new AuthorNotificationRoleGroupHelper();\r\n\t}\r\n}\r\n","import { ILogger } from \"../interfaces/ILogger\";\r\nimport { PerfMarkers, ApplicationConstants, FxpConstants } from \"../common/ApplicationConstants\";\r\nimport { Resiliency } from \"../resiliency/FxpResiliency\";\r\nimport { TelemetryContext } from \"../telemetry/telemetrycontext\";\r\nimport { FxpContext } from \"../context/FxpContext\";\r\nimport { PageLoaderService } from \"../../app/loader/pageLoaderService\";\r\nimport { FxpRouteService } from \"../services/FxpRouteService\";\r\nimport { IRootScope } from \"../interfaces/IRootScope\";\r\nimport { AppControllerHelper } from \"./AppControllerHelper\";\r\nimport { IStateConfig } from \"../interfaces/IStateConfig\";\r\nimport { IRouteInfo } from \"../interfaces/IRouteInfo\";\r\nimport { PartnerAppRegistrationService } from \"../services/PartnerAppRegistrationService\";\r\nimport { UserInfoService } from \"../services/UserInfoService\";\r\nimport { IFxpAppContext } from \"../interfaces/IFxpAppContext\";\r\nimport { FxpConfigurationService } from \"../services/FxpConfiguration\";\r\nimport { PartnerContainerComponent } from \"../../app/components/partnerContainer-component/partnerContainer-component\";\r\nimport { FxpMessageService } from \"../../app/banner/FxpMessageService\";\r\nimport { IStateDataObject } from \"../interfaces/IStateDataObject\";\r\nimport { CommonUtils } from \"../utils/CommonUtils\";\r\nimport { DashboardService } from \"../services/dashboardService\";\r\nimport { ReactPartnerContainerComponent } from \"../../app/components/reactContainer-component/reactpartner-component\";\r\nimport { FxpGlobalStoreService } from \"../services/fxp.global.store.service\";\r\nimport { AddRouteConfiguration } from \"@fxp/staterouter\";\r\nimport { PowerBIReportContainerComponent } from \"../../app/components/powerbi-component/powerbi-container-component\";\r\nimport { StateParams } from \"@uirouter/angular\";\r\nimport { TelemetryConstants } from \"../telemetry/TelemetryConst\";\r\nimport { ComponentType } from \"@microsoftit/telemetry-extensions-npm\";\r\nimport { SystemEvent } from \"../telemetry/SystemEvent\";\r\nimport { ErrorCodes } from \"../constants/errorCodes\";\r\nimport { ErrorSeverityLevel } from \"../telemetry/ErrorSeverityLevel\";\r\nimport { FxpBroadcastedEvents } from \"../services/FxpBroadcastedEvents\";\r\nimport { UserFeedbackUIService } from \"../services/UserFeedbackUIService\";\r\nimport { UserAnnouncementUIService } from \"../services/UserAnnouncementUIService\";\r\n\r\ndeclare type IStateService = any;\r\n/**\r\n * @application Fxp\r\n */\r\n\r\n/**\r\n * A main factory which acts as an helper for DashBoardController. This is the factory having common functionalities.\r\n * @class Fxp.Factory.DashBoardHelper\r\n * @classdesc An helper factory for DashBoardController in FxPApp module\r\n * @example \r\n * //How To use this factory\r\n * angular.module('FxPApp').controller('DashBoardController', ['DashBoardHelper', DashBoardHelper]);\r\n * function DashBoardController(AnyDependency){ DashBoardHelper.fillRoutes(config); }\r\n */\r\nexport class DashBoardHelper {\r\n private UIStateHelper: angular.IServiceProvider;\r\n private fxpLoggerService: ILogger;\r\n private $state: IStateService;\r\n private fxpContext: FxpContext;\r\n private fxpTelemetryContext: TelemetryContext;\r\n private fxpRouteService: FxpRouteService;\r\n private $rootScope: IRootScope;\r\n private $location: angular.ILocationService;\r\n private pageLoaderService: PageLoaderService;\r\n private $injector: angular.auto.IInjectorService;\r\n private appControllerHelper: AppControllerHelper;\r\n private stateConfigCollection: Array;\r\n private userInfoService: UserInfoService;\r\n private fxpMessageService: FxpMessageService;\r\n private enableLazyLoading: boolean\r\n private $q: angular.IQService\r\n private $interval: angular.IIntervalService;\r\n private maxWaitTimeInMs = 2000;\r\n private dashboardService: DashboardService;\r\n private sourceForTelemetry = `${TelemetryConstants.FXP_TELEMETRY_BASE_NAME}.DashBoardHelper`;\r\n\r\n constructor(\r\n $rootScope: IRootScope,\r\n $state: any, UIStateHelper: angular.IServiceProvider,\r\n fxpLoggerService: ILogger, fxpTelemetryContext: TelemetryContext,\r\n fxpContextService: FxpContext,\r\n fxpRouteService: FxpRouteService,\r\n $location: angular.ILocationService,\r\n PageLoaderService: PageLoaderService,\r\n private fxpConfigurationService: FxpConfigurationService,\r\n $injector: angular.auto.IInjectorService, appControllerHelper: AppControllerHelper, userInfoService: UserInfoService,\r\n fxpMessageService: FxpMessageService,\r\n $interval: angular.IIntervalService,\r\n $q: angular.IQService,\r\n DashboardService: DashboardService,\r\n private globalStore: FxpGlobalStoreService,\r\n private feedbackService: UserFeedbackUIService,\r\n private announcementService: UserAnnouncementUIService\r\n ) {\r\n this.$rootScope = $rootScope;\r\n this.UIStateHelper = UIStateHelper;\r\n this.fxpLoggerService = fxpLoggerService;\r\n this.$state = $state;\r\n this.fxpContext = fxpContextService;\r\n this.fxpTelemetryContext = fxpTelemetryContext\r\n this.fxpRouteService = fxpRouteService;\r\n this.$location = $location;\r\n this.pageLoaderService = PageLoaderService;\r\n this.$injector = $injector;\r\n this.appControllerHelper = appControllerHelper;\r\n this.userInfoService = userInfoService;\r\n this.fxpMessageService = fxpMessageService;\r\n var lazyLoadconfig = window[\"tenantConfiguration\"].AdditionalConfigurationContainer || {};\r\n this.enableLazyLoading = lazyLoadconfig.EnableLazyLoading || false;\r\n this.$interval = $interval;\r\n this.$q = $q;\r\n this.dashboardService = DashboardService;\r\n }\r\n\r\n /**\r\n* A method to get the basic profile.\r\n* @method Fxp.Factory.DashBoardHelper.getBasicProfile(config)\r\n* @param {Object} fxpConfig FxpRoute Configurations.\r\n* @example Example to use fillRoutes\r\n* DashBoardHelper.fillRoutes(config);\r\n*/\r\n public fillRoutes(fxpConfig: any): void {\r\n this.stateConfigCollection = new Array();\r\n if (fxpConfig && fxpConfig.Routes)\r\n this.updateStateConfiguration(fxpConfig.Routes);\r\n let fxpAppContext: IFxpAppContext = {\r\n UserContext: this.userInfoService.getCurrentUserContext()\r\n }\r\n var partnerRoutes: any = PartnerAppRegistrationService.getRegisteredRoutes(fxpAppContext);\r\n if (!partnerRoutes) {\r\n partnerRoutes = new Array();\r\n }\r\n partnerRoutes.push(this.getFxpWelcomeRoute());\r\n this.updateStateConfiguration(partnerRoutes);\r\n this.addAngularPartnerAppRoutes();\r\n if (this.stateConfigCollection.length > 0) {\r\n this.fxpContext.saveContext(ApplicationConstants.UIConfigDB, JSON.stringify(fxpConfig));\r\n this.$rootScope.configRouteStates = this.stateConfigCollection;\r\n this.fxpLoggerService.startTrackPerformance(PerfMarkers.LoadRoutes);\r\n\r\n this.fxpLoggerService.stopTrackPerformance(PerfMarkers.LoadRoutes);\r\n if (sessionStorage[\"startTime\"] != null && sessionStorage[\"startTime\"] != \"undefined\" && sessionStorage[\"startTime\"] != \"null\") {\r\n var propbag = this.fxpLoggerService.createPropertyBag();\r\n var receiveDate = new Date();\r\n var startTime = new Date(Date.parse(sessionStorage[\"startTime\"]));\r\n var responseTime = receiveDate.getTime() - startTime.getTime(); // in millisecs\r\n propbag.addToBag(FxpConstants.metricConstants.StartTime, startTime.toUTCString());\r\n propbag.addToBag(FxpConstants.metricConstants.EndTime, receiveDate.toUTCString());\r\n propbag.addToBag(FxpConstants.metricConstants.ServiceName, FxpConstants.metricConstants.FXPApplicationLaunchMetric);\r\n propbag.addToBag(FxpConstants.metricConstants.UserAgent, navigator.userAgent);\r\n propbag.addToBag(FxpConstants.metricConstants.SessionId, this.$rootScope.sessionId);\r\n propbag.addToBag(FxpConstants.metricConstants.UserUPN, this.fxpTelemetryContext.getUserID());\r\n propbag.addToBag(FxpConstants.metricConstants.UserBusinessRole, this.fxpTelemetryContext.getUserRole());\r\n propbag.addToBag(FxpConstants.metricConstants.Geography, this.fxpTelemetryContext.getGeography());\r\n this.fxpLoggerService.logMetric(this.sourceForTelemetry, FxpConstants.metricConstants.FXPApplicationLaunchTimeMetric, responseTime, propbag);\r\n sessionStorage[\"startTime\"] = null;\r\n }\r\n\r\n let alias = this.userInfoService.getCurrentUser();\r\n\r\n var claimdata = this.globalStore.GetPlatformState().CurrentUser.Claims;\r\n var defaultRoutes = window[\"defaultRoutes\"].DefaultRoutes;\r\n\r\n //Get all the states of the user role\r\n const { States } = defaultRoutes.find((item) => (item.AppRole == claimdata.defaultAppRole));\r\n var oldFlightState, newFlightState;\r\n if (States !== undefined && States !== null && States.length > 1) {\r\n oldFlightState = this.getStateName(States);\r\n this.setRoute(oldFlightState, States);\r\n this.dashboardService.getInitialFeatureFlagsForPlatform().then(() => {\r\n newFlightState = this.getStateName(States);\r\n if (JSON.stringify(oldFlightState) !== JSON.stringify(newFlightState)) {\r\n this.setRoute(newFlightState, States);\r\n }\r\n sessionStorage[ApplicationConstants.RequestStateName] = \"\";\r\n });\r\n } else {\r\n this.setRoute(oldFlightState, States);\r\n sessionStorage[ApplicationConstants.RequestStateName] = \"\";\r\n }\r\n }\r\n }\r\n\r\n private setRoute(flightstate, States) {\r\n const source_telemetry = `${this.sourceForTelemetry}.SetRoute`;\r\n var DefaultStateName;\r\n //Get the flighted state name or default state name, as applicable\r\n if (flightstate !== undefined && flightstate !== null) {\r\n DefaultStateName = flightstate.StateName;\r\n } else {\r\n DefaultStateName = States.find((item) => (item.FeatureName == \"default\")).StateName;\r\n }\r\n this.$rootScope.defaultStateName = DefaultStateName;\r\n let landingPage = this.$rootScope.defaultStateName;\r\n if (this.fxpConfigurationService.FxpAppSettings.EnableFxPWelcomePage) {\r\n landingPage = \"fxpwelcome\";\r\n }\r\n var dhref = this.$state.href(this.$rootScope.defaultStateName);\r\n if (dhref == null || dhref == undefined) {\r\n this.pageLoaderService.fnHidePageLoader();\r\n this.fxpMessageService.addMessage(`Default route ${DefaultStateName} is not configured`, FxpConstants.messageType.error);\r\n this.fxpLoggerService.logError(source_telemetry, `Default route ${DefaultStateName} is not configured`, ErrorCodes.DefaultStateNotConfigured, null, null, null, null, ErrorSeverityLevel.High);\r\n }\r\n else {\r\n this.UIStateHelper.otherwise(dhref.slice(1)); //$state.href(defaultStateName) returns # prefixed href e.g #/DashBoard. So we need to remove # prefix\r\n this.fxpRouteService.setDefaultStateName(this.$rootScope.defaultStateName);\r\n if (sessionStorage[ApplicationConstants.RequestStateName] != '' && sessionStorage[ApplicationConstants.RequestStateName] != '/') {\r\n location.hash = `#${sessionStorage[ApplicationConstants.RequestStateName]}`;\r\n }\r\n else {\r\n this.$rootScope.appBooted = true;\r\n this.pageLoaderService.fnShowPageLoader(this.$rootScope.fxpUIConstants.UIStrings.LoadingStrings.LoadingDashboard, this.appControllerHelper.handleAdalErrorsLoadingDashboard);\r\n (this.$state.current.name === landingPage) ? this.$state.reload() : this.$state.go(landingPage, {}, { location: \"replace\" });\r\n }\r\n\r\n let bag = this.fxpLoggerService.createPropertyBag();\r\n let currentProcessName = TelemetryConstants.FXP_TELEMETRY_PLATFORM_BOOTSTRAP + '.LandingExperience.FillRoutes';\r\n let eventData = new SystemEvent(currentProcessName, ComponentType.DataStore, 'Fill routes completed.');\r\n\r\n bag.addToBag('DefaultStateName', `${this.$rootScope.defaultStateName}`);\r\n if (this.$rootScope.actOnBehalfOfUserActive) {\r\n bag.addToBag(\"IsOBOMode\", \"True\");\r\n }\r\n else {\r\n bag.addToBag(\"IsOBOMode\", \"False\");\r\n }\r\n this.fxpLoggerService.logSystemEvent(source_telemetry, eventData, bag)\r\n }\r\n this.fxpLoggerService.stopTrackPerformance(PerfMarkers.DashboardLoad);\r\n this.loadOCVScripts();\r\n this.fxpLoggerService.stopTrackPerformance(PerfMarkers.FxpLoad);\r\n this.$rootScope.$broadcast(FxpBroadcastedEvents.OnPageLoadComplete, `${TelemetryConstants.FXP_TELEMETRY_BASE_NAME}.Shell`);\r\n const shellLoadCompleteEvent = new SystemEvent(`${TelemetryConstants.FXP_TELEMETRY_BASE_NAME}.FxpShellLoadComplete`, ComponentType.Web, \"FxP Shell loaded.\");\r\n this.fxpLoggerService.logSystemEvent(source_telemetry, shellLoadCompleteEvent);\r\n this.collectFeedback();\r\n }\r\n private loadOCVScripts() {\r\n window[\"fxpOcvLoaded\"], window[\"fxpOcvFloodGateLoaded\"] = false;\r\n\r\n var ocvFileName = window[\"isDebugMode\"] ? 'officebrowserfeedback.js' : 'officebrowserfeedback.min.js';\r\n var ocvFloodgateFileName = window[\"isDebugMode\"] ? 'officebrowserfeedback_floodgate.js' : 'officebrowserfeedback_floodgate.min.js';\r\n\r\n (function (d, s, id) {\r\n var js, fjs = d.getElementsByTagName(s)[0];\r\n if (d.getElementById(id)) { return; }\r\n js = d.createElement(s); js.id = id;\r\n js.src = \"lib/OCV/scripts/\" + ocvFileName;; // officebrowserfeedback.js or officebrowserfeedback_floodgate.js\r\n js.onload = function () {\r\n window[\"fxpOcvLoaded\"] = true;\r\n }\r\n fjs.parentNode.insertBefore(js, fjs);\r\n }(document, 'script', 'officebrowserfeedback-jssdk'));\r\n\r\n (function (d, s, id) {\r\n var js, fjs = d.getElementsByTagName(s)[0];\r\n if (d.getElementById(id)) { return; }\r\n js = d.createElement(s); js.id = id;\r\n js.src = \"lib/OCV/scripts/\" + ocvFloodgateFileName; // officebrowserfeedback.js or officebrowserfeedback_floodgate.js\r\n js.onload = function () {\r\n window[\"fxpOcvFloodGateLoaded\"] = true;\r\n }\r\n fjs.parentNode.insertBefore(js, fjs);\r\n }(document, 'script', 'officebrowserfeedback-floodgate-jssdk'));\r\n }\r\n private collectFeedback() {\r\n let self = this;\r\n this.dashboardService.getInitialFeatureFlagsForPlatform().then(() => {\r\n self.announcementService.showUserAnnouncement();\r\n self.feedbackService.collectGCEFeedback();\r\n });\r\n }\r\n private getFxpWelcomeRoute() {\r\n const route = \"{\\\"name\\\":\\\"fxpwelcome\\\",\\\"url\\\":\\\"/fxpwelcome\\\",\\\"templateUrl\\\":\\\"welcome.html\\\",\\\"controller\\\":\\\"FxpWelcomeController\\\",\\\"data\\\":{\\\"ocvAreaName\\\":\\\"FxpWelcomeArea\\\",\\\"headerName\\\":\\\"Enterprise Field Experience\\\",\\\"breadcrumbText\\\":\\\"Enterprise Field Experience\\\",\\\"pageTitle\\\":\\\"Enterprise Field Experience\\\",\\\"partnerTelemetryName\\\":\\\"Fxp\\\"}}\";\r\n return JSON.parse(route);\r\n }\r\n\r\n private updateStateConfiguration(configRoutes) {\r\n var routeInfoList = [];\r\n for (var i = 0; i < configRoutes.length; i++) {\r\n if (configRoutes[i].RouteConfig) {\r\n var routeConfig = typeof (configRoutes[i].RouteConfig) == \"string\" ? JSON.parse(configRoutes[i].RouteConfig) : configRoutes[i].RouteConfig;\r\n var currentStateObj = {};\r\n currentStateObj.name = configRoutes[i].StateName;\r\n currentStateObj.url = routeConfig.url;\r\n currentStateObj.controller = routeConfig.controller;\r\n currentStateObj.controllerAs = routeConfig.controllerAs;\r\n currentStateObj.templateUrl = routeConfig.templateUrl;\r\n currentStateObj.resolve = routeConfig.resolve;\r\n if (!routeConfig.powerbiReportConfig) {\r\n currentStateObj.component = routeConfig.component;\r\n currentStateObj.params = routeConfig.params || {};\r\n }\r\n else {\r\n currentStateObj.component = PowerBIReportContainerComponent;\r\n currentStateObj.params = new StateParams(routeConfig.powerbiReportConfig);\r\n }\r\n\r\n //backward compatibility to access params object for existed partners.\r\n currentStateObj.params.headerName = configRoutes[i].AppHeader;\r\n currentStateObj.params.breadcrumbText = configRoutes[i].BreadcrumbText;\r\n currentStateObj.params.pageTitle = configRoutes[i].PageTitle;\r\n currentStateObj.data = {\r\n partnerTelemetryName: configRoutes[i].PartnerTelemetryName,\r\n headerName: configRoutes[i].AppHeader,\r\n breadcrumbText: configRoutes[i].BreadcrumbText,\r\n pageTitle: configRoutes[i].PageTitle,\r\n requiredModules: configRoutes[i].requiredModules,\r\n LazyLoad: configRoutes[i].LazyLoad || [],\r\n stateModulesMissing: false,\r\n extendable: configRoutes[i].extendable || {},\r\n featureName: configRoutes[i].FeatureName || undefined,\r\n subFeatureName: configRoutes[i].SubFeatureName || undefined,\r\n actionName: configRoutes[i].ActionName,\r\n pageNameForTelemetry: configRoutes[i].PageNameForTelemetry,\r\n appNameForTelemetry: configRoutes[i].AppNameForTelemetry\r\n };\r\n currentStateObj.views = routeConfig.views;\r\n this.stateConfigCollection.push(currentStateObj);\r\n this.registerRoute(currentStateObj);\r\n if (routeInfoList.some(routeInfo => routeInfo.applicationName === currentStateObj.data.partnerTelemetryName)) {\r\n routeInfoList.find(routeInfo => routeInfo.applicationName === currentStateObj.data.partnerTelemetryName).routes.push(currentStateObj)\r\n } else {\r\n routeInfoList.push({\r\n applicationName: currentStateObj.data.partnerTelemetryName,\r\n routes: [currentStateObj],\r\n sharedBundles: null\r\n });\r\n }\r\n }\r\n else {\r\n // adding routes with new schema directly to collection\r\n let route;\r\n if (configRoutes[i].component) {\r\n\r\n route = configRoutes[i];\r\n route.childComponent = route.component;\r\n //route.component = PartnerContainerComponent;\r\n\r\n if (configRoutes[i].componentFramework != undefined && configRoutes[i].componentFramework == \"React\") {\r\n route.component = ReactPartnerContainerComponent;\r\n }\r\n else {\r\n route.component = PartnerContainerComponent;\r\n }\r\n }\r\n // if using sticky states feature, swap the named view component with PartnerContainerComponent\r\n if (configRoutes[i].sticky && configRoutes[i].views) {\r\n route = configRoutes[i];\r\n let name = Object.keys(route.views)[0]; // sticky:true requires there to be a named view in the `views` attribute\r\n route.childComponent = route.views[name].component;\r\n route.views[name].component = PartnerContainerComponent;\r\n }\r\n this.stateConfigCollection.push(configRoutes[i]);\r\n this.registerRoute(configRoutes[i]);\r\n }\r\n }\r\n }\r\n\r\n private registerRoute(routesData): void {\r\n try {\r\n this.updateResolveObjects(routesData, routesData.data.LazyLoad)\r\n var stateModulesMissing = false;\r\n try {\r\n if (routesData.data && routesData.data.requiredModules && Resiliency.UnavailablePartnerModules.length > 0) {\r\n var reqModules = routesData.data.requiredModules.split(',');\r\n if (reqModules.length > 0) {\r\n for (var i = 0; i < reqModules.length; i++) {\r\n if (Resiliency.UnavailablePartnerModules.indexOf(reqModules[i]) > -1) {\r\n stateModulesMissing = true;\r\n Resiliency.statesWithMissingModules.push(routesData.name);\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n catch (ex) { }\r\n routesData.data.stateModulesMissing = stateModulesMissing;\r\n var config = angular.extend({\r\n \"requireADLogin\": true\r\n }, routesData);\r\n if (!this.$state.get(routesData.name)) {\r\n this.UIStateHelper.addState(routesData.name, config);\r\n }\r\n }\r\n catch (ex) {\r\n this.fxpLoggerService.logException(`${this.sourceForTelemetry}.RegisterRoute`, ex, null, null, null, ErrorSeverityLevel.Medium, ErrorCodes.ErrorRegisteringRoute);\r\n }\r\n }\r\n\r\n /**\r\n * A method to get the basic profile.\r\n * @method Fxp.Factory.DashBoardHelper.getResolveMembers(config)\r\n * @param {Object} resolveObjects Resolve Objects.\r\n * @example Example to use getResolveMembers\r\n * this.getResolveMembers(resolveObjects);\r\n */\r\n private getResolveMembers(resolveObjects: any): any {\r\n var promiseObjects = {};\r\n Object.keys(resolveObjects).forEach(function (key) {\r\n var value = resolveObjects[key];\r\n promiseObjects[key] = new Function(value); // [SM04509] legacy code\r\n });\r\n\r\n return promiseObjects;\r\n }\r\n\r\n /**\r\n * A method to get the basic profile.\r\n * @method Fxp.Factory.DashBoardHelper.updateResolveObjects(config)\r\n * @param {Object} uirouteConfigObjects UIRoute Config Objects.\r\n * @example Example to use updateResolveObjects\r\n * this.updateResolveObjects(uirouteConfigObjects);\r\n */\r\n private updateResolveObjects(uirouteConfigObjects: any, lazyLoadModules: any): any {\r\n let self = this;\r\n const telemetry_source = `${this.sourceForTelemetry}.UpdateResolveObjects`;\r\n try {\r\n var ocResolve, getFlightingInfo;\r\n var getResolveMembers = this.getResolveMembers;\r\n if (this.enableLazyLoading && lazyLoadModules && lazyLoadModules.length) {\r\n ocResolve = [\"$ocLazyLoad\", \"$injector\", function ($ocLazyLoad, $injector) {\r\n var pgldrService = $injector.get('PageLoaderService');\r\n if (pgldrService != undefined)\r\n pgldrService.fnShowPageLoader(\"loading...\");\r\n\r\n return $ocLazyLoad.load(lazyLoadModules, { serie: true }).then(function () {\r\n pgldrService.fnShowPageLoader(\"loaded...\");\r\n pgldrService.fnHidePageLoader();\r\n }).catch(function (err) {\r\n pgldrService.fnHidePageLoader();\r\n let errMessage;\r\n if (err.message != undefined) {\r\n errMessage = err.message;\r\n }\r\n if (err.stack != undefined) {\r\n errMessage += \" \" + err.stack;\r\n }\r\n self.fxpLoggerService.logException(telemetry_source, err, null, null, null, ErrorSeverityLevel.High, ErrorCodes.ErrorInLazyLoading);\r\n });\r\n }];\r\n if (uirouteConfigObjects.resolve != undefined) {\r\n try {\r\n uirouteConfigObjects.resolve = eval(uirouteConfigObjects.resolve);\r\n uirouteConfigObjects.resolve = uirouteConfigObjects.resolve || {};\r\n uirouteConfigObjects.resolve.lazyLoad = ocResolve;\r\n }\r\n catch (ex) {\r\n this.handleRouteResolveException(lazyLoadModules, uirouteConfigObjects);\r\n }\r\n }\r\n else {\r\n uirouteConfigObjects.resolve = uirouteConfigObjects.resolve || {};\r\n uirouteConfigObjects.resolve.lazyLoad = ocResolve;\r\n }\r\n }\r\n else {\r\n if (uirouteConfigObjects.resolve != undefined) {\r\n uirouteConfigObjects.resolve = eval(uirouteConfigObjects.resolve);\r\n }\r\n }\r\n if (uirouteConfigObjects.views != undefined) {\r\n var stateViews = uirouteConfigObjects.views;\r\n Object.keys(stateViews).forEach(function (key) {\r\n var value = stateViews[key];\r\n if (value.resolve != undefined) {\r\n value.resolve = getResolveMembers(value.resolve);\r\n }\r\n });\r\n }\r\n } catch (ex) {\r\n this.fxpLoggerService.logException(telemetry_source, ex, null, null, null, ErrorSeverityLevel.High, ErrorCodes.ErrorUpdatingStateObject);\r\n }\r\n }\r\n\r\n private handleRouteResolveException(lazyLoadModules: any, uirouteConfigObjects: any): void {\r\n let self = this;\r\n let getFlightingInfo = [\"$ocLazyLoad\", \"$injector\", function ($ocLazyLoad, $injector) {\r\n var pgldrService = $injector.get('PageLoaderService');\r\n if (pgldrService != undefined)\r\n pgldrService.fnShowPageLoader(\"loading...\");\r\n\r\n return $ocLazyLoad.load(lazyLoadModules, { serie: true }).then(function () {\r\n pgldrService.fnHidePageLoader();\r\n var featureFlagService = $injector.get('featureFlagService');\r\n return featureFlagService.GetFilghtingFeatures().then(null, null);\r\n\r\n }).catch(function (err) {\r\n pgldrService.fnHidePageLoader();\r\n self.fxpLoggerService.logException(`${self.sourceForTelemetry}.HandleRouteResolveException`, err, null, null, null, ErrorSeverityLevel.High, ErrorCodes.RouteResolveException);\r\n });\r\n }];\r\n uirouteConfigObjects.resolve = {};\r\n uirouteConfigObjects.resolve.getFlightingInfo = getFlightingInfo;\r\n }\r\n\r\n private addAngularPartnerAppRoutes(): void {\r\n if (PartnerAppRegistrationService.angularPartnerStateConfig.length > 0) {\r\n PartnerAppRegistrationService.angularPartnerStateConfig.forEach(partnerStateConfig => {\r\n let addRouteConfigurationAction = AddRouteConfiguration(partnerStateConfig);\r\n this.globalStore.DispatchGlobalAction(\"Fxp.DashboardHelper\", addRouteConfigurationAction);\r\n let routes = partnerStateConfig.routes;\r\n routes.forEach(partnerRoute => {\r\n let route = {};\r\n route.url = partnerRoute.url;\r\n // if using sticky states feature, swap the named view component with PartnerContainerComponent\r\n if (partnerRoute.sticky && partnerRoute.views) {\r\n route.views = partnerRoute.views;\r\n let name = Object.keys(route.views)[0];\r\n route.views[name].component = PartnerContainerComponent;\r\n } else {\r\n //route.component = PartnerContainerComponent;\r\n\r\n if (partnerRoute.componentFramework != undefined && partnerRoute.componentFramework == \"React\") {\r\n route.component = ReactPartnerContainerComponent;\r\n }\r\n else {\r\n route.component = PartnerContainerComponent;\r\n }\r\n\r\n }\r\n route.sticky = partnerRoute.sticky;\r\n route.name = partnerRoute.name;\r\n route.params = partnerRoute.params;\r\n route.controllerAs = partnerRoute.controllerAs;\r\n route.includeRootModule = partnerRoute.includeRootModule;\r\n route.redirectTo = partnerRoute.redirectTo;\r\n route.template = partnerRoute.template;\r\n route.templateUrl = partnerRoute.templateUrl;\r\n route.authorizationRules = partnerRoute.authorizationRules;\r\n route.data = {};\r\n route.data[\"partnerAppName\"] = partnerStateConfig.applicationName;\r\n route.data.breadcrumbText = partnerRoute.data.breadcrumbText;\r\n route.data.headerName = partnerRoute.data.headerName;\r\n route.data.pageTitle = partnerRoute.data.pageTitle;\r\n route.data.style = partnerRoute.data.style;\r\n route.data.partnerTelemetryName = partnerRoute.data.partnerTelemetryName;\r\n route.data.requiredModules = partnerRoute.data.requiredModules;\r\n route.data.stateModulesMissing = partnerRoute.data.stateModulesMissing;\r\n route.data.extendable = partnerRoute.data.extendable;\r\n route.data.LazyLoad = this.getLazyLoadBundles(partnerStateConfig.sharedBundles, partnerRoute.specificBundles, partnerRoute.generatedBundle);\r\n route.data.appNameForTelemetry = partnerRoute.data.appNameForTelemetry;\r\n route.data.pageNameForTelemetry = partnerRoute.data.pageNameForTelemetry;\r\n route.data.featureName = partnerRoute.data.featureName;\r\n route.data.subFeatureName = partnerRoute.data.subFeatureName;\r\n route.data.actionName = partnerRoute.data.actionName;\r\n route.data.ocvAreaName = partnerRoute.data.ocvAreaName;\r\n this.registerRoute(route);\r\n this.stateConfigCollection.push(route);\r\n });\r\n });\r\n }\r\n }\r\n\r\n private getLazyLoadBundles(commonBundles: Array, specificBundles: Array, generatedBundle: string): Array {\r\n let totalBundles = Array();\r\n totalBundles = commonBundles ? [...totalBundles, ...commonBundles] : totalBundles;\r\n totalBundles = specificBundles ? [...totalBundles, ...specificBundles] : totalBundles;\r\n totalBundles = (generatedBundle && generatedBundle.length > 0) ? [...totalBundles, generatedBundle] : totalBundles;\r\n return totalBundles;\r\n }\r\n\r\n static DashBoardHelperFactory($rootScope, $state, UIStateHelper, fxpLoggerService, fxpTelemetryContext, fxpContextService, fxpRouteService, $location, PageLoaderService, FxpConfigurationService, $injector, appControllerHelper, userInfoService, FxpMessageService, $interval, $q, DashboardService, globalStore, feedbackService, announcementService) {\r\n return new DashBoardHelper($rootScope, $state, UIStateHelper, fxpLoggerService, fxpTelemetryContext, fxpContextService, fxpRouteService, $location, PageLoaderService, FxpConfigurationService, $injector, appControllerHelper, userInfoService, FxpMessageService, $interval, $q, DashboardService, globalStore, feedbackService, announcementService);\r\n }\r\n\r\n private getStateName(States): string {\r\n var featureFlagJson = localStorage[\"FeatureFlags\"];\r\n var flightstate = null;\r\n //Get all feature flags which are true\r\n if (featureFlagJson !== undefined) {\r\n var FeatureFlags = JSON.parse(featureFlagJson);\r\n var arrFeatureFlag = [];\r\n Object.keys(FeatureFlags).map(function (key) {\r\n if (FeatureFlags[key])\r\n arrFeatureFlag.push(key);\r\n return arrFeatureFlag;\r\n });\r\n\r\n //Get feature flight state if any feature flag value is true\r\n flightstate = States.find((state) => {\r\n var isFeatureFlagExists = arrFeatureFlag.find((item) => (item == state.FeatureName));\r\n return isFeatureFlagExists !== undefined && isFeatureFlagExists !== null;\r\n });\r\n }\r\n return flightstate;\r\n }\r\n}\r\n","import { UserInfoService } from \"../services/UserInfoService\";\r\nimport { FxpConfigurationService } from \"../services/FxpConfiguration\";\r\nimport { ILogger } from \"../interfaces/ILogger\";\r\nimport { IRootScope } from \"../interfaces/IRootScope\";\r\nimport { CommonUtils } from \"../utils/CommonUtils\";\r\nimport { TelemetryConstants } from \"../telemetry/TelemetryConst\";\r\nimport { ErrorCodes } from \"../constants/errorCodes\";\r\nimport { ErrorSeverityLevel } from \"../telemetry/ErrorSeverityLevel\";\r\nimport { FxpGlobalStoreService } from \"../../js/services/fxp.global.store.service\";\r\nimport { InteractionRequiredAuthError, PopupRequest, RedirectRequest, SilentRequest } from \"@azure/msal-browser\";\r\nimport { FxpBootstrap } from \"../boot/fxpboot\";\r\nimport { PartnerAppRegistrationService } from \"../services/PartnerAppRegistrationService\";\r\nimport { MsalAuthenticationService, MsalAuthenticationServiceProvider } from \"../services/MsalAuthenticationService\";\r\n\r\nconst HttpInterceptorTelemetrySource = `${TelemetryConstants.FXP_TELEMETRY_BASE_NAME}.FxpHttpInterceptor`;\r\nexport function httpCorrelationInterceptor(userInfoService: UserInfoService,\r\n\tfxpConfigurationService: FxpConfigurationService,\r\n\tloggerService: ILogger,\r\n\tglobalStoreService: FxpGlobalStoreService) {\r\n\r\n\tvar grmInterceptorConfig = window[\"tenantConfiguration\"].AdditionalConfigurationContainer || {};\r\n\tvar authExcludeExtnPat = new RegExp(fxpConfigurationService.FxpBaseConfiguration.FxpConfigurationStrings.AdalAuthExcludeExtn, \"i\");\r\n\tvar enableLazyLoading = grmInterceptorConfig.EnableLazyLoading || false;\r\n\tvar requestInterceptor = {\r\n\t\trequest(config) {\r\n\t\t\tif (authExcludeExtnPat.test(config.url) || isAddHeaders(config)) {\r\n\t\t\t\tdelete config.headers[\"Authorization\"];\r\n\t\t\t\treturn config;\r\n\t\t\t}\r\n\t\t\tif (enableLazyLoading) {\r\n\t\t\t\tif (grmInterceptorConfig.InterceptGRMCalls && grmInterceptorConfig.GRM_APIMServiceUrl != undefined && config.url.indexOf(grmInterceptorConfig.GRM_APIMServiceUrl) >= 0) {\r\n\t\t\t\t\tif (config.headers['X-SenderId'] == undefined) {\r\n\t\t\t\t\t\tconfig.headers['X-SenderId'] = 'GRM';\r\n\t\t\t\t\t\tconfig.headers['X-SenderApp'] = 'GRM User Experience';\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (config.headers['Ocp-Apim-Subscription-Key'] == undefined) {\r\n\t\t\t\t\t\tconfig.headers['Ocp-Apim-Subscription-Key'] = grmInterceptorConfig.GRM_APIM_SubscriptionKey || \"\";\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tlet transactionId = loggerService.getCorrelationId();\r\n\t\t\tconfig.headers[\"X-CorrelationId\"] = transactionId;\r\n\t\t\tif(fxpConfigurationService.FxpAppSettings.MakeFaultFeatureFlagEvaluateCall){\r\n\t\t\t\tconfig.headers[\"X-faultEnabled\"] = globalStoreService.GetPlatformState().FeatureFlags[fxpConfigurationService.FxpAppSettings.FaultFeatureFlagName];\r\n\r\n\t\t\t}\r\n\r\n\t\t\tconfig.headers[\"X-LoggedInUser-Alias\"] = userInfoService.getLoggedInUser();\r\n\t\t\tconfig.headers[\"X-LoggedInUser-Id\"] = userInfoService.getLoggedInUserOID();\r\n\t\t\tif (userInfoService.isActingOnBehalfOf()) {\r\n\t\t\t\tconfig.headers[\"X-ActonBehalfMode\"] = 'true';\r\n\t\t\t\tconfig.headers[\"X-OnBehalfOfUser\"] = userInfoService.getCurrentUserUpn();\r\n\t\t\t\tconfig.headers[\"X-OnBehalfOfUser-Alias\"] = userInfoService.getCurrentUser();\r\n\t\t\t\tconfig.headers[\"X-OnBehalfOfUser-Id\"] = userInfoService.getCurrentUserOID();\r\n\t\t\t}\r\n\r\n\t\t\treturn config;\r\n\t\t}\r\n\t};\r\n\r\n\tfunction isAddHeaders(config) {\r\n\t\tvar FxpAppSettings = FxpAppSettings || window[\"FxpAppSettings\"] || {};\r\n\t\tvar simpleEndpoints = FxpAppSettings.CorsExcludedDomains;\r\n\t\tvar excludedDomains = [];\r\n\t\tif (simpleEndpoints) {\r\n\t\t\texcludedDomains = simpleEndpoints.split(';');\r\n\t\t}\r\n\r\n\t\tfor (var i = 0; i < excludedDomains.length; i++) {\r\n\t\t\tif (config.url.indexOf(excludedDomains[i]) > -1) {\r\n\t\t\t\treturn true;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn false;\r\n\t}\r\n\r\n\treturn requestInterceptor;\r\n}\r\n\r\nexport function httpRetryInterceptor($q: angular.IQService,\r\n\t$injector: angular.auto.IInjectorService,\r\n\t$timeout: angular.IHttpInterceptorFactory,\r\n\tfxpConfigurationService: FxpConfigurationService,\r\n\tloggerService: ILogger,\r\n\t$rootScope: IRootScope) {\r\n\tvar requestURL,\r\n\t\tretries = {},\r\n\t\twaitBetweenErrors = fxpConfigurationService.FxpBaseConfiguration.HttpRetryWaitTime || 1000,\r\n\t\tmaxRetries = fxpConfigurationService.FxpBaseConfiguration.HttpRetryCount || 3;\r\n\tvar excludedHttpStatusCodesForLogging = [];\r\n\tif (!CommonUtils.isNullOrEmpty(fxpConfigurationService.FxpAppSettings.ExcludeHttpStatusCodesFromLogging)) {\r\n\t\texcludedHttpStatusCodesForLogging = fxpConfigurationService.FxpAppSettings.ExcludeHttpStatusCodesFromLogging.split(',');\r\n\t}\r\n\r\n\tfunction onResponseError(httpConfig) {\r\n\t\treturn $timeout(function () {\r\n\t\t\tvar $http: any = $injector.get('$http');\r\n\t\t\treturn $http(httpConfig);\r\n\t\t}, waitBetweenErrors);\r\n\t}\r\n\r\n\treturn {\r\n\t\trequest: function (config) {\r\n\t\t\trequestURL = config.url;\r\n\t\t\tconfig[\"beginTimeStamp\"] = performance.now();\r\n\t\t\treturn config;\r\n\t\t},\r\n\t\tresponse: function (response) {\r\n\t\t\t//logResourceTiming(\"ResourceTimingSuccess\", response.config.url, response.status);\r\n\t\t\tlet self = this;\r\n\t\t\tif (retries[response.config.url])\r\n\t\t\t\tdelete retries[response.config.url];\r\n\r\n\t\t\tif (response.config && response.config.beginTimeStamp) {\r\n\t\t\t\tlogPerfMetric(response.config.url, performance.now() - response.config.beginTimeStamp);\r\n\t\t\t}\r\n\t\t\treturn response;\r\n\t\t},\r\n\t\tresponseError: function (response) {\r\n\t\t\tlet specificError = '';\r\n\t\t\tlet propBag = loggerService.createPropertyBag();\r\n\t\t\tif (response != null) {\r\n\t\t\t\tvar config;\r\n\t\t\t\tif (response.config) {\r\n\t\t\t\t\tconfig = response.config;\r\n\t\t\t\t\tpropBag.addToBag(\"Status\", response.status);\r\n\t\t\t\t\tpropBag.addToBag(\"StatusText\", response.statusText);\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\tif (response.data && (response.data.indexOf(\"Token renewal\") > -1 || response.data.indexOf(\"Token Renewal\") > -1)) {\r\n\t\t\t\t\t\tconfig = response;\r\n\t\t\t\t\t\tpropBag.addToBag(\"Error-Data\", response.data);\r\n\t\t\t\t\t\tresponse[\"customStatus\"] = response.status || -1;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tif (config && config.url) {\r\n\t\t\t\t\tlogResourceTiming(\"ResourceTimingFailure\", config.url, response.status);\r\n\t\t\t\t\tvar retryForUrlCount = retries[config.url] || 0;\r\n\t\t\t\t\tvar retryEnabled = config.retryEnabled === undefined ? true : config.retryEnabled;\r\n\r\n\t\t\t\t\tpropBag.addToBag(\"ServiceUrl\", config.url);\r\n\r\n\t\t\t\t\tif (retryEnabled && (response.status === -1 || response.customStatus === -1)) {\r\n\t\t\t\t\t\tif (retryForUrlCount < maxRetries) {\r\n\t\t\t\t\t\t\tretryForUrlCount++;\r\n\t\t\t\t\t\t\tretries[config.url] = retryForUrlCount;\r\n\t\t\t\t\t\t\treturn onResponseError(config);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\telse {\r\n\t\t\t\t\t\t\tspecificError = 'ServiceCallRetryExit';\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tspecificError = 'ServiceCallFailed';\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tdelete retries[config.url];\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\tspecificError = 'response was not appropriate.';\r\n\t\t\t\t\tpropBag.addToBag('Message', `responseError function does not return response as object, response value: \" ${CommonUtils.objectToString(response)}`);\r\n\t\t\t\t\tpropBag.addToBag(\"ServiceUrl\", requestURL);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\tspecificError = 'response is null.';\r\n\t\t\t\tpropBag.addToBag('Message', `responseError function does not return response`);\r\n\t\t\t\tpropBag.addToBag(\"ServiceUrl\", requestURL);\r\n\t\t\t}\r\n\t\t\tlet statusCode = (response.status) ? response.status.toString() : '0';\r\n\t\t\tif (excludedHttpStatusCodesForLogging.indexOf(statusCode) === -1) {\r\n\t\t\t\tlet message: string = `Error in Fxp Http Interceptor due to ${specificError}.`;\r\n\t\t\t\tif (statusCode === \"-1\" || statusCode == \"0\") {\t// CORS error or server was unreachable\r\n\t\t\t\t\tmessage.concat(\"The request was either aborted or the server was unreachable. Please check your CORS configuration and firewall settings on the server.\");\r\n\t\t\t\t}\r\n\t\t\t\tconst responseData = JSON.parse(JSON.stringify(response));\r\n\t\t\t\tif(responseData?.config && responseData?.config?.headers && responseData?.config?.headers?.Authorization){\r\n\t\t\t\t\tresponseData.config.headers.Authorization = \"REDACTED\";\r\n\t\t\t\t}\r\n\t\t\t\tloggerService.logError(`${HttpInterceptorTelemetrySource}.HttpRetryInterceptor`, message, ErrorCodes.HttpInterceptorResponseError, CommonUtils.objectToString(responseData), propBag, null, null, ErrorSeverityLevel.High);\r\n\t\t\t}\r\n\t\t\treturn $q.reject(response);\r\n\t\t}\r\n\t};\r\n\r\n\tfunction logPerfMetric(url: string, value: number) {\r\n\t\tif (url.indexOf('html') > 0 && value == 0) return; //value 0 means it is coming from template cache. \r\n\t\tconst properties = loggerService.createPropertyBag();\r\n\t\tsetTimeout(function () {\r\n\t\t\tif (!isNaN(value)) {\r\n\t\t\t\tvalue = parseFloat((value / 1000).toFixed(1));\r\n\t\t\t\tproperties.addToBag(\"Unit\", \"Seconds\");\r\n\t\t\t}\r\n\t\t\tloggerService.logMetric(`${HttpInterceptorTelemetrySource}.HttpInterceptor`, url, value, properties);\r\n\t\t}, 0);\r\n\t}\r\n\r\n\tfunction logResourceTiming(message, url, status) {\r\n\t\tif (fxpConfigurationService.FxpAppSettings.EnableHttpTransactionTimeLogging) {\r\n\t\t\tvar resourcePerf: any = window.performance.getEntries().filter(function getFilteredRecords(event) { return event.name.indexOf(url) > -1 });\r\n\t\t\tfor (var i = 0; i < resourcePerf.length; i++) {\r\n\t\t\t\tvar dns = resourcePerf[i].domainLookupEnd - resourcePerf[i].domainLookupStart,//capture domain lookup start\r\n\t\t\t\t\ttcp = resourcePerf[i].connectEnd - resourcePerf[i].connectStart,// TCP handshake\r\n\t\t\t\t\tttfb = resourcePerf[i].responseStart - resourcePerf[i].startTime,//time to take first byte\r\n\t\t\t\t\ttransfer = resourcePerf[i].responseEnd - resourcePerf[i].responseStart,\r\n\t\t\t\t\ttotal = resourcePerf[i].responseEnd - resourcePerf[i].startTime;// total time taken\r\n\t\t\t\tif (total > 0 && ttfb > 0) {\r\n\t\t\t\t\tvar propBag = loggerService.createPropertyBag();\r\n\t\t\t\t\tpropBag.addToBag(\"ResourceName\", url);\r\n\t\t\t\t\tpropBag.addToBag(\"Status\", status);\r\n\t\t\t\t\tpropBag.addToBag(\"DNS\", dns.toString());\r\n\t\t\t\t\tpropBag.addToBag(\"TCP\", tcp.toString());\r\n\t\t\t\t\tpropBag.addToBag(\"TTFB\", ttfb.toString());\r\n\t\t\t\t\tpropBag.addToBag(\"Transfer\", transfer.toString());\r\n\t\t\t\t\tpropBag.addToBag(\"Total\", total.toString());\r\n\t\t\t\t\tloggerService.logEvent(`${HttpInterceptorTelemetrySource}`, message, propBag);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n\r\nexport function MsalHttpRequestInterceptor($q: angular.IQService, msalAuthenticationService: MsalAuthenticationService) {\r\n\treturn {\r\n\t\trequest: async function (config) {\r\n\t\t\tvar token = (await msalAuthenticationService.acquireTokenAsPromise(config.url)).accessToken;\r\n\t\t\tif (token) { config.headers.Authorization = \"Bearer \" + token; }\r\n\t\t\treturn config;\r\n\t\t},\r\n\t\trequestError: function (rejection) {\r\n\t\t\treturn $q.reject(rejection);\r\n\t\t},\r\n\t\tresponse: function (result) {\r\n\t\t\treturn result;\r\n\t\t},\r\n\t\tresponseError: function (response) {\r\n\t\t\treturn $q.reject(response);\r\n\t\t}\r\n\t};\r\n}\r\n","import { FxpPartnerHttpInterceptorHooks } from \"../services/FxpPartnerHttpInterceptorHooks\";\r\n\r\n\r\n/**\r\n\t * Interceptor provided by fxp team, to invoke all the partner registered interceptors for their http requests .Done sequentially\r\n\t */\r\nexport function FxpPartnerHttpRequestInterceptor($q: angular.IQService,fxpPartnerHttpInterceptorHooks: FxpPartnerHttpInterceptorHooks) {\r\n\t\tvar requestInterceptors = fxpPartnerHttpInterceptorHooks.getRegisteredInterceptorHooks();\r\n\t\tvar fxpPartnerRequestInterceptor = {\r\n\t\t\trequest: function(config) {\r\n\t\t\t\tif (requestInterceptors == []){\r\n\t\t\t\t\treturn config;\r\n\t\t\t\t}\r\n\t\t\t\trequestInterceptors.forEach(interceptor => {\r\n\t\t\t\t\tif (interceptor.request){\r\n\r\n\t\t\t\t\t\tlet updatedConfig = interceptor.request(config);\r\n\t\t\t\t\t\tif (updatedConfig){\r\n\t\t\t\t\t\t\tconfig = updatedConfig;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\t\t\t\r\n\t\t\t\t \t\r\n\t\t\t\t});\r\n\t\t\t\treturn config;\r\n\t\t\t},\r\n\t\t\trequestError: function(rejection) {\r\n\t\t\t\t// do something on error\r\n\t\t\t\trequestInterceptors.forEach(interceptor => {\t\r\n\t\t\t\t\tif (interceptor.requestError){\r\n\t\t\t\t\t\tinterceptor.requestError(rejection);\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t}\t\t\r\n\t\t\t\t\t\r\n\t\t\t });\r\n\t\t\t\treturn $q.reject(rejection);\r\n\t\t\t},\r\n\t\t\tresponse: function(response) {\r\n\t\t\t\t// do something on success\r\n\t\t\t\trequestInterceptors.forEach(interceptor => {\t\r\n\t\t\t\t\tif (interceptor.response){\r\n\t\t\t\t\t\tinterceptor.response(response);\r\n\t\t\t\t\t}\t\t\r\n\t\t\t\t});\t\t\r\n\t\t\t\treturn response;\r\n\t\t\t},\r\n\t\t\tresponseError: function(rejection) {\r\n\t\t\t\t// do something on error\r\n\t\t\t\trequestInterceptors.forEach(interceptor => {\t\r\n\t\t\t\t\tif (interceptor.responseError){\r\n\t\t\t\t\t\tinterceptor.responseError(rejection);\r\n\t\t\t\t\t}\t\t\r\n\t\t\t\t});\t\r\n\r\n\t\t\t\treturn $q.reject(rejection);\r\n\t\t\t}\r\n\t\t};\r\n\treturn fxpPartnerRequestInterceptor;\r\n}\r\n\r\n\r\n","import { FxpFeedbackService } from \"../services/FxpFeedbackService\";\r\nimport { CommonUtils } from \"../utils/CommonUtils\";\r\nimport { FxpBroadcastedEvents } from \"../services/FxpBroadcastedEvents\";\r\nimport { IFxPService } from \"../interfaces/IFxpService\";\r\n\r\n\r\n/**\r\n * @application Fxp\r\n */\r\n\r\n/**\r\n * A main factory which acts as an helper for AppController. This is the factory having common functionalities.\r\n * @class Fxp.Factory.FxpUIData\r\n * @classdesc An factory to get and set main header text\r\n * @example \r\n * //How To use this factory\r\n * angular.module('FxPApp').controller('AppController', ['FxpUIData', FxpUIData]);\r\n * function AppController(AnyDependency){ FxpUIData.getHeaderText(); }\r\n */\r\nexport class FxpUIData implements IFxPService{\r\n\tprivate headerText: string;\r\n\tprivate pageTitle: string;\r\n\tprivate $rootScope: angular.IRootScopeService;\r\n\tprivate fxpFeedbackService: FxpFeedbackService;\r\n\tconstructor($rootScope: angular.IRootScopeService, fxpFeedbackService: FxpFeedbackService) {\r\n\t\tthis.$rootScope = $rootScope;\r\n\t\tthis.fxpFeedbackService = fxpFeedbackService;\r\n\t\tthis.headerText = \"\";\r\n\t\tthis.pageTitle = \"\";\r\n\t}\r\n\r\n\t/**\r\n\t* @method Fxp.Factory.FxpUIData.getHeaderText()\r\n\t* @example Example to use getHeaderText\r\n\t* FxpUIData.getHeaderText();\r\n\t*/\r\n\tpublic getHeaderText() {\r\n\t\treturn this.headerText;\r\n\t}\r\n\r\n\t/**\r\n\t* A method to set the header text.\r\n\t* @method Fxp.Factory.FxpUIData.setHeaderText(\"Professional Services\")\r\n\t* @param {string} headerText Header Text\r\n\t* @example Example to use setHeaderText\r\n\t* FxpUIData.setHeaderText(\"Professional Services\");\r\n\t*/\r\n\tpublic setHeaderText(headerText: string) {\r\n\t\tthis.headerText = headerText;\r\n\t\tthis.$rootScope.$broadcast(FxpBroadcastedEvents.OnAppHeaderChanged, headerText);\r\n\t}\r\n\r\n\t/**\r\n\t* A method to get the Page Title.\r\n\t* @method Fxp.Factory.FxpUIData.getPageTitle()\r\n\t* @example Example to use getPageTitle\r\n\t* FxpUIData.getPageTitle();\r\n\t*/\r\n\tpublic getPageTitle() {\r\n\t\treturn this.pageTitle;\r\n\t}\r\n\r\n\t/**\r\n\t* A method to set the Page Title.\r\n\t* @method Fxp.Factory.FxpUIData.setPageTitle(\"Professional Services\")\r\n\t* @param {string} pageTitle Page Title\r\n\t* @example Example to use setPageTitle\r\n\t* FxpUIData.setPageTitle(\"Professional Services\");\r\n\t*/\r\n\tpublic setPageTitle(pageTitle: string) {\r\n\t\tthis.pageTitle = pageTitle;\r\n\t\tthis.$rootScope.$broadcast(FxpBroadcastedEvents.OnPageTitleChanged, pageTitle);\r\n\t}\r\n\r\n\t/**\r\n\t* A method to set the Page Title RouteChangeSuccess Event.\r\n\t* @method Fxp.Factory.FxpUIData.setpageTitleFromRoute()\r\n\t* @param {any} toState object from ui router\r\n\t* @example Example to use setpageTitleFromRoute\r\n\t* FxpUIData.setpageTitleFromRoute();\r\n\t*/\r\n\tpublic setPageTitleFromRoute(toState) {\r\n\t\tvar self = this;\r\n\t\tself.fxpFeedbackService.setScreenRoute(toState.name);\r\n\t\tvar pageTitle = toState.data.pageTitle;\r\n\t\tif (CommonUtils.isNullOrEmpty(pageTitle)) {\r\n\t\t\tconsole.error(\"Page title is not set for \" + toState.name + \" state\");\r\n\t\t\tpageTitle = \"\";\r\n\t\t}\r\n\t\tself.fxpFeedbackService.setBrowserTitle(pageTitle);\r\n\t\tself.setPageTitle(pageTitle);\r\n\t}\r\n\r\n\t/**\r\n\t A method to set the AppHeader RouteChangeSuccess Event.\r\n\t* @method Fxp.Factory.FxpUIData.seAppHeaderFromRoute()\r\n\t* @param {any} toState object from ui router\r\n\t* @example Example to use setAppHeaderFromRoute\r\n\t* FxpUIData.setAppHeaderFromRoute();\r\n\t*/\r\n\tpublic setAppHeaderFromRoute(toState) {\r\n\t\tvar self = this;\r\n\t\tvar headerName = toState.data.headerName;\r\n\t\tif (CommonUtils.isNullOrEmpty(headerName)) {\r\n\t\t\tconsole.error(\"Appheader is not set for \" + toState.name + \" state\");\r\n\t\t\theaderName = \"\";\r\n\t\t}\r\n\t\tself.setHeaderText(headerName);\r\n\t}\r\n\r\n\tstatic getUIDataFactoryObj($rootScope, fxpFeedbackService) {\r\n\t\treturn new FxpUIData($rootScope, fxpFeedbackService);\r\n\t}\r\n}","import { FxpConfigurationService } from \"../services/FxpConfiguration\";\r\nimport { ILogger } from \"../interfaces/ILogger\";\r\nimport { SessionTimeoutModalConstant } from \"../constants/SessionTimeoutModal.constants\";\r\nimport { FxpConstants } from \"../common/ApplicationConstants\";\r\nimport { FxpBroadcastedEvents } from \"../services/FxpBroadcastedEvents\";\r\nimport { IRootScope } from \"../interfaces/IRootScope\";\r\nimport { TelemetryConstants } from \"../telemetry/TelemetryConst\";\r\n\r\n/**\r\n * @application Fxp\r\n */\r\n/**\r\n * @module Fxp.Services\r\n */\r\n\r\n\r\n/**\r\n * A facroey to display Modal\r\n * @class FxpModalService\r\n * @classdesc A service to display popup modal\r\n * @example Example to create an instance of sessionTimeoutmodalfactory\r\n * //Initializing sessionTimeOutModalFactory\r\n * angular.module('FxPApp').controller('AppController', ['SessionTimeoutModalFactory', AppController]);\r\n * function AppController(fxpModalService, fxpConstants){ SessionTimeoutModalFactory.showSessionTimeoutModal(); }\r\n */\r\nexport class SessionTimeoutModalFactory {\r\n\r\n\tconstructor(\r\n\t\tprivate $uibModal: any,\r\n\t\tprivate fxpConfigurationService: FxpConfigurationService,\r\n\r\n\t\tprivate fxplogger: ILogger,\r\n\t\tprivate SessionTimeoutModalConstant: SessionTimeoutModalConstant,\r\n\t\tprivate ActivityMonitor: any,\r\n\t\tprivate $rootScope: IRootScope) {\r\n\t\t\r\n\t}\r\n\r\n\t/**\r\n * Method to show SessionTimeOut Modal.\r\n * @method Fxp.Factory.SessionTimeoutModalFactory.showSessionTimeoutModal\r\n * @example Example to use showSessionTimeoutModal\r\n * sessionTimeoutModalFactory.showSessionTimeoutModal();\r\n */\r\n\r\n\tshowSessionTimeoutModal() {\r\n\r\n\t\tlet self = this;\r\n\t\tlet options = SessionTimeoutModalConstant.options;\r\n\t\tself.$uibModal.open(options);\r\n\r\n\r\n\t}\r\n\r\n\tinit() {\r\n\t\tlet self = this;\r\n\t\tself.ActivityMonitor.options.inactive = this.fxpConfigurationService.FxpAppSettings.SessionTimeoutDurationInSeconds;\r\n\t\tself.ActivityMonitor.on('inactive', function () {\r\n\t\t\tself.fxplogger.logEvent(`${TelemetryConstants.FXP_TELEMETRY_BASE_NAME}.SessionTimeoutModalFactory.init`, `${TelemetryConstants.FXP_TELEMETRY_BASE_NAME}.SessionTimedOut`);\r\n\r\n\t\t\tsessionStorage.clear();\r\n\r\n\t\t\tself.showSessionTimeoutModal();\r\n\t\t\tself.$rootScope.$broadcast(FxpBroadcastedEvents.OnUserSessionTimeout);\r\n\t\t});\r\n\r\n\t}\r\n\r\n\tstatic getUIDataFactoryObj($uibModal: any,\r\n\t\tfxpConfigurationService: FxpConfigurationService,\r\n\r\n\t\tfxpLoggerService: ILogger,\r\n\t\tSessionTimeoutModalConstant: SessionTimeoutModalConstant,\r\n\t\tActivityMonitor: any,\r\n\t\t$rootScope: IRootScope) {\r\n\t\treturn new SessionTimeoutModalFactory($uibModal, fxpConfigurationService, fxpLoggerService, SessionTimeoutModalConstant, ActivityMonitor, $rootScope);\r\n\t}\r\n}\r\n","/*\r\nunCamelCase converts camelCase string to spaced sring\r\neg. thisIsASentence -> This Is A Sentence\r\n\r\nusage\r\n \r\n \r\n*/\r\n\r\nexport class UnCamelCase {\r\n\tpublic static getSpacedString() {\r\n\t\treturn function (str = \"\") {\r\n\t\t\tlet upperOrLowerCaseRegex = /([a-z])([A-Z])/g;\r\n\t\t\tlet nextWord = /\\b([A-Z]+)([A-Z])([a-z])/;\r\n\t\t\t/*\r\n\t\t\t\t1) insert a space between lower & upper\r\n\t\t\t\t2) insert space before last upper in a sequence followed by lower\r\n\t\t\t\t\t(this is to catch cases when we have multiple upper case in a sequence like FXPUi to FXP Ui)\r\n\t\t\t\t3) uppercase the first character\r\n\t\t\t*/\r\n\t\t\treturn str.replace(upperOrLowerCaseRegex, '$1 $2').replace(nextWord, '$1 $2$3').replace(/^./, function (str) { return str.toUpperCase(); })\r\n\t\t}\r\n\t}\r\n}\r\n\r\n\r\n","import { FxpResponseCallback, FxpRequestMessage, FxpServiceFuncRequest, RequestMessageType, FxpMessageEvent } from \"./iframeAppSdkInferfaces\";\r\n\r\n\r\n\r\nexport class FxpIframeClient {\r\n\tprivate callbackMap: Object = {};\r\n\tprivate origin: string;\r\n\tprivate source: any;\r\n\tprivate initCallbackId: string = \"init\";\r\n\tprivate initCallback: Function;\r\n\r\n\t/**\r\n\t * Array of trusted origin the sdk can connect with\r\n\t * \r\n\t * @type {Array}\r\n\t * @memberof FxpIframeClient\r\n\t */\r\n\tpublic trustedOrigin: Array = [];\r\n\r\n\r\n\t/**\r\n\t * Creates an instance of FxpIframeClient.\r\n\t * @memberof FxpIframeClient\r\n\t */\r\n\tpublic constructor() {\r\n\t\twindow.addEventListener(\"message\", this.receivedMessageHandler.bind(this), false);\r\n\t\tthis.callbackMap[this.initCallbackId] = this.sendInitAck;\r\n\t}\r\n\r\n\t/**\r\n\t * Calls an angular function inside Fxp context\r\n\t * \r\n\t * @param {FxpResponseCallback} callback \r\n\t * @param {string} serviceName \r\n\t * @param {string} serviceFuncName \r\n\t * @param {...any[]} params \r\n\t * @memberof FxpIframeClient\r\n\t */\r\n\tpublic callNgServiceFunc(callback: FxpResponseCallback, serviceName: string,\r\n\t\tserviceFuncName: string, ...params: any[]) {\r\n\r\n\t\tif (!this.origin)\r\n\t\t\tthrow new Error(\"Origin is not defined\");\r\n\t\tvar callbackId = this.getUniqueId();\r\n\t\tthis.callbackMap[callbackId] = callback;\r\n\r\n\t\tvar fxpRequestMessage: FxpRequestMessage = {\r\n\t\t\ttype: RequestMessageType.ServiceFuncRequest,\r\n\t\t\tdata: {\r\n\t\t\t\tserviceName: serviceName,\r\n\t\t\t\tserviceFuncName: serviceFuncName,\r\n\t\t\t\tparams: params\r\n\t\t\t},\r\n\t\t\tcallbackId: callbackId\r\n\t\t};\r\n\r\n\t\tthis.sendMessage(fxpRequestMessage);\r\n\t}\r\n\r\n\t/**\r\n\t * Sets the callback to be called when fxpsdk is initialised\r\n\t * \r\n\t * @param {Function} callback \r\n\t * @memberof FxpIframeClient\r\n\t */\r\n\tpublic onInit(callback: Function) {\r\n\t\tthis.initCallback = callback;\r\n\t}\r\n\r\n\tprivate sendInitAck = () => {\r\n\t\tthis.sendMessage({ type: RequestMessageType.InitAckRequest });\r\n\t\tif (this.initCallback)\r\n\t\t\tthis.initCallback();\r\n\t}\r\n\r\n\t/**\r\n\t * Returns whether client is connected to fxp or not\r\n\t * \r\n\t * @returns {boolean} \r\n\t * @memberof FxpIframeClient\r\n\t */\r\n\tpublic isConnected(): boolean {\r\n\t\treturn (this.trustedOrigin.indexOf(this.origin) > -1);\r\n\t}\r\n\r\n\tprivate receivedMessageHandler(event: FxpMessageEvent) {\r\n\t\tif (this.trustedOrigin.indexOf(event.origin) > -1) {\r\n\t\t\tthis.origin = event.origin;\r\n\t\t\tthis.source = event.source;\r\n\t\t\tvar callbackId = event.data.callbackId;\r\n\t\t\tif (callbackId && this.callbackMap[callbackId]) {\r\n\t\t\t\tthis.callbackMap[callbackId](event.data.error, event.data.response, event.data.contextInfo);\r\n\t\t\t\tdelete this.callbackMap[callbackId];\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n\tprivate sendMessage(message: FxpRequestMessage) {\r\n\t\tthis.source.postMessage(message, this.origin);\r\n\t}\r\n\r\n\tprivate getUniqueId() {\r\n\t\tvar ALPHABET = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';\r\n\t\tlet ID_LENGTH = 8\r\n\t\tlet rtn = '';\r\n\t\twhile (rtn === '' || this.callbackMap[rtn]) {\r\n\t\t\tfor (let i = 0; i < ID_LENGTH; i++) {\r\n\t\t\t\trtn += ALPHABET.charAt(Math.floor(Math.random() * ALPHABET.length));\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn rtn;\r\n\t}\r\n\r\n}","\r\nexport interface FxpMessageEvent extends MessageEvent {\r\n\tdata: FxpResponseEventData\r\n}\r\n\r\nexport interface FxpResponseEventData {\r\n\tresponse?: any;\r\n\terror?: any;\r\n\tcallbackId: string;\r\n\tcontextInfo?: FxpContextInfo\r\n}\r\nexport enum RequestMessageType {\r\n\tServiceFuncRequest = \"ServiceFuncRequest\",\r\n\tInitAckRequest = \"InitAckRequest\",\r\n}\r\nexport interface FxpServiceFuncRequest {\r\n\tserviceName: string;\r\n\tserviceFuncName: string;\r\n\tparams: Array;\r\n}\r\nexport interface FxpRequestMessage {\r\n\ttype: RequestMessageType,\r\n\tdata?: T,\r\n\tcallbackId?: string\r\n}\r\n\r\nexport interface FxpContextInfo {\r\n\tcorrelationId: string\r\n}\r\n\r\nexport interface FxpResponseCallback {\r\n\t(error: any, response: any, contextInfo: FxpContextInfo): void\r\n}","\r\nexport class IframeAppMessage {\r\n\tpublic static FailedToLoadMessage = `We are facing issues loading {0}\\nPlease visit [{1}]({1}) and try refreshing this page`\r\n}\r\n\r\nexport enum IframeAppRequestType {\r\n\tInitAckRequest = \"InitAckRequest\",\r\n\tServiceFuncRequest = \"ServiceFuncRequest\"\r\n\r\n}","import { FxpUIData } from \"../factory/FxpUIDataFactory\";\r\nimport { FxpGlobalStoreService } from \"../services/fxp.global.store.service\";\r\nimport { FxpMessageService } from \"../../app/banner/FxpMessageService\";\r\nimport { IframeAppRequestType, IframeAppMessage } from \"./iframeAppConstants\";\r\nimport { CommonUtils } from \"../utils/CommonUtils\";\r\nimport { IframeBridgeService } from \"./iframeBridgeService\";\r\nimport { FxpResponseEventData, FxpRequestMessage, FxpContextInfo, FxpServiceFuncRequest } from \"../iframeAppSDK/iframeAppSdkInferfaces\";\r\nimport { HideLoader, ShowLoader } from \"../../app/loader/loader.actions\";\r\n\r\nexport interface IframeAppCtrlScope extends angular.IScope {\r\n\tiframeAppTitle: string;\r\n\tiframeAppUrl: string;\r\n}\r\nexport class IframeAppController {\r\n\tprivate iframeElement = (document.getElementById(\"externalIframe\") as HTMLIFrameElement);\r\n\tprivate iframeWindow = this.iframeElement.contentWindow;\r\n\tprivate initSuccess: boolean = false;\r\n\r\n\tstatic $inject = ['$scope', 'IframeBridgeService', 'FxpUIData', '$location', '$stateParams', 'FxpGlobalStoreService', 'FxpMessageService'];\r\n\tpublic constructor(private $scope: IframeAppCtrlScope,\r\n\t\tprivate IframeBridgeService: IframeBridgeService,\r\n\t\tprivate fxpUIData: FxpUIData,\r\n\t\tprivate $location: angular.ILocationService,\r\n\t\tprivate $stateParams: any,\r\n\t\tprivate fxpGlobalStoreService: FxpGlobalStoreService,\r\n\t\tprivate fxpMessageService: FxpMessageService) {\r\n\r\n\t\tvar self = this;\r\n\t\t$scope.iframeAppTitle = fxpUIData.getHeaderText();\r\n\r\n\t\t//get pathUrl by removing app prefix from url\r\n\t\tvar pathUrl = $location.url().replace(/^\\/[a-zA-Z0-9]+/, '');\r\n\t\t$scope.iframeAppUrl = $stateParams.baseUrl + pathUrl;\r\n\r\n\t\twindow.addEventListener(\"message\", this.iframeMessageEventHandler, false);\r\n\t\tangular.element('#externalIframe').on('load', function () {\r\n\t\t\tself.fxpGlobalStoreService.DispatchGlobalAction(\"Platform\", HideLoader({}));\r\n\t\t\tself.sendMessage({ callbackId: \"init\" });\r\n\t\t\tsetTimeout(function () {\r\n\t\t\t\tself.checkInitSuccess();\r\n\t\t\t}, 3000);\r\n\t\t});\r\n\r\n\t\tself.fxpGlobalStoreService.DispatchGlobalAction(\"Platform\", ShowLoader({loadingText: \"Loading \" + this.$scope.iframeAppTitle}));\r\n\t}\r\n\r\n\tprivate sendMessage(message: FxpResponseEventData) {\r\n\t\tmessage.contextInfo = this.getContextInfo();\r\n\r\n\t\tthis.iframeWindow.postMessage(this.getClonableMessage(message), this.$scope.iframeAppUrl);\r\n\t}\r\n\r\n\tprivate iframeMessageEventHandler = (event: MessageEvent) => {\r\n\t\tif (this.$scope.iframeAppUrl.indexOf(event.origin) == 0) {\r\n\t\t\ttry {\r\n\t\t\t\tvar self = this;\r\n\t\t\t\tvar data = event.data as FxpRequestMessage;\r\n\t\t\t\tswitch (data.type as string) {\r\n\t\t\t\t\tcase IframeAppRequestType.InitAckRequest:\r\n\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\tself.handleInitAck();\r\n\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\tcase IframeAppRequestType.ServiceFuncRequest:\r\n\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\tself.handleServiceFuncRequest(data);\r\n\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\t\t\tcatch (error) {\r\n\r\n\t\t\t\tself.sendMessage({ error: error, callbackId: data.callbackId });\r\n\t\t\t}\r\n\r\n\t\t}\r\n\t}\r\n\r\n\tprivate handleServiceFuncRequest(message: FxpRequestMessage) {\r\n\t\tvar self = this;\r\n\t\tvar data = message.data as FxpServiceFuncRequest;\r\n\t\tvar result = this.IframeBridgeService.callNgServiceFunc(data.serviceName,\r\n\t\t\tdata.serviceFuncName, data.params);\r\n\r\n\t\tif (result && result.then) //Handling promises\r\n\t\t{\r\n\t\t\tresult.then(function success(response) {\r\n\t\t\t\tself.sendMessage({ response: response, callbackId: message.callbackId });\r\n\t\t\t},\r\n\t\t\t\tfunction fail(err) {\r\n\t\t\t\t\tself.sendMessage({ error: err, callbackId: message.callbackId });\r\n\t\t\t\t});\r\n\t\t}\r\n\t\telse\r\n\t\t\tself.sendMessage({ response: result, callbackId: message.callbackId });\r\n\t}\r\n\r\n\tprivate handleInitAck() {\r\n\t\tthis.initSuccess = true;\r\n\t}\r\n\r\n\tprivate checkInitSuccess() {\r\n\t\tif (!this.initSuccess) {\r\n\t\t\tvar errorMessage = CommonUtils.stringFormat(IframeAppMessage.FailedToLoadMessage,\r\n\t\t\t\tthis.$scope.iframeAppTitle, this.$scope.iframeAppUrl);\r\n\t\t\tthis.fxpMessageService.addMessage(errorMessage, \"error\", true);\r\n\t\t}\r\n\t}\r\n\r\n\tprivate getClonableMessage(message: FxpResponseEventData) {\r\n\t\tvar clonableMessage = {};\r\n\t\tObject.getOwnPropertyNames(message).forEach((key) => {\r\n\t\t\tclonableMessage[key] = this.getObjectClone(message[key]);\r\n\t\t});\r\n\t\treturn clonableMessage;\r\n\t}\r\n\r\n\tprivate getObjectClone(obj) {\r\n\t\tif (!CommonUtils.isObject(obj) && !(obj instanceof Error)) return obj;\r\n\t\tvar objClone = {}\r\n\t\t//converting all getters to properties\r\n\t\tObject.getOwnPropertyNames(obj).forEach(function (key) {\r\n\t\t\tobjClone[key] = obj[key];\r\n\t\t});\r\n\t\t//removing functions from object\r\n\t\treturn JSON.parse(JSON.stringify(objClone));\r\n\t}\r\n\r\n\tprivate getContextInfo(): FxpContextInfo {\r\n\t\treturn {\r\n\t\t\tcorrelationId: $.correlator.getCorrelationId()\r\n\t\t}\r\n\t}\r\n}\r\n\r\n export var NonFxpApp: string = \"NonFxpApp\";\r\n\r\nangular.module(NonFxpApp, [])\r\n\t .controller(\"IframeAppController\", IframeAppController);\r\n\r\n\r\n\r\n\r\n","\r\nexport class IframeBridgeService {\r\n\r\n\tstatic $inject = [\"$injector\"]\r\n\tpublic constructor(private $injector: angular.auto.IInjectorService) {\r\n\r\n\t}\r\n\r\n\tpublic callNgServiceFunc(serviceName: string, serviceFuncName: string, params: Array) {\r\n\t\tif (this.$injector.has(serviceName)) {\r\n\t\t\tvar service = this.$injector.get(serviceName);\r\n\t\t\tif (service[serviceFuncName])\r\n\t\t\t\treturn service[serviceFuncName].apply(service, params);\r\n\t\t\telse throw new Error(`Invalid function name: ${serviceFuncName}`);\r\n\t\t}\r\n\t\telse throw new Error(`Invalid service name: ${serviceName}`);\r\n\t}\r\n}\r\nangular.module(\"NonFxpApp\")\r\n\t.service(\"IframeBridgeService\", IframeBridgeService)","// For Backward compatibility\r\nimport { BusinessProcessEvent as businessProcessEvent } from './telemetry/BusinessProcessEvent';\r\nimport { FeatureUsageEvent as featureUsageEvent } from './telemetry/FeatureUsageEvent';\r\nimport { SystemEvent as systemEvent } from './telemetry/SystemEvent';\r\nimport { ComponentType as componentType } from './telemetry/ComponentType';\r\nimport { EnvironmentData as environmentData } from './telemetry/EnvironmentData';\r\nimport { EventData as eventData } from './telemetry/EventData';\r\nimport { EventTypes as eventTypes } from './telemetry/EventTypes';\r\nimport { ErrorSeverityLevel as errorSeverityLevel} from './telemetry/ErrorSeverityLevel';\r\nimport { FxpLoggerService as fxpLoggerService } from './telemetry/FxpLogger';\r\nimport { FxpLoggerServiceExtension as fxpLoggerServiceExtension } from './telemetry/FxpLoggerServiceExtension';\r\nimport { LogPropertyBag as logPropertyBag } from './telemetry/LogPropertyBag';\r\nimport { TelemetryConfiguration as telemetryConfiguration } from './telemetry/TelemetryConfiguration';\r\nimport { UserInfo as telemetryUserInfo } from './telemetry/UserInfo';\r\nimport { FxpLogHelper as fxpLogHelper } from './telemetry/FxpLogHelper';\r\nimport { LogMetricBag as logMetricBag } from './telemetry/LogMetricBag';\r\nimport { TelemetryData as telemetryData } from './telemetry/TelemetryData';\r\nimport { TelemetryContext as telemetryContext } from './telemetry/telemetrycontext';\r\nimport { DashBoardHelper as dashBoardHelper } from './factory/DashBoardHelper';\r\nimport { FxpIrisBotService as fxpIrisBotService } from './services/FxpIrisBotService';\r\nimport { FxpOCVFeedbackService as fxpOCVFeedbackService } from './services/FxpOCVFeedbackService';\r\nimport { httpCorrelationInterceptor as httpCorrelationInterceptorAlias, httpRetryInterceptor as httpRetryInterceptorAlias } from './factory/FxpHttpInterceptorFactory';\r\nimport { AdminLandingDirective as adminLandingDirective } from './directives/adminLanding.directive';\r\nimport { AppDirectives } from './directives/AppDirectives';\r\nimport { AuthorNotificationContentDirective } from './directives/fxpAuthorNotification.directive';\r\nimport { FxpAuthorNotificationListDirective } from './directives/fxpAuthorNotificationList.directives';\r\nimport { FxpIncludeStaticTemplate as fxpIncludeStaticTemplate } from './directives/fxpIncludeStaticTemplate';\r\nimport { SkipToMainContent as skipToMainContent } from './directives/fxpSkipToMainContent.directive';\r\nimport { HelpArticleImageController as helpArticleImageController } from './controllers/HelpArticleImageController';\r\nimport { FxpGlobalStoreService as fxpGlobalStoreService } from './services/fxp.global.store.service';\r\nimport { FxpTelemGuid as fxpTelemGuid } from './telemetry/FxpTelemGuid';\r\n\r\nimport {\r\n TelemetryConstants as telemetryConstants,\r\n TelemetryEventType as telemetryEventType,\r\n TelemetryConfigDefaults as telemetryConfigDefaults,\r\n TracingLevel as tracingLevel,\r\n PouchSyncMode as pouchSyncMode,\r\n DiagnosticLevel as diagnosticLevel,\r\n EventDataProperties as eventDataProperties,\r\n EnvironmentData as environmentData_Telemetry,\r\n RoleGroupDetails as roleGroupDetails,\r\n TenantDetails as tenantDetails\r\n} from './telemetry/TelemetryConst';\r\n\r\nimport {\r\n CustomEvents as customEvent,\r\n ApplicationConstants as applicationConstants,\r\n FxpConstants as fxpContants,\r\n PerfMarkers as perfMarkers,\r\n RoleGroupInfo as roleGroupInfo,\r\n TenantInfo as tenantInfo\r\n} from './common/ApplicationConstants';\r\n\r\nimport { FxpBroadcastedEvents as fxpBroadcastedEvents } from './services/FxpBroadcastedEvents';\r\nimport { ITelemetryContextListener as iTelemetryContextListener } from './interfaces/ITelemetryContextListener';\r\nimport { FxpBaseController as fxpBaseController } from './common/FxpBaseController';\r\nimport { FxpWorkerActions as fxpWorkerActions } from './common/FxpWorkerActions';\r\nimport { NotificationAPI as notificationAPI } from './common/NotificationAPI';\r\nimport { PouchDbConnection as pouchDbConnection } from './common/PouchDbConnection';\r\nimport { PouchDBProvider as pouchDBProvider } from './common/PouchDBProvider';\r\nimport { PouchDbService as pouchDbService } from './common/PouchDbService';\r\nimport { SettingsType as settingsType } from './common/SettingsType';\r\nimport { Environment as environment } from './common/enum/environment.enum';\r\nimport { HomeLocation as homeLocation, WorkLocation as workLocation, UserInfo as userInfo } from './common/UserInfo';\r\nimport { AuthorNotificationConstant as authorNotificationConstant } from './constants/AuthorNotification.constants';\r\nimport { CreateAskOpsModalConstant as createAskOpsModalConstant } from './constants/CreateAskOpsRequest.constants';\r\nimport { CreateSupportTicketModalConstant as createTicketModalConstant } from './constants/createSupportTicketRequest.constants';\r\nimport { HelpArticleImageModalConstant as helpArticleImageModalConstant } from './constants/HelpArticle.constants';\r\nimport { SessionTimeoutModalConstant as sessionTimeoutModalConstant } from './constants/SessionTimeoutModal.constants';\r\nimport { FxpModalConstant as fxpModalConstant } from './constants/FxPModal.constants';\r\nimport { SYSTEM_MESSAGE_UI as SYSTEM_MESSAGE_UI_Alias } from './constants/systemMessages.constants';\r\nimport { FxpContext as fxpContext } from './context/FxpContext';\r\nimport { RouteConfig as routeConfig } from './core/RouteConfig';\r\nimport { CommonUtils as commonUtils } from './utils/CommonUtils';\r\nimport { Resiliency as resiliency } from './resiliency/FxpResiliency';\r\nimport { FxpStateTransitionService as fxpStateTransitionService } from './services/FxpStateTransitionService';\r\n// import { MsalAuthenticationService as msalAuthenticationService } from './services/MsalAuthenticationService';\r\nimport { AdalLoginHelperService as adalLoginHelperService } from './services/AdalLoginHelperService';\r\nimport { AdminLandingService as adminLandingService } from '../app/adminTiles/AdminLandingService';\r\nimport { DashboardService as dashboardService } from './services/dashboardService';\r\nimport { DataService as dataService } from './services/DataService';\r\nimport { FxpAuthorizationService as fxpAuthorizationService } from './services/FxpAuthorizationService';\r\nimport { FxpBreadcrumbService as fxpBreadcrumbService } from './services/FxpBreadcrumbService';\r\nimport { FxpConfigurationService as fxpConfigurationService } from './services/FxpConfiguration';\r\nimport { FxpFeedbackService as fxpFeedbackService } from './services/FxpFeedbackService';\r\nimport { FxpMessageService as fxpMessageService } from '../app/banner/FxpMessageService';\r\nimport { FxpRouteService as fxpRouteService } from './services/FxpRouteService';\r\nimport { FxpStorageService as fxpStorageService } from './services/FxpStorageService';\r\nimport { HelpCentralService as helpCentralService } from './services/HelpCentralService';\r\nimport { NotificationActionCenter as notificationActionCenter } from './services/NotificationActionCenter';\r\nimport { NotificationService as notificationService } from './services/NotificationService';\r\nimport { NotificationStore as notificationStore } from './services/NotificationStore';\r\nimport { OBOUserService as oBOUserService } from './services/OBOUserService';\r\nimport { PageLoaderService as pageLoaderService } from '../app/loader/pageLoaderService';\r\nimport { pageTourEventService as pageTourEventServiceAlias } from './services/pageTourEventService';\r\nimport { PersonalizationService as personalizationService } from './services/PersonalizationService';\r\nimport { PlannedDownTimeService as plannedDownTimeService } from '../app/systemMessages/PlannedDownTimeService';\r\nimport { SystemMessagesService as systemMessagesService } from '../app/systemMessages/SystemMessagesService';\r\nimport { TimeZoneHelper as timeZoneHelper } from './services/TimeZoneHelper';\r\nimport { UserInfoService as userInfoService } from './services/UserInfoService';\r\nimport { UserProfileService as userProfileService } from './services/userProfileService';\r\nimport { UserClaimsService as userClaimsService } from './services/UserClaimsService';\r\nimport { FxpProviders as fxpProviders } from './provider/CorrelationProvider';\r\nimport { FxpBotService as fxpBotService, FxpBotServiceProvider as fxpBotServiceProvider } from './provider/FxpBotServiceProvider';\r\nimport { SettingsServiceProvider as settingsServiceProvider } from './provider/SettingsServiceProvider';\r\nimport { FxpUIStateHelperProvider as fxpUIStateHelperProvider } from './provider/UIStateHelperProvider';\r\nimport { AppDirectives as appDirectives } from './directives/AppDirectives';\r\nimport { fxpBreadcrumbLink } from './directives/fxpBreadcrumbLink';\r\nimport { FxpBootstrap as fxpBootstrap } from './boot/fxpboot';\r\nimport { ActOnBehalfOfHelper as actOnBehalfOfHelper } from './factory/ActOnBehalfOfHelper';\r\nimport { AppControllerHelper as appControllerHelper } from './factory/AppControllerHelper';\r\nimport { AuthorNotificationRoleGroupHelper as authorNotificationRoleGroupHelper } from './factory/AuthorNotificationRoleGroupHelper';\r\nimport { FxpUIData as fxpUIData } from './factory/FxpUIDataFactory';\r\nimport { SessionTimeoutModalFactory as sessionTimeoutModalFactory } from './factory/SessionTimeoutModalFactory';\r\nimport { FxpKeyDownDirective as fxpKeyDownDirective } from './directives/fxpKeyDown.derective';\r\nimport { UnCamelCase as unCamelCase } from './filters/unCamelCase.filter';\r\nimport { IframeAppMessage as iframeAppMessage, IframeAppRequestType as iframeAppRequestType } from './iframe_app/iframeAppConstants';\r\nimport { IframeAppController as iframeAppController, IframeAppCtrlScope as iframeAppCtrlScope } from './iframe_app/iframeAppController';\r\nimport { IframeBridgeService as iframeBridgeService } from './iframe_app/iframeBridgeService';\r\nimport {\r\n FxpMessageEvent as fxpMessageEvent,\r\n FxpResponseEventData as fxpResponseEventData,\r\n RequestMessageType as requestMessageType,\r\n FxpServiceFuncRequest as fxpServiceFuncRequest,\r\n FxpRequestMessage as fxpRequestMessage,\r\n FxpContextInfo as fxpContextInfo,\r\n FxpResponseCallback as fxpResponseCallback\r\n} from './iframeAppSDK/iframeAppSdkInferfaces';\r\nimport { FxpIframeClient as fxpIframeClient } from './iframeAppSDK/iframeAppSdk';\r\nimport { FxpComponentRegistrationService as fxpComponentRegistrationService } from './services/FxpComponentRegistrationService';\r\nimport { PartnerAppRegistrationService as partnerAppRegistrationService } from './services/PartnerAppRegistrationService';\r\nimport { FxpEventBroadCastService as fxpEventBroadCastService } from './services/BroadCastingService';\r\nimport { FxpHttpService as fxpHttpService } from './services/FxpHttpService';\r\nimport { ConFitService as confitService } from '@fxp/confitsdk';\r\nimport { FeatureFlagService as featureFlagService } from '@fxp/flightingsdk';\r\nimport { DeviceFactoryProvider as deviceFactoryProvider } from './utils/devicefactoryService';\r\n\r\nimport { FxpPartnerHttpInterceptorHooks as fxpPartnerHttpInterceptorHooks } from './services/FxpPartnerHttpInterceptorHooks';\r\nimport { FxpSignalRService as fxpSignalRService } from './services/FxpSignalRClient';\r\nimport { ComponentFramework as componentFramework } from './common/enum/ComponentFramework';\r\nimport * as TelemetryEnums from './telemetry/FxpTelemEnumExtensions';\r\n\r\nexport module Fxp {\r\n export var Resiliency = resiliency;\r\n export module Telemetry {\r\n export var BusinessProcessEvent = businessProcessEvent;\r\n export var FeatureUsageEvent = featureUsageEvent;\r\n export var SystemEvent = systemEvent;\r\n export var ComponentType = componentType;\r\n export var EnvironmentData = environmentData;\r\n export var EventData = eventData;\r\n export var EventTypes = eventTypes;\r\n export var FxpLoggerService = fxpLoggerService;\r\n export var FxpLoggerServiceExtension = fxpLoggerServiceExtension;\r\n export var TelemetryConfiguration = telemetryConfiguration;\r\n export var UserInfo = telemetryUserInfo;\r\n export var TelemetryContext = telemetryContext;\r\n export var ErrorSeverityLevel = errorSeverityLevel;\r\n export var FxpTelemActionType = TelemetryEnums.FxpTelemActionType;\r\n export var FxpTelemEventName = TelemetryEnums.FxpTelemEventName;\r\n export var FxpTelemActionStatus = TelemetryEnums.FxpTelemActionStatus;\r\n export var FxpTelemGuid = fxpTelemGuid;\r\n\r\n export module Helper {\r\n export var FxpLogHelper = fxpLogHelper;\r\n export var LogPropertyBag = logPropertyBag;\r\n export var LogMetricBag = logMetricBag;\r\n export var TelemetryData = telemetryData;\r\n }\r\n }\r\n export module Common {\r\n export var FxpBaseController = fxpBaseController;\r\n export var PouchDbConnection = pouchDbConnection;\r\n export var PouchDBProvider = pouchDBProvider;\r\n export var PouchDbService = pouchDbService;\r\n export var SettingsType = settingsType;\r\n export var Environment = environment;\r\n export var HomeLocation = homeLocation;\r\n export var WorkLocation = workLocation;\r\n export var UserInfo = userInfo;\r\n export var FxpWorkerActions = fxpWorkerActions;\r\n export var NotificationAPI = notificationAPI;\r\n export var ComponentFramework = componentFramework;\r\n export module Constants {\r\n export var TelemetryConstants = telemetryConstants;\r\n export var TelemetryEventType = telemetryEventType;\r\n export var TelemetryConfigDefaults = telemetryConfigDefaults;\r\n export var TracingLevel = tracingLevel;\r\n export var PouchSyncMode = pouchSyncMode;\r\n export var DiagnosticLevel = diagnosticLevel;\r\n export var EventDataProperties = eventDataProperties;\r\n export var EnvironmentData = environmentData_Telemetry;\r\n export var RoleGroupDetails = roleGroupDetails;\r\n export var TenantDetails = tenantDetails;\r\n export var CustomEvents = customEvent;\r\n export var ApplicationConstants = applicationConstants;\r\n export var FxpConstants = fxpContants;\r\n export var PerfMarkers = perfMarkers;\r\n export var RoleGroupInfo = roleGroupInfo;\r\n export var TenantInfo = tenantInfo;\r\n }\r\n }\r\n export module Constants {\r\n export var AuthorNotificationConstant = authorNotificationConstant;\r\n export var CreateAskOpsModalConstant = createAskOpsModalConstant;\r\n export var CreateTicketModalConstant = createTicketModalConstant;\r\n export var helpArticleImageModalConstant = helpArticleImageModalConstant;\r\n export var SessionTimeoutModalConstant = sessionTimeoutModalConstant;\r\n export var FxpModalConstant = fxpModalConstant;\r\n export var SYSTEM_MESSAGE_UI = SYSTEM_MESSAGE_UI_Alias;\r\n }\r\n\r\n export module Context {\r\n export var FxpContext = fxpContext;\r\n }\r\n\r\n export module Core {\r\n export var RouteConfig = routeConfig;\r\n }\r\n\r\n export module Utils {\r\n export var CommonUtils = commonUtils;\r\n export var DeviceFactoryProvider = deviceFactoryProvider;\r\n export module Services {\r\n export var DataService = dataService;\r\n export var AdalLoginHelperService = adalLoginHelperService;\r\n // export var MsalAuthenticationService = msalAuthenticationService;\r\n }\r\n }\r\n\r\n export module Services {\r\n export var FxpHttpService = fxpHttpService;\r\n export var FxpBroadcastedEvents = fxpBroadcastedEvents;\r\n export var FxpEventBroadCastService = fxpEventBroadCastService;\r\n export var FxpStateTransitionService = fxpStateTransitionService;\r\n export var AdminLandingService = adminLandingService;\r\n export var DashboardService = dashboardService;\r\n export var FxpAuthorizationService = fxpAuthorizationService;\r\n export var FxpBreadcrumbService = fxpBreadcrumbService;\r\n export var FxpConfigurationService = fxpConfigurationService;\r\n export var FxpFeedbackService = fxpFeedbackService;\r\n export var FxpMessageService = fxpMessageService;\r\n export var FxpRouteService = fxpRouteService;\r\n export var FxpStorageService = fxpStorageService;\r\n export var HelpCentralService = helpCentralService;\r\n export var NotificationActionCenter = notificationActionCenter;\r\n export var NotificationService = notificationService;\r\n export var NotificationStore = notificationStore;\r\n export var OBOUserService = oBOUserService;\r\n export var PageLoaderService = pageLoaderService;\r\n export var pageTourEventService = pageTourEventServiceAlias;\r\n export var PersonalizationService = personalizationService;\r\n export var PlannedDownTimeService = plannedDownTimeService;\r\n export var SystemMessagesService = systemMessagesService;\r\n export var TimeZoneHelper = timeZoneHelper;\r\n export var UserInfoService = userInfoService;\r\n export var UserProfileService = userProfileService;\r\n export var UserClaimsService = userClaimsService;\r\n export var FxpBotService = fxpBotService;\r\n export var FxpBotServiceProvider = fxpBotServiceProvider;\r\n export var SettingsServiceProvider = settingsServiceProvider;\r\n export var FxpComponentRegistrationService = fxpComponentRegistrationService;\r\n export var PartnerAppRegistrationService = partnerAppRegistrationService;\r\n export var ConFitService = confitService;\r\n export var FeatureFlagService = featureFlagService;\r\n export var FxpPartnerHttpInterceptorHooks = fxpPartnerHttpInterceptorHooks;\r\n export var FxpGlobalStoreService = fxpGlobalStoreService;\r\n export var FxpIrisBotService = fxpIrisBotService;\r\n export var FxpOCVFeedbackService = fxpOCVFeedbackService;\r\n export var FxpSignalRService = fxpSignalRService;\r\n }\r\n\r\n export module Boot {\r\n export var FxpBootstrap = fxpBootstrap;\r\n }\r\n\r\n export module Filters {\r\n export var UnCamelCase = unCamelCase;\r\n }\r\n\r\n export namespace External.Constants {\r\n export var IframeAppMessage = iframeAppMessage;\r\n export var IframeAppRequestType = iframeAppRequestType;\r\n }\r\n\r\n export module External.App {\r\n export var IframeAppController = iframeAppController;\r\n export type IframeAppCtrlScope = iframeAppController;\r\n export var IframeBridgeService = iframeBridgeService;\r\n }\r\n\r\n export module Factory {\r\n export var ActOnBehalfOfHelper = actOnBehalfOfHelper;\r\n export var AppControllerHelper = appControllerHelper;\r\n export var AuthorNotificationRoleGroupHelper = authorNotificationRoleGroupHelper;\r\n export var DashBoardHelper = dashBoardHelper;\r\n export var httpCorrelationInterceptor = httpCorrelationInterceptorAlias;\r\n export var httpRetryInterceptor = httpRetryInterceptorAlias;\r\n export var FxpUIData = fxpUIData;\r\n export var SessionTimeoutModalFactory = sessionTimeoutModalFactory;\r\n }\r\n\r\n window[\"Fxp\"] = Fxp;\r\n}\r\n\r\nmodule FxpSDK {\r\n export type FxpMessageEvent = fxpMessageEvent;\r\n export type FxpResponseEventData = fxpResponseEventData;\r\n export type RequestMessageType = requestMessageType;\r\n export type FxpServiceFuncRequest = fxpServiceFuncRequest;\r\n export type FxpRequestMessage = fxpRequestMessage;\r\n export type FxpContextInfo = fxpContextInfo;\r\n export type FxpResponseCallback = fxpResponseCallback;\r\n export var FxpIframeClient = fxpIframeClient;\r\n}\r\n\r\nwindow[\"FxpSDK\"] = FxpSDK;\r\n","/**\r\n * A class that contains angular providers for FXP app\r\n * @class Fxp.Provider.FxpProviders\r\n * @classdesc A class that contains angular providers for FXP app, \r\n */\r\nexport class FxpProviders {\r\n\r\n\t/**\r\n\t * An angular provider for returning the deegate to generate coorelation id\r\n\t * @method Fxp.Config.FxpConfigs.CorrelationProvider \r\n\t */\r\n\tpublic static CorrelationProvider = function () {\r\n\t\tthis.$get = function Correlation() {\r\n\t\t\tfunction CorrelationManager() { }\r\n\t\t\tCorrelationManager.prototype.getCorrelationId = function () {\r\n\t\t\t\treturn $.correlator.getCorrelationId();\r\n\t\t\t}\r\n\t\t\treturn new CorrelationManager();\r\n\t\t}\r\n\t}\r\n\r\n\r\n}\r\n","import { IFxpBotContext } from \"../interfaces/IFxpBotContext\";\r\nimport { UserInfoService } from \"../services/UserInfoService\";\r\n\r\nexport class FxpBotService {\r\n\tprivate _botContext: IFxpBotContext;\r\n\r\n\tstatic $inject = ['UserInfoService', '$http'];\r\n\r\n\tconstructor(public userInfoService: UserInfoService, public $http: angular.IHttpService, botContext: IFxpBotContext) {\r\n\t\tthis._botContext = botContext;\r\n\t}\r\n\r\n\tpublic setUserContext(otherData?: any): angular.IHttpPromise {\r\n\t\tvar config: angular.IRequestShortcutConfig = {\r\n\t\t\theaders: { 'Content-Type': 'application/json' }\r\n\t\t}\r\n\t\tvar data = {\r\n\t\t\tUserAlias: this.userInfoService.getLoggedInUser(),\r\n\t\t\tAppID: this._botContext.AppID,\r\n\t\t\tTopicID: this._botContext.TopicID,\r\n\t\t\tOtherData: otherData\r\n\t\t}\r\n\r\n\t\tvar requestUrl = this._botContext.Url + '/SetContext'\r\n\t\tvar promise = this.$http.post(requestUrl, data, config);\r\n\t\treturn promise;\r\n\t}\r\n}\r\n\r\nexport class FxpBotServiceProvider implements angular.IServiceProvider {\r\n\tinit() {\r\n\t\t//throw new Error(\"Method not implemented.\");\r\n\t}\r\n\taddState(stateName: any, config: any): void {\r\n\t\t//throw new Error(\"Method not implemented.\");\r\n\t}\r\n\totherwise(input: any): void {\r\n\t\tthrow new Error(\"Method not implemented.\");\r\n\t}\r\n\tprivate _botContext: IFxpBotContext;\r\n\r\n\tconstructor() {\r\n\t\tthis.$get.$inject = ['UserInfoService', '$http']\r\n\t}\r\n\r\n\t$get(userInfoService: UserInfoService, $http: angular.IHttpService) {\r\n\t\treturn new FxpBotService(userInfoService, $http, this._botContext);\r\n\t}\r\n\r\n\tpublic configure(botContext: IFxpBotContext): void {\r\n\t\tthis._botContext = botContext;\r\n\t}\r\n}","import { ISettingsServiceConfig } from \"../interfaces/ISettingsServiceConfig\";\r\nimport { ISettingsService } from \"../interfaces/ISettingsService\";\r\nimport { ISettingsServiceProvider } from \"../interfaces/ISettingsServiceProvider\";\r\nimport { SettingsType } from \"../common/SettingsType\";\r\nimport { IFxPService } from \"../interfaces/IFxpService\";\r\nimport { MsalAuthenticationService } from \"../services/MsalAuthenticationService\";\r\n\r\ndeclare var deferred: any;\r\n\r\nexport class SettingsServiceProvider implements ISettingsServiceProvider, ISettingsService, IFxPService {\r\n\tinit() {\r\n\t\t//throw new Error(\"Method not implemented.\");\r\n\t}\r\n\taddState(stateName: any, config: any): void {\r\n\t\t//throw new Error(\"Method not implemented.\");\r\n\t}\r\n\totherwise(input: any): void {\r\n\t\t//throw new Error(\"Method not implemented.\");\r\n\t}\r\n\tprivate settingsServiceConfig: ISettingsServiceConfig = { settingsServiceBaseUrl: \"\" };\r\n\tprivate iReqCount: number;\r\n\tprivate sleepInterval: number;\r\n\tprivate http: angular.IHttpService;\r\n\tprivate msalAuthenticationService: MsalAuthenticationService;\r\n\tprivate timeout: angular.ITimeoutService;\r\n\tprivate q: angular.IQService;\r\n\r\n\tpublic configure(settingsSeerviceConfig: ISettingsServiceConfig) {\r\n\t\tangular.extend(this.settingsServiceConfig, settingsSeerviceConfig);\r\n\t}\r\n\tconstructor() {\r\n\t\tthis.$get.$inject = ['$http', 'MsalAuthenticationService', '$timeout', '$q'];\r\n\t}\r\n\r\n\t$get($http: angular.IHttpService,\r\n\t\tmsalAuthenticationService: MsalAuthenticationService,\r\n\t\t$timeout: angular.ITimeoutService,\r\n\t\t$q: angular.IQService): ISettingsService {\r\n\t\tthis.http = $http;\r\n\t\tthis.msalAuthenticationService = msalAuthenticationService;\r\n\t\tthis.timeout = $timeout;\r\n\t\tthis.q = $q;\r\n\t\tthis.iReqCount = 0;\r\n\t\tthis.sleepInterval = 100;\r\n\t\tvar settingsService: ISettingsService = {\r\n\t\t\tgetSettings: (settingType: SettingsType, settingId: string, settingNames: string[]): angular.IPromise => this.getSettings(settingType, settingId, settingNames),\r\n\t\t\tsaveSettings: (settingType: SettingsType, settingId: string, settingName: string, settingValue: string): angular.IPromise => this.saveSettings(settingType, settingId, settingName, settingValue)\r\n\t\t};\r\n\t\treturn settingsService;\r\n\t}\r\n\r\n\tgetSettings(settingType: SettingsType, settingId: string, settingNames: string[]): angular.IPromise {\r\n\t\tvar pathUrl = this.getPathUrl(settingType, settingId);\r\n\t\tvar url = this.settingsServiceConfig.settingsServiceBaseUrl + pathUrl + '?';\r\n\t\tif (typeof settingNames == 'string') {\r\n\t\t\turl += 'settingNames=' + settingNames;\r\n\t\t}\r\n\t\telse {\r\n\t\t\tif (settingNames instanceof Array) {\r\n\t\t\t\tsettingNames.forEach((setting: string, index: number) => {\r\n\t\t\t\t\turl += index > 0 ?\r\n\t\t\t\t\t\t'&settingNames=' + setting :\r\n\t\t\t\t\t\t'settingNames=' + setting;\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn this.getSettingsSvc(url);\r\n\t}\r\n\r\n\tsaveSettings(settingType: SettingsType, settingId: string, settingName: string, settingValue: string): angular.IPromise {\r\n\t\tvar pathUrl = this.getPathUrl(settingType, settingId);\r\n\t\tvar url = this.settingsServiceConfig.settingsServiceBaseUrl + pathUrl;\r\n\t\treturn this.saveSettingsSvc(url, { settingName: settingName, settingValue: settingValue });\r\n\t}\r\n\r\n\tprivate getSettingsSvc(url: string): angular.IPromise {\r\n\t\tvar self = this;\r\n\t\tvar deferred = self.q.defer();\r\n\t\tif (self.msalAuthenticationService.accessTokenRequestInProgress(url)) {\r\n\t\t\tself.iReqCount++;\r\n\t\t\tif (self.iReqCount == 5) {\r\n\t\t\t\treturn deferred.promise;\r\n\t\t\t}\r\n\r\n\t\t\tself.timeout(function () {\r\n\t\t\t\tself.getSettingsSvc(url);\r\n\t\t\t}, self.sleepInterval);\r\n\t\t}\r\n\t\telse {\r\n\t\t\tself.iReqCount = 0;\r\n\t\t\treturn self.http.get(url);\r\n\t\t}\r\n\r\n\t\treturn deferred.promise;\r\n\t}\r\n\r\n\tprivate saveSettingsSvc(url: string, value: any): angular.IPromise {\r\n\t\tvar self = this;\r\n\t\tvar deferred = self.q.defer();\r\n\t\tif (self.msalAuthenticationService.accessTokenRequestInProgress(url)) {\r\n\t\t\tself.iReqCount++;\r\n\t\t\tif (self.iReqCount == 5) {\r\n\t\t\t\treturn deferred.promise;\r\n\t\t\t}\r\n\r\n\t\t\tself.timeout(function () {\r\n\t\t\t\tself.saveSettingsSvc(url, value);\r\n\t\t\t}, self.sleepInterval);\r\n\t\t}\r\n\t\telse {\r\n\t\t\tself.iReqCount = 0;\r\n\t\t\treturn self.http.post(url, value, { headers: { 'Content-Type': 'application/json' } });\r\n\t\t}\r\n\r\n\t\treturn deferred.promise;\r\n\t}\r\n\r\n\tprivate getPathUrl(settingType: SettingsType, settingId: string): string {\r\n\t\tvar settingTypeValue = SettingsType[settingType];\r\n\t\tvar pathUrl = '/' + settingTypeValue + '/' + settingId + '/settings';\r\n\t\treturn pathUrl;\r\n\t}\r\n}","/**\r\n * A class that contains angular providers for FXP app\r\n * @class Fxp.Provider.FxpUIStateHelperProvider\r\n * @classdesc A class that contains angular providers for FXP app, \r\n */\r\n\r\ndeclare var window: any;\r\ndeclare type IStateProvider = any;\r\ndeclare type IUrlRouterProvider = any;\r\nexport class FxpUIStateHelperProvider {\r\n\r\n\t/**\r\n\t * An angular configuration for dynamically adding of states\r\n\t * @method Fxp.Provider.FxpUIStateHelperProvider.UIStateHelperProvider \r\n\t */\r\n\tpublic static UIStateHelperProvider = function ($stateProvider: IStateProvider, $urlRouterProvider: IUrlRouterProvider) {\r\n\t\tthis.$get = function UIStateHelper() {\r\n\t\t\tfunction UIStateManager() { }\r\n\t\t\tUIStateManager.prototype.addState = function (name, state) {\r\n\t\t\t\tif (state.controllerUrl && state.controllerUrl != \"\") {\r\n\t\t\t\t\t$stateProvider.state(name, window.angularAMD.route(state));\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\t$stateProvider.state(name, state);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tUIStateManager.prototype.otherwise = function (url) {\r\n\t\t\t\t$urlRouterProvider.otherwise(url);\r\n\t\t\t}\r\n\r\n\t\t\tUIStateManager.prototype.init = function () {\r\n\t\t\t\t$stateProvider.init();\r\n\t\t\t\t$urlRouterProvider.init();\r\n\t\t\t}\r\n\r\n\r\n\t\t\treturn new UIStateManager();\r\n\t\t}\r\n\t}\r\n}","import { ErrorCodes } from \"../constants/errorCodes\";\r\nimport { ErrorSeverityLevel } from \"../telemetry/ErrorSeverityLevel\";\r\nimport { FxpLoggerService } from \"../telemetry/fxpLogger\";\r\nimport { GlobalExceptionHandler } from \"../telemetry/GlobalExceptionHandler\";\r\nimport { TelemetryConstants } from \"../telemetry/TelemetryConst\";\r\n\r\n///*Fxp.Resiliency can be used to method when Angular boot fails*/\r\nexport class Resiliency {\r\n\tprivate static resilientModules: any;\r\n\tprivate static failedModules: any;\r\n\tprivate static unavailablePartnerModules: any;\r\n\tprivate static hasChildren: boolean = false;\r\n\tpublic static statesWithMissingModules: any = [];\r\n\tpublic static get FxpLoggerService(): FxpLoggerService {\r\n\t\treturn FxpLoggerService.getInstance(); \r\n\t}\r\n\tstatic source = `${TelemetryConstants.FXP_TELEMETRY_BASE_NAME}.Resiliency`;\r\n\r\n\tstatic init(){\r\n\t\t\r\n\t}\r\n\r\n\tpublic static get UnavailablePartnerModules() {\r\n\t\treturn this.unavailablePartnerModules;\r\n\t}\r\n\tpublic static set UnavailablePartnerModules(value: any) {\r\n\t\tthis.unavailablePartnerModules = value;\r\n\t}\r\n\t/**\r\n * @method Fxp.Resiliency.externalResourceLoadFailed to log Global Event when js cdn files is mispelled or not available.\r\n * @param {string} scriptName - name of the script file\r\n */\r\n\tstatic externalResourceLoadFailed(scriptName): void {\r\n\t\tvar logMsg = \"Unable to load resource: \" + scriptName;\r\n\t\tlet properties = this.FxpLoggerService.createPropertyBag();\r\n\t\tproperties.addToBag(\"Details\", logMsg);\r\n\t\tthis.FxpLoggerService.logError(`${this.source}.ExternalResourceLoadFailed`, logMsg, ErrorCodes.Resiliency_ExternalResourceLoadingError, \"\", properties, null, null, ErrorSeverityLevel.Medium); \r\n\t\tconsole.error(\"Fxp Resiliency: \", logMsg);\r\n\t}\r\n\r\n\r\n\t/**\r\n * @method Fxp.Resiliency.getResilientModules to fetch modules which are resilient.\r\n * @param {any} modules -list of modules which needs to be injected\r\n */\r\n\tstatic getResilientModules(modules): any {\r\n\t\t// to capture all resilient modules \r\n\t\tthis.statesWithMissingModules = [];\r\n\t\tthis.unavailablePartnerModules = [];\r\n\t\tthis.resilientModules = [];\r\n\t\tmodules.forEach(function (moduleName, i) {\r\n\t\t\tthis.failedModules = [];\r\n\t\t\tif (this.checkModuleResiliency(moduleName))\r\n\t\t\t\tthis.resilientModules.push(moduleName);\r\n\t\t\telse {\r\n\t\t\t\tthis.unavailablePartnerModules.push(moduleName);\r\n\t\t\t\tthis.failedModules.push(moduleName);\r\n\t\t\t\tthis.logFailedModulesInfo(moduleName);\r\n\t\t\t}\r\n\t\t}, this);\r\n\t\treturn this.resilientModules;\r\n\t}\r\n\r\n\t/**\r\n\t* @method Fxp.Resiliency.checkModuleResiliency to check if the modules are avaialble for FXP module injection .\r\n\t* @param {any} modules - modules whose resiliency needs to be checked\r\n\t*/\r\n\tprivate static checkModuleResiliency(module): boolean {\r\n\t\ttry {\r\n\t\t\tvar app = angular.module(module);\r\n\t\t\tif (app.requires.length > 0) {\r\n\t\t\t\tfor (var i = 0; i < app.requires.length; i++) {\r\n\t\t\t\t\tif (!this.checkModuleResiliency(app.requires[i])) {\r\n\t\t\t\t\t\tthis.failedModules.push(app.requires[i]);\r\n\t\t\t\t\t\treturn false;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\treturn true;\r\n\t\t\t}\r\n\t\t\treturn true;\r\n\t\t}\r\n\t\tcatch (e) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t}\r\n\t/**\r\n * @method Fxp.Resiliency.logFailedModulesInfo call global event and log property bag value .\r\n * @param {any} moduleName - modules whose resiliency needs to be checked\r\n */\r\n\tprivate static logFailedModulesInfo(moduleName) {\r\n\t\tvar msg = this.failedModules.length > 1 ? \" due to \" + this.failedModules[0] + \", \" + this.failedModules.reverse().join(\" <- \") : \".\";\r\n\t\tvar logMsg = \"Failed to instantiate module \" + moduleName + `${msg}`;\r\n\t\tlet error = new Error();\r\n\t\terror.message = logMsg; \r\n\t\terror.name = \"AngularJS Module Instantiation Failed\"; \r\n\r\n\t\tlet properties = this.FxpLoggerService.createPropertyBag();\r\n\t\tproperties.addToBag('ModuleName', moduleName);\r\n\t\tthis.FxpLoggerService.logException(this.source, error, properties, undefined, undefined, ErrorSeverityLevel.Critical, ErrorCodes.Resiliency_ModuleLoadingError);\r\n\t\tconsole.error(\"Fxp Resiliency: \", logMsg);\r\n\t}\r\n}\r\nResiliency.init();","/// \r\n/// \r\n/// \r\n\r\nimport { AuthenticationResult } from \"@azure/msal-browser\";\r\nimport { IFxPService } from \"../interfaces/IFxpService\";\r\nimport { IServiceEndPoints } from \"../interfaces/IServiceEndPoints\";\r\nimport { MsalAuthenticationService } from \"./MsalAuthenticationService\";\r\n\r\ndeclare global {\r\n\tinterface Window { _msalEndpoints: any; }\r\n}\r\n/**\r\n * @application Fxp\r\n */\r\n/**\r\n * @module Fxp.Utils.Services\r\n */\r\n\r\n/**\r\n * A service keeping the generic methods used in the fxp application and for multiple adal requests \r\n * @class Fxp.Services.AdalLoginHelperService\r\n * @classdesc A service used for generic methods in the fxp application and adal simultaneous cors requests\r\n * @example Example to create an instance of AdalLoginHelperService\r\n * //Initializing AdalLoginHelperService\r\n * angular.module('FxPApp').controller('AppController', ['AdalLoginHelperService', AppController]);\r\n * function AppController(AdalLoginHelperService){ AdalLoginHelperService.getJsonData(path, callbackfunc); }\r\n */\r\nexport class AdalLoginHelperService implements IFxPService {\r\n\tprivate serviceEndpoints: Array = [];\r\n\tprivate $q;\r\n\tprivate $resource;\r\n\r\n\tconstructor($q: angular.IQService, $resource: angular.resource.IResourceService, private msalAuthenticationService: MsalAuthenticationService) {\r\n\t}\r\n\r\n\t/**\r\n * Checks for whether the adal service request is in progress or not and returns boolean \r\n * @method Fxp.Utils.Services.AdalLoginHelperService.registerEndPoint\r\n * @param {EndPoint} endpoint is the api endpoint for the resource or the api to which adal authorizes.\r\n * @param {ResourceId} ResourceId is the api endpoint for the resource or the api to which adal authorizes.\r\n * @example Example to invoke accessTokenRequestInProgress\r\n * AdalLoginHelperService.registerEndPoint('http://oneprofiledevapi.azurewebsites.net', 'asdasd-asdasd-asdasda-asdasd');\r\n */\r\n\tregisterEndPoint(endpoint: string, applicationId: string) {\r\n\t\tthis.msalAuthenticationService.registerEndPoint(endpoint, applicationId);\r\n\t}\r\n\r\n\t/**\r\n * Checks for whether the adal service request is in progress or not and returns boolean \r\n * @method Fxp.Utils.Services.AdalLoginHelperService.accessTokenRequestInProgress\r\n * @param {EndPoint} endpoint is the api endpoint for the resource or the api to which adal authorizes.\r\n * @example Example to invoke accessTokenRequestInProgress\r\n * AdalLoginHelperService.accessTokenRequestInProgress('http://oneprofiledevapi.azurewebsites.net');\r\n */\r\n\taccessTokenRequestInProgress(endpoint): boolean {\r\n\t\treturn false;\r\n\t}\r\n\r\n\t/**\r\n * Returns cached token for a given endpoint \r\n * @method Fxp.Utils.Services.AdalLoginHelperService.getCachedToken\r\n * @param {EndPoint} endpoint is the api endpoint for the resource or the api to which adal authorizes.\r\n * @example Example to invoke getCachedToken\r\n * AdalLoginHelperService.getCachedToken('http://oneprofiledevapi.azurewebsites.net');\r\n */\r\n\tgetCachedToken(endpoint) {\r\n\t\t// var resource = this.adal.getResourceForEndpoint(endpoint);\r\n\t\t// return this.adal.getCachedToken(resource);\r\n\t\treturn this.msalAuthenticationService.getCachedToken(endpoint);\r\n\t}\r\n\r\n\t/**\r\n * To kick off token acquisition manually on special cases \r\n * @method Fxp.Utils.Services.AdalLoginHelperService.acquireToken\r\n * @param {EndPoint} endpoint is the api endpoint for the resource or the api to which adal authorizes.\r\n * @example Example to invoke acquireToken\r\n * AdalLoginHelperService.acquireToken('http://oneprofiledevapi.azurewebsites.net');\r\n */\r\n\tacquireToken(endpoint, callback) {\r\n\t\tthis.msalAuthenticationService.acquireTokenAsPromise(endpoint).then((authResult: AuthenticationResult) => {\r\n\t\t\tif (authResult && authResult.accessToken) {\r\n\t\t\t\tcallback(null, authResult.accessToken, null);\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\tconsole.log(\"Token not acquired\");\r\n\t\t\t\tcallback('User login is required', null, 'login required');\r\n\t\t\t}\r\n\t\t}).catch((error: any) => callback('User login is required', null, 'login required'));\r\n\t}\r\n\r\n\tacquireTokenAsPromise(endpoint) {\r\n\t\tvar self = this;\r\n\t\treturn new Promise(function (resolve, reject) {\r\n\t\t\tself.msalAuthenticationService.acquireTokenAsPromise(endpoint)\r\n\t\t\t\t.then((result: AuthenticationResult) => resolve(result.accessToken))\r\n\t\t\t\t.catch((error: any) => reject(error))\r\n\t\t});\r\n\t}\r\n\r\n\t/**\r\n * Checks for whether the token retrieval is started for the endpoint provided \r\n * @method Fxp.Utils.Services.AdalLoginHelperService.isTokenRetrievalStarted\r\n * @param {Resource} resource an endpoint which is passed to check for it in the logs entry.\r\n * @example Example to invoke isTokenRetrievalStarted\r\n * AdalLoginHelperService.isTokenRetrievalStarted('https://microsoft.onmicrosoft.com/FXPCouchBaseAPI');\r\n */\r\n\tisTokenRetrievalStarted(resource): boolean {\r\n\t\tvar isTokenRetrievalStarted = false;\r\n\r\n\t\t// console.log(this.adal.CONSTANTS.LOG_ENTRY + resource);\r\n\t\t// var log = this.adal._getItem(this.adal.CONSTANTS.LOG_ENTRY + resource);\r\n\t\t// if (log) {\r\n\t\t// \tvar logEntries = log.split(';');\r\n\t\t// \tvar lastEntry = logEntries[logEntries.length - 2];\r\n\t\t// \tvar entryTime = new Date(lastEntry.substr(0, lastEntry.indexOf('GMT:') + 3));\r\n\t\t// \tvar now = new Date();\r\n\t\t// \tisTokenRetrievalStarted = now.getTime() < entryTime.getTime() + 10000;\r\n\t\t// }\r\n\r\n\t\treturn isTokenRetrievalStarted;\r\n\t}\r\n\r\n}\r\n\r\n","import { Subject } from 'rxjs';\r\nimport { IRootScope } from '../interfaces/IRootScope';\r\nimport { CommonUtils } from '../utils/CommonUtils';\r\nimport { IFxPService } from '../interfaces/IFxpService';\r\n\r\nexport class FxpEventBroadCastService implements IFxPService {\r\n\r\n\tprivate subject: Subject;\r\n\tprivate subjects: any = [];\r\n\tconstructor(private $rootScope: IRootScope) {\r\n\t}\r\n\tprivate broadCastSubject(eventName: string, value: any) {\r\n\t\tvar self = this;\r\n\t\tvar eventIndex = CommonUtils.getIndexOfObject(self.subjects, \"eventName\", eventName);\r\n\t\tif (eventIndex > -1) {\r\n\t\t\tself.subjects[eventIndex].subject.onNext(value);\r\n\t\t} else {\r\n\t\t\tlet event = {\r\n\t\t\t\teventName: eventName,\r\n\t\t\t\tsubject: self.getSubjectInstance()\r\n\t\t\t}\r\n\t\t\tself.subjects.push(event);\r\n\t\t}\r\n\t}\r\n\tprivate subscribeToSubject(eventName: string): Subject {\r\n\t\tvar self = this;\r\n\t\tvar eventIndex = CommonUtils.getIndexOfObject(self.subjects, \"eventName\", eventName);\r\n\t\tif (eventIndex > -1) {\r\n\t\t\treturn self.subjects[eventIndex].subject;\r\n\t\t} else {\r\n\t\t\tlet event = {\r\n\t\t\t\teventName: eventName,\r\n\t\t\t\tsubject: self.getSubjectInstance()\r\n\t\t\t}\r\n\t\t\tself.subjects.push(event);\r\n\t\t\treturn event.subject;\r\n\t\t}\r\n\t}\r\n\tprivate unsubscribeSubject(eventName: string) {\r\n\t\tvar self = this;\r\n\t\tvar eventIndex = CommonUtils.getIndexOfObject(self.subjects, \"eventName\", eventName);\r\n\t\tif (eventIndex > -1) {\r\n\t\t\tself.subjects[eventIndex].subject.unsubscribe();\r\n\t\t}\r\n\t}\r\n\tpublic On(eventName: string, callBack: any): any {\r\n\t\tvar self = this;\r\n\t\treturn self.$rootScope.$on(eventName, callBack);\r\n\t}\r\n\tpublic broadCast(eventName: string, value: any) {\r\n\t\tvar self = this;\r\n\t\tself.$rootScope.$broadcast(eventName, value);\r\n\t}\r\n\tpublic emit(eventName: string, callBack: any) {\r\n\t\tvar self = this;\r\n\t\tself.$rootScope.$emit(eventName, callBack);\r\n\t}\r\n\r\n\tprivate getSubjectInstance(): any {\r\n\t\tvar subject = new Subject();\r\n\t\treturn subject;\r\n\t}\r\n\r\n}\r\n","declare type IStateService = any;\r\n/// \r\nimport { IBrowserExperience } from \"../interfaces/IUserExperience\";\r\nimport { UserInfoService } from \"./UserInfoService\";\r\nimport { BrowserExperienceObject } from \"../interfaces/BrowserExperienceObject\";\r\nimport { BrowserExperienceConstants } from \"../constants/BrowserExperienceConstants\";\r\n\r\n\r\nexport class BrowserExperience {\r\n private $scope: IBrowserExperience;\r\n private message: string;\r\n private userInfoService: UserInfoService;\r\n private isBannerHidden: number;\r\n private topMargin: string;\r\n private timeLimit: number;\r\n\r\n\r\n constructor(userInfoService: UserInfoService) {\r\n this.message = BrowserExperienceConstants.message\r\n this.userInfoService = userInfoService;\r\n this.isBannerHidden = 0;\r\n this.topMargin = \"57px !important\";\r\n this.timeLimit = BrowserExperienceConstants.timeLeft;\r\n }\r\n\r\n setMarginZero() {\r\n this.topMargin = \"0px !important\";\r\n }\r\n\r\n setBrowserExperienceObject(flag) {\r\n var browserExperienceObject: BrowserExperienceObject = { userName: \"\", timestamp: 123456, noThanksFlag: 2 };\r\n browserExperienceObject.userName = this.userInfoService.getLoggedInUser();\r\n browserExperienceObject.timestamp = new Date().getTime();\r\n browserExperienceObject.noThanksFlag = flag;\r\n\r\n return JSON.stringify(browserExperienceObject);\r\n }\r\n\r\n noThanksClick() {\r\n this.remindMeLaterClick();\r\n }\r\n\r\n remindMeLaterClick() {\r\n localStorage.setItem(\"browserExperience\", this.setBrowserExperienceObject(0));\r\n this.setMarginZero();\r\n this.isBannerHidden = 1;\r\n }\r\n\r\n buttonLogic() {\r\n var browserExperienceJson = localStorage.getItem(\"browserExperience\");\r\n\r\n if (browserExperienceJson == null) {\r\n this.isBannerHidden = 0;\r\n this.topMargin = \"57px !important\";\r\n }\r\n else {\r\n var browserExperienceObject: BrowserExperienceObject = JSON.parse(browserExperienceJson);\r\n\r\n if (!(browserExperienceObject.noThanksFlag == 1 || browserExperienceObject.timestamp > new Date().getTime() - this.timeLimit)) {\r\n this.isBannerHidden = 0;\r\n this.topMargin = \"57px !important\";\r\n }\r\n else {\r\n\r\n this.isBannerHidden = 1;\r\n this.setMarginZero();\r\n }\r\n }\r\n }\r\n\r\n checkBrowser() {\r\n var isIEedge = window.navigator.userAgent.indexOf(\"Edge\") > -1;\r\n\r\n if (!isIEedge) {\r\n this.isBannerHidden = 1;\r\n this.setMarginZero();\r\n } else {\r\n\r\n this.buttonLogic();\r\n }\r\n }\r\n}\r\n","import { IDataService } from \"../interfaces/IDataService\";\r\nimport { ILogger } from \"../interfaces/ILogger\";\r\nimport { Observable } from \"rxjs\";\r\nimport { IFxPService } from \"../interfaces/IFxpService\";\r\nimport { TelemetryConstants } from \"../telemetry/TelemetryConst\";\r\nimport { ErrorCodes } from \"../constants/errorCodes\";\r\nimport { ErrorSeverityLevel } from \"../telemetry/ErrorSeverityLevel\";\r\nimport { MsalAuthenticationService } from \"./MsalAuthenticationService\";\r\n\r\n/**\r\n* @application Fxp\r\n*/\r\n/**\r\n* @module Fxp.Utils.Services\r\n*/\r\nexport class DataService implements IDataService,IFxPService {\r\n\r\n\tprivate sleepInterval: number = 100;\r\n\tprivate retryCount = {};\r\n\tprivate sourceForTelemetry = `${TelemetryConstants.FXP_TELEMETRY_BASE_NAME}.DataService`;\r\n\r\n\tconstructor(\r\n\t\tprivate $http: angular.IHttpService,\r\n\t\tprivate $q: angular.IQService,\r\n\t\tprivate $timeout: angular.ITimeoutService,\r\n\t\tprivate msalAuthenticationService: MsalAuthenticationService,\r\n\t\tprivate fxploggerService: ILogger) {\r\n\t}\r\n\r\n\tpublic get(url: string, parentDeferred: any): angular.IPromise {\r\n\t\treturn this.getWithAdalTokenSync(url, parentDeferred);\r\n\t}\r\n\r\n\tpublic getAsObservable(url: string): Observable {\r\n\t\treturn Observable.create(observer=>{\r\n\t\t\tthis.getWithAdalTokenSync(url, null).then((data) => {\r\n\t\t\t\tobserver.next(data); \r\n\t\t\t\tobserver.complete(); \r\n\t\t\t}).catch((error)=> {\r\n\t\t\t\tobserver.error(error); \r\n\t\t\t})\r\n\t\t})\r\n\t\t\r\n\t}\r\n\tprivate getWithAdalTokenSync(url: string, parentDeferred: any): angular.IPromise {\r\n\t\tvar self = this;\r\n\t\tvar deferred = parentDeferred || self.$q.defer();\r\n\r\n\t\tif (self.msalAuthenticationService.accessTokenRequestInProgress(url)) {\r\n\t\t\tvar retryCountForUrl = self.retryCount[url] || 0;\r\n\t\t\tretryCountForUrl++;\r\n\t\t\tself.retryCount[url] = retryCountForUrl;\r\n\t\t\tif (retryCountForUrl == 5) {\r\n\t\t\t\tdelete self.retryCount[url];\r\n\t\t\t\tvar propBag = self.fxploggerService.createPropertyBag();\r\n\t\t\t\tpropBag.addToBag('ServiceUrl', url);\r\n\r\n\t\t\t\tself.fxploggerService.logError(`${self.sourceForTelemetry}.GetWithAdalTokenSync`, 'AdalTokenAquisitionFailed', ErrorCodes.DataService_TokenFailure, null, propBag, null, null, ErrorSeverityLevel.Medium);\r\n\t\t\t\t\r\n\t\t\t\treturn deferred.promise;\r\n\t\t\t}\r\n\t\t\tself.$timeout(function () {\r\n\t\t\t\tself.getWithAdalTokenSync(url, deferred);\r\n\t\t\t}, self.sleepInterval);\r\n\t\t}\r\n\t\telse {\r\n\t\t\tdelete self.retryCount[url];\r\n\t\t\treturn this.$http.get(url);\r\n\t\t}\r\n\r\n\t\treturn deferred.promise;\r\n\t}\r\n}\r\n\r\n","import { IRootScope } from \"../interfaces/IRootScope\";\r\nimport { ILogger } from \"../interfaces/ILogger\";\r\nimport { UserClaimsService } from \"./UserClaimsService\";\r\nimport { UserInfoService } from \"./UserInfoService\";\r\nimport { FxpConfigurationService } from \"./FxpConfiguration\";\r\nimport { StateService } from \"@uirouter/core\"\r\nimport { PartnerAppRegistrationService } from \"./PartnerAppRegistrationService\";\r\nimport { IUserPermission, IUserRole, IUserResourcePermissions, IResourcePermission } from \"../interfaces/IUserPermission\";\r\nimport { IStateConfig } from \"../interfaces/IStateConfig\";\r\nimport { IStateAuthorizationRule } from \"../interfaces/IStateAuthorizationRule\";\r\nimport { IFxPService } from \"../interfaces/IFxpService\";\r\n\r\n/**\r\n * @application Fxp\r\n */\r\n/**\r\n * @module Fxp.Services\r\n */\r\n/**\r\n * A service to check Authorization Rules\r\n * @class Fxp.Services.FxpAuthorizationService \r\n * @classdesc A service to check Authorization Rules\r\n * @example Example to create an instance of Fxp Authorization Service\r\n * //Initializing Fxp Route Service\r\n * angular.module('FxPApp').controller('AppController', ['FxpAuthorizationService ', AppController]);\r\n */\r\nexport class FxpAuthorizationService implements IFxPService {\r\n\tprivate states;\r\n\tprivate stateGo: StateService;\r\n\tprivate rootScope: IRootScope;\r\n\tprivate fxplogger: ILogger;\r\n\tprivate userClaimsService: UserClaimsService;\r\n\tprivate userInfoService: UserInfoService;\r\n\tprivate fxpConfigurationService: FxpConfigurationService;\r\n\r\n\tconstructor($state: StateService,\r\n\t\t$rootScope: IRootScope,\r\n\t\tloggerService: ILogger,\r\n\t\tuserClaimsService: UserClaimsService,\r\n\t\tuserInfoService: UserInfoService,\r\n\t\tfxpConfigurationService: FxpConfigurationService\r\n\t) {\r\n\t\tthis.states = $state.get();\r\n\t\tthis.stateGo = $state;\r\n\t\tthis.rootScope = $rootScope;\r\n\t\tthis.userClaimsService = userClaimsService;\r\n\t\tthis.userInfoService = userInfoService;\r\n\t\tthis.fxplogger = loggerService;\r\n\t\tthis.fxpConfigurationService = fxpConfigurationService;\r\n\r\n\t}\r\n\r\n\tprivate isNullOrEmpty(object: any) {\r\n\t\treturn (typeof object === 'undefined' || object === null || object.length < 1)\r\n\t}\r\n\r\n\tpublic checkStatePermission(event, state: IStateConfig): void {\r\n\t\tconst self = this;\r\n\t\tif (self.isStateAuthorized(state) === false)\r\n\t\t\tself.redirectToUnauthorizedState(event, state.name);\r\n\t}\r\n\r\n\tpublic redirectToUnauthorizedState(event:any=null, currentState:string=\"\"): void {\r\n\t\tconst self = this;\r\n\t\tconst propbag = self.fxplogger.createPropertyBag();\r\n\t\tif (currentState.trim().length === 0){\r\n\t\t\tcurrentState = self.states.current.name;\r\n\t\t}\r\n\t\tpropbag.addToBag(\"currentUser\", self.userInfoService.getCurrentUser());\r\n\t\tpropbag.addToBag(\"currentState\", currentState);\r\n\t\tvar telemetrymsg = self.rootScope.fxpUIConstants.UIStrings.UnauthorizedUIString + currentState;\r\n\t\tself.fxplogger.logWarning(\"FxpAuthorizationService\", telemetrymsg, propbag);\r\n\t\tif (event){\r\n\t\t\tevent.preventDefault();\r\n\t\t}\r\n\t\tthis.stateGo.go(\"unauthorized\");\r\n\t}\t\r\n\r\n\t/*check if given state for a given app is authorized*/\r\n\tpublic isAuthorized(stateName: string, appName?: string): boolean \r\n\t{\r\n\t\tconst self = this;\r\n\t\tlet stateConfig = { name: stateName } as IStateConfig;\r\n\r\n\t\tif(!self.isNullOrEmpty(appName))\r\n\t\t{\r\n\t\t\tconst appConfig = PartnerAppRegistrationService.angularPartnerStateConfig.find(s => s.applicationName && s.applicationName.toLowerCase() === appName.toLowerCase());\r\n\t\t\tif(!self.isNullOrEmpty(appConfig)) //if it is a registered partner app with its routes registered in Fxp\r\n\t\t\t{\r\n\t\t\t\tstateConfig = appConfig.routes.find(r => r.name.toLowerCase() === stateName.toLowerCase());\t\t\t\r\n\t\t\t}\r\n\t\t}\t\t\r\n\r\n\t\treturn self.isStateAuthorized(stateConfig);\r\n\t}\r\n\r\n\t/*check if user is admin*/\r\n\tpublic isAppAdmin(appName: string): boolean\r\n\t{\r\n\t\tif(!appName)\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\tconst self = this;\r\n\t\tconst adminPermissionsRules = self.getAppAdminRules(appName);\r\n\r\n\t\tif (self.isNullOrEmpty(adminPermissionsRules)) return false; //if no auth rules defined, the user is not an admin by default\r\n\r\n\t\treturn self.hasUserPermissions(adminPermissionsRules);\r\n\t}\r\n\r\n\t/*check if user has the required role*/\r\n\tpublic hasUserRoles(userRoles: IUserRole) : boolean\r\n\t{\t\r\n\t\tconst self = this;\r\n\t\tlet hasRoles = false;\r\n\t\tif(userRoles)\r\n\t\t{\r\n\t\t\tconst allRolesMandatory = userRoles.AllRolesMandatory;\r\n\t\t\tconst roles = userRoles.Value;\r\n\t\t\t\r\n\t\t\t//Role based authorization\r\n\t\t\tif(!self.isNullOrEmpty(roles)){\r\n\t\t\t\tconst claimsList = self.getClaimsList(userRoles.Value, null);\r\n\t\t\t\tif (allRolesMandatory) {\r\n\t\t\t\t\thasRoles = roles.every(r => self.checkRoleFunc(r, claimsList));\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\thasRoles = roles.some(r => self.checkRoleFunc(r, claimsList));\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn hasRoles;\r\n\t}\r\n\r\n\t/*check if user has the required resource permission*/\r\n\tpublic hasResourcePermissions(userResourcePermissions: IUserResourcePermissions) : boolean\r\n\t{\r\n\t\tconst self = this;\r\n\t\tlet areResourcesAuthorized = false;\r\n\t\tif(userResourcePermissions)\r\n\t\t{\r\n\t\t\tconst allResourcePermissionsMandatory = userResourcePermissions.AllResourcesMandatory;\r\n\t\t\tconst resourcePermissions = userResourcePermissions.Value;\r\n\t\t\t\r\n\t\t\t// Resource Permission based authorization\r\n\t\t\tif (!self.isNullOrEmpty(resourcePermissions)){\r\n\t\t\t\tconst tenantClaims = self.getClaimsList(null, userResourcePermissions.Value);\r\n\t\t\t\tif (allResourcePermissionsMandatory) {\r\n\t\t\t\t\tareResourcesAuthorized = resourcePermissions.every(p => self.checkResourcePermissionFunc(p, tenantClaims));\r\n\t\t\t\t}\r\n\t\t\t\t\r\n\t\t\t\telse {\r\n\t\t\t\t\tareResourcesAuthorized = resourcePermissions.some(p => self.checkResourcePermissionFunc(p, tenantClaims));\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn areResourcesAuthorized;\r\n\t}\t\r\n\r\n\t/*check if user has the required role/resource permissions*/\r\n\tpublic hasUserPermissions(allowedPermissions: IUserPermission) : boolean\r\n\t{\r\n\t\tconst self = this;\r\n\t\t// if both roles and resource permissions are required\r\n\t\tconst authorizeRolesAndResources = allowedPermissions.AuthorizeRolesAndResources;\t\r\n\t\t\r\n\t\tlet userRoles: IUserRole\r\n\t\tif(allowedPermissions.Roles && !self.isNullOrEmpty(allowedPermissions.Roles.Value)) \r\n\t\t{\r\n\t\t\tuserRoles = allowedPermissions.Roles;\r\n\t\t}\r\n\t\t\r\n\t\tlet userResourcePermissions: IUserResourcePermissions\t\t\r\n\t\tif(allowedPermissions.ResourcePermissions && !self.isNullOrEmpty(allowedPermissions.ResourcePermissions.Value)) \r\n\t\t{\r\n\t\t\tuserResourcePermissions = allowedPermissions.ResourcePermissions;\r\n\t\t}\r\n\r\n\t\tvar areRolesAuthorized = () => {\r\n\t\t\treturn self.hasUserRoles(userRoles);\t\t\r\n\t\t}\r\n\t\tvar areResourcesAuthorized = () => {\r\n\t\t\treturn self.hasResourcePermissions(userResourcePermissions);\r\n\t\t}\r\n\r\n\t\tif(authorizeRolesAndResources){\r\n\t\t\treturn (areRolesAuthorized() && areResourcesAuthorized());\r\n\t\t}\r\n\t\telse{\r\n\t\t\treturn (areRolesAuthorized() || areResourcesAuthorized());\r\n\t\t}\r\n\t}\t\t\r\n\t\r\n\tprivate isStateAuthorized(state: IStateConfig): boolean \r\n\t{\r\n\t\tconst self = this;\r\n\t\tconst authorizationRules = self.getStateAuthorizationRules(state)\r\n\r\n\t\tif (self.isNullOrEmpty(authorizationRules) || self.isNullOrEmpty(authorizationRules.AllowedPermissions)) return true; //if no auth rules defined, the state is authorized by default\r\n\t\t\r\n\t\tif (self.rootScope.actOnBehalfOfUserActive && authorizationRules.IsRestrictedInObo === true)\r\n\t\t\treturn false;\r\n\r\n\t\t/*check if either admin or user state is authorized*/\r\n\t\treturn self.hasUserPermissions(authorizationRules.AllowedPermissions) || (state.data && state.data[\"partnerAppName\"] ? self.isAppAdmin(state.data[\"partnerAppName\"]) : false);\r\n\t}\t\r\n\r\n\tprivate getStateAuthorizationRules(state: IStateConfig) : IStateAuthorizationRule\r\n\t{\r\n\t\tconst self = this;\r\n\t\tconst stateName = state.name\r\n\t\tlet authRules = self.fxpConfigurationService.FxpBaseConfiguration.AuthorizationRules.filter(function (item) {\r\n\t\t\treturn (item.StateName === stateName);\r\n\t\t})[0];\r\n\t\tif(!self.isNullOrEmpty(authRules))\r\n\t\t{\r\n\t\t\treturn authRules; // auth rules for the state in startup config takes precedence over partner app config\r\n\t\t}\t\r\n\t\t\r\n\t\treturn state.authorizationRules;\r\n\t}\r\n\r\n\tprivate getAppAdminRules(appName : string) : IUserPermission\r\n\t{\r\n\t\tconst self = this;\r\n\t\tlet adminRules;\r\n\t\tif(!self.isNullOrEmpty(appName))\r\n\t\t{\r\n\t\t\tconst appConfig = PartnerAppRegistrationService.angularPartnerStateConfig.find(s => s.applicationName.toLowerCase() === appName.toLowerCase());\r\n\t\t\tif(appConfig)\r\n\t\t\t{\r\n\t\t\t\tadminRules = appConfig.adminRules\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn adminRules;\r\n\t}\t\r\n\r\n\tprivate getClaimsList(roles: Array, resourcePermissions: Array)\r\n\t{\r\n\t\tconst self = this;\r\n\t\tconst tenantClaims = {};\r\n\r\n\t\tconst apps = self.getAppList(roles, resourcePermissions);\r\n\t\t\r\n\t\t/*get claims as per app Id passed in auth rule*/\r\n\t\tapps.forEach(app => {\r\n try {\r\n tenantClaims[app] = self.userClaimsService.getUserTenantClaims(app);\r\n } catch (e) {\r\n }\r\n\t\t});\r\n\t\treturn tenantClaims;\r\n\t}\r\n\r\n\tprivate getAppList(roles: Array, resourcePermissions: Array = null): Array\r\n\t{\r\n\t\tlet apps = [];\r\n\t\tif(roles)\r\n\t\t{\r\n\t\t\tapps = apps.concat(roles.map((role) => {\r\n\t\t\t\treturn role.split(\".\")[0];\r\n\t\t\t}));\r\n\t\t}\r\n\t\tif(resourcePermissions)\r\n\t\t{\r\n\t\t\tapps = apps.concat(resourcePermissions.map((permission) => {\t\t\t\t\r\n\t\t\t\treturn permission.Resource.split(\".\")[0];\r\n\t\t\t}));\r\n\t\t}\r\n\r\n\t\t/*remove duplicates from app list to avoid calling claims service repeatedly for same app */\r\n\t\tapps = apps.filter((el, i, a) => i === a.indexOf(el))\r\n\t\t\r\n\t\treturn apps;\r\n\t}\t\r\n\r\n\tprivate checkRoleFunc(item: string, tenantClaims) : boolean\r\n\t{\r\n\t\tconst self = this;\r\n\t\tlet hasRoles = false;\r\n\t\tif(!self.isNullOrEmpty(item))\r\n\t\t{\r\n\t\t\tconst[npd, role] = item.split(\".\");\r\n\t\t\tconst NPDClaims = tenantClaims[npd];\r\n\t\t\tif (NPDClaims && NPDClaims.claims.roles.hasOwnProperty(role) === true) {\r\n\t\t\t\thasRoles = true;\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn hasRoles;\r\n\t}\t\r\n\r\n\tprivate checkResourcePermissionFunc(item: IResourcePermission, tenantClaims) : boolean\r\n\t{\r\n\t\tconst self = this;\r\n\t\tlet hasPermissions = false;\r\n\t\tif(item && !self.isNullOrEmpty(item.Resource))\r\n\t\t{\r\n\t\t\tconst[npd, resource] = item.Resource.split(\".\");\r\n\t\t\tconst NPDClaims = tenantClaims[npd];\r\n\t\t\tif (NPDClaims && NPDClaims.claims.resourcePermissions) {\r\n\t\t\t\tconst resourcePermission = NPDClaims.claims.resourcePermissions.find((r) => (r.resource.toLowerCase() == resource.toLowerCase()));\r\n\t\t\t\tif (resourcePermission && resourcePermission.resource) {\r\n\t\t\t\t\tif(!item.Permissions || self.isNullOrEmpty(item.Permissions.Value)) //if no permissions mentioned only check on resource\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\thasPermissions = true;\r\n\t\t\t\t\t\treturn hasPermissions;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tconst allPermissionsMandatory = item.Permissions.AllPermissionsMandatory;\r\n\t\t\t\t\tif(allPermissionsMandatory)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\thasPermissions = item.Permissions.Value.every(p=> resourcePermission.permissions.includes(p));\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\thasPermissions = item.Permissions.Value.some(p=> resourcePermission.permissions.includes(p));\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn hasPermissions;\r\n\t}\t\t\r\n}\r\n","import { IRootScope } from \"../interfaces/IRootScope\";\r\nimport { ILogger } from \"../interfaces/ILogger\";\r\nimport { TelemetryContext } from \"../telemetry/telemetrycontext\";\r\nimport { CommonUtils } from \"../utils/CommonUtils\";\r\nimport {\r\n ApplicationConstants,\r\n FxpConstants,\r\n} from \"../common/ApplicationConstants\";\r\nimport { FxpLogHelper } from \"../telemetry/FxpLogHelper\";\r\nimport { FxpStorageService } from \"./FxpStorageService\";\r\nimport { UserInfoService } from \"./UserInfoService\";\r\nimport { DashboardService } from \"./dashboardService\";\r\nimport { FxpConfigurationService } from \"./FxpConfiguration\";\r\nimport { StateService } from \"@uirouter/core\";\r\nimport { IFxPService } from \"../interfaces/IFxpService\";\r\nimport { FxpGlobalStoreService } from \"../services/fxp.global.store.service\";\r\nimport { TelemetryConstants } from \"../telemetry/TelemetryConst\";\r\nimport { FeatureUsageEvent } from \"../telemetry/FeatureUsageEvent\";\r\nimport {\r\n ActionStatus,\r\n ActionType,\r\n ComponentType,\r\n EventName,\r\n} from \"@microsoftit/telemetry-extensions-npm\";\r\n/**\r\n * @application Fxp\r\n */\r\n/**\r\n * @module Fxp.Services\r\n */\r\n/**\r\n * A service to connect to FxpBreadcrumbService to maintain breadcrumb across all routes\r\n * @class Fxp.Services.FxpBreadcrumbService\r\n * @classdesc A service to connect to FxpBreadcrumbService to maintain breadcrumb\r\n * @example Example to create an instance of FxpBreadcrumbService\r\n * //Initializing FxpBreadcrumbService\r\n * angular.module('FxPApp').controller('LeftNavController', ['FxpBreadcrumbService', LeftNavController]);\r\n * function LeftNavController(FxpBreadcrumbService){ FxpBreadcrumbService.setBreadcrumbsObj(userAlias,roleGroupId); }\r\n */\r\nexport class FxpBreadcrumbService implements IFxPService {\r\n private $state;\r\n private $rootScope: IRootScope;\r\n private $q: angular.IQService;\r\n private fxpStorageService: FxpStorageService;\r\n private static _instance: FxpBreadcrumbService;\r\n private userInfoService: UserInfoService;\r\n private dashboardService: DashboardService;\r\n private fxpConfigurationService: FxpConfigurationService;\r\n private fxpLogger: ILogger;\r\n private fxpTelemetryContext: TelemetryContext;\r\n private sourceForTelemetry = `${TelemetryConstants.FXP_TELEMETRY_BASE_NAME}.FxpBreadcrumbService`;\r\n public isLeftNavItemClicked: boolean;\r\n\r\n constructor(\r\n $state: StateService,\r\n $q: angular.IQService,\r\n $rootScope: IRootScope,\r\n fxpStorageService: FxpStorageService,\r\n userInfoService: UserInfoService,\r\n dashboardService: DashboardService,\r\n fxpConfigurationService: FxpConfigurationService,\r\n fxpLogger: ILogger,\r\n fxpTelemetryContext: TelemetryContext,\r\n private globalStore: FxpGlobalStoreService\r\n ) {\r\n this.$state = $state;\r\n this.$q = $q;\r\n this.fxpStorageService = fxpStorageService;\r\n this.userInfoService = userInfoService;\r\n this.dashboardService = dashboardService;\r\n this.fxpConfigurationService = fxpConfigurationService;\r\n this.fxpTelemetryContext = fxpTelemetryContext;\r\n this.fxpLogger = fxpLogger;\r\n this.$rootScope = $rootScope;\r\n this.isLeftNavItemClicked = false;\r\n }\r\n\r\n /**\r\n * Create the breadcrumb item and update the breadcrumb Array\r\n * @method Fxp.Services.FxpBreadcrumbService.setBreadcrumbFromRoute\r\n * @param {toState } toState current state object.\r\n * @example Example to invoke setBreadcrumbFromRoute\r\n * FxpBreadcrumbService.setBreadcrumbFromRoute();\r\n */\r\n setBreadcrumbFromRoute(toState: any): void {\r\n var self = this;\r\n var breadcrumbText = !CommonUtils.isNullOrEmpty(toState.data.breadcrumbText)\r\n ? toState.data.breadcrumbText\r\n : \"\";\r\n var href = self.$state.href(toState.name);\r\n if (!breadcrumbText || !href || href.indexOf(\"//\") > -1)\r\n //Don't update breadcrumb for invalid urls'\r\n return;\r\n self.setCurrentPageBreadcrumb({\r\n displayName: breadcrumbText,\r\n href: href,\r\n });\r\n }\r\n\r\n /**\r\n * Set the Breadcrumb for Current Page\r\n * @method Fxp.Services.FxpBreadcrumbService.setCurrentPageBreadcrumb\r\n * @param {breadcrumbItem } breadcrumbItem breadcrumbItem of current page.\r\n * @example Example to invoke setCurrentPageBreadcrumb\r\n * FxpBreadcrumbService.setCurrentPageBreadcrumb(breadcrumbItem);\r\n */\r\n setCurrentPageBreadcrumb(breadcrumbItem: any): void {\r\n var self = this;\r\n var currentStateName = self.$state.current.name;\r\n self.startNewBreadcrumbOnSpecificState(currentStateName);\r\n if (self.isLeftNavItemClicked) {\r\n self.$rootScope.fxpBreadcrumb = new Array();\r\n }\r\n self.setBreadcrumb(breadcrumbItem);\r\n self.isLeftNavItemClicked = false;\r\n }\r\n\r\n /**\r\n * Add breadcrumb item by partners\r\n * @method Fxp.Services.FxpBreadcrumbService.setBreadcrumbItem\r\n * @param {breadcrumbItem } breadcrumbItem breadcrumbItem object.\r\n * @example Example to invoke setBreadcrumbItem\r\n * FxpBreadcrumbService.setBreadcrumbItem(breadcrumbItem);\r\n */\r\n setBreadcrumbItem(breadcrumbItem: any): void {\r\n var self = this;\r\n self.setBreadcrumb(breadcrumbItem);\r\n }\r\n\r\n /**\r\n * Save and Get the breadcrumb array in $rootScope.fxpBreadcrumb and localStorage\r\n * @method Fxp.Services.FxpBreadcrumbService.setBreadcrumb\r\n * @param {breadcrumbItem } breadcrumbItem breadcrumbItem object.\r\n * @example Example to invoke setBreadcrumb\r\n * FxpBreadcrumbService.setBreadcrumb(breadcrumbItem);\r\n */\r\n private setBreadcrumb(breadcrumbItem: any): void {\r\n var self = this;\r\n var storageKey =\r\n self.userInfoService.getCurrentUser() +\r\n \"-\" +\r\n ApplicationConstants.FxpBreadcrumbStorageKey;\r\n var userNavigatedStatesWithBreadcrumb =\r\n self.fxpStorageService.getFromLocalStorage(storageKey) || {};\r\n var newTabBreadcrumbStorageKey = CommonUtils.hashCode(breadcrumbItem.href);\r\n var prevSessionBreadcrumbArray = self.fxpStorageService.getFromLocalStorage(\r\n newTabBreadcrumbStorageKey\r\n );\r\n if (prevSessionBreadcrumbArray) {\r\n self.$rootScope.fxpBreadcrumb = prevSessionBreadcrumbArray;\r\n self.fxpStorageService.deleteFromLocalStorage(newTabBreadcrumbStorageKey);\r\n }\r\n if (!self.$rootScope.fxpBreadcrumb)\r\n self.$rootScope.fxpBreadcrumb = new Array();\r\n var expectedBreadcrumbForCurrentState =\r\n self.getExpectedBreadcrumbForCurrentState(\r\n self.$rootScope.fxpBreadcrumb,\r\n breadcrumbItem\r\n );\r\n var breadcrumbArraySearchKey = CommonUtils.hashCode(\r\n self.$state.current.name.toLowerCase() +\r\n \"_\" +\r\n (breadcrumbItem.href ? breadcrumbItem.href.toLowerCase() : \"\") +\r\n \"_\" +\r\n breadcrumbItem.displayName.toLowerCase()\r\n );\r\n var isBreadcrumbStateExist =\r\n userNavigatedStatesWithBreadcrumb.hasOwnProperty(\r\n breadcrumbArraySearchKey\r\n );\r\n if (!isBreadcrumbStateExist) {\r\n self.$rootScope.fxpBreadcrumb = self.updateBreadcrumb(\r\n self.$rootScope.fxpBreadcrumb,\r\n breadcrumbItem\r\n );\r\n userNavigatedStatesWithBreadcrumb[breadcrumbArraySearchKey] =\r\n self.$rootScope.fxpBreadcrumb;\r\n self.fxpStorageService.saveInLocalStorage(\r\n storageKey,\r\n userNavigatedStatesWithBreadcrumb\r\n );\r\n } else {\r\n if (\r\n (self.$rootScope.fxpBreadcrumb === undefined ||\r\n self.$rootScope.fxpBreadcrumb.length == 0) &&\r\n !self.isLeftNavItemClicked\r\n ) {\r\n self.$rootScope.fxpBreadcrumb =\r\n userNavigatedStatesWithBreadcrumb[breadcrumbArraySearchKey];\r\n return;\r\n }\r\n var storedBreadcrumbForCurrentState =\r\n userNavigatedStatesWithBreadcrumb[breadcrumbArraySearchKey];\r\n if (\r\n CommonUtils.hashCode(\r\n JSON.stringify(expectedBreadcrumbForCurrentState)\r\n ) ===\r\n CommonUtils.hashCode(JSON.stringify(storedBreadcrumbForCurrentState))\r\n ) {\r\n self.$rootScope.fxpBreadcrumb = storedBreadcrumbForCurrentState;\r\n } else {\r\n self.$rootScope.fxpBreadcrumb = expectedBreadcrumbForCurrentState;\r\n userNavigatedStatesWithBreadcrumb[breadcrumbArraySearchKey] =\r\n expectedBreadcrumbForCurrentState;\r\n self.fxpStorageService.saveInLocalStorage(\r\n storageKey,\r\n userNavigatedStatesWithBreadcrumb\r\n );\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * check if breadcrumb item is exist or not in current breadcrumb list\r\n * @method Fxp.Services.FxpBreadcrumbService.updateBreadcrumb\r\n * @param {breadcrumbList } breadcrumbList breadcrumb list\r\n * @param {breadcrumbItem } breadcrumbItem breadcrumbItem\r\n * @example Example to invoke updateBreadcrumb\r\n * FxpBreadcrumbService.updateBreadcrumb(breadcrumbList, breadcrumbItem);\r\n */\r\n private updateBreadcrumb(breadcrumbList: any, breadcrumbItem: any): any {\r\n var breadcrumbItemIndex = -1;\r\n for (let i = 0, length = breadcrumbList.length; i < length; i++) {\r\n if (\r\n breadcrumbList[i].displayName.toLowerCase() ===\r\n breadcrumbItem.displayName.toLowerCase()\r\n ) {\r\n breadcrumbItemIndex = i;\r\n breadcrumbList[i].href = breadcrumbItem.href;\r\n break;\r\n }\r\n }\r\n if (breadcrumbItemIndex > -1) {\r\n breadcrumbList.splice(breadcrumbItemIndex + 1);\r\n } else {\r\n breadcrumbList.push(breadcrumbItem);\r\n }\r\n return breadcrumbList;\r\n }\r\n\r\n /**\r\n * expected breadcrumb when we visit the page.\r\n * @method Fxp.Services.FxpBreadcrumbService.getExpectedBreadcrumbForCurrentState\r\n * @param {breadcrumbList } breadcrumbList breadcrumb list\r\n * @param {breadcrumbItem } breadcrumbItem breadcrumbItem\r\n * @example Example to invoke getExpectedBreadcrumbForCurrentState\r\n * FxpBreadcrumbService.getExpectedBreadcrumbForCurrentState(breadcrumbList, breadcrumbItem);\r\n */\r\n private getExpectedBreadcrumbForCurrentState(\r\n breadcrumbList: any,\r\n breadcrumbItem: any\r\n ): any {\r\n var self = this;\r\n return self.updateBreadcrumb(angular.copy(breadcrumbList), breadcrumbItem);\r\n }\r\n\r\n /**\r\n * in special case where a breadcrumb start as fresh\r\n * @method Fxp.Services.FxpBreadcrumbService.startNewBreadcrumbOnSpecificState\r\n * @param {currentStateName } currentStateName current state name.\r\n * @example Example to invoke startNewBreadcrumbOnSpecificState\r\n * FxpBreadcrumbService.startNewBreadcrumbOnSpecificState(currentStateName);\r\n */\r\n private startNewBreadcrumbOnSpecificState(currentStateName): void {\r\n var self = this;\r\n var nonGLNStateCollectionForBreadcrumb =\r\n self.fxpConfigurationService.FxpBaseConfiguration\r\n .NonGLNStateCollectionForBreadcrumb;\r\n var isStateAvailable = nonGLNStateCollectionForBreadcrumb.some((item) => {\r\n return item.toLowerCase() === currentStateName.toLowerCase();\r\n });\r\n if (isStateAvailable) {\r\n self.$rootScope.fxpBreadcrumb = new Array();\r\n }\r\n }\r\n\r\n /**\r\n * Breadcrumb info capture in Telemetry when user navigate different link options\r\n * @method Fxp.Services.FxpBreadcrumbService.logBreadcrumbTelemetryInfo\r\n * @example Example to invoke logBreadcrumbTelemetryInfo\r\n * FxpBreadcrumbService.logBreadcrumbTelemetryInfo();\r\n */\r\n public logBreadcrumbTelemetryInfo(type: string, breadcrumbItem: any): void {\r\n var self = this,\r\n propBag,\r\n userInfo,\r\n breadcrumbString;\r\n var profile = self.globalStore.GetPlatformState().LoggedInUser.Profile;\r\n if (!CommonUtils.isNullOrEmpty(profile)) userInfo = JSON.stringify(profile);\r\n if (!self.$rootScope.fxpBreadcrumb || !userInfo) return;\r\n\r\n var loginUserInfo = JSON.parse(userInfo);\r\n\r\n if (CommonUtils.isNullOrEmpty(breadcrumbItem)) {\r\n breadcrumbString = self.$rootScope.fxpBreadcrumb\r\n .map(function (breadcrumbItem) {\r\n return breadcrumbItem.displayName;\r\n })\r\n .join(\" > \");\r\n } else {\r\n //To handle breadcrumb text on breadcrumb Click, Need to build breadcrumb text by the item clicked.\r\n var breadcrumbForClick = self.updateBreadcrumb(\r\n self.$rootScope.fxpBreadcrumb,\r\n breadcrumbItem\r\n );\r\n breadcrumbString = breadcrumbForClick\r\n .map(function (breadcrumbItem) {\r\n return breadcrumbItem.displayName;\r\n })\r\n .join(\" > \");\r\n }\r\n\r\n propBag = self.fxpLogger.createPropertyBag();\r\n propBag.addToBag(\r\n FxpConstants.metricConstants.SessionId,\r\n self.$rootScope.sessionId\r\n );\r\n propBag.addToBag(\r\n FxpConstants.metricConstants.UserBusinessRole,\r\n loginUserInfo.businessRole\r\n );\r\n\r\n if (self.userInfoService.isActingOnBehalfOf()) {\r\n var oboUserInfo;\r\n let profile = self.globalStore.GetPlatformState().CurrentUser.Profile;\r\n if (!CommonUtils.isNullOrEmpty(profile))\r\n oboUserInfo = JSON.stringify(profile);\r\n if (!oboUserInfo) return;\r\n var oboUserData = JSON.parse(oboUserInfo);\r\n propBag.addToBag(\r\n FxpConstants.metricConstants.OBOUserBusinessRole,\r\n oboUserData.OBOUserBusinessRole\r\n );\r\n }\r\n propBag.addToBag(\r\n FxpConstants.metricConstants.TimeStamp,\r\n FxpLogHelper.getTimeStamp()\r\n );\r\n propBag.addToBag(\r\n FxpConstants.metricConstants.BreadcrumbString,\r\n breadcrumbString\r\n );\r\n\r\n if (type === FxpConstants.BreadcrumbEventType.BreadcrumbClick) {\r\n self.fxpLogger.logInformation(\r\n self.sourceForTelemetry,\r\n `${TelemetryConstants.FXP_TELEMETRY_BASE_NAME}.BreadcrumbItemClicked`,\r\n propBag\r\n );\r\n const breadcrumbFeature = new FeatureUsageEvent(\r\n `${TelemetryConstants.FXP_TELEMETRY_BASE_NAME}.Breadcrumb`,\r\n ActionType.User,\r\n \"BreadcrumbClicked\",\r\n EventName.LinkClicked,\r\n ComponentType.Web\r\n );\r\n breadcrumbFeature.ActionStatus = ActionStatus.Succeeded;\r\n self.fxpLogger.logFeatureUsageEvent(\r\n self.sourceForTelemetry,\r\n breadcrumbFeature,\r\n propBag\r\n );\r\n } else {\r\n self.fxpLogger.logInformation(\r\n self.sourceForTelemetry,\r\n `${TelemetryConstants.FXP_TELEMETRY_BASE_NAME}.BreadcrumbLoad`,\r\n propBag\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * Store the current fxpBreadcrumb array into localStorage with newTabBreadcrumbStorageKey\r\n * Before opening any link in newtab through click action, have to call setTempBreadcrumbArray\r\n * @method Fxp.Services.FxpBreadcrumbService.setTempBreadcrumbArray\r\n * @example Example to invoke setTempBreadcrumbArray\r\n * FxpBreadcrumbService.setTempBreadcrumbArray();\r\n */\r\n setTempBreadcrumbArray(url: string): void {\r\n var self = this;\r\n var newTabBreadcrumbStorageKey = CommonUtils.hashCode(url);\r\n self.fxpStorageService.saveInLocalStorage(\r\n newTabBreadcrumbStorageKey,\r\n self.$rootScope.fxpBreadcrumb\r\n );\r\n }\r\n\r\n /**\r\n * Partners can override the current State/Url breadcrumbItem displayName using this method\r\n * @method Fxp.Services.FxpBreadcrumbService.overrideBreadcrumbText\r\n * @param {breadcrumbText } breadcrumbText of the current state/url.\r\n * @example Example to invoke overrideBreadcrumbText\r\n * FxpBreadcrumbService.overrideBreadcrumbText(breadcrumbText);\r\n */\r\n overrideBreadcrumbText(breadcrumbText: string): void {\r\n var self = this;\r\n self.updateDisplayNameForCurrentBreadcrumbItem(breadcrumbText);\r\n }\r\n\r\n /**\r\n * Update the DisplayName of current State/Url breadcrumbItem\r\n * @method Fxp.Services.FxpBreadcrumbService.updateDisplayNameForCurrentBreadcrumbItem\r\n * @param {breadcrumbText } breadcrumbText of the current state/url.\r\n * @example Example to invoke updateDisplayNameForCurrentBreadcrumbItem\r\n * FxpBreadcrumbService.updateDisplayNameForCurrentBreadcrumbItem(breadcrumbText);\r\n */\r\n updateDisplayNameForCurrentBreadcrumbItem(breadcrumbText: string): void {\r\n var self = this;\r\n if (\r\n self.$rootScope.fxpBreadcrumb &&\r\n self.$rootScope.fxpBreadcrumb.length > 0\r\n ) {\r\n self.$rootScope.fxpBreadcrumb[\r\n self.$rootScope.fxpBreadcrumb.length - 1\r\n ].displayName = breadcrumbText;\r\n }\r\n }\r\n\r\n /**\r\n * Method to get the index of breadcrumbItem from breadcrumb context.\r\n * @method Fxp.Services.FxpBreadcrumbService.getBreadcrumbItemIndex\r\n * @param {fxpBreadcrumbContext } fxpBreadcrumbContext is an array.\r\n * @param {breadcrumbName } breadcrumbName is the displayName of the breadcrumbItem.\r\n * @example Example to invoke getBreadcrumbItemIndex\r\n * FxpBreadcrumbService.getBreadcrumbItemIndex(fxpBreadcrumbContext, breadcrumbItem);\r\n */\r\n getBreadcrumbItemIndex(\r\n fxpBreadcrumbContext: any,\r\n breadcrumbName: string\r\n ): number {\r\n if (!fxpBreadcrumbContext || !breadcrumbName) {\r\n return -1;\r\n }\r\n for (var i = 0; i < fxpBreadcrumbContext.length; i++) {\r\n if (\r\n fxpBreadcrumbContext[i].displayName.toLowerCase() ===\r\n breadcrumbName.toLowerCase()\r\n ) {\r\n return i;\r\n }\r\n }\r\n return -1;\r\n }\r\n\r\n /**\r\n * Method to save the context of breadcrumb for the current state/url in local storage.\r\n * @method Fxp.Services.FxpBreadcrumbService.saveBreadcrumbContextForCurrentState\r\n * @example Example to invoke saveBreadcrumbContextForCurrentState\r\n * FxpBreadcrumbService.saveBreadcrumbContextForCurrentState(breadcrumbArray);\r\n */\r\n saveBreadcrumbContextForCurrentState(): void {\r\n var self = this;\r\n var breadcrumbLastItem =\r\n self.$rootScope.fxpBreadcrumb[self.$rootScope.fxpBreadcrumb.length - 1];\r\n var storageKey =\r\n self.userInfoService.getCurrentUser() +\r\n \"-\" +\r\n ApplicationConstants.FxpBreadcrumbStorageKey;\r\n var userNavigatedStatesWithBreadcrumb =\r\n self.fxpStorageService.getFromLocalStorage(storageKey) || {};\r\n var breadcrumbArraySearchKey = CommonUtils.hashCode(\r\n self.$state.current.name.toLowerCase() +\r\n \"_\" +\r\n (breadcrumbLastItem.href ? breadcrumbLastItem.href.toLowerCase() : \"\") +\r\n \"_\" +\r\n breadcrumbLastItem.displayName.toLowerCase()\r\n );\r\n userNavigatedStatesWithBreadcrumb[breadcrumbArraySearchKey] =\r\n self.$rootScope.fxpBreadcrumb;\r\n self.fxpStorageService.saveInLocalStorage(\r\n storageKey,\r\n userNavigatedStatesWithBreadcrumb\r\n );\r\n }\r\n\r\n /**\r\n * Method to update the url of breadcrumbItem which is sent by partners.\r\n * @method Fxp.Services.FxpBreadcrumbService.updateBreadcrumbUrlByName\r\n * @param {breadcrumbName } breadcrumbName is the displayName of the breadcrumbItem.\r\n * @param {newUrl } newUrl is href of breadcrumbItem.\r\n * @example Example to invoke updateBreadcrumbUrlByName\r\n * FxpBreadcrumbService.updateBreadcrumbUrlByName(breadcrumbName, newUrl);\r\n */\r\n updateBreadcrumbUrlByName(breadcrumbName: string, newUrl: string): void {\r\n var self = this;\r\n var breadcrumbItemIndex = self.getBreadcrumbItemIndex(\r\n self.$rootScope.fxpBreadcrumb,\r\n breadcrumbName\r\n );\r\n if (breadcrumbItemIndex > -1) {\r\n self.$rootScope.fxpBreadcrumb[breadcrumbItemIndex].href = newUrl;\r\n }\r\n self.saveBreadcrumbContextForCurrentState();\r\n }\r\n}\r\n","export enum FxpBroadcastedEvents {\r\n OnUserContextChanged = \"UserContextChanged\",\r\n OnLeftNavHighlightByStateName = \"HighlightLeftNavByStateName\",\r\n OnLeftNavToggleExpandedState = \"toggleLeftNavExpandedState\",\r\n OnLeftNavTogglePinState = \"toggleLeftNavPinState\",\r\n OnFxpLoadCompleted = \"OnFxpLoadedEvent\",\r\n OnAppHeaderChanged = \"AppHeaderChanged\",\r\n OnPageTitleChanged = \"PageTitleChanged\",\r\n OnFeedbackContextChanged = \"FeedbackContext\",\r\n OnFeedbackConfigurationChanged = \"FeedbackConfiguration\",\r\n OnNewNotificationsRecieved = \"newNotifications\",\r\n OnShowHideInlineLoader = \"showHideInlineLoader\",\r\n OnBasicUserProfileRefresh = \"GetLatestBasicUserProfile\",\r\n OnLayoutChanged = \"layoutChanged\",\r\n OnPageLoadComplete = \"OnPageLoadComplete\",\r\n OnUserSessionTimeout = \"FxPUserSessionTimeout\",\r\n OnLaunchIrisBot = 'LaunchIrisBot',\r\n\tOnHideIrisBot = 'HideIrisBot',\r\n OnPageTourFlyoutOpened = 'PageTourFlyoutOpened',\r\n OnPageTourFlyoutClosed = 'PageTourFlyoutClosed',\r\n LaunchHelpSection = 'LaunchHelpSection',\r\n HidePageTour = 'HidePageTour',\r\n ShowPageTour = 'ShowPageTour',\r\n ActOnBehalfClosed = \"ActOnBehalfClosed\",\r\n ShowPopupOnPageDirty = \"ShowPopupOnPageDirty\"\r\n}","import { IStateConfig } from \"../interfaces/IStateConfig\";\r\n\r\nexport class FxpComponentRegistrationService {\r\n\r\n\tprivate static _partnerRoutes = {};\r\n\tprivate static _partnerEndpoints = {};\r\n\tprivate static _registeredNG1Modules: Array = new Array(); \r\n\tprivate static _registeredNG2Modules: Array = new Array(); \r\n\t\r\n\tpublic static registerEndpoints(endpoint: string, clientId: string) {\r\n\t\tif (!this._partnerEndpoints[endpoint])\r\n\t\t\tthis._partnerEndpoints[endpoint] = clientId;\r\n\t}\r\n\tpublic static getRegisterEndpoints(){\r\n\t\treturn this._partnerEndpoints;\r\n\t}\r\n\r\n\tpublic static registerRoute(routeConfig: IStateConfig):void {\r\n\t\tif (!this._partnerRoutes[routeConfig.name] && this.isValidRoute(routeConfig)) {\r\n\t\t\tthis._partnerRoutes[routeConfig.name] = routeConfig;\r\n\t\t}\r\n\t}\r\n\r\n\tpublic static getRegisteredRoutes() {\r\n\t\treturn this._partnerRoutes;\r\n\t}\r\n\r\n\tpublic static registerAngular1Module(moduleName: string) {\r\n\t\tif (!moduleName || moduleName.trim().length === 0) {\r\n\t\t\tconsole.log(\"Failed to register module as Module Name is missing\");\r\n\t\t\treturn; \r\n\t\t}\r\n\t\tif (!this._registeredNG1Modules.includes(moduleName)) {\r\n\t\t\tthis._registeredNG1Modules.push(moduleName);\r\n\t\t}\r\n\t}\r\n\r\n\tpublic static registerAngular2Module(module: any) {\r\n\t\tif (!module) {\r\n\t\t\tconsole.log(\"Failed to register module as Module is missing\");\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tif (! this.isModuleAlreadyRegistered(module, this._registeredNG2Modules)) {\r\n\t\t\tthis._registeredNG2Modules.push(module);\r\n\t\t}\r\n\t\t\r\n\t}\r\n\r\n\tprivate static isModuleAlreadyRegistered(module: any, container: any): boolean {\r\n\t\tfor (let i = 0; i < container.length; i++) {\r\n\t\t\tif (container[i].name === module.name) return true;\r\n\t\t}\r\n\t\treturn false;\r\n\t}\r\n\r\n\tpublic static getRegisteredAngular2Modules() {\r\n\t\treturn this._registeredNG2Modules;\r\n\t}\r\n\r\n\tprivate static isValidRoute(stateConfig: IStateConfig) {\r\n\t\tconst stateName: string = \"name\";\r\n\t\tconst appHeader: string = \"headerName\";\r\n\t\tconst breadcrumbText: string = \"breadcrumbText\";\r\n\t\tconst pageTitle: string = \"pageTitle\";\r\n\t\tconst url: string = \"url\";\r\n\t\tconst component: string = \"component\";\r\n\t\tconst templateUrl: string = \"templateUrl\";\r\n\r\n\t\tif (!this.hasValue(stateConfig, stateName)) {\r\n\t\t\tthis.logToConsole(stateName);\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\tif (!this.hasValue(stateConfig.data, appHeader)) {\r\n\t\t\tthis.logToConsole(appHeader);\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\tif (!this.hasValue(stateConfig.data, breadcrumbText)) {\r\n\t\t\tthis.logToConsole(breadcrumbText);\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\tif (!this.hasValue(stateConfig.data, pageTitle)) {\r\n\t\t\tthis.logToConsole(pageTitle);\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tif (!this.hasValue(stateConfig, url)) {\r\n\t\t\tthis.logToConsole(url);\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\r\n\t\tif (!this.hasValue(stateConfig, component) && !this.hasValue(stateConfig, templateUrl)) {\r\n\t\t\tthis.logToConsole(component + \" or \" + templateUrl);\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\treturn true;\r\n\t}\r\n\r\n\tprivate static logToConsole(propertyName: string): void {\r\n\t\tconsole.log(propertyName + \" is a mandatory parameter for route which is missing. \");\r\n\t}\r\n\r\n\tprivate static hasValue(configObject: any, propertyName: string): boolean {\r\n\t\tif (!configObject[propertyName] || configObject[propertyName].toString().trim().length === 0) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\treturn true;\r\n\t}\r\n\r\n}\r\n","import { IFxPService } from \"../interfaces/IFxpService\";\r\n\r\n/**\r\n * @application Fxp\r\n */\r\n/**\r\n * @module Fxp.Services\r\n */\r\n/**\r\n * A service to keep all the configurations used for the application in \r\n * @class Fxp.Services.FxpConfiguration\r\n * @classdesc A service to keep all the settings required for base, application and telemetry settings \r\n * @example Example to use one from FxpConfiguration \r\n * //Using in a Controller\r\n * angular.module('FxPApp').controller('AppController', ['FxpConfigurationService', AppController]);\r\n * function AppController(fxpConfigurationService){ var appSettings = fxpConfigurationService.fxpAppSettings; }\r\n */\r\nexport class FxpConfigurationService implements IFxPService {\r\n\tpublic fxpAppSettings = window[\"FxpAppSettings\"];\r\n\t//TODO: Below two config's should be fetched through Confit service connected from client side\r\n\tprivate fxpBaseConfiguration = window[\"FxpBaseConfiguration\"];\r\n\tprivate modelConfiguration = window[\"ModelConfiguration\"];\r\n\r\n\tpublic get FxpAppSettings(): any {\r\n\t\treturn this.fxpAppSettings;\r\n\t}\r\n\r\n\tget FxpBaseConfiguration(): any {\r\n\t\treturn this.fxpBaseConfiguration;\r\n\t}\r\n\r\n\tget ModelConfiguration(): any {\r\n\t\treturn this.modelConfiguration;\r\n\t}\r\n\r\n\tGetConfiguration(config: string): any {\r\n\r\n\t\tif (window[\"tenantConfiguration\"] && window[\"tenantConfiguration\"][config]) {\r\n\t\t\treturn window[\"tenantConfiguration\"][config];\r\n\t\t}\r\n\t\telse if (this.FxpBaseConfiguration && this.FxpBaseConfiguration[config]) {\r\n\t\t\treturn this.FxpBaseConfiguration[config];\r\n\t\t}\r\n\t\telse if (this.FxpAppSettings && this.FxpAppSettings[config]) {\r\n\t\t\treturn this.FxpAppSettings[config];\r\n\t\t}\r\n\t\telse return;\r\n\r\n\t}\r\n\r\n}","import { ILogger } from \"../interfaces/ILogger\";\r\nimport { TelemetryContext } from \"../telemetry/telemetrycontext\";\r\nimport { FxpConstants } from \"../common/ApplicationConstants\";\r\nimport { UserInfoService } from \"./UserInfoService\";\r\nimport { UserProfileService } from \"./userProfileService\";\r\nimport { FxpBroadcastedEvents } from \"./FxpBroadcastedEvents\";\r\nimport { IFxPService } from \"../interfaces/IFxpService\";\r\nimport { TelemetryConstants } from \"../telemetry/TelemetryConst\";\r\nimport { ErrorCodes } from \"../constants/errorCodes\";\r\nimport { ErrorSeverityLevel } from \"../telemetry/ErrorSeverityLevel\";\r\n\r\nexport class FxpFeedbackService implements IFxPService {\r\n\tprivate fxplogger: ILogger;\r\n\tprivate userInfoService: UserInfoService;\r\n\tprivate fxpTelemetryContext: TelemetryContext;\r\n\tprivate userProfileService: UserProfileService;\r\n\tprivate rootscope: angular.IRootScopeService;\r\n\tprivate feedbackRouteData: any = {};\r\n\tprivate feedbackPropBag = {};\r\n\tprivate _feedbackItemCollection: any = [];\r\n\tprivate _userId: string = \"\";\r\n\tprivate _subscriprtionId: string = \"\";\r\n\tprivate _feedbackServiceEndpoint: string = \"\";\r\n\tprivate sourceForTelemetry = `${TelemetryConstants.FXP_TELEMETRY_BASE_NAME}.FeedbackService`;\r\n\tconstructor(loggerService: ILogger, rootscope: angular.IRootScopeService, userInfoService: UserInfoService, fxpTelemetryContext: TelemetryContext, userProfileService: UserProfileService) {\r\n\t\tthis.fxplogger = loggerService;\r\n\t\tthis.userInfoService = userInfoService;\r\n\t\tthis.rootscope = rootscope;\r\n\t\tthis.fxpTelemetryContext = fxpTelemetryContext;\r\n\t\tthis.userProfileService = userProfileService;\r\n\t}\r\n\r\n\t/**\r\n\t* sets setBrowserTitle of FeedbackService Context Object\r\n\t* @method Fxp.Services.FxpFeedbackService.setBrowserTitle\r\n\t* @param {string} setBrowserTitle a broser tab title.\r\n\t* @example Example to invoke setBrowserTitle\r\n\t* FeedbackWidgetContextService.setBrowserTitle('xxxxxx');\r\n\t*/\r\n\tsetBrowserTitle(browserTitle) {\r\n\t\tvar self = this;\r\n\t\tif (browserTitle) {\r\n\t\t\tself.feedbackRouteData[\"BrowserPageTitle\"] = browserTitle;\r\n\t\t\tself.addToFeedbackPropBag(\"BrowserPageTitle\", browserTitle);\r\n\t\t\tself.rootscope.$broadcast(FxpBroadcastedEvents.OnFeedbackContextChanged);\r\n\t\t}\r\n\t};\r\n\r\n\t/**\r\n\t* sets setScreenRoute of FeedbackService Context Object\r\n\t* @method Fxp.Services.FxpFeedbackService.setScreenRoute\r\n\t* @param {object} currentRoute a user navigated screen Route.\r\n\t* @example Example to invoke setScreenRoute\r\n\t* Fxp.Services.FxpFeedbackService.setScreenRoute('xxxxxx');\r\n\t*/\r\n\tsetScreenRoute(currentRoute) {\r\n\t\tvar self = this;\r\n\t\tif (currentRoute) {\r\n\t\t\tself.feedbackRouteData[\"ScreenRoute\"] = currentRoute;\r\n\t\t\tself.addToFeedbackPropBag(\"ScreenRoute\", currentRoute);\r\n\t\t\tself.rootscope.$broadcast(FxpBroadcastedEvents.OnFeedbackContextChanged);\r\n\t\t}\r\n\t};\r\n\r\n\t/**\r\n\t* sets setFeedbackServiceProperties for FeedbackService Context Object\r\n\t* @method Fxp.Services.FxpFeedbackService.setFeedbackServiceProperties\r\n\t* @param {object } usersDetails a userdetail object having userName, BusinessRole.\r\n\t* @example Example to invoke setFeedbackServiceProperties\r\n\t* Fxp.Services.FxpFeedbackService.setFeedbackServiceProperties();\r\n\t*/\r\n\tsetFeedbackServiceProperties(usersDetails) {\r\n\t\tvar self = this;\r\n\t\tself.removeFeedbackPropBagRange();\r\n\t\tself.addFeedbackPropBagRange(usersDetails);\r\n\t\tself.addFeedbackPropBagRange(self.getEnvironmentDetails());\r\n\t\tself.addFeedbackPropBagRange(self.feedbackRouteData);\r\n\t\tself.rootscope.$broadcast(FxpBroadcastedEvents.OnFeedbackContextChanged);\r\n\t}\r\n\r\n\t/**\r\n\t* get EnvironmentDetails for FeedbackService Context Object\r\n\t* @method Fxp.Services.FxpFeedbackService.getEnvironmentDetails\r\n\t* @example Example to invoke getEnvironmentDetails\r\n\t* Fxp.Services.FxpFeedbackService.getEnvironmentDetails();\r\n\t*/\r\n\tgetEnvironmentDetails(): any {\r\n\t\tvar self = this;\r\n\t\tvar feedbackEnvData = self.fxpTelemetryContext.getEnvironmentDetails(null);\r\n\t\tif (!feedbackEnvData)\r\n\t\t\treturn;\r\n\r\n\t\treturn {\r\n\t\t\tEnvironmentName: feedbackEnvData.EnvironmetName,\r\n\t\t\tService: feedbackEnvData.Service,\r\n\t\t\tServiceOffering: feedbackEnvData.ServiceOffering,\r\n\t\t\tServiceLine: feedbackEnvData.ServiceLine\r\n\t\t}\r\n\t};\r\n\r\n\t/**\r\n\t* this method is used to accumulate all application specific proprities for FeedbackComponent\r\n\t* @method Fxp.Services.FxpFeedbackService.setUserDetailsToFeedback\r\n\t* @example Example to invoke setUserDetailsToFeedback\r\n\t* Fxp.Services.FxpFeedbackService.setUserDetailsToFeedback();\r\n\t*/\r\n\tsetUserDetailsToFeedback(): void {\r\n\t\tvar self = this, userDetails, oboUserBasicInfo;\r\n\t\tself.userProfileService.getBasicProfileByAlias(self.userInfoService.getLoggedInUser(), null).then(function (loginUserBasicInfo:any) {\r\n\t\t\tif (!loginUserBasicInfo)\r\n\t\t\t\treturn\r\n\r\n\t\t\tuserDetails =\r\n\t\t\t\t{\r\n\t\t\t\t\tUserId: self.userInfoService.getLoggedInUserUpn(),\r\n\t\t\t\t\tUserName: loginUserBasicInfo.fullName,\r\n\t\t\t\t\tBusinessRole: loginUserBasicInfo.businessRole,\r\n\t\t\t\t\tRoleGroupName: loginUserBasicInfo.roleGroupName\r\n\t\t\t\t}\r\n\r\n\t\t\tif (self.userInfoService.isActingOnBehalfOf()) {\r\n\t\t\t\toboUserBasicInfo = self.userInfoService.getCurrentUserData();\r\n\t\t\t\tif (!oboUserBasicInfo)\r\n\t\t\t\t\treturn\r\n\r\n\t\t\t\tuserDetails.OBOUserUPN = self.userInfoService.getCurrentUserUpn();\r\n\t\t\t\tuserDetails.OBOUserBusinessRole = oboUserBasicInfo.businessRole;\r\n\t\t\t\tuserDetails.OBOUserRoleGroupName = oboUserBasicInfo.roleGroupName;\r\n\t\t\t\tuserDetails.OBOUserName = oboUserBasicInfo.fullName;\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\tself.setFeedbackServiceProperties(userDetails);\r\n\t\t});\r\n\t}\r\n\r\n\t/**\r\n\t* sets setUserId of FeedbackService Context Object\r\n\t* @method Fxp.Services.FxpFeedbackService.setUserDetails\r\n\t* @param {string} UserID a Logged IN setUserDetails in Application.\r\n\t* @example Example to invoke setUserDetails\r\n\t* FxpFeedbackService.setUserId('xxxxxx');\r\n\t*/\r\n\tsetUserId = function (userId) {\r\n\t\tvar self = this;\r\n\t\tself._userId = userId;\r\n\t};\r\n\r\n\t/**\r\n\t* getUserID of FeedbackService Context Object\r\n\t* @method Feedback.FeedbackWidgetContextService.getUserID\r\n\t* @example Example to invoke getUserID\r\n\t* FxpFeedbackService.getUserID();\r\n\t*/\r\n\tgetUserID = function () {\r\n\t\tvar self = this;\r\n\t\treturn self._userId;\r\n\t};\r\n\r\n\t/**\r\n\t* sets setFeedbackItemCollection of FeedbackWidget Context Object\r\n\t* @method Fxp.Services.FxpFeedbackService.setFeedbackItemCollection\r\n\t* @param { any} ItemCollection a feedback dropdown item collection\r\n\t* @example Example to invoke setFeedbackItemCollection\r\n\t* FxpFeedbackService.setFeedbackItemCollection('xxxxxx');\r\n\t*/\r\n\tsetFeedbackItemCollection = function (itemCollection) {\r\n\t\tvar self = this;\r\n\t\tself._feedbackItemCollection = itemCollection;\r\n\t\tself.rootscope.$broadcast(FxpBroadcastedEvents.OnFeedbackConfigurationChanged)\r\n\t};\r\n\r\n\t/**\r\n\t* get FeedbackItemCollection of FeedbackService Context Object\r\n\t* @method Fxp.Services.FxpFeedbackService.getFeedbackItemCollection\r\n\t* @example Example to invoke getFeedbackItemCollection\r\n\t* FxpFeedbackService.getFeedbackItemCollection();\r\n\t*/\r\n\tgetFeedbackItemCollection = function () {\r\n\t\tvar self = this;\r\n\t\treturn self._feedbackItemCollection;\r\n\t};\r\n\r\n\t/**\r\n\t* sets setFeedbackEndpoint of FeedbackService Context Object\r\n\t* @method Fxp.Services.FxpFeedbackService.setFeedbackEndpoint\r\n\t* @param {string} endpoint a feedback API Endpoint.\r\n\t* @example Example to invoke setFeedbackEndpoint\r\n\t* FxpFeedbackService.setFeedbackEndpoint('xxxxxx');\r\n\t*/\r\n\tsetFeedbackEndpoint = function (endpoint) {\r\n\t\tvar self = this;\r\n\t\tself._feedbackServiceEndpoint = endpoint;\r\n\t\tself.rootscope.$broadcast(FxpBroadcastedEvents.OnFeedbackConfigurationChanged)\r\n\t};\r\n\t/**\r\n\t* sets getFeedbackEndpoint of FeedbackService Context Object\r\n\t* @method Fxp.Services.FxpFeedbackService.getFeedbackEndpoint\r\n\t* @example Example to invoke getFeedbackEndpoint\r\n\t* FxpFeedbackService.getFeedbackEndpoint();\r\n\t*/\r\n\tgetFeedbackEndpoint = function () {\r\n\t\tvar self = this;\r\n\t\treturn self._feedbackServiceEndpoint;\r\n\t};\r\n\t/**\r\n\t* sets setSubsctiptionId of FeedbackService Context Object\r\n\t* @method Fxp.Services.FxpFeedbackService.setSubsctiptionId\r\n\t* @param {string} subsctiptionId a subscrption of consumer Id .\r\n\t* @example Example to invoke setSubsctiptionId\r\n\t* FxpFeedbackService.setSubsctiptionId('xxxxxx');\r\n\t*/\r\n\tsetSubscriprtionId = function (subscriprtionId) {\r\n\t\tvar self = this;\r\n\t\tself._subscriprtionId = subscriprtionId;\r\n\t\tself.rootscope.$broadcast(FxpBroadcastedEvents.OnFeedbackConfigurationChanged)\r\n\t};\r\n\r\n\t/**\r\n\t* getSubsctiptionId of FeedbackService Context Object\r\n\t* @method Fxp.Services.FxpFeedbackService.getSubsctiptionId\r\n\t* @example Example to invoke getSubsctiptionId\r\n\t* FxpFeedbackService.getSubsctiptionId();\r\n\t*/\r\n\tgetSubscriprtionId = function () {\r\n\t\tvar self = this;\r\n\t\treturn self._subscriprtionId;\r\n\t};\r\n\r\n\t/**\r\n\t* sets addToFeedbackPropBag of FeedbackService Context Object\r\n\t* @method Fxp.Services.FxpFeedbackService.addToFeedbackPropBag\r\n\t* @param {string} key a object key.\r\n\t* @param {string} value a object value.\r\n\t* @example Example to invoke addToFeedbackPropBag\r\n\t* FxpFeedbackService.addToFeedbackPropBag('key','value');\r\n\t*/\r\n\taddToFeedbackPropBag = function (key, value) {\r\n\t\tvar self = this;\r\n\t\tself.feedbackPropBag[key] = value;\r\n\t};\r\n\t/**\r\n\t* sets getFeedbackPropBagItems of FeedbackService Context Object\r\n\t* @method Feedback.FeedbackWidgetContextService.getItems\r\n\t* @example Example to invoke getFeedbackPropBagItems\r\n\t* FxpFeedbackService.getFeedbackPropBagItems();\r\n\t*/\r\n\tgetFeedbackPropBagItems = function () {\r\n\t\tvar self = this;\r\n\t\treturn self.feedbackPropBag;\r\n\t};\r\n\t/**\r\n\t * sets addFeedbackPropBagRange of FeedbackService Context Object\r\n\t * @method Fxp.Services.FxpFeedbackService.addRange\r\n\t * @param { object } properties is collection of properties like object.\r\n\t * @example Example to invoke addFeedbackPropBagRange\r\n\t * FxpFeedbackService.addFeedbackPropBagRange('xxxxxx');\r\n\t */\r\n\taddFeedbackPropBagRange = function (properties) {\r\n\t\tvar self = this;\r\n\t\tfor (var property in properties) {\r\n\t\t\tself.addToFeedbackPropBag(property, properties[property]);\r\n\t\t}\r\n\t};\r\n\r\n\t/**\r\n\t * removeFeedbackPropBagRange of FeedbackService Context Object\r\n\t * @method Fxp.Services.FxpFeedbackService.removeFeedbackPropBagRange\r\n\t * @example Example to invoke addRange\r\n\t * FxpFeedbackService.removeFeedbackPropBagRange();\r\n\t */\r\n\tremoveFeedbackPropBagRange = function () {\r\n\t\tvar self = this;\r\n\t\tif (self.feedbackPropBag)\r\n\t\t\tself.feedbackPropBag = {};\r\n\t};\r\n\r\n\t/**\r\n\t* sets removeFromFeedbackPropBag of FeedbackService Context Object\r\n\t* @method Fxp.Services.FxpFeedbackService.removeFromFeedbackPropBag\r\n\t* @param {string} key a property key.\r\n\t* @example Example to invoke key\r\n\t* FxpFeedbackService.removeFromFeedbackPropBag('xxxxxx');\r\n\t*/\r\n\tremoveFromFeedbackPropBag = function (key) {\r\n\t\tvar self = this;\r\n\t\tdelete self.feedbackPropBag[key];\r\n\t};\r\n\r\n\r\n\t/**\r\n\t*A method to use the log the UserFeedback Information.\r\n\t* @method Fxp.Services.FxpFeedbackService.logFeedbackInformation\r\n\t* @param {feedbackInfo } toState feedbackInfo.\r\n\t* @param {feedbackStatusInfo } toState feedbackStatusInfo.\r\n\t* @param {status } toState status.\r\n\t* @param {error } toState error.\r\n\t* @example Example to use logFeedbackInformation\r\n\t* logFeedbackInformation(feedbackInfo: any, feedbackStatusInfo: string, status: string, error: any)\r\n\t*/\r\n\tlogFeedbackInformation(feedbackInfo: any, feedbackStatusInfo: string, status: string, error: any): void {\r\n\t\tvar self = this, propBag;\r\n\t\tconst telemetry_source = `${this.sourceForTelemetry}.LogFeedbackInformation`;\r\n\t\tpropBag = self.fxplogger.createPropertyBag();\r\n\t\tpropBag.addToBag(FxpConstants.metricConstants.UserUPN, feedbackInfo.userId);\r\n\t\tpropBag.addToBag(FxpConstants.metricConstants.UserBusinessRole, feedbackInfo.tags.BusinessRole);\r\n\t\tpropBag.addToBag(FxpConstants.metricConstants.UserRoleGroup, feedbackInfo.tags.RoleGroupName);\r\n\t\tpropBag.addToBag(FxpConstants.metricConstants.LoggedinUserName, feedbackInfo.tags.UserName);\r\n\t\tpropBag.addToBag(FxpConstants.metricConstants.BrowserPageTitle, feedbackInfo.tags.BrowserPageTitle);\r\n\t\tpropBag.addToBag(FxpConstants.metricConstants.FeedbackType, feedbackInfo.feedbackType);\r\n\t\tpropBag.addToBag(FxpConstants.metricConstants.Action, feedbackInfo.tags.Action);\r\n\t\tpropBag.addToBag(FxpConstants.metricConstants.UserFeedback, feedbackInfo.feedback);\r\n\t\tpropBag.addToBag(FxpConstants.metricConstants.BrowserType, feedbackInfo.tags.BrowserType);\r\n\t\tpropBag.addToBag(FxpConstants.metricConstants.BrowserVersion, feedbackInfo.tags.BrowserVersion);\r\n\t\tpropBag.addToBag(FxpConstants.metricConstants.OperatingSystem, feedbackInfo.tags.OperatingSystem);\r\n\t\tpropBag.addToBag(FxpConstants.metricConstants.ScreenRoute, feedbackInfo.tags.ScreenRoute);\r\n\t\tpropBag.addToBag(FxpConstants.metricConstants.DeviceType, feedbackInfo.tags.DeviceType);\r\n\t\tpropBag.addToBag(FxpConstants.metricConstants.TotalDuration, feedbackInfo.TotalDuration);\r\n\t\tpropBag.addToBag(FxpConstants.metricConstants.UIRenderDuration, feedbackInfo.UIRenderDuration);\r\n\r\n\t\tif (self.userInfoService.isActingOnBehalfOf()) {\r\n\t\t\tpropBag.addToBag(FxpConstants.metricConstants.OBOUserUPN, feedbackInfo.tags.OBOUserUPN);\r\n\t\t\tpropBag.addToBag(FxpConstants.metricConstants.OBOUserName, feedbackInfo.tags.OBOUserName);\r\n\t\t\tpropBag.addToBag(FxpConstants.metricConstants.OBOUserBusinessRole, feedbackInfo.tags.OBOUserBusinessRole);\r\n\t\t\tpropBag.addToBag(FxpConstants.metricConstants.OBOUserRoleGroupName, feedbackInfo.tags.OBOUserRoleGroupName);\r\n\t\t}\r\n\r\n\t\tif (status === FxpConstants.messageType.success)\r\n\t\t\tself.fxplogger.logInformation(telemetry_source, feedbackStatusInfo, propBag);\r\n\r\n\t\tif (status === FxpConstants.messageType.error)\r\n\t\t\tself.fxplogger.logError(telemetry_source, feedbackStatusInfo + \". Error Message: \" + error, ErrorCodes.FeedbackService_Error, null, propBag, null, null, ErrorSeverityLevel.Medium);\r\n\t}\r\n}\r\n","import { IFxPService } from \"../interfaces/IFxpService\";\r\n\r\n//import { Observable , from as fromPromise } from 'rxjs';\r\n\r\nexport class FxpHttpService implements IFxPService {\r\n constructor(private $http: angular.IHttpService) {\r\n }\r\n\r\n private toEs6Promise(qPromise: any) {\r\n return new Promise(function (resolve, reject) {\r\n qPromise.then(function (response) {\r\n resolve(response);\r\n }).catch(function (reason) {\r\n reject(reason);\r\n })\r\n });\r\n }\r\n get(url: string, headers?: any, responseType?: string): Promise {\r\n var self = this;\r\n return this.toEs6Promise(self.$http.get(url, { headers: headers, responseType: responseType }));\r\n }\r\n put(url: string, data: any, headers?: any): Promise {\r\n var self = this;\r\n return this.toEs6Promise(self.$http.put(url, data, { headers: headers }));\r\n }\r\n patch(url: string, data: any, headers?: any): Promise {\r\n var self = this;\r\n return this.toEs6Promise(self.$http.patch(url, data, { headers: headers }));\r\n }\r\n post(url: string, data: any, headers?: any, responseType?: string): Promise {\r\n var self = this;\r\n return this.toEs6Promise(self.$http.post(url, data, { headers: headers, responseType: responseType }));\r\n }\r\n jsonp(url: string, data: any, headers?: any): Promise {\r\n var self = this;\r\n return this.toEs6Promise(self.$http.jsonp(url, { headers: headers }));\r\n }\r\n delete(url: string, headers?: any, data?: any): Promise {\r\n var self = this;\r\n if (data) {\r\n return this.toEs6Promise(self.$http({ method: 'DELETE', url: url, data: data, headers: headers}));\r\n }\r\n\r\n return this.toEs6Promise(self.$http.delete(url, { headers: headers }));\r\n }\r\n head(url: string, headers?: any): Promise {\r\n var self = this;\r\n return this.toEs6Promise(self.$http.head(url, { headers: headers }));\r\n }\r\n}\r\n","import { FxpEventBroadCastService } from \"./BroadCastingService\";\r\nimport { FxpBroadcastedEvents } from './FxpBroadcastedEvents';\r\n\r\n\r\nexport class FxpIrisBotService {\r\n\r\n constructor(private fxpEventBroadCastService: FxpEventBroadCastService) {\r\n\r\n }\r\n\r\n launchIrisBot() {\r\n this.fxpEventBroadCastService.broadCast( FxpBroadcastedEvents.OnLaunchIrisBot , \"Launch Bot\");\r\n }\r\n\r\n hideIrisBot() {\r\n this.fxpEventBroadCastService.broadCast( FxpBroadcastedEvents.OnHideIrisBot, \"Hide Bot\");\r\n }\r\n \r\n}","import { ILogger } from \"../interfaces/ILogger\";\r\nimport { UserInfoService } from \"./UserInfoService\";\r\nimport { IOCVSource } from \"../common/enum/Feedback.enum\";\r\nimport { IOCVFeedbackPayload } from \"../interfaces/IOCVFeedbackPayload\";\r\nimport { CommonUtils } from \"../utils/CommonUtils\";\r\nimport { FxpHttpService } from \"./FxpHttpService\";\r\nimport { IFxpFeedbackMessage } from \"../interfaces/IFxpFeedbackMessage\";\r\nimport { FxpConfigurationService } from \"./FxpConfiguration\";\r\nimport { FxpGlobalStoreService } from \"./fxp.global.store.service\";\r\n\r\nexport class FxpOCVFeedbackService {\r\n\r\n private fxplogger: ILogger;\r\n private fxpHttpService: FxpHttpService;\r\n private fxpConfigService: FxpConfigurationService;\r\n\r\n constructor(loggerService: ILogger, private globalStore: FxpGlobalStoreService, fxpHttpService: FxpHttpService, fxpConfigurationService: FxpConfigurationService) {\r\n\t\tthis.fxplogger = loggerService;\r\n this.fxpHttpService = fxpHttpService;\r\n this.fxpConfigService = fxpConfigurationService;\r\n }\r\n \r\n public SubmitFeedback(feedbackMessage: IFxpFeedbackMessage) : Promise {\r\n let feedbackPayload: IOCVFeedbackPayload = {\r\n manifestType: feedbackMessage.feedbackManifestType,\r\n appId: this.fxpConfigService.FxpAppSettings.OCVAppId,\r\n submitTime: new Date().toISOString(),\r\n source: IOCVSource.Client,\r\n type: feedbackMessage.feedbackType,\r\n rating: feedbackMessage.rating,\r\n clientFeedbackId: CommonUtils.getNewGuId(),\r\n comment: feedbackMessage.feedbackMessage,\r\n email: feedbackMessage.email,\r\n application: {\r\n appData: feedbackMessage.appData\r\n },\r\n telemetry: {\r\n loggableUserId: this.globalStore.GetPlatformState().CurrentUser.Claims.aadObjectId,\r\n featureArea: feedbackMessage.partnerName,\r\n officeBuild: this.fxpConfigService.FxpAppSettings.BuildNumber,\r\n tenantId: this.fxpConfigService.FxpAppSettings.TenantId\r\n },\r\n survey: {\r\n surveyId: feedbackMessage.surveyId\r\n },\r\n web: {\r\n browser: navigator[\"browserDetails\"] ? navigator[\"browserDetails\"].name : \"\",\r\n browserVersion: navigator[\"browserDetails\"] ? navigator[\"browserDetails\"].version : \"\",\r\n sourcePageName: document.getElementsByTagName(\"title\")[0].innerHTML,\r\n sourcePageURI: window.location.href\r\n }\r\n };\r\n return this.sendFeedback(feedbackPayload);\r\n }\r\n\r\n private sendFeedback(feedbackPayload: IOCVFeedbackPayload) : Promise\r\n { \r\n let url = this.fxpConfigService.FxpAppSettings.FeedbackOCVEndpoint;\r\n let requestHeaders = {};\r\n requestHeaders[\"Content-Type\"] = \"application/json\";\r\n return this.fxpHttpService.post(url, feedbackPayload, requestHeaders);\r\n }\r\n}","import { IFxpHttpInterceptorHook } from './../interfaces/IFxpHttpInterceptorHook'; \r\nimport { IFxPService } from '../interfaces/IFxpService';\r\nexport class FxpPartnerHttpInterceptorHooks implements IFxPService {\r\n \r\n\tprotected _interceptorHooks : Array = [];\r\n\t\r\n\tRegisterInterceptorHook = function(httpInterceptorHookInstance: IFxpHttpInterceptorHook):void {\r\n\t\tif (this._interceptorHooks.indexOf(httpInterceptorHookInstance)>=0){\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tthis._interceptorHooks.push(httpInterceptorHookInstance); \r\n\t}\r\n\tUnRegisterInterceptorHook =function(httpInterceptorHookInstance: IFxpHttpInterceptorHook):void {\r\n\t\tconst index = this._interceptorHooks.indexOf(httpInterceptorHookInstance);\r\n\t\tthis._interceptorHooks.splice(index, 1); \r\n\t}\r\n\r\n\tgetRegisteredInterceptorHooks=function(): Array{\r\n\t\treturn this._interceptorHooks;\r\n\t}\r\n}\r\n\r\n","import { IRootScope } from \"../interfaces/IRootScope\";\r\nimport { ILogger } from \"../interfaces/ILogger\";\r\nimport { FxpBreadcrumbService } from \"./FxpBreadcrumbService\";\r\nimport { FxpConstants } from \"../common/ApplicationConstants\";\r\nimport { Resiliency } from \"../resiliency/FxpResiliency\";\r\nimport { UserProfileService } from \"./userProfileService\";\r\nimport { UserInfoService } from \"./UserInfoService\";\r\nimport { StateService, TransitionOptions } from \"@uirouter/core\";\r\nimport { IFxPService } from \"../interfaces/IFxpService\";\r\n\r\n/**\r\n * @application Fxp\r\n */\r\n/**\r\n * @module Fxp.Services\r\n */\r\n/**\r\n * A service to connect to user Route users to their configured URLs\r\n * @class Fxp.Services.FxpRouteService\r\n * @classdesc A service to Route users to their configured URLs\r\n * @example Example to create an instance of Fxp Route Service\r\n * //Initializing Fxp Route Service\r\n * angular.module('FxPApp').controller('AppController', ['FxpRouteService', AppController]);\r\n * function AppController(FxpRouteService){ FxpRouteService.getAllStates(); }\r\n */\r\nexport class FxpRouteService implements IFxPService{\r\n\tprivate stateGo: StateService;\r\n\tprivate rootScope: IRootScope;\r\n\tprivate fxplogger: ILogger;\r\n\tprivate userProfileService: UserProfileService;\r\n\tprivate userInfoService: UserInfoService;\r\n\tprivate fxpBreadcrumbService: FxpBreadcrumbService;\r\n\tprivate defaultStateName: string;\r\n\tconstructor($state: StateService, $rootScope: IRootScope, loggerService: ILogger, userProfileService: UserProfileService, userInfoService: UserInfoService, fxpBreadcrumbService: FxpBreadcrumbService) {\r\n\t\tthis.stateGo = $state;\r\n\t\tthis.rootScope = $rootScope;\r\n\t\tthis.userProfileService = userProfileService;\r\n\t\tthis.userInfoService = userInfoService;\r\n\t\tthis.fxplogger = loggerService;\r\n\t\tthis.fxpBreadcrumbService = fxpBreadcrumbService;\r\n\t\tif (this.rootScope.isNewTabAllowed === undefined) {\r\n\t\t\tthis.rootScope.isNewTabAllowed = true;\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t* Gets List of States from URL State Provider\r\n\t* @method Fxp.Services.FxpRouteService.getAllStates\r\n\t* @example Example to invoke getAllStates\r\n\t* FxpRouteService.getAllStates();\r\n\t*/\r\n\tgetAllStates = function (): any {\r\n\t\tvar statesList = [];\r\n\t\tfor (var i = 0; i < this.states.length; i++) {\r\n\t\t\tstatesList.push(this.states[i].name);\r\n\t\t}\r\n\t\treturn statesList;\r\n\t}\r\n\r\n\tget states():any {\r\n\t\treturn this.stateGo.get();\r\n\t}\r\n\r\n\t/**\r\n\t* Gets URL of mentioned state from URL State Provider\r\n\t* @method Fxp.Services.FxpRouteService.getURLfromState\r\n\t* @param statename {string} a mandatory string value.\r\n\t* @param params {any} $state parameters values\r\n\t* @param options {any} an options values.\r\n\t* @example Example to invoke getURLfromState\r\n\t* FxpRouteService.getURLfromState(stateOrName [, params] [, options]);\r\n\t* FxpRouteService.getURLfromState($state.current.name, $state.params, {absolute: true});\r\n\t*/\r\n\tgetURLfromState = function (statename: string, params?: any, options?: any) {\r\n\t\tfor (var i = 0; i < this.states.length; i++) {\r\n\t\t\tif (this.states[i].name == statename)\r\n\t\t\t\treturn this.stateGo.href(this.states[i].name, params, options);\r\n\t\t}\r\n\t\treturn null;\r\n\t}\r\n\r\n\t/**\r\n\t* @deprecated Use new method FxpRouteService.navigatetoNewWindow('Home')\r\n\t*/\r\n\tnavigatetoState = function (statename: string) {\r\n\t\tconsole.warn(\"This method has been deprecated.Please use navigatetoNewWindow(statename) \");\r\n\t\tthis.navigatetoNewWindow(statename);\r\n\t}\r\n\t/**\r\n\t* Open a New Browser Window of mentioned state by Picking URL from URL State Provider\r\n\t* @method Fxp.Services.FxpRouteService.navigatetoNewWindow\r\n\t* @param {string} a mandatory string value.\r\n\t* @example Example to invoke navigatetoNewWindow\r\n\t* FxpRouteService.navigatetoNewWindow('Home');\r\n\t*/\r\n\r\n\tnavigatetoNewWindow = function (statename: string) {\r\n\r\n\t\t//Check if the requested state is missing any dependencies.\r\n\t\tif (Resiliency.statesWithMissingModules && Resiliency.statesWithMissingModules.indexOf(statename) > -1) {\r\n\t\t\tthrow new Error('The requested state cannot be navigated due to missing dependencies.');\r\n\t\t}\r\n\r\n\t\tfor (var i = 0; i < this.states.length; i++) {\r\n\t\t\tif (this.states[i].name == statename) {\r\n\t\t\t\twindow.open(\"#\" + this.states[i].url, \"Popup\", \"location=1,status=1,scrollbars=1, resizable=1, directories=1, toolbar=1, titlebar=1, width=\" + screen.width + \", height=\" + screen.height);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\t/**\r\n * Navigates to a the specific state which is passed as a parameter,also can pass optional parameters like params,target,features,replace\r\n * @method Fxp.Services.FxpRouteService.navigatetoSpecificState\r\n * @param {string} statename string specifies the name of the state.\r\n * @param {any} params any specifies the object.\r\n * @param {TransitionOptions} transitionOptions TransitionOptions specifies the options.\r\n\r\n * @example Example to invoke navigatetoSpecificState\r\n * FxpRouteService.navigatetoSpecificState('Home');\r\n */\r\n\tnavigatetoSpecificState = function (statename: string, params?: any, transitionOptions?: TransitionOptions) {\r\n\r\n\t\t//Check if the requested state is missing any dependencies.\r\n\t\tif (Resiliency.statesWithMissingModules && Resiliency.statesWithMissingModules.indexOf(statename) > -1) {\r\n\t\t\tthrow new Error('The requested state cannot be navigated due to missing dependencies.');\r\n\t\t}\r\n\r\n if (params !== undefined && params !== null && transitionOptions !== undefined && transitionOptions !== null)\r\n this.stateGo.go(statename, params, transitionOptions);\r\n\t\telse if (params !== undefined && params !== null)\r\n\t\t\tthis.stateGo.go(statename, params);\r\n\t\telse\r\n\t\t\tthis.stateGo.go(statename);\r\n\t}\r\n\r\n\t/**\r\n\t* Navigates to a the specific URL which is passed as a parameter,also can pass optional parameters like target,features,replace\r\n\t* @method Fxp.Services.FxpRouteService.navigateToSpecificUrl\r\n\t* @param {string} url string that specifies the URL of the document to display.\r\n\t* @param {string} target string that specifies the name of the window.\r\n\t* @param {string} features string that contains a list of items separated by commas.\r\n\t* @param {boolean} replace boolean that specifies whether the url creates a new entry or replaces the current entry in the window's history list.\r\n\t* @example Example to invoke navigateToSpecificUrl\r\n\t* FxpRouteService.navigateToSpecificUrl('#/Home');\r\n\t*/\r\n\tnavigateToSpecificUrl = function (url: string, target?: string, features?: string, replace?: boolean) {\r\n\t\tvar self = this;\r\n\t\tself.navigateToUrl(url, target, features, replace);\r\n\t}\r\n\r\n\t/**\r\n\t* Navigates to a the URL which is passed as a parameter,also can pass optional parameters like target,features,replace\r\n\t* @method Fxp.Services.FxpRouteService.navigateToSpecificUrl\r\n\t* @param {string} url string that specifies the URL of the document to display.\r\n\t* @param {string} target string that specifies the name of the window.\r\n\t* @param {string} features string that contains a list of items separated by commas.\r\n\t* @param {boolean} replace boolean that specifies whether the url creates a new entry or replaces the current entry in the window's history list.\r\n\t* @example Example to invoke navigateToUrl\r\n\t* FxpRouteService.navigateToUrl('#/Home');\r\n\t*/\r\n\tprivate navigateToUrl(url: string, target?: string, features?: string, replace?: boolean) {\r\n\t\tvar self = this;\r\n\t\ttarget = self.rootScope.isNewTabAllowed && target != undefined ? target : \"_self\";\r\n\t\tfeatures = features || \"\";\r\n\t\treplace = replace || false;\r\n\t\tif (target === \"_blank\") {\r\n\t\t\tself.fxpBreadcrumbService.setTempBreadcrumbArray(url);\r\n\t\t}\r\n\t\twindow.open(url, target, features, replace);\r\n\t}\r\n\r\n\t/**\r\n\t* getDefaultStateName\r\n\t* @method Fxp.Services.FxpRouteService.getDefaultStateName\r\n\t* @example Example to invoke getDefaultStateName\r\n\t* FxpRouteService.getDefaultStateName();\r\n\t*/\r\n\tgetDefaultStateName = function () {\r\n\t\treturn this.defaultStateName;\r\n\t}\r\n\r\n\t/**\r\n\t* setDefaultStateName\r\n\t* @method Fxp.Services.FxpRouteService.setDefaultStateName\r\n\t* @param {string} value mandatory string value to set as default StateName.\r\n\t* @example Example to invoke setDefaultStateName\r\n\t* FxpRouteService.setDefaultStateName('Home');\r\n\t*/\r\n\tsetDefaultStateName = function (value: string) {\r\n\t\tthis.defaultStateName = value;\r\n\t}\r\n\r\n\t/**\r\n\t* getStateDetails\r\n\t* @method Fxp.Services.FxpRouteService.getStateDetails\r\n\t* @param {string} value mandatory string value to get the state details.\r\n\t* @example Example to invoke getStateDetails\r\n\t* FxpRouteService.getStateDetails('Home');\r\n\t*/\r\n\tgetStateDetails = function (stateName: string) {\r\n\t\treturn this.states.find((item) => (item.name == stateName));\r\n\t}\r\n\r\n\t/**\r\n\t* getCurrentStateDetails\r\n\t* @method Fxp.Services.FxpRouteService.getCurrentStateDetails\r\n\t* @example Example to invoke getCurrentStateDetails\r\n\t* FxpRouteService.getCurrentStateDetails();\r\n\t*/\r\n\tgetCurrentStateDetails = function () {\r\n\t\treturn this.getStateDetails(this.stateGo.current.name);\r\n\t}\r\n}\r\n","import { HubConnection, HubConnectionBuilder, HubConnectionState } from '@microsoft/signalr';\r\nimport { FxpConfigurationService } from \"./FxpConfiguration\";\r\nimport { SystemEvent } from \"./../telemetry/SystemEvent\";\r\nimport { ComponentType } from \"@microsoftit/telemetry-extensions-npm\";\r\nimport { TelemetryConstants } from \"../telemetry/TelemetryConst\";\r\nimport { ILogger } from \"../interfaces/ILogger\";\r\nimport { ErrorSeverityLevel } from \"../telemetry/ErrorSeverityLevel\";\r\nimport { ErrorCodes } from \"../constants/errorCodes\";\r\nimport { MsalAuthenticationService } from \"./MsalAuthenticationService\";\r\n\r\n\r\nexport class FxpSignalRService {\r\n private connection: HubConnection;\r\n private signalRServiceEndPoint: string;\r\n private listeners = {};\r\n private connectionPromise: Promise = null;\r\n private pingTimeOutRef = null;\r\n private pingInterval = 10; //default value 10 mins\r\n private processName: string;\r\n private signalREventName: string;\r\n private readonly sourceForTelemetry = `${TelemetryConstants.FXP_TELEMETRY_BASE_NAME}.FxpSignalRService`;\r\n\r\n constructor(\r\n protected logger: ILogger,\r\n private fxpConfigurationService: FxpConfigurationService,\r\n private msalAuthenticationService: MsalAuthenticationService\r\n ) {\r\n this.signalRServiceEndPoint = fxpConfigurationService.FxpAppSettings.SignalRPlatformEndPoint;\r\n this.processName = TelemetryConstants.FXP_TELEMETRY_BASE_NAME + \".SignalRClient\";\r\n this.signalREventName = \"SignalREventName\";\r\n\r\n if (Number.isInteger(fxpConfigurationService.FxpAppSettings.SignalRPlatformPingIntervalInMinutes)){\r\n this.pingInterval = fxpConfigurationService.FxpAppSettings.SignalRPlatformPingIntervalInMinutes;\r\n }\r\n this.pingInterval = this.pingInterval * 60 * 1000;\r\n\r\n }\r\n\r\n\r\n private setupPingForSignalServer() {\r\n const self = this;\r\n self.ping();\r\n self.nextLoad();\r\n }\r\n\r\n cancelNextLoad() {\r\n const self = this;\r\n if (self.pingTimeOutRef) {\r\n clearTimeout(self.pingTimeOutRef);\r\n self.pingTimeOutRef = null;\r\n }\r\n };\r\n\r\n nextLoad() {\r\n const self = this;\r\n self.cancelNextLoad();\r\n self.pingTimeOutRef = setTimeout(self.setupPingForSignalServer.bind(self), self.pingInterval);\r\n };\r\n\r\n private ping(): void {\r\n this.sendMessage(\"ping\", \"ping server\");\r\n }\r\n\r\n private connect(): Promise {\r\n const self = this;\r\n\r\n return new Promise((resolve, reject) => {\r\n if (self.connection && self.connection.state === HubConnectionState.Connected) {\r\n resolve();\r\n let currentProcessName = this.processName + '.SignalServerConnected';\r\n let eventData = new SystemEvent(currentProcessName, ComponentType.DataStore, 'SignalServer Connection Created');\r\n let customProperties = this.logger.createPropertyBag();\r\n customProperties.addToBag(TelemetryConstants.CLASSNAME, \"FxpSignalRClient\");\r\n customProperties.addToBag(TelemetryConstants.METHODNAME, \"connect\");\r\n this.logger.logSystemEvent(this.sourceForTelemetry, eventData, customProperties);\r\n\r\n return;\r\n }\r\n self.setupConnection().then(() => {\r\n resolve();\r\n });\r\n });\r\n }\r\n\r\n private disconnect(): void {\r\n if (this.connection && this.connection.state === HubConnectionState.Connected) {\r\n this.connection.stop()\r\n .then(() => {\r\n let currentProcessName = this.processName + '.SignalServerDisconnected';\r\n let eventData = new SystemEvent(currentProcessName, ComponentType.DataStore, 'SignalServer disconnected');\r\n let customProperties = this.logger.createPropertyBag();\r\n customProperties.addToBag(TelemetryConstants.CLASSNAME, \"FxpSignalRClient\");\r\n customProperties.addToBag(TelemetryConstants.METHODNAME, \"disconnect\");\r\n this.logger.logSystemEvent(this.sourceForTelemetry, eventData, customProperties);\r\n })\r\n .catch(error => {\r\n this.logger.logException(this.sourceForTelemetry, error, null, null, null, ErrorSeverityLevel.Low, ErrorCodes.SignalR_ErrorOnDisconnect);\r\n });\r\n };\r\n\r\n }\r\n\r\n private sendMessage(methodName: string, ...args): Promise {\r\n return this.connection.send(methodName, args)\r\n .catch(error => {\r\n this.logger.logException(this.sourceForTelemetry, error, null, null, null, ErrorSeverityLevel.Medium, ErrorCodes.SignalR_ErrorOnMessageSend);\r\n });\r\n }\r\n\r\n private joinGroup(groupName: string, tenantName: string, environment: string): Promise {\r\n try {\r\n if(environment)\r\n return this.sendMessage(\"joinGroup\", groupName, tenantName, environment);\r\n else\r\n return this.sendMessage(\"joinGroup\", groupName, tenantName);\r\n }\r\n catch (error) {\r\n this.logger.logException(this.sourceForTelemetry, error, null, null, null, ErrorSeverityLevel.High, ErrorCodes.SignalR_ErrorOnJoinGroup);\r\n }\r\n }\r\n\r\n private leaveGroup(groupName: string, tenantName: string, environment: string): Promise {\r\n try {\r\n if(environment)\r\n return this.sendMessage(\"leaveGroup\", groupName, tenantName, environment);\r\n else\r\n return this.sendMessage(\"leaveGroup\", groupName, tenantName);\r\n\r\n }\r\n catch (error) {\r\n this.logger.logException(this.sourceForTelemetry, error, null, null, null, ErrorSeverityLevel.Medium, ErrorCodes.SignalR_ErrorOnLeaveGroup);\r\n }\r\n }\r\n\r\n subscribe(eventName, tenantName: string, callBack: any) {\r\n const self = this;\r\n const environment = this.fxpConfigurationService.FxpAppSettings.EnvironmentName;\r\n this.connect().then(() => {\r\n self.joinGroup(eventName, tenantName, environment);\r\n if (!self.listeners.hasOwnProperty(eventName)) {\r\n self.listeners[eventName] = [];\r\n }\r\n self.listeners[eventName].push(callBack);\r\n let currentProcessName = this.processName + '.SubscribeEvent.' + eventName;\r\n let eventData = new SystemEvent(currentProcessName, ComponentType.DataStore, `Subscribed to event: ${eventName}`);\r\n let customProperties = this.logger.createPropertyBag();\r\n customProperties.addToBag(TelemetryConstants.CLASSNAME, \"FxpSignalRClient\");\r\n customProperties.addToBag(TelemetryConstants.METHODNAME, \"subscribe\");\r\n customProperties.addToBag(this.signalREventName, eventName);\r\n this.logger.logSystemEvent(this.sourceForTelemetry, eventData, customProperties);\r\n\r\n });\r\n\r\n return function () {\r\n self.unsubscribe(eventName, tenantName, callBack, environment);\r\n\r\n }\r\n }\r\n\r\n private unsubscribe(eventName, tenantName: string, callBack: any, environment: string = null) {\r\n this.leaveGroup(eventName, tenantName, environment);\r\n\r\n let currentProcessName = this.processName + '.UnSubscribeEvent.' + eventName;\r\n let eventData = new SystemEvent(currentProcessName, ComponentType.DataStore, `UnSubscribed to event: ${eventName}`);\r\n let customProperties = this.logger.createPropertyBag();\r\n customProperties.addToBag(TelemetryConstants.CLASSNAME, \"FxpSignalRClient\");\r\n customProperties.addToBag(TelemetryConstants.METHODNAME, \"unsubscribe\");\r\n customProperties.addToBag(this.signalREventName, eventName);\r\n this.logger.logSystemEvent(this.sourceForTelemetry, eventData, customProperties);\r\n\r\n if (!this.listeners.hasOwnProperty(eventName)) {\r\n return;\r\n }\r\n this.listeners[eventName] = this.listeners[eventName].filter(x => x != callBack);\r\n if (this.listeners[eventName].length === 0) {\r\n delete this.listeners[eventName];\r\n }\r\n if (Object.keys(this.listeners).length === 0) {\r\n this.disconnect();\r\n }\r\n }\r\n\r\n unsubscribeAll() {\r\n this.listeners = {};\r\n this.disconnect();\r\n }\r\n\r\n private onMessageFromServer(eventName: string, messageData: any) {\r\n if (eventName === \"pingResponse\") {\r\n return;\r\n }\r\n\r\n let currentProcessName = this.processName + '.MessageFromServer.' + eventName;\r\n let eventData = new SystemEvent(currentProcessName, ComponentType.DataStore, `Message from SignalR Server for event: ${eventName}`);\r\n let customProperties = this.logger.createPropertyBag();\r\n customProperties.addToBag(TelemetryConstants.CLASSNAME, \"FxpSignalRClient\");\r\n customProperties.addToBag(TelemetryConstants.METHODNAME, \"onMessageFromServer\");\r\n customProperties.addToBag(this.signalREventName, eventName);\r\n this.logger.logSystemEvent(this.sourceForTelemetry, eventData, customProperties);\r\n\r\n if (this.listeners.hasOwnProperty(eventName)) {\r\n const callBackFunctions = this.listeners[eventName];\r\n if (callBackFunctions.length > 0) {\r\n callBackFunctions.forEach(callbackFunc => {\r\n callbackFunc(messageData);\r\n });\r\n }\r\n }\r\n }\r\n\r\n private setupConnection(): Promise {\r\n const self = this;\r\n const resource = self.fxpConfigurationService.FxpAppSettings.SignalRPlatformClientId;\r\n\r\n if (self.connectionPromise) {\r\n return self.connectionPromise;\r\n }\r\n self.connection = new HubConnectionBuilder()\r\n .withUrl(self.signalRServiceEndPoint, { accessTokenFactory: async ()=>{\r\n let token;\r\n await this.msalAuthenticationService.getTokenForAppIdAsync(resource).then(function (accesstoken) {\r\n token = accesstoken;\r\n })\r\n return token;\r\n } })\r\n .withAutomaticReconnect()\r\n .build();\r\n\r\n self.connection.onreconnecting(error => {\r\n if(self.connection.state === HubConnectionState.Reconnecting){\r\n self.logger.logEvent(this.sourceForTelemetry, `${TelemetryConstants.FXP_TELEMETRY_BASE_NAME}.SignalRReconnecting`)\r\n }\r\n });\r\n\r\n self.connection.onreconnected(connectionId => {\r\n if(self.connection.state === HubConnectionState.Connected){\r\n self.logger.logEvent(this.sourceForTelemetry, `${TelemetryConstants.FXP_TELEMETRY_BASE_NAME}.SignalRReconnected`)\r\n }\r\n });\r\n self.connection.onclose(error => {\r\n if (self.connection.state === HubConnectionState.Disconnected) {\r\n self.logger.logEvent(this.sourceForTelemetry, `${TelemetryConstants.FXP_TELEMETRY_BASE_NAME}.SignalRDisconnected`)\r\n }\r\n });\r\n\r\n self.connectionPromise = self.connection.start().then(() => {\r\n self.connection.on('eventFromServer', self.onMessageFromServer.bind(self));\r\n self.connectionPromise = null;\r\n self.setupPingForSignalServer();\r\n self.logger.logEvent(this.sourceForTelemetry, `${TelemetryConstants.FXP_TELEMETRY_BASE_NAME}.SignalRConnected`)\r\n\r\n })\r\n .catch(error => {\r\n // Logging disabled to reduce noise\r\n // self.logger.logException(this.sourceForTelemetry, error, null, null, null, ErrorSeverityLevel.High, ErrorCodes.SignalR_ErrorOnConnection);\r\n })\r\n return self.connectionPromise;\r\n\r\n }\r\n\r\n}\r\n","import { Subject } from \"rxjs\";\r\nimport { StateService } from \"@uirouter/core\";\r\nimport { SyncRoutes } from \"@fxp/staterouter\";\r\nimport { IFxPService } from \"../interfaces/IFxpService\";\r\nimport { FxpConstants } from \"../common/ApplicationConstants\";\r\nimport { FxpGlobalStoreService } from \"./fxp.global.store.service\";\r\nimport { IRootScope } from \"../interfaces/IRootScope\";\r\nimport { FxpBroadcastedEvents } from \"./FxpBroadcastedEvents\";\r\n//import { FxpLoggerService } from './../telemetry/FxpLogger';\r\nimport { TelemetryConstants } from \"../telemetry/TelemetryConst\";\r\nimport { CommonUtils } from \"../utils/CommonUtils\";\r\nimport { FeatureUsageEvent } from \"../telemetry/FeatureUsageEvent\";\r\nimport {\r\n ActionStatus,\r\n ActionType,\r\n ComponentType,\r\n EventName,\r\n} from \"@microsoftit/telemetry-extensions-npm\";\r\nimport { FxpLoggerService } from \"../telemetry/fxpLogger\";\r\nimport { LogMetricBag } from \"../telemetry/LogMetricBag\";\r\nimport { LogPropertyBag } from \"../telemetry/LogPropertyBag\";\r\n\r\nexport class FxpStateTransitionService implements IFxPService {\r\n private $transitions;\r\n private subjects: any = [];\r\n private $rootScope: IRootScope;\r\n constructor(\r\n $rootScope: IRootScope,\r\n private $injector: angular.auto.IInjectorService,\r\n private stateService: StateService,\r\n private globalStore: FxpGlobalStoreService,\r\n private logger: FxpLoggerService\r\n ) {\r\n this.$transitions = this.$injector.get(\"$transitions\");\r\n this.$transitions.onStart({}, this.onStartStateChangeHandler.bind(this));\r\n this.$transitions.onSuccess(\r\n {},\r\n this.onSuccessStateChangeHandler.bind(this)\r\n );\r\n this.$transitions.onError({}, this.onErrorStateChangeHandler.bind(this));\r\n this.stateService.onInvalid(this.onInvalidStateHandler.bind(this));\r\n this.$rootScope = $rootScope;\r\n this.subjects = [\r\n { id: FxpConstants.StateEvents.OnStart, subject: new Subject() },\r\n { id: FxpConstants.StateEvents.onSuccess, subject: new Subject() },\r\n { id: FxpConstants.StateEvents.onError, subject: new Subject() },\r\n { id: FxpConstants.StateEvents.onInvalid, subject: new Subject() },\r\n ];\r\n }\r\n\r\n onStartStateChangeHandler(transition: any): void {\r\n const self = this;\r\n self.subjects\r\n .filter((event) => event.id === FxpConstants.StateEvents.OnStart)[0]\r\n .subject.next(self.getStateInfo(transition));\r\n }\r\n\r\n onSuccessStateChangeHandler(transition: any): void {\r\n const self = this;\r\n self.subjects\r\n .filter((event) => event.id === FxpConstants.StateEvents.onSuccess)[0]\r\n .subject.next(self.getStateInfo(transition));\r\n const syncRouteAction = SyncRoutes({\r\n $current: this.stateService.$current,\r\n params: this.stateService.params,\r\n });\r\n this.globalStore.DispatchGlobalAction(\r\n \"Fxp.FxpStateTransitionService\",\r\n syncRouteAction\r\n );\r\n self.$rootScope.$broadcast(\r\n FxpBroadcastedEvents.OnLeftNavHighlightByStateName,\r\n transition.to().name\r\n );\r\n this.logFeatureUsageEventForState(transition);\r\n this.logPageView(transition);\r\n }\r\n\r\n private logPageView(transition: any) {\r\n const currentState = transition.to();\r\n const appName =\r\n currentState.data.appNameForTelemetry ||\r\n currentState.data.partnerTelemetryName;\r\n const pageName =\r\n currentState.data.pageNameForTelemetry ||\r\n currentState.data.breadcrumbText;\r\n const telemetryName =\r\n currentState.data.partnerTelemetryName ||\r\n TelemetryConstants.FXP_TELEMETRY_BASE_NAME;\r\n let displayNameForPageView = \"\";\r\n if (pageName && appName) {\r\n displayNameForPageView = `${appName}.${pageName}`;\r\n } else {\r\n displayNameForPageView = currentState.data.headerName;\r\n }\r\n const startTime = parseFloat(this.$rootScope.stateChangeStartTime);\r\n let duration = 0;\r\n if (!isNaN(startTime) || startTime !== 0) {\r\n duration = (performance.now() - startTime) / 1000;\r\n }\r\n const measurements = this.logger.createMetricBag();\r\n const properties = this.logger.createPropertyBag();\r\n\r\n properties.addToBag(\r\n TelemetryConstants.LOGGING_SOURCE,\r\n `${TelemetryConstants.FXP_TELEMETRY_BASE_NAME}.FxpStateTransitionService.logFeatureUsageEventForState`\r\n );\r\n properties.addToBag(\"Unit\", \"Seconds\");\r\n measurements.addToBag(\"StateTransitionTime\", duration);\r\n this.logger.logPageView(\r\n telemetryName,\r\n displayNameForPageView,\r\n window.location.href,\r\n properties,\r\n measurements,\r\n duration\r\n );\r\n }\r\n\r\n private logFeatureUsageEventForState(transition: any) {\r\n const currentState = transition.to();\r\n const appName = currentState.data.appNameForTelemetry;\r\n const featureName = currentState.data.featureName;\r\n const subFeatureName = currentState.data.subFeatureName;\r\n const actionName = currentState.data.actionName;\r\n const telemetryName =\r\n currentState.data.partnerTelemetryName ||\r\n TelemetryConstants.FXP_TELEMETRY_BASE_NAME;\r\n const fromState = transition.from();\r\n let previousFeatureName = \"\",\r\n previousAppName: \"\",\r\n previousSubFeatureName = \"\";\r\n if (fromState && fromState.data) {\r\n previousFeatureName = fromState.data.featureName;\r\n previousAppName = fromState.data.appNameForTelemetry;\r\n previousSubFeatureName = fromState.data.subFeatureName;\r\n }\r\n let displayFeatureName = \"\";\r\n if (!CommonUtils.isNullOrEmpty(featureName)) {\r\n displayFeatureName = `${appName}.${featureName}`;\r\n if (!CommonUtils.isNullOrEmpty(subFeatureName)) {\r\n displayFeatureName = `${displayFeatureName}.${subFeatureName}`;\r\n if (\r\n !CommonUtils.isNullOrEmpty(featureName) &&\r\n previousFeatureName === featureName\r\n ) {\r\n this.logger.renewSubCorrelationId();\r\n } else {\r\n this.logger.renewCorrelationId();\r\n }\r\n } else {\r\n this.logger.renewCorrelationId();\r\n }\r\n //TODO: May be we can create featureusageevent object and set subfeature instead of playing with strings.\r\n const featureUsageEvent = new FeatureUsageEvent(\r\n displayFeatureName,\r\n ActionType.User,\r\n actionName,\r\n EventName.PageLoad,\r\n ComponentType.Web\r\n );\r\n featureUsageEvent.SubFeatureName = subFeatureName;\r\n featureUsageEvent.ActionStatus = ActionStatus.Succeeded;\r\n const properties = this.logger.createPropertyBag();\r\n properties.addToBag(\r\n TelemetryConstants.LOGGING_SOURCE,\r\n `${TelemetryConstants.FXP_TELEMETRY_BASE_NAME}.FxpStateTransitionService.logFeatureUsageEventForState`\r\n );\r\n this.logger.logFeatureUsageEvent(\r\n telemetryName,\r\n featureUsageEvent,\r\n properties,\r\n null,\r\n null\r\n );\r\n }\r\n }\r\n\r\n onErrorStateChangeHandler(transition: any): void {\r\n const self = this;\r\n self.subjects\r\n .filter((event) => event.id === FxpConstants.StateEvents.onError)[0]\r\n .subject.next(self.getStateInfo(transition));\r\n }\r\n\r\n onInvalidStateHandler(toState: any, fromState: any, injector: any): void {\r\n const self = this;\r\n self.subjects\r\n .filter((event) => event.id === FxpConstants.StateEvents.onInvalid)[0]\r\n .subject.next({\r\n toState: toState,\r\n fromState: fromState,\r\n injector: injector,\r\n });\r\n }\r\n\r\n getStateInfo(transition: any): any {\r\n const stateInfo = {\r\n toState: transition.to(),\r\n toParams: transition.params(\"to\"),\r\n fromState: transition.from(),\r\n fromParams: transition.params(\"from\"),\r\n error: transition.error(),\r\n };\r\n return stateInfo;\r\n }\r\n\r\n onStateChangeStart(callback): Subject {\r\n const self = this;\r\n return self.subjects\r\n .filter((event) => event.id === FxpConstants.StateEvents.OnStart)[0]\r\n .subject.subscribe(callback);\r\n }\r\n onStateChangeSuccess(callback): Subject {\r\n const self = this;\r\n return self.subjects\r\n .filter((event) => event.id === FxpConstants.StateEvents.onSuccess)[0]\r\n .subject.subscribe(callback);\r\n }\r\n onStateChangeFailure(callback): Subject {\r\n const self = this;\r\n return self.subjects\r\n .filter((event) => event.id === FxpConstants.StateEvents.onError)[0]\r\n .subject.subscribe(callback);\r\n }\r\n onStateNotFound(callback): Subject {\r\n const self = this;\r\n return self.subjects\r\n .filter((event) => event.id === FxpConstants.StateEvents.onInvalid)[0]\r\n .subject.subscribe(callback);\r\n }\r\n\r\n offStateChangeStart(observer): void {\r\n const self = this;\r\n const currentSubject = self.subjects.filter(\r\n (event) => event.id === FxpConstants.StateEvents.OnStart\r\n )[0].subject;\r\n currentSubject.observers.filter((x) => x == observer)[0].unsubscribe();\r\n }\r\n\r\n offStateChangeSuccess(observer): void {\r\n const self = this;\r\n const currentSubject = self.subjects.filter(\r\n (event) => event.id === FxpConstants.StateEvents.onSuccess\r\n )[0].subject;\r\n currentSubject.observers.filter((x) => x == observer)[0].unsubscribe();\r\n }\r\n\r\n offStateChangeFailure(observer): void {\r\n const self = this;\r\n const currentSubject = self.subjects.filter(\r\n (event) => event.id === FxpConstants.StateEvents.onError\r\n )[0].subject;\r\n currentSubject.observers.filter((x) => x == observer)[0].unsubscribe();\r\n }\r\n\r\n offStateNotFound(observer): void {\r\n const self = this;\r\n const currentSubject = self.subjects.filter(\r\n (event) => event.id === FxpConstants.StateEvents.onInvalid\r\n )[0].subject;\r\n currentSubject.observers.filter((x) => x == observer)[0].unsubscribe();\r\n }\r\n}\r\n","import { IFxPService } from \"../interfaces/IFxpService\";\r\n\r\n/**\r\n * @application Fxp\r\n */\r\n/**\r\n * @module Fxp.Services\r\n */\r\n/**\r\n * A service to connect to dashboard service to fetch the leftnav data of the user\r\n * @class Fxp.Services.FxpStorageService\r\n * @classdesc A service to connect to dashaboard service to fetch the leftnav data \r\n * @example Example to create an instance of dashboard service \r\n * //Initializing FxpStorageService\r\n * angular.module('FxPApp').controller('LeftNavController', ['FxpStorageService', LeftNavController]);\r\n * function LeftNavController(FxpStorageService){ FxpStorageService.getLeftNavData(userAlias,roleGroupId); }\r\n */\r\nexport class FxpStorageService implements IFxPService{\r\n\tprivate static _instance: FxpStorageService;\r\n\tprivate $window;\r\n\r\n\tconstructor($window) {\r\n\t\tthis.$window = $window;\r\n\t\tif (FxpStorageService._instance) {\r\n\t\t\treturn FxpStorageService._instance;\r\n\t\t}\r\n\t\tFxpStorageService._instance = this;\r\n\t}\r\n\r\n\tsaveInLocalStorage(key: string, data: any): void {\r\n\t\tvar self = this;\r\n\t\tif (data)\r\n\t\t\tself.$window.localStorage && self.$window.localStorage.setItem(key, JSON.stringify(data));\r\n\t}\r\n\r\n\tgetFromLocalStorage(key: string): any {\r\n\t\tvar self = this;\r\n\t\tvar data;\r\n\t\tdata = (self.$window.localStorage && self.$window.localStorage.getItem(key));\r\n\t\tif (data)\r\n\t\t\tdata = JSON.parse(data);\r\n\t\treturn data;\r\n\t}\r\n\r\n\tdeleteFromLocalStorage(key: string): any {\r\n\t\tvar self = this;\r\n\t\tself.$window.localStorage && self.$window.localStorage.removeItem(key);\r\n\t}\r\n}","import { IHelpCentralService } from \"../interfaces/IHelpCentralService\";\r\nimport { FxpConfigurationService } from \"./FxpConfiguration\";\r\nimport { UserInfoService } from \"./UserInfoService\";\r\nimport { IFxPService } from \"../interfaces/IFxpService\";\r\n\r\n/**\r\n * @application Fxp\r\n */\r\n/**\r\n * @module Fxp.Services\r\n */\r\n/**\r\n * A service to handle service call for Contextual Help Articles\r\n * @class Fxp.Services.HelpCentralService\r\n * @classdesc A service to handle service calls for Contextual Help Articles\r\n * @example Example to create an instance of HelpCentralService\r\n * //Initializing HelpCentralService\r\n * angular.module('FxPApp').controller('AppController', ['HelpCentralService', AppController]);\r\n * function AppController(helpCentralService, fxpConstants){ helpCentralService.getContextualHelpArticles(); }\r\n */\r\nexport class HelpCentralService implements IHelpCentralService,IFxPService {\r\n\r\n\tprivate helpCentralServiceEndPoint: string;\r\n\tprivate roleGroupId: string;\r\n\tprivate tenantName: string;\r\n\tprivate helpCentralServiceAppId: string;\r\n\tconstructor(\r\n\t\tprivate $http: angular.IHttpService,\r\n\t\tprivate fxpConfiguration: FxpConfigurationService,\r\n\t\tprivate userInfoService: UserInfoService,\r\n\t\tprivate deviceFactory: any\r\n\t) {\r\n\r\n\t\tthis.helpCentralServiceEndPoint = fxpConfiguration.FxpAppSettings.HelpCentralServiceEndpoint;\r\n\t\tthis.helpCentralServiceAppId = window[\"tenantConfiguration\"].UIStrings.HelpCentralAppId;\r\n\t\tthis.roleGroupId = this.userInfoService.getCurrentUserData().roleGroupId;\r\n\t\tthis.tenantName = this.userInfoService.getCurrentUserData().MappedTenantName ? this.userInfoService.getCurrentUserData().MappedTenantName : this.userInfoService.getCurrentUserData().TenantName;\r\n\t}\r\n\r\n\t/**\r\n\t* Get Help Article content\r\n\t* @method Fxp.Services.HelpCentralService.getContextualHelpArticles\r\n\t* @param {number} topArticles mandatory number value which contains number of notification to be fetched.\r\n\t* @param {number} businessCapability optional number value which contains GLN-L0 Help Articles to be fetched.\r\n\t* @param {number} businessFunctions optional number value which contains GLN-L1 Help Articles to be fetched.\r\n\t* @param {string} searchString optional string value which contains search value against which Help Articles are to be fetched.\r\n\t* @example Example to invoke getNotifications\r\n\t* helpCentralService.getContextualHelpArticles(startIndex, count);\r\n\t*/\r\n\tgetContextualHelpArticles(topArticles, businessCapability?, businessFunctions?, searchString?, route?): angular.IPromise {\r\n\t\tvar self = this,\r\n\t\t\tdeviceType = self.deviceFactory.isMobile() ? \"Mobile\" : \"Desktop\";\r\n\t\tvar url = self.helpCentralServiceEndPoint + \"tenants/\" + self.tenantName + \"/app/\" + self.helpCentralServiceAppId\r\n\t\t\t+ \"/search?Filter=Meta_ViewPort:\" + deviceType + \";\";\r\n\t\tif (searchString) {\r\n\t\t\turl += \"&SearchString=\" + searchString;\r\n\t\t} else {\r\n\t\t\turl += \"Meta_RoleGroup:\" + self.roleGroupId + \";\";\r\n\t\t\turl += (businessCapability) ? \"Meta_L0:\" + businessCapability + \";\" : '';\r\n\t\t\turl += (businessFunctions) ? \"Meta_L1:\" + businessFunctions + \";\" : '';\r\n\t\t\turl += (route) ? \"Meta_Route:\" + route + \";\" : '';\r\n\t\t}\r\n\t\turl += \"&top=\" + topArticles + \"&skip=0\";\r\n\t\treturn this.$http.get(url);\r\n\t}\r\n\r\n\t/**\r\n\t* Get Help Article content\r\n\t* @method Fxp.Services.HelpCentralService.getContextualHelpArticleContent\r\n\t* @param {object} articleId mandatory value which contains id of article to be fetched.\r\n\t* @example Example to invoke getContextualHelpArticleContent\r\n\t* helpCentralService.getContextualHelpArticleContent(articleId);\r\n\t*/\r\n\tgetContextualHelpArticleContent(articleId): angular.IPromise {\r\n\t\tvar urlGetArticle = this.helpCentralServiceEndPoint + \"articles/\" + articleId + \"?tenantid=\" + this.tenantName + \"&appid=\" + this.helpCentralServiceAppId;\r\n\t\treturn this.$http.get(urlGetArticle);\r\n\t}\r\n\tgetSuggestions(searchPhrase: string): angular.IPromise {\r\n\t\tvar url = this.helpCentralServiceEndPoint + \"tenants/\" + this.tenantName + \"/app/\" + this.helpCentralServiceAppId + \"/suggest?SuggestString=\" + searchPhrase + \"&FuzzySearch=true\";\r\n\t\treturn this.$http.get(url);\r\n\t}\r\n\r\n\tsaveArticleFeedback(feedback): angular.IPromise {\r\n\t\tvar url = this.helpCentralServiceEndPoint + \"article/feedback?tenantid=\" + this.tenantName + \"&appid=\" + this.helpCentralServiceAppId;\r\n\t\treturn this.$http.post(url, feedback, { headers: { 'Content-Type': 'application/json' } });\r\n\t}\r\n\r\n\tsaveArticleViewCount(articleId): angular.IPromise {\r\n\t\tvar url = this.helpCentralServiceEndPoint + \"articles/\" + articleId + \"/readhistory?tenantid=\" + this.tenantName + \"&appid=\" + this.helpCentralServiceAppId;\r\n\t\treturn this.$http.post(url, { headers: { 'Content-Type': 'application/json' } });\r\n\t}\r\n}\r\n\r\n","import { AccountInfo, AuthenticationResult, BrowserAuthError, Configuration, EventType, InteractionRequiredAuthError, PublicClientApplication, RedirectRequest, ServerError, SilentRequest } from \"@azure/msal-browser\";\r\nimport { IRootScope } from \"../interfaces/IRootScope\";\r\nimport { CommonUtils } from \"../utils/CommonUtils\";\r\nimport { PartnerAppRegistrationService } from \"./PartnerAppRegistrationService\";\r\nimport { BrowserConstants } from \"@azure/msal-browser/dist/utils/BrowserConstants\";\r\n\r\n/**\r\n * @application Fxp\r\n */\r\n/**\r\n * @module Fxp.Services\r\n */\r\n\r\n/**\r\n * A service keeping the generic methods used in the fxp application and for multiple adal requests\r\n * @class Fxp.Services.MsalAuthenticationService\r\n * @classdesc A service used for generic methods in the fxp application and adal simultaneous cors requests\r\n * @example Example to create an instance of MsalAuthenticationService\r\n * //Initializing MsalAuthenticationService\r\n * angular.module('FxPApp').controller('AppController', ['MsalAuthenticationService', AppController]);\r\n * function AppController(MsalAuthenticationService){ MsalAuthenticationService.getJsonData(path, callbackfunc); }\r\n */\r\nexport class MsalAuthenticationService {\r\n\r\n private publicClientApplication: PublicClientApplication = null;\r\n private anonymousEndpointList = [];\r\n constructor(config: Configuration) {\r\n if (!this.publicClientApplication) {\r\n this.publicClientApplication = new PublicClientApplication(config);\r\n }\r\n\r\n var FxpAppSettings = FxpAppSettings || window[\"FxpAppSettings\"] || {};\r\n var anonEndpoints = FxpAppSettings.AuthExcludedDomains;\r\n if (anonEndpoints) {\r\n this.anonymousEndpointList = anonEndpoints.split(';');\r\n }\r\n }\r\n\r\n registerEndPoint(endpoint: string, applicationId: string) {\r\n PartnerAppRegistrationService.registerEndpoints(endpoint, applicationId);\r\n }\r\n\r\n\r\n initializeAuthentication(configuration: Configuration) {\r\n if (!this.publicClientApplication)\r\n this.publicClientApplication = new PublicClientApplication(configuration);\r\n }\r\n\r\n /**\r\n * Checks for whether the adal service request is in progress or not and returns boolean\r\n * @method Fxp.Utils.Services.MsalAuthenticationService.accessTokenRequestInProgress\r\n * @param {EndPoint} endpoint is the api endpoint for the resource or the api to which adal authorizes.\r\n * @example Example to invoke accessTokenRequestInProgress\r\n * MsalAuthenticationService.accessTokenRequestInProgress('http://oneprofiledevapi.azurewebsites.net');\r\n */\r\n accessTokenRequestInProgress(endpoint): boolean {\r\n return false;\r\n }\r\n\r\n async login($rootScope: IRootScope) {\r\n\r\n const accounts = this.publicClientApplication.getAllAccounts();\r\n if (accounts.length > 0) {\r\n this.publicClientApplication.setActiveAccount(accounts[0]);\r\n }\r\n\r\n const callbackId = this.publicClientApplication.addEventCallback((message: any) => {\r\n // Update UI or interact with EventMessage here\r\n if (message.eventType === EventType.LOGIN_SUCCESS) {\r\n const payload: any = message.payload;\r\n this.publicClientApplication.setActiveAccount(payload?.account as AccountInfo);\r\n } else if (message.eventType === EventType.LOGIN_FAILURE) {\r\n console.log(\"MsalError: \" + message.error);\r\n $rootScope.$broadcast('msal:loginFailure', { errorDesc: message.error, err: message.eventType});\r\n }\r\n else if (message.eventType === EventType.ACQUIRE_TOKEN_FAILURE) {\r\n console.log(\"MsalError: \" + message.error);\r\n $rootScope.$broadcast('msal:acquireTokenFailure', message.error, message.eventType, \"\", message?.error?.errorDesc?.errorCode);\r\n }\r\n });\r\n\r\n var localPublicClientApplication = this.publicClientApplication;\r\n if (accounts.length === 0) {\r\n await this.publicClientApplication\r\n .handleRedirectPromise()\r\n .then(async (loginResponse: AuthenticationResult | null) => {\r\n if (loginResponse !== null) {\r\n const account = localPublicClientApplication.getActiveAccount();\r\n if (!account) {\r\n // redirect anonymous user to login page\r\n await localPublicClientApplication.loginRedirect();\r\n }\r\n $rootScope.$broadcast('msal:loginSuccess', loginResponse.idToken);\r\n }\r\n else {\r\n await localPublicClientApplication.loginRedirect();\r\n }\r\n })\r\n .catch((error: any) => {\r\n console.log(error);\r\n throw (error);\r\n });\r\n }\r\n else {\r\n var silentRequest = {\r\n scopes: [\"User.Read\"],\r\n account: accounts[0],\r\n forceRefresh: false\r\n };\r\n\r\n var request = {\r\n scopes: [\"User.Read\"],\r\n loginHint: accounts[0].username // For v1 endpoints, use upn from idToken claims\r\n };\r\n\r\n const tokenResponse = await this.publicClientApplication.acquireTokenSilent(silentRequest).catch(error => {\r\n console.log(\"MsalError: Login Error\");\r\n $rootScope.$broadcast('msal:acquireTokenFailure', { errorDesc: \"Login Error msal:acquireTokenFailure\", err: error });\r\n $rootScope.$broadcast('msal:loginFailure', { errorDesc: \"Login Error due to Refresh Token msal:loginFailure\", err: \"Login Error due to Refresh Token msal:loginFailure\" });\r\n if (error.errorCode === BrowserConstants.INVALID_GRANT_ERROR) {\r\n // Refresh token expired, prompt for re-authentication\r\n if (error.error === \"invalid_grant\" && error.errorCodes && error.errorCodes.includes(700084))\r\n {\r\n localStorage.clear();\r\n $rootScope.$broadcast('msal:loginFailure', { errorDesc: \"Session expired, please re-authenticate\", err: error });\r\n $rootScope.$broadcast('msal:acquireTokenFailure', { errorDesc: \"Session expired, please re-authenticate 1\", err: error });\r\n return this.publicClientApplication.loginRedirect(); // Redirect for re-authentication\r\n }\r\n \r\n }\r\n const isServerError = error instanceof ServerError;\r\n const isInteractionRequiredError = error instanceof InteractionRequiredAuthError;\r\n const isRefreshTokenError = error instanceof BrowserAuthError;\r\n\r\n\r\n if (isInteractionRequiredError) {\r\n // fallback to interaction when silent call fails\r\n localStorage.clear();\r\n return this.publicClientApplication.acquireTokenRedirect(request)\r\n }\r\n else {\r\n if (isRefreshTokenError) {\r\n localStorage.clear();\r\n window.location.reload();\r\n }\r\n else {\r\n const isInvalidGrantError = (error.errorCode === BrowserConstants.INVALID_GRANT_ERROR);\r\n if (isServerError && isInvalidGrantError && !isInteractionRequiredError) {\r\n console.log(\"MsalError: Login Error due to Refresh Token\");\r\n $rootScope.$broadcast('msal:loginFailure', { errorDesc: \"Login Error due to Refresh Token\", err: \"Login Error due to Refresh Token\" });\r\n localStorage.clear();\r\n window.location.reload();\r\n }\r\n else {\r\n const isMonitorTimeoutError = (error.errorCode === \"monitor_window_timeout\");\r\n if (isMonitorTimeoutError) {\r\n console.log(\"MsalError: Login Error due to Refresh token on Iframe Timeout\");\r\n $rootScope.$broadcast('msal:loginFailure', { errorDesc: \"Token acquisition in iframe failed due to timeout\", err: \"Token acquisition in iframe failed due to timeout\" });\r\n localStorage.clear();\r\n window.location.reload();\r\n }\r\n }\r\n }\r\n }\r\n })\r\n if (tokenResponse) {\r\n $rootScope.$broadcast('msal:loginSuccess', tokenResponse.idToken);\r\n }\r\n // const idToken = (await this.getTokenRedirect(null, this.publicClientApplication.getActiveAccount()));\r\n // if (idToken) {\r\n // $rootScope.$broadcast('msal:loginSuccess', idToken);\r\n // }\r\n // else {\r\n\r\n // }\r\n\r\n }\r\n }\r\n\r\n /**\r\n * Returns cached token for a given endpoint\r\n * @method Fxp.Utils.Services.MsalAuthenticationService.getCachedToken\r\n * @param {EndPoint} endpoint is the api endpoint for the resource or the api to which adal authorizes.\r\n * @example Example to invoke getCachedToken\r\n * MsalAuthenticationService.getCachedToken('http://oneprofiledevapi.azurewebsites.net');\r\n */\r\n async getCachedToken(endpoint) {\r\n return await this.getTokenRedirect(endpoint);\r\n }\r\n\r\n /**\r\n * To kick off token acquisition manually on special cases\r\n * @method Fxp.Utils.Services.MsalAuthenticationService.acquireToken\r\n * @param {EndPoint} endpoint is the api endpoint for the resource or the api to which adal authorizes.\r\n * @example Example to invoke acquireToken\r\n * MsalAuthenticationService.acquireToken('http://oneprofiledevapi.azurewebsites.net');\r\n */\r\n async acquireToken(endpoint) {\r\n return await (await this.getTokenRedirectAsync(endpoint)).accessToken;\r\n }\r\n\r\n acquireTokenAsPromise(endpoint) {\r\n return this.getTokenRedirectAsync(endpoint);\r\n }\r\n\r\n /**\r\n * Checks for whether the token retrieval is started for the endpoint provided\r\n * @method Fxp.Utils.Services.MsalAuthenticationService.isTokenRetrievalStarted\r\n * @param {Resource} resource an endpoint which is passed to check for it in the logs entry.\r\n * @example Example to invoke isTokenRetrievalStarted\r\n * MsalAuthenticationService.isTokenRetrievalStarted('https://microsoft.onmicrosoft.com/FXPCouchBaseAPI');\r\n */\r\n isTokenRetrievalStarted(resource): boolean {\r\n return false;\r\n }\r\n\r\n getAccount(): AccountInfo {\r\n return this.publicClientApplication.getActiveAccount();\r\n }\r\n\r\n private async getTokenRedirect(\r\n endpoint: string, account: AccountInfo = null\r\n ): Promise {\r\n try {\r\n var response = await this.getTokenRedirectAsync(endpoint, account);\r\n return response.accessToken;\r\n } catch (error) {\r\n console.error(error);\r\n console.log(\"silent token acquisition fails.\");\r\n if (error.errorCode === BrowserConstants.INVALID_GRANT_ERROR) {\r\n if (error.error === \"invalid_grant\" && error.errorCodes && error.errorCodes.includes(700084)) {\r\n // Refresh token expired, prompt for re-authentication\r\n localStorage.clear();\r\n this.publicClientApplication.loginRedirect(); // Redirect for re-authentication\r\n }\r\n }\r\n else if (error instanceof InteractionRequiredAuthError) {\r\n console.log(\"acquiring token using redirect\");\r\n this.publicClientApplication.loginRedirect();\r\n } else {\r\n console.error(error);\r\n }\r\n }\r\n }\r\n\r\n async getTokenForAppIdAsync(appId: string): Promise {\r\n return new Promise((resolve, reject) => {\r\n var silentRequest = { scopes: [appId + \"/.default\"] };\r\n var redirectRequest: RedirectRequest = { scopes: [\"User.Read\"] };\r\n redirectRequest.account = this.publicClientApplication.getActiveAccount();\r\n try {\r\n this.publicClientApplication.acquireTokenSilent(\r\n silentRequest\r\n ).then((response: AuthenticationResult) => resolve(response.accessToken));\r\n } catch (e) {\r\n console.log(\"silent token acquisition fails.\");\r\n if (e instanceof InteractionRequiredAuthError) {\r\n console.log(\"acquiring token using redirect\");\r\n this.publicClientApplication.acquireTokenRedirect(redirectRequest);\r\n } else {\r\n console.error(e);\r\n reject(\"error getting token: \" + e);\r\n }\r\n }\r\n })\r\n }\r\n\r\n private getTokenRedirectAsync(\r\n endpoint: string, account: AccountInfo = null\r\n ): Promise {\r\n var silentRequest: SilentRequest = { scopes: [\"User.Read\"] };\r\n var redirectRequest: RedirectRequest = { scopes: [\"User.Read\"] };\r\n if (account) {\r\n silentRequest = { scopes: [\"User.Read\"] };\r\n redirectRequest = { scopes: [\"User.Read\"] };\r\n redirectRequest.account = account;\r\n }\r\n else if (endpoint) {\r\n var authExceptionEndpoints = PartnerAppRegistrationService.addAuthenticationExceptionEndpoints();\r\n this.anonymousEndpointList = this.anonymousEndpointList.concat(authExceptionEndpoints);\r\n if (this.anonymousEndpointList) {\r\n for (var i = 0; i < this.anonymousEndpointList.length; i++) {\r\n if (endpoint.indexOf(this.anonymousEndpointList[i]) > -1) {\r\n return Promise.resolve({ accessToken: '' } as AuthenticationResult);\r\n\r\n }\r\n }\r\n }\r\n\r\n var resource = this.getResourceForEndpoint(endpoint);\r\n if (resource) {\r\n silentRequest = { scopes: [resource + \"/.default\"] };\r\n redirectRequest = { scopes: [\"User.Read\"], redirectStartPage: window.location.href };\r\n redirectRequest.account = this.publicClientApplication.getActiveAccount();\r\n }\r\n }\r\n try {\r\n return this.publicClientApplication.acquireTokenSilent(\r\n silentRequest\r\n );\r\n } catch (e) {\r\n console.log(\"silent token acquisition fails.\");\r\n if (e.errorCode === BrowserConstants.INVALID_GRANT_ERROR) {\r\n if (e.error === \"invalid_grant\" && e.errorCodes && e.errorCodes.includes(700084)) {\r\n // Refresh token expired, prompt for re-authentication\r\n localStorage.clear();\r\n this.publicClientApplication.loginRedirect(); // Redirect for re-authentication\r\n }\r\n }\r\n else if (e instanceof InteractionRequiredAuthError) {\r\n console.log(\"acquiring token using redirect\");\r\n this.publicClientApplication.acquireTokenRedirect(redirectRequest);\r\n } else {\r\n console.error(e);\r\n }\r\n }\r\n\r\n return new Promise((resolve, reject) => reject('No resource found for the Request'));\r\n }\r\n\r\n private getResourceForEndpoint(endpoint) {\r\n\r\n var config = window[\"ModelConfiguration\"];\r\n var FxpAppSettings = FxpAppSettings || window[\"FxpAppSettings\"] || {};\r\n var partnerEnpoints = PartnerAppRegistrationService.getRegisterEndpoints();\r\n var endpoints = JSON.parse(JSON.stringify(eval(\"(\" + \"{\" + config.Endpoints + \"}\" + \")\"))); // CodeQL [SM04509] Intent is to set a config value\r\n\r\n endpoints = CommonUtils.jsonConcat(endpoints, partnerEnpoints);\r\n window._msalEndpoints = endpoints;\r\n var clientId = FxpAppSettings.FxpAppClientId;\r\n // var clientId = \"853531f8-add1-44d2-824b-b4a2790b08ac\";\r\n endpoints.loginResource = this.publicClientApplication ? clientId /*FxpAppSettings.FxpAppClientId */ : null;\r\n endpoints.redirectUri = this.publicClientApplication ? window.location.host : null;\r\n\r\n if (endpoints) {\r\n var bestMatchedConfigEndpoint = \"\";\r\n endpoint = endpoint.trimStart();\r\n for (var configEndpoint in endpoints) {\r\n if (endpoint.startsWith(configEndpoint) && configEndpoint.length > bestMatchedConfigEndpoint.length) {\r\n bestMatchedConfigEndpoint = configEndpoint;\r\n }\r\n }\r\n if (bestMatchedConfigEndpoint !== \"\") {\r\n return endpoints[bestMatchedConfigEndpoint];\r\n }\r\n // for (var configEndpoint in endpoints) {\r\n // // configEndpoint is like /api/Todo requested endpoint can be /api/Todo/1\r\n // myArray.filter(element => element.includes(\"substring\"));\r\n // if (endpoint.indexOf(configEndpoint) > -1) {\r\n // return endpoints[configEndpoint];\r\n // }\r\n // }\r\n }\r\n\r\n // default resource will be clientid if nothing specified\r\n // App will use idtoken for calls to itself\r\n // check if it's staring from http or https, needs to match with app host\r\n if (endpoint.indexOf('http://') > -1 || endpoint.indexOf('https://') > -1) {\r\n if (this._getHostFromUri(endpoint) === this._getHostFromUri(endpoints.redirectUri)) {\r\n return endpoints.loginResource;\r\n }\r\n else {\r\n if (endpoint.indexOf('azureedge.net') > -1) {\r\n return '';\r\n }\r\n }\r\n }\r\n else {\r\n // in angular level, the url for $http interceptor call could be relative url,\r\n // if it's relative call, we'll treat it as app backend call.\r\n return endpoints.loginResource;\r\n }\r\n\r\n // if not the app's own backend or not a domain listed in the endpoints structure\r\n return null;\r\n };\r\n\r\n /**\r\n * Strips the protocol part of the URL and returns it.\r\n * @ignore\r\n */\r\n private _getHostFromUri(uri) {\r\n // remove http:// or https:// from uri\r\n var extractedUri = String(uri).replace(/^(https?:)\\/\\//, '');\r\n extractedUri = extractedUri.split('/')[0];\r\n return extractedUri;\r\n };\r\n\r\n}\r\n\r\nexport class MsalAuthenticationServiceProvider implements angular.IServiceProvider {\r\n\r\n _config: any;\r\n _msalService: MsalAuthenticationService;\r\n public configure(config: Configuration): void {\r\n this._config = config;\r\n if (!this._msalService) {\r\n this._msalService = new MsalAuthenticationService(this._config);\r\n }\r\n }\r\n\r\n $get(): any {\r\n return this._msalService;\r\n }\r\n\r\n init() {\r\n // throw new Error(\"Method not implemented.\");\r\n }\r\n addState(stateName: any, config: any): void {\r\n // throw new Error(\"Method not implemented.\");\r\n }\r\n otherwise(input: any): void {\r\n // throw new Error(\"Method not implemented.\");\r\n }\r\n}\r\n\r\n","import { FxpRouteService } from \"./FxpRouteService\";\r\nimport { FxpConfigurationService } from \"./FxpConfiguration\";\r\nimport { IRootScope } from \"../interfaces/IRootScope\";\r\nimport { StateService } from \"@uirouter/core\"\r\nimport { IFxPService } from \"../interfaces/IFxpService\";\r\nimport { CommonUtils } from '../../js/utils/CommonUtils';\r\n/**\r\n * @application Fxp\r\n */\r\n/**\r\n * @module Fxp.Services\r\n */\r\n/**\r\n * A service to handle notification actions\r\n * @class Fxp.Services.NotificationActionCenter\r\n * @classdesc A service to handle actions for Notifications\r\n * @example Example to create an instance of NotificationActionCenter \r\n * //Initializing NotificationActionCenter\r\n * angular.module('FxPApp').controller('AppController', ['NotificationActionCenter', AppController]);\r\n * function AppController(notificationActionCenter, fxpConstants){ notificationActionCenter.excecuteNotificationAction('New Resource Request'); }\r\n */\r\nexport class NotificationActionCenter implements IFxPService{\r\n\tprivate notificationActions: any;\r\n\tprivate iconConfiguration: any;\r\n\tconstructor(\r\n\t\tprivate $rootScope: IRootScope,\r\n\t\tprivate $state: StateService,\r\n\t\tfxpConfigurationService: FxpConfigurationService,\r\n\t\tprivate fxpRouteService: FxpRouteService\r\n\t) {\r\n\t\tthis.notificationActions = fxpConfigurationService.FxpBaseConfiguration.NotificationConfiguration ? fxpConfigurationService.FxpBaseConfiguration.NotificationConfiguration.ActionConfiguration : [];\r\n\t\tthis.iconConfiguration = fxpConfigurationService.FxpBaseConfiguration.NotificationConfiguration ? fxpConfigurationService.FxpBaseConfiguration.NotificationConfiguration.IconConfiguration : [];\r\n\t}\r\n\r\n\t/**\r\n * Navigate to a state/url based on the subject passed\r\n * @method Fxp.Services.notificationActionCenter.excecuteNotificationAction\r\n * @param {any} is an object of containing details of notification.\r\n * @example Example to invoke excecuteNotificationAction\r\n * notificationActionCenter.excecuteNotificationAction('New Resource Request');\r\n */\r\n\texcecuteNotificationAction(item) {\r\n\t\tvar self = this,\r\n\t\t\ttarget = \"\",\r\n\t\t\tactions = [];\r\n\r\n\t\ttry {\r\n\t\t\tactions.push(JSON.parse(item.content));\r\n\t\t} catch (e) {\r\n\t\t\tactions = self.notificationActions.filter(function (notification) {\r\n\t\t\t\treturn !CommonUtils.isNullOrEmpty(item.subject) && notification.Subject.toLowerCase() == item.subject.toLowerCase();\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\tif (actions.length) {\r\n\t\t\tif (actions[0].OpenInNewTab) {\r\n\t\t\t\ttarget = \"_blank\";\r\n\t\t\t}\r\n\t\t\tif (actions[0].ActionType.toLowerCase() == \"state\" && self.$state.get(actions[0].Action)) {\r\n\t\t\t\tif (target)\r\n\t\t\t\t\tself.fxpRouteService.navigateToSpecificUrl(self.$state.href(actions[0].Action, {}, { absolute: true }), target);\r\n\t\t\t\telse\r\n\t\t\t\t\tself.fxpRouteService.navigatetoSpecificState(actions[0].Action);\r\n\t\t\t} else if (actions[0].ActionType.toLowerCase() == \"url\") {\r\n\t\t\t\tself.fxpRouteService.navigateToSpecificUrl(actions[0].Action, target);\r\n\t\t\t} else if (actions[0].ActionType.toLowerCase() == \"function\") {\r\n\t\t\t\tself.$rootScope.$broadcast(actions[0].Action, item);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t* Register to a new state to map with notification\r\n\t* @method Fxp.Services.notificationActionCenter.registerNotificationAction\r\n\t* @param {string} a mandatory string value which contains notification subject.\r\n\t* @param {string} a mandatory string value which contains action to be performed.\r\n\t* @param {string} a mandatory string value which contains action type: state/url/function.\r\n\t* @param {boolean} a mandatory bool value whether to perform the action in new tab.\r\n\t* @example Example to invoke registerNotificationAction\r\n\t* notificationActionCenter.registerNotificationAction('New Resource Request');\r\n\t*/\r\n\tregisterNotificationAction(subject, action, actionType, openInNewTab) {\r\n\t\tvar notificationAction = this.notificationActions.filter(item => item.Subject == subject);\r\n\t\tif (!notificationAction.length) {\r\n\t\t\tthis.notificationActions.push({\r\n\t\t\t\tSubject: subject,\r\n\t\t\t\tActionType: actionType,\r\n\t\t\t\tOpenInNewTab: openInNewTab,\r\n\t\t\t\tAction: action\r\n\t\t\t});\r\n\t\t} else {\r\n\t\t\tnotificationAction[0].ActionType = actionType;\r\n\t\t\tnotificationAction[0].OpenInNewTab = openInNewTab;\r\n\t\t\tnotificationAction[0].Action = action;\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t* Appends icons and other properties to the notification\r\n\t* @method Fxp.Services.notificationActionCenter.appendPropertiesToNotifications\r\n\t* @param {any} notifications mandatory array of notifications.\r\n\t* @example Example to invoke appendPropertiesToNotifications\r\n\t* notificationActionCenter.appendPropertiesToNotifications([]);\r\n\t*/\r\n\tappendPropertiesToNotifications(notifications) {\r\n\t\tvar self = this;\r\n\t\tnotifications.forEach(function (item) {\r\n\t\t\t// Find icon corresponding to notification.\r\n\t\t\tvar icon = self.iconConfiguration.filter(function (icon) {\r\n\t\t\t\treturn icon.From.toLowerCase() == item.senderAddress.toLowerCase();\r\n\t\t\t});\r\n\t\t\t// Check if notification has corresponding icon.\r\n\t\t\tif (icon.length)\r\n\t\t\t\titem.icon = icon[0].Icon;\r\n\r\n\t\t\t// Check for dynamic action\r\n\t\t\titem.hasAction = item.content.indexOf(\"ActionType\") > -1;\r\n\r\n\t\t\t// Check notification has corresponding action.\r\n\t\t\tif (!item.hasAction) {\r\n\t\t\t\titem.hasAction = self.notificationActions.some(function (action) {\r\n\t\t\t\t\treturn !CommonUtils.isNullOrEmpty(item.subject) && action.Subject.toLowerCase() == item.subject.toLowerCase();\r\n\t\t\t\t});\r\n\t\t\t}\r\n\r\n\t\t\t// Convert date to local.\r\n\t\t\titem.publishedOn = new Date(item.publishedOn);\r\n\t\t});\r\n\t\treturn notifications;\r\n\t}\r\n}\r\n","import { UserInfoService } from './UserInfoService'\r\nimport { IFxPService } from \"../interfaces/IFxpService\";\r\nimport { FxpConfigurationService } from \"./FxpConfiguration\";\r\nimport { INotificationService } from \"../interfaces/INotificationService\";\r\n\r\n/**\r\n * @application Fxp\r\n */\r\n/**\r\n * @module Fxp.Services\r\n */\r\n/**\r\n\t* A service to handle service call for notifications\r\n\t* @class Fxp.Services.NotificationService\r\n\t* @classdesc A service to handle service calls for notifications\r\n\t* @example Example to create an instance of NotificationService\r\n\t* //Initializing NotificationService\r\n\t* angular.module('FxPApp').controller('AppController', ['NotificationService', AppController]);\r\n\t* function AppController(notificationService, fxpConstants){ notificationService.getUnreadNotificationCount(); }\r\n\t*/\r\nexport class NotificationService implements INotificationService, IFxPService {\r\n\tprivate notificationApiBaseUrl: string;\r\n\tprivate fxpServiceEndPoint: string;\r\n\tprivate notificationApiWebNotifResourceUrl: string = \"/api/webnotifications\";\r\n\t\r\n\tconstructor(\r\n\t\tprivate $http: angular.IHttpService,\r\n\t\tprivate fxpConfiguration: FxpConfigurationService,\r\n\t\tprivate userInfoService: UserInfoService\r\n\t\t) {\r\n\t\tthis.notificationApiBaseUrl = fxpConfiguration.FxpAppSettings.NotificationServiceEndpoint;\r\n\t\tthis.fxpServiceEndPoint = fxpConfiguration.FxpAppSettings.FxpServiceEndPoint;\r\n\t\tthis.notificationApiWebNotifResourceUrl = this.notificationApiBaseUrl + this.notificationApiWebNotifResourceUrl;\r\n\t \r\n\t}\r\n\r\n\t/**\r\n\t* Get notifications\r\n\t* @method Fxp.Services.notificationService.getNotifications\r\n\t* @param {number} startIndex mandatory number value which contains index after which notification is to be fetched.\r\n\t* @param {number} count mandatory number value which contains number of notification to be fetched.\r\n\t* @param {string} status optional string value which contains status of notifications to be fetched.\r\n\t* @param {number} offset optional number value which contains id of last notification fetched.\r\n\t* @example Example to invoke getNotifications\r\n\t* notificationService.getNotifications(startIndex, count);\r\n\t*/\r\n\tgetNotifications(startIndex, count, status?, offset?, user?, channel?): angular.IPromise {\r\n\t\tuser = user ? user : this.userInfoService.getCurrentUserUpn();\r\n\t\tchannel = channel ? channel : this.fxpConfiguration.FxpAppSettings[\"NotificationServiceChannel\"];\r\n\t\tvar urlGetNotiicationsByPage = this.notificationApiWebNotifResourceUrl + \"?channel=\" + channel + \"&userId=\" + user + \"&skip=\" + startIndex + \"&take=\" + count;\r\n\t\tif (status) {\r\n\t\t\turlGetNotiicationsByPage += \"&status=\" + status;\r\n\t\t}\r\n\t\tif (offset) {\r\n\t\t\turlGetNotiicationsByPage += \"&filter=notification.PublishedOnTicks >\" + offset;\r\n\t\t}\r\n\t\turlGetNotiicationsByPage += \"&Order=notification.PublishedOnTicks DESC\";\r\n\t\tvar requestConfig: any = {};\r\n\r\n\t\tif (this.fxpConfiguration.FxpAppSettings[\"NotificationServiceAllowNullHeader\"]) {\r\n\t\t\trequestConfig = {\r\n\t\t\t\theaders: {}\r\n\t\t\t};\r\n\t\t\trequestConfig.headers[this.fxpConfiguration.FxpAppSettings[\"NotificationServiceAllowNullHeader\"]] = true;\r\n\t\t}\r\n\t\treturn this.$http.get(urlGetNotiicationsByPage, requestConfig);\r\n\t}\r\n\r\n\t/**\r\n\t* Delete notification\r\n\t* @method Fxp.Services.notificationService.deleteNotification\r\n\t* @param {number} webNotificationId mandatory number value which contains id of the notification which is to be deleted.\r\n\t* @example Example to invoke deleteNotification\r\n\t* notificationService.deleteNotification(webNotificationId);\r\n\t*/\r\n\tdeleteNotification(webNotificationId, user?, channel?): angular.IPromise {\r\n\t\tuser = user ? user : this.userInfoService.getCurrentUserUpn();\r\n\t\tchannel = channel ? channel : this.fxpConfiguration.FxpAppSettings[\"NotificationServiceChannel\"];\r\n\t\tvar urlDeleteNotification = this.notificationApiWebNotifResourceUrl + \"/\" + webNotificationId + \"?channel=\" + channel + \"&userId=\" + user;\r\n\t\treturn this.$http.delete(urlDeleteNotification);\r\n\t}\r\n\r\n\t/**\r\n\t* Delete all notification\r\n\t* @method Fxp.Services.notificationService.deleteAllNotification\r\n\t* @example Example to invoke deleteAllNotification\r\n\t* notificationService.deleteAllNotification();\r\n\t*/\r\n\tdeleteAllNotification(user?, channel?): angular.IPromise {\r\n\t\tuser = user ? user : this.userInfoService.getCurrentUserUpn();\r\n\t\tchannel = channel ? channel : this.fxpConfiguration.FxpAppSettings[\"NotificationServiceChannel\"];\r\n\t\tvar urlDeleteAllNotification = this.notificationApiWebNotifResourceUrl + \"?channel=\" + channel + \"&userId=\" + user;\r\n\t\treturn this.$http.delete(urlDeleteAllNotification);\r\n\t}\r\n\r\n\t/**\r\n\t* Mark notification as Read\r\n\t* @method Fxp.Services.notificationService.markNotificationAsRead\r\n\t* @param {number} webNotificationId mandatory number value which contains id of the notification which is to be marked as read.\r\n\t* @example Example to invoke markNotificationAsRead\r\n\t* notificationService.markNotificationAsRead(webNotificationId);\r\n\t*/\r\n\tmarkNotificationAsRead(webNotificationId, user?, channel?): angular.IPromise {\r\n\t\tuser = user ? user : this.userInfoService.getCurrentUserUpn();\r\n\t\tchannel = channel ? channel : this.fxpConfiguration.FxpAppSettings[\"NotificationServiceChannel\"];\r\n\t\tvar urlMarkAsRead = this.notificationApiWebNotifResourceUrl + \"/\" + webNotificationId + \"/mark\" + \"?channel=\" + channel + \"&userId=\" + user;\r\n\t\treturn this.$http.put(urlMarkAsRead, {});\r\n\t}\r\n\r\n\t/**\r\n\t* Mark all notification as Read\r\n\t* @method Fxp.Services.notificationService.markAllNotificationAsRead\r\n\t* @example Example to invoke markAllNotificationAsRead\r\n\t* notificationService.markAllNotificationAsRead();\r\n\t*/\r\n\tmarkAllNotificationsAsRead(user?, channel?): angular.IPromise {\r\n\t\tuser = user ? user : this.userInfoService.getCurrentUserUpn();\r\n\t\tchannel = channel ? channel : this.fxpConfiguration.FxpAppSettings[\"NotificationServiceChannel\"];\r\n\t\tvar urlMarkAllAsRead = this.notificationApiWebNotifResourceUrl + \"/mark\" + \"?channel=\" + channel + \"&userId=\" + user;\r\n\t\treturn this.$http.put(urlMarkAllAsRead, {});\r\n\t}\r\n\r\n\t/**\r\n\t* Publish Notification\r\n\t* @method Fxp.Services.notificationService.publishNotifications\r\n\t* @example Example to invoke publishNotifications\r\n\t* notificationService.publishNotifications();\r\n\t*/\r\n\tpublishNotifications(notificationArray: Array): angular.IPromise {\r\n\t\tvar publishEventUrl = this.fxpConfiguration.FxpAppSettings[\"EventStoreEndpoint\"] + \"api/events\";\r\n\t\tvar event = {\r\n\t\t\t\"EventName\": this.fxpConfiguration.FxpAppSettings[\"EventStoreDefaultNotificationEventName\"],\r\n\t\t\t\"EventType\": \"notification\",\r\n\t\t\t\"EventSubject\": this.fxpConfiguration.FxpAppSettings[\"EventStoreDefaultNotificationEventName\"],\r\n\t\t\t\"Publisher\": {\r\n\t\t\t\t\"Id\": this.fxpConfiguration.FxpAppSettings[\"EventStoreDefaultNotificationPublisherId\"],\r\n\t\t\t\t\"Name\": this.fxpConfiguration.FxpAppSettings[\"EventStoreDefaultNotificationPublisherName\"],\r\n\t\t\t},\r\n\t\t\t\"Payload\": \"\",\r\n\t\t\t\"Notification\": {\r\n\t\t\t\t\"WebNotification\": {\r\n\t\t\t\t\t\"Enabled\": true,\r\n\t\t\t\t\t\"Channel\": this.fxpConfiguration.FxpAppSettings[\"NotificationServiceChannel\"],\r\n\t\t\t\t\t\"Notifications\": []\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\tif (notificationArray) {\r\n\t\t\tfor (var notification of notificationArray) {\r\n\t\t\t\tevent.Notification.WebNotification.Notifications.push({\r\n\t\t\t\t\t\"SenderAddress\": notification.From ? notification.From : this.fxpConfiguration.FxpAppSettings[\"FxPAdminName\"],\r\n\t\t\t\t\t\"Subject\": notification.Subject ? notification.Subject : \"\",\r\n\t\t\t\t\t\"Content\": notification.Content,\r\n\t\t\t\t\t\"ReceiverAddresses\": [notification.To]\r\n\t\t\t\t})\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn this.$http.post(\r\n\t\t\tpublishEventUrl,\r\n\t\t\tevent,\r\n\t\t\t{\r\n\t\t\t\theaders:\r\n\t\t\t\t{\r\n\t\t\t\t\t'Content-Type': 'application/json'\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t}\r\n\r\n\t/**\r\n\t* Publish Notification (Deprecated - DO NOT USE)\r\n\t* @method Fxp.Services.notificationService.publishNotificationsRolesRoleGroup\r\n\t* @example Example to invoke publishNotificationsRolesRoleGroup\r\n\t* notificationService.publishNotificationsRolesRoleGroup();\r\n\t*/\r\n\tpublishNotificationsRolesRoleGroup(notificationArray): angular.IPromise {\r\n\t\tvar urlPublish = this.fxpServiceEndPoint + \"/notification\";\r\n\r\n\t\treturn this.$http.post(\r\n\t\t\turlPublish,\r\n\t\t\tnotificationArray,\r\n\t\t\t{\r\n\t\t\t\theaders:\r\n\t\t\t\t{\r\n\t\t\t\t\t'Content-Type': 'application/json; charset=UTF-8'\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t}\r\n}","import { IRootScope } from \"../interfaces/IRootScope\";\r\nimport { NotificationService } from \"./NotificationService\";\r\nimport { FxpBroadcastedEvents } from \"./FxpBroadcastedEvents\";\r\nimport { IFxPService } from \"../interfaces/IFxpService\";\r\nimport { CommonUtils } from '../../js/utils/CommonUtils';\r\n/**\r\n * @application Fxp\r\n */\r\n/**\r\n * @module Fxp.Services\r\n */\r\n/**\r\n* A service to handle service call for notifications\r\n* @class Fxp.Services.NotificationStore\r\n* @classdesc A service to handle service calls for notifications\r\n* @example Example to create an instance of NotificationStore\r\n* //Initializing NotificationService\r\n* angular.module('FxPApp').controller('AppController', ['NotificationStore', AppController]);\r\n* function AppController(notificationStore, fxpConstants){ notificationStore.getUnreadNotificationCount(); }\r\n*/\r\nexport class NotificationStore implements IFxPService {\r\n\tconstructor(\r\n\t\tprivate $rootScope: IRootScope,\r\n\t\tprivate $q: angular.IQService,\r\n\t\tprivate notificationService: NotificationService\r\n\t) {\r\n\t}\r\n\r\n\t/**\r\n\t* Get notifications\r\n\t* @method Fxp.Services.notificationStore.getNotifications\r\n\t* @param {number} startIndex mandatory number value which contains index after which notification is to be fetched.\r\n\t* @param {number} count mandatory number value which contains number of notification to be fetched.\r\n\t* @param {string} status optional string value which contains status of notification to be fetched.\r\n\t* @param {number} offset optional number value which contains id of last notification fetched.\r\n\t* @example Example to invoke getNotifications\r\n\t* notificationStore.getNotifications(startIndex, count);\r\n\t*/\r\n\tgetNotifications(startIndex, count, status?, offset?): angular.IPromise {\r\n\t\tvar self = this,\r\n\t\t\tdefered = self.$q.defer();\r\n\t\tself.notificationService.getNotifications(startIndex, count, status, offset).then((response) => {\r\n\t\t\t\r\n\t\t\tdefered.resolve(response);\r\n\t\t}, (error) => {\r\n\t\t\tdefered.reject(error);\r\n\t\t});\r\n\t\treturn defered.promise;\r\n\t}\r\n\t\r\n\t\r\n\t/**\r\n\t* Delete notification\r\n\t* @method Fxp.Services.notificationStore.deleteNotification\r\n\t* @param {number} webNotificationId mandatory number value which contains id of the notification which is to be deleted.\r\n\t* @example Example to invoke deleteNotification\r\n\t* notificationStore.deleteNotification(webNotificationId);\r\n\t*/\r\n\tdeleteNotification(webNotificationId): angular.IPromise {\r\n\t\tvar self = this,\r\n\t\t\tdefered = self.$q.defer();\r\n\t\tif (!CommonUtils.isNullOrEmpty(webNotificationId)) {\r\n\t\t\t//Delete particular notification\r\n\t\t\tself.notificationService.deleteNotification(webNotificationId).then((response) => {\r\n\t\t\t\tdefered.resolve(response);\r\n\t\t\t}, (error) => {\r\n\t\t\t\tdefered.reject(error);\r\n\t\t\t});\r\n\t\t} else {\r\n\t\t\t//Delete all notification\r\n\t\t\tself.notificationService.deleteAllNotification().then((response) => {\r\n\t\t\t\tdefered.resolve(response);\r\n\t\t\t}, (error) => {\r\n\t\t\t\tdefered.reject(error);\r\n\t\t\t});\r\n\t\t}\r\n\t\treturn defered.promise;\r\n\t}\r\n\r\n\t/**\r\n\t* Mark notification as Read\r\n\t* @method Fxp.Services.notificationStore.markNotificationAsRead\r\n\t* @param {number} webNotificationId mandatory number value which contains id of the notification which is to be marked as read.\r\n\t* @example Example to invoke markNotificationAsRead\r\n\t* notificationStore.markNotificationAsRead(webNotificationId);\r\n\t*/\r\n\tmarkNotificationAsRead(webNotificationId?): angular.IPromise {\r\n\t\tvar self = this,\r\n\t\t\tdefered = self.$q.defer();\r\n\t\tif (webNotificationId) {\r\n\t\t\t//Mark particular notification as Read\r\n\t\t\tself.notificationService.markNotificationAsRead(webNotificationId).then((response) => {\r\n\t\t\t\tdefered.resolve(response);\r\n\t\t\t}, (error) => {\r\n\t\t\t\tdefered.reject(error);\r\n\t\t\t});\r\n\t\t} else {\r\n\t\t\t//Mark particular notification as Read\r\n\t\t\tself.notificationService.markAllNotificationsAsRead().then((response) => {\r\n\t\t\t\tdefered.resolve(response);\r\n\t\t\t}, (error) => {\r\n\t\t\t\tdefered.reject(error);\r\n\t\t\t});\r\n\t\t}\r\n\t\treturn defered.promise;\r\n\t}\r\n\r\n\t/**\r\n\t* Publish notifications\r\n\t* @method Fxp.Services.notificationStore.publishNotifications\r\n\t* @param {any} notificationArray array of notification object.\r\n\t* @example Example to invoke publishNotifications\r\n\t* notificationStore.publishNotifications(startIndex, count);\r\n\t*/\r\n\tpublishNotifications(notificationArray): angular.IPromise {\r\n\t\tvar self = this,\r\n\t\t\tdefered = self.$q.defer();\r\n\t\tself.notificationService.publishNotifications(notificationArray).then((response) => {\r\n\t\t\tdefered.resolve(response);\r\n\t\t}, (error) => {\r\n\t\t\tdefered.reject(error);\r\n\t\t});\r\n\t\treturn defered.promise;\r\n\t}\r\n\t/**\r\n\t* Publish notifications\r\n\t* @method Fxp.Services.notificationStore.publishNotificationsRolesRoleGroup\r\n\t* @param {any} notificationArray array of notification object.\r\n\t* @example Example to invoke publishNotificationsRolesRoleGroup\r\n\t* notificationStore.publishNotificationsRolesRoleGroup(notificationArray);\r\n\t*/\r\n\tpublishNotificationsRolesRoleGroup(notificationArray): angular.IPromise {\r\n\t\tvar self = this,\r\n\t\t\tdefered = self.$q.defer();\r\n\t\tself.notificationService.publishNotificationsRolesRoleGroup(notificationArray).then((response) => {\r\n\t\t\tdefered.resolve(response);\r\n\t\t}, (error) => {\r\n\t\t\tdefered.reject(error);\r\n\t\t});\r\n\t\treturn defered.promise;\r\n\t}\r\n}","import { IRootScope } from \"../interfaces/IRootScope\";\r\nimport { FxpContext } from \"../context/FxpContext\";\r\nimport { FxpMessageService } from \"../../app/banner/FxpMessageService\";\r\nimport { FxpConstants } from \"../common/ApplicationConstants\";\r\nimport { UserInfoService } from \"./UserInfoService\";\r\nimport { UserProfileService } from \"./userProfileService\";\r\nimport { UserClaimsService } from \"./UserClaimsService\";\r\nimport { IFxPService } from \"../interfaces/IFxpService\";\r\nimport { FxpGlobalStoreService } from \"./fxp.global.store.service\";\r\nimport { AddCurrentUserClaims } from \"../../app/claims/claims.action\";\r\nimport { AddCurrentUserProfile } from \"../../app/profile/profile.action\";\r\nimport {AddOBOEntity , RemoveOBOEntity} from \"../../app/obo/obo.action\";\r\nimport { removeOboContext } from \"../../app/adminTiles/adminTile.action\";\r\n\r\n/**\r\n * @application Fxp\r\n */\r\n/**\r\n * @module Fxp.Services\r\n */\r\n/**\r\n * A service to connect to user profile service to fetch the detaisl of user info and user claims related to partner apps\r\n * @class Fxp.Services.OBOUserService\r\n * @classdesc A service to connect to user profile service to fetch the user profile details and claims \r\n * @example Example to create an instance of user profile service \r\n * //Initializing User Profile Service\r\n * angular.module('FxPApp').controller('AppController', ['OBOUserService', AppController]);\r\n * function AppController(OBOUserService){ OBOUserService.InitializeOBOEntityFromContext(); }\r\n */\r\n\r\nexport class OBOUserService implements IFxPService {\r\n\tprivate $rootScope: IRootScope;\r\n\tprivate static _instance: OBOUserService;\r\n\tprivate fxpContextService: FxpContext;\r\n\tprivate q: angular.IQService;\r\n\tprivate OBOUserStatus: boolean;\r\n\tprivate OBOUserRoutes: any;\r\n\tprivate OBOUser: any;\r\n\tprivate OBOUserSessionInfo: string;\r\n\tprivate OBOUserTenantConfiguration: any;\r\n\tprivate fxpMessageService: FxpMessageService;\r\n\tprivate userInfoService: UserInfoService;\r\n\tprivate userProfileService: UserProfileService;\r\n\tprivate isOBOAsNewTab: boolean;\r\n\tprivate userClaimsService:UserClaimsService;\r\n\t\r\n\tconstructor($rootScope: IRootScope, fxpContextService: FxpContext, q: angular.IQService, fxpMessageService: FxpMessageService, userInfoService: UserInfoService, userProfileService: UserProfileService,userClaimsService:UserClaimsService,private globalStoreService:FxpGlobalStoreService) {\r\n\t\tthis.$rootScope = $rootScope;\r\n\t\tthis.fxpContextService = fxpContextService;\r\n\t\tthis.q = q;\r\n\t\tthis.OBOUser = \"\";\r\n\t\tthis.OBOUserRoutes = \"\";\r\n\t\tthis.OBOUserStatus = false;\r\n\t\tthis.OBOUserSessionInfo = \"\";\r\n\t\tthis.OBOUserTenantConfiguration = \"\";\r\n\t\tthis.fxpMessageService = fxpMessageService;\r\n\t\tthis.userInfoService = userInfoService;\r\n\t\tthis.userProfileService = userProfileService;\r\n\t\tthis.isOBOAsNewTab = false;\r\n\t\tthis.userClaimsService=userClaimsService;\r\n\r\n\t\tif (OBOUserService._instance) {\r\n\t\t\treturn OBOUserService._instance;\r\n\t\t}\r\n\t\tOBOUserService._instance = this;\r\n\t}\r\n\r\n\t/**\r\n * Intitalizes the in memory variables for OBO using the value passed\r\n * @method Fxp.Services.OBOUserService.initilizeOBOEntity\r\n * @param {any} value the json value for OBO entity\r\n * @example Example to invoke initilizeOBOEntity\r\n * OBOUserService.initilizeOBOEntity(value);\r\n */\r\n\tinitilizeOBOEntity(value: any): void {\r\n\t\tthis.$rootScope.actOnBehalfOfUserActive = value.OBOUserStatus;\r\n\t\tthis.OBOUser = value.OBOUser;\r\n\t\tthis.OBOUserRoutes = value.OBOUserRoutes;\r\n\t\tthis.OBOUserStatus = value.OBOUserStatus;\r\n\t\tthis.OBOUserSessionInfo = value.OBOUserSessionInfo;\r\n\t\tthis.OBOUserTenantConfiguration = value.OBOUserTenantConfiguration;\r\n\t\tthis.userInfoService.setOBOUserSessionInfo(value.OBOUserSessionInfo);\r\n\t\tthis.userInfoService.setActingOnBehalfOfFlag(true);\r\n\t\tif (!this.isOBOAsNewTab) {\r\n\t\t\tthis.userInfoService.setCurrentUserOID(value.OBOUser.aadObjectId);\r\n\t\t\tthis.userInfoService.setCurrentUser(this.OBOUser.alias);\r\n\t\t\tthis.userInfoService.setCurrentUserUpn(this.OBOUser.userUpn);\r\n\t\t}\r\n\t\t//Dispatch action to save obo entity state\r\n\t\tthis.globalStoreService.DispatchGlobalAction(\"Platform\",AddOBOEntity(value));\r\n\t}\r\n\r\n\r\n\t/**\r\n\t* Saves the entity of OBO in context and local inmemory variables\r\n\t* @method Fxp.Services.OBOUserService.saveOBOEntityInContext\r\n\t* @param {any} value the json value for OBO entity\r\n\t* @example Example to invoke saveOBOEntityInContext\r\n\t* OBOUserService.saveOBOEntityInContext(value);\r\n\t*/\r\n\tsaveOBOEntityInContext(value: any): void {\r\n\t\tthis.initilizeOBOEntity(value);\r\n\t\tthis.fxpContextService.saveContext(\"OBOEntity\", JSON.stringify(value));\r\n\t}\r\n\r\n\tsetCurrentUserStateFromLoggedInUserState():void{\r\n\t\t//set current user details from logged in user details\r\n\t\tlet profile = this.globalStoreService.GetPlatformState().LoggedInUser.Profile;\r\n\t\tlet claims = this.globalStoreService.GetPlatformState().LoggedInUser.Claims;\r\n\t\tthis.globalStoreService.DispatchGlobalAction(\"Platform\", AddCurrentUserClaims(claims));\r\n\t\tthis.globalStoreService.DispatchGlobalAction(\"Platform\", AddCurrentUserProfile(profile));\r\n\t}\r\n\t/**\r\n\t * Saves the entity of OBO in context and local inmemory variables\r\n\t * @method Fxp.Services.OBOUserService.saveOBOEntityInContext\r\n\t * @param {any} value the json value for OBO entity\r\n\t * @example Example to invoke saveOBOEntityInContext\r\n\t * OBOUserService.saveOBOEntityInContext(value);\r\n\t */\r\n\r\n initializeOBOEntityFromContext(): angular.IPromise {\r\n let self = this;\r\n //Wrapping it up in a promise just to make FxP wait until this is done. This promise need to succeed in all the cases. \r\n let defer = self.q.defer();\r\n this.fxpContextService.readContext(\"OBOEntity\").then(function (udata) {\r\n if (!udata.IsError) {\r\n\t\t var oboData = JSON.parse(udata.Result);\r\n\t\t self.userInfoService.setCurrentUserOID(oboData.OBOUser.aadObjectId);\r\n\t\t self.userProfileService.setCurrentUser(oboData.OBOUser.alias);\r\n try {\r\n\t\t\tself.initilizeOBOEntity(oboData);\r\n self.userClaimsService.getCalimsSvc(oboData.OBOUser.alias).then(function () {\r\n self.isOBOAsNewTab = true;\r\n defer.resolve(oboData.OBOUser);\r\n }).catch(function () {\r\n //TODO: Log exception here.\r\n\t\t\t defer.resolve(null);\r\n\t\t\t self.removeOBOUserContext();\r\n });\r\n }\r\n catch (ex) {\r\n self.fxpMessageService.addMessage(self.$rootScope.fxpUIConstants.UIMessages.SelectedProfileRoles.ErrorMessage, FxpConstants.messageType.error);\r\n //TODO: Log exception here. \r\n // Do not reject this promise otherwise FxP will not load. If this is failing OBO will not get initialized but FxP will boot normal. \r\n\t\t\tdefer.resolve(null);\r\n\t\t\tself.removeOBOUserContext();\r\n }\r\n }\r\n else {\r\n self.removeOBOUserContext();\r\n defer.resolve(null);\r\n }\r\n //Due to async nature of the call to this method, the variable \r\n //actOnBehalfOfUserActive is not being set by the time FXP has \r\n //reached Home page.Hence forcing it to apply the rootscope once again.\r\n if (!self.$rootScope.$$phase) {\r\n self.$rootScope.$apply();\r\n }\r\n\r\n }, function (error) {\r\n self.removeOBOUserContext();\r\n //Due to async nature of the call to this method, the variable \r\n //actOnBehalfOfUserActive is not being set by the time FXP has \r\n //reached Home page.Hence forcing it to apply the rootscope once again.\r\n if (!self.$rootScope.$$phase) {\r\n self.$rootScope.$apply();\r\n }\r\n defer.resolve(null);\r\n\r\n });\r\n\r\n return defer.promise;\r\n }\r\n\r\n\t/**\r\n\t* Reset the value in context and in memory variables for OBO User by removing values from there\r\n\t* @method Fxp.Services.OBOUserService.removeOBOUserContext\r\n\t* @example Example to invoke removeOBOUserContext\r\n\t* OBOUserService.removeOBOUserContext();\r\n\t*/\r\n\tremoveOBOUserContext(): void {\r\n\t\tvar self = this;\r\n\t\t//dispatch action to remove obo context state\r\n\t\tself.globalStoreService.DispatchGlobalAction(\"Platform\",RemoveOBOEntity());\r\n\t\r\n\t\tself.$rootScope.actOnBehalfOfUserActive = false;\r\n\t\tif (self.OBOUser != \"\" && self.OBOUser.alias) {\r\n\t\t\tself.fxpContextService.deleteContext(self.OBOUser.alias + \"-userInfo\").then(function (data) {\r\n\t\t\t\tconsole.log(self.OBOUser.alias + \"-userInfo - deleted\" + data);\r\n\t\t\t}, function (error) {\r\n\t\t\t\tconsole.log(self.OBOUser.alias + \"-userInfo - deleted Error :\", error);\r\n\t\t\t});\r\n\r\n\t\t\tself.fxpContextService.deleteContext(self.OBOUser.alias + \"-userclaims\").then(function (data) {\r\n\t\t\t\tconsole.log(self.OBOUser.alias + \"-userclaims - deleted\" + data);\r\n\t\t\t}, function (error) {\r\n\t\t\t\tconsole.log(self.OBOUser.alias + \"-userclaims - deleted Error :\", error);\r\n\t\t\t});\r\n\t\t\tself.fxpContextService.deleteContext(self.OBOUser.aadObjectId + \"-userclaims\").then(function (data) {\r\n\t\t\t\tconsole.log(self.OBOUser.aadObjectId + \"-userclaims - deleted\" + data);\r\n\t\t\t}, function (error) {\r\n\t\t\t\tconsole.log(self.OBOUser.aadObjectId + \"-userclaims - deleted Error :\", error);\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\tthis.OBOUserRoutes = \"\";\r\n\t\tthis.OBOUser = \"\";\r\n\t\tthis.OBOUserStatus = false\r\n\t\tthis.OBOUserTenantConfiguration = \"\";\r\n\t\tthis.fxpContextService.deleteContext(\"OBOEntity\");\r\n\t\tthis.userInfoService.setActingOnBehalfOfFlag(false);\r\n\t\tthis.userInfoService.setCurrentUserOID(this.userInfoService.getLoggedInUserOID());\r\n\t\tthis.userInfoService.setCurrentUser(this.userInfoService.getLoggedInUser());\r\n\t\tthis.userInfoService.setCurrentUserUpn(this.userInfoService.getLoggedInUserUpn());\r\n\t\tthis.globalStoreService.GetPlatformStore().dispatch(removeOboContext());\r\n\t};\r\n\r\n\r\n\t/**\r\n\t* Get the routes for OBO User\r\n\t* @method Fxp.Services.OBOUserService.getOBOUserRoutes\r\n\t* @example Example to invoke getOBOUserRoutes\r\n\t* OBOUserService.getOBOUserRoutes();\r\n\t*/\r\n\tgetOBOUserRoutes(): any {\r\n\t\treturn this.OBOUserRoutes;\r\n\t};\r\n\r\n\t/**\r\n\t* get the OBO User Informations\r\n\t* @method Fxp.Services.OBOUserService.getOBOUser\r\n\t* @example Example to invoke getOBOUser\r\n\t* OBOUserService.getOBOUser(OBOUser);\r\n\t*/\r\n\tgetOBOUser(): any {\r\n\t\treturn this.OBOUser;\r\n\t};\r\n\r\n\t/**\r\n\t* get the OBO User Tenant UIStrings\r\n\t* @method Fxp.Services.OBOUserService.getOBOUserTenantConfiguration\r\n\t* @example Example to invoke getOBOUserTenantConfiguration\r\n\t* OBOUserService.getOBOUserTenantConfiguration();\r\n\t*/\r\n\tgetOBOUserTenantConfiguration(): any {\r\n\t\treturn this.OBOUserTenantConfiguration;\r\n\t};\r\n}\r\n","import { IStateConfig } from \"../interfaces/IStateConfig\";\r\nimport { GlobalExceptionHandler } from \"../telemetry/GlobalExceptionHandler\";\r\nimport { IFxpAppContext } from \"../interfaces/IFxpAppContext\";\r\nimport { CommonUtils } from \"../utils/CommonUtils\";\r\nimport { IAuthExceptionServiceEndPoints, IServiceEndPoints } from \"../interfaces/IServiceEndPoints\";\r\nimport { IRouteInfo } from \"../interfaces/IRouteInfo\";\r\nimport { ILazyloadBundle } from \"../interfaces/ILazyLoadBundle\";\r\nimport { IPartnerBundle } from \"../interfaces/IPartnerBundle\";\r\nimport { AddRouteConfiguration, UpdateRouteConfiguration } from \"@fxp/staterouter\";\r\nimport { GlobalStore } from 'redux-micro-frontend';\r\nimport { FxpLazyLoader } from \"../../app/fxplazyloader\";\r\nimport { ISharedComponents } from \"../interfaces/ISharedComponents\";\r\nimport { ISharedComponentConfig } from \"../interfaces/ISharedComponentConfig\";\r\nimport { TelemetryConstants } from \"../telemetry/TelemetryConst\";\r\nimport { ErrorSeverityLevel } from \"../telemetry/ErrorSeverityLevel\";\r\nimport { ErrorCodes } from \"../constants/errorCodes\";\r\nimport { FxpLoggerService } from \"../telemetry/fxpLogger\";\r\nimport { ComponentFramework } from \"../common/enum/ComponentFramework\";\r\nimport { ISharedComponentReference } from \"../interfaces/ISharedComponentReference\";\r\nimport { IStateInfo } from \"@fxp/staterouter/src/common/interfaces/IStateInfo\";\r\n\r\n\r\nexport class PartnerAppRegistrationService {\r\n private static registeredApps: any = {};\r\n private static registerPartnerEndpoints = {};\r\n private static registeredRoutes: Array = [];\r\n public static angularPartnerStateConfig: Array = [];\r\n public static partnerRegisteredEndpoints = {};\r\n public static authExceptionEndpoints = [];\r\n\r\n private static lazyLoader = null;\r\n public static angularPartnerSharedComponents: Array = [];\r\n private static applicationsWithStore: Array = [];\r\n private static get FxpLoggerService(): FxpLoggerService {\r\n return FxpLoggerService.getInstance();\r\n }\r\n private static sourceForTelemetry = `${TelemetryConstants.FXP_TELEMETRY_BASE_NAME}.PartnerAppRegistrationService`;\r\n\r\n public static setLazyLoader(lazyLoaderInstance){\r\n if (!this.lazyLoader){\r\n this.lazyLoader = lazyLoaderInstance;\r\n }\r\n }\r\n\r\n\r\n public static registerEndpoints(endpoint: string, clientId: string) {\r\n console.warn(\"[Obsolete] - PartnerAppRegistrationService.registerEndpoints() has been marked as obsolete and will be removed in future. Please start using getServiceEndPoints() method of IAppService.\");\r\n if (!this.registerPartnerEndpoints[endpoint]) {\r\n this.registerPartnerEndpoints[endpoint] = clientId;\r\n }\r\n }\r\n\r\n public static getRegisterEndpoints() {\r\n const partnerRegisteredEndpoints = this.getRegisteredEndPointsFromPartnerAppRegistrationClass();\r\n return CommonUtils.jsonConcat(partnerRegisteredEndpoints, this.registerPartnerEndpoints);\r\n }\r\n\r\n public static addAuthenticationExceptionEndpoints() {\r\n const partnerExceptionEndpoints = this.getAuthExcpetionFromPartnerAppRegistrationClass();\r\n return partnerExceptionEndpoints;\r\n }\r\n\r\n public static addApplicationWithStores(appName: string): void{\r\n if(this.applicationsWithStore.indexOf(appName) >= 0){\r\n return;\r\n }\r\n this.applicationsWithStore.push(appName);\r\n }\r\n\r\n public static isStoreRegistered(appName: string): boolean{\r\n return this.applicationsWithStore.indexOf(appName) >= 0;\r\n }\r\n\r\n public static registerPartnerApp(appName: string, appInstance): void {\r\n let properties = this.FxpLoggerService.createPropertyBag();\r\n properties.addToBag('PartnerAppName', appName );\r\n if (!this.registeredApps[appName]) {\r\n this.registeredApps[appName] = appInstance;\r\n //TO-DO (Discussion needed) - Where do we need to configure the routes with proper action?\r\n const routeInfo = (new appInstance()).getRoutes();\r\n const addRouteConfigurationAction = AddRouteConfiguration(routeInfo);\r\n GlobalStore.Get().DispatchGlobalAction(\"Fxp.PartnerAppRegistrationService\", addRouteConfigurationAction);\r\n this.registerPartnerAppRoutes(routeInfo);\r\n }\r\n else {\r\n const error = new Error();\r\n error.message = 'Application name with ' + appName + ' is already registered.';\r\n console.error(error.message);\r\n this.FxpLoggerService.logException(`${this.sourceForTelemetry}.RegisterPartnerApp`, error, properties, null, null, ErrorSeverityLevel.High, ErrorCodes.PartnerAppRegistrationService_ErrorOnAppRegistration);\r\n }\r\n }\r\n\r\n public static updateStateObject(stateName: string, ngModule: any, component: any, componentFramework?: ComponentFramework){\r\n const $stateService:any = angular.element(document.body).injector().get(\"$state\");\r\n const $state = $stateService.get(stateName);\r\n if($state != null) {\r\n $state.ngModule = ngModule;\r\n $state.childComponent = component;\r\n $state.componentFramework = componentFramework\r\n\r\n if ($state.componentFramework == ComponentFramework.React && $state.data.partnerAppName){\r\n const stateInfo: IStateInfo = {\r\n stateName: stateName,\r\n component: component,\r\n applicationName: $state.data.partnerAppName\r\n }\r\n const updateRouteConfiguration = UpdateRouteConfiguration(stateInfo);\r\n\r\n GlobalStore.Get().DispatchGlobalAction(\"Fxp.PartnerAppRegistrationService\", updateRouteConfiguration);\r\n\r\n }\r\n }\r\n }\r\n\r\n public static getRegisteredRoutes(fxpAppContext: IFxpAppContext): Array {\r\n Object.keys(this.registeredApps).forEach((key) => {\r\n const appInstance = new this.registeredApps[key]();\r\n const routesInfo = appInstance.getRoutes(fxpAppContext);\r\n this.registeredRoutes.push.apply(this.registeredRoutes, routesInfo);\r\n });\r\n return this.registeredRoutes;\r\n }\r\n\r\n public static getRegisteredAppRoute(appName: string, stateName: string): IStateConfig {\r\n let routeInfo;\r\n if (this.registeredApps.hasOwnProperty(appName)) {\r\n const appInstance = new this.registeredApps[appName]();\r\n const routeCollection = appInstance.getRoutes().routes;\r\n routeInfo = routeCollection.find(route => { return route.name === stateName });\r\n }\r\n return routeInfo;\r\n }\r\n\r\n public static registerLazyLoadedApp(registryInstance: any, appName?: string) {\r\n const registry = new registryInstance();\r\n const routeInfo = this.updateAppName(registry.getRoutes(), appName);\r\n let bundles: Array = [];\r\n if (registry.getBundles){\r\n bundles = [...bundles, ...registry.getBundles()];\r\n }\r\n if (registry.getGeneratedBundles){\r\n bundles = [...bundles, ...registry.getGeneratedBundles()];\r\n }\r\n this.registerPartnerAppBundles(bundles);\r\n this.registerPartnerAppRoutes(routeInfo);\r\n this.registerPartnerAppEndpoints(registry.getServiceEndPoints(), routeInfo.applicationName);\r\n if(registry.getAuthExceptionEndpoints)\r\n this.registerAuthExceptionEndpoints(registry.getAuthExceptionEndpoints(), routeInfo.applicationName);\r\n if (registry.getSharedComponentsInfo) {\r\n this.registerAngularSharedComponents(this.updateAppName(registry.getSharedComponentsInfo(), appName));\r\n }\r\n }\r\n\r\n private static updateAppName(configObject: any, appName?: string){\r\n if(appName && appName.length>0){\r\n configObject.appName = appName\r\n }\r\n return configObject;\r\n }\r\n\r\n private static registerAngularSharedComponents(sharedComponentsInfo: ISharedComponents) {\r\n if (sharedComponentsInfo.appName && !sharedComponentsInfo.disableSharing) {\r\n this.angularPartnerSharedComponents.push(sharedComponentsInfo);\r\n }\r\n else if(!sharedComponentsInfo.appName)\r\n {\r\n const error = new Error();\r\n error.message = 'Application name is not provided for the shared components';\r\n console.error(error.message);\r\n let props = this.FxpLoggerService.createPropertyBag();\r\n props.addToBag(\"Details\", error.message);\r\n\r\n this.FxpLoggerService.logException(`${this.sourceForTelemetry}.RegisterAngularSharedComponents`,\r\n error,\r\n props,\r\n null,\r\n null,\r\n ErrorSeverityLevel.High,\r\n ErrorCodes.PartnerAppRegistrationService_ErrorOnSharedComponentRegistration);\r\n }\r\n }\r\n\r\n private static registerPartnerAppRoutes(config: IRouteInfo): void {\r\n this.angularPartnerStateConfig.push(config);\r\n }\r\n\r\n private static registerPartnerAppBundles(bundles: Array): void {\r\n const ocBundles = Array();\r\n bundles.forEach(bundle => {\r\n const ocBundle: ILazyloadBundle = {\r\n name: bundle.name,\r\n files: bundle.files,\r\n serie: bundle.sequentialLoading\r\n }\r\n ocBundles.push(ocBundle);\r\n });\r\n\r\n window[\"OcModules\"] = [...window[\"OcModules\"], ...ocBundles];\r\n }\r\n\r\n private static registerPartnerAppEndpoints(endpoints: Array, key: string) {\r\n endpoints.forEach(endpoint => {\r\n if (!endpoint.serviceEndPoint) {\r\n console.error(\"[ValidationError-\" + key + \"] - Endpoint/Url is missing in the data provided in getServiceEndPoints() method.\");\r\n return;\r\n }\r\n if (!endpoint.clientId) {\r\n console.error(\"[ValidationError-\" + key + \"] - ClientId is missing in the data provided in getServiceEndPoints() method.\");\r\n return;\r\n }\r\n if (!this.partnerRegisteredEndpoints[endpoint.serviceEndPoint]) {\r\n this.partnerRegisteredEndpoints[endpoint.serviceEndPoint] = endpoint.clientId;\r\n }\r\n });\r\n }\r\n\r\n private static registerAuthExceptionEndpoints(endpoints: Array, key: string) {\r\n endpoints.forEach(endpoint => {\r\n if (!endpoint.serviceEndPoint) {\r\n console.error(\"[ValidationError-\" + key + \"] - Endpoint/Url is missing in the data provided in getAuthException() method.\");\r\n return;\r\n }\r\n \r\n if (!this.authExceptionEndpoints[endpoint.serviceEndPoint]) {\r\n this.authExceptionEndpoints.push(endpoint.serviceEndPoint);\r\n }\r\n });\r\n }\r\n\r\n private static getRegisteredEndPointsFromPartnerAppRegistrationClass() {\r\n Object.keys(this.registeredApps).forEach((key) => {\r\n const appInstance = new this.registeredApps[key]();\r\n if (!appInstance || !appInstance.getServiceEndPoints) {\r\n return;\r\n }\r\n const endpoints = appInstance.getServiceEndPoints();\r\n if (!endpoints || endpoints.length === 0) {\r\n return;\r\n }\r\n this.registerPartnerAppEndpoints(endpoints, key);\r\n });\r\n\r\n return this.partnerRegisteredEndpoints;\r\n }\r\n\r\n private static getAuthExcpetionFromPartnerAppRegistrationClass() {\r\n Object.keys(this.registeredApps).forEach((key) => {\r\n const appInstance = new this.registeredApps[key]();\r\n if (!appInstance || !appInstance.getAuthExceptionEndpoints) {\r\n return;\r\n }\r\n \r\n const endpoints = appInstance.getAuthExceptionEndpoints();\r\n if (!endpoints || endpoints.length === 0) {\r\n return;\r\n }\r\n this.registerAuthExceptionEndpoints(endpoints, key);\r\n });\r\n\r\n return this.authExceptionEndpoints;\r\n }\r\n\r\n public static updateSharedComponentDetails(appName: string, compName: string, component: any, ngModule: any, componentFramework?: ComponentFramework){\r\n this.angularPartnerSharedComponents.forEach(item => {\r\n if (item.appName === appName){\r\n const sharedComponentDetails = item;\r\n if (sharedComponentDetails){\r\n sharedComponentDetails.components.forEach(item=> {\r\n if (item.componentName.toString().toLowerCase().trim() === compName.toString().toLowerCase().trim()){\r\n item.component = component;\r\n item.ngModule = ngModule;\r\n item.componentFramework = componentFramework;\r\n }\r\n })\r\n }\r\n }\r\n });\r\n }\r\n\r\n public static getSharedComponentDetails(appName: string, compName: string): ISharedComponentConfig {\r\n const partnerApp: ISharedComponents = this.angularPartnerSharedComponents.find((partnerApp) => (partnerApp.appName.toLocaleLowerCase() === appName.toLocaleLowerCase()));\r\n if (partnerApp){\r\n const sharedComponents = partnerApp.components.find((comp) => (comp.componentName.toLocaleLowerCase() === compName.toLocaleLowerCase()));\r\n if (sharedComponents){\r\n return sharedComponents;\r\n }\r\n }\r\n }\r\n\r\n public static getBundlesForSharedComponent(appName: string, compName:string): Array {\r\n let bundles = [ ];\r\n const partnerApp:ISharedComponents = this.angularPartnerSharedComponents.find((partnerApp) => (partnerApp.appName.toLocaleLowerCase() === appName.toLocaleLowerCase()));\r\n if (partnerApp){\r\n if (partnerApp.sharedBundles){\r\n bundles = partnerApp.sharedBundles;\r\n }\r\n const sharedComponents = partnerApp.components.find((comp) => (comp.componentName.toLocaleLowerCase() === compName.toLocaleLowerCase()));\r\n if (sharedComponents && !CommonUtils.isNullOrEmpty(sharedComponents.generatedBundle)){\r\n bundles.push(sharedComponents.generatedBundle);\r\n }\r\n }\r\n return bundles;\r\n }\r\n\r\n public static getSharedComponentReference(appName: string, compName: string): Promise {\r\n const self = this;\r\n const telemetry_source = `${this.sourceForTelemetry}.GetSharedComponentFactory`;\r\n let properties = self.FxpLoggerService.createPropertyBag();\r\n properties.addToBag(\"AppName\", appName);\r\n properties.addToBag(\"ComponentName\", compName);\r\n return new Promise(function (resolve, reject) {\r\n //let partnerApp:ISharedComponents = self.angularPartnerSharedComponents.find((partnerApp) => (partnerApp.appName.toLocaleLowerCase() === appName.toLocaleLowerCase()));\r\n let sharedComponentConfig = self.getSharedComponentDetails(appName, compName);\r\n if (sharedComponentConfig) {\r\n let bundles = self.getBundlesForSharedComponent(appName, compName);\r\n self.lazyLoader.load(bundles, { serie: true }).then(() => {\r\n let component, componentFramework, ngModule = null ;\r\n let sharedComponentReference: ISharedComponentReference;\r\n sharedComponentConfig = self.getSharedComponentDetails(appName, compName);\r\n if (sharedComponentConfig.component){ // Non lazyloaded angular bundles.\r\n component = sharedComponentConfig.component;\r\n ngModule = sharedComponentConfig.ngModule;\r\n componentFramework = sharedComponentConfig.componentFramework;\r\n }\r\n else {\r\n const application = self.registeredApps[appName];\r\n const instance = new application();\r\n const componentInfo = instance.getSharedComponentsInfo();\r\n const sharedComponent = componentInfo.components.find(item=> item.componentName == compName);\r\n if (sharedComponent){\r\n component = sharedComponent.component;\r\n ngModule = sharedComponent.ngModule;\r\n componentFramework = sharedComponent.componentFramework;\r\n }\r\n }\r\n // This is Angular block\r\n if (ngModule){\r\n if (ngModule._ngModuleDefFactory){\r\n const moduleRef = FxpLazyLoader.instantiateModule(ngModule);\r\n const factory = moduleRef.componentFactoryResolver.resolveComponentFactory(component);\r\n sharedComponentReference = {component: factory, componentFramework: ComponentFramework.Angular, ngModule: moduleRef};\r\n resolve(sharedComponentReference);\r\n return ;\r\n }\r\n FxpLazyLoader.compileAndLoadModule(ngModule).then(function (ngModuleRef) {\r\n const factory = ngModuleRef.componentFactoryResolver.resolveComponentFactory(component);\r\n sharedComponentReference = {component: factory, componentFramework: ComponentFramework.Angular, ngModule: ngModuleRef};\r\n resolve(factory);\r\n }).catch((error) => {\r\n reject(error);\r\n });\r\n return;\r\n\r\n }\r\n // React\r\n if (componentFramework && componentFramework === ComponentFramework.React) {\r\n sharedComponentReference = {component: component, componentFramework: ComponentFramework.React, ngModule: null};\r\n resolve(sharedComponentReference);\r\n return;\r\n }\r\n\r\n const errorMessage = `Unable to identify the JS Framwork for Component: ${compName} of Application: ${appName}. Please specify componentFramework in getSharedComponentsInfo() of application.ts file.`;\r\n console.error(errorMessage);\r\n self.FxpLoggerService.logException(telemetry_source,\r\n new Error(errorMessage),\r\n properties,\r\n null,\r\n null,\r\n ErrorSeverityLevel.High,\r\n ErrorCodes.LazyLoadingFailedForSharedComponent);\r\n })\r\n .catch(function (e) {\r\n self.FxpLoggerService.logException(telemetry_source,\r\n e,\r\n properties,\r\n null,\r\n null,\r\n ErrorSeverityLevel.High,\r\n ErrorCodes.LazyLoadingFailedForSharedComponent);\r\n reject(e);\r\n });\r\n\r\n }\r\n else {\r\n let error = `${appName} app shared components not registered.`;\r\n reject(error);\r\n self.FxpLoggerService.logError(telemetry_source,\r\n error,\r\n ErrorCodes.SharedComponentNotRegistered,\r\n \"\",\r\n properties,\r\n null,\r\n null,\r\n ErrorSeverityLevel.High);\r\n }\r\n });\r\n }\r\n\r\n public static getSharedComponentFactory(appName: string, compName: string): Promise {\r\n return this.getSharedComponentReference(appName, compName).then(function(componentRef: ISharedComponentReference){\r\n return componentRef.component;\r\n });\r\n }\r\n}\r\n","import { IPersonalizationService } from \"../interfaces/IPersonalizationService\";\r\nimport { FxpContext } from \"../context/FxpContext\";\r\nimport { IRootScope } from \"../interfaces/IRootScope\";\r\nimport { FxpConfigurationService } from \"./FxpConfiguration\";\r\nimport { ILogger } from \"../interfaces/ILogger\";\r\nimport { FxpMessageService } from \"../../app/banner/FxpMessageService\";\r\nimport { FxpConstants, PerfMarkers } from \"../common/ApplicationConstants\";\r\nimport { CommonUtils } from \"../utils/CommonUtils\";\r\nimport { IFxPService } from \"../interfaces/IFxpService\";\r\nimport { TelemetryConstants } from \"../telemetry/TelemetryConst\";\r\nimport { ErrorCodes } from \"../constants/errorCodes\";\r\nimport { ErrorSeverityLevel } from \"../telemetry/ErrorSeverityLevel\";\r\nimport { MsalAuthenticationService } from \"./MsalAuthenticationService\";\r\n\r\nexport class PersonalizationService implements IPersonalizationService,IFxPService {\r\n\tprivate sleepInterval: number;\r\n\tprivate iCount: number = 0;\r\n\tprivate iReqCount: number = 0;\r\n\tprivate iUCount: number = 0;\r\n\tprivate fxpServiceEndPoint: string;\r\n\tprivate oneProfileEndPoint: string;\r\n\tprivate sourceForTelemetry = `${TelemetryConstants.FXP_TELEMETRY_BASE_NAME}.PersonalizationService`;\r\n\tprivate tenantClaimsApiEndpoint: string;\r\n\tprivate tenantRolesApiEndpoint: string;\r\n\tprivate tenantNPD: string;\r\n\tprivate NotificationApiEndpoint: string;\r\n\tconstructor(private http: angular.IHttpService,\r\n\t\tprivate q: angular.IQService,\r\n\t\tprivate rootScope: IRootScope,\r\n\t\tprivate fxpConfiguration: FxpConfigurationService,\r\n\t\tprivate timeout: angular.ITimeoutService,\r\n\t\tprivate fxplogger: ILogger,\r\n\t\tprivate msalAuthenticationService: MsalAuthenticationService,\r\n\t\tprivate fxpMessageSvc: FxpMessageService) {\r\n\r\n\t\tthis.sleepInterval = 100;\r\n\t\tthis.fxpServiceEndPoint = this.fxpConfiguration.FxpAppSettings.FxpServiceEndPoint;\r\n\t\tlet profileStore = window[\"tenantConfiguration\"].ProfileStore || {};\r\n\t\tthis.oneProfileEndPoint = profileStore.ProfileAPIEndPoint;\r\n\t\tlet authStore = window[\"tenantConfiguration\"].AuthStore || {};\r\n\t\tlet rolePersonalizationStore = window[\"tenantConfiguration\"].RolePersonalizationStore || {};\r\n\t\tthis.tenantClaimsApiEndpoint = authStore.TenantClaimsEndPoint;\r\n\t\tthis.tenantRolesApiEndpoint = rolePersonalizationStore.TenantRolesEndPoint;\r\n\t\tthis.tenantNPD = window[\"tenantConfiguration\"].NPD;\r\n\t\tlet NotificationStore = window[\"tenantConfiguration\"].NotificationStore || {};\r\n\t\tthis.NotificationApiEndpoint = NotificationStore.NotificationApiEndPoint;\r\n\r\n\t}\r\n\r\n\t/**\r\n\t* A method to Get the Persisted Pesanalization User Informantion\r\n\t* @method Fxp.Services.PersonalizationService.getPersistedPersonalization\r\n\t* @example Example to use getPersistedPersonalization\r\n\t* PersonalizationService.getPersistedPersonalization()\r\n\t*/\r\n\tgetPersistedPersonalization(): any {\r\n\t\tlet context = localStorage.getItem(\"selectedUserPersonalization\");\r\n\t\tlet keyContext = null;\r\n\t\tif (!CommonUtils.isNullOrEmpty(context)) {\r\n\t\t\tlet data = JSON.parse(context);\r\n\t\t\tkeyContext = data.user;\r\n\t\t}\r\n\t\treturn keyContext;\r\n\r\n\t}\r\n\t/**\r\n * A method to Persisted Pesanalization for selected User\r\n * @method Fxp.Services.PersonalizationService.getPersistedPersonalization\r\n * @example Example to use getPersistedPersonalization\r\n * PersonalizationService.persistUserPersonalization()\r\n */\r\n\tpersistUserPersonalization(value): void {\r\n\t\tlet context = localStorage.getItem(\"selectedUserPersonalization\");\r\n\t\tlet selectedUserPersonalization = null;\r\n\t\tif (!CommonUtils.isNullOrEmpty(context)) {\r\n\t\t\tselectedUserPersonalization = JSON.parse(context);\r\n\t\t} else {\r\n\t\t\tselectedUserPersonalization = {\r\n\t\t\t\tuser: null\r\n\t\t\t}\r\n\t\t}\r\n\t\tselectedUserPersonalization.user = value;\r\n\t\tif (!CommonUtils.isNullOrEmpty(selectedUserPersonalization)) {\r\n\t\t\tlocalStorage.setItem(\"selectedUserPersonalization\", JSON.stringify(selectedUserPersonalization));\r\n\t\t}\r\n\t}\r\n\t/**\r\n * A method to Remove the Persisted Pesanalization User Informantion\r\n * @method Fxp.Services.PersonalizationService.removePersistedUserPersonalization\r\n * @example Example to use removePersistedUserPersonalization\r\n * PersonalizationService.removePersistedUserPersonalization()\r\n */\r\n\tremovePersistedUserPersonalization(): void {\r\n\t\tlocalStorage.removeItem(\"selectedUserPersonalization\");\r\n\t}\r\n\t/**\r\n\t *A method to use Fetch the Global Master LeftNav Items From Api\r\n\t * @method Fxp.Services.PersonalizationService.getMasterLeftNavItems\r\n\t * @example Example to use getMasterLeftNavItems\r\n\t * PersonalizationService.getMasterLeftNavItems()\r\n\t */\r\n\tgetMasterLeftNavItems(): angular.IPromise {\r\n\t\tvar self = this;\r\n\t\tconst telemetry_source = `${self.sourceForTelemetry}.GetMasterLeftNavItems`;\r\n\t\tvar deferred = self.q.defer();\r\n\t\tvar url = self.fxpServiceEndPoint + \"/leftNav/master\";\r\n\t\tif (self.msalAuthenticationService.accessTokenRequestInProgress(url)) {\r\n\t\t\tself.iReqCount++;\r\n\t\t\tif (self.iReqCount == 5) {\r\n\t\t\t\tself.fxplogger.logError(telemetry_source, self.rootScope.fxpUIConstants.UIMessages.AADAuthFailureError.ErrorMessageTitle, ErrorCodes.PersonalizationService_GetMasterLeftNav_Failure, null, null, null, null, ErrorSeverityLevel.High);\r\n\t\t\t\tself.fxpMessageSvc.addMessage(self.rootScope.fxpUIConstants.UIMessages.AADAuthFailureError.ErrorMessage, FxpConstants.messageType.error);\r\n\t\t\t}\r\n\t\t\tself.timeout(function () {\r\n\t\t\t\tself.getMasterLeftNavItems();\r\n\t\t\t}, self.sleepInterval);\r\n\t\t} else {\r\n\t\t\tself.fxplogger.startTrackPerformance(PerfMarkers.GetMasterLeftNavItems);\r\n\t\t\tself.iReqCount = 0;\r\n\t\t\tlet requestHeaders = {};\r\n\t\t\trequestHeaders[\"X-TenantId\"] = window[\"tenantConfiguration\"].TenantId;\r\n\t\t\treturn self.http.get(url, { headers: requestHeaders });\r\n\t\t}\r\n\t\tself.fxplogger.stopTrackPerformance(PerfMarkers.GetMasterLeftNavItems);\r\n\t\treturn deferred.promise;\r\n\t}\r\n\r\n\t/**\r\n\t*A method to use Fetch the Personalaized NavItems From Api\r\n\t* @method Fxp.Services.PersonalizationService.getPersonalizedNavItems\r\n\t* @example Example to use getPersonalizedNavItems\r\n\t* PersonalizationService.getPersonalizedNavItems()\r\n\t*/\r\n\tgetPersonalizedNavItems(userAlias: string, roleGroupId: string, userRoleId: string): angular.IPromise {\r\n\t\tvar self = this;\r\n\t\tvar deferred = self.q.defer();\r\n\t\tconst telemetry_source = `${self.sourceForTelemetry}.GetPersonalizedNavItems`;\r\n\t\tvar url = this.fxpServiceEndPoint + \"/user/\" + userAlias + \"/leftNav/personalization?roleGroupId=\" + roleGroupId + \"&userRoleId=\" + userRoleId;\r\n\t\tif (self.msalAuthenticationService.accessTokenRequestInProgress(url)) {\r\n\t\t\tself.iReqCount++;\r\n\t\t\tif (self.iReqCount == 5) {\r\n\t\t\t\tself.fxplogger.logError(telemetry_source, self.rootScope.fxpUIConstants.UIMessages.AADAuthFailureError.ErrorMessageTitle, ErrorCodes.PersonalizationService_GetPersonalizedLeftNav_Failure, null, null, null, null, ErrorSeverityLevel.Medium);\r\n\t\t\t\tself.fxpMessageSvc.addMessage(self.rootScope.fxpUIConstants.UIMessages.AADAuthFailureError.ErrorMessage, FxpConstants.messageType.error);\r\n\t\t\t}\r\n\t\t\tself.timeout(function () {\r\n\t\t\t\tself.getPersonalizedNavItems(userAlias, roleGroupId, userRoleId);\r\n\t\t\t}, self.sleepInterval);\r\n\t\t} else {\r\n\t\t\tself.fxplogger.startTrackPerformance(PerfMarkers.GetPersonalizedNavItems);\r\n\t\t\tself.iReqCount = 0;\r\n\t\t\treturn self.http.get(url);\r\n\t\t}\r\n\t\tself.fxplogger.stopTrackPerformance(PerfMarkers.GetPersonalizedNavItems);\r\n\t\treturn deferred.promise;\r\n\t}\r\n\r\n\t/**\r\n\t*A method to use save the Personalaized NavItems to Api\r\n\t* @method Fxp.Services.PersonalizationService.savePersonalizedNavItems\r\n\t* @example Example to use savePersonalizedNavItems\r\n\t* PersonalizationService.savePersonalizedNavItems(userAlias: string, savedUserPrefNavList: any)\r\n\t*/\r\n\tsavePersonalizedNavItems(userAlias: string, savedUserPrefNavList: any, shouldAssignRoles: boolean = true): angular.IPromise {\r\n\t\tvar self = this;\r\n\t\tvar deferred = self.q.defer();\r\n\t\tconst telemetry_source = `${self.sourceForTelemetry}.SavePersonalizedNavItems`;\r\n\t\tvar url = self.fxpServiceEndPoint + \"/user/\" + userAlias + \"/leftNav/personalization\";\r\n\t\tsavedUserPrefNavList.ShouldAssignRoles = shouldAssignRoles;\r\n\t\tif (self.msalAuthenticationService.accessTokenRequestInProgress(url)) {\r\n\t\t\tself.iReqCount++;\r\n\t\t\tif (self.iReqCount == 5) {\r\n\t\t\t\tself.fxplogger.logError(telemetry_source, self.rootScope.fxpUIConstants.UIMessages.AADAuthFailureError.ErrorMessageTitle, ErrorCodes.PersonalizationSerivce_SavePersonalizedNavItems_Failure, null, null, null, null, ErrorSeverityLevel.High);\r\n\t\t\t\tself.fxpMessageSvc.addMessage(self.rootScope.fxpUIConstants.UIMessages.AADAuthFailureError.ErrorMessage, FxpConstants.messageType.error);\r\n\t\t\t}\r\n\t\t\tself.timeout(function () {\r\n\t\t\t\tself.savePersonalizedNavItems(userAlias, savedUserPrefNavList);\r\n\t\t\t}, self.sleepInterval);\r\n\t\t} else {\r\n\t\t\tself.fxplogger.startTrackPerformance(PerfMarkers.SavePersonalizedNavItems);\r\n\t\t\tself.iReqCount = 0;\r\n\t\t\treturn self.http.post(url, savedUserPrefNavList, { headers: { 'Content-Type': 'application/json' } });\r\n\t\t}\r\n\t\tself.fxplogger.stopTrackPerformance(PerfMarkers.SavePersonalizedNavItems);\r\n\t\treturn deferred.promise;\r\n\t}\r\n\r\n\t/**\r\n\t*A method to use Fetch the RoleGroupDetails From Api\r\n\t* @method Fxp.Services.PersonalizationService.getRoleGroupDetails\r\n\t* @example Example to use getRoleGroupDetails\r\n\t* PersonalizationService.getRoleGroupDetails()\r\n\t*/\r\n\tgetRoleGroupDetails(): angular.IPromise {\r\n\t\tvar self = this;\r\n\t\tvar deferred = self.q.defer();\r\n\t\tconst telemetry_source = `${this.sourceForTelemetry}.GetRoleGroupDetails`; \r\n\t\tvar url = self.tenantRolesApiEndpoint + \"/roles\";\r\n\t\tif (self.msalAuthenticationService.accessTokenRequestInProgress(url)) {\r\n\t\t\tself.iReqCount++;\r\n\t\t\tif (self.iReqCount == 5) {\r\n\t\t\t\tself.fxplogger.logError(telemetry_source, self.rootScope.fxpUIConstants.UIMessages.AADAuthFailureError.ErrorMessageTitle, ErrorCodes.PersonalizationSerivce_GetRoleGroupDetails_Failure, null, null, null, null, ErrorSeverityLevel.High);\r\n\t\t\t\tself.fxpMessageSvc.addMessage(self.rootScope.fxpUIConstants.UIMessages.AADAuthFailureError.ErrorMessage, FxpConstants.messageType.error);\r\n\t\t\t}\r\n\t\t\tself.timeout(function () {\r\n\t\t\t\tself.getRoleGroupDetails();\r\n\t\t\t}, self.sleepInterval);\r\n\t\t} else {\r\n\t\t\tself.fxplogger.startTrackPerformance(PerfMarkers.GetRoleGroupDetails);\r\n\t\t\tself.iReqCount = 0;\r\n\t\t\tlet requestHeaders = {};\r\n\t\t\trequestHeaders[\"X-Tenants\"] = self.tenantNPD;\r\n\t\t\treturn this.http.get(url, { headers: requestHeaders });\r\n\r\n\t\t}\r\n\t\tself.fxplogger.stopTrackPerformance(PerfMarkers.GetRoleGroupDetails);\r\n\t\treturn deferred.promise;\r\n\t}\r\n\r\n\t/**\r\n\t*A method to use Fetch the RoleGroupDetails From Api\r\n\t* @method Fxp.Services.PersonalizationService.getRoleGroupDetailsForNotification\r\n\t* @example Example to use getRoleGroupDetails\r\n\t* PersonalizationService.getRoleGroupDetailsForNotification()\r\n\t*/\r\n\tgetRoleGroupDetailsForNotification(): angular.IPromise {\r\n\t\tvar self = this;\r\n\t\tvar deferred = self.q.defer();\r\n\t\tconst telemtry_source = `${this.sourceForTelemetry}.GetRoleGroupDetailsForNotification`;\r\n\t\tvar url = self.NotificationApiEndpoint + \"/master/rolegroup\";\r\n\t\tif (self.msalAuthenticationService.accessTokenRequestInProgress(url)) {\r\n\t\t\tself.iReqCount++;\r\n\t\t\tif (self.iReqCount == 5) {\r\n\t\t\t\tself.fxplogger.logError(telemtry_source, self.rootScope.fxpUIConstants.UIMessages.AADAuthFailureError.ErrorMessageTitle, ErrorCodes.PersonalizationSerivce_GetRoleGroupDetailsForNotification_Failure, null, null, null, null, ErrorSeverityLevel.High);\r\n\t\t\t\tself.fxpMessageSvc.addMessage(self.rootScope.fxpUIConstants.UIMessages.AADAuthFailureError.ErrorMessage, FxpConstants.messageType.error);\r\n\t\t\t}\r\n\t\t\tself.timeout(function () {\r\n\t\t\t\tself.getRoleGroupDetails();\r\n\t\t\t}, self.sleepInterval);\r\n\t\t} else {\r\n\t\t\tself.fxplogger.startTrackPerformance(PerfMarkers.GetRoleGroupDetails);\r\n\t\t\tself.iReqCount = 0;\r\n\t\t\treturn this.http.get(url);\r\n\r\n\t\t}\r\n\t\tself.fxplogger.stopTrackPerformance(PerfMarkers.GetRoleGroupDetails);\r\n\t\treturn deferred.promise;\r\n\t}\r\n\r\n\t/**\r\n\t*A method to use get the Role Personalaized NavItems from Api\r\n\t* @method Fxp.Services.PersonalizationService.getRolePersonalizedNavItems\r\n\t* @example Example to use getRolePersonalizedNavItems\r\n\t* PersonalizationService.getRolePersonalizedNavItems(userRoleId, roleGroupId)\r\n\t*/\r\n\tgetRolePersonalizedNavItems(userRoleId: string, roleGroupId: string): angular.IPromise {\r\n\t\tvar self = this;\r\n\t\tvar deferred = self.q.defer();\r\n\t\tvar url = this.fxpServiceEndPoint + \"/navigation/personalization?roleGroupId=\" + roleGroupId;\r\n\t\tconst telemetry_source = `${this.sourceForTelemetry}.GetRolePersonalizedNavItems`;\r\n\t\tif (self.msalAuthenticationService.accessTokenRequestInProgress(url)) {\r\n\t\t\tself.iReqCount++;\r\n\t\t\tif (self.iReqCount == 5) {\r\n\t\t\t\tself.fxplogger.logError(telemetry_source, self.rootScope.fxpUIConstants.UIMessages.AADAuthFailureError.ErrorMessageTitle, ErrorCodes.PersonalizationSerivce_GetRolePersonalizedNavItems_Failure, null, null, null, null, ErrorSeverityLevel.High);\r\n\t\t\t\tself.fxpMessageSvc.addMessage(self.rootScope.fxpUIConstants.UIMessages.AADAuthFailureError.ErrorMessage, FxpConstants.messageType.error);\r\n\t\t\t}\r\n\t\t\tself.timeout(function () {\r\n\t\t\t\tself.getRolePersonalizedNavItems(userRoleId, roleGroupId);\r\n\t\t\t}, self.sleepInterval);\r\n\t\t} else {\r\n\t\t\tself.fxplogger.startTrackPerformance(PerfMarkers.GetPersonalizedNavItems);\r\n\t\t\tself.iReqCount = 0;\r\n\t\t\tvar requestHeaders = {}\r\n\t\t\trequestHeaders[\"tenantId\"] = window[\"tenantConfiguration\"].TenantId;\r\n\t\t\treturn self.http.get(url, { headers: requestHeaders });\r\n\t\t}\r\n\t\tself.fxplogger.stopTrackPerformance(PerfMarkers.GetPersonalizedNavItems);\r\n\t\treturn deferred.promise;\r\n\t}\r\n\r\n\t/**\r\n\t*A method to use get the RoleGroup Personalaized NavItems from Api\r\n\t* @method Fxp.Services.PersonalizationService.savePersonalizedNavItems\r\n\t* @example Example to use getRoleGroupPersonalizedList\r\n\t* PersonalizationService.getRoleGroupPersonalizedList(roleGroupId)\r\n\t*/\r\n\tgetRoleGroupPersonalizedList(roleGroupId: string): angular.IPromise {\r\n\t\tvar self = this;\r\n\t\tvar deferred = self.q.defer();\r\n\t\tconst telemetry_source = `${this.sourceForTelemetry}.GetRoleGroupPersonalizedList`;\r\n\t\tvar url = self.fxpServiceEndPoint + \"/navigation/personalization?AppRole=\" + roleGroupId;\r\n\r\n\t\tif (self.msalAuthenticationService.accessTokenRequestInProgress(url)) {\r\n\t\t\tself.iReqCount++;\r\n\t\t\tif (self.iReqCount == 5) {\r\n\t\t\t\tself.fxplogger.logError(telemetry_source, self.rootScope.fxpUIConstants.UIMessages.AADAuthFailureError.ErrorMessageTitle, ErrorCodes.PersonalizationSerivce_GetRoleGroupPersonalizedList_Failure, null, null, null, null, ErrorSeverityLevel.High);\r\n\t\t\t\tself.fxpMessageSvc.addMessage(self.rootScope.fxpUIConstants.UIMessages.AADAuthFailureError.ErrorMessage, FxpConstants.messageType.error);\r\n\t\t\t}\r\n\t\t\tself.timeout(function () {\r\n\t\t\t\tself.getRoleGroupPersonalizedList(roleGroupId);\r\n\t\t\t}, self.sleepInterval);\r\n\t\t} else {\r\n\t\t\tself.fxplogger.startTrackPerformance(PerfMarkers.GetPersonalizedNavItems);\r\n\t\t\tself.iReqCount = 0;\r\n\t\t\treturn self.http.get(url, { headers: { \"X-TenantId\": window[\"tenantConfiguration\"].TenantId } });\r\n\t\t}\r\n\t\tself.fxplogger.stopTrackPerformance(PerfMarkers.GetPersonalizedNavItems);\r\n\t\treturn deferred.promise;\r\n\t}\r\n\r\n\t/**\r\n\t*A method to use save the Personalaized NavItems to Api\r\n\t* @method Fxp.Services.PersonalizationService.savePersonalizedNavItems\r\n\t* @example Example to use savePersonalizedNavItems\r\n\t* PersonalizationService. saveRoleGroupPersonalizedNavItems(roleGroupId: string, userRoleId: string, savedRoleGroupPrefNavList: any)\r\n\t*/\r\n\tsaveRoleGroupPersonalizedNavItems(savedRoleGroupPrefNavList: any, shouldAssignRoles: boolean = true): angular.IPromise {\r\n\t\tvar self = this, url;\r\n\t\tvar deferred = self.q.defer();\r\n\t\tconst telemetry_source = `${this.sourceForTelemetry}.SaveRoleGroupPersonalizedNavItems`; \r\n\t\tsavedRoleGroupPrefNavList.ShouldAssignRoles = shouldAssignRoles;\r\n\t\turl = self.fxpServiceEndPoint + \"/navigation/personalization\";\r\n\r\n\t\tif (self.msalAuthenticationService.accessTokenRequestInProgress(url)) {\r\n\t\t\tself.iReqCount++;\r\n\t\t\tif (self.iReqCount == 5) {\r\n\t\t\t\tself.fxplogger.logError(telemetry_source, self.rootScope.fxpUIConstants.UIMessages.AADAuthFailureError.ErrorMessageTitle, ErrorCodes.PersonalizationSerivce_SaveRoleGroupPersonalizedNavItems_Failure, null, null, null, null, ErrorSeverityLevel.High);\r\n\t\t\t\tself.fxpMessageSvc.addMessage(self.rootScope.fxpUIConstants.UIMessages.AADAuthFailureError.ErrorMessage, FxpConstants.messageType.error);\r\n\t\t\t}\r\n\t\t\tself.timeout(function () {\r\n\t\t\t\tself.saveRoleGroupPersonalizedNavItems(savedRoleGroupPrefNavList, shouldAssignRoles);\r\n\t\t\t}, self.sleepInterval);\r\n\t\t} else {\r\n\t\t\tself.fxplogger.startTrackPerformance(PerfMarkers.SaveRoleGroupPersonalizedNavItems);\r\n\t\t\tself.iReqCount = 0;\r\n\t\t\treturn self.http.post(url, savedRoleGroupPrefNavList, { headers: { 'Content-Type': 'application/json', 'X-TenantId': window['tenantConfiguration'].TenantId } });\r\n\t\t}\r\n\t\tself.fxplogger.stopTrackPerformance(PerfMarkers.SaveRoleGroupPersonalizedNavItems);\r\n\t\treturn deferred.promise;\r\n\t}\r\n\r\n\t/**\r\n\t*A method to use get the RoleGroup which is configured in Sysytem\r\n\t* @method Fxp.Services.PersonalizationService.getDefaultRoleGroup\r\n\t* @example Example to use getDefaultRoleGroup\r\n\t* PersonalizationService.getDefaultRoleGroup(roleGroupId: number)\r\n\t*/\r\n\tgetRoleGroup(roleGroupId: number): any {\r\n\t\tvar self = this;\r\n\t\treturn self.http.get(\"/Home/GetRoleGroup?roleGroupId=\" + roleGroupId);\r\n\t}\r\n}\r\n","import { IFxPService } from \"../interfaces/IFxpService\";\r\nexport class TimeZoneHelper implements IFxPService{\r\n\r\n\tprivate PacificRegion = \"America/Los_Angeles\";\r\n\r\n\tconstructor(private moment: any) {\r\n\t}\r\n\r\n\tgetCurrentUtcDateTime = () => {\r\n\t\treturn this.moment.utc();\r\n\t}\r\n\r\n\taddHoursToCurrentUtcDateTime = (hours) => {\r\n\t\treturn this.moment.utc.add(hours,'hours');\r\n\t}\r\n\r\n\tgetCurrentLocalDateTime = () => {\r\n\t\treturn this.moment.utc().local();\r\n\t}\r\n\r\n\taddHoursToLocalUtcDateTime = (hours) => {\r\n\t\treturn this.moment.utc().local().add(hours,'hours');\r\n\t}\r\n\r\n\r\n\tgetCurrentPacificDateTime = () => {\r\n\t\treturn this.moment.tz(this.PacificRegion);\r\n\t}\r\n\r\n\tAddHoursToCurrentPacificDateTime = (hours) => {\r\n\t\treturn this.moment.tz(this.PacificRegion).add(hours,'hours');\r\n\t}\r\n\r\n\tconvertToPacific = (moment) => {\r\n\t\tlet a = this.moment.isMoment(moment) ? moment : this.moment(moment);\r\n\t\treturn this.moment.tz(a, this.PacificRegion);\r\n\t}\r\n\r\n\tconvertToLocal = (moment) => {\r\n\t\tlet currentTime = this.moment.isMoment(moment) ? moment : this.moment(moment);\r\n\t\treturn currentTime.utc().local();\r\n\t}\r\n\r\n\tconvertToUtc = (moment) => {\r\n\t\treturn this.moment.utc(moment);\r\n\t}\r\n\r\n\tchangeTimeZoneComponentToPacific = (moment) => {\r\n\t\tlet clone = moment.clone();\r\n\t\tclone = this.moment.tz(clone, this.PacificRegion);\r\n\t\tclone.add(moment.utcOffset() - clone.utcOffset(), 'minutes');\r\n\t\treturn clone;\r\n\t}\r\n\tchangeTimeZoneComponentToUniversal = (time) => {\r\n\t\tlet timeUtc = this.moment.utc(time.clone());\r\n\t\ttimeUtc.add(time.utcOffset(), 'minutes');\r\n\t\treturn timeUtc;\r\n\t}\r\n\tconvertUtcToLocal = (time) => {\r\n\t\tlet utcDate = this.moment.utc(time.clone());\r\n\t\tlet timeLocal = utcDate.local();\r\n\t\treturn timeLocal;\r\n\t}\r\n\r\n\tgetCurrentTimeZoneCode = (timezone) => {\r\n\t\treturn this.moment().tz(timezone).format('zz')\r\n\t}\r\n}\r\n","import { TelemetryConstants } from \"../telemetry/TelemetryConst\";\r\nimport { ILogger } from \"../interfaces/ILogger\";\r\nimport { FxpConfigurationService } from \"./FxpConfiguration\";\r\nimport { FxpAnnouncementModalConstant } from \"../constants/FxPModal.constants\";\r\nimport { FxpGlobalStoreService } from \"./fxp.global.store.service\";\r\nimport { IRootScope } from \"../interfaces/IRootScope\";\r\nimport { UserFeedbackUIService } from \"./UserFeedbackUIService\";\r\n\r\n\r\n\r\nexport class UserAnnouncementUIService {\r\n\tprivate readonly sourceForTelemetry: string = `${TelemetryConstants.FXP_TELEMETRY_BASE_NAME}.UserAnnouncementUIService`; \r\n \r\n\tconstructor(private $uibModal: any,\r\n private fxpLogger: ILogger, private fxpConfiguration: FxpConfigurationService, private fxpGlobalStoreService: FxpGlobalStoreService,private $rootScope: IRootScope, private userFeedbackUIService: UserFeedbackUIService){\r\n\r\n }\r\n\t\r\n private showAnnouncement(content: string, callback: any){\r\n const modalProps: any = FxpAnnouncementModalConstant.options;\r\n const self = this;\r\n const source_telemetry = `${this.sourceForTelemetry}.showAnnouncement`;\r\n modalProps.controller = function ($scope,$uibModalInstance) {\r\n this.Content = content;\r\n\r\n this.onCancel = _ => { \r\n $uibModalInstance.close('cancel');\r\n self.$rootScope.IsModelOpen = false;\r\n setTimeout(function () {\r\n self.fxpLogger.logEvent(source_telemetry, `${TelemetryConstants.FXP_TELEMETRY_BASE_NAME}.AnnouncementPopupClosed`); \r\n self.userFeedbackUIService.collectGCEFeedback();\r\n }, self.fxpConfiguration.FxpAppSettings.DelayFeedbackPoupInSeconds * 1000);\r\n };\r\n };\r\n this.$uibModal.open(modalProps);\r\n localStorage[\"AnnouncementShown\"] = true;\r\n }\r\n\r\n public showUserAnnouncement(){\r\n let self = this;\r\n const source_telemetry = `${this.sourceForTelemetry}.showUserAnnouncement`;\r\n let showGCEAnnouncementDialog = self.fxpGlobalStoreService.GetPlatformState().FeatureFlags[this.fxpConfiguration.FxpAppSettings.ShowSystemAnnouncementFeatureFlagName];\r\n\t\t\tlet GCEFeedbackDialogFeatureFlag = self.fxpGlobalStoreService.GetPlatformState().FeatureFlags[this.fxpConfiguration.FxpAppSettings.GCERingReleaseFeatureFlagName];\r\n\t\t\tlet isAnnouncementShown = localStorage[\"AnnouncementShown\"] === \"true\" ? true : false;\r\n\t\t\tsetTimeout(function () {\r\n\t\t\t\tif (showGCEAnnouncementDialog && GCEFeedbackDialogFeatureFlag && !isAnnouncementShown && !self.$rootScope.IsModelOpen) {\r\n\t\t\t\t\tself.showAnnouncement(self.fxpConfiguration.FxpBaseConfiguration.FxpConfigurationStrings.UIStrings.AnnouncementPopupMessages.ContentMessage, {});\r\n self.$rootScope.IsModelOpen = true;\r\n self.fxpLogger.logEvent(source_telemetry, `${TelemetryConstants.FXP_TELEMETRY_BASE_NAME}.AnnouncementPopupOpened`); \r\n }\r\n\t\t\t}, 2000);\r\n }\r\n}","import { IRootScope } from \"../interfaces/IRootScope\";\r\nimport { ILogger } from \"../interfaces/ILogger\";\r\nimport { FxpContext } from \"../context/FxpContext\";\r\nimport { FxpMessageService } from \"../../app/banner/FxpMessageService\";\r\nimport { FxpConstants, ApplicationConstants, PerfMarkers } from \"../common/ApplicationConstants\";\r\nimport { UserInfoService } from \"./UserInfoService\";\r\nimport { CommonUtils } from \"../utils/CommonUtils\";\r\nimport { LogPropertyBag } from \"../telemetry/LogPropertyBag\";\r\nimport { FxpConfigurationService } from \"./FxpConfiguration\";\r\nimport { IFxPService } from \"../interfaces/IFxpService\";\r\nimport { FxpGlobalStoreService } from \"../services/fxp.global.store.service\";\r\nimport { AddLoggedInUserClaims, AddCurrentUserClaims } from \"../../app/claims/claims.action\";\r\n\r\ndeclare var _: any;\r\nimport { TelemetryConstants } from './../telemetry/TelemetryConst';\r\nimport { SystemEvent } from './../telemetry/SystemEvent';\r\nimport { ComponentType } from '@microsoftit/telemetry-extensions-npm';\r\nimport { ErrorCodes } from \"../constants/errorCodes\";\r\nimport { ErrorSeverityLevel } from \"../telemetry/ErrorSeverityLevel\";\r\nimport { UserProfileService } from \"./userProfileService\";\r\nimport { MsalAuthenticationService } from \"./MsalAuthenticationService\";\r\n\r\ndeclare var _: any;\r\n/**\r\n * A service to connect to user cliams service to fetch the detaisl of user claims related to partner apps\r\n * @class Fxp.Services.UserClaimsService\r\n * @classdesc A service to connect to user cliams service to fetch the detaisl of user claims related to partner apps\r\n * @example Example to create an instance of user cliams service\r\n * //Initializing User Cliams Service\r\n * angular.module('FxPApp').controller('AppController', ['UserClaimsService', AppController]);\r\n * function AppController(userClaimsService){ userClaimsService.getUserThumbnail(upn); }\r\n */\r\nexport class UserClaimsService implements IFxPService {\r\n private http: angular.IHttpService;\r\n private q: angular.IQService;\r\n private rootScope: IRootScope;\r\n private timeout: angular.ITimeoutService;\r\n private sleepInterval: number;\r\n private msalAuthenticationService: MsalAuthenticationService;\r\n private claimsApiEndpoint: string;\r\n private tenantClaimsApiEndpoint: string;\r\n private loggedInUserAlias: string;\r\n private fxplogger: ILogger;\r\n private fxpcontext: FxpContext;\r\n private userAlias: string;\r\n private fxpMessageSvc: FxpMessageService;\r\n private iReqCount: number = 0;\r\n private iTenantReqCount: number = 0;\r\n private userInfoService: UserInfoService;\r\n public currentUserAlias;\r\n private sourceForTelemetry = `${TelemetryConstants.FXP_TELEMETRY_BASE_NAME}.UserClaimsService`;\r\n\r\n constructor($http: angular.IHttpService, $q: angular.IQService, $rootScope: IRootScope, $timeout: angular.ITimeoutService, loggerService: ILogger,\r\n msalAuthenticationService: MsalAuthenticationService, fxpMessage: FxpMessageService, fxpContext: FxpContext,\r\n userInfoService: UserInfoService, private fxpConfiguration: FxpConfigurationService, private globalStoreService: FxpGlobalStoreService, private userProfileService: UserProfileService) {\r\n this.http = $http;\r\n this.q = $q;\r\n this.rootScope = $rootScope;\r\n this.timeout = $timeout;\r\n this.sleepInterval = 100;\r\n this.msalAuthenticationService = msalAuthenticationService;\r\n this.fxplogger = loggerService;\r\n this.fxpMessageSvc = fxpMessage;\r\n this.fxpcontext = fxpContext;\r\n this.userAlias = \"\";\r\n this.loggedInUserAlias = \"\";\r\n this.currentUserAlias = \"\";\r\n this.userInfoService = userInfoService;\r\n let authStore = window[\"tenantConfiguration\"].AuthStore || {};\r\n this.claimsApiEndpoint = authStore.UserClaimsEndPoint;\r\n this.tenantClaimsApiEndpoint = authStore.TenantClaimsEndPoint;\r\n }\r\n\r\n\r\n /**\r\n * Gets userclaims of the logged in user from the fxp context for an application.\r\n * @method Fxp.Services.UserClaimsService.getLoggedInUserClaims\r\n * @param {ApplcationId } appId application name for which the roles defined.\r\n * @example Example to invoke getLoggedInUserClaims\r\n * UserClaimsService.getLoggedInUserClaims('oneProfile');\r\n */\r\n getLoggedInUserClaims(appId: string): any {\r\n return this.getUserClaimsForAlias(appId, this.userInfoService.getLoggedInUserOID());\r\n }\r\n\r\n /**\r\n * Gets tenant claims of the logged in user from the fxp context for an application.\r\n * @method Fxp.Services.UserProfileService.getUserClaims\r\n * @param {string } tenantId tenant id for which the roles defined.\r\n * @example Example to invoke getUserClaims\r\n * UserClaimsService.getUserClaims('oneProfile');\r\n */\r\n getLoggedInUserTenantClaims(tenantId: string): any {\r\n return this.getUserClaimsForAlias(tenantId, this.userInfoService.getLoggedInUserOID());\r\n }\r\n\r\n /**\r\n * Gets userclaims of the logged in user from the fxp context for an application.\r\n * @method Fxp.Services.UserClaimsService.getUserClaims\r\n * @param {string} appId application name for which the roles defined.\r\n * @example Example to invoke getUserClaims\r\n * UserClaimsService.getUserClaims('oneProfile');\r\n */\r\n getUserClaims(appId: string): any {\r\n return this.getUserClaimsForAlias(appId, this.userInfoService.getCurrentUserOID());\r\n }\r\n\r\n /**\r\n * Gets userclaims of the logged in user from the fxp context for an application.\r\n * @method Fxp.Services.UserClaimsService.getUserClaimsForScopes\r\n * @param {string} userAlias alias of the user\r\n * @param {string[]} appId application / tenant names for which the roles defined.\r\n * @param {string[]} scopes scopes of role, for which the claims has to be returned.\r\n * @param {string} scopeDirection direction on which you want to search the scopes for, this inclues \"Exact\", \"ScopeAndAbove\", \"ScopeAndBelow\". By default it is \"ScopeAndBelow\"\r\n * @example Example to invoke getUserClaimsForScopes\r\n * UserClaimsService.getUserClaimsForScopes('your-alias', ['ps','mdm'], ['/contracts/role/abc','/contracts/role/abc'], 'ScopeAndBelow');\r\n */\r\n async getUserClaimsForScopes(userAlias: string, appId: string[], scopes: string[] = [], scopeDirection: string = \"ScopeAndBelow\") {\r\n const self = this;\r\n if(CommonUtils.isNullOrEmpty(userAlias)){\r\n throw new Error('User Alias cannot be null or Empty');\r\n }\r\n if(CommonUtils.isNullOrEmpty(appId)){\r\n throw new Error('Tenant ID cannot be null or empty');\r\n }\r\n let userClaims = await this.getClaimsForUserAlias(userAlias, appId);\r\n if(!CommonUtils.isNullOrEmpty(userClaims.tenantClaims)){\r\n let userClaimsCopy = JSON.parse(JSON.stringify(userClaims));\r\n let tenantClaims = Object.keys(userClaimsCopy.tenantClaims).reduce((accumulator, key)=> {\r\n accumulator[key.toLowerCase()] = userClaimsCopy.tenantClaims[key]; \r\n return accumulator;\r\n },{});\r\n appId = appId.map(app => app.toLowerCase());\r\n let filteredClaims = self.filterRolesBasedOnScopes(tenantClaims, appId, scopes, scopeDirection);\r\n userClaimsCopy.tenantClaims = {};\r\n for(let app of appId){\r\n if(!CommonUtils.isNullOrEmpty(filteredClaims[app])) {\r\n userClaimsCopy.tenantClaims[app] = filteredClaims[app]\r\n }\r\n }\r\n return userClaimsCopy;\r\n } else {\r\n throw new Error('Tenant claims is empty');\r\n }\r\n }\r\n\r\n filterRolesBasedOnScopes(inputClaims, tenants, scopes, scopeDirection) {\r\n if (CommonUtils.isNullOrEmpty(inputClaims)) {\r\n throw new Error('Tenant claims cannot be null.');\r\n }\r\n \r\n let tenantScopesMap = this.formTenantScopeMapping(scopes, tenants);\r\n \r\n for (const tenant of tenants) {\r\n if (CommonUtils.isNullOrEmpty(tenantScopesMap[tenant])) {\r\n continue;\r\n }\r\n\r\n let tenantScopes = tenantScopesMap[tenant];\r\n \r\n const properties = Object.keys(inputClaims[tenant]);\r\n for (let i = 0; i < properties.length; i++) {\r\n const propertyName = properties[i];\r\n \r\n if (propertyName !== 'claims' && propertyName !== 'delegatedClaims') {\r\n break;\r\n }\r\n \r\n let roles = {};\r\n if (propertyName === 'claims') {\r\n roles = inputClaims[tenant].claims.roles;\r\n inputClaims[tenant].claims.resourcePermissions = [];\r\n } else if (propertyName === 'delegatedClaims') {\r\n roles = inputClaims[tenant].delegatedClaims.roles;\r\n inputClaims[tenant].delegatedClaims.resourcePermissions = [];\r\n }\r\n let filteredScopes = [];\r\n \r\n for (const roleName in roles) {\r\n if (!roles.hasOwnProperty(roleName)) {\r\n continue;\r\n }\r\n \r\n const roleObj = roles[roleName];\r\n \r\n if (!roleObj || !roleObj.Scopes) {\r\n continue;\r\n }\r\n \r\n const roleScopes = roleObj.Scopes;\r\n \r\n switch (scopeDirection) {\r\n case 'None':\r\n filteredScopes = [];\r\n break;\r\n case 'Exact':\r\n filteredScopes = roleScopes.filter((scope) =>tenantScopes.includes(scope));\r\n break;\r\n case 'ScopeAndBelow':\r\n filteredScopes = roleScopes.filter((roleScope) => {\r\n return tenantScopes.some((tenantScope) =>\r\n this.filterScope(roleScope, tenantScope)\r\n );\r\n });\r\n break;\r\n case 'ScopeAndAbove':\r\n filteredScopes = roleScopes.filter((roleScope) => tenantScopes.some((tenantScope) => tenantScope.startsWith(roleScope)));\r\n break;\r\n default:\r\n throw new Error('Invalid search direction');\r\n }\r\n \r\n if (filteredScopes.length === 0) {\r\n if (propertyName === 'claims') {\r\n delete inputClaims[tenant].claims.roles[roleName];\r\n } else if (propertyName === 'delegatedClaims') {\r\n delete inputClaims[tenant].delegatedClaims.roles[roleName];\r\n }\r\n } else {\r\n if (propertyName === 'claims') {\r\n inputClaims[tenant].claims.roles[roleName].Scopes = filteredScopes;\r\n if(roleObj.resourcePermissions){\r\n for (const permission of roleObj.resourcePermissions) {\r\n const existingPermission = inputClaims[tenant].claims.resourcePermissions.find((existingPermission) => \r\n existingPermission.resource.toLowerCase() === permission.resource.toLowerCase());\r\n if (existingPermission) {\r\n existingPermission.permissions.push(...permission.permissions);\r\n existingPermission.permissions = Array.from(\r\n new Set(existingPermission.permissions)\r\n );\r\n continue;\r\n }\r\n inputClaims[tenant].claims.resourcePermissions.push(permission);\r\n }\r\n }\r\n } else if (propertyName === 'delegatedClaims') {\r\n inputClaims[tenant].delegatedClaims.roles[roleName].Scopes = filteredScopes;\r\n if(roleObj?.DefaultPermisssions){\r\n for (const permission of roleObj.DefaultPermisssions) {\r\n const existingPermission =\r\n inputClaims[tenant].delegatedClaims.resourcePermissions.find(\r\n (existingPermission) =>\r\n existingPermission.resource.toLowerCase() ===\r\n permission.resource.toLowerCase()\r\n );\r\n \r\n if (existingPermission) {\r\n existingPermission.permissions.push(...permission.permissions);\r\n existingPermission.permissions = Array.from(\r\n new Set(existingPermission.permissions)\r\n );\r\n continue;\r\n }\r\n inputClaims[tenant].delegatedClaims.resourcePermissions.push(permission);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n return inputClaims;\r\n }\r\n\r\n formTenantScopeMapping(scopes, tenants) {\r\n let tenantScopesMap = {};\r\n (tenants ?? []).forEach((tenant) => {\r\n tenantScopesMap[tenant] = [];\r\n });\r\n\r\n if (scopes && scopes.length > 0) {\r\n (scopes ?? []).forEach((scope) => {\r\n let modifiedScope = scope.replace(/^\\/+/, '');\r\n let tenantMatch = tenants.find((tenant) =>\r\n modifiedScope.toLowerCase().startsWith(tenant.toLowerCase())\r\n );\r\n if (tenantMatch) {\r\n let tenantTrimmedScope =\r\n modifiedScope.indexOf('/') >= 0\r\n ? modifiedScope.substring(modifiedScope.indexOf('/'))\r\n : null;\r\n if (tenantTrimmedScope) {\r\n tenantScopesMap[tenantMatch].push(tenantTrimmedScope);\r\n }\r\n }\r\n });\r\n }\r\n return tenantScopesMap;\r\n }\r\n filterScope(roleScope, headerScope) {\r\n const roleParts = roleScope.split('/');\r\n const headerParts = headerScope.split('/');\r\n if (headerParts.length > roleParts.length) {\r\n return false;\r\n }\r\n for (let i = 0; i < headerParts.length; i++) {\r\n if (headerParts[i].toLowerCase() !== roleParts[i].toLowerCase()) {\r\n return false;\r\n }\r\n }\r\n return true;\r\n }\r\n\r\n /**\r\n * Gets userclaims of the logged in user from the fxp context for an application.\r\n * @method Fxp.Services.UserProfileService.getUserClaims\r\n * @param {ApplcationId } appId application name for which the roles defined.\r\n * @example Example to invoke getUserClaims\r\n * UserClaimsService.getUserClaims('oneProfile');\r\n */\r\n getUserTenantClaims(tenantId: string): any {\r\n return this.getUserTenatClaimsByObjectId(this.userInfoService.getCurrentUserOID(), tenantId);\r\n }\r\n\r\n /**\r\n * Gets userclaims of the user from the fxp context for an application.\r\n * @method Fxp.Services.UserProfileService.getUserClaims\r\n * @param {ApplcationId } appId application name for which the roles defined.\r\n * @example Example to invoke getUserClaims\r\n * UserClaimsService.getUserClaims('oneProfile');\r\n */\r\n\r\n private getUserClaimsForAlias(appId: string, objectId: string): any {\r\n let userClaimsLocalStorage = this.getClaimsFromLocalStorage(objectId);\r\n let genericPropBag = this.getClaimsPropertyBag(objectId, appId, \"AppId\");\r\n const telemetry_source = `${this.sourceForTelemetry}.GetUserClaimsForAlias`;\r\n if (CommonUtils.isNullOrEmpty(userClaimsLocalStorage)) {\r\n this.fxplogger.logError(telemetry_source, this.rootScope.fxpUIConstants.UIMessages.AuthServiceReturnsBlankAppError.ErrorMessageTitle, ErrorCodes.AuthSerive_UserClaimsEmptyInLocalStorage, null, genericPropBag, null, null, ErrorSeverityLevel.High);\r\n throw new Error(this.rootScope.fxpUIConstants.UIMessages.AuthServiceReturnsBlankAppError.ErrorMessage);\r\n }\r\n let userClaims = JSON.parse(userClaimsLocalStorage);\r\n if (CommonUtils.isNullOrEmpty(appId))\r\n return userClaims.Applications;\r\n\r\n if (!userClaims.Applications || Object.keys(userClaims.Applications).indexOf(appId) < 0) {\r\n this.fxplogger.logError(telemetry_source, this.rootScope.fxpUIConstants.UIMessages.AuthServiceReturnsBlankAppError.ErrorMessageTitle, ErrorCodes.AuthSerive_MissingApplicationObjectInClaims, null, genericPropBag, null, null, ErrorSeverityLevel.High);\r\n throw new Error(this.rootScope.fxpUIConstants.UIMessages.AuthServiceReturnsBlankAppError.ErrorMessage);\r\n }\r\n\r\n let application = userClaims.Applications[appId];\r\n\r\n if (application.Roles === undefined || Object.keys(application.Roles).length === 0) {\r\n this.fxplogger.logError(telemetry_source, this.rootScope.fxpUIConstants.UIMessages.AuthServiceReturnsBlankAppRoleError.ErrorMessageTitle, ErrorCodes.AuthSerive_MissingRolesObjectInClaims, null, genericPropBag, null, null, ErrorSeverityLevel.High);\r\n throw new Error(this.rootScope.fxpUIConstants.UIMessages.AuthServiceReturnsBlankAppRoleError.ErrorMessage);\r\n }\r\n return application;\r\n }\r\n\r\n private getClaimsPropertyBag(alias: string, entityId: string, entityType: string): LogPropertyBag {\r\n let propertyBag = this.fxplogger.createPropertyBag();\r\n try {\r\n let localStorageValue = this.getClaimsFromLocalStorage(alias);\r\n propertyBag.addToBag('alias', alias);\r\n propertyBag.addToBag(`${entityType}`, entityId);\r\n\r\n if (!CommonUtils.isNullOrEmpty(localStorageValue)) {\r\n let claimsData = JSON.parse(localStorageValue);\r\n propertyBag.addToBag(\"localStorage-V1Claims\", CommonUtils.objectToString(claimsData.Applications));\r\n propertyBag.addToBag(\"localStorage-V2Claims\", CommonUtils.objectToString(claimsData.tenantClaims));\r\n propertyBag.addToBag(\"localStorage-ErrorInfor\", CommonUtils.objectToString(claimsData.ErrorInfo));\r\n }\r\n else {\r\n propertyBag.addToBag(\"IsLocalStorageEmpty\", 'True');\r\n }\r\n\r\n }\r\n catch (e) {\r\n //ingore if something is breaking. \r\n }\r\n return propertyBag;\r\n }\r\n /**\r\n * Gets tenant claims of the user based on alias and tenantId\r\n * @method Fxp.Services.UserProfileService.getUserTenatClaimsByAlias\r\n * @param {string } alias user alias information\r\n * @param {string } tenantId tenant id\r\n * @example Example to invoke getUserTenatClaimsByAlias\r\n * UserClaimsService.getUserTenatClaimsByAlias('oneProfile');\r\n */\r\n private getUserTenatClaimsByObjectId(objectId: string, tenantId?: string): any {\r\n let claimsLocalStorage = this.getClaimsFromLocalStorage(objectId);\r\n let genericPropBag = this.getClaimsPropertyBag(objectId, tenantId, \"TenantId\");\r\n const telemetry_source = `${this.sourceForTelemetry}.GetUserTenatClaimsByAlias`;\r\n\r\n if (CommonUtils.isNullOrEmpty(claimsLocalStorage)) {\r\n this.fxplogger.logError(telemetry_source, this.rootScope.fxpUIConstants.UIMessages.AuthServiceReturnsBlankAppError.ErrorMessageTitle, ErrorCodes.AuthSerive_TenantClaimsEmptyInLocalStorage, null, genericPropBag, null, null, ErrorSeverityLevel.High);\r\n throw new Error(this.rootScope.fxpUIConstants.UIMessages.AuthServiceReturnsBlankAppError.ErrorMessage);\r\n }\r\n let claimsData = JSON.parse(claimsLocalStorage);\r\n if (CommonUtils.isNullOrEmpty(tenantId))\r\n return claimsData.tenantClaims;\r\n\r\n if (Object.keys(claimsData.tenantClaims).indexOf(tenantId) < 0) {\r\n\r\n this.fxplogger.logError(telemetry_source, this.rootScope.fxpUIConstants.UIMessages.AuthServiceReturnsBlankAppError.ErrorMessageTitle, ErrorCodes.AuthSerive_TenantObjectMissingInClaims, null, genericPropBag, null, null, ErrorSeverityLevel.High);\r\n throw new Error(this.rootScope.fxpUIConstants.UIMessages.AuthServiceReturnsBlankAppError.ErrorMessage);\r\n }\r\n let tenant = claimsData.tenantClaims[tenantId];\r\n if (tenant.claims === undefined || Object.keys(tenant.claims).length === 0) {\r\n this.fxplogger.logError(telemetry_source, this.rootScope.fxpUIConstants.UIMessages.AuthServiceReturnsBlankAppRoleError.ErrorMessageTitle, ErrorCodes.AuthSerive_ClaimsMissingInTenantObject, null, genericPropBag, null, null, ErrorSeverityLevel.High);\r\n throw new Error(this.rootScope.fxpUIConstants.UIMessages.AuthServiceReturnsBlankAppRoleError.ErrorMessage);\r\n }\r\n\r\n return tenant;\r\n }\r\n\r\n public isV2ClaimsTenantId(appId: string): boolean {\r\n let result: boolean = false;\r\n let alias = this.userInfoService.getCurrentUser();\r\n\r\n\r\n var claimsData = this.globalStoreService.GetPlatformState().LoggedInUser.Claims;\r\n if (!CommonUtils.isNullOrEmpty(appId) && !CommonUtils.isNullOrEmpty(claimsData) && claimsData.tenantClaims && (Object.keys(claimsData.tenantClaims).indexOf(appId) >= 0)) {\r\n {\r\n result = true;\r\n }\r\n }\r\n return result;\r\n }\r\n\r\n private createClaimsPropertyBag(claimId: string, claims: any, method: string): LogPropertyBag {\r\n let propBag = this.fxplogger.createPropertyBag();\r\n propBag.addToBag('Method', method);\r\n propBag.addToBag('ClaimId', claimId);\r\n propBag.addToBag('V1Claims', CommonUtils.objectToString(claims.Applications));\r\n propBag.addToBag('V2Claims', CommonUtils.objectToString(claims.tenantClaims));\r\n propBag.addToBag('ErrorInfo', CommonUtils.objectToString(claims.ErrorInfo));\r\n propBag.addToBag('ClaimsURL', this.tenantClaimsApiEndpoint);\r\n return propBag;\r\n }\r\n /**\r\n * this method used get get tenant claims\r\n * @method Fxp.Services.UserProfileService.getTenatClaimsSvc\r\n * @param {string} alias it contains user alias information\r\n * @example Example to invoke getTenatClaimsSvc\r\n * UserClaimsService.getTenatClaimsSvc(alias);\r\n */\r\n getTenatClaimsSvc(objectID, parentDeferred?: any) {\r\n let self = this;\r\n const telemetry_source = `${this.sourceForTelemetry}.GetTenatClaimsSvc`;\r\n let deferred = parentDeferred || self.q.defer();\r\n if (this.tenantClaimsApiEndpoint) {\r\n let url = this.tenantClaimsApiEndpoint + '/User/' + objectID + '/claims';\r\n if (self.msalAuthenticationService.accessTokenRequestInProgress(url)) {\r\n self.iTenantReqCount++;\r\n if (self.iTenantReqCount === 5) {\r\n self.fxplogger.logError(telemetry_source, self.rootScope.fxpUIConstants.UIMessages.AADAuthFailureError.ErrorMessageTitle, ErrorCodes.AuthService_TokenAcquisitionInProgress, null, null, null, null, ErrorSeverityLevel.Medium);\r\n self.fxpMessageSvc.addMessage(self.rootScope.fxpUIConstants.UIMessages.AADAuthFailureError.ErrorMessage, FxpConstants.messageType.error);\r\n return deferred.promise;\r\n }\r\n self.timeout(function () {\r\n self.getTenatClaimsSvc(objectID, deferred);\r\n }, self.sleepInterval);\r\n }\r\n else {\r\n self.iTenantReqCount = 0;\r\n let areHeadersAvailable = window[\"tenantConfiguration\"].AuthStore != null && window[\"tenantConfiguration\"].AuthStore.TenantClaimsHeaders != null;\r\n let currentProcessName = TelemetryConstants.FXP_TELEMETRY_PLATFORM_BOOTSTRAP + '.Authorization.FetchUserClaims';\r\n let eventData = new SystemEvent(currentProcessName, ComponentType.DataStore, 'Fetching User Claims data. ');\r\n\r\n self.fxplogger.logSystemEvent(telemetry_source, eventData, null);\r\n\r\n return areHeadersAvailable ?\r\n this.http.get(url, { headers: window[\"tenantConfiguration\"].AuthStore.TenantClaimsHeaders }) : this.http.get(url);\r\n }\r\n } else {\r\n let defer = self.q.defer();\r\n defer.resolve({ data: { tenantClaims: {} } });\r\n return defer.promise;\r\n }\r\n return deferred.promise;\r\n }\r\n\r\n /**\r\n * Gets user claims by connecting to the service through the url\r\n * @method Fxp.Services.UserProfileService.getUserClaimsSvc\r\n * @example Example to invoke getUserClaimsSvc\r\n * UserClaimsService.getUserClaimsSvc();\r\n */\r\n getUserClaimsSvc(alias: string, parentDeferred?: any): angular.IPromise {\r\n let self = this;\r\n let deferred = parentDeferred || self.q.defer();\r\n let url: string;\r\n const telemetry_source = `${this.sourceForTelemetry}.GetUserClaimsSvc`;\r\n if (self.claimsApiEndpoint) {\r\n this.getObjectIdFromIdentifier(alias).then(function (result) {\r\n let OID = result;\r\n url = self.claimsApiEndpoint + \"/User/\" + OID + \"/claims\";\r\n this.fxplogger.startTrackPerformance(PerfMarkers.GetUserClaims);\r\n if (self.msalAuthenticationService.accessTokenRequestInProgress(url)) {\r\n self.iReqCount++;\r\n if (self.iReqCount == 5) {\r\n self.fxplogger.logError(telemetry_source, self.rootScope.fxpUIConstants.UIMessages.AADAuthFailureError.ErrorMessageTitle, ErrorCodes.AuthService_TokenAcquisitionInProgress_TenantClaims, null, null, null, null, ErrorSeverityLevel.Medium);\r\n self.fxpMessageSvc.addMessage(self.rootScope.fxpUIConstants.UIMessages.AADAuthFailureError.ErrorMessage, FxpConstants.messageType.error);\r\n return deferred.promise;\r\n }\r\n self.timeout(function () {\r\n self.getUserClaimsSvc(alias);\r\n }, self.sleepInterval);\r\n }\r\n else {\r\n this.iReqCount = 0;\r\n return this.http.get(url);\r\n }\r\n self.fxplogger.stopTrackPerformance(PerfMarkers.GetUserClaims);\r\n });\r\n }\r\n else {\r\n let defer = self.q.defer();\r\n //returning empty claims if profile api is not configured\r\n defer.resolve({ data: { \"Applications\": {} } });\r\n return defer.promise;\r\n }\r\n return deferred.promise;\r\n }\r\n \r\n getObjectIdFromIdentifier(useridentifier: string): angular.IPromise {\r\n var self = this;\r\n let deferred = this.q.defer();\r\n if (CommonUtils.isGuid(useridentifier))\r\n deferred.resolve(useridentifier);\r\n\r\n else if (useridentifier.toLowerCase() == self.userInfoService.getLoggedInUser().toLowerCase())\r\n deferred.resolve(self.userInfoService.getLoggedInUserOID());\r\n\r\n\r\n else if (useridentifier.toLowerCase() == self.userInfoService.getCurrentUser().toLowerCase())\r\n deferred.resolve(self.userInfoService.getCurrentUserOID());\r\n\r\n\r\n else {\r\n // get oid from one profile call\r\n self.userProfileService.getBasicProfileByAlias(useridentifier).then(function (loggedInUserInfo: any) {\r\n var userinfo = loggedInUserInfo;\r\n deferred.resolve(userinfo.aadObjectId);\r\n });\r\n }\r\n return deferred.promise;\r\n }\r\n\r\n /**\r\n * This is a temporary method used to get claims for the given alias.\r\n * This method is written to ensure that error cases are gracefully handled by partners\r\n * @param alias Alias of the user\r\n * @param tenants List of Tenants for which claims are needed. If not passed then the list is picked from tenant configuration\r\n */\r\n getClaimsForUserAlias(alias: string, tenants?: string[]): angular.IPromise {\r\n let self = this;\r\n let deferred = this.q.defer();\r\n const telmetry_source = `${this.sourceForTelemetry}.GetClaimsForUserAlias`;\r\n\r\n self.getObjectIdFromIdentifier(alias).then(function (oid) {\r\n let objectID = oid;\r\n var parsedClaims = self.getClaimsFromGlobalStore(objectID);\r\n\r\n if (!CommonUtils.isNullOrEmpty(parsedClaims)) {\r\n deferred.resolve(parsedClaims);\r\n return deferred.promise;\r\n }\r\n let claimsEndpoint = self.tenantClaimsApiEndpoint + \"/User/\" + objectID + \"/claims\";\r\n let tenantheaders = tenants === undefined || tenants === null || tenants.length === 0\r\n ? window[\"tenantConfiguration\"].AuthStore.TenantClaimsHeaders\r\n : { \"X-Tenants\": tenants.join(\",\") };\r\n\r\n self.http.get(claimsEndpoint, {\r\n headers: tenantheaders\r\n }).then(response => {\r\n let properties = self.fxplogger.createPropertyBag();\r\n properties.addToBag(\"Alias\", alias);\r\n let systemEvent = new SystemEvent(`${TelemetryConstants.FXP_TELEMETRY_BASE_NAME}.ClaimsCallSuccessfull`, ComponentType.Web, `Claims received for alias: ${alias}`);\r\n self.fxplogger.logSystemEvent(self.sourceForTelemetry, systemEvent, properties, null, null);\r\n var responseData = JSON.stringify(response.data);\r\n self.dispatchClaimsAction(responseData, objectID);\r\n deferred.resolve(response.data);\r\n }, error => {\r\n let properties = self.fxplogger.createPropertyBag();\r\n properties.addToBag(\"UserAlias\", alias);\r\n self.fxplogger.logException(telmetry_source,\r\n error,\r\n properties,\r\n null,\r\n null,\r\n ErrorSeverityLevel.Critical,\r\n ErrorCodes.ProfileServiceFailure);\r\n deferred.reject(error)\r\n });\r\n });\r\n return deferred.promise;\r\n }\r\n\r\n /**\r\n * This method is used to get user claims by Object ID\r\n * This method is written to ensure that error cases are gracefully handled by partners\r\n * @param objectId Object ID of the user\r\n * @param tenants List of Tenants for which claims are needed. If not passed then the list is picked from tenant configuration\r\n */\r\n getClaimsByObjectId(objectId: string, tenants?: string[]): angular.IPromise {\r\n let self = this;\r\n let deferred = this.q.defer();\r\n const telmetry_source = `${this.sourceForTelemetry}.GetClaimsByObjectId`;\r\n var parsedClaims = self.getClaimsFromGlobalStore(objectId);\r\n\r\n if (!CommonUtils.isNullOrEmpty(parsedClaims)) {\r\n deferred.resolve(parsedClaims);\r\n return deferred.promise;\r\n }\r\n let claimsEndpoint = this.tenantClaimsApiEndpoint + \"/User/\" + objectId + \"/claims\";\r\n let tenantheaders = tenants === undefined || tenants === null || tenants.length === 0\r\n ? window[\"tenantConfiguration\"].AuthStore.TenantClaimsHeaders\r\n : { \"X-Tenants\": tenants.join(\",\") };\r\n\r\n this.http.get(claimsEndpoint, {\r\n headers: tenantheaders\r\n }).then(response => {\r\n let properties = self.fxplogger.createPropertyBag();\r\n properties.addToBag(\"ObjectId\", objectId);\r\n let systemEvent = new SystemEvent(`${TelemetryConstants.FXP_TELEMETRY_BASE_NAME}.ClaimsCallSuccessfull`, ComponentType.Web, `Claims received for Object ID: ${objectId}`);\r\n self.fxplogger.logSystemEvent(this.sourceForTelemetry, systemEvent, properties, null, null);\r\n var responseData = JSON.stringify(response.data);\r\n self.dispatchClaimsAction(responseData, objectId);\r\n deferred.resolve(response.data);\r\n }, error => {\r\n let properties = self.fxplogger.createPropertyBag();\r\n properties.addToBag(\"ObjectId\", objectId);\r\n self.fxplogger.logException(telmetry_source,\r\n error,\r\n properties,\r\n null,\r\n null,\r\n ErrorSeverityLevel.Critical,\r\n ErrorCodes.ProfileServiceFailure);\r\n deferred.reject(error)\r\n });\r\n\r\n return deferred.promise;\r\n }\r\n\r\n /**\r\n * this method used get user claims and tenant cliams based on user alias\r\n * @method Fxp.Services.UserClaimsService.getCalimsSvc\r\n * @param {string} alias it contains user alias info\r\n * @example Example to invoke getCalimsSvc\r\n * UserClaimsService.getCalimsSvc(alias);\r\n */\r\n getCalimsSvc(userIdentifier?: string): angular.IPromise {\r\n let self = this;\r\n let deferred = self.q.defer();\r\n let sendDate = new Date();\r\n const telemetry_source = `${this.sourceForTelemetry}.GetCalimsSvc`;\r\n self.getObjectIdFromIdentifier(userIdentifier).then(function (response) {\r\n let objectId = response;\r\n let customProperties = self.fxplogger.createPropertyBag();\r\n customProperties.addToBag(\"AADObjectId\", objectId);\r\n\r\n var fxpAppLaunched = window.sessionStorage.getItem(ApplicationConstants.FxpApplaunchedKey);\r\n let isAppLaunched = !CommonUtils.isNullOrEmpty(fxpAppLaunched) && fxpAppLaunched === \"true\";\r\n\r\n let claimData;\r\n claimData = self.getClaimsFromGlobalStore(objectId);\r\n\r\n if (isAppLaunched && !CommonUtils.isNullOrEmpty(claimData)) {\r\n self.setUserInfo(claimData);\r\n self.timeout(function () {\r\n deferred.resolve(claimData);\r\n }, self.sleepInterval);\r\n return deferred.promise;\r\n } else {\r\n let appCliams = {};\r\n var localStorageClaims = self.getClaimsFromLocalStorage(objectId);\r\n if (localStorageClaims) {\r\n self.dispatchClaimsAction(localStorageClaims, objectId);\r\n let claims = JSON.parse(localStorageClaims);\r\n if (claims.tenantClaims) {\r\n self.timeout(function () {\r\n try {\r\n deferred.notify(JSON.parse(localStorageClaims));\r\n let currentProcessName = TelemetryConstants.FXP_TELEMETRY_PLATFORM_BOOTSTRAP + '.Authorization.GetUserClaimsFromCache';\r\n let eventData = new SystemEvent(currentProcessName, ComponentType.DataStore, 'User Claims data from browser cache. ');\r\n self.fxplogger.logSystemEvent(telemetry_source, eventData, customProperties);\r\n\r\n } catch (exception) {\r\n self.fxplogger.logException(telemetry_source, exception, customProperties, null, null, ErrorSeverityLevel.Medium, ErrorCodes.AuthService_ErrorNotifyingCachedClaims);\r\n }\r\n }, self.sleepInterval);\r\n }\r\n }\r\n\r\n self.getTenatClaimsSvc(objectId)\r\n .then(function (tResponse) {\r\n if (tResponse.data) {\r\n appCliams = tResponse.data;\r\n self.setUserInfo(appCliams);\r\n self.logClaimsMetrics(sendDate, 'getTenatClaimsSvc() Start');\r\n\r\n if (appCliams[\"tenantClaims\"] == undefined || Object.keys(appCliams[\"tenantClaims\"]).length == 0) {\r\n let propBag = self.createClaimsPropertyBag('', appCliams, 'getCalimsSvc-getTenatClaimsSvc');\r\n self.fxplogger.logError(telemetry_source, self.rootScope.fxpUIConstants.UIMessages.AuthServiceReturnsBlankAppError.ErrorMessageTitle, ErrorCodes.AuthService_TenantClaimsObjectMissingInClaims, null, propBag, null, null, ErrorSeverityLevel.High);\r\n }\r\n appCliams[\"defaultAppRole\"] = self.getDefaultAppRole(appCliams[\"tenantClaims\"]);\r\n\r\n self.logClaimsMetrics(sendDate, 'getUserAppRolesSvc() End');\r\n }\r\n self.saveClaimsData(objectId, appCliams);\r\n deferred.resolve(appCliams);\r\n }, function (err) {\r\n console.log(\"ClaimsFailed\" + new Date());\r\n self.logClaimsException(err, sendDate);\r\n if (window[\"tenantConfiguration\"].IsAuthorizationRequired || self.rootScope.isLoginRequired) {\r\n let error = {};\r\n if (err.data && err.data.ErrorInfo != null) {\r\n if (err.data.ErrorInfo[\"V1\"] != null)\r\n error = { statusText: \"V1 Claims Call Failed\", status: err.data.ErrorInfo[\"V1\"].responseCode, config: err.config };\r\n if (err.data.ErrorInfo[\"V2\"] != null)\r\n error = { statusText: \"V2 Claims Call Failed\", status: err.data.ErrorInfo[\"V2\"].responseCode, config: err.config };\r\n if (!err.data.ErrorInfo) {\r\n error = { statusText: \"Claims service call failed with unknown reasons - Error information not found\" };\r\n }\r\n }\r\n else {\r\n error = { statusText: \"Claims service call failed with unknown reasons - Error data not found\" };\r\n }\r\n let genericPropBag = self.fxplogger.createPropertyBag();\r\n genericPropBag.addToBag(FxpConstants.metricConstants.IsLoginRequired, self.rootScope.isLoginRequired);\r\n genericPropBag.addToBag(FxpConstants.metricConstants.Error, JSON.stringify(error));\r\n self.fxplogger.logError(telemetry_source, self.rootScope.fxpUIConstants.UIMessages.GetUserClaimsSvcReturnsError.ErrorMessageTitle, ErrorCodes.AuthService_APICallFailedWithUnknownReason, null, genericPropBag, null, null, ErrorSeverityLevel.Critical);\r\n deferred.reject(error);\r\n }\r\n else {\r\n\r\n if (self.getClaimsFromLocalStorage(objectId)) {\r\n appCliams[\"defaultAppRole\"] = self.getClaimsFromLocalStorage(objectId);\r\n }\r\n else {\r\n appCliams[\"defaultAppRole\"] = self.getDefaultAppRole(null);\r\n self.saveClaimsData(objectId, appCliams);\r\n }\r\n deferred.resolve(appCliams);\r\n }\r\n });\r\n\r\n\r\n }\r\n }, function (err) {\r\n self.logClaimsException(err, sendDate);\r\n deferred.reject(err);\r\n });\r\n return deferred.promise;\r\n }\r\n\r\n private dispatchClaimsAction(localStorageClaims: string, objectId: string) {\r\n var self = this;\r\n if (objectId == self.userInfoService.getLoggedInUserOID()) {\r\n self.globalStoreService.DispatchGlobalAction(\"Platform\", AddLoggedInUserClaims(JSON.parse(localStorageClaims)));\r\n }\r\n if (objectId == self.userInfoService.getCurrentUserOID()) {\r\n self.globalStoreService.DispatchGlobalAction(\"Platform\", AddCurrentUserClaims(JSON.parse(localStorageClaims)));\r\n\r\n }\r\n }\r\n\r\n private getClaimsFromGlobalStore(objectId: string) {\r\n var self = this;\r\n var claimData;\r\n if (objectId == self.userInfoService.getLoggedInUserOID()) {\r\n claimData = self.globalStoreService.GetPlatformState().LoggedInUser.Claims;\r\n }\r\n else if (objectId == self.userInfoService.getCurrentUserOID()) {\r\n let currentClaims = self.globalStoreService.GetPlatformState().CurrentUser.Claims;\r\n if (!CommonUtils.isNullOrEmpty(currentClaims) && objectId == currentClaims.aadObjectId)\r\n claimData = currentClaims;\r\n }\r\n\r\n return claimData;\r\n }\r\n\r\n /**\r\n * this method is used to save claims data into session storage\r\n * @method Fxp.Services.UserClaimsService.setUserInfo\r\n * @param {string} alias user alias\r\n * @param {Object} claimsData it contains claims data\r\n * @example Example to invoke saveClaimsData\r\n * UserClaimsService.saveClaimsData(alias, claimsData, sessionkey, contextkey);\r\n */\r\n saveClaimsData(objectId: string, claimsData): void {\r\n let strCalimsData = JSON.stringify(claimsData);\r\n var self = this;\r\n this.dispatchClaimsAction(strCalimsData, objectId);\r\n localStorage[FxpConstants.CONST.fxpUserClaimsSession + \"_\" + objectId] = strCalimsData;\r\n this.fxpcontext.saveContext(objectId + '-' + ApplicationConstants.UserClaims, strCalimsData);\r\n let alias = self.getAliasFromOID(objectId);\r\n if (!CommonUtils.isNullOrEmpty(alias)) {\r\n localStorage[FxpConstants.CONST.fxpUserClaimsSession + \"_\" + alias.toLowerCase()] = strCalimsData;\r\n this.fxpcontext.saveContext(alias.toLowerCase() + '-' + ApplicationConstants.UserClaims, strCalimsData);\r\n }\r\n }\r\n getAliasFromOID(objectId: string): string {\r\n return objectId == this.userInfoService.getLoggedInUserOID() ? this.userInfoService.getLoggedInUser() :\r\n objectId == this.userInfoService.getCurrentUserOID() ? this.userInfoService.getCurrentUser() : \"\";\r\n }\r\n /**\r\n * this method is used to log get user cliams api response metrics\r\n * @method Fxp.Services.UserClaimsService.logUserClaimsMetrics\r\n * @param {date} sendDate it contains user claims service intiate date and time\r\n * @example Example to invoke saveClaimsData\r\n * UserClaimsService.logUserClaimsMetrics(sendDate);\r\n */\r\n private logClaimsMetrics(sendDate, logInfo: string): void {\r\n let self = this,\r\n propbag = self.fxplogger.createPropertyBag(),\r\n receiveDate = new Date(),\r\n responseTime = receiveDate.getTime() - sendDate.getTime(); // in millisecs\r\n\r\n propbag.addToBag(FxpConstants.metricConstants.StartTime, sendDate.toUTCString());\r\n propbag.addToBag(FxpConstants.metricConstants.EndTime, receiveDate.toUTCString());\r\n propbag.addToBag(FxpConstants.metricConstants.ServiceName, FxpConstants.metricConstants.GetBasicProfileSvcName);\r\n\r\n self.fxplogger.logMetric(self.sourceForTelemetry, FxpConstants.metricConstants.UserClaimsResponseTime, responseTime, propbag);\r\n //self.fxplogger.logInformation(self.classNameUserClaimsService, logInfo);\r\n }\r\n\r\n /**\r\n * this method is used to log exception details of user cliams api =\r\n * @method Fxp.Services.UserClaimsService.logUserClaimsException\r\n * @param {object} exception it contains exception details\r\n * @param {date} sendDate it contains user claims service intiate date and time\r\n * @example Example to invoke logUserClaimsException\r\n * UserClaimsService.logUserClaimsException(exception,sendDate);\r\n */\r\n private logClaimsException(exception, sendDate): void {\r\n let self = this, propbag = self.fxplogger.createPropertyBag(),\r\n receiveDate = new Date(),\r\n responseTime = receiveDate.getTime() - sendDate.getTime();\r\n propbag.addToBag(FxpConstants.metricConstants.Status, exception.status);\r\n propbag.addToBag(FxpConstants.metricConstants.StatusText, exception.statusText);\r\n propbag.addToBag(FxpConstants.metricConstants.ErrorUrl, exception.config ? exception.config.url : '');\r\n propbag.addToBag(FxpConstants.metricConstants.ErrorText, exception.data ? JSON.stringify(exception.data) : '');\r\n self.fxplogger.logError(`${self.sourceForTelemetry}.LogClaimsException`, self.rootScope.fxpUIConstants.UIMessages.AuthServiceReturnsBlankAppError.ErrorMessageTitle, ErrorCodes.AuthService_UnknownException, \"\", propbag, null, null, ErrorSeverityLevel.High);\r\n propbag.addToBag(FxpConstants.metricConstants.StartTime, sendDate.toUTCString());\r\n propbag.addToBag(FxpConstants.metricConstants.EndTime, receiveDate.toUTCString());\r\n propbag.addToBag(FxpConstants.metricConstants.ServiceName, FxpConstants.metricConstants.GetUserClaimsSvcName);\r\n self.fxplogger.logMetric(self.sourceForTelemetry, FxpConstants.metricConstants.UserClaimsResponseTimeError, responseTime, propbag);\r\n if (window[\"tenantConfiguration\"].IsAuthorizationRequired)\r\n self.fxpMessageSvc.addMessage(self.rootScope.fxpUIConstants.UIMessages.AuthzServiceReturnsError.ErrorMessage, FxpConstants.messageType.error);\r\n }\r\n\r\n /**\r\n * this method is used to get is Acting On Behalf Of is activate\r\n * @example Example to invoke logTenantClaimsException\r\n * UserClaimsService.isObo();\r\n */\r\n private isObo(): boolean {\r\n return this.userInfoService.isActingOnBehalfOf();\r\n }\r\n\r\n /**\r\n * this method is used to set the Upn and AAD Object ID for the Resepective users\r\n * @method Fxp.Services.UserClaimsService.setUserInfo\r\n * @param {claimsData } claimsData user cliams\r\n * @example Example to invoke setUserInfo\r\n * UserClaimsService.setUserInfo(claimsData);\r\n */\r\n private setUserInfo(claimsData): void {\r\n this.userInfoService.setCurrentUserUpn(claimsData.upn);\r\n }\r\n\r\n /**\r\n * intializing current user alias\r\n * @method Fxp.Services.UserClaimsService.setCurrentUser\r\n * @param {string } alias it contains user alias\r\n * @example Example to invoke setCurrentUser\r\n * UserClaimsService.setCurrentUser(alias);\r\n */\r\n setCurrentUser(alias: string) {\r\n this.userAlias = alias;\r\n this.currentUserAlias = alias;\r\n }\r\n\r\n getUserRoles(alias?: string): angular.IPromise {\r\n let self = this;\r\n let deferred = self.q.defer();\r\n let listOfRoles = [];\r\n let userIdentifier = alias || self.userInfoService.getCurrentUser();\r\n if(CommonUtils.isNullOrEmpty(userIdentifier))\r\n userIdentifier = self.userInfoService.getCurrentUserOID();\r\n try {\r\n self.getCalimsSvc(userIdentifier)\r\n .then(function (response) {\r\n let result = response;\r\n if (result.Applications) {\r\n _.each(result.Applications, function (app) {\r\n var appName = app.ApplicationName;\r\n _.each(app.Roles, function (role) {\r\n listOfRoles.push(appName + \".\" + role.RoleName);\r\n });\r\n });\r\n }\r\n if (result.tenantClaims) {\r\n for (let npd in result.tenantClaims) {\r\n _.each(result.tenantClaims[npd].claims.roles, function (role) {\r\n listOfRoles.push(role.roleName);\r\n });\r\n }\r\n }\r\n if (listOfRoles.length == 0) {\r\n //adding dummy app role if user dont have app roles\r\n listOfRoles.push(window[\"tenantConfiguration\"].DefaultAppRole);\r\n }\r\n deferred.resolve(listOfRoles);\r\n });\r\n }\r\n catch (ex) {\r\n deferred.reject(ex);\r\n self.fxpMessageSvc.addMessage(self.rootScope.fxpUIConstants.UIMessages.SelectedProfileRoles.ErrorMessage, FxpConstants.messageType.error);\r\n }\r\n return deferred.promise;\r\n }\r\n\r\n getUserDelegatedRoles(alias?: string): angular.IPromise {\r\n let self = this;\r\n let deferred = self.q.defer();\r\n let listOfRoles: string[] = [];\r\n let userIdentifier = alias || self.userInfoService.getCurrentUser();\r\n if(CommonUtils.isNullOrEmpty(userIdentifier))\r\n userIdentifier = self.userInfoService.getCurrentUserOID();\r\n try {\r\n self.getCalimsSvc(userIdentifier)\r\n .then(function (response) {\r\n let result = response;\r\n if (result.tenantClaims) {\r\n for (let npd in result.tenantClaims) {\r\n if (result.tenantClaims[npd].delegatedClaims !== undefined\r\n && result.tenantClaims[npd].delegatedClaims !== null\r\n && result.tenantClaims[npd].delegatedClaims.roles !== undefined\r\n && result.tenantClaims[npd].delegatedClaims.roles !== null) {\r\n _.each(result.tenantClaims[npd].delegatedClaims.roles, function (role) {\r\n listOfRoles.push(role.roleName);\r\n });\r\n }\r\n }\r\n }\r\n deferred.resolve(listOfRoles);\r\n });\r\n }\r\n catch (ex) {\r\n deferred.reject(ex);\r\n self.fxpMessageSvc.addMessage(self.rootScope.fxpUIConstants.UIMessages.SelectedProfileRoles.ErrorMessage, FxpConstants.messageType.error);\r\n }\r\n return deferred.promise;\r\n }\r\n\r\n getUserConsolidatedRoles(alias?: string): angular.IPromise {\r\n let self = this;\r\n let deferred = self.q.defer();\r\n let getUserRolesPromise = self.getUserRoles(alias);\r\n let getUserDelegatedRolesPromise = self.getUserDelegatedRoles(alias);\r\n\r\n let promiseList = [getUserRolesPromise, getUserDelegatedRolesPromise];\r\n self.q.all(promiseList)\r\n .then(function (result) {\r\n if (result === undefined || result === null || result.length === 0) {\r\n deferred.resolve([]);\r\n }\r\n let userRoles = result.length > 0 ? result[0] : [];\r\n let userDelegatedRoles = result.length > 1 ? result[1] : [];\r\n let consolidatedRoles = _.union(userRoles, userDelegatedRoles);\r\n deferred.resolve(consolidatedRoles);\r\n });\r\n return deferred.promise;\r\n }\r\n\r\n /**\r\n * userd to get user resources list\r\n * @method Fxp.Services.UserClaimsService.getUserResources\r\n * @param {string } alias it contains user alias\r\n * @example Example to invoke getUserResources\r\n * UserClaimsService.getUserResources(alias);\r\n *\r\n */\r\n getUserResources(objectId?: string) {\r\n let self = this;\r\n let listOfResources = [];\r\n objectId = objectId || self.userInfoService.getCurrentUserOID();\r\n try {\r\n let result = self.getUserTenatClaimsByObjectId(objectId);\r\n if (result && result[window[\"tenantConfiguration\"].NPD]) {\r\n _.each(result[window[\"tenantConfiguration\"].NPD].claims.resourcePermissions, function (item) {\r\n listOfResources.push(item.resource);\r\n });\r\n }\r\n }\r\n catch (ex) {\r\n self.fxpMessageSvc.addMessage(self.rootScope.fxpUIConstants.UIMessages.SelectedProfileRoles.ErrorMessage, FxpConstants.messageType.error);\r\n }\r\n return listOfResources;\r\n }\r\n\r\n /**\r\n * userd to get user resources list\r\n * @method Fxp.Services.UserClaimsService.getUserResources\r\n * @param {string } alias it contains user alias\r\n * @example Example to invoke getUserResources\r\n * UserClaimsService.getUserResources(alias);\r\n *\r\n */\r\n getUserAdminResources(objectId?: string) {\r\n let self = this;\r\n let listOfResources = [];\r\n objectId = objectId || self.userInfoService.getCurrentUserOID();\r\n try {\r\n let result = self.getUserTenatClaimsByObjectId(objectId);\r\n if (result) {\r\n _.each(result[self.fxpConfiguration.FxpAppSettings.FxpNpd].claims.resourcePermissions, function (item) {\r\n listOfResources.push(item.resource);\r\n });\r\n }\r\n }\r\n catch (ex) {\r\n self.fxpMessageSvc.addMessage(self.rootScope.fxpUIConstants.UIMessages.SelectedProfileRoles.ErrorMessage, FxpConstants.messageType.error);\r\n }\r\n return listOfResources;\r\n }\r\n\r\n getDefaultAppRole(lstClaims) {\r\n let appRole;\r\n if (lstClaims && lstClaims[window[\"tenantConfiguration\"].NPD]) {\r\n var tenantClaims = lstClaims[window[\"tenantConfiguration\"].NPD];\r\n var prefix = window[\"tenantConfiguration\"].TenantId;\r\n _.each(tenantClaims.claims.roles, function (role) {\r\n if (role.isDefaultRole) {\r\n appRole = prefix + \".\" + role.roleName;\r\n }\r\n });\r\n }\r\n return (appRole) ? appRole : window[\"tenantConfiguration\"].DefaultAppRole;\r\n }\r\n\r\n private getClaimsFromLocalStorage(userIdentifier) {\r\n if (!userIdentifier)\r\n return null;\r\n\r\n let claimsStorageKey = CommonUtils.getSessionStorageUserClaimsKey(userIdentifier);\r\n if (!claimsStorageKey) \r\n return null;\r\n \r\n var localStorageProfile = localStorage[claimsStorageKey];\r\n return localStorageProfile;\r\n }\r\n}\r\n","import { TelemetryConstants } from \"../telemetry/TelemetryConst\";\r\nimport { ILogger } from \"../interfaces/ILogger\";\r\nimport { ErrorCodes } from \"../constants/errorCodes\";\r\nimport { IFxpFeedbackMessage } from \"../interfaces/IFxpFeedbackMessage\";\r\nimport { IOCVFeedbackType, IOCVManifestType, IOCVSource } from \"../common/enum/Feedback.enum\";\r\nimport { FxpConfigurationService } from \"./FxpConfiguration\";\r\nimport { FxpOCVFeedbackService } from \"./FxpOCVFeedbackService\";\r\nimport { FxpFeedbackModalConstant } from \"../constants/FxPModal.constants\";\r\nimport { FxpMessageService } from \"../../app/banner/FxpMessageService\";\r\nimport { FxpGlobalStoreService } from \"./fxp.global.store.service\";\r\nimport { IRootScope } from \"../interfaces/IRootScope\";\r\nimport { IOCVFeedbackPayload } from \"../interfaces/IOCVFeedbackPayload\";\r\nimport { CommonUtils } from \"../utils/CommonUtils\";\r\nimport { UserInfoService } from \"./UserInfoService\";\r\n\r\n\r\nexport class UserFeedbackUIService {\r\n\tprivate readonly sourceForTelemetry: string = `${TelemetryConstants.FXP_TELEMETRY_BASE_NAME}.UserFeedbackUIService`; \r\n \r\n\tconstructor(private http: angular.IHttpService,private fxpOCVFeedbackService : FxpOCVFeedbackService,private userInfoService: UserInfoService,\r\n private fxpConfiguration: FxpConfigurationService,private $uibModal: any,\r\n private fxpLogger: ILogger, private fxpMessage: FxpMessageService, private fxpGlobalStoreService: FxpGlobalStoreService,private $rootScope: IRootScope){\r\n\r\n }\r\n\t\r\n private showFeedbackPopup(title: string, description: string, callback: any) {\r\n const modalProps: any = FxpFeedbackModalConstant.options;\r\n let upn = this.userInfoService.getCurrentUserUpn();\r\n const self = this;\r\n const source_telemetry = `${this.sourceForTelemetry}.showFeedbackSurveyPopup`;\r\n modalProps.controller = function ($scope,$uibModalInstance) {\r\n $scope.feedbackData = {};\r\n this.Title = title;\r\n this.Content = description;\r\n $scope.feedbackData.disableButton = true;\r\n this.onSubmit = _ => {\r\n self.submitFeedback($scope.feedbackData.feedbackMessage, $scope.feedbackData.feedbackRating/5, $scope.feedbackData.feedbackUserEmail, $uibModalInstance);\r\n self.$rootScope.IsModelOpen = false; \r\n };\r\n this.emailIsChecked = function(){\r\n if($(\"input[name=shareEmail]\").prop('checked')) {\r\n $scope.feedbackData.feedbackUserEmail = upn;\r\n $(\"#EmailInput\").prop('disabled', false);\r\n }\r\n else {\r\n $scope.feedbackData.feedbackUserEmail = \"\";\r\n $(\"#EmailInput\").prop('disabled', true);\r\n }\r\n };\r\n this.onCancel = _ => { \r\n localStorage[\"GCEFeedbackLastReminder\"] = new Date();\r\n $uibModalInstance.close('cancel');\r\n self.$rootScope.IsModelOpen = false;\r\n self.fxpLogger.logEvent(source_telemetry, `${TelemetryConstants.FXP_TELEMETRY_BASE_NAME}.FeedbackPopupClosed`); \r\n };\r\n this.ratingSelected = function(){\r\n if($scope.feedbackData.feedbackRating && $scope.feedbackData.feedbackRating != 0) {\r\n $scope.feedbackData.disableButton = false;\r\n }\r\n\r\n }\r\n };\r\n \r\n this.$uibModal.open(modalProps);\r\n \r\n }\r\n\r\n public collectGCEFeedback(){\r\n let self = this;\r\n const source_telemetry = `${this.sourceForTelemetry}.collectGCEFeedback`;\r\n let showGCEFeedbackDialog = self.fxpGlobalStoreService.GetPlatformState().FeatureFlags[this.fxpConfiguration.FxpAppSettings.ShowGCEFeedbackDialogFeatureFlagName];\r\n\t\t\tlet GCEFeedbackDialogFeatureFlag = self.fxpGlobalStoreService.GetPlatformState().FeatureFlags[this.fxpConfiguration.FxpAppSettings.GCERingReleaseFeatureFlagName];\r\n\t\t\tlet isFeedbackSubmitted = localStorage[\"GCEFeedbackSubmitted\"] === \"true\" ? true : false;\r\n\t\t\tlet LastFeedbackLaunchTimeStamp = localStorage[\"GCEFeedbackLastReminder\"];\r\n\t\t\tlet canShowFeedbackModal = true;\r\n\t\t\tif(LastFeedbackLaunchTimeStamp)\r\n\t\t\t\tcanShowFeedbackModal = (new Date().getTime() - new Date(LastFeedbackLaunchTimeStamp).getTime())/ (1000 * 60 * 60) >= this.fxpConfiguration.FxpAppSettings.ShowGCEFeedbackAfterInterval_InHours;\r\n\t\t\tsetTimeout(function () {\r\n\t\t\t\tif (showGCEFeedbackDialog && GCEFeedbackDialogFeatureFlag && !isFeedbackSubmitted && canShowFeedbackModal && !self.$rootScope.IsModelOpen) {\r\n\t\t\t\t\tself.showFeedbackPopup(self.fxpConfiguration.FxpBaseConfiguration.FxpConfigurationStrings.UIStrings.FeedbackPopupMessages.HeaderMessage, self.fxpConfiguration.FxpBaseConfiguration.FxpConfigurationStrings.UIStrings.FeedbackPopupMessages.FeedbackMessage, {});\r\n self.$rootScope.IsModelOpen = true;\r\n self.fxpLogger.logEvent(source_telemetry, `${TelemetryConstants.FXP_TELEMETRY_BASE_NAME}.FeedbackPopupOpened`); \r\n }\r\n\t\t\t}, 2000);\r\n }\r\n\r\n private submitFeedback(message, rating, userEmail, $uibModalInstance){\r\n const self = this;\r\n const source_telemetry = `${this.sourceForTelemetry}.submitFeedback`;\r\n let SendGCEFeedackToOCVFlag = self.fxpGlobalStoreService.GetPlatformState().FeatureFlags[this.fxpConfiguration.FxpAppSettings.SendGCEFeedackToOCV];\r\n let feedbackMessagesEndPoint = this.fxpConfiguration.FxpAppSettings.FxpServiceEndPoint + \"/feedbackmessages\";\r\n const feedbackMessage: IFxpFeedbackMessage = {\r\n feedbackManifestType: IOCVManifestType.Fps, // Manifest type for survey\r\n feedbackType: IOCVFeedbackType.Survey, // Feedback type\r\n feedbackMessage: message, // user message\r\n partnerName: this.fxpConfiguration.FxpAppSettings.GCEFeedbackSurveyPartnerName, // sub area info // Has user given the consent to store the email address\r\n surveyId: this.fxpConfiguration.FxpAppSettings.GCEFeedbackDialogSurveyId, // survey id\r\n rating: rating, // normalized rating 0-1\r\n email: userEmail\r\n };\r\n if (SendGCEFeedackToOCVFlag) {\r\n this.fxpOCVFeedbackService.SubmitFeedback(feedbackMessage).then(function () {\r\n localStorage[\"GCEFeedbackSubmitted\"] = true;\r\n $uibModalInstance.close('submit');\r\n self.fxpLogger.logEvent(source_telemetry, `${TelemetryConstants.FXP_TELEMETRY_BASE_NAME}.GCEFeedbackSubmitted`);\r\n self.fxpMessage.addMessage(\"Your feedback has been submitted\", \"success\");\r\n }).catch(function (error) {\r\n localStorage[\"GCEFeedbackSubmitted\"] = false;\r\n $uibModalInstance.close('submit');\r\n self.fxpLogger.logError(source_telemetry, \"Error while submitting the GCE OCV feedback.\", ErrorCodes.Error_SubmittingFeedback, null);\r\n self.fxpMessage.addMessage(\"Error while submitting the feedback.\", \"error\");\r\n });\r\n }\r\n else {\r\n let feedbackPayload: IOCVFeedbackPayload = {\r\n manifestType: feedbackMessage.feedbackManifestType,\r\n appId: this.fxpConfiguration.FxpAppSettings.OCVAppId,\r\n submitTime: new Date().toISOString(),\r\n source: IOCVSource.Client,\r\n type: feedbackMessage.feedbackType,\r\n rating: feedbackMessage.rating,\r\n clientFeedbackId: CommonUtils.getNewGuId(),\r\n comment: feedbackMessage.feedbackMessage,\r\n email: feedbackMessage.email,\r\n telemetry: {\r\n loggableUserId: this.fxpGlobalStoreService.GetPlatformState().CurrentUser.Claims.aadObjectId,\r\n featureArea: feedbackMessage.partnerName,\r\n officeBuild: this.fxpConfiguration.FxpAppSettings.BuildNumber,\r\n tenantId: this.fxpConfiguration.FxpAppSettings.TenantId\r\n },\r\n survey: {\r\n surveyId: feedbackMessage.surveyId\r\n },\r\n web: {\r\n browser: navigator[\"browserDetails\"] ? navigator[\"browserDetails\"].name : \"\",\r\n browserVersion: navigator[\"browserDetails\"] ? navigator[\"browserDetails\"].version : \"\",\r\n sourcePageName: document.getElementsByTagName(\"title\")[0].innerHTML,\r\n sourcePageURI: window.location.href\r\n }\r\n };\r\n this.http.post(feedbackMessagesEndPoint, JSON.stringify(feedbackPayload), { headers: { 'Content-Type': 'application/json' } }).then(function () {\r\n localStorage[\"GCEFeedbackSubmitted\"] = true;\r\n $uibModalInstance.close('submit');\r\n self.fxpLogger.logEvent(source_telemetry, `${TelemetryConstants.FXP_TELEMETRY_BASE_NAME}.GCEFeedbackSubmitted`);\r\n self.fxpMessage.addMessage(\"Your feedback has been submitted\", \"success\");\r\n }).catch(function (error) {\r\n localStorage[\"GCEFeedbackSubmitted\"] = false;\r\n $uibModalInstance.close('submit');\r\n self.fxpLogger.logError(source_telemetry, \"Error while submitting the GCE OCV feedback.\", ErrorCodes.Error_SubmittingFeedback, null);\r\n self.fxpMessage.addMessage(\"Error while submitting the feedback.\", \"error\");\r\n });\r\n }\r\n }\r\n}","import { CommonUtils } from \"../utils/CommonUtils\";\r\nimport { IUserContext } from \"../interfaces/IUserContext\";\r\nimport { IFxPService } from \"../interfaces/IFxpService\";\r\nimport { FxpGlobalStoreService } from \"../services/fxp.global.store.service\";\r\nimport { Profile } from \"../../app/profile/profile.model\";\r\nimport { Claims } from \"../../app/claims/claims.model\";\r\n/**\r\n * A service to connect to user profile service to fetch the detaisl of user info and user claims related to partner apps\r\n * @class Fxp.Services.UserInfoService\r\n * @classdesc A service to connect to user profile service to fetch the user profile details and claims \r\n * @example Example to create an instance of user profile service \r\n * //Initializing User Profile Service\r\n * angular.module('FxPApp').service('UserInfoService', [UserInfoService]); \r\n */\r\nexport class UserInfoService implements IFxPService {\r\n\tprivate currentUser: string;\r\n\tprivate loggedInUser: string;\r\n\tprivate loggedInUserOID: string;\r\n\tprivate currentUserOID: string;\r\n\tprivate currentUserUpn: string;\r\n\tprivate loggedInUserUpn: string;\r\n\tprivate OBOUserSession: any;\r\n\tprivate isOboActive: boolean;\r\n\tprivate globalStoreService: FxpGlobalStoreService;\r\n\tconstructor(globalStoreService: FxpGlobalStoreService) {\r\n\t\tthis.currentUser = \"\";\r\n\t\tthis.loggedInUser = \"\";\r\n\t\tthis.currentUserUpn = \"\";\r\n\t\tthis.loggedInUserUpn = \"\";\r\n\t\tthis.loggedInUserOID=\"\";\r\n\t\tthis.currentUserOID=\"\";\r\n\t\tthis.globalStoreService = globalStoreService;\r\n\t}\r\n\tgetCurrentUserProfile():Profile{\r\n\t\treturn this.globalStoreService.GetPlatformState().CurrentUser.Profile;\r\n\t}\r\n\tgetCurrentUserClaims():Claims{\r\n\t\treturn this.globalStoreService.GetPlatformState().CurrentUser.Claims;\r\n\t}\r\n\tgetLoggedInUserProfile():Profile{\r\n\t\treturn this.globalStoreService.GetPlatformState().LoggedInUser.Profile;\r\n\t}\r\n\tpublic \tgetLoggedInUserOID():string{\r\n\t\treturn this.loggedInUserOID;\r\n\t}\r\n\tpublic \tgetCurrentUserOID():string{\r\n\t\treturn this.currentUserOID;\r\n\t}\r\n\tpublic \tsetLoggedInUserOID(aadOID:string){\r\n\t\t this.loggedInUserOID = aadOID;\r\n\t}\r\n\tpublic \tsetCurrentUserOID(aadOID:string){\r\n\t\tthis.currentUserOID = aadOID;\r\n\t}\r\n\tpublic getCurrentUser(): string {\r\n\t\treturn this.currentUser;\r\n\t}\r\n\r\n\tpublic setCurrentUser(alias: string) {\r\n\t\tthis.currentUser = alias ? alias.toLowerCase() : alias;\r\n\t}\r\n\r\n\tpublic getLoggedInUser(): string {\r\n\t\treturn this.loggedInUser;\r\n\t}\r\n\r\n\tpublic setLoggedInUser(alias: string) {\r\n\t\tthis.loggedInUser = alias;\r\n\t}\r\n\r\n\tpublic getCurrentUserUpn(): string {\r\n\t\tlet userClaims = this.getCurrentUserContext().userClaims;\r\n\t\tif (userClaims) {\r\n\t\t\tlet upn = userClaims.upn;\r\n\t\t\treturn upn;\r\n\t\t}\r\n\t\telse return this.getCurrentUser();\r\n\t}\r\n\r\n\tpublic setCurrentUserUpn(upn: string) {\r\n\t\tthis.currentUserUpn = upn;\r\n\t\tthis.setUpAjaxCallsHeaders();\r\n\r\n\t}\r\n\r\n\tpublic getAADObjectIDFromAlias(alias: string): string {\r\n\t\treturn alias == this.getCurrentUser() ? this.currentUserOID : this.loggedInUserOID\r\n\t}\r\n\r\n\tpublic setLoggedInUserUpn(upn: string) {\r\n\t\tthis.loggedInUserUpn = upn;\r\n\t}\r\n\r\n\tpublic getLoggedInUserUpn() {\r\n\t\treturn this.loggedInUserUpn;\r\n\t}\r\n\r\n\tpublic setOBOUserSessionInfo(value: string) {\r\n\t\tthis.OBOUserSession = value;\r\n\t}\r\n\r\n\tpublic getCurrentUserData() {\r\n\t\tvar userInfo;\r\n\t\tvar self = this;\r\n\r\n\t\t//remove sessionStorage and keep the data only in state for loggedinUser\r\n\t\tif (!self.isActingOnBehalfOf()) {\r\n\r\n\t\t\tvar profile = self.getLoggedInUserProfile();\r\n\t\t\tif (profile && !CommonUtils.isNullOrEmpty(profile))\r\n\t\t\t\tuserInfo = JSON.stringify(profile);\r\n\r\n\r\n\t\t}\r\n\t\telse {\r\n\t\t\tuserInfo = self.OBOUserSession;\r\n\t\t}\r\n\t\tif (userInfo) {\r\n\t\t\tuserInfo = JSON.parse(userInfo);\r\n\t\t\treturn userInfo;\r\n\t\t}\r\n\t}\r\n\r\n\tpublic isActingOnBehalfOf() {\r\n\t\treturn this.isOboActive;\r\n\t}\r\n\r\n\tpublic setActingOnBehalfOfFlag(value: boolean) {\r\n\t\tthis.isOboActive = value;\r\n\t}\r\n\r\n\tprivate setUpAjaxCallsHeaders() {\r\n\t\tif (this.isActingOnBehalfOf()) {\r\n\t\t\tlet userClaims = this.getCurrentUserContext().userClaims;\r\n\t\t\tlet upn;\r\n\t\t\tlet aadObjectID;\r\n\t\t\tif (!userClaims) {\r\n\t\t\t\tupn = this.getCurrentUser();\r\n\t\t\t\taadObjectID = this.getAADObjectIDFromAlias(this.getCurrentUser());\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\tupn = userClaims.upn;\r\n\t\t\t\taadObjectID = userClaims.aadObjectId;\r\n\t\t\t}\r\n\t\t\t$.ajaxSetup({\r\n\t\t\t\theaders: { \"X-ActonBehalfMode\": 'true', \"X-OnBehalfOfUser\": upn, \"X-OnBehalfOfUserObjectId\": aadObjectID }\r\n\t\t\t});\r\n\t\t}\r\n\t\telse {\r\n\t\t\t$.ajaxSetup({\r\n\t\t\t\theaders: { \"X-ActonBehalfMode\": 'false', \"X-OnBehalfOfUser\": '', \"X-OnBehalfOfUserObjectId\": '' }\r\n\t\t\t});\r\n\t\t}\r\n\t}\r\n\r\n\tpublic getCurrentUserContext(): IUserContext {\r\n\t\tvar self = this;\r\n\t\tlet userData = null;\r\n\t\tlet userClaimsData = null;\r\n\t\tvar profile = self.globalStoreService.GetPlatformState().CurrentUser.Profile;\r\n\r\n\t\tif (!CommonUtils.isNullOrEmpty(profile)) {\r\n\t\t\tuserData = profile\r\n\t\t}\r\n\t\tvar claims = self.globalStoreService.GetPlatformState().CurrentUser.Claims;\r\n\t\tif (!CommonUtils.isNullOrEmpty(claims)) {\r\n\t\t\tuserClaimsData = claims;\r\n\t\t}\r\n\r\n\t\tlet userContext: IUserContext = {\r\n\t\t\tuserInfo: userData,\r\n\t\t\tuserClaims: userClaimsData\r\n\t\t};\r\n\t\treturn userContext;\r\n\t}\r\n}","import { IRootScope } from \"../interfaces/IRootScope\";\r\nimport { ILogger } from \"../interfaces/ILogger\";\r\nimport { FxpConstants, ApplicationConstants, PerfMarkers, CustomEvents } from \"../common/ApplicationConstants\";\r\nimport { TelemetryContext } from \"../telemetry/telemetrycontext\";\r\nimport { FxpLogHelper } from \"../telemetry/FxpLogHelper\";\r\nimport { FxpConfigurationService } from \"./FxpConfiguration\";\r\nimport { FxpMessageService } from \"../../app/banner/FxpMessageService\";\r\nimport { UserInfoService } from \"./UserInfoService\";\r\nimport { UserProfileService } from \"./userProfileService\";\r\nimport { FeatureFlagService } from \"@fxp/flightingsdk\";\r\nimport { IFxPService } from \"../interfaces/IFxpService\";\r\nimport { FxpGlobalStoreService } from \"./fxp.global.store.service\";\r\nimport { setLeftnav } from \"../../app/leftNavigation/leftNavigation.action\";\r\nimport { ILeftNavigationGroup } from \"../../app/leftNavigation/leftNavigation.model\";\r\nimport { HideLoader } from \"../../app/loader/loader.actions\";\r\nimport { TelemetryConstants } from \"../telemetry/TelemetryConst\";\r\nimport { ErrorCodes } from \"../constants/errorCodes\";\r\nimport { ErrorSeverityLevel } from \"../telemetry/ErrorSeverityLevel\";\r\nimport { UpsertFeatureFlags } from \"../../app/flighting/featureFlags.actions\";\r\nimport { MsalAuthenticationService } from \"./MsalAuthenticationService\";\r\n\r\n/**\r\n * @application Fxp\r\n */\r\n/**\r\n * @module Fxp.Services\r\n */\r\n/**\r\n * A service to connect to dashboard service to fetch the leftnav data of the user\r\n * @class Fxp.Services.DashboardService\r\n * @classdesc A service to connect to dashaboard service to fetch the leftnav data \r\n * @example Example to create an instance of dashboard service \r\n * //Initializing DashboardService\r\n * angular.module('FxPApp').controller('LeftNavController', ['DashboardService', LeftNavController]);\r\n * function LeftNavController(dashboardService){ dashboardService.getLeftNavData(userAlias,roleGroupId); }\r\n */\r\ndeclare type IStateService = any;\r\n\r\nexport class DashboardService implements IFxPService {\r\n\tprivate http: angular.IHttpService;\r\n\tprivate q: angular.IQService;\r\n\tprivate rootScope: IRootScope;\r\n\tprivate fxpConfiguration: FxpConfigurationService;\r\n\tprivate timeout: angular.ITimeoutService;\r\n\tprivate sleepInterval: number;\r\n\tprivate fxplogger: ILogger;\r\n\tprivate userAlias: string;\r\n\tprivate fxpMessageSvc: FxpMessageService;\r\n\tprivate userInfoService: UserInfoService;\r\n\tprivate fxpConstants: FxpConstants;\r\n\tprivate fxpTelemetryContext: TelemetryContext;\r\n\tprivate userProfileService: UserProfileService;\r\n\tprivate iCount: number = 0;\r\n\tprivate iReqCount: number = 0;\r\n\tprivate iUCount: number = 0;\r\n\tprivate fxpServiceEndPoint: string;\r\n\tprivate sourceForTelemetry = `${TelemetryConstants.FXP_TELEMETRY_BASE_NAME}.DashboardService`;\r\n\tprivate static _instance: DashboardService;\r\n\tprivate pageTourWaitTime: number = 2000;\r\n\tprivate msalAuthenticationService: MsalAuthenticationService;\r\n\r\n\tprivate static featureFlagPromise: angular.IPromise;\r\n\r\n\tconstructor($http: angular.IHttpService, \r\n\t\t$q: angular.IQService, \r\n\t\t$rootScope: IRootScope, \r\n\t\tfxpConfiguration: FxpConfigurationService, \r\n\t\t$timeout: angular.ITimeoutService, \r\n\t\tloggerService: ILogger, \r\n\t\tmsalAuthenticationService: MsalAuthenticationService, \r\n\t\tfxpMessage: FxpMessageService, \r\n\t\tuserInfoService: UserInfoService,\r\n\t\tfxpTelemetryContext: TelemetryContext, \r\n\t\tuserProfileService: UserProfileService, \r\n\t\tprivate featureFlagService: FeatureFlagService, \r\n\t\tprivate startUpFlightConfig: any,\r\n\t\tprivate globalStoreService: FxpGlobalStoreService\r\n\t\t) {\r\n\t\tthis.http = $http;\r\n\t\tthis.q = $q;\r\n\t\tthis.rootScope = $rootScope;\r\n\t\tthis.timeout = $timeout;\r\n\t\tthis.sleepInterval = 100;\r\n\t\tthis.fxplogger = loggerService;\r\n\t\tthis.fxpMessageSvc = fxpMessage;\r\n\t\tthis.fxpTelemetryContext = fxpTelemetryContext;\r\n\t\tthis.fxpConfiguration = fxpConfiguration;\r\n\t\tthis.userInfoService = userInfoService;\r\n\t\tthis.userProfileService = userProfileService;\r\n\t\tthis.fxpServiceEndPoint = this.fxpConfiguration.FxpAppSettings.FxpServiceEndPoint;\r\n\t\tthis.msalAuthenticationService = msalAuthenticationService;\r\n\t\tif (DashboardService._instance) {\r\n\t\t\treturn DashboardService._instance;\r\n\t\t}\r\n\t\tDashboardService._instance = this;\r\n\t}\r\n\t/**\r\n* Get the Leftnavigation data of the user\r\n* @method Fxp.Services.DashboardService.getLeftNavData\r\n* @param {tenantId } tenantId of the user.\r\n* @param {userRoles } userRoles of the user.\r\n* @example Example to invoke getLeftNavData\r\n* DashboardService.getLeftNavData(tenantId,userRoles);\r\n*/\r\n\tgetLeftNavData(tenantId: string, userProfile: string): angular.IPromise {\r\n\t\tvar deferred = this.q.defer();\r\n\t\tconst telemetry_source = `${this.sourceForTelemetry}.GetLeftNavData`; \r\n\t\tvar url = this.fxpServiceEndPoint + \"/navigation\";\r\n\t\tvar self = this;\r\n\t\tlet currentUser = this.userInfoService.getCurrentUser();\r\n\t\t// if current alias is undefined\r\n\t\tconst leftNavDataKey = currentUser? \"LeftNavData-\" + currentUser.toLowerCase() : \"LeftNavData-\" + this.userInfoService.getCurrentUserOID();\r\n\t\tlet leftNavData = localStorage.getItem(leftNavDataKey);\t\t\r\n\t\tif (leftNavData && leftNavData.length > 0) {\r\n\t\t\ttry {\r\n\t\t\t\tself.globalStoreService.GetPlatformStore().dispatch(setLeftnav(JSON.parse(leftNavData)));\r\n\t\t\t\tlet timeoutHandle = setTimeout(function () {\r\n\t\t\t\t\tleftNavData = JSON.parse(leftNavData);\r\n\t\t\t\t\tdeferred.notify(leftNavData);\r\n\t\t\t\t\tclearTimeout(timeoutHandle);\r\n\t\t\t\t}, 0);\r\n\t\t\t}\r\n\t\t\tcatch (e) {\r\n\t\t\t\t//ingore. \r\n\t\t\t}\r\n\t\t}\r\n\t\tthis.fxplogger.startTrackPerformance(PerfMarkers.GetLeftNavData);\r\n\t\tif (self.msalAuthenticationService.accessTokenRequestInProgress(url)) {\r\n\t\t\tself.iReqCount++;\r\n\t\t\tif (self.iReqCount == 5) {\r\n\t\t\t\tself.fxplogger.logError(telemetry_source, self.rootScope.fxpUIConstants.UIMessages.GetLeftNavAuthFailureError.ErrorMessageTitle, ErrorCodes.DashboardService_GetLeftNavDataFailure, null, null, null, null, ErrorSeverityLevel.High);\r\n\t\t\t\tself.fxpMessageSvc.addMessage(self.rootScope.fxpUIConstants.UIMessages.GetLeftNavAuthFailureError.ErrorMessage, FxpConstants.messageType.error);\r\n\t\t\t}\r\n\t\t\tself.timeout(function () {\r\n\t\t\t\tself.getLeftNavData(tenantId, userProfile);\r\n\t\t\t}, self.sleepInterval);\r\n\t\t}\r\n\t\telse {\r\n\t\t\tself.iReqCount = 0;\r\n\t\t\tlet requestHeaders = {};\r\n\t\t\trequestHeaders[ApplicationConstants.XTenantId] = tenantId;\r\n\t\t\trequestHeaders[ApplicationConstants.XUserProfileToken] = userProfile;\r\n\t\t\tthis.http.get(url, {\r\n\t\t\t\theaders: requestHeaders\r\n\t\t\t}).then(function (responseData) {\r\n\t\t\t\tlocalStorage[leftNavDataKey] = JSON.stringify(responseData.data);\r\n\t\t\t\tlet data : ILeftNavigationGroup = JSON.parse(JSON.stringify(responseData.data));\r\n\t\t\t\tself.globalStoreService.GetPlatformStore().dispatch(setLeftnav(data));\r\n\t\t\t\tdeferred.resolve(responseData);\r\n\t\t\t\tif (responseData.headers != undefined) {\r\n\t\t\t\t\tvar properties = self.fxplogger.createPropertyBag();\r\n\t\t\t\t\tproperties.addToBag(\"Flighting-Call-Status\", responseData.headers(ApplicationConstants.FlightingStatusHeader));\r\n\t\t\t\t}\r\n\t\t\t}).catch(function (err) {\r\n\t\t\t\tdeferred.reject(err);\r\n\t\t\t});\r\n\t\t}\r\n\t\tself.fxplogger.stopTrackPerformance(PerfMarkers.GetLeftNavData);\r\n\t\treturn deferred.promise;\r\n\t}\r\n\r\n\tgetCachedLeftNavForCurrentUser() {\r\n\t\tlet currentUser = this.userInfoService.getCurrentUser();\r\n\t\tconst leftNavDataKey = currentUser? \"LeftNavData-\" + currentUser.toLowerCase() : \"LeftNavData-\" + this.userInfoService.getCurrentUserOID();\r\n\t\t\r\n\t\tlet leftNavData = JSON.parse(localStorage.getItem(leftNavDataKey));\r\n\t\tthis.globalStoreService.GetPlatformStore().dispatch(setLeftnav(leftNavData));\r\n\t\tif (leftNavData && leftNavData.internalLinks.length > 0) {\r\n\t\t\treturn this.getGLNFlatDataStructure(leftNavData.internalLinks);\r\n\t\t}\r\n\t\treturn null;\r\n\t}\r\n\r\n\t/**\r\n\t* Get the flat structure of Leftnavigation data\r\n\t* @method Fxp.Services.DashboardService.getGLNFlatDataStructure\r\n\t* @param {leftnavData } leftNavData leftnavigation data of the user.\r\n\t* @example Example to invoke getGLNFlatDataStructure\r\n\t* DashboardService.getGLNFlatDataStructure();\r\n\t*/\r\n\tgetGLNFlatDataStructure(leftNavData: any) {\r\n\t\tvar list = new Array();\r\n\t\tfor (var i = 0, L0length = leftNavData.length; i < L0length; i++) {\r\n\t\t\tif (leftNavData[i].hasChildren) {\r\n\t\t\t\tfor (var j = 0, L1length = leftNavData[i].children.length; j < L1length; j++) {\r\n\t\t\t\t\tlist.push(leftNavData[i].children[j]);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\tlist.push(leftNavData[i]);\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn list;\r\n\t}\r\n\r\n\t/**\r\n\t* Logging Telemetry Info and Display Error message when FxpUIConfiguration Fetching is Failed by RoleGroupId\r\n\t* @method Fxp.Services.DashboardService.fxpConfigurationFailed\r\n\t* @example Example to invoke fxpConfigurationFailed\r\n\t* DashboardService.fxpConfigurationFailed();\r\n\t*/\r\n\tfxpConfigurationFailed(): void {\r\n\t\tvar self = this;\r\n\t\tvar userData = self.globalStoreService.GetPlatformState().CurrentUser.Profile;\r\n\t\tvar propbag = self.fxplogger.createPropertyBag();\r\n\t\tpropbag.addToBag(FxpConstants.metricConstants.SessionId, self.rootScope.sessionId);\r\n\t\tpropbag.addToBag(FxpConstants.metricConstants.TimeStamp, FxpLogHelper.getTimeStamp());\r\n\t\tpropbag.addToBag(FxpConstants.metricConstants.UserUPN, self.userInfoService.getCurrentUser());\r\n\t\tpropbag.addToBag(FxpConstants.metricConstants.UserBusinessRole, userData.businessRole);\r\n\t\tpropbag.addToBag(FxpConstants.metricConstants.UserRoleGroup, userData.roleGroupName);\r\n\t\tpropbag.addToBag(FxpConstants.metricConstants.UserAgent, navigator.userAgent);\r\n\t\tpropbag.addToBag(FxpConstants.metricConstants.Geography, self.fxpTelemetryContext.getGeography());\r\n\t\tself.fxplogger.logError(`${self.sourceForTelemetry}.FxpConfigurationFailed`, self.rootScope.fxpUIConstants.UIMessages.UserRoleGroupFxpConfigNotFoundError.ErrorMessageTitle, ErrorCodes.FxPConfigurationFailure, \"\", propbag, null, null, ErrorSeverityLevel.High);\r\n\t\tself.fxpMessageSvc.addMessage(self.rootScope.fxpUIConstants.UIMessages.UserRoleGroupFxpConfigNotFoundError.ErrorMessage, FxpConstants.messageType.error);\r\n\t\tself.globalStoreService.DispatchGlobalAction(\"Platform\", HideLoader({}));\r\n\t}\r\n\r\n\tgetInitialFeatureFlagsForPlatform(): angular.IPromise {\r\n\t\tif (DashboardService.featureFlagPromise) return DashboardService.featureFlagPromise;\r\n\r\n\t\tvar self = this;\r\n\t\tvar context = {};\r\n\t\tvar eventNames = CustomEvents;\r\n\t\tself.rootScope.initialFlags = {}; //to avoid undefined errors\r\n\t\tvar config = self.startUpFlightConfig;\r\n\r\n\t\tvar deferred = this.q.defer();\r\n\t\tself.userProfileService.getLoggedInUserFlighitngContext().then((flightingContext) => {\r\n\t\t\tDashboardService.featureFlagPromise = self.featureFlagService\r\n\t\t\t\t.getFeatureFlags(config.appName, config.envName, config.featureNames, flightingContext)\r\n\t\t\t\t.then(function (response) {\r\n\t\t\t\t\tresponse = self.fxpConfiguration?.FxpAppSettings?.InitialFeatureFlags ?\r\n\t\t\t\t\t{...JSON.parse(self.fxpConfiguration?.FxpAppSettings?.InitialFeatureFlags), ...response} :\r\n\t\t\t\t\tresponse;\r\n\t\t\t\r\n\t\t\t\t\tself.globalStoreService.DispatchGlobalAction(\"Platform\", UpsertFeatureFlags(response));\r\n\t\t\t\t\tlocalStorage[\"FeatureFlags\"] = JSON.stringify(response);\r\n\t\t\t\t\tlet pageTourEnabled = response.pageTourEnabled;\r\n\t\t\t\t\tself.rootScope.initialFlags = response;\r\n\t\t\t\t\tself.rootScope.initialFlags.pageTourEnabled = false;\r\n\r\n\t\t\t\t\t// Remove timeout once pagetour api is optimized.\r\n\t\t\t\t\tsetTimeout(function () {\r\n\t\t\t\t\t\tself.rootScope.initialFlags.pageTourEnabled = pageTourEnabled;\r\n\t\t\t\t\t\tself.rootScope.$emit(eventNames.PageTourFlagRetrieved);\r\n\t\t\t\t\t}, self.pageTourWaitTime);\r\n\r\n\t\t\t\t\tself.rootScope.$emit(eventNames.StartUpFlagRetrieved);\r\n\t\t\t\t\tDashboardService.featureFlagPromise = null;\r\n\t\t\t\t\tdeferred.resolve();\r\n\t\t\t\t}, function (error) {\r\n\t\t\t\t\tself.fxplogger.logException(`${self.sourceForTelemetry}.GetInitialFeatureFlagsForPlatform`, error, null, null, null, ErrorSeverityLevel.High, ErrorCodes.StartUpFlagRetrieveError);\r\n\t\t\t\t\tself.rootScope.$emit(eventNames.StartUpFlagRetrieved);\r\n\t\t\t\t\tDashboardService.featureFlagPromise = null;\r\n\t\t\t\t\tdeferred.reject(error);\r\n\t\t\t\t});\r\n\t\t}, function (error) {\r\n\t\t\tdeferred.reject(error);\r\n\t\t});\r\n\t\treturn deferred.promise;\r\n\r\n\t}\r\n}\r\n","import { Store, Reducer, Middleware } from 'redux';\r\nimport { IFxPService } from \"../interfaces/IFxpService\";\r\nimport { FxpLoggerService } from '../telemetry/fxpLogger';\r\nimport { IPlatformState } from '../../app/store/platform.state.model';\r\nimport { PlatformStoreFactory } from '../../app/store/platform.store.factory';\r\nimport { IAction, IGlobalStore, GlobalStore, AbstractLogger as ILogger } from 'redux-micro-frontend';\r\n\r\n/**\r\n * Summary: Anuglar 1 service to access the global store.\r\n * Description: Angular 1 wrapper on top of the Global Store.\r\n */\r\nexport class FxpGlobalStoreService implements IGlobalStore,IFxPService {\r\n private readonly _globalStore: IGlobalStore;\r\n\r\n constructor(private _logger: FxpLoggerService) {\r\n this._globalStore = GlobalStore.Get(this._logger);\r\n }\r\n\r\n AddSelectors(source: string, selectors: Record, mergeSelectors?: boolean): void {\r\n this._globalStore.AddSelectors(source, selectors, mergeSelectors);\r\n }\r\n\r\n SelectPartnerState(partner: string, selector: string, defaultReturn?: any) {\r\n this._globalStore.SelectPartnerState(partner, selector, defaultReturn);\r\n }\r\n\r\n CreateStore = (appName: string, appReducer: Reducer, middlewares?: Array, globalActions?: Array, shouldReplace: boolean = false, shouldUpdate: boolean = false): Store =>\r\n this._globalStore.CreateStore(appName, appReducer, middlewares, globalActions, shouldReplace, shouldUpdate);\r\n RegisterStore = (appName: string, store: Store, globalActions?: Array, shouldReplace: boolean = false): void => \r\n this._globalStore.RegisterStore(appName, store, globalActions, shouldReplace)\r\n RegisterGlobalActions = (appName: string, actions: Array): void => \r\n this._globalStore.RegisterGlobalActions(appName, actions);\r\n\r\n GetPlatformState = (): any => this._globalStore.GetPlatformState();\r\n GetPlatformStore = (): Store => PlatformStoreFactory.Get();\r\n GetPartnerState = (partnerName: string): any => this._globalStore.GetPartnerState(partnerName);\r\n GetGlobalState = (): any => this._globalStore.GetGlobalState();\r\n\r\n DispatchGlobalAction = (source: string, action: IAction): void =>\r\n this._globalStore.DispatchGlobalAction(source, action);\r\n DispatchLocalAction = (source: string, action: IAction): void => \r\n this._globalStore.DispatchLocalAction(source, action);\r\n DispatchAction = (source: string, action: IAction): void => \r\n this._globalStore.DispatchAction(source, action)\r\n\r\n Subscribe = (source: string, callback: (state: any) => void): () => void => \r\n this._globalStore.Subscribe(source, callback);\r\n SubscribeToPlatformState = (source: string, callback: (state: any) => void): () => void =>\r\n this._globalStore.SubscribeToPlatformState(source, callback);\r\n SubscribeToPartnerState = (source: string, partner: string, callback: (state: any) => void, eager: boolean = true): () => void =>\r\n this._globalStore.SubscribeToPartnerState(source, partner, callback, eager);\r\n SubscribeToGlobalState = (source: string, callback: (state: any) => void): () => void =>\r\n this._globalStore.SubscribeToGlobalState(source, callback);\r\n SetLogger = (logger: ILogger): void => this._globalStore.SetLogger(logger);\r\n}","import { $injector } from \"@uirouter/core\";\r\nimport { IFxPService } from \"../interfaces/IFxpService\";\r\n\r\nexport class LazyLoaderService implements IFxPService{\r\n\r\n constructor(private $ocLazyLoad){\r\n }\r\n \r\n public getInstance(): ILazyLoaderService{\r\n return this.$ocLazyLoad; \r\n }\r\n}\r\n\r\nexport interface ILazyLoaderService{\r\n load(bundles:Array, options: Object); \r\n}\r\n","import { IRootScope } from \"../interfaces/IRootScope\";\r\nimport { UserProfileService } from \"./userProfileService\";\r\nimport { AppControllerHelper } from \"../factory/AppControllerHelper\";\r\nimport { IFxPService } from \"../interfaces/IFxpService\";\r\n\r\nexport class pageTourEventService implements IFxPService{\r\n\tprivate rootScope: IRootScope;\r\n\tcurrentLeftNavPinState: boolean;\r\n\tisPageTourInProgress: boolean;\r\n\tconstructor($rootScope: IRootScope,\r\n\t\tprivate userProfileService: UserProfileService,\r\n\t\tappControllerHelper: AppControllerHelper\r\n\t) {\r\n\t\tthis.rootScope = $rootScope;\r\n\t\tthis.isPageTourInProgress = false;\r\n\t}\r\n\tinit() {\r\n\t\tvar self = this;\r\n\t\tself.rootScope.$on('pageTour-initialize', function (event) {\r\n\t\t\tself.isPageTourInProgress = true;\r\n\t\t\tself.currentLeftNavPinState = self.rootScope.isLeftNavPinned;\r\n\t\t\tself.rootScope.isLeftNavOpen = true;\r\n\t\t\tself.rootScope.isLeftNavPinned = true;\r\n\t\t\tself.rootScope.isNewTabAllowed = false;\r\n\t\t});\r\n\r\n\t\tself.rootScope.$on('pageTour-Completed', function (event) {\r\n\t\t\tself.isPageTourInProgress = false;\r\n\t\t\tself.rootScope.isLeftNavPinned = self.rootScope.isLeftNavOpen = self.currentLeftNavPinState;\r\n\t\t\tself.rootScope.isNewTabAllowed = true;\r\n\t\t});\r\n\r\n\t\tself.rootScope.$on('collapse-leftNav', function (event) {\r\n\t\t\tself.rootScope.isLeftNavPinned = false;\r\n\t\t\tself.rootScope.isLeftNavOpen = false\r\n\t\t\tself.currentLeftNavPinState = false;\r\n\t\t\tself.rootScope.isNewTabAllowed = true;\r\n\t\t});\r\n\r\n\t\tself.rootScope.$on('reset-leftNav', function (event) {\r\n\t\t\tself.rootScope.isLeftNavPinned = true;\r\n\t\t\tself.rootScope.isLeftNavOpen = true;\r\n\t\t\tself.currentLeftNavPinState = true;\r\n\t\t\tself.rootScope.isNewTabAllowed = true;\r\n\t\t});\r\n\r\n\t}\r\n}","import { IRootScope } from \"../interfaces/IRootScope\";\r\nimport { ILogger } from \"../interfaces/ILogger\";\r\nimport { FxpContext } from \"../context/FxpContext\";\r\nimport { FxpMessageService } from \"../../app/banner/FxpMessageService\";\r\nimport { FxpConstants, ApplicationConstants, PerfMarkers, CustomEvents } from \"../common/ApplicationConstants\";\r\nimport { FxpConfigurationService } from \"./FxpConfiguration\";\r\nimport { TelemetryContext } from \"../telemetry/telemetrycontext\";\r\nimport { UserInfoService } from \"./UserInfoService\";\r\nimport { CommonUtils } from \"../utils/CommonUtils\";\r\nimport { LogPropertyBag } from \"../telemetry/LogPropertyBag\";\r\nimport { FxpLogHelper } from \"../telemetry/FxpLogHelper\";\r\nimport { UserInfo } from \"../common/UserInfo\";\r\nimport { IHttpPromise } from \"angular\";\r\nimport { FxpBroadcastedEvents } from \"./FxpBroadcastedEvents\";\r\nimport { IFxPService } from \"../interfaces/IFxpService\";\r\nimport { FxpGlobalStoreService } from \"../services/fxp.global.store.service\";\r\nimport { PlatformStoreFactory } from \"../../app/store/platform.store.factory\";\r\nimport { AddLoggedInUserProfile, AddCurrentUserProfile } from \"../../app/profile/profile.action\";\r\nimport { TelemetryConstants } from \"../telemetry/TelemetryConst\";\r\nimport { SystemEvent } from \"../telemetry/SystemEvent\";\r\nimport { ComponentType } from \"@microsoftit/telemetry-extensions-npm\";\r\nimport { ErrorCodes } from \"../constants/errorCodes\";\r\nimport { ErrorSeverityLevel } from \"../telemetry/ErrorSeverityLevel\";\r\nimport { IUserInfo } from \"../interfaces/IUserInfo\";\r\nimport { MsalAuthenticationService } from \"./MsalAuthenticationService\";\r\n//import { FxpLoggerService } from \"../telemetry/FxpLogger\";\r\n\r\n\r\n/**\r\n * A service to connect to user profile service to fetch the detaisl of user info and user claims related to partner apps\r\n * @class Fxp.Services.UserProfileService\r\n * @classdesc A service to connect to user profile service to fetch the user profile details and claims\r\n * @example Example to create an instance of user profile service\r\n * //Initializing User Profile Service\r\n * angular.module('FxPApp').controller('AppController', ['UserProfileService', AppController]);\r\n * function AppController(userProfileService){ userProfileService.getUserThumbnail(upn); }\r\n */\r\nexport class UserProfileService implements IFxPService {\r\n private q: angular.IQService;\r\n private rootScope: IRootScope;\r\n private timeout: angular.ITimeoutService;\r\n private sleepInterval: number;\r\n private msalAuthenticationService: MsalAuthenticationService;\r\n private profileApiEndpoint: string;\r\n private claimsApiEndpoint: string;\r\n private loggedInUserAlias: string;\r\n private fxplogger: ILogger;\r\n private fxpcontext: FxpContext;\r\n private userAlias: string;\r\n private fxpMessageSvc: FxpMessageService;\r\n private fxpConfiguration: FxpConfigurationService;\r\n private iCount: number = 0;\r\n private iReqCount: number = 0;\r\n private iUCount: number = 0;\r\n private telemetryContext: TelemetryContext;\r\n private userInfoService: UserInfoService;\r\n public currentUserAlias;\r\n private telemetrySource = `${TelemetryConstants.FXP_TELEMETRY_BASE_NAME}.UserProfileService`;\r\n private responseStartTime = 0;\r\n private isBasicProfileRefreshed = true;\r\n private graphAPIProfileUrl: string;\r\n private graphAPIUserThumbnailUrl: string;\r\n private graphAPIUserProfileUrl: string;\r\n private defaultRoleGroupId: number;\r\n private defaultBusinessRoleId: number;\r\n private searchProfileApiEndpoint: string;\r\n private isProfileRequired: boolean;\r\n constructor(private $http: angular.IHttpService, $q: angular.IQService, $rootScope: IRootScope, $timeout: angular.ITimeoutService, loggerService: ILogger, msalAuthenticationService: MsalAuthenticationService, fxpMessage: FxpMessageService, fxpContext: FxpContext, fxpConfiguration: FxpConfigurationService,\r\n fxpTelemetryContext: TelemetryContext, userInfoService: UserInfoService, private globalStoreService: FxpGlobalStoreService) {\r\n this.telemetryContext = fxpTelemetryContext;\r\n this.q = $q;\r\n this.rootScope = $rootScope;\r\n this.timeout = $timeout;\r\n this.sleepInterval = 100;\r\n this.msalAuthenticationService = msalAuthenticationService;\r\n this.fxplogger = loggerService;\r\n this.fxpMessageSvc = fxpMessage;\r\n this.fxpConfiguration = fxpConfiguration;\r\n this.fxpcontext = fxpContext;\r\n this.userAlias = \"\";\r\n this.loggedInUserAlias = \"\";\r\n this.currentUserAlias = \"\";\r\n this.userInfoService = userInfoService;\r\n this.graphAPIProfileUrl = fxpConfiguration.FxpAppSettings.GraphAdEndPoint;\r\n this.graphAPIUserProfileUrl = fxpConfiguration.FxpAppSettings.GraphApiUserProfileUrl;\r\n this.graphAPIUserThumbnailUrl = fxpConfiguration.FxpAppSettings.GraphApiUserThumbnailUrl;\r\n let profileStore = window[\"tenantConfiguration\"].ProfileStore || {};\r\n this.profileApiEndpoint = profileStore.ProfileAPIEndPoint;\r\n this.searchProfileApiEndpoint = profileStore.SearchAPIEndPoint;\r\n this.isProfileRequired = window[\"tenantConfiguration\"].IsProfileRequired;\r\n }\r\n\r\n /**\r\n * Gets thumbnail image from the graph api service\r\n * @method Fxp.Services.UserProfileService.getUserThumbnail\r\n * @param {Email} upn a User Principal Name (UPN) is the name of a system user in an e-mail address format.\r\n * @param {Boolean} deferred a boolean value which is false by default.\r\n * @example Example to invoke getUserThumbnail\r\n * userProfileService.getUserThumbnail('logged in user email');\r\n */\r\n getUserThumbnail(upn: string, parentDeferred: any): any {\r\n let url = this.graphAPIUserProfileUrl + upn + this.graphAPIUserThumbnailUrl;\r\n let deferred = parentDeferred || this.q.defer();\r\n let self = this;\r\n\r\n if (self.msalAuthenticationService.accessTokenRequestInProgress(url)) {\r\n self.iCount++;\r\n if (self.iCount == 5) {\r\n // log only error. \r\n self.fxplogger.logError(self.telemetrySource, self.rootScope.fxpUIConstants.UIMessages.AADAuthFailureError.ErrorMessageTitle, ErrorCodes.GetUserThumbnail_TokenNotFound, null, null, null, null, ErrorSeverityLevel.Medium);\r\n return deferred.promise;\r\n }\r\n self.timeout(function () {\r\n self.getUserThumbnail(upn, deferred);\r\n }, self.sleepInterval);\r\n }\r\n else {\r\n self.iCount = 0;\r\n let currentProcessName = TelemetryConstants.FXP_TELEMETRY_PLATFORM_BOOTSTRAP + '.Authorization.FetchUserThumbnail';\r\n let eventData = new SystemEvent(currentProcessName, ComponentType.DataStore, 'Fetching user thumbnail from graph');\r\n let customProperties = self.fxplogger.createPropertyBag();\r\n customProperties.addToBag(TelemetryConstants.CLASSNAME, \"UserProfileService\");\r\n customProperties.addToBag(TelemetryConstants.METHODNAME, \"getUserThumbnail\");\r\n self.fxplogger.logSystemEvent(TelemetryConstants.FXP_TELEMETRY_BASE_NAME + \".UserProfileService\", eventData, customProperties);\r\n\r\n return self.$http({\r\n url: url,\r\n method: \"get\",\r\n responseType: \"blob\"\r\n });\r\n }\r\n\r\n return deferred.promise;\r\n };\r\n\r\n /**\r\n * Gets user's basic profile details by connecting to the service through the url\r\n * @method Fxp.Services.UserProfileService.getBasicUserProfile\r\n * @example Example to invoke getBasicUserProfile\r\n * userProfileService.getBasicUserProfile();\r\n */\r\n getBasicUserProfile(pDeferred: Object, showBanner?: boolean): angular.IPromise {\r\n if (!this.isBasicProfileRefreshed)\r\n console.warn(\"getBasicUserProfile was called before basic profile details were refreshed\");\r\n return this.getBasicProfileByOID(this.userInfoService.getCurrentUserOID(), pDeferred, showBanner);\r\n }\r\n /**\r\n * Gets user's latest basic profile details by connecting to the service through the url\r\n * @method Fxp.Services.UserProfileService.refreshBasicUserProfileInContext\r\n * @example Example to invoke refreshBasicUserProfileInContext\r\n * userProfileService.refreshBasicUserProfileInContext();\r\n */\r\n refreshBasicUserProfileInContext(pDeferred: any): angular.IPromise {\r\n let self = this;\r\n let deferred = pDeferred || this.q.defer();\r\n self.isBasicProfileRefreshed = false;\r\n self.responseStartTime = performance.now();\r\n console.log(\"Basic Profile Api Call Start Time : \" + self.responseStartTime);\r\n self.getBasicProfile(this.currentUserAlias, true, deferred);\r\n return deferred.promise;\r\n }\r\n /**\r\n * Gets user's basic profile details for passed in Alias\r\n * @method Fxp.Services.UserProfileService.getBasicProfileByOID\r\n * @param {Alias} alias an alias of a user\r\n * @param {Object} deferred holds promise of a parent caller if set\r\n * @example Example to invoke getBasicProfileSvc\r\n * userProfileService.getBasicProfileByOID('<>');\r\n */\r\n public getBasicProfileByOID(aadObjectID: string, pDeferred?: any, showBanner?: boolean): angular.IPromise {\r\n let self = this;\r\n let deferred = pDeferred || this.q.defer();\r\n let userData = null;\r\n // Removed as part of FXP Event Cleanup (keep comments for near future reference)\r\n if (self.userInfoService.getLoggedInUserOID() == aadObjectID) {\r\n userData = self.globalStoreService.GetPlatformState().LoggedInUser.Profile;\r\n\r\n }\r\n else if (aadObjectID == self.userInfoService.getCurrentUserOID()) {\r\n let currentProfile = self.globalStoreService.GetPlatformState().CurrentUser.Profile;\r\n if (!CommonUtils.isNullOrEmpty(currentProfile) && aadObjectID == currentProfile.AadObjectId)\r\n userData = currentProfile;\r\n\r\n }\r\n if (!CommonUtils.isNullOrEmpty(userData)) {\r\n self.timeout(() => {\r\n deferred.resolve(userData);\r\n }, self.sleepInterval);\r\n\r\n }\r\n else {\r\n self.getBasicProfile(aadObjectID, true, deferred, showBanner);\r\n }\r\n return deferred.promise;\r\n }\r\n public getBasicProfileByAlias(alias: string, pDeferred?: any, showBanner?: boolean,includeInactiveUser: boolean = false): angular.IPromise {\r\n if (includeInactiveUser)\r\n return this.getBasicProfileByAliasIncludingInActiveUser(alias);\r\n let self = this;\r\n let deferred = pDeferred || this.q.defer();\r\n let userData = null;\r\n // Removed as part of FXP Event Cleanup (keep comments for near future reference)\r\n if (self.loggedInUserAlias == alias) {\r\n userData = self.globalStoreService.GetPlatformState().LoggedInUser.Profile;\r\n\r\n }\r\n else if (alias == self.currentUserAlias) {\r\n let currentProfile = self.globalStoreService.GetPlatformState().CurrentUser.Profile;\r\n if (!CommonUtils.isNullOrEmpty(currentProfile) && alias == currentProfile.alias)\r\n userData = currentProfile;\r\n\r\n }\r\n if (!CommonUtils.isNullOrEmpty(userData)) {\r\n self.timeout(() => {\r\n deferred.resolve(userData);\r\n }, self.sleepInterval);\r\n\r\n }\r\n else {\r\n self.getBasicProfile(alias, true, deferred, showBanner);\r\n }\r\n return deferred.promise;\r\n }\r\n\r\n private getBasicProfileByAliasIncludingInActiveUser(alias: string): angular.IPromise {\r\n var self = this;\r\n var url = self.searchProfileApiEndpoint + '/profile/' + alias+ '?IncludeInactive='+true;\r\n\r\n var deferred = self.q.defer();\r\n\r\n if (self.msalAuthenticationService.accessTokenRequestInProgress(url)) {\r\n self.iUCount++;\r\n if (self.iUCount == 5) {\r\n self.fxplogger.logError(self.telemetrySource, self.rootScope.fxpUIConstants.UIMessages.AADAuthFailureError.ErrorMessageTitle, ErrorCodes.SearchProfile_TokenMissing, null, null, null, null, ErrorSeverityLevel.Medium);\r\n return deferred.promise;\r\n }\r\n self.timeout(function () {\r\n self.getBasicProfileByAliasIncludingInActiveUser(alias);\r\n }, self.sleepInterval);\r\n }\r\n else {\r\n self.iUCount = 0;\r\n let bag = this.fxplogger.createPropertyBag();\r\n bag.addToBag('Url', url);\r\n const currentProcessName = TelemetryConstants.FXP_TELEMETRY_BASE_NAME + '.getBasicProfileByAliasIncludeInActiveUser';\r\n const eventData = new SystemEvent(currentProcessName, ComponentType.DataStore, 'User Profile api call');\r\n\r\n self.fxplogger.logSystemEvent(TelemetryConstants.FXP_TELEMETRY_BASE_NAME + \".UserProfileService.getBasicProfileByAliasIncludeInActiveUser\", eventData, bag);\r\n\r\n return self.$http.get(url);\r\n }\r\n return deferred.promise;\r\n }\r\n // get flighting context from user profile data\r\n getFlightingContext(data: any, userUpn: string): any {\r\n let roleGroupIdInternalId = CommonUtils.getPropertyValueCaseInsensitive(data, \"RoleGroupId\");\r\n if (roleGroupIdInternalId === null || roleGroupIdInternalId === undefined) {\r\n roleGroupIdInternalId = -1;\r\n }\r\n let resourceCategoryInternalId = CommonUtils.getPropertyValueCaseInsensitive(data, \"ResourceCategoryId\");\r\n if (resourceCategoryInternalId === null || resourceCategoryInternalId === undefined) {\r\n resourceCategoryInternalId = -1\r\n }\r\n let sDODomainInternalId = CommonUtils.getPropertyValueCaseInsensitive(data, \"SDODomainId\");\r\n if (sDODomainInternalId === null || sDODomainInternalId === undefined) {\r\n sDODomainInternalId = -1;\r\n }\r\n\r\n var FxpAppSettings = FxpAppSettings || window[\"FxpAppSettings\"] || {};\r\n var flightingContext = {};\r\n var opFields = FxpAppSettings.LeftNavFlightingContextProperties;\r\n var opFieldsArray = opFields.split(',');\r\n var field = \"\";\r\n\r\n flightingContext[\"RoleGroupId\"] = roleGroupIdInternalId;\r\n flightingContext[\"ResourceCategoryId\"] = resourceCategoryInternalId;\r\n flightingContext[\"SDODomainId\"] = sDODomainInternalId;\r\n flightingContext[\"userUpn\"] = userUpn;\r\n\r\n opFieldsArray.forEach(fieldName => {\r\n field = CommonUtils.getPropertyValueCaseInsensitive(data, fieldName);\r\n flightingContext[fieldName] = field;\r\n });\r\n \r\n return flightingContext;\r\n }\r\n\r\n /**\r\n * Get flighting context for logged in user\r\n * @method Fxp.Services.UserProfileService.getLoggedInUserFlighitngContext\r\n * @example Example to invoke getLoggedInUserFlighitngContext\r\n * userProfileService.getLoggedInUserFlighitngContext();\r\n */\r\n getLoggedInUserFlighitngContext(): angular.IPromise {\r\n let self = this;\r\n let deferred = this.q.defer();\r\n let flightingContext = {};\r\n this.getBasicUserProfileLoggedInUser().then(\r\n (data) => {\r\n flightingContext = self.getFlightingContext(data, self.userInfoService.getLoggedInUserUpn());\r\n deferred.resolve(flightingContext);\r\n }, (error) => {\r\n this.fxplogger.logEvent('Fxp.userProfileService.getBasicUserProfileLoggedInUser', `BasicProfile:${this.userInfoService.getLoggedInUserOID()} failed.`);\r\n deferred.reject(error);\r\n });\r\n return deferred.promise;\r\n }\r\n\r\n /**\r\n * Get flighting context for Current user\r\n * @method Fxp.Services.UserProfileService.getCurrentUserFlighitngContext\r\n * @example Example to invoke getCurrentUserFlighitngContext\r\n * userProfileService.getCurrentUserFlighitngContext();\r\n */\r\n getCurrentUserFlighitngContext(): angular.IPromise {\r\n let self = this;\r\n let deferred = this.q.defer();\r\n let flightingContext = {};\r\n this.getBasicProfileByOID(this.userInfoService.getCurrentUserOID(), null).then(\r\n (data) => {\r\n flightingContext = self.getFlightingContext(data, self.userInfoService.getCurrentUserUpn());\r\n deferred.resolve(flightingContext);\r\n }, (error) => {\r\n this.fxplogger.logEvent('Fxp.userProfileService.getBasicProfileByAlias', `BasicProfile:${this.userInfoService.getCurrentUserOID()} failed.`);\r\n deferred.reject(error);\r\n });\r\n return deferred.promise;\r\n }\r\n\r\n\r\n /**\r\n * Gets user's basic profile details by connecting to the service through the url\r\n * @method Fxp.Services.UserProfileService.getBasicProfileSvc\r\n * @param {Alias} alias an alias is the name of a user upto the symbol @ in the upn.\r\n * @param {Boolean} deferred a boolean value which is false by default.\r\n * @example Example to invoke getBasicProfileSvc\r\n * userProfileService.getBasicProfileSvc('logged in user alias', false);\r\n */\r\n private getProfileURL(userIdentifier: string, userIdentifierType: string) {\r\n var self = this;\r\n var url = '';\r\n if (self.profileApiEndpoint && userIdentifierType.toUpperCase() == \"OBJECTID\") {\r\n url = self.profileApiEndpoint + \"/profile/basic/\" + userIdentifier;\r\n\r\n }\r\n else if (self.profileApiEndpoint && userIdentifierType.toUpperCase() == \"ALIAS\") {\r\n url = self.profileApiEndpoint + \"/profile/\" + userIdentifier;\r\n }\r\n\r\n else {\r\n //call graph API\r\n url = self.graphAPIProfileUrl + ApplicationConstants.GraphApiProfileUrl;\r\n }\r\n return url;\r\n }\r\n private getBasicProfileSvc(userIdentifier: string, parentDeferred: any, showBanner?: boolean): IHttpPromise {\r\n let self = this;\r\n var userIdentifierType = CommonUtils.isGuid(userIdentifier) ? \"objectid\" : \"alias\";\r\n let url = this.getProfileURL(userIdentifier, userIdentifierType);\r\n let deferred = parentDeferred || self.q.defer();\r\n\r\n if (self.msalAuthenticationService.accessTokenRequestInProgress(url)) {\r\n self.iUCount++;\r\n if (self.iUCount == 5) {\r\n self.fxplogger.logError(self.telemetrySource, self.rootScope.fxpUIConstants.UIMessages.AADAuthFailureError.ErrorMessageTitle, ErrorCodes.GetBasicProfile_TokenNotFound, null, null, null, null, ErrorSeverityLevel.Medium);\r\n self.fxpMessageSvc.addMessage(self.rootScope.fxpUIConstants.UIMessages.AADAuthFailureError.ErrorMessage, FxpConstants.messageType.error);\r\n return deferred.promise;\r\n }\r\n self.timeout(function () {\r\n self.getBasicProfileSvc(userIdentifier, deferred, showBanner);\r\n }, self.sleepInterval);\r\n }\r\n else {\r\n self.iUCount = 0;\r\n self.fxplogger.stopTrackPerformance(PerfMarkers.AdalTimeGetBasicProfile);\r\n let bag = this.fxplogger.createPropertyBag();\r\n bag.addToBag('Url', url);\r\n let currentProcessName = TelemetryConstants.FXP_TELEMETRY_PLATFORM_BOOTSTRAP + '.Authorization.FetchBasicProfile';\r\n let eventData = new SystemEvent(currentProcessName, ComponentType.DataStore, 'Basic Profile api call');\r\n\r\n bag.addToBag(TelemetryConstants.CLASSNAME, \"UserProfileService\");\r\n bag.addToBag(TelemetryConstants.METHODNAME, \"getBasicProfileSvc\");\r\n self.fxplogger.logSystemEvent(TelemetryConstants.FXP_TELEMETRY_BASE_NAME + \".UserProfileService\", eventData, bag);\r\n\r\n return this.$http.get(url);\r\n }\r\n return deferred.promise;\r\n }\r\n\r\n getBasicProfile(userIdentifier: string, isRefresh: boolean, pDeferred?: any, showBanner?: boolean): angular.IPromise {\r\n let self = this;\r\n let userData = null;\r\n let receiveDate;\r\n let responseTime;\r\n let rootScope = this.rootScope;\r\n let deferred = pDeferred || this.q.defer();\r\n let telemetryContext = this.telemetryContext;\r\n showBanner = this.getShowBannerValue(showBanner);\r\n var userIdentifierType = CommonUtils.isGuid(userIdentifier) ? \"objectid\" : \"alias\";\r\n if (!isRefresh) {\r\n return self.getBasicUserProfile(deferred, showBanner);\r\n }\r\n else {\r\n let currentProcessName = TelemetryConstants.FXP_TELEMETRY_PLATFORM_BOOTSTRAP + '.Authorization.GetBasicProfileFromCache';\r\n let customProperties = self.fxplogger.createPropertyBag();\r\n customProperties.addToBag(TelemetryConstants.CLASSNAME, \"UserProfileService\");\r\n customProperties.addToBag(TelemetryConstants.METHODNAME, \"getBasicProfile\");\r\n customProperties.addToBag(userIdentifierType, userIdentifier);\r\n var localStorageProfile = this.getProfileFromLocalStorage(userIdentifier);\r\n if (localStorageProfile) {\r\n self.dispatchProfileActions(localStorageProfile, userIdentifier);\r\n self.timeout(function () {\r\n try {\r\n deferred.notify(JSON.parse(localStorageProfile));\r\n let eventData = new SystemEvent(currentProcessName, ComponentType.DataStore, 'Returned Basic Profile from browser cache');\r\n self.fxplogger.logSystemEvent(TelemetryConstants.FXP_TELEMETRY_BASE_NAME + \".UserProfileService\", eventData, customProperties);\r\n }\r\n catch (exception) {\r\n self.fxplogger.logException(currentProcessName, new Error(\"Invalid JSON in local Storage for Basic Profile\"), customProperties, null, null, ErrorSeverityLevel.Medium, ErrorCodes.ProfileService_ErrorNotifyingCachedProfile);\r\n }\r\n }, self.sleepInterval);\r\n }\r\n\r\n let sendDate = new Date();\r\n this.fxplogger.startTrackPerformance(PerfMarkers.GetBasicProfileWithAdal);\r\n this.fxplogger.startTrackPerformance(PerfMarkers.AdalTimeGetBasicProfile);\r\n self.getBasicProfileSvc(userIdentifier, false, showBanner).then(function (data) {\r\n userData = data;\r\n // Logging a metric with the response\r\n\r\n receiveDate = new Date();\r\n responseTime = receiveDate.getTime() - sendDate.getTime(); // in millisecs\r\n var propbag = self.fxplogger.createPropertyBag();\r\n propbag.addToBag(FxpConstants.metricConstants.Status, userData.status);\r\n propbag.addToBag(FxpConstants.metricConstants.StatusText, userData.statusText);\r\n\r\n propbag.addToBag(FxpConstants.metricConstants.StartTime, sendDate.toUTCString());\r\n propbag.addToBag(FxpConstants.metricConstants.EndTime, receiveDate.toUTCString());\r\n propbag.addToBag(FxpConstants.metricConstants.ServiceName, FxpConstants.metricConstants.GetBasicProfileSvcName);\r\n let url = self.getProfileURL(userIdentifier, userIdentifierType);\r\n propbag.addToBag(FxpConstants.metricConstants.ServiceURL, url);\r\n propbag.addToBag(FxpConstants.metricConstants.UserAgent, navigator.userAgent);\r\n\r\n propbag.addToBag(FxpConstants.metricConstants.SessionId, rootScope.sessionId);\r\n propbag.addToBag(userIdentifierType, userIdentifier);\r\n propbag.addToBag(FxpConstants.metricConstants.UserBusinessRole, userData.BusinessRole);\r\n propbag.addToBag(FxpConstants.metricConstants.Geography, telemetryContext.getGeography());\r\n self.fxplogger.stopTrackPerformance(PerfMarkers.GetBasicProfileWithAdal);\r\n self.fxplogger.logMetric(self.telemetrySource, FxpConstants.metricConstants.UserProfileService, responseTime, propbag);\r\n\r\n if (userData.data != undefined && userData.data != null) {\r\n userData = userData.data;\r\n if (userData.hasOwnProperty(\"CacheHit\")) {\r\n delete userData[\"CacheHit\"];\r\n }\r\n var userInfo = new UserInfo();\r\n if (self.profileApiEndpoint) {\r\n for (var attr in userData) {\r\n userInfo[attr] = userData[attr];\r\n }\r\n\r\n // Adding BusinessDomain\r\n userInfo.BusinessDomain = userData.SDODomain;\r\n userInfo.AddressBookTitleDesc = userData.AddressBookTitleDesc;\r\n //Adding RoleGrouId\r\n userInfo.RoleGroupId = userData.RoleGroupID;\r\n rootScope.BusinessRole = userInfo.BusinessRole;\r\n\r\n // Adding Email\r\n userInfo.Email = userData.EmailName;\r\n\r\n // Adding FirstName to FullName\r\n if (!CommonUtils.isNullOrEmpty(userInfo.DisplayName)) {\r\n userInfo.FullName = userInfo.DisplayName;\r\n }\r\n\r\n // Adding MiddleName to FullName\r\n if (!CommonUtils.isNullOrEmpty(userInfo.MiddleName)) {\r\n userInfo.FullName += (userInfo.FullName.length > 0 ? \" \" : \"\") + userInfo.MiddleName;\r\n }\r\n\r\n // Adding LastName to FullName\r\n if (!CommonUtils.isNullOrEmpty(userInfo.LastName)) {\r\n userInfo.FullName += (userInfo.FullName.length > 0 ? \" \" : \"\") + userInfo.LastName;\r\n }\r\n\r\n //Adding BusinessRoleDisplayName\r\n if (!CommonUtils.isNullOrEmpty(userInfo.BusinessRole)) {\r\n if (!CommonUtils.isNullOrEmpty(userInfo.Seniority)) {\r\n userInfo.BusinessRoleDisplayName = userInfo.Seniority + \" \" + userInfo.BusinessRole;\r\n }\r\n else {\r\n userInfo.BusinessRoleDisplayName = userInfo.BusinessRole;\r\n }\r\n }\r\n\r\n //Checking isDefaultProfile flag\r\n userInfo.IsDefaultProfile = false;\r\n\r\n //Checking BusinessRole and BusinessRoleId\r\n if ((userInfo.BusinessRoleId == null || userInfo.BusinessRoleId == 0) ||\r\n (CommonUtils.isNullOrEmpty(userInfo.BusinessRole))) {\r\n self.fxplogger.logError(self.telemetrySource, rootScope.fxpUIConstants.UIMessages.UserProfileBusinessRoleMissingError.ErrorMessageTitle, ErrorCodes.GetBasicProfile_BusinessRoleMissing, null, null, null, null, ErrorSeverityLevel.High);\r\n if (showBanner) {\r\n self.fxpMessageSvc.addMessage(rootScope.fxpUIConstants.UIMessages.UserProfileBusinessRoleMissingError.ErrorMessage, FxpConstants.messageType.error);\r\n }\r\n }\r\n\r\n // Adding old tenant\r\n var tenantMapping = self.fxpConfiguration.FxpAppSettings[\"UserTenantMapping\"];\r\n if (tenantMapping) {\r\n tenantMapping = JSON.parse(tenantMapping);\r\n var newTenant = userInfo.TenantName;\r\n if (tenantMapping[newTenant]) {\r\n userInfo.MappedTenantName = tenantMapping[newTenant];\r\n } else {\r\n userInfo.MappedTenantName = newTenant;\r\n }\r\n }\r\n\r\n // Checking RoleGroup\r\n if ((!userInfo.RoleGroupId || userInfo.RoleGroupId <= 0) ||\r\n (CommonUtils.isNullOrEmpty(userInfo.RoleGroupName))) {\r\n propbag = self.fxplogger.createPropertyBag();\r\n propbag.addToBag(FxpConstants.metricConstants.SessionId, rootScope.sessionId);\r\n propbag.addToBag(FxpConstants.metricConstants.TimeStamp, FxpLogHelper.getTimeStamp());\r\n //change\r\n // propbag.addToBag(FxpConstants.metricConstants.UserUPN, alias);\r\n propbag.addToBag(FxpConstants.metricConstants.UserAgent, navigator.userAgent);\r\n propbag.addToBag(FxpConstants.metricConstants.UserBusinessRole, userInfo.BusinessRole);\r\n propbag.addToBag(FxpConstants.metricConstants.Geography, telemetryContext.getGeography());\r\n self.fxplogger.logError(self.telemetrySource, rootScope.fxpUIConstants.UIMessages.UserProfileRoleGroupMissingError.ErrorMessageTitle, ErrorCodes.GetBasicProfile_RoleGroupMissing, \"\", propbag, null, null, ErrorSeverityLevel.Critical);\r\n }\r\n\r\n } else {\r\n //read data incase graph api call\r\n userInfo = self.getProfileDataFromGraphResponse(userData);\r\n }\r\n\r\n // adding user profile data to the local \r\n self.setLocalStorageProfile(userInfo);\r\n let localStorageProfile = JSON.stringify(userInfo);\r\n self.dispatchProfileActions(localStorageProfile, userIdentifier);\r\n var responseEndTime = performance.now();\r\n var responseTotalDuration = responseEndTime - self.responseStartTime;\r\n self.isBasicProfileRefreshed = true;\r\n self.rootScope.$broadcast(FxpBroadcastedEvents.OnBasicUserProfileRefresh);\r\n }\r\n else {\r\n self.fxplogger.logError(self.telemetrySource, this.rootScope.fxpUIConstants.UIMessages.UserProfileNotFoundError.ErrorMessageTitle, ErrorCodes.GetBasicProfile_ProfileNotFound, null, null, null, null, ErrorSeverityLevel.Critical);\r\n if (self.isProfileRequired && showBanner)\r\n self.fxpMessageSvc.addMessage(rootScope.fxpUIConstants.UIMessages.UserProfileNotFoundError.ErrorMessage, FxpConstants.messageType.error);\r\n }\r\n\r\n deferred.resolve(userInfo);\r\n }).catch(function (err) {\r\n self.fxplogger.stopTrackPerformance(PerfMarkers.GetBasicProfileWithAdal);\r\n self.rootScope.isBlockedCSAUser = false;\r\n\r\n if (err && err.data && err.data.ErrorCode && err.data.ErrorCode.toString() === self.fxpConfiguration.FxpAppSettings.CSAErrorCode) {\r\n self.rootScope.isBlockedCSAUser = true;\r\n }\r\n // property bag for error\r\n if (self.isProfileRequired || self.rootScope.isLoginRequired || self.rootScope.isBlockedCSAUser) {\r\n var propbag = self.fxplogger.createPropertyBag();\r\n receiveDate = new Date();\r\n responseTime = receiveDate.getTime() - sendDate.getTime(); // in millisecs\r\n propbag.addToBag(FxpConstants.metricConstants.StartTime, sendDate.toUTCString());\r\n propbag.addToBag(FxpConstants.metricConstants.EndTime, receiveDate.toUTCString());\r\n propbag.addToBag(FxpConstants.metricConstants.ServiceName, FxpConstants.metricConstants.GetBasicProfileSvcName);\r\n propbag.addToBag(FxpConstants.metricConstants.IsLoginRequired, self.rootScope.isLoginRequired);\r\n if (err != null) {\r\n propbag.addToBag(FxpConstants.metricConstants.Status, err.status);\r\n propbag.addToBag(FxpConstants.metricConstants.StatusText, err.statusText);\r\n propbag.addToBag(FxpConstants.metricConstants.ErrorUrl, err.config ? err.config.url : '');\r\n propbag.addToBag(FxpConstants.metricConstants.IsCSABlockedUser, self.rootScope.isBlockedCSAUser.toString());\r\n\r\n if (err.status == \"404\") {\r\n self.fxplogger.logEvent(`${self.telemetrySource}.getBasicProfile`, CustomEvents.ProfileNotFound, propbag);\r\n }\r\n else {\r\n self.logBasicProfileFailureError(propbag);\r\n }\r\n\r\n //Added a flag to show/hide banner. By default banner will be visible. User need to send false value to hide the flag\r\n if (showBanner && !self.rootScope.isBlockedCSAUser) {\r\n self.fxpMessageSvc.addMessage(rootScope.fxpUIConstants.UIMessages.ProfileServiceCallFailedError.ErrorMessage, FxpConstants.messageType.error);\r\n }\r\n } else {\r\n propbag.addToBag(FxpConstants.metricConstants.ServiceURL, self.getProfileURL(userIdentifier, userIdentifierType));\r\n propbag.addToBag(FxpConstants.metricConstants.ErrorText, \"Error object is null\");\r\n self.logBasicProfileFailureError(propbag);\r\n }\r\n deferred.reject(err);\r\n }\r\n else {\r\n var userInfo = self.getDeafultUserInfo();\r\n self.isBasicProfileRefreshed = true;\r\n self.setLocalStorageProfile(userInfo);\r\n let localStorageProfile = JSON.stringify(userInfo);\r\n self.dispatchProfileActions(localStorageProfile, userIdentifier);\r\n deferred.resolve(userInfo);\r\n }\r\n });\r\n }\r\n\r\n return deferred.promise;\r\n }\r\n private setLocalStorageProfile(profile: UserInfo) {\r\n let alias = profile.Alias;\r\n let OID = profile.AadObjectId;\r\n let localStorageProfile = JSON.stringify(profile);\r\n if (!CommonUtils.isNullOrEmpty(alias))\r\n localStorage[CommonUtils.getSessionStorageUserInfoKey(alias)] = localStorageProfile;\r\n if (!CommonUtils.isNullOrEmpty(OID))\r\n localStorage[CommonUtils.getSessionStorageUserInfoKey(OID)] = localStorageProfile;\r\n }\r\n\r\n // need to save for both so will work always both here\r\n private getProfileFromLocalStorage(userIdentifier) {\r\n if (!userIdentifier)\r\n return null;\r\n\r\n let profileStorageKey = CommonUtils.getSessionStorageUserInfoKey(userIdentifier);\r\n if (!profileStorageKey)\r\n return null;\r\n \r\n var localStorageProfile = localStorage[profileStorageKey];\r\n return localStorageProfile;\r\n }\r\n\r\n private dispatchProfileActions(localStorageProfile: any, userIdentifier: string) {\r\n let self = this;\r\n if (userIdentifier == self.userInfoService.getLoggedInUserOID() || userIdentifier == self.loggedInUserAlias) {\r\n //dispatch action with payload as localStorage\r\n self.globalStoreService.DispatchGlobalAction(\"Platform\", AddLoggedInUserProfile(JSON.parse(localStorageProfile)));\r\n this.setLoggedInUser(localStorageProfile);\r\n }\r\n if (userIdentifier == self.userInfoService.getCurrentUserOID() || userIdentifier == self.currentUserAlias)\r\n {\r\n self.globalStoreService.DispatchGlobalAction(\"Platform\", AddCurrentUserProfile(JSON.parse(localStorageProfile)));\r\n \r\n }\r\n }\r\n\r\n /**\r\n * Logs exception occured in get basic profile\r\n * @method Fxp.Services.UserProfileService.logBasicProfileFailureError\r\n * @param {object} propbag contains all property bag values.\r\n * userProfileService.logBasicProfileFailureError(propbag);\r\n */\r\n logBasicProfileFailureError(propbag: LogPropertyBag): void {\r\n var self = this;\r\n self.fxplogger.logError(self.telemetrySource, self.rootScope.fxpUIConstants.UIMessages.ProfileServiceCallFailedError.ErrorMessageTitle, ErrorCodes.BasicProfile_UnknownError, null, propbag, null, null, ErrorSeverityLevel.Critical);\r\n }\r\n\r\n /**\r\n * Gets logged in user's basic profile details by getBasicUserProfileLoggedInUser to the service through the url\r\n * @method Fxp.Services.UserProfileService.getBasicUserProfile\r\n * @example Example to invoke getBasicUserProfileLoggedInUser\r\n * userProfileService.getBasicUserProfileLoggedInUser();\r\n */\r\n getBasicUserProfileLoggedInUser(): angular.IPromise {\r\n return this.getBasicProfileByOID(this.userInfoService.getLoggedInUserOID(), null);\r\n }\r\n\r\n setLoggedInUser(localStorageProfile) {\r\n let userProfile = JSON.parse(localStorageProfile);\r\n this.loggedInUserAlias = userProfile.alias;\r\n this.userInfoService.setLoggedInUser(this.loggedInUserAlias);\r\n if (!this.isObo())\r\n {\r\n this.userInfoService.setCurrentUser(this.loggedInUserAlias);\r\n this.setCurrentUser(this.loggedInUserAlias);\r\n }\r\n }\r\n\r\n setCurrentUser(alias: string) {\r\n if (alias) {\r\n this.userAlias = alias;\r\n this.currentUserAlias = alias;\r\n this.userInfoService.setCurrentUser(alias);\r\n }\r\n }\r\n\r\n isObo(): boolean {\r\n return this.userInfoService.isActingOnBehalfOf();\r\n }\r\n /**\r\n * Returns search results from the profile API for the specified search string\r\n * @method Fxp.Services.UserProfileService.searchProfile\r\n * @param {string} searchString search string for a user alias.\r\n * @example Example to invoke searchProfile\r\n * userProfileService.searchProfile('search string');\r\n */\r\n searchProfile(searchString, parentDiffered?) {\r\n var self = this;\r\n var url = self.searchProfileApiEndpoint + '/profile/searchprofile?searchText=' + searchString;\r\n\r\n var deferred = parentDiffered || self.q.defer();\r\n\r\n if (self.msalAuthenticationService.accessTokenRequestInProgress(url)) {\r\n self.iUCount++;\r\n if (self.iUCount == 5) {\r\n self.fxplogger.logError(self.telemetrySource, self.rootScope.fxpUIConstants.UIMessages.AADAuthFailureError.ErrorMessageTitle, ErrorCodes.SearchProfile_TokenMissing, null, null, null, null, ErrorSeverityLevel.Medium);\r\n self.fxpMessageSvc.addMessage(self.rootScope.fxpUIConstants.UIMessages.AADAuthFailureError.ErrorMessage, FxpConstants.messageType.error);\r\n return deferred.promise;\r\n }\r\n self.timeout(function () {\r\n self.searchProfile(searchString, deferred);\r\n }, self.sleepInterval);\r\n }\r\n else {\r\n self.iUCount = 0;\r\n let bag = this.fxplogger.createPropertyBag();\r\n bag.addToBag('Url', url);\r\n //this.fxplogger.logEvent('Fxp.userProfileService.getBasicProfileSvc', 'GetBasicProfile:StartingServiceCall', bag);\r\n const currentProcessName = TelemetryConstants.FXP_TELEMETRY_BASE_NAME + '.UserProfileSearch';\r\n const eventData = new SystemEvent(currentProcessName, ComponentType.DataStore, 'User Profile api call');\r\n\r\n self.fxplogger.logSystemEvent(TelemetryConstants.FXP_TELEMETRY_BASE_NAME + \".UserProfileService.searchProfile\", eventData, bag);\r\n\r\n return (window[\"tenantConfiguration\"].ProfileStore && window[\"tenantConfiguration\"].ProfileStore.SearchAPIHeaders) ?\r\n self.$http.get(url, { headers: window[\"tenantConfiguration\"].ProfileStore.SearchAPIHeaders }) : self.$http.get(url);\r\n }\r\n return deferred.promise;\r\n }\r\n\r\n\r\n\r\n private getProfileDataFromGraphResponse(userData: any): any {\r\n var userInfo = new UserInfo();\r\n userInfo.FirstName = userData.givenName;\r\n userInfo.LastName = userData.surname;\r\n userInfo.FullName = userData.displayName;\r\n userInfo.Email = userData.userPrincipalName;\r\n userInfo.DisplayName = userData.displayName;\r\n userInfo.Alias = userData.mailNickname;\r\n userInfo.PersonnelNumber = userData.immutableId;\r\n userInfo.BusinessRole = userData.jobTitle || {};\r\n userInfo.BusinessRoleDisplayName = userData.jobTitle || {};\r\n userInfo.IsDefaultProfile = false;\r\n\r\n for (let item in userData) {\r\n if (item.indexOf(\"ReportsToFullName\") > 0) {\r\n userInfo.ReportsToDisplayName = userData[item]\r\n userInfo.ReportsToFullName = userInfo.ReportsToDisplayName;\r\n break;\r\n }\r\n }\r\n return userInfo;\r\n }\r\n private getDeafultUserInfo() {\r\n var aadBasicUserInfo = this.getAADBasicInfoFromLocalStorage();\r\n var userInfo = new UserInfo();\r\n if (aadBasicUserInfo === null) {\r\n userInfo.Email = \"\";\r\n userInfo.FirstName = \"\";\r\n userInfo.LastName = \"\";\r\n userInfo.FullName = \"\";\r\n userInfo.DisplayName = \"\";\r\n }\r\n else {\r\n console.log('Fetching user info from AAD user info.')\r\n var userProfileAAD = aadBasicUserInfo['profile'];\r\n userInfo.Email = userProfileAAD['upn'];\r\n userInfo.FirstName = userProfileAAD['given_name'];\r\n userInfo.LastName = userProfileAAD['family_name'];\r\n userInfo.FullName = userProfileAAD['name'];\r\n userInfo.DisplayName = userProfileAAD['name'];\r\n }\r\n\r\n userInfo.IsDefaultProfile = true;\r\n userInfo.BusinessRole = \"0\";\r\n userInfo.BusinessRoleDisplayName = \"0\";\r\n\r\n this.rootScope.$broadcast(CustomEvents.OnProfileFromGraphAPI);\r\n this.rootScope.isBotEnabled = false;\r\n\r\n return userInfo;\r\n }\r\n\r\n private getAADBasicInfoFromLocalStorage(): any {\r\n return angular.fromJson(localStorage.getItem(\"AADBasicInfo\"));\r\n }\r\n\r\n private getShowBannerValue(showBanner: boolean) {\r\n //Setting the showBanner variable to true when the value is undefined. Banner will be showing by default \r\n return (showBanner === false) ? false : true;\r\n }\r\n}\r\n","import * as msit from '@microsoftit/telemetry-extensions-npm'; \r\nexport class BusinessProcessEvent extends msit.BusinessProcessEvent {\r\n constructor(businessProcessName: string, componentType: msit.ComponentType, startDateTime?: Date, endDateTime?: Date, templateType?: string){\r\n super(businessProcessName, componentType, startDateTime, endDateTime, templateType); \r\n }\r\n}\r\n\r\n\r\n","export enum ComponentType {\r\n Web = 0,\r\n SmartApp = 1,\r\n Device = 2,\r\n BackgroundProcess = 3,\r\n WebService = 4,\r\n Executable = 5,\r\n DynamicLinkLibrary = 6,\r\n JobService = 7,\r\n WorkflowComponent = 8,\r\n DataStore = 9,\r\n Other = 10\r\n}","export class EnvironmentData {\r\n\tpublic EnvironmetName;\r\n\tpublic ServiceOffering;\r\n\tpublic ServiceLine;\r\n\tpublic Service;\r\n\tpublic ComponentId;\r\n\tpublic ComponentName;\r\n\tpublic AppName;\r\n\tpublic IctoId;\r\n\tpublic BusinessProcessName;\r\n\r\n\tconstructor(private environmentName: string, private serviceOffering: string, private serviceLine: string, private service: string, private componentId: string, private componentName: string, private appName: string, private ictoId: string, private businessProcessName: string) {\r\n\t\tthis.EnvironmetName = environmentName;\r\n\t\tthis.ServiceOffering = serviceOffering;\r\n\t\tthis.ServiceLine = serviceLine;\r\n\t\tthis.Service = service;\r\n\t\tthis.ComponentId = componentId;\r\n\t\tthis.ComponentName = componentName;\r\n\t\tthis.AppName = appName;\r\n\t\tthis.IctoId = ictoId;\r\n\t\tthis.BusinessProcessName = businessProcessName;\r\n\t}\r\n}","export enum ErrorSeverityLevel {\r\n Low = 1, // Error in which user or workflow in not impacted.\r\n Medium = 2, // Error which can impact a feature or workflow partially but user can proceed to complete it with workarounds. \r\n High = 3, // Any error which can bring feature(s) down. \r\n Critical = 4 // Any error which can bring FxP Platform down. \r\n} ","import { ComponentType } from './ComponentType'; \r\nexport abstract class EventData {\r\n\tpublic ComponentType: ComponentType;\r\n\tpublic EventType: string;\r\n\tpublic Xcv: string;\r\n\tpublic UserRoleName: string;\r\n}","export enum EventTypes {\r\n\tFeatureUsageEvent = 0,\r\n\tBusinessProcessEvent = 1,\r\n\tBusinessEventMessageExchange = 2,\r\n\tBusinessEventEntityUpdate = 3,\r\n\tBusinessEventDatabaseRecord = 4,\r\n\tSystemEvent = 5,\r\n\tOther = 6\r\n}","import { ComponentType, ActionType, FeatureUsageEventV2, EventName, ActionStatus, TaskStatus, ItEventType } from '@microsoftit/telemetry-extensions-npm'\r\nexport class FeatureUsageEvent extends FeatureUsageEventV2 {\r\n constructor(featureName: string, actionType: ActionType, actionName: string, eventName: EventName, componentType: ComponentType) {\r\n super(featureName, actionType, actionName, eventName, componentType);\r\n }\r\n \r\n public getTaskName(): string {\r\n return this.TaskName;\r\n }\r\n public setTaskName(value: string) {\r\n this.TaskName = value;\r\n }\r\n public getTaskStatus(): TaskStatus {\r\n return this.TaskStatus;\r\n }\r\n public setTaskStatus(value: TaskStatus) {\r\n this.TaskStatus = value;\r\n }\r\n public getCapabilityType(): string {\r\n return this.CapabilityType;\r\n }\r\n public setCapabilityType(value: string) {\r\n this.CapabilityType = value;\r\n }\r\n public getEmbeddedExpereinceName(): string {\r\n return this.EmbeddedExpereinceName;\r\n }\r\n public setEmbeddedExpereinceName(value: string) {\r\n this.EmbeddedExpereinceName = value;\r\n }\r\n public setIsEmbeddedExperience(value: boolean) {\r\n this.IsEmbeddedExperience = value;\r\n }\r\n public getIsEmbeddedExperience(): boolean {\r\n return this.IsEmbeddedExperience;\r\n }\r\n public getEventName(): EventName {\r\n return this.EventName;\r\n }\r\n public getEventType(): ItEventType {\r\n return this.EventType;\r\n }\r\n public setEventType(value: ItEventType) {\r\n this.EventType = value;\r\n }\r\n public getDuration(): number {\r\n return this.Duration;\r\n }\r\n public setDuration(value: number) {\r\n this.Duration = value;\r\n }\r\n public getFeatureName(): string {\r\n return this.FeatureName;\r\n }\r\n public getSubFeatureName(): string {\r\n return this.SubFeatureName;\r\n }\r\n public setSubFeatureName(value: string) {\r\n this.SubFeatureName = value;\r\n }\r\n public getActionName(): string {\r\n return this.ActionName;\r\n }\r\n public getActionType(): ActionType {\r\n return this.ActionType;\r\n }\r\n public setExperimentationConfigId(value: string) {\r\n this.ExperimentationConfigId = value;\r\n }\r\n public getExperimentationConfigId(): string {\r\n return this.ExperimentationConfigId;\r\n }\r\n public setExperimentationConfigName(value: string) {\r\n this.ExperimentationConfigName = value;\r\n }\r\n public getExperimentationConfigName(): string {\r\n return this.ExperimentationConfigName;\r\n }\r\n public setExperimentationConfigResult(value: boolean) {\r\n this.ExperimentationConfigResult = value;\r\n }\r\n public getExperimentationConfigResult(): boolean {\r\n return this.ExperimentationConfigResult;\r\n }\r\n public getTemplateType(): string {\r\n return this.TemplateType;\r\n }\r\n public getComponentType(): ComponentType {\r\n return this.ComponentType;\r\n }\r\n public getUserRoleName(): string {\r\n return this.UserRoleName;\r\n }\r\n public setUserRoleName(value: string) {\r\n this.UserRoleName = value;\r\n }\r\n public getStartDateTime(): Date {\r\n return this.StartDateTime;\r\n }\r\n public setStartDateTime(value: Date) {\r\n this.StartDateTime = value;\r\n }\r\n public getEndDateTime(): Date {\r\n return this.EndDateTime;\r\n }\r\n public setEndDateTime(value: Date) {\r\n this.EndDateTime = value;\r\n }\r\n public getComponentUri(): string {\r\n return this.ComponentUri;\r\n }\r\n public setComponentUri(value: string) {\r\n this.ComponentUri = value;\r\n }\r\n public getEntityId(): string {\r\n return this.EntityId;\r\n }\r\n public setEntityId(value: string) {\r\n this.EntityId = value;\r\n }\r\n public getActionStatus() {\r\n return this.ActionStatus;\r\n }\r\n public setActionStatus(status: ActionStatus) {\r\n this.ActionStatus = status;\r\n }\r\n}","import { LogPropertyBag } from \"./LogPropertyBag\";\r\nimport { LogMetricBag } from \"./LogMetricBag\";\r\nimport { CommonUtils } from \"../utils/CommonUtils\";\r\nimport { TelemetryContext } from \"./telemetrycontext\";\r\nimport { EnvironmentData } from \"./TelemetryConst\";\r\n\r\n/**\r\n * @application Fxp\r\n */\r\n/**\r\n * @module Fxp.Telemetry.Helper\r\n */\r\n\r\n/**\r\n * Telmetry Log helper Class.\r\n * @class Fxp.Telemetry.Helper.FxpLogHelper\r\n * @classdesc Telmetry Log helper Class\r\n * @example \r\n * //To Use Telemetry.Helper.FxpLogHelper\r\n * var telemetryData = new Fxp.Telemetry.Helper.FxpLogHelper();\r\n */\r\nexport class FxpLogHelper {\r\n\t/**\r\n\t* Method Create Property Bag Object.\r\n\t* @method Fxp.Telemetry.Helper.FxpLogHelper().createPropertyBag()\r\n\t* @example Example to use new Fxp.Telemetry.Helper.FxpLogHelper().createPropertyBag()\r\n\t*/\r\n\tstatic createPropertyBag(): LogPropertyBag {\r\n\t\treturn new LogPropertyBag();\r\n\t}\r\n\r\n\t/**\r\n\t* Method Create Metric Bag Object.\r\n\t* @method Fxp.Telemetry.Helper.FxpLogHelper().createMetricBag()\r\n\t* @example Example to use new Fxp.Telemetry.Helper.FxpLogHelper().createMetricBag()\r\n\t*/\r\n\tstatic createMetricBag(): LogMetricBag {\r\n\t\treturn new LogMetricBag();\r\n\t}\r\n\r\n\t/**\r\n\t* Method to Get Current Time Stamp\r\n\t* @method Fxp.Telemetry.Helper.FxpLogHelper().getTimeStamp()\r\n\t* @example Example to use new Fxp.Telemetry.Helper.FxpLogHelper().getTimeStamp()\r\n\t*/\r\n\tstatic getTimeStamp(): string {\r\n\t\tvar currentDate = new Date();\r\n\t\tvar day: any = currentDate.getDate(),\r\n\t\t\tmonth: any = currentDate.getMonth() + 1,\r\n\t\t\tyear: any = currentDate.getFullYear(),\r\n\t\t\thours: any = currentDate.getHours(),\r\n\t\t\tminutes: any = currentDate.getMinutes(),\r\n\t\t\tseconds: any = currentDate.getSeconds();\r\n\t\tif (day < 10)\r\n\t\t\tday = \"0\" + day;\r\n\t\tif (month < 10)\r\n\t\t\tmonth = \"0\" + month;\r\n\t\tif (minutes < 10)\r\n\t\t\tminutes = \"0\" + minutes;\r\n\t\tif (seconds < 10)\r\n\t\t\tseconds = \"0\" + seconds;\r\n\t\tvar suffix = \"AM\";\r\n\t\tif (hours >= 12) {\r\n\t\t\tsuffix = \"PM\";\r\n\t\t\thours = hours - 12;\r\n\t\t}\r\n\t\tif (hours == 0) {\r\n\t\t\thours = 12;\r\n\t\t}\r\n\t\tif (hours < 10)\r\n\t\t\thours = \"0\" + hours;\r\n\t\treturn day + '/' + month + '/' + year + ' ' + hours + ':' + minutes + ':' + seconds + ' ' + suffix;\r\n\t}\r\n\r\n\t/**\r\n\t* Method to Get Telemetry Unique Key\r\n\t* @method Fxp.Telemetry.Helper.FxpLogHelper().getTelemetryUniqueKey()\r\n\t* @example Example to use new Fxp.Telemetry.Helper.FxpLogHelper().getTelemetryUniqueKey()\r\n\t*/\r\n\tstatic getTelemetryUniqueKey(): string {\r\n\t\tvar date = new Date();\r\n\r\n\t\treturn date.getFullYear().toString() +\r\n\t\t\tthis.pad2(date.getMonth() + 1) +\r\n\t\t\tthis.pad2(date.getDate()) +\r\n\t\t\tthis.pad2(date.getHours()) +\r\n\t\t\tthis.pad2(date.getMinutes()) +\r\n\t\t\tthis.pad2(date.getSeconds());\r\n\t}\r\n\r\n\t/**\r\n\t* Method to Get New SessionId\r\n\t* @method Fxp.Telemetry.Helper.FxpLogHelper().getNewSessionId()\r\n\t* @example Example to use new Fxp.Telemetry.Helper.FxpLogHelper().getNewSessionId()\r\n\t*/\r\n\tpublic static getNewSessionId(): string {\r\n\t\tvar d: number = new Date().getTime();\r\n\t\tvar guid: string = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {\r\n\t\t\tvar r = (d + Math.random() * 16) % 16 | 0;\r\n\t\t\td = Math.floor(d / 16);\r\n\t\t\treturn (c == 'x' ? r : (r & 0x3 | 0x8)).toString(16);\r\n\t\t});\r\n\r\n\t\treturn guid;\r\n\t}\r\n\r\n\tprivate static getAppNameFromSource(source: string): string{\r\n\t\tif (CommonUtils.isNullOrEmpty(source)) return; \r\n\t\treturn source.split('.')[0]; \r\n\t}\r\n\r\n/**\r\n * Adds environment detials to property bag\r\n * @param properties\r\n * @param transactionId\r\n */\r\n\tpublic static addEnvironmentDetails(eventProperties: LogPropertyBag, transactionId?: string, source?: string, aiInstrumentKey?: string, telemetryAppName?: string) {\r\n\t\tconst defaultAppName = \"FXP\" ;\r\n\t\tlet appName = (telemetryAppName)? telemetryAppName : null; \r\n\r\n\t\tif (!appName){\r\n\t\t\tappName = this.getAppNameFromSource(source);\r\n\t\t}\r\n\r\n\t\tif (!appName){\r\n\t\t\tappName = defaultAppName; \r\n\t\t}\r\n\r\n\t\t//get Environment details based on appName if environment details is not avilable then getting fxp environment details \r\n\t\tconst environmentData = TelemetryContext.CurrentContext.getEnvironmentDetails(appName) || TelemetryContext.CurrentContext.getEnvironmentDetails(defaultAppName);\r\n\t\tconst globalProperties = TelemetryContext.CurrentContext.getGlobalPropertyBag();\r\n\t\teventProperties.addRange(globalProperties);\r\n\t\tif (environmentData != null) {\r\n\t\t\teventProperties.addToBag(EnvironmentData.ENVIRONMENTNAME, environmentData.EnvironmetName || '');\r\n\t\t\teventProperties.addToBag(EnvironmentData.SERVICEOFFERING, environmentData.ServiceOffering || '');\r\n\t\t\teventProperties.addToBag(EnvironmentData.SERVICELINE, environmentData.ServiceLine || '');\r\n\t\t\teventProperties.addToBag(EnvironmentData.SERVICE, environmentData.Service || '');\r\n\t\t\teventProperties.addToBag(EnvironmentData.COMPONENTID, environmentData.ComponentId || '');\r\n\t\t\teventProperties.addToBag(EnvironmentData.COMPONENTNAME, environmentData.ComponentName || '');\r\n\t\t\teventProperties.addToBag(EnvironmentData.XCV, transactionId || '');\r\n\t\t\teventProperties.addToBag(EnvironmentData.AIAPPKEY, aiInstrumentKey || '');\r\n\t\t\teventProperties.addToBag(EnvironmentData.LOGGEDFROM, environmentData.AppName || '');\r\n\t\t\teventProperties.addToBag(EnvironmentData.ICTOID, environmentData.IctoId || '');\r\n\t\t\teventProperties.addToBag(EnvironmentData.BUSINESSPROCESSNAME, environmentData.BusinessProcessName || '');\r\n\t\t\teventProperties.addToBag(EnvironmentData.BuildNumber, window[\"FxpAppSettings\"].BuildNumber);\r\n\t\t}\r\n\t\treturn eventProperties;\r\n\t}\r\n\r\n\tprivate static pad2(n: number): string {\r\n\t\treturn n < 10 ? '0' + n.toString() : n.toString()\r\n\t}\r\n}\r\n","import { ILogger } from \"../interfaces/ILogger\";\r\nimport { IFxPService } from \"../interfaces/IFxpService\";\r\nimport { ICorrelationProvider } from \"../interfaces/ICorrelationProvider\";\r\nimport { BusinessProcessEvent } from \"./BusinessProcessEvent\";\r\nimport { FeatureUsageEvent } from \"./FeatureUsageEvent\";\r\nimport { LogMetricBag } from \"./LogMetricBag\";\r\nimport { LogPropertyBag } from \"./LogPropertyBag\";\r\nimport { SystemEvent } from \"./SystemEvent\";\r\nimport {\r\n AppInsights,\r\n Correlator,\r\n EnvironmentValues,\r\n FeatureUsageEventV2,\r\n} from \"@microsoftit/telemetry-extensions-npm\";\r\nimport { ClickAnalyticsPlugin } from \"@microsoft/applicationinsights-clickanalytics-js\";\r\nimport { TelemetryContext } from \"./telemetrycontext\";\r\nimport { FxpLogHelper } from \"./FxpLogHelper\";\r\nimport { ITelemetryContextListener } from \"../interfaces/ITelemetryContextListener\";\r\nimport { CommonUtils } from \"../utils/CommonUtils\";\r\nimport { ErrorSeverityLevel } from \"./ErrorSeverityLevel\";\r\nimport { RoleGroupInfo, TenantInfo } from \"../common/ApplicationConstants\";\r\nimport {\r\n RoleGroupDetails,\r\n TelemetryConstants,\r\n TenantDetails,\r\n} from \"./TelemetryConst\";\r\nimport {\r\n IPageViewTelemetry,\r\n IMetricTelemetry,\r\n} from \"@microsoft/applicationinsights-common\";\r\nimport { FxpLoggerServiceExtension } from \"./FxpLoggerServiceExtension\";\r\nimport { NetworkConnection } from \"./network-connection\";\r\n\r\ndeclare type Envelope = any;\r\nconst PerfMarkerPrefix: string = \"Perf\";\r\n/**\r\n * A service for telemetry logging\r\n * @class FxpLoggerService\r\n * @classdesc A service to instrument data in Telemetry\r\n */\r\nexport class FxpLoggerService\r\n implements ILogger, IFxPService, ITelemetryContextListener\r\n{\r\n private _appInsight: AppInsights;\r\n private _environmentValues: EnvironmentValues;\r\n private _context: TelemetryContext;\r\n private _correlator: Correlator;\r\n private static _loggerServiceInstance: FxpLoggerService;\r\n private loggedInUserContext: any;\r\n private OBOUserContext: any;\r\n private isObo: boolean;\r\n private correlationProvider: ICorrelationProvider;\r\n private instrumentationKey: string;\r\n private pageLoadMetric: any;\r\n private _loggerServiceExtenstion: FxpLoggerServiceExtension;\r\n private _events: {\r\n [key: string]: number;\r\n };\r\n\r\n private constructor() {\r\n //this.init();\r\n }\r\n\r\n private init() {\r\n let FxpAppSettings: any = window[\"FxpAppSettings\"];\r\n let FxpBaseConfiguration: any = window[\"FxpBaseConfiguration\"];\r\n if (!this._appInsight) {\r\n this._events = {};\r\n this._appInsight = new AppInsights();\r\n this.instrumentationKey =\r\n FxpBaseConfiguration.Telemetry.InstrumentationKey;\r\n const clickPluginInstance = new ClickAnalyticsPlugin();\r\n // Click Analytics configuration\r\n const clickPluginConfig = {\r\n autoCapture: true,\r\n dataTags: {\r\n useDefaultContentNameOrId: true,\r\n captureAllMetaDataContent: true,\r\n },\r\n };\r\n // Application Insights Configuration\r\n const configObj = {\r\n instrumentationKey: FxpBaseConfiguration.Telemetry.InstrumentationKey,\r\n extensions: [clickPluginInstance],\r\n extensionConfig: {\r\n [clickPluginInstance.identifier]: clickPluginConfig,\r\n },\r\n };\r\n this._environmentValues = new EnvironmentValues(\r\n FxpAppSettings.EnvironmentName,\r\n FxpAppSettings.ServiceOffering,\r\n FxpAppSettings.ServiceLine,\r\n FxpAppSettings.Service,\r\n FxpAppSettings.ComponentName,\r\n FxpAppSettings.ComponentId,\r\n FxpAppSettings.IctoId\r\n );\r\n this._appInsight.InitializeTelemetryWithConfiguration(\r\n this._environmentValues,\r\n configObj\r\n );\r\n\r\n this._context = TelemetryContext.getInstance();\r\n this._context.initUserSession();\r\n this.setContextInfo();\r\n this._context.addContextChangeListener(this);\r\n this._correlator = new Correlator();\r\n $.correlator = this._correlator;\r\n const telemetryInitializer = {\r\n init: (envelope: Envelope) => {\r\n try {\r\n const telemetryItem = envelope.baseData;\r\n this.telemetryInitializerInit(\r\n telemetryItem,\r\n FxpBaseConfiguration.Telemetry.InstrumentationKey\r\n );\r\n } finally {\r\n envelope.tags[\"ai.cloud.role\"] = \"FxP-Client\";\r\n return true;\r\n }\r\n },\r\n };\r\n this._appInsight.appInsights.addTelemetryInitializer(\r\n telemetryInitializer.init\r\n );\r\n this._appInsight.AddMsitTelemetryInitializers(this._correlator);\r\n this._loggerServiceExtenstion =\r\n FxpLoggerServiceExtension.getInstance().init(this._appInsight);\r\n }\r\n }\r\n\r\n /**\r\n * Static method to get instance of FxpLoggerService\r\n * @abstract\r\n * @method Fxp.telemetry.fxpLogger#getInstance\r\n * @returns {FxpLoggerService} - Returns instance of FxpLoggerService\r\n */\r\n static getInstance(): FxpLoggerService {\r\n if (!this._loggerServiceInstance) {\r\n this._loggerServiceInstance = new FxpLoggerService();\r\n this._loggerServiceInstance.init();\r\n }\r\n return this._loggerServiceInstance;\r\n }\r\n\r\n notify() {\r\n this.setContextInfo();\r\n }\r\n\r\n private setContextInfo() {\r\n this._appInsight.appInsights.context.session.id =\r\n this._context.getSessionID();\r\n this._appInsight.appInsights.context.application.ver =\r\n this._context.getAppVersion();\r\n }\r\n\r\n private telemetryInitializerInit(\r\n telemetryItem: any,\r\n instrumentationKey: string\r\n ): void {\r\n const telemetryAppName = this.getCurrentPartnerTelemetryName();\r\n const properties = FxpLogHelper.addEnvironmentDetails(\r\n new LogPropertyBag(),\r\n null,\r\n null,\r\n instrumentationKey,\r\n telemetryAppName\r\n );\r\n let finalProperties = {};\r\n\r\n if (telemetryItem.properties) {\r\n finalProperties = Object.assign(\r\n {},\r\n telemetryItem.properties,\r\n properties.getItems()\r\n );\r\n }\r\n\r\n if (finalProperties[\"AppName\"] && finalProperties[\"AppName\"] === \"Fxp\") {\r\n finalProperties[\"AppName\"] = TelemetryConstants.FXP_TELEMETRY_BASE_NAME;\r\n }\r\n\r\n telemetryItem.properties = finalProperties;\r\n }\r\n\r\n private getCurrentPartnerTelemetryName(): string {\r\n const ngInjector = angular.element(document.body).injector();\r\n if (!ngInjector) return;\r\n\r\n const stateService: any = ngInjector.get(\"$state\");\r\n if (!stateService) return;\r\n\r\n const currentState = stateService.current;\r\n return currentState.data ? currentState.data.partnerTelemetryName : null;\r\n }\r\n\r\n /**\r\n * Diagnostic method to log error in telemetry\r\n * @abstract\r\n * @method Fxp.telemetry.fxpLogger#logError\r\n * @param {string} source - Source where this exception originated. It should be in Format ..\r\n * @param {string} message - Error Message.\r\n * @param {string} errorCode - Error Code or Error Constant.\r\n * @param {string} stackTrace - StackTrace of the Error.\r\n * @param {LogPropertyBag} properties - Properties for the customDimensions.\r\n * @param {LogMetricBag} measurements - measurements to be logged in customDimensions.\r\n * @param {string} transactionId - Transaction id or Operation id of the transaction.\r\n * @param {ErrorSeverityLevel} severityLevel - Severity Level of the error.\r\n */\r\n logError(\r\n source: string,\r\n message: string,\r\n errorCode: string,\r\n stackTrace?: string,\r\n properties?: LogPropertyBag,\r\n measurements?: LogMetricBag,\r\n transactionId?: string,\r\n severityLevel?: ErrorSeverityLevel\r\n ): void {\r\n try {\r\n let error = new Error();\r\n error.message = CommonUtils.removePII(message);\r\n error.stack = CommonUtils.removePII(stackTrace);\r\n this.logException(\r\n source,\r\n error,\r\n properties,\r\n measurements,\r\n transactionId,\r\n severityLevel,\r\n errorCode\r\n );\r\n } catch (exception) {\r\n this.internalCustomLog(exception);\r\n }\r\n }\r\n\r\n /**\r\n * Diagnostic method to log exception object\r\n * @abstract\r\n * @method Fxp.telemetry.fxpLogger#logError\r\n * @param {string} source - Source where this exception originated. It should be in Format ..\r\n * @param {Error} exception - Exception object.\r\n * @param {LogPropertyBag} properties - Properties for the customDimensions.\r\n * @param {LogMetricBag} measurements - measurements to be logged in customDimensions.\r\n * @param {string} transactionId - Transaction id or Operation id of the transaction.\r\n * @param {ErrorSeverityLevel} severityLevel - Severity Level of the error.\r\n * @param {string} errorCode - Error Code or Error Constant.\r\n */\r\n logException(\r\n source: string,\r\n exception: Error,\r\n properties?: LogPropertyBag,\r\n measurements?: LogMetricBag,\r\n transactionId?: string,\r\n severityLevel?: ErrorSeverityLevel,\r\n errorCode?: string\r\n ): void {\r\n try {\r\n exception.stack = CommonUtils.removePII(exception?.stack);\r\n exception.message = CommonUtils.removePII(exception?.message);\r\n exception.name = CommonUtils.removePII(exception?.name);\r\n errorCode = CommonUtils.removePII(errorCode);\r\n properties = this.setTransactionIdAndCommonProperties(\r\n source,\r\n transactionId,\r\n properties,\r\n errorCode,\r\n exception.stack\r\n );\r\n this._appInsight.TrackException(\r\n exception,\r\n severityLevel,\r\n properties.getItems(),\r\n measurements == null ? null : measurements.getItems()\r\n );\r\n } catch (exception) {\r\n this.internalCustomLog(exception);\r\n }\r\n }\r\n\r\n /**\r\n * Creates and returns a new instance of LogPropertyBag object.\r\n * @abstract\r\n * @method Fxp.telemetry.fxpLogger#createMetricBag\r\n * @returns {LogPropertyBag}\r\n */\r\n createPropertyBag(): LogPropertyBag {\r\n return FxpLogHelper.createPropertyBag();\r\n }\r\n\r\n /**\r\n * Creates and returns a new instance of LogmetricBag object.\r\n * @abstract\r\n * @method Fxp.telemetry.fxpLogger#createMetricBag\r\n * @returns {LogMetricBag}\r\n */\r\n createMetricBag(): LogMetricBag {\r\n return FxpLogHelper.createMetricBag();\r\n }\r\n\r\n /**\r\n * Diagnostic method to log warnings which will be captured in customEvents of application insights with EventType as Warning\r\n * @abstract\r\n * @method Fxp.telemetry.fxpLogger#logWarning\r\n * @param {string} source - Source from where the Warning is logged. It should be in Format ..\r\n * @param {string} message - Warning Message.\r\n * @param {LogPropertyBag} properties - Properties for the customDimensions.\r\n * @param {LogMetricBag} measurements - measurements to be logged in customDimensions.\r\n * @param {string} transactionId - Transaction id or Operation id of the transaction.\r\n */\r\n logWarning(\r\n source: string,\r\n message: string,\r\n properties?: LogPropertyBag,\r\n measurements?: LogMetricBag,\r\n transactionId?: string\r\n ): void {\r\n try {\r\n if (!properties) {\r\n properties = this.createPropertyBag();\r\n }\r\n properties.addToBag(\"EventType\", \"Warning\");\r\n this.logEvent(source, message, properties, measurements, transactionId);\r\n } catch (exception) {\r\n this.internalCustomLog(exception);\r\n }\r\n }\r\n\r\n /**\r\n * Diagnostic method to log Information which will be captured in customEvents of application insights with EventType as Information\r\n * @abstract\r\n * @method Fxp.telemetry.fxpLogger#logInformation\r\n * @param {string} message - Information Message\r\n * @param {LogPropertyBag} properties - Properties for the customDimensions.\r\n * @param {LogMetricBag} measurements - measurements to be logged in customDimensions.\r\n * @param {string} transactionId - Transaction id or Operation id of the transaction.\r\n */\r\n logInformation(\r\n source: string,\r\n message: string,\r\n properties?: LogPropertyBag,\r\n measurements?: LogMetricBag,\r\n transactionId?: string\r\n ): void {\r\n try {\r\n if (!properties) {\r\n properties = this.createPropertyBag();\r\n }\r\n properties.addToBag(\"EventType\", \"Information\");\r\n this.logEvent(source, message, properties, measurements, transactionId);\r\n } catch (exception) {\r\n this.internalCustomLog(exception);\r\n }\r\n }\r\n\r\n /**\r\n * Diagnostic method to log Events which will be captured in customEvents of application insights.\r\n * @abstract\r\n * @method Fxp.telemetry.fxpLogger#logCustomEvents\r\n * @param {string} source - Source from where the Event is getting logged. It should be in Format ..\r\n * @param {string} eventName - Event Name to be logged.\r\n * @param {LogPropertyBag} properties - Properties for the customDimensions.\r\n * @param {LogMetricBag} measurements - measurements to be logged in customDimensions.\r\n * @param {string} transactionId - Transaction id or Operation id of the transaction.\r\n */\r\n logEvent(\r\n source: string,\r\n eventName: string,\r\n properties?: LogPropertyBag,\r\n measurements?: LogMetricBag,\r\n transactionId?: string\r\n ): void {\r\n try {\r\n properties = this.setTransactionIdAndCommonProperties(\r\n source,\r\n transactionId,\r\n properties\r\n );\r\n this._appInsight.TrackEvent(\r\n eventName,\r\n properties.getItems(),\r\n measurements\r\n );\r\n } catch (exception) {\r\n this.internalCustomLog(exception);\r\n }\r\n }\r\n\r\n /**\r\n * Diagnostic method to Track Page Views in telemetry\r\n * @abstract\r\n * @method Fxp.telemetry.fxpLogger#logPageView\r\n * @param {string} source - Source from where this is getting logged. It should be in Format ..\r\n * @param pageName - Name of the visited page as string\r\n * @param {string} url - Url of the visited page.\r\n * @param {LogPropertyBag} properties - Properties for the customDimensions.\r\n * @param {LogMetricBag} measurements - measurements to be logged in customDimensions.\r\n * @param {number} duration - Time took to load the page. The value should be a positive integer.\r\n * @param {string} transactionId - Transaction id or Operation id of the transaction.\r\n */\r\n logPageView(\r\n source: string,\r\n pageName: string,\r\n url?: string,\r\n properties?: LogPropertyBag,\r\n measurements?: LogMetricBag,\r\n duration?: number,\r\n transactionId?: string\r\n ): void {\r\n try {\r\n properties = this.setTransactionIdAndCommonProperties(\r\n source,\r\n transactionId,\r\n properties\r\n );\r\n if (!measurements) {\r\n measurements = this.createMetricBag();\r\n }\r\n if (duration) {\r\n measurements.addToBag(`${pageName}-LoadDuration`, duration);\r\n }\r\n let pageViewTelemetry: IPageViewTelemetry = {\r\n name: pageName,\r\n uri: url,\r\n refUri: null,\r\n pageType: null,\r\n isLoggedIn: null,\r\n properties: properties.getItems(),\r\n measurements: measurements.getItems(),\r\n };\r\n this._appInsight.appInsights.trackPageView(pageViewTelemetry);\r\n } catch (exception) {\r\n this.internalCustomLog(exception);\r\n }\r\n }\r\n\r\n /**\r\n * OBSOLETE Method. Diagnostic method to Track Page Views\r\n * @abstract\r\n * @method Fxp.telemetry.fxpLogger#trackPageView\r\n * @param {string} url - Url of the visited page.\r\n * @param {LogPropertyBag} properties - Properties for the customDimensions.\r\n * @param {LogMetricBag} measurements - measurements to be logged in customDimensions.\r\n * @param duration - Time took to load the page. The value should be a number.\r\n * @deprecated - This method is deprecated and will be removed in future. Please use logPageView method instead.\r\n */\r\n trackPageView(\r\n url?: string,\r\n properties?: LogPropertyBag,\r\n measurements?: LogMetricBag,\r\n duration?: number,\r\n transactionId?: string\r\n ): void {\r\n try {\r\n this.logPageView(null, null, url, properties, measurements, duration);\r\n } catch (exception) {\r\n this.internalCustomLog(exception);\r\n }\r\n }\r\n\r\n /**\r\n * Diagnostic method to Track Metrics in telemetry\r\n * @abstract\r\n * @method Fxp.telemetry.fxpLogger#logMetric\r\n * @param {string} source - Source from where this is getting logged. It should be in Format ..\r\n * @param {string} metricName - Name of the metric.\r\n * @param {number} metricValue - The value of the metric as number.\r\n * @param {LogPropertyBag} properties - Properties for the customDimensions.\r\n * @param {string} transactionId - Transaction id or Operation id of the transaction.\r\n */\r\n logMetric(\r\n source: string,\r\n metricName: string,\r\n metricValue: number,\r\n properties?: LogPropertyBag,\r\n transactionId?: string\r\n ): void {\r\n try {\r\n properties = this.setTransactionIdAndCommonProperties(\r\n source,\r\n transactionId,\r\n properties\r\n );\r\n let metricTelemetry: IMetricTelemetry = {\r\n name: metricName,\r\n average: metricValue,\r\n properties: properties.getItems(),\r\n };\r\n this._appInsight.appInsights.trackMetric(metricTelemetry);\r\n } catch (exception) {\r\n this.internalCustomLog(exception);\r\n }\r\n }\r\n\r\n /**\r\n * Method to start tracking FeatureUsageEvent.\r\n * @description Method to start tracking FeatureUsageEvent.\r\n * @abstract\r\n * @method Fxp.telemetry.fxpLogger#logSystemEvent\r\n * @param {FeatureUsageEvent} featureUsageEvent - Instance of FeatureUsageEvent type.\r\n */\r\n startFeatureUsageEvent(featureUsageEvent: FeatureUsageEvent) {\r\n this._loggerServiceExtenstion.startFeatureUsageEvent(featureUsageEvent);\r\n }\r\n\r\n /**\r\n * Method to complete tracking FeatureUsageEvent.\r\n * @description Method to complete tracking FeatureUsageEvent.\r\n * @abstract\r\n * @method Fxp.telemetry.fxpLogger#endFeatureUsageEvent\r\n * @param {string} source - Source from where this is getting logged. It should be in Format ..\r\n * @param {FeatureUsageEvent} featureUsageEvent - Instance of SystemEvent type.\r\n * @param {LogPropertyBag} properties - Properties for the customDimensions.\r\n * @param {string} transactionId - Transaction id or Operation id of the transaction.\r\n */\r\n endFeatureUsageEvent(\r\n source: string,\r\n featureUsageEvent: FeatureUsageEvent,\r\n properties?: LogPropertyBag,\r\n transactionId?: any\r\n ) {\r\n properties = this.setTransactionIdAndCommonProperties(\r\n source,\r\n transactionId,\r\n properties\r\n );\r\n this._loggerServiceExtenstion.endFeatureUsageEvent(\r\n featureUsageEvent,\r\n properties\r\n );\r\n }\r\n\r\n /**\r\n * Diagnostic method to log Feature Usage in telemetry. This method can be used for tracking single session workflows.\r\n * @abstract\r\n * @method Fxp.telemetry.fxpLogger#logFeatureUsageEvent\r\n * @param {string} source - Source from where this is getting logged. It should be in Format ..\r\n * @param {FeatureUsageEvent} eventData - Instance of FeatureUsageEvent.\r\n * @param {LogPropertyBag} properties - Properties for the customDimensions.\r\n * @param {LogMetricBag} measurements - measurements to be logged in customDimensions.\r\n * @param {string} transactionId - Transaction id or Operation id of the transaction.\r\n */\r\n logFeatureUsageEvent(\r\n source: string,\r\n eventData: FeatureUsageEvent,\r\n properties?: LogPropertyBag,\r\n measurements?: LogMetricBag,\r\n transactionId?: any\r\n ): void {\r\n try {\r\n properties = this.setTransactionIdAndCommonProperties(\r\n source,\r\n transactionId,\r\n properties\r\n );\r\n this._loggerServiceExtenstion.logFeatureUsageEvent(\r\n eventData,\r\n properties,\r\n measurements\r\n );\r\n } catch (exception) {\r\n this.internalCustomLog(exception);\r\n }\r\n }\r\n\r\n /**\r\n * Diagnostic method to log Business Process Event in telemetry.\r\n * @abstract\r\n * @method Fxp.telemetry.fxpLogger#logBusinessProcessEvent\r\n * @param {string} source - Source from where this is getting logged. It should be in Format ..\r\n * @param {BusinessProcessEvent} eventData - Instance of FeatureUsageEvent.\r\n * @param {LogPropertyBag} properties - Properties for the customDimensions.\r\n * @param {LogMetricBag} measurements - measurements to be logged in customDimensions.\r\n * @param {string} transactionId - Transaction id or Operation id of the transaction.\r\n */\r\n logBusinessProcessEvent(\r\n source: string,\r\n eventData: BusinessProcessEvent,\r\n properties?: LogPropertyBag,\r\n measurements?: LogMetricBag,\r\n transactionId?: any\r\n ): void {\r\n try {\r\n properties = this.setTransactionIdAndCommonProperties(\r\n source,\r\n transactionId,\r\n properties\r\n );\r\n this._loggerServiceExtenstion.logBusinessProcessEvent(\r\n eventData,\r\n properties,\r\n measurements\r\n );\r\n } catch (exception) {\r\n this.internalCustomLog(exception);\r\n }\r\n }\r\n\r\n /**\r\n * Diagnostic method to log trace information in telemetry.\r\n * @abstract\r\n * @method Fxp.telemetry.fxpLogger#logTrace\r\n * @param {string} source - Source from where this is getting logged. It should be in Format ..\r\n * @param {string} message - Trace message.\r\n * @param {LogPropertyBag} properties - Properties for the customDimensions.\r\n * @param {LogMetricBag} measurements - measurements to be logged in customDimensions.\r\n * @param {string} transactionId - Transaction id or Operation id of the transaction.\r\n */\r\n logTrace(\r\n source: string,\r\n message: string,\r\n properties?: LogPropertyBag,\r\n transactionId?: string\r\n ): void {\r\n try {\r\n properties = this.setTransactionIdAndCommonProperties(\r\n source,\r\n transactionId,\r\n properties\r\n );\r\n this._appInsight.TrackTrace(message, properties.getItems());\r\n } catch (exception) {\r\n this.internalCustomLog(exception);\r\n }\r\n }\r\n\r\n /**\r\n * Internal method to Set the correlationProvider object for FxpLoggerService. This method should only be invoked from Platform during initialization.\r\n * @abstract\r\n * @method Fxp.telemetry.fxpLogger#setCorrelationProvider\r\n * @param {ICorrelationProvider} correlationProvider - Instance of ICorrelationProvider\r\n */\r\n setCorrelationProvider(correlationProvider: ICorrelationProvider) {\r\n this.correlationProvider = correlationProvider;\r\n }\r\n\r\n /**\r\n * Method to start performance tracking.\r\n * @abstract\r\n * @method Fxp.telemetry.fxpLogger#startTrackPerformance\r\n * @param {string} eventName - Name of the event\r\n * @param {string} transactionId - Transaction id or Operation id of the transaction.\r\n */\r\n startTrackPerformance(eventName: string, transactionId?: any): void {\r\n const metricName = PerfMarkerPrefix + eventName;\r\n try {\r\n if (!CommonUtils.isNullOrEmpty(this._events[metricName])) {\r\n console.warn(\r\n \"Start was called before calling stop for event : \" + metricName\r\n );\r\n } else {\r\n this._events[metricName] = performance.now();\r\n }\r\n } catch (exception) {\r\n this.internalCustomLog(exception);\r\n }\r\n }\r\n\r\n /**\r\n * Method to complete performance tracking.\r\n * @abstract\r\n * @method Fxp.telemetry.fxpLogger#stopTrackPerformance\r\n * @param {string} eventName - Name of the event\r\n * @param {LogPropertyBag} properties - Properties for the customDimensions.\r\n * @param {LogMetricBag} measurements - measurements to be logged in customDimensions.\r\n * @param {string} transactionId - Transaction id or Operation id of the transaction.\r\n */\r\n stopTrackPerformance(\r\n eventName: string,\r\n source?: string,\r\n properties?: LogPropertyBag,\r\n measurements?: LogMetricBag,\r\n transactionId?: any\r\n ): void {\r\n const metricName = PerfMarkerPrefix + eventName;\r\n const start = this._events[metricName];\r\n\r\n if (isNaN(start)) {\r\n console.warn(\r\n \"Stop was called before calling start for event : \" + eventName\r\n );\r\n } else {\r\n const duration = performance.now() - start;\r\n delete this._events[eventName];\r\n this._events[eventName] = undefined;\r\n if (CommonUtils.isNullOrEmpty(measurements)) {\r\n measurements = new LogMetricBag();\r\n }\r\n\r\n try {\r\n measurements.addToBag(metricName, duration);\r\n properties = this.setTransactionIdAndCommonProperties(\r\n source,\r\n transactionId,\r\n properties\r\n );\r\n properties.addToBag(\"Unit\", \"Milliseconds\");\r\n let metricTelemetry: IMetricTelemetry = {\r\n name: metricName,\r\n average: duration,\r\n properties: properties.getItems(),\r\n };\r\n\r\n this._appInsight.appInsights.trackMetric(metricTelemetry);\r\n } catch (exception) {\r\n this.internalCustomLog(exception);\r\n }\r\n }\r\n }\r\n\r\n getPageLoadMetrics() {\r\n return this.pageLoadMetric;\r\n }\r\n\r\n setPageLoadMetrics(value: any) {\r\n this.pageLoadMetric = value;\r\n }\r\n\r\n logPageLoadMetrics(pageLoadTime?: number): void {\r\n try {\r\n var pageLoadMetricsCalled = performance.now();\r\n var propBag = this.createPropertyBag();\r\n var pageLoadData = this.pageLoadMetric;\r\n\r\n pageLoadData.totalDuration = performance.now() - pageLoadData.startTime;\r\n\r\n if (\r\n !CommonUtils.isNullOrEmpty(pageLoadData.sourceRoute) &&\r\n !CommonUtils.isNullOrEmpty(pageLoadData.destinationRoute)\r\n ) {\r\n if (\r\n pageLoadTime != null &&\r\n pageLoadTime != undefined &&\r\n typeof pageLoadTime == \"number\"\r\n ) {\r\n pageLoadData.pageLoadDuration = pageLoadTime;\r\n } else pageLoadData.pageLoadDuration = 0;\r\n\r\n propBag.addToBag(\"pageDisplayName\", pageLoadData.pageDisplayName);\r\n propBag.addToBag(\"sourceRoute\", pageLoadData.sourceRoute);\r\n propBag.addToBag(\r\n \"sourceRouteURL\",\r\n CommonUtils.isNullOrEmpty(pageLoadData.sourceRouteURL)\r\n ? \"No_SourceRouteURL_Found\"\r\n : pageLoadData.sourceRouteURL\r\n );\r\n propBag.addToBag(\"destinationRoute\", pageLoadData.destinationRoute);\r\n propBag.addToBag(\r\n \"destinationRouteURL\",\r\n CommonUtils.isNullOrEmpty(pageLoadData.destinationRouteURL)\r\n ? \"No_DestinationRouteURL_Found\"\r\n : pageLoadData.destinationRouteURL\r\n );\r\n propBag.addToBag(\r\n \"pageTransitionStatus\",\r\n pageLoadData.pageTransitionStatus\r\n );\r\n propBag.addToBag(\r\n \"stateChangeDuration\",\r\n pageLoadData.stateChangeDuration.toString()\r\n );\r\n propBag.addToBag(\r\n \"preStateDuration\",\r\n pageLoadData.preStateDuration.toString()\r\n );\r\n propBag.addToBag(\"error\", pageLoadData.pageLoadError);\r\n propBag.addToBag(\r\n \"partnerPageLoadDuration\",\r\n pageLoadData.pageLoadDuration.toString()\r\n );\r\n propBag.addToBag(\r\n \"totalDuration\",\r\n pageLoadData.totalDuration.toString()\r\n );\r\n propBag.addToBag(\r\n \"thresholdCrossed\",\r\n pageLoadData.threshold.thresholdCrossed.toString()\r\n );\r\n propBag.addToBag(\r\n \"thresholdValue\",\r\n pageLoadData.threshold.thresholdValue.toString()\r\n );\r\n\r\n // Temp properties added for trouble shooting\r\n propBag.addToBag(\"startTime\", pageLoadData.startTime.toString());\r\n propBag.addToBag(\r\n \"$rootScope.startTime\",\r\n CommonUtils.isNullOrEmpty(pageLoadData.rootscopestartTime)\r\n ? \"0\"\r\n : pageLoadData.rootscopestartTime.toString()\r\n );\r\n propBag.addToBag(\r\n \"$rootScope.stateChangeStartTime\",\r\n CommonUtils.isNullOrEmpty(pageLoadData.stateChangeStartTime)\r\n ? \"0\"\r\n : pageLoadData.stateChangeStartTime.toString()\r\n );\r\n propBag.addToBag(\r\n \"pageLoadMetricsCalled\",\r\n pageLoadMetricsCalled.toString()\r\n );\r\n this.logEvent(\r\n pageLoadData.sourceRoute,\r\n \"FxpTelemetry.PageMetrics\",\r\n propBag\r\n );\r\n }\r\n } catch (exception) {\r\n this.internalCustomLog(exception);\r\n }\r\n }\r\n\r\n setLoggedInUserContext(\r\n loggedInUserRoleId: string,\r\n loggedInUserRoleName: string,\r\n isOBO: boolean,\r\n loggedInUserTenantKey: string,\r\n loggedInUserTenantName: string\r\n ) {\r\n this.loggedInUserContext = {\r\n [RoleGroupInfo.RoleGroupId]: loggedInUserRoleId\r\n ? loggedInUserRoleId.toString()\r\n : loggedInUserRoleId,\r\n [RoleGroupInfo.RoleGroupName]: loggedInUserRoleName,\r\n [TenantInfo.TenantKey]: loggedInUserTenantKey,\r\n [TenantInfo.TenantName]: loggedInUserTenantName,\r\n };\r\n this.isObo = isOBO;\r\n }\r\n\r\n setOBOUserContext(\r\n OBOUserRoleId: string,\r\n OBOUserRoleName: string,\r\n isOBO: boolean,\r\n OBOUserTenantKey: string,\r\n OBOUserTenantName: string\r\n ) {\r\n this.OBOUserContext = {\r\n [RoleGroupInfo.RoleGroupId]: OBOUserRoleId\r\n ? OBOUserRoleId.toString()\r\n : OBOUserRoleId,\r\n [RoleGroupInfo.RoleGroupName]: OBOUserRoleName,\r\n [TenantInfo.TenantKey]: OBOUserTenantKey,\r\n [TenantInfo.TenantName]: OBOUserTenantName,\r\n };\r\n this.isObo = isOBO;\r\n }\r\n\r\n /**\r\n * Method to log user actions which will be logged in customEvents with EventType as UserAction.\r\n * @abstract\r\n * @method Fxp.telemetry.fxpLogger#logSystemEvent\r\n * @param {string} source - Source from where this is getting logged. It should be in format ..\r\n * @param {string} eventName - Name of the event. It should be in format .\r\n * @param {LogPropertyBag} properties - Properties for the customDimensions.\r\n * @param {LogMetricBag} measurements - measurements to be logged in customDimensions.\r\n * @param {string} transactionId - Transaction id or Operation id of the transaction.\r\n */\r\n logUserAction(\r\n source,\r\n eventName: string,\r\n message: string,\r\n properties?: LogPropertyBag,\r\n measurements?: LogMetricBag,\r\n transactionId?: string\r\n ) {\r\n try {\r\n if (!properties) {\r\n properties = this.createPropertyBag();\r\n }\r\n properties.addToBag(\"EventType\", \"UserAction\");\r\n properties.addToBag(\"message\", message);\r\n this.logEvent(source, eventName, properties, measurements, transactionId);\r\n } catch (exception) {\r\n this.internalCustomLog(exception);\r\n }\r\n }\r\n\r\n /**\r\n * Method to log system events which will be logged in customEvents with EventType as SystemEvent.\r\n * @abstract\r\n * @method Fxp.telemetry.fxpLogger#logSystemEvent\r\n * @param {string} source - Source from where this is getting logged. It should be in Format ..\r\n * @param {SystemEvent} eventData - Instance of SystemEvent type.\r\n * @param {LogPropertyBag} properties - Properties for the customDimensions.\r\n * @param {LogMetricBag} measurements - measurements to be logged in customDimensions.\r\n * @param {string} transactionId - Transaction id or Operation id of the transaction.\r\n */\r\n logSystemEvent(\r\n source: string,\r\n eventData: SystemEvent,\r\n properties?: LogPropertyBag,\r\n measurements?: LogMetricBag,\r\n transactionId?: any\r\n ) {\r\n try {\r\n properties = this.setTransactionIdAndCommonProperties(\r\n source,\r\n transactionId,\r\n properties\r\n );\r\n this._appInsight.TrackSystemEvent(\r\n eventData,\r\n properties.getItems(),\r\n measurements\r\n );\r\n } catch (exception) {\r\n this.internalCustomLog(exception);\r\n }\r\n }\r\n\r\n private setTransactionId(transactionId?: any) {\r\n if (transactionId) {\r\n this._appInsight.appInsights.context.telemetryTrace.traceID =\r\n transactionId;\r\n return;\r\n }\r\n const subCorrelationId = this._correlator.getSubCorrelationId();\r\n const correlationId = this._correlator.getCorrelationId();\r\n if (subCorrelationId) {\r\n this._appInsight.appInsights.context.telemetryTrace.traceID =\r\n subCorrelationId;\r\n this._appInsight.appInsights.context.telemetryTrace.parentID =\r\n correlationId;\r\n return subCorrelationId;\r\n }\r\n this._appInsight.appInsights.context.telemetryTrace.traceID = correlationId;\r\n return correlationId;\r\n }\r\n\r\n private setTransactionIdAndCommonProperties(\r\n source?: string,\r\n transactionId?: any,\r\n properties?: LogPropertyBag,\r\n errorCode?: string,\r\n stackTrace?: string\r\n ) {\r\n this.setTransactionId(transactionId);\r\n properties = this.addPropertyBagValues(properties, transactionId, source);\r\n properties = this.buildCommonLogProperties(properties, source, null, null);\r\n return properties;\r\n }\r\n\r\n /**\r\n * To Builds log properties that are common to all methods\r\n * @param properties\r\n * @param source\r\n * @param errorCode\r\n * @param stackTrace\r\n */\r\n private buildCommonLogProperties(\r\n properties: LogPropertyBag,\r\n source: string,\r\n errorCode: string,\r\n stackTrace: string\r\n ) {\r\n const logProperties = properties || this.createPropertyBag();\r\n if (logProperties.getValue(TelemetryConstants.LOGGING_SOURCE)) {\r\n logProperties.addToBag(\r\n \"Source\",\r\n properties.getValue(TelemetryConstants.LOGGING_SOURCE)\r\n );\r\n logProperties.removeFromBag(TelemetryConstants.LOGGING_SOURCE);\r\n } else if (!CommonUtils.isNullOrEmpty(source)) {\r\n logProperties.addToBag(\"Source\", source);\r\n }\r\n if (!CommonUtils.isNullOrEmpty(errorCode))\r\n logProperties.addToBag(\"ErrorCode\", errorCode);\r\n\r\n if (!CommonUtils.isNullOrEmpty(stackTrace))\r\n logProperties.addToBag(\"StackTrace\", stackTrace);\r\n\r\n return logProperties;\r\n }\r\n\r\n private addPropertyBagValues(\r\n eventProperties: LogPropertyBag,\r\n transactionId?: string,\r\n source?: string\r\n ) {\r\n eventProperties = eventProperties || new LogPropertyBag();\r\n const appNameForTelemetry = this.getCurrentPartnerTelemetryName();\r\n eventProperties = FxpLogHelper.addEnvironmentDetails(\r\n eventProperties,\r\n transactionId,\r\n source,\r\n this.instrumentationKey,\r\n appNameForTelemetry\r\n );\r\n eventProperties = this.addUserRoleGroupDetails(eventProperties);\r\n eventProperties = this.addUserTenantDetails(eventProperties);\r\n eventProperties.addToBag(\r\n \"networkSpeed\",\r\n NetworkConnection.getInstance().getCurrentNetworkSpeed()\r\n );\r\n return eventProperties;\r\n }\r\n\r\n private addUserRoleGroupDetails(eventProperties: LogPropertyBag) {\r\n if (this.loggedInUserContext) {\r\n eventProperties.addToBag(\r\n RoleGroupDetails.LOGGEDINUSERROLEGROUPID,\r\n this.loggedInUserContext.RoleGroupId == undefined\r\n ? \"\"\r\n : this.loggedInUserContext.RoleGroupId\r\n );\r\n eventProperties.addToBag(\r\n RoleGroupDetails.LOGGEDINUSERROLEGROUPNAME,\r\n this.loggedInUserContext.RoleGroupName == undefined\r\n ? \"\"\r\n : this.loggedInUserContext.RoleGroupName\r\n );\r\n }\r\n if (this.isObo && this.OBOUserContext) {\r\n eventProperties.addToBag(\r\n RoleGroupDetails.OBOROLEGROUPID,\r\n this.OBOUserContext.RoleGroupId == undefined\r\n ? \"\"\r\n : this.OBOUserContext.RoleGroupId\r\n );\r\n eventProperties.addToBag(\r\n RoleGroupDetails.OBOROLEGROUPNAME,\r\n this.OBOUserContext.RoleGroupName == undefined\r\n ? \"\"\r\n : this.OBOUserContext.RoleGroupName\r\n );\r\n }\r\n return eventProperties;\r\n }\r\n\r\n /**\r\n * To add loggedIn user tenant properties that are common to all methods\r\n * @param properties\r\n */\r\n private addUserTenantDetails(eventProperties: LogPropertyBag) {\r\n if (this.loggedInUserContext) {\r\n eventProperties.addToBag(\r\n TenantDetails.LOGGEDINUSERTENANTKEY,\r\n this.loggedInUserContext == undefined\r\n ? \"\"\r\n : this.loggedInUserContext.TenantKey\r\n );\r\n eventProperties.addToBag(\r\n TenantDetails.LOGGEDINUSERTENANTNAME,\r\n this.loggedInUserContext.TenantName == undefined\r\n ? \"\"\r\n : this.loggedInUserContext.TenantName\r\n );\r\n }\r\n if (this.isObo && this.OBOUserContext) {\r\n eventProperties.addToBag(\r\n TenantDetails.OBOTENANTKEY,\r\n this.OBOUserContext == undefined ? \"\" : this.OBOUserContext.TenantKey\r\n );\r\n eventProperties.addToBag(\r\n TenantDetails.OBOTENANTNAME,\r\n this.OBOUserContext.TenantName == undefined\r\n ? \"\"\r\n : this.OBOUserContext.TenantName\r\n );\r\n }\r\n return eventProperties;\r\n }\r\n\r\n public getCorrelationId(correlationId?: string): string {\r\n if (!CommonUtils.isNullOrEmpty(correlationId)) return;\r\n if (this.correlationProvider)\r\n return this.correlationProvider.getCorrelationId();\r\n if (this._correlator) return this._correlator.getCorrelationId();\r\n if ($.correlator) return $.correlator.getCorrelationId();\r\n }\r\n\r\n public getSubCorrelationId(): string {\r\n if (this._correlator) return this._correlator.getSubCorrelationId();\r\n }\r\n\r\n /**\r\n * Method to renew the correlation identity.\r\n * @abstract\r\n * @method Fxp.telemetry.fxpLogger#renewCorrelationId\r\n */\r\n public renewCorrelationId() {\r\n if (this._correlator) return this._correlator.renewCorrelationId();\r\n }\r\n\r\n /**\r\n * Method to renew the sub correlation identity.\r\n * @abstract\r\n * @method Fxp.telemetry.fxpLogger#renewSubCorrelationId\r\n * @description Method to renew the sub correlation identity.\r\n */\r\n public renewSubCorrelationId() {\r\n if (this._correlator) return this._correlator.renewSubCorrelationId();\r\n }\r\n\r\n /**\r\n * logs error to console\r\n * @param exception\r\n */\r\n private internalCustomLog(exception) {\r\n console.error(TelemetryConstants.ERRORPREFIX + JSON.stringify(exception));\r\n }\r\n\r\n getDefaultPropertyBagValues(properties?: LogPropertyBag): LogPropertyBag {\r\n let propBag = properties || this.createPropertyBag();\r\n propBag = this.addPropertyBagValues(propBag);\r\n return propBag;\r\n }\r\n}\r\n","/**\r\n * A service to connect to FxpLoggerServiceExtension to log businessprocess,featureusage,systemevent etc.,\r\n * @class FxpTelemetry.FxpLoggerServiceExtension\r\n * @classdesc A service to connect to FxpLoggerServiceExtension to log businessprocess,featureusage,systemevent etc.,\r\n * @example Example to create an instance of FxpLoggerServiceExtension service\r\n * //Initializing Fxp FxpLoggerServiceExtension Service\r\n * angular.module('FxPApp').controller('AppController', ['FxpLoggerServiceExtension', AppController]);\r\n * function AppController(FxpLoggerServiceExtension){ FxpLoggerServiceExtension.logBusinessProcessEvent(); }\r\n */\r\n\r\nimport { LogPropertyBag } from './LogPropertyBag';\r\nimport { LogMetricBag } from './LogMetricBag';\r\nimport { BusinessProcessEvent } from './BusinessProcessEvent';\r\nimport { FeatureUsageEvent } from './FeatureUsageEvent';\r\nimport { SystemEvent } from './SystemEvent';\r\nimport { GlobalExceptionHandler } from './GlobalExceptionHandler';\r\nimport { AppInsights, Correlator } from \"@microsoftit/telemetry-extensions-npm/\";\r\n\r\nexport class FxpLoggerServiceExtension {\r\n\t//private msitInstance: any;\r\n\tprivate appIngishtInstance: AppInsights;\r\n\tprivate static fxpLoggerServiceExtension: FxpLoggerServiceExtension;\r\n\r\n\tconstructor() {\r\n\t}\r\n\r\n\t/**\r\n\t* Diagnostic method to log business process events\r\n\t* @method FxpTelemetry.FxpLoggerServiceExtension#init\r\n\t* @param {AppInsights} appIngisht - Application Insight Instance\r\n\t*/\r\n\tinit(appIngisht: AppInsights){\r\n\t\tthis.appIngishtInstance = appIngisht; \r\n\t\treturn this;\r\n\t}\r\n\r\n\tstatic getInstance() {\r\n\t\tif (!this.fxpLoggerServiceExtension){\r\n\t\t\tthis.fxpLoggerServiceExtension = new FxpLoggerServiceExtension(); \r\n\t\t}\r\n\t\treturn this.fxpLoggerServiceExtension; \r\n\t}\r\n\r\n\t/**\r\n\t* Diagnostic method to log business process events\r\n\t* @method FxpTelemetry.fxpLogger#logBusinessProcessEvent\r\n\t* @param {string} source - Source\r\n\t* @param {FeatureUsageEvent} eventData - event data that is to be logged\r\n\t* @param {Fxp.Telemetry.Helper.LogPropertyBag} properties - log properties\r\n\t* @param {Fxp.Telemetry.Helper.LogMetricBag} measurements - log metrics\r\n\t*/\r\n\tlogBusinessProcessEvent(eventData: BusinessProcessEvent, properties?: LogPropertyBag,\r\n\t\tmeasurements?:LogMetricBag) {\r\n\t this.appIngishtInstance.TrackBusinessProcessEvent(eventData, properties == null ? null : properties.getItems(), measurements == null ? null : measurements.getItems());\r\n\t}\r\n\r\n\t/**\r\n\t* Diagnostic method to log Feature Usage events\r\n\t* @method FxpTelemetry.FxpLoggerServiceExtension#logFeatureUsageEvent\r\n\t* @param {string} source - Source\r\n\t* @param {FeatureUsageEvent} eventData - event data that is to be logged\r\n\t* @param {Fxp.Telemetry.Helper.LogPropertyBag} properties - log properties\r\n\t* @param {Fxp.Telemetry.Helper.LogMetricBag} measurements - log metrics\r\n\t*/\r\n\tlogFeatureUsageEvent(eventData: FeatureUsageEvent, properties?: LogPropertyBag,\r\n\t\tmeasurements?: LogMetricBag) {\r\n\t\tthis.appIngishtInstance.TrackFeatureUsageEventV2(eventData, properties == null ? null : properties.getItems(), measurements == null ? null : measurements.getItems());\r\n\t}\r\n\r\n\tstartFeatureUsageEvent(featureUsageEvent: FeatureUsageEvent){\r\n this.appIngishtInstance.StartFeatureUsageEvent(featureUsageEvent); \r\n\t}\r\n\t\r\n endFeatureUsageEvent (featureUsageEvent: FeatureUsageEvent, properties?: LogPropertyBag){\r\n this.appIngishtInstance.EndFeatureUsageEvent(featureUsageEvent, properties == null ? null : properties.getItems()); \r\n }\r\n\r\n\t/**\r\n\t* Diagnostic method to log Track System events\r\n\t* @method FxpTelemetry.FxpLoggerServiceExtension#logTrackSystemEvent\r\n\t* @param {string} source - Source\r\n\t* @param {FeatureUsageEvent} eventData - event data that is to be logged\r\n\t* @param {Fxp.Telemetry.Helper.LogPropertyBag} properties - log properties\r\n\t* @param {Fxp.Telemetry.Helper.LogMetricBag} measurements - log metrics\r\n\t*/\r\n\tlogTrackSystemEvent(eventData: SystemEvent, properties?: LogPropertyBag,\r\n\t\tmeasurements?: LogMetricBag) {\r\n\t\tthis.appIngishtInstance.TrackSystemEvent(eventData, properties == null ? null : properties.getItems(), measurements == null ? null : measurements.getItems());\r\n\t}\r\n\t\r\n}","export enum FxpTelemActionStatus {\r\n Succeeded = \"Succeeded\",\r\n Failed = \"Failed\",\r\n NA = \"NA\"\r\n}\r\nexport enum FxpTelemActionType {\r\n User = \"User\",\r\n System = \"System\",\r\n Aware = \"Aware\"\r\n}\r\nexport enum FxpTelemEventName {\r\n PageLoad = \"PageLoad\",\r\n DropdownSelected = \"DropdownSelected\",\r\n DropdownChange = \"DropdownChange\",\r\n PageNavigation = \"PageNavigation\",\r\n CheckboxChange = \"CheckboxChange\",\r\n ListChange = \"ListChange\",\r\n ButtonClick = \"ButtonClick\",\r\n TabChange = \"TabChange\",\r\n TabNavigation = \"TabNavigation\",\r\n PanelOpened = \"PanelOpened\",\r\n PanelClosed = \"PanelClosed\",\r\n PickerSelected = \"PickerSelected\",\r\n PickerDeselected = \"PickerDeselected\",\r\n TileAdded = \"TileAdded\",\r\n TileClicked = \"TileClicked\",\r\n TileDeleted = \"TileDeleted\",\r\n TileLoaded = \"TileLoaded\",\r\n OnFocus = \"OnFocus\",\r\n OnBlur = \"OnBlur\",\r\n TextChange = \"TextChange\",\r\n Scroll = \"Scroll\",\r\n SectionRendering = \"SectionRendering\",\r\n BackEndAPICall = \"BackEndAPICall\",\r\n Rendering = \"Rendering\",\r\n NA = \"NA\",\r\n Hover = \"Hover\",\r\n LinkClicked = \"LinkClicked\"\r\n}","export class FxpTelemGuid {\r\n constructor(){}\r\n public create = (format?: string) => {\r\n function generateNumber() {\r\n return Math.floor((1 + Math.random()) * 0x10000)\r\n .toString(16)\r\n .substring(1);\r\n }\r\n let tmpGuid = (format == \"N\")\r\n ? generateNumber() + generateNumber() + generateNumber() + generateNumber() + generateNumber() + generateNumber() + generateNumber() + generateNumber()\r\n : generateNumber() + generateNumber() + '-' + generateNumber() + '-' + generateNumber() + '-' + generateNumber() + '-' + generateNumber() + generateNumber() + generateNumber();\r\n return tmpGuid;\r\n }\r\n public empty = (format?: string) => {\r\n if (format == \"N\") {\r\n return \"00000000000000000000000000000000\";\r\n }\r\n else {\r\n return \"00000000-0000-0000-0000-000000000000\";\r\n }\r\n }\r\n}","import { showSystemDownOverlay } from \"../utils/systemDownOverlay\";\r\nimport { TelemetryConstants } from \"./TelemetryConst\";\r\nimport { CommonUtils } from \"../utils/CommonUtils\";\r\nimport { LogPropertyBag } from \"./LogPropertyBag\";\r\nimport { FxpLoggerService } from \"./fxpLogger\";\r\n\r\nexport class GlobalExceptionHandler {\r\n\r\n\t\r\n\tprivate static telemetrySource = `${TelemetryConstants.FXP_TELEMETRY_BASE_NAME}.GlobalExceptionHandler`;\r\n\t\r\n\tprivate static get FxPLoggerService(): FxpLoggerService {\r\n\t\treturn FxpLoggerService.getInstance();\r\n\t}\r\n\r\n\t\r\n\t\r\n\t/**\r\n * @method Fxp.GlobalExceptionHandler.logFxpBootFailure to log Global Event when Fxp App Boot Fails and redirect to System down page.\r\n * @param {any} properties - extra details which needs to be logged.\r\n * @param {string} source - source from where it is triggered.\r\n * @param {boolean} isDefaultPropertiesAvailable flag to check if default parameters are passed or not\r\n * @param {boolean} headerText for system down page.\r\n * @param {boolean} descriptionText for system down page.\r\n */\r\n\tstatic logFxpBootFailure(properties: LogPropertyBag, source: string, headerText: string, descriptionText: string, pageTitle: string, isCSABlockedUser: boolean = false) {\r\n\t\tconst eventName = `${TelemetryConstants.FXP_TELEMETRY_PLATFORM_BOOTSTRAP}.FxPBootAppFailure`;\r\n\t\tconst sourceName = CommonUtils.isNullOrEmpty(source)? this.telemetrySource: source; \r\n\t\t\r\n\t\tif (!properties) {\r\n\t\t\tproperties = this.FxPLoggerService.createPropertyBag();\r\n\t\t}\r\n\t\tif (!isCSABlockedUser){\r\n\t\t\tproperties.addToBag('Reason', 'Failed to boot FxP App');\r\n\t\t}\r\n\t\telse {\r\n\t\t\tproperties.addToBag('Reason', 'CSA Blocked Profile');\r\n\t\t}\r\n\t\tthis.FxPLoggerService.logEvent(sourceName, eventName, properties); \r\n\t\tshowSystemDownOverlay(headerText, descriptionText, pageTitle, undefined, undefined, !isCSABlockedUser);\r\n\t}\r\n}\r\n","export class LogMetricBag {\r\n\tprivate metricBagInternal: any = {};\r\n\tconstructor() {\r\n\t}\r\n\r\n\taddToBag(key: string, value: number) {\r\n\t\tthis.metricBagInternal[key] = value;\r\n\t}\r\n\r\n\tgetItems() {\r\n\t\treturn this.metricBagInternal;\r\n\t}\r\n}\r\n","import { CommonUtils } from \"../utils/CommonUtils\";\r\n\r\nexport class LogPropertyBag {\r\n\tprivate propBagInternal: any = {};\r\n\tconstructor() {\r\n\t}\r\n\r\n\taddToBag(key: string, value: string): void {\r\n\t\tif(CommonUtils.isNullOrEmpty(value)){\r\n\t\t\tthis.propBagInternal[key] = value;\r\n\t\t}\r\n\t\telse if(CommonUtils.isObject(value)){\r\n\t\t\tlet stringVal = CommonUtils.objectToString(value);\r\n\t\t\tif(!CommonUtils.isNullOrEmpty(stringVal)){\r\n\t\t\t\tthis.propBagInternal[key] = CommonUtils.removePII(stringVal);\r\n\t\t\t}\r\n\t\t}\r\n\t\telse {\r\n\t\t\tthis.propBagInternal[key] = CommonUtils.removePII(String(value));\r\n\t\t}\r\n\t}\r\n\tgetItems(): any {\r\n\t\treturn this.propBagInternal;\r\n\t}\r\n\taddRange(propertyBag: LogPropertyBag) {\r\n\t\tvar properties = propertyBag.getItems();\r\n\r\n\t\tfor (var property in properties) {\r\n\t\t\tthis.addToBag(property, properties[property]);\r\n\t\t}\r\n\t}\r\n\tremoveFromBag(key: string) {\r\n\t\tdelete this.propBagInternal[key];\r\n\t}\r\n\tgetValue(key: string){\r\n\t\treturn this.propBagInternal[key];\r\n\t}\r\n\r\n}\r\n","\r\nimport * as MsitTelemetry from '@microsoftit/telemetry-extensions-npm';\r\n\r\nexport class SystemEvent extends MsitTelemetry.SystemEvent {\r\n \r\n\tconstructor(eventName: string, componentType: MsitTelemetry.ComponentType, systemMessage: string) {\r\n\t\tsuper(eventName, componentType, systemMessage);\r\n\t}\r\n}","import { DiagnosticLevel, TelemetryConfigDefaults } from \"./TelemetryConst\";\r\n\r\n/**\r\n * A service for creating an object of default telemetry configuration\r\n * @class Fxp.Telemetry.TelemetryConfiguration\r\n * @classdesc A service for creating an object of default telemetry configuration\r\n * @example Example to create an instance of this service \r\n * //Initializing this Service\r\n * var configuration = new Fxp.Telemetry.TelemetryConfiguration();\r\n */\r\nexport class TelemetryConfiguration {\r\n\tconstructor() {\r\n\r\n\t}\r\n\t//DiagnosticLevel value should be 'Error' OR 'Information' OR 'Warning' OR 'Off'\r\n\tDiagnosticLevel: DiagnosticLevel = DiagnosticLevel.Error;\r\n\t//EventEnabled value should be true OR false\r\n\tEventEnabled: boolean = true;\r\n\t//PerformanceMetricEnabled value should be true OR false\r\n\tPerformanceMetricEnabled: boolean = true;\r\n\tPerfMarkersEnabled: boolean = false;\r\n\tInstrumentationKey: string = TelemetryConfigDefaults.InstrumentationKey;\r\n\tDebugEnabled: boolean = false;\r\n\tEndPointUrl: string = TelemetryConfigDefaults.EndPointUrl;\r\n\r\n\t/**\r\n\t* Gets Default Configuration of telemetry \r\n\t* @method Fxp.Telemetry.TelemetryConfiguration.getDefaultConfiguration()\r\n\t* @example Example to invoke getUserThumbnail\r\n\t* var defaultConfig = Fxp.Telemetry.TelemetryConfiguration.getDefaultConfiguration();\r\n\t*/\r\n\tgetDefaultConfiguration() {\r\n\t\treturn this;\r\n\t}\r\n}","/**\r\n * Defines telemetry constants\r\n * @class Fxp.common.Telemetry\r\n */\r\nexport class TelemetryConstants {\r\n\tpublic static PAGENAME: string = 'PageName';\r\n\tpublic static PAGEVISITED: string = 'PageVisited';\r\n\tpublic static URL: string = 'Url';\r\n\tpublic static Duration: string = 'Duration';\r\n\tpublic static ERRORPREFIX: string = 'Error in fxp logger : ';\r\n\tpublic static CLASSNAME: string = 'ClassName';\r\n\tpublic static METHODNAME: string = \"MethodName\";\r\n\tpublic static FXP_TELEMETRY_BASE_NAME = 'FxpPlatform';\r\n\tpublic static FXP_TELEMETRY_PLATFORM_BOOTSTRAP = \"FxpPlatform.PlatformBootstrap\"\r\n\tpublic static USER_ALIAS = \"alias\";\r\n\tpublic static LOGGING_SOURCE = 'LoggingSource'; \r\n}\r\n\r\nexport class TelemetryEventType {\r\n\tpublic static AIFeatureUsageEvent: string = 'AI.FeatureUsageEvent';\r\n\tpublic static AIBusinessProcessEvent: string = 'AI.BusinessProcessEvent';\r\n}\r\n\r\nexport class TelemetryConfigDefaults {\r\n\tpublic static InstrumentationKey: string = 'bdacee2d-2b6a-41b6-8454-f0e155db2721';\r\n\tpublic static EndPointUrl: string = '';\r\n}\r\n\r\n/**\r\n* Defines trackinglevel constants\r\n* @class Fxp.common.TracingLevel\r\n*/\r\nexport class TracingLevel {\r\n\t/** \r\n\t* @member {string} Fxp.common.TracingLevel#ERROR   \r\n\t*/\r\n\tpublic static ERROR: string = 'Error';\r\n\r\n\t/** \r\n * @member {string} Fxp.common.TracingLevel#ERRORWITHMETRIC   \r\n */\r\n\tpublic static Metric: string = 'Metric';\r\n\r\n\t/** \r\n * @member {string} Fxp.common.TracingLevel#WARNING   \r\n */\r\n\tpublic static WARNING: string = 'Warning';\r\n\r\n\t/** \r\n * @member {string} Fxp.common.TracingLevel#WARNING   \r\n */\r\n\tpublic static TRACE: string = 'Trace';\r\n\r\n\t/** \r\n * @member {string} Fxp.common.TracingLevel#INFORMATION   \r\n */\r\n\tpublic static INFORMATION: string = 'Information';\r\n\r\n\t/** \r\n * @member {string} Fxp.common.TracingLevel#CUSTOMEVENT\r\n */\r\n\tpublic static CUSTOMEVENT: string = 'CustomEvent';\r\n}\r\n\r\nexport enum PouchSyncMode {\r\n\tPush,\r\n\tPull,\r\n\tBoth,\r\n\tNone\r\n}\r\n\r\nexport enum DiagnosticLevel {\r\n\tOff = 0,\r\n\tError = 1,\r\n\tWarning = 2,\r\n\tInfo = 3,\r\n\tVerbose = 4\r\n}\r\n\r\nexport class EventDataProperties {\r\n\tpublic static ACTIONURI: string = 'ActionUri';\r\n\tpublic static APPACTION: string = 'AppAction';\r\n\tpublic static COMPONENTTYPE: string = 'ComponentType';\r\n\tpublic static EVENTTYPE: string = 'EventType';\r\n\tpublic static TARGETENTITYKEY: string = 'TargetEntityKey';\r\n\tpublic static USERROLENAME: string = 'UserRoleName';\r\n\tpublic static XCV: string = 'Xcv';\r\n\tpublic static COMPONENTURI: string = 'ComponentUri';\r\n\tpublic static DURATION: string = 'Duration';\r\n}\r\n\r\nexport class EnvironmentData {\r\n\tpublic static ENVIRONMENTNAME: string = 'EnvironmentName';\r\n\tpublic static SERVICEOFFERING: string = 'ServiceOffering';\r\n\tpublic static SERVICELINE: string = 'ServiceLine';\r\n\tpublic static SERVICE: string = 'Service';\r\n\tpublic static COMPONENTID: string = 'ComponentId';\r\n\tpublic static COMPONENTNAME: string = 'ComponentName';\r\n\tpublic static XCV: string = 'Xcv';\r\n\tpublic static AIAPPKEY: string = 'AiAppKey';\r\n\tpublic static LOGGEDFROM: string = 'AppName';\r\n\tpublic static ICTOID: string = 'IctoId';\r\n\tpublic static BUSINESSPROCESSNAME: string = 'BusinessProcessName';\r\n\tpublic static BuildNumber: string = 'BuildNumber';\r\n\r\n}\r\n\r\nexport class RoleGroupDetails {\r\n\tpublic static LOGGEDINUSERROLEGROUPID: string = 'LoggedInUserRoleGroupId';\r\n\tpublic static LOGGEDINUSERROLEGROUPNAME: string = 'LoggedInUserRoleGroupName';\r\n\tpublic static OBOROLEGROUPID: string = 'OBOUserRoleGroupId';\r\n\tpublic static OBOROLEGROUPNAME: string = 'OBOUserRoleGroupName';\r\n}\r\nexport class TenantDetails {\r\n\tpublic static LOGGEDINUSERTENANTKEY: string = 'LoggedInUserTenantKey';\r\n\tpublic static LOGGEDINUSERTENANTNAME: string = 'LoggedInUserTenantName';\r\n\tpublic static OBOTENANTKEY: string = 'OBOUserTenantKey';\r\n\tpublic static OBOTENANTNAME: string = 'OBOUserTenantName';\r\n}\r\n","import { LogPropertyBag } from \"./LogPropertyBag\";\r\nimport { LogMetricBag } from \"./LogMetricBag\";\r\nimport { FxpLogHelper } from \"./FxpLogHelper\";\r\nimport { TelemetryContext } from \"./telemetrycontext\";\r\nimport { TracingLevel } from \"./TelemetryConst\";\r\n\r\n\r\n/**\r\n * Telmetry helper file to hold the object of telemetry.\r\n * @class Fxp.Telemetry.Helper.TelemetryData\r\n * @classdesc A telmetry helper file to hold the object of telemetry.\r\n * @example \r\n * //To Use Telemetry.Helper.TelemetryData\r\n * var telemetryData = new Fxp.Telemetry.Helper.TelemetryData();\r\n */\r\nexport class TelemetryData {\r\n\tlogType: string = \"\";\r\n\terrorMsg: string = \"\";\r\n\terrorCode: string = \"\";\r\n\tstackTrace: string = \"\";\r\n\tmetricName: string = \"\";\r\n\tmetricValue: number;\r\n\twarnMsg: string = \"\";\r\n\ttraceMsg: string = \"\";\r\n\tinfoMsg: string = \"\";\r\n\teventName: string = \"\";\r\n\tpropertyBag: LogPropertyBag = null;\r\n\tmetricBag: LogMetricBag = null;\r\n\ttransactionID: string = \"\";\r\n\r\n\t/**\r\n\t* Method to get the telemetry data object in json format.\r\n\t* @method Fxp.Telemetry.Helper.TelemetryData().toJsonString()\r\n\t* @example Example to use new Fxp.Telemetry.Helper.TelemetryData().toJsonString()\r\n\t*/\r\n\ttoJsonString(): string {\r\n\t\tvar jsonObject = this.toJson();\r\n\r\n\t\treturn JSON.stringify(jsonObject);\r\n\t}\r\n\r\n\t/**\r\n\t* Method to get the telemetry data object in json format.\r\n\t* @method Fxp.Telemetry.Helper.TelemetryData().toJson()\r\n\t* @example Example to use new Fxp.Telemetry.Helper.TelemetryData().toJson()\r\n\t*/\r\n\tprivate toJson(): any {\r\n\t\tvar jsonObject: any = {};\r\n\t\tvar context = TelemetryContext.getInstance();\r\n\r\n\t\tjsonObject.LogData = {\r\n\t\t\tLogInfo: {\r\n\t\t\t\tTransactionId: this.transactionID,\r\n\t\t\t\tTransactionTime: FxpLogHelper.getTimeStamp(),\r\n\t\t\t\tLogId: FxpLogHelper.getTelemetryUniqueKey()\r\n\t\t\t},\r\n\t\t\tContext: {\r\n\t\t\t\tSessionId: context.getSessionID(),\r\n\t\t\t\tUserId: context.getUserID(),\r\n\t\t\t\tUserRole: context.getUserRole(),\r\n\t\t\t\tAppName: context.getAppName(),\r\n\t\t\t\tAppVersion: context.getAppVersion(),\r\n\t\t\t\tGeography: context.getGeography()\r\n\t\t\t},\r\n\t\t\tTelemetryInfo: {\r\n\t\t\t\tType: this.logType,\r\n\t\t\t\tProperties: {}\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\tif (this.propertyBag != null) {\r\n\t\t\tjsonObject.LogData.TelemetryInfo.Properties = this.propertyBag.getItems();\r\n\t\t}\r\n\r\n\t\t//METRICS\r\n\t\tif (this.metricBag != null) {\r\n\t\t\tjsonObject.LogData.TelemetryInfo.Metrics = this.metricBag.getItems();\r\n\t\t}\r\n\r\n\t\tswitch (this.logType) {\r\n\t\t\tcase TracingLevel.ERROR:\r\n\t\t\t\tjsonObject.LogData.TelemetryInfo.ErrorMsg = this.errorMsg;\r\n\t\t\t\tjsonObject.LogData.TelemetryInfo.ErrorCode = this.errorCode;\r\n\t\t\t\tbreak;\r\n\t\t\tcase TracingLevel.WARNING:\r\n\t\t\t\tjsonObject.LogData.TelemetryInfo.WarnMsg = this.warnMsg;\r\n\t\t\t\tbreak;\r\n\t\t\tcase TracingLevel.TRACE:\r\n\t\t\t\tjsonObject.LogData.TelemetryInfo.TraceMsg = this.traceMsg;\r\n\t\t\t\tbreak;\r\n\t\t\tcase TracingLevel.INFORMATION:\r\n\t\t\t\tjsonObject.LogData.TelemetryInfo.InfoMsg = this.infoMsg;\r\n\t\t\t\tbreak;\r\n\t\t\tcase TracingLevel.CUSTOMEVENT:\r\n\t\t\t\tjsonObject.LogData.TelemetryInfo.EventName = this.eventName;\r\n\t\t\t\tbreak;\r\n\t\t\tcase TracingLevel.Metric:\r\n\t\t\t\tjsonObject.LogData.TelemetryInfo.MetricName = this.metricName;\r\n\t\t\t\tjsonObject.LogData.TelemetryInfo.MetricValue = this.metricValue;\r\n\t\t}\r\n\r\n\t\treturn jsonObject.LogData;\r\n\t}\r\n}","export class UserInfo {\r\n\tpublic userId: string;\r\n\tpublic userRole: string;\r\n\r\n\tconstructor(private _userId: string, private _userRole: string) {\r\n\t\tthis.userId = _userId;\r\n\t\tthis.userRole = _userRole;\r\n\t}\r\n}","import { ILogger } from \"../interfaces/ILogger\";\r\nimport { IFxPService } from \"../interfaces/IFxpService\";\r\nimport { ICorrelationProvider } from \"../interfaces/ICorrelationProvider\";\r\nimport { BusinessProcessEvent } from \"./BusinessProcessEvent\";\r\nimport { FeatureUsageEvent } from \"./FeatureUsageEvent\";\r\nimport { LogMetricBag } from \"./LogMetricBag\";\r\nimport { LogPropertyBag } from \"./LogPropertyBag\";\r\nimport { SystemEvent } from \"./SystemEvent\";\r\nimport {\r\n AppInsights,\r\n Correlator,\r\n EnvironmentValues,\r\n FeatureUsageEventV2,\r\n} from \"@microsoftit/telemetry-extensions-npm\";\r\nimport { ClickAnalyticsPlugin } from \"@microsoft/applicationinsights-clickanalytics-js\";\r\nimport { TelemetryContext } from \"./telemetrycontext\";\r\nimport { FxpLogHelper } from \"./FxpLogHelper\";\r\nimport { ITelemetryContextListener } from \"../interfaces/ITelemetryContextListener\";\r\nimport { CommonUtils } from \"../utils/CommonUtils\";\r\nimport { ErrorSeverityLevel } from \"./ErrorSeverityLevel\";\r\nimport { RoleGroupInfo, TenantInfo } from \"../common/ApplicationConstants\";\r\nimport {\r\n RoleGroupDetails,\r\n TelemetryConstants,\r\n TenantDetails,\r\n} from \"./TelemetryConst\";\r\nimport {\r\n IPageViewTelemetry,\r\n IMetricTelemetry,\r\n} from \"@microsoft/applicationinsights-common\";\r\nimport { FxpLoggerServiceExtension } from \"./FxpLoggerServiceExtension\";\r\nimport { NetworkConnection } from \"./network-connection\";\r\n\r\ndeclare type Envelope = any;\r\nconst PerfMarkerPrefix: string = \"Perf\";\r\n/**\r\n * A service for telemetry logging\r\n * @class FxpLoggerService\r\n * @classdesc A service to instrument data in Telemetry\r\n */\r\nexport class FxpLoggerService\r\n implements ILogger, IFxPService, ITelemetryContextListener\r\n{\r\n private _appInsight: AppInsights;\r\n private _environmentValues: EnvironmentValues;\r\n private _context: TelemetryContext;\r\n private _correlator: Correlator;\r\n private static _loggerServiceInstance: FxpLoggerService;\r\n private loggedInUserContext: any;\r\n private OBOUserContext: any;\r\n private isObo: boolean;\r\n private correlationProvider: ICorrelationProvider;\r\n private instrumentationKey: string;\r\n private pageLoadMetric: any;\r\n private _loggerServiceExtenstion: FxpLoggerServiceExtension;\r\n private _events: {\r\n [key: string]: number;\r\n };\r\n\r\n private constructor() {\r\n //this.init();\r\n }\r\n\r\n private init() {\r\n let FxpAppSettings: any = window[\"FxpAppSettings\"];\r\n let FxpBaseConfiguration: any = window[\"FxpBaseConfiguration\"];\r\n if (!this._appInsight) {\r\n this._events = {};\r\n this._appInsight = new AppInsights();\r\n this.instrumentationKey =\r\n FxpBaseConfiguration.Telemetry.InstrumentationKey;\r\n const clickPluginInstance = new ClickAnalyticsPlugin();\r\n // Click Analytics configuration\r\n const clickPluginConfig = {\r\n autoCapture: true,\r\n dataTags: {\r\n useDefaultContentNameOrId: true,\r\n captureAllMetaDataContent: true,\r\n },\r\n };\r\n // Application Insights Configuration\r\n const configObj = {\r\n instrumentationKey: FxpBaseConfiguration.Telemetry.InstrumentationKey,\r\n extensions: [clickPluginInstance],\r\n extensionConfig: {\r\n [clickPluginInstance.identifier]: clickPluginConfig,\r\n },\r\n };\r\n this._environmentValues = new EnvironmentValues(\r\n FxpAppSettings.EnvironmentName,\r\n FxpAppSettings.ServiceOffering,\r\n FxpAppSettings.ServiceLine,\r\n FxpAppSettings.Service,\r\n FxpAppSettings.ComponentName,\r\n FxpAppSettings.ComponentId,\r\n FxpAppSettings.IctoId\r\n );\r\n this._appInsight.InitializeTelemetryWithConfiguration(\r\n this._environmentValues,\r\n configObj\r\n );\r\n\r\n this._context = TelemetryContext.getInstance();\r\n this._context.initUserSession();\r\n this.setContextInfo();\r\n this._context.addContextChangeListener(this);\r\n this._correlator = new Correlator();\r\n $.correlator = this._correlator;\r\n const telemetryInitializer = {\r\n init: (envelope: Envelope) => {\r\n try {\r\n const telemetryItem = envelope.baseData;\r\n this.telemetryInitializerInit(\r\n telemetryItem,\r\n FxpBaseConfiguration.Telemetry.InstrumentationKey\r\n );\r\n } finally {\r\n envelope.tags[\"ai.cloud.role\"] = \"FxP-Client\";\r\n return true;\r\n }\r\n },\r\n };\r\n this._appInsight.appInsights.addTelemetryInitializer(\r\n telemetryInitializer.init\r\n );\r\n this._appInsight.AddMsitTelemetryInitializers(this._correlator);\r\n this._loggerServiceExtenstion =\r\n FxpLoggerServiceExtension.getInstance().init(this._appInsight);\r\n }\r\n }\r\n\r\n /**\r\n * Static method to get instance of FxpLoggerService\r\n * @abstract\r\n * @method Fxp.telemetry.fxpLogger#getInstance\r\n * @returns {FxpLoggerService} - Returns instance of FxpLoggerService\r\n */\r\n static getInstance(): FxpLoggerService {\r\n if (!this._loggerServiceInstance) {\r\n this._loggerServiceInstance = new FxpLoggerService();\r\n this._loggerServiceInstance.init();\r\n }\r\n return this._loggerServiceInstance;\r\n }\r\n\r\n notify() {\r\n this.setContextInfo();\r\n }\r\n\r\n private setContextInfo() {\r\n this._appInsight.appInsights.context.session.id =\r\n this._context.getSessionID();\r\n this._appInsight.appInsights.context.application.ver =\r\n this._context.getAppVersion();\r\n }\r\n\r\n private telemetryInitializerInit(\r\n telemetryItem: any,\r\n instrumentationKey: string\r\n ): void {\r\n const telemetryAppName = this.getCurrentPartnerTelemetryName();\r\n const properties = FxpLogHelper.addEnvironmentDetails(\r\n new LogPropertyBag(),\r\n null,\r\n null,\r\n instrumentationKey,\r\n telemetryAppName\r\n );\r\n let finalProperties = {};\r\n\r\n if (telemetryItem.properties) {\r\n finalProperties = Object.assign(\r\n {},\r\n telemetryItem.properties,\r\n properties.getItems()\r\n );\r\n }\r\n\r\n if (finalProperties[\"AppName\"] && finalProperties[\"AppName\"] === \"Fxp\") {\r\n finalProperties[\"AppName\"] = TelemetryConstants.FXP_TELEMETRY_BASE_NAME;\r\n }\r\n\r\n telemetryItem.properties = finalProperties;\r\n }\r\n\r\n private getCurrentPartnerTelemetryName(): string {\r\n const ngInjector = angular.element(document.body).injector();\r\n if (!ngInjector) return;\r\n\r\n const stateService: any = ngInjector.get(\"$state\");\r\n if (!stateService) return;\r\n\r\n const currentState = stateService.current;\r\n return currentState.data ? currentState.data.partnerTelemetryName : null;\r\n }\r\n\r\n /**\r\n * Diagnostic method to log error in telemetry\r\n * @abstract\r\n * @method Fxp.telemetry.fxpLogger#logError\r\n * @param {string} source - Source where this exception originated. It should be in Format ..\r\n * @param {string} message - Error Message.\r\n * @param {string} errorCode - Error Code or Error Constant.\r\n * @param {string} stackTrace - StackTrace of the Error.\r\n * @param {LogPropertyBag} properties - Properties for the customDimensions.\r\n * @param {LogMetricBag} measurements - measurements to be logged in customDimensions.\r\n * @param {string} transactionId - Transaction id or Operation id of the transaction.\r\n * @param {ErrorSeverityLevel} severityLevel - Severity Level of the error.\r\n */\r\n logError(\r\n source: string,\r\n message: string,\r\n errorCode: string,\r\n stackTrace?: string,\r\n properties?: LogPropertyBag,\r\n measurements?: LogMetricBag,\r\n transactionId?: string,\r\n severityLevel?: ErrorSeverityLevel\r\n ): void {\r\n try {\r\n let error = new Error();\r\n error.message = CommonUtils.removePII(message);\r\n error.stack = CommonUtils.removePII(stackTrace);\r\n this.logException(\r\n source,\r\n error,\r\n properties,\r\n measurements,\r\n transactionId,\r\n severityLevel,\r\n errorCode\r\n );\r\n } catch (exception) {\r\n this.internalCustomLog(exception);\r\n }\r\n }\r\n\r\n /**\r\n * Diagnostic method to log exception object\r\n * @abstract\r\n * @method Fxp.telemetry.fxpLogger#logError\r\n * @param {string} source - Source where this exception originated. It should be in Format ..\r\n * @param {Error} exception - Exception object.\r\n * @param {LogPropertyBag} properties - Properties for the customDimensions.\r\n * @param {LogMetricBag} measurements - measurements to be logged in customDimensions.\r\n * @param {string} transactionId - Transaction id or Operation id of the transaction.\r\n * @param {ErrorSeverityLevel} severityLevel - Severity Level of the error.\r\n * @param {string} errorCode - Error Code or Error Constant.\r\n */\r\n logException(\r\n source: string,\r\n exception: Error,\r\n properties?: LogPropertyBag,\r\n measurements?: LogMetricBag,\r\n transactionId?: string,\r\n severityLevel?: ErrorSeverityLevel,\r\n errorCode?: string\r\n ): void {\r\n try {\r\n exception.stack = CommonUtils.removePII(exception?.stack);\r\n exception.message = CommonUtils.removePII(exception?.message);\r\n exception.name = CommonUtils.removePII(exception?.name);\r\n errorCode = CommonUtils.removePII(errorCode);\r\n properties = this.setTransactionIdAndCommonProperties(\r\n source,\r\n transactionId,\r\n properties,\r\n errorCode,\r\n exception.stack\r\n );\r\n this._appInsight.TrackException(\r\n exception,\r\n severityLevel,\r\n properties.getItems(),\r\n measurements == null ? null : measurements.getItems()\r\n );\r\n } catch (exception) {\r\n this.internalCustomLog(exception);\r\n }\r\n }\r\n\r\n /**\r\n * Creates and returns a new instance of LogPropertyBag object.\r\n * @abstract\r\n * @method Fxp.telemetry.fxpLogger#createMetricBag\r\n * @returns {LogPropertyBag}\r\n */\r\n createPropertyBag(): LogPropertyBag {\r\n return FxpLogHelper.createPropertyBag();\r\n }\r\n\r\n /**\r\n * Creates and returns a new instance of LogmetricBag object.\r\n * @abstract\r\n * @method Fxp.telemetry.fxpLogger#createMetricBag\r\n * @returns {LogMetricBag}\r\n */\r\n createMetricBag(): LogMetricBag {\r\n return FxpLogHelper.createMetricBag();\r\n }\r\n\r\n /**\r\n * Diagnostic method to log warnings which will be captured in customEvents of application insights with EventType as Warning\r\n * @abstract\r\n * @method Fxp.telemetry.fxpLogger#logWarning\r\n * @param {string} source - Source from where the Warning is logged. It should be in Format ..\r\n * @param {string} message - Warning Message.\r\n * @param {LogPropertyBag} properties - Properties for the customDimensions.\r\n * @param {LogMetricBag} measurements - measurements to be logged in customDimensions.\r\n * @param {string} transactionId - Transaction id or Operation id of the transaction.\r\n */\r\n logWarning(\r\n source: string,\r\n message: string,\r\n properties?: LogPropertyBag,\r\n measurements?: LogMetricBag,\r\n transactionId?: string\r\n ): void {\r\n try {\r\n if (!properties) {\r\n properties = this.createPropertyBag();\r\n }\r\n properties.addToBag(\"EventType\", \"Warning\");\r\n this.logEvent(source, message, properties, measurements, transactionId);\r\n } catch (exception) {\r\n this.internalCustomLog(exception);\r\n }\r\n }\r\n\r\n /**\r\n * Diagnostic method to log Information which will be captured in customEvents of application insights with EventType as Information\r\n * @abstract\r\n * @method Fxp.telemetry.fxpLogger#logInformation\r\n * @param {string} message - Information Message\r\n * @param {LogPropertyBag} properties - Properties for the customDimensions.\r\n * @param {LogMetricBag} measurements - measurements to be logged in customDimensions.\r\n * @param {string} transactionId - Transaction id or Operation id of the transaction.\r\n */\r\n logInformation(\r\n source: string,\r\n message: string,\r\n properties?: LogPropertyBag,\r\n measurements?: LogMetricBag,\r\n transactionId?: string\r\n ): void {\r\n try {\r\n if (!properties) {\r\n properties = this.createPropertyBag();\r\n }\r\n properties.addToBag(\"EventType\", \"Information\");\r\n this.logEvent(source, message, properties, measurements, transactionId);\r\n } catch (exception) {\r\n this.internalCustomLog(exception);\r\n }\r\n }\r\n\r\n /**\r\n * Diagnostic method to log Events which will be captured in customEvents of application insights.\r\n * @abstract\r\n * @method Fxp.telemetry.fxpLogger#logCustomEvents\r\n * @param {string} source - Source from where the Event is getting logged. It should be in Format ..\r\n * @param {string} eventName - Event Name to be logged.\r\n * @param {LogPropertyBag} properties - Properties for the customDimensions.\r\n * @param {LogMetricBag} measurements - measurements to be logged in customDimensions.\r\n * @param {string} transactionId - Transaction id or Operation id of the transaction.\r\n */\r\n logEvent(\r\n source: string,\r\n eventName: string,\r\n properties?: LogPropertyBag,\r\n measurements?: LogMetricBag,\r\n transactionId?: string\r\n ): void {\r\n try {\r\n properties = this.setTransactionIdAndCommonProperties(\r\n source,\r\n transactionId,\r\n properties\r\n );\r\n this._appInsight.TrackEvent(\r\n eventName,\r\n properties.getItems(),\r\n measurements\r\n );\r\n } catch (exception) {\r\n this.internalCustomLog(exception);\r\n }\r\n }\r\n\r\n /**\r\n * Diagnostic method to Track Page Views in telemetry\r\n * @abstract\r\n * @method Fxp.telemetry.fxpLogger#logPageView\r\n * @param {string} source - Source from where this is getting logged. It should be in Format ..\r\n * @param pageName - Name of the visited page as string\r\n * @param {string} url - Url of the visited page.\r\n * @param {LogPropertyBag} properties - Properties for the customDimensions.\r\n * @param {LogMetricBag} measurements - measurements to be logged in customDimensions.\r\n * @param {number} duration - Time took to load the page. The value should be a positive integer.\r\n * @param {string} transactionId - Transaction id or Operation id of the transaction.\r\n */\r\n logPageView(\r\n source: string,\r\n pageName: string,\r\n url?: string,\r\n properties?: LogPropertyBag,\r\n measurements?: LogMetricBag,\r\n duration?: number,\r\n transactionId?: string\r\n ): void {\r\n try {\r\n properties = this.setTransactionIdAndCommonProperties(\r\n source,\r\n transactionId,\r\n properties\r\n );\r\n if (!measurements) {\r\n measurements = this.createMetricBag();\r\n }\r\n if (duration) {\r\n measurements.addToBag(`${pageName}-LoadDuration`, duration);\r\n }\r\n let pageViewTelemetry: IPageViewTelemetry = {\r\n name: pageName,\r\n uri: url,\r\n refUri: null,\r\n pageType: null,\r\n isLoggedIn: null,\r\n properties: properties.getItems(),\r\n measurements: measurements.getItems(),\r\n };\r\n this._appInsight.appInsights.trackPageView(pageViewTelemetry);\r\n } catch (exception) {\r\n this.internalCustomLog(exception);\r\n }\r\n }\r\n\r\n /**\r\n * OBSOLETE Method. Diagnostic method to Track Page Views\r\n * @abstract\r\n * @method Fxp.telemetry.fxpLogger#trackPageView\r\n * @param {string} url - Url of the visited page.\r\n * @param {LogPropertyBag} properties - Properties for the customDimensions.\r\n * @param {LogMetricBag} measurements - measurements to be logged in customDimensions.\r\n * @param duration - Time took to load the page. The value should be a number.\r\n * @deprecated - This method is deprecated and will be removed in future. Please use logPageView method instead.\r\n */\r\n trackPageView(\r\n url?: string,\r\n properties?: LogPropertyBag,\r\n measurements?: LogMetricBag,\r\n duration?: number,\r\n transactionId?: string\r\n ): void {\r\n try {\r\n this.logPageView(null, null, url, properties, measurements, duration);\r\n } catch (exception) {\r\n this.internalCustomLog(exception);\r\n }\r\n }\r\n\r\n /**\r\n * Diagnostic method to Track Metrics in telemetry\r\n * @abstract\r\n * @method Fxp.telemetry.fxpLogger#logMetric\r\n * @param {string} source - Source from where this is getting logged. It should be in Format ..\r\n * @param {string} metricName - Name of the metric.\r\n * @param {number} metricValue - The value of the metric as number.\r\n * @param {LogPropertyBag} properties - Properties for the customDimensions.\r\n * @param {string} transactionId - Transaction id or Operation id of the transaction.\r\n */\r\n logMetric(\r\n source: string,\r\n metricName: string,\r\n metricValue: number,\r\n properties?: LogPropertyBag,\r\n transactionId?: string\r\n ): void {\r\n try {\r\n properties = this.setTransactionIdAndCommonProperties(\r\n source,\r\n transactionId,\r\n properties\r\n );\r\n let metricTelemetry: IMetricTelemetry = {\r\n name: metricName,\r\n average: metricValue,\r\n properties: properties.getItems(),\r\n };\r\n this._appInsight.appInsights.trackMetric(metricTelemetry);\r\n } catch (exception) {\r\n this.internalCustomLog(exception);\r\n }\r\n }\r\n\r\n /**\r\n * Method to start tracking FeatureUsageEvent.\r\n * @description Method to start tracking FeatureUsageEvent.\r\n * @abstract\r\n * @method Fxp.telemetry.fxpLogger#logSystemEvent\r\n * @param {FeatureUsageEvent} featureUsageEvent - Instance of FeatureUsageEvent type.\r\n */\r\n startFeatureUsageEvent(featureUsageEvent: FeatureUsageEvent) {\r\n this._loggerServiceExtenstion.startFeatureUsageEvent(featureUsageEvent);\r\n }\r\n\r\n /**\r\n * Method to complete tracking FeatureUsageEvent.\r\n * @description Method to complete tracking FeatureUsageEvent.\r\n * @abstract\r\n * @method Fxp.telemetry.fxpLogger#endFeatureUsageEvent\r\n * @param {string} source - Source from where this is getting logged. It should be in Format ..\r\n * @param {FeatureUsageEvent} featureUsageEvent - Instance of SystemEvent type.\r\n * @param {LogPropertyBag} properties - Properties for the customDimensions.\r\n * @param {string} transactionId - Transaction id or Operation id of the transaction.\r\n */\r\n endFeatureUsageEvent(\r\n source: string,\r\n featureUsageEvent: FeatureUsageEvent,\r\n properties?: LogPropertyBag,\r\n transactionId?: any\r\n ) {\r\n properties = this.setTransactionIdAndCommonProperties(\r\n source,\r\n transactionId,\r\n properties\r\n );\r\n this._loggerServiceExtenstion.endFeatureUsageEvent(\r\n featureUsageEvent,\r\n properties\r\n );\r\n }\r\n\r\n /**\r\n * Diagnostic method to log Feature Usage in telemetry. This method can be used for tracking single session workflows.\r\n * @abstract\r\n * @method Fxp.telemetry.fxpLogger#logFeatureUsageEvent\r\n * @param {string} source - Source from where this is getting logged. It should be in Format ..\r\n * @param {FeatureUsageEvent} eventData - Instance of FeatureUsageEvent.\r\n * @param {LogPropertyBag} properties - Properties for the customDimensions.\r\n * @param {LogMetricBag} measurements - measurements to be logged in customDimensions.\r\n * @param {string} transactionId - Transaction id or Operation id of the transaction.\r\n */\r\n logFeatureUsageEvent(\r\n source: string,\r\n eventData: FeatureUsageEvent,\r\n properties?: LogPropertyBag,\r\n measurements?: LogMetricBag,\r\n transactionId?: any\r\n ): void {\r\n try {\r\n properties = this.setTransactionIdAndCommonProperties(\r\n source,\r\n transactionId,\r\n properties\r\n );\r\n this._loggerServiceExtenstion.logFeatureUsageEvent(\r\n eventData,\r\n properties,\r\n measurements\r\n );\r\n } catch (exception) {\r\n this.internalCustomLog(exception);\r\n }\r\n }\r\n\r\n /**\r\n * Diagnostic method to log Business Process Event in telemetry.\r\n * @abstract\r\n * @method Fxp.telemetry.fxpLogger#logBusinessProcessEvent\r\n * @param {string} source - Source from where this is getting logged. It should be in Format ..\r\n * @param {BusinessProcessEvent} eventData - Instance of FeatureUsageEvent.\r\n * @param {LogPropertyBag} properties - Properties for the customDimensions.\r\n * @param {LogMetricBag} measurements - measurements to be logged in customDimensions.\r\n * @param {string} transactionId - Transaction id or Operation id of the transaction.\r\n */\r\n logBusinessProcessEvent(\r\n source: string,\r\n eventData: BusinessProcessEvent,\r\n properties?: LogPropertyBag,\r\n measurements?: LogMetricBag,\r\n transactionId?: any\r\n ): void {\r\n try {\r\n properties = this.setTransactionIdAndCommonProperties(\r\n source,\r\n transactionId,\r\n properties\r\n );\r\n this._loggerServiceExtenstion.logBusinessProcessEvent(\r\n eventData,\r\n properties,\r\n measurements\r\n );\r\n } catch (exception) {\r\n this.internalCustomLog(exception);\r\n }\r\n }\r\n\r\n /**\r\n * Diagnostic method to log trace information in telemetry.\r\n * @abstract\r\n * @method Fxp.telemetry.fxpLogger#logTrace\r\n * @param {string} source - Source from where this is getting logged. It should be in Format ..\r\n * @param {string} message - Trace message.\r\n * @param {LogPropertyBag} properties - Properties for the customDimensions.\r\n * @param {LogMetricBag} measurements - measurements to be logged in customDimensions.\r\n * @param {string} transactionId - Transaction id or Operation id of the transaction.\r\n */\r\n logTrace(\r\n source: string,\r\n message: string,\r\n properties?: LogPropertyBag,\r\n transactionId?: string\r\n ): void {\r\n try {\r\n properties = this.setTransactionIdAndCommonProperties(\r\n source,\r\n transactionId,\r\n properties\r\n );\r\n this._appInsight.TrackTrace(message, properties.getItems());\r\n } catch (exception) {\r\n this.internalCustomLog(exception);\r\n }\r\n }\r\n\r\n /**\r\n * Internal method to Set the correlationProvider object for FxpLoggerService. This method should only be invoked from Platform during initialization.\r\n * @abstract\r\n * @method Fxp.telemetry.fxpLogger#setCorrelationProvider\r\n * @param {ICorrelationProvider} correlationProvider - Instance of ICorrelationProvider\r\n */\r\n setCorrelationProvider(correlationProvider: ICorrelationProvider) {\r\n this.correlationProvider = correlationProvider;\r\n }\r\n\r\n /**\r\n * Method to start performance tracking.\r\n * @abstract\r\n * @method Fxp.telemetry.fxpLogger#startTrackPerformance\r\n * @param {string} eventName - Name of the event\r\n * @param {string} transactionId - Transaction id or Operation id of the transaction.\r\n */\r\n startTrackPerformance(eventName: string, transactionId?: any): void {\r\n const metricName = PerfMarkerPrefix + eventName;\r\n try {\r\n if (!CommonUtils.isNullOrEmpty(this._events[metricName])) {\r\n console.warn(\r\n \"Start was called before calling stop for event : \" + metricName\r\n );\r\n } else {\r\n this._events[metricName] = performance.now();\r\n }\r\n } catch (exception) {\r\n this.internalCustomLog(exception);\r\n }\r\n }\r\n\r\n /**\r\n * Method to complete performance tracking.\r\n * @abstract\r\n * @method Fxp.telemetry.fxpLogger#stopTrackPerformance\r\n * @param {string} eventName - Name of the event\r\n * @param {LogPropertyBag} properties - Properties for the customDimensions.\r\n * @param {LogMetricBag} measurements - measurements to be logged in customDimensions.\r\n * @param {string} transactionId - Transaction id or Operation id of the transaction.\r\n */\r\n stopTrackPerformance(\r\n eventName: string,\r\n source?: string,\r\n properties?: LogPropertyBag,\r\n measurements?: LogMetricBag,\r\n transactionId?: any\r\n ): void {\r\n const metricName = PerfMarkerPrefix + eventName;\r\n const start = this._events[metricName];\r\n\r\n if (isNaN(start)) {\r\n console.warn(\r\n \"Stop was called before calling start for event : \" + eventName\r\n );\r\n } else {\r\n const duration = performance.now() - start;\r\n delete this._events[eventName];\r\n this._events[eventName] = undefined;\r\n if (CommonUtils.isNullOrEmpty(measurements)) {\r\n measurements = new LogMetricBag();\r\n }\r\n\r\n try {\r\n measurements.addToBag(metricName, duration);\r\n properties = this.setTransactionIdAndCommonProperties(\r\n source,\r\n transactionId,\r\n properties\r\n );\r\n properties.addToBag(\"Unit\", \"Milliseconds\");\r\n let metricTelemetry: IMetricTelemetry = {\r\n name: metricName,\r\n average: duration,\r\n properties: properties.getItems(),\r\n };\r\n\r\n this._appInsight.appInsights.trackMetric(metricTelemetry);\r\n } catch (exception) {\r\n this.internalCustomLog(exception);\r\n }\r\n }\r\n }\r\n\r\n getPageLoadMetrics() {\r\n return this.pageLoadMetric;\r\n }\r\n\r\n setPageLoadMetrics(value: any) {\r\n this.pageLoadMetric = value;\r\n }\r\n\r\n logPageLoadMetrics(pageLoadTime?: number): void {\r\n try {\r\n var pageLoadMetricsCalled = performance.now();\r\n var propBag = this.createPropertyBag();\r\n var pageLoadData = this.pageLoadMetric;\r\n\r\n pageLoadData.totalDuration = performance.now() - pageLoadData.startTime;\r\n\r\n if (\r\n !CommonUtils.isNullOrEmpty(pageLoadData.sourceRoute) &&\r\n !CommonUtils.isNullOrEmpty(pageLoadData.destinationRoute)\r\n ) {\r\n if (\r\n pageLoadTime != null &&\r\n pageLoadTime != undefined &&\r\n typeof pageLoadTime == \"number\"\r\n ) {\r\n pageLoadData.pageLoadDuration = pageLoadTime;\r\n } else pageLoadData.pageLoadDuration = 0;\r\n\r\n propBag.addToBag(\"pageDisplayName\", pageLoadData.pageDisplayName);\r\n propBag.addToBag(\"sourceRoute\", pageLoadData.sourceRoute);\r\n propBag.addToBag(\r\n \"sourceRouteURL\",\r\n CommonUtils.isNullOrEmpty(pageLoadData.sourceRouteURL)\r\n ? \"No_SourceRouteURL_Found\"\r\n : pageLoadData.sourceRouteURL\r\n );\r\n propBag.addToBag(\"destinationRoute\", pageLoadData.destinationRoute);\r\n propBag.addToBag(\r\n \"destinationRouteURL\",\r\n CommonUtils.isNullOrEmpty(pageLoadData.destinationRouteURL)\r\n ? \"No_DestinationRouteURL_Found\"\r\n : pageLoadData.destinationRouteURL\r\n );\r\n propBag.addToBag(\r\n \"pageTransitionStatus\",\r\n pageLoadData.pageTransitionStatus\r\n );\r\n propBag.addToBag(\r\n \"stateChangeDuration\",\r\n pageLoadData.stateChangeDuration.toString()\r\n );\r\n propBag.addToBag(\r\n \"preStateDuration\",\r\n pageLoadData.preStateDuration.toString()\r\n );\r\n propBag.addToBag(\"error\", pageLoadData.pageLoadError);\r\n propBag.addToBag(\r\n \"partnerPageLoadDuration\",\r\n pageLoadData.pageLoadDuration.toString()\r\n );\r\n propBag.addToBag(\r\n \"totalDuration\",\r\n pageLoadData.totalDuration.toString()\r\n );\r\n propBag.addToBag(\r\n \"thresholdCrossed\",\r\n pageLoadData.threshold.thresholdCrossed.toString()\r\n );\r\n propBag.addToBag(\r\n \"thresholdValue\",\r\n pageLoadData.threshold.thresholdValue.toString()\r\n );\r\n\r\n // Temp properties added for trouble shooting\r\n propBag.addToBag(\"startTime\", pageLoadData.startTime.toString());\r\n propBag.addToBag(\r\n \"$rootScope.startTime\",\r\n CommonUtils.isNullOrEmpty(pageLoadData.rootscopestartTime)\r\n ? \"0\"\r\n : pageLoadData.rootscopestartTime.toString()\r\n );\r\n propBag.addToBag(\r\n \"$rootScope.stateChangeStartTime\",\r\n CommonUtils.isNullOrEmpty(pageLoadData.stateChangeStartTime)\r\n ? \"0\"\r\n : pageLoadData.stateChangeStartTime.toString()\r\n );\r\n propBag.addToBag(\r\n \"pageLoadMetricsCalled\",\r\n pageLoadMetricsCalled.toString()\r\n );\r\n this.logEvent(\r\n pageLoadData.sourceRoute,\r\n \"FxpTelemetry.PageMetrics\",\r\n propBag\r\n );\r\n }\r\n } catch (exception) {\r\n this.internalCustomLog(exception);\r\n }\r\n }\r\n\r\n setLoggedInUserContext(\r\n loggedInUserRoleId: string,\r\n loggedInUserRoleName: string,\r\n isOBO: boolean,\r\n loggedInUserTenantKey: string,\r\n loggedInUserTenantName: string\r\n ) {\r\n this.loggedInUserContext = {\r\n [RoleGroupInfo.RoleGroupId]: loggedInUserRoleId\r\n ? loggedInUserRoleId.toString()\r\n : loggedInUserRoleId,\r\n [RoleGroupInfo.RoleGroupName]: loggedInUserRoleName,\r\n [TenantInfo.TenantKey]: loggedInUserTenantKey,\r\n [TenantInfo.TenantName]: loggedInUserTenantName,\r\n };\r\n this.isObo = isOBO;\r\n }\r\n\r\n setOBOUserContext(\r\n OBOUserRoleId: string,\r\n OBOUserRoleName: string,\r\n isOBO: boolean,\r\n OBOUserTenantKey: string,\r\n OBOUserTenantName: string\r\n ) {\r\n this.OBOUserContext = {\r\n [RoleGroupInfo.RoleGroupId]: OBOUserRoleId\r\n ? OBOUserRoleId.toString()\r\n : OBOUserRoleId,\r\n [RoleGroupInfo.RoleGroupName]: OBOUserRoleName,\r\n [TenantInfo.TenantKey]: OBOUserTenantKey,\r\n [TenantInfo.TenantName]: OBOUserTenantName,\r\n };\r\n this.isObo = isOBO;\r\n }\r\n\r\n /**\r\n * Method to log user actions which will be logged in customEvents with EventType as UserAction.\r\n * @abstract\r\n * @method Fxp.telemetry.fxpLogger#logSystemEvent\r\n * @param {string} source - Source from where this is getting logged. It should be in format ..\r\n * @param {string} eventName - Name of the event. It should be in format .\r\n * @param {LogPropertyBag} properties - Properties for the customDimensions.\r\n * @param {LogMetricBag} measurements - measurements to be logged in customDimensions.\r\n * @param {string} transactionId - Transaction id or Operation id of the transaction.\r\n */\r\n logUserAction(\r\n source,\r\n eventName: string,\r\n message: string,\r\n properties?: LogPropertyBag,\r\n measurements?: LogMetricBag,\r\n transactionId?: string\r\n ) {\r\n try {\r\n if (!properties) {\r\n properties = this.createPropertyBag();\r\n }\r\n properties.addToBag(\"EventType\", \"UserAction\");\r\n properties.addToBag(\"message\", message);\r\n this.logEvent(source, eventName, properties, measurements, transactionId);\r\n } catch (exception) {\r\n this.internalCustomLog(exception);\r\n }\r\n }\r\n\r\n /**\r\n * Method to log system events which will be logged in customEvents with EventType as SystemEvent.\r\n * @abstract\r\n * @method Fxp.telemetry.fxpLogger#logSystemEvent\r\n * @param {string} source - Source from where this is getting logged. It should be in Format ..\r\n * @param {SystemEvent} eventData - Instance of SystemEvent type.\r\n * @param {LogPropertyBag} properties - Properties for the customDimensions.\r\n * @param {LogMetricBag} measurements - measurements to be logged in customDimensions.\r\n * @param {string} transactionId - Transaction id or Operation id of the transaction.\r\n */\r\n logSystemEvent(\r\n source: string,\r\n eventData: SystemEvent,\r\n properties?: LogPropertyBag,\r\n measurements?: LogMetricBag,\r\n transactionId?: any\r\n ) {\r\n try {\r\n properties = this.setTransactionIdAndCommonProperties(\r\n source,\r\n transactionId,\r\n properties\r\n );\r\n this._appInsight.TrackSystemEvent(\r\n eventData,\r\n properties.getItems(),\r\n measurements\r\n );\r\n } catch (exception) {\r\n this.internalCustomLog(exception);\r\n }\r\n }\r\n\r\n private setTransactionId(transactionId?: any) {\r\n if (transactionId) {\r\n this._appInsight.appInsights.context.telemetryTrace.traceID =\r\n transactionId;\r\n return;\r\n }\r\n const subCorrelationId = this._correlator.getSubCorrelationId();\r\n const correlationId = this._correlator.getCorrelationId();\r\n if (subCorrelationId) {\r\n this._appInsight.appInsights.context.telemetryTrace.traceID =\r\n subCorrelationId;\r\n this._appInsight.appInsights.context.telemetryTrace.parentID =\r\n correlationId;\r\n return subCorrelationId;\r\n }\r\n this._appInsight.appInsights.context.telemetryTrace.traceID = correlationId;\r\n return correlationId;\r\n }\r\n\r\n private setTransactionIdAndCommonProperties(\r\n source?: string,\r\n transactionId?: any,\r\n properties?: LogPropertyBag,\r\n errorCode?: string,\r\n stackTrace?: string\r\n ) {\r\n this.setTransactionId(transactionId);\r\n properties = this.addPropertyBagValues(properties, transactionId, source);\r\n properties = this.buildCommonLogProperties(properties, source, null, null);\r\n return properties;\r\n }\r\n\r\n /**\r\n * To Builds log properties that are common to all methods\r\n * @param properties\r\n * @param source\r\n * @param errorCode\r\n * @param stackTrace\r\n */\r\n private buildCommonLogProperties(\r\n properties: LogPropertyBag,\r\n source: string,\r\n errorCode: string,\r\n stackTrace: string\r\n ) {\r\n const logProperties = properties || this.createPropertyBag();\r\n if (logProperties.getValue(TelemetryConstants.LOGGING_SOURCE)) {\r\n logProperties.addToBag(\r\n \"Source\",\r\n properties.getValue(TelemetryConstants.LOGGING_SOURCE)\r\n );\r\n logProperties.removeFromBag(TelemetryConstants.LOGGING_SOURCE);\r\n } else if (!CommonUtils.isNullOrEmpty(source)) {\r\n logProperties.addToBag(\"Source\", source);\r\n }\r\n if (!CommonUtils.isNullOrEmpty(errorCode))\r\n logProperties.addToBag(\"ErrorCode\", errorCode);\r\n\r\n if (!CommonUtils.isNullOrEmpty(stackTrace))\r\n logProperties.addToBag(\"StackTrace\", stackTrace);\r\n\r\n return logProperties;\r\n }\r\n\r\n private addPropertyBagValues(\r\n eventProperties: LogPropertyBag,\r\n transactionId?: string,\r\n source?: string\r\n ) {\r\n eventProperties = eventProperties || new LogPropertyBag();\r\n const appNameForTelemetry = this.getCurrentPartnerTelemetryName();\r\n eventProperties = FxpLogHelper.addEnvironmentDetails(\r\n eventProperties,\r\n transactionId,\r\n source,\r\n this.instrumentationKey,\r\n appNameForTelemetry\r\n );\r\n eventProperties = this.addUserRoleGroupDetails(eventProperties);\r\n eventProperties = this.addUserTenantDetails(eventProperties);\r\n eventProperties.addToBag(\r\n \"networkSpeed\",\r\n NetworkConnection.getInstance().getCurrentNetworkSpeed()\r\n );\r\n return eventProperties;\r\n }\r\n\r\n private addUserRoleGroupDetails(eventProperties: LogPropertyBag) {\r\n if (this.loggedInUserContext) {\r\n eventProperties.addToBag(\r\n RoleGroupDetails.LOGGEDINUSERROLEGROUPID,\r\n this.loggedInUserContext.RoleGroupId == undefined\r\n ? \"\"\r\n : this.loggedInUserContext.RoleGroupId\r\n );\r\n eventProperties.addToBag(\r\n RoleGroupDetails.LOGGEDINUSERROLEGROUPNAME,\r\n this.loggedInUserContext.RoleGroupName == undefined\r\n ? \"\"\r\n : this.loggedInUserContext.RoleGroupName\r\n );\r\n }\r\n if (this.isObo && this.OBOUserContext) {\r\n eventProperties.addToBag(\r\n RoleGroupDetails.OBOROLEGROUPID,\r\n this.OBOUserContext.RoleGroupId == undefined\r\n ? \"\"\r\n : this.OBOUserContext.RoleGroupId\r\n );\r\n eventProperties.addToBag(\r\n RoleGroupDetails.OBOROLEGROUPNAME,\r\n this.OBOUserContext.RoleGroupName == undefined\r\n ? \"\"\r\n : this.OBOUserContext.RoleGroupName\r\n );\r\n }\r\n return eventProperties;\r\n }\r\n\r\n /**\r\n * To add loggedIn user tenant properties that are common to all methods\r\n * @param properties\r\n */\r\n private addUserTenantDetails(eventProperties: LogPropertyBag) {\r\n if (this.loggedInUserContext) {\r\n eventProperties.addToBag(\r\n TenantDetails.LOGGEDINUSERTENANTKEY,\r\n this.loggedInUserContext == undefined\r\n ? \"\"\r\n : this.loggedInUserContext.TenantKey\r\n );\r\n eventProperties.addToBag(\r\n TenantDetails.LOGGEDINUSERTENANTNAME,\r\n this.loggedInUserContext.TenantName == undefined\r\n ? \"\"\r\n : this.loggedInUserContext.TenantName\r\n );\r\n }\r\n if (this.isObo && this.OBOUserContext) {\r\n eventProperties.addToBag(\r\n TenantDetails.OBOTENANTKEY,\r\n this.OBOUserContext == undefined ? \"\" : this.OBOUserContext.TenantKey\r\n );\r\n eventProperties.addToBag(\r\n TenantDetails.OBOTENANTNAME,\r\n this.OBOUserContext.TenantName == undefined\r\n ? \"\"\r\n : this.OBOUserContext.TenantName\r\n );\r\n }\r\n return eventProperties;\r\n }\r\n\r\n public getCorrelationId(correlationId?: string): string {\r\n if (!CommonUtils.isNullOrEmpty(correlationId)) return;\r\n if (this.correlationProvider)\r\n return this.correlationProvider.getCorrelationId();\r\n if (this._correlator) return this._correlator.getCorrelationId();\r\n if ($.correlator) return $.correlator.getCorrelationId();\r\n }\r\n\r\n public getSubCorrelationId(): string {\r\n if (this._correlator) return this._correlator.getSubCorrelationId();\r\n }\r\n\r\n /**\r\n * Method to renew the correlation identity.\r\n * @abstract\r\n * @method Fxp.telemetry.fxpLogger#renewCorrelationId\r\n */\r\n public renewCorrelationId() {\r\n if (this._correlator) return this._correlator.renewCorrelationId();\r\n }\r\n\r\n /**\r\n * Method to renew the sub correlation identity.\r\n * @abstract\r\n * @method Fxp.telemetry.fxpLogger#renewSubCorrelationId\r\n * @description Method to renew the sub correlation identity.\r\n */\r\n public renewSubCorrelationId() {\r\n if (this._correlator) return this._correlator.renewSubCorrelationId();\r\n }\r\n\r\n /**\r\n * logs error to console\r\n * @param exception\r\n */\r\n private internalCustomLog(exception) {\r\n console.error(TelemetryConstants.ERRORPREFIX + JSON.stringify(exception));\r\n }\r\n\r\n getDefaultPropertyBagValues(properties?: LogPropertyBag): LogPropertyBag {\r\n let propBag = properties || this.createPropertyBag();\r\n propBag = this.addPropertyBagValues(propBag);\r\n return propBag;\r\n }\r\n}\r\n","declare var navigator: any; \r\n\r\nexport class NetworkConnection {\r\n _connection: any = navigator.connection || navigator.mozConnection || navigator.webkitConnection;\r\n _effectiveType: any;\r\n static _networkConnection: NetworkConnection; \r\n\r\n constructor(){\r\n this._connection.addEventListener('change', this.broadcastNetworkChange.bind(this));\r\n this.getCurrentNetworkSpeed();\r\n }\r\n\r\n static getInstance(): NetworkConnection{\r\n if (!this._networkConnection)\r\n this._networkConnection = new NetworkConnection(); \r\n\r\n return this._networkConnection;\r\n }\r\n\r\n getCurrentNetworkSpeed(){\r\n this._effectiveType = this._connection.effectiveType;\r\n return this._effectiveType; \r\n }\r\n\r\n broadcastNetworkChange() {\r\n const newEffectiveType = this._connection.effectiveType;\r\n const networkChangeCustomEvent = new CustomEvent(\"network_speed_changed\", {\r\n bubbles: true, // only bubbles and cancelable\r\n cancelable: true, // work in the Event constructor\r\n detail: {'from': this._effectiveType, 'to': newEffectiveType}\r\n });\r\n window.dispatchEvent(networkChangeCustomEvent);\r\n this._effectiveType = newEffectiveType; \r\n \r\n }\r\n}\r\n","import { LogPropertyBag } from \"./LogPropertyBag\";\r\nimport { EnvironmentData } from \"./EnvironmentData\";\r\nimport { FxpLogHelper } from \"./FxpLogHelper\";\r\nimport { ApplicationConstants } from \"../common/ApplicationConstants\";\r\nimport { ITelemetryContextListener } from \"../interfaces/ITelemetryContextListener\";\r\nimport { CommonUtils } from \"../utils/CommonUtils\";\r\n\r\n/**\r\n* A service to get/set telemetry context\r\n* @class Fxp.Telemetry.TelemetryContext\r\n* @classdesc A service to get/set telemetry context\r\n* @example Example to create an instance of FxpTelemetryContext \r\n* //Initializing FxpTelemetryContext Service\r\n* angular.module('FxPApp').controller('AppController', ['FxpTelemetryContext', AppController]);\r\n* function AppController(FxpTelemetryContext){ FxpTelemetryContext.setUserID(\"xxxxx\"); }\r\n*/\r\nexport class TelemetryContext {\r\n\r\n\tprivate static _currentContext: TelemetryContext;\r\n\tprivate _userId: string = \"\";\r\n\tprivate _appName: string = \"\";\r\n\tprivate _appVersion: string = \"\";\r\n\tprivate _userRole: string = \"\";\r\n\tprivate _sessionId: string = \"\";\r\n\tprivate _geography: string = \"\";\r\n\tprivate _envData: any = null;\r\n\tprivate _globalPropertyBag: LogPropertyBag = new LogPropertyBag();\r\n\tprivate contextChangeListeners: Array = new Array();\r\n\r\n\tprivate constructor() {\r\n\t\tthis.setAppContext('FXP', 'V1');\r\n\t\tthis._envData = [];\r\n\t}\r\n\r\n\tstatic getInstance(): TelemetryContext{\r\n\t\tif (!this._currentContext) {\r\n\t\t\tthis._currentContext = new TelemetryContext(); \r\n\t\t}\r\n\t\treturn this._currentContext;\r\n\t}\r\n\r\n\r\n\tgetGlobalPropertyBag(): LogPropertyBag {\r\n\t\treturn this._globalPropertyBag;\r\n\t}\r\n\r\n\taddToGlobalPropertyBag(key: string, value: string) {\r\n\t\tthis._globalPropertyBag.addToBag(key, value);\r\n\t}\r\n\r\n\tremoveFromGlobalPropertyBag(key: string) {\r\n\t\tthis._globalPropertyBag.removeFromBag(key);\r\n\t}\r\n\r\n\r\n\t/**\r\n\t* gets instance of TelemetryContext Object\r\n\t* @method Fxp.Telemetry.TelemetryContext.CurrentContext \r\n\t* @example Example to invoke CurrentContext\r\n\t* FxpTelemetryContext.CurrentContext();\r\n\t*/\r\n\t//Keeping this function as is for backward Compatibility\r\n\tpublic static get CurrentContext(): TelemetryContext {\r\n\t\tif (TelemetryContext._currentContext) {\r\n\t\t\treturn TelemetryContext._currentContext;\r\n\t\t}\r\n\t\telse {\r\n\t\t\tTelemetryContext._currentContext = new TelemetryContext();\r\n\t\t\treturn TelemetryContext._currentContext;\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t* sets UserId of Telemetry Context Object\r\n\t* @method Fxp.Telemetry.TelemetryContext.setUserID\r\n\t* @param {string} UserID a Logged IN UserId in FXP. \r\n\t* @example Example to invoke setUserID\r\n\t* FxpTelemetryContext.setUserID('xxxxxx');\r\n\t*/\r\n\tsetUserID(userID: string) {\r\n\t\tif (userID)\r\n\t\t\tthis._userId = userID;\r\n\t\telse\r\n\t\t\tthrow new Error(ApplicationConstants.RequiredMessage.replace('{0}', \"User Id\"));\r\n\t}\r\n\r\n\t/**\r\n\t* gets UserId of Telemetry Context Object, return type of the method is a string\r\n\t* @method Fxp.Telemetry.TelemetryContext.setUserID \r\n\t* @example Example to invoke getUserID\r\n\t* FxpTelemetryContext.getUserID();\r\n\t*/\r\n\tgetUserID(): string {\r\n\t\treturn this._userId;\r\n\t}\r\n\r\n\r\n\t/**\r\n\t* sets Application Context of Telemetry Context Object\r\n\t* @method Fxp.Telemetry.TelemetryContext.setAppContext\r\n\t* @param {string} appName Application Name. \r\n\t* @param {string} appVersion Application Version. \r\n\t* @example Example to invoke setAppContext\r\n\t* FxpTelemetryContext.setAppContext('FXP','V1');\r\n\t*/\r\n\tsetAppContext(appName: string, appVersion: string) {\r\n\t\tif (appName)\r\n\t\t\tthis._appName = appName;\r\n\t\telse\r\n\t\t\tthrow new Error(ApplicationConstants.RequiredMessage.replace('{0}', \"Application Name\"));\r\n\r\n\t\tif (appVersion)\r\n\t\t\tthis._appVersion = appVersion;\r\n\t\telse\r\n\t\t\tthrow new Error(ApplicationConstants.RequiredMessage.replace('{0}', \"Application Version\"));\r\n\r\n\t\tthis.notifyContextChangeListeners();\r\n\t}\r\n\r\n\t/**\r\n\t* gets getAppVersion of Telemetry Context Object, return type of the method is a string\r\n\t* @method Fxp.Telemetry.TelemetryContext.getAppVersion \r\n\t* @example Example to invoke getAppVersion\r\n\t* FxpTelemetryContext.getAppVersion();\r\n\t*/\r\n\tgetAppVersion(): string {\r\n\t\treturn this._appVersion;\r\n\t}\r\n\r\n\t/**\r\n\t* gets Application Name of Telemetry Context Object, return type of the method is a string\r\n\t* @method Fxp.Telemetry.TelemetryContext.getAppName \r\n\t* @example Example to invoke getAppName\r\n\t* FxpTelemetryContext.getAppName();\r\n\t*/\r\n\tgetAppName(): string {\r\n\t\treturn this._appName;\r\n\t}\r\n\r\n\t/**\r\n\t* sets UserRole of Telemetry Context Object\r\n\t* @method Fxp.Telemetry.TelemetryContext.setUserRole \r\n\t* @param {string} userRole Business Role of Logged in User. \r\n\t* @example Example to invoke setUserRole\r\n\t* FxpTelemetryContext.setUserRole('Architect');\r\n\t*/\r\n\tsetUserRole(userRole: string) {\r\n\t\tif (userRole) {\r\n\t\t\tthis._userRole = userRole;\r\n\t\t\tthis.notifyContextChangeListeners();\r\n\t\t}\r\n\t\telse {\r\n\t\t\tthrow new Error(ApplicationConstants.RequiredMessage.replace('{0}', \"User Role\"));\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t* gets UserRole of Telemetry Context Object, return type of the method is a string\r\n\t* @method Fxp.Telemetry.TelemetryContext.getUserRole \r\n\t* @example Example to invoke getUserRole\r\n\t* FxpTelemetryContext.getUserRole();\r\n\t*/\r\n\tgetUserRole(): string {\r\n\t\treturn this._userRole;\r\n\t}\r\n\r\n\t/**\r\n\t* sets SessionID of Telemetry Context Object\r\n\t* @method Fxp.Telemetry.TelemetryContext.setSessionID \r\n\t* @param {string} SessionID SessionId of Logged in User. \r\n\t* @example Example to invoke setSessionID\r\n\t* FxpTelemetryContext.setSessionID(\"12345-56789-123364\");\r\n\t*/\r\n\tsetSessionID(sessionID: string) {\r\n\t\tif (sessionID)\r\n\t\t\tthis._sessionId = sessionID;\r\n\t\telse\r\n\t\t\tthrow new Error(ApplicationConstants.RequiredMessage.replace('{0}', \"Session Id\"));\r\n\t}\r\n\r\n\t/**\r\n\t* gets SessionID of Telemetry Context Object, return type of the method is a string\r\n\t* @method Fxp.Telemetry.TelemetryContext.setSessionID \r\n\t* @example Example to invoke setSessionID\r\n\t* FxpTelemetryContext.setSessionID();\r\n\t*/\r\n\tgetSessionID(): string {\r\n\t\treturn this._sessionId;\r\n\t}\r\n\r\n\t/**\r\n\t* gets Geography Information of Telemetry Context Object, return type of the method is a string\r\n\t* @method Fxp.Telemetry.TelemetryContext.getGeography \r\n\t* @example Example to invoke getGeography\r\n\t* FxpTelemetryContext.getGeography();\r\n\t*/\r\n\tgetGeography(): string {\r\n\t\treturn this._geography;\r\n\t}\r\n\r\n\t/**\r\n\t* sets Geography of Telemetry Context Object\r\n\t* @method Fxp.Telemetry.TelemetryContext.setGeography \r\n\t* @param {string} geo IP Address of Logged in User. \r\n\t* @example Example to invoke setGeography\r\n\t* FxpTelemetryContext.setGeography(\"127.0.0.1\");\r\n\t*/\r\n\tsetGeography(geo: string) {\r\n\t\tif (geo) {\r\n\t\t\tthis._geography = geo;\r\n\t\t\tthis.notifyContextChangeListeners();\r\n\t\t}\r\n\t\telse\r\n\t\t\tthrow new Error(ApplicationConstants.RequiredMessage.replace('{0}', \"Geography\"));\r\n\r\n\t}\r\n\r\n\t/**\r\n\t* Sets user Session of Telemetry Context Object\r\n\t* @method Fxp.Telemetry.TelemetryContext.setNewUserSession \r\n\t* @param {Fxp.Telemetry.UserInfo} userInfo UserInfo of Logged in User. \r\n\t* @param {string} sessionId sessionId of Logged in User. \r\n\t* @example Example to invoke setNewUserSession\r\n\t* FxpTelemetryContext.setNewUserSession();\r\n\t*/\r\n\tsetNewUserSession(userId: string, sessionId?: string): string {\r\n\t\tif (!sessionId)\r\n\t\t\tsessionId = FxpLogHelper.getNewSessionId(); // CodeQL [js/insecure-randomness] Not a security-sensitive data\r\n\r\n\t\tif (userId) {\r\n\t\t\tthis.setUserID(userId);\r\n\t\t\tthis.setSessionID(sessionId);\r\n\t\t\tthis.notifyContextChangeListeners();\r\n\t\t}\r\n\t\telse\r\n\t\t\tthrow new Error(ApplicationConstants.RequiredMessage.replace('{0}', \"UserInfo\"));\r\n\r\n\t\treturn sessionId;\r\n\t}\r\n\r\n\tinitUserSession(){\r\n\t\tlet sessionIdCached = window.sessionStorage.getItem(ApplicationConstants.FxpSessionKey);\r\n\t\tif (CommonUtils.isNullOrEmpty(sessionIdCached)) {\r\n\t\t\tsessionIdCached = FxpLogHelper.getNewSessionId(); // CodeQL [SM01527] Insecure randomness - The value generated here is not a secret, guids for tracking purpose only\r\n\t\t\twindow.sessionStorage.setItem(ApplicationConstants.FxpSessionKey, sessionIdCached);\r\n\t\t}\r\n\t\tthis.setSessionID(sessionIdCached);\r\n\t\tthis.notifyContextChangeListeners();\r\n\t\tconsole.log(`SessionId: ${sessionIdCached}`) ;\r\n\t}\r\n\r\n\t/**\r\n\t* sets Enviroonment Details of FXP in Telemetry Context Object\r\n\t* @method Fxp.Telemetry.TelemetryContext.setEnvironmentDetails\r\n\t* @param {string} appName Application Name\r\n\t* @param {Fxp.Telemetry.EnvironmentData} envData Environment Details of FXP. \r\n\t* @example Example to invoke setEnvironmentDetails\r\n\t* FxpTelemetryContext.setEnvironmentDetails();\r\n\t*/\r\n\tsetEnvironmentDetails(appName: string, envData: EnvironmentData) {\r\n\t\tif (!CommonUtils.isNullOrEmpty(appName) && (envData))\r\n\t\t\tthis._envData[appName.toLowerCase()] = envData;\r\n\t\telse\r\n\t\t\tthrow new Error(ApplicationConstants.RequiredMessage.replace('{0}', \"Environment Data\"));\r\n\t}\r\n\t/**\r\n\t* sets Partner Enviroonment Details of FXP in Telemetry Context Object\r\n\t* @method Fxp.Telemetry.TelemetryContext.setEnvironmentDetails\r\n\t* @param {string} environmentName EnvironmentName is Environment Name of the Application like \"Development\" or \"Production\" etc..\r\n\t* @param {Object} partnersTelmetryInfo is a collection of partner telemetry environment details\r\n\t* @example Example to invoke setEnvironmentDetails\r\n\t* FxpTelemetryContext.setPartnerEnvironmentDetails();\r\n\t*/\r\n\tsetPartnerEnvironmentDetails(environmentName, partnersTelmetryInfo) {\r\n\t\tvar self = this;\r\n\t\ttry {\r\n\t\t\tif (!CommonUtils.isNullOrEmpty(partnersTelmetryInfo)) {\r\n\t\t\t\tfor (var index = 0, length = partnersTelmetryInfo.length; index < length; index++) {\r\n\t\t\t\t\tvar partnerTelmetryInfo = partnersTelmetryInfo[index];\r\n\t\t\t\t\tif (!CommonUtils.isNullOrEmpty(partnerTelmetryInfo.Name))\r\n\t\t\t\t\t\tself._envData[partnerTelmetryInfo.Name.toLowerCase()] = new EnvironmentData(environmentName,\r\n\t\t\t\t\t\t\tpartnerTelmetryInfo.ServiceOffering,\r\n\t\t\t\t\t\t\tpartnerTelmetryInfo.ServiceLine,\r\n\t\t\t\t\t\t\t!CommonUtils.isNullOrEmpty(partnerTelmetryInfo.Service) ? partnerTelmetryInfo.Service : \"\",\r\n\t\t\t\t\t\t\t!CommonUtils.isNullOrEmpty(partnerTelmetryInfo.ComponentId) ? partnerTelmetryInfo.ComponentId : \"\",\r\n\t\t\t\t\t\t\tpartnerTelmetryInfo.ComponentName,\r\n\t\t\t\t\t\t\tpartnerTelmetryInfo.Name,\r\n\t\t\t\t\t\t\tpartnerTelmetryInfo.IctoId,\r\n\t\t\t\t\t\t\tpartnerTelmetryInfo.BusinessProcessName);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t} catch (exception) {\r\n\t\t\tconsole.log(exception);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t* gets Environment Details of FXP, return type of the method is a type of Fxp.Telemetry.EnvironmentData class\r\n\t* @method Fxp.Telemetry.TelemetryContext.getEnvironmentDetails\r\n\t* @param {string} appName Application Name\r\n\t* @example Example to invoke getEnvironmentDetails\r\n\t* FxpTelemetryContext.getEnvironmentDetails();\r\n\t*/\r\n\tgetEnvironmentDetails(appName: string): EnvironmentData {\r\n\t\tvar envData;\r\n\t\tif (!CommonUtils.isNullOrEmpty(appName))\r\n\t\t\tenvData = this._envData[appName.toLowerCase()];\r\n\t\treturn envData;\r\n\t}\r\n\r\n\t/**\r\n\t* adds Context Change Event Listner\r\n\t* @method Fxp.Telemetry.TelemetryContext.addContextChangeListener \r\n\t* @param {Fxp.Interfaces.ITelemetryContextListener} listener Context Change Event Listner\r\n\t* @example Example to invoke addContextChangeListener\r\n\t* FxpTelemetryContext.addContextChangeListener(\"xxxx\");\r\n\t*/\r\n\taddContextChangeListener(listener: ITelemetryContextListener) {\r\n\t\tthis.contextChangeListeners.push(listener);\r\n\t}\r\n\r\n\tprivate notifyContextChangeListeners() {\r\n\t\tfor (var listener in this.contextChangeListeners)\r\n\t\t\tthis.contextChangeListeners[listener].notify();\r\n\t}\r\n}\r\n","import { ApplicationConstants } from \"../common/ApplicationConstants\";\r\n\r\nexport class CommonUtils {\r\n\r\n public static clone(input: object): any {\r\n return JSON.parse(JSON.stringify(input));\r\n }\r\n\r\n public static isNullOrEmpty(input: any) {\r\n return (input === null || input === undefined || jQuery.isEmptyObject(input) || input.toString().length === 0 || input === \"null\");\r\n }\r\n\r\n public static getNewGuId(): string {\r\n var d: number = new Date().getTime();\r\n var guid: string = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {\r\n var r = (d + Math.random() * 16) % 16 | 0;\r\n d = Math.floor(d / 16);\r\n return (c == 'x' ? r : (r & 0x3 | 0x8)).toString(16);\r\n });\r\n\r\n return guid;\r\n }\r\n\r\n public static isObject(obj: any): boolean {\r\n return (!!obj) && (obj.constructor === Object);\r\n }\r\n\r\n public static pullFocusToElement(elementId): void {\r\n $('#' + elementId).focus();\r\n }\r\n\r\n public static angularInherits(ctor, superCtor): void {\r\n ctor.super_ = superCtor;\r\n if (superCtor) {\r\n ctor.prototype = Object.create(superCtor.prototype, {\r\n constructor: {\r\n value: ctor,\r\n enumerable: false\r\n }\r\n });\r\n }\r\n }\r\n\r\n public static hashCode(value): string {\r\n var hash = 0;\r\n if (value.length == 0)\r\n return hash.toString();\r\n for (var i = 0; i < value.length; i++) {\r\n var char = value.toString().charCodeAt(i);\r\n hash = ((hash << 5) - hash) + char;\r\n hash = hash & hash; // Convert to 32bit integer\r\n }\r\n return hash.toString();\r\n }\r\n\r\n public static isGuid(value) {\r\n var regex = /[a-f0-9]{8}(?:-[a-f0-9]{4}){3}-[a-f0-9]{12}/i;\r\n var match = regex.exec(value);\r\n return match != null;\r\n }\r\n\r\n public static getSessionStorageUserInfoKey(userIdentifier: string): string {\r\n if (userIdentifier === undefined || userIdentifier === null)\r\n return null;\r\n\r\n if (this.isGuid(userIdentifier))\r\n return userIdentifier + \"-userInfo\";\r\n return userIdentifier.toLowerCase() + \"-userInfo\";\r\n }\r\n\r\n public static getSessionStorageUserClaimsKey(userIdentifier: string): string {\r\n if (userIdentifier === undefined || userIdentifier === null)\r\n return null;\r\n\r\n if (this.isGuid(userIdentifier))\r\n return \"fxpUserClaims_\" + userIdentifier;\r\n return \"fxpUserClaims_\" + userIdentifier.toLowerCase();\r\n }\r\n\r\n public static getArrayLength(arrayCollection): number {\r\n return CommonUtils.isNullOrEmpty(arrayCollection) ? 0 : arrayCollection.length;\r\n }\r\n\r\n public static getIndexOfObject(source, compareKey, value): number {\r\n var index = -1;\r\n var length = source.length;\r\n for (let i = 0; i < length; i++) {\r\n if (source[i][compareKey] === value) {\r\n index = i;\r\n break;\r\n }\r\n }\r\n return index;\r\n }\r\n\r\n public static generateUPN(userInfo: any, fxpAppSettings: any): string {\r\n // getting user alias and removing partners~ from it if it is there.\r\n let UPN = userInfo.Alias;\r\n if (userInfo.Domain.toLowerCase() == \"corpnet\")\r\n // appending domain.\r\n UPN += fxpAppSettings.UpnCorpnet;\r\n else\r\n // removing partners~ from UPN if it is there and appending partner domain.\r\n UPN = UPN.substring(UPN.indexOf('~') + 1) + fxpAppSettings.UpnPartner;\r\n return UPN.toLowerCase();\r\n }\r\n\r\n public static stringFormat(str: string, ...params: string[]) {\r\n return str.replace(/{(\\d+)}/g, function (match, number) {\r\n return typeof params[number] != 'undefined'\r\n ? params[number]\r\n : match\r\n ;\r\n });\r\n }\r\n\r\n public static getTenantURLSpecificPageTitle(str: string) {\r\n if (window.location.href.indexOf(ApplicationConstants.SalesTenantUrlString) > -1) {\r\n return str.replace(ApplicationConstants.ESTenanatUrlString, ApplicationConstants.SalesTenantUrlString);\r\n }\r\n return str;\r\n }\r\n\r\n public static jsonConcat(obj1: any, obj2: any) {\r\n for (var key in obj2) {\r\n obj1[key] = obj2[key];\r\n }\r\n return obj1;\r\n }\r\n\r\n private static isObjectAnArray(val: any): boolean {\r\n return Object.prototype.toString.call(val) === '[object Array]';\r\n }\r\n\r\n private static isPlainObject(val: any): boolean {\r\n return Object.prototype.toString.call(val) === '[object Object]';\r\n }\r\n\r\n /**\r\n * This method reads the value of the property specified with key parameter from the given object in case insensitive way.\r\n * @abstract\r\n * @method CommonUtils#getPropertyValueCaseInsensitive\r\n * @param {object} object - Object on which property has to be read.\r\n * @param {string} key - Name of the property in any case (Upper, Lower, Pascal, Camel)\r\n * @returns {string} - The value of the property on the given object.\r\n */\r\n public static getPropertyValueCaseInsensitive(object: object, key: string) {\r\n return object[Object.keys(object).filter(function (k) {\r\n return k.toLowerCase() === key.toLowerCase();\r\n })[0]];\r\n }\r\n\r\n public static sortJsonObj(inputJson: any, isArray: boolean = false) {\r\n isArray = isArray || false;\r\n let inputObject: any = {};\r\n if (CommonUtils.isObjectAnArray(inputJson)) {\r\n // Sort or don't sort arrays\r\n if (isArray) {\r\n inputObject = inputJson;\r\n } else {\r\n inputObject = inputJson.sort();\r\n }\r\n\r\n inputObject.forEach(function (v, i) {\r\n inputObject[i] = CommonUtils.sortJsonObj(v, isArray);\r\n });\r\n\r\n if (!isArray) {\r\n inputObject = inputObject.sort(function (a, b) {\r\n a = JSON.stringify(a);\r\n b = JSON.stringify(b);\r\n return a < b ? -1 : (a > b ? 1 : 0);\r\n });\r\n }\r\n } else if (CommonUtils.isPlainObject(inputJson)) {\r\n inputObject = {};\r\n Object.keys(inputJson).sort(function (a, b) {\r\n if (a.toLowerCase() < b.toLowerCase()) return -1;\r\n if (a.toLowerCase() > b.toLowerCase()) return 1;\r\n return 0;\r\n }).forEach(function (key) {\r\n inputObject[key] = CommonUtils.sortJsonObj(inputJson[key], isArray);\r\n });\r\n } else {\r\n inputObject = inputJson;\r\n }\r\n return inputObject;\r\n }\r\n\r\n public static objectToString(input: any): string {\r\n if (!input) return null;\r\n if (typeof input === \"string\") {\r\n return input;\r\n }\r\n if (!CommonUtils.isObject(input)) return null;\r\n\r\n try {\r\n return JSON.stringify(input);\r\n }\r\n catch (e) {\r\n return null;\r\n }\r\n\r\n }\r\n\r\n public static getQueryString(field: string, url?: string) {\r\n var href = url ? url : window.location.href;\r\n var reg = new RegExp('[?&]' + field + '=([^&#]*)', 'i');\r\n var string = reg.exec(href);\r\n return string ? string[1] : null;\r\n };\r\n\r\n public static getScriptBaseUrl(){\r\n var baseUrl = '';\r\n var currentScriptUrl = document.currentScript['src'];\r\n if (currentScriptUrl.indexOf('exclude.inline.bundle') > 0) {\r\n currentScriptUrl = Error().stack.match(/(https?:\\/\\/[^ ]*)/g);\r\n baseUrl = currentScriptUrl\r\n .filter((item) => item.indexOf('localhost:5000') === -1)[0]\r\n .toLowerCase();\r\n baseUrl = baseUrl.substring(0, baseUrl.lastIndexOf('/'));\r\n } else {\r\n baseUrl = currentScriptUrl.substring(0, currentScriptUrl.lastIndexOf('/'));\r\n }\r\n if (baseUrl.endsWith(\"/\")){\r\n baseUrl = baseUrl.substring(0, baseUrl.lastIndexOf('/'));\r\n }\r\n return baseUrl;\r\n }\r\n\r\n public static removePII(data: string):string{\r\n let FxpAppSettings: any = window[\"FxpAppSettings\"];\r\n if (CommonUtils.isNullOrEmpty(data)) {\r\n return data;\r\n }\r\n else if(CommonUtils.isObject(data)){\r\n\t\t\tdata = CommonUtils.objectToString(data);\r\n\t\t\tif(CommonUtils.isNullOrEmpty(data)){\r\n\t\t\t\treturn data;\r\n\t\t\t}\r\n\t\t}\r\n else {\r\n data = String(data);\r\n }\r\n let PIIRegex;\r\n if (CommonUtils.isNullOrEmpty(FxpAppSettings?.PIIFilterRegex) \r\n && !CommonUtils.isNullOrEmpty(ApplicationConstants?.PIIFilterRegex)) {\r\n PIIRegex = JSON.parse(ApplicationConstants?.PIIFilterRegex);\r\n }\r\n else {\r\n PIIRegex = JSON.parse(FxpAppSettings?.PIIFilterRegex);\r\n }\r\n if(!CommonUtils.isNullOrEmpty(PIIRegex)){\r\n PIIRegex.forEach((filter) => {\r\n const regexp = new RegExp(filter, \"g\");\r\n data = data?.replace(regexp, \"REDACTED\");\r\n });\r\n }\r\n return data;\r\n }\r\n}\r\n","import { IWindowService } from \"angular\";\r\nimport { FxpBroadcastedEvents } from \"../services/FxpBroadcastedEvents\";\r\nimport { IFxPService } from \"../interfaces/IFxpService\";\r\ndeclare var _: any; \r\n\r\nexport class DeviceFactoryProvider implements IFxPService{ \r\n\r\n resolution: any;\r\n\r\n constructor(private $window:angular.IWindowService, private $rootScope:angular.IWindowService, private $timeout:angular.ITimeoutService){\r\n this.resolution = {\r\n devicePixelRatio:$window.devicePixelRatio,\r\n types: {\r\n mobile: 'xs',\r\n tablet: 'sm',\r\n desktop: 'lg'\r\n }\r\n };\r\n\r\n this.resolution.size = this.getWindowSize();\r\n this.resolution.type = this.updateType();\r\n\r\n var self = this;\r\n var lazyUpdate = _.throttle(function (event) {\r\n $timeout(function () {\r\n self.resolution.size = self.getWindowSize();\r\n self.resolution.type = self.updateType();\r\n $rootScope.$broadcast(FxpBroadcastedEvents.OnLayoutChanged, self.resolution.type);\r\n });\r\n }, 250);\r\n\r\n angular\r\n .element($window)\r\n .bind('resize', lazyUpdate);\r\n }\r\n\r\n getWindowSize = function () {\r\n return {\r\n width: this.$window.innerWidth,\r\n height: this.$window.innerHeight\r\n };\r\n };\r\n\r\n updateType = function () {\r\n if (this.resolution.size.width <= 736) {\r\n return this.resolution.types.mobile;\r\n }\r\n else if (this.resolution.size.width <= 1024) {\r\n return this.resolution.types.tablet;\r\n }\r\n else if (this.resolution.size.width > 1024) {\r\n return this.resolution.types.desktop;\r\n }\r\n };\r\n\r\n isSmallScreen = function () {\r\n return this.resolution.type === this.resolution.types.mobile\r\n || this.resolution.type === this.resolution.types.tablet;\r\n };\r\n\r\n isMobile = function () {\r\n return this.resolution.type === this.resolution.types.mobile;\r\n };\r\n\r\n isTablet = function () {\r\n return this.resolution.type === this.resolution.types.tablet;\r\n };\r\n\r\n isDesktop = function () {\r\n return this.resolution.type === this.resolution.types.desktop;\r\n };\r\n\r\n}\r\n","// download system-down-div.html and put in index.cshtml div.\r\nexport function showSystemDownOverlay(headerText, descriptionText, pageTitle, supportLinkText?, supportLink?, showSupportLinks?) {\r\n\tdocument.title = pageTitle;\r\n\t$(\"#contentHost\").load(\"templates/system-down-div.html\", function () {\r\n\t\tif (headerText)\r\n\t\t\tdocument.getElementById(\"headerText\").innerHTML = headerText;\r\n\t\tif (descriptionText)\r\n\t\t\tdocument.getElementById(\"descriptionText\").innerHTML = descriptionText;\r\n\r\n\t\tif (!showSupportLinks){\r\n\t\t\t$('#supportLinkContainer').hide();\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif (supportLinkText)\r\n\t\t\tdocument.getElementById(\"supportLink\").innerHTML = supportLinkText;\r\n\t\tif (supportLink) {\r\n\t\t\tdocument.getElementById(\"supportLink\").setAttribute(\"href\", supportLink);\r\n\t\t}\r\n\t});\r\n}","module.exports = angular;"],"sourceRoot":"webpack:///FxpCore"}