{"version":3,"sources":["src/app/models/hubsite-data.ts","src/app/services/navigation.service.ts","src/app/models/power-bi-frame.ts","src/app/services/site.service.ts","src/app/common/date-value-is-after-or-before-other-control-validator.ts","src/app/services/user-app-tile.service.ts","src/app/models/site-element.ts","src/app/components/actions/action-router-link/action-router-link.component.ts","src/app/components/actions/action-router-link/action-router-link.component.html","src/app/models/audit.ts","src/app/services/channel.service.ts","src/app/models/user-language-term.ts","src/app/common/page-query.ts","src/environments/environment-feature-settings.ts","src/app/services/feature-settings-store.service.ts","src/app/services/site-elements.service.ts","src/app/components/actions/action-link/action-link.component.ts","src/app/components/actions/action-link/action-link.component.html","src/app/components/people-card/people-card.component.ts","src/app/components/people-card/people-card.component.html","src/app/models/navigation-node.ts","src/app/common/store.ts","src/environments/git-version.ts","src/app/components/widget-placeholder/widget-placeholder.component.ts","src/app/components/widget-placeholder/widget-placeholder.component.html","src/app/common/http-helper.ts","src/app/services/security.service.ts","src/app/views/first-day-wizard/first-day-hero/first-day-hero.component.ts","src/app/views/first-day-wizard/first-day-hero/first-day-hero.component.html","src/app/models/components-on-routes-state.ts","src/app/services/component-states-on-routes.service.ts","src/app/services/url-helper.service.ts","src/app/services/user-tab-config.service.ts","src/app/services/navigation-node.service.ts","src/app/common/authorization-mode.ts","src/app/services/license.service.ts","src/app/models/feature-setting.ts","src/app/models/user-tab-configuration.ts","src/app/services/news.service.ts","src/app/common/navigation-mode..ts","src/app/components/error-templates/error-templates.component.ts","src/app/components/error-templates/error-templates.component.html","src/app/models/news-page.ts","src/app/components/confirm-dialog/confirm-dialog.component.ts","src/app/components/confirm-dialog/confirm-dialog.component.html","src/app/tracking/base-tracking.service.ts","src/app/components/gallery/gallery.component.ts","src/app/components/gallery/gallery.component.html","src/app/services/broadcast.service.ts","src/app/models/search-post-query.ts","src/app/common/auth-interceptor.ts","src/app/components/refresh-prompt-dialog/refresh-prompt-dialog.component.html","src/app/components/refresh-prompt-dialog/refresh-prompt-dialog.component.ts","src/app/services/window.service.ts","src/app/modules/window/window.module.ts","src/app/services/app-init.service.ts","src/app/components/broadcasts/broadcasts/broadcasts.component.html","src/app/components/broadcasts/broadcasts/broadcasts.component.ts","src/app/components/first-day-dialog/first-day-dialog.component.ts","src/app/components/first-day-dialog/first-day-dialog.component.html","src/app/common/footer-template.ts","src/app/services/appsettings.service.ts","src/app/components/footer/footer.component.html","src/app/components/footer/footer.component.ts","src/app/components/header/topnav-broadcasts/topnav-broadcasts.component.html","src/app/components/header/topnav-broadcasts/topnav-broadcasts.component.ts","src/app/components/header/logo/logo.component.ts","src/app/components/header/logo/logo.component.html","src/app/components/header/toolbar-button/toolbar-button.component.ts","src/app/components/header/toolbar-button/toolbar-button.component.html","src/app/components/header/search-form/search-form.component.ts","src/app/components/header/search-form/search-form.component.html","src/app/components/header/user-menu/user-menu.component.html","src/app/components/header/user-menu/user-menu.component.ts","src/app/services/badge-menu.service.ts","src/app/components/header/topnav/topnav.component.html","src/app/components/header/topnav/topnav.component.ts","src/app/components/ios-pwa-banner/ios-pwa-banner.component.ts","src/app/components/ios-pwa-banner/ios-pwa-banner.component.html","src/app/components/skip-links/skip-links.component.html","src/app/components/skip-links/skip-links.component.ts","src/app/services/signalr.service.ts","src/app/models/organization-events.ts","src/app/services/organization-calendar.service.ts","src/app/services/updated-content.service.ts","src/app/views/main/main.component.html","src/app/views/main/main.component.ts","src/app/app.module.ts","src/app/app.component.html","src/app/app.component.ts","src/app/common/managed-property-config.ts","src/app/common/msal-angular-configuration.ts","projects/cafcass/src/environments/environment.test.ts","src/app/tracking/app-insights.service.ts","src/app/components/featured-news/featured-news.component.html","src/app/components/featured-news/featured-news.component.ts","src/app/components/news-card-list/news-card-list.component.html","src/app/components/news-card-list/news-card-list.component.ts","src/app/components/my-news/my-news.component.html","src/app/components/my-news/my-news.component.ts","src/app/components/organization-calendar/organization-calendar.component.html","src/app/components/organization-calendar/organization-calendar.component.ts","src/app/components/birthdays/birthdays.component.html","src/app/components/birthdays/birthdays.component.ts","src/app/components/restaurant-menu/restaurant-menu.component.html","src/app/components/restaurant-menu/restaurant-menu.component.ts","src/app/services/feed.service.ts","src/app/components/rss-feeds/rss-feeds.component.html","src/app/components/rss-feeds/rss-feeds.component.ts","src/app/directives/mark-component-visited.directive.ts","projects/cafcass/src/app/services/blog.service.ts","projects/cafcass/src/app/custom-my-blogs/custom-my-blogs.component.html","projects/cafcass/src/app/custom-my-blogs/custom-my-blogs.component.ts","projects/cafcass/src/app/services/compliments.service.ts","projects/cafcass/src/app/custom-compliments-wall/custom-compliments-wall.component.html","projects/cafcass/src/app/custom-compliments-wall/custom-compliments-wall.component.ts","src/app/components/css-charts/bar-chart/bar-chart.component.html","src/app/components/css-charts/bar-chart/bar-chart.component.ts","src/app/components/css-charts/pie-chart/pie-chart.component.html","src/app/components/css-charts/pie-chart/pie-chart.component.ts","src/app/components/kpi-charts/kpi-charts.component.html","src/app/components/kpi-charts/kpi-charts.component.ts","src/app/components/actions/action-button/action-button.component.ts","src/app/components/actions/action-button/action-button.component.html","src/app/components/power-bi/power-bi-frame/power-bi-frame.component.ts","src/app/components/power-bi/power-bi-frame/power-bi-frame.component.html","src/app/components/power-bi/power-bi.component.html","src/app/components/power-bi/power-bi.component.ts","projects/cafcass/src/app/custom-today/custom-today.component.html","projects/cafcass/src/app/custom-today/custom-today.component.ts","src/app/guards/auth.guard.ts","src/app/common/default-modal-route-config.ts","src/app/models/followed-page.ts","src/app/services/my-followed-pages.service.ts","src/app/components/find-information/find-information-saved-pages/find-information-saved-pages.component.html","src/app/components/find-information/find-information-saved-pages/find-information-saved-pages.component.ts","src/app/services/editor-trending-news.service.ts","src/app/components/find-information/find-information-trending-pages/find-information-trending-pages.component.html","src/app/components/find-information/find-information-trending-pages/find-information-trending-pages.component.ts","src/app/components/find-information/find-information-mega-menu/find-information-mega-menu.component.html","src/app/components/find-information/find-information-mega-menu/find-information-mega-menu.component.ts","projects/cafcass/src/app/components/custom-find-information-mega-menu/custom-find-information-mega-menu.component.html","projects/cafcass/src/app/components/custom-find-information-mega-menu/custom-find-information-mega-menu.component.ts","projects/cafcass/src/app/views/custom-find-information/custom-find-information.component.html","projects/cafcass/src/app/views/custom-find-information/custom-find-information.component.ts","src/app/components/colleagues/colleagues.component.html","src/app/components/colleagues/colleagues.component.ts","src/app/models/change.ts","src/app/services/my-collaboration-activities.service.ts","src/app/components/my-collaboration-activities/my-collaboration-activities-widget/my-collaboration-activities-widget.component.html","src/app/components/my-collaboration-activities/my-collaboration-activities-widget/my-collaboration-activities-widget.component.ts","src/app/services/my-latest-sites.service.ts","src/app/components/my-latest-sites/my-latest-sites.component.html","src/app/components/my-latest-sites/my-latest-sites.component.ts","src/app/components/popover/popover.component.html","src/app/components/popover/popover.component.ts","src/app/components/table-of-contents/table-of-contents.component.html","src/app/components/table-of-contents/table-of-contents.component.ts","src/app/components/site-index/site-index.component.html","src/app/components/site-index/site-index.component.ts","src/app/views/collaboration/collaboration.component.ts","src/app/views/collaboration/collaboration.component.html","src/app/views/find-information/find-information.component.html","src/app/views/find-information/find-information.component.ts","src/app/components/apps-and-tools/my-app-tiles/my-app-tiles.component.html","src/app/components/apps-and-tools/my-app-tiles/my-app-tiles.component.ts","src/app/models/my-event.ts","src/app/models/my-task.ts","src/app/services/planner.service.ts","src/app/services/outlook.service.ts","src/app/services/events.service.ts","src/app/components/my-day/my-day.component.html","src/app/components/my-day/my-day.component.ts","src/app/components/my-documents/upload-document/upload-document-modal/upload-document-modal.component.html","src/app/components/my-documents/upload-document/upload-document-modal/upload-document-modal.component.ts","src/app/components/my-documents/upload-document/upload-document-warning-message/upload-document-warning-message.component.ts","src/app/components/my-documents/upload-document/upload-document-warning-message/upload-document-warning-message.component.html","src/app/services/onedrive.service.ts","src/app/components/my-documents/upload-document/upload-document-button/upload-document-button.component.ts","src/app/components/my-documents/upload-document/upload-document-button/upload-document-button.component.html","src/app/models/my-document.ts","src/app/components/my-documents/my-documents-widget/my-documents.component.html","src/app/components/my-documents/my-documents-widget/my-documents.component.ts","src/app/views/my-board/my-board.component.html","src/app/views/my-board/my-board.component.ts","src/app/components/filter-by-department/filter-by-department.component.html","src/app/components/filter-by-department/filter-by-department.component.ts","src/app/components/compact-featured-news/compact-featured-news.component.html","src/app/components/compact-featured-news/compact-featured-news.component.ts","src/app/components/compact-news-card-list/compact-news-card-list.component.html","src/app/components/compact-news-card-list/compact-news-card-list.component.ts","src/app/components/compact-your-news/compact-your-news.component.html","src/app/components/compact-your-news/compact-your-news.component.ts","src/app/views/news-layout/news-layout.component.html","src/app/views/news-layout/news-layout.component.ts","src/app/components/compact-birthdays/compact-birthdays.component.html","src/app/components/compact-birthdays/compact-birthdays.component.ts","src/app/models/restaurant-menu.ts","src/app/components/compact-restaurant-menu/compact-restaurant-menu.component.html","src/app/components/compact-restaurant-menu/compact-restaurant-menu.component.ts","src/app/components/compact-rss-feeds/compact-rss-feeds.component.html","src/app/components/compact-rss-feeds/compact-rss-feeds.component.ts","src/app/components/compact-upcoming-events/compact-upcoming-events.component.html","src/app/components/compact-upcoming-events/compact-upcoming-events.component.ts","src/app/views/compact-layout/compact-layout.component.html","src/app/views/compact-layout/compact-layout.component.ts","src/app/views/today/today.component.ts","src/app/views/today/today.component.html","projects/workplace-light/src/app/today-light/today-light.component.ts","projects/workplace-light/src/app/today-light/today-light.component.html","src/app/components/find-information/find-information-light-menu/find-information-light-menu.component.html","src/app/components/find-information/find-information-light-menu/find-information-light-menu.component.ts","src/app/views/find-information-light/find-information-light.component.ts","src/app/views/find-information-light/find-information-light.component.html","src/app/common/default-routes.ts","projects/cafcass/src/app/custom-route-config.ts","projects/cafcass/src/app/views/custom-collaboration/custom-collaboration.component.ts","projects/cafcass/src/app/views/custom-collaboration/custom-collaboration.component.html","projects/cafcass/src/app/app-routing.module.ts","projects/cafcass/src/app/app.module.ts","projects/cafcass/src/main.ts","src/app/services/pages.service.ts","src/app/models/simplified-term.ts","src/app/services/language-term.service.ts","src/app/models/app-tile.ts","src/app/models/principal.ts","src/app/services/user-items-to-read.service.ts","src/app/models/first-day-step.ts","src/app/services/infobox.service.ts","src/app/services/restaurant-menu.service.ts","src/app/directives/link.directive.ts","src/app/directives/stickyfill.directive.ts","src/app/common/breakpoints.ts","src/app/directives/img-src-proxy.directive.ts","src/app/services/taxonomy.service.ts","src/app/services/culture.service.ts","src/app/guards/navigation-canceling-error.ts","src/app/components/apps-and-tools/dialogs/app-tile-hide-dialog/app-tile-hide-dialog.component.ts","src/app/components/apps-and-tools/dialogs/app-tile-hide-dialog/app-tile-hide-dialog.component.html","src/app/components/apps-and-tools/app-tile-box/app-tile-box.component.html","src/app/components/apps-and-tools/app-tile-box/app-tile-box.component.ts","src/app/services/feature-settings.service.ts","src/app/services/smart-links.service.ts","src/app/components/form-controls/channel-control/channel-control.component.ts","src/app/components/form-controls/channel-control/channel-control.component.html","src/app/models/page.ts","src/app/modules/msteams/msteams.module.ts","src/app/services/msteams.service.ts","src/app/common/trending-result.ts","src/app/models/channel-term-app-tile.ts","node_modules/moment/locale sync ^\\.\\/.*$","src/app/directives/hide-parent-if-empty.directive.ts","src/app/services/user-channel-terms.service.ts","src/app/components/smart-links/smart-links.component.ts","src/app/components/smart-links/smart-links.component.html","src/app/models/cacheable-data.ts","src/app/services/cache.service.ts","src/app/guards/authorize-access.guard.ts","src/app/common/array-extensions.ts","src/app/common/app-tokens.ts","src/app/services/restaurant.service.ts","src/app/common/constants.ts","src/app/directives/css-background-image-proxy.directive.ts","src/app/pipes/safe.pipe.ts","src/app/models/person-extended.ts","src/app/services/app-tile.service.ts","src/app/directives/feature-toggle.directive.ts","src/app/models/tracking-event.ts","src/app/directives/ng-subscribe.directive.ts","src/app/services/power-bi.service.ts","src/app/services/sphome.service.ts","src/app/directives/dom-change.directive.ts","src/app/components/html-editor/html-editor.component.ts","src/app/components/html-editor/html-editor.component.html","src/app/components/required-reading/required-reading.component.ts","src/app/components/required-reading/required-reading.component.html","src/app/common/custom-http-param-encode.ts","src/app/services/groups.service.ts","src/app/components/alert-templates/alert-templates.component.ts","src/app/components/alert-templates/alert-templates.component.html","src/app/services/my-documents.service.ts","src/app/injectors/portal.injector.ts","src/app/common/rss-feed.ts","src/app/services/search.service.ts","src/app/common/filtering-behavior.ts","src/app/services/auth.service.ts","src/app/models/user-app-tile.ts","src/app/components/commento/commento.component.ts","src/app/components/commento/commento.component.html","src/app/views/pages/page/page.component.html","src/app/views/pages/page/page.component.ts","src/app/components/infobox-zone/infobox-zone.component.ts","src/app/components/infobox-zone/infobox-zone.component.html","src/app/components/broadcasts/broadcast-banner-list/broadcast-banner-list.component.ts","src/app/components/broadcasts/broadcast-banner-list/broadcast-banner-list.component.html","src/app/services/image.service.ts","src/app/common/news-mode.ts","src/app/components/infobox-zone/text/text.component.html","src/app/components/infobox-zone/text/text.component.ts","src/app/components/infobox-zone/picture/picture.component.html","src/app/components/infobox-zone/picture/picture.component.ts","src/app/components/infobox-zone/video/video.component.html","src/app/components/infobox-zone/video/video.component.ts","src/app/components/infobox-zone/infobox/infobox.component.html","src/app/components/infobox-zone/infobox/infobox.component.ts","src/app/models/component.ts","src/app/services/user-language-term.service.ts","src/app/models/user.ts","src/app/services/user.service.ts","src/app/common/roles.ts","src/app/models/infobox.ts","src/app/models/broadcast-message.ts","src/app/common/utilities.ts","src/app/common/o365-licenses.ts","src/app/models/user-channel-term.ts","src/app/views/pages/add-edit-page/add-edit-page.component.html","src/app/views/pages/add-edit-page/add-edit-page.component.ts","src/app/components/page-filter/page-filter.component.html","src/app/components/page-filter/page-filter.component.ts","src/app/components/page-list/page-list.component.html","src/app/components/page-list/page-list.component.ts","src/app/services/page-center.service.ts","src/app/views/pages/page-center/page-center.component.html","src/app/views/pages/page-center/page-center.component.ts","src/app/views/pages/page/page.resolver.ts","src/app/views/pages/content-page-center-view/content-page-center-view.component.html","src/app/views/pages/content-page-center-view/content-page-center-view.component.ts","src/app/views/pages/news-center-view/news-center-view.component.html","src/app/views/pages/news-center-view/news-center-view.component.ts","src/app/views/pages/pages-view.module.ts","src/app/models/search-result.ts","src/app/models/component-state.ts","src/app/guards/license.guard.ts","src/app/models/language-term-app-tile.ts","src/app/services/my-followed-sites.service.ts","src/app/services/internet-status.service.ts","src/app/components/text-placeholder/text-placeholder.component.ts","src/app/components/text-placeholder/text-placeholder.component.html","src/app/components/infobox-zone/infobox-utility.ts","src/app/services/kpi-chart-group.service.ts","$_lazy_route_resource lazy namespace object"],"names":["HubSiteData","opt","Object","assign","this","NavigationService","http","cache","environment","channelService","taxonomyService","userChannelService","httpHelper","featureSettingsStoreService","cacheKeyPrefix","useCache","getHubSiteNavigation_LastUsedUrl","getNavigationNodes$","cacheKey","getTermSet","state","navigationTermSet","NAVIGATION_TERMSET_GUID","pipe","tap","data","set","catchError","handleError","operation","result","Array","shareReplay","bufferSize","refCount","cachedData","get","concat","of","hubSiteUrl","getHubSiteNavigation$","map","console","log","JSON","parse","value","combineLatest","getChannels","getUserChannelTerms","channels","userChannelTerms","siteListTerm","filter","c","undefined","LocalCustomProperties","SETTINGS_CHANNEL_TERM_HUB_SITE_HOME_LIST","toLowerCase","length","myTerms","ChannelTermId","foundHomeSite","Terms","t","includes","Guid","homeSiteUrl","SETTINGS_CHANNEL_TERM_HUB_SITE_URL","coreWorkplaceSiteUrl","PowerBIFrameType","PowerBIFrame","SiteService","getSiteInfoFromUrl$","Map","getGroupEndpoints$","findSitesResult$","getHubSiteId$","url","endPoint","indexOf","matches","match","has","httpParams","append","fetchOperation","GRAPH_API_ENDPOINT","GRAPH_API_VERSION_ONE","params","response","count","encodeURI","toString","API_ENDPOINT","results","Items","groupId","GRAPH_API_BETA_VERSION","r","rethrow","term","siteId","siteInfo","IsHubSite","HubSiteId","dateValueIsAfterOrBeforeOtherControl","otherDateControlId","shouldBeAfterOtherDateValue","control","isNaN","getTime","parent","otherDateControl","valid","updateValueAndValidity","UserAppTileService","userService","getUserAppTiles$","reload$","refresh$","clear","removeAllItemsInPersistentCacheWithGeneratedKeyPrefix","next","includeHidden","userAppTiles$","getUserAppTiles","getMyDetailsFromMsGraph$","getMyDetailsFromMsGraph","userAppTiles","userDetails","app","AppTile","O365ServiceName","foundLicense","assignedPlans","find","plan","service","capabilityStatus","lastVisitedDate","getNewOrUpdatedUserAppTilesSinceLastVisit$","toISOString","p","userAppTile","AppTileBroadcastMessages","activeAptileBroadcastMessages","b","BroadcastMessage","EndDate","Date","StartDate","id","put","reload","delete","post","SiteElementType","SiteElement","ActionRouterLinkComponent","ActionRouterLinkModule","Audit","DateTime","NewValues","channelPropertyKeyToRemove","keys","forEach","key","channelProperty","NewChannelGuidValues","channelObject","cpKey","channelObjKey","ChannelService","localeId","licenseService","cultureService","featureService","channelTermsetId","channelTermsetGUID","noCache","hasUserAny365License","hasUser365License","getChannelsFromSharePoint","getChannelsFromApi","termId","getTermByIdWithFullHierarchy","findRecursive","filterDeprecated","CHANNEL_TERMSET_GUID","sort","a","Name","localeCompare","getCachableInfo","AbsoluteExpirationDate","getAmountOfChangesSince","AddedToCache","amount","Data","getLcidForCurrentLocale","lcid","terms","LanguageType","UserLanguageTerm","PageQuery","PageType","News","ChannelMatchingMode","Or","FindText","OwnerOrEditorUpnId","IncludeDrafts","Skip","Take","showBroadcastsIconInTopNav","showSearchbarInTopNav","hideNewsTags","showMessageBroadcastCriticalLabel","showMessageBroadcastWarningLabel","showMessageBroadcastInformationLabel","disableOverlayOnInfoBoxes","showNewOrModifiedbadgeOnAppTile","enabledCollapsableNodesOnFindInformation","enableThirdLevelMenusInFindInformation","title","DEFAULT_TITLE","newsModeFeaturedNews","GraphFromNewsCenterSite","newsModePersonalNews","excludeSitesFromNewsSearch","everyoneCanCreateCollabSites","rssFeedConfig","newsFilterButtonConfig","enableSignalR","enableUpdateChecksForNewContent","redirectToTeamsByDefault","enableFirstDayPopupDialog","enableAutoUserChannelSync","noChannelSelectionLimitationsForAdmins","noChannelSelectionLimitationsForEditors","enableRequiredReading","allowMarkAsReadFromReqReadList","includeDraftsInReqReadList","searchCenterUrl","customSearchResult","showHubSiteFilterInSearch","hubSiteFilterInSearchDefault","hideNonGroups","enableRightSection","myColleaguesShowDepartment","myColleaguesShowLocation","myColleaguesShowOfficePhone","myColleaguesShowOrgChart","myColleagueNumberOfGraphResultsCap","userServiceAppendedFilter","useGraphToExtendPeopleSearch","showDescriptionInSearchResult","useSearchSuggestionMode","useSearchDidYouMean","enableProfileCardView","enableUserExperience","enableSearchFromCustomDB","enableProjectSection","chartsBackground","togglePagesFromSPorWP","colleagueProperties","Property1","Label","Property2","showBirthdayCalendar","showRestaurantMenus","defaultImageThumbnailSize","auditsEnabled","stickyHeader","showNewsDescription","myDetailsMsGraphProperties","coreIntranetEnabled","smartLinksEnabled","editorInsightsShowTotalVisits","bypassLicenseFilterInTopNav","addTeamByDefault","enableModernSPNewsLanguageFilter","enableAutoUserLanguageSync","enableAzureADGroupSync","enableLanguageFilteringForSharepointPages","enableLanguageFilteringForWorkplaceInfoboxes","enableLanguageFilteringForSharepointEvents","enableLanguageFilteringForWorkplace","enableShowNonLanguageContentForAllUsers","enableIosA2hsBanner","openAllLinksInSameTab","openAppAndToolsInSameTab","firstDayBackgroundImage","hash","enableFeaturedPages","enableNotificationSubscriptions","showRefreshDialogTitle","enableSiteIndexPopover","infoBoxShowMigrateBtn","showGoToDelveOnUserMenu","enableCollapsableChannels","infoboxImageUploadinstructionsImage","powerBIEmbedCodeUploadinstructionsImage","powerBIBookmarkUploadinstructionsImage","requireChannelSelectionForBroadcastAlerts","requireChannelSelectionForPowerBIVisuals","showSharePointNewsCenterLink","peopleResultSourceId","showFilterByDepartmentButtons","disableLocalStorage","showFilterInNewsCenter","newsNumberOfDaysBack","newsOrPageIconsInSearch","news","iconClass","iconUrl","page","showPowerBIComponent","enableTeamsNotification","teamsNotificationInstructionsImage","showGuideNavigation","enableCompactDesign","FeatureSettingsStoreService","super","featureSettings","settingFromDb","settingKey","DataType","Value","featureSetting","setValueOfSetting","Id","setState","SiteElementsService","type","UNDEFINED","language","siteElement","Type","Language","removeFromPersistentCache","ActionLinkComponent","ActionLinkModule","PeopleCardComponent","featureStoreSettingsService","router","activatedRoute","injector","newtab","expanded","size","useTeamsChat","clicked","getPreferredNameLetters","person","generateInitials","displayName","fallbackUrl","event","navigate","emit","outlet","outlets","modal","then","userUpn","userPrincipalName","showDepartment","showLocation","showOfficePhone","showOrgChart","photoUrl$","getUserPhotoByUpn","replace","customComponents","portalInjector","create","mobilePhonePortal","PeopleCardModule","NavigationNode","SPNavigationNode","WPNavigationNode","Store","initialState","_state$","state$","asObservable","getValue","nextState","GITVERSION","DATESTAMP","WidgetPlaceholderComponent","WidgetPlaceholderModule","HttpHelper","snackBar","internetStatusService","showErrorSnackbar","error","status","openSnackBar","message","online","cachedValue","offline","SecurityService","authService","isUserMemberOfSharePointGroup$","groupTitle","httpRequest","hasLicense","groupIds","gid","membershipToGroupIds","GroupId","UserIsMember","some","roles","idTokenClaims","roles$","role","roleName","getRoleName","authorizationMode","Claims","getUserRoleClaimValues","isUserMemberOfSharePointGroup","obs$","hasUserAppRole","authMode","Admin","WORKPLACE_ADMINISTRATORS_ROLE_NAME","Editor","WORKPLACE_EDITORS_ROLE_NAME","CollabSiteCreator","WORKPLACE_COLLABSITECREATOR_ROLE_NAME","AppEditor","WORKPLACE_APP_EDITOR_ROLE_NAME","MessageBroadcastEditor","WORKPLACE_MESSAGEBROADCAST_EDITOR_ROLE_NAME","FooterEditor","WORKPLACE_FOOTER_EDITOR_ROLE_NAME","EditorDashboardEditor","WORKPLACE_EDITORDASHBOARD_EDITOR_ROLE_NAME","PowerBIEditor","WORKPLACE_POWER_BI_EDITOR_ROLE_NAME","SharePoint","WORKPLACE_ADMINISTRATORS_GROUP_TITLE","WORKPLACE_EDITORS_GROUP_TITLE","COLLAB_SITE_CREATION_GROUP_TITLE","FirstDayHeroComponent","platformLocation","backgroundImage","getBaseHrefFromDOM","FirstDayHeroModule","routeConfig","componentFactoryResolver","vcr","RouteMap","MainMap","route","routeKey","path","components","getComponentsOnRoute","ComponentStatesOnRoutesService","hasInitialized","viewContainerRef","config","updatedComponentState","Routes","componentState","componentStatesForRouteWithSelector","e","ComponentId","push","cState","Component","Configurations","componentStatesOnRoute","componentEvent","mappedComponenents","currentComponentState","LastCheckedForNewContent","ShowBadge","Refresh","s","UrlHelperService","rendererFactory","renderer","createRenderer","parser","createElement","href","urlToReturn","protocol","hostname","pathname","remove","vars","search","substring","split","i","pair","decodeURIComponent","UserTabComponentConfigurationsService","getUserTabConfig$","userTabConfiguration","userTabConfigurations","NavigationNodeService","getAllNavigationNodes$","node","nodes","AuthorizationMode","LicenseService","hasUser365License$","user","assignedLicenses","license","skuId","MICROSOFT_365_BUSINESS","MICROSOFT_365_E3","Microsoft_365_E5","Microsoft_365_F1","OFFICE_365_BUSINESS","O365_BUSINESS_ESSENTIALS","O365_BUSINESS_PREMIUM","OFFICE_365_ENTERPRISE_E1","OFFICE_365_ENTERPRISE_E2","OFFICE_365_ENTERPRISE_E3","OFFICE_365_ENTERPRISE_E4","OFFICE_365_ENTERPRISE_E5","OFFICE_365_ENTERPRISE_E5_WITHOUT_AUDIO_CONFERENCING","OFFICE_365_F1","OFFICE_365_MIDSIZE_BUSINESS","OFFICE_365_PROPLUS","OFFICE_365_SMALL_BUSINESS","OFFICE_365_SMALL_BUSINESS_PREMIUM","skuIds","FeatureSetting","UserTabComponentConfiguration","NewsService","spHomeService","searchService","urlHelperService","translationFields","getModernTopNewsGraph$","getTopNewsApi$","getModernNewsFromSearch$","reloadAllTopNews$","reloadGetModernTopNewsGraph$","reloadGetTopNewsApi$","reloadAllPersonalNews$","reloadGetModernPersonalNewsFromGraph$","reloadGetPersonalNewsFromApi$","reloadGetModernNewsFromSearch$","getSharePointNewsPageFromOriginalUrl$","getModernPersonalNewsFromGraph$","getPersonalNewsFromApi$","start","getSPHomeContext","ctx","httpHeaders","Payload","Urls","headers","lastCheckedDate","userLanguageTerms$","enableWorkplaceLight","licensed","getNewTopNewsFromApi","getNewOrUpdatedModernTopNewsFromGraph","apiItems","graphItems","listsRequest","newsCenterSiteUrl","listItemResult","item","Title","fields","PublishedDate","Picture","Url","Description","CommentsCount","LikesCount","Path","webUrl","LanguageTermId","TermGuid","IsSharePointNews","SenderTags","pages","userLanguageTerms","defaultLanguageTermId","PublishingDate","BannerImageUrl","Content","SlugTitle","selectFields","getLocaleWithSuffix","Channels","newsPage","originalUrl","listItem","parentReference","authorityUrl","getAuthorityUrlWithoutQueryStrings","hostName","getHostName","getSpPageInfoFromUrl","ChannelTermPages","userChannelTerms$","httpCall$","pages$","HTMLToPlainText","channelTerms","ct","getMyModernPersonalNewsFromGraph$","found","matchingChannels","newsCenterSite","excludeSites","languageFilterQuery","excludeSitesQuery","join","getModernNewsFromSearch","channelsMngProp","managedPropertyConfig","newsChannelManagedProperty","topNewsMngProp","newsIsTopNewsManagedProperty","channelQuery","query","postQuery","request","Querytext","RowLimit","EnableSorting","TrimDuplicates","SortList","SelectProperties","newsAmountOfCommentsManagedProperty","newsAmountOfLikesManagedProperty","newsLanguageManagedProperty","newsSenderTagsManagedProperty","Properties","BoolVal","QueryPropertyValueTypeIndex","sendPostSearchQuery","fromSearchResult","htmlContent","htmlParser","innerHTML","plainText","innerText","NavigationMode","ErrorTemplatesComponent","ErrorTemplatesModule","NewsPage","newsAmountOfCommentsMP","newsAmountOfLikesMP","newsChannelMP","pageLanguageMP","newsSenderTagMP","PictureThumbnailURL","FirstPublishedDate","ViewsCount","ViewsLifeTimeUniqueUsers","parseManagedMetaDataString","getManagedMetaDataTermId","SiteUrl","SPWebUrl","ImageUrl","SiteName","Site","metadatastring","slice","ConfirmDialogComponent","dialogRef","close","confirm","ConfirmDialogModule","BaseTrackingService","GalleryComponent","document","cdRef","isSelectable","maxAmountSelectable","clearSelections","imageChange","imageEnter","imageLeave","amountToDisplay","objectFitFallback","currentlySelectedImages","fetchedAmountOfImages","images","amountToDisplayCurrently","amountToIncrement","currentImagesShowing","documentElement","style","image","isImageSelected","shift","emitSelectedImages","detectChanges","from","imageItem","parentElement","src","backgroundSize","backgroundPosition","GalleryModule","BroadcastService","appTileService","userAppTileService","getActiveBroadcastMessages$","getAllBroadcastMessages$","getMyHiddenBroadcastMessages$","EndDateAsDate","StartDateAsDate","broadcast","SearchPostQuery","SearchPostQueryRequest","AuthInterceptor","req","scopes","getScopesForEndpoint","handle","accountInfo","throwError","attachToken$","mergeMap","authReq","clone","accessToken","acquireTokenAndContinue$","useRedirect","acquireTokenSilentWithFallBackToRedirect","account","acquireTokenSilentWithFallBackToPopup","err","name","acquireTokenRedirect","acquireTokenPopup","statusText","RefreshPromptDialogComponent","window","showTitle","location","refresh","RefreshPromptDialogModule","WindowService","platformId","_window","factoryFn","windowService","nativeWindow","WindowModule","provide","useFactory","deps","AppInitService","cacheService","featureSettingsService","msteamsService","CacheKeyPopupsAreAllowed","PopupsAreAllowed","getWithCustomKey","Promise","resolve","reject","initObservable$","inTeamsAuthPopupRedirect","handleRedirect","switchMap","authenticatedResult","initMsTeams","notifyAuthSuccess","stringify","toPromise","isInTeamsApp","ssoSilent","loginRequest","initUserAndFeatures","errorCode","silentSSOInsufficientInfoError","code","teamsObs$","authenticate","createSignInButtonAndListenOnClick","login","isInIframe","authResult","loginPopup","popUpWindowError","setWithCustomKey","loginRedirect","interactionInProgress","redirectInIframeError","onClickAction","addPopupNotice","div","button","paragraph","img","addClass","cssClass","setAttribute","paragraphText","createText","$localize","buttonText","appendChild","body","fromEvent","first","forkJoin","getOrCreateMe","getFeatureSettings","BroadcastsComponent","componentEventService","elementRef","userChannelTermsService","userLanguageTermService","showHideButton","channels$","broadcastMessages$","getActiveBroadcastMessages","getMyHiddenBroadcastMessages","broadcasts","hiddenBroadcasts","ChannelTermBroadcastMessages","h","iif","getUserLanguageTerms","subscription","componentsOnRouteState","nativeElement","localName","subscribe","updateStates","unsubscribe","BroadcastsModule","FirstDayDialogComponent","setTimeout","onBtnClick","FirstDayDialogModule","FooterTemplate","HTML","AppSettingsService","getDefaultRequestCulture$","responseType","endOfDay","FooterComponent","locale","dialog","siteElementsService","securityService","appSettingsService","footerElementSubject$","Subject","editMode","isNew","Subscription","footerEditorForm","FooterContent","availableLanguages","siteElement$","startWith","getSiteElements","FOOTER","getDefaultRequestCulture","siteElements","defaultRequestCulture","defaultRequestCultureLanguage","substr","setValue","existingSiteElement","hasUserPermissionToEdit$","hasUserAnyAppRole","languagesVar","andVar","defaultVar","sortedLanguages","l","tag","className","cl","availableLanguagesOutput","currentLanguage","siteElementToAddOrUpdate","add","addSiteElement","open","afterClosed","concatMap","updateSiteElements","FooterModule","$event","stopPropagation","TopnavBroadcastsComponent","broadcastService","trigger","closeMenu","TopnavBroadcastsModule","LogoComponent","logo","production","workPlaceName","workplaceName","LogoModule","ToolbarButtonComponent","ToolbarButtonModule","SearchFormComponent","changeDetectorRef","subscriptions","character","toUpperCase","KeyboardEvent","element","target","keyCode","isLetter","queryParams","q","afterOpened","SEARCH_DIALOG_ID","searchInputElement","blur","handleModalCloseFromComponent","focus","onElementClick","onKeyUp","SearchFormModule","UserMenuComponent","infoboxService","infoboxZones","editModeInfoBoxes$","currentEditMode$","userProfile","logOut","anyInfoBoxesOnPage","getElementsByTagName","checked","enableMyProfile","userProfile$","hasPermissionEditorOrAdmin$","hasPermissionEditorOrAdminOrDashBoard$","hasPermissionAdmin$","UserMenuModule","BadgeMenuService","userTabComponentConfigurationsService","getUserTabConfig","userTabComponentConfiguration","myBoardRoute","foundComponent","component","d","Hidden","TopnavComponent","badgeMenuService","cdr","sideMenuIsOpen","toggleSideMenuEvent","guideUrl","guideSiteUrl","additionalTopNavLink","linkTopNav","hasOwnProperty","onlyShowForLicensedUsers","routeLinks$","showInTopNav","licenseFilter","showBadge$","showBadge","TopnavModule","IosPwaBannerComponent","cookie","IOS_BANNER_CLOSED_COOKIE","IosPwaBannerModule","SkipLinksComponent","staticSkipLinks","Sections","section","events","dynamicSkipLinks","skipLinks","elementId","getElementById","test","tagName","tabIndex","SkipLinksModule","SignalRService","innerSubject$","BehaviorSubject","hubConnection","HubConnectionBuilder","withUrl","port","accessTokenFactory","configureLogging","Information","Debug","withAutomaticReconnect","build","onclose","complete","serverTimeoutInMilliseconds","keepAliveIntervalInMilliseconds","HubConnection","Connected","finalize","off","stop","catch","publishReplay","OrganizationEvent","OrganizationCalendarService","reloadGetNewOrUpdatedOrganizationCalendarEventsFromGraph$","getOrganizationCalendarEventsFromGraph$","now","ListGuid","Location","EventDate","BannerUrl","AllDayEvent","Recurrence","RecurrenceData","getNewOrUpdatedOrganizationCalendarEventsFromGraph$","UpdatedContentService","newsService","organizationCalendarService","componentStatesOnRoutesService","userItemsToReadService","minutesBetweenUpdatedContentChecks","routeMap","observableChecksArr","componentStates","current","timeStamp","timeStampValue","COMPONENT_VISITED_CACHEKEY_SUFFIX","isAfter","addMinutes","getNewOrUpdatedOrganizationCalendarEventsFromGraph","reloadOrganizationCalendarEventsFromGraph","getNewTopNews","reloadAllTopNews","getNewOrUpdatedUserAppTilesSinceLastVisit","getNewOrUpdatedUserToReadSinceLastVisit","MainComponent","titleService","componentStateService","signalRService","updatedContentService","platform","breakpointObserver","initStates","sidenav","toggle","internetStatus$","whenOnline","whenOffline","opened","toggleSideMenu","snapshot","setTitle","onNavigationEnd","FirstDayWizardStep","None","firstDayDialogRef","minWidth","panelClass","autoFocus","disableClose","closeOnNavigation","connect","connection","on","syncUserChannels","syncUserChannelsWithAD","syncUserLanguageTermsWithAD","IOS","isSafari","isInStandAloneMode","hasUserClosedBanner","hasBackdrop","position","bottom","navigator","isMatched","MainModule","WorkplaceAppModule","parentModule","Error","ngModule","providers","useClass","multi","initAndAuthenticate","appInitService","init","AppComponent","shouldLoadMainComponent","twoLetterLangCode","clearCacheIfAppWasUpdated","shouldLoadMain","currentStoredVersion","clearPersistentCacheFromCoreWP","removeAllExpiredItemsInPersistentCache","reason","unlicensed","ManagedProperties","DefaultConfig","birthDayDateManagedProperty","tenantHostUrl","msalConfig","tenant","auth","clientId","authority","protectedResourceScopeMap","blogSiteUrl","complimentsWallSiteUrl","gaTrackingKey","appInsightsTrackingKey","navigationMode","HubSite","trendingResult","Modern","newsArchiveLink","sharePointNewsCenterUrl","prefixToO365Groups","myColleagueRootTerm","Query","ResultIcon","calendarPageInfoUrl","AppInsightsService","appInsights","instrumentationKey","enableDebug","loadAppInsights","trackEvent","TRACKING_EVENT_TYPE_WORKPLACE_USER_CHANNELS","properties","channelTermId","channel","loadStartTime","loadTime","trackRouterEvent","headerTitle","getTitle","trackPageView","uri","urlAfterRedirects","duration","currentRoute","FeaturedNewsComponent","trackingService","amountOfDaysBackInTime","amountOfNewsToDisplay","titleMaxLength","maxNumberOfShowMore","fetchedAmountOfNews","amountOfNewsToIncreaseWith","loading","moreNewsSubject","errorSubject$","fetchFromGraph","numberOfShowMoreClicks","showNewsDesc","isQuickView","amountOfNewsToDisplayConfigured","componentName","observe","Medium","Large","XLarge","amountOfNewsToDisplayCurrently","breakpoints","newsCenterUrl","x","componentEventData","subjectsToListenOn$","Number","isInteger","featuredNewsItems$","getTopNewsFromApi","getModernTopNewsFromGraph","ced","ShowNewOrModifiedBadge","newsItem","text","truncate","scrollIntoFeatureView","scrollIntoView","hide","trackingEvent","TRACKING_EVENT_TYPE_NEWS_DESCR_CLICK","label","componentId","getSenderTagString","transform","FeaturedNewsModule","NewsCardListComponent","featureStore","showChannelTagsPrintout","channelsString","NewsCardListModule","MyNewsComponent","followedSitesService","siteService","userLanguageTermsService","amountOfFollowedSitesToGet","preambleTextMaxLength","followedSiteNewsBatch","user$","race","personalNewsFromSharePoint$","isLicensed","myPersonalNewsFromGraph$","getMyModernPersonalNewsFromGraph","GraphFromNewsCenterSiteAndSearchFromFollowedSites","newsfromMyFollowedSites$","getNewsFromMyFollowedSites$","personalNews","newsFromFollowedSites","SearchNewsFromAnySiteWithChannelField","getPersonalModernNewsFromAllSitesFromSearch","SiteInfo$","getSiteInfoFromUrl","PageInfo$","getModernNewsItemInfoFromPagePath","personalNewsItems$","getPersonalNewsFromApi","newsFromApi","ShowNewsFromFollowedSites","getMyFollowedSitesFromSpHome","followedSites","OriginalUrl","urls","getModernNewsFromAllSitesExceptNewsCenterFromSearch","newsFromSearch","MyNewsModule","OrganizationCalendarComponent","hideParentIfEmptyDirective","numEventsPerLoad","calendarUrl","singleEventCalendarUrl","numEventsShowing","maxEventsToShow","eventsToDisplay","allEvents","loadEventSubscription","getOrganizationCalendarEventsFromGraph","organizationEvents","val","parseEvents","parseRecurringEvents","orderByDate","hideElement","showElement","arr","dateProp","eventInstance","isSameDay","EventInstance","OrganizationCalendarName","ItemUrl","end","durationInSec","er","total","rTotal","startDate","endDate","differenceInSeconds","parseDate","wd","wom","rTotalstring","parseInt","str","formatString","frequency","loop","ed","setSeconds","getSeconds","ni","cloneObj","fRecurrence","ID","setDate","getDate","initDay","getDay","nd","day","getMonth","setMonth","weekdayOfMonth","temp","month","setFullYear","getFullYear","dayOfMonth","itemUrl","date","allDay","lastIndexOf","dt","trim","obj","copy","setTime","len","attr","OrganizationCalendarModule","BirthdaysComponent","useTeamsCongratulations","today","moreBirthdaysSubject","fetchedAmount","dateToQuery","formatISO","representation","breakPoint","getCurrentBootstrapBreakpoint","amountOfBirthdaysToDisplay","xxxl","xxl","xs","amountOfBirthdaysToIncreaseWith","amountOfBirthdaysToDisplayCurrently","birthdayPersonsToday$","getPeopleWithBirthdayDate","WorkEmail","preferredName","BirthdaysModule","RestaurantMenuComponent","restaurantService","lunchMenuService","changeSubject","currentWeekNumber","getISOWeek","startOfISOWeek","endOfISOWeek","restaurants$","getAllRestaurants","restaurants","userChannels","restaurant","UserChannelMatched","ChannelTermRestaurants","restaurantChannel","userChannel","matchedRestaurant","selectedRestaurant","restaurantMenus$","getCurrentRestaurantMenusForRestaurant","RestaurantMenuModule","FeedService","feedsInfo","numberOfFeedsToFetch","paramsFeedUrls","feed","FeedLink","paramsTagNames","TagName","allFeedItems","items","RssFeedsComponent","moreFeedsSubject","smallModes","sm","md","lg","xl","mediumModes","breakpoint","amountToShowPerLoad","Small","amountToFetch","subscribedToRssFeature","feedsFrom","feedLinksAndTagName","amountCurrentlyShowing","isFeedUrlConfigured","feeds$","feedLoading","feedinfo","feeds","channelTerm","getRssFeeds","fetchedAmountOfFeeds","splice","RssFeedsModule","MarkComponentVisitedDirective","componentConfigMap","htmlElement","getAttributeNames","attributeValue","getAttribute","toLocaleLowerCase","MarkComponentVisitedModule","BlogService","getModernBlogPostsFromSearch$","reloadGetModernBlogPostsFromSearch$","parsedResults","takeUntil","getModernPersonalNewsFromBlogSite$","getMyModernPersonalNewsFromSite$","CustomMyBlogsComponent","amountOfBlogPostsToDisplay","moreBlogPostsSubject","fetchedAmountOfPosts","amountOfBlogPostsToDisplayCurrently","blogCenterUrl","personalBlogItems$","getMyModernPersonalNewsFromBlogSite","CustomMyBlogsModule","ComplimentsService","getModernComplimentPostsFromSearch$","reloadGetModernComplimentPostsFromSearch$","getModernPersonalNewsFromComplimentSite$","CustomComplimentsWallComponent","amountOfComplimentsToDisplay","moreComplimentPostsSubject","amountOfComplimentPostsToDisplayCurrently","complimentsWallUrl","personalComplimentItems$","getMyModernPersonalNewsFromComplimentSite","CustomComplimentsWallModule","BarChartComponent","graphHeight","chart","ChartItems","max","Math","apply","o","ChartValue","min","sum","reduce","prev","cur","roundOffDif","adjustToRoundOff","GraphValue","chartItems","BarChartModule","PieChartComponent","PieChartDegree","Repeat","index","PieChartModule","KpiChartsComponent","kpiChartGroupService","activeGroups$","getActiveKPIChartGroups","classes","ChartWidth","KpiChartsModule","ActionButtonComponent","clickEvent","buttonClick","ActionButtonModule","PowerBIFrameComponent","mobileBreakepoint","subscription$","isMobileDevice","initialized","ANDROID","innerWidth","powerBI","Service","hpmFactory","wpmpFactory","routerFactory","resizeObservable$","debounceTime","updateMobileViewSettings","reportContainer","reset","setPowerBIFrame","errorObservable$","frame","evt","rebuildConfig","buildEmbedConfig","embed","embedConfig","setComponentTitle","selectedFrame","enableMobileView","settings","layoutType","LayoutType","MobilePortrait","Custom","pageView","MobileViewHeight","tokenType","TokenType","Aad","embedUrl","EmbedUrl","EmbedId","permissions","Permissions","Read","viewMode","ViewMode","View","bookmark","BookmarkId","filterPaneEnabled","ShowFilterPane","navContentPaneEnabled","ShowNavigationPane","background","BackgroundType","Transparent","PowerBIFrameModule","PowerBIComponent","powerBIService","getAccessToken","POWERBI_API_ENDPOINT","userAccessToken$","selectedFrame$","activatedRouteForPrimaryOutlet","root","children","_","allPowerBIFrames$","getAllPowerBIFrames","powerBIFrames$","hasUserLicense","POWER_BI_FOR_OFFICE_365_ADD_ON","POWER_BI_FREE","POWER_BI_PRO","frames","RouteId","Active","ChannelTermPowerBIFrames","uc","PowerBIModule","CustomTodayComponent","CustomTodayModule","AuthGuard","childRoute","canActivate","DEFAULT_MODAL_ROUTE_CONFIG","loadChildren","m","UserAppTileModalViewModule","AppsAndToolsDialogIntroModalModule","AppTileModalViewModule","BroadcastMessagesModalViewModule","AuditsViewModule","FindInformationModalViewModule","ResourceValuesModalViewModule","SearchModalViewModule","InfoBoxModalViewModule","PowerBIModalViewModule","RestaurantMenuModalViewModule","FollowedPage","MyFollowedPagesService","httpClient","myFollowedPages$","amountOfItems","param","DriveId","driveId","Icon","ShowIcon","FindInformationSavedPagesComponent","followedPageCount","linkToSeeAllSavedPages","getMyFollowingPages","savedPages","preventDefault","removePageSubscription","removePage","removedPage","findIndex","FindInformationSavedPagesModule","EditorTrendingNewsService","newsCount","limitPath","ModernOnlyFromCoreRootSite","pageCount","FindInformationTrendingPagesComponent","trendingPageCount","trendingPages$","getTrendingPages","FindInformationTrendingPagesModule","FindInformationMegaMenuComponent","enableCollapsableNodes","navigationNodes$","getUsersHomeHubSiteUrl","siteUrl","getHubSiteNavigation","n","navigation","mapHubSiteNodes","getNavigationNodes","mapSimplifiedTerms","thereAreNodesWithSubnodesAboveThis","foundThis","Children","nodeHasChildren","getHubSiteUrl","IsDocLib","IsExternal","ParentId","ListTemplateType","AudienceIds","IsAvailableForTagging","FriendlyUrl","TermCount","LastModified","Labels","Selected","DisableSelection","IsRoot","CustomFindInformationMegaMenuComponent","CustomFindInformationMegaMenuModule","CustomFindInformationComponent","CustomFindInformationModule","ColleaguesComponent","myColleaguesCount","me$","myColleagues$","getRelatedPeople","colleagues","myColeagues","colleague","fromPerson","ChangeType","MyCollaborationActivitiesService","myCollabcacheKey","myCollabUserActivityCacheKey","getItemDetails$","getMyFrequentSites$","getChangesForSite$","siteExclude","httpParamsMyCollabActivities","filteredResults","frequentSite","resourceReference","resource","maxAmountOfChanges","serviceMapKey","changesResult","changes","queryText","change","ItemId","ListId","SiteId","SiteTitle","resourceVisualization","TimeAsDate","parseISO","Time","WebId","UniqueId","queryTextWithOr","searchRequests","amountOfSplits","ceil","chunk","searchRequest","buildSearchPostQuery","merge","searchResults","Filename","ListItem$","getItemDetails","values","listId","itemId","numOfParts","temparray","MyCollaborationActivitiesWidgetComponent","myCollabActivityService","rootUrl","allSiteActivitiesUrl","amountToLoad","myFrequentSites$","getMyFrequentSites","resources","mapOfSites","siteChangeRequests","mapKey","getChangesForSite","UserPhoto$","EditorEmailHint","TRANSPARENT_IMAGE","userName","MyLatestSitesService","MyLatestSitesComponent","myRecentSitesService","itemsToShow","endPointsErrorSubject$","myLatestSites$","getMyRecentSitesFromSpHome","groups","EndPoints$","getGroupEndpoints","ItemReference","site","currentTarget","classList","contains","removeClass","whenMouseEnter","Hovered","PopoverComponent","focusTrap","isOpen","_manualListeners","show","connectedOverlay","overlayRef","overlayElement","originOverlay","listener","addEventListener","hasAttached","focusInitialElement","keydownEvents","detach","toElement","relatedTarget","leaveToPopover","removeEventListener","opacity","offset","TableOfContentsComponent","scroll","links","scrollingSubscription","scrolled","onScroll","querySelectorAll","selectors","header","attributes","rect","getBoundingClientRect","top","pageYOffset","height","active","inView","screenTop","screenBottom","innerHeight","link","SiteIndexComponent","groupsService","siteIndexForm","selectedMode","YourSites","enablePopover","allowedToCreateNew$","filter$","valueChanges","patchValue","mySitesGroupedByLetters$","getAllSiteCollections","getAllMyOwnedGroups","getAllMyMemberGroups","filterString","siteSearchResults","ownedGroups","memberGroups","uniqueMapOfOwnerAndMemberGroups","group","doesGroupNameContainString","siteGroupTeam","buildSiteAndGroupTeam","assignSiteToMap","allSitesGroupedByLetters$","getAllGroups","hasTeam","resourceProvisioningOptions","baseUrl","HasTeam","HasYammer","description","Visibility","visibility","ConversationUrl","COLLAB_UNIFIED_GROUPS_CONVERSATION_LINK_TARGET","FilesUrl","COLLAB_UNIFIED_GROUPS_FILES_LINK_TARGET","CalendarUrl","COLLAB_UNIFIED_GROUPS_CALENDER_LINK_TARGET","PlannerUrl","COLLAB_UNIFIED_GROUPS_PLANNER_LINK_TARGET","firstChar","charAt","CollaborationComponent","FindInformationComponent","MyAppTilesComponent","showHidden","showHiddenSubject","options","disabled","onUpdate","onSortUpdate","HideFromUI","AppTileId","Order","updateUserAppTileSubscription","updateUserAppTiles","updatedorder","getLicensedUserAppTiles","personalAppTiles","u","IsPersonal","dialogSubscription","handleEditMode","MyAppTilesModule","MyEvent","Response","TaskType","TaskStatus","defaultTaskFolderId","completedDate","completedDateTime","dateTime","dueDate","dueDateTime","startDateTime","Outlook","Body","content","Status","toLocaleUpperCase","subject","Owner","owner","CompletedDate","CompletedDateFormatted","DueDate","DueDateFormatted","StartDateFormatted","Created","createdDateTime","CreatedDateFormatted","tenantName","NOTSTARTED","percentComplete","INPROGRESS","COMPLETED","Planner","Etag","PlannerService","task","patch","OutlookService","cuncurrencyValue","reloadGetOutlookTasks$","getMyOutlookTaskFolders$","ids","todayDate","startOfToday","tasks","EventsService","numItems","startDateInUTC","endDateInUTC","httpParamsMyEvents","MyDayComponent","plannerService","outlookService","eventService","todoLink","plannerLink","calendarLink","tasksCount","eventsCount","showLessTasksCount","minTasks","showMore","showMoreInterval","tasksToRequestFromApi","domain","currentDate","todayMidnight","startOfDay","tomorrowMidnight","addDays","nextWeek","getMyOutlookTaskFolders","taskFolders","isDefaultFolder","taskFolderIds","folder","getMyPlannerTasks","getMyOutlookTasksFromFoldersBatch","getMyEvents","plannerResults","outlookResults","eventsResult","filteredEvents","endDateUTC","isEqual","parseTasks","parseEvent","plannerTasks","fromPlanner","outlookTasks","fromOutlook","filteredTasks","isBefore","todaysDueDateTasks","sortedTasks","PlannerTaskDetails$","getPlannerTaskDetails","PlannerPlan$","getPlannerPlan","planId","PlannerBucket$","getPlannerBucket","bucketId","currentTime","timeZoneSuffix","timeZone","localStartDate","localEndDate","localEndDateFormatted","attendees","isOrganizer","emailAddress","address","organizer","acceptedUpns","userResponse","responseStatus","Tentative","Decline","Accepted","responses","BodyPreview","bodyPreview","EventStartDate","EventStartDateFormatted","EventStartDateAllDayFormatted","EventEndDate","EventEndDateFormatted","Recurring","WebLink","webLink","IsAllDay","isAllDay","Attendees","Declined","NoResponse","Expired","IsCancelled","isCancelled","IsOrganizer","UserPhotos$","getBatchUserPhotoByUpn","reloadGetOutlookTasks","completeSubScription","completePlannerTask","completeOutlookTask","accordion","toArray","responseSubscription","acceptEvent","getEvent","updatedEvent","tentativelyAcceptEvent","declineEvent","cancelEvent","deleteEvent","styles","MyDayModule","UploadDocumentModalComponent","emitData","cancel","override","uploading","docExists","UploadDocumentModalModule","UploadDocumentWarningMessageComponent","UploadDocumentWarningMessageModule","OneDriveService","getOneDrive$","fileName","rawData","UploadDocumentButtonComponent","onedriveService","file","files","reader","FileReader","componentInstance","onedriveLink","onload","uploadFile","getFile","res","uploadedFile","fileUrl","readAsArrayBuffer","UploadDocumentButtonModule","versionIE","containerWebUrl","getWebUrl","getIETitle","IconClasses","getDocumentIcon","EdgeAction","SharedBy","lastShared","sharedBy","ContainerUrl","Rank","weight","lastModifiedDateTime","lastUsed","lastAccessedDateTime","EdgeDate","fileType","iconClasses","trimmedTitle","words","filename","webFilePath","MyDocumentsComponent","renderer2","myDocumentsService","numberOfRecentDocuments","numberOfTrendingDocuments","numberOfSharedDocuments","minDocuments","maxDocuments","selectedIndex","fileSizeLimit","originalShowMoreValue","getRealUrlFromTokenBasedUrl","paths","unescape","endsWith","pop","startsWith","breadcrumbUrl","detectIE","userAgent","myRecentDocuments$","getMyRecentDocuments","doc","fromUsedInsight","myTrendingDocuments$","getMyTrendingDocuments","fromTrendingDocuments","mySharedResult$","getMySharedDocuments","fromSharedInsight","onedriveLink$","getOneDrive","droppedFile","fileEntry","isFile","userEvent","relativePath","dropped","MyDocumentsModule","MyBoardComponent","userTabConfigService","normalPosition","userTabConfig","conf","numberOfComponents","tabsForThisRoute","TabId","every","configurableRoutes","ROUTE_DATA_CONFIGURABLE_KEY","tabConfig$","MyBoardModule","FilterByDepartmentComponent","newsFilterButtons","showComponent","definedChannels","flattenRecursive","GUID","SortOrder","CompactFeaturedNewsComponent","direction","slidesPerView","slideToClickedSlide","mousewheel","scrollbar","watchSlidesProgress","keyboard","pagination","centeredSlides","roundLengths","spaceBetween","320","576","CompactNewsCardListComponent","CompactYourNewsComponent","NewsLayoutComponent","CompactBirthdaysComponent","startIndex","showNext","onLoad","sliced","hideBirthdays","WeeklyRestaurantMenu","MenuText","CompactRestaurantMenuComponent","numberOfMenuCardPerLoad","hideRestaurantMenu","getCurrentAndFutureRestaurantMenusForRestaurant","menus","weeks","toLocaleDateString","weekday","weekMenu","week","WeekNumber","weekIndex","daysInCurrentWeek","parseWeekDays","menuCardsToDisplay","weekDays","w","WeekDay","menu","parseWeeklyMenus","AllWeek","dayMenu","CompactRssFeedsComponent","hideRssFeed","feedsToShow","CompactUpcomingEventsComponent","maxEventsToFetch","hideEvents","appTile","CompactLayoutComponent","panelOpenState","hideRssComponent","hideResturantMenuComponent","hideBirthdaysComponent","hideEventsComponent","TodayComponent","TodayLightComponent","FindInformationLightMenuComponent","navigationNodeService","languageTermService","isLoading","languageFilteringEnabled","onMove","related","movedNodes","navigationNodes","subNode","j","subsubNode","y","updateNodeOrderSubscription","updateNavigationNodeOrder","getAllNavigationNodes","nodeHasTerms","ChannelTermNavigationNodes","matchesUserTerms","uct","nc","ngc","languageFilterNavigationNodes","getLanguagesSubscription","getLanguages","languages","elements","propertyName","userLanguages","filteredNodes","nodeLanguages","nodeLanguage","matchingLanguage","FindInformationLightComponent","DefaultRoutes","TODAY_LIGHT","TODAY_LIGHT_DEFAULT_DATA","FIND_INFO_LIGHT","FIND_LIGHT_INFO_DEFAULT_DATA","TODAY","TODAY_DEFAULT_DATA","TODAY_WITH_LICENSE_CHECK","YOUR_BOARD","YOUR_BOARD_DEFAULT_DATA","YOUR_BOARD_WITH_LICENSE_CHECK","COLLABORATION","COLLABORATION_DEFAULT_DATA","COLLABORATION_WITH_LICENSE_CHECK","FIND_INFO","FIND_INFO_DEFAULT_DATA","FIND_INFO_WITH_LICENSE_CHECK","APPS_TOOLS","AppsAndToolsViewModule","APP_CENTER_DEFAULT_DATA","SETTINGS","SettingsViewModule","SETTINGS_DEFAULT_DATA","CREATE_SITE","CreateSiteViewModule","CREATE_SITE_DEFAULT_DATA","EDITOR_DASHBOARD","EditorDashboardViewModule","EDITOR_DASHBOARD_DEFAULT_DATA","FIRST_DAY","FirstDayViewModule","FIRST_DAY_DEFAULT_DATA","ADMIN","AdminViewModule","ADMIN_DASHBOARD_DEFAULT_DATA","ABOUT","AboutViewModule","PEOPLE","FindColleagueViewModule","FIND_COLLEAGUE_DEFAULT_DATA","BROADCAST_MESSAGES","BroadcastMessagesViewModule","BROADCAST_MESSAGES_DEFAULT_DATA","RESTAURANT","RestaurantMenuViewModule","RESTAURANT_DEFAULT_DATA","KPI_CHARTS","KpiChartsViewModule","KPI_CHARTS_DEFAULT_DATA","MSTEAMS_AUTH","MsteamsAuthViewModule","PAGES","PagesViewModule","PAGES_DEFAULT_DATA","INFOBOXES","InfoBoxViewModule","INFOBOXES_DEFAULT_DATA","USER","UserViewModule","MY_PROFILE_DEFAULT_DATA","POWER_BI","PowerBIFramesViewModule","POWER_BI_DEFAULT_DATA","CAFCASS_CUSTOM_ROUTE_CONFIG","pathMatch","CustomCollaborationComponent","redirectTo","CafcassAppRoutingModule","forRoot","scrollPositionRestoration","anchorScrolling","relativeLinkResolution","AppModule","useValue","register","enabled","bootstrapModule","PagesService","internalReload$","updatedPageFromAudit$","getNewsPagesMap$","getNewsPageMap$","getContentPagesMap$","getContentPageMap$","getAllPages$","getPublishedContentPages$","getPublishedNewsPages$","reloadGetTopNewsApi","reloadGetPersonalNewsFromApi","getImages$","formData","FormData","getPagesByQuery","isFeaturedPage","isPublished","slugTitleWithId","auditId","SimplifiedTerm","LanguageTermService","getLanguageTermsFromSharePoint","getLanguageTermsFromApi","LANGUAGE_TERMSET_GUID","ShowAsNewUntilThisDate","Modified","IsSmartLink","Start","End","ChannelTermAppTiles","LanguageTermAppTiles","PrincipalType","UserItemsToReadService","featureSettingsStore","groupPrincipalIds","ItemToRead","ItemsToReadForPrincipal","Principal","Group","PrincipalId","checkMembershipToOffice365Groups","groupMemberships","itemsToRead","User","g","guid","userItemToRead","InfoboxService","imageService","myActiveCacheKey","futureCacheKey","allCacheKey","getMyActiveInfoBoxes$","getActiveAndFutureInfoBoxes$","shouldReload","getAllInfoBoxes$","area","infoBoxes$","infoBox","ChannelTermInfoBoxes","infoBoxes","ib","filterOnLanguageIfEnabled","boxes","infobox","mappedItems","contentType","typeOfInfoBox","imageUrlToFetch","CT_WORKPLACE_INFOBOX_TEXT_GUID","Text","CT_WORKPLACE_INFOBOX_PICTURE_GUID","CT_WORKPLACE_INFOBOX_VIDEO_GUID","Video","getPublishingImageUrl","buildOldInfoBox","newItem","ShowTitle","ApplyTitle","LinkUrl","LinkDescription","PictureUrl","VideoEmbedCode","VideoEmbed","Style","getStyle","WorkplaceStyle","Width","getWidth","WorkplaceSize","Height","WorkplaceArea","Compact","Normal","getOrder","WorkplaceOrder","AreaId","getArea","getRouteId","addInfobox","areaInLowerCase","Accent1","Accent2","Accent3","Auto","Width25Percent","Width33Percent","Width50Percent","Width66Percent","Width75Percent","Width100Percent","order","firstTwoNumbers","firstNumber","RestaurantMenuService","getCurrentRestaurantMenusForRestaurant$","getAllRestaurantMenus$","restaurantId","currentWeekYear","nextWeekNumber","nextSecondWeekNumber","restaurantMenu","LinkDirective","rel","getParentComponentElementThatStartWithPrefix","componentIdentifier","targetElement","hrefAttribute","getNamedItem","TRACKING_EVENT_TYPE_LINK_CLICK","innerTxtArr","TRACKING_EVENT_TYPE_APP_CLICK","el","LinkModule","StickyFillDirective","StickyFillModule","BreakPoints","ImgSrcProxyDirective","getSharePointImageThumbnailFromPreviewHandlerUrl","getThumbnailFromApiUrl","getSharePointImageThumbnailFromOriginalUrlWithStandardDimensions","ImgSrcProxyModule","TaxonomyService","labelsPropertyKey","parentPropertyKey","childItemsPropertyKey","simpleLinkPropertyKey","taxonomy","setup","sp","fetchClientFactory","CustomSPHttpClient","getDefaultSiteCollectionTermStore","getChanges","StartTime","selects","getTermById","select","all","termSet","termsData","termData","buildSimplifiedTermRecursively","termSetId","getTermSetById","allTermsData","IsDeprecated","buildSimplifiedTermFlat","languageCode","labels","termLabel","buildSimplifiedTerm","TermsCount","childTerms","simplifiedTerm","ParentTermGuid","InternalName","getDateFromAspNetFormat","LastModifiedDate","getUrlForTerm","getFriendlyUrl","dateTicks","exec","PathOfTerm","customProps","defaultHttpHeaders","localHttpHeaders","method","CultureService","getLcidForCurrentLocale$","getRegionCodeForCurrentLocale$","useSpTranslationFormat","localIdWithSuffix","navigationCancelingError","AppTileHideDialogComponent","AppTileHideDialogModule","AppTileBoxComponent","removalEvents","colorHexCode","hexToRGBA","deleteUserAppTile","updateUserAppTile","IntegrationEndpointUrl","UnreadCounter$","getUnreadCounterFromEndpoint","AppTileBoxModule","FeatureSettingsService","getFeatureSettingsCacheKey","getFeatureSettings$","getAzureADApplicationObjectId$","f","updateState","setting","SmartLinksService","getUserSmartLinks$","getAllSmartLinks$","zones","stockholmZone","z","IANAName","DisplayName","intlName","Intl","DateTimeFormat","resolvedOptions","timeZoneItem","localTimeOffset","matchingZones","zone","timeZoneName","matchingZone","StandardName","getSystemTimeZones$","getRegionCodeForCurrentLocale","regionCode","ChannelControlComponent","checklistSelection","selectionChange","hasChannelSelected","hasNestedChild","_getChildren","nestedTreeControl","nestedDataSource","selectedChannels","filterRecursive","descendants","getDescendants","cn","isSelected","deselect","child","changed","added","removed","selected","allTerms","dataNodes","ChannelControlModule","Page","featuredPageMP","pageType","IsFeaturedPage","parseManagedMetaDataStringAsChannelTerms","IsSharePointPage","PageId","searchResult","MsTeamsModule","MsteamsService","authenticateWindowOpen","queue","authResultMap$","Observable","subscriber","isTeamsInitialized","notifyAppLoaded","notifyAppSuccess","notifySuccess","notifyFailure","bindCallback","scope","authenticateUsingTeams$","origin","IN_TEAMS_AUTH_POPUP_REDIRECT_KEY","SHOULD_NOT_LOAD_MAIN_KEY","successCallback","failureCallback","TrendingResult","ChannelTermAppTile","webpackContext","webpackContextResolve","__webpack_require__","module","exports","HideParentIfEmptyDirective","hideClass","HideParentIfEmptyModule","UserChannelTermsService","restaurantMenuService","getUserChannelTerms$","reloadAllPersonalNews","personalization","doReload","currentRouteUrl","pushedFromAdPersonalization","alreadyPushedCacheKey","alreadyPushed","requestedPath","WANTED_ROUTE_PATH","userGroups$","getAllMyTransitiveMemeberGroups","myDetails","userGroups","azureADUserProperty","mappingProperty","SETTINGS_GRAPH_API_PERSONALIZATION_MAPPING_KEY","mappingPropertyKey","setSelectedTerms","personalizationsToAdd","concatenatedAdds","interestsselectionsynced","termsToDelete","alreadySyncedCacheKey","alreadySynced","flattenChannels","deleteObservables","userProfileProperty","azureADGroupMatch","matchingProperty","azureADGroupMappingKeys","SETTINGS_AZURE_AD_GROUP_MAPPING_KEYS","ChannelType","FromAd","SmartLinksComponent","smartLinksService","maxDescriptionLength","getUrl","getColor","shouldDisplayNew","appTiles$","getAdminSmartLinks","getUserSmartLinks","IsRecurring","IsWithinTimeSpan","appTiles","deleteAppTile","appLanguages","SmartLinksModule","CachableData","CacheService","cachePrefix","persistentCache","localStorage","sessionCache","sessionStorage","username","generatedKey","generateCacheKey","cachedItem","getItem","cachableData","expirationDate","absoluteExpirationDate","addMonths","setItem","defaultValue","removeItem","removeAllItemsInPersistentCacheWithPrefix","tmpArr","AuthorizeAccessGuard","prototype","predicate","childrenPropertyName","array","initialFind","elementsWithChildren","childElements","childProperty","filterResults","filterAndPushResults","arrayToFilter","filtered","flattenAndPushResults","CUSTOMERENVIRONMENT","WINDOW","PORTAL_DATA","RestaurantService","getAllRestaurants$","Constants","POWERBI_APP_ENDPOINT","POWERBI_API_VERSION_ONE","SYSTEM_USER_NAME","COLLAB_UNIFIED_GROUPS_LINK_TARGET","COLLAB_UNIFIED_GROUPS_TEAMS_LINK_TARGET","SETTINGS_GRAPH_API_PERSONALIZATION_HIDE_NON_MAPPED_KEY","SETTINGS_GRAPH_API_PERSONALIZATION_DESELECT_NON_MAPPED_KEY","SETTINGS_CHANNEL_TERM_USE_RADIO_BUTTONS","BOOTSTRAP_MEDIUM_DEVICE_BREAKPOINT","ADAL_EXPIRATION_KEY","TRACKING_EVENT_TYPE_WORKPLACE_SEARCH","TRACKING_EVENT_TYPE_WORKPLACE_SEARCH_CLOSE","TRACKING_EVENT_TYPE_WORKPLACE_SEARCH_NO_RESULT","INSIGHT_API_ENDPOINT","INSIGHT_API_VERSION_ONE","INSIGHT_API_APPS","LAST_7_Days","LAST_30_Days","LAST_90_Days","exact","prefix","configurableByUser","FIND_YOUR_COLLEAGUES_DEFAULT_DATA","APP_TILE_ADD_DEFAULT_DATA","APP_TILE_EDIT_DEFAULT_DATA","BROADCASTFORM_EDIT_DEFAULT_DATA","BROADCASTFORM_ADD_DEFAULT_DATA","SEARCH_DEFAULT_DATA","INFOBOX_EDIT_DEFAULT_DATA","INFOBOX_ADD_DEFAULT_DATA","POWERBIFORM_EDIT_DEFAULT_DATA","POWERBIFORM_ADD_DEFAULT_DATA","IN_TEAMS_KEY","CT_WORKPLACE_INFOBOX_BASE_GUID","CssBackgroundImageProxyDirective","currentValue","previousValue","isFirstChange","setBackgroundImageOfCurrentElement","setStyle","replacedUrl","clientWidth","getSharePointImageThumbnailFromOriginalUrlWithCustomDimensions","CssBackgroundImageProxyModule","SafePipe","sanitizer","bypassSecurityTrustHtml","bypassSecurityTrustStyle","bypassSecurityTrustScript","bypassSecurityTrustUrl","bypassSecurityTrustResourceUrl","SafeModule","PersonExtended","mail","scoredEmailAddresses","emailAddresses","department","officeLocation","jobTitle","mobilePhone","phones","number","businessPhones","AccountName","PreferredName","photoUrl","PictureURL","Department","BaseOfficeLocation","JobTitle","AppTileService","getAppTilesCacheKey","getAppTiles$","keepUnlicensed","getAppTiles","userDetails$","UserIsLicensed","unseen_notification_count","unseen_message_count","isArray","keyword","FeatureToggleDirective","tpl","featureSettingKey","embeddedView","createEmbeddedView","FeatureToggleModule","TrackingEvent","NgSubscribeContext","ngSubscribe","NgSubscribeDirective","viewContainer","templateRef","context","inputObservable","observable","markForCheck","NgSubscribeModule","PowerBIService","getAllPowerBIFrames$","SphomeService","getSPHomeContext$","DomChangeDirective","domChange","MutationObserver","mutations","mutation","childList","characterData","subtree","disconnect","DomChangeModule","HtmlEditorComponent","formatBlock","defaultParagraphSeparator","htmlMode","setProperty","codeElement","editor","querySelector","clientHeight","fn","onChange","onTouch","isDisabled","textContent","actionBarButtons","selector","_elementRef","command","prompt","lblLinkUrl","lblImageUrl","execCommand","queryCommandValue","queryCommandState","selectorElement","selectedHeading","nodeName","highlightSelectedActionBarButton","firstChild","nodeType","addOpenInNewWindowAttributeToLinks","useExisting","handleAction","changeEditorMode","onClick","onDomChange","HtmlEditorModule","RequiredReadingComponent","showHasReadSubject","showHasRead","updateSubscription","updateUserItem","HasRead","readingItems$","hasRead","getAllUserItemsToRead","getAllUserItemsHasRead","r1","r2","handleShowHasRead","RequiredReadingModule","CustomEncoder","GroupsService","cacheKeyAllGroups","cacheKeyAllOwnedGroups","cacheKeyMemberGroups","cacheKeyGroupsWithFilter","cacheKeyAllMyTransitiveMemberGroups","doNotIncludeSecurityGroups","getAllGroups$","encoder","expand","allGroups","getAllOwnedGroups$","groupTypes","getAllMemberGroups$","securityEnabledOnly","AlertTemplatesComponent","errorInfo","interestssyncing","interestsselectionupdated","languageselectionupdated","newssettingsupdated","tabconfigupdated","channelcachecleared","operationcompleted","updatedsetting","genericupdated","genericadded","genericdeleted","AlertTemplatesModule","MyDocumentsService","httpParamsMyRecentDocuments","PortalInjectorFactory","dataToPass","RssFeedAmount","SearchService","getAllSiteCollectionsCacheKey","getAllHubConnectedContentPagesCacheKey","getAllModernNewsPagesCacheKey","getAllHubConnectedContentPages$","sourceId","amountOfSuggestions","escapeQueryTextForSharePoint","piPageImpression","piPageImpressionBlockType","piSearchResultId","SourceId","SearchTerm","rowLimit","refinementFilters","birthdayOtherParams","executeSearch","includeOneDriveFiles","selectProperties","otherParams","fileTypes","hubSiteId","includeNewsSiteContentIfHubSiteQuery","hubSiteQuery","documentsQuery","pagesQuery","rowlimit","sitesQuery","executeRecursiveSPSearch","getAllModernNewsPages$","getAllSiteCollections$","newsQuery","Featured","fileTypesToExclude","promotedQuery","isUserLicensed","resultsToReturn","SecondaryQueryResults","SpecialTermResults","Results","tmp","promotedResult","PrimaryQueryResult","RelevantResults","Table","Rows","row","Cells","Key","ValueType","trimDuplicates","msSearch","executeMSSearch","executeSPSearch","requests","entityTypes","queryString","hitsContainers","hits","LastModifiedTime","lastModifiedTime","siteTitle","firstPublishedDate","FileExtension","ModifiedBy","lastModifiedBy","listOfOneDriveResults","pageImpresssion","tmpObj","tmpResults","startRow","TotalRows","RowCount","updatedParams","allResults","applyLanguageFilteringMulti","elementLanguagePropertyName","showItemsWithoutLanguage","elementLanguages","getNestedObject","ul","applyLanguageFilteringSingle","nestedObj","pathArr","AuthService","storeAuthStateInCookie","isElectron","cacheLocation","redirectUri","navigateToLoginRequestUrl","MSALObj","extraQueryParameters","loginHint","domainHint","storedAccountInfos","getAllAccounts","storedAccountInfo","protectedResourceEndpoints","handleRedirectPromise","authenticationResult","setFields","logout","acquireTokenSilent","fallbackRequest","acquireTokenUsingTeamsAuth","noTokensFoundError","correlationId","UserAppTile","CommentoComponent","scriptSrc","commentoScriptUrl","script","dataPageId","head","CommentoModule","PageComponent","pagesService","page$","modifiedByUser$","ModifiedByUserUpnId","getUserByUpn","GraphId","UPN","ownerUser$","OwnerUserUpnId","selectedChannels$","fetchedChannels","selectedChannel","fc","language$","showEditMode$","galleryImages$","getImages","PageModule","InfoboxZoneComponent","editMode$","boxes$","currentEditMode","getActiveAndFutureInfoBoxes","hideParentElement","getMyActiveInfoBoxes","boxesToUpdate","sortable","sortablejs","box","updateInfoboxes","save","updateInfobox","hideInfobox","deleteInfobox","getWidthClasses","InfoboxZoneModule","BroadcastBannerListComponent","clickOnEditBtnEvent","titleTextMaxLength","appTileBroadcastMessages","broadcastMessages","broadcastMessage","postMessageToCoreIntranet","hideBroadcastMessage","BroadcastBannerListComponentModule","ImageService","contentAndQueryStringEndpoint","getThumbnailFromApiUrl$","getPublishingImageUrl$","getSharePointImageThumbnailFromOriginalUrlWithCustomDimensions$","getSharePointImageThumbnailFromOriginalUrlWithStandardDimensions$","base64","origBlobSize","canvas","getContext","scale","quality","width","drawImage","dataUrl","toDataURL","apiUrl","URL","createObjectURL","fallbackImageUrl","imageHtml","implementation","createHTMLDocument","imageUrl","getParamsFromUrl","handleImageRedirectError","NewsModeFeaturedNews","NewsModePersonalNews","TextComponent","_box","TextInfoboxModule","PictureComponent","PictureInfoboxModule","VideoComponent","videoTmpl","getDialogById","VideoInfoboxModule","InfoboxComponent","getStyleClasses","textAlignmentClass","getCustomStyle","InfoboxModule","UserLanguageTermService","getUserLanguageTerms$","languagesToPushFromAD","myProperties","matchingUserLanguageTerm","languagesToAdd","UserService","getUserPhotoByUpn$","getUserByUpn$","getSingleUserByUpn$","getUserPhotoOfBlobByUpn$","defaultSelectProperties","getOrCreateMe$","searchMsGraphForUsers","userPrincipalNames","upn","allRequests","currentUpnChunk","getBatchUserByUpnWorker","keywords","searchMsGraphForUsersWithKeyword","searchTerms","uniqueUsers","graphCalls","resultSets","userList","matchingUser","SearchTermHits","users","requiredLicenses","rejectedLicenses","enabledAssignedPlans","licenses","servicePlanId","Roles","InfoB","InfoBoxHeight","InfoBoxWidth","InfoBoxStyle","InfoBoxType","BroadcastType","Utilities","snackbar","openFromComponent","verticalPosition","horizontalPosition","parseFloat","decodedValue","decodeURI","encodedValue","msie","rv","edge","input","upperCaseLetters","maxLength","hex","alpha","startFrom","until","k","vendor","self","postMessage","routeComponentRef","resolveComponentFactory","getComponentsWithinElementRef","destroy","getComponentsWithinElement","viewAsHTMLElement","headerElement","subHeaderElement","cp","v","deepCopy","senderTagString","maxSenderTags","nameof","trimValidator","O365Licenses","AUDIO_CONFERENCING","AZURE_ACTIVE_DIRECTORY_BASIC","AZURE_ACTIVE_DIRECTORY_PREMIUM_P1","AZURE_ACTIVE_DIRECTORY_PREMIUM_P2","AZURE_INFORMATION_PROTECTION_PLAN_1","DYNAMICS_365_CUSTOMER_ENGAGEMENT_PLAN_ENTERPRISE_EDITION","DYNAMICS_365_FOR_CUSTOMER_SERVICE_ENTERPRISE_EDITION","DYNAMICS_365_FOR_FINANCIALS_BUSINESS_EDITION","DYNAMICS_365_FOR_SALES_AND_CUSTOMER_SERVICE_ENTERPRISE_EDITION","DYNAMICS_365_FOR_SALES_ENTERPRISE_EDITION","DYNAMICS_365_FOR_TEAM_MEMBERS_ENTERPRISE_EDITION","DYNAMICS_365_UNF_OPS_PLAN_ENT_EDITION","ENTERPRISE_MOBILITY_SECURITY_E3","ENTERPRISE_MOBILITY_SECURITY_E5","EXCHANGE_ONLINE_PLAN_1","EXCHANGE_ONLINE_PLAN_2","EXCHANGE_ONLINE_ARCHIVING_FOR_EXCHANGE_ONLINE","EXCHANGE_ONLINE_ARCHIVING_FOR_EXCHANGE_SERVER","EXCHANGE_ONLINE_ESSENTIALS","EXCHANGE_S_ONLINE_ESSENTIALS","EXCHANGE_ONLINE_KIOSK","EXCHANGE_ONLINE_POP","INTUNE","MICROSOFT_DYNAMICS_CRM_ONLINE_BASIC","MICROSOFT_DYNAMICS_CRM_ONLINE","MICROSOFT_INTUNE_A_DIRECT","MS_IMAGINE_ACADEMY","SMB_BUSINESS","SMB_BUSINESS_ESSENTIALS","SMB_BUSINESS_PREMIUM","OFFICE_365_ENTERPRISE_E3_DEVELOPER","ONEDRIVE_FOR_BUSINESS_PLAN_1","ONEDRIVE_FOR_BUSINESS_PLAN_2","PROJECT_FOR_OFFICE_365","PROJECT_ONLINE_ESSENTIALS","PROJECT_ONLINE_PREMIUM","PROJECT_ONLINE_PREMIUM_WITHOUT_PROJECT_CLIENT","PROJECT_ONLINE_PROFESSIONAL","PROJECT_ONLINE_WITH_PROJECT_FOR_OFFICE_365","SHAREPOINT_ONLINE_PLAN_1","SHAREPOINT_ONLINE_PLAN_2","SKYPE_FOR_BUSINESS_CLOUD_PBX","SKYPE_FOR_BUSINESS_ONLINE_PLAN_1","SKYPE_FOR_BUSINESS_ONLINE_PLAN_2","SKYPE_FOR_BUSINESS_PSTN_CONFERENCING","SKYPE_FOR_BUSINESS_PSTN_DOMESTIC_AND_INTERNATIONAL_CALLING","SKYPE_FOR_BUSINESS_PSTN_DOMESTIC_CALLING","SKYPE_FOR_BUSINESS_PSTN_DOMESTIC_CALLING_120_MINUTES","VISIO_ONLINE_PLAN_1","VISIO_Online_Plan_2","Microsoft_365_E3_USGOV_DOD","Microsoft_365_E3_USGOV_GCCHIGH","Office_365_E3_USGOV_DOD","Office_365_E3_USGOV_GCCHIGH","WINDOWS_10_ENTERPRISE_E3","CRMPLAN1","CRMPLAN2","CRMSTANDARD","DYN365_ENTERPRISE_CUSTOMER_SERVICE","DYN365_ENTERPRISE_P1","DYN365_ENTERPRISE_P1_IW","DYN365_ENTERPRISE_SALES","DYN365_ENTERPRISE_TEAM_MEMBERS","EMPLOYEE_SELF_SERVICE","EXCHANGE_B_STANDARD","EXCHANGE_L_STANDARD","EXCHANGE_S_ARCHIVE","EXCHANGE_S_DESKLESS","EXCHANGE_S_ENTERPRISE","EXCHANGE_S_ESSENTIALS","EXCHANGE_S_STANDARD","EXCHANGE_S_STANDARD_MIDMARKET","INTUNE_A","INTUNE_A_VL","INTUNE_B","ONEDRIVEENTERPRISE","SHAREPOINT_S_DEVELOPER","SHAREPOINTDESKLESS","SHAREPOINTENTERPRISE","SHAREPOINTENTERPRISE_EDU","SHAREPOINTENTERPRISE_MIDMARKET","SHAREPOINTLITE","SHAREPOINTSTANDARD","SHAREPOINTSTANDARD_EDU","SHAREPOINTSTANDARD_YAMMERSHADOW","MCOIMP","MCOSTANDARD_MIDMARKET","MCOSTANDARD","MCOLITE","MCOPSTN1","MCOPSTN2","MCOPSTN5","YAMMER_ENTERPRISE","YAMMER_EDU","YAMMER_MIDSIZE","UserChannelTerm","ImageAlternative","AddEditPageComponent","pageService","imageVaultUrl","removedChannel$","removedChannels","searchingForUsers","noUsersFound","isInPictureEditMode","hasSelectedImage","hasTrashedImage","clearGallerySelections","pageEditorForm","required","BannerImageText","BannerImageAltText","IsCommentsEnabled","addControl","OwnerInputControl","userIdentifier","option","Mail","ownerInput","channelMenuOpen","mapChannelTermPages","channelTermPages","sc","existingPage","imageInput","currentlySelectedImageType","COMPUTER","currentlySelectedImageData","readAsDataURL","_event","imageContent","bannerImageUrl","currentlySelectedImageFileContents","originalImageUrl","galleryImage","GALLERY","newPage","relativeTo","errors","setErrors","saveBtnDisabled","urlsegments","isNewsPage","updatedPage","handleSave","selectedOwner$","upnId","prop","languages$","fetchedLanguages","selectedLanguage","fl","removedChannel","foundUsers$","distinctUntilChanged","searchTerm","userArray","newOrUpdatedPage","addImage","updatePage","addPage","deletePage","ch","AddEditPageModule","TopNewsOnlyOption","PageFilterComponent","fb","queryOptionsChange","channelOptionsChange","filterOpen","newsDaysBack","searchText","queryOptionsForm","onlyCurrentUserPages","onlyInCurrentUserLanguages","includeDrafts","subDays","topNewsOnlyOption","All","channelFilterForm","channelsMatchingOption","isNews","feature","queryOptions","_domTrigger","selectedChannelsWithoutRemovedChannel","handleSelectedChannelsChange","appendQueryParam","queryParam","urlTree","createUrlTree","queryParamsHandling","preserveFragment","navigateByUrl","toggleFilter","channelFocus","PageFilterModule","PageListComponent","termsLoaded","pageChannel","pageItem","PageListModule","PageCenterService","overrideLanguageFilter","languageFilteredPagesFromSharePoint$","getModernPagesByPageQuery","searchResultFromSharePoint","languageFilteredPagesFromWorkplace$","pagesFromApi","pagesFromSharePoint","queryOptionsChanged$","channelFilterChanged$","PageCenterComponent","pageCenterService","amountOfPagesToDisplay","fetchedAmountOfPages","amountOfPagesToDisplayCurrently","amountOfPagesMatchingFilter","selectedChannelsNameMappings","lightEnabled","userInfo$","morePagesSubject","reloadPagesSubject","filterChannelGuid","allPagesFromQuery$","TopNewsOnly","getAllPagesByQuery","allPagesFromQuery","filteredPages$","channelFilterValues","ctp","And","filteredPages","sortedAndfilteredPages","channelFilter","availableChannels","Set","acc","modifyChannelForSelection","allPages","pagesHavingTerm","isChannelSelected","ac","deleteSubscription","PageCenterModule","NewsPageResolver","paramMap","getNewsPage","ModifiedByUserPhotoUrl$","OwnerUserPhotoUrl$","ContentPageResolver","getContentPage","ContentPageCenterViewComponent","ContentPageCenterViewModule","NewsCenterViewComponent","showNewsCenterLink","licensed$","filterChannelGuid$","queryParamMap","NewsCenterViewModule","forChild","SearchResult","ComponentState","LicenseGuard","routeToShowInstead","LanguageTermAppTile","MyFollowedSitesService","getMyFollowedSitesFromSpHome$","InternetStatusService","onLine","TextPlaceholderComponent","TextPlaceholderModule","InfoBoxUtilities","bgStyle","textStyle","CustomBackgroundColorHexCode","CustomTextColorHexCode","KpiChartGroupService","activeCacheKey","getActiveKpiChartGroups$","getAllKpiChartGroups$","kpiChartGroup","webpackEmptyAsyncContext"],"mappings":"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","file":"main-es2015.27ff3fde1dee24a457b5.js","sourcesContent":["export class HubSiteData {\r\n public headerEmphasis?: any;\r\n public themeKey: string;\r\n public name: string;\r\n public url: string;\r\n public logoUrl?: any;\r\n public usesMetadataNavigation: boolean;\r\n public megaMenuEnabled: boolean;\r\n public navigation: Navigation[];\r\n public siteDesignId: string;\r\n public requiresJoinApproval: boolean;\r\n\r\n constructor(opt?: Partial) {\r\n Object.assign(this, opt);\r\n }\r\n}\r\n\r\nexport interface Navigation {\r\n Id: number;\r\n Title: string;\r\n Url: string;\r\n IsDocLib: boolean;\r\n IsExternal: boolean;\r\n ParentId: number;\r\n ListTemplateType: number;\r\n AudienceIds?: any;\r\n Children: Child[];\r\n}\r\n\r\ninterface Child {\r\n Id: number;\r\n Title: string;\r\n Url: string;\r\n IsDocLib: boolean;\r\n IsExternal: boolean;\r\n ParentId: number;\r\n ListTemplateType: number;\r\n AudienceIds?: any;\r\n Children: Child[];\r\n}\r\n","import { HttpClient } from '@angular/common/http';\r\nimport { Inject, Injectable } from '@angular/core';\r\nimport { CUSTOMERENVIRONMENT } from '@app/common/app-tokens';\r\nimport { Constants } from '@app/common/constants';\r\nimport { HttpHelper } from '@app/common/http-helper';\r\nimport { HubSiteData } from '@app/models/hubsite-data';\r\nimport { SimplifiedTerm } from '@app/models/simplified-term';\r\nimport { CacheService } from '@app/services/cache.service';\r\nimport { ChannelService } from '@app/services/channel.service';\r\nimport { TaxonomyService } from '@app/services/taxonomy.service';\r\nimport { UserChannelTermsService } from '@app/services/user-channel-terms.service';\r\nimport { Environment } from '@environments/interface.environment';\r\nimport { combineLatest, concat, Observable, of } from 'rxjs';\r\nimport { catchError, map, shareReplay, tap } from 'rxjs/operators';\r\nimport { FeatureSettingsStoreService } from '@app/services/feature-settings-store.service';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class NavigationService {\r\n\r\n constructor(private http: HttpClient,\r\n private cache: CacheService,\r\n @Inject(CUSTOMERENVIRONMENT) private environment: Environment,\r\n private channelService: ChannelService,\r\n private taxonomyService: TaxonomyService,\r\n private userChannelService: UserChannelTermsService,\r\n private httpHelper: HttpHelper,\r\n private featureSettingsStoreService: FeatureSettingsStoreService) { }\r\n\r\n private readonly cacheKeyPrefix = 'NavigationService';\r\n public useCache = true;\r\n private getNavigationNodes$: Observable>;\r\n private getHubSiteNavigation$: Observable;\r\n private getHubSiteNavigation_LastUsedUrl = '';\r\n\r\n getNavigationNodes(): Observable> {\r\n if (this.getNavigationNodes$) {\r\n return this.getNavigationNodes$;\r\n } else {\r\n const cacheKey = `${this.cacheKeyPrefix}-getNavigationTermSetNodes`;\r\n this.getNavigationNodes$ = this.taxonomyService.getTermSet(this.featureSettingsStoreService.state.navigationTermSet || Constants.NAVIGATION_TERMSET_GUID)\r\n .pipe(\r\n tap(data => {\r\n this.useCache && this.cache.set(cacheKey, data);\r\n }),\r\n catchError(this.httpHelper.handleError({ operation: 'getNavigationNodes', result: new Array() })),\r\n shareReplay({ bufferSize: 1, refCount: true }));\r\n\r\n if (this.useCache) {\r\n const cachedData = this.cache.get>(cacheKey);\r\n if (cachedData) {\r\n return concat(of(cachedData), this.getNavigationNodes$);\r\n }\r\n }\r\n return this.getNavigationNodes$;\r\n }\r\n }\r\n\r\n getHubSiteNavigation(hubSiteUrl: string): Observable {\r\n if (this.getHubSiteNavigation$) {\r\n return this.getHubSiteNavigation$;\r\n } else {\r\n const cacheKey = `${this.cacheKeyPrefix}-getHubSiteNavigation-${hubSiteUrl}`;\r\n this.getHubSiteNavigation$ = this.http.get(`${hubSiteUrl}/_api/web/HubSiteData(true)`)\r\n .pipe(\r\n map(result => {\r\n console.log(`fetched hub site navigation: `);\r\n console.log(result);\r\n return new HubSiteData(JSON.parse(result.value));\r\n }),\r\n tap(data => {\r\n this.useCache && this.cache.set(cacheKey, data);\r\n }),\r\n catchError(this.httpHelper.handleError({ operation: 'getHubSiteNavigation', result: new HubSiteData() })),\r\n shareReplay({ bufferSize: 1, refCount: true }));\r\n\r\n if (this.useCache) {\r\n const cachedData = this.cache.get(cacheKey);\r\n if (cachedData) {\r\n return concat(of(cachedData), this.getHubSiteNavigation$);\r\n }\r\n }\r\n return this.getHubSiteNavigation$;\r\n }\r\n }\r\n\r\n // Figures out the home hub site for the user. Configured in term store using channels - see manual how to configure.\r\n getUsersHomeHubSiteUrl(): Observable {\r\n return combineLatest([\r\n this.channelService.getChannels(),\r\n this.userChannelService.getUserChannelTerms()])\r\n .pipe(\r\n map(([channels, userChannelTerms]) => {\r\n\r\n // find channel containing with list of hub sites\r\n const siteListTerm = channels.filter(c => c.LocalCustomProperties[Constants.SETTINGS_CHANNEL_TERM_HUB_SITE_HOME_LIST] !== undefined && c.LocalCustomProperties[Constants.SETTINGS_CHANNEL_TERM_HUB_SITE_HOME_LIST].toLowerCase() === 'true');\r\n if (siteListTerm && siteListTerm.length > 0) {\r\n\r\n // get all my channels\r\n const myTerms = userChannelTerms.map(c => c.ChannelTermId.toLowerCase());\r\n\r\n // inner join to find *my* home site\r\n const foundHomeSite = siteListTerm[0].Terms.filter(t => myTerms.includes(t.Guid.toLowerCase()));\r\n\r\n // get url from term\r\n if (foundHomeSite && foundHomeSite.length > 0) {\r\n const homeSiteUrl = foundHomeSite[0].LocalCustomProperties[Constants.SETTINGS_CHANNEL_TERM_HUB_SITE_URL];\r\n if (homeSiteUrl) {\r\n\r\n // force fetching new data if home site is changed\r\n if (this.getHubSiteNavigation_LastUsedUrl !== homeSiteUrl) {\r\n this.getHubSiteNavigation$ = undefined;\r\n }\r\n this.getHubSiteNavigation_LastUsedUrl = homeSiteUrl;\r\n\r\n return homeSiteUrl;\r\n }\r\n }\r\n }\r\n\r\n return this.environment.coreWorkplaceSiteUrl; // always return default\r\n })\r\n );\r\n }\r\n}\r\n","import { ChannelTermPowerBIFrame } from '@app/models/channel-term-power-bi-frame';\r\n\r\nexport enum PowerBIFrameType {\r\n Report = 0,\r\n Dashboard = 1,\r\n Tile = 2\r\n}\r\n\r\nexport class PowerBIFrame {\r\n public Id: number;\r\n public Title: string;\r\n public Type: PowerBIFrameType;\r\n public EmbedUrl: string;\r\n public EmbedId: string;\r\n public DashboardId?: string;\r\n public Order?: number;\r\n public Active: boolean;\r\n public BookmarkId: string;\r\n public ShowTitle: boolean;\r\n public ShowFilterPane: boolean;\r\n public ShowNavigationPane: boolean;\r\n public RouteId: string;\r\n public ChannelTermPowerBIFrames: Array;\r\n public MobileViewHeight: number;\r\n\r\n constructor(opt?: Partial) {\r\n Object.assign(this, opt);\r\n }\r\n}\r\n","import { HttpClient, HttpParams } from '@angular/common/http';\r\nimport { Inject, Injectable } from '@angular/core';\r\nimport { CUSTOMERENVIRONMENT } from '@app/common/app-tokens';\r\nimport { Constants } from '@app/common/constants';\r\nimport { HttpHelper } from '@app/common/http-helper';\r\nimport { FollowedSite } from '@app/models/followed-site';\r\nimport { CacheService } from '@app/services/cache.service';\r\nimport { Environment } from '@environments/interface.environment';\r\nimport { List, Site } from '@microsoft/microsoft-graph-types';\r\nimport { Endpoint } from '@microsoft/microsoft-graph-types-beta';\r\nimport { concat, Observable, of } from 'rxjs';\r\nimport { catchError, map, shareReplay, tap } from 'rxjs/operators';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class SiteService {\r\n\r\n constructor(private http: HttpClient, private cache: CacheService, @Inject(CUSTOMERENVIRONMENT) private environment: Environment, private httpHelper: HttpHelper) { }\r\n\r\n private readonly cacheKeyPrefix = 'SiteService';\r\n\r\n public useCache = true;\r\n\r\n private getSiteInfoFromUrl$ = new Map>();\r\n private getGroupEndpoints$ = new Map>>();\r\n private findSitesResult$ = new Map>>();\r\n private getHubSiteId$ = new Map>();\r\n\r\n // Takes a URL (e.g. a aspx page) and queries MS Graph for information about the site collection hosting the artifact\r\n getSiteInfoFromUrl(url: string): Observable {\r\n\r\n let endPoint = '/sites/root';\r\n if (url.toLowerCase().indexOf('sites') !== -1 || url.toLowerCase().indexOf('teams') !== -1) {\r\n const matches = url.match(/https:\\/\\/(.*?)\\/(sites|teams)\\/(.*?)\\//i); // matches: [1] = tenant, [2] = managed path, [3] = site collection\r\n endPoint = '/sites/' + matches[1] + ':/' + matches[2] + '/' + matches[3]; // endPoint should be something like this: /sites/booldev.sharepoint.com:/sites/TechLunchCommSite\r\n }\r\n\r\n if (this.getSiteInfoFromUrl$.has(endPoint)) {\r\n return this.getSiteInfoFromUrl$.get(endPoint);\r\n } else {\r\n const cacheKey = `${this.cacheKeyPrefix}-siteInfo-${endPoint}`;\r\n const httpParams = new HttpParams()\r\n .append('$select', `displayName,webUrl`);\r\n\r\n const fetchOperation = this.http.get(`${Constants.GRAPH_API_ENDPOINT + Constants.GRAPH_API_VERSION_ONE}${endPoint}`, { params: httpParams })\r\n .pipe(\r\n map(response => {\r\n const result = response as Site;\r\n this.useCache && this.cache.set(cacheKey, result);\r\n return result;\r\n }),\r\n shareReplay({ bufferSize: 1, refCount: true })\r\n );\r\n this.getSiteInfoFromUrl$.set(endPoint, fetchOperation);\r\n\r\n if (this.useCache) {\r\n const cachedData = this.cache.get(cacheKey);\r\n if (cachedData) {\r\n this.getSiteInfoFromUrl$.set(endPoint, of(cachedData));\r\n }\r\n }\r\n\r\n return this.getSiteInfoFromUrl$.get(endPoint);\r\n }\r\n\r\n }\r\n\r\n public getFollowedSites(count: number): Observable> {\r\n\r\n const cacheKey = `${this.cacheKeyPrefix}-followedSites-${count}`;\r\n\r\n const httpParams = new HttpParams()\r\n .append('siteUrl', encodeURI(this.environment.coreWorkplaceSiteUrl))\r\n .append('start', '0')\r\n .append('count', count.toString());\r\n\r\n const fetchOperation = this.http.get(`${Constants.API_ENDPOINT}/follow/sites`, {\r\n params: httpParams,\r\n })\r\n .pipe(\r\n map(data => {\r\n console.log(`fetched followed sites: `);\r\n console.log(data);\r\n const results = data.Items as FollowedSite[];\r\n this.useCache && this.cache.set(cacheKey, results);\r\n return results;\r\n }),\r\n catchError(this.httpHelper.handleError({ operation: 'getFollowedSites', result: new Array() }))\r\n );\r\n\r\n if (this.useCache) {\r\n const cachedData = this.cache.get>(cacheKey);\r\n if (cachedData) {\r\n return of(cachedData);\r\n }\r\n }\r\n return fetchOperation;\r\n\r\n }\r\n\r\n public getGroupEndpoints(groupId: string): Observable> {\r\n const cacheKey = `${this.cacheKeyPrefix}-getGroupEndpoints-${groupId}`;\r\n\r\n if (this.getGroupEndpoints$.has(groupId)) {\r\n return this.getGroupEndpoints$.get(groupId);\r\n } else {\r\n const fetchOperation = this.http\r\n .get(`${Constants.GRAPH_API_ENDPOINT}${Constants.GRAPH_API_BETA_VERSION}/groups/${groupId}/endpoints`)\r\n .pipe(\r\n map(result => {\r\n const r = result.value as Array;\r\n this.useCache && this.cache.set(cacheKey, r);\r\n return r;\r\n }),\r\n catchError(this.httpHelper.handleError({ operation: 'getGroupEndpoints', result: null, rethrow: true })),\r\n shareReplay({ bufferSize: 1, refCount: true }));\r\n\r\n this.getGroupEndpoints$.set(groupId, fetchOperation);\r\n }\r\n\r\n if (this.useCache) {\r\n const cachedData = this.cache.get>(cacheKey);\r\n if (cachedData) {\r\n return concat(of(cachedData), this.getGroupEndpoints$.get(groupId));\r\n }\r\n }\r\n\r\n return this.getGroupEndpoints$.get(groupId);\r\n\r\n }\r\n\r\n public findSites(term: string): Observable> {\r\n // https://graph.microsoft.com/v1.0/sites?search=*\r\n const httpParams = new HttpParams()\r\n .append('search', term);\r\n\r\n const cacheKey = `${this.cacheKeyPrefix}-findSites-${term}`;\r\n\r\n if (this.findSitesResult$.has(term)) {\r\n return this.findSitesResult$.get(term);\r\n } else {\r\n const fetchOperation = this.http\r\n .get(`${Constants.GRAPH_API_ENDPOINT}${Constants.GRAPH_API_VERSION_ONE}/sites`, { params: httpParams })\r\n .pipe(\r\n map(result => {\r\n const r = result.value as Array;\r\n this.useCache && this.cache.set(cacheKey, r);\r\n return r;\r\n }),\r\n catchError(this.httpHelper.handleError({ operation: 'findSites', result: null, rethrow: true })),\r\n shareReplay({ bufferSize: 1, refCount: true }));\r\n\r\n this.findSitesResult$.set(term, fetchOperation);\r\n }\r\n\r\n if (this.useCache) {\r\n const cachedData = this.cache.get>(cacheKey);\r\n if (cachedData) {\r\n return concat(of(cachedData), this.findSitesResult$.get(term));\r\n }\r\n }\r\n\r\n return this.findSitesResult$.get(term);\r\n\r\n }\r\n\r\n public getLists(siteId: string): Observable> {\r\n return this.http\r\n .get(`${Constants.GRAPH_API_ENDPOINT}${Constants.GRAPH_API_VERSION_ONE}/sites/${siteId}/lists?$select=system,name,id,drive&$expand=drive`)\r\n .pipe(\r\n map(result => {\r\n const r = result.value as Array;\r\n return r;\r\n }),\r\n catchError(this.httpHelper.handleError({ operation: 'getLists', result: [], rethrow: true }))\r\n );\r\n }\r\n\r\n /** Returns the id of the site specified in the hub if it is a hub-site, otherwise null */\r\n getHubSiteId(url: string): Observable {\r\n const cacheKey = `${this.cacheKeyPrefix}-GetHubSiteId-${url}`;\r\n\r\n if (this.getHubSiteId$.has(cacheKey)) {\r\n return this.getHubSiteId$.get(cacheKey);\r\n } else {\r\n this.getHubSiteId$.set(cacheKey, this.http.get(`${url}/_api/site?$select=IsHubSite,HubSiteId`)\r\n .pipe(\r\n map(siteInfo => siteInfo.IsHubSite ? siteInfo.HubSiteId : null),\r\n tap(data => {\r\n this.useCache && this.cache.set(cacheKey, data);\r\n }),\r\n catchError(this.httpHelper.handleError({ operation: 'getHubSiteId', result: '', cacheKey: cacheKey })),\r\n shareReplay({ bufferSize: 1, refCount: true })\r\n )\r\n );\r\n\r\n if (this.useCache) {\r\n const cachedData = this.cache.get(cacheKey);\r\n if (cachedData) {\r\n return of(cachedData);\r\n }\r\n }\r\n\r\n return this.getHubSiteId$.get(cacheKey);\r\n }\r\n }\r\n\r\n}\r\n","import { AbstractControl, ValidationErrors, ValidatorFn } from '@angular/forms';\r\nimport { isAfter } from 'date-fns';\r\n// Client side validators\r\nexport function dateValueIsAfterOrBeforeOtherControl(otherDateControlId: string, shouldBeAfterOtherDateValue: boolean): ValidatorFn {\r\n return (control: AbstractControl): ValidationErrors | null => {\r\n if (control.value && !isNaN(control.value.getTime()) && control.parent) {\r\n const otherDateControl = control.parent.get(otherDateControlId);\r\n if (otherDateControl.value) {\r\n const isControlValueAfterOther = isAfter(control.value, otherDateControl.value);\r\n if (isControlValueAfterOther) {\r\n if (shouldBeAfterOtherDateValue) {\r\n if (!otherDateControl.valid) {\r\n otherDateControl.updateValueAndValidity();\r\n }\r\n return null;\r\n } else {\r\n return { 'invalidDate': { value: control.value } };\r\n }\r\n } else {\r\n if (shouldBeAfterOtherDateValue) {\r\n return { 'invalidDate': { value: control.value } };\r\n } else {\r\n if (!otherDateControl.valid) {\r\n otherDateControl.updateValueAndValidity();\r\n }\r\n return null;\r\n }\r\n }\r\n } else {\r\n return null;\r\n }\r\n } else {\r\n return null;\r\n }\r\n };\r\n}\r\n","import { HttpClient, HttpParams } from '@angular/common/http';\r\nimport { Injectable } from '@angular/core';\r\nimport { Constants } from '@app/common/constants';\r\nimport { HttpHelper } from '@app/common/http-helper';\r\nimport { AppTileBroadcastMessages } from '@app/models/message-broadcast-app-tile';\r\nimport { UserAppTile } from '@app/models/user-app-tile';\r\nimport { UserService } from '@app/services/user.service';\r\nimport { isAfter, isBefore } from 'date-fns/esm';\r\nimport { BehaviorSubject, concat, forkJoin, Observable, of, Subject } from 'rxjs';\r\nimport { catchError, map, shareReplay, takeUntil, tap } from 'rxjs/operators';\r\nimport { CacheService } from './cache.service';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class UserAppTileService {\r\n\r\n constructor(private http: HttpClient, private cache: CacheService, private userService: UserService, private httpHelper: HttpHelper) { }\r\n\r\n public readonly cacheKeyPrefix = 'UserAppTileService-getUserAppTiles';\r\n public useCache = true;\r\n private getUserAppTiles$ = new Map>>();\r\n\r\n private getNewOrUpdatedUserAppTilesSinceLastVisit$: Observable>;\r\n\r\n private reload$ = new Subject();\r\n public refresh$ = new BehaviorSubject(null);\r\n\r\n public reload() {\r\n this.getUserAppTiles$.clear();\r\n if (this.useCache) {\r\n this.cache.removeAllItemsInPersistentCacheWithGeneratedKeyPrefix(this.cacheKeyPrefix);\r\n }\r\n this.reload$.next();\r\n this.refresh$.next(null);\r\n }\r\n\r\n /*\r\n * Returns user app tiles that the current user is licensed to use\r\n */\r\n getLicensedUserAppTiles(includeHidden = false): Observable> {\r\n const userAppTiles$ = this.getUserAppTiles(includeHidden);\r\n const getMyDetailsFromMsGraph$ = this.userService.getMyDetailsFromMsGraph();\r\n return forkJoin(\r\n [\r\n userAppTiles$,\r\n getMyDetailsFromMsGraph$\r\n ])\r\n .pipe(\r\n map(([userAppTiles, userDetails]) => {\r\n // remove apps that the user does not have a license to user\r\n userAppTiles = userAppTiles.filter(app => {\r\n if (!app.AppTile.O365ServiceName || app.AppTile.O365ServiceName === '') {\r\n // no license required\r\n return true;\r\n }\r\n const foundLicense = userDetails.assignedPlans.find(plan => {\r\n return plan.service.toLowerCase() === app.AppTile.O365ServiceName.toLowerCase();\r\n });\r\n return foundLicense !== undefined && foundLicense.capabilityStatus === 'Enabled';\r\n });\r\n return userAppTiles;\r\n }),\r\n catchError(this.httpHelper.handleError({ operation: 'getLicensedUserAppTiles', result: ({} as UserAppTile[]), rethrow: true }))\r\n );\r\n }\r\n\r\n getNewOrUpdatedUserAppTilesSinceLastVisit(lastVisitedDate: Date): Observable> {\r\n if (this.getNewOrUpdatedUserAppTilesSinceLastVisit$) {\r\n return this.getNewOrUpdatedUserAppTilesSinceLastVisit$;\r\n } else {\r\n const httpParams = new HttpParams().append('lastVisitedDate', `${lastVisitedDate.toISOString()}`);\r\n\r\n this.getNewOrUpdatedUserAppTilesSinceLastVisit$ = this.http.get>(`${Constants.API_ENDPOINT}/me/userapptiles/updates`, {\r\n params: httpParams\r\n })\r\n .pipe(\r\n map(response => {\r\n console.log(`fetched result getNewOrUpdatedUserAppTilesSinceLastVisit:`, response);\r\n return response.map(p => {\r\n const userAppTile = new UserAppTile(p);\r\n // filter AppTileBroadcastMessages to get only active messages on app tile.\r\n if (userAppTile.AppTile && userAppTile.AppTile.AppTileBroadcastMessages.length > 0) {\r\n const activeAptileBroadcastMessages: AppTileBroadcastMessages[] = userAppTile.AppTile.AppTileBroadcastMessages.filter(b => (!b.BroadcastMessage.EndDate || isAfter(new Date(b.BroadcastMessage.EndDate), new Date())) && (!b.BroadcastMessage.StartDate || isBefore(new Date(b.BroadcastMessage.StartDate), new Date())));\r\n userAppTile.AppTile.AppTileBroadcastMessages = activeAptileBroadcastMessages;\r\n }\r\n return userAppTile;\r\n });\r\n }),\r\n catchError(this.httpHelper.handleError({ operation: 'getNewOrUpdatedUserAppTilesSinceLastVisit', result: new Array(), rethrow: true })),\r\n shareReplay({ bufferSize: 1, refCount: true }));\r\n return this.getNewOrUpdatedUserAppTilesSinceLastVisit$;\r\n }\r\n }\r\n\r\n getUserAppTiles(includeHidden = false): Observable> {\r\n if (this.getUserAppTiles$.has(includeHidden.toString())) {\r\n return this.getUserAppTiles$.get(includeHidden.toString());\r\n } else {\r\n const httpParams = new HttpParams().set('includeHidden', `${includeHidden}`);\r\n const cacheKey = `${this.cacheKeyPrefix}-${includeHidden}`;\r\n\r\n this.getUserAppTiles$.set(includeHidden.toString(), this.http.get>(`${Constants.API_ENDPOINT}/me/userapptiles`, {\r\n params: httpParams\r\n })\r\n .pipe(\r\n map(response => {\r\n console.log(`fetched result getUserAppTiles: `, response);\r\n\r\n return response.map(p => {\r\n const userAppTile = new UserAppTile(p);\r\n // filter AppTileBroadcastMessages to get only active messages on app tile.\r\n if (userAppTile.AppTile && userAppTile.AppTile.AppTileBroadcastMessages.length > 0) {\r\n const activeAptileBroadcastMessages: AppTileBroadcastMessages[] = userAppTile.AppTile.AppTileBroadcastMessages.filter(b => (!b.BroadcastMessage.EndDate || isAfter(new Date(b.BroadcastMessage.EndDate), new Date())) && (!b.BroadcastMessage.StartDate || isBefore(new Date(b.BroadcastMessage.StartDate), new Date())));\r\n userAppTile.AppTile.AppTileBroadcastMessages = activeAptileBroadcastMessages;\r\n }\r\n return userAppTile;\r\n });\r\n }),\r\n tap(data => {\r\n this.useCache && this.cache.set(cacheKey, data);\r\n }),\r\n catchError(this.httpHelper.handleError({ operation: 'getUserAppTiles', result: new Array(), rethrow: true, cacheKey: cacheKey })),\r\n takeUntil(this.reload$),\r\n shareReplay({ bufferSize: 1, refCount: true })));\r\n\r\n if (this.useCache) {\r\n const cachedData = this.cache.get>(cacheKey);\r\n if (cachedData) {\r\n return concat(of(cachedData), this.getUserAppTiles$.get(includeHidden.toString()));\r\n }\r\n }\r\n\r\n return this.getUserAppTiles$.get(includeHidden.toString());\r\n }\r\n }\r\n\r\n getUserAppTile(id: number): Observable {\r\n return this.http.get(`${Constants.API_ENDPOINT}/me/userapptiles/${id}`)\r\n .pipe(\r\n map(response => {\r\n console.log(`fetched result getUserAppTile: `, response);\r\n return new UserAppTile(response);\r\n }));\r\n }\r\n\r\n updateUserAppTile(id: number, userAppTile: UserAppTile): Observable {\r\n const fetchOperation = this.http.put(`${Constants.API_ENDPOINT}/me/userapptiles/${id}`, userAppTile, {\r\n\r\n })\r\n .pipe(\r\n map(response => {\r\n console.log(`updated result: `);\r\n console.log(response);\r\n this.reload();\r\n return userAppTile;\r\n }),\r\n catchError(this.httpHelper.handleError({ operation: 'updateUserAppTile', result: new UserAppTile(), rethrow: true })));\r\n\r\n return fetchOperation;\r\n }\r\n\r\n updateUserAppTiles(userAppTiles: Array): Observable> {\r\n const fetchOperation = this.http.put>(`${Constants.API_ENDPOINT}/me/userapptiles`, userAppTiles)\r\n .pipe(\r\n map(response => {\r\n console.log(`updated result: `);\r\n console.log(response);\r\n this.reload();\r\n return userAppTiles;\r\n }),\r\n catchError(this.httpHelper.handleError({ operation: 'updateUserAppTiles', result: ({} as UserAppTile[]), rethrow: true })));\r\n\r\n return fetchOperation;\r\n }\r\n\r\n deleteUserAppTile(id: number): Observable {\r\n const fetchOperation = this.http.delete(`${Constants.API_ENDPOINT}/me/userapptiles/${id}`)\r\n .pipe(\r\n map(response => {\r\n console.log(`deleted result: `);\r\n console.log(response);\r\n this.reload();\r\n return response;\r\n }),\r\n catchError(this.httpHelper.handleError({ operation: 'deleteUserAppTile', result: new UserAppTile(), rethrow: true })));\r\n\r\n return fetchOperation;\r\n }\r\n\r\n addUserAppTile(userAppTile: UserAppTile): Observable {\r\n const fetchOperation = this.http.post(`${Constants.API_ENDPOINT}/me/userapptiles`, userAppTile)\r\n .pipe(\r\n map(response => {\r\n console.log(`added result: `);\r\n console.log(response);\r\n this.reload();\r\n return new UserAppTile(response);\r\n }),\r\n catchError(this.httpHelper.handleError({ operation: 'addUserAppTile', result: new UserAppTile(), rethrow: true })));\r\n\r\n return fetchOperation;\r\n }\r\n}\r\n","\r\nexport enum SiteElementType {\r\n // Don't change the already set values (ordering, values and available enumerations) without thorough\r\n // testing, as this will otherwise break the data fetching completely\r\n FOOTER,\r\n DID_YOU_MEAN_CONFIG,\r\n UNDEFINED,\r\n}\r\n\r\nexport class SiteElement {\r\n\r\n public Id: number;\r\n public Language: string;\r\n public Type: SiteElementType;\r\n public Content: string;\r\n\r\n constructor(opt?: Partial) {\r\n Object.assign(this, opt);\r\n }\r\n}\r\n","import { CommonModule } from '@angular/common';\r\nimport { Component, Input, NgModule, OnInit } from '@angular/core';\r\nimport { RouterModule } from '@angular/router';\r\nimport { LinkModule } from '@app/directives/link.directive';\r\n\r\n@Component({\r\n selector: 'app-action-router-link',\r\n templateUrl: './action-router-link.component.html',\r\n styleUrls: ['./action-router-link.component.scss']\r\n})\r\nexport class ActionRouterLinkComponent implements OnInit {\r\n\r\n @Input() actionRouterLink: any[] | string;\r\n @Input() buttonClass: string | string[] | Set | { [klass: string]: any; };\r\n\r\n constructor() {\r\n\r\n }\r\n\r\n ngOnInit() {\r\n }\r\n\r\n}\r\n@NgModule({\r\n declarations: [ActionRouterLinkComponent],\r\n imports: [\r\n CommonModule,\r\n RouterModule,\r\n LinkModule,\r\n ],\r\n exports: [ActionRouterLinkComponent]\r\n})\r\nexport class ActionRouterLinkModule { }\r\n","\r\n","import { parseISO } from 'date-fns';\r\nimport { Observable } from 'rxjs';\r\n\r\nexport class Audit {\r\n Id: number;\r\n UserName: string;\r\n TableName: string;\r\n Action: string;\r\n DateTime: Date;\r\n KeyValues: string;\r\n OldValues: string;\r\n NewValues: any;\r\n // Used only on client side to make the channel mapping a little easier.\r\n NewChannelGuidValues?: Array;\r\n // Used only on client side for mapping with the channel names from the channel service\r\n Channels?: Observable;\r\n\r\n constructor(opt?: Partial) {\r\n if (opt) {\r\n\r\n if (opt.DateTime && typeof opt.DateTime === 'string') {\r\n opt.DateTime = parseISO(opt.DateTime);\r\n }\r\n\r\n if (opt.NewValues && typeof opt.NewValues === 'string') {\r\n opt.NewValues = JSON.parse(opt.NewValues);\r\n\r\n let channelPropertyKeyToRemove: string;\r\n\r\n Object.keys(opt.NewValues).forEach(key => {\r\n if (key.toLowerCase().indexOf('channel') !== -1) {\r\n const channelProperty = opt.NewValues[key] as Array;\r\n opt.NewChannelGuidValues = channelProperty?.map(channelObject => {\r\n const cpKey = Object.keys(channelObject).find(channelObjKey => channelObjKey.toLowerCase().indexOf('termid') !== -1);\r\n if (cpKey) {\r\n channelPropertyKeyToRemove = key;\r\n return channelObject[cpKey];\r\n }\r\n });\r\n }\r\n });\r\n\r\n if (opt.NewChannelGuidValues?.length > 0 && channelPropertyKeyToRemove) {\r\n delete opt.NewValues[channelPropertyKeyToRemove];\r\n }\r\n }\r\n }\r\n Object.assign(this, opt);\r\n }\r\n}\r\n","import { HttpClient, HttpParams } from '@angular/common/http';\r\nimport { Inject, Injectable, LOCALE_ID } from '@angular/core';\r\nimport { CUSTOMERENVIRONMENT } from '@app/common/app-tokens';\r\nimport { Constants } from '@app/common/constants';\r\nimport { HttpHelper } from '@app/common/http-helper';\r\nimport { ChannelTerm } from '@app/models/channel-term';\r\nimport { SimplifiedTerm } from '@app/models/simplified-term';\r\nimport { CacheService } from '@app/services/cache.service';\r\nimport { LicenseService } from '@app/services/license.service';\r\nimport { TaxonomyService } from '@app/services/taxonomy.service';\r\nimport { Environment } from '@environments/interface.environment';\r\nimport { addHours, differenceInMinutes } from 'date-fns';\r\nimport { Observable, of } from 'rxjs';\r\nimport { catchError, map, mergeMap, retry, tap } from 'rxjs/operators';\r\nimport { CultureService } from '@app/services/culture.service';\r\nimport { FeatureSettingsStoreService } from '@app/services/feature-settings-store.service';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class ChannelService {\r\n\r\n constructor(\r\n @Inject(LOCALE_ID) private localeId: string,\r\n @Inject(CUSTOMERENVIRONMENT) private environment: Environment,\r\n private http: HttpClient,\r\n private cache: CacheService,\r\n private httpHelper: HttpHelper,\r\n private taxonomyService: TaxonomyService,\r\n private licenseService: LicenseService,\r\n private cultureService: CultureService,\r\n private featureService: FeatureSettingsStoreService) { }\r\n\r\n private readonly cacheKeyPrefix = 'ChannelService';\r\n public useCache = true;\r\n private channelTermsetId = this.featureService.state.channelTermsetGUID;\r\n\r\n getChannels(noCache?: boolean): Observable> {\r\n return this.licenseService.hasUserAny365License()\r\n .pipe(\r\n mergeMap(hasUser365License => {\r\n if (hasUser365License) {\r\n return this.getChannelsFromSharePoint(noCache);\r\n } else {\r\n return this.getChannelsFromApi();\r\n }\r\n }));\r\n }\r\n\r\n getChannelByIdAndHierarchy(termId: string): Observable {\r\n return this.licenseService.hasUserAny365License()\r\n .pipe(\r\n mergeMap(hasUser365License => {\r\n if (hasUser365License) {\r\n return this.taxonomyService.getTermByIdWithFullHierarchy(termId);\r\n } else {\r\n return this.getChannelsFromApi()\r\n .pipe(\r\n map(c => c.findRecursive(t => t.Guid.toLowerCase() === termId.toLowerCase(), 'Terms'))\r\n );\r\n }\r\n }));\r\n }\r\n\r\n getChannelsFromSharePoint(noCache?: boolean, filterDeprecated = false): Observable> {\r\n const cacheKey = `${this.cacheKeyPrefix}-getChannelsFromSharePoint-${this.localeId}`;\r\n const channelTermsetGUID = this.channelTermsetId ? this.channelTermsetId : Constants.CHANNEL_TERMSET_GUID;\r\n\r\n const fetchOperation = this.taxonomyService.getTermSet(channelTermsetGUID, filterDeprecated)\r\n .pipe(\r\n map(response => {\r\n return response.map(term => new SimplifiedTerm(term)).sort((a, b) => a?.Name?.localeCompare(b?.Name));\r\n }),\r\n tap(data => {\r\n this.useCache && this.cache.set(cacheKey, data, addHours(new Date(), 1)); // expire cache within one hour\r\n }),\r\n retry(3),\r\n catchError(this.httpHelper.handleError({ operation: 'getChannelsFromSharePoint', result: new Array(), rethrow: true, cacheKey: cacheKey })));\r\n\r\n if (this.useCache && !noCache) {\r\n const cachedData = this.cache.getCachableInfo>(cacheKey);\r\n if (cachedData) {\r\n if (differenceInMinutes(new Date(cachedData.AbsoluteExpirationDate), new Date) <= 30) {\r\n // If we have cached data and its about to expire within 30 min we check for any changes since last fetch)\r\n return this.taxonomyService\r\n .getAmountOfChangesSince(new Date(cachedData.AddedToCache))\r\n .pipe(\r\n mergeMap(amount => {\r\n if (amount > 0) {\r\n return fetchOperation;\r\n } else {\r\n return of(cachedData.Data)\r\n .pipe(\r\n tap(data => {\r\n // We'll assume the cache is good and set the expire time one hour from now before we check for new changes.\r\n this.cache.set(cacheKey, data, addHours(new Date(), 1)); // expire cache within one hour\r\n }));\r\n }\r\n })\r\n );\r\n } else {\r\n return of(cachedData.Data);\r\n }\r\n }\r\n }\r\n return fetchOperation;\r\n }\r\n\r\n getChannelsFromApi(): Observable> {\r\n return this.cultureService.getLcidForCurrentLocale().pipe(\r\n mergeMap(lcid => {\r\n return this.http\r\n .get>(`${Constants.API_ENDPOINT}/channelterms/localized/${lcid}`)\r\n .pipe(\r\n map(\r\n results => results.map(r => new SimplifiedTerm(r)).sort((a, b) => a?.Name?.localeCompare(b?.Name)))\r\n );\r\n }),\r\n retry(3),\r\n catchError(this.httpHelper.handleError({ operation: 'getChannelsFromApi', result: null, rethrow: true })));\r\n }\r\n\r\n removeChannelFromApi(termId: string): Observable {\r\n return this.http\r\n .delete(`${Constants.API_ENDPOINT}/channelterms/${termId}`)\r\n .pipe(\r\n catchError(this.httpHelper.handleError({ operation: 'removeChannelFromApi', result: null, rethrow: true }))\r\n );\r\n }\r\n\r\n addOrUpdateChannelsInApi(terms: Array): Observable> {\r\n // We need to append the siteUrl because there will be an authorization check in the backend against the workplace admin group on this site\r\n const httpParams = new HttpParams().append('siteUrl', encodeURI(this.environment.coreWorkplaceSiteUrl));\r\n return this.http.\r\n post>(`${Constants.API_ENDPOINT}/channelterms/`, terms, { params: httpParams })\r\n .pipe(\r\n catchError(this.httpHelper.handleError({ operation: 'addOrUpdateChannelsInApi', result: null, rethrow: true }))\r\n );\r\n }\r\n\r\n}\r\n","\r\nexport enum LanguageType {\r\n UserSelection = 0,\r\n FromAd = 1\r\n}\r\n\r\nexport class UserLanguageTerm {\r\n\r\n public LanguageTermId: string;\r\n\r\n public UserUpnId: string;\r\n\r\n public LanguageType: LanguageType;\r\n\r\n constructor(opt?: Partial) {\r\n Object.assign(this, opt);\r\n }\r\n}\r\n","import { PageType } from '@app/models/page';\r\n\r\nexport class PageQuery {\r\n\r\n public PageType: PageType = PageType.News;\r\n\r\n public Featured?: boolean;\r\n\r\n public Channels?: Array;\r\n\r\n public ChannelMatchingMode?: ChannelMatchingMode = ChannelMatchingMode.Or;\r\n\r\n public FindText?: string = null;\r\n\r\n public OwnerOrEditorUpnId?: string = null;\r\n\r\n public IncludeDrafts = false;\r\n\r\n public StartDate?: Date = null;\r\n\r\n public EndDate?: Date = null;\r\n\r\n public Skip?: number = null;\r\n\r\n public Take?: number = null;\r\n\r\n public hubSiteId?: string;\r\n\r\n constructor(opt?: Partial) {\r\n Object.assign(this, opt);\r\n }\r\n\r\n}\r\n\r\nexport enum ChannelMatchingMode {\r\n Or = 0,\r\n And = 1\r\n}\r\n","import { Constants } from '@app/common/constants';\r\nimport { HideNewsComments } from '@app/common/hide-news-comments';\r\nimport { HideNewsLikes } from '@app/common/hide-news-likes';\r\nimport { ManagedPropertyConfig } from '@app/common/managed-property-config';\r\nimport { NavigationMode } from '@app/common/navigation-mode.';\r\nimport { NewsModeFeaturedNews, NewsModePersonalNews } from '@app/common/news-mode';\r\nimport { PrivacySetting } from '@app/common/privacy-setting';\r\nimport { RssFeeds } from '@app/common/rss-feed';\r\nimport { TrendingResult } from '@app/common/trending-result';\r\nimport { ColleagueProperty } from '@app/models/colleague-property';\r\nimport { CustomSearchResultConfig } from '@app/models/custom-search-result-config';\r\nimport { CustomerSpecificProperty } from '@app/models/project-selection-additional-properties';\r\nimport { GITVERSION } from '@environments/git-version';\r\nimport { FilterButtonInfo } from '@app/models/filter-button-info';\r\n\r\n/* tslint:disable */\r\nexport class EnvironmentFeatureSettings {\r\n\r\n /** Allows hiding \"mylaunch\" icons in the top bar*/\r\n showBroadcastsIconInTopNav?: boolean = true;\r\n showSearchbarInTopNav?: boolean = true;\r\n\r\n /** Allow configure if and when comments and likes should be hidden for news. */\r\n hideNewsComments?: HideNewsComments;\r\n hideNewsLikes?: HideNewsLikes;\r\n hideNewsTags?: boolean = true;\r\n\r\n /** Set these to configure whether to should the broadcast label */\r\n showMessageBroadcastCriticalLabel?: boolean = true;\r\n showMessageBroadcastWarningLabel?: boolean = true;\r\n showMessageBroadcastInformationLabel?: boolean = true;\r\n\r\n /** TODO: Need explanation here ?? */\r\n disableOverlayOnInfoBoxes?: boolean = false;\r\n\r\n /** Allows configuring to show the 'new'-badge on app tiles. */\r\n showNewOrModifiedbadgeOnAppTile?: boolean = true;\r\n\r\n /** Allows changing default privacy setting when creating groups */\r\n defaultCreateGroupPrivacySetting?: PrivacySetting;\r\n\r\n /** Should level 3 nodes start collapsed on the \"Find information\" page?\r\n Does not look as good, but useful when lots of nodes\r\n Default is false, meaning all nodes are expanded. The expand arrow is also hidden. */\r\n enabledCollapsableNodesOnFindInformation?: boolean = false;\r\n\r\n /** If a node in a section has 3 levels this setting automatically sets a separate design for the node headers - Set to false to hide third level completely - requested by PE */\r\n enableThirdLevelMenusInFindInformation?: boolean = true;\r\n\r\n /** If set, the \"new collaboration site\" button will open this url instead of our own form */\r\n redirectCreateGroupButtonToUrl?: string;\r\n\r\n /** This property should be used for setting the title the head tag. it defaults to Workplace if nothing is set. */\r\n title?: string = Constants.DEFAULT_TITLE;\r\n\r\n /** This should be set to the company name or the name of the Workplace site. This is used as a prefix to the 'Today' tab. E.g. 'Contoso today' */\r\n workplaceName?: string;\r\n\r\n /** This should be set to the type of news mode the customer will use in the Featured News widget */\r\n newsModeFeaturedNews?: NewsModeFeaturedNews = NewsModeFeaturedNews.GraphFromNewsCenterSite;\r\n\r\n /** This should be set to the type of news mode the customer will use in the Personal News widget. */\r\n newsModePersonalNews?: NewsModePersonalNews = NewsModePersonalNews.GraphFromNewsCenterSite;\r\n\r\n /** This should be set to the site where the customer will publish all news pages that they want to promote on workplace Example: 'https://booldemo.sharepoint.com/sites/news' */\r\n newsCenterSiteUrl?: string;\r\n\r\n /** Decides where to send the use when clicking on show all news link */\r\n newsArchiveLink: string;\r\n\r\n /** Decides where to send the user when clicking on links that go to the SharePoint news center */\r\n sharePointNewsCenterUrl: string;\r\n\r\n /** Exclude sites from news search Example: ['https://booldev.sharepoint.com/sites/abc', 'https://booldev.sharepoint.com/sites/def'] */\r\n excludeSitesFromNewsSearch?: Array = null;\r\n\r\n /** Allows limiting who is allowed to use the collaboration creation wizard. Defaults to true. If false, code verifies that user is member of 'Workplace Collab Creators' group */\r\n everyoneCanCreateCollabSites?: boolean = true;\r\n\r\n /** RSS feed configurations*/\r\n rssFeedConfig?: RssFeeds = null;\r\n\r\n /** News filter buttons configurations*/\r\n newsFilterButtonConfig?: Array = null;\r\n\r\n /** Set this to false to disable SignalR push notifications */\r\n enableSignalR?: boolean = true;\r\n\r\n /** Set this to false to disable the checks for updated content */\r\n enableUpdateChecksForNewContent?: boolean = true;\r\n\r\n /** If collab index sites with teams, set this to true to redirect to teams by defaul, if false by default redirects to SharePoint site instead teams.*/\r\n redirectToTeamsByDefault?: boolean = true;\r\n\r\n /** This should be set to the type of trending result the customer will use. SharePoint means to search for trending result from Communication and team sites as per SPO default.*/\r\n trendingResult?: TrendingResult;\r\n\r\n /** By setting this to false we can turn off the first day wizard popup that appears for users who have not completed the first day wizard*/\r\n enableFirstDayPopupDialog?: boolean = true;\r\n\r\n /** By setting this to false we can turn off the automatic sync for the users channel and AD properties that gets done automatically on first load every day */\r\n enableAutoUserChannelSync?: boolean = true;\r\n\r\n /** Allows editors and/or admins to de-select pushed channels. The \"Hide non-mapped channels\" feature is also inactivated. This is useful to test different channel combinations. */\r\n noChannelSelectionLimitationsForAdmins?: boolean = false;\r\n noChannelSelectionLimitationsForEditors?: boolean = false;\r\n\r\n /** Enable required reading component*/\r\n enableRequiredReading?: boolean = false;\r\n\r\n /** Allow a user to mark a document or page as read directly from the component (i.e. without nactually having clicked)*/\r\n allowMarkAsReadFromReqReadList?: boolean = false;\r\n\r\n /** Picks up both draft and published versions in RR List Webpart (useful when approval is turned on), if disabled = only published versions are picked up. */\r\n includeDraftsInReqReadList?: boolean = false;\r\n\r\n /** Add prefix to o365 groups as per customer naming policy */\r\n prefixToO365Groups?: string;\r\n\r\n /** This property determines where to send users when clicking on show more results in header search. */\r\n searchCenterUrl?: string = 'https://www.office.com/search?auth=2&q=';\r\n\r\n /** This property enables a customer to reconfigure the managed properties used by search based components */\r\n managedPropertyConfig?: ManagedPropertyConfig;\r\n\r\n /** Set the navigation mode being used for the mega menu. */\r\n navigationMode?: NavigationMode;\r\n\r\n /** This property enables a customer to set a custom navigation termset to use for the mega menu when navigation mode is set to 'TermSet'. */\r\n navigationTermSet?: string;\r\n\r\n /** Contains the environment specific tracking key used by GA */\r\n gaTrackingKey?: string;\r\n\r\n /** Contains the environment specific tracking key used by AppInsights */\r\n appInsightsTrackingKey?: string;\r\n\r\n customSearchResult?: CustomSearchResultConfig = null;\r\n\r\n /** Show the hubsite filter in search */\r\n showHubSiteFilterInSearch?: boolean = false;\r\n\r\n /** Default state of hubsite filtering in search */\r\n hubSiteFilterInSearchDefault?: boolean = false;\r\n\r\n /** This property enables the customer to show or hide regular SharePoint sites in site index.*/\r\n hideNonGroups?: boolean = true;\r\n\r\n /** Add hotjar key to track workplace*/\r\n hotJarKey?: string;\r\n\r\n /** Enable right section in find information*/\r\n enableRightSection?: boolean = false;\r\n\r\n /**\r\n * Root term which my colleague will fetch all child terms and show as a tree. Must be configured for my colleagues to work.\r\n * Most customers can probably use the old \"Organization\" sub term for channels with id: fdc4ef06-e425-40ca-8483-57e0e7118a0f\r\n */\r\n myColleagueRootTerm?: string;\r\n\r\n /** If you want to show department for my colleagues */\r\n myColleaguesShowDepartment?: boolean = true;\r\n\r\n /** If you want to show location for my colleagues */\r\n myColleaguesShowLocation?: boolean = true;\r\n\r\n /** If you want to show office phone (in addition to mobile phone) for my colleagues */\r\n myColleaguesShowOfficePhone?: boolean = false;\r\n\r\n /** If you want to show link to MS Teams organizational chart */\r\n myColleaguesShowOrgChart?: boolean = false;\r\n\r\n /** How many persona are fetched from the graph API, increase this value if the customer think my colleagues search sometimes is capped at too few reults **/\r\n myColleagueNumberOfGraphResultsCap?: number = 20;\r\n\r\n /** Filter to append to the user service query, for example to hide admin accounts from Workplace **/\r\n userServiceAppendedFilter?: string = '';\r\n\r\n /** Top search uses SP User Services to find people. But not all properties are synced from Azure AD. Enabled by default to fetch the user from graph (with all properties) when expanding the people card in results. This should enasure that people cards in Find Colleague and Top Seach have the same content. */\r\n useGraphToExtendPeopleSearch?: boolean = true;\r\n\r\n /** Set to false if you want to hide the description of pages and news for search results*/\r\n showDescriptionInSearchResult?: boolean = true;\r\n\r\n /** Set this to true if you wish to use the suggestions mode instead of appending the asterisk to search term - if suggestion mode is enabled the asterisk will not be used */\r\n useSearchSuggestionMode?: boolean = false;\r\n\r\n /** Did You Mean shows suggestions in the search bar. Source of suggestions is manually configured. Matching uses fuzzy search to suggest mistypings, shortcuts, aliases and so forth */\r\n useSearchDidYouMean?: boolean = false;\r\n\r\n /** Customer needs a specific license to be allowed to configure this.\r\n * If you want to enable profile card view instead navigating user to delve */\r\n enableProfileCardView?: boolean = false;\r\n\r\n /** Term set id from which the user profile page will show the users organizational breadcrumb.*/\r\n profileCardOrganizationTermSetId?: string;\r\n\r\n /** Customer needs a specific license to be allowed to configure this.\r\n If you want to enable user experience in the user resume */\r\n enableUserExperience?: boolean = false;\r\n\r\n /** Customer needs a specific license to be allowed to configure this.\r\n * If you want to enable search from custom database source*/\r\n enableSearchFromCustomDB?: boolean = false;\r\n\r\n /** Customer needs a specific license to be allowed to configure this.\r\n * If you want to enable project section in profiler*/\r\n enableProjectSection?: boolean = true;\r\n\r\n /** Configure customer specific properties in project section in profiler*/\r\n customerProperties?: Array;\r\n\r\n /** Set to a URL wher the user can change their profile picture */\r\n changePictureUrl?: string;\r\n\r\n /** default color codes to editor insight charts */\r\n chartsBackground?: Array = ['#cc2e64', '#0C7191', '#C7DAEA', '#b300b3', '#ff6666', '#ff9933', '#3366ff', '#80ff00', '#3366ff', '#ffbb33'];\r\n\r\n /** This option is by default true to support toggle between Sp news pages and WP pages and should be set as false in coreIntranet as it support on SP news page.*/\r\n togglePagesFromSPorWP?: boolean = true;\r\n\r\n /** Configurable properties for Your colleagues- each customer can pick 0-2 properties (default is \"Department\" and \"State\")*/\r\n colleagueProperties?: ColleagueProperty = {\r\n Property1: {\r\n Label: 'Department',\r\n Name: 'Department'\r\n },\r\n Property2: {\r\n Label: 'State',\r\n Name: 'State'\r\n }\r\n };\r\n\r\n /** Set to true to show the birthday calendar component, NOTE you will need to have the birthday module included in the project for it work */\r\n showBirthdayCalendar?: boolean = false;\r\n\r\n /** Set to true to show the restaurant menu component, NOTE you will need to have the restaurant menu module included in the project for it work */\r\n showRestaurantMenus?: boolean = false;\r\n\r\n /** Set the default size of images when fetching images from SharePoint. By selecting a larger size the performance will suffer.\r\n * Notes: 'c400x99999' is what SharePoint Modern seems to use most of the time. This might be better since we can assume that it is the size most likely to be cached and ready to use.\r\n * 'medium' seems to give the same dimensions as c400x99999, unless the image is tall. For our purposes both seems to work fine (however: c400x99999 is more specific. We can never know what medium will return in the future.)\r\n * Size options: https://docs.microsoft.com/en-us/graph/api/driveitem-list-thumbnails?view=graph-rest-1.0&tabs=http#size-options\r\n * Keeping medium for now, since this makes it easy for us to let the customer change between 'small', 'medium' and 'large' from the admin dashboard\r\n */\r\n defaultImageThumbnailSize?: string = 'medium';\r\n\r\n /** Set this to true if the Audit trail functionality is enabled on server side (AuditTrailEnabled=true) and you wish to be able to view the audit trail for apps, pages etc.\r\n * This also enables restoring of previous \"versions\" for these items.*/\r\n auditsEnabled?: boolean = false;\r\n\r\n /** Set this to true to have the entire header element as a sticky element following along when scrolling. */\r\n stickyHeader?: boolean = false;\r\n\r\n /** Show news description in Find information, Top news and Your news. */\r\n showNewsDescription?: boolean = false;\r\n\r\n /** Allows configurable attributes fetched from graph for getMyDetailsFromMsGraph */\r\n myDetailsMsGraphProperties?: Array = [\r\n 'id',\r\n 'displayName',\r\n 'mail',\r\n 'assignedPlans',\r\n 'assignedLicenses',\r\n 'city',\r\n 'country',\r\n 'jobTitle',\r\n 'state',\r\n 'department',\r\n 'companyName',\r\n 'officeLocation',\r\n 'userPrincipalName',\r\n 'extension_091508dac99d46a1ae24ad9e0373e94b_extensionAttribute6',\r\n 'extension_9c71bd435c4f4809a6135eb366b97902_department',\r\n 'mobilePhone'\r\n ];\r\n\r\n /** Enables the app to be iframed in Core Intranet **/\r\n coreIntranetEnabled?: boolean = false;\r\n\r\n /** Option to enable or disable smartlinks (Apps and Tools) **/\r\n smartLinksEnabled?: boolean = true;\r\n\r\n /** Option to enable or disable Total visits section of Site analytics in editorDashboard. **/\r\n editorInsightsShowTotalVisits?: boolean = true;\r\n\r\n /** Set this to the host url where commento is deployed example: http://commento-dev-01.westeurope.azurecontainer.io:8080/js/commento.js */\r\n commentoScriptUrl?: string;\r\n\r\n /** Set this to false if you want the license filter to apply in the top navigation - useful for WP light customers*/\r\n bypassLicenseFilterInTopNav?: boolean = true;\r\n\r\n /** Set this to true to add a team by default to the create collab site wizard **/\r\n addTeamByDefault?: boolean = false;\r\n\r\n /** Set this to true to enable the language filtering of modern Sharepoint news pages. Note this requires that the language setting is turned on on the News Center Site*/\r\n enableModernSPNewsLanguageFilter?: boolean = false;\r\n\r\n // Enable users languages to sync based on AD properties\r\n enableAutoUserLanguageSync?: boolean = false;\r\n\r\n // Enable syncronization of Azure AD groups to WP channels\r\n enableAzureADGroupSync?: boolean = false;\r\n\r\n // Enable language filtering for SharePoint pages\r\n enableLanguageFilteringForSharepointPages?: boolean = false;\r\n\r\n // Enable language filtering for SharePoint infoboxes\r\n enableLanguageFilteringForWorkplaceInfoboxes?: boolean = false;\r\n\r\n // Enable language filtering for SharePoint events\r\n enableLanguageFilteringForSharepointEvents?: boolean = false;\r\n\r\n // Enable language filtering for Workplace content\r\n enableLanguageFilteringForWorkplace?: boolean = false;\r\n\r\n // If enabled, items without any languages selected will be shown to everyone. If disabled items without language will generally not be shown.\r\n enableShowNonLanguageContentForAllUsers?: boolean = false;\r\n\r\n /**\r\n * Specify a term guid from the languages term set.\r\n * If set, this will act as a default language for filtering purposes for users that doesn't have any selected languages.*/\r\n defaultLanguageTermId?: string;\r\n\r\n /** Set this to true to enable the 'add to homescreen banner' for IOS devices*/\r\n enableIosA2hsBanner?: boolean = false;\r\n\r\n /**\r\n * Set this to true to have all links open in the current tab except apps and tools. Including external links such as sharepoint news etc\r\n * When enabled the target attribute (i.e. target=\"_blank\") is set to \"_self\"\r\n */\r\n openAllLinksInSameTab?: boolean = false;\r\n \r\n /**\r\n * Set this to true to have apps and tools open in the current tab. \r\n * When enabled the target attribute (i.e. target=\"_blank\") is set to \"_self\"\r\n */\r\n openAppAndToolsInSameTab?: boolean = false;\r\n\r\n /** Set this to a custom image if you want to override the default one or set it to null when using the Azure CDN for improved performance*/\r\n firstDayBackgroundImage?: string = `assets/cellphone-coffee-desk-860379.jpg?v=${GITVERSION.hash}`\r\n\r\n /** Set this to false to disable the possibility to mark a page as featured */\r\n enableFeaturedPages?: boolean = true;\r\n\r\n /** Set this to tru to enable the notification subscription for broadcasts and news */\r\n enableNotificationSubscriptions?: boolean = false;\r\n\r\n /**\r\n * These SkipLinks are targeted to main content and footer\r\n * All the component skip links are populated dynamically with in the code.\r\n */\r\n staticSkipLinks?: {\r\n \"Sections\": [\r\n {\r\n \"Id\": \"main-content\",\r\n \"Name\": \"Content\"\r\n },\r\n {\r\n \"Id\": \"footer\",\r\n \"Name\": \"Footer\"\r\n },\r\n ]\r\n };\r\n\r\n /** Set this to false to hide the title in the refresh dialog */\r\n showRefreshDialogTitle?: boolean = true;\r\n\r\n /** Toggle this to enable or disable the popover in site index */\r\n enableSiteIndexPopover?: boolean = true;\r\n\r\n /** Set a url that will take user to an iamge gallery where the user can upload an image and then copy the url to the infobox picture url field*/\r\n infoBoxPictureGalleryLink?: string;\r\n\r\n /** Toggle this to enable or disable the migrate button in the infobox list view. It will be hidden when a migration has been performed once */\r\n infoBoxShowMigrateBtn?: boolean = true;\r\n\r\n /** Enable to show a link to the users Delve page on the user menu */\r\n showGoToDelveOnUserMenu?: boolean = false;\r\n\r\n /** Enable to collapse channel lists in user settings if more than 5 channels */\r\n enableCollapsableChannels?: boolean = false;\r\n\r\n /** Set this to a custom image if you want to override the default one or set it to null when using the Azure CDN for improved performance*/\r\n infoboxImageUploadinstructionsImage?: string = `assets/infobox-picture-help.png?v=${GITVERSION.hash}`\r\n\r\n /** Set this to a custom image if you want to override the default one or set it to null when using the Azure CDN for improved performance*/\r\n powerBIEmbedCodeUploadinstructionsImage?: string = `assets/powerbi-embed-picture-help.png?v=${GITVERSION.hash}`\r\n\r\n /** Set this to a custom image if you want to override the default one or set it to null when using the Azure CDN for improved performance*/\r\n powerBIBookmarkUploadinstructionsImage?: string = `assets/powerbi-bookmark-picture-help.png?v=${GITVERSION.hash}`\r\n\r\n /** Enable to make the channel selection required when adding a new BroadcastMessage */\r\n requireChannelSelectionForBroadcastAlerts?: boolean = false;\r\n\r\n /** Enable to make the channel selection required when adding a new PowerBI visual */\r\n requireChannelSelectionForPowerBIVisuals?: boolean = false;\r\n\r\n /** Enable to show SharePoint news center link to all users on News center page */\r\n showSharePointNewsCenterLink?: boolean = false;\r\n\r\n /** Result source ID for finding people, defaults to the built in GUID of Local People Results**/\r\n peopleResultSourceId?: string = 'b09a7990-05ea-4af9-81ef-edfab16c4e31'\r\n\r\n /** Enable to show the news filter buttons between your news and top news */\r\n showFilterByDepartmentButtons?: boolean = false;\r\n\r\n /** Disable expensive api calls to store the data in the local storage which adds up some response time but it works*/\r\n /** Note that this setting only applies to certain selected calls and not generally across workplace. */\r\n disableLocalStorage?: boolean = false;\r\n\r\n /** Set this to false to close the filter dropdown in news center page, it will be open as default */\r\n showFilterInNewsCenter?: boolean = true;\r\n\r\n/** Number of days back to fetch news. Default is 30 days back, but this can be changed in admin settings. */\r\n newsNumberOfDaysBack?: number = 30;\r\n\r\n /** Configure news or page icons in top search, supports both image and font awesome icons if both iconClass and iconUrl are configured than icon class takes precedence*/\r\n newsOrPageIconsInSearch? = {\r\n news: {\r\n iconClass: '',\r\n iconUrl: ''\r\n },\r\n page: {\r\n iconClass: '',\r\n iconUrl: ''\r\n }\r\n };\r\n\r\n /** Set to true to show the PowerBI component, NOTE you will need to have the PowerBI module included in the project for it to work */\r\n showPowerBIComponent?: boolean = false;\r\n\r\n /** Set to true to show teams notification option in users settings page, NOTE: before setting this option to true, configure teams notification feature in customer environment. */\r\n enableTeamsNotification?: boolean = false;\r\n\r\n /** Set this to a custom image if you want to override the default one or set it to null when using the Azure CDN for improved performance*/\r\n teamsNotificationInstructionsImage?: string = `assets/enable-teams-notification-instructions.png?v=${GITVERSION.hash}`\r\n\r\n /** Set the CHANNEL_TERMSET_GUID here, good to use only in customer test environments, this could be overriden from Admin dashboard.*/\r\n channelTermsetGUID?: string = 'd1a62611-0513-4d6a-92e2-9b250a08c5c3';\r\n\r\n /** set this to show guide link in the top navigation */\r\n showGuideNavigation?: boolean = false;\r\n\r\n /** This should be set to the SharePoint Guide URL. Example: 'https://booldemo.sharepoint.com/sites/guide' */\r\n guideSiteUrl?: string;\r\n\r\n /** set this to add a link in the top navigation. URL: where you want the link to go, Title: what it says in top nav */\r\n linkTopNav?: {\r\n title: string,\r\n url: string,\r\n target:string\r\n };\r\n\r\n /** Set URL link to ImageVault if used when uploading images to news pages */\r\n imageVaultUrl?: string;\r\n\r\n /** Set URL link to calendarPageInformation if you like to have this url in the description below the header of Organization calendar */\r\n calendarPageInfoUrl?: string;\r\n \r\n enableCompactDesign?: boolean = true ;\r\n}\r\n/* tslint:enable */\r\n","import { Inject, Injectable } from '@angular/core';\r\nimport { CUSTOMERENVIRONMENT } from '@app/common/app-tokens';\r\nimport { Store } from '@app/common/store';\r\nimport { FeatureSetting } from '@app/models/feature-setting';\r\nimport { EnvironmentFeatureSettings } from '@environments/environment-feature-settings';\r\nimport { Environment } from '@environments/interface.environment';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class FeatureSettingsStoreService extends Store {\r\n\r\n constructor(@Inject(CUSTOMERENVIRONMENT) environment: Environment) {\r\n super({ ...new EnvironmentFeatureSettings(), ...environment.featureSettings } as EnvironmentFeatureSettings);\r\n }\r\n\r\n private setValueOfSetting(settingFromDb: FeatureSetting, settingKey: string) {\r\n if (settingFromDb.DataType === 'boolean' || settingFromDb.DataType === 'number' || settingFromDb.DataType === 'object') {\r\n this.state[settingKey] = JSON.parse(settingFromDb.Value);\r\n } else {\r\n this.state[settingKey] = settingFromDb.Value;\r\n }\r\n }\r\n\r\n updateState(featureSetting: FeatureSetting) {\r\n this.setValueOfSetting(featureSetting, featureSetting.Id);\r\n this.setState(this.state);\r\n }\r\n}\r\n","import { HttpClient, HttpParams } from '@angular/common/http';\r\nimport { Inject, Injectable } from '@angular/core';\r\nimport { CUSTOMERENVIRONMENT } from '@app/common/app-tokens';\r\nimport { Constants } from '@app/common/constants';\r\nimport { HttpHelper } from '@app/common/http-helper';\r\nimport { SiteElement, SiteElementType } from '@app/models/site-element';\r\nimport { CacheService } from '@app/services/cache.service';\r\nimport { Environment } from '@environments/interface.environment';\r\nimport { endOfDay } from 'date-fns';\r\nimport { concat, Observable, of } from 'rxjs';\r\nimport { catchError, map, tap } from 'rxjs/operators';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class SiteElementsService {\r\n\r\n constructor(private http: HttpClient, private cache: CacheService, @Inject(CUSTOMERENVIRONMENT) private environment: Environment, private httpHelper: HttpHelper) { }\r\n\r\n private readonly cacheKeyPrefix = 'SiteElementsService';\r\n public useCache = true;\r\n\r\n getSiteElements(type: SiteElementType = SiteElementType.UNDEFINED, language: string = ''): Observable> {\r\n const cacheKey = `${this.cacheKeyPrefix}-getSiteElements-${type}-${language}`;\r\n const httpParams = new HttpParams()\r\n .append('type', type.toString())\r\n .append('language', language);\r\n const fetchOperation = this.http.get>(`${Constants.API_ENDPOINT}/siteelements`, {\r\n params: httpParams\r\n })\r\n .pipe(\r\n map(result => {\r\n return result;\r\n }),\r\n tap(result => {\r\n console.log(`fetched result getSiteElements: `, result);\r\n // Since this is quite static data we can allow this to be cached and returned again to the user for the duration of the day.\r\n this.useCache && this.cache.set(cacheKey, result, endOfDay(new Date()));\r\n }),\r\n catchError(this.httpHelper.handleError({ operation: 'getSiteElements', result: new Array(), cacheKey: cacheKey })));\r\n\r\n if (this.useCache) {\r\n const cachedData = this.cache.get>(cacheKey);\r\n if (cachedData) {\r\n return concat(of(cachedData), fetchOperation);\r\n }\r\n }\r\n return fetchOperation;\r\n }\r\n\r\n addSiteElement(siteElement: SiteElement): Observable {\r\n const cacheKey = `${this.cacheKeyPrefix}-getSiteElements-${siteElement.Type}-${siteElement.Language}`;\r\n // We need to append the siteUrl because there will be an authorization check in the backend against the workplace admin group on this site\r\n const httpParams = new HttpParams().append('siteUrl', encodeURI(this.environment.coreWorkplaceSiteUrl));\r\n return this.http.post(`${Constants.API_ENDPOINT}/siteelements`, siteElement, {\r\n params: httpParams\r\n })\r\n .pipe(\r\n tap(result => {\r\n console.log(`add siteElement result: `);\r\n console.log(result);\r\n this.useCache && this.cache.removeFromPersistentCache(cacheKey);\r\n }),\r\n catchError(this.httpHelper.handleError({ operation: 'addSiteElement', result: new SiteElement(), rethrow: true })));\r\n }\r\n\r\n updateSiteElements(siteElement: SiteElement): Observable {\r\n const cacheKey = `${this.cacheKeyPrefix}-getSiteElements-${siteElement.Type}-${siteElement.Language}`;\r\n // We need to append the siteUrl because there will be an authorization check in the backend against the workplace admin group on this site\r\n const httpParams = new HttpParams().append('siteUrl', encodeURI(this.environment.coreWorkplaceSiteUrl));\r\n return this.http.put(`${Constants.API_ENDPOINT}/siteelements/${siteElement.Id}`, siteElement, {\r\n params: httpParams\r\n })\r\n .pipe(\r\n tap(result => {\r\n console.log(`updated siteElement result: `);\r\n console.log(result);\r\n this.useCache && this.cache.removeFromPersistentCache(cacheKey);\r\n }),\r\n catchError(this.httpHelper.handleError({ operation: 'updateSiteElements', result: new SiteElement(), rethrow: true })));\r\n }\r\n}\r\n","import { CommonModule } from '@angular/common';\r\nimport { Component, Input, NgModule, OnInit } from '@angular/core';\r\nimport { LinkModule } from '@app/directives/link.directive';\r\n\r\n@Component({\r\n selector: 'app-action-link',\r\n templateUrl: './action-link.component.html',\r\n styleUrls: ['./action-link.component.scss']\r\n})\r\nexport class ActionLinkComponent implements OnInit {\r\n\r\n @Input() href: string;\r\n @Input() target: string;\r\n\r\n constructor() {\r\n\r\n }\r\n\r\n ngOnInit() {\r\n }\r\n\r\n}\r\n\r\n@NgModule({\r\n declarations: [ActionLinkComponent],\r\n imports: [\r\n CommonModule,\r\n LinkModule,\r\n ],\r\n exports: [ActionLinkComponent]\r\n})\r\nexport class ActionLinkModule { }\r\n","\r\n","import { ComponentPortal, PortalModule } from '@angular/cdk/portal';\r\nimport { CommonModule } from '@angular/common';\r\nimport { Component, EventEmitter, Inject, Injector, Input, NgModule, OnInit, Output } from '@angular/core';\r\nimport { RouterModule, Router, ActivatedRoute } from '@angular/router';\r\nimport { CUSTOMERENVIRONMENT } from '@app/common/app-tokens';\r\nimport { Utilities } from '@app/common/utilities';\r\nimport { PortalInjectorFactory } from '@app/injectors/portal.injector';\r\nimport { PersonExtended } from '@app/models/person-extended';\r\nimport { LinkModule } from '@app/directives/link.directive';\r\nimport { SafeModule } from '@app/pipes/safe.pipe';\r\nimport { FeatureSettingsStoreService } from '@app/services/feature-settings-store.service';\r\nimport { UserService } from '@app/services/user.service';\r\nimport { Environment } from '@environments/interface.environment';\r\nimport { Observable } from 'rxjs';\r\n\r\n@Component({\r\n selector: 'app-people-card',\r\n templateUrl: './people-card.component.html',\r\n styleUrls: ['./people-card.component.scss']\r\n})\r\nexport class PeopleCardComponent implements OnInit {\r\n\r\n mobilePhonePortal: ComponentPortal;\r\n\r\n @Input() person: PersonExtended;\r\n @Input() newtab = false;\r\n @Input() expanded = true;\r\n @Input() size: 'small' | 'regular' = 'regular';\r\n @Input() useTeamsChat = true;\r\n @Output() clicked = new EventEmitter();\r\n showDepartment: boolean;\r\n showLocation: boolean;\r\n showOfficePhone: boolean;\r\n showOrgChart: boolean;\r\n photoUrl$: Observable;\r\n enableProfileCardView: boolean;\r\n userUpn: string;\r\n\r\n constructor(@Inject(CUSTOMERENVIRONMENT) private environment: Environment,\r\n private featureStoreSettingsService: FeatureSettingsStoreService,\r\n private userService: UserService,\r\n private router: Router,\r\n private activatedRoute: ActivatedRoute,\r\n private injector: Injector) { }\r\n\r\n getPreferredNameLetters = (person: PersonExtended): string => Utilities.generateInitials(person.displayName);\r\n\r\n /** Delve URL for user */\r\n getDelveUrl(person: PersonExtended): string {\r\n if (person.id) {\r\n return 'https://delve.office.com/?u=' + person.id;\r\n } else {\r\n return person.fallbackUrl;\r\n }\r\n }\r\n\r\n whenPersonClicked(event: Event, navigate = false) {\r\n this.clicked.emit(navigate);\r\n\r\n // HACK: Because of this bug https://github.com/angular/angular/issues/13523 we have to do it this way.\r\n if (navigate) {\r\n if (this.activatedRoute.parent.outlet === 'modal') {\r\n this.router.navigate(['', { outlets: { modal: null } }])\r\n .then(() => {\r\n return this.router.navigate([`/user/detail/`, this.userUpn]);\r\n });\r\n } else {\r\n this.router.navigate([`/user/detail/`, this.userUpn]);\r\n }\r\n }\r\n }\r\n\r\n isExternalUser(person: PersonExtended): boolean {\r\n if (person.userPrincipalName) {\r\n return person.userPrincipalName.includes('#EXT#');\r\n }\r\n return false;\r\n }\r\n\r\n ngOnInit() {\r\n this.showDepartment = this.featureStoreSettingsService.state.myColleaguesShowDepartment;\r\n this.showLocation = this.featureStoreSettingsService.state.myColleaguesShowLocation;\r\n this.showOfficePhone = this.featureStoreSettingsService.state.myColleaguesShowOfficePhone;\r\n this.showOrgChart = this.featureStoreSettingsService.state.myColleaguesShowOrgChart;\r\n this.enableProfileCardView = this.featureStoreSettingsService.state.enableProfileCardView;\r\n this.photoUrl$ = this.userService.getUserPhotoByUpn(this.person.userPrincipalName);\r\n\r\n const re = /\\./gi;\r\n this.userUpn = this.person.userPrincipalName.replace(re, '/');\r\n\r\n if (this.environment.customComponents && this.environment.customComponents.has('mobilePhonePortal')) {\r\n const portalInjector = PortalInjectorFactory.create(this.injector, { person: this.person });\r\n this.mobilePhonePortal = new ComponentPortal(this.environment.customComponents.get('mobilePhonePortal'), null, portalInjector);\r\n }\r\n }\r\n\r\n}\r\n@NgModule({\r\n declarations: [PeopleCardComponent],\r\n exports: [PeopleCardComponent],\r\n imports: [\r\n CommonModule,\r\n LinkModule,\r\n SafeModule,\r\n PortalModule,\r\n RouterModule\r\n ],\r\n})\r\nexport class PeopleCardModule { }\r\n","
\r\n \r\n \r\n
\r\n {{person.displayName}}\r\n
\r\n \r\n \r\n
\r\n {{person.displayName}}\r\n
\r\n
\r\n
\r\n \r\n \r\n

{{ getPreferredNameLetters(person) }}

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

{{ getPreferredNameLetters(person) }}

\r\n
\r\n
\r\n
\r\n\r\n
\r\n \r\n\r\n
\r\n {{person.jobTitle}}\r\n
\r\n\r\n
\r\n \r\n
\r\n \r\n {{person.department}}\r\n
\r\n\r\n \r\n
\r\n \r\n {{person.officeLocation}}\r\n
\r\n\r\n
\r\n \r\n \r\n {{person.mobilePhone}}\r\n \r\n \r\n
\r\n\r\n \r\n
0 && showOfficePhone\">\r\n \r\n \r\n {{person.businessPhones[0]}}\r\n \r\n
\r\n\r\n
\r\n \r\n {{person.mail}}\r\n
\r\n\r\n
\r\n \r\n \r\n \r\n Start chat\r\n \r\n \r\n Start chat\r\n \r\n \r\n
\r\n
\r\n \r\n \r\n \r\n Organizational chart\r\n \r\n \r\n
\r\n
\r\n\r\n
\r\n
\r\n","import { ChannelTermNavigationNode } from './channel-term-navigation-node';\r\nimport { LanguageTermNavigationNode } from './language-term-navigation-node';\r\nimport { TermLabel } from './simplified-term';\r\n\r\nexport class NavigationNode {\r\n\r\n public Id: string;\r\n public Title: string;\r\n public Url: string;\r\n public Children: Array;\r\n\r\n constructor(opt?: Partial) {\r\n Object.assign(this, opt);\r\n }\r\n}\r\n\r\nexport class SPNavigationNode extends NavigationNode {\r\n\r\n public Children: Array;\r\n\r\n // specific for Term Set navigation nodes\r\n public FriendlyUrl: string;\r\n public TermCount: number;\r\n public LastModified: Date;\r\n public Labels: Array;\r\n public LocalCustomProperties: { [key: string]: string; };\r\n public Selected: boolean;\r\n public DisableSelection: boolean;\r\n public IsRoot: boolean;\r\n public IsAvailableForTagging: boolean;\r\n\r\n // specific for SP navigation nodes\r\n public IsDocLib: boolean;\r\n public IsExternal: boolean;\r\n public ParentId: number;\r\n public ListTemplateType: number;\r\n public AudienceIds?: any;\r\n\r\n /** UI specific, status for node expansion. */\r\n public Expanded?: boolean;\r\n\r\n constructor(opt?: Partial) {\r\n super();\r\n Object.assign(this, opt);\r\n }\r\n}\r\n\r\nexport class WPNavigationNode extends NavigationNode {\r\n\r\n public Children: Array;\r\n public Order: number;\r\n public Parent?: WPNavigationNode;\r\n public ParentId?: number;\r\n public ChannelTermNavigationNodes: Array;\r\n public LanguageTermNavigationNodes: Array;\r\n\r\n constructor(opt?: Partial) {\r\n super();\r\n Object.assign(this, opt);\r\n }\r\n}\r\n","import { BehaviorSubject, Observable } from 'rxjs';\r\n\r\n/* Used for hepling with state management\r\n * From this example: https://jurebajt.com/state-management-in-angular-with-observable-store-services/, https://github.com/jurebajt/rxjs-observable-store */\r\nexport abstract class Store {\r\n state$: Observable;\r\n private _state$: BehaviorSubject;\r\n\r\n protected constructor(initialState: T) {\r\n this._state$ = new BehaviorSubject(initialState);\r\n this.state$ = this._state$.asObservable();\r\n }\r\n\r\n get state(): T {\r\n return this._state$.getValue();\r\n }\r\n\r\n setState(nextState: T): void {\r\n this._state$.next(nextState);\r\n }\r\n}\r\n","// IMPORTANT: THIS FILE IS AUTO GENERATED AND OVERWRITTEN ON BUILD!\n/* tslint:disable */\nexport const GITVERSION = {\n \"dirty\": false,\n \"raw\": \"11.5.0-33-g8a8ec183f\",\n \"hash\": \"g8a8ec183f\",\n \"distance\": 33,\n \"tag\": \"11.5.0\",\n \"semver\": {\n \"options\": {\n \"loose\": false,\n \"includePrerelease\": false\n },\n \"loose\": false,\n \"raw\": \"11.5.0\",\n \"major\": 11,\n \"minor\": 5,\n \"patch\": 0,\n \"prerelease\": [],\n \"build\": [],\n \"version\": \"11.5.0\"\n },\n \"suffix\": \"33-g8a8ec183f\",\n \"semverString\": \"11.5.0+33.g8a8ec183f\"\n};\nexport const DATESTAMP = '2022-04-04 17:42:19';\n/* tslint:enable */\n","import { CommonModule } from '@angular/common';\r\nimport { Component, Input, NgModule, OnInit } from '@angular/core';\r\n\r\n@Component({\r\n selector: 'app-widget-placeholder',\r\n templateUrl: './widget-placeholder.component.html',\r\n styleUrls: ['./widget-placeholder.component.scss']\r\n})\r\nexport class WidgetPlaceholderComponent implements OnInit {\r\n\r\n @Input() useGhostContent: boolean;\r\n\r\n constructor() { }\r\n\r\n ngOnInit() {\r\n }\r\n\r\n}\r\n\r\n@NgModule({\r\n declarations: [WidgetPlaceholderComponent],\r\n imports: [CommonModule],\r\n exports: [WidgetPlaceholderComponent]\r\n})\r\nexport class WidgetPlaceholderModule { }\r\n","
\r\n \r\n
\r\n","import { Injectable, Optional } from '@angular/core';\r\nimport { MatSnackBar } from '@angular/material/snack-bar';\r\nimport { Utilities } from '@app/common/utilities';\r\nimport { AlertTemplatesComponent } from '@app/components/alert-templates/alert-templates.component';\r\nimport { CacheService } from '@app/services/cache.service';\r\nimport { InternetStatusService } from '@app/services/internet-status.service';\r\nimport { Observable, of, throwError } from 'rxjs';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class HttpHelper {\r\n\r\n constructor(@Optional() private snackBar: MatSnackBar, private cache: CacheService, private internetStatusService: InternetStatusService) { }\r\n\r\n public handleError({ operation, result, rethrow = false, cacheKey, showErrorSnackbar = true }: { operation: string; result?: T; rethrow?: boolean; cacheKey?: string, showErrorSnackbar?: boolean }): (error: any) => Observable {\r\n return (error: any): Observable => {\r\n\r\n // log error\r\n console.error(operation, error);\r\n\r\n if (error.status === 402) {\r\n // We return 402 Payment Required when we're not licensed to access a sharepoint api - https://tools.ietf.org/html/rfc7231#section-6.5.2\r\n // The error is actually that we're not licensed to call the api so we just return whatever default has been specified.\r\n console.log('The user is unlicensed to call the requested API');\r\n return of(result as T);\r\n }\r\n\r\n const errorInfo = error.status + ';' + operation;\r\n if (error?.status && showErrorSnackbar) {\r\n this.snackBar && Utilities.openSnackBar(this.snackBar, AlertTemplatesComponent, errorInfo);\r\n }\r\n\r\n // Handle if we're offline then return cached data.\r\n if (cacheKey &&\r\n (\r\n error?.status === 504 // Service worker reports 504 when we're offline\r\n ||\r\n (error?.message?.indexOf('Http failure response for') > -1 && error?.status === 0) // this case usually happens if DNS fails for a service or ethernetcable is unplugged\r\n ||\r\n this.internetStatusService.state.online === false // We know that we're offline due to browser events\r\n )\r\n ) {\r\n const cachedValue = this.cache.get(cacheKey);\r\n if (cachedValue) {\r\n this.snackBar && Utilities.openSnackBar(this.snackBar, AlertTemplatesComponent, AlertTemplatesComponent.offline, 5000);\r\n return of(cachedValue);\r\n }\r\n }\r\n\r\n if (rethrow) {\r\n return throwError(error);\r\n }\r\n\r\n // Let the app keep running by returning an empty or cached result.\r\n return of(result as T);\r\n };\r\n }\r\n\r\n}\r\n","import { HttpClient } from '@angular/common/http';\r\nimport { Inject, Injectable } from '@angular/core';\r\nimport { CUSTOMERENVIRONMENT } from '@app/common/app-tokens';\r\nimport { AuthorizationMode } from '@app/common/authorization-mode';\r\nimport { Constants } from '@app/common/constants';\r\nimport { HttpHelper } from '@app/common/http-helper';\r\nimport { Roles } from '@app/common/roles';\r\nimport { UserMembershipToGroup } from '@app/models/file';\r\nimport { LicenseService } from '@app/services/license.service';\r\nimport { Environment } from '@environments/interface.environment';\r\nimport { forkJoin, Observable, of } from 'rxjs';\r\nimport { catchError, map, mergeMap, shareReplay } from 'rxjs/operators';\r\nimport { AuthService } from '@app/services/auth.service';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class SecurityService {\r\n\r\n constructor(private http: HttpClient, @Inject(CUSTOMERENVIRONMENT) private environment: Environment, private httpHelper: HttpHelper, private licenseService: LicenseService, private authService: AuthService) { }\r\n\r\n private isUserMemberOfSharePointGroup$ = new Map>();\r\n private roles$: Observable>;\r\n\r\n isUserMemberOfSharePointGroup(groupTitle: string): Observable {\r\n // NOTE: The property OnlyAllowMembersViewMembership must be set to true for the group you want to check.\r\n if (!this.isUserMemberOfSharePointGroup$.has(groupTitle)) {\r\n const httpRequest = this.licenseService.hasUserAny365License()\r\n .pipe(\r\n mergeMap(hasLicense => {\r\n if (hasLicense) {\r\n return this.http\r\n .get(`${this.environment.coreWorkplaceSiteUrl}/_api/web/sitegroups/getbyname('${groupTitle}')/CanCurrentUserViewMembership`)\r\n .pipe(\r\n map(response => {\r\n return response.value;\r\n }));\r\n } else {\r\n return of(false);\r\n }\r\n }),\r\n catchError(this.httpHelper.handleError({ operation: 'isUserMemberOfGroup', result: false })),\r\n shareReplay({ bufferSize: 1, refCount: true })\r\n );\r\n\r\n this.isUserMemberOfSharePointGroup$.set(groupTitle, httpRequest);\r\n }\r\n return this.isUserMemberOfSharePointGroup$.get(groupTitle);\r\n }\r\n\r\n checkMembershipToOffice365Groups(groupIds: Array): Observable> {\r\n if (groupIds.length > 0) {\r\n return this.http\r\n .post(`${Constants.GRAPH_API_ENDPOINT}${Constants.GRAPH_API_VERSION_ONE}/me/checkMemberGroups`, { 'groupIds': groupIds })\r\n .pipe(map(response => {\r\n return groupIds.map(gid => {\r\n const membershipToGroupIds = response.value as Array;\r\n return {\r\n GroupId: gid,\r\n UserIsMember: membershipToGroupIds && membershipToGroupIds.length > 0 ? membershipToGroupIds.some(a => a.toLowerCase() === gid.toLowerCase()) : false\r\n };\r\n });\r\n }));\r\n } else {\r\n return of(new Array());\r\n }\r\n }\r\n\r\n getUserRoleClaimValues(): Observable {\r\n const roles = this.authService.idTokenClaims.get('roles') as Array;\r\n if (!roles || roles.length === 0) {\r\n if (!this.roles$) {\r\n this.roles$ = this.http.get>(`${Constants.API_ENDPOINT}/security/roles`)\r\n .pipe(\r\n catchError(this.httpHelper.handleError({ operation: 'roles$', result: [] })),\r\n shareReplay({ bufferSize: 1, refCount: true })\r\n );\r\n }\r\n return this.roles$;\r\n } else {\r\n return of(roles);\r\n }\r\n }\r\n\r\n hasUserAppRole(role: Roles): Observable {\r\n const roleName = this.getRoleName(role, this.environment.authorizationMode);\r\n if (this.environment.authorizationMode === AuthorizationMode.Claims) {\r\n return this.getUserRoleClaimValues()\r\n .pipe(\r\n map(roles => {\r\n return roles.some(r => r === roleName);\r\n }));\r\n } else {\r\n return this.isUserMemberOfSharePointGroup(roleName);\r\n }\r\n }\r\n\r\n hasUserAnyAppRole(roles: Roles[]) {\r\n const obs$ = roles.map(role => this.hasUserAppRole(role));\r\n return forkJoin(obs$)\r\n .pipe(\r\n map(result => {\r\n return result.some(r => r === true);\r\n }));\r\n }\r\n\r\n getRoleName(role: Roles, authMode: AuthorizationMode) {\r\n switch (authMode) {\r\n case AuthorizationMode.Claims: {\r\n if (role === Roles.Admin) {\r\n return Constants.WORKPLACE_ADMINISTRATORS_ROLE_NAME;\r\n }\r\n if (role === Roles.Editor) {\r\n return Constants.WORKPLACE_EDITORS_ROLE_NAME;\r\n }\r\n if (role === Roles.CollabSiteCreator) {\r\n return Constants.WORKPLACE_COLLABSITECREATOR_ROLE_NAME;\r\n }\r\n if (role === Roles.AppEditor) {\r\n return Constants.WORKPLACE_APP_EDITOR_ROLE_NAME;\r\n }\r\n if (role === Roles.MessageBroadcastEditor) {\r\n return Constants.WORKPLACE_MESSAGEBROADCAST_EDITOR_ROLE_NAME;\r\n }\r\n if (role === Roles.FooterEditor) {\r\n return Constants.WORKPLACE_FOOTER_EDITOR_ROLE_NAME;\r\n }\r\n if (role === Roles.EditorDashboardEditor) {\r\n return Constants.WORKPLACE_EDITORDASHBOARD_EDITOR_ROLE_NAME;\r\n }\r\n if (role === Roles.PowerBIEditor) {\r\n return Constants.WORKPLACE_POWER_BI_EDITOR_ROLE_NAME;\r\n }\r\n break;\r\n }\r\n case AuthorizationMode.SharePoint:\r\n default: {\r\n // Default will use SharePoint as this was the default mode when Workplace was created.\r\n if (role === Roles.Admin) {\r\n return Constants.WORKPLACE_ADMINISTRATORS_GROUP_TITLE;\r\n }\r\n if (role === Roles.Editor) {\r\n return Constants.WORKPLACE_EDITORS_GROUP_TITLE;\r\n }\r\n if (role === Roles.CollabSiteCreator) {\r\n return Constants.COLLAB_SITE_CREATION_GROUP_TITLE;\r\n }\r\n if (role === Roles.AppEditor) {\r\n return Constants.WORKPLACE_EDITORS_GROUP_TITLE;\r\n }\r\n if (role === Roles.MessageBroadcastEditor) {\r\n return Constants.WORKPLACE_EDITORS_GROUP_TITLE;\r\n }\r\n if (role === Roles.FooterEditor) {\r\n return Constants.WORKPLACE_EDITORS_GROUP_TITLE;\r\n }\r\n if (role === Roles.EditorDashboardEditor) {\r\n return Constants.WORKPLACE_EDITORS_GROUP_TITLE;\r\n }\r\n if (role === Roles.PowerBIEditor) {\r\n return Constants.WORKPLACE_ADMINISTRATORS_GROUP_TITLE;\r\n }\r\n break;\r\n }\r\n }\r\n }\r\n\r\n}\r\n","import { CommonModule, PlatformLocation } from '@angular/common';\r\nimport { Component, Input, NgModule, OnInit } from '@angular/core';\r\nimport { FeatureSettingsStoreService } from '@app/services/feature-settings-store.service';\r\n\r\n@Component({\r\n selector: 'app-first-day-hero',\r\n templateUrl: './first-day-hero.component.html',\r\n styleUrls: ['./first-day-hero.component.scss']\r\n})\r\nexport class FirstDayHeroComponent implements OnInit {\r\n @Input() height: number;\r\n backgroundImage: string;\r\n\r\n constructor(private platformLocation: PlatformLocation, private featureSettingsStoreService: FeatureSettingsStoreService) { }\r\n\r\n ngOnInit() {\r\n if (this.featureSettingsStoreService.state.firstDayBackgroundImage) {\r\n this.backgroundImage = `url(${this.platformLocation.getBaseHrefFromDOM()}${this.featureSettingsStoreService.state.firstDayBackgroundImage})`;\r\n }\r\n }\r\n\r\n}\r\n@NgModule({\r\n declarations: [FirstDayHeroComponent],\r\n imports: [\r\n CommonModule\r\n ],\r\n exports: [FirstDayHeroComponent]\r\n})\r\nexport class FirstDayHeroModule { }\r\n","
\r\n
\r\n
\r\n \r\n \r\n
\r\n
\r\n
\r\n","import { ComponentFactoryResolver, ViewContainerRef } from '@angular/core';\r\nimport { Routes } from '@angular/router';\r\nimport { ComponentState } from '@app/models/component-state';\r\nimport { Utilities } from '@app/common/utilities';\r\n\r\nexport class ComponentsOnRoutesState {\r\n RouteMap: Map> = new Map>();\r\n MainMap = new Array();\r\n\r\n constructor(routeConfig: Routes, componentFactoryResolver: ComponentFactoryResolver, vcr: ViewContainerRef) {\r\n // Iterate through components on routes\r\n routeConfig.forEach(route => {\r\n const routeKey = `/${route.path}`;\r\n const components = Utilities.getComponentsOnRoute(route, componentFactoryResolver, vcr);\r\n this.RouteMap.set(routeKey, components);\r\n });\r\n }\r\n}\r\n","import { ComponentFactoryResolver, Injectable, ViewContainerRef } from '@angular/core';\r\nimport { Router } from '@angular/router';\r\nimport { Store } from '@app/common/store';\r\nimport { ComponentState } from '@app/models/component-state';\r\nimport { ComponentsOnRoutesState } from '@app/models/components-on-routes-state';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class ComponentStatesOnRoutesService extends Store {\r\n\r\n hasInitialized = false;\r\n\r\n constructor(private componentFactoryResolver: ComponentFactoryResolver, private router: Router) {\r\n super(null); // intialization is in initStates separately due to need for ViewContainerRef\r\n }\r\n\r\n initStates(viewContainerRef: ViewContainerRef) {\r\n if (!this.hasInitialized) {\r\n this.setState(new ComponentsOnRoutesState(this.router.config, this.componentFactoryResolver, viewContainerRef));\r\n this.hasInitialized = true;\r\n }\r\n }\r\n\r\n updateStates(updatedComponentState: ComponentState) {\r\n if (this.hasInitialized) {\r\n if (!updatedComponentState.Routes || updatedComponentState.Routes?.length === 0) {\r\n // if the state that needs to be updated doesnt have a route we try to find it. This could be when we're updating events from server side.\r\n this.state.RouteMap.forEach((componentState, route) => {\r\n const componentStatesForRouteWithSelector = componentState.filter(e => e.ComponentId === updatedComponentState.ComponentId);\r\n if (componentStatesForRouteWithSelector) {\r\n if (componentStatesForRouteWithSelector.length === 1) {\r\n if (!updatedComponentState.Routes) {\r\n updatedComponentState.Routes = [route];\r\n } else {\r\n updatedComponentState.Routes.push(route);\r\n }\r\n } else {\r\n componentStatesForRouteWithSelector.forEach(cState => {\r\n if (!updatedComponentState.Routes || updatedComponentState.Routes?.length === 0) {\r\n if (updatedComponentState.Component) {\r\n Object.keys(cState.Component.Configurations).forEach(key => {\r\n if (updatedComponentState.Component.Configurations[key] && updatedComponentState.Component.Configurations[key] === cState.Component.Configurations[key]) {\r\n if (!updatedComponentState.Routes) {\r\n updatedComponentState.Routes = [route];\r\n } else {\r\n updatedComponentState.Routes.push(route);\r\n }\r\n }\r\n });\r\n } else {\r\n if (updatedComponentState.Routes.indexOf(route) === -1) {\r\n if (!updatedComponentState.Routes) {\r\n updatedComponentState.Routes = [route];\r\n } else {\r\n updatedComponentState.Routes.push(route);\r\n }\r\n }\r\n }\r\n }\r\n });\r\n }\r\n }\r\n });\r\n }\r\n\r\n if (updatedComponentState?.Routes?.length > 0) {\r\n updatedComponentState.Routes.forEach(route => {\r\n const componentStatesOnRoute = this.state.RouteMap.get(route);\r\n if (componentStatesOnRoute) {\r\n const existing = componentStatesOnRoute.find(componentEvent => componentEvent.ComponentId === updatedComponentState.ComponentId);\r\n if (existing) {\r\n const mappedComponenents = componentStatesOnRoute.map(currentComponentState => {\r\n if (currentComponentState.ComponentId === updatedComponentState.ComponentId) {\r\n if (updatedComponentState.Data && currentComponentState.Data) {\r\n currentComponentState.Data = updatedComponentState.Data.concat(currentComponentState.Data);\r\n }\r\n if (updatedComponentState.LastCheckedForNewContent) {\r\n currentComponentState.LastCheckedForNewContent = updatedComponentState.LastCheckedForNewContent;\r\n }\r\n currentComponentState.ShowBadge = updatedComponentState.ShowBadge;\r\n currentComponentState.Refresh = updatedComponentState.Refresh;\r\n }\r\n return currentComponentState;\r\n });\r\n this.state.RouteMap.set(route, mappedComponenents);\r\n } else {\r\n componentStatesOnRoute.push(updatedComponentState);\r\n this.state.RouteMap.set(route, componentStatesOnRoute);\r\n }\r\n } else {\r\n this.state.RouteMap.set(route, [updatedComponentState]);\r\n }\r\n });\r\n } else {\r\n if (this.state.MainMap.some(s => s.ComponentId === updatedComponentState.ComponentId)) {\r\n this.state.MainMap = this.state.MainMap.map(currentComponentState => {\r\n if (currentComponentState.ComponentId === updatedComponentState.ComponentId) {\r\n if (updatedComponentState.Data && currentComponentState.Data) {\r\n updatedComponentState.Data = updatedComponentState.Data.concat(currentComponentState.Data);\r\n }\r\n // Merge the updated state with current because we get some properties from different sources.\r\n updatedComponentState.Component = { ...currentComponentState.Component, ...updatedComponentState.Component };\r\n currentComponentState = updatedComponentState;\r\n }\r\n return currentComponentState;\r\n });\r\n } else {\r\n this.state.MainMap.push(updatedComponentState);\r\n }\r\n }\r\n\r\n this.setState(this.state);\r\n }\r\n }\r\n}\r\n","import { Injectable, Renderer2, RendererFactory2 } from '@angular/core';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class UrlHelperService {\r\n\r\n private renderer: Renderer2;\r\n\r\n constructor(rendererFactory: RendererFactory2) {\r\n this.renderer = rendererFactory.createRenderer(null, null);\r\n }\r\n\r\n public getUrlWithoutQueryStrings(url): string {\r\n const parser = this.renderer.createElement('a');\r\n parser.href = url;\r\n const urlToReturn = `${parser.protocol}//${parser.hostname}/${parser.pathname}`;\r\n parser.remove();\r\n return urlToReturn;\r\n }\r\n\r\n public getAuthorityUrlWithoutQueryStrings(url): string {\r\n const parser = this.renderer.createElement('a');\r\n parser.href = url;\r\n const urlToReturn = `${parser.protocol}//${parser.hostname}`;\r\n parser.remove();\r\n return urlToReturn;\r\n }\r\n\r\n public getHostName(url): string {\r\n const parser = this.renderer.createElement('a');\r\n parser.href = url;\r\n const urlToReturn = `${parser.hostname}`;\r\n parser.remove();\r\n return urlToReturn;\r\n }\r\n\r\n public getParamsFromUrl(url): Map {\r\n const params = new Map();\r\n const parser = this.renderer.createElement('a');\r\n parser.href = url;\r\n const query = parser.search.substring(1);\r\n const vars = query.split('&');\r\n for (let i = 0; i < vars.length; i++) {\r\n const pair = vars[i].split('=');\r\n params.set(pair[0], decodeURIComponent(pair[1]));\r\n }\r\n parser.remove();\r\n return params;\r\n }\r\n}\r\n","import { HttpClient } from '@angular/common/http';\r\nimport { Injectable } from '@angular/core';\r\nimport { Constants } from '@app/common/constants';\r\nimport { HttpHelper } from '@app/common/http-helper';\r\nimport { UserTabComponentConfiguration } from '@app/models/user-tab-configuration';\r\nimport { concat, Observable, of, Subject } from 'rxjs';\r\nimport { catchError, map, shareReplay, takeUntil, tap } from 'rxjs/operators';\r\nimport { CacheService } from './cache.service';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class UserTabComponentConfigurationsService {\r\n\r\n constructor(private http: HttpClient, private cache: CacheService, private httpHelper: HttpHelper) { }\r\n\r\n public readonly cacheKey = 'UserTabComponentConfigurationsService-getUserTabConfig';\r\n public useCache = true;\r\n private getUserTabConfig$: Observable>;\r\n private reload$ = new Subject();\r\n\r\n public reload() {\r\n this.reload$.next();\r\n this.getUserTabConfig$ = null;\r\n if (this.useCache) {\r\n this.cache.removeFromPersistentCache(this.cacheKey);\r\n }\r\n }\r\n\r\n getUserTabConfig(): Observable> {\r\n if (this.getUserTabConfig$) {\r\n return this.getUserTabConfig$;\r\n } else {\r\n this.getUserTabConfig$ = this.http.get>(`${Constants.API_ENDPOINT}/me/usertabcomponentconfigurations`)\r\n .pipe(\r\n map(response => {\r\n console.log('UserTabComponentConfigurationsService.getUserTabConfig', response);\r\n return response.map(p => new UserTabComponentConfiguration(p));\r\n }),\r\n tap(data => {\r\n this.useCache && this.cache.set(this.cacheKey, data);\r\n }),\r\n catchError(this.httpHelper.handleError({ operation: 'getUserTabConfig', result: new Array(), rethrow: true, cacheKey: this.cacheKey })),\r\n takeUntil(this.reload$),\r\n shareReplay({ bufferSize: 1, refCount: true }));\r\n\r\n if (this.useCache) {\r\n const cachedData = this.cache.get>(this.cacheKey);\r\n if (cachedData) {\r\n return concat(of(cachedData), this.getUserTabConfig$);\r\n }\r\n }\r\n\r\n return this.getUserTabConfig$;\r\n }\r\n\r\n }\r\n\r\n addUserTabConfiguration(userTabConfiguration: UserTabComponentConfiguration): Observable {\r\n return this.http.post(`${Constants.API_ENDPOINT}/me/usertabcomponentconfigurations`, userTabConfiguration)\r\n .pipe(\r\n map(response => {\r\n // console.log(`added result: `);\r\n // console.log(response);\r\n this.reload();\r\n return new UserTabComponentConfiguration(response);\r\n }),\r\n catchError(this.httpHelper.handleError({ operation: 'addUserTabConfiguration', result: new UserTabComponentConfiguration(), rethrow: true })));\r\n }\r\n\r\n updateUserTabConfigurations(userTabConfigurations: Array): Observable {\r\n return this.http.put>(`${Constants.API_ENDPOINT}/me/usertabcomponentconfigurations`, userTabConfigurations)\r\n .pipe(\r\n tap(response => {\r\n // console.log(`updated results: `);\r\n // console.log(response);\r\n this.reload();\r\n }),\r\n catchError(this.httpHelper.handleError({ operation: 'updateUserTabConfigurations', result: new Array(), rethrow: true })));\r\n }\r\n\r\n updateUserTabConfiguration(id: number, userTabConfiguration: UserTabComponentConfiguration): Observable {\r\n return this.http.put>(`${Constants.API_ENDPOINT}/me/usertabcomponentconfigurations/${id}`, userTabConfiguration)\r\n .pipe(\r\n tap(response => {\r\n // console.log(`updated result: `);\r\n // console.log(response);\r\n this.reload();\r\n }),\r\n catchError(this.httpHelper.handleError({ operation: 'updateUserTabConfiguration', result: new UserTabComponentConfiguration(), rethrow: true })));\r\n }\r\n}\r\n","import { HttpClient, HttpParams } from '@angular/common/http';\r\nimport { Inject, Injectable } from '@angular/core';\r\nimport { CUSTOMERENVIRONMENT } from '@app/common/app-tokens';\r\nimport { Constants } from '@app/common/constants';\r\nimport { HttpHelper } from '@app/common/http-helper';\r\nimport { CacheService } from '@app/services/cache.service';\r\nimport { Environment } from '@environments/interface.environment';\r\nimport { BehaviorSubject, concat, Observable, of, Subject } from 'rxjs';\r\nimport { catchError, map, shareReplay, takeUntil, tap } from 'rxjs/operators';\r\nimport { WPNavigationNode } from '../models/navigation-node';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class NavigationNodeService {\r\n\r\n constructor(@Inject(CUSTOMERENVIRONMENT) private environment: Environment,\r\n private http: HttpClient,\r\n private httpHelper: HttpHelper,\r\n private cache: CacheService) { }\r\n\r\n private readonly cacheKey = 'NavigationNodeService-getNavigationNodesLight';\r\n public useCache = true;\r\n getAllNavigationNodes$: Observable>;\r\n private reload$ = new Subject();\r\n public refresh$ = new BehaviorSubject(null);\r\n\r\n public reload() {\r\n if (this.useCache) {\r\n this.cache.removeFromPersistentCache(this.cacheKey);\r\n }\r\n this.reload$.next();\r\n this.getAllNavigationNodes$ = null;\r\n this.refresh$.next(null);\r\n }\r\n\r\n deleteNavigationNode(id: string): Observable {\r\n // We need to append the siteUrl because there will be an authorization check in the backend against the workplace admin group on this site\r\n const httpParams = new HttpParams().append('siteUrl', encodeURI(this.environment.coreWorkplaceSiteUrl));\r\n const fetchOperation = this.http.delete(`${Constants.API_ENDPOINT}/NavigationNodes/${id}`, {\r\n\r\n params: httpParams\r\n })\r\n .pipe(\r\n map(response => {\r\n console.log(`deleteNavigationNode response: `, response);\r\n this.reload();\r\n return response;\r\n }));\r\n\r\n return fetchOperation;\r\n }\r\n\r\n addNavigationNode(node: WPNavigationNode): Observable {\r\n // We need to append the siteUrl because there will be an authorization check in the backend against the workplace admin group on this site\r\n const httpParams = new HttpParams().append('siteUrl', encodeURI(this.environment.coreWorkplaceSiteUrl));\r\n const fetchOperation = this.http.post(`${Constants.API_ENDPOINT}/NavigationNodes`, node, {\r\n params: httpParams\r\n })\r\n .pipe(\r\n map(response => {\r\n console.log(`addNavigationNode added response: `, response);\r\n this.reload();\r\n return new WPNavigationNode(response);\r\n }),\r\n catchError(this.httpHelper.handleError({ operation: 'addNavigationNode', result: new WPNavigationNode(), rethrow: true })));\r\n\r\n return fetchOperation;\r\n }\r\n\r\n updateNavigationNode(id: string, node: WPNavigationNode): Observable {\r\n // We need to append the siteUrl because there will be an authorization check in the backend against the workplace admin group on this site\r\n const httpParams = new HttpParams().append('siteUrl', encodeURI(this.environment.coreWorkplaceSiteUrl));\r\n const fetchOperation = this.http.put(`${Constants.API_ENDPOINT}/NavigationNodes/${id}`, node, {\r\n\r\n params: httpParams\r\n })\r\n .pipe(\r\n map(response => {\r\n console.log(`updateNavigationNode response: `, response);\r\n this.reload();\r\n return new WPNavigationNode(response);\r\n }),\r\n catchError(this.httpHelper.handleError({ operation: 'updateNavigationNode', result: new WPNavigationNode(), rethrow: true })));\r\n\r\n return fetchOperation;\r\n }\r\n\r\n updateNavigationNodeOrder(nodes: Array): Observable {\r\n // We need to append the siteUrl because there will be an authorization check in the backend against the workplace admin group on this site\r\n const httpParams = new HttpParams().append('siteUrl', encodeURI(this.environment.coreWorkplaceSiteUrl));\r\n const fetchOperation = this.http.put>(`${Constants.API_ENDPOINT}/NavigationNodes/`, nodes, {\r\n\r\n params: httpParams\r\n })\r\n .pipe(\r\n map(response => {\r\n console.log(`updateNavigationNodeOrder ordering updated`);\r\n this.reload();\r\n return;\r\n }),\r\n catchError(this.httpHelper.handleError({ operation: 'updateNavigationNodeOrder', result: new WPNavigationNode(), rethrow: true })));\r\n\r\n return fetchOperation;\r\n }\r\n\r\n getNavigationNode(id: string): Observable {\r\n // We need to append the siteUrl because there will be an authorization check in the backend against the workplace admin group on this site\r\n const httpParams = new HttpParams().append('siteUrl', encodeURI(this.environment.coreWorkplaceSiteUrl));\r\n const fetchOperation = this.http.get(`${Constants.API_ENDPOINT}/NavigationNodes/${id}`, {\r\n\r\n params: httpParams\r\n })\r\n .pipe(\r\n map(response => {\r\n console.log('getNavigationNode response: ', response);\r\n return new WPNavigationNode(response);\r\n }));\r\n\r\n return fetchOperation;\r\n }\r\n\r\n getAllNavigationNodes(): Observable> {\r\n if (this.getAllNavigationNodes$) {\r\n return this.getAllNavigationNodes$;\r\n } else {\r\n this.getAllNavigationNodes$ = this.http.get>(`${Constants.API_ENDPOINT}/NavigationNodes/`, {\r\n\r\n })\r\n .pipe(\r\n map(response => {\r\n console.log(`fetched result getAllNavigationNodes: `, response);\r\n return response.map(p => new WPNavigationNode(p));\r\n }),\r\n tap(data => {\r\n this.useCache && this.cache.set(`${this.cacheKey}-all`, data);\r\n }),\r\n catchError(this.httpHelper.handleError({ operation: 'getAllNavigationNodes', result: new Array(), rethrow: true, cacheKey: `${this.cacheKey}-all` })),\r\n takeUntil(this.reload$),\r\n shareReplay({ bufferSize: 1, refCount: true }));\r\n\r\n if (this.useCache) {\r\n const cachedData = this.cache.get>(`${this.cacheKey}-all`);\r\n if (cachedData) {\r\n return concat(of(cachedData), this.getAllNavigationNodes$);\r\n }\r\n }\r\n return this.getAllNavigationNodes$;\r\n }\r\n }\r\n}\r\n","export enum AuthorizationMode {\r\n Claims = 'Claims', // Claims mode requires that you setup appRoles as specified in documentation.\r\n SharePoint = 'SharePoint' // SharePoint mode was default for Workplace and requires that atleast 2 SharePoint groups are setup on the coreWorkplaceSiteUrl.\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { O365Licenses } from '@app/common/o365-licenses';\r\nimport { UserService } from '@app/services/user.service';\r\nimport { Observable } from 'rxjs';\r\nimport { map, shareReplay } from 'rxjs/operators';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class LicenseService {\r\n\r\n constructor(private userService: UserService) { }\r\n\r\n private hasUser365License$: Observable;\r\n\r\n hasUserAny365License(): Observable {\r\n if (!this.hasUser365License$) {\r\n this.hasUser365License$ = this.userService.getMyDetailsFromMsGraph(true)\r\n .pipe(\r\n map(user => user.assignedLicenses.some(license =>\r\n license.skuId === O365Licenses.MICROSOFT_365_BUSINESS\r\n || license.skuId === O365Licenses.MICROSOFT_365_E3\r\n || license.skuId === O365Licenses.Microsoft_365_E5\r\n || license.skuId === O365Licenses.Microsoft_365_F1\r\n || license.skuId === O365Licenses.OFFICE_365_BUSINESS\r\n || license.skuId === O365Licenses.O365_BUSINESS_ESSENTIALS\r\n || license.skuId === O365Licenses.O365_BUSINESS_PREMIUM\r\n || license.skuId === O365Licenses.OFFICE_365_ENTERPRISE_E1\r\n || license.skuId === O365Licenses.OFFICE_365_ENTERPRISE_E2\r\n || license.skuId === O365Licenses.OFFICE_365_ENTERPRISE_E3\r\n || license.skuId === O365Licenses.OFFICE_365_ENTERPRISE_E3\r\n || license.skuId === O365Licenses.OFFICE_365_ENTERPRISE_E4\r\n || license.skuId === O365Licenses.OFFICE_365_ENTERPRISE_E5\r\n || license.skuId === O365Licenses.OFFICE_365_ENTERPRISE_E5_WITHOUT_AUDIO_CONFERENCING\r\n || license.skuId === O365Licenses.OFFICE_365_F1\r\n || license.skuId === O365Licenses.OFFICE_365_MIDSIZE_BUSINESS\r\n || license.skuId === O365Licenses.OFFICE_365_PROPLUS\r\n || license.skuId === O365Licenses.OFFICE_365_SMALL_BUSINESS\r\n || license.skuId === O365Licenses.OFFICE_365_SMALL_BUSINESS_PREMIUM)\r\n ),\r\n shareReplay({ bufferSize: 1, refCount: true })\r\n );\r\n }\r\n return this.hasUser365License$;\r\n }\r\n\r\n hasUserLicense(skuIds: Array): Observable {\r\n return this.userService.getMyDetailsFromMsGraph()\r\n .pipe(\r\n map(user => {\r\n return user.assignedLicenses.some(license => skuIds.includes(license.skuId)) || user.assignedPlans.some(plan => plan.capabilityStatus === 'Enabled' && plan.service === 'PowerBI');\r\n }),\r\n shareReplay({ bufferSize: 1, refCount: true })\r\n );\r\n }\r\n}\r\n","export class FeatureSetting {\r\n Id: string;\r\n Value: string;\r\n DataType: string;\r\n Environment: string;\r\n Modified: string;\r\n constructor(opt?: Partial) {\r\n Object.assign(this, opt);\r\n }\r\n}\r\n","import { Component } from '@app/models/component';\r\nimport { Tab } from '@app/models/tab';\r\nimport { User } from '@app/models/user';\r\n\r\nexport class UserTabComponentConfiguration {\r\n public Id: number;\r\n public User?: User;\r\n public UserUpnId: string;\r\n public Tab?: Tab;\r\n public TabId: string;\r\n public Component?: Component;\r\n public ComponentId: string;\r\n public ComponentConfigurations?: { [key: string]: any; };\r\n public Hidden?: boolean;\r\n public Order: number;\r\n\r\n constructor(opt?: Partial) {\r\n Object.assign(this, opt);\r\n }\r\n}\r\n","import { HttpClient, HttpHeaders, HttpParams } from '@angular/common/http';\r\nimport { Inject, Injectable, Renderer2, RendererFactory2 } from '@angular/core';\r\nimport { CUSTOMERENVIRONMENT } from '@app/common/app-tokens';\r\nimport { Constants } from '@app/common/constants';\r\nimport { applyLanguageFilteringSingle } from '@app/common/filtering-behavior';\r\nimport { HttpHelper } from '@app/common/http-helper';\r\nimport { NewsPage } from '@app/models/news-page';\r\nimport { Page } from '@app/models/page';\r\nimport { SearchPostQuery, SearchPostQueryRequest } from '@app/models/search-post-query';\r\nimport { UserChannelTerm } from '@app/models/user-channel-term';\r\nimport { UserLanguageTerm } from '@app/models/user-language-term';\r\nimport { CacheService } from '@app/services/cache.service';\r\nimport { CultureService } from '@app/services/culture.service';\r\nimport { FeatureSettingsStoreService } from '@app/services/feature-settings-store.service';\r\nimport { SearchService } from '@app/services/search.service';\r\nimport { SphomeService } from '@app/services/sphome.service';\r\nimport { Environment } from '@environments/interface.environment';\r\nimport { ListItem } from '@microsoft/microsoft-graph-types';\r\nimport { combineLatest, concat, forkJoin, iif, Observable, of, Subject } from 'rxjs';\r\nimport { catchError, concatMap, map, mergeMap, shareReplay, switchMap, takeUntil, tap } from 'rxjs/operators';\r\nimport { LicenseService } from './license.service';\r\nimport { UrlHelperService } from '@app/services/url-helper.service';\r\nimport { addMinutes } from 'date-fns';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class NewsService {\r\n\r\n private readonly cacheKeyPrefix = 'NewsService';\r\n\r\n private readonly translationFields = '_SPIsTranslation,_SPTranslatedLanguages,_SPTranslationSourceItemId,_SPTranslationLanguage';\r\n\r\n public useCache = true;\r\n private getModernTopNewsGraph$ = new Map>>();\r\n private getTopNewsApi$ = new Map>>();\r\n private getModernPersonalNewsFromGraph$: Observable>;\r\n private getPersonalNewsFromApi$: Observable>;\r\n private getModernNewsFromSearch$ = new Map>>();\r\n\r\n public reloadAllTopNews$ = new Subject();\r\n public reloadGetModernTopNewsGraph$ = new Subject();\r\n public reloadGetTopNewsApi$ = new Subject();\r\n public reloadAllPersonalNews$ = new Subject();\r\n public reloadGetModernPersonalNewsFromGraph$ = new Subject();\r\n public reloadGetPersonalNewsFromApi$ = new Subject();\r\n public reloadGetModernNewsFromSearch$ = new Subject();\r\n\r\n private getSharePointNewsPageFromOriginalUrl$ = new Map>();\r\n\r\n private renderer: Renderer2; // Used to convert the light page content HTML to plain text for my-news\r\n\r\n private featureSettings = this.featureSettingsStoreService.state;\r\n\r\n constructor(@Inject(CUSTOMERENVIRONMENT) private environment: Environment,\r\n private http: HttpClient,\r\n private httpHelper: HttpHelper,\r\n private cache: CacheService,\r\n private spHomeService: SphomeService,\r\n private featureSettingsStoreService: FeatureSettingsStoreService,\r\n private searchService: SearchService,\r\n private licenseService: LicenseService,\r\n private cultureService: CultureService,\r\n rendererFactory: RendererFactory2,\r\n private urlHelperService: UrlHelperService) {\r\n this.renderer = rendererFactory.createRenderer(null, null);\r\n }\r\n\r\n reloadModernTopNewsGraph() {\r\n this.getModernTopNewsGraph$.clear();\r\n this.reloadGetModernTopNewsGraph$.next();\r\n }\r\n\r\n reloadGetTopNewsApi() {\r\n this.getTopNewsApi$.clear();\r\n this.reloadGetTopNewsApi$.next();\r\n }\r\n\r\n reloadAllTopNews() {\r\n this.getModernTopNewsGraph$.clear();\r\n this.getTopNewsApi$.clear();\r\n this.reloadAllTopNews$.next();\r\n }\r\n\r\n reloadGetModernPersonalNewsFromGraph() {\r\n this.getModernPersonalNewsFromGraph$ = null;\r\n this.reloadGetModernPersonalNewsFromGraph$.next();\r\n }\r\n\r\n reloadGetPersonalNewsFromApi() {\r\n this.getPersonalNewsFromApi$ = null;\r\n this.reloadGetPersonalNewsFromApi$.next();\r\n }\r\n\r\n reloadGetModernNewsFromSearch() {\r\n this.getModernNewsFromSearch$.clear();\r\n this.reloadGetModernNewsFromSearch$.next();\r\n }\r\n\r\n reloadAllPersonalNews() {\r\n this.getModernPersonalNewsFromGraph$ = null;\r\n this.getPersonalNewsFromApi$ = null;\r\n this.getModernNewsFromSearch$.clear();\r\n this.reloadAllPersonalNews$.next();\r\n }\r\n\r\n getNewsFromSpHome(start: number = 0, count: number = 10) {\r\n\r\n // Source types for news:\r\n // Unknown = 0x0,\r\n // PersonalFeed = 0x1,\r\n // SuggestedSites = 0x2,\r\n // FollowedSites = 0x4,\r\n // PeopleToReadNewsFrom = 0x8,\r\n // PeopleWorkingWith = 0x10,\r\n // All = 0x1F\r\n // e.g. https://westeurope3-sphomep.svc.ms/api/v1/news?start=0&count=200&sourceType=4\r\n\r\n return this.spHomeService.getSPHomeContext()\r\n .pipe(concatMap(ctx => {\r\n const httpHeaders = new HttpHeaders().append('SPHome-ApiContext', ctx.Payload);\r\n return this.http.get(`${ctx.Urls[0]}/api/v1/news?start=${start}&count=${count}`, {\r\n headers: httpHeaders\r\n });\r\n }));\r\n }\r\n\r\n getNewTopNews(lastCheckedDate: Date, userLanguageTerms$: Observable>): Observable {\r\n return iif(\r\n () => this.environment.enableWorkplaceLight,\r\n // Workplace light enabled\r\n this.licenseService.hasUserAny365License().pipe(\r\n switchMap(licensed => {\r\n return iif(\r\n () => licensed,\r\n // Workplace light + SharePoint licensed\r\n forkJoin([this.getNewTopNewsFromApi(lastCheckedDate, userLanguageTerms$), this.getNewOrUpdatedModernTopNewsFromGraph(lastCheckedDate, userLanguageTerms$)]).pipe(\r\n map(([apiItems, graphItems]) => {\r\n // Concat the results from sharepoint + api\r\n return apiItems.concat(graphItems);\r\n })\r\n ),\r\n // Only Workplace Light\r\n this.getNewTopNewsFromApi(lastCheckedDate, userLanguageTerms$)\r\n );\r\n })\r\n ),\r\n // Only SharePoint\r\n this.getNewOrUpdatedModernTopNewsFromGraph(lastCheckedDate, userLanguageTerms$)\r\n );\r\n }\r\n\r\n getNewOrUpdatedModernTopNewsFromGraph(lastCheckedDate: Date, userLanguageTerms$: Observable>): Observable {\r\n const newsCenterSite = this.featureSettings.newsCenterSiteUrl ? this.featureSettings.newsCenterSiteUrl : this.environment.coreWorkplaceSiteUrl;\r\n const listsRequest = `${newsCenterSite}/_api/v2.0/sharePoint/getBaseItemByUrl(url='/SitePages')/items`;\r\n const httpParams = new HttpParams()\r\n .append('expand', 'fields(select=Title,BannerImageUrl,BoolField_NewsIsTopNews,BoolField_Language,Description,_CommentCount,_LikeCount,BoolField_SenderTag,PromotedState,FirstPublishedDate,Modified)')\r\n .append('select', 'fields,id,webUrl')\r\n .append('filter', `(fields/PromotedState eq 2) and (fields/BoolField_NewsIsTopNews eq 1) and (fields/FirstPublishedDate gt '${lastCheckedDate.toISOString()}')`)\r\n .append('orderby', 'fields/FirstPublishedDate desc');\r\n\r\n const getNewOrUpdatedModernTopNewsFromGraph$ = this.http\r\n .get(listsRequest, {\r\n params: httpParams,\r\n headers: {\r\n 'Prefer': 'HonorNonIndexedQueriesWarningMayFailRandomly'\r\n }\r\n })\r\n .pipe(\r\n map((listItemResult) => {\r\n const listItems = listItemResult.value as ListItem[];\r\n return listItems.map(item => {\r\n return new NewsPage({\r\n Title: item.fields['Title'],\r\n PublishedDate: item.fields['FirstPublishedDate'],\r\n Picture: item.fields['BannerImageUrl'] ? item.fields['BannerImageUrl'].Url : null,\r\n Description: item.fields['Description'],\r\n CommentsCount: item.fields['_CommentCount'] ? item.fields['_CommentCount'] : 0,\r\n LikesCount: item.fields['_LikeCount'] ? item.fields['_LikeCount'] : 0,\r\n Path: item.webUrl,\r\n LanguageTermId: (item.fields['BoolField_Language'] && item.fields['BoolField_Language'].TermGuid) ? item.fields['BoolField_Language'].TermGuid : '',\r\n IsSharePointNews: true,\r\n SenderTags: item.fields['BoolField_SenderTag'] ? item.fields['BoolField_SenderTag'] : null\r\n });\r\n });\r\n }));\r\n\r\n return getNewOrUpdatedModernTopNewsFromGraph$\r\n .pipe(\r\n // Language filter toggle\r\n mergeMap((pages) => {\r\n return iif(\r\n () => this.featureSettings.enableLanguageFilteringForSharepointPages,\r\n userLanguageTerms$.pipe(\r\n map((userLanguageTerms) => {\r\n return applyLanguageFilteringSingle(pages, userLanguageTerms, this.featureSettings.enableShowNonLanguageContentForAllUsers, this.featureSettings.defaultLanguageTermId);\r\n })\r\n ),\r\n of(pages)\r\n );\r\n }),\r\n catchError(this.httpHelper.handleError({ operation: 'getNewOrUpdatedModernTopNewsFromGraph', result: new Array(), rethrow: true }))\r\n );\r\n }\r\n\r\n getNewTopNewsFromApi(lastCheckedDate: Date, userLanguageTerms$: Observable>): Observable {\r\n\r\n const httpParams = new HttpParams()\r\n .append('fromDate', lastCheckedDate.toISOString());\r\n\r\n const getNewTopNewsFromApi$ = this.http\r\n .get>(`${Constants.API_ENDPOINT}/pages/news/top/new`, {\r\n params: httpParams,\r\n })\r\n .pipe(\r\n map(pages => {\r\n return pages.map(page => {\r\n return new NewsPage({\r\n Title: page.Title,\r\n PublishedDate: page.PublishingDate,\r\n Picture: page.BannerImageUrl,\r\n Description: page.Content,\r\n CommentsCount: null,\r\n LikesCount: null,\r\n Path: `/pages/news/${page.SlugTitle}-${page.Id}`,\r\n IsSharePointNews: false,\r\n LanguageTermId: page.LanguageTermId,\r\n });\r\n });\r\n }));\r\n\r\n return getNewTopNewsFromApi$\r\n .pipe(\r\n mergeMap((pages) => {\r\n // Language filter toggle\r\n if (this.featureSettings.enableLanguageFilteringForWorkplace) {\r\n return userLanguageTerms$\r\n .pipe(\r\n map((userLanguageTerms) => {\r\n return applyLanguageFilteringSingle(pages, userLanguageTerms, this.featureSettings.enableShowNonLanguageContentForAllUsers, this.featureSettings.defaultLanguageTermId);\r\n })\r\n );\r\n } else {\r\n return of(pages);\r\n }\r\n }),\r\n catchError(this.httpHelper.handleError({ operation: 'getNewTopNewsFromApi', result: new Array(), rethrow: true }))\r\n );\r\n }\r\n\r\n getModernTopNewsFromGraph(amount: number, userLanguageTerms$: Observable>): Observable {\r\n const cacheKey = `${this.cacheKeyPrefix}-${'getModernTopNewsFromGraph'}-${amount.toString()}`;\r\n\r\n if (this.getModernTopNewsGraph$.has(cacheKey)) {\r\n return this.getModernTopNewsGraph$.get(cacheKey);\r\n } else {\r\n const newsCenterSite = this.featureSettings.newsCenterSiteUrl ? this.featureSettings.newsCenterSiteUrl : this.environment.coreWorkplaceSiteUrl;\r\n const listsRequest = `${newsCenterSite}/_api/v2.0/sharePoint/getBaseItemByUrl(url='/SitePages')/items`;\r\n const selectFields = `Title,BannerImageUrl,BoolField_NewsIsTopNews,Description,_CommentCount,_LikeCount,BoolField_Channel,BoolField_Language,PromotedState,BoolField_SenderTag,FirstPublishedDate${this.featureSettings.enableModernSPNewsLanguageFilter ? ',' + this.translationFields : ''}`;\r\n let httpParams = new HttpParams()\r\n .append('expand', `fields(select=${selectFields})`)\r\n .append('orderby', 'fields/FirstPublishedDate desc')\r\n .append('select', 'fields,id,webUrl')\r\n .append('top', this.featureSettings.enableLanguageFilteringForSharepointPages ? '50' : amount.toString());\r\n\r\n if (this.featureSettings.enableModernSPNewsLanguageFilter) {\r\n // Filter reads like this: Get only top news where the page has been translated to our language or the apge is not translated and has no translations to our language.\r\n httpParams = httpParams.append('filter', `(fields/PromotedState eq 2) and (fields/BoolField_NewsIsTopNews eq 1) and ((fields/_SPTranslationLanguage eq '${this.cultureService.getLocaleWithSuffix().toLowerCase()}' and fields/_SPIsTranslation eq 1) or (fields/_SPIsTranslation ne 1 and fields/_SPTranslatedLanguages ne '${this.cultureService.getLocaleWithSuffix().toLowerCase()}'))`);\r\n } else {\r\n // Filter reads like this: Get only top news\r\n httpParams = httpParams.append('filter', `(fields/PromotedState eq 2) and (fields/BoolField_NewsIsTopNews eq 1)`);\r\n }\r\n\r\n const getModernTopNewsGraph$ = this.http.get(listsRequest, { params: httpParams, headers: { 'Prefer': 'HonorNonIndexedQueriesWarningMayFailRandomly' } })\r\n .pipe(\r\n map((listItemResult) => {\r\n const listItems = listItemResult.value as ListItem[];\r\n return listItems.map(item => {\r\n return new NewsPage({\r\n Title: item.fields['Title'],\r\n PublishedDate: item.fields['FirstPublishedDate'],\r\n Picture: item.fields['BannerImageUrl'] ? item.fields['BannerImageUrl'].Url : null,\r\n Description: item.fields['Description'],\r\n CommentsCount: item.fields['_CommentCount'] ? item.fields['_CommentCount'] : 0,\r\n LikesCount: item.fields['_LikeCount'] ? item.fields['_LikeCount'] : 0,\r\n Channels: item.fields['BoolField_Channel'],\r\n LanguageTermId: (item.fields['BoolField_Language'] && item.fields['BoolField_Language'].TermGuid) ? item.fields['BoolField_Language'].TermGuid : '',\r\n Path: item.webUrl,\r\n IsSharePointNews: true,\r\n SenderTags: item.fields['BoolField_SenderTag'] ? item.fields['BoolField_SenderTag'] : null\r\n });\r\n });\r\n }));\r\n\r\n this.getModernTopNewsGraph$.set(cacheKey, getModernTopNewsGraph$\r\n .pipe(\r\n mergeMap((pages) => {\r\n // Language filter toggle\r\n if (this.featureSettings.enableLanguageFilteringForSharepointPages) {\r\n return userLanguageTerms$\r\n .pipe(\r\n map((userLanguageTerms) => {\r\n return applyLanguageFilteringSingle(pages, userLanguageTerms, this.featureSettings.enableShowNonLanguageContentForAllUsers, this.featureSettings.defaultLanguageTermId);\r\n })\r\n );\r\n } else {\r\n return of(pages);\r\n }\r\n }),\r\n tap(data => {\r\n this.useCache && this.cache.set(cacheKey, data);\r\n }),\r\n catchError(this.httpHelper.handleError({ operation: 'getModernTopNewsFromGraph', result: new Array(), rethrow: true, cacheKey: cacheKey })),\r\n takeUntil(this.reloadGetModernTopNewsGraph$),\r\n shareReplay({ bufferSize: 1, refCount: true })\r\n ));\r\n\r\n if (this.useCache) {\r\n const cachedData = this.cache.get>(cacheKey);\r\n if (cachedData) {\r\n return concat(of(cachedData), this.getModernTopNewsGraph$.get(cacheKey));\r\n }\r\n }\r\n return this.getModernTopNewsGraph$.get(cacheKey);\r\n }\r\n }\r\n\r\n getModernNewsItemInfoFromPagePath(newsPage: NewsPage): Observable {\r\n const originalUrl = newsPage.Path;\r\n const cacheKey = `${this.cacheKeyPrefix}-NewsItemInfo-${originalUrl}`;\r\n const cachedData = this.cache.get(cacheKey);\r\n if (cachedData) {\r\n return of(cachedData);\r\n }\r\n\r\n const httpParams = new HttpParams()\r\n .append('url', `'${originalUrl}'`)\r\n .append('select', `id,parentReference`);\r\n const getSharePointNewsPageFromOriginalUrl$ =\r\n this.http.get(`${this.environment.coreWorkplaceSiteUrl}/_api/v2.0/sharePoint/getBaseItemByUrl`, { params: httpParams })\r\n .pipe(\r\n mergeMap(listItem => {\r\n if (listItem?.id && listItem?.parentReference?.id && listItem?.parentReference?.siteId && listItem?.parentReference['listId']) {\r\n const authorityUrl = this.urlHelperService.getAuthorityUrlWithoutQueryStrings(originalUrl);\r\n const hostName = this.urlHelperService.getHostName(originalUrl);\r\n const url = `${authorityUrl}/_api/v2.1/sites/${hostName},${listItem.parentReference.siteId}/lists/${listItem?.parentReference['listId']}/items/${listItem.id}`;\r\n return this.getSpPageInfoFromUrl(url);\r\n } else {\r\n return of(null);\r\n }\r\n }),\r\n shareReplay({ bufferSize: 1, refCount: true }),\r\n tap(data => {\r\n this.useCache && this.cache.set(cacheKey, data, addMinutes(new Date(), 1));\r\n }),\r\n );\r\n\r\n return getSharePointNewsPageFromOriginalUrl$;\r\n }\r\n\r\n getSpPageInfoFromUrl(url: string): Observable {\r\n const cacheKey = `${this.cacheKeyPrefix}-${'getPageInfoFromUrl'}-${url}`;\r\n const cachedData = this.cache.get(cacheKey);\r\n if (cachedData) {\r\n return of(cachedData);\r\n }\r\n\r\n const httpParams = new HttpParams()\r\n .append('expand', 'fields(select=Title,BannerImageUrl,BoolField_NewsIsTopNews,BoolField_Language,Description,_CommentCount,_LikeCount,BoolField_SenderTag,PromotedState,FirstPublishedDate,Modified)')\r\n .append('select', 'fields,id,webUrl');\r\n\r\n const getModernPersonalNewsFromSP$ = this.http\r\n .get(url, {\r\n params: httpParams,\r\n headers: {\r\n 'Prefer': 'HonorNonIndexedQueriesWarningMayFailRandomly'\r\n }\r\n })\r\n .pipe(\r\n map((listItemResult) => {\r\n return new NewsPage({\r\n Title: listItemResult.fields['Title'],\r\n PublishedDate: listItemResult.fields['FirstPublishedDate'],\r\n Picture: listItemResult.fields['BannerImageUrl'] ? listItemResult.fields['BannerImageUrl'].Url : null,\r\n Description: listItemResult.fields['Description'],\r\n CommentsCount: listItemResult.fields['_CommentCount'] ? listItemResult.fields['_CommentCount'] : 0,\r\n LikesCount: listItemResult.fields['_LikeCount'] ? listItemResult.fields['_LikeCount'] : 0,\r\n Path: listItemResult.webUrl,\r\n LanguageTermId: (listItemResult.fields['BoolField_Language'] && listItemResult.fields['BoolField_Language'].TermGuid) ? listItemResult.fields['BoolField_Language'].TermGuid : '',\r\n IsSharePointNews: true,\r\n SenderTags: listItemResult.fields['BoolField_SenderTag'] ? listItemResult.fields['BoolField_SenderTag'] : null\r\n });\r\n }),\r\n shareReplay({ bufferSize: 1, refCount: true }),\r\n tap(data => {\r\n this.useCache && this.cache.set(cacheKey, data, addMinutes(new Date(), 1));\r\n }),\r\n catchError(this.httpHelper.handleError({ operation: 'getSpPageInfoFromUrl', result: new NewsPage(), cacheKey: cacheKey })));\r\n\r\n return getModernPersonalNewsFromSP$;\r\n }\r\n\r\n getTopNewsFromApi(amount: number, userLanguageTerms$: Observable>): Observable {\r\n const cacheKey = `${this.cacheKeyPrefix}-${'getTopNewsFromApi'}-${amount.toString()}`;\r\n\r\n if (this.getTopNewsApi$.has(cacheKey)) {\r\n return this.getTopNewsApi$.get(cacheKey);\r\n } else {\r\n const httpParams = new HttpParams()\r\n .append('amount', this.featureSettings.enableLanguageFilteringForWorkplace ? '50' : amount.toString());\r\n\r\n const httpCall$ = this.http\r\n .get>(`${Constants.API_ENDPOINT}/pages/news/top`, {\r\n params: httpParams,\r\n });\r\n const getTopNewsApi$ = httpCall$\r\n .pipe(\r\n map((pages) => {\r\n return pages.map(page => {\r\n return new NewsPage({\r\n Title: page.Title,\r\n PublishedDate: page.PublishingDate,\r\n Picture: page.BannerImageUrl,\r\n Description: page.Content,\r\n CommentsCount: null,\r\n LikesCount: null,\r\n Channels: page.ChannelTermPages,\r\n Path: `/pages/news/${page.SlugTitle}-${page.Id}`,\r\n IsSharePointNews: false,\r\n LanguageTermId: page.LanguageTermId\r\n });\r\n });\r\n }));\r\n\r\n this.getTopNewsApi$.set(cacheKey,\r\n getTopNewsApi$\r\n .pipe(\r\n mergeMap((pages) => {\r\n // Language filter toggle\r\n if (this.featureSettings.enableLanguageFilteringForWorkplace) {\r\n return userLanguageTerms$\r\n .pipe(\r\n map((userLanguageTerms) => {\r\n return applyLanguageFilteringSingle(pages, userLanguageTerms, this.featureSettings.enableShowNonLanguageContentForAllUsers, this.featureSettings.defaultLanguageTermId);\r\n })\r\n );\r\n } else {\r\n return of(pages);\r\n }\r\n }),\r\n tap(data => {\r\n this.useCache && this.cache.set(cacheKey, data);\r\n }),\r\n catchError(this.httpHelper.handleError({ operation: 'getTopNewsFromApi', result: new Array(), rethrow: true, cacheKey: cacheKey })),\r\n takeUntil(this.reloadGetTopNewsApi$),\r\n shareReplay({ bufferSize: 1, refCount: true })\r\n ));\r\n\r\n if (this.useCache) {\r\n const cachedData = this.cache.get>(cacheKey);\r\n if (cachedData) {\r\n return concat(of(cachedData), this.getTopNewsApi$.get(cacheKey));\r\n }\r\n }\r\n return this.getTopNewsApi$.get(cacheKey);\r\n }\r\n }\r\n\r\n getPersonalNewsFromApi(userChannelTerms$: Observable>, userLanguageTerms$: Observable>, amount: number = 100): Observable {\r\n const cacheKey = `${this.cacheKeyPrefix}-${'getPersonalNewsFromApi'}-${amount.toString()}`;\r\n if (this.getPersonalNewsFromApi$) {\r\n return this.getPersonalNewsFromApi$;\r\n } else {\r\n const httpParams = new HttpParams()\r\n .append('amount', this.featureSettings.enableLanguageFilteringForSharepointPages ? '50' : amount.toString());\r\n const httpCall$ = this.http\r\n .get>(`${Constants.API_ENDPOINT}/pages/news/my`, {\r\n params: httpParams,\r\n });\r\n\r\n const pages$ = combineLatest([userChannelTerms$, httpCall$])\r\n .pipe(\r\n map(([userChannelTerms, pages]) => {\r\n return pages.map(page => {\r\n return new NewsPage({\r\n Title: page.Title,\r\n PublishedDate: page.PublishingDate,\r\n Picture: page.BannerImageUrl,\r\n Description: this.HTMLToPlainText(page.Content),\r\n CommentsCount: null,\r\n LikesCount: null,\r\n Path: `/pages/news/${page.SlugTitle}-${page.Id}`,\r\n IsSharePointNews: false,\r\n Channels: page.ChannelTermPages,\r\n LanguageTermId: page.LanguageTermId,\r\n });\r\n }).filter(i => {\r\n const channelTerms = i.Channels;\r\n if (channelTerms && channelTerms.length > 0) {\r\n const matchingChannels = i.Channels.some(c =>\r\n userChannelTerms.some(ct => ct.ChannelTermId === c.ChannelTermId)\r\n );\r\n if (matchingChannels) {\r\n return i;\r\n }\r\n } else {\r\n return i;\r\n }\r\n });\r\n }),\r\n );\r\n\r\n this.getPersonalNewsFromApi$ = pages$\r\n .pipe(\r\n // Language filter toggle\r\n mergeMap((pages) => {\r\n return iif(\r\n () => this.featureSettings.enableLanguageFilteringForWorkplace,\r\n userLanguageTerms$.pipe(\r\n map((userLanguageTerms) => {\r\n return applyLanguageFilteringSingle(pages, userLanguageTerms, this.featureSettings.enableShowNonLanguageContentForAllUsers, this.featureSettings.defaultLanguageTermId);\r\n })\r\n ),\r\n of(pages)\r\n );\r\n }),\r\n tap(data => {\r\n this.useCache && this.cache.set(cacheKey, data);\r\n }),\r\n catchError(this.httpHelper.handleError({ operation: 'getPersonalNewsFromApi', result: new Array(), rethrow: true, cacheKey: cacheKey })),\r\n takeUntil(this.reloadGetPersonalNewsFromApi$),\r\n shareReplay({ bufferSize: 1, refCount: true })\r\n );\r\n\r\n if (this.useCache) {\r\n const cachedData = this.cache.get>(cacheKey);\r\n if (cachedData) {\r\n return concat(of(cachedData), this.getPersonalNewsFromApi$);\r\n }\r\n }\r\n return this.getPersonalNewsFromApi$;\r\n }\r\n }\r\n\r\n getMyModernPersonalNewsFromGraph(userChannelTerms$: Observable>, userLanguageTerms$: Observable>) {\r\n if (this.getModernPersonalNewsFromGraph$) {\r\n return this.getModernPersonalNewsFromGraph$;\r\n } else {\r\n const cacheKey = `${this.cacheKeyPrefix}-${'getMyModernPersonalNewsFromGraph'}`;\r\n const newsCenterSite = this.featureSettings.newsCenterSiteUrl ? this.featureSettings.newsCenterSiteUrl : this.environment.coreWorkplaceSiteUrl;\r\n const listsRequest = `${newsCenterSite}/_api/v2.0/sharePoint/getBaseItemByUrl(url='/SitePages')/items`;\r\n const selectFields = `Title,BannerImageUrl,BoolField_Channel,BoolField_Language,BoolField_NewsIsTopNews,Description,_CommentCount,_LikeCount,PromotedState,BoolField_SenderTag,FirstPublishedDate${this.featureSettings.enableModernSPNewsLanguageFilter ? ',' + this.translationFields : ''}`;\r\n let httpParams = new HttpParams()\r\n .append('expand', `fields(select=${selectFields})`)\r\n .append('orderby', 'fields/FirstPublishedDate desc')\r\n .append('select', 'fields,id,webUrl')\r\n .append('top', '100');\r\n if (this.featureSettings.enableModernSPNewsLanguageFilter) {\r\n // Filter reads like this: Get only non-top news where the page has been translated to our language or the apge is not translated and has no translations to our language.\r\n httpParams = httpParams.append('filter', `(fields/PromotedState eq 2) and (fields/BoolField_NewsIsTopNews eq 0) and ((fields/_SPTranslationLanguage eq '${this.cultureService.getLocaleWithSuffix().toLowerCase()}' and fields/_SPIsTranslation eq 1) or (fields/_SPIsTranslation ne 1 and fields/_SPTranslatedLanguages ne '${this.cultureService.getLocaleWithSuffix().toLowerCase()}'))`);\r\n } else {\r\n // Filter reads like this: Get only non-top top news\r\n httpParams = httpParams.append('filter', `(fields/PromotedState eq 2) and (fields/BoolField_NewsIsTopNews eq 0)`);\r\n }\r\n\r\n const httpCall$ = this.http\r\n .get(listsRequest, {\r\n params: httpParams,\r\n headers: {\r\n 'Prefer': 'HonorNonIndexedQueriesWarningMayFailRandomly'\r\n }\r\n });\r\n const getMyModernPersonalNewsFromGraph$ = combineLatest([userChannelTerms$, httpCall$])\r\n .pipe(\r\n map(([userChannelTerms, listItemResult]) => {\r\n const listItems = listItemResult.value as ListItem[];\r\n return listItems.map(item => {\r\n return new NewsPage({\r\n Title: item.fields['Title'],\r\n PublishedDate: item.fields['FirstPublishedDate'],\r\n Channels: item.fields['BoolField_Channel'],\r\n LanguageTermId: (item.fields['BoolField_Language'] && item.fields['BoolField_Language'].TermGuid) ? item.fields['BoolField_Language'].TermGuid : '',\r\n Picture: item.fields['BannerImageUrl'] ? item.fields['BannerImageUrl'].Url : null,\r\n Description: item.fields['Description'],\r\n CommentsCount: item.fields['_CommentCount'] ? item.fields['_CommentCount'] : 0,\r\n LikesCount: item.fields['_LikeCount'] ? item.fields['_LikeCount'] : 0,\r\n Path: item.webUrl,\r\n IsSharePointNews: true,\r\n SenderTags: item.fields['BoolField_SenderTag'] ? item.fields['BoolField_SenderTag'] : null\r\n });\r\n }).filter(i => {\r\n const channelTerms = i.Channels;\r\n if (channelTerms && channelTerms.length > 0) {\r\n let found = true;\r\n const matchingChannels = i.Channels.filter(c => {\r\n found = userChannelTerms.some(ct => ct.ChannelTermId === c.TermGuid);\r\n if (found) {\r\n return c;\r\n }\r\n });\r\n if (matchingChannels && matchingChannels.length > 0) {\r\n return i;\r\n }\r\n } else {\r\n return i;\r\n }\r\n });\r\n }));\r\n\r\n this.getModernPersonalNewsFromGraph$ = getMyModernPersonalNewsFromGraph$\r\n .pipe(\r\n mergeMap((pages) => {\r\n // Language filter toggle\r\n return iif(\r\n () => this.featureSettings.enableLanguageFilteringForSharepointPages,\r\n userLanguageTerms$.pipe(\r\n map((userLanguageTerms) => {\r\n return applyLanguageFilteringSingle(pages, userLanguageTerms, this.featureSettings.enableShowNonLanguageContentForAllUsers, this.featureSettings.defaultLanguageTermId);\r\n })\r\n ),\r\n of(pages)\r\n );\r\n }),\r\n tap(data => {\r\n this.useCache && this.cache.set(cacheKey, data);\r\n }),\r\n catchError(this.httpHelper.handleError({ operation: 'getMyModernPersonalNewsFromGraph', result: new Array(), rethrow: true, cacheKey: cacheKey })),\r\n takeUntil(this.reloadGetModernTopNewsGraph$),\r\n shareReplay({ bufferSize: 1, refCount: true })\r\n );\r\n\r\n if (this.useCache) {\r\n const cachedData = this.cache.get>(cacheKey);\r\n if (cachedData) {\r\n return concat(of(cachedData), this.getModernPersonalNewsFromGraph$);\r\n }\r\n }\r\n return this.getModernPersonalNewsFromGraph$;\r\n }\r\n }\r\n\r\n // Returns moderns news pages from all sites except the Core news center site\r\n getModernNewsFromAllSitesExceptNewsCenterFromSearch(userLanguageTerms$: Observable>, amount: number = 100): Observable> {\r\n const newsCenterSite = this.featureSettings.newsCenterSiteUrl ? this.featureSettings.newsCenterSiteUrl : this.environment.coreWorkplaceSiteUrl;\r\n const excludeSites = this.featureSettings.excludeSitesFromNewsSearch;\r\n\r\n let languageFilterQuery = '';\r\n if (this.featureSettings.enableModernSPNewsLanguageFilter) {\r\n languageFilterQuery = ` AND ((SPTranslationLanguage:${this.cultureService.getLocaleWithSuffix().toLowerCase()} AND SPIsTranslation:true) OR (NOT(SPIsTranslation:true) AND NOT(SPTranslatedLanguages:${this.cultureService.getLocaleWithSuffix().toLowerCase()})))`;\r\n }\r\n\r\n let excludeSitesQuery = '';\r\n if (excludeSites) {\r\n excludeSitesQuery = `OR path:${excludeSites.map(s => s).join(' OR path: ')}`;\r\n }\r\n\r\n const query = `(ContentTypeId: 0x0101009D1CB255DA76424F860D91F20E6C4118* AND PromotedState: 2${languageFilterQuery}) AND NOT(path:${newsCenterSite} ${excludeSitesQuery} )`;\r\n\r\n return this.getModernNewsFromSearch(query, userLanguageTerms$, amount);\r\n }\r\n\r\n // Returns modern news ...\r\n // - from any site (including news center), IF tagged with Core Channel that matches provided channels\r\n // - or from News Center site, AND channel field is empty (thus targeted to all) AND top news field is false\r\n getPersonalModernNewsFromAllSitesFromSearch(userChannelTerms$: Observable>, userLanguageTerms$: Observable>, amount: number = 100): Observable> {\r\n return userChannelTerms$\r\n .pipe(\r\n switchMap(channels => {\r\n const channelsMngProp = this.environment.featureSettings.managedPropertyConfig.newsChannelManagedProperty;\r\n const topNewsMngProp = this.environment.featureSettings.managedPropertyConfig.newsIsTopNewsManagedProperty;\r\n const excludeSites = this.featureSettings.excludeSitesFromNewsSearch;\r\n\r\n let channelQuery = '';\r\n if (channels.length > 0) {\r\n const joinedChannels = channels.map(c => channelsMngProp + ':\"GP0|#' + c.ChannelTermId + '\"').join(' OR ');\r\n channelQuery = ` OR ( NOT(${topNewsMngProp}:1) AND (${joinedChannels}) )`;\r\n }\r\n\r\n // Searching for pages where channel is empty comes from this suggestion: https://fivep.com.au/kierans-tech-talk-searching-for-empty-managed-metadata-columns/\r\n channelQuery = `( (NOT(${channelsMngProp}:G*) AND ${topNewsMngProp}:0) ${channelQuery} )`;\r\n\r\n let languageFilterQuery = '';\r\n if (this.featureSettings.enableModernSPNewsLanguageFilter) {\r\n languageFilterQuery = ` AND ((SPTranslationLanguage:${this.cultureService.getLocaleWithSuffix().toLowerCase()} AND SPIsTranslation:true) OR (NOT(SPIsTranslation:true) AND NOT(SPTranslatedLanguages:${this.cultureService.getLocaleWithSuffix().toLowerCase()})))`;\r\n }\r\n\r\n let excludeSitesQuery = '';\r\n if (excludeSites) {\r\n excludeSitesQuery = ` AND NOT(path:${excludeSites.map(s => s).join(' OR path: ')})`;\r\n }\r\n\r\n const query = `(ContentTypeId: 0x0101009D1CB255DA76424F860D91F20E6C4118* AND PromotedState: 2${languageFilterQuery}) AND ${channelQuery} ${excludeSitesQuery}`;\r\n\r\n return this.getModernNewsFromSearch(query, userLanguageTerms$, amount);\r\n })\r\n );\r\n }\r\n\r\n // Generic function to fetch modern news using search. Uses POST to allow for large queries.\r\n getModernNewsFromSearch(query: string, userLanguageTerms$: Observable>, amount: number = 100): Observable> {\r\n const params = `${amount.toString()}-${query}`;\r\n if (this.getModernNewsFromSearch$.has(params)) {\r\n return this.getModernNewsFromSearch$.get(params);\r\n } else {\r\n const cacheKey = `${this.cacheKeyPrefix}-${'getModernNewsFromSearch'}-${params}`;\r\n const postQuery = new SearchPostQuery({\r\n request: new SearchPostQueryRequest({\r\n Querytext: query,\r\n RowLimit: this.featureSettings.enableLanguageFilteringForSharepointPages ? 50 : amount,\r\n EnableSorting: true,\r\n TrimDuplicates: false,\r\n SortList: [\r\n {\r\n 'Property': 'FirstPublishedDate',\r\n 'Direction': 1\r\n }\r\n ],\r\n SelectProperties: [\r\n 'Title',\r\n 'EditorOwsUser',\r\n 'ModifiedBy',\r\n 'LastModifiedBy',\r\n 'Description',\r\n 'Path',\r\n 'PictureThumbnailURL',\r\n 'LastModifiedTime',\r\n 'FirstPublishedDate',\r\n 'SPWebUrl',\r\n 'SPIsTranslation',\r\n 'SPTranslationLanguage',\r\n 'SPTranslationSourceItemId',\r\n 'SPTranslatedLanguages',\r\n this.environment.featureSettings.managedPropertyConfig.newsAmountOfCommentsManagedProperty,\r\n this.environment.featureSettings.managedPropertyConfig.newsAmountOfLikesManagedProperty,\r\n this.environment.featureSettings.managedPropertyConfig.newsChannelManagedProperty,\r\n this.environment.featureSettings.managedPropertyConfig.newsIsTopNewsManagedProperty,\r\n this.environment.featureSettings.managedPropertyConfig.newsLanguageManagedProperty,\r\n this.environment.featureSettings.managedPropertyConfig.newsSenderTagsManagedProperty,\r\n ],\r\n Properties: [\r\n {\r\n Name: 'EnableDynamicGroups',\r\n Value: {\r\n BoolVal: 'True',\r\n QueryPropertyValueTypeIndex: 3\r\n }\r\n } // include results form private groups - https://www.techmikael.com/2017/01/retrieving-search-results-from-private.html\r\n ]\r\n })\r\n });\r\n\r\n const httpCall$ = this.searchService.sendPostSearchQuery(postQuery);\r\n\r\n const getModernNewsFromSearch$ = httpCall$\r\n .pipe(\r\n map(data => {\r\n const parsedResults = data.map(item => {\r\n return NewsPage.fromSearchResult(item,\r\n this.environment.featureSettings.managedPropertyConfig.newsAmountOfCommentsManagedProperty,\r\n this.environment.featureSettings.managedPropertyConfig.newsAmountOfLikesManagedProperty,\r\n this.environment.featureSettings.managedPropertyConfig.newsChannelManagedProperty,\r\n this.environment.featureSettings.managedPropertyConfig.newsLanguageManagedProperty,\r\n this.environment.featureSettings.managedPropertyConfig.newsSenderTagsManagedProperty);\r\n });\r\n return parsedResults;\r\n }),\r\n tap((data) => {\r\n this.useCache && this.cache.set(cacheKey, data);\r\n }),\r\n catchError(this.httpHelper.handleError({ operation: 'getModernNewsFromSearch', result: new Array(), rethrow: true, cacheKey: cacheKey })),\r\n takeUntil(this.reloadGetModernNewsFromSearch$),\r\n shareReplay({ bufferSize: 1, refCount: true })\r\n );\r\n\r\n this.getModernNewsFromSearch$.set(params, getModernNewsFromSearch$\r\n .pipe(\r\n mergeMap((pages) => {\r\n // Language filter toggle\r\n return iif(\r\n () => this.featureSettings.enableLanguageFilteringForSharepointPages,\r\n userLanguageTerms$.pipe(\r\n map((userLanguageTerms) => {\r\n return applyLanguageFilteringSingle(pages, userLanguageTerms, this.featureSettings.enableShowNonLanguageContentForAllUsers, this.featureSettings.defaultLanguageTermId);\r\n })\r\n ),\r\n of(pages)\r\n );\r\n }),\r\n tap(data => {\r\n this.useCache && this.cache.set(cacheKey, data);\r\n }),\r\n catchError(this.httpHelper.handleError({ operation: 'getModernNewsFromSearch', result: new Array(), rethrow: true, cacheKey: cacheKey })),\r\n takeUntil(this.reloadGetModernTopNewsGraph$),\r\n shareReplay({ bufferSize: 1, refCount: true })\r\n )\r\n );\r\n\r\n if (this.useCache) {\r\n const cachedData = this.cache.get(cacheKey);\r\n if (cachedData) {\r\n return concat(of(cachedData), this.getModernNewsFromSearch$.get(params));\r\n }\r\n }\r\n\r\n return this.getModernNewsFromSearch$.get(params);\r\n }\r\n }\r\n\r\n HTMLToPlainText(htmlContent: string): string {\r\n const htmlParser = this.renderer.createElement('div');\r\n htmlParser.innerHTML = htmlContent;\r\n const plainText = htmlParser.innerText;\r\n htmlParser.remove();\r\n return plainText;\r\n }\r\n}\r\n","export enum NavigationMode {\r\n TermSet = 'TermSet',\r\n HubSite = 'HubSite',\r\n}\r\n","import { CommonModule } from '@angular/common';\r\nimport { Component, Input, NgModule, OnInit } from '@angular/core';\r\n\r\n@Component({\r\n selector: 'app-error-templates',\r\n templateUrl: './error-templates.component.html',\r\n styleUrls: ['./error-templates.component.scss']\r\n})\r\nexport class ErrorTemplatesComponent implements OnInit {\r\n\r\n @Input() error: number;\r\n @Input() componentName: string;\r\n\r\n constructor() { }\r\n\r\n ngOnInit() {\r\n }\r\n\r\n}\r\n\r\n@NgModule({\r\n declarations: [ErrorTemplatesComponent],\r\n imports: [CommonModule],\r\n exports: [ErrorTemplatesComponent]\r\n})\r\nexport class ErrorTemplatesModule { }\r\n","
\r\n
\r\n \r\n

An error occurred in :

{{componentName}}\r\n
\r\n
\r\n \r\n

= 500\">There was a problem loading or saving information. Please try again later.

\r\n

There was an error in the request to the server.

\r\n

You were not authorized to perform the request.

\r\n

You did not have permission to perform the request.

\r\n

The requested object could not be found on the server.

\r\n

There are too many people trying to do the same thing as you, wait a minute and try again.

\r\n

= 300\">There was a redirect in the request, wait a minute and the refresh.

\r\n
\r\n
\r\n","import { SearchResult } from '@app/models/search-result';\r\nimport { Site } from '@microsoft/microsoft-graph-types';\r\nimport { Observable } from 'rxjs';\r\n\r\nexport class NewsPage {\r\n public Title: string;\r\n public Description: string;\r\n public Path: string;\r\n public Picture: string;\r\n public PublishedDate: Date;\r\n public ViewsCount: number;\r\n public CommentsCount: number;\r\n public LikesCount: number;\r\n public GUID: string;\r\n public Channels: Array;\r\n public LanguageTermId?: string;\r\n public ShowNewOrModifiedBadge: boolean;\r\n public SiteName: string;\r\n public SiteUrl: string;\r\n public SiteInfo$?: Observable;\r\n public PageInfo$?: Observable;\r\n public IsSharePointNews?: boolean;\r\n public hide?: boolean;\r\n public SenderTags?: Array;\r\n\r\n constructor(opt?: Partial) {\r\n Object.assign(this, opt);\r\n }\r\n\r\n static fromSearchResult(result: SearchResult, newsAmountOfCommentsMP, newsAmountOfLikesMP, newsChannelMP, pageLanguageMP, newsSenderTagMP?): NewsPage {\r\n\r\n return new this({\r\n Title: result ? result.Title : null,\r\n Description: result ? result.Description : null,\r\n Path: result ? result.Path : null,\r\n Picture: result && result.PictureThumbnailURL ? result.PictureThumbnailURL : null,\r\n PublishedDate: result ? result.FirstPublishedDate : null,\r\n ViewsCount: result ? result.ViewsLifeTimeUniqueUsers : 0,\r\n CommentsCount: result && result[newsAmountOfCommentsMP] ? result[newsAmountOfCommentsMP] : 0,\r\n LikesCount: result && result[newsAmountOfLikesMP] ? result[newsAmountOfLikesMP] : 0,\r\n Channels: result && result[newsChannelMP] ? this.parseManagedMetaDataString(result[newsChannelMP]) : null,\r\n LanguageTermId: result && result[pageLanguageMP] ? this.getManagedMetaDataTermId(result[pageLanguageMP])[0] : '',\r\n SiteUrl: result && result.SPWebUrl ? result.SPWebUrl : null,\r\n IsSharePointNews: true,\r\n SenderTags: result && result[newsSenderTagMP] ? this.parseManagedMetaDataString(result[newsSenderTagMP]) : null\r\n });\r\n }\r\n\r\n static fromSPHomeResult(result: any): NewsPage {\r\n return new this({\r\n Title: result ? result.Title : null,\r\n Description: result ? result.Description : null,\r\n Path: result ? result.Url : null,\r\n Picture: result ? result.ImageUrl : null,\r\n PublishedDate: result ? result.FirstPublishedDate : null,\r\n SiteName: result ? result.Site.Title : null,\r\n SiteUrl: result ? result.Site.Url : null,\r\n IsSharePointNews: true\r\n });\r\n }\r\n\r\n static parseManagedMetaDataString(channels: string): string[] {\r\n // EXAMPLE:\r\n // \"GP0|#fa47a309-9bf1-41c5-ae0e-c96fec918fb0;\"\r\n // \"L0|#0fa47a309-9bf1-41c5-ae0e-c96fec918fb0|Lund;\"\r\n // \"GTSet|#d1a62611-0513-4d6a-92e2-9b250a08c5c3;\r\n // \"GPP|#bf474651-16af-430b-a1c7-3be0003f0f98;\"\r\n // \"GPP|#cd878a30-546c-4275-9e88-08114d03c079;\"\r\n // \"GPP|#48dfae2a-0b81-46dd-872f-d60b08a7c702;\"\r\n // \"GP0|#5ae92d29-5d4a-440e-b0a2-2e8bf0468ba0;\"\r\n // \"L0|#05ae92d29-5d4a-440e-b0a2-2e8bf0468ba0|Chef;\"\r\n // \"GPP|#601ef509-add9-4237-a80f-039f87615b6b;\"\r\n // \"GPP|#79a51917-cf59-4470-81c4-a74e12be48cc\"\r\n return channels.split(';').filter(c => c.split('|').length === 3).map(c => c.split('|')[2]);\r\n }\r\n\r\n static getManagedMetaDataTermId(metadatastring: string): string[] {\r\n // The language used always have 3 parts split by | and the guid starts with '#0' so slice away those two\r\n // EXAMPLE:\r\n // \"GP0|#8718ab35-a7d9-4d99-9945-1f5cc5742224;\"\r\n // \"L0|#08718ab35-a7d9-4d99-9945-1f5cc5742224|English;\"\r\n // \"GTSet|#d1a62611-0513-4d6a-92e2-9b250a08c5c3;\"\r\n return metadatastring.split(';').filter(c => c.split('|').length === 3).map(c => c.split('|')[1].slice(2));\r\n }\r\n}\r\n","import { CommonModule } from '@angular/common';\r\nimport { Component, Inject, NgModule, OnInit } from '@angular/core';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatDialogModule, MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog';\r\nimport { LinkModule } from '@app/directives/link.directive';\r\n\r\n@Component({\r\n selector: 'app-confirm-dialog',\r\n templateUrl: './confirm-dialog.component.html',\r\n styleUrls: ['./confirm-dialog.component.scss']\r\n})\r\nexport class ConfirmDialogComponent implements OnInit {\r\n\r\n constructor(public dialogRef: MatDialogRef,\r\n @Inject(MAT_DIALOG_DATA) public data: any) { }\r\n\r\n confirm() {\r\n this.dialogRef.close(true);\r\n }\r\n\r\n ngOnInit() {\r\n console.log(this.data);\r\n }\r\n\r\n}\r\n@NgModule({\r\n declarations: [\r\n ConfirmDialogComponent\r\n ],\r\n entryComponents: [\r\n ConfirmDialogComponent\r\n ],\r\n imports: [\r\n CommonModule,\r\n MatDialogModule,\r\n MatButtonModule,\r\n LinkModule,\r\n ]\r\n})\r\nexport class ConfirmDialogModule { }\r\n","\r\n

Please confirm

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

\r\n Warning!\r\n Changing this setting can cause major issues to all Workplace features using channels.\r\n

\r\n
    \r\n
  • \r\n Users can lose existing personalized settings from the settings page\r\n
  • \r\n
  • \r\n Users can stop receiving personalised content from Workplace and SharePoint\r\n
  • \r\n
\r\n

Some considerations before making the change:

\r\n
    \r\n
  • \r\n The purpose of this setting is mainly to allow running multiple instances of Workplace with separate channel configurations in the same environment. It is a good idea to change this for a test installation for example\r\n
  • \r\n
  • \r\n This setting should best be changed before users log on to the system and before creating any content tagged with channel\r\n
  • \r\n
  • \r\n Since channel selections are cached for 24 hours this change should preferably be done over the weekend if done in a live environment\r\n
  • \r\n
  • \r\n Do not change this setting without consulting with you supplier contact\r\n
  • \r\n
  • \r\n The channel column used in SharePoint must be updated to use the new term set, or the channel terms will not match\r\n
  • \r\n
\r\n

\r\n Note:\r\n Changing this setting after the application has already been used requires some additional changes and cleanup.\r\n

\r\n
    \r\n
  • \r\n News from SharePoint tagged with channels must be re-tagged with the new channel terms\r\n
  • \r\n
  • \r\n Content in the Workplace database must have their old channels removed or updated with the new channel term references\r\n
  • \r\n
\r\n
\r\n

Are you sure you want to perform this action?

\r\n
\r\n\r\n \r\n \r\n\r\n\r\n","import { Injectable } from '@angular/core';\r\nimport { NavigationEnd } from '@angular/router';\r\nimport { TrackingEvent } from '@app/models/tracking-event';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport abstract class BaseTrackingService {\r\n\r\n abstract trackRouterEvent(event: NavigationEnd): void;\r\n\r\n abstract trackEvent(event: TrackingEvent): void;\r\n\r\n abstract trackException(): void;\r\n}\r\n","import { CommonModule, DOCUMENT } from '@angular/common';\r\nimport { ChangeDetectorRef, Component, EventEmitter, Inject, Input, NgModule, OnChanges, OnInit, Output, ViewEncapsulation } from '@angular/core';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatCheckboxModule } from '@angular/material/checkbox';\r\nimport { LinkModule } from '@app/directives/link.directive';\r\n\r\n@Component({\r\n selector: 'app-gallery',\r\n templateUrl: './gallery.component.html',\r\n styleUrls: ['./gallery.component.scss'],\r\n encapsulation: ViewEncapsulation.None\r\n})\r\n\r\nexport class GalleryComponent implements OnInit, OnChanges {\r\n\r\n @Input() images: Array;\r\n @Input() isSelectable = false;\r\n @Input() maxAmountSelectable = 1;\r\n @Input() clearSelections = false;\r\n\r\n @Output() imageChange = new EventEmitter>();\r\n @Output() imageEnter = new EventEmitter();\r\n @Output() imageLeave = new EventEmitter();\r\n\r\n fetchedAmountOfImages: number;\r\n // MUST be x, where x * lowest Bootstrap breakpoint in HTML = 12\r\n // This is to make sure that the images are always shown in a uniform grid\r\n amountToDisplay = 4;\r\n amountToDisplayCurrently: number;\r\n amountToIncrement: number;\r\n\r\n currentImagesShowing: Array;\r\n currentlySelectedImages: Array;\r\n\r\n objectFitFallback = false;\r\n\r\n constructor(@Inject(DOCUMENT) private document: Document,\r\n private cdRef: ChangeDetectorRef) { }\r\n\r\n ngOnInit() {\r\n this.currentlySelectedImages = new Array();\r\n\r\n this.fetchedAmountOfImages = this.images.length;\r\n this.amountToDisplayCurrently = this.amountToDisplay;\r\n this.amountToIncrement = this.amountToDisplay;\r\n this.currentImagesShowing = this.images.slice(0, this.amountToDisplayCurrently);\r\n\r\n if ('objectFit' in this.document.documentElement.style === false) {\r\n this.objectFitFallback = true;\r\n }\r\n }\r\n\r\n isImageSelected(url: string): boolean {\r\n if (this.clearSelections) {\r\n return false;\r\n }\r\n return this.currentlySelectedImages.some(image => image === url);\r\n }\r\n\r\n hoverImage(url: string) {\r\n this.imageEnter.emit(url);\r\n }\r\n\r\n dehoverImage(url: string) {\r\n this.imageLeave.emit(url);\r\n }\r\n\r\n selectImage(url: string) {\r\n // If selections isn't enabled and we end up in here, always exit early\r\n if (!this.isSelectable) {\r\n return;\r\n }\r\n\r\n if (this.isImageSelected(url)) {\r\n this.currentlySelectedImages = this.currentlySelectedImages.filter(image => image !== url);\r\n } else if (this.currentlySelectedImages.length < this.maxAmountSelectable) {\r\n this.currentlySelectedImages.push(url);\r\n } else if (this.currentlySelectedImages.length >= this.maxAmountSelectable) {\r\n this.currentlySelectedImages.shift();\r\n this.currentlySelectedImages.push(url);\r\n }\r\n this.emitSelectedImages();\r\n this.cdRef.detectChanges();\r\n }\r\n\r\n emitSelectedImages() {\r\n const images = Array.from(this.currentlySelectedImages);\r\n this.imageChange.emit(images);\r\n }\r\n\r\n setFallBackStyle(imageItem: HTMLImageElement) {\r\n if (this.objectFitFallback) {\r\n imageItem.parentElement.style.backgroundImage = `url(${imageItem.src})`;\r\n imageItem.parentElement.style.backgroundSize = `cover`;\r\n imageItem.parentElement.style.backgroundPosition = `center`;\r\n return {\r\n 'display': `none`\r\n };\r\n }\r\n }\r\n\r\n showMoreImages() {\r\n this.amountToDisplayCurrently += this.amountToIncrement;\r\n this.currentImagesShowing = this.images.slice(0, this.amountToDisplayCurrently);\r\n }\r\n\r\n showLessImages() {\r\n this.amountToDisplayCurrently = this.amountToDisplay;\r\n this.currentImagesShowing = this.images.slice(0, this.amountToDisplayCurrently);\r\n }\r\n\r\n ngOnChanges() {\r\n if (this.clearSelections) {\r\n this.currentlySelectedImages = new Array();\r\n }\r\n }\r\n\r\n}\r\n@NgModule({\r\n declarations: [GalleryComponent],\r\n exports: [GalleryComponent],\r\n imports: [\r\n CommonModule,\r\n LinkModule,\r\n MatCheckboxModule,\r\n MatButtonModule\r\n ]\r\n})\r\nexport class GalleryModule { }\r\n","
\r\n\r\n
\r\n
\r\n
\r\n
\r\n
\r\n \r\n
\r\n \r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n\r\n
amountToDisplayCurrently\">\r\n
\r\n \r\n
\r\n
\r\n
amountToDisplay\">\r\n
\r\n \r\n
\r\n
\r\n\r\n
\r\n\r\n\r\n\r\n","import { HttpClient, HttpParams } from '@angular/common/http';\r\nimport { Inject, Injectable } from '@angular/core';\r\nimport { CUSTOMERENVIRONMENT } from '@app/common/app-tokens';\r\nimport { Constants } from '@app/common/constants';\r\nimport { HttpHelper } from '@app/common/http-helper';\r\nimport { BroadcastMessage } from '@app/models/broadcast-message';\r\nimport { AppTileService } from '@app/services/app-tile.service';\r\nimport { CacheService } from '@app/services/cache.service';\r\nimport { UserAppTileService } from '@app/services/user-app-tile.service';\r\nimport { Environment } from '@environments/interface.environment';\r\nimport { isAfter, isBefore } from 'date-fns';\r\nimport { BehaviorSubject, concat, Observable, of, Subject } from 'rxjs';\r\nimport { catchError, map, shareReplay, takeUntil, tap } from 'rxjs/operators';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class BroadcastService {\r\n\r\n constructor(@Inject(CUSTOMERENVIRONMENT) private environment: Environment,\r\n private http: HttpClient,\r\n private cache: CacheService,\r\n private httpHelper: HttpHelper,\r\n private appTileService: AppTileService,\r\n private userAppTileService: UserAppTileService) { }\r\n\r\n private readonly cacheKey = 'BroadcastService-getBroadcastMessages';\r\n public useCache = true;\r\n private reload$ = new Subject();\r\n public refresh$ = new BehaviorSubject(null);\r\n\r\n getActiveBroadcastMessages$: Observable>;\r\n getMyHiddenBroadcastMessages$: Observable;\r\n getAllBroadcastMessages$: Observable>;\r\n\r\n public reload() {\r\n this.getActiveBroadcastMessages$ = null;\r\n this.getAllBroadcastMessages$ = null;\r\n this.getMyHiddenBroadcastMessages$ = null;\r\n if (this.useCache) {\r\n this.cache.removeAllItemsInPersistentCacheWithGeneratedKeyPrefix(this.cacheKey);\r\n }\r\n this.reload$.next();\r\n this.refresh$.next(null);\r\n }\r\n\r\n getAllBroadcastMessages(): Observable> {\r\n if (this.getAllBroadcastMessages$) {\r\n return this.getAllBroadcastMessages$;\r\n } else {\r\n this.getAllBroadcastMessages$ = this.http.get>(`${Constants.API_ENDPOINT}/broadcastmessages/all`)\r\n .pipe(\r\n map(response => {\r\n console.log(`fetched result getAllBroadcastMessages: `, response);\r\n return response.map(p => new BroadcastMessage(p));\r\n }),\r\n tap(data => {\r\n this.useCache && this.cache.set(`${this.cacheKey}-all`, data);\r\n }),\r\n catchError(this.httpHelper.handleError({ operation: 'getAllBroadcastMessages', result: new Array(), cacheKey: `${this.cacheKey}-all` })),\r\n takeUntil(this.reload$),\r\n shareReplay({ bufferSize: 1, refCount: true }));\r\n\r\n if (this.useCache) {\r\n const cachedData = this.cache.get>(`${this.cacheKey}-all`);\r\n if (cachedData) {\r\n return concat(of(cachedData), this.getAllBroadcastMessages$);\r\n }\r\n }\r\n return this.getAllBroadcastMessages$;\r\n }\r\n }\r\n\r\n getActiveBroadcastMessages(): Observable> {\r\n if (this.getActiveBroadcastMessages$) {\r\n return this.getActiveBroadcastMessages$;\r\n } else {\r\n this.getActiveBroadcastMessages$ = this.http.get>(`${Constants.API_ENDPOINT}/broadcastmessages`, {\r\n\r\n })\r\n .pipe(\r\n map(response => {\r\n console.log(`fetched result getActiveBroadcastMessages: `, response);\r\n return response.map(p => new BroadcastMessage(p)).filter(b => (!b.EndDateAsDate || isAfter(b.EndDateAsDate, new Date())) && (!b.StartDateAsDate || isBefore(b.StartDateAsDate, new Date())));\r\n }),\r\n tap(data => {\r\n this.useCache && this.cache.set(this.cacheKey, data);\r\n }),\r\n catchError(this.httpHelper.handleError({ operation: 'getBroadcastMessages', result: new Array(), cacheKey: this.cacheKey })),\r\n takeUntil(this.reload$),\r\n shareReplay({ bufferSize: 1, refCount: true }));\r\n\r\n if (this.useCache) {\r\n const cachedData = this.cache.get>(this.cacheKey);\r\n if (cachedData) {\r\n return concat(of(cachedData), this.getActiveBroadcastMessages$);\r\n }\r\n }\r\n return this.getActiveBroadcastMessages$;\r\n }\r\n }\r\n\r\n getBroadcastMessage(id: number): Observable {\r\n return this.http.get(`${Constants.API_ENDPOINT}/broadcastmessages/${id}`)\r\n .pipe(\r\n map(response => {\r\n console.log(`fetched result getBroadcastMessage: `, response);\r\n return new BroadcastMessage(response);\r\n }));\r\n }\r\n\r\n getMyHiddenBroadcastMessages(): Observable> {\r\n if (this.getMyHiddenBroadcastMessages$) {\r\n return this.getMyHiddenBroadcastMessages$;\r\n } else {\r\n this.getMyHiddenBroadcastMessages$ = this.http.get>(`${Constants.API_ENDPOINT}/me/broadcastmessages/hidden`)\r\n .pipe(\r\n map(response => {\r\n console.log(`fetched result getMyHiddenBroadcastMessages: `, response);\r\n return response.map(p => new BroadcastMessage(p)).filter(b => (!b.EndDateAsDate || isAfter(b.EndDateAsDate, new Date())) && (!b.StartDateAsDate || isBefore(b.StartDateAsDate, new Date())));\r\n }),\r\n tap(data => {\r\n this.useCache && this.cache.set(`${this.cacheKey}-hidden`, data);\r\n }),\r\n catchError(this.httpHelper.handleError({ operation: 'getMyHiddenBroadcastMessages', result: new Array() })),\r\n takeUntil(this.reload$),\r\n shareReplay({ bufferSize: 1, refCount: true }));\r\n\r\n if (this.useCache) {\r\n const cachedData = this.cache.get>(`${this.cacheKey}-hidden`);\r\n if (cachedData) {\r\n return concat(of(cachedData), this.getMyHiddenBroadcastMessages$);\r\n }\r\n }\r\n return this.getMyHiddenBroadcastMessages$;\r\n }\r\n }\r\n\r\n hideBroadcastMessage(id: number): Observable {\r\n const updateOperation = this.http.put(`${Constants.API_ENDPOINT}/me/broadcastmessages/${id}/hide`, {})\r\n .pipe(\r\n map(response => {\r\n console.log(`updated result: `);\r\n console.log(response);\r\n this.reload();\r\n return response;\r\n }));\r\n\r\n return updateOperation;\r\n }\r\n\r\n updateBroadcastMessage(id: number, broadcast: BroadcastMessage): Observable {\r\n // We need to append the siteUrl because there will be an authorization check in the backend against the workplace admin group on this site\r\n const httpParams = new HttpParams().append('siteUrl', encodeURI(this.environment.coreWorkplaceSiteUrl));\r\n const fetchOperation = this.http.put(`${Constants.API_ENDPOINT}/broadcastmessages/${id}`, broadcast, {\r\n params: httpParams\r\n })\r\n .pipe(\r\n map(response => {\r\n // if the broad cast message is targeted to app then clear the app tile service cache key from local storage\r\n const result = broadcast as BroadcastMessage;\r\n if (result.AppTileBroadcastMessages.length > 0) {\r\n this.appTileService.reload();\r\n this.userAppTileService.reload();\r\n }\r\n console.log(`updated result: `);\r\n console.log(response);\r\n this.reload();\r\n return broadcast;\r\n }));\r\n\r\n return fetchOperation;\r\n }\r\n\r\n deleteBroadcastMessage(id: number): Observable {\r\n // We need to append the siteUrl because there will be an authorization check in the backend against the workplace admin group on this site\r\n const httpParams = new HttpParams().append('siteUrl', encodeURI(this.environment.coreWorkplaceSiteUrl));\r\n const fetchOperation = this.http.delete(`${Constants.API_ENDPOINT}/broadcastmessages/${id}`, {\r\n params: httpParams\r\n })\r\n .pipe(\r\n map(response => {\r\n const result = response as BroadcastMessage;\r\n if (result.AppTileBroadcastMessages.length > 0) {\r\n this.appTileService.reload();\r\n this.userAppTileService.reload();\r\n }\r\n console.log(`deleted result: `);\r\n console.log(response);\r\n this.reload();\r\n return response;\r\n }),\r\n catchError(this.httpHelper.handleError({ operation: 'deleteBroadcastMessage', result: new BroadcastMessage() })));\r\n\r\n return fetchOperation;\r\n }\r\n\r\n addBroadcastMessage(broadcast: BroadcastMessage): Observable {\r\n // We need to append the siteUrl because there will be an authorization check in the backend against the workplace admin group on this site\r\n const httpParams = new HttpParams().append('siteUrl', encodeURI(this.environment.coreWorkplaceSiteUrl));\r\n const fetchOperation = this.http.post(`${Constants.API_ENDPOINT}/broadcastmessages`, broadcast, {\r\n params: httpParams\r\n })\r\n .pipe(\r\n map(response => {\r\n // if the broad cast message is targeted to app then clear the app key from local storage\r\n const result = response as BroadcastMessage;\r\n if (result.AppTileBroadcastMessages.length > 0) {\r\n this.appTileService.reload();\r\n this.userAppTileService.reload();\r\n }\r\n console.log(`added result: `);\r\n console.log(response);\r\n this.reload();\r\n return new BroadcastMessage(response);\r\n }));\r\n\r\n return fetchOperation;\r\n }\r\n}\r\n","export class SearchPostQuery {\r\n public request: SearchPostQueryRequest;\r\n\r\n constructor(opt?: Partial) {\r\n Object.assign(this, opt);\r\n }\r\n}\r\n\r\nexport class SearchPostQueryRequest {\r\n Querytext: string;\r\n RowLimit?: number;\r\n EnableSorting?: boolean;\r\n TrimDuplicates?: boolean;\r\n SortList?: [{ [key: string]: any; }];\r\n SelectProperties?: Array;\r\n Properties?: any;\r\n\r\n constructor(opt?: Partial) {\r\n Object.assign(this, opt);\r\n }\r\n}\r\n","import { HttpErrorResponse, HttpEvent, HttpHandler, HttpInterceptor, HttpRequest } from '@angular/common/http';\r\nimport { Injectable } from '@angular/core';\r\nimport { AuthService } from '@app/services/auth.service';\r\nimport { LicenseService } from '@app/services/license.service';\r\nimport { AuthenticationResult } from '@azure/msal-browser';\r\nimport { Observable, throwError } from 'rxjs';\r\nimport { catchError, mergeMap } from 'rxjs/operators';\r\n\r\n@Injectable()\r\nexport class AuthInterceptor implements HttpInterceptor {\r\n\r\n constructor(private licenseService: LicenseService, private authService: AuthService) { }\r\n\r\n intercept(req: HttpRequest, next: HttpHandler): Observable> {\r\n\r\n const scopes = this.authService.getScopesForEndpoint(req.url);\r\n\r\n if (!scopes) {\r\n return next.handle(req); // The resource being requested is not in the MSAL endpoints and we should treat it as a normal request.\r\n }\r\n\r\n // if the user is not authenticated then drop the request\r\n if (!this.authService.accountInfo) {\r\n return throwError('Cannot send request to registered endpoint if the user is not authenticated.');\r\n }\r\n\r\n const attachToken$ = mergeMap((result: AuthenticationResult) => {\r\n const authReq = req.clone({\r\n headers: req.headers.set('Authorization', `Bearer ${result.accessToken}`)\r\n });\r\n // send cloned request with header to the next handler.\r\n return next.handle(authReq);\r\n });\r\n\r\n const acquireTokenWithFallback$ = this.authService.useRedirect ?\r\n this.authService.acquireTokenSilentWithFallBackToRedirect({ ...scopes, ...{ account: this.authService.accountInfo } }, scopes)\r\n :\r\n this.authService.acquireTokenSilentWithFallBackToPopup({ ...scopes, ...{ account: this.authService.accountInfo } }, scopes);\r\n\r\n const acquireTokenAndContinue$ = acquireTokenWithFallback$\r\n .pipe(\r\n attachToken$,\r\n catchError((err) => {\r\n if (err?.status === 401 || err?.name === 'ClientAuthError') {\r\n // We are unauthenticated, try again\r\n const acquireToken$ = this.authService.useRedirect ? this.authService.acquireTokenRedirect(scopes) : this.authService.acquireTokenPopup(scopes);\r\n return acquireToken$.pipe(attachToken$);\r\n }\r\n return throwError(err);\r\n }));\r\n\r\n if (req.url.indexOf('sharepoint.com') === -1) {\r\n return acquireTokenAndContinue$;\r\n } else {\r\n // Do license check for 365 when doing calls to sharepoint and return unlicensed error if no valid license.\r\n // We do this to catch WP Light users.\r\n // NOTE: DO NOT DO THIS CHECK FOR CALLS TO THE GRAPH API (ME-ENDPOINT) SINCE THAT COULD TRIGGER AN ENDLESS LOOP\r\n return this.licenseService.hasUserAny365License()\r\n .pipe(\r\n mergeMap(hasLicense => {\r\n if (hasLicense) {\r\n return acquireTokenAndContinue$;\r\n } else {\r\n // We return 402 Payment Required when we're not licensed to access a sharepoint api - https://tools.ietf.org/html/rfc7231#section-6.5.2\r\n return throwError(new HttpErrorResponse({ status: 402, statusText: 'Unlicensed', url: req.url }));\r\n }\r\n })\r\n );\r\n }\r\n }\r\n}\r\n","

An error has occurred

\r\n\r\n

It seems like the page has been idle too long, please refresh to continue.

\r\n
\r\n\r\n \r\n \r\n\r\n","import { CommonModule } from '@angular/common';\r\nimport { Component, Inject, NgModule } from '@angular/core';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatDialogModule } from '@angular/material/dialog';\r\nimport { WINDOW } from '@app/common/app-tokens';\r\nimport { LinkModule } from '@app/directives/link.directive';\r\nimport { FeatureSettingsStoreService } from '@app/services/feature-settings-store.service';\r\n\r\n@Component({\r\n selector: 'app-refresh-prompt-dialog',\r\n templateUrl: './refresh-prompt-dialog.component.html',\r\n styleUrls: ['./refresh-prompt-dialog.component.scss']\r\n})\r\nexport class RefreshPromptDialogComponent {\r\n\r\n showTitle = this.featureSettingsStoreService.state.showRefreshDialogTitle;\r\n\r\n constructor(@Inject(WINDOW) private window: Window, private featureSettingsStoreService: FeatureSettingsStoreService) { }\r\n\r\n refresh() {\r\n this.window.location.reload();\r\n }\r\n\r\n}\r\n@NgModule({\r\n declarations: [\r\n RefreshPromptDialogComponent\r\n ],\r\n entryComponents: [\r\n RefreshPromptDialogComponent\r\n ],\r\n imports: [\r\n CommonModule,\r\n MatDialogModule,\r\n MatButtonModule,\r\n LinkModule,\r\n ]\r\n})\r\nexport class RefreshPromptDialogModule { }\r\n","import { isPlatformBrowser } from '@angular/common';\r\nimport { Inject, Injectable, PLATFORM_ID } from '@angular/core';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class WindowService {\r\n private _window: Window;\r\n constructor(@Inject(PLATFORM_ID) platformId) {\r\n if (!isPlatformBrowser(platformId)) {\r\n this._window = {} as Window;\r\n } else {\r\n this._window = window;\r\n }\r\n }\r\n\r\n get nativeWindow(): any {\r\n return this._window;\r\n }\r\n}\r\n","import { NgModule } from '@angular/core';\r\nimport { WINDOW } from '@app/common/app-tokens';\r\nimport { WindowService } from '@app/services/window.service';\r\n\r\nexport function factoryFn(windowService: WindowService) {\r\n return windowService.nativeWindow;\r\n}\r\n\r\n@NgModule({\r\n providers: [\r\n WindowService,\r\n { provide: WINDOW, useFactory: factoryFn, deps: [WindowService] }\r\n ]\r\n})\r\nexport class WindowModule { }\r\n","import { DOCUMENT } from '@angular/common';\r\nimport { Inject, Injectable, RendererFactory2, Renderer2, Optional } from '@angular/core';\r\nimport { CUSTOMERENVIRONMENT, WINDOW } from '@app/common/app-tokens';\r\nimport { Utilities } from '@app/common/utilities';\r\nimport { AuthService } from '@app/services/auth.service';\r\nimport { FeatureSettingsService } from '@app/services/feature-settings.service';\r\nimport { UserService } from '@app/services/user.service';\r\nimport { BrowserAuthError, BrowserAuthErrorMessage, AuthenticationResult, RedirectRequest, PopupRequest } from '@azure/msal-browser';\r\nimport { Environment } from '@environments/interface.environment';\r\nimport { forkJoin, fromEvent, Observable, throwError, EMPTY } from 'rxjs';\r\nimport { catchError, first, map, tap, mergeMap, switchMap } from 'rxjs/operators';\r\nimport { GITVERSION } from '@environments/git-version';\r\nimport { CacheService } from '@app/services/cache.service';\r\nimport { MsteamsService } from '@app/services/msteams.service';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class AppInitService {\r\n private renderer: Renderer2;\r\n\r\n private readonly CacheKeyPopupsAreAllowed = 'popups-allowed';\r\n private readonly PopupsAreAllowed = true;\r\n\r\n constructor(\r\n @Inject(CUSTOMERENVIRONMENT) private environment: Environment,\r\n @Inject(WINDOW) private window: Window,\r\n @Inject(DOCUMENT) private document: Document,\r\n private authService: AuthService,\r\n private userService: UserService,\r\n private cacheService: CacheService,\r\n private featureSettingsService: FeatureSettingsService,\r\n private rendererFactory: RendererFactory2,\r\n @Optional() private msteamsService?: MsteamsService,\r\n ) {\r\n this.renderer = this.rendererFactory.createRenderer(null, null);\r\n this.PopupsAreAllowed = this.cacheService.getWithCustomKey(this.CacheKeyPopupsAreAllowed, true);\r\n }\r\n\r\n /**\r\n * This should only be called from the main workplace app module to hook into\r\n * the init process and hold off or continue the bootstrap depending on authentication status.\r\n * */\r\n public init(): Promise {\r\n return new Promise((resolve, reject) => {\r\n let initObservable$: Observable;\r\n\r\n if (Utilities.inTeamsAuthPopupRedirect(this.window)) {\r\n console.log('MS Teams handling when we have opened the authenticate popup using MS Teams API');\r\n // MS Teams handling when we have opened the authenticate popup using MS Teams API\r\n initObservable$ = this.authService.handleRedirect()\r\n .pipe(\r\n switchMap(authenticatedResult => {\r\n if (authenticatedResult) {\r\n if (this.msteamsService) {\r\n return this.msteamsService.initMsTeams()\r\n .pipe(\r\n tap(() => {\r\n this.msteamsService.notifyAuthSuccess(JSON.stringify(authenticatedResult));\r\n reject('Window will be closed by MS Teams API');\r\n }));\r\n }\r\n }\r\n return EMPTY;\r\n }));\r\n resolve(initObservable$.toPromise());\r\n } else {\r\n // MS Teams handling - Try SSO Silent first. If we dont succeed we go ahead and open a popup for our custom 'msteams-auth' route using the MS Teams API\r\n if (Utilities.isInTeamsApp(this.window) && this.msteamsService) {\r\n\r\n initObservable$ = this.msteamsService.initMsTeams()\r\n .pipe(\r\n mergeMap(() => {\r\n\r\n return this.authService.ssoSilent(this.authService.loginRequest);\r\n }),\r\n mergeMap((authenticatedResult) => {\r\n\r\n this.authService.accountInfo = authenticatedResult.account;\r\n return this.initUserAndFeatures();\r\n }),\r\n catchError((err) => {\r\n\r\n if (err?.errorCode === BrowserAuthErrorMessage.silentSSOInsufficientInfoError.code) {\r\n\r\n const teamsObs$ = this.msteamsService.authenticate()\r\n .pipe(\r\n mergeMap((authenticatedResult: string) => {\r\n\r\n const result = JSON.parse(authenticatedResult) as AuthenticationResult;\r\n this.authService.accountInfo = result.account;\r\n return this.initUserAndFeatures();\r\n }),\r\n catchError((error) => {\r\n if (this.authService.accountInfo) {\r\n return this.initUserAndFeatures();\r\n }\r\n }));\r\n\r\n return this.createSignInButtonAndListenOnClick(teamsObs$, false);\r\n } else if (err.errorCode === 'login_required') {\r\n if (this.authService.accountInfo) {\r\n return this.initUserAndFeatures();\r\n }\r\n } else {\r\n\r\n return throwError(err);\r\n }\r\n }));\r\n } else {\r\n\r\n initObservable$ = this.login(reject);\r\n }\r\n\r\n resolve(initObservable$.toPromise());\r\n }\r\n });\r\n }\r\n\r\n private login(reject: (reason?: any) => void) {\r\n\r\n return this.authService.handleRedirect()\r\n .pipe(\r\n switchMap((authenticatedResult) => {\r\n\r\n // The handleredirect will always initialize since we use redirect flow as a fallback.\r\n // If result is null we're are not authenticated and will need to start a login flow\r\n // If we have a result we're coming back from an authentication process (using redirect) and we can continue initializing the user and featuresettings.\r\n if (authenticatedResult) {\r\n\r\n this.authService.useRedirect = true;\r\n return this.initUserAndFeatures();\r\n } else {\r\n if ((this.environment.featureSettings.coreIntranetEnabled && Utilities.isInIframe(this.window)) || Utilities.isInIframe(this.window)) {\r\n // This flow is used by Core Intranet or when Iframed - in the Core intra case WP is always iframed inside SharePoint so we dont care about redirect-flow.\r\n return this.authService.ssoSilent(this.authService.loginRequest)\r\n .pipe(\r\n mergeMap((authResult) => {\r\n this.authService.accountInfo = authResult.account;\r\n return this.initUserAndFeatures();\r\n }),\r\n catchError((err) => {\r\n if (err?.errorCode === BrowserAuthErrorMessage.silentSSOInsufficientInfoError.code) {\r\n return this.loginPopup();\r\n } else {\r\n return throwError(err);\r\n }\r\n }),\r\n catchError((err) => {\r\n if (err instanceof BrowserAuthError) {\r\n // Fallback to create a sign in button if popups are blocked\r\n if (err.errorCode === BrowserAuthErrorMessage.popUpWindowError.code) {\r\n this.cacheService.setWithCustomKey(this.CacheKeyPopupsAreAllowed, false);\r\n return this.createSignInButtonAndListenOnClick();\r\n }\r\n }\r\n return throwError(err);\r\n }));\r\n } else {\r\n if (this.authService.useRedirect || !this.PopupsAreAllowed) {\r\n return this.loginRedirect(reject);\r\n } else {\r\n // Setup the default login flow with fallback to redirect\r\n const loginPopupWithFallBackToRedirect$ = this.loginPopup()\r\n .pipe(\r\n catchError((err) => {\r\n if (err instanceof BrowserAuthError) {\r\n // Fallback to redirect if popup fails due to blocking setting in browser\r\n if (err.errorCode === BrowserAuthErrorMessage.popUpWindowError.code) {\r\n this.cacheService.setWithCustomKey(this.CacheKeyPopupsAreAllowed, false);\r\n return this.loginRedirect(reject);\r\n }\r\n }\r\n return throwError(err);\r\n })\r\n );\r\n\r\n return loginPopupWithFallBackToRedirect$;\r\n }\r\n }\r\n }\r\n }),\r\n catchError((err) => {\r\n if (err instanceof BrowserAuthError) {\r\n if (err.errorCode === BrowserAuthErrorMessage.interactionInProgress.code) {\r\n reject('Do not continue with app initialization - Interaction in progress');\r\n }\r\n }\r\n return throwError(err);\r\n })\r\n );\r\n }\r\n\r\n private loginPopup(): Observable {\r\n return this.authService.loginPopup((this.authService.loginRequest as PopupRequest))\r\n .pipe(\r\n mergeMap(() => {\r\n return this.initUserAndFeatures();\r\n }));\r\n }\r\n\r\n private loginRedirect(reject: (reason?: any) => void): Observable {\r\n return this.authService.loginRedirect((this.authService.loginRequest as RedirectRequest))\r\n .pipe(\r\n tap(() => {\r\n reject('Do not continue with app initialization - Login redirect will start now');\r\n }),\r\n catchError((err) => {\r\n if (err instanceof BrowserAuthError) {\r\n // Create sign-in button if redirect happens in iframe - We will HAVE to use popup flow and the user needs to click the button manually.\r\n if (err.errorCode === BrowserAuthErrorMessage.redirectInIframeError.code) {\r\n\r\n return this.createSignInButtonAndListenOnClick();\r\n }\r\n if (err.errorCode === BrowserAuthErrorMessage.interactionInProgress.code) {\r\n reject('Do not continue with app initialization - Interaction in progress');\r\n }\r\n }\r\n return throwError(err);\r\n }));\r\n }\r\n\r\n private createSignInButtonAndListenOnClick(onClickAction?: Observable, addPopupNotice = true): Observable {\r\n\r\n const div = this.renderer.createElement('div');\r\n const button = this.renderer.createElement('button');\r\n const paragraph = this.renderer.createElement('p');\r\n const img = this.renderer.createElement('img');\r\n\r\n this.renderer.addClass(div, 'absolute-center-position');\r\n\r\n ['btn', 'btn-primary', 'btn-lg', 'd-block', 'mx-auto'].forEach(cssClass => {\r\n this.renderer.addClass(button, cssClass);\r\n });\r\n\r\n ['text-center', 'mt-3'].forEach(cssClass => {\r\n this.renderer.addClass(paragraph, cssClass);\r\n });\r\n\r\n ['d-block', 'mx-auto', 'img-thumbnail', 'w-50'].forEach(cssClass => {\r\n this.renderer.addClass(img, cssClass);\r\n });\r\n\r\n this.renderer.setAttribute(img, 'src', `assets/popup_block.png?v=${GITVERSION.hash}`);\r\n\r\n const paragraphText = this.renderer.createText($localize`:@@allow-popups:You can skip this step by allowing popups for this site in your browser (see below).`);\r\n const buttonText = this.renderer.createText($localize`:@@click-to-sign-in:Click to Sign in`);\r\n\r\n this.renderer.appendChild(paragraph, paragraphText);\r\n this.renderer.appendChild(button, buttonText);\r\n this.renderer.appendChild(div, button);\r\n if (addPopupNotice) {\r\n this.renderer.appendChild(div, paragraph);\r\n this.renderer.appendChild(div, img);\r\n }\r\n\r\n this.renderer.appendChild(this.document.body, div);\r\n\r\n return fromEvent(button, 'click')\r\n .pipe(\r\n first(), // only listen to the frist click otherwise this observable chain will never complete and the init process will halt.\r\n tap(() => {\r\n button.remove();\r\n paragraph.remove();\r\n img.remove();\r\n div.remove();\r\n }),\r\n mergeMap(() => {\r\n if (onClickAction) {\r\n return onClickAction;\r\n } else {\r\n return this.loginPopup();\r\n }\r\n })\r\n );\r\n }\r\n\r\n private initUserAndFeatures(): Observable {\r\n return forkJoin([\r\n this.userService.getOrCreateMe(),\r\n this.featureSettingsService.getFeatureSettings()\r\n ])\r\n .pipe(map(() => {\r\n // We have to return void here so no actual result.\r\n }));\r\n }\r\n}\r\n","\r\n \r\n\r\n","import { CommonModule } from '@angular/common';\r\nimport { Component, ElementRef, Input, NgModule, OnDestroy, OnInit, ViewEncapsulation } from '@angular/core';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatExpansionModule } from '@angular/material/expansion';\r\nimport { RouterModule } from '@angular/router';\r\nimport { applyLanguageFilteringSingle } from '@app/common/filtering-behavior';\r\nimport { FeatureToggleModule } from '@app/directives/feature-toggle.directive';\r\nimport { BroadcastMessage } from '@app/models/broadcast-message';\r\nimport { SimplifiedTerm } from '@app/models/simplified-term';\r\nimport { UserChannelTerm } from '@app/models/user-channel-term';\r\nimport { LinkModule } from '@app/directives/link.directive';\r\nimport { BroadcastService } from '@app/services/broadcast.service';\r\nimport { ChannelService } from '@app/services/channel.service';\r\nimport { ComponentStatesOnRoutesService } from '@app/services/component-states-on-routes.service';\r\nimport { FeatureSettingsStoreService } from '@app/services/feature-settings-store.service';\r\nimport { UserChannelTermsService } from '@app/services/user-channel-terms.service';\r\nimport { UserLanguageTermService } from '@app/services/user-language-term.service';\r\nimport { forkJoin, iif, Observable, of, Subscription } from 'rxjs';\r\nimport { filter, map, mergeMap } from 'rxjs/operators';\r\nimport { BroadcastBannerListComponentModule } from '../broadcast-banner-list/broadcast-banner-list.component';\r\n\r\n@Component({\r\n selector: 'app-broadcasts',\r\n templateUrl: './broadcasts.component.html',\r\n styleUrls: ['./broadcasts.component.scss'],\r\n encapsulation: ViewEncapsulation.None\r\n})\r\nexport class BroadcastsComponent implements OnInit, OnDestroy {\r\n\r\n @Input() broadcastMessages$: Observable>;\r\n subscription: Subscription;\r\n channels$: Observable>;\r\n userChannelTerms$: Observable>;\r\n @Input() showHideButton = true;\r\n\r\n constructor(\r\n private service: BroadcastService,\r\n private componentEventService: ComponentStatesOnRoutesService,\r\n public elementRef: ElementRef,\r\n private featureSettingsStoreService: FeatureSettingsStoreService,\r\n private channelService: ChannelService,\r\n private userChannelTermsService: UserChannelTermsService,\r\n private userLanguageTermService: UserLanguageTermService) {\r\n }\r\n\r\n ngOnInit() {\r\n this.channels$ = this.channelService.getChannels();\r\n this.userChannelTerms$ = this.userChannelTermsService.getUserChannelTerms();\r\n\r\n if (!this.broadcastMessages$) {\r\n const broadcastMessages$ = this.service.refresh$\r\n .pipe(\r\n mergeMap(() => {\r\n return forkJoin([\r\n this.service.getActiveBroadcastMessages(),\r\n this.service.getMyHiddenBroadcastMessages(),\r\n this.userChannelTerms$\r\n ]);\r\n }),\r\n map(([broadcasts, hiddenBroadcasts, userChannelTerms]) => {\r\n // exclude the app boradcast messages.\r\n const siteBroadcasts = broadcasts.filter(b => b.AppTileBroadcastMessages.length === 0);\r\n return siteBroadcasts.filter(b => {\r\n const channelTerms = b.ChannelTermBroadcastMessages;\r\n let match = false;\r\n if (channelTerms && channelTerms.length > 0) {\r\n match = channelTerms.some(c => userChannelTerms.some(ct => ct.ChannelTermId === c.ChannelTermId));\r\n } else {\r\n match = true;\r\n }\r\n if (match) {\r\n if (hiddenBroadcasts.some(h => h.Id === b.Id)) {\r\n return false;\r\n } else {\r\n return true;\r\n }\r\n } else {\r\n return false;\r\n }\r\n });\r\n }));\r\n\r\n this.broadcastMessages$ = broadcastMessages$\r\n .pipe(\r\n mergeMap((broadcasts) => {\r\n // Language filter toggle\r\n return iif(\r\n () => this.featureSettingsStoreService.state.enableLanguageFilteringForWorkplace,\r\n this.userLanguageTermService.getUserLanguageTerms().pipe(\r\n map((userLanguageTerms) => {\r\n return applyLanguageFilteringSingle(broadcasts, userLanguageTerms, this.featureSettingsStoreService.state.enableShowNonLanguageContentForAllUsers, this.featureSettingsStoreService.state.defaultLanguageTermId);\r\n })\r\n ),\r\n of(broadcasts)\r\n );\r\n }));\r\n }\r\n\r\n this.subscription = this.componentEventService\r\n .state$\r\n .pipe(\r\n filter(componentsOnRouteState => {\r\n return componentsOnRouteState.MainMap.some(s => s.ComponentId === this.elementRef.nativeElement.localName && s.Refresh);\r\n }))\r\n .subscribe(componentsOnRouteState => {\r\n if (componentsOnRouteState) {\r\n this.service.reload();\r\n const componentState = componentsOnRouteState.MainMap.find(s => s.ComponentId === this.elementRef.nativeElement.localName && s.Refresh);\r\n componentState.Refresh = false;\r\n this.componentEventService.updateStates(componentState);\r\n }\r\n });\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.subscription && this.subscription.unsubscribe();\r\n }\r\n\r\n}\r\n@NgModule({\r\n declarations: [BroadcastsComponent],\r\n exports: [BroadcastsComponent],\r\n imports: [\r\n CommonModule,\r\n RouterModule,\r\n MatExpansionModule,\r\n MatButtonModule,\r\n FeatureToggleModule,\r\n LinkModule,\r\n BroadcastBannerListComponentModule\r\n ]\r\n})\r\nexport class BroadcastsModule { }\r\n","import { CommonModule } from '@angular/common';\r\nimport { Component, Inject, NgModule, OnInit, ViewEncapsulation } from '@angular/core';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatDialogModule, MatDialogRef } from '@angular/material/dialog';\r\nimport { Router } from '@angular/router';\r\nimport { WINDOW } from '@app/common/app-tokens';\r\nimport { LinkModule } from '@app/directives/link.directive';\r\nimport { FirstDayHeroModule } from '@app/views/first-day-wizard/first-day-hero/first-day-hero.component';\r\n\r\n@Component({\r\n selector: 'app-first-day-dialog',\r\n templateUrl: './first-day-dialog.component.html',\r\n styleUrls: ['./first-day-dialog.component.scss'],\r\n encapsulation: ViewEncapsulation.None\r\n})\r\nexport class FirstDayDialogComponent implements OnInit {\r\n\r\n constructor(private dialogRef: MatDialogRef, private router: Router, @Inject(WINDOW) private window: Window) {\r\n }\r\n\r\n onBtnClick() {\r\n this.router.navigate(['/first-day'])\r\n .then(() => {\r\n this.dialogRef.close();\r\n });\r\n }\r\n\r\n ngOnInit() {\r\n if (this.router.url.indexOf('first-day') >= 0) {\r\n this.window.setTimeout(() => {\r\n this.dialogRef.close();\r\n }, 0);\r\n }\r\n }\r\n\r\n}\r\n@NgModule({\r\n declarations: [FirstDayDialogComponent],\r\n entryComponents: [FirstDayDialogComponent],\r\n imports: [\r\n CommonModule,\r\n MatDialogModule,\r\n MatButtonModule,\r\n FirstDayHeroModule,\r\n LinkModule,\r\n ]\r\n})\r\nexport class FirstDayDialogModule { }\r\n","\r\n

Hi! It looks like this is your first time here!

\r\n \r\n
\r\n","export namespace FooterTemplate {\r\n export const HTML =\r\n `
\r\n
\r\n
\r\n
\r\n
Lorem ipsum
\r\n

Dolor sit amet

\r\n

Aliquam erat volutpat

\r\n

Suspendisse id purus

\r\n

Tempor mi et

\r\n

Donec tincidunt eros

\r\n

Ac egestas ornare

\r\n

Mauris vitae purus

\r\n

Duis turpis ipsum

\r\n

Tempor mi et

\r\n
\r\n
Curabitur dignissim
\r\n

Dolor sit amet

Aliquam erat volutpat

\r\n

Suspendisse id purus

\r\n

Tempor mi et

Donec tincidunt eros

Ac egestas ornare

Mauris vitae purus

\r\n

Duis turpis ipsum

Donec tincidunt eros

\r\n
\r\n
\r\n
Morbi tincidunt
\r\n

Dolor sit amet

Aliquam erat volutpat

Suspendisse id purus

\r\n

Tempor mi et

Donec tincidunt eros

Ac egestas ornare

\r\n

Mauris vitae purus

\r\n

Duis turpis ipsum

\r\n

Ac egestas ornare

\r\n
\r\n
\r\n
\r\n
`;\r\n}\r\n","import { HttpClient } from '@angular/common/http';\r\nimport { Injectable } from '@angular/core';\r\nimport { Constants } from '@app/common/constants';\r\nimport { HttpHelper } from '@app/common/http-helper';\r\nimport { CacheService } from '@app/services/cache.service';\r\nimport { endOfDay } from 'date-fns';\r\nimport { concat, Observable, of } from 'rxjs';\r\nimport { catchError, tap } from 'rxjs/operators';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class AppSettingsService {\r\n\r\n constructor(\r\n private http: HttpClient,\r\n private httpHelper: HttpHelper,\r\n private cache: CacheService) { }\r\n\r\n private readonly cacheKeyPrefix = 'AppSettingsService';\r\n public useCache = true;\r\n\r\n private getDefaultRequestCulture$: Observable;\r\n\r\n getDefaultRequestCulture(): Observable {\r\n const cacheKey = `${this.cacheKeyPrefix}-getDefaultRequestCulture`;\r\n if (this.getDefaultRequestCulture$) {\r\n return this.getDefaultRequestCulture$;\r\n } else {\r\n this.getDefaultRequestCulture$ = this.http.get(`${Constants.API_ENDPOINT}/appsettings/defaultrequestculture`, { responseType: 'text' })\r\n .pipe(\r\n tap(data => {\r\n // Since this is quite static data we can allow this to be cached and returned again to the user for the duration of the day.\r\n this.useCache && this.cache.set(cacheKey, data, endOfDay(new Date()));\r\n }),\r\n catchError(this.httpHelper.handleError({ operation: 'getDefaultRequestCulture', result: null, cacheKey: cacheKey })));\r\n\r\n if (this.useCache) {\r\n const cachedData = this.cache.get(cacheKey);\r\n if (cachedData) {\r\n return concat(of(cachedData), this.getDefaultRequestCulture$);\r\n }\r\n }\r\n return this.getDefaultRequestCulture$;\r\n }\r\n }\r\n}\r\n","\r\n
\r\n
\r\n \r\n
\r\n\r\n
\r\n
\r\n \r\n
\r\n \r\n \r\n \r\n
\r\n
\r\n\r\n
\r\n Danish\r\n English\r\n Finnish\r\n Norwegian\r\n Swedish\r\n and\r\n default\r\n
\r\n\r\n
0\">\r\n Footer available in\r\n {{ getAvailableLanguages([danish, english, finnish, norwegian, swedish], and, default) }}\r\n
\r\n
\r\n","import { CommonModule } from '@angular/common';\r\nimport { Component, Inject, LOCALE_ID, NgModule, OnDestroy, OnInit, ViewEncapsulation } from '@angular/core';\r\nimport { FormControl, FormGroup, ReactiveFormsModule } from '@angular/forms';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatDialog } from '@angular/material/dialog';\r\nimport { FooterTemplate } from '@app/common/footer-template';\r\nimport { Roles } from '@app/common/roles';\r\nimport { HtmlEditorModule } from '@app/components/html-editor/html-editor.component';\r\nimport { SiteElement, SiteElementType } from '@app/models/site-element';\r\nimport { LinkModule } from '@app/directives/link.directive';\r\nimport { SafeModule } from '@app/pipes/safe.pipe';\r\nimport { AppSettingsService } from '@app/services/appsettings.service';\r\nimport { SecurityService } from '@app/services/security.service';\r\nimport { SiteElementsService } from '@app/services/site-elements.service';\r\nimport { forkJoin, Observable, of, Subject, Subscription } from 'rxjs';\r\nimport { concatMap, map, mergeMap, startWith } from 'rxjs/operators';\r\nimport { ConfirmDialogComponent, ConfirmDialogModule } from '../confirm-dialog/confirm-dialog.component';\r\n\r\n@Component({\r\n selector: 'app-footer',\r\n templateUrl: './footer.component.html',\r\n styleUrls: ['./footer.component.scss'],\r\n encapsulation: ViewEncapsulation.None\r\n})\r\nexport class FooterComponent implements OnInit, OnDestroy {\r\n siteElement$: Observable;\r\n footerElementSubject$: Subject = new Subject();\r\n hasUserPermissionToEdit$: Observable;\r\n existingSiteElement: SiteElement;\r\n editMode = false;\r\n isNew = false;\r\n subscription = new Subscription();\r\n footerEditorForm = new FormGroup({\r\n FooterContent: new FormControl(FooterTemplate.HTML),\r\n });\r\n availableLanguages: Array = new Array();\r\n defaultRequestCultureLanguage: string;\r\n\r\n constructor(@Inject(LOCALE_ID) private locale: string,\r\n public dialog: MatDialog,\r\n private siteElementsService: SiteElementsService,\r\n private securityService: SecurityService,\r\n private appSettingsService: AppSettingsService) { }\r\n\r\n ngOnInit() {\r\n this.siteElement$ = this.footerElementSubject$\r\n .pipe(\r\n startWith(true),\r\n mergeMap(() => {\r\n return forkJoin([\r\n this.siteElementsService.getSiteElements(SiteElementType.FOOTER),\r\n this.appSettingsService.getDefaultRequestCulture()\r\n ]);\r\n }),\r\n map(([siteElements, defaultRequestCulture]) => {\r\n this.defaultRequestCultureLanguage = defaultRequestCulture?.substr(0, 2);\r\n if (siteElements) {\r\n this.availableLanguages = siteElements.filter(s => s.Language).map(s => s.Language);\r\n\r\n // Sort the fetched site elements by priority\r\n const sortedSiteElements = siteElements.sort((a, b) => {\r\n\r\n // return -1 to sort a before b, return 1 to sort b before a\r\n\r\n if (a.Language === this.locale) {\r\n return -1;\r\n }\r\n if (b.Language === this.locale) {\r\n return 1;\r\n }\r\n\r\n if (a.Language === this.defaultRequestCultureLanguage) {\r\n return -1;\r\n }\r\n if (b.Language === this.defaultRequestCultureLanguage) {\r\n return 1;\r\n }\r\n\r\n // legacy footer (put last)\r\n if (a.Language === null) {\r\n return 1;\r\n }\r\n if (b.Language === null) {\r\n return -1;\r\n }\r\n\r\n return 1;\r\n });\r\n\r\n const siteElement = sortedSiteElements[0];\r\n if (siteElement) {\r\n this.footerEditorForm.setValue({ FooterContent: siteElement.Content });\r\n this.existingSiteElement = siteElement;\r\n\r\n if (siteElement.Language !== this.locale) {\r\n // If the selected footer doesn't match the current language, it means a footer for the current\r\n // language doesn't exist (it could, for example, be the fallback footer); force creation of new footer\r\n this.isNew = true;\r\n } else {\r\n this.isNew = false;\r\n }\r\n\r\n return siteElement;\r\n } else {\r\n this.isNew = true;\r\n return new SiteElement({ Content: FooterTemplate.HTML });\r\n }\r\n } else {\r\n this.isNew = true;\r\n return new SiteElement({ Content: FooterTemplate.HTML });\r\n }\r\n }));\r\n\r\n this.hasUserPermissionToEdit$ = this.securityService.hasUserAnyAppRole([Roles.Admin, Roles.FooterEditor]);\r\n }\r\n\r\n editFooter() {\r\n this.editMode = true;\r\n }\r\n\r\n cancel() {\r\n this.editMode = false;\r\n }\r\n\r\n getTemplate() {\r\n this.footerEditorForm.setValue({ FooterContent: FooterTemplate.HTML });\r\n }\r\n\r\n getAvailableLanguages(languagesVar: Array, andVar: HTMLInputElement, defaultVar: HTMLInputElement) {\r\n const languages: any[] = languagesVar.map(l => ({ language: l.innerText, tag: l.className })).filter(l => this.availableLanguages.some(cl => cl === l.tag));\r\n\r\n const sortedLanguages = languages.sort((a, b) => {\r\n if (this.defaultRequestCultureLanguage && a.tag === this.defaultRequestCultureLanguage) {\r\n return -1;\r\n } else {\r\n return a.language.localeCompare(b.language);\r\n }\r\n });\r\n\r\n let availableLanguagesOutput = '';\r\n for (let i = 0; i < sortedLanguages.length; i++) {\r\n const currentLanguage = (sortedLanguages[i].tag === this.defaultRequestCultureLanguage ? `${sortedLanguages[i].language} (${defaultVar.innerText})` : sortedLanguages[i].language);\r\n if (sortedLanguages.length === 1) {\r\n // Special case: only one language\r\n availableLanguagesOutput += `${currentLanguage}.`;\r\n } else if (i < sortedLanguages.length - 2) {\r\n // At least two more elements after this one\r\n availableLanguagesOutput += `${currentLanguage}, `;\r\n } else if (i < sortedLanguages.length - 1) {\r\n // One more element after this one\r\n availableLanguagesOutput += `${currentLanguage} `;\r\n } else {\r\n // Last element\r\n availableLanguagesOutput += `${andVar.innerText} ${currentLanguage}.`;\r\n }\r\n }\r\n return availableLanguagesOutput;\r\n }\r\n\r\n save() {\r\n const siteElementToAddOrUpdate = new SiteElement();\r\n siteElementToAddOrUpdate.Content = this.footerEditorForm.get('FooterContent').value;\r\n siteElementToAddOrUpdate.Language = this.locale;\r\n siteElementToAddOrUpdate.Type = SiteElementType.FOOTER;\r\n if (this.isNew) {\r\n // add a new footer setting\r\n this.subscription.add(\r\n this.siteElementsService.addSiteElement(siteElementToAddOrUpdate)\r\n .subscribe(() => {\r\n this.editMode = false;\r\n this.footerElementSubject$.next(true);\r\n }));\r\n } else {\r\n // open dialog\r\n const dialogRef = this.dialog.open(ConfirmDialogComponent);\r\n siteElementToAddOrUpdate.Id = this.existingSiteElement.Id;\r\n // wait for user to confirm before saving changes\r\n this.subscription.add(\r\n dialogRef.afterClosed()\r\n .pipe(concatMap(result => {\r\n if (result) {\r\n // update existing footer setting\r\n return this.siteElementsService.updateSiteElements(siteElementToAddOrUpdate);\r\n } else {\r\n return of(null);\r\n }\r\n }))\r\n .subscribe(() => {\r\n this.editMode = false;\r\n this.footerElementSubject$.next(true);\r\n }));\r\n }\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.subscription && this.subscription.unsubscribe();\r\n }\r\n}\r\n@NgModule({\r\n declarations: [FooterComponent],\r\n exports: [FooterComponent],\r\n imports: [\r\n CommonModule,\r\n ReactiveFormsModule,\r\n HtmlEditorModule,\r\n MatButtonModule,\r\n ConfirmDialogModule,\r\n LinkModule,\r\n SafeModule,\r\n ]\r\n})\r\nexport class FooterModule { }\r\n","\r\n \r\n\r\n\r\n\r\n \r\n
\r\n \r\n
\r\n
\r\n
\r\n","import { CommonModule } from '@angular/common';\r\nimport { Component, NgModule, OnInit, ViewChild, ViewEncapsulation } from '@angular/core';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatMenuModule, MatMenuTrigger } from '@angular/material/menu';\r\nimport { applyLanguageFilteringSingle } from '@app/common/filtering-behavior';\r\nimport { BroadcastsModule } from '@app/components/broadcasts/broadcasts/broadcasts.component';\r\nimport { BroadcastMessage } from '@app/models/broadcast-message';\r\nimport { LinkModule } from '@app/directives/link.directive';\r\nimport { BroadcastService } from '@app/services/broadcast.service';\r\nimport { FeatureSettingsStoreService } from '@app/services/feature-settings-store.service';\r\nimport { UserLanguageTermService } from '@app/services/user-language-term.service';\r\nimport { iif, Observable, of } from 'rxjs';\r\nimport { map, mergeMap } from 'rxjs/operators';\r\n\r\n@Component({\r\n selector: 'app-topnav-broadcasts',\r\n templateUrl: './topnav-broadcasts.component.html',\r\n styleUrls: ['./topnav-broadcasts.component.scss'],\r\n encapsulation: ViewEncapsulation.None\r\n})\r\nexport class TopnavBroadcastsComponent implements OnInit {\r\n\r\n broadcastMessages$: Observable>;\r\n @ViewChild(MatMenuTrigger) trigger: MatMenuTrigger;\r\n constructor(\r\n private broadcastService: BroadcastService,\r\n private userLanguageTermService: UserLanguageTermService,\r\n private featureSettingsStoreService: FeatureSettingsStoreService) { }\r\n\r\n ngOnInit() {\r\n const broadcastMessages$ =\r\n this.broadcastService\r\n .refresh$\r\n .pipe(\r\n mergeMap(() => this.broadcastService.getMyHiddenBroadcastMessages())\r\n );\r\n\r\n this.broadcastMessages$ = broadcastMessages$\r\n .pipe(\r\n mergeMap((broadcasts) => {\r\n // Language filter toggle\r\n return iif(\r\n () => this.featureSettingsStoreService.state.enableLanguageFilteringForWorkplace,\r\n this.userLanguageTermService.getUserLanguageTerms().pipe(\r\n map((userLanguageTerms) => {\r\n return applyLanguageFilteringSingle(broadcasts, userLanguageTerms, this.featureSettingsStoreService.state.enableShowNonLanguageContentForAllUsers, this.featureSettingsStoreService.state.defaultLanguageTermId);\r\n })\r\n ),\r\n of(broadcasts)\r\n );\r\n }));\r\n }\r\n\r\n closeMenu() {\r\n this.trigger.closeMenu();\r\n }\r\n}\r\n@NgModule({\r\n declarations: [TopnavBroadcastsComponent],\r\n exports: [TopnavBroadcastsComponent],\r\n imports: [\r\n CommonModule,\r\n MatMenuModule,\r\n BroadcastsModule,\r\n MatButtonModule,\r\n LinkModule,\r\n ]\r\n})\r\nexport class TopnavBroadcastsModule { }\r\n","import { Component, Inject, LOCALE_ID, NgModule, OnInit } from '@angular/core';\r\nimport { CUSTOMERENVIRONMENT } from '@app/common/app-tokens';\r\nimport { Environment } from '@environments/interface.environment';\r\nimport { GITVERSION } from '@environments/git-version';\r\n\r\n@Component({\r\n selector: 'app-logo',\r\n templateUrl: './logo.component.html',\r\n styleUrls: ['./logo.component.scss']\r\n})\r\nexport class LogoComponent implements OnInit {\r\n\r\n logo = this.environment.production ? `/${this.localeId.substr(0, 2)}/assets/logo.svg?v=${GITVERSION.hash}` : `assets/logo.svg?v=${GITVERSION.hash}`;\r\n\r\n workPlaceName = this.environment.featureSettings.workplaceName;\r\n\r\n constructor(@Inject(CUSTOMERENVIRONMENT) private environment: Environment, @Inject(LOCALE_ID) public localeId: string) {\r\n }\r\n\r\n ngOnInit() {\r\n }\r\n\r\n}\r\n@NgModule({\r\n declarations: [LogoComponent],\r\n exports: [LogoComponent],\r\n})\r\nexport class LogoModule { }\r\n","\r\n\"{{workPlaceName}}\r\n","import { CommonModule } from '@angular/common';\r\nimport { Component, Input, NgModule, OnInit, ViewEncapsulation } from '@angular/core';\r\n\r\n@Component({\r\n selector: 'app-toolbar-button',\r\n templateUrl: './toolbar-button.component.html',\r\n styleUrls: ['./toolbar-button.component.scss'],\r\n encapsulation: ViewEncapsulation.None\r\n})\r\nexport class ToolbarButtonComponent implements OnInit {\r\n\r\n @Input() buttonClass: string | string[] | Set | { [klass: string]: any; };\r\n @Input() title: string;\r\n\r\n constructor() { }\r\n\r\n ngOnInit() {\r\n }\r\n\r\n}\r\n@NgModule({\r\n declarations: [ToolbarButtonComponent],\r\n imports: [CommonModule],\r\n exports: [ToolbarButtonComponent]\r\n})\r\nexport class ToolbarButtonModule { }\r\n","\r\n","import { CommonModule } from '@angular/common';\r\nimport { ChangeDetectionStrategy, Component, NgModule, OnInit, ViewEncapsulation, Renderer2, ChangeDetectorRef, OnDestroy, ViewChild, ElementRef } from '@angular/core';\r\nimport { ReactiveFormsModule } from '@angular/forms';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { RouterModule, Router } from '@angular/router';\r\nimport { ToolbarButtonModule } from '@app/components/header/toolbar-button/toolbar-button.component';\r\nimport { LinkModule } from '@app/directives/link.directive';\r\nimport { MatDialog } from '@angular/material/dialog';\r\nimport { Subscription } from 'rxjs';\r\nimport { Constants } from '@app/common/constants';\r\nimport { filter, mergeMap } from 'rxjs/operators';\r\n\r\n@Component({\r\n selector: 'app-search-form',\r\n templateUrl: './search-form.component.html',\r\n styleUrls: ['./search-form.component.scss'],\r\n encapsulation: ViewEncapsulation.None,\r\n changeDetection: ChangeDetectionStrategy.OnPush\r\n})\r\nexport class SearchFormComponent implements OnInit, OnDestroy {\r\n\r\n subscriptions = new Subscription();\r\n @ViewChild('searchInput', { static: true }) searchInputElement: ElementRef;\r\n\r\n constructor(private router: Router, private renderer: Renderer2, private changeDetectorRef: ChangeDetectorRef, private dialog: MatDialog) { }\r\n\r\n private isLetter(character: any) {\r\n return character.toLowerCase() !== character.toUpperCase();\r\n }\r\n\r\n onKeyUp(event: Event) {\r\n if (event instanceof KeyboardEvent) {\r\n const element = event.target as HTMLInputElement;\r\n if (element && element.value) {\r\n this.renderer.setValue(element, '');\r\n this.changeDetectorRef.detectChanges();\r\n }\r\n }\r\n }\r\n\r\n onElementClick(event: Event) {\r\n let query = '';\r\n\r\n if (event instanceof KeyboardEvent) {\r\n /* tslint:disable */\r\n if (event.key && (event.key !== 'Enter' || event.keyCode !== 13) && event.key.length > 0 && this.isLetter(event.key)) {\r\n /* tslint:enable */\r\n query = event.key;\r\n }\r\n }\r\n\r\n this.router.navigate(['', { outlets: { modal: ['search'] } }], { queryParams: { q: query } });\r\n }\r\n\r\n ngOnInit() {\r\n this.subscriptions.add(\r\n this.dialog\r\n .afterOpened\r\n .pipe(\r\n filter((dialogRef) => dialogRef.id === Constants.SEARCH_DIALOG_ID),\r\n mergeMap((dialogRef) => {\r\n this.searchInputElement?.nativeElement?.blur();\r\n this.changeDetectorRef.detectChanges();\r\n return dialogRef.afterClosed();\r\n }))\r\n .subscribe((handleModalCloseFromComponent) => {\r\n // When the search component dialog is closed there are some cases where we navigate to another route and then i dont think we need to refocus.\r\n if (!handleModalCloseFromComponent) {\r\n this.searchInputElement?.nativeElement?.focus();\r\n }\r\n }));\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.subscriptions.unsubscribe();\r\n }\r\n\r\n}\r\n@NgModule({\r\n declarations: [SearchFormComponent],\r\n exports: [SearchFormComponent],\r\n imports: [\r\n CommonModule,\r\n ReactiveFormsModule,\r\n MatFormFieldModule,\r\n MatInputModule,\r\n ToolbarButtonModule,\r\n LinkModule,\r\n RouterModule\r\n ]\r\n})\r\nexport class SearchFormModule { }\r\n","
\r\n \r\n \r\n \r\n \r\n \r\n Search\r\n \r\n \r\n \r\n \r\n
\r\n \r\n \r\n Search\r\n \r\n
\r\n
\r\n","
\r\n\r\n \r\n\r\n \r\n \r\n \r\n
\r\n Edit infoboxes\r\n
\r\n
\r\n
\r\n
\r\n\r\n \r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n \r\n\r\n \r\n\r\n
\r\n
\r\n","import { CommonModule, DOCUMENT } from '@angular/common';\r\nimport { Component, Inject, NgModule, OnInit, ViewEncapsulation } from '@angular/core';\r\nimport { MatMenuModule } from '@angular/material/menu';\r\nimport { Router, RouterModule } from '@angular/router';\r\nimport { WINDOW } from '@app/common/app-tokens';\r\nimport { Roles } from '@app/common/roles';\r\nimport { Utilities } from '@app/common/utilities';\r\nimport { ToolbarButtonModule } from '@app/components/header/toolbar-button/toolbar-button.component';\r\nimport { LinkModule } from '@app/directives/link.directive';\r\nimport { SafeModule } from '@app/pipes/safe.pipe';\r\nimport { AuthService } from '@app/services/auth.service';\r\nimport { FeatureSettingsStoreService } from '@app/services/feature-settings-store.service';\r\nimport { FeatureToggleModule } from '@app/directives/feature-toggle.directive';\r\nimport { SecurityService } from '@app/services/security.service';\r\nimport { UserService } from '@app/services/user.service';\r\nimport { User } from '@microsoft/microsoft-graph-types';\r\nimport { Observable } from 'rxjs';\r\nimport { map } from 'rxjs/operators';\r\nimport { MatSlideToggleModule, MatSlideToggleChange } from '@angular/material/slide-toggle';\r\nimport { InfoboxService } from '@app/services/infobox.service';\r\nimport { NgSubscribeModule } from '@app/directives/ng-subscribe.directive';\r\nimport { PersonExtended } from '@app/models/person-extended';\r\n\r\n@Component({\r\n selector: 'app-user-menu',\r\n templateUrl: './user-menu.component.html',\r\n styleUrls: ['./user-menu.component.scss'],\r\n encapsulation: ViewEncapsulation.None\r\n})\r\nexport class UserMenuComponent implements OnInit {\r\n\r\n userProfile$: Observable;\r\n hasPermissionEditorOrAdmin$: Observable;\r\n hasPermissionEditorOrAdminOrDashBoard$: Observable;\r\n hasPermissionAdmin$: Observable;\r\n enableMyProfile: boolean;\r\n userUpn: string;\r\n infoboxZones = [];\r\n anyInfoBoxesOnPage: boolean;\r\n editModeInfoBoxes$ = this.infoboxService.currentEditMode$;\r\n\r\n constructor(\r\n @Inject(DOCUMENT) private document: Document,\r\n private userService: UserService,\r\n private authService: AuthService,\r\n private securityService: SecurityService,\r\n private infoboxService: InfoboxService,\r\n private featureStoreSettingsService: FeatureSettingsStoreService,\r\n @Inject(WINDOW) private window: Window,\r\n private router: Router) { }\r\n\r\n getPictureUrl(userProfile: User): Observable {\r\n return this.userService.getUserPhotoByUpn(userProfile.userPrincipalName);\r\n }\r\n\r\n getPreferredNameLetters(userProfile: User) {\r\n return Utilities.generateInitials(userProfile.displayName);\r\n }\r\n\r\n logOut() {\r\n this.authService.logOut();\r\n }\r\n\r\n menuOpened() {\r\n this.anyInfoBoxesOnPage = this.document.getElementsByTagName('app-infobox-zone').length > 0;\r\n // For find infomration route, since the section is hidden so app-infobox-zone is still avialable in the DOM\r\n if ( this.router.url.indexOf('find-information') >= 0) {\r\n this.anyInfoBoxesOnPage = this.featureStoreSettingsService.state.enableRightSection;\r\n }\r\n }\r\n\r\n showInfoBoxZones(event: MatSlideToggleChange) {\r\n this.infoboxService.currentEditMode$.next(event.checked);\r\n }\r\n\r\n goToDelve(user: PersonExtended) {\r\n this.window.location.href = `https://delve.office.com/?u=${user.id}`;\r\n }\r\n\r\n ngOnInit() {\r\n this.enableMyProfile = this.featureStoreSettingsService.state.enableProfileCardView;\r\n\r\n this.userProfile$ = this.userService.getMyDetailsFromMsGraph()\r\n .pipe(\r\n map(user => {\r\n const re = /\\./gi;\r\n this.userUpn = user.userPrincipalName.replace(re, '/');\r\n return user;\r\n }));\r\n\r\n this.hasPermissionEditorOrAdmin$ = this.securityService.hasUserAnyAppRole([Roles.Admin, Roles.Editor]);\r\n this.hasPermissionEditorOrAdminOrDashBoard$ = this.securityService.hasUserAnyAppRole([Roles.Admin, Roles.Editor, Roles.EditorDashboardEditor]);\r\n this.hasPermissionAdmin$ = this.securityService.hasUserAppRole(Roles.Admin);\r\n }\r\n\r\n}\r\n@NgModule({\r\n declarations: [UserMenuComponent],\r\n exports: [UserMenuComponent],\r\n imports: [\r\n CommonModule,\r\n MatMenuModule,\r\n RouterModule,\r\n LinkModule,\r\n ToolbarButtonModule,\r\n SafeModule,\r\n MatSlideToggleModule,\r\n NgSubscribeModule,\r\n FeatureToggleModule\r\n ]\r\n})\r\nexport class UserMenuModule { }\r\n","import { Injectable } from '@angular/core';\r\nimport { Route } from '@angular/router';\r\nimport { ComponentStatesOnRoutesService } from '@app/services/component-states-on-routes.service';\r\nimport { UserTabComponentConfigurationsService } from '@app/services/user-tab-config.service';\r\nimport { concat, forkJoin, Observable, of } from 'rxjs';\r\nimport { filter, map, mergeMap } from 'rxjs/operators';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class BadgeMenuService {\r\n\r\n constructor(\r\n private userTabComponentConfigurationsService: UserTabComponentConfigurationsService,\r\n private componentEventService: ComponentStatesOnRoutesService) { }\r\n\r\n public showBadge(route: Route): Observable {\r\n return concat(\r\n of(false),\r\n this.componentEventService\r\n .state$\r\n .pipe(\r\n filter(componentsOnRouteState => {\r\n return componentsOnRouteState.RouteMap.has(`/${route.path}`);\r\n }),\r\n mergeMap((componentsOnRouteState) => {\r\n return forkJoin([this.userTabComponentConfigurationsService.getUserTabConfig(), of(componentsOnRouteState)]);\r\n }),\r\n map(([userTabComponentConfiguration, componentsOnRouteState]) => {\r\n const myBoardRoute = componentsOnRouteState.RouteMap.get(`/${route.path}`);\r\n const foundComponent = myBoardRoute?.find(component => component.ShowBadge === true);\r\n if (foundComponent) {\r\n const componentIsHidden = userTabComponentConfiguration?.some(d => d.ComponentId === foundComponent.ComponentId && d.Hidden);\r\n if (!componentIsHidden) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n })));\r\n }\r\n}\r\n","\r\n","import { CommonModule } from '@angular/common';\r\nimport { ChangeDetectionStrategy, ChangeDetectorRef, Component, EventEmitter, Input, NgModule, OnInit, Output, ViewEncapsulation } from '@angular/core';\r\nimport { MatBadgeModule } from '@angular/material/badge';\r\nimport { Route, Router, RouterModule } from '@angular/router';\r\nimport { RouteData } from '@app/common/route-data';\r\nimport { LogoModule } from '@app/components/header/logo/logo.component';\r\nimport { SearchFormModule } from '@app/components/header/search-form/search-form.component';\r\nimport { TopnavBroadcastsModule } from '@app/components/header/topnav-broadcasts/topnav-broadcasts.component';\r\nimport { UserMenuModule } from '@app/components/header/user-menu/user-menu.component';\r\nimport { FeatureToggleModule } from '@app/directives/feature-toggle.directive';\r\nimport { ExtendedRoute } from '@app/models/extended-route';\r\nimport { BadgeMenuService } from '@app/services/badge-menu.service';\r\nimport { FeatureSettingsStoreService } from '@app/services/feature-settings-store.service';\r\nimport { LicenseService } from '@app/services/license.service';\r\nimport { Observable } from 'rxjs';\r\nimport { map, tap } from 'rxjs/operators';\r\nimport { LinkModule } from '@app/directives/link.directive';\r\nimport { ActionLinkModule } from '@app/components/actions/action-link/action-link.component';\r\n\r\n@Component({\r\n selector: 'app-topnav',\r\n templateUrl: './topnav.component.html',\r\n styleUrls: ['./topnav.component.scss'],\r\n encapsulation: ViewEncapsulation.None,\r\n changeDetection: ChangeDetectionStrategy.OnPush\r\n})\r\nexport class TopnavComponent implements OnInit {\r\n\r\n @Input() sideMenuIsOpen = false;\r\n @Input() displayMode: 'vertical' | 'horizontal';\r\n @Output() toggleSideMenuEvent = new EventEmitter();\r\n\r\n featureSettings = this.featureSettingsStoreService.state;\r\n workplaceName = this.featureSettingsStoreService.state.workplaceName;\r\n bypassLicenseFilterInTopNav = this.featureSettingsStoreService.state.bypassLicenseFilterInTopNav;\r\n routeLinks$: Observable;\r\n guideUrl = this.featureSettingsStoreService.state.guideSiteUrl;\r\n additionalTopNavLink = this.featureSettingsStoreService.state.linkTopNav;\r\n\r\n constructor(private featureSettingsStoreService: FeatureSettingsStoreService,\r\n private badgeMenuService: BadgeMenuService,\r\n private licenseService: LicenseService,\r\n private cdr: ChangeDetectorRef,\r\n public router: Router) {\r\n }\r\n\r\n toggleSideMenu() {\r\n this.sideMenuIsOpen = !this.sideMenuIsOpen;\r\n this.toggleSideMenuEvent.emit(this.sideMenuIsOpen);\r\n }\r\n\r\n licenseFilter(route: Route, hasUserAny365License: boolean): boolean {\r\n if (route.data?.hasOwnProperty('onlyShowForLicensedUsers')) {\r\n if (hasUserAny365License === (route.data as RouteData)?.onlyShowForLicensedUsers || this.bypassLicenseFilterInTopNav) {\r\n return true;\r\n } else {\r\n return false;\r\n }\r\n } else {\r\n return true;\r\n }\r\n }\r\n\r\n ngOnInit() {\r\n this.routeLinks$ =\r\n this.licenseService.hasUserAny365License()\r\n .pipe(\r\n map(hasUserAny365License => {\r\n // Only show routes that have the data.title property defined.\r\n // Also filter where where 'showForLicensedUsers' is either not defined or is equal to the license requirements\r\n return this.router.config\r\n .filter(route => route.data?.title && route.data?.showInTopNav && this.licenseFilter(route, hasUserAny365License))\r\n .map(route => {\r\n return {\r\n path: route.path,\r\n data: route.data,\r\n showBadge$: this.badgeMenuService.showBadge(route)\r\n .pipe(\r\n tap(() => {\r\n this.cdr.detectChanges();\r\n }))\r\n } as ExtendedRoute;\r\n });\r\n }));\r\n\r\n }\r\n\r\n}\r\n@NgModule({\r\n declarations: [TopnavComponent],\r\n exports: [TopnavComponent],\r\n imports: [\r\n CommonModule,\r\n RouterModule,\r\n MatBadgeModule,\r\n LogoModule,\r\n SearchFormModule,\r\n FeatureToggleModule,\r\n TopnavBroadcastsModule,\r\n UserMenuModule,\r\n LinkModule,\r\n ActionLinkModule\r\n ]\r\n})\r\nexport class TopnavModule { }\r\n","import { CommonModule, DOCUMENT } from '@angular/common';\r\nimport { Component, HostListener, Inject, NgModule, Optional, ViewEncapsulation } from '@angular/core';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatDialogRef } from '@angular/material/dialog';\r\nimport { Constants } from '@app/common/constants';\r\nimport { LinkModule } from '@app/directives/link.directive';\r\nimport { FeatureSettingsStoreService } from '@app/services/feature-settings-store.service';\r\n\r\n@Component({\r\n selector: 'app-ios-pwa-banner',\r\n templateUrl: './ios-pwa-banner.component.html',\r\n styleUrls: ['./ios-pwa-banner.component.scss'],\r\n encapsulation: ViewEncapsulation.None\r\n})\r\nexport class IosPwaBannerComponent {\r\n\r\n workplaceName = this.featureSettingsStoreService.state.workplaceName;\r\n title = this.featureSettingsStoreService.state.title;\r\n\r\n constructor(\r\n @Optional() private dialogRef: MatDialogRef,\r\n @Inject(DOCUMENT) private document: Document,\r\n private featureSettingsStoreService: FeatureSettingsStoreService) { }\r\n\r\n close() {\r\n if (this.dialogRef) {\r\n this.document.cookie = Constants.IOS_BANNER_CLOSED_COOKIE;\r\n this.dialogRef.close(true);\r\n }\r\n }\r\n\r\n @HostListener('document:click', ['$event']) public onClickAnyWhere() {\r\n this.close();\r\n }\r\n}\r\n@NgModule({\r\n declarations: [IosPwaBannerComponent],\r\n entryComponents: [IosPwaBannerComponent],\r\n imports: [\r\n CommonModule,\r\n LinkModule,\r\n MatButtonModule\r\n ]\r\n})\r\nexport class IosPwaBannerModule { }\r\n","
\r\n
\r\n Install {{title}} on your device. Tapand then \"Add to homescreen\".\r\n
\r\n \r\n
\r\n","\r\n","import { CommonModule, DOCUMENT } from '@angular/common';\r\nimport { Component, ElementRef, Inject, NgModule, OnDestroy, OnInit } from '@angular/core';\r\nimport { NavigationStart, Router, RouterModule } from '@angular/router';\r\nimport { CUSTOMERENVIRONMENT } from '@app/common/app-tokens';\r\nimport { Component as ComponentInfo } from '@app/models/component';\r\nimport { ComponentState } from '@app/models/component-state';\r\nimport { LinkModule } from '@app/directives/link.directive';\r\nimport { ComponentStatesOnRoutesService } from '@app/services/component-states-on-routes.service';\r\nimport { Environment } from '@environments/interface.environment';\r\nimport { Subscription } from 'rxjs';\r\nimport { filter } from 'rxjs/operators';\r\n\r\n@Component({\r\n selector: 'app-skip-links',\r\n templateUrl: './skip-links.component.html',\r\n styleUrls: ['./skip-links.component.scss']\r\n})\r\nexport class SkipLinksComponent implements OnInit, OnDestroy {\r\n subscriptions = new Subscription();\r\n skipLinks: ComponentState[];\r\n dynamicSkipLinks: ComponentState[];\r\n staticSkipLinks: ComponentState[];\r\n\r\n constructor(private router: Router,\r\n private componentEventService: ComponentStatesOnRoutesService,\r\n public elementRef: ElementRef,\r\n @Inject(CUSTOMERENVIRONMENT) private environment: Environment,\r\n @Inject(DOCUMENT) private document: Document) { }\r\n\r\n ngOnInit(): void {\r\n this.staticSkipLinks = this.environment.featureSettings.staticSkipLinks ? this.environment.featureSettings.staticSkipLinks.Sections.map(section => {\r\n return new ComponentState({\r\n ShowBadge: false,\r\n ComponentId: section.Id,\r\n Component: new ComponentInfo({\r\n Title: section.Name,\r\n Id: section.Id\r\n })\r\n });\r\n }) : [];\r\n\r\n this.subscriptions.add(\r\n this.router.events\r\n .pipe(filter(event => event instanceof NavigationStart))\r\n .subscribe((event: NavigationStart) => {\r\n if (event.url.indexOf('#') === -1) {\r\n this.dynamicSkipLinks = this.componentEventService.state.RouteMap.has(event.url)\r\n && this.componentEventService.state.RouteMap.get(event.url);\r\n if (this.dynamicSkipLinks && this.dynamicSkipLinks.length > 0) {\r\n this.skipLinks = [...this.staticSkipLinks, ...this.dynamicSkipLinks];\r\n }\r\n }\r\n })\r\n );\r\n }\r\n\r\n skipToContent(elementId) {\r\n const element = this.document.getElementById(elementId);\r\n\r\n if (element) {\r\n if (!/^(?:a|select|input|button|textarea)$/i.test(element.tagName)) {\r\n element.tabIndex = -1;\r\n }\r\n element.focus();\r\n }\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.subscriptions.unsubscribe();\r\n }\r\n}\r\n\r\n@NgModule({\r\n declarations: [SkipLinksComponent],\r\n exports: [SkipLinksComponent],\r\n imports: [\r\n CommonModule,\r\n LinkModule,\r\n RouterModule,\r\n ]\r\n})\r\nexport class SkipLinksModule { }\r\n","import { Inject, Injectable } from '@angular/core';\r\nimport { MatSnackBar } from '@angular/material/snack-bar';\r\nimport { CUSTOMERENVIRONMENT, WINDOW } from '@app/common/app-tokens';\r\nimport { Utilities } from '@app/common/utilities';\r\nimport { AlertTemplatesComponent } from '@app/components/alert-templates/alert-templates.component';\r\nimport { AuthService } from '@app/services/auth.service';\r\nimport { HubConnection, HubConnectionState } from '@microsoft/signalr/dist/esm/HubConnection';\r\nimport { HubConnectionBuilder } from '@microsoft/signalr/dist/esm/HubConnectionBuilder';\r\nimport { LogLevel } from '@microsoft/signalr/dist/esm/ILogger';\r\nimport { Environment } from '@environments/interface.environment';\r\nimport { BehaviorSubject, from, Observable, of } from 'rxjs';\r\nimport { finalize, map, mergeMap, publishReplay, refCount } from 'rxjs/operators';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class SignalRService {\r\n\r\n private hubConnection: HubConnection;\r\n private innerSubject$ = new BehaviorSubject(null);\r\n\r\n constructor(@Inject(CUSTOMERENVIRONMENT) private environment: Environment, @Inject(WINDOW) private window: Window, private authService: AuthService, private snackBar: MatSnackBar) {\r\n\r\n this.hubConnection = new HubConnectionBuilder()\r\n // use our default debug url to the API here. The proxy wont do websockets.\r\n .withUrl(`${this.environment.production || this.window.location.port !== '4200' ? '' : 'http://localhost:64818'}/hub`, {\r\n accessTokenFactory: () => {\r\n const scopes = this.authService.getScopesForEndpoint('/api/');\r\n if (scopes) {\r\n return this.authService\r\n .acquireTokenSilentWithFallBackToPopup({ ...scopes, ...{ account: this.authService.accountInfo } }, scopes)\r\n .pipe(\r\n map(authResult => authResult.accessToken))\r\n .toPromise();\r\n }\r\n }\r\n })\r\n .configureLogging(this.environment.production ? LogLevel.Information : LogLevel.Debug)\r\n .withAutomaticReconnect()\r\n .build();\r\n\r\n this.hubConnection.onclose((err) => {\r\n if (err && err.message.indexOf('1006') !== -1) {\r\n // Show snackbar or something indicating a closed connection from the server.\r\n Utilities.openSnackBar(this.snackBar, AlertTemplatesComponent, err.message, 5000);\r\n }\r\n this.innerSubject$.complete();\r\n });\r\n\r\n this.hubConnection.serverTimeoutInMilliseconds = 60000;\r\n this.hubConnection.keepAliveIntervalInMilliseconds = 30000;\r\n }\r\n\r\n /** Will start the SignalR connection and stop it on 'unsubscribe'. Pattern stolen from this example https://github.com/ReactiveX/rxjs/issues/3786 */\r\n connect(): Observable {\r\n return this.innerSubject$\r\n .pipe(\r\n mergeMap(() => {\r\n if (this.hubConnection.state === HubConnectionState.Connected) {\r\n return of(this.hubConnection);\r\n } else {\r\n return from(this.hubConnection.start())\r\n .pipe(\r\n map(() => {\r\n if (this.hubConnection.state === HubConnectionState.Connected) {\r\n return this.hubConnection;\r\n } else {\r\n return null;\r\n }\r\n }));\r\n }\r\n }),\r\n finalize(() => {\r\n // Stop the connection on unsubscribe.\r\n this.hubConnection.off('UpdateComponentState');\r\n\r\n this.hubConnection.stop()\r\n .then(() => {\r\n console.log('SignalR connection was stopped!');\r\n })\r\n .catch((err) => {\r\n console.log('SignalR connection caught error when trying to stop: ' + err);\r\n });\r\n }),\r\n publishReplay(1),\r\n refCount()\r\n );\r\n }\r\n}\r\n","export class OrganizationEvent {\r\n\r\n public Id: string;\r\n public UniqueId: string;\r\n public Title: string;\r\n public EventDate: Date;\r\n public EventDay: string;\r\n public Description: string;\r\n public Recurrence: string;\r\n public AllDayEvent: string;\r\n public EndDate: Date;\r\n public Location: string;\r\n public RecurrenceData: string;\r\n public Duration: any;\r\n public ItemUrl: string;\r\n public OrganizationCalendarName: string;\r\n public EventInstance: string;\r\n public BannerUrl: string;\r\n public ListGuid: string;\r\n public ShowNewOrModifiedBadge: boolean;\r\n public Channels: Array;\r\n public LanguageTermId?: string;\r\n\r\n constructor(opt?: Partial) {\r\n Object.assign(this, opt);\r\n }\r\n\r\n}\r\n","import { HttpClient, HttpParams } from '@angular/common/http';\r\nimport { Inject, Injectable } from '@angular/core';\r\nimport { CUSTOMERENVIRONMENT } from '@app/common/app-tokens';\r\nimport { applyLanguageFilteringSingle } from '@app/common/filtering-behavior';\r\nimport { HttpHelper } from '@app/common/http-helper';\r\nimport { OrganizationEvent } from '@app/models/organization-events';\r\nimport { SimplifiedTerm } from '@app/models/simplified-term';\r\nimport { UserChannelTerm } from '@app/models/user-channel-term';\r\nimport { CacheService } from '@app/services/cache.service';\r\nimport { ChannelService } from '@app/services/channel.service';\r\nimport { FeatureSettingsStoreService } from '@app/services/feature-settings-store.service';\r\nimport { UserChannelTermsService } from '@app/services/user-channel-terms.service';\r\nimport { Environment } from '@environments/interface.environment';\r\nimport { ListItem } from '@microsoft/microsoft-graph-types';\r\nimport { concat, forkJoin, Observable, of, Subject } from 'rxjs';\r\nimport { catchError, map, mergeMap, shareReplay, tap } from 'rxjs/operators';\r\nimport { UserLanguageTermService } from './user-language-term.service';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class OrganizationCalendarService {\r\n\r\n constructor(@Inject(CUSTOMERENVIRONMENT) private environment: Environment,\r\n private http: HttpClient,\r\n private cache: CacheService,\r\n private httpHelper: HttpHelper,\r\n private channelService: ChannelService,\r\n private userLanguageTermService: UserLanguageTermService,\r\n private userChannelTermsService: UserChannelTermsService,\r\n private featureSettingsStoreService: FeatureSettingsStoreService) { }\r\n\r\n private readonly cacheKey = 'OrganizationCalendarService-getOrganizationCalendarEvents';\r\n\r\n public useCache = true;\r\n private getOrganizationCalendarEventsFromGraph$: Observable>;\r\n private getNewOrUpdatedOrganizationCalendarEventsFromGraph$: Observable>;\r\n private reloadGetNewOrUpdatedOrganizationCalendarEventsFromGraph$ = new Subject();\r\n\r\n private channels$: Observable> = this.channelService.getChannels();\r\n private userChannelTerms$: Observable> = this.userChannelTermsService.getUserChannelTerms();\r\n\r\n reloadOrganizationCalendarEventsFromGraph() {\r\n this.reloadGetNewOrUpdatedOrganizationCalendarEventsFromGraph$.next();\r\n this.getOrganizationCalendarEventsFromGraph$ = null;\r\n }\r\n\r\n getOrganizationCalendarEventsFromGraph(amount: number = 100): Observable> {\r\n if (this.getOrganizationCalendarEventsFromGraph$) {\r\n return this.getOrganizationCalendarEventsFromGraph$;\r\n } else {\r\n const cacheKey = `-${amount.toString()}`;\r\n const listsRequest = `${this.environment.coreWorkplaceSiteUrl}/_api/v2.0/sharePoint/getBaseItemByUrl(url='/lists/Events')/items`;\r\n const now = new Date();\r\n const httpParams = new HttpParams()\r\n .append('expand', 'fields(select=Title,EventDate,EndDate,Description,Location,BannerUrl,fRecurrence,fAllDayEvent,RecurrenceData,BoolField_Channel,BoolField_Language)')\r\n .append('filter', `(fields/EventDate gt '${now.toISOString()}') or (fields/EventDate le '${now.toISOString()}' and fields/EndDate ge '${now.toISOString()}')`)\r\n .append('top', amount.toString())\r\n .append('select', 'fields,id,parentReference')\r\n .append('orderby', 'fields/EventDate asc');\r\n const getOrganizationCalendarEventsFromGraph$ = forkJoin(\r\n [\r\n this.http\r\n .get(listsRequest, {\r\n params: httpParams,\r\n headers: {\r\n 'Prefer': 'HonorNonIndexedQueriesWarningMayFailRandomly'\r\n }\r\n }),\r\n this.userChannelTerms$])\r\n .pipe(\r\n map(([listItemResult, userChannelTerms]) => {\r\n const listItems = listItemResult.value as ListItem[];\r\n return listItems.map(item => {\r\n return new OrganizationEvent({\r\n Title: item.fields['Title'],\r\n Description: item.fields['Description'],\r\n Channels: item.fields['BoolField_Channel'],\r\n ListGuid: item.parentReference['listId'],\r\n Id: item.id,\r\n Location: item.fields['Location'],\r\n EventDate: item.fields['EventDate'],\r\n EndDate: item.fields['EndDate'],\r\n BannerUrl: item.fields['BannerUrl'] ? item.fields['BannerUrl'].Url : null,\r\n AllDayEvent: item.fields['fAllDayEvent'],\r\n Recurrence: item.fields['fRecurrence'],\r\n RecurrenceData: item.fields['RecurrenceData'] ? item.fields['RecurrenceData'] : null,\r\n LanguageTermId: (item.fields['BoolField_Language'] && item.fields['BoolField_Language'].TermGuid) ? item.fields['BoolField_Language'].TermGuid : '',\r\n });\r\n }).filter(i => {\r\n const channelTerms = i.Channels;\r\n if (channelTerms && channelTerms.length > 0) {\r\n let found = true;\r\n const matchingChannels = i.Channels.filter(c => {\r\n found = userChannelTerms.some(ct => ct.ChannelTermId === c.TermGuid);\r\n if (found) {\r\n return c;\r\n }\r\n });\r\n if (matchingChannels && matchingChannels.length > 0) {\r\n return i;\r\n }\r\n } else {\r\n return i;\r\n }\r\n });\r\n }));\r\n\r\n this.getOrganizationCalendarEventsFromGraph$ = getOrganizationCalendarEventsFromGraph$\r\n .pipe(\r\n mergeMap((events) => {\r\n // Language filter toggle\r\n if (this.featureSettingsStoreService.state.enableLanguageFilteringForSharepointEvents) {\r\n return this.userLanguageTermService.getUserLanguageTerms().pipe(\r\n map((userLanguageTerms) => {\r\n return applyLanguageFilteringSingle(events, userLanguageTerms, this.featureSettingsStoreService.state.enableShowNonLanguageContentForAllUsers, this.featureSettingsStoreService.state.defaultLanguageTermId);\r\n })\r\n );\r\n } else {\r\n return of(events);\r\n }\r\n }),\r\n tap(data => {\r\n this.useCache && this.cache.set(cacheKey, data);\r\n }),\r\n catchError(this.httpHelper.handleError({ operation: 'getOrganizationCalendarEventsFromGraph', result: new Array(), rethrow: true, cacheKey: cacheKey })),\r\n shareReplay({ bufferSize: 1, refCount: true })\r\n );\r\n\r\n if (this.useCache) {\r\n const cachedData = this.cache.get>(this.cacheKey);\r\n if (cachedData) {\r\n return concat(of(cachedData), this.getOrganizationCalendarEventsFromGraph$);\r\n }\r\n }\r\n return this.getOrganizationCalendarEventsFromGraph$;\r\n }\r\n }\r\n\r\n getNewOrUpdatedOrganizationCalendarEventsFromGraph(lastCheckedDate: Date, amount: number = 100): Observable> {\r\n if (this.getOrganizationCalendarEventsFromGraph$) {\r\n return this.getOrganizationCalendarEventsFromGraph$;\r\n } else {\r\n const listsRequest = `${this.environment.coreWorkplaceSiteUrl}/_api/v2.0/sharePoint/getBaseItemByUrl(url='/lists/Events')/items`;\r\n const cacheKey = `-${amount.toString()}`;\r\n const now = new Date();\r\n const httpParams = new HttpParams()\r\n .append('expand', 'fields(select=Title,EventDate,EndDate,Description,Location,BannerUrl,fRecurrence,fAllDayEvent,RecurrenceData,BoolField_Channel,BoolField_Language,Modified)')\r\n .append('select', 'fields,id,parentReference')\r\n .append('filter', `(fields/Modified gt '${lastCheckedDate.toISOString()}') and ((fields/EventDate gt '${now.toISOString()}') or (fields/EventDate le '${now.toISOString()}' and fields/EndDate ge '${now.toISOString()}'))`)\r\n .append('top', amount.toString())\r\n .append('orderby', 'fields/EventDate desc');\r\n\r\n const getNewOrUpdatedOrganizationCalendarEventsFromGraph$ = forkJoin(\r\n [\r\n this.http\r\n .get(listsRequest, {\r\n params: httpParams,\r\n headers: {\r\n 'Prefer': 'HonorNonIndexedQueriesWarningMayFailRandomly'\r\n }\r\n }),\r\n this.userChannelTerms$])\r\n .pipe(\r\n map(([listItemResult, userChannelTerms]) => {\r\n const listItems = listItemResult.value as ListItem[];\r\n return listItems.map(item => {\r\n return new OrganizationEvent({\r\n Title: item.fields['Title'],\r\n Description: item.fields['Description'],\r\n Channels: item.fields['BoolField_Channel'],\r\n ListGuid: item.parentReference['listId'],\r\n Id: item.id,\r\n Location: item.fields['Location'],\r\n EventDate: item.fields['EventDate'],\r\n EndDate: item.fields['EndDate'],\r\n BannerUrl: item.fields['BannerUrl'] ? item.fields['BannerUrl'].Url : null,\r\n AllDayEvent: item.fields['fAllDayEvent'],\r\n Recurrence: item.fields['fRecurrence'],\r\n RecurrenceData: item.fields['RecurrenceData'] ? item.fields['RecurrenceData'] : null,\r\n LanguageTermId: (item.fields['BoolField_Language'] && item.fields['BoolField_Language'].TermGuid) ? item.fields['BoolField_Language'].TermGuid : '',\r\n });\r\n }).filter(i => {\r\n const channelTerms = i.Channels;\r\n if (channelTerms && channelTerms.length > 0) {\r\n let found = true;\r\n const matchingChannels = i.Channels.filter(c => {\r\n found = userChannelTerms.some(ct => ct.ChannelTermId === c.TermGuid);\r\n if (found) {\r\n return c;\r\n }\r\n });\r\n if (matchingChannels && matchingChannels.length > 0) {\r\n return i;\r\n }\r\n } else {\r\n return i;\r\n }\r\n });\r\n }),\r\n catchError(this.httpHelper.handleError({ operation: 'getNewOrUpdatedOrganizationCalendarEventsFromGraph', result: new Array(), rethrow: true })));\r\n\r\n this.getNewOrUpdatedOrganizationCalendarEventsFromGraph$ = getNewOrUpdatedOrganizationCalendarEventsFromGraph$\r\n .pipe(\r\n mergeMap((events) => {\r\n // Language filter toggle\r\n if (this.featureSettingsStoreService.state.enableLanguageFilteringForSharepointEvents) {\r\n return this.userLanguageTermService\r\n .getUserLanguageTerms()\r\n .pipe(\r\n map((userLanguageTerms) => {\r\n return applyLanguageFilteringSingle(events, userLanguageTerms, this.featureSettingsStoreService.state.enableShowNonLanguageContentForAllUsers, this.featureSettingsStoreService.state.defaultLanguageTermId);\r\n })\r\n );\r\n } else {\r\n return of(events);\r\n }\r\n }),\r\n tap(data => {\r\n this.useCache && this.cache.set(cacheKey, data);\r\n }),\r\n catchError(this.httpHelper.handleError({ operation: 'getNewOrUpdatedOrganizationCalendarEventsFromGraph', result: new Array(), rethrow: true, cacheKey: cacheKey }))\r\n );\r\n\r\n return this.getNewOrUpdatedOrganizationCalendarEventsFromGraph$;\r\n }\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { NavigationEnd } from '@angular/router';\r\nimport { Constants } from '@app/common/constants';\r\nimport { ComponentState } from '@app/models/component-state';\r\nimport { UserLanguageTerm } from '@app/models/user-language-term';\r\nimport { CacheService } from '@app/services/cache.service';\r\nimport { ComponentStatesOnRoutesService } from '@app/services/component-states-on-routes.service';\r\nimport { FeatureSettingsStoreService } from '@app/services/feature-settings-store.service';\r\nimport { NewsService } from '@app/services/news.service';\r\nimport { OrganizationCalendarService } from '@app/services/organization-calendar.service';\r\nimport { UserAppTileService } from '@app/services/user-app-tile.service';\r\nimport { UserItemsToReadService } from '@app/services/user-items-to-read.service';\r\nimport { addMinutes, isAfter } from 'date-fns';\r\nimport { forkJoin, Observable } from 'rxjs';\r\nimport { tap } from 'rxjs/operators';\r\nimport { UserLanguageTermService } from './user-language-term.service';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class UpdatedContentService {\r\n\r\n constructor(private newsService: NewsService,\r\n private cacheService: CacheService,\r\n private userAppTileService: UserAppTileService,\r\n private organizationCalendarService: OrganizationCalendarService,\r\n private componentStatesOnRoutesService: ComponentStatesOnRoutesService,\r\n private userItemsToReadService: UserItemsToReadService,\r\n private featureSettingsStoreService: FeatureSettingsStoreService,\r\n private userLanguageTermService: UserLanguageTermService) {\r\n this.userLanguageTerms$ = this.userLanguageTermService.getUserLanguageTerms();\r\n }\r\n\r\n private readonly minutesBetweenUpdatedContentChecks = 30;\r\n private userLanguageTerms$: Observable>;\r\n\r\n onNavigationEnd(event: NavigationEnd): Observable {\r\n // get our current routemap with all components on every route\r\n const routeMap = this.componentStatesOnRoutesService.state.RouteMap;\r\n const observableChecksArr = new Array>();\r\n routeMap.forEach((componentStates, url) => {\r\n // We dont do checks for new content on the route that we're presently browsing\r\n if (url !== event.url) {\r\n componentStates.forEach(current => {\r\n // Get the last check\r\n let timeStamp = current.LastCheckedForNewContent;\r\n // If we dont have a current last check in the state we try the cache to see if there is a value there\r\n if (!timeStamp) {\r\n const timeStampValue = this.cacheService.get(`${current.ComponentId}-${Constants.COMPONENT_VISITED_CACHEKEY_SUFFIX}`);\r\n timeStamp = timeStampValue ? new Date(timeStampValue) : new Date();\r\n }\r\n\r\n // Check if it has been an X amount fo time since the last check and that the current component state doesnt already have ShowBadge==true\r\n if (isAfter(new Date(), addMinutes(timeStamp, this.minutesBetweenUpdatedContentChecks)) && !current.ShowBadge) {\r\n // If we should do a new check for updated content we have a couple of different ways to do it for each type of component\r\n switch (current.ComponentId) {\r\n case 'app-organization-calendar': {\r\n observableChecksArr.push(\r\n this.organizationCalendarService.getNewOrUpdatedOrganizationCalendarEventsFromGraph(timeStamp)\r\n .pipe(\r\n tap((data) => {\r\n if (data && data.length > 0) {\r\n this.organizationCalendarService.reloadOrganizationCalendarEventsFromGraph();\r\n this.componentStatesOnRoutesService.updateStates(\r\n new ComponentState({\r\n ComponentId: 'app-organization-calendar',\r\n ShowBadge: true,\r\n Data: data\r\n }));\r\n }\r\n })));\r\n break;\r\n }\r\n case 'app-featured-news': {\r\n observableChecksArr.push(\r\n this.newsService.getNewTopNews(timeStamp, this.userLanguageTerms$).pipe(\r\n tap((data) => {\r\n if (data && data.length > 0) {\r\n this.newsService.reloadAllTopNews();\r\n this.componentStatesOnRoutesService.updateStates(\r\n new ComponentState({\r\n ComponentId: 'app-featured-news',\r\n ShowBadge: true,\r\n Data: data\r\n }));\r\n }\r\n })));\r\n break;\r\n }\r\n case 'app-my-app-tiles': {\r\n observableChecksArr.push(this.userAppTileService.getNewOrUpdatedUserAppTilesSinceLastVisit(timeStamp)\r\n .pipe(\r\n tap((data) => {\r\n if (data && data.length > 0) {\r\n this.userAppTileService.reload();\r\n this.componentStatesOnRoutesService.updateStates(\r\n new ComponentState({\r\n ComponentId: 'app-my-app-tiles',\r\n ShowBadge: true,\r\n Data: data\r\n }));\r\n }\r\n })));\r\n break;\r\n }\r\n case 'app-required-reading': {\r\n if (this.featureSettingsStoreService.state.enableRequiredReading) {\r\n observableChecksArr.push(\r\n this.userItemsToReadService.getNewOrUpdatedUserToReadSinceLastVisit(timeStamp)\r\n .pipe(\r\n tap((data) => {\r\n if (data && data.length > 0) {\r\n this.componentStatesOnRoutesService.updateStates(\r\n new ComponentState({\r\n ComponentId: 'app-required-reading',\r\n ShowBadge: true,\r\n Data: data\r\n }));\r\n }\r\n })));\r\n }\r\n break;\r\n }\r\n default: {\r\n // do nothing\r\n break;\r\n }\r\n }\r\n }\r\n });\r\n }\r\n });\r\n return forkJoin(observableChecksArr);\r\n }\r\n}\r\n","\r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n
\r\n
\r\n No internet connection\r\n \r\n
\r\n
\r\n
\r\n
\r\n \r\n \r\n \r\n
\r\n
\r\n \r\n \r\n
\r\n \r\n
\r\n
\r\n\r\n\r\n","import { BreakpointObserver } from '@angular/cdk/layout';\r\nimport { Platform } from '@angular/cdk/platform';\r\nimport { CommonModule, PlatformLocation } from '@angular/common';\r\nimport { Component, Inject, NgModule, OnDestroy, OnInit, ViewChild, ViewContainerRef } from '@angular/core';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatDialog, MatDialogRef } from '@angular/material/dialog';\r\nimport { MatProgressSpinnerModule } from '@angular/material/progress-spinner';\r\nimport { MatSidenav, MatSidenavModule } from '@angular/material/sidenav';\r\nimport { Title } from '@angular/platform-browser';\r\nimport { NavigationEnd, NavigationStart, Router, RouterModule, ActivationEnd } from '@angular/router';\r\nimport { WINDOW } from '@app/common/app-tokens';\r\nimport { Constants } from '@app/common/constants';\r\nimport { AlertTemplatesModule } from '@app/components/alert-templates/alert-templates.component';\r\nimport { BroadcastsModule } from '@app/components/broadcasts/broadcasts/broadcasts.component';\r\nimport { FirstDayDialogComponent, FirstDayDialogModule } from '@app/components/first-day-dialog/first-day-dialog.component';\r\nimport { FooterModule } from '@app/components/footer/footer.component';\r\nimport { TopnavBroadcastsModule } from '@app/components/header/topnav-broadcasts/topnav-broadcasts.component';\r\nimport { TopnavModule } from '@app/components/header/topnav/topnav.component';\r\nimport { IosPwaBannerComponent, IosPwaBannerModule } from '@app/components/ios-pwa-banner/ios-pwa-banner.component';\r\nimport { SkipLinksModule } from '@app/components/skip-links/skip-links.component';\r\nimport { StickyFillModule } from '@app/directives/stickyfill.directive';\r\nimport { ComponentState } from '@app/models/component-state';\r\nimport { FirstDayWizardStep } from '@app/models/first-day-step';\r\nimport { InternetStatus } from '@app/models/internet-status';\r\nimport { LinkModule } from '@app/directives/link.directive';\r\nimport { ComponentStatesOnRoutesService } from '@app/services/component-states-on-routes.service';\r\nimport { FeatureSettingsStoreService } from '@app/services/feature-settings-store.service';\r\nimport { InternetStatusService } from '@app/services/internet-status.service';\r\nimport { SignalRService } from '@app/services/signalr.service';\r\nimport { UpdatedContentService } from '@app/services/updated-content.service';\r\nimport { UserChannelTermsService } from '@app/services/user-channel-terms.service';\r\nimport { UserLanguageTermService } from '@app/services/user-language-term.service';\r\nimport { UserService } from '@app/services/user.service';\r\nimport { Observable, Subscription } from 'rxjs';\r\nimport { filter, map, mergeMap } from 'rxjs/operators';\r\nimport { Utilities } from '@app/common/utilities';\r\n\r\n@Component({\r\n selector: 'app-main',\r\n templateUrl: './main.component.html',\r\n styleUrls: ['./main.component.scss']\r\n})\r\nexport class MainComponent implements OnInit, OnDestroy {\r\n\r\n subscriptions = new Subscription();\r\n firstDayDialogRef: MatDialogRef;\r\n @ViewChild('sidenav') sidenav: MatSidenav;\r\n stickyHeader = this.featureSettingsStoreService.state.stickyHeader;\r\n internetStatus$: Observable;\r\n\r\n constructor(\r\n @Inject(WINDOW) private window: Window,\r\n private titleService: Title,\r\n private userService: UserService,\r\n private componentStateService: ComponentStatesOnRoutesService,\r\n private signalRService: SignalRService,\r\n private userChannelService: UserChannelTermsService,\r\n private userLanguageTermService: UserLanguageTermService,\r\n private platformLocation: PlatformLocation,\r\n private featureSettingsStoreService: FeatureSettingsStoreService,\r\n private dialog: MatDialog,\r\n private vcr: ViewContainerRef,\r\n private updatedContentService: UpdatedContentService,\r\n private internetStatusService: InternetStatusService,\r\n private router: Router,\r\n private platform: Platform,\r\n private breakpointObserver: BreakpointObserver) {\r\n this.componentStateService.initStates(this.vcr);\r\n }\r\n\r\n toggleSideMenu(open: boolean, sidenav: MatSidenav) {\r\n sidenav.toggle(open);\r\n }\r\n\r\n // Fullscreen means no toolbar or footer, just a single outlet for the config component\r\n fullscreenView() {\r\n return this.router.url.indexOf('first-day') >= 0 || this.featureSettingsStoreService.state.coreIntranetEnabled;\r\n }\r\n\r\n reload() {\r\n this.window.location.reload();\r\n }\r\n\r\n ngOnInit(): void {\r\n this.internetStatus$ = this.internetStatusService.state$.pipe(map(status => status));\r\n this.subscriptions.add(this.internetStatusService.whenOnline().subscribe());\r\n this.subscriptions.add(this.internetStatusService.whenOffline().subscribe());\r\n\r\n this.subscriptions.add(\r\n this.router.events\r\n .pipe(filter(event => event instanceof NavigationStart))\r\n .subscribe((event: NavigationStart) => {\r\n // Close sidenav when navigating\r\n if (event && this.sidenav && this.sidenav.opened) {\r\n this.toggleSideMenu(false, this.sidenav);\r\n }\r\n })\r\n );\r\n\r\n this.subscriptions.add(\r\n this.router.events\r\n .pipe(\r\n filter(event => event instanceof ActivationEnd)\r\n )\r\n .subscribe((event: ActivationEnd) => {\r\n if (event.snapshot.data?.title) {\r\n this.setTitle(event.snapshot.data?.title);\r\n }\r\n })\r\n );\r\n\r\n if (this.featureSettingsStoreService.state.enableUpdateChecksForNewContent) {\r\n this.subscriptions.add(\r\n this.router.events.pipe(\r\n filter(event => event instanceof NavigationEnd),\r\n mergeMap((event: NavigationEnd) => {\r\n return this.updatedContentService.onNavigationEnd(event);\r\n }))\r\n .subscribe(() => {\r\n console.log('checked');\r\n })\r\n );\r\n }\r\n\r\n if (this.featureSettingsStoreService.state.enableFirstDayPopupDialog) {\r\n this.subscriptions.add(\r\n this.userService\r\n .getOrCreateMe()\r\n .subscribe(user => {\r\n if (user.FirstDayWizardStep === FirstDayWizardStep.None) {\r\n if (!this.firstDayDialogRef) {\r\n this.firstDayDialogRef = this.dialog.open(FirstDayDialogComponent, {\r\n minWidth: '50vw',\r\n panelClass: 'first-day-dialog-container',\r\n autoFocus: true,\r\n disableClose: true,\r\n closeOnNavigation: false,\r\n });\r\n }\r\n }\r\n })\r\n );\r\n }\r\n\r\n if (this.featureSettingsStoreService.state.enableSignalR) {\r\n this.subscriptions.add(\r\n this.signalRService\r\n .connect()\r\n .subscribe((connection) => {\r\n connection.on('UpdateComponentState', (componentState: ComponentState) => {\r\n if (componentState) {\r\n this.componentStateService.updateStates(new ComponentState(componentState));\r\n }\r\n });\r\n })\r\n );\r\n }\r\n\r\n this.subscriptions.add(\r\n this.userChannelService\r\n .syncUserChannels(this.platformLocation.pathname)\r\n .subscribe()\r\n );\r\n\r\n if (this.featureSettingsStoreService.state.enableAutoUserChannelSync) {\r\n this.subscriptions.add(\r\n this.userChannelService\r\n .syncUserChannelsWithAD(this.platformLocation.pathname)\r\n .subscribe()\r\n );\r\n }\r\n\r\n if (this.featureSettingsStoreService.state.enableAutoUserLanguageSync) {\r\n this.subscriptions.add(\r\n this.userLanguageTermService\r\n .syncUserLanguageTermsWithAD(this.platformLocation.pathname)\r\n .subscribe()\r\n );\r\n }\r\n\r\n if (this.featureSettingsStoreService.state.enableIosA2hsBanner && this.platform.IOS && Utilities.isSafari(this.window) && !this.isInStandAloneMode() && !this.hasUserClosedBanner()) {\r\n this.dialog.open(IosPwaBannerComponent, {\r\n minWidth: '80vw',\r\n panelClass: 'ios-banner-day-dialog-container',\r\n closeOnNavigation: true,\r\n hasBackdrop: false,\r\n position: { bottom: '1rem' }\r\n });\r\n }\r\n\r\n }\r\n\r\n private setTitle(title: string) {\r\n if (title?.length > 0) {\r\n this.titleService.setTitle(`${this.featureSettingsStoreService.state.title} - ${title}`);\r\n } else {\r\n this.titleService.setTitle(this.featureSettingsStoreService.state.title);\r\n }\r\n }\r\n private isInStandAloneMode() {\r\n return ('standalone' in this.window.navigator && this.window.navigator['standalone'] === true) || this.breakpointObserver.isMatched('(display-mode: standalone)');\r\n }\r\n\r\n // Check if user has closed ios banner previously, use cookie because of simplicity and our cache gets clered on every application update.\r\n private hasUserClosedBanner() {\r\n return document.cookie.split(';').some(item => item.indexOf(Constants.IOS_BANNER_CLOSED_COOKIE) >= 0);\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.subscriptions.unsubscribe();\r\n }\r\n}\r\n@NgModule({\r\n declarations: [\r\n MainComponent,\r\n ],\r\n exports: [MainComponent],\r\n imports: [\r\n CommonModule,\r\n RouterModule,\r\n BroadcastsModule,\r\n MatSidenavModule,\r\n FooterModule,\r\n TopnavModule,\r\n MatButtonModule,\r\n TopnavBroadcastsModule,\r\n MatProgressSpinnerModule,\r\n LinkModule,\r\n FirstDayDialogModule,\r\n AlertTemplatesModule,\r\n StickyFillModule,\r\n IosPwaBannerModule,\r\n SkipLinksModule\r\n ]\r\n})\r\nexport class MainModule { }\r\n","import { CommonModule } from '@angular/common';\r\nimport { HttpClientModule, HTTP_INTERCEPTORS } from '@angular/common/http';\r\nimport { APP_INITIALIZER, ModuleWithProviders, NgModule, Optional, SkipSelf } from '@angular/core';\r\nimport { AppComponent } from '@app/app.component';\r\nimport { AuthInterceptor } from '@app/common/auth-interceptor';\r\nimport { RefreshPromptDialogModule } from '@app/components/refresh-prompt-dialog/refresh-prompt-dialog.component';\r\nimport { WindowModule } from '@app/modules/window/window.module';\r\nimport { AppInitService } from '@app/services/app-init.service';\r\nimport { MainModule } from '@app/views/main/main.component';\r\nimport { RouterModule } from '@angular/router';\r\n\r\n@NgModule({\r\n declarations: [\r\n AppComponent,\r\n ],\r\n imports: [\r\n HttpClientModule,\r\n CommonModule,\r\n WindowModule,\r\n MainModule,\r\n RefreshPromptDialogModule,\r\n RouterModule\r\n ],\r\n exports: [\r\n AppComponent,\r\n ]\r\n})\r\nexport class WorkplaceAppModule {\r\n constructor(@Optional() @SkipSelf() parentModule: WorkplaceAppModule) {\r\n if (parentModule) {\r\n throw new Error(\r\n 'WorkplaceAppModule is already loaded. Import it in the AppModule only');\r\n }\r\n }\r\n\r\n static forRoot(): ModuleWithProviders {\r\n return {\r\n ngModule: WorkplaceAppModule,\r\n providers: [\r\n [{\r\n provide: HTTP_INTERCEPTORS, useClass: AuthInterceptor, multi: true\r\n }],\r\n {\r\n provide: APP_INITIALIZER,\r\n multi: true,\r\n deps: [AppInitService],\r\n useFactory: initAndAuthenticate\r\n }\r\n ]\r\n };\r\n }\r\n}\r\n\r\nexport function initAndAuthenticate(appInitService: AppInitService) {\r\n return (): Promise => {\r\n return appInitService.init();\r\n };\r\n}\r\n","\r\n\r\n","import { DOCUMENT } from '@angular/common';\r\nimport { Component, Inject, LOCALE_ID, OnDestroy, OnInit, Renderer2 } from '@angular/core';\r\nimport { MatDialog } from '@angular/material/dialog';\r\nimport { NavigationCancel, NavigationError, Router } from '@angular/router';\r\nimport { RefreshPromptDialogComponent } from '@app/components/refresh-prompt-dialog/refresh-prompt-dialog.component';\r\nimport { CacheService } from '@app/services/cache.service';\r\nimport { GITVERSION } from '@environments/git-version';\r\nimport { Subscription } from 'rxjs';\r\nimport { filter } from 'rxjs/operators';\r\nimport { Utilities } from '@app/common/utilities';\r\nimport { WINDOW } from '@app/common/app-tokens';\r\nimport { MatSnackBar } from '@angular/material/snack-bar';\r\nimport { AlertTemplatesComponent } from '@app/components/alert-templates/alert-templates.component';\r\n\r\n@Component({\r\n selector: 'app-root',\r\n templateUrl: './app.component.html',\r\n styleUrls: ['./app.component.scss']\r\n})\r\nexport class AppComponent implements OnInit, OnDestroy {\r\n private subscriptions = new Subscription();\r\n shouldLoadMainComponent = true;\r\n\r\n constructor(@Inject(LOCALE_ID) private localeId: string,\r\n @Inject(DOCUMENT) private document: Document,\r\n @Inject(WINDOW) private window: Window,\r\n private renderer: Renderer2,\r\n private cacheService: CacheService,\r\n private router: Router,\r\n private snackBar: MatSnackBar,\r\n private dialog: MatDialog) {\r\n if (this.localeId) {\r\n const twoLetterLangCode = localeId.split('-')[0];\r\n this.renderer.setAttribute(this.document.body.parentElement, 'lang', twoLetterLangCode);\r\n }\r\n\r\n this.clearCacheIfAppWasUpdated();\r\n this.shouldLoadMainComponent = Utilities.shouldLoadMain(this.window);\r\n }\r\n\r\n private clearCacheIfAppWasUpdated() {\r\n // Get currently stored version from cache\r\n const currentStoredVersion = this.cacheService.get(GITVERSION.hash);\r\n if (!currentStoredVersion) {\r\n // If we dont have an entry for the stored version we set the current version.\r\n this.cacheService.clearPersistentCacheFromCoreWP();\r\n this.cacheService.set(GITVERSION.hash, GITVERSION);\r\n } else {\r\n // If we have an entry for the version we compare it to the current version\r\n if (GITVERSION.hash !== currentStoredVersion.hash) {\r\n // If the current version differs from the stored version we clear the cache update the entry with the current version\r\n this.cacheService.clearPersistentCacheFromCoreWP();\r\n this.cacheService.set(GITVERSION.hash, GITVERSION);\r\n } else {\r\n this.cacheService.removeAllExpiredItemsInPersistentCache();\r\n }\r\n }\r\n }\r\n\r\n ngOnInit(): void {\r\n this.subscriptions.add(\r\n this.router.events\r\n .pipe(\r\n filter((e): e is NavigationError | NavigationCancel => e instanceof NavigationError || e instanceof NavigationCancel))\r\n .subscribe((e) => {\r\n if (e instanceof NavigationError) {\r\n if (e?.error?.name === 'ChunkLoadError') {\r\n // ChunkLoadError indicates that we cant load a lazy loaded module for instance\r\n // Show dialog, prompting for refresh. Could be network/server issue\r\n this.dialog.open(RefreshPromptDialogComponent);\r\n }\r\n }\r\n if (e instanceof NavigationCancel) {\r\n if (e?.reason === '') {\r\n // When we've lost connection to the server it seems that navigation events gets cancelled with no reason. So we try and catch these.\r\n // Show dialog, prompting for refresh. Could be network/server issue\r\n this.dialog.open(RefreshPromptDialogComponent);\r\n }\r\n if (e?.reason.indexOf('unlicensed') >= 0) {\r\n Utilities.openSnackBar(this.snackBar, AlertTemplatesComponent, AlertTemplatesComponent.unlicensed);\r\n }\r\n }\r\n }));\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.subscriptions.unsubscribe();\r\n }\r\n}\r\n","export class ManagedPropertyConfig {\r\n newsChannelManagedProperty: string;\r\n newsLanguageManagedProperty: string;\r\n newsIsTopNewsManagedProperty: string;\r\n newsAmountOfCommentsManagedProperty: string;\r\n newsAmountOfLikesManagedProperty: string;\r\n birthDayDateManagedProperty: string;\r\n newsSenderTagsManagedProperty: string;\r\n}\r\n\r\nexport class ManagedProperties {\r\n public static DefaultConfig: ManagedPropertyConfig = {\r\n newsChannelManagedProperty: 'RefinableString20', // Maps to ows_taxId_BoolField_Channel\r\n\r\n newsLanguageManagedProperty: 'RefinableString21', // Maps to ows_taxId_BoolField_Language\r\n\r\n newsIsTopNewsManagedProperty: 'BoolFieldNewsIsTopNewsOWSBOOL', // Maps to ows_q_BOOL_BoolField_NewsIsTopNews\r\n\r\n newsAmountOfCommentsManagedProperty: 'RefinableInt00', // Maps to ows__CommentCount\r\n\r\n newsAmountOfLikesManagedProperty: 'RefinableInt01', // Maps to ows__LikeCount\r\n\r\n birthDayDateManagedProperty: 'RefinableDate19', // Maps to People:SPS-Birthday\r\n\r\n newsSenderTagsManagedProperty: 'RefinableString22' // Maps to ows_taxId_BoolField_SenderTag\r\n };\r\n}\r\n","import { Configuration } from '@azure/msal-browser';\r\n\r\nexport interface MsalAngularConfiguration extends Configuration {\r\n loginHint?: string;\r\n domainHint?: string;\r\n tenant?: string;\r\n extraQueryParameters?: { [key: string]: string };\r\n protectedResourceScopeMap?: [string, string[]][] | Map>;\r\n useRedirect?: boolean;\r\n}\r\n\r\nexport const DefaultProtectedResourceScopesMap: [string, string[]][] = [\r\n ['https://graph.microsoft.com', ['https://graph.microsoft.com/.default']], // Graph\r\n ['https://graph.windows.net', ['https://graph.windows.net/.default']], // old Graph\r\n ['/api/v1/', ['dcad865d-9257-4521-ad4d-bae3e137b345/.default']], // SPHome\r\n ['https://api.powerbi.com', ['https://analysis.windows.net/powerbi/api/.default']] // PowerBI\r\n];\r\n","import { NavigationMode } from '@app/common/navigation-mode.';\r\nimport { CafcassEnvironment } from './cafcassEnvironment';\r\nimport { NewsModeFeaturedNews, NewsModePersonalNews } from '@app/common/news-mode';\r\nimport { ManagedProperties } from '@app/common/managed-property-config';\r\nimport { TrendingResult } from '@app/common/trending-result';\r\nimport { AuthorizationMode } from '@app/common/authorization-mode';\r\nimport { DefaultProtectedResourceScopesMap } from '@app/common/msal-angular-configuration';\r\n\r\n// This file can be replaced during build by using the `fileReplacements` array.\r\n// `ng build ---prod` replaces `environment.ts` with `environment.prod.ts`.\r\n// The list of file replacements can be found in `angular.json`.\r\n\r\n// Booldev CoreIntranet\r\nexport const environment: CafcassEnvironment = {\r\n production: true,\r\n name: 'test',\r\n tenantHostUrl: 'https://cafcass.sharepoint.com',\r\n coreWorkplaceSiteUrl: 'https://cafcass.sharepoint.com/sites/Workplace',\r\n msalConfig: {\r\n tenant: 'cafcass.onmicrosoft.com',\r\n auth: {\r\n clientId: 'e0fcad00-54ac-4f1f-b56b-4884c13ffa4e',\r\n authority: 'https://login.microsoftonline.com/cafcass.onmicrosoft.com',\r\n },\r\n protectedResourceScopeMap: [\r\n ...DefaultProtectedResourceScopesMap,\r\n [`/api/`, [`e0fcad00-54ac-4f1f-b56b-4884c13ffa4e/.default`]],\r\n ['https://cafcass.sharepoint.com', ['https://cafcass.sharepoint.com/.default']],\r\n ],\r\n useRedirect : true\r\n },\r\n authorizationMode: AuthorizationMode.Claims,\r\n blogSiteUrl: 'https://cafcass.sharepoint.com/sites/blogs-test', // The URL to Cafcass blog site.\r\n complimentsWallSiteUrl: 'https://cafcass.sharepoint.com/sites/compliments-test', // The URL to Cafcass Compliments Wall site.\r\n featureSettings: {\r\n workplaceName: 'Cafcass',\r\n gaTrackingKey: '',\r\n appInsightsTrackingKey: '70a8f25e-326d-4e19-ad98-a188c967b10b',\r\n navigationMode: NavigationMode.HubSite,\r\n newsCenterSiteUrl: 'https://cafcass.sharepoint.com/sites/Workplace-test',\r\n newsModeFeaturedNews: NewsModeFeaturedNews.GraphFromNewsCenterSite,\r\n newsModePersonalNews: NewsModePersonalNews.GraphFromNewsCenterSite,\r\n excludeSitesFromNewsSearch: ['https://cafcass.sharepoint.com/sites/blogs-test', 'https://cafcass.sharepoint.com/sites/compliments-test'],\r\n showDescriptionInSearchResult: true,\r\n trendingResult: TrendingResult.Modern,\r\n newsArchiveLink: '',\r\n sharePointNewsCenterUrl: 'https://cafcass.sharepoint.com/sites/Workplace-test',\r\n showNewOrModifiedbadgeOnAppTile: true,\r\n managedPropertyConfig: ManagedProperties.DefaultConfig,\r\n redirectToTeamsByDefault: true,\r\n enableRequiredReading: true,\r\n prefixToO365Groups: '',\r\n myColleagueRootTerm: 'd98acfac-21d2-4957-8f38-22d178dc8ec4',\r\n myColleaguesShowOrgChart: true,\r\n enableRightSection: true,\r\n allowMarkAsReadFromReqReadList: true,\r\n chartsBackground: ['#cc2e64', '#0C7191', '#C7DAEA', '#b300b3', '#ff6666', '#ff9933', '#3366ff', '#80ff00', '#3366ff', '#ffbb33'],\r\n colleagueProperties: {\r\n Property1: {\r\n Label: 'Job Title',\r\n Name: 'jobTitle'\r\n },\r\n Property2: {\r\n Label: 'City',\r\n Name: 'City'\r\n }\r\n },\r\n showBirthdayCalendar: true,\r\n showRestaurantMenus: true,\r\n useGraphToExtendPeopleSearch: true,\r\n customSearchResult: {\r\n Title: 'Offices',\r\n Query: 'AND SiteName:https://cafcass.sharepoint.com/sites/offices-test AND contentclass:STS_List AND ((ContentTypeId:0x0101009D1CB255DA76424F860D91F20E6C4118* AND PromotedState:0) OR (ContentTypeId:0x010100C568DB52D9D0A14D9B2FDCC96666E9F2007948130EC3DB064584E219954237AF39*))',\r\n SelectProperties: ['Title', 'Path', 'SiteTitle', 'Description', 'LastModifiedTime'],\r\n ResultIcon: 'ms-Icon ms-Icon--CityNext'\r\n },\r\n myDetailsMsGraphProperties: [\r\n 'id',\r\n 'displayName',\r\n 'mail',\r\n 'assignedPlans',\r\n 'assignedLicenses',\r\n 'city',\r\n 'country',\r\n 'jobTitle',\r\n 'state',\r\n 'department',\r\n 'companyName',\r\n 'officeLocation',\r\n 'userPrincipalName',\r\n 'mobilePhone',\r\n 'extension_bb58b85a3e724127a95e0a4bd0d557b8_extensionAttribute13'\r\n ],\r\n myColleagueNumberOfGraphResultsCap: 60,\r\n enableIosA2hsBanner: true,\r\n showPowerBIComponent: true,\r\n disableLocalStorage: true,\r\n requireChannelSelectionForPowerBIVisuals: true,\r\n enableAzureADGroupSync: true,\r\n calendarPageInfoUrl: 'https://cafcass.sharepoint.com/sites/diversity/SitePages/Equality,-diversity-and-inclusion-calendar.aspx',\r\n },\r\n};\r\n","import { Inject, Injectable } from '@angular/core';\r\nimport { Title } from '@angular/platform-browser';\r\nimport { NavigationEnd, NavigationError, NavigationStart, Router } from '@angular/router';\r\nimport { CUSTOMERENVIRONMENT } from '@app/common/app-tokens';\r\nimport { Constants } from '@app/common/constants';\r\nimport { TrackingEvent } from '@app/models/tracking-event';\r\nimport { FeatureSettingsStoreService } from '@app/services/feature-settings-store.service';\r\nimport { UserChannelTermsService } from '@app/services/user-channel-terms.service';\r\nimport { BaseTrackingService } from '@app/tracking/base-tracking.service';\r\nimport { Environment } from '@environments/interface.environment';\r\nimport { ApplicationInsights } from '@microsoft/applicationinsights-web';\r\nimport { Subscription } from 'rxjs';\r\nimport { filter } from 'rxjs/operators';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class AppInsightsService implements BaseTrackingService {\r\n\r\n appInsights: ApplicationInsights;\r\n routerSubscription: Subscription;\r\n loadStartTime: number;\r\n loadTime: number;\r\n\r\n constructor(@Inject(CUSTOMERENVIRONMENT) private environment: Environment,\r\n private titleService: Title,\r\n private featureSettingsStoreService: FeatureSettingsStoreService,\r\n private router: Router,\r\n private userChannelTermsService: UserChannelTermsService) {\r\n if (this.featureSettingsStoreService.state.appInsightsTrackingKey) {\r\n this.appInsights = new ApplicationInsights({\r\n config: {\r\n instrumentationKey: this.featureSettingsStoreService.state.appInsightsTrackingKey,\r\n enableDebug: !this.environment.production\r\n }\r\n });\r\n\r\n this.appInsights.loadAppInsights();\r\n\r\n // push user channels to azure insight to use them later to plot a charts in editor dash board\r\n this.userChannelTermsService.getUserChannelTerms()\r\n .subscribe((channels) => {\r\n\r\n this.appInsights.trackEvent({\r\n name: Constants.TRACKING_EVENT_TYPE_WORKPLACE_USER_CHANNELS, properties: {\r\n channelTermId: channels.map(channel => channel.ChannelTermId),\r\n }\r\n });\r\n });\r\n\r\n // track router events\r\n this.router.events\r\n .pipe(\r\n filter(event => event instanceof NavigationStart))\r\n .subscribe(() => {\r\n this.loadStartTime = Date.now();\r\n this.loadTime = null;\r\n });\r\n\r\n this.router.events.pipe(\r\n filter(event => event instanceof NavigationError || event instanceof NavigationEnd))\r\n .subscribe(\r\n (event) => {\r\n this.loadTime = Date.now() - this.loadStartTime;\r\n this.loadStartTime = null;\r\n if (event instanceof NavigationEnd) {\r\n this.trackRouterEvent(event);\r\n }\r\n });\r\n }\r\n }\r\n\r\n public trackRouterEvent(event: NavigationEnd): void {\r\n if (this.appInsights) {\r\n const headerTitle = this.titleService.getTitle();\r\n this.appInsights.trackPageView({ uri: event.urlAfterRedirects, name: headerTitle, properties: { duration: this.loadTime } });\r\n }\r\n }\r\n\r\n trackEvent(event: TrackingEvent): void {\r\n if (this.appInsights) {\r\n event.properties.currentRoute = this.router.url;\r\n this.appInsights.trackEvent({ name: event.name, properties: event.properties });\r\n }\r\n }\r\n\r\n trackException(): void {\r\n throw new Error('Method not implemented.');\r\n }\r\n}\r\n","
\r\n\r\n \r\n \r\n Go to the news center\r\n \r\n \r\n \r\n Go to the news center\r\n \r\n \r\n \r\n\r\n
\r\n

Featured news

\r\n

Read the featured news from {{workplaceName}} today! When you click on a post, it will open in a new tab. You can navigate back here at any time by closing or switching the tab.

\r\n
\r\n\r\n
\r\n
\r\n
\r\n
\r\n\r\n \r\n
\r\n \"{{truncate(newsItem.Title)}}\"\r\n \r\n \r\n \"{{truncate(newsItem.Title)}}\"\r\n \r\n
\r\n
\r\n \r\n \r\n
\r\n
\r\n
\r\n
\r\n\r\n
\r\n \r\n
\r\n\r\n
\r\n
\r\n {{newsItem.PublishedDate | date}}\r\n 0) || (!newsItem.IsSharePointNews && newsItem.LikesCount > 0)\">\r\n \r\n {{newsItem.LikesCount}}\r\n \r\n 0) || (!newsItem.IsSharePointNews && newsItem.CommentsCount > 0)\">\r\n \r\n {{newsItem.CommentsCount}}\r\n \r\n
\r\n\r\n \r\n New\r\n

\r\n {{truncate(newsItem.Title)}}\r\n

\r\n
\r\n
\r\n
\r\n {{getSenderTagString(newsItem)}}\r\n
\r\n
\r\n\r\n
\r\n\r\n
\r\n\r\n
\r\n\r\n
\r\n \r\n
\r\n\r\n
\r\n
\r\n {{newsItem.PublishedDate | date}}\r\n 0)\">\r\n \r\n {{newsItem.LikesCount}}\r\n \r\n 0)\">\r\n \r\n {{newsItem.CommentsCount}}\r\n \r\n
\r\n\r\n \r\n New\r\n

\r\n {{truncate(newsItem.Title)}}\r\n

\r\n
\r\n\r\n
\r\n \r\n {{newsItem.Description}}\r\n \r\n
\r\n \r\n \r\n Open this page in sharepoint\r\n \r\n \r\n
\r\n\r\n
\r\n\r\n
\r\n
\r\n \r\n

No featured news could be found.

\r\n
\r\n
\r\n
\r\n
\r\n
\r\n \r\n
\r\n \r\n \r\n \r\n
\r\n
\r\n\r\n
amountOfNewsToDisplayCurrently && !loading && numberOfShowMoreClicks < maxNumberOfShowMore else linkToNewsCenter\">\r\n
\r\n \r\n
\r\n
\r\n
amountOfNewsToDisplayCurrently && !loading && numberOfShowMoreClicks === maxNumberOfShowMore\">\r\n
\r\n \r\n
\r\n
\r\n\r\n \r\n
\r\n For older news, open News Center\r\n For older news, open News Center\r\n
\r\n
\r\n\r\n
\r\n
\r\n\r\n
\r\n","import { BreakpointObserver, Breakpoints, BreakpointState } from '@angular/cdk/layout';\r\nimport { CommonModule, DOCUMENT } from '@angular/common';\r\nimport { ChangeDetectionStrategy, Component, ElementRef, Inject, Input, NgModule, OnDestroy, OnInit, Optional } from '@angular/core';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { Router } from '@angular/router';\r\nimport { CUSTOMERENVIRONMENT } from '@app/common/app-tokens';\r\nimport { Utilities } from '@app/common/utilities';\r\nimport { ActionLinkModule } from '@app/components/actions/action-link/action-link.component';\r\nimport { ActionRouterLinkModule } from '@app/components/actions/action-router-link/action-router-link.component';\r\nimport { ErrorTemplatesModule } from '@app/components/error-templates/error-templates.component';\r\nimport { TextPlaceholderModule } from '@app/components/text-placeholder/text-placeholder.component';\r\nimport { WidgetPlaceholderModule } from '@app/components/widget-placeholder/widget-placeholder.component';\r\nimport { ImgSrcProxyModule } from '@app/directives/img-src-proxy.directive';\r\nimport { NewsPage } from '@app/models/news-page';\r\nimport { LinkModule } from '@app/directives/link.directive';\r\nimport { ComponentStatesOnRoutesService } from '@app/services/component-states-on-routes.service';\r\nimport { FeatureSettingsStoreService } from '@app/services/feature-settings-store.service';\r\nimport { LicenseService } from '@app/services/license.service';\r\nimport { NewsService } from '@app/services/news.service';\r\nimport { UserLanguageTermService } from '@app/services/user-language-term.service';\r\nimport { Environment } from '@environments/interface.environment';\r\nimport { forkJoin, Observable, of, Subject, Subscription } from 'rxjs';\r\nimport { catchError, map, mergeMap, startWith, switchMap, tap } from 'rxjs/operators';\r\nimport { trigger, style, transition, animate } from '@angular/animations';\r\nimport { BaseTrackingService } from '@app/tracking/base-tracking.service';\r\nimport { TrackingEvent } from '@app/models/tracking-event';\r\nimport { Constants } from '@app/common/constants';\r\n\r\n@Component({\r\n selector: 'app-featured-news',\r\n templateUrl: './featured-news.component.html',\r\n styleUrls: ['./featured-news.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n animations: [\r\n trigger('slideInOut', [\r\n transition(':enter', [\r\n style({ transform: 'translateY(70%)' }),\r\n animate('200ms ease-in', style({ transform: 'translateY(0)' } )),\r\n ]),\r\n transition(':leave', [\r\n animate('200ms ease-out', style({ transform: 'translateY(100%)' }))\r\n ])\r\n ])\r\n ]\r\n})\r\nexport class FeaturedNewsComponent implements OnInit, OnDestroy {\r\n\r\n @Input() amountOfDaysBackInTime = 365;\r\n @Input() amountOfNewsToDisplay = 0;\r\n @Input() titleMaxLength = 60;\r\n @Input() maxNumberOfShowMore = 2; // How may times can you press the show more button\r\n\r\n fetchedAmountOfNews = 0;\r\n amountOfNewsToIncreaseWith = this.amountOfNewsToDisplay;\r\n newsCenterUrl: string;\r\n amountOfNewsToDisplayCurrently: number;\r\n featuredNewsItems$: Observable>;\r\n loading = false;\r\n private moreNewsSubject = new Subject();\r\n private errorSubject$ = new Subject();\r\n featureSettings = this.featureSettingsStoreService.state;\r\n objectFitFallback = false;\r\n fetchFromGraph = true;\r\n isUserLicensed$: Observable;\r\n workplaceName: string;\r\n numberOfShowMoreClicks = 0;\r\n showNewsDesc = this.featureSettingsStoreService.state.showNewsDescription;\r\n isQuickView = false;\r\n amountOfNewsToDisplayConfigured = this.amountOfNewsToDisplay > 0;\r\n subscription: Subscription;\r\n componentName = 'Featured news';\r\n\r\n constructor(@Inject(CUSTOMERENVIRONMENT) private environment: Environment,\r\n @Inject(DOCUMENT) private document: Document,\r\n private service: NewsService,\r\n private router: Router,\r\n private componentEventService: ComponentStatesOnRoutesService,\r\n private featureSettingsStoreService: FeatureSettingsStoreService,\r\n public elementRef: ElementRef,\r\n private licenseService: LicenseService,\r\n private userLanguageTermService: UserLanguageTermService,\r\n private breakpointObserver: BreakpointObserver,\r\n @Optional() private trackingService?: BaseTrackingService) {\r\n this.workplaceName = this.featureSettingsStoreService.state.workplaceName;\r\n }\r\n\r\n ngOnInit() {\r\n // Vary amount of news to load based on screen size to ensure display is even\r\n this.subscription = this.breakpointObserver.observe([Breakpoints.Medium, Breakpoints.Large, Breakpoints.XLarge])\r\n .subscribe((state: BreakpointState) => {\r\n if (!this.amountOfNewsToDisplayConfigured) { // amountOfNewsToDisplay is not configured by customers\r\n if (state.breakpoints[Breakpoints.Medium]) {\r\n this.amountOfNewsToDisplay = 3;\r\n this.amountOfNewsToDisplayCurrently = this.amountOfNewsToDisplay;\r\n this.moreNewsSubject.next(this.amountOfNewsToDisplayCurrently + 1);\r\n } else {\r\n this.amountOfNewsToDisplay = 4;\r\n this.amountOfNewsToDisplayCurrently = this.amountOfNewsToDisplay;\r\n this.moreNewsSubject.next(this.amountOfNewsToDisplayCurrently + 1);\r\n }\r\n } else {\r\n this.amountOfNewsToDisplayCurrently = this.amountOfNewsToDisplay;\r\n this.moreNewsSubject.next(this.amountOfNewsToDisplayCurrently + 1);\r\n }\r\n\r\n this.amountOfNewsToIncreaseWith = this.amountOfNewsToDisplay;\r\n });\r\n\r\n this.newsCenterUrl = `${this.featureSettingsStoreService.state.newsArchiveLink}`;\r\n this.amountOfNewsToDisplayCurrently = this.amountOfNewsToDisplay;\r\n\r\n const componentEvent = this.componentEventService.state.RouteMap.has(this.router.url) && this.componentEventService.state.RouteMap.get(this.router.url).find(x => x.ComponentId === this.elementRef.nativeElement.localName);\r\n const componentEventData = componentEvent ? componentEvent.Data as Array : undefined;\r\n\r\n if ('objectFit' in this.document.documentElement.style === false) {\r\n this.objectFitFallback = true;\r\n }\r\n\r\n const subjectsToListenOn$ = this.moreNewsSubject\r\n .pipe(map((amount) => {\r\n this.service.reloadAllTopNews();\r\n return Number.isInteger(amount) ? Number(amount) : this.amountOfNewsToDisplayCurrently + 1;\r\n }));\r\n\r\n this.featuredNewsItems$ = subjectsToListenOn$\r\n .pipe(\r\n startWith(this.amountOfNewsToDisplayCurrently + 1),\r\n switchMap((amount) => {\r\n this.loading = true;\r\n const userLanguageTerms$ = this.userLanguageTermService.getUserLanguageTerms();\r\n if (this.environment.enableWorkplaceLight) {\r\n // Workplace light enabled\r\n return this.licenseService.hasUserAny365License()\r\n .pipe(\r\n mergeMap(licensed => {\r\n if (licensed) {\r\n // Workplace light + SharePoint licensed\r\n return forkJoin([\r\n this.service.getTopNewsFromApi(amount, userLanguageTerms$),\r\n this.service.getModernTopNewsFromGraph(amount, userLanguageTerms$)\r\n ])\r\n .pipe(\r\n map(([apiItems, graphItems]) => {\r\n // Concat the results from sharepoint + api and resort them, the dates seem to still be strings so we have to parse them again\r\n return apiItems.concat(graphItems).sort((a, b) => new Date(b.PublishedDate).getTime() - new Date(a.PublishedDate).getTime());\r\n })\r\n );\r\n } else {\r\n // Only Workplace Light\r\n return this.service.getTopNewsFromApi(amount, userLanguageTerms$);\r\n }\r\n })\r\n );\r\n } else {\r\n // Only SharePoint\r\n return this.service.getModernTopNewsFromGraph(amount, userLanguageTerms$);\r\n }\r\n }),\r\n map(pages => {\r\n this.fetchedAmountOfNews = pages.length;\r\n if (this.fetchedAmountOfNews > this.amountOfNewsToDisplayCurrently) {\r\n pages = pages.slice(0, this.amountOfNewsToDisplayCurrently);\r\n }\r\n return pages.map(page => {\r\n if (componentEventData) {\r\n const foundNewsPage = componentEventData.find(ced => ced.Path === page.Path);\r\n if (foundNewsPage) {\r\n page.ShowNewOrModifiedBadge = true;\r\n }\r\n } else {\r\n page.ShowNewOrModifiedBadge = false;\r\n }\r\n return page;\r\n });\r\n }),\r\n tap(() => {\r\n this.loading = false;\r\n }),\r\n catchError(err => {\r\n this.errorSubject$.next(err);\r\n return of(null);\r\n }));\r\n }\r\n\r\n setFallBackStyle(newsItem: HTMLImageElement) {\r\n if (this.objectFitFallback) {\r\n newsItem.parentElement.style.backgroundImage = `url(${newsItem.src})`;\r\n newsItem.parentElement.style.backgroundSize = `cover`;\r\n newsItem.parentElement.style.backgroundPosition = `50% 50%`;\r\n return {\r\n 'display': `none`\r\n };\r\n }\r\n }\r\n\r\n truncate(text: string) {\r\n return Utilities.truncate(text, this.titleMaxLength);\r\n }\r\n\r\n showMoreNews() {\r\n this.numberOfShowMoreClicks++;\r\n this.amountOfNewsToDisplayCurrently = this.amountOfNewsToDisplayCurrently + this.amountOfNewsToIncreaseWith;\r\n this.moreNewsSubject.next(this.amountOfNewsToDisplayCurrently + 1);\r\n }\r\n\r\n showLessNews() {\r\n this.numberOfShowMoreClicks = 0;\r\n this.amountOfNewsToDisplayCurrently = this.amountOfNewsToDisplay;\r\n this.moreNewsSubject.next(this.amountOfNewsToDisplayCurrently + 1);\r\n this.scrollIntoFeatureView();\r\n }\r\n\r\n scrollIntoFeatureView() {\r\n const elementId = 'app-featured-news';\r\n const element = this.document.getElementById(elementId);\r\n\r\n if (element) {\r\n if (!/^(?:a|select|input|button|textarea)$/i.test(element.tagName)) {\r\n element.scrollIntoView();\r\n }\r\n element.focus();\r\n }\r\n }\r\n\r\n showNewsDescription(newsItem: NewsPage) {\r\n if (newsItem.hide !== undefined) {\r\n newsItem.hide = !newsItem.hide;\r\n } else {\r\n newsItem.hide = true;\r\n if (this.trackingService && this.trackingService.trackEvent) {\r\n const trackingEvent = new TrackingEvent({\r\n name: Constants.TRACKING_EVENT_TYPE_NEWS_DESCR_CLICK,\r\n properties: {\r\n href: newsItem.Path,\r\n label: newsItem.Title,\r\n componentId: this.elementRef.nativeElement.localName\r\n }\r\n });\r\n this.trackingService.trackEvent(trackingEvent);\r\n }\r\n }\r\n }\r\n\r\n getSenderTagString(newsItem: NewsPage) {\r\n return Utilities.getSenderTagString(newsItem);\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.subscription?.unsubscribe();\r\n }\r\n}\r\n@NgModule({\r\n declarations: [FeaturedNewsComponent],\r\n exports: [\r\n FeaturedNewsComponent\r\n ],\r\n imports: [\r\n CommonModule,\r\n ImgSrcProxyModule,\r\n ActionLinkModule,\r\n ActionRouterLinkModule,\r\n TextPlaceholderModule,\r\n ErrorTemplatesModule,\r\n WidgetPlaceholderModule,\r\n MatButtonModule,\r\n LinkModule,\r\n ]\r\n})\r\nexport class FeaturedNewsModule { }\r\n","
\r\n
\r\n
\r\n
\r\n
\r\n \r\n
\r\n \"{{newsItem.Title}}\"\r\n \r\n \r\n \"{{newsItem.Title}}\"\r\n \r\n
\r\n
\r\n
\r\n \r\n
\r\n
\r\n
\r\n \r\n
\r\n
\r\n
\r\n \r\n \r\n \r\n \r\n
\r\n
\r\n {{newsItem.PublishedDate | date}}\r\n \r\n 0)\">\r\n \r\n {{pageInfo.LikesCount}}\r\n \r\n 0)\">\r\n \r\n {{pageInfo.CommentsCount}}\r\n \r\n \r\n \r\n 0) || (!newsItem.IsSharePointNews && newsItem.LikesCount > 0)\">\r\n \r\n {{newsItem.LikesCount}}\r\n \r\n 0 || (!newsItem.IsSharePointNews && newsItem.CommentsCount > 0))\">\r\n \r\n {{newsItem.CommentsCount}}\r\n \r\n \r\n \r\n 0\" (click)=\"showChannelTagsPrintoutClick(newsItem)\" title=\"{{getChannelsString(newsItem)}}\">\r\n \r\n \r\n
\r\n \r\n
\r\n \r\n \r\n \r\n \r\n {{getChannelsString(newsItem)}}\r\n
\r\n \r\n

{{truncate(newsItem.Title)}}

\r\n
\r\n
\r\n
\r\n {{getSenderTagString(newsItem)}}\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n \r\n
\r\n \r\n
\r\n
\r\n \r\n {{truncate(newsItem.Description, 180)}}\r\n \r\n
\r\n \r\n \r\n Open this page in sharepoint\r\n \r\n \r\n
\r\n
\r\n
\r\n
\r\n
\r\n\r\n","import { CommonModule, DOCUMENT } from '@angular/common';\r\nimport { Component, Inject, Input, NgModule, OnInit, Optional, ElementRef } from '@angular/core';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { Utilities } from '@app/common/utilities';\r\nimport { ActionLinkModule } from '@app/components/actions/action-link/action-link.component';\r\nimport { ErrorTemplatesModule } from '@app/components/error-templates/error-templates.component';\r\nimport { TextPlaceholderModule } from '@app/components/text-placeholder/text-placeholder.component';\r\nimport { WidgetPlaceholderModule } from '@app/components/widget-placeholder/widget-placeholder.component';\r\nimport { ImgSrcProxyModule } from '@app/directives/img-src-proxy.directive';\r\nimport { NewsPage } from '@app/models/news-page';\r\nimport { LinkModule } from '@app/directives/link.directive';\r\nimport { FeatureSettingsStoreService } from '@app/services/feature-settings-store.service';\r\nimport { BaseTrackingService } from '@app/tracking/base-tracking.service';\r\nimport { TrackingEvent } from '@app/models/tracking-event';\r\nimport { Constants } from '@app/common/constants';\r\nimport { trigger, transition, style, animate } from '@angular/animations';\r\n\r\n@Component({\r\n selector: 'app-news-card-list',\r\n templateUrl: './news-card-list.component.html',\r\n styleUrls: ['./news-card-list.component.scss'],\r\n animations: [\r\n trigger('slideInOut', [\r\n transition(':enter', [\r\n style({ transform: 'translateY(100%)' }),\r\n animate('200ms ease-in', style({ transform: 'translateY(0)' })),\r\n ]),\r\n transition(':leave', [\r\n animate('200ms ease-out', style({ transform: 'translateY(100%)' }))\r\n ])\r\n ])\r\n ]\r\n})\r\nexport class NewsCardListComponent implements OnInit {\r\n @Input() personalNewsItems: Array;\r\n @Input() titleMaxLength = 70;\r\n featureSettings = this.featureStore.state;\r\n objectFitFallback = false;\r\n showNewsDesc = this.featureStore.state.showNewsDescription;\r\n isQuickView = false;\r\n showChannelTagsPrintout = {};\r\n\r\n constructor(@Inject(DOCUMENT) private document: Document,\r\n private featureStore: FeatureSettingsStoreService,\r\n public elementRef: ElementRef,\r\n @Optional() private trackingService?: BaseTrackingService) {\r\n }\r\n\r\n ngOnInit(): void {\r\n if ('objectFit' in this.document.documentElement.style === false) {\r\n this.objectFitFallback = true;\r\n }\r\n }\r\n\r\n setFallBackStyle(newsItem: HTMLImageElement) {\r\n if (this.objectFitFallback) {\r\n if (newsItem) {\r\n newsItem.parentElement.style.backgroundImage = `url(${newsItem.src})`;\r\n newsItem.parentElement.style.backgroundSize = `cover`;\r\n newsItem.parentElement.style.backgroundPosition = `50% 50%`;\r\n }\r\n return {\r\n 'display': `none`\r\n };\r\n }\r\n }\r\n\r\n showNewsDescription(newsItem: NewsPage) {\r\n if (newsItem.hide !== undefined) {\r\n newsItem.hide = !newsItem.hide;\r\n } else {\r\n newsItem.hide = true;\r\n if (this.trackingService && this.trackingService.trackEvent) {\r\n const trackingEvent = new TrackingEvent({\r\n name: Constants.TRACKING_EVENT_TYPE_NEWS_DESCR_CLICK,\r\n properties: {\r\n href: newsItem.Path,\r\n label: newsItem.Title,\r\n componentId: this.elementRef.nativeElement.localName\r\n }\r\n });\r\n this.trackingService.trackEvent(trackingEvent);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Creates a user friendly string by concatenting the news item channel labels\r\n * @param newsItem Newsitem to get channels from\r\n * @returns string for displaying the tags for users\r\n */\r\n getChannelsString(newsItem: NewsPage) {\r\n if (newsItem.Channels && newsItem.Channels.length) {\r\n let channelsString = '';\r\n for (let i = 0; i < newsItem.Channels.length; i++) {\r\n if (i > 0) {\r\n channelsString += ', ';\r\n }\r\n const channelName = newsItem.Channels[i].Label ? newsItem.Channels[i].Label : newsItem.Channels[i];\r\n channelsString += '#' + channelName;\r\n }\r\n return channelsString;\r\n }\r\n return null;\r\n }\r\n\r\n getSenderTagString(newsItem: NewsPage) {\r\n return Utilities.getSenderTagString(newsItem);\r\n }\r\n\r\n /**\r\n * Toggles if the news tags should be shown in the UI, needed since there is no title attribute on mobile devices\r\n * @param newsItem Newsitem to get channels from\r\n */\r\n showChannelTagsPrintoutClick(newsItem: NewsPage) {\r\n // Path is unique, no ID on the NewsPage object\r\n this.showChannelTagsPrintout[newsItem.Path] = !this.showChannelTagsPrintout[newsItem.Path];\r\n }\r\n\r\n truncate(text: string, length = this.titleMaxLength) {\r\n return Utilities.truncate(text, length);\r\n }\r\n}\r\n@NgModule({\r\n declarations: [\r\n NewsCardListComponent\r\n ],\r\n exports: [\r\n NewsCardListComponent\r\n ],\r\n imports: [\r\n CommonModule,\r\n LinkModule,\r\n ImgSrcProxyModule,\r\n ErrorTemplatesModule,\r\n TextPlaceholderModule,\r\n WidgetPlaceholderModule,\r\n ActionLinkModule,\r\n MatButtonModule,\r\n ]\r\n})\r\nexport class NewsCardListModule { }\r\n","
\r\n \r\n \r\n Go to the news center\r\n \r\n \r\n \r\n Go to the news center\r\n \r\n \r\n \r\n\r\n
\r\n \r\n
\r\n

Your news

\r\n

Here you'll find the latest posts in your personal feed. Update your selected channels on your settings page. When you click on a post, it will open in a new tab. You can navigate back here at any time by closing or switching the tab.

\r\n
\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

No news could be found according to your channel selections.

\r\n
\r\n
\r\n\r\n
\r\n
\r\n \r\n
\r\n
\r\n
\r\n
\r\n\r\n \r\n
\r\n \r\n
\r\n
\r\n\r\n
amountOfNewsToDisplayCurrently && !loading && numberOfShowMoreClicks < maxNumberOfShowMore else linkToNewsCenter\">\r\n
\r\n \r\n
\r\n
\r\n
amountOfNewsToDisplayCurrently && !loading && numberOfShowMoreClicks === maxNumberOfShowMore\">\r\n
\r\n \r\n
\r\n
\r\n\r\n \r\n
\r\n For older news, open News Center\r\n For older news, open News Center\r\n
\r\n
\r\n
\r\n","import { CommonModule, DOCUMENT } from '@angular/common';\r\nimport { ChangeDetectionStrategy, Component, Inject, Input, NgModule, OnInit } from '@angular/core';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { RouterModule } from '@angular/router';\r\nimport { CUSTOMERENVIRONMENT } from '@app/common/app-tokens';\r\nimport { NewsModePersonalNews } from '@app/common/news-mode';\r\nimport { ActionLinkModule } from '@app/components/actions/action-link/action-link.component';\r\nimport { ActionRouterLinkModule } from '@app/components/actions/action-router-link/action-router-link.component';\r\nimport { ErrorTemplatesModule } from '@app/components/error-templates/error-templates.component';\r\nimport { NewsCardListModule } from '@app/components/news-card-list/news-card-list.component';\r\nimport { TextPlaceholderModule } from '@app/components/text-placeholder/text-placeholder.component';\r\nimport { WidgetPlaceholderModule } from '@app/components/widget-placeholder/widget-placeholder.component';\r\nimport { NewsPage } from '@app/models/news-page';\r\nimport { User } from '@app/models/user';\r\nimport { UserLanguageTerm } from '@app/models/user-language-term';\r\nimport { LinkModule } from '@app/directives/link.directive';\r\nimport { FeatureSettingsStoreService } from '@app/services/feature-settings-store.service';\r\nimport { LicenseService } from '@app/services/license.service';\r\nimport { MyFollowedSitesService } from '@app/services/my-followed-sites.service';\r\nimport { NewsService } from '@app/services/news.service';\r\nimport { SiteService } from '@app/services/site.service';\r\nimport { UserChannelTermsService } from '@app/services/user-channel-terms.service';\r\nimport { UserLanguageTermService } from '@app/services/user-language-term.service';\r\nimport { UserService } from '@app/services/user.service';\r\nimport { Environment } from '@environments/interface.environment';\r\nimport { combineLatest, Observable, of, race, Subject } from 'rxjs';\r\nimport { catchError, map, mergeMap, startWith, switchMap } from 'rxjs/operators';\r\n\r\n@Component({\r\n selector: 'app-my-news',\r\n templateUrl: './my-news.component.html',\r\n styleUrls: ['./my-news.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush\r\n})\r\nexport class MyNewsComponent implements OnInit {\r\n\r\n @Input() amountOfDaysBackInTime = 365;\r\n @Input() amountOfNewsToDisplay = 6;\r\n @Input() amountOfFollowedSitesToGet = 100; // max is 100, NOTE: we need to add paginated api calls if we should be able to fetch more\r\n @Input() preambleTextMaxLength = 140;\r\n @Input() maxNumberOfShowMore = 2; // How may times can you press the show more button\r\n\r\n fetchedAmountOfNews = 0;\r\n followedSiteNewsBatch = 50; // set to 50 because it gets very slow otherwise.\r\n amountOfNewsToIncreaseWith = this.amountOfNewsToDisplay;\r\n newsCenterUrl: string;\r\n amountOfNewsToDisplayCurrently = this.amountOfNewsToDisplay;\r\n personalNewsItems$: Observable>;\r\n personalNewsFromSharePoint$: Observable>;\r\n private errorSubject$ = new Subject();\r\n loading = false;\r\n featureSettings = this.featureStore.state;\r\n private moreNewsSubject = new Subject();\r\n numberOfShowMoreClicks = 0;\r\n componentName = 'Your news';\r\n\r\n constructor(@Inject(CUSTOMERENVIRONMENT) private environment: Environment,\r\n private service: NewsService,\r\n private featureStore: FeatureSettingsStoreService,\r\n private followedSitesService: MyFollowedSitesService,\r\n private siteService: SiteService,\r\n private userService: UserService,\r\n private licenseService: LicenseService,\r\n private userChannelTermsService: UserChannelTermsService,\r\n private userLanguageTermsService: UserLanguageTermService,\r\n @Inject(DOCUMENT) private document: Document) { }\r\n\r\n ngOnInit() {\r\n\r\n this.newsCenterUrl = `${this.featureStore.state.newsArchiveLink}`;\r\n\r\n const userChannelTerms$ = this.userChannelTermsService.getUserChannelTerms();\r\n\r\n const userLanguageTerms$ = this.userLanguageTermsService.getUserLanguageTerms();\r\n\r\n const user$ = this.userService.getOrCreateMe();\r\n\r\n const subjectsToListenOn$ = race([this.moreNewsSubject, this.service.reloadAllPersonalNews$])\r\n .pipe(map((amount) => {\r\n return Number.isInteger(amount) ? Number(amount) : this.amountOfNewsToDisplayCurrently + 1;\r\n }));\r\n\r\n this.personalNewsFromSharePoint$ = this.licenseService.hasUserAny365License()\r\n .pipe(\r\n mergeMap(isLicensed => {\r\n if (isLicensed) {\r\n return subjectsToListenOn$\r\n .pipe(\r\n startWith(this.amountOfNewsToDisplayCurrently + 1),\r\n mergeMap((amount) => {\r\n this.loading = true;\r\n\r\n const myPersonalNewsFromGraph$ = this.service.getMyModernPersonalNewsFromGraph(userChannelTerms$, userLanguageTerms$);\r\n\r\n if (this.featureStore.state.newsModePersonalNews === NewsModePersonalNews.GraphFromNewsCenterSiteAndSearchFromFollowedSites) {\r\n\r\n const newsfromMyFollowedSites$ = this.getNewsFromMyFollowedSites$(user$, amount, userLanguageTerms$);\r\n\r\n return combineLatest([myPersonalNewsFromGraph$, newsfromMyFollowedSites$])\r\n .pipe(\r\n map(([personalNews, newsFromFollowedSites]) => {\r\n return personalNews.concat(newsFromFollowedSites);\r\n })\r\n );\r\n } else if (this.featureStore.state.newsModePersonalNews === NewsModePersonalNews.SearchNewsFromAnySiteWithChannelField) {\r\n return this.service.getPersonalModernNewsFromAllSitesFromSearch(userChannelTerms$, userLanguageTerms$, amount);\r\n } else {\r\n return myPersonalNewsFromGraph$;\r\n }\r\n }),\r\n map((pages) => {\r\n if (this.featureStore.state.newsModePersonalNews === NewsModePersonalNews.GraphFromNewsCenterSiteAndSearchFromFollowedSites\r\n ||\r\n this.featureStore.state.newsModePersonalNews === NewsModePersonalNews.SearchNewsFromAnySiteWithChannelField) {\r\n // only fetch site names when news mode that fetch from different sites\r\n // Also fetch likes and comments from individual site page instead search\r\n pages.forEach(page => {\r\n if (page && (!page.SiteName || !page.SiteUrl)) {\r\n page.SiteInfo$ = this.siteService.getSiteInfoFromUrl(page.Path);\r\n page.PageInfo$ = this.service.getModernNewsItemInfoFromPagePath(page);\r\n }\r\n });\r\n }\r\n return pages;\r\n }));\r\n } else {\r\n return of([]);\r\n }\r\n })\r\n );\r\n\r\n this.personalNewsItems$ = subjectsToListenOn$\r\n .pipe(\r\n startWith(this.amountOfNewsToDisplayCurrently + 1),\r\n switchMap(amount => {\r\n // If amount has changed we don't need to wait for the old call to fetch/concat/sort etc, cancel it and switch to the new\r\n // If workplace light is enabled concat with workplace light news\r\n if (this.environment.enableWorkplaceLight) {\r\n return combineLatest([\r\n this.personalNewsFromSharePoint$,\r\n this.service.getPersonalNewsFromApi(userChannelTerms$, userLanguageTerms$, amount)])\r\n .pipe(\r\n map(([personalNews, newsFromApi]) => {\r\n return personalNews.concat(newsFromApi);\r\n })\r\n );\r\n } else {\r\n return this.personalNewsFromSharePoint$;\r\n }\r\n }),\r\n map((pages) => {\r\n // Since pages can be concatinated from multiple sources it could be unsorted\r\n pages = pages.sort((a, b) => {\r\n return new Date(b.PublishedDate).getTime() - new Date(a.PublishedDate).getTime();\r\n });\r\n this.fetchedAmountOfNews = pages.length;\r\n if (this.fetchedAmountOfNews > this.amountOfNewsToDisplayCurrently) {\r\n pages = pages.slice(0, this.amountOfNewsToDisplayCurrently);\r\n }\r\n\r\n this.loading = false;\r\n return pages;\r\n }),\r\n catchError(err => {\r\n this.errorSubject$.next(err);\r\n return of(null);\r\n }));\r\n }\r\n\r\n private getNewsFromMyFollowedSites$(user$: Observable, amount: number, userLanguageTerms$: Observable) {\r\n return user$\r\n .pipe(\r\n mergeMap(user => {\r\n if (user && user.ShowNewsFromFollowedSites) {\r\n // the user has selected/deselected to show news from followed sites\r\n return this.followedSitesService\r\n .getMyFollowedSitesFromSpHome(0, this.amountOfFollowedSitesToGet)\r\n .pipe(\r\n map(followedSites => followedSites.map(s => s.OriginalUrl))\r\n );\r\n } else {\r\n return of([]);\r\n }\r\n }),\r\n mergeMap(urls => {\r\n const amountToFetch = this.followedSiteNewsBatch <= amount ? amount : this.followedSiteNewsBatch;\r\n return this.service.getModernNewsFromAllSitesExceptNewsCenterFromSearch(userLanguageTerms$, amountToFetch)\r\n .pipe(\r\n map(\r\n // we could filter on url directly in the getModernNewsFromAllSitesExceptNewsCenterFromSearch request, but it seems to give a 400 error if we have a lot of followed sites, so we filter manually instead\r\n newsFromSearch => {\r\n return newsFromSearch.filter(page => urls.indexOf(page.SiteUrl) !== -1);\r\n }));\r\n }));\r\n }\r\n\r\n showMoreNews() {\r\n this.numberOfShowMoreClicks++;\r\n this.amountOfNewsToDisplayCurrently = this.amountOfNewsToDisplayCurrently + this.amountOfNewsToIncreaseWith;\r\n this.loading = true;\r\n if (this.featureStore.state.newsModePersonalNews === NewsModePersonalNews.GraphFromNewsCenterSite) {\r\n this.moreNewsSubject.next();\r\n } else {\r\n this.moreNewsSubject.next(this.amountOfNewsToDisplayCurrently + 1);\r\n }\r\n }\r\n\r\n showLessNews() {\r\n this.numberOfShowMoreClicks = 0;\r\n this.amountOfNewsToDisplayCurrently = this.amountOfNewsToDisplay;\r\n this.moreNewsSubject.next(this.amountOfNewsToDisplayCurrently + 1);\r\n this.scrollIntoFeatureView();\r\n }\r\n\r\n scrollIntoFeatureView() {\r\n const elementId = 'app-my-news';\r\n const element = this.document.getElementById(elementId);\r\n\r\n if (element) {\r\n if (!/^(?:a|select|input|button|textarea)$/i.test(element.tagName)) {\r\n element.scrollIntoView();\r\n }\r\n element.focus();\r\n }\r\n }\r\n\r\n}\r\n@NgModule({\r\n declarations: [MyNewsComponent],\r\n exports: [MyNewsComponent],\r\n imports: [\r\n CommonModule,\r\n NewsCardListModule,\r\n LinkModule,\r\n ActionLinkModule,\r\n ActionRouterLinkModule,\r\n MatButtonModule,\r\n RouterModule,\r\n ErrorTemplatesModule,\r\n TextPlaceholderModule,\r\n WidgetPlaceholderModule\r\n ]\r\n})\r\nexport class MyNewsModule { }\r\n","
\r\n \r\n \r\n Go to the calendar\r\n \r\n \r\n\r\n
\r\n

Upcoming events

\r\n

Here you'll find common events that you can sign up to.

\r\n

\r\n Use \r\n this link\r\n to find out more about which events are included in the calendar.\r\n

\r\n
\r\n\r\n
\r\n \r\n
0; else noEvents\">\r\n
\r\n
\r\n
\r\n
\r\n
\r\n \r\n
\r\n \r\n {{(event.Location.length>30)? (event.Location | slice:0:30)+'...':(event.Location)}}\r\n \r\n
\r\n
\r\n
\r\n
\r\n\r\n
\r\n \r\n
\r\n
\r\n
\r\n
\r\n \r\n\r\n
numEventsShowing else linkToCalendar\">\r\n
\r\n \r\n
\r\n
\r\n
\r\n
\r\n \r\n
\r\n
\r\n\r\n \r\n
\r\n Find more events in the Calendar\r\n
\r\n
\r\n\r\n
\r\n\r\n
\r\n\r\n
\r\n \r\n
\r\n \r\n
\r\n \r\n

No future events.

\r\n
\r\n
\r\n
\r\n
\r\n\r\n\r\n
\r\n \r\n
\r\n
\r\n\r\n","import { CommonModule, DOCUMENT } from '@angular/common';\r\nimport { ChangeDetectionStrategy, ChangeDetectorRef, Component, ElementRef, Host, Inject, Input, NgModule, OnDestroy, OnInit, Optional } from '@angular/core';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { Router } from '@angular/router';\r\nimport { CUSTOMERENVIRONMENT } from '@app/common/app-tokens';\r\nimport { ActionLinkModule } from '@app/components/actions/action-link/action-link.component';\r\nimport { ErrorTemplatesModule } from '@app/components/error-templates/error-templates.component';\r\nimport { TextPlaceholderModule } from '@app/components/text-placeholder/text-placeholder.component';\r\nimport { WidgetPlaceholderModule } from '@app/components/widget-placeholder/widget-placeholder.component';\r\nimport { CssBackgroundImageProxyModule } from '@app/directives/css-background-image-proxy.directive';\r\nimport { HideParentIfEmptyDirective } from '@app/directives/hide-parent-if-empty.directive';\r\nimport { OrganizationEvent } from '@app/models/organization-events';\r\nimport { LinkModule } from '@app/directives/link.directive';\r\nimport { ComponentStatesOnRoutesService } from '@app/services/component-states-on-routes.service';\r\nimport { OrganizationCalendarService } from '@app/services/organization-calendar.service';\r\nimport { Environment } from '@environments/interface.environment';\r\nimport { differenceInSeconds, isSameDay } from 'date-fns';\r\nimport { Subject, Subscription } from 'rxjs';\r\nimport { FeatureSettingsStoreService } from '@app/services/feature-settings-store.service';\r\n\r\n@Component({\r\n selector: 'app-organization-calendar',\r\n templateUrl: './organization-calendar.component.html',\r\n styleUrls: ['./organization-calendar.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush\r\n})\r\nexport class OrganizationCalendarComponent implements OnInit, OnDestroy {\r\n\r\n organizationEvents: OrganizationEvent[];\r\n allEvents: any[];\r\n eventsToDisplay: any[];\r\n groupedEvents: any;\r\n @Input() maxNumberOfShowMore = 2; // How may times can you press the show more button\r\n @Input() numEventsPerLoad = 6; // 6 is a good number since it will work with all screen breakpoints\r\n maxEventsToShow: number;\r\n numEventsShowing: number;\r\n listGuid: string;\r\n calendarUrl = `${this.environment.coreWorkplaceSiteUrl}/_layouts/15/Events.aspx`;\r\n singleEventCalendarUrl = `${this.environment.coreWorkplaceSiteUrl}/_layouts/15/Event.aspx`;\r\n loadEventSubscription: Subscription;\r\n private errorSubject$ = new Subject();\r\n numberOfShowMoreClicks = 0;\r\n calendarPageInfoUrl = this.featureSettingsStoreService.state.calendarPageInfoUrl;\r\n componentName = 'Upcoming events';\r\n\r\n constructor(@Inject(CUSTOMERENVIRONMENT) private environment: Environment,\r\n private service: OrganizationCalendarService,\r\n private router: Router,\r\n private componentEventService: ComponentStatesOnRoutesService,\r\n public elementRef: ElementRef,\r\n private cdRef: ChangeDetectorRef,\r\n private featureSettingsStoreService: FeatureSettingsStoreService,\r\n @Host() @Optional() private hideParentIfEmptyDirective: HideParentIfEmptyDirective,\r\n @Inject(DOCUMENT) private document: Document) {\r\n }\r\n\r\n clickShowMore(): void {\r\n this.numberOfShowMoreClicks++;\r\n this.numEventsShowing += this.numEventsPerLoad;\r\n if (this.numEventsShowing > this.maxEventsToShow) { this.numEventsShowing = this.maxEventsToShow; }\r\n this.eventsToDisplay = this.allEvents.slice(0, this.numEventsShowing);\r\n }\r\n\r\n clickShowLess(): void {\r\n this.numberOfShowMoreClicks = 0;\r\n this.maxEventsToShow = this.numEventsPerLoad * (this.maxNumberOfShowMore + 1);\r\n this.numEventsShowing = this.numEventsPerLoad;\r\n this.eventsToDisplay = this.allEvents.slice(0, this.numEventsPerLoad);\r\n this.scrollIntoFeatureView();\r\n }\r\n\r\n scrollIntoFeatureView() {\r\n const elementId = 'app-organization-calendar';\r\n const element = this.document.getElementById(elementId);\r\n\r\n if (element) {\r\n if (!/^(?:a|select|input|button|textarea)$/i.test(element.tagName)) {\r\n element.scrollIntoView();\r\n }\r\n element.focus();\r\n }\r\n }\r\n\r\n ngOnInit() {\r\n\r\n this.maxEventsToShow = this.numEventsPerLoad * (this.maxNumberOfShowMore + 1);\r\n this.numEventsShowing = this.numEventsPerLoad;\r\n\r\n const componentEvent = this.componentEventService.state.RouteMap.has(this.router.url) && this.componentEventService.state.RouteMap.get(this.router.url).find(x => x.ComponentId === this.elementRef.nativeElement.localName);\r\n const componentEventData = componentEvent ? componentEvent.Data as Array : undefined;\r\n\r\n this.loadEventSubscription = this.service.getOrganizationCalendarEventsFromGraph()\r\n .subscribe(events => {\r\n this.organizationEvents = events.map(val => {\r\n if (this.calendarUrl.indexOf('ListGuid') === -1) {\r\n this.calendarUrl = `${this.calendarUrl}?ListGuid=${val.ListGuid}`;\r\n }\r\n return this.parseEvents(val);\r\n });\r\n\r\n let allEvents = [];\r\n for (let i = 0; i < this.organizationEvents.length; i++) {\r\n allEvents = allEvents.concat(this.parseRecurringEvents(this.organizationEvents[i]));\r\n }\r\n\r\n this.allEvents = this.orderByDate(allEvents, 'EventDate');\r\n\r\n this.allEvents = this.allEvents.map(event => {\r\n if (componentEventData) {\r\n const foundEvent = componentEventData.find(ced => ced.Id === event.Id);\r\n if (foundEvent) {\r\n event.ShowNewOrModifiedBadge = true;\r\n }\r\n } else {\r\n event.ShowNewOrModifiedBadge = false;\r\n }\r\n return event;\r\n });\r\n\r\n if (this.allEvents.length === 0) {\r\n this.hideParentIfEmptyDirective && this.hideParentIfEmptyDirective.hideElement();\r\n } else {\r\n this.hideParentIfEmptyDirective && this.hideParentIfEmptyDirective.showElement();\r\n }\r\n\r\n // take top 5\r\n if (this.allEvents.length > this.numEventsPerLoad) {\r\n this.eventsToDisplay = this.allEvents.slice(0, this.numEventsPerLoad);\r\n } else {\r\n this.eventsToDisplay = this.allEvents;\r\n }\r\n this.cdRef.detectChanges();\r\n },\r\n err => {\r\n this.errorSubject$.next(err);\r\n this.cdRef.detectChanges();\r\n });\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.loadEventSubscription && this.loadEventSubscription.unsubscribe();\r\n }\r\n\r\n orderByDate(arr, dateProp) {\r\n return arr.slice().sort(function (a, b) {\r\n return a[dateProp] < b[dateProp] ? -1 : 1;\r\n });\r\n }\r\n\r\n parseEvents(event: OrganizationEvent): OrganizationEvent {\r\n\r\n let eventInstance;\r\n\r\n if (event.AllDayEvent) {\r\n eventInstance = '';\r\n } else {\r\n if (isSameDay(new Date(event.EventDate), new Date(event.EndDate))) {\r\n eventInstance = 'on same day';\r\n } else {\r\n eventInstance = 'on diff day';\r\n }\r\n }\r\n\r\n return new OrganizationEvent({\r\n EventDate: event.EventDate,\r\n EndDate: event.EndDate,\r\n EventInstance: eventInstance,\r\n Description: event.Description,\r\n AllDayEvent: event.AllDayEvent,\r\n Location: event.Location,\r\n Recurrence: event.Recurrence,\r\n Title: event.Title,\r\n RecurrenceData: event.RecurrenceData,\r\n Id: event.Id,\r\n ListGuid: event.ListGuid,\r\n OrganizationCalendarName: event.OrganizationCalendarName,\r\n BannerUrl: event.BannerUrl && event.BannerUrl !== 'https://none' ? event.BannerUrl.split('?')[0] : null,\r\n ItemUrl: `${this.singleEventCalendarUrl}?ListGuid=${event.ListGuid}&ItemId=${event.Id}`\r\n });\r\n }\r\n\r\n parseRecurringEvents(e: OrganizationEvent): OrganizationEvent[] {\r\n\r\n let start, end, durationInSec, eventInstance;\r\n const er = []; let total = 0; let rTotal = 0;\r\n const startDate = new Date(e.EventDate);\r\n const endDate = new Date(e.EndDate);\r\n\r\n durationInSec = differenceInSeconds(endDate, startDate); // (new Date(endDate).getHours() - new Date(startDate).getHours()) * 60 * 60;\r\n\r\n start = new Date(this.parseDate(e.EventDate, e.AllDayEvent));\r\n end = new Date(this.parseDate(e.EndDate, e.AllDayEvent));\r\n\r\n if (isSameDay(new Date(start), new Date(end))) {\r\n eventInstance = 'on same day';\r\n } else {\r\n eventInstance = 'on diff day';\r\n }\r\n const url = `${this.singleEventCalendarUrl}?ListGuid=${e.ListGuid}&ItemId=${e.Id}`;\r\n // normal events on diff day\r\n if (!e.Recurrence) {\r\n if (eventInstance === 'on diff day') {\r\n const init = new Date(this.parseDate(e.EventDate, e.AllDayEvent));\r\n const ed = new Date(this.parseDate(e.EndDate, e.AllDayEvent));\r\n if ((new Date(init)).getTime() >= start.getTime()) {\r\n const ni = this.cloneObj(e);\r\n ni.EventDate = init;\r\n ni.EndDate = ed;\r\n ni.fRecurrence = false;\r\n ni.AllDayEvent = e.AllDayEvent;\r\n ni.EventInstance = eventInstance;\r\n ni.Id = e.Id;\r\n ni.ID = ni.Id;\r\n ni.itemUrl = url;\r\n if (new Date(ed) >= new Date()) {\r\n er.push(ni);\r\n }\r\n }\r\n } else {\r\n // normal events on same day\r\n e.EventDate = new Date(this.parseDate(e.EventDate, e.AllDayEvent));\r\n e.EndDate = new Date(this.parseDate(e.EndDate, e.AllDayEvent));\r\n e.AllDayEvent = e.AllDayEvent;\r\n e.EventInstance = eventInstance;\r\n e.ItemUrl = url;\r\n if (er.length <= 11) {\r\n er.push(e);\r\n } else { return; }\r\n }\r\n return er;\r\n } else {\r\n const wd = ['su', 'mo', 'tu', 'we', 'th', 'fr', 'sa'];\r\n const wom = ['first', 'second', 'third', 'fourth'];\r\n let rTotalstring = '';\r\n if (e.RecurrenceData.indexOf('') !== -1) {\r\n rTotalstring = e.RecurrenceData.substring(e.RecurrenceData.indexOf('') + 17);\r\n rTotal = parseInt(rTotalstring.substring(0, rTotalstring.indexOf('<')), 10);\r\n }\r\n // daily recurrence expansion\r\n if (e.RecurrenceData.indexOf('') - 1);\r\n const arr = this.formatString(str);\r\n if (arr.indexOf('dayFrequency') !== -1) {\r\n const frequency = parseInt(arr[arr.indexOf('dayFrequency') + 1], 10);\r\n let loop = true;\r\n const init = new Date(this.parseDate(e.EventDate, e.AllDayEvent));\r\n while (loop) {\r\n total++;\r\n if ((new Date(init)).getTime() >= start.getTime()) {\r\n\r\n const ed = new Date(init);\r\n ed.setSeconds(ed.getSeconds() + durationInSec);\r\n const ni = this.cloneObj(e);\r\n ni.EventDate = new Date(init);\r\n ni.EndDate = ed;\r\n ni.fRecurrence = false;\r\n ni.AllDayEvent = e.AllDayEvent;\r\n ni.EventInstance = 'on same day';\r\n ni.Id = e.Id;\r\n ni.ID = ni.Id;\r\n ni.ItemUrl = url;\r\n if (new Date(ni.EventDate) >= new Date()) {\r\n if (er.length <= 11) {\r\n er.push(ni);\r\n } else { break; }\r\n }\r\n }\r\n init.setDate(init.getDate() + frequency);\r\n if ((new Date(init) > end) || (rTotal > 0 && rTotal <= total)) { loop = false; }\r\n }\r\n } else if (arr.indexOf('weekday') !== -1) {\r\n e.RecurrenceData = e.RecurrenceData + ''; // change from daily on every weekday to weekly on every weekday\r\n }\r\n }\r\n\r\n // weekly recurrence expansion\r\n if (e.RecurrenceData.indexOf('') - 1);\r\n const arr = this.formatString(str);\r\n const frequency = parseInt(arr[arr.indexOf('weekFrequency') + 1], 10);\r\n let loop = true;\r\n const init = new Date(this.parseDate(e.EventDate, e.AllDayEvent));\r\n let initDay = new Date(init).getDay();\r\n while (loop) {\r\n for (let i = initDay; i < 7; i++) {\r\n if (arr.indexOf(wd[i]) !== -1 && (rTotal > total || rTotal === 0)) {\r\n total++;\r\n if ((new Date(init)).getTime() >= start.getTime()) {\r\n\r\n const nd = new Date(init);\r\n nd.setDate(nd.getDate() + (i - initDay));\r\n const ed = new Date(nd);\r\n ed.setSeconds(ed.getSeconds() + durationInSec);\r\n const ni = this.cloneObj(e);\r\n ni.EventDate = new Date(nd);\r\n ni.EndDate = ed;\r\n ni.fRecurrence = false;\r\n ni.AllDayEvent = e.AllDayEvent;\r\n ni.EventInstance = 'on same day';\r\n ni.Id = e.Id;\r\n ni.ID = ni.Id;\r\n ni.ItemUrl = url;\r\n if (new Date(ni.EventDate) >= new Date()) {\r\n if (er.length <= 11) {\r\n er.push(ni);\r\n } else { break; }\r\n }\r\n }\r\n }\r\n }\r\n init.setDate(init.getDate() + ((7 * frequency) - initDay));\r\n initDay = 0;\r\n if ((new Date(init) > end) || (rTotal > 0 && rTotal <= total)) { loop = false; }\r\n }\r\n }\r\n\r\n // monthly recurrence expansion\r\n if (e.RecurrenceData.indexOf('') - 1);\r\n const arr = this.formatString(str);\r\n const frequency = parseInt(arr[arr.indexOf('monthFrequency') + 1], 10);\r\n let loop = true;\r\n const init = new Date(this.parseDate(e.EventDate, e.AllDayEvent));\r\n const day = parseInt(arr[arr.indexOf('day') + 1], 10);\r\n while (loop) {\r\n total++;\r\n if ((new Date(init)).getTime() >= start.getTime()) {\r\n const nd = new Date(init);\r\n nd.setDate(day);\r\n if (nd.getMonth() === init.getMonth()) {\r\n\r\n const ed = new Date(nd);\r\n ed.setSeconds(ed.getSeconds() + durationInSec);\r\n const ni = this.cloneObj(e);\r\n ni.EventDate = new Date(nd);\r\n ni.EndDate = ed;\r\n ni.fRecurrence = false;\r\n ni.AllDayEvent = e.AllDayEvent;\r\n ni.EventInstance = 'on same day';\r\n ni.Id = e.Id;\r\n ni.ID = ni.Id;\r\n ni.ItemUrl = url;\r\n if (new Date(ni.EventDate) >= new Date()) {\r\n if (er.length <= 11) {\r\n er.push(ni);\r\n } else { break; }\r\n }\r\n }\r\n }\r\n init.setMonth(init.getMonth() + frequency);\r\n if ((new Date(init) > end) || (rTotal > 0 && rTotal <= total)) { loop = false; }\r\n }\r\n }\r\n\r\n // monthlyByDay recurrence expansion\r\n if (e.RecurrenceData.indexOf('') - 1);\r\n const arr = this.formatString(str);\r\n const frequency = parseInt(arr[arr.indexOf('monthFrequency') + 1], 10);\r\n let loop = true;\r\n const init = new Date(this.parseDate(e.EventDate, e.AllDayEvent));\r\n const weekdayOfMonth = arr[arr.indexOf('weekdayOfMonth') + 1];\r\n let temp = new Date();\r\n while (loop) {\r\n total++;\r\n if ((new Date(init)).getTime() >= start.getTime()) {\r\n let nd = new Date(init);\r\n nd.setDate(1); // set to first day of month\r\n if (arr.indexOf('weekday') !== -1) { // find first weekday - if not saturday or sunday, then current date is a weekday\r\n if (nd.getDay() === 0) { nd.setDate(nd.getDate() + 1); } else if (nd.getDay() === 6) { nd.setDate(nd.getDate() + 2); } // add two days to saturday\r\n if (weekdayOfMonth === 'last') {\r\n while (nd.getMonth() === init.getMonth()) {\r\n temp = new Date(nd);\r\n if (nd.getDay() === 5) { nd.setDate(nd.getDate() + 3); } else { nd.setDate(nd.getDate() + 1); } // otherwise, just add one day\r\n }\r\n nd = new Date(temp);\r\n } else {\r\n for (let i = 0; i < wom.indexOf(weekdayOfMonth); i++) {\r\n if (nd.getDay() === 5) { nd.setDate(nd.getDate() + 3); } else { nd.setDate(nd.getDate() + 1); } // otherwise, just add one day\r\n }\r\n }\r\n } else if (arr.indexOf('weekend_day') !== -1) { // find first weekend day\r\n if (nd.getDay() !== 0 && nd.getDay() !== 6) { nd.setDate(nd.getDate() + (6 - nd.getDay())); } // if not saturday or sunday, then add days to get to saturday\r\n if (weekdayOfMonth === 'last') {\r\n while (nd.getMonth() === init.getMonth()) {\r\n temp = new Date(nd);\r\n if (nd.getDay() === 0) { nd.setDate(nd.getDate() + 6); } else { nd.setDate(nd.getDate() + 1); } // otherwise, just add one day\r\n }\r\n nd = new Date(temp);\r\n } else {\r\n for (let i = 0; i < wom.indexOf(weekdayOfMonth); i++) {\r\n if (nd.getDay() === 0) { nd.setDate(nd.getDate() + 6); } else { nd.setDate(nd.getDate() + 1); } // otherwise, just add one day\r\n }\r\n }\r\n } else if (arr.indexOf('day') !== -1) {// just looking for the Nth day in the month...\r\n if (weekdayOfMonth === 'last') {\r\n nd.setMonth(nd.getMonth() + 1);\r\n nd.setDate(0);\r\n } else { nd.setDate(nd.getDate() + (wom.indexOf(weekdayOfMonth))); } // now add days to get to the Nth instance of this day\r\n } else {\r\n for (let i = 0; i < wd.length; i++) { // get first instance of the specified day\r\n if (arr.indexOf(wd[i]) !== -1) {\r\n if (nd.getDate() > i) { nd.setDate(nd.getDate() + (7 - (nd.getDay() - i))); } else { nd.setDate(nd.getDate() + (i - nd.getDay())); }\r\n }\r\n }\r\n if (weekdayOfMonth === 'last') {\r\n while (nd.getMonth() === init.getMonth()) {\r\n temp = new Date(nd);\r\n nd.setDate(nd.getDate() + 7); // add a week to each instance to get the Nth instance\r\n }\r\n nd = new Date(temp);\r\n } else {\r\n for (let i = 0; i < wom.indexOf(weekdayOfMonth); i++) {\r\n nd.setDate(nd.getDate() + 7); // add a week to each instance to get the Nth instance\r\n }\r\n }\r\n }\r\n if (nd.getMonth() === init.getMonth()) { // make sure the new date calculated actually falls within the current month (sometimes there may be no 4th instance of a day)\r\n\r\n const ed = new Date(nd);\r\n ed.setSeconds(ed.getSeconds() + durationInSec);\r\n const ni = this.cloneObj(e);\r\n ni.EventDate = new Date(nd);\r\n ni.EndDate = ed;\r\n ni.fRecurrence = false;\r\n ni.AllDayEvent = e.AllDayEvent;\r\n ni.EventInstance = 'on same day';\r\n ni.Id = e.Id;\r\n ni.ID = ni.Id;\r\n ni.ItemUrl = url;\r\n if (new Date(ni.EventDate) >= new Date()) {\r\n if (er.length <= 11) {\r\n er.push(ni);\r\n } else { break; }\r\n }\r\n }\r\n }\r\n init.setMonth(init.getMonth() + frequency);\r\n if ((new Date(init) > end) || (rTotal > 0 && rTotal <= total)) { loop = false; }\r\n }\r\n }\r\n\r\n // yearly recurrence expansion\r\n if (e.RecurrenceData.indexOf('') - 1);\r\n const arr = this.formatString(str);\r\n const frequency = parseInt(arr[arr.indexOf('yearFrequency') + 1], 10);\r\n let loop = true;\r\n const init = new Date(this.parseDate(e.EventDate, e.AllDayEvent));\r\n const month = (parseInt(arr[arr.indexOf('month') + 1], 10) - 1);\r\n const day = parseInt(arr[arr.indexOf('day') + 1], 10);\r\n while (loop) {\r\n const nd = new Date(init);\r\n nd.setMonth(month);\r\n nd.setDate(day);\r\n if ((new Date(init)).getTime() >= nd.getTime()) {\r\n total++;\r\n if ((new Date(init)).getTime() >= start.getTime()) {\r\n\r\n const ed = new Date(nd);\r\n ed.setSeconds(ed.getSeconds() + durationInSec);\r\n const ni = this.cloneObj(e);\r\n ni.EventDate = new Date(nd);\r\n ni.EndDate = ed;\r\n ni.fRecurrence = false;\r\n ni.AllDayEvent = e.AllDayEvent;\r\n ni.EventInstance = 'on same day';\r\n ni.Id = e.Id;\r\n ni.ID = ni.Id;\r\n ni.ItemUrl = url;\r\n if (new Date(ni.EventDate) >= new Date()) {\r\n if (er.length <= 11) {\r\n er.push(ni);\r\n } else { break; }\r\n }\r\n }\r\n }\r\n init.setFullYear(init.getFullYear() + frequency);\r\n if ((new Date(init) > end) || (rTotal > 0 && rTotal <= total)) { loop = false; }\r\n }\r\n }\r\n\r\n // yearlyByDay recurrence expansion\r\n if (e.RecurrenceData.indexOf('') - 1);\r\n const arr = this.formatString(str);\r\n const frequency = parseInt(arr[arr.indexOf('yearFrequency') + 1], 10);\r\n let loop = true;\r\n const init = new Date(this.parseDate(e.EventDate, e.AllDayEvent));\r\n const month = (parseInt(arr[arr.indexOf('month') + 1], 10) - 1);\r\n const weekdayOfMonth = arr[arr.indexOf('weekdayOfMonth') + 1];\r\n let day = 0;\r\n for (let i = 0; i < wd.length; i++) {\r\n if (arr.indexOf(wd[i]) !== -1) {\r\n if (arr[arr.indexOf(wd[i]) + 1].toLowerCase() === 'true') { day = i; }\r\n }\r\n }\r\n while (loop) {\r\n let nd = new Date(init);\r\n nd.setMonth(month);\r\n if ((new Date(init)).getTime() >= nd.getTime()) {\r\n total++;\r\n if ((new Date(init)).getTime() >= start.getTime()) {\r\n nd.setDate(1);\r\n const dayOfMonth = nd.getDay();\r\n if (day < dayOfMonth) { nd.setDate(nd.getDate() + ((7 - dayOfMonth) + day)); } else { nd.setDate(nd.getDate() + (day - dayOfMonth)); }\r\n if (weekdayOfMonth === 'last') {\r\n const temp = new Date(nd);\r\n while (temp.getMonth() === month) {\r\n nd = new Date(temp);\r\n temp.setDate(temp.getDate() + 7); // loop from first instance of month to last instance of month\r\n }\r\n } else {\r\n nd.setDate(nd.getDate() + (7 * (wom.indexOf(weekdayOfMonth))));\r\n }\r\n if (nd.getMonth() === month) {\r\n\r\n const ed = new Date(nd);\r\n ed.setSeconds(ed.getSeconds() + durationInSec);\r\n const ni = this.cloneObj(e);\r\n ni.EventDate = new Date(nd);\r\n ni.EndDate = ed;\r\n ni.fRecurrence = false;\r\n ni.AllDayEvent = e.AllDayEvent;\r\n ni.EventInstance = 'on same day';\r\n ni.Id = e.Id;\r\n ni.ID = ni.Id;\r\n ni.ItemUrl = url;\r\n if (new Date(ni.EventDate) >= new Date()) {\r\n if (er.length <= 11) {\r\n er.push(ni);\r\n } else { break; }\r\n }\r\n }\r\n }\r\n }\r\n init.setFullYear(init.getFullYear() + frequency);\r\n init.setMonth(month);\r\n init.setDate(1);\r\n if ((new Date(init) > end) || (rTotal > 0 && rTotal <= total)) { loop = false; }\r\n }\r\n }\r\n\r\n return er;\r\n } // end recurrence check\r\n }\r\n\r\n parseDate(date, allDay): Date {\r\n if (typeof date === 'string') {\r\n if (allDay) {\r\n if (date.lastIndexOf('Z') === date.length - 1) {\r\n const dt = date.substring(0, date.length - 1);\r\n return new Date(dt);\r\n }\r\n } else {\r\n return new Date(date);\r\n }\r\n }\r\n return date;\r\n }\r\n\r\n formatString(str: string) {\r\n let arr = str.split('\\'');\r\n str = arr.join('');\r\n arr = str.split('\"');\r\n str = arr.join('');\r\n arr = str.split('=');\r\n str = arr.join(' ');\r\n str.trim();\r\n return str.split(' ');\r\n }\r\n\r\n cloneObj(obj: any) {\r\n let copy;\r\n if (null === obj || 'object' !== typeof obj) { return obj; }\r\n if (obj instanceof Date) {\r\n copy = new Date();\r\n copy.setTime(obj.getTime());\r\n return copy;\r\n }\r\n if (obj instanceof Array) {\r\n copy = [];\r\n for (let i = 0, len = obj.length; i < len; i++) {\r\n copy[i] = this.cloneObj(obj[i]);\r\n }\r\n return copy;\r\n }\r\n if (obj instanceof Object) {\r\n copy = {};\r\n for (const attr in obj) {\r\n if (obj.hasOwnProperty(attr)) { copy[attr] = this.cloneObj(obj[attr]); }\r\n }\r\n return copy;\r\n }\r\n throw new Error('Unable to copy obj! Its type isn\\'t supported.');\r\n }\r\n\r\n setCalendarStyle(event: OrganizationEvent) {\r\n let cssClass: string;\r\n\r\n if (!event.BannerUrl || event.BannerUrl === 'https://none') {\r\n cssClass = 'calendar-box-background';\r\n }\r\n return cssClass;\r\n }\r\n\r\n setLayOverStyle(event: OrganizationEvent) {\r\n let cssClass = {};\r\n if (event.BannerUrl) {\r\n cssClass = 'calendar-banner-overlay';\r\n }\r\n return cssClass;\r\n }\r\n\r\n}\r\n@NgModule({\r\n declarations: [OrganizationCalendarComponent],\r\n exports: [OrganizationCalendarComponent],\r\n imports: [\r\n CommonModule,\r\n ActionLinkModule,\r\n MatButtonModule,\r\n CssBackgroundImageProxyModule,\r\n ErrorTemplatesModule,\r\n TextPlaceholderModule,\r\n WidgetPlaceholderModule,\r\n LinkModule,\r\n ]\r\n})\r\nexport class OrganizationCalendarModule { }\r\n","\r\n
0\" class=\"birthday-component-container\">\r\n

\r\n Birthday calendar\r\n {{ today | date:'longDate'}}\r\n

\r\n

Don't forget to congratulate your colleagues who have their birthday today.

\r\n

(The following is only visible in dev-mode. Current date query: {{dateToQuery}})

\r\n
\r\n \r\n
\r\n
amountOfBirthdaysToDisplayCurrently && !loading\">\r\n
\r\n \r\n
\r\n
\r\n
amountOfBirthdaysToDisplay && !loading\">\r\n
\r\n \r\n
\r\n
\r\n
\r\n
\r\n
\r\n \r\n
\r\n \r\n \r\n \r\n
\r\n
\r\n\r\n\r\n\r\n","import { CommonModule } from '@angular/common';\r\nimport { Component, Host, Inject, Input, NgModule, OnInit, Optional } from '@angular/core';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { CUSTOMERENVIRONMENT, WINDOW } from '@app/common/app-tokens';\r\nimport { Utilities } from '@app/common/utilities';\r\nimport { BreakPoints } from '@app/common/breakpoints';\r\nimport { ErrorTemplatesModule } from '@app/components/error-templates/error-templates.component';\r\nimport { WidgetPlaceholderModule } from '@app/components/widget-placeholder/widget-placeholder.component';\r\nimport { HideParentIfEmptyDirective } from '@app/directives/hide-parent-if-empty.directive';\r\nimport { SearchResult } from '@app/models/search-result';\r\nimport { LinkModule } from '@app/directives/link.directive';\r\nimport { SafeModule } from '@app/pipes/safe.pipe';\r\nimport { SearchService } from '@app/services/search.service';\r\nimport { UserService } from '@app/services/user.service';\r\nimport { Environment } from '@environments/interface.environment';\r\nimport { formatISO } from 'date-fns';\r\nimport { Observable, of, Subject } from 'rxjs';\r\nimport { catchError, concatMap, map, startWith, tap } from 'rxjs/operators';\r\n\r\n@Component({\r\n selector: 'app-birthdays',\r\n templateUrl: './birthdays.component.html',\r\n styleUrls: ['./birthdays.component.scss']\r\n})\r\n\r\nexport class BirthdaysComponent implements OnInit {\r\n\r\n // Amount of birthdays to display on each row\r\n @Input() useTeamsCongratulations = true;\r\n\r\n amountOfBirthdaysToDisplay: number;\r\n amountOfBirthdaysToIncreaseWith: number;\r\n amountOfBirthdaysToDisplayCurrently: number;\r\n\r\n loading = false;\r\n birthdayPersonsToday$: Observable>;\r\n today = new Date();\r\n errorSubject$ = new Subject();\r\n moreBirthdaysSubject = new Subject();\r\n fetchedAmount = 0;\r\n dateToQuery: string;\r\n componentName = 'Your birthday';\r\n\r\n constructor(private searchService: SearchService,\r\n private userService: UserService,\r\n @Inject(CUSTOMERENVIRONMENT) private environment: Environment,\r\n @Host() @Optional() private hideParentIfEmptyDirective: HideParentIfEmptyDirective,\r\n @Inject(WINDOW) private window: Window) { }\r\n\r\n ngOnInit() {\r\n\r\n // Set querydate to ask for year 2000 since the property SPS-Birthday always stores the birthday date with year 2000.\r\n // The date format for queries should be in this format 2000-MM-dd (ISO8601).\r\n // For development purpose we set this to 21 november becasue we know we'll get some values then.\r\n const date = this.environment.production ? new Date(2000, new Date().getMonth(), new Date().getDate()) : new Date(2000, 11, 17);\r\n this.dateToQuery = formatISO(date, { representation: 'date' });\r\n\r\n // Set amount to load dynamically based on screen size\r\n const breakPoint = Utilities.getCurrentBootstrapBreakpoint(this.window);\r\n this.amountOfBirthdaysToDisplay = 4;\r\n if (breakPoint === BreakPoints.xxxl || breakPoint === BreakPoints.xxl) {\r\n this.amountOfBirthdaysToDisplay = 6;\r\n }\r\n if (breakPoint === BreakPoints.xs) {\r\n this.amountOfBirthdaysToDisplay = 3;\r\n }\r\n this.amountOfBirthdaysToIncreaseWith = this.amountOfBirthdaysToDisplay;\r\n this.amountOfBirthdaysToDisplayCurrently = this.amountOfBirthdaysToDisplay;\r\n\r\n this.birthdayPersonsToday$ = this.moreBirthdaysSubject\r\n .pipe(\r\n startWith(this.amountOfBirthdaysToDisplayCurrently + 1),\r\n concatMap((amount) => {\r\n this.loading = true;\r\n return this.searchService.getPeopleWithBirthdayDate(this.dateToQuery, amount);\r\n }),\r\n map((results) => {\r\n this.fetchedAmount = results.length;\r\n\r\n if (results.length === 0) {\r\n this.hideParentIfEmptyDirective && this.hideParentIfEmptyDirective.hideElement();\r\n } else {\r\n this.hideParentIfEmptyDirective && this.hideParentIfEmptyDirective.showElement();\r\n }\r\n\r\n if (this.fetchedAmount > this.amountOfBirthdaysToDisplayCurrently) {\r\n results = results.slice(0, this.amountOfBirthdaysToDisplayCurrently);\r\n }\r\n return results.map(result => {\r\n if (result.WorkEmail) {\r\n result.photoUrl$ = this.userService.getUserPhotoByUpn(result.WorkEmail);\r\n }\r\n return result;\r\n });\r\n }),\r\n tap(() => {\r\n this.loading = false;\r\n }),\r\n catchError(err => {\r\n this.errorSubject$.next(err);\r\n return of(null);\r\n }));\r\n }\r\n\r\n getPreferredNameLetters(preferredName: string) {\r\n return Utilities.generateInitials(preferredName);\r\n }\r\n\r\n showMoreBirthdays() {\r\n this.amountOfBirthdaysToDisplayCurrently = this.amountOfBirthdaysToDisplayCurrently + this.amountOfBirthdaysToIncreaseWith;\r\n this.moreBirthdaysSubject.next(this.amountOfBirthdaysToDisplayCurrently + 1);\r\n }\r\n\r\n showLessBirthdays() {\r\n this.amountOfBirthdaysToDisplayCurrently = this.amountOfBirthdaysToDisplay;\r\n this.moreBirthdaysSubject.next(this.amountOfBirthdaysToDisplayCurrently + 1);\r\n }\r\n}\r\n\r\n@NgModule({\r\n declarations: [BirthdaysComponent],\r\n exports: [BirthdaysComponent],\r\n imports: [\r\n CommonModule,\r\n WidgetPlaceholderModule,\r\n LinkModule,\r\n MatButtonModule,\r\n ErrorTemplatesModule,\r\n SafeModule\r\n ],\r\n})\r\n\r\nexport class BirthdaysModule { }\r\n","
\r\n

Restaurant menus

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

\r\n Hungry? Have a look at what's on the menu for week {{currentWeekNumber}} ({{startOfISOWeek | date:'shortDate'}} - {{endOfISOWeek | date:'shortDate'}})\r\n

\r\n
\r\n
\r\n Restaurant:\r\n
\r\n \r\n {{restaurant.Name}}\r\n \r\n
\r\n
\r\n
\r\n
\r\n\r\n
\r\n
\r\n
\r\n
\r\n Monday\r\n
\r\n \r\n {{truncate(restaurantMenu.Monday)}}\r\n \r\n
\r\n
\r\n
\r\n
\r\n
\r\n Tuesday\r\n
\r\n \r\n {{truncate(restaurantMenu.Tuesday)}}\r\n \r\n
\r\n
\r\n
\r\n
\r\n
\r\n Wednesday\r\n
\r\n \r\n {{truncate(restaurantMenu.Wednesday)}}\r\n \r\n
\r\n
\r\n
\r\n
\r\n
\r\n Thursday\r\n
\r\n \r\n {{truncate(restaurantMenu.Thursday)}}\r\n \r\n
\r\n
\r\n
\r\n
\r\n
\r\n Friday\r\n
\r\n \r\n {{truncate(restaurantMenu.Friday)}}\r\n \r\n
\r\n
\r\n
\r\n
\r\n
\r\n Saturday\r\n
\r\n \r\n {{truncate(restaurantMenu.Saturday)}}\r\n \r\n
\r\n
\r\n
\r\n
\r\n
\r\n Sunday\r\n
\r\n \r\n {{truncate(restaurantMenu.Sunday)}}\r\n \r\n
\r\n
\r\n
\r\n
\r\n
\r\n All week\r\n
\r\n \r\n {{truncate(restaurantMenu.AllWeek)}}\r\n \r\n
\r\n
\r\n
\r\n
\r\n
\r\n \r\n

There are no menus for the restaurant this week.

\r\n
\r\n
\r\n
\r\n\r\n\r\n \r\n\r\n","import { CommonModule } from '@angular/common';\r\nimport { Component, Host, NgModule, OnInit, Optional } from '@angular/core';\r\nimport { MatSelectChange, MatSelectModule } from '@angular/material/select';\r\nimport { Utilities } from '@app/common/utilities';\r\nimport { TextPlaceholderModule } from '@app/components/text-placeholder/text-placeholder.component';\r\nimport { WidgetPlaceholderModule } from '@app/components/widget-placeholder/widget-placeholder.component';\r\nimport { HideParentIfEmptyDirective } from '@app/directives/hide-parent-if-empty.directive';\r\nimport { Restaurant, RestaurantMenu } from '@app/models/restaurant-menu';\r\nimport { LinkModule } from '@app/directives/link.directive';\r\nimport { RestaurantMenuService } from '@app/services/restaurant-menu.service';\r\nimport { RestaurantService } from '@app/services/restaurant.service';\r\nimport { UserChannelTermsService } from '@app/services/user-channel-terms.service';\r\nimport { endOfISOWeek, getISOWeek, startOfISOWeek } from 'date-fns';\r\nimport { BehaviorSubject, EMPTY, forkJoin, Observable } from 'rxjs';\r\nimport { map, mergeMap, tap } from 'rxjs/operators';\r\n\r\n@Component({\r\n selector: 'app-restaurant-menu',\r\n templateUrl: './restaurant-menu.component.html',\r\n styleUrls: ['./restaurant-menu.component.scss']\r\n})\r\nexport class RestaurantMenuComponent implements OnInit {\r\n\r\n private changeSubject = new BehaviorSubject(0);\r\n selectedRestaurant: number;\r\n restaurants$: Observable;\r\n restaurantMenus$: Observable;\r\n currentWeekNumber: number;\r\n startOfISOWeek: Date;\r\n endOfISOWeek: Date;\r\n\r\n constructor(private restaurantService: RestaurantService,\r\n private userChannelTermsService: UserChannelTermsService,\r\n private lunchMenuService: RestaurantMenuService,\r\n @Host() @Optional() private hideParentIfEmptyDirective: HideParentIfEmptyDirective) { }\r\n\r\n handleSelection(event: MatSelectChange) {\r\n this.changeSubject.next(event.value);\r\n }\r\n\r\n truncate(text: string) {\r\n return Utilities.truncate(text, 100);\r\n }\r\n\r\n ngOnInit() {\r\n // we treat week number according to ISO-8601 https://date-fns.org/docs/getISOWeek\r\n this.currentWeekNumber = getISOWeek(new Date());\r\n this.startOfISOWeek = startOfISOWeek(new Date());\r\n this.endOfISOWeek = endOfISOWeek(new Date());\r\n\r\n this.restaurants$ = forkJoin(\r\n [\r\n this.restaurantService.getAllRestaurants(),\r\n this.userChannelTermsService.getUserChannelTerms()\r\n ])\r\n .pipe(\r\n map(([restaurants, userChannels]) => {\r\n return restaurants.map(restaurant => {\r\n restaurant.UserChannelMatched = restaurant.ChannelTermRestaurants.some(restaurantChannel => userChannels.some(userChannel => userChannel.ChannelTermId === restaurantChannel.ChannelTermId));\r\n return restaurant;\r\n });\r\n }),\r\n tap(restaurants => {\r\n if (restaurants && restaurants.length > 0) {\r\n const matchedRestaurant = restaurants.find(restaurant => restaurant.UserChannelMatched) ?? restaurants.find(restaurant => restaurant.ChannelTermRestaurants.length === 0) ?? restaurants[0];\r\n this.selectedRestaurant = matchedRestaurant.Id;\r\n this.changeSubject.next(this.selectedRestaurant);\r\n this.hideParentIfEmptyDirective && this.hideParentIfEmptyDirective.showElement();\r\n } else {\r\n this.hideParentIfEmptyDirective && this.hideParentIfEmptyDirective.hideElement();\r\n }\r\n }));\r\n\r\n this.restaurantMenus$ = this.changeSubject\r\n .pipe(\r\n mergeMap(id => {\r\n if (id > 0) {\r\n return this.lunchMenuService.getCurrentRestaurantMenusForRestaurant(id);\r\n } else {\r\n return EMPTY;\r\n }\r\n }));\r\n }\r\n}\r\n@NgModule({\r\n declarations: [RestaurantMenuComponent],\r\n exports: [RestaurantMenuComponent],\r\n imports: [\r\n CommonModule,\r\n MatSelectModule,\r\n TextPlaceholderModule,\r\n WidgetPlaceholderModule,\r\n LinkModule,\r\n ],\r\n})\r\nexport class RestaurantMenuModule { }\r\n","import { HttpClient, HttpParams } from '@angular/common/http';\r\nimport { Injectable } from '@angular/core';\r\nimport { Constants } from '@app/common/constants';\r\nimport { HttpHelper } from '@app/common/http-helper';\r\nimport { Feed } from '@app/models/Feed';\r\nimport { FeedItem } from '@app/models/feed-item';\r\nimport { FeedInfo } from '@app/models/feed-source-info';\r\nimport { CacheService } from '@app/services/cache.service';\r\nimport { concat, Observable, of } from 'rxjs';\r\nimport { catchError, map, tap } from 'rxjs/operators';\r\nimport { FeatureSettingsStoreService } from '@app/services/feature-settings-store.service';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class FeedService {\r\n\r\n constructor(private featureSettingsStoreService: FeatureSettingsStoreService, private http: HttpClient, private cache: CacheService, private httpHelper: HttpHelper) { }\r\n private readonly cacheKey = 'RssFeedService-getRssFeeds';\r\n\r\n public useCache = true;\r\n\r\n getRssFeeds(feedsInfo: Array, numberOfFeedsToFetch: number): Observable> {\r\n\r\n const paramsFeedUrls = feedsInfo.map(feed => {\r\n return encodeURI(feed.FeedLink);\r\n });\r\n\r\n const paramsTagNames = feedsInfo.map(feed => {\r\n return feed.TagName;\r\n });\r\n\r\n const httpParams = new HttpParams()\r\n .append('feedUrls', paramsFeedUrls.join(', '))\r\n .append('amount', numberOfFeedsToFetch.toString())\r\n .append('feedTagNames', paramsTagNames.join(', '));\r\n\r\n const fetchOperation = this.http.get(`${Constants.API_ENDPOINT}/Feed`,\r\n {\r\n params: httpParams\r\n })\r\n .pipe(\r\n map(data => {\r\n // console.log('RssFeeds' + data);\r\n const results = data as Array;\r\n let allFeedItems = new Array();\r\n results.forEach(items => {\r\n const tmp = items.Items;\r\n allFeedItems = allFeedItems.concat(tmp);\r\n });\r\n\r\n const descendingResult = allFeedItems.sort((a, b) => (a.PublishedDate < b.PublishedDate) ? 1 : ((b.PublishedDate < a.PublishedDate) ? -1 : 0));\r\n return descendingResult;\r\n }),\r\n tap(data => {\r\n this.useCache && this.cache.set(this.cacheKey, data);\r\n }),\r\n catchError(this.httpHelper.handleError({ operation: 'getRssFeeds', result: new Array(), cacheKey: this.cacheKey })));\r\n\r\n if (this.useCache) {\r\n const cachedData = this.cache.get>(this.cacheKey);\r\n if (cachedData) {\r\n return concat(of(cachedData), fetchOperation);\r\n }\r\n }\r\n return fetchOperation;\r\n }\r\n\r\n}\r\n","
\r\n

RSS-feed

\r\n

Read the latest post about us in media.

\r\n\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
{{feedItem.TagName}}
\r\n
{{feedItem.PublishedDate| date}}
\r\n
\r\n

\r\n {{truncate(feedItem.Title)}}\r\n

\r\n
\r\n
\r\n
\r\n
\r\n
amountCurrentlyShowing && amountCurrentlyShowing < amountToFetch && !feedLoading else showLess\">\r\n
\r\n \r\n
\r\n
\r\n \r\n
amountToShowPerLoad && !feedLoading\">\r\n
\r\n \r\n
\r\n
\r\n
\r\n\r\n
\r\n \r\n

No posts to show.

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

Please configure the feed source URI.

\r\n
\r\n
\r\n
\r\n","import { CommonModule } from '@angular/common';\r\nimport { ChangeDetectionStrategy, Component, Host, Inject, Input, NgModule, OnInit, Optional } from '@angular/core';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { WINDOW } from '@app/common/app-tokens';\r\nimport { BreakPoints } from '@app/common/breakpoints';\r\nimport { Utilities } from '@app/common/utilities';\r\nimport { TextPlaceholderModule } from '@app/components/text-placeholder/text-placeholder.component';\r\nimport { WidgetPlaceholderModule } from '@app/components/widget-placeholder/widget-placeholder.component';\r\nimport { HideParentIfEmptyDirective } from '@app/directives/hide-parent-if-empty.directive';\r\nimport { FeedItem } from '@app/models/feed-item';\r\nimport { FeedInfo } from '@app/models/feed-source-info';\r\nimport { LinkModule } from '@app/directives/link.directive';\r\nimport { FeedService } from '@app/services/feed.service';\r\nimport { Observable, of, Subject } from 'rxjs';\r\nimport { concatMap, startWith, tap } from 'rxjs/operators';\r\nimport { RssFeedAmount } from '@app/common/rss-feed';\r\nimport { FeatureSettingsStoreService } from '@app/services/feature-settings-store.service';\r\nimport { UserLanguageTermService } from '@app/services/user-language-term.service';\r\n\r\n@Component({\r\n selector: 'app-rss-feeds',\r\n templateUrl: './rss-feeds.component.html',\r\n styleUrls: ['./rss-feeds.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush\r\n})\r\nexport class RssFeedsComponent implements OnInit {\r\n\r\n @Input() maxNumberOfShowMore = 2; // How may times can you press the show more button\r\n @Input() titleMaxLength = 100;\r\n amountToFetch: number;\r\n amountToShowPerLoad: number;\r\n amountCurrentlyShowing: number;\r\n feedLoading: boolean;\r\n fetchedAmountOfFeeds: number;\r\n feedsFrom: Array;\r\n tagName: string;\r\n isFeedUrlConfigured: boolean;\r\n subscribedToRssFeature: boolean;\r\n feeds$: Observable;\r\n private moreFeedsSubject = new Subject();\r\n rssFeedConfig = this.featureSettingsStoreService.state.rssFeedConfig;\r\n\r\n constructor(private featureSettingsStoreService: FeatureSettingsStoreService,\r\n @Inject(WINDOW) private window: Window,\r\n private service: FeedService,\r\n @Host() @Optional() private hideParentIfEmptyDirective: HideParentIfEmptyDirective,\r\n private userLanguageTermService: UserLanguageTermService, ) { }\r\n\r\n ngOnInit() {\r\n\r\n if (this.rssFeedConfig) {\r\n\r\n // Vary amount of items to show based on screen size (and thus breakpoint).\r\n // Goal: 1) display even amount, and 2) show suitable amount for the resolution\r\n const smallModes = { [BreakPoints.xs]: 2, [BreakPoints.sm]: 2, [BreakPoints.md]: 4, [BreakPoints.lg]: 3, [BreakPoints.xl]: 3, [BreakPoints.xxl]: 4, [BreakPoints.xxxl]: 4 };\r\n const mediumModes = { [BreakPoints.xs]: 4, [BreakPoints.sm]: 4, [BreakPoints.md]: 8, [BreakPoints.lg]: 6, [BreakPoints.xl]: 6, [BreakPoints.xxl]: 8, [BreakPoints.xxxl]: 8 };\r\n const breakpoint = Utilities.getCurrentBootstrapBreakpoint(this.window);\r\n if (this.rssFeedConfig.amountToShowPerLoad === RssFeedAmount.Small) {\r\n this.amountToShowPerLoad = smallModes[breakpoint];\r\n } else { // Medium\r\n this.amountToShowPerLoad = mediumModes[breakpoint];\r\n }\r\n\r\n this.amountToFetch = this.amountToShowPerLoad * (this.maxNumberOfShowMore + 1);\r\n\r\n this.subscribedToRssFeature = true;\r\n this.feedsFrom = this.rssFeedConfig.feedLinksAndTagName;\r\n this.amountCurrentlyShowing = this.amountToShowPerLoad;\r\n\r\n if (this.feedsFrom.length > 0) {\r\n this.hideParentIfEmptyDirective && this.hideParentIfEmptyDirective.showElement();\r\n this.isFeedUrlConfigured = true;\r\n this.feeds$ = this.moreFeedsSubject\r\n .pipe(startWith(this.amountCurrentlyShowing))\r\n .pipe(concatMap((amount) => {\r\n this.amountCurrentlyShowing = amount;\r\n this.feedLoading = true;\r\n // filter feed links based on user interests to rss feed language setting in admin center\r\n return this.userLanguageTermService.getUserLanguageTerms()\r\n .pipe(\r\n concatMap((userChannelTerms) => {\r\n const feedinfo = this.feedsFrom.filter(feeds => userChannelTerms.some(channelTerm => (channelTerm.LanguageTermId === feeds.Language)) || !feeds.Language || feeds.Language === '');\r\n if (feedinfo.length > 0) {\r\n return this.service.getRssFeeds(feedinfo, this.amountToFetch);\r\n } else {\r\n return of([]);\r\n }\r\n })\r\n );\r\n }))\r\n .pipe(tap((feeds) => {\r\n if (feeds.length === 0) {\r\n this.hideParentIfEmptyDirective && this.hideParentIfEmptyDirective.hideElement();\r\n } else {\r\n this.hideParentIfEmptyDirective && this.hideParentIfEmptyDirective.showElement();\r\n this.fetchedAmountOfFeeds = feeds.length;\r\n if (this.fetchedAmountOfFeeds > this.amountCurrentlyShowing) {\r\n feeds.splice(this.amountCurrentlyShowing, this.fetchedAmountOfFeeds);\r\n }\r\n this.feedLoading = false;\r\n }\r\n }));\r\n } else {\r\n this.isFeedUrlConfigured = false;\r\n this.hideParentIfEmptyDirective && this.hideParentIfEmptyDirective.hideElement();\r\n }\r\n } else {\r\n this.hideParentIfEmptyDirective && this.hideParentIfEmptyDirective.hideElement();\r\n this.subscribedToRssFeature = false;\r\n }\r\n }\r\n\r\n showMoreFeeds() {\r\n this.amountCurrentlyShowing = this.amountCurrentlyShowing + this.amountToShowPerLoad;\r\n this.moreFeedsSubject.next(this.amountCurrentlyShowing);\r\n }\r\n\r\n showLessFeeds() {\r\n this.amountCurrentlyShowing = this.amountToShowPerLoad;\r\n this.moreFeedsSubject.next(this.amountCurrentlyShowing);\r\n }\r\n\r\n truncate(text: string) {\r\n return Utilities.truncate(text, this.titleMaxLength);\r\n }\r\n}\r\n\r\n@NgModule({\r\n declarations: [RssFeedsComponent],\r\n exports: [RssFeedsComponent],\r\n imports: [\r\n CommonModule,\r\n MatButtonModule,\r\n TextPlaceholderModule,\r\n WidgetPlaceholderModule,\r\n LinkModule,\r\n ]\r\n})\r\nexport class RssFeedsModule { }\r\n","import { Directive, ElementRef, NgModule, OnInit } from '@angular/core';\r\nimport { Router } from '@angular/router';\r\nimport { Constants } from '@app/common/constants';\r\nimport { Component } from '@app/models/component';\r\nimport { ComponentState } from '@app/models/component-state';\r\nimport { CacheService } from '@app/services/cache.service';\r\nimport { ComponentStatesOnRoutesService } from '@app/services/component-states-on-routes.service';\r\n\r\n@Directive({\r\n selector: '[appMarkComponentVisited]'\r\n})\r\nexport class MarkComponentVisitedDirective implements OnInit {\r\n\r\n constructor(\r\n private cacheService: CacheService,\r\n private elementRef: ElementRef,\r\n private router: Router,\r\n private componentStatesOnRoutesService: ComponentStatesOnRoutesService) { }\r\n\r\n ngOnInit(): void {\r\n this.cacheService.set(`${this.elementRef.nativeElement.localName}-${Constants.COMPONENT_VISITED_CACHEKEY_SUFFIX}`, new Date().toISOString());\r\n const componentConfigMap = {};\r\n const htmlElement = this.elementRef.nativeElement as HTMLElement;\r\n const attributeNames = htmlElement.getAttributeNames();\r\n\r\n attributeNames.forEach(name => {\r\n if (name && name.indexOf('ng') === -1) {\r\n const attributeValue = htmlElement.getAttribute(name);\r\n if (attributeValue) {\r\n componentConfigMap[name.toLocaleLowerCase()] = attributeValue;\r\n }\r\n }\r\n });\r\n\r\n this.componentStatesOnRoutesService.updateStates(\r\n new ComponentState({\r\n ComponentId: this.elementRef.nativeElement.localName,\r\n Routes: [this.router.url],\r\n ShowBadge: false,\r\n Refresh: false,\r\n Component: new Component({ Configurations: componentConfigMap }),\r\n LastCheckedForNewContent: new Date()\r\n }));\r\n }\r\n}\r\n@NgModule({\r\n declarations: [MarkComponentVisitedDirective],\r\n exports: [MarkComponentVisitedDirective],\r\n})\r\nexport class MarkComponentVisitedModule { }\r\n","import { Injectable, Inject } from '@angular/core';\r\nimport { Observable, concat, of, Subject, combineLatest } from 'rxjs';\r\nimport { catchError, map, shareReplay, takeUntil, tap } from 'rxjs/operators';\r\nimport { HttpHelper } from '@app/common/http-helper';\r\nimport { CacheService } from '@app/services/cache.service';\r\nimport { NewsPage } from '@app/models/news-page';\r\nimport { CUSTOMERENVIRONMENT } from '@app/common/app-tokens';\r\nimport { UserChannelTerm } from '@app/models/user-channel-term';\r\nimport { SearchPostQuery, SearchPostQueryRequest } from '@app/models/search-post-query';\r\nimport { SearchService } from '@app/services/search.service';\r\nimport { FeatureSettingsStoreService } from '@app/services/feature-settings-store.service';\r\nimport { CultureService } from '@app/services/culture.service';\r\nimport { CafcassEnvironment } from '../../environments/cafcassEnvironment';\r\nimport { HttpParams, HttpClient } from '@angular/common/http';\r\nimport { ListItem } from '@microsoft/microsoft-graph-types';\r\nimport { ChannelService } from '@app/services/channel.service';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class BlogService {\r\n\r\n private readonly cacheKeyPrefix = 'BlogService';\r\n\r\n public useCache = true;\r\n\r\n private getModernPersonalNewsFromBlogSite$: Observable>;\r\n private getModernBlogPostsFromSearch$ = new Map>>();\r\n private reloadGetModernBlogPostsFromSearch$ = new Subject();\r\n private readonly translationFields = '_SPIsTranslation,_SPTranslatedLanguages,_SPTranslationSourceItemId,_SPTranslationLanguage';\r\n\r\n constructor(@Inject(CUSTOMERENVIRONMENT) private environment: CafcassEnvironment,\r\n private cache: CacheService,\r\n private featureSettingsStoreService: FeatureSettingsStoreService,\r\n private searchService: SearchService,\r\n private cultureService: CultureService,\r\n private httpHelper: HttpHelper,\r\n private http: HttpClient,\r\n private channelService: ChannelService) { }\r\n\r\n getPersonalModernBlogPostsFromBlogSiteFromSearch(amount: number, channels?: Array): Observable> {\r\n\r\n const channelsMngProp = this.environment.featureSettings.managedPropertyConfig.newsChannelManagedProperty;\r\n\r\n let channelQuery = '';\r\n if (channels?.length > 0) {\r\n const joinedChannels = channels.map(c => channelsMngProp + ':' + c.ChannelTermId).join(' OR ');\r\n channelQuery = `(${joinedChannels})`;\r\n }\r\n\r\n // Searching for pages where channel is empty comes from this suggestion: https://fivep.com.au/kierans-tech-talk-searching-for-empty-managed-mecolumns/\r\n channelQuery = `(${channelQuery} OR NOT(${channelsMngProp}:G*))`;\r\n\r\n let languageFilterQuery = '';\r\n if (this.featureSettingsStoreService.state.enableModernSPNewsLanguageFilter) {\r\n languageFilterQuery = ` AND ((SPTranslationLanguage:${this.cultureService.getLocaleWithSuffix().toLowerCase()} AND SPIsTranslation:true) OR (NOT(SPIsTranslation:true) AND NOT(SPTranslatedLanguages:${this.cultureService.getLocaleWithSuffix().toLowerCase()})))`;\r\n }\r\n\r\n const fromSite = `SiteName:${this.environment.blogSiteUrl}`;\r\n const query = `(ContentTypeId: 0x0101009D1CB255DA76424F860D91F20E6C4118* AND PromotedState: 2${languageFilterQuery}) AND ${fromSite} AND ${channelQuery}`;\r\n\r\n return this.getModernNewsFromSearch(amount, query);\r\n\r\n }\r\n\r\n getModernNewsFromSearch(amount: number, query: string): Observable> {\r\n const params = `${amount.toString()}-${query}`;\r\n\r\n if (this.getModernBlogPostsFromSearch$.has(params)) {\r\n return this.getModernBlogPostsFromSearch$.get(params);\r\n } else {\r\n const cacheKey = `${this.cacheKeyPrefix}-${'getModernBlogPostsFromSearch'}-${params}`;\r\n\r\n const postQuery = new SearchPostQuery({\r\n request: new SearchPostQueryRequest({\r\n Querytext: query,\r\n RowLimit: amount,\r\n EnableSorting: true,\r\n TrimDuplicates: true,\r\n SortList: [\r\n {\r\n 'Property': 'FirstPublishedDate',\r\n 'Direction': 1\r\n }\r\n ],\r\n SelectProperties: [\r\n 'Title',\r\n 'EditorOwsUser',\r\n 'ModifiedBy',\r\n 'LastModifiedBy',\r\n 'Description',\r\n 'Path',\r\n 'PictureThumbnailURL',\r\n 'LastModifiedTime',\r\n 'FirstPublishedDate',\r\n 'SPWebUrl',\r\n 'SPIsTranslation',\r\n 'SPTranslationLanguage',\r\n 'SPTranslationSourceItemId',\r\n 'SPTranslatedLanguages',\r\n 'SiteName',\r\n this.environment.featureSettings.managedPropertyConfig.newsAmountOfCommentsManagedProperty,\r\n this.environment.featureSettings.managedPropertyConfig.newsAmountOfLikesManagedProperty,\r\n this.environment.featureSettings.managedPropertyConfig.newsChannelManagedProperty,\r\n this.environment.featureSettings.managedPropertyConfig.newsIsTopNewsManagedProperty,\r\n ],\r\n Properties: [\r\n {\r\n Name: 'EnableDynamicGroups',\r\n Value: {\r\n BoolVal: 'True',\r\n QueryPropertyValueTypeIndex: 3\r\n }\r\n } // include results form private groups - https://www.techmikael.com/2017/01/retrieving-search-results-from-private.html\r\n ]\r\n })\r\n });\r\n\r\n this.getModernBlogPostsFromSearch$.set(params, this.searchService.sendPostSearchQuery(postQuery)\r\n .pipe(\r\n map(data => {\r\n const parsedResults = data.map(item => {\r\n return NewsPage.fromSearchResult(item,\r\n this.environment.featureSettings.managedPropertyConfig.newsAmountOfCommentsManagedProperty,\r\n this.environment.featureSettings.managedPropertyConfig.newsAmountOfLikesManagedProperty,\r\n this.environment.featureSettings.managedPropertyConfig.newsChannelManagedProperty,\r\n this.environment.featureSettings.managedPropertyConfig.newsLanguageManagedProperty);\r\n });\r\n this.useCache && this.cache.set(cacheKey, parsedResults);\r\n return parsedResults;\r\n }),\r\n catchError(this.httpHelper.handleError({ operation: 'getModernBlogPostsFromSearch', result: new Array(), rethrow: true, cacheKey: cacheKey })),\r\n takeUntil(this.reloadGetModernBlogPostsFromSearch$),\r\n shareReplay({ bufferSize: 1, refCount: true })));\r\n\r\n if (this.useCache) {\r\n const cachedData = this.cache.get(cacheKey);\r\n if (cachedData) {\r\n return concat(of(cachedData), this.getModernBlogPostsFromSearch$.get(params));\r\n }\r\n }\r\n return this.getModernBlogPostsFromSearch$.get(params);\r\n }\r\n }\r\n\r\n getMyModernPersonalNewsFromBlogSite(userChannelTerms$: Observable>) {\r\n if (this.getModernPersonalNewsFromBlogSite$) {\r\n return this.getModernPersonalNewsFromBlogSite$;\r\n } else {\r\n const cacheKey = `${this.cacheKeyPrefix}-${'getMyModernPersonalNewsFromGraph'}`;\r\n const newsCenterSite = this.environment.blogSiteUrl;\r\n const listsRequest = `${newsCenterSite}/_api/v2.0/sharePoint/getBaseItemByUrl(url='/SitePages')/items`;\r\n const selectFields = `Title,BannerImageUrl,BoolField_Channel,Description,_CommentCount,_LikeCount,PromotedState,FirstPublishedDate${this.featureSettingsStoreService.state.enableModernSPNewsLanguageFilter ? ',' + this.translationFields : ''}`;\r\n let httpParams = new HttpParams()\r\n .append('expand', `fields(select=${selectFields})`)\r\n .append('orderby', 'fields/FirstPublishedDate desc')\r\n .append('select', 'fields,id,webUrl')\r\n .append('top', '100');\r\n if (this.featureSettingsStoreService.state.enableModernSPNewsLanguageFilter) {\r\n // Filter reads like this: Get only non-top news where the page has been translated to our language or the apge is not translated and has no translations to our language.\r\n httpParams = httpParams.append('filter', `(fields/PromotedState eq 2) and ((fields/_SPTranslationLanguage eq '${this.cultureService.getLocaleWithSuffix().toLowerCase()}' and fields/_SPIsTranslation eq 1) or (fields/_SPIsTranslation ne 1 and fields/_SPTranslatedLanguages ne '${this.cultureService.getLocaleWithSuffix().toLowerCase()}'))`);\r\n } else {\r\n // Filter reads like this: Get only non-top top news\r\n httpParams = httpParams.append('filter', `(fields/PromotedState eq 2)`);\r\n }\r\n\r\n const httpCall$ = this.http\r\n .get(listsRequest, {\r\n params: httpParams,\r\n headers: {\r\n 'Prefer': 'HonorNonIndexedQueriesWarningMayFailRandomly'\r\n }\r\n });\r\n const getMyModernPersonalNewsFromSite$ = combineLatest([userChannelTerms$, httpCall$])\r\n .pipe(\r\n map(([userChannelTerms, listItemResult]) => {\r\n const listItems = listItemResult.value as ListItem[];\r\n return listItems.map(item => {\r\n return new NewsPage({\r\n Title: item.fields['Title'],\r\n PublishedDate: item.fields['FirstPublishedDate'],\r\n Channels: item.fields['BoolField_Channel'],\r\n Picture: item.fields['BannerImageUrl'] ? item.fields['BannerImageUrl'].Url : null,\r\n Description: item.fields['Description'],\r\n CommentsCount: item.fields['_CommentCount'] ? item.fields['_CommentCount'] : 0,\r\n LikesCount: item.fields['_LikeCount'] ? item.fields['_LikeCount'] : 0,\r\n Path: item.webUrl,\r\n IsSharePointNews: true\r\n });\r\n }).filter(i => {\r\n const channelTerms = i.Channels;\r\n if (channelTerms && channelTerms.length > 0) {\r\n let found = true;\r\n const matchingChannels = i.Channels.filter(c => {\r\n found = userChannelTerms.some(ct => ct.ChannelTermId === c.TermGuid);\r\n if (found) {\r\n return c;\r\n }\r\n });\r\n if (matchingChannels && matchingChannels.length > 0) {\r\n return i;\r\n }\r\n } else {\r\n return i;\r\n }\r\n });\r\n }));\r\n\r\n this.getModernPersonalNewsFromBlogSite$ = getMyModernPersonalNewsFromSite$\r\n .pipe(\r\n tap(data => {\r\n this.useCache && this.cache.set(cacheKey, data);\r\n }),\r\n catchError(this.httpHelper.handleError({ operation: 'getMyModernPersonalNewsFromSite', result: new Array(), rethrow: true, cacheKey: cacheKey })),\r\n shareReplay({ bufferSize: 1, refCount: true })\r\n );\r\n\r\n if (this.useCache) {\r\n const cachedData = this.cache.get>(cacheKey);\r\n if (cachedData) {\r\n return concat(of(cachedData), this.getModernPersonalNewsFromBlogSite$);\r\n }\r\n }\r\n return this.getModernPersonalNewsFromBlogSite$;\r\n }\r\n }\r\n}\r\n","
\r\n \r\n \r\n Go to the blog center\r\n \r\n \r\n\r\n
\r\n \r\n
\r\n

Blog posts

\r\n Here you'll find the latest blog posts from your personal feed. Update your selected channels on your settings page. When you click on a post, it will open in a new tab. You can navigate back here at any time by closing or switching the tab.\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

No blog posts could be found according to your channel selections.

\r\n
\r\n
\r\n\r\n
\r\n
\r\n \r\n
\r\n
\r\n
\r\n
\r\n\r\n \r\n
\r\n \r\n
\r\n
\r\n\r\n
amountOfBlogPostsToDisplayCurrently && !loading && numberOfShowMoreClicks < maxNumberOfShowMore else linkToBlogCenter\">\r\n
\r\n \r\n
\r\n
\r\n\r\n \r\n
\r\n For older blog posts, open Blog Center\r\n
\r\n
\r\n
\r\n","import { Component, OnInit, Input, ChangeDetectionStrategy, NgModule, Inject } from '@angular/core';\r\nimport { SiteService } from '@app/services/site.service';\r\nimport { Observable, Subject, of } from 'rxjs';\r\nimport { NewsPage } from '@app/models/news-page';\r\nimport { startWith, map, catchError, mergeMap } from 'rxjs/operators';\r\nimport { UserChannelTermsService } from '@app/services/user-channel-terms.service';\r\nimport { ActionLinkModule } from '@app/components/actions/action-link/action-link.component';\r\nimport { WidgetPlaceholderModule } from '@app/components/widget-placeholder/widget-placeholder.component';\r\nimport { TextPlaceholderModule } from '@app/components/text-placeholder/text-placeholder.component';\r\nimport { ErrorTemplatesModule } from '@app/components/error-templates/error-templates.component';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { CommonModule } from '@angular/common';\r\nimport { LinkModule } from '@app/directives/link.directive';\r\nimport { RouterModule } from '@angular/router';\r\nimport { NewsCardListModule } from '@app/components/news-card-list/news-card-list.component';\r\nimport { BlogService } from '../services/blog.service';\r\nimport { CUSTOMERENVIRONMENT } from '@app/common/app-tokens';\r\nimport { CafcassEnvironment } from '../../environments/cafcassEnvironment';\r\n\r\n@Component({\r\n selector: 'app-custom-my-blogs',\r\n templateUrl: './custom-my-blogs.component.html',\r\n styleUrls: ['./custom-my-blogs.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush\r\n})\r\nexport class CustomMyBlogsComponent implements OnInit {\r\n\r\n @Input() amountOfBlogPostsToDisplay = 6;\r\n @Input() maxNumberOfShowMore = 2; // How many times can you press the show more button\r\n\r\n private errorSubject$ = new Subject();\r\n private moreBlogPostsSubject = new Subject();\r\n personalBlogItems$: Observable>;\r\n\r\n fetchedAmountOfPosts = 0;\r\n amountOfNewsToIncreaseWith = this.amountOfBlogPostsToDisplay;\r\n amountOfBlogPostsToDisplayCurrently = this.amountOfBlogPostsToDisplay;\r\n numberOfShowMoreClicks = 0;\r\n\r\n blogCenterUrl: string;\r\n loading = false;\r\n\r\n constructor(@Inject(CUSTOMERENVIRONMENT) private environment: CafcassEnvironment,\r\n private service: BlogService,\r\n private userChannelTermsService: UserChannelTermsService,\r\n private siteService: SiteService) { }\r\n\r\n ngOnInit() {\r\n\r\n this.blogCenterUrl = this.environment.blogSiteUrl;\r\n\r\n this.personalBlogItems$ = this.moreBlogPostsSubject\r\n .pipe(\r\n startWith(this.amountOfBlogPostsToDisplayCurrently + 1),\r\n mergeMap(() => {\r\n this.loading = true;\r\n const channels$ = this.userChannelTermsService.getUserChannelTerms();\r\n return this.service.getMyModernPersonalNewsFromBlogSite(channels$);\r\n }),\r\n map((pages) => {\r\n pages.forEach(page => {\r\n if (page && (!page.SiteName || !page.SiteUrl)) {\r\n page.SiteInfo$ = this.siteService.getSiteInfoFromUrl(page.Path);\r\n }\r\n });\r\n\r\n this.fetchedAmountOfPosts = pages.length;\r\n if (this.fetchedAmountOfPosts > this.amountOfBlogPostsToDisplayCurrently) {\r\n pages = pages.slice(0, this.amountOfBlogPostsToDisplayCurrently);\r\n }\r\n this.loading = false;\r\n return pages;\r\n }),\r\n catchError(err => {\r\n this.errorSubject$.next(err);\r\n return of(null);\r\n }));\r\n }\r\n\r\n showMoreBlogPosts() {\r\n this.numberOfShowMoreClicks++;\r\n this.amountOfBlogPostsToDisplayCurrently = this.amountOfBlogPostsToDisplayCurrently + this.amountOfNewsToIncreaseWith;\r\n this.loading = true;\r\n this.moreBlogPostsSubject.next(this.amountOfBlogPostsToDisplayCurrently + 1);\r\n }\r\n}\r\n@NgModule({\r\n entryComponents: [CustomMyBlogsComponent],\r\n declarations: [CustomMyBlogsComponent],\r\n exports: [CustomMyBlogsComponent],\r\n imports: [\r\n CommonModule,\r\n NewsCardListModule,\r\n LinkModule,\r\n ActionLinkModule,\r\n MatButtonModule,\r\n RouterModule,\r\n ErrorTemplatesModule,\r\n TextPlaceholderModule,\r\n WidgetPlaceholderModule\r\n ]\r\n})\r\nexport class CustomMyBlogsModule { }\r\n","import { Injectable, Inject } from '@angular/core';\r\nimport { Observable, concat, of, Subject, combineLatest } from 'rxjs';\r\nimport { catchError, map, shareReplay, takeUntil, tap } from 'rxjs/operators';\r\nimport { HttpHelper } from '@app/common/http-helper';\r\nimport { CacheService } from '@app/services/cache.service';\r\nimport { NewsPage } from '@app/models/news-page';\r\nimport { CUSTOMERENVIRONMENT } from '@app/common/app-tokens';\r\nimport { UserChannelTerm } from '@app/models/user-channel-term';\r\nimport { SearchPostQuery, SearchPostQueryRequest } from '@app/models/search-post-query';\r\nimport { SearchService } from '@app/services/search.service';\r\nimport { FeatureSettingsStoreService } from '@app/services/feature-settings-store.service';\r\nimport { CultureService } from '@app/services/culture.service';\r\nimport { CafcassEnvironment } from '../../environments/cafcassEnvironment';\r\nimport { HttpParams, HttpClient } from '@angular/common/http';\r\nimport { ListItem } from '@microsoft/microsoft-graph-types';\r\nimport { ChannelService } from '@app/services/channel.service';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class ComplimentsService {\r\n\r\n constructor(@Inject(CUSTOMERENVIRONMENT) private environment: CafcassEnvironment,\r\n private cache: CacheService,\r\n private featureSettingsStoreService: FeatureSettingsStoreService,\r\n private searchService: SearchService,\r\n private cultureService: CultureService,\r\n private httpHelper: HttpHelper,\r\n private http: HttpClient,\r\n private channelService: ChannelService) { }\r\n\r\n private readonly cacheKeyPrefix = 'ComplimentService';\r\n\r\n public useCache = true;\r\n\r\n private getModernComplimentPostsFromSearch$ = new Map>>();\r\n private reloadGetModernComplimentPostsFromSearch$ = new Subject();\r\n private getModernPersonalNewsFromComplimentSite$: Observable>;\r\n private readonly translationFields = '_SPIsTranslation,_SPTranslatedLanguages,_SPTranslationSourceItemId,_SPTranslationLanguage';\r\n\r\n getPersonalModernComplimentsFromComplimentSiteFromSearch(amount: number, channels?: Array): Observable> {\r\n\r\n const channelsMngProp = this.environment.featureSettings.managedPropertyConfig.newsChannelManagedProperty;\r\n\r\n let channelQuery = '';\r\n if (channels?.length > 0) {\r\n const joinedChannels = channels.map(c => channelsMngProp + ':' + c.ChannelTermId).join(' OR ');\r\n channelQuery = `(${joinedChannels})`;\r\n }\r\n\r\n // Searching for pages where channel is empty comes from this suggestion: https://fivep.com.au/kierans-tech-talk-searching-for-empty-managed-metadata-columns/\r\n channelQuery = `(${channelQuery} OR NOT(${channelsMngProp}:G*))`;\r\n\r\n let languageFilterQuery = '';\r\n if (this.featureSettingsStoreService.state.enableModernSPNewsLanguageFilter) {\r\n languageFilterQuery = ` AND ((SPTranslationLanguage:${this.cultureService.getLocaleWithSuffix().toLowerCase()} AND SPIsTranslation:true) OR (NOT(SPIsTranslation:true) AND NOT(SPTranslatedLanguages:${this.cultureService.getLocaleWithSuffix().toLowerCase()})))`;\r\n }\r\n\r\n const fromSite = `SiteName:${this.environment.complimentsWallSiteUrl}`;\r\n const query = `(ContentTypeId: 0x0101009D1CB255DA76424F860D91F20E6C4118* AND PromotedState: 2${languageFilterQuery}) AND ${fromSite} AND ${channelQuery}`;\r\n\r\n return this.getModernNewsFromSearch(amount, query);\r\n\r\n }\r\n\r\n getModernNewsFromSearch(amount: number, query: string): Observable> {\r\n const params = `${amount.toString()}-${query}`;\r\n\r\n if (this.getModernComplimentPostsFromSearch$.has(params)) {\r\n return this.getModernComplimentPostsFromSearch$.get(params);\r\n } else {\r\n const cacheKey = `${this.cacheKeyPrefix}-${'getModernComplimentPostsFromSearch'}-${params}`;\r\n\r\n const postQuery = new SearchPostQuery({\r\n request: new SearchPostQueryRequest({\r\n Querytext: query,\r\n RowLimit: amount,\r\n EnableSorting: true,\r\n TrimDuplicates: true,\r\n SortList: [\r\n {\r\n 'Property': 'FirstPublishedDate',\r\n 'Direction': 1\r\n }\r\n ],\r\n SelectProperties: [\r\n 'Title',\r\n 'EditorOwsUser',\r\n 'ModifiedBy',\r\n 'LastModifiedBy',\r\n 'Description',\r\n 'Path',\r\n 'PictureThumbnailURL',\r\n 'LastModifiedTime',\r\n 'FirstPublishedDate',\r\n 'SPWebUrl',\r\n 'SPIsTranslation',\r\n 'SPTranslationLanguage',\r\n 'SPTranslationSourceItemId',\r\n 'SPTranslatedLanguages',\r\n 'SiteName',\r\n this.environment.featureSettings.managedPropertyConfig.newsAmountOfCommentsManagedProperty,\r\n this.environment.featureSettings.managedPropertyConfig.newsAmountOfLikesManagedProperty,\r\n this.environment.featureSettings.managedPropertyConfig.newsChannelManagedProperty,\r\n this.environment.featureSettings.managedPropertyConfig.newsIsTopNewsManagedProperty,\r\n ],\r\n Properties: [\r\n {\r\n Name: 'EnableDynamicGroups',\r\n Value: {\r\n BoolVal: 'True',\r\n QueryPropertyValueTypeIndex: 3\r\n }\r\n } // include results form private groups - https://www.techmikael.com/2017/01/retrieving-search-results-from-private.html\r\n ]\r\n })\r\n });\r\n\r\n this.getModernComplimentPostsFromSearch$.set(params, this.searchService.sendPostSearchQuery(postQuery)\r\n .pipe(\r\n map(data => {\r\n const parsedResults = data.map(item => {\r\n return NewsPage.fromSearchResult(item,\r\n this.environment.featureSettings.managedPropertyConfig.newsAmountOfCommentsManagedProperty,\r\n this.environment.featureSettings.managedPropertyConfig.newsAmountOfLikesManagedProperty,\r\n this.environment.featureSettings.managedPropertyConfig.newsChannelManagedProperty,\r\n this.environment.featureSettings.managedPropertyConfig.newsLanguageManagedProperty);\r\n });\r\n this.useCache && this.cache.set(cacheKey, parsedResults);\r\n return parsedResults;\r\n }),\r\n catchError(this.httpHelper.handleError({ operation: 'getModernComplimentPostsFromSearch', result: new Array(), rethrow: true, cacheKey: cacheKey })),\r\n takeUntil(this.reloadGetModernComplimentPostsFromSearch$),\r\n shareReplay({ bufferSize: 1, refCount: true })));\r\n\r\n if (this.useCache) {\r\n const cachedData = this.cache.get(cacheKey);\r\n if (cachedData) {\r\n return concat(of(cachedData), this.getModernComplimentPostsFromSearch$.get(params));\r\n }\r\n }\r\n return this.getModernComplimentPostsFromSearch$.get(params);\r\n }\r\n }\r\n\r\n getMyModernPersonalNewsFromComplimentSite(userChannelTerms$: Observable>) {\r\n if (this.getModernPersonalNewsFromComplimentSite$) {\r\n return this.getModernPersonalNewsFromComplimentSite$;\r\n } else {\r\n const cacheKey = `${this.cacheKeyPrefix}-${'getMyModernPersonalNewsFromGraph'}`;\r\n const newsCenterSite = this.environment.complimentsWallSiteUrl;\r\n const listsRequest = `${newsCenterSite}/_api/v2.0/sharePoint/getBaseItemByUrl(url='/SitePages')/items`;\r\n const selectFields = `Title,BannerImageUrl,BoolField_Channel,Description,_CommentCount,_LikeCount,PromotedState,FirstPublishedDate${this.featureSettingsStoreService.state.enableModernSPNewsLanguageFilter ? ',' + this.translationFields : ''}`;\r\n let httpParams = new HttpParams()\r\n .append('expand', `fields(select=${selectFields})`)\r\n .append('orderby', 'fields/FirstPublishedDate desc')\r\n .append('select', 'fields,id,webUrl')\r\n .append('top', '100');\r\n if (this.featureSettingsStoreService.state.enableModernSPNewsLanguageFilter) {\r\n // Filter reads like this: Get only non-top news where the page has been translated to our language or the apge is not translated and has no translations to our language.\r\n httpParams = httpParams.append('filter', `(fields/PromotedState eq 2) and ((fields/_SPTranslationLanguage eq '${this.cultureService.getLocaleWithSuffix().toLowerCase()}' and fields/_SPIsTranslation eq 1) or (fields/_SPIsTranslation ne 1 and fields/_SPTranslatedLanguages ne '${this.cultureService.getLocaleWithSuffix().toLowerCase()}'))`);\r\n } else {\r\n // Filter reads like this: Get only non-top top news\r\n httpParams = httpParams.append('filter', `(fields/PromotedState eq 2)`);\r\n }\r\n\r\n const httpCall$ = this.http\r\n .get(listsRequest, {\r\n params: httpParams,\r\n headers: {\r\n 'Prefer': 'HonorNonIndexedQueriesWarningMayFailRandomly'\r\n }\r\n });\r\n const getMyModernPersonalNewsFromSite$ = combineLatest([userChannelTerms$, httpCall$])\r\n .pipe(\r\n map(([userChannelTerms, listItemResult]) => {\r\n const listItems = listItemResult.value as ListItem[];\r\n return listItems.map(item => {\r\n return new NewsPage({\r\n Title: item.fields['Title'],\r\n PublishedDate: item.fields['FirstPublishedDate'],\r\n Channels: item.fields['BoolField_Channel'],\r\n Picture: item.fields['BannerImageUrl'] ? item.fields['BannerImageUrl'].Url : null,\r\n Description: item.fields['Description'],\r\n CommentsCount: item.fields['_CommentCount'] ? item.fields['_CommentCount'] : 0,\r\n LikesCount: item.fields['_LikeCount'] ? item.fields['_LikeCount'] : 0,\r\n Path: item.webUrl,\r\n IsSharePointNews: true\r\n });\r\n }).filter(i => {\r\n const channelTerms = i.Channels;\r\n if (channelTerms && channelTerms.length > 0) {\r\n let found = true;\r\n const matchingChannels = i.Channels.filter(c => {\r\n found = userChannelTerms.some(ct => ct.ChannelTermId === c.TermGuid);\r\n if (found) {\r\n return c;\r\n }\r\n });\r\n if (matchingChannels && matchingChannels.length > 0) {\r\n return i;\r\n }\r\n } else {\r\n return i;\r\n }\r\n });\r\n }));\r\n\r\n this.getModernPersonalNewsFromComplimentSite$ = getMyModernPersonalNewsFromSite$\r\n .pipe(\r\n tap(data => {\r\n this.useCache && this.cache.set(cacheKey, data);\r\n }),\r\n catchError(this.httpHelper.handleError({ operation: 'getMyModernPersonalNewsFromSite', result: new Array(), rethrow: true, cacheKey: cacheKey })),\r\n shareReplay({ bufferSize: 1, refCount: true })\r\n );\r\n\r\n if (this.useCache) {\r\n const cachedData = this.cache.get>(cacheKey);\r\n if (cachedData) {\r\n return concat(of(cachedData), this.getModernPersonalNewsFromComplimentSite$);\r\n }\r\n }\r\n return this.getModernPersonalNewsFromComplimentSite$;\r\n }\r\n }\r\n\r\n}\r\n","
\r\n \r\n \r\n See more compliments\r\n \r\n \r\n\r\n
\r\n \r\n
\r\n

Celebrating excellence

\r\n Read the compliments we have received about our practice and our people, and compliments from our partners.\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

No compliments could be found according to your channel selections.

\r\n
\r\n
\r\n\r\n
\r\n
\r\n \r\n
\r\n
\r\n
\r\n
\r\n\r\n \r\n
\r\n \r\n
\r\n
\r\n\r\n
amountOfComplimentPostsToDisplayCurrently && !loading && numberOfShowMoreClicks < maxNumberOfShowMore else linkToComplimentsCenter\">\r\n
\r\n \r\n
\r\n
\r\n\r\n \r\n
\r\n For older compliments, Click here\r\n
\r\n
\r\n
\r\n","import { Component, OnInit, Input, ChangeDetectionStrategy, NgModule, Inject } from '@angular/core';\r\nimport { SiteService } from '@app/services/site.service';\r\nimport { Observable, Subject, of } from 'rxjs';\r\nimport { NewsPage } from '@app/models/news-page';\r\nimport { startWith, map, catchError, mergeMap } from 'rxjs/operators';\r\nimport { UserChannelTermsService } from '@app/services/user-channel-terms.service';\r\nimport { ActionLinkModule } from '@app/components/actions/action-link/action-link.component';\r\nimport { WidgetPlaceholderModule } from '@app/components/widget-placeholder/widget-placeholder.component';\r\nimport { TextPlaceholderModule } from '@app/components/text-placeholder/text-placeholder.component';\r\nimport { ErrorTemplatesModule } from '@app/components/error-templates/error-templates.component';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { CommonModule } from '@angular/common';\r\nimport { LinkModule } from '@app/directives/link.directive';\r\nimport { RouterModule } from '@angular/router';\r\nimport { NewsCardListModule } from '@app/components/news-card-list/news-card-list.component';\r\nimport { ComplimentsService } from '../services/compliments.service';\r\nimport { CUSTOMERENVIRONMENT } from '@app/common/app-tokens';\r\nimport { CafcassEnvironment } from '../../environments/cafcassEnvironment';\r\n\r\n@Component({\r\n selector: 'app-custom-compliments-wall',\r\n templateUrl: './custom-compliments-wall.component.html',\r\n styleUrls: ['./custom-compliments-wall.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush\r\n})\r\nexport class CustomComplimentsWallComponent implements OnInit {\r\n\r\n @Input() amountOfComplimentsToDisplay = 6;\r\n @Input() maxNumberOfShowMore = 2; // How many times can you press the show more button\r\n\r\n private errorSubject$ = new Subject();\r\n private moreComplimentPostsSubject = new Subject();\r\n personalComplimentItems$: Observable>;\r\n\r\n fetchedAmountOfPosts = 0;\r\n amountOfNewsToIncreaseWith = this.amountOfComplimentsToDisplay;\r\n amountOfComplimentPostsToDisplayCurrently = this.amountOfComplimentsToDisplay;\r\n numberOfShowMoreClicks = 0;\r\n\r\n complimentsWallUrl: string;\r\n loading = false;\r\n\r\n constructor(@Inject(CUSTOMERENVIRONMENT) private environment: CafcassEnvironment,\r\n private service: ComplimentsService,\r\n private userChannelTermsService: UserChannelTermsService,\r\n private siteService: SiteService) { }\r\n\r\n ngOnInit() {\r\n\r\n this.complimentsWallUrl = this.environment.complimentsWallSiteUrl;\r\n\r\n this.personalComplimentItems$ = this.moreComplimentPostsSubject\r\n .pipe(\r\n startWith(this.amountOfComplimentPostsToDisplayCurrently + 1),\r\n mergeMap(() => {\r\n this.loading = true;\r\n const channels$ = this.userChannelTermsService.getUserChannelTerms();\r\n return this.service.getMyModernPersonalNewsFromComplimentSite(channels$);\r\n }),\r\n map((pages) => {\r\n pages.forEach(page => {\r\n if (page && (!page.SiteName || !page.SiteUrl)) {\r\n page.SiteInfo$ = this.siteService.getSiteInfoFromUrl(page.Path);\r\n }\r\n });\r\n\r\n this.fetchedAmountOfPosts = pages.length;\r\n if (this.fetchedAmountOfPosts > this.amountOfComplimentPostsToDisplayCurrently) {\r\n pages = pages.slice(0, this.amountOfComplimentPostsToDisplayCurrently);\r\n }\r\n this.loading = false;\r\n return pages;\r\n }),\r\n catchError(err => {\r\n this.errorSubject$.next(err);\r\n return of(null);\r\n }));\r\n }\r\n\r\n showMoreComplimentPosts() {\r\n this.numberOfShowMoreClicks++;\r\n this.amountOfComplimentPostsToDisplayCurrently = this.amountOfComplimentPostsToDisplayCurrently + this.amountOfNewsToIncreaseWith;\r\n this.loading = true;\r\n this.moreComplimentPostsSubject.next(this.amountOfComplimentPostsToDisplayCurrently + 1);\r\n }\r\n}\r\n@NgModule({\r\n entryComponents: [CustomComplimentsWallComponent],\r\n declarations: [CustomComplimentsWallComponent],\r\n exports: [CustomComplimentsWallComponent],\r\n imports: [\r\n CommonModule,\r\n NewsCardListModule,\r\n LinkModule,\r\n ActionLinkModule,\r\n MatButtonModule,\r\n RouterModule,\r\n ErrorTemplatesModule,\r\n TextPlaceholderModule,\r\n WidgetPlaceholderModule\r\n ]\r\n})\r\nexport class CustomComplimentsWallModule { }\r\n","
\r\n
\r\n \r\n {{item.GraphValue}}\r\n
\r\n
\r\n {{item.Title}}\r\n
\r\n
\r\n
\r\n

{{max}}

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

0

\r\n
\r\n","import { CommonModule } from '@angular/common';\r\nimport { Component, Input, NgModule, OnInit } from '@angular/core';\r\nimport { KpiChart } from '@app/models/kpi-chart';\r\nimport { KpiChartGroup } from '@app/models/kpi-chart-group';\r\nimport { LinkModule } from '@app/directives/link.directive';\r\n\r\n@Component({\r\n selector: 'app-bar-chart',\r\n templateUrl: './bar-chart.component.html',\r\n styleUrls: ['./bar-chart.component.scss']\r\n})\r\nexport class BarChartComponent implements OnInit {\r\n @Input() chart: KpiChartGroup;\r\n max: number;\r\n min: number;\r\n sum: number;\r\n graphHeight = 200;\r\n roundOffDif: number;\r\n adjustToRoundOff: number;\r\n chartItems: KpiChart[];\r\n constructor() { }\r\n\r\n ngOnInit(): void {\r\n if (this.chart && this.chart.ChartItems) {\r\n console.log(this.chart);\r\n this.max = Math.max.apply(Math, this.chart.ChartItems.map(function (o) { return o.ChartValue; }));\r\n this.min = Math.min.apply(Math, this.chart.ChartItems.map(function (o) { return o.ChartValue; }));\r\n this.sum = this.chart.ChartItems.reduce((prev, cur) => prev + cur.ChartValue, 0);\r\n\r\n if (this.max % 10 === 0) {\r\n this.roundOffDif = 0;\r\n this.adjustToRoundOff = 0;\r\n } else {\r\n const mod = this.max % 10;\r\n this.roundOffDif = 10 - mod;\r\n this.max = this.max + this.roundOffDif;\r\n }\r\n\r\n console.log(this.max);\r\n this.chart.ChartItems.map(item => {\r\n item.GraphValue = item.ChartValue;\r\n item.ChartValue = ((this.graphHeight / this.max) * item.ChartValue);\r\n console.log(item.ChartValue);\r\n });\r\n\r\n this.chartItems = this.chart.ChartItems;\r\n }\r\n }\r\n getStyle() {\r\n const style = '{\\'transform\\': \\'rotate(90deg)\\'}';\r\n return style;\r\n }\r\n}\r\n@NgModule({\r\n declarations: [BarChartComponent],\r\n exports: [BarChartComponent],\r\n imports: [\r\n CommonModule,\r\n LinkModule,\r\n ]\r\n})\r\nexport class BarChartModule { }\r\n","
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n \r\n
\r\n
\r\n
\r\n
\r\n
\r\n\r\n
\r\n
\r\n
\r\n \r\n
\r\n
\r\n {{item.Title}} {{item.ChartValue}}\r\n
\r\n
\r\n
\r\n
\r\n
\r\n","import { CommonModule } from '@angular/common';\r\nimport { Component, Input, NgModule, OnInit } from '@angular/core';\r\nimport { KpiChart } from '@app/models/kpi-chart';\r\nimport { KpiChartGroup } from '@app/models/kpi-chart-group';\r\nimport { LinkModule } from '@app/directives/link.directive';\r\n\r\n@Component({\r\n selector: 'app-pie-chart',\r\n templateUrl: './pie-chart.component.html',\r\n styleUrls: ['./pie-chart.component.scss']\r\n})\r\nexport class PieChartComponent implements OnInit {\r\n\r\n @Input() chart: KpiChartGroup;\r\n max: KpiChart;\r\n min: KpiChart;\r\n chartItems: KpiChart[];\r\n chartFix: KpiChart[];\r\n constructor() { }\r\n\r\n ngOnInit(): void {\r\n if (this.chart && this.chart.ChartItems) {\r\n this.max = Math.max.apply(Math, this.chart.ChartItems.map(c => c.ChartValue));\r\n this.min = Math.min.apply(Math, this.chart.ChartItems.map(c => c.ChartValue));\r\n const sum = this.chart.ChartItems.reduce((prev, cur) => prev + cur.ChartValue, 0);\r\n\r\n this.chart.ChartItems.forEach((item, i) => {\r\n item.GraphValue = (360 / sum) * item.ChartValue;\r\n\r\n if (i > 0) {\r\n if (this.chart.ChartItems[i - 1].Repeat) {\r\n item.PieChartDegree = (this.chart.ChartItems[i - 1].GraphValue * 2) + this.chart.ChartItems[i - 1].PieChartDegree;\r\n } else {\r\n item.PieChartDegree = this.chart.ChartItems[i - 1].GraphValue + this.chart.ChartItems[i - 1].PieChartDegree;\r\n }\r\n } else {\r\n // first pie chart value set to start from 0 degree\r\n item.PieChartDegree = 0;\r\n }\r\n\r\n if (item.GraphValue > 180) {\r\n const divided_val = item.GraphValue / 2;\r\n item.GraphValue = divided_val;\r\n item.Repeat = true;\r\n }\r\n console.log(item.GraphValue);\r\n });\r\n\r\n this.chartItems = this.chart.ChartItems;\r\n }\r\n }\r\n getStyle() {\r\n const style = '{\\'transform\\': \\'rotate(90deg)\\'}';\r\n return style;\r\n }\r\n\r\n getPieChartColor(index) {\r\n if (index > 9) {\r\n return 'pie-chart-color-default';\r\n }\r\n\r\n return 'pie-chart-color' + (index + 1);\r\n }\r\n}\r\n@NgModule({\r\n declarations: [PieChartComponent],\r\n exports: [PieChartComponent],\r\n imports: [\r\n CommonModule,\r\n LinkModule\r\n ]\r\n})\r\nexport class PieChartModule { }\r\n","
\r\n

KPI Charts

\r\n \r\n Charts visualising KPI measurement and other goals for the organisation.\r\n \r\n
\r\n
\r\n
\r\n
\r\n

{{chart.GroupName}}

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

{{chart.GroupName}}

\r\n \r\n
\r\n
\r\n
\r\n
\r\n
\r\n\r\n\r\n
\r\n \r\n
\r\n \r\n
\r\n \r\n
\r\n
\r\n
","import { CommonModule } from '@angular/common';\r\nimport { Component, Host, NgModule, OnInit, Optional } from '@angular/core';\r\nimport { BarChartModule } from '@app/components/css-charts/bar-chart/bar-chart.component';\r\nimport { PieChartModule } from '@app/components/css-charts/pie-chart/pie-chart.component';\r\nimport { HideParentIfEmptyDirective } from '@app/directives/hide-parent-if-empty.directive';\r\nimport { KpiChartGroup } from '@app/models/kpi-chart-group';\r\nimport { LinkModule } from '@app/directives/link.directive';\r\nimport { KpiChartGroupService } from '@app/services/kpi-chart-group.service';\r\nimport { ChartsModule } from 'ng2-charts';\r\nimport { Observable, of, Subject } from 'rxjs';\r\nimport { catchError, mergeMap, tap } from 'rxjs/operators';\r\nimport { ErrorTemplatesModule } from '../error-templates/error-templates.component';\r\nimport { WidgetPlaceholderModule } from '../widget-placeholder/widget-placeholder.component';\r\n\r\n@Component({\r\n selector: 'app-kpi-charts',\r\n templateUrl: './kpi-charts.component.html',\r\n styleUrls: ['./kpi-charts.component.scss']\r\n})\r\nexport class KpiChartsComponent implements OnInit {\r\n\r\n errorSubject$ = new Subject();\r\n activeGroups$: Observable;\r\n componentName = 'KPI charts';\r\n\r\n constructor(@Host() @Optional() private hideParentIfEmptyDirective: HideParentIfEmptyDirective, private kpiChartGroupService: KpiChartGroupService) { }\r\n\r\n ngOnInit() {\r\n this.activeGroups$ = this.kpiChartGroupService\r\n .refresh$\r\n .pipe(\r\n mergeMap(() => this.kpiChartGroupService.getActiveKPIChartGroups()),\r\n tap((results => {\r\n if (!results || results.length === 0) {\r\n this.hideParentIfEmptyDirective.hideElement();\r\n } else {\r\n this.hideParentIfEmptyDirective.showElement();\r\n }\r\n })),\r\n catchError(err => {\r\n this.errorSubject$.next(err);\r\n return of(null);\r\n }));\r\n }\r\n\r\n setSizeClass(chart: KpiChartGroup) {\r\n let classes = '';\r\n const size = chart.ChartWidth ? chart.ChartWidth : 50;\r\n\r\n if (size === 25) {\r\n classes = classes + ' chart-w-25';\r\n } else if (size === 50) {\r\n classes = classes + ' chart-w-50';\r\n } else if (size === 75) {\r\n classes = classes + ' chart-w-75';\r\n } else if (size === 100) {\r\n classes = classes + ' chart-w-100';\r\n } else {\r\n classes = classes + ' w-auto';\r\n }\r\n\r\n return classes;\r\n\r\n }\r\n}\r\n@NgModule({\r\n declarations: [KpiChartsComponent],\r\n exports: [KpiChartsComponent],\r\n imports: [\r\n CommonModule,\r\n LinkModule,\r\n ChartsModule,\r\n BarChartModule,\r\n PieChartModule,\r\n ErrorTemplatesModule,\r\n WidgetPlaceholderModule\r\n ]\r\n})\r\nexport class KpiChartsModule { }\r\n","import { CommonModule } from '@angular/common';\r\nimport { Component, EventEmitter, NgModule, OnInit, Output } from '@angular/core';\r\nimport { LinkModule } from '@app/directives/link.directive';\r\n\r\n@Component({\r\n selector: 'app-action-button',\r\n templateUrl: './action-button.component.html',\r\n styleUrls: ['./action-button.component.scss']\r\n})\r\nexport class ActionButtonComponent implements OnInit {\r\n\r\n @Output() clickEvent = new EventEmitter();\r\n\r\n constructor() { }\r\n\r\n buttonClick(): void {\r\n if (this.clickEvent) {\r\n this.clickEvent.emit(true);\r\n }\r\n }\r\n\r\n ngOnInit() {\r\n }\r\n\r\n}\r\n@NgModule({\r\n declarations: [ActionButtonComponent],\r\n imports: [\r\n CommonModule,\r\n LinkModule,\r\n ],\r\n exports: [ActionButtonComponent]\r\n})\r\nexport class ActionButtonModule { }\r\n","\r\n","import { CommonModule } from '@angular/common';\r\nimport { AfterViewInit, Component, ElementRef, Inject, Input, NgModule, OnChanges, OnDestroy, OnInit, ViewChild, ViewEncapsulation } from '@angular/core';\r\nimport { PowerBIFrame } from '@app/models/power-bi-frame';\r\nimport { WINDOW } from '@app/common/app-tokens';\r\nimport { fromEvent, Observable, Subscription } from 'rxjs';\r\nimport { debounceTime } from 'rxjs/operators';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { Platform } from '@angular/cdk/platform';\r\nimport { Report, models, service, factories } from 'powerbi-client';\r\n\r\n@Component({\r\n selector: 'app-power-bi-frame',\r\n templateUrl: './power-bi-frame.component.html',\r\n styleUrls: ['./power-bi-frame.component.scss'],\r\n encapsulation: ViewEncapsulation.None\r\n})\r\nexport class PowerBIFrameComponent implements OnInit, AfterViewInit, OnChanges, OnDestroy {\r\n\r\n @ViewChild('frameContainer', { static: true }) reportContainer: ElementRef;\r\n @Input() selectedFrame: PowerBIFrame;\r\n @Input() accessToken: string;\r\n mobileBreakepoint = 776; // 776px\r\n\r\n resizeObservable$: Observable;\r\n fullScreenObservable$: Observable;\r\n errorObservable$: Observable;\r\n subscription$: Subscription = new Subscription();\r\n\r\n embedConfig: models.IReportEmbedConfiguration | models.IDashboardEmbedConfiguration | models.ITileEmbedConfiguration;\r\n\r\n frame: Report;\r\n powerBI: service.Service;\r\n isMobileDevice = false;\r\n\r\n private initialized = false;\r\n\r\n constructor(@Inject(WINDOW) private window: Window, private platform: Platform) {\r\n this.isMobileDevice = this.platform.ANDROID || this.platform.IOS || window.innerWidth < this.mobileBreakepoint;\r\n this.powerBI = new service.Service(factories.hpmFactory, factories.wpmpFactory, factories.routerFactory);\r\n }\r\n\r\n ngOnInit() {\r\n\r\n this.resizeObservable$ = fromEvent(window, 'resize');\r\n\r\n this.subscription$.add(\r\n this.resizeObservable$.pipe(\r\n debounceTime(300))\r\n .subscribe(() => {\r\n if (this.window.innerWidth < this.mobileBreakepoint && !this.isMobileDevice) {\r\n this.updateMobileViewSettings(true);\r\n this.isMobileDevice = true;\r\n } else if (this.window.innerWidth >= this.mobileBreakepoint && this.isMobileDevice) {\r\n this.updateMobileViewSettings(false);\r\n this.isMobileDevice = false;\r\n }\r\n }));\r\n }\r\n\r\n ngOnChanges() {\r\n if (this.reportContainer.nativeElement) {\r\n // The Power BI Service needs to be reset if new visual is provided.\r\n this.powerBI.reset(this.reportContainer.nativeElement);\r\n this.setPowerBIFrame(true);\r\n }\r\n }\r\n\r\n ngAfterViewInit() {\r\n this.errorObservable$ = fromEvent(this.frame, 'error');\r\n\r\n this.subscription$.add(this.errorObservable$.subscribe(evt => {\r\n console.log(evt);\r\n }));\r\n }\r\n\r\n ngOnDestroy() {\r\n this.subscription$ && this.subscription$.unsubscribe();\r\n }\r\n\r\n setPowerBIFrame(rebuildConfig: boolean = false) {\r\n rebuildConfig && this.buildEmbedConfig();\r\n\r\n this.frame = this.powerBI.embed(this.reportContainer.nativeElement, this.embedConfig) as Report;\r\n this.frame.setComponentTitle(this.selectedFrame.Title);\r\n }\r\n\r\n updateMobileViewSettings(enableMobileView: boolean) {\r\n if (this.selectedFrame.Type === 0) {\r\n this.embedConfig.settings.layoutType = enableMobileView ? models.LayoutType.MobilePortrait : models.LayoutType.Custom;\r\n }\r\n if (this.selectedFrame.Type === 1) {\r\n (this.embedConfig as models.IDashboardEmbedConfiguration).pageView = enableMobileView ? 'oneColumn' : 'fitToWidth';\r\n }\r\n this.powerBI.reset(this.reportContainer.nativeElement);\r\n this.setPowerBIFrame();\r\n }\r\n\r\n getClassForMobileView() {\r\n // MobileViewHeight is specified in add/edit form.\r\n // padding-top: x%: percentages are relative to the width of the frame container.\r\n return {\r\n 'padding-top': `${this.selectedFrame.MobileViewHeight}vh`\r\n };\r\n }\r\n\r\n buildEmbedConfig() {\r\n\r\n if (this.selectedFrame.Type === 0) {\r\n this.embedConfig = {\r\n type: 'report',\r\n tokenType: models.TokenType.Aad,\r\n accessToken: this.accessToken,\r\n embedUrl: this.selectedFrame.EmbedUrl,\r\n id: this.selectedFrame.EmbedId,\r\n permissions: models.Permissions.Read,\r\n viewMode: models.ViewMode.View,\r\n bookmark: this.selectedFrame.BookmarkId ? { name: this.selectedFrame.BookmarkId } : undefined,\r\n settings: {\r\n filterPaneEnabled: this.selectedFrame.ShowFilterPane ? true : false,\r\n navContentPaneEnabled: this.selectedFrame.ShowNavigationPane ? true : false,\r\n layoutType: this.isMobileDevice ? models.LayoutType.MobilePortrait : models.LayoutType.Custom,\r\n background: models.BackgroundType.Transparent,\r\n } as models.ISettings\r\n } as models.IReportEmbedConfiguration;\r\n\r\n } else if (this.selectedFrame.Type === 1) {\r\n this.embedConfig = {\r\n type: 'dashboard',\r\n tokenType: models.TokenType.Aad,\r\n accessToken: this.accessToken,\r\n embedUrl: this.selectedFrame.EmbedUrl,\r\n id: this.selectedFrame.EmbedId,\r\n permissions: models.Permissions.Read,\r\n viewMode: models.ViewMode.View,\r\n pageView: this.isMobileDevice ? 'oneColumn' : 'fitToWidth',\r\n settings: {\r\n background: models.BackgroundType.Transparent,\r\n } as models.ISettings\r\n } as models.IDashboardEmbedConfiguration;\r\n }\r\n }\r\n\r\n}\r\n\r\n@NgModule({\r\n declarations: [PowerBIFrameComponent],\r\n exports: [PowerBIFrameComponent],\r\n imports: [\r\n CommonModule,\r\n MatButtonModule\r\n ]\r\n})\r\n\r\nexport class PowerBIFrameModule { }\r\n","
\r\n
\r\n
\r\n
\r\n
\r\n","\r\n

Power BI

\r\n
\r\n

{{selectedFrame.Title}}

\r\n
\r\n
1\" class=\"d-flex\">\r\n Report:\r\n
\r\n \r\n {{frame.Title}}\r\n \r\n
\r\n
\r\n
\r\n
\r\n\r\n
\r\n
\r\n \r\n
\r\n
\r\n","import { CommonModule } from '@angular/common';\r\nimport { Component, Host, Inject, NgModule, OnDestroy, OnInit, Optional } from '@angular/core';\r\nimport { ActivatedRoute, RouterModule } from '@angular/router';\r\nimport { CUSTOMERENVIRONMENT } from '@app/common/app-tokens';\r\nimport { ErrorTemplatesModule } from '@app/components/error-templates/error-templates.component';\r\nimport { AuthService } from '@app/services/auth.service';\r\nimport { FeatureSettingsStoreService } from '@app/services/feature-settings-store.service';\r\nimport { PowerBIService } from '@app/services/power-bi.service';\r\nimport { Environment } from '@environments/interface.environment';\r\nimport { PowerBIFrame } from '@app/models/power-bi-frame';\r\nimport { Observable, Subscription, BehaviorSubject, combineLatest, of } from 'rxjs';\r\nimport { filter, map, mergeMap } from 'rxjs/operators';\r\nimport { Constants } from '@app/common/constants';\r\nimport { ActionLinkModule } from '@app/components/actions/action-link/action-link.component';\r\nimport { ActionButtonModule } from '@app/components/actions/action-button/action-button.component';\r\nimport { UserChannelTermsService } from '@app/services/user-channel-terms.service';\r\nimport { MatSelectChange, MatSelectModule } from '@angular/material/select';\r\nimport { UserChannelTerm } from '@app/models/user-channel-term';\r\nimport { PowerBIFrameModule } from '@app/components/power-bi/power-bi-frame/power-bi-frame.component';\r\nimport { HideParentIfEmptyDirective } from '@app/directives/hide-parent-if-empty.directive';\r\nimport { LicenseService } from '@app/services/license.service';\r\nimport { O365Licenses } from '@app/common/o365-licenses';\r\n\r\n@Component({\r\n selector: 'app-power-bi',\r\n templateUrl: './power-bi.component.html',\r\n styleUrls: ['./power-bi.component.scss'],\r\n})\r\nexport class PowerBIComponent implements OnInit, OnDestroy {\r\n\r\n private changeSubject = new BehaviorSubject(null);\r\n private subscription: Subscription = new Subscription();\r\n userAccessToken$: Observable;\r\n userChannelTerms$: Observable>;\r\n selectedFrame$: Observable;\r\n powerBIFrames$: Observable;\r\n\r\n selectedFrame: PowerBIFrame;\r\n showPowerBIComponent = this.featureStore.state.showPowerBIComponent;\r\n\r\n constructor(@Inject(CUSTOMERENVIRONMENT) private environment: Environment,\r\n private featureStore: FeatureSettingsStoreService,\r\n private powerBIService: PowerBIService,\r\n private userChannelTermsService: UserChannelTermsService,\r\n private authService: AuthService,\r\n private activatedRoute: ActivatedRoute,\r\n private licenseService: LicenseService,\r\n @Host() @Optional() private hideParentIfEmptyDirective: HideParentIfEmptyDirective) { }\r\n\r\n handleSelection(event: MatSelectChange) {\r\n this.getAccessToken();\r\n this.changeSubject.next(event.value);\r\n }\r\n\r\n getAccessToken() {\r\n const scopes = this.authService.getScopesForEndpoint(Constants.POWERBI_API_ENDPOINT);\r\n this.userAccessToken$ = this.authService\r\n .acquireTokenSilentWithFallBackToPopup({ ...scopes, ...{ account: this.authService.accountInfo } }, scopes)\r\n .pipe(\r\n map(authResult => {\r\n return authResult.accessToken;\r\n })\r\n );\r\n }\r\n\r\n ngOnInit() {\r\n if (this.showPowerBIComponent) {\r\n this.getAccessToken();\r\n\r\n this.selectedFrame$ = this.changeSubject\r\n .pipe(\r\n filter(frame => !!frame),\r\n map(frame => {\r\n return frame;\r\n })\r\n );\r\n\r\n const activatedRouteForPrimaryOutlet = this.activatedRoute.root.children.find(_ => _.outlet === 'primary');\r\n\r\n const userChannelTerms$ = this.userChannelTermsService.getUserChannelTerms();\r\n\r\n const allPowerBIFrames$ = this.powerBIService.getAllPowerBIFrames();\r\n\r\n this.powerBIFrames$ = this.licenseService.hasUserLicense([O365Licenses.POWER_BI_FOR_OFFICE_365_ADD_ON, O365Licenses.POWER_BI_FREE, O365Licenses.POWER_BI_PRO])\r\n .pipe(\r\n mergeMap(hasLicense => {\r\n if (hasLicense) {\r\n return combineLatest([allPowerBIFrames$, userChannelTerms$, activatedRouteForPrimaryOutlet.url])\r\n .pipe(\r\n map(([frames, userChannels, url]) => {\r\n frames = frames.filter(frame => {\r\n if (('/' + url.join('/')) !== frame.RouteId || frame.Active === false) {\r\n return false;\r\n }\r\n const channelTerms = frame.ChannelTermPowerBIFrames;\r\n if (channelTerms && channelTerms.length > 0) {\r\n return channelTerms.some(c => userChannels.some(uc => uc.ChannelTermId === c.ChannelTermId));\r\n } else {\r\n return true;\r\n }\r\n });\r\n if (frames && frames.length > 0) {\r\n this.selectedFrame = frames[0];\r\n this.changeSubject.next(this.selectedFrame);\r\n this.hideParentIfEmptyDirective && this.hideParentIfEmptyDirective.showElement();\r\n } else {\r\n this.hideParentIfEmptyDirective && this.hideParentIfEmptyDirective.hideElement();\r\n }\r\n return frames;\r\n }));\r\n } else {\r\n this.hideParentIfEmptyDirective && this.hideParentIfEmptyDirective.hideElement();\r\n return of([]);\r\n }\r\n })\r\n );\r\n } else {\r\n this.hideParentIfEmptyDirective && this.hideParentIfEmptyDirective.hideElement();\r\n }\r\n\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.subscription && this.subscription.unsubscribe();\r\n }\r\n}\r\n@NgModule({\r\n declarations: [PowerBIComponent],\r\n exports: [PowerBIComponent],\r\n imports: [\r\n CommonModule,\r\n RouterModule,\r\n ErrorTemplatesModule,\r\n ActionLinkModule,\r\n ActionButtonModule,\r\n MatSelectModule,\r\n PowerBIFrameModule\r\n ]\r\n})\r\n\r\nexport class PowerBIModule { }\r\n","
\r\n
\r\n \r\n
\r\n
\r\n\r\n\r\n\r\n
\r\n
\r\n \r\n
\r\n
\r\n\r\n
\r\n
\r\n \r\n
\r\n
\r\n\r\n
\r\n
\r\n \r\n
\r\n
\r\n\r\n
\r\n
\r\n \r\n
\r\n
\r\n\r\n
\r\n
\r\n \r\n
\r\n
\r\n\r\n
\r\n
\r\n
\r\n
\r\n \r\n
\r\n
\r\n \r\n
\r\n
\r\n
\r\n
\r\n\r\n
\r\n
\r\n \r\n
\r\n
\r\n\r\n
\r\n
\r\n \r\n
\r\n
\r\n\r\n
\r\n
\r\n
\r\n
\r\n \r\n
\r\n
\r\n
\r\n
\r\n","import { Component, NgModule } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { LinkModule } from '@app/directives/link.directive';\r\nimport { FeaturedNewsModule } from '@app/components/featured-news/featured-news.component';\r\nimport { MyNewsModule } from '@app/components/my-news/my-news.component';\r\nimport { OrganizationCalendarModule } from '@app/components/organization-calendar/organization-calendar.component';\r\nimport { BirthdaysModule } from '@app/components/birthdays/birthdays.component';\r\nimport { RestaurantMenuModule } from '@app/components/restaurant-menu/restaurant-menu.component';\r\nimport { RssFeedsModule } from '@app/components/rss-feeds/rss-feeds.component';\r\nimport { HideParentIfEmptyModule } from '@app/directives/hide-parent-if-empty.directive';\r\nimport { MarkComponentVisitedModule } from '@app/directives/mark-component-visited.directive';\r\nimport { FeatureToggleModule } from '@app/directives/feature-toggle.directive';\r\nimport { CustomMyBlogsModule } from '../custom-my-blogs/custom-my-blogs.component';\r\nimport { CustomComplimentsWallModule } from '../custom-compliments-wall/custom-compliments-wall.component';\r\nimport { KpiChartsModule } from '@app/components/kpi-charts/kpi-charts.component';\r\nimport { InfoboxZoneModule } from '@app/components/infobox-zone/infobox-zone.component';\r\nimport { PowerBIModule } from '@app/components/power-bi/power-bi.component';\r\n\r\n@Component({\r\n selector: 'cafcass-custom-today',\r\n templateUrl: './custom-today.component.html',\r\n styleUrls: ['./custom-today.component.scss']\r\n})\r\nexport class CustomTodayComponent {\r\n\r\n}\r\n@NgModule({\r\n declarations: [\r\n CustomTodayComponent\r\n ],\r\n exports: [\r\n CustomTodayComponent\r\n ],\r\n imports: [\r\n CommonModule,\r\n LinkModule,\r\n InfoboxZoneModule,\r\n FeaturedNewsModule,\r\n MyNewsModule,\r\n CustomMyBlogsModule,\r\n CustomComplimentsWallModule,\r\n OrganizationCalendarModule,\r\n BirthdaysModule,\r\n RestaurantMenuModule,\r\n RssFeedsModule,\r\n HideParentIfEmptyModule,\r\n MarkComponentVisitedModule,\r\n FeatureToggleModule,\r\n KpiChartsModule,\r\n PowerBIModule\r\n ]\r\n})\r\nexport class CustomTodayModule { }\r\n","import { Injectable } from '@angular/core';\r\nimport { ActivatedRouteSnapshot, CanActivate, CanActivateChild, RouterStateSnapshot } from '@angular/router';\r\nimport { AuthService } from '@app/services/auth.service';\r\nimport { Observable } from 'rxjs';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class AuthGuard implements CanActivate, CanActivateChild {\r\n\r\n constructor(private authService: AuthService) { }\r\n\r\n canActivate(\r\n next: ActivatedRouteSnapshot,\r\n state: RouterStateSnapshot): Observable | Promise | boolean {\r\n return this.authService.accountInfo !== null;\r\n }\r\n\r\n canActivateChild(\r\n childRoute: ActivatedRouteSnapshot,\r\n state: RouterStateSnapshot\r\n ): Observable | Promise | boolean {\r\n return this.canActivate(childRoute, state);\r\n }\r\n}\r\n","import { Routes } from '@angular/router';\r\nimport { AuthorizeAccessGuard } from '@app/guards/authorize-access.guard';\r\nimport { Roles } from '@app/common/roles';\r\n\r\nexport const DEFAULT_MODAL_ROUTE_CONFIG: Routes = [\r\n {\r\n path: 'user-app-tiles',\r\n outlet: 'modal',\r\n loadChildren: () => import('@app/components/apps-and-tools/dialogs/user-app-tile-add-edit/user-app-tile-modal-view.module').then(m => m.UserAppTileModalViewModule),\r\n },\r\n {\r\n path: 'app-tile-intro',\r\n outlet: 'modal',\r\n loadChildren: () => import('@app/components/apps-and-tools/dialogs/apps-and-tools-dialog-intro/apps-and-tools-intro-modal-view.module').then(m => m.AppsAndToolsDialogIntroModalModule),\r\n },\r\n {\r\n path: 'app-tiles',\r\n outlet: 'modal',\r\n loadChildren: () => import('@app/components/apps-and-tools/dialogs/app-tile-add-edit/app-tile-modal-view.module').then(m => m.AppTileModalViewModule),\r\n canActivate: [AuthorizeAccessGuard], data: { roles: [Roles.Admin, Roles.AppEditor, Roles.Editor] }\r\n },\r\n {\r\n path: 'broadcast-messages',\r\n outlet: 'modal',\r\n loadChildren: () => import('@app/views/broadcast-messages/broadcast-messages-modal-view.module').then(m => m.BroadcastMessagesModalViewModule),\r\n canActivate: [AuthorizeAccessGuard], data: { roles: [Roles.Admin, Roles.MessageBroadcastEditor, Roles.Editor] }\r\n },\r\n {\r\n path: 'audits',\r\n outlet: 'modal',\r\n loadChildren: () => import('@app/views/audits/audits-modal-view.module').then(m => m.AuditsViewModule),\r\n canActivate: [AuthorizeAccessGuard], data: { roles: [Roles.Admin, Roles.Editor] }\r\n },\r\n {\r\n path: 'find-information',\r\n outlet: 'modal',\r\n loadChildren: () => import('@app/components/find-information/find-information-light-menu/find-information-light-dialog/find-information-modal-view.module').then(m => m.FindInformationModalViewModule),\r\n canActivate: [AuthorizeAccessGuard], data: { roles: [Roles.Admin, Roles.Editor] }\r\n },\r\n {\r\n path: 'resource-values',\r\n outlet: 'modal',\r\n loadChildren: () => import('@app/views/admin/resource-values/resource-values-modal-view.module').then(m => m.ResourceValuesModalViewModule),\r\n canActivate: [AuthorizeAccessGuard], data: { roles: [Roles.Admin] }\r\n },\r\n {\r\n path: 'search',\r\n outlet: 'modal',\r\n loadChildren: () => import('@app/views/search/search-view.module').then(m => m.SearchModalViewModule)\r\n },\r\n {\r\n path: 'infoboxes',\r\n outlet: 'modal',\r\n loadChildren: () => import('@app/views/infobox/infobox-modal-view.module').then(m => m.InfoBoxModalViewModule),\r\n canActivate: [AuthorizeAccessGuard], data: { roles: [Roles.Admin, Roles.Editor] }\r\n },\r\n {\r\n path: 'power-bi',\r\n outlet: 'modal',\r\n loadChildren: () => import('@app/views/power-bi/power-bi-frames-modal-view.module').then(m => m.PowerBIModalViewModule),\r\n canActivate: [AuthorizeAccessGuard], data: { roles: [Roles.Admin, Roles.PowerBIEditor] }\r\n },\r\n {\r\n path: 'restaurants',\r\n outlet: 'modal',\r\n loadChildren: () => import('@app/views/restaurant-menu/restaurant-menu-modal-view.module').then(m => m.RestaurantMenuModalViewModule),\r\n canActivate: [AuthorizeAccessGuard], data: { roles: [Roles.Admin, Roles.Editor] }\r\n }\r\n];\r\n","export class FollowedPage {\r\n Id: string;\r\n Path: string;\r\n Title: string;\r\n DriveId: string;\r\n Icon: string;\r\n ShowIcon: boolean;\r\n\r\n constructor(opt?: Partial) {\r\n Object.assign(this, opt);\r\n }\r\n}\r\n","import { HttpClient, HttpParams } from '@angular/common/http';\r\nimport { Injectable } from '@angular/core';\r\nimport { Constants } from '@app/common/constants';\r\nimport { HttpHelper } from '@app/common/http-helper';\r\nimport { FollowedPage } from '@app/models/followed-page';\r\nimport { CacheService } from '@app/services/cache.service';\r\nimport { concat, Observable, of, Subject } from 'rxjs';\r\nimport { catchError, map, shareReplay, takeUntil, tap } from 'rxjs/operators';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class MyFollowedPagesService {\r\n\r\n constructor(private httpClient: HttpClient, private cache: CacheService, private httpHelper: HttpHelper) { }\r\n\r\n public useCache = true;\r\n private readonly cacheKeyPrefix = 'MyFollowedPagesService';\r\n\r\n private myFollowedPages$ = new Map>>();\r\n private reload$ = new Subject();\r\n\r\n public reload() {\r\n\r\n this.reload$.next();\r\n this.myFollowedPages$ = null;\r\n }\r\n\r\n getMyFollowingPages(amountOfItems: number): Observable> {\r\n\r\n const params = new HttpParams()\r\n .append('$top', amountOfItems.toString());\r\n\r\n const param = `${amountOfItems}`;\r\n if (this.myFollowedPages$ && this.myFollowedPages$.has(param)) {\r\n return this.myFollowedPages$.get(param);\r\n } else {\r\n\r\n const cacheKey = `${this.cacheKeyPrefix}-${'MyFollowingPages'}-${param}`;\r\n this.myFollowedPages$ = new Map>>();\r\n\r\n this.myFollowedPages$.set(param, this.httpClient.get(`${Constants.GRAPH_API_ENDPOINT + Constants.GRAPH_API_BETA_VERSION}/me/drive/following`, {\r\n params: params\r\n })\r\n .pipe(\r\n map(result => {\r\n console.log(`fetched my following pages result: `);\r\n console.log(result);\r\n return result.value\r\n .map(page => {\r\n return new FollowedPage({\r\n Id: page.id,\r\n Path: page.webUrl,\r\n Title: page.name.split('.')[0],\r\n DriveId: page.parentReference.driveId,\r\n Icon: 'SingleBookmarkSolid',\r\n ShowIcon: false\r\n });\r\n });\r\n }),\r\n tap(response => {\r\n console.log(`fetched result: fetched my following pages `, response);\r\n this.useCache && this.cache.set(cacheKey, response as Array);\r\n }),\r\n catchError(this.httpHelper.handleError({ operation: 'getMyFollowing', result: new Array(), cacheKey: cacheKey })),\r\n takeUntil(this.reload$),\r\n shareReplay({ bufferSize: 1, refCount: true })));\r\n\r\n if (this.useCache) {\r\n const cachedData = this.cache.get(cacheKey);\r\n if (cachedData) {\r\n return concat(of(cachedData), this.myFollowedPages$.get(param));\r\n }\r\n }\r\n\r\n return this.myFollowedPages$.get(param);\r\n }\r\n }\r\n\r\n removePage(page: FollowedPage) {\r\n const fetchOperation = this.httpClient.delete(`${Constants.GRAPH_API_ENDPOINT + Constants.GRAPH_API_BETA_VERSION}/me/drives/${page.DriveId}/following/${page.Id}`,\r\n {\r\n })\r\n .pipe(\r\n map(response => {\r\n console.log(`removed page: `);\r\n console.log(response);\r\n this.reload();\r\n }),\r\n catchError(this.httpHelper.handleError({ operation: 'remove page from saved/bookmarked', result: true })));\r\n return fetchOperation;\r\n }\r\n\r\n}\r\n","
\r\n\r\n
\r\n\r\n
\r\n\r\n
\r\n \r\n All\r\n \r\n
\r\n\r\n
\r\n

Saved for later

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

You have no saved pages.

\r\n
\r\n
\r\n\r\n
\r\n\r\n\r\n\r\n
\r\n \r\n
\r\n
\r\n","import { CommonModule } from '@angular/common';\r\nimport { Component, Inject, Input, NgModule, OnDestroy, OnInit } from '@angular/core';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { CUSTOMERENVIRONMENT } from '@app/common/app-tokens';\r\nimport { ActionLinkModule } from '@app/components/actions/action-link/action-link.component';\r\nimport { TextPlaceholderModule } from '@app/components/text-placeholder/text-placeholder.component';\r\nimport { WidgetPlaceholderModule } from '@app/components/widget-placeholder/widget-placeholder.component';\r\nimport { FollowedPage } from '@app/models/followed-page';\r\nimport { LinkModule } from '@app/directives/link.directive';\r\nimport { MyFollowedPagesService } from '@app/services/my-followed-pages.service';\r\nimport { Environment } from '@environments/interface.environment';\r\nimport { Observable, Subscription } from 'rxjs';\r\nimport { map } from 'rxjs/operators';\r\n\r\n@Component({\r\n selector: 'app-find-information-saved-pages',\r\n templateUrl: './find-information-saved-pages.component.html',\r\n styleUrls: ['./find-information-saved-pages.component.scss']\r\n})\r\nexport class FindInformationSavedPagesComponent implements OnInit, OnDestroy {\r\n followedPages$: Observable;\r\n @Input() followedPageCount = 5;\r\n removePageSubscription: Subscription;\r\n refreshPageSubscription: Subscription;\r\n allPageSubscription: Subscription;\r\n savedPages: FollowedPage[];\r\n myFollowedPages$: Observable;\r\n\r\n linkToSeeAllSavedPages = `${this.environment.coreWorkplaceSiteUrl}/_layouts/15/sharepoint.aspx?v=saved`;\r\n\r\n constructor(private service: MyFollowedPagesService, @Inject(CUSTOMERENVIRONMENT) private environment: Environment) { }\r\n\r\n ngOnInit() {\r\n this.myFollowedPages$ = this.service.getMyFollowingPages(this.followedPageCount)\r\n .pipe(map((pages) => {\r\n this.savedPages = pages;\r\n return this.savedPages;\r\n }));\r\n }\r\n\r\n removePage(event: any, page: FollowedPage) {\r\n event.preventDefault();\r\n page.Icon = 'SingleBookmark';\r\n this.removePageSubscription = this.service.removePage(page).subscribe(removedPage => {\r\n const index = this.savedPages.findIndex(x => x.Id === page.Id);\r\n this.savedPages.splice(index, 1);\r\n });\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.removePageSubscription && this.removePageSubscription.unsubscribe();\r\n }\r\n\r\n mouseEnter(page: FollowedPage) {\r\n page.ShowIcon = true;\r\n }\r\n\r\n mouseLeave(page: FollowedPage) {\r\n page.ShowIcon = false;\r\n }\r\n}\r\n@NgModule({\r\n declarations: [FindInformationSavedPagesComponent],\r\n exports: [\r\n FindInformationSavedPagesComponent\r\n ],\r\n imports: [\r\n CommonModule,\r\n WidgetPlaceholderModule,\r\n LinkModule,\r\n ActionLinkModule,\r\n TextPlaceholderModule,\r\n MatButtonModule,\r\n ]\r\n})\r\nexport class FindInformationSavedPagesModule { }\r\n","import { Inject, Injectable } from '@angular/core';\r\nimport { CUSTOMERENVIRONMENT } from '@app/common/app-tokens';\r\nimport { HttpHelper } from '@app/common/http-helper';\r\nimport { TrendingResult } from '@app/common/trending-result';\r\nimport { SearchPostQuery, SearchPostQueryRequest } from '@app/models/search-post-query';\r\nimport { SearchResult } from '@app/models/search-result';\r\nimport { SearchService } from '@app/services/search.service';\r\nimport { Environment } from '@environments/interface.environment';\r\nimport { Observable } from 'rxjs';\r\nimport { catchError, map } from 'rxjs/operators';\r\nimport { FeatureSettingsStoreService } from '@app/services/feature-settings-store.service';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class EditorTrendingNewsService {\r\n\r\n constructor(private searchService: SearchService,\r\n @Inject(CUSTOMERENVIRONMENT) private environment: Environment,\r\n private featureSettingsStoreService: FeatureSettingsStoreService,\r\n private httpHelper: HttpHelper) { }\r\n\r\n getTrendingNews(newsCount): Observable> {\r\n\r\n const limitPath = this.featureSettingsStoreService.state.trendingResult === TrendingResult.ModernOnlyFromCoreRootSite ? 'AND (path:' + encodeURI(this.environment.coreWorkplaceSiteUrl) + ')' : '';\r\n const query = 'ContentTypeId:0x0101009D1CB255DA76424F860D91F20E6C4118* AND PromotedState=2' + ' ' + limitPath;\r\n\r\n const postQuery = new SearchPostQuery({\r\n request: new SearchPostQueryRequest({\r\n Querytext: query,\r\n RowLimit: newsCount,\r\n EnableSorting: true,\r\n TrimDuplicates: false,\r\n SortList: [\r\n {\r\n 'Property': 'ViewsLifeTime',\r\n 'Direction': 1\r\n }\r\n ],\r\n SelectProperties: [\r\n 'ContentType',\r\n 'ContentTypeId',\r\n 'Title',\r\n 'EditorOwsUser',\r\n 'ModifiedBy',\r\n 'LastModifiedBy',\r\n 'Path',\r\n 'PictureThumbnailURL',\r\n 'LastModifiedTime',\r\n 'FirstPublishedDate',\r\n ],\r\n Properties: [\r\n {\r\n Name: 'EnableDynamicGroups',\r\n Value: {\r\n BoolVal: 'True',\r\n QueryPropertyValueTypeIndex: 3\r\n }\r\n } // include results form private groups - https://www.techmikael.com/2017/01/retrieving-search-results-from-private.html\r\n ]\r\n })\r\n });\r\n\r\n return this.searchService.sendPostSearchQuery(postQuery)\r\n .pipe(\r\n map(data => {\r\n console.log(`getTrendingNews: fetched results by search: `);\r\n console.log(data);\r\n return data;\r\n }),\r\n catchError(this.httpHelper.handleError({ operation: 'getTop10TrendingNews', result: new Array() })));\r\n }\r\n\r\n getTrendingPages(pageCount): Observable> {\r\n\r\n const limitPath = this.featureSettingsStoreService.state.trendingResult === TrendingResult.ModernOnlyFromCoreRootSite ? 'AND (path:' + encodeURI(this.environment.coreWorkplaceSiteUrl) + ')' : '';\r\n const query = 'contentclass:STS_ListItem_WebPageLibrary AND (ContentTypeId:0x0101009D1CB255DA76424F860D91F20E6C4118* AND PromotedState:0)' + ' ' + limitPath;\r\n\r\n const postQuery = new SearchPostQuery({\r\n request: new SearchPostQueryRequest({\r\n Querytext: query,\r\n RowLimit: pageCount,\r\n EnableSorting: true,\r\n TrimDuplicates: false,\r\n SortList: [\r\n {\r\n 'Property': 'FirstPublishedDate',\r\n 'Direction': 1\r\n }\r\n ],\r\n SelectProperties: [\r\n 'ContentType',\r\n 'ContentTypeId',\r\n 'Title',\r\n 'EditorOwsUser',\r\n 'ModifiedBy',\r\n 'LastModifiedBy',\r\n 'Path',\r\n 'PictureThumbnailURL',\r\n 'LastModifiedTime',\r\n 'FirstPublishedDate',\r\n ],\r\n Properties: [\r\n {\r\n Name: 'EnableDynamicGroups',\r\n Value: {\r\n BoolVal: 'True',\r\n QueryPropertyValueTypeIndex: 3\r\n }\r\n } // include results form private groups - https://www.techmikael.com/2017/01/retrieving-search-results-from-private.html\r\n ]\r\n })\r\n });\r\n\r\n return this.searchService.sendPostSearchQuery(postQuery)\r\n .pipe(\r\n map(data => {\r\n console.log(`getTrendingPages: fetched results by search: `);\r\n console.log(data);\r\n return data;\r\n }),\r\n catchError(this.httpHelper.handleError({ operation: 'getTop10TrendingPages', result: new Array() })));\r\n }\r\n}\r\n","\r\n\r\n\r\n\r\n\r\n\r\n
\r\n \r\n
\r\n
\r\n","import { CommonModule } from '@angular/common';\r\nimport { ChangeDetectionStrategy, Component, Input, NgModule, OnInit } from '@angular/core';\r\nimport { WidgetPlaceholderModule } from '@app/components/widget-placeholder/widget-placeholder.component';\r\nimport { SearchResult } from '@app/models/search-result';\r\nimport { LinkModule } from '@app/directives/link.directive';\r\nimport { EditorTrendingNewsService } from '@app/services/editor-trending-news.service';\r\nimport { Observable } from 'rxjs';\r\nimport { map } from 'rxjs/operators';\r\n\r\n@Component({\r\n selector: 'app-find-information-trending-pages',\r\n templateUrl: './find-information-trending-pages.component.html',\r\n styleUrls: ['./find-information-trending-pages.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush\r\n})\r\nexport class FindInformationTrendingPagesComponent implements OnInit {\r\n\r\n trendingPages$: Observable;\r\n @Input() trendingPageCount = 4;\r\n constructor(private service: EditorTrendingNewsService) { }\r\n\r\n ngOnInit() {\r\n\r\n this.trendingPages$ = this.service.getTrendingPages(this.trendingPageCount)\r\n .pipe(map((pages) => {\r\n return pages\r\n .map(page => {\r\n return new SearchResult({\r\n Path: page.Path,\r\n Title: page.Title,\r\n });\r\n });\r\n }));\r\n }\r\n\r\n}\r\n@NgModule({\r\n declarations: [FindInformationTrendingPagesComponent],\r\n exports: [\r\n FindInformationTrendingPagesComponent\r\n ],\r\n imports: [\r\n CommonModule,\r\n WidgetPlaceholderModule,\r\n LinkModule\r\n ]\r\n})\r\nexport class FindInformationTrendingPagesModule { }\r\n","
\r\n
\r\n
\r\n\r\n \r\n

\r\n\r\n \r\n {{node.Title}}\r\n\r\n \r\n {{node.Title}}\r\n

\r\n\r\n \r\n
    \r\n
  • \r\n\r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n\r\n
  • \r\n
\r\n\r\n
\r\n
\r\n\r\n\r\n\r\n\r\n\r\n \r\n
\r\n\r\n \r\n

\r\n \r\n {{node.Title}}\r\n \r\n

\r\n\r\n \r\n \r\n\r\n \r\n
    \r\n
  • \r\n \r\n
  • \r\n
\r\n
\r\n
\r\n\r\n\r\n\r\n\r\n \r\n {{node.Title}}\r\n \r\n\r\n\r\n\r\n\r\n\r\n
\r\n \r\n
\r\n
\r\n","import { CommonModule } from '@angular/common';\r\nimport { ChangeDetectionStrategy, Component, Inject, NgModule, OnInit } from '@angular/core';\r\nimport { CUSTOMERENVIRONMENT } from '@app/common/app-tokens';\r\nimport { NavigationMode } from '@app/common/navigation-mode.';\r\nimport { WidgetPlaceholderModule } from '@app/components/widget-placeholder/widget-placeholder.component';\r\nimport { Navigation } from '@app/models/hubsite-data';\r\nimport { NavigationNode, SPNavigationNode } from '@app/models/navigation-node';\r\nimport { SimplifiedTerm } from '@app/models/simplified-term';\r\nimport { LinkModule } from '@app/directives/link.directive';\r\nimport { FeatureSettingsStoreService } from '@app/services/feature-settings-store.service';\r\nimport { NavigationService } from '@app/services/navigation.service';\r\nimport { Environment } from '@environments/interface.environment';\r\nimport { Observable } from 'rxjs';\r\nimport { map, mergeMap } from 'rxjs/operators';\r\n\r\n@Component({\r\n selector: 'app-find-information-mega-menu',\r\n templateUrl: './find-information-mega-menu.component.html',\r\n styleUrls: ['./find-information-mega-menu.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush\r\n})\r\nexport class FindInformationMegaMenuComponent implements OnInit {\r\n\r\n navigationNodes$: Observable;\r\n enableCollapsableNodes = false;\r\n\r\n constructor(\r\n @Inject(CUSTOMERENVIRONMENT) private environment: Environment,\r\n private featureSettingsStoreService: FeatureSettingsStoreService,\r\n private service: NavigationService) { }\r\n\r\n ngOnInit() {\r\n\r\n this.enableCollapsableNodes = this.featureSettingsStoreService.state.enabledCollapsableNodesOnFindInformation ? true : false;\r\n\r\n if (this.featureSettingsStoreService.state.navigationMode === NavigationMode.HubSite) {\r\n this.navigationNodes$ = this.service\r\n .getUsersHomeHubSiteUrl()\r\n .pipe(\r\n mergeMap((siteUrl: string) => {\r\n return this.service.getHubSiteNavigation(siteUrl);\r\n }),\r\n map(n => {\r\n if (n?.navigation) {\r\n return this.mapHubSiteNodes(n.navigation);\r\n } else {\r\n return new Array();\r\n }\r\n }));\r\n } else {\r\n this.navigationNodes$ = this.service.getNavigationNodes()\r\n .pipe(map(n => {\r\n return this.mapSimplifiedTerms(n.filter(node => node.Terms));\r\n }));\r\n }\r\n }\r\n\r\n // Determines if node should show draw as level 2 (fat) or level 3 (thin) link\r\n // Menu has no level 3 nodes (or disabled) --> draw all as level 3\r\n // Node has children --> draw as levle 2\r\n // Node has no children --> draw as level 3 if no level 2 appeared above, else draw as level 2\r\n showAsSubHeader(node: NavigationNode, parent: NavigationNode) {\r\n\r\n // First check if level 3 nodes are completely disabled\r\n if (!this.featureSettingsStoreService.state.enableThirdLevelMenusInFindInformation) {\r\n return false;\r\n }\r\n\r\n // Is there a level 2 node above me?\r\n let thereAreNodesWithSubnodesAboveThis = false;\r\n let foundThis = false;\r\n for (let i = 0; i < parent.Children.length; i++) {\r\n if (parent.Children[i].Id === node.Id) {\r\n foundThis = true;\r\n break;\r\n }\r\n if (!foundThis) {\r\n if (parent.Children[i].Children && parent.Children[i].Children.length > 0) {\r\n thereAreNodesWithSubnodesAboveThis = true;\r\n }\r\n }\r\n }\r\n\r\n const nodeHasChildren = node.Children && node.Children.length > 0;\r\n\r\n if (!nodeHasChildren && thereAreNodesWithSubnodesAboveThis) {\r\n return true;\r\n }\r\n\r\n return nodeHasChildren;\r\n }\r\n\r\n getHubSiteUrl(url: string): string {\r\n if (url && url.toLowerCase().indexOf('linkless.header') === -1) {\r\n if (url.length > 0) {\r\n return url[0] === '/' ? this.environment.tenantHostUrl + url : url;\r\n }\r\n return url;\r\n } else {\r\n return null;\r\n }\r\n }\r\n\r\n mapHubSiteNodes(nodes: Navigation[]) {\r\n return nodes.map(node => {\r\n return new SPNavigationNode({\r\n Title: node.Title,\r\n Url: this.getHubSiteUrl(node.Url),\r\n Id: node.Id.toString(),\r\n IsDocLib: node.IsDocLib,\r\n IsExternal: node.IsExternal,\r\n ParentId: node.ParentId,\r\n ListTemplateType: node.ListTemplateType,\r\n AudienceIds: node.AudienceIds,\r\n IsAvailableForTagging: true,\r\n Children: this.mapHubSiteNodes(node.Children)\r\n });\r\n });\r\n }\r\n\r\n mapSimplifiedTerms(nodes: SimplifiedTerm[]) {\r\n return nodes.map(node => {\r\n return new SPNavigationNode({\r\n Title: node.Name,\r\n Url: node.Url,\r\n Id: node.Guid,\r\n FriendlyUrl: node.FriendlyUrl,\r\n TermCount: node.TermCount,\r\n LastModified: node.LastModified,\r\n Labels: node.Labels,\r\n LocalCustomProperties: node.LocalCustomProperties,\r\n Selected: node.Selected,\r\n DisableSelection: node.DisableSelection,\r\n IsRoot: node.IsRoot,\r\n IsAvailableForTagging: node.IsAvailableForTagging,\r\n Children: node.Terms ? this.mapSimplifiedTerms(node.Terms) : []\r\n });\r\n });\r\n }\r\n\r\n}\r\n@NgModule({\r\n declarations: [FindInformationMegaMenuComponent],\r\n exports: [\r\n FindInformationMegaMenuComponent\r\n ],\r\n imports: [\r\n CommonModule,\r\n WidgetPlaceholderModule,\r\n LinkModule,\r\n ]\r\n})\r\nexport class FindInformationMegaMenuModule { }\r\n","
\r\n
\r\n
\r\n\r\n \r\n

\r\n\r\n \r\n {{node.Title}}\r\n\r\n \r\n {{node.Title}}\r\n

\r\n\r\n \r\n
    \r\n
  • \r\n\r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n
  • \r\n
\r\n\r\n
\r\n
\r\n\r\n\r\n\r\n\r\n\r\n \r\n
\r\n\r\n \r\n \r\n {{node.Title}}\r\n \r\n\r\n \r\n \r\n\r\n \r\n
    \r\n
  • \r\n \r\n
  • \r\n
\r\n
\r\n
\r\n\r\n\r\n\r\n\r\n \r\n {{node.Title}}\r\n \r\n\r\n\r\n\r\n\r\n\r\n
\r\n \r\n
\r\n
\r\n","import { CommonModule } from '@angular/common';\r\nimport { ChangeDetectionStrategy, Component, NgModule } from '@angular/core';\r\nimport { FindInformationMegaMenuComponent } from '@app/components/find-information/find-information-mega-menu/find-information-mega-menu.component';\r\nimport { WidgetPlaceholderModule } from '@app/components/widget-placeholder/widget-placeholder.component';\r\nimport { LinkModule } from '@app/directives/link.directive';\r\n\r\n@Component({\r\n selector: 'cafcass-custom-find-information-mega-menu',\r\n templateUrl: './custom-find-information-mega-menu.component.html',\r\n styleUrls: ['./custom-find-information-mega-menu.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush\r\n})\r\nexport class CustomFindInformationMegaMenuComponent extends FindInformationMegaMenuComponent {\r\n\r\n}\r\n@NgModule({\r\n declarations: [CustomFindInformationMegaMenuComponent],\r\n exports: [\r\n CustomFindInformationMegaMenuComponent\r\n ],\r\n imports: [\r\n CommonModule,\r\n WidgetPlaceholderModule,\r\n LinkModule,\r\n ]\r\n})\r\nexport class CustomFindInformationMegaMenuModule { }\r\n","\r\n
\r\n
\r\n \r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n \r\n
\r\n \r\n
\r\n
\r\n \r\n
\r\n
\r\n \r\n
\r\n
\r\n \r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n","import { CommonModule } from '@angular/common';\r\nimport { Component, NgModule } from '@angular/core';\r\nimport { FindInformationSavedPagesModule } from '@app/components/find-information/find-information-saved-pages/find-information-saved-pages.component';\r\nimport { FindInformationTrendingPagesModule } from '@app/components/find-information/find-information-trending-pages/find-information-trending-pages.component';\r\nimport { RequiredReadingModule } from '@app/components/required-reading/required-reading.component';\r\nimport { FeatureToggleModule } from '@app/directives/feature-toggle.directive';\r\nimport { HideParentIfEmptyModule } from '@app/directives/hide-parent-if-empty.directive';\r\nimport { MarkComponentVisitedModule } from '@app/directives/mark-component-visited.directive';\r\nimport { LinkModule } from '@app/directives/link.directive';\r\nimport { CustomFindInformationMegaMenuModule } from '../../components/custom-find-information-mega-menu/custom-find-information-mega-menu.component';\r\nimport { InfoboxZoneModule } from '@app/components/infobox-zone/infobox-zone.component';\r\n\r\n@Component({\r\n selector: 'cafcass-custom-find-information',\r\n templateUrl: './custom-find-information.component.html',\r\n styleUrls: ['./custom-find-information.component.scss']\r\n})\r\nexport class CustomFindInformationComponent { }\r\n@NgModule({\r\n declarations: [CustomFindInformationComponent],\r\n exports: [CustomFindInformationComponent],\r\n imports: [\r\n CommonModule,\r\n LinkModule,\r\n FeatureToggleModule,\r\n MarkComponentVisitedModule,\r\n HideParentIfEmptyModule,\r\n RequiredReadingModule,\r\n CustomFindInformationMegaMenuModule,\r\n FindInformationTrendingPagesModule,\r\n FindInformationSavedPagesModule,\r\n InfoboxZoneModule\r\n ]\r\n})\r\nexport class CustomFindInformationModule { }\r\n","\r\n \r\n Find more colleagues\r\n \r\n \r\n\r\n\r\n
\r\n

Find your colleagues

\r\n

Here you find colleagues that you often interact with. Click on \"Find more colleagues\" to search for more colleagues and departments.

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

No colleagues found.

\r\n
\r\n
\r\n
\r\n\r\n\r\n
\r\n \r\n
\r\n \r\n \r\n \r\n \r\n
\r\n","import { CommonModule } from '@angular/common';\r\nimport { ChangeDetectionStrategy, Component, Input, NgModule, OnInit } from '@angular/core';\r\nimport { ActionLinkModule } from '@app/components/actions/action-link/action-link.component';\r\nimport { ErrorTemplatesModule } from '@app/components/error-templates/error-templates.component';\r\nimport { TextPlaceholderModule } from '@app/components/text-placeholder/text-placeholder.component';\r\nimport { WidgetPlaceholderModule } from '@app/components/widget-placeholder/widget-placeholder.component';\r\nimport { PersonExtended } from '@app/models/person-extended';\r\nimport { LinkModule } from '@app/directives/link.directive';\r\nimport { UserService } from '@app/services/user.service';\r\nimport { User } from '@microsoft/microsoft-graph-types';\r\nimport { combineLatest, Observable, of, Subject } from 'rxjs';\r\nimport { catchError, map } from 'rxjs/operators';\r\nimport { ActionRouterLinkModule } from '../actions/action-router-link/action-router-link.component';\r\nimport { PeopleCardModule } from '../people-card/people-card.component';\r\n\r\n@Component({\r\n selector: 'app-colleagues',\r\n templateUrl: './colleagues.component.html',\r\n styleUrls: ['./colleagues.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush\r\n})\r\nexport class ColleaguesComponent implements OnInit {\r\n\r\n myColleagues$: Observable>;\r\n @Input() myColleaguesCount = 7;\r\n allColleagues: string;\r\n loggedInUserProfileProp: string;\r\n me$: Observable;\r\n private errorSubject$ = new Subject();\r\n componentName = 'Find your colleagues';\r\n\r\n constructor(private userService: UserService) { }\r\n\r\n ngOnInit() {\r\n\r\n this.me$ = this.userService.getMyDetailsFromMsGraph();\r\n\r\n this.myColleagues$ = combineLatest([\r\n this.userService.getRelatedPeople(this.myColleaguesCount),\r\n this.me$])\r\n .pipe(map(([colleagues, user]) => {\r\n const myColeagues = colleagues\r\n .filter(item => item.id !== user.id)\r\n .map(colleague => {\r\n return PersonExtended.fromPerson(colleague);\r\n });\r\n // Show maximum of 6 colleague cards only.\r\n if (myColeagues.length === this.myColleaguesCount) {\r\n return myColeagues.slice(0, this.myColleaguesCount - 1);\r\n } else {\r\n return myColeagues;\r\n }\r\n }),\r\n catchError(err => {\r\n this.errorSubject$.next(err);\r\n return of(null);\r\n }));\r\n }\r\n\r\n getUrl(user: User) {\r\n return 'https://delve.office.com/?u=' + user.id + '&v=liveprofileworkingwith';\r\n }\r\n}\r\n\r\n@NgModule({\r\n declarations: [ColleaguesComponent],\r\n exports: [ColleaguesComponent],\r\n imports: [\r\n CommonModule,\r\n ActionLinkModule,\r\n TextPlaceholderModule,\r\n WidgetPlaceholderModule,\r\n ErrorTemplatesModule,\r\n LinkModule,\r\n ActionRouterLinkModule,\r\n PeopleCardModule,\r\n ],\r\n})\r\nexport class ColleaguesModule { }\r\n","import { ListItem } from '@microsoft/microsoft-graph-types';\r\nimport { Observable } from 'rxjs';\r\n\r\nexport interface Change {\r\n ListItem$: Observable;\r\n SiteTitle: string;\r\n TimeAsDate: Date;\r\n UserPhoto$: Observable;\r\n ItemUrl: string;\r\n SiteUrl: string;\r\n Title: string;\r\n ChangeType: ChangeType;\r\n Editor: string;\r\n EditorEmailHint: string;\r\n ItemId: number;\r\n ListId: string;\r\n ServerRelativeUrl: string;\r\n SharedByUser: any;\r\n SharedWithUsers: any;\r\n SiteId: string;\r\n Time: string;\r\n UniqueId: string;\r\n WebId: string;\r\n}\r\n\r\nexport enum ChangeType {\r\n NoChange = 0,\r\n Add = 1,\r\n Update = 2,\r\n DeleteObject = 3,\r\n Rename = 4,\r\n MoveAway = 5,\r\n MoveInto = 6,\r\n Restore = 7,\r\n RoleAdd = 8,\r\n RoleDelete = 9,\r\n RoleUpdate = 10,\r\n AssignmentAdd = 11,\r\n AssignmentDelete = 12,\r\n MemberAdd = 13,\r\n MemberDelete = 14,\r\n SystemUpdate = 15,\r\n Navigation = 16,\r\n ScopeAdd = 17,\r\n ScopeDelete = 18,\r\n ListContentTypeAdd = 19,\r\n ListContentTypeDelete = 20,\r\n Dirty = 21,\r\n Activity = 22\r\n}\r\n","import { HttpClient, HttpParams } from '@angular/common/http';\r\nimport { Inject, Injectable } from '@angular/core';\r\nimport { CUSTOMERENVIRONMENT } from '@app/common/app-tokens';\r\nimport { Constants } from '@app/common/constants';\r\nimport { HttpHelper } from '@app/common/http-helper';\r\nimport { Change } from '@app/models/change';\r\nimport { SearchPostQuery } from '@app/models/search-post-query';\r\nimport { SearchResult } from '@app/models/search-result';\r\nimport { CacheService } from '@app/services/cache.service';\r\nimport { SearchService } from '@app/services/search.service';\r\nimport { Environment } from '@environments/interface.environment';\r\nimport { ListItem } from '@microsoft/microsoft-graph-types';\r\nimport { UsedInsight } from '@microsoft/microsoft-graph-types-beta';\r\nimport { parseISO } from 'date-fns';\r\nimport { concat, merge, Observable, of } from 'rxjs';\r\nimport { catchError, map, mergeMap, shareReplay, tap } from 'rxjs/operators';\r\nimport { UrlHelperService } from './url-helper.service';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class MyCollaborationActivitiesService {\r\n\r\n constructor(\r\n private http: HttpClient,\r\n private cache: CacheService,\r\n @Inject(CUSTOMERENVIRONMENT) private environment: Environment,\r\n private urlHelperService: UrlHelperService,\r\n private searchService: SearchService, private httpHelper: HttpHelper) { }\r\n\r\n private readonly myCollabcacheKey = 'MyCollaborationActivitiesService-getMyFrequentSites';\r\n private readonly myCollabUserActivityCacheKey = 'MyCollaborationUserActivitiesService-getItemDetails';\r\n private getItemDetails$ = new Map>();\r\n private getMyFrequentSites$ = new Map>>();\r\n private getChangesForSite$ = new Map>>();\r\n private siteExclude = '/News';\r\n public useCache = false;\r\n\r\n getMyFrequentSites(amount: number = 10): Observable> {\r\n const key = `${this.myCollabcacheKey}-${amount}`;\r\n if (this.getMyFrequentSites$.has(key)) {\r\n return this.getMyFrequentSites$.get(key);\r\n } else {\r\n const httpParamsMyCollabActivities = new HttpParams()\r\n .append('$filter', 'resourceVisualization/type eq \\'spsite\\'')\r\n .append('$orderBy', 'lastUsed/lastAccessedDateTime desc')\r\n .append('$top', (amount + 1).toString());\r\n\r\n // Graph API call to fetch user activities\r\n this.getMyFrequentSites$.set(key, this.http.get(`${Constants.GRAPH_API_ENDPOINT + Constants.GRAPH_API_BETA_VERSION}/me/insights/used`,\r\n {\r\n params: httpParamsMyCollabActivities\r\n })\r\n .pipe(\r\n map(result => {\r\n console.log('Collab Frequent Sites:' + result.value);\r\n const filteredResults = result.value.filter(frequentSite => frequentSite.resourceReference.webUrl.indexOf(this.siteExclude) === -1) as Array;\r\n if (filteredResults.length > amount) {\r\n return filteredResults.slice(0, amount);\r\n }\r\n return filteredResults;\r\n }),\r\n tap(data => {\r\n this.useCache && this.cache.set(key, data);\r\n }),\r\n catchError(this.httpHelper.handleError({ operation: 'getMyFrequentSites', result: new Array(), cacheKey: key })),\r\n shareReplay({ bufferSize: 1, refCount: true })));\r\n\r\n if (this.useCache) {\r\n const cachedData = this.cache.get>(key);\r\n if (cachedData) {\r\n return concat(of(cachedData), this.getMyFrequentSites$.get(key));\r\n }\r\n }\r\n return this.getMyFrequentSites$.get(key);\r\n }\r\n\r\n }\r\n\r\n getChangesForSite(resource: UsedInsight, maxAmountOfChanges: number = 2): Observable> {\r\n const serviceMapKey = `${resource.resourceReference.webUrl}-${maxAmountOfChanges}`;\r\n if (this.getChangesForSite$.has(serviceMapKey)) {\r\n return this.getChangesForSite$.get(serviceMapKey);\r\n } else {\r\n const changeQuery = {\r\n 'query':\r\n {\r\n 'View': true,\r\n 'LatestFirst': true,\r\n 'Item': true,\r\n 'Add': true,\r\n 'DeleteObject': true,\r\n 'Rename': true,\r\n 'Update': true,\r\n 'FetchLimit': '200',\r\n 'RequireSecurityTrim': true\r\n }\r\n };\r\n this.getChangesForSite$.set(serviceMapKey, this.http.post(`${resource.resourceReference.webUrl}/_api/web/getchanges`, changeQuery)\r\n .pipe(\r\n mergeMap(changesResult => {\r\n const changes = new Map();\r\n const queryText = new Array();\r\n (changesResult.value as Array).forEach(change => {\r\n if (changes.size <= maxAmountOfChanges) {\r\n const key = `${resource.resourceReference.webUrl}-${change.ItemId}-${change.ListId}-${change.SiteId}-${change.ChangeType.toString()}`;\r\n if (!changes.has(key)) {\r\n change.Title = change.ItemId.toString();\r\n change.SiteTitle = resource.resourceVisualization.title;\r\n change.SiteUrl = resource.resourceReference.webUrl;\r\n change.TimeAsDate = parseISO(change.Time);\r\n change.ItemUrl = `${resource.resourceReference.webUrl}/_layouts/15/shortcutlink.aspx?siteId=${change.SiteId}&webId=${change.WebId}&uniqueId=${change.UniqueId}`;\r\n queryText.push(`uniqueid:{${change.UniqueId}}`);\r\n changes.set(key, change);\r\n }\r\n }\r\n });\r\n\r\n if (queryText.length > 0) {\r\n const queryTextWithOr = queryText.join(' OR ');\r\n let searchRequests: Array>;\r\n if (queryTextWithOr.length >= 4096) { // Query text only supports max 4096 characters so we need to split the queries in that case\r\n const amountOfSplits = Math.ceil(queryTextWithOr.length / 4096);\r\n const splittedQueryText = this.chunk(queryText, queryText.length / amountOfSplits);\r\n searchRequests = splittedQueryText.map(value => {\r\n const searchRequest = this.buildSearchPostQuery(value);\r\n return this.searchService.sendPostSearchQuery(searchRequest);\r\n });\r\n } else {\r\n const searchRequest = this.buildSearchPostQuery(queryText);\r\n searchRequests = [this.searchService.sendPostSearchQuery(searchRequest)];\r\n }\r\n return merge(...searchRequests)\r\n .pipe(\r\n map((searchResults) => {\r\n changes.forEach((change) => {\r\n const result = searchResults.find(s => s.UniqueId.toLowerCase() === `{${change.UniqueId.toLowerCase()}}`);\r\n if (result) {\r\n change.Title = result.Title || result.Filename;\r\n change.ItemUrl = result.Path;\r\n } else {\r\n change.ListItem$ = this.getItemDetails(change.SiteId, change.ListId, change.ItemId);\r\n }\r\n });\r\n return [...changes.values()];\r\n }));\r\n } else {\r\n return of([...changes.values()]);\r\n }\r\n }),\r\n shareReplay({ bufferSize: 1, refCount: true })));\r\n return this.getChangesForSite$.get(serviceMapKey);\r\n }\r\n }\r\n\r\n getItemDetails(siteId: string, listId: string, itemId: number): Observable {\r\n const key = `${this.myCollabUserActivityCacheKey}-${siteId}-${listId}-${itemId}`;\r\n if (this.getItemDetails$.has(key)) {\r\n return this.getItemDetails$.get(key);\r\n } else {\r\n\r\n const httpParams = new HttpParams()\r\n .append('expand', 'fields(select=FileLeafRef)')\r\n .append('select', 'fields,id,webUrl');\r\n\r\n siteId = siteId.replace(/-/g, '');\r\n listId = listId.replace(/-/g, '');\r\n\r\n this.getItemDetails$.set(key, this.http.get(\r\n `${Constants.GRAPH_API_ENDPOINT}${Constants.GRAPH_API_VERSION_ONE}/sites/${siteId}/lists/${listId}/items/${itemId}`,\r\n { params: httpParams })\r\n .pipe(\r\n map(data => {\r\n if (data.webUrl.indexOf('?') === -1) {\r\n data.webUrl = `${data.webUrl}?Web=1`;\r\n }\r\n return data;\r\n }),\r\n tap(data => {\r\n this.useCache && this.cache.set(key, data);\r\n }),\r\n shareReplay({ bufferSize: 1, refCount: true })));\r\n\r\n if (this.useCache) {\r\n const cachedData = this.cache.get(key);\r\n if (cachedData) {\r\n return concat(of(cachedData), this.getItemDetails$.get(key));\r\n }\r\n }\r\n return this.getItemDetails$.get(key);\r\n }\r\n }\r\n\r\n private chunk(arr: Array, numOfParts: number) {\r\n const temparray = new Array>();\r\n for (let i = 0; i < arr.length; i += numOfParts) {\r\n temparray.push(arr.slice(i, i + numOfParts));\r\n }\r\n return temparray;\r\n }\r\n\r\n private buildSearchPostQuery(value: string[]) {\r\n return {\r\n request: {\r\n Querytext: value.join(' OR '),\r\n RowLimit: 100,\r\n SelectProperties: ['Title', 'Filename', 'UniqueId', 'Path'],\r\n TrimDuplicates: false,\r\n Properties: [\r\n {\r\n Name: 'EnableDynamicGroups',\r\n Value: {\r\n BoolVal: 'True',\r\n QueryPropertyValueTypeIndex: 3\r\n }\r\n }\r\n ]\r\n }\r\n } as SearchPostQuery;\r\n }\r\n}\r\n","
\r\n\r\n \r\n \r\n See all activities\r\n \r\n \r\n\r\n
\r\n

Recent activities

\r\n

See what's happening on your SharePoint sites.

\r\n
\r\n\r\n
\r\n
\r\n
\r\n \r\n
\r\n
\r\n
\r\n
\r\n \r\n
\r\n
\r\n \r\n
\r\n {{ getPreferredNameLetters(changeItem.Editor) }}\r\n
\r\n
\r\n
\r\n
\r\n {{changeItem.Editor}}\r\n {{getChangeType(changeItem.ChangeType)}}{{changeItem.ChangeType === 1 ? 'ed':'d' }} \r\n \r\n \r\n \r\n {{listItem.fields.FileLeafRef.length > 40 ? (listItem.fields.FileLeafRef | slice:0:40) + '...' : (listItem.fields.FileLeafRef) }}\r\n \r\n \r\n \r\n \r\n \r\n \r\n {{changeItem.Title.length > 40 ? (changeItem.Title | slice:0:40) + '...' : (changeItem.Title) }}\r\n \r\n \r\n \r\n
\r\n {{changeItem.Time | date:'longDate'}}\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n No recent activities found in SharePoint.\r\n
\r\n
\r\n
\r\n
\r\n \r\n

No recent activities found in SharePoint.

\r\n
\r\n
\r\n
\r\n
\r\n\r\n\r\n
\r\n \r\n
\r\n
\r\n","import { CommonModule } from '@angular/common';\r\nimport { ChangeDetectionStrategy, Component, Inject, LOCALE_ID, NgModule, OnInit } from '@angular/core';\r\nimport { CUSTOMERENVIRONMENT, WINDOW } from '@app/common/app-tokens';\r\nimport { BreakPoints } from '@app/common/breakpoints';\r\nimport { Constants } from '@app/common/constants';\r\nimport { Utilities } from '@app/common/utilities';\r\nimport { ActionLinkModule } from '@app/components/actions/action-link/action-link.component';\r\nimport { TextPlaceholderModule } from '@app/components/text-placeholder/text-placeholder.component';\r\nimport { WidgetPlaceholderModule } from '@app/components/widget-placeholder/widget-placeholder.component';\r\nimport { Change, ChangeType } from '@app/models/change';\r\nimport { LinkModule } from '@app/directives/link.directive';\r\nimport { SafeModule } from '@app/pipes/safe.pipe';\r\nimport { MyCollaborationActivitiesService } from '@app/services/my-collaboration-activities.service';\r\nimport { UrlHelperService } from '@app/services/url-helper.service';\r\nimport { UserService } from '@app/services/user.service';\r\nimport { Environment } from '@environments/interface.environment';\r\nimport { merge, Observable, of } from 'rxjs';\r\nimport { map, mergeMap } from 'rxjs/operators';\r\n\r\n@Component({\r\n selector: 'app-my-collaboration-activities-widget',\r\n templateUrl: './my-collaboration-activities-widget.component.html',\r\n styleUrls: ['./my-collaboration-activities-widget.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush\r\n})\r\nexport class MyCollaborationActivitiesWidgetComponent implements OnInit {\r\n\r\n myFrequentSites$: Observable>;\r\n allSiteActivitiesUrl: string;\r\n rootUrl = this.urlHelperService.getAuthorityUrlWithoutQueryStrings(this.environment.coreWorkplaceSiteUrl);\r\n\r\n constructor(@Inject(CUSTOMERENVIRONMENT) private environment: Environment,\r\n @Inject(WINDOW) private window: Window,\r\n private myCollabActivityService: MyCollaborationActivitiesService,\r\n private userService: UserService,\r\n private urlHelperService: UrlHelperService,\r\n @Inject(LOCALE_ID) public localeId: string) {\r\n }\r\n\r\n ngOnInit() {\r\n this.allSiteActivitiesUrl = this.rootUrl + '/_layouts/15/sharepoint.aspx';\r\n\r\n // Vary amount of items to show based on screen size (and thus breakpoint).\r\n // Goal: 1) display even amount, and 2) show suitable amount for the resolution\r\n const amountToLoad = { [BreakPoints.xs]: 3, [BreakPoints.sm]: 3, [BreakPoints.md]: 4, [BreakPoints.lg]: 3, [BreakPoints.xl]: 3, [BreakPoints.xxl]: 4, [BreakPoints.xxxl]: 4 };\r\n const breakpoint = Utilities.getCurrentBootstrapBreakpoint(this.window);\r\n\r\n this.myFrequentSites$ = this.myCollabActivityService.getMyFrequentSites(amountToLoad[breakpoint])\r\n .pipe(\r\n mergeMap(resources => {\r\n const mapOfSites = new Map();\r\n const siteChangeRequests = resources.map(resource => {\r\n const mapKey = `${resource.resourceReference.webUrl},${resource.resourceVisualization.title}`;\r\n mapOfSites.set(mapKey, []);\r\n return this.myCollabActivityService\r\n .getChangesForSite(resource)\r\n .pipe(map((changes) => {\r\n changes.forEach(change => {\r\n change.UserPhoto$ = change.EditorEmailHint ? this.userService.getUserPhotoByUpn(change.EditorEmailHint) : of(Constants.TRANSPARENT_IMAGE);\r\n let arr = [change];\r\n if (mapOfSites.has(mapKey)) {\r\n arr = mapOfSites.get(mapKey).concat([change]);\r\n }\r\n mapOfSites.set(mapKey, arr);\r\n });\r\n return mapOfSites;\r\n }));\r\n });\r\n return merge(...siteChangeRequests);\r\n })\r\n );\r\n }\r\n\r\n getChangeType(change: ChangeType) {\r\n return ChangeType[change];\r\n }\r\n\r\n getPreferredNameLetters(userName: string) {\r\n return Utilities.generateInitials(userName);\r\n }\r\n}\r\n@NgModule({\r\n declarations: [MyCollaborationActivitiesWidgetComponent],\r\n exports: [MyCollaborationActivitiesWidgetComponent],\r\n imports: [\r\n CommonModule,\r\n ActionLinkModule,\r\n TextPlaceholderModule,\r\n WidgetPlaceholderModule,\r\n SafeModule,\r\n LinkModule,\r\n ]\r\n})\r\nexport class MyCollaborationActivitiesModule { }\r\n","import { HttpClient, HttpHeaders } from '@angular/common/http';\r\nimport { Injectable } from '@angular/core';\r\nimport { HttpHelper } from '@app/common/http-helper';\r\nimport { concat, of } from 'rxjs';\r\nimport { catchError, mergeMap, tap } from 'rxjs/operators';\r\nimport { CacheService } from './cache.service';\r\nimport { SphomeService } from './sphome.service';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class MyLatestSitesService {\r\n\r\n public useCache = true;\r\n private readonly cacheKeyPrefix = 'MyLatestSitesService';\r\n\r\n constructor(private http: HttpClient,\r\n private cache: CacheService,\r\n private spHomeService: SphomeService,\r\n private httpHelper: HttpHelper) { }\r\n\r\n getMyRecentSitesFromSpHome(start: number = 0, count: number = 10) {\r\n const cacheKey = `${this.cacheKeyPrefix}-${'getMyRecentSitesFromSpHome'}-${start.toString()}-${count.toString()}`;\r\n\r\n const fetchOperation = this.spHomeService.getSPHomeContext()\r\n .pipe(\r\n mergeMap(ctx => {\r\n const httpHeaders = new HttpHeaders().append('SPHome-ApiContext', ctx.Payload);\r\n return this.http.get(`${ctx.Urls[0]}/api/v1/sites/recent?start=${start}&count=${count}`, {\r\n headers: httpHeaders\r\n });\r\n }),\r\n tap(data => {\r\n this.useCache && this.cache.set(cacheKey, data);\r\n }),\r\n catchError(this.httpHelper.handleError({ operation: 'getMyRecentSitesFromSpHome', result: {}, rethrow: true })));\r\n\r\n if (this.useCache) {\r\n const cachedData = this.cache.get(cacheKey);\r\n if (cachedData) {\r\n return concat(of(cachedData), fetchOperation);\r\n }\r\n }\r\n\r\n return fetchOperation;\r\n }\r\n}\r\n","
\r\n

Recently visited collaboration sites

\r\n\r\n

You have recently visited these collaboration sites.

\r\n\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n {{ getGroupLetters(site.Title) }}\r\n \r\n
\r\n
\r\n
\r\n
\r\n \r\n
0 && items[0].providerName === 'Microsoft Teams'\">\r\n \r\n \r\n Redirect to Teams\r\n \r\n
\r\n
0 && items[0].providerName === 'Yammer'\">\r\n \r\n \r\n Redirect to Yammer\r\n \r\n
\r\n \r\n
\r\n \r\n
\r\n \r\n This group has recently been deleted. It will disappear from here when the search index has been updated.\r\n \r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n\r\n
\r\n \r\n

No recent visited sites were found.

\r\n
\r\n
\r\n\r\n
\r\n
\r\n
\r\n \r\n
\r\n \r\n \r\n \r\n
\r\n
\r\n\r\n
\r\n","import { CommonModule } from '@angular/common';\r\nimport { ChangeDetectionStrategy, Component, Inject, Input, NgModule, OnInit, Renderer2 } from '@angular/core';\r\nimport { WINDOW } from '@app/common/app-tokens';\r\nimport { Utilities } from '@app/common/utilities';\r\nimport { ErrorTemplatesModule } from '@app/components/error-templates/error-templates.component';\r\nimport { TextPlaceholderModule } from '@app/components/text-placeholder/text-placeholder.component';\r\nimport { WidgetPlaceholderModule } from '@app/components/widget-placeholder/widget-placeholder.component';\r\nimport { LinkModule } from '@app/directives/link.directive';\r\nimport { MyLatestSitesService } from '@app/services/my-latest-sites.service';\r\nimport { SiteService } from '@app/services/site.service';\r\nimport { Observable, of, Subject } from 'rxjs';\r\nimport { catchError, map } from 'rxjs/operators';\r\n\r\n@Component({\r\n selector: 'app-my-latest-sites',\r\n templateUrl: './my-latest-sites.component.html',\r\n styleUrls: ['./my-latest-sites.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush\r\n})\r\nexport class MyLatestSitesComponent implements OnInit {\r\n\r\n @Input() itemsToShow = 6;\r\n myLatestSites$: Observable;\r\n private errorSubject$ = new Subject();\r\n private endPointsErrorSubject$ = new Subject();\r\n loading = true;\r\n componentName = 'Your latest sites';\r\n\r\n constructor(\r\n private myRecentSitesService: MyLatestSitesService,\r\n private renderer: Renderer2,\r\n private siteService: SiteService,\r\n @Inject(WINDOW) private window: Window) { }\r\n\r\n ngOnInit() {\r\n this.myLatestSites$ = this.myRecentSitesService.getMyRecentSitesFromSpHome(0, 50)\r\n .pipe(map(result => {\r\n const groups = result?.Items?.filter(item => {\r\n return item.Type === 'Group';\r\n })\r\n .map(item => {\r\n item.EndPoints$ = this.siteService\r\n .getGroupEndpoints(item.ItemReference.GroupId)\r\n .pipe(\r\n catchError(err => {\r\n this.endPointsErrorSubject$.next(item);\r\n return of(null);\r\n }));\r\n return item;\r\n });\r\n this.loading = false;\r\n return groups?.slice(0, this.itemsToShow);\r\n })),\r\n catchError(err => {\r\n this.loading = false;\r\n this.errorSubject$.next(err);\r\n return of(null);\r\n });\r\n }\r\n\r\n whenTouched(event: TouchEvent, site: any) {\r\n const e = event.currentTarget as HTMLElement;\r\n if (e.classList.contains('card-inner-container-touched')) {\r\n this.renderer.removeClass(e, 'card-inner-container-touched');\r\n } else {\r\n this.renderer.addClass(e, 'card-inner-container-touched');\r\n this.whenMouseEnter(site);\r\n }\r\n }\r\n\r\n removeTouched(event: TouchEvent, site: any) {\r\n const e = event.currentTarget as HTMLElement;\r\n this.window.setTimeout(() => {\r\n if (e.classList.contains('card-inner-container-touched')) {\r\n this.renderer.removeClass(e, 'card-inner-container-touched');\r\n }\r\n }, 1500);\r\n\r\n }\r\n\r\n whenMouseEnter(site: any) {\r\n site.Hovered = true;\r\n }\r\n\r\n getGroupLetters(title: any) {\r\n return Utilities.generateInitials(title);\r\n }\r\n}\r\n@NgModule({\r\n declarations: [MyLatestSitesComponent],\r\n exports: [MyLatestSitesComponent],\r\n imports: [\r\n CommonModule,\r\n ErrorTemplatesModule,\r\n TextPlaceholderModule,\r\n WidgetPlaceholderModule,\r\n LinkModule,\r\n ]\r\n})\r\nexport class MyLatestSitesModule { }\r\n","\r\n
\r\n \r\n
\r\n
\r\n","import { animate, keyframes, state, style, transition, trigger } from '@angular/animations';\r\nimport { ConfigurableFocusTrapFactory } from '@angular/cdk/a11y';\r\nimport { ESCAPE } from '@angular/cdk/keycodes';\r\nimport { CdkConnectedOverlay, CdkOverlayOrigin, OverlayModule, OverlayRef } from '@angular/cdk/overlay';\r\nimport { Platform } from '@angular/cdk/platform';\r\nimport { CommonModule } from '@angular/common';\r\nimport { Component, Inject, Input, NgModule, OnDestroy, OnInit, ViewChild } from '@angular/core';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { WINDOW } from '@app/common/app-tokens';\r\nimport { LinkModule } from '@app/directives/link.directive';\r\nimport { Subscription } from 'rxjs';\r\n\r\n@Component({\r\n selector: 'app-popover',\r\n templateUrl: './popover.component.html',\r\n styleUrls: ['./popover.component.scss'],\r\n animations: [\r\n trigger('state', [\r\n state('initial, void, hidden', style({ opacity: 0, transform: 'scale(0)' })),\r\n state('visible', style({ transform: 'scale(1)' })),\r\n transition('* => visible', animate('200ms cubic-bezier(0, 0, 0.2, 1)', keyframes([\r\n style({ opacity: 0, transform: 'scale(0)', offset: 0 }),\r\n style({ opacity: 0.5, transform: 'scale(0.99)', offset: 0.5 }),\r\n style({ opacity: 1, transform: 'scale(1)', offset: 1 })\r\n ]))),\r\n transition('* => hidden', animate('100ms cubic-bezier(0, 0, 0.2, 1)', style({ opacity: 0 }))),\r\n ])],\r\n})\r\nexport class PopoverComponent implements OnInit, OnDestroy {\r\n\r\n @Input() originOverlay: CdkOverlayOrigin;\r\n @Input() isOpen = false;\r\n @ViewChild(CdkConnectedOverlay, { static: true }) connectedOverlay: CdkConnectedOverlay;\r\n element: HTMLElement;\r\n _manualListeners = new Map();\r\n private subscription: Subscription = new Subscription();\r\n overlayRef: OverlayRef;\r\n subscriptions = new Subscription();\r\n\r\n constructor(private platform: Platform, private focusTrap: ConfigurableFocusTrapFactory, @Inject(WINDOW) private window: Window) {\r\n if (!this.platform.IOS && !this.platform.ANDROID) {\r\n this._manualListeners\r\n .set('mouseenter', () => this.show())\r\n .set('mouseleave', (event) => this.hide(event))\r\n .set('focus', () => {\r\n this.isOpen = true;\r\n this.window.setTimeout(() => this.focus(this.connectedOverlay.overlayRef.overlayElement), 200);\r\n });\r\n }\r\n }\r\n\r\n mouseLeave() {\r\n this.isOpen = false;\r\n }\r\n\r\n ngOnInit() {\r\n this.element = this.originOverlay.elementRef.nativeElement as HTMLElement;\r\n this._manualListeners.forEach((listener, event) => this.element.addEventListener(event, listener));\r\n }\r\n\r\n show() {\r\n this.isOpen = true;\r\n }\r\n\r\n focus(overlayElement: HTMLElement) {\r\n if (overlayElement) {\r\n if (this.connectedOverlay.overlayRef.hasAttached) {\r\n const focusTrap = this.focusTrap.create(overlayElement); // creates a focus trap region\r\n focusTrap.focusInitialElement();\r\n }\r\n\r\n this.subscriptions.add(\r\n this.connectedOverlay\r\n .overlayRef\r\n .keydownEvents()\r\n .subscribe((event: KeyboardEvent) => {\r\n if (event.key) {\r\n if (event.key === 'Escape') {\r\n this.connectedOverlay.overlayRef.detach();\r\n const element = this.element;\r\n this.window.setTimeout(() => element.focus(), 0);\r\n }\r\n } else {\r\n /* tslint:disable */\r\n if (event.keyCode === ESCAPE) {\r\n /* tslint:enable */\r\n this.connectedOverlay.overlayRef.detach();\r\n const element = this.element;\r\n this.window.setTimeout(() => element.focus(), 0);\r\n }\r\n }\r\n }));\r\n }\r\n }\r\n\r\n hide(event) {\r\n const element = event.toElement || event.relatedTarget;\r\n if (element) {\r\n const overlayElement = this.connectedOverlay.overlayRef?.overlayElement;\r\n if (overlayElement) {\r\n const leaveToPopover = overlayElement.contains(element) || overlayElement === element;\r\n if (leaveToPopover) {\r\n this.isOpen = true;\r\n } else {\r\n this.isOpen = false;\r\n }\r\n } else {\r\n this.isOpen = false;\r\n }\r\n } else {\r\n this.isOpen = false;\r\n }\r\n }\r\n\r\n ngOnDestroy(): void {\r\n if (this.element) {\r\n this._manualListeners.forEach((listener, event) => {\r\n this.element.removeEventListener(event, listener);\r\n });\r\n }\r\n this.subscription && this.subscription.unsubscribe();\r\n }\r\n}\r\n\r\n@NgModule({\r\n declarations: [PopoverComponent],\r\n exports: [PopoverComponent],\r\n imports: [\r\n CommonModule,\r\n OverlayModule,\r\n LinkModule,\r\n MatButtonModule\r\n ]\r\n})\r\nexport class PopoverModule { }\r\n","
\r\n {{link.name}}\r\n
\r\n","import { ScrollDispatcher } from '@angular/cdk/overlay';\r\nimport { ScrollingModule } from '@angular/cdk/scrolling';\r\nimport { CommonModule, DOCUMENT } from '@angular/common';\r\nimport { AfterViewInit, ChangeDetectorRef, Component, Inject, Input, NgModule, OnDestroy, OnInit } from '@angular/core';\r\nimport { RouterModule } from '@angular/router';\r\nimport { WINDOW } from '@app/common/app-tokens';\r\nimport { Link } from '@app/models/link';\r\nimport { LinkModule } from '@app/directives/link.directive';\r\nimport { Subscription } from 'rxjs';\r\n@Component({\r\n selector: 'app-table-of-contents',\r\n templateUrl: './table-of-contents.component.html',\r\n styleUrls: ['./table-of-contents.component.scss'],\r\n})\r\nexport class TableOfContentsComponent implements OnInit, AfterViewInit, OnDestroy {\r\n @Input() selectors: string;\r\n links = new Array();\r\n scrollingSubscription: Subscription;\r\n\r\n constructor(private scroll: ScrollDispatcher,\r\n @Inject(DOCUMENT) private document: Document,\r\n @Inject(WINDOW) private window: Window,\r\n private cdRef: ChangeDetectorRef) {\r\n }\r\n\r\n ngOnInit() {\r\n this.scrollingSubscription = this.scroll\r\n .scrolled() // This event is throttled so there may be a slight lag when scrolling up and down and setting the active link.\r\n .subscribe(() => {\r\n this.onScroll();\r\n });\r\n }\r\n\r\n ngAfterViewInit(): void {\r\n this.document\r\n .querySelectorAll(this.selectors)\r\n .forEach((header: HTMLElement) => {\r\n const name = header.attributes['data-letter'].value;\r\n const rect = header.getBoundingClientRect();\r\n this.links.push({\r\n name,\r\n type: header.tagName.toLowerCase(),\r\n top: this.window.pageYOffset + (rect.top - rect.height),\r\n id: header.id,\r\n active: false\r\n });\r\n });\r\n }\r\n\r\n private onScroll(): void {\r\n\r\n const inView = [];\r\n const screenTop = this.window.pageYOffset;\r\n const screenBottom = this.window.pageYOffset + this.window.innerHeight;\r\n this.document\r\n .querySelectorAll(this.selectors)\r\n .forEach((header: HTMLElement) => {\r\n const id = header.id;\r\n const rect = header.getBoundingClientRect();\r\n const top = this.window.pageYOffset + (rect.top);\r\n const bottom = this.window.pageYOffset + (rect.top + rect.height) - 1;\r\n if (bottom > (screenTop + 40) && top < (screenBottom - 40)) { // 40 are margins, subjectively chosen to look nice\r\n inView.push(id);\r\n }\r\n });\r\n\r\n this.links.forEach(link => {\r\n link.active = inView.includes(link.id);\r\n });\r\n\r\n this.cdRef.detectChanges();\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.scrollingSubscription && this.scrollingSubscription.unsubscribe();\r\n }\r\n}\r\n\r\n@NgModule({\r\n declarations: [TableOfContentsComponent],\r\n imports: [\r\n CommonModule,\r\n RouterModule,\r\n LinkModule,\r\n ScrollingModule\r\n ],\r\n exports: [TableOfContentsComponent]\r\n})\r\nexport class TableOfContentsModule { }\r\n","
\r\n

Your collaboration sites

\r\n

In the index below you find the collaboration sites where you are a member or owner. You can select ”View all sites” to see all collaboration sites you have permission to see.

\r\n
\r\n
\r\n
\r\n
\r\n Select scope\r\n \r\n View your sites\r\n View all sites\r\n \r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n \r\n Filter by name\r\n \r\n \r\n \r\n
\r\n
\r\n
\r\n \r\n \r\n New collaboration site\r\n \r\n \r\n\r\n \r\n \r\n \r\n New collaboration site\r\n \r\n \r\n \r\n \r\n New collaboration site\r\n \r\n \r\n \r\n
\r\n
\r\n
\r\n
\r\n\r\n \r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n

{{letter.key}}

\r\n
\r\n
\r\n
\r\n
\r\n
\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {{site.Title}}\r\n \r\n \r\n
\r\n
\r\n

{{site.Title}}

\r\n

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

\r\n\r\n

{{truncate(site.Description, 100)}}

\r\n\r\n

\r\n Go to: \r\n \r\n Conversations\r\n \r\n \r\n Files\r\n \r\n \r\n Calendar\r\n \r\n \r\n Planner\r\n \r\n \r\n Site\r\n \r\n \r\n Team\r\n \r\n

\r\n
\r\n {{site.Visibility}}\r\n
\r\n
\r\n
\r\n \r\n \r\n {{site.Title}}\r\n \r\n \r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n \r\n

No sites could be found.

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

{{letter.key}}

\r\n
\r\n
\r\n
\r\n
\r\n
\r\n \r\n \r\n \r\n \r\n \r\n \r\n {{site.Title}}\r\n \r\n \r\n
\r\n
\r\n

{{site.Title}}

\r\n

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

\r\n\r\n

{{truncate(site.Description, 100)}}

\r\n\r\n

\r\n Go to: \r\n \r\n Conversations\r\n \r\n \r\n Files\r\n \r\n \r\n Calendar\r\n \r\n \r\n Planner\r\n \r\n \r\n Site\r\n \r\n \r\n Team\r\n \r\n

\r\n
\r\n {{site.Visibility}}\r\n
\r\n
\r\n
\r\n \r\n \r\n {{site.Title}}\r\n \r\n \r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n \r\n

No sites could be found.

\r\n
\r\n
\r\n
\r\n
\r\n
\r\n \r\n
\r\n
\r\n
\r\n
\r\n\r\n \r\n
\r\n \r\n
\r\n \r\n \r\n \r\n \r\n
\r\n\r\n
\r\n
\r\n","import { OverlayModule } from '@angular/cdk/overlay';\r\nimport { CommonModule } from '@angular/common';\r\nimport { Component, Inject, NgModule, OnInit, ViewEncapsulation } from '@angular/core';\r\nimport { FormControl, FormGroup, FormsModule, ReactiveFormsModule } from '@angular/forms';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { MatRadioModule } from '@angular/material/radio';\r\nimport { RouterModule } from '@angular/router';\r\nimport { CUSTOMERENVIRONMENT } from '@app/common/app-tokens';\r\nimport { Constants } from '@app/common/constants';\r\nimport { Roles } from '@app/common/roles';\r\nimport { Utilities } from '@app/common/utilities';\r\nimport { ErrorTemplatesModule } from '@app/components/error-templates/error-templates.component';\r\nimport { PopoverModule } from '@app/components/popover/popover.component';\r\nimport { TableOfContentsModule } from '@app/components/table-of-contents/table-of-contents.component';\r\nimport { TextPlaceholderModule } from '@app/components/text-placeholder/text-placeholder.component';\r\nimport { WidgetPlaceholderModule } from '@app/components/widget-placeholder/widget-placeholder.component';\r\nimport { StickyFillModule } from '@app/directives/stickyfill.directive';\r\nimport { SearchResult } from '@app/models/search-result';\r\nimport { SiteGroupTeam } from '@app/models/site-group-team';\r\nimport { LinkModule } from '@app/directives/link.directive';\r\nimport { FeatureSettingsStoreService } from '@app/services/feature-settings-store.service';\r\nimport { GroupsService } from '@app/services/groups.service';\r\nimport { SearchService } from '@app/services/search.service';\r\nimport { SecurityService } from '@app/services/security.service';\r\nimport { UrlHelperService } from '@app/services/url-helper.service';\r\nimport { Environment } from '@environments/interface.environment';\r\nimport { Group } from '@microsoft/microsoft-graph-types-beta';\r\nimport { combineLatest, Observable, of, Subject } from 'rxjs';\r\nimport { catchError, debounceTime, finalize, map, startWith } from 'rxjs/operators';\r\nimport { AutoFocusModule } from '../../directives/auto-focus.directive';\r\n\r\nexport enum ViewMode {\r\n YourSites = 0,\r\n AllSites = 1\r\n}\r\n\r\n@Component({\r\n selector: 'app-site-index',\r\n templateUrl: './site-index.component.html',\r\n styleUrls: ['./site-index.component.scss'],\r\n encapsulation: ViewEncapsulation.None,\r\n})\r\nexport class SiteIndexComponent implements OnInit {\r\n siteIndexForm = new FormGroup({\r\n filter: new FormControl()\r\n });\r\n filter$: Observable;\r\n selectedMode = ViewMode.YourSites;\r\n mySitesGroupedByLetters$: Observable>;\r\n allSitesGroupedByLetters$: Observable>;\r\n allowedToCreateNew$: Observable;\r\n errorSubject$ = new Subject();\r\n enablePopover = this.featureSettingsStoreService.state.enableSiteIndexPopover;\r\n componentName = 'Your collaboration sites';\r\n constructor(\r\n @Inject(CUSTOMERENVIRONMENT) private environment: Environment,\r\n private searchService: SearchService,\r\n private groupsService: GroupsService,\r\n private urlHelperService: UrlHelperService,\r\n private securityService: SecurityService,\r\n public featureSettingsStoreService: FeatureSettingsStoreService) { }\r\n\r\n ngOnInit() {\r\n\r\n if (this.featureSettingsStoreService.state.everyoneCanCreateCollabSites) {\r\n this.allowedToCreateNew$ = of(true);\r\n } else {\r\n this.allowedToCreateNew$ = this.securityService.hasUserAppRole(Roles.CollabSiteCreator);\r\n }\r\n\r\n this.filter$ = this.siteIndexForm\r\n .get('filter')\r\n .valueChanges\r\n .pipe(\r\n startWith(''),\r\n debounceTime(300),\r\n finalize(() => {\r\n // Reset filter when we switch between your sites and all sites\r\n this.siteIndexForm.get('filter').patchValue('');\r\n })\r\n );\r\n\r\n this.mySitesGroupedByLetters$ = combineLatest([\r\n this.filter$,\r\n this.searchService.getAllSiteCollections(),\r\n this.groupsService.getAllMyOwnedGroups(true),\r\n this.groupsService.getAllMyMemberGroups(true)])\r\n .pipe(\r\n map(([filterString, siteSearchResults, ownedGroups, memberGroups]) => {\r\n const mapOfSites = new Map(); // The real map to return\r\n\r\n const uniqueMapOfOwnerAndMemberGroups = new Map();\r\n ownedGroups.concat(memberGroups).forEach((group) => {\r\n // Concat the owner and membergroups and then combine them into one map to get rid of duplicates.\r\n uniqueMapOfOwnerAndMemberGroups.set(group.id, Object.assign(uniqueMapOfOwnerAndMemberGroups.get(group.id) || {}, group));\r\n });\r\n const ownerAndMemberGroups = Array.from(uniqueMapOfOwnerAndMemberGroups.values());\r\n\r\n ownerAndMemberGroups\r\n .filter((group) => this.doesGroupNameContainString(filterString, group))\r\n .sort((a, b) => a.displayName.localeCompare(b.displayName))\r\n .forEach(group => {\r\n const siteGroupTeam = this.buildSiteAndGroupTeam(siteSearchResults, group);\r\n this.assignSiteToMap(siteGroupTeam, mapOfSites);\r\n });\r\n return mapOfSites;\r\n }),\r\n catchError(err => {\r\n this.errorSubject$.next(err);\r\n return of(null);\r\n }));\r\n\r\n this.allSitesGroupedByLetters$ = combineLatest([\r\n this.filter$,\r\n this.searchService.getAllSiteCollections(),\r\n this.groupsService.getAllGroups(true)])\r\n .pipe(\r\n map(([filterString, siteSearchResults, groups]) => {\r\n const mapOfSites = new Map();\r\n groups\r\n .filter(group => this.doesGroupNameContainString(filterString, group))\r\n .sort((a, b) => a.displayName.localeCompare(b.displayName))\r\n .forEach(group => {\r\n const siteGroupTeam = this.buildSiteAndGroupTeam(siteSearchResults, group);\r\n this.assignSiteToMap(siteGroupTeam, mapOfSites);\r\n });\r\n return mapOfSites;\r\n }),\r\n catchError(err => {\r\n this.errorSubject$.next(err);\r\n return of(null);\r\n }));\r\n }\r\n\r\n private doesGroupNameContainString(filterString: string, group: Group) {\r\n if (filterString) {\r\n return group.displayName.toLowerCase().indexOf(filterString.toLowerCase()) > -1;\r\n }\r\n return true;\r\n }\r\n\r\n private buildSiteAndGroupTeam(siteSearchResults: SearchResult[], group: Group) {\r\n const site = siteSearchResults.filter(s => s.GroupId).find(s => s.GroupId.toLowerCase() === group.id.toLowerCase());\r\n const hasTeam = group.resourceProvisioningOptions.indexOf('Team') > -1;\r\n let url: string;\r\n if (site) {\r\n if (hasTeam) {\r\n url = `${site.Path}/_layouts/groupstatus.aspx?id=${group.id}&Target=TEAM`;\r\n } else {\r\n url = site.Path;\r\n }\r\n } else {\r\n url = `${this.urlHelperService.getAuthorityUrlWithoutQueryStrings(this.environment.coreWorkplaceSiteUrl)}/_layouts/groupstatus.aspx?id=${group.id}&target=site`;\r\n }\r\n const sitePath = `${site ? site.Path : this.urlHelperService.getAuthorityUrlWithoutQueryStrings(this.environment.coreWorkplaceSiteUrl)}`;\r\n const baseUrl = `${sitePath}/_layouts/groupstatus.aspx?id=${group.id}&target=`;\r\n const siteGroupTeam = {\r\n Url: url,\r\n HasTeam: hasTeam,\r\n HasYammer: group['creationOptions'] ? group['creationOptions'].indexOf('YammerProvisioning') > -1 : false,\r\n SiteUrl: site ? site.Path : url,\r\n Title: group.displayName,\r\n Description: group.description,\r\n Visibility: group.visibility,\r\n GroupId: group.id,\r\n ConversationUrl: `${baseUrl}${Constants.COLLAB_UNIFIED_GROUPS_CONVERSATION_LINK_TARGET}`,\r\n FilesUrl: `${baseUrl}${Constants.COLLAB_UNIFIED_GROUPS_FILES_LINK_TARGET}`,\r\n CalendarUrl: `${baseUrl}${Constants.COLLAB_UNIFIED_GROUPS_CALENDER_LINK_TARGET}`,\r\n PlannerUrl: `${baseUrl}${Constants.COLLAB_UNIFIED_GROUPS_PLANNER_LINK_TARGET}`,\r\n } as SiteGroupTeam;\r\n return siteGroupTeam;\r\n }\r\n\r\n truncate(text: string, titleMaxLength: number) {\r\n return Utilities.truncate(text, titleMaxLength);\r\n }\r\n\r\n private assignSiteToMap(siteGroupTeam: SiteGroupTeam, mapOfSites: Map) {\r\n const firstChar = siteGroupTeam.Title.charAt(0).toUpperCase();\r\n if (/[ !@#$%^&*()_+\\-=\\[\\]{};':\"\\\\|,.<>\\/?]/i.test(firstChar) || /^\\d*$/i.test(firstChar)) {\r\n if (mapOfSites.has('#')) {\r\n mapOfSites.get('#').push(siteGroupTeam);\r\n } else {\r\n mapOfSites.set('#', [siteGroupTeam]);\r\n }\r\n } else {\r\n if (mapOfSites.has(firstChar)) {\r\n mapOfSites.get(firstChar).push(siteGroupTeam);\r\n } else {\r\n mapOfSites.set(firstChar, [siteGroupTeam]);\r\n }\r\n }\r\n }\r\n}\r\n\r\n@NgModule({\r\n declarations: [SiteIndexComponent],\r\n exports: [SiteIndexComponent],\r\n imports: [\r\n CommonModule,\r\n FormsModule,\r\n RouterModule,\r\n LinkModule,\r\n MatButtonModule,\r\n MatFormFieldModule,\r\n MatInputModule,\r\n ReactiveFormsModule,\r\n TableOfContentsModule,\r\n ErrorTemplatesModule,\r\n MatRadioModule,\r\n WidgetPlaceholderModule,\r\n OverlayModule,\r\n PopoverModule,\r\n TextPlaceholderModule,\r\n StickyFillModule,\r\n AutoFocusModule\r\n ]\r\n})\r\nexport class SiteIndexModule { }\r\n","import { CommonModule } from '@angular/common';\r\nimport { Component, NgModule } from '@angular/core';\r\nimport { ColleaguesModule } from '@app/components/colleagues/colleagues.component';\r\nimport { MyCollaborationActivitiesModule } from '@app/components/my-collaboration-activities/my-collaboration-activities-widget/my-collaboration-activities-widget.component';\r\nimport { MyLatestSitesModule } from '@app/components/my-latest-sites/my-latest-sites.component';\r\nimport { SiteIndexModule } from '@app/components/site-index/site-index.component';\r\nimport { LinkModule } from '@app/directives/link.directive';\r\n\r\n@Component({\r\n selector: 'app-collaboration',\r\n templateUrl: './collaboration.component.html',\r\n styleUrls: ['./collaboration.component.scss']\r\n})\r\nexport class CollaborationComponent { }\r\n@NgModule({\r\n declarations: [CollaborationComponent],\r\n exports: [CollaborationComponent],\r\n imports: [\r\n CommonModule,\r\n LinkModule,\r\n MyCollaborationActivitiesModule,\r\n MyLatestSitesModule,\r\n ColleaguesModule,\r\n SiteIndexModule,\r\n ]\r\n})\r\nexport class CollaborationModule { }\r\n","
\r\n
\r\n \r\n
\r\n
\r\n
\r\n
\r\n \r\n
\r\n
\r\n
\r\n
\r\n \r\n
\r\n
\r\n
\r\n
\r\n \r\n
\r\n
\r\n","\r\n
\r\n
\r\n \r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n \r\n
\r\n \r\n \r\n
\r\n
\r\n \r\n
\r\n
\r\n \r\n
\r\n
\r\n \r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n","import { CommonModule } from '@angular/common';\r\nimport { Component, NgModule, OnInit } from '@angular/core';\r\nimport { FindInformationMegaMenuModule } from '@app/components/find-information/find-information-mega-menu/find-information-mega-menu.component';\r\nimport { FindInformationSavedPagesModule } from '@app/components/find-information/find-information-saved-pages/find-information-saved-pages.component';\r\nimport { FindInformationTrendingPagesModule } from '@app/components/find-information/find-information-trending-pages/find-information-trending-pages.component';\r\nimport { RequiredReadingModule } from '@app/components/required-reading/required-reading.component';\r\nimport { FeatureToggleModule } from '@app/directives/feature-toggle.directive';\r\nimport { HideParentIfEmptyModule } from '@app/directives/hide-parent-if-empty.directive';\r\nimport { MarkComponentVisitedModule } from '@app/directives/mark-component-visited.directive';\r\nimport { LinkModule } from '@app/directives/link.directive';\r\nimport { InfoboxZoneModule } from '@app/components/infobox-zone/infobox-zone.component';\r\nimport { FeatureSettingsStoreService } from '@app/services/feature-settings-store.service';\r\n\r\n@Component({\r\n selector: 'app-find-information',\r\n templateUrl: './find-information.component.html',\r\n styleUrls: ['./find-information.component.scss']\r\n})\r\nexport class FindInformationComponent implements OnInit {\r\n\r\n enableRightSection: boolean;\r\n constructor(private featureSettingsStoreService: FeatureSettingsStoreService) { }\r\n ngOnInit(): void {\r\n this.enableRightSection = this.featureSettingsStoreService.state.enableRightSection;\r\n }\r\n}\r\n@NgModule({\r\n declarations: [FindInformationComponent],\r\n exports: [FindInformationComponent],\r\n imports: [\r\n CommonModule,\r\n LinkModule,\r\n FeatureToggleModule,\r\n MarkComponentVisitedModule,\r\n HideParentIfEmptyModule,\r\n RequiredReadingModule,\r\n FindInformationMegaMenuModule,\r\n FindInformationTrendingPagesModule,\r\n FindInformationSavedPagesModule,\r\n InfoboxZoneModule\r\n ]\r\n})\r\nexport class FindInformationModule { }\r\n","
\r\n
\r\n
\r\n

Apps & tools

\r\n

\r\n Here you'll find your apps and tools. You can enable edit mode to change your collection, or go to the App center to browse and add available apps.\r\n

\r\n
\r\n
\r\n Edit\r\n \r\n Hidden\r\n \r\n \r\n Go to the app center\r\n \r\n \r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n \r\n
\r\n
\r\n \r\n

You have no apps and tools here at the moment. Add a new personal one by clicking on edit or go to the app center to get some existing apps.

\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n \r\n
\r\n
\r\n \r\n
\r\n
\r\n
\r\n Add new app\r\n
\r\n
\r\n
\r\n
\r\n
\r\n\r\n\r\n
\r\n \r\n
\r\n \r\n
\r\n \r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n","import { CommonModule } from '@angular/common';\r\nimport { Component, ElementRef, NgModule, OnDestroy, OnInit, TemplateRef, ViewChild } from '@angular/core';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatSlideToggleModule } from '@angular/material/slide-toggle';\r\nimport { MatSnackBar } from '@angular/material/snack-bar';\r\nimport { Router, RouterModule } from '@angular/router';\r\nimport { applyLanguageFilteringMulti } from '@app/common/filtering-behavior';\r\nimport { Utilities } from '@app/common/utilities';\r\nimport { ActionRouterLinkModule } from '@app/components/actions/action-router-link/action-router-link.component';\r\nimport { AlertTemplatesComponent } from '@app/components/alert-templates/alert-templates.component';\r\nimport { AppTileBoxModule } from '@app/components/apps-and-tools/app-tile-box/app-tile-box.component';\r\nimport { ErrorTemplatesModule } from '@app/components/error-templates/error-templates.component';\r\nimport { TextPlaceholderModule } from '@app/components/text-placeholder/text-placeholder.component';\r\nimport { WidgetPlaceholderModule } from '@app/components/widget-placeholder/widget-placeholder.component';\r\nimport { UserAppTile } from '@app/models/user-app-tile';\r\nimport { LinkModule } from '@app/directives/link.directive';\r\nimport { ComponentStatesOnRoutesService } from '@app/services/component-states-on-routes.service';\r\nimport { FeatureSettingsStoreService } from '@app/services/feature-settings-store.service';\r\nimport { UserAppTileService } from '@app/services/user-app-tile.service';\r\nimport { UserLanguageTermService } from '@app/services/user-language-term.service';\r\nimport { SortablejsModule } from 'ngx-sortablejs';\r\nimport { BehaviorSubject, combineLatest, iif, Observable, of, Subject, Subscription } from 'rxjs';\r\nimport { catchError, map, mergeMap, switchMap, tap } from 'rxjs/operators';\r\nimport { Options } from 'sortablejs';\r\n\r\n@Component({\r\n selector: 'app-my-app-tiles',\r\n templateUrl: './my-app-tiles.component.html',\r\n styleUrls: ['./my-app-tiles.component.scss']\r\n})\r\nexport class MyAppTilesComponent implements OnInit, OnDestroy {\r\n\r\n userAppTiles$: Observable;\r\n userAppTiles: UserAppTile[];\r\n editMode = false;\r\n showHidden = false;\r\n componentName = 'Apps & tools';\r\n options: Options;\r\n private showHiddenSubject = new BehaviorSubject(this.showHidden);\r\n private errorSubject$ = new Subject();\r\n updateUserAppTileSubscription: Subscription;\r\n dialogSubscription: Subscription;\r\n @ViewChild('allappsandtoolssnackbarorder') orderUpdatedTmpl: TemplateRef;\r\n\r\n constructor(private userAppTileService: UserAppTileService,\r\n private snackBar: MatSnackBar,\r\n private componentEventService: ComponentStatesOnRoutesService,\r\n private featureSettingsStoreService: FeatureSettingsStoreService,\r\n private userLanguageTermService: UserLanguageTermService,\r\n private router: Router,\r\n public elementRef: ElementRef) {\r\n\r\n this.options = {\r\n disabled: false,\r\n filter: '.ignore-elements',\r\n onUpdate: (event: any) => {\r\n this.onSortUpdate();\r\n }\r\n };\r\n }\r\n\r\n handleRemove(event: UserAppTile, userAppTiles: UserAppTile[]) {\r\n if (event) {\r\n if (this.showHidden && event.HideFromUI) {\r\n // Do nothing in this case becasue the app will be hidden and we are already showing hidden apps.\r\n } else {\r\n const index = userAppTiles.findIndex(d => d.AppTileId === event.AppTileId);\r\n if (index !== -1) {\r\n userAppTiles.splice(index, 1);\r\n }\r\n }\r\n }\r\n }\r\n\r\n private onSortUpdate() {\r\n this.userAppTiles.forEach((link, index) => {\r\n link.Order = index;\r\n });\r\n\r\n this.updateUserAppTileSubscription = this.userAppTileService.updateUserAppTiles(this.userAppTiles)\r\n .subscribe(() => {\r\n Utilities.openSnackBar(this.snackBar, AlertTemplatesComponent, AlertTemplatesComponent.updatedorder);\r\n });\r\n }\r\n\r\n // The type here is any beacuse it could be MatSlideToggleChange as well keyboard key evnets\r\n handleEditMode(change: any) {\r\n if (this.editMode && !change.checked && this.showHidden) {\r\n this.showHidden = false;\r\n this.showHiddenSubject.next(this.showHidden);\r\n }\r\n this.editMode = change.checked;\r\n // key board right arrow event\r\n if (change.keyCode && change.keyCode === 39) {\r\n this.editMode = true;\r\n }\r\n // key board left arrow event\r\n if (change.keyCode && change.keyCode === 37) {\r\n this.editMode = false;\r\n }\r\n\r\n this.userAppTileService.refresh$.next(null);\r\n }\r\n\r\n // The type here is any beacuse it could be MatSlideToggleChange as well keyboard key evnets\r\n handleShowHidden(change: any) {\r\n this.showHidden = change.checked;\r\n // key board right arrow event\r\n if (change.keyCode && change.keyCode === 39) {\r\n this.showHidden = true;\r\n }\r\n // key board left arrow event\r\n if (change.keyCode && change.keyCode === 37) {\r\n this.showHidden = false;\r\n }\r\n\r\n this.showHiddenSubject.next(this.showHidden);\r\n }\r\n\r\n ngOnInit() {\r\n const componentEvent = this.componentEventService.state.RouteMap.has(this.router.url) && this.componentEventService.state.RouteMap.get(this.router.url).find(x => x.ComponentId === this.elementRef.nativeElement.localName);\r\n const componentEventData = componentEvent.Data as Array;\r\n\r\n const userAppTiles$ = combineLatest([this.showHiddenSubject, this.userAppTileService.refresh$])\r\n .pipe(\r\n mergeMap(([includeHidden]) => this.userAppTileService.getLicensedUserAppTiles(includeHidden)),\r\n tap(result => {\r\n return result.map(userAppTile => {\r\n if (componentEventData) {\r\n const foundAppTile = componentEventData.find(ced => ced.AppTileId === userAppTile.AppTileId);\r\n if (foundAppTile) {\r\n userAppTile.ShowNewOrModifiedBadge = true;\r\n }\r\n } else {\r\n userAppTile.ShowNewOrModifiedBadge = false;\r\n }\r\n return userAppTile;\r\n });\r\n }));\r\n\r\n this.userAppTiles$ = userAppTiles$\r\n .pipe(\r\n switchMap((userAppTiles) => {\r\n // Language filter toggle\r\n return iif(\r\n () => this.featureSettingsStoreService.state.enableLanguageFilteringForWorkplace,\r\n this.userLanguageTermService.getUserLanguageTerms().pipe(\r\n map((userLanguageTerms) => {\r\n // Don't filter out personal app tiles or subscribed app tiles\r\n const personalAppTiles = userAppTiles.filter(u => u.AppTile.IsPersonal);\r\n const nonPersonalAppTiles = applyLanguageFilteringMulti(userAppTiles.filter(u => !u.AppTile.IsPersonal), 'AppTile.LanguageTermAppTiles', userLanguageTerms, this.featureSettingsStoreService.state.enableShowNonLanguageContentForAllUsers, this.featureSettingsStoreService.state.defaultLanguageTermId);\r\n return nonPersonalAppTiles.concat(personalAppTiles).sort((a, b) => {\r\n return a.Order - b.Order;\r\n });\r\n })\r\n ),\r\n of(userAppTiles)\r\n );\r\n }),\r\n map((userAppTiles) => {\r\n this.userAppTiles = userAppTiles;\r\n return userAppTiles;\r\n }),\r\n catchError(err => {\r\n this.errorSubject$.next(err);\r\n return of(null);\r\n }));\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.updateUserAppTileSubscription && this.updateUserAppTileSubscription.unsubscribe();\r\n this.dialogSubscription && this.dialogSubscription.unsubscribe();\r\n }\r\n\r\n}\r\n@NgModule({\r\n declarations: [MyAppTilesComponent],\r\n exports: [MyAppTilesComponent],\r\n imports: [\r\n CommonModule,\r\n TextPlaceholderModule,\r\n AppTileBoxModule,\r\n MatButtonModule,\r\n ErrorTemplatesModule,\r\n ActionRouterLinkModule,\r\n MatSlideToggleModule,\r\n ErrorTemplatesModule,\r\n WidgetPlaceholderModule,\r\n SortablejsModule,\r\n LinkModule,\r\n RouterModule,\r\n ]\r\n})\r\nexport class MyAppTilesModule { }\r\n","import { Observable } from 'rxjs';\r\n\r\nexport class MyEvent {\r\n public Id: string;\r\n public Subject: string;\r\n public EventStartDate: Date;\r\n public BodyPreview: string;\r\n public EventStartDateFormatted: string;\r\n public EventStartDateAllDayFormatted: string;\r\n public EventEndDate: Date;\r\n public EventEndDateFormatted: string;\r\n public EventEndDateAllDayFormatted: string;\r\n public Location: string;\r\n public Recurring: string;\r\n public WebLink: string;\r\n public IsAllDay: boolean;\r\n public IsMultipleDays: boolean;\r\n public Attendees: number;\r\n public Accepted: number;\r\n public Declined: number;\r\n public NoResponse: number;\r\n public Tentative: number;\r\n public Expired: boolean;\r\n public IsCancelled: boolean;\r\n public IsOrganizer: boolean;\r\n public Response: Response;\r\n public UserPhotos$: Observable>;\r\n\r\n constructor(opt?: Partial) {\r\n Object.assign(this, opt);\r\n }\r\n}\r\n\r\nexport enum Response {\r\n None = 1,\r\n Accepted = 2,\r\n Tentative = 3,\r\n Decline = 4\r\n}\r\n","import { formatDate } from '@angular/common';\r\nimport { PlannerBucket, PlannerPlan, PlannerTask, PlannerTaskDetails } from '@microsoft/microsoft-graph-types';\r\nimport { OutlookTask } from '@microsoft/microsoft-graph-types-beta';\r\nimport { parseISO } from 'date-fns';\r\nimport { Observable } from 'rxjs';\r\n\r\nexport enum TaskType {\r\n Outlook = 0,\r\n Planner = 1,\r\n}\r\n\r\nexport enum TaskStatus {\r\n NOTSTARTED = 0,\r\n INPROGRESS = 1,\r\n COMPLETED = 2,\r\n WAITINGONOTHERS = 3,\r\n DEFERRED = 4\r\n}\r\n\r\nexport class MyTask {\r\n public Type: TaskType;\r\n public AssignedTo: string;\r\n public Body: string;\r\n public CompletedDate: Date;\r\n public CompletedDateFormatted: string;\r\n public DueDate: Date;\r\n public DueDateFormatted: string;\r\n public StartDate: Date;\r\n public StartDateFormatted: string;\r\n public Status: TaskStatus;\r\n public Created: Date;\r\n public CreatedDateFormatted: string;\r\n public Importance: string;\r\n public Owner: string;\r\n public ParentFolderId: string;\r\n public Subject: string;\r\n public Url: string;\r\n public Id: string;\r\n public Etag: string;\r\n public PlannerTaskDetails$: Observable;\r\n public PlannerPlan$: Observable;\r\n public PlannerBucket$: Observable;\r\n\r\n constructor(opt?: Partial) {\r\n Object.assign(this, opt);\r\n }\r\n\r\n static fromOutlook(item: OutlookTask, localeId: string, defaultTaskFolderId: string) {\r\n\r\n const timeZoneSuffix = 'Z';\r\n const completedDate = item.completedDateTime ? parseISO(item.completedDateTime.dateTime + timeZoneSuffix) : null;\r\n const dueDate = item.dueDateTime ? parseISO(item.dueDateTime.dateTime + timeZoneSuffix) : null;\r\n const startDate = item.startDateTime ? parseISO(item.startDateTime.dateTime + timeZoneSuffix) : null;\r\n\r\n // Id should be available, but we previously had reports of \"short ids\" being used (see DevOps #22228). I have not seen it now, but link to inbox as a fallback just to be sure it does not crash.\r\n let itemUrl = 'https://to-do.office.com/lists/inbox';\r\n if (item.id && item.id.length > 30) {\r\n itemUrl = `https://to-do.office.com/tasks/id/${item.id}/details`;\r\n }\r\n\r\n const fancypants = new MyTask({\r\n Type: TaskType.Outlook,\r\n Body: item.body.content,\r\n Status: TaskStatus[item.status.toLocaleUpperCase()],\r\n Subject: item.subject,\r\n Owner: item.owner,\r\n CompletedDate: completedDate,\r\n CompletedDateFormatted: completedDate ? formatDate(completedDate, 'mediumDate', localeId) : '',\r\n DueDate: dueDate,\r\n DueDateFormatted: dueDate ? formatDate(dueDate, 'mediumDate', localeId) : '',\r\n StartDate: startDate,\r\n StartDateFormatted: startDate ? formatDate(startDate, 'shortTime', localeId) : '',\r\n Created: item.createdDateTime ? parseISO(item.createdDateTime + timeZoneSuffix) : null,\r\n CreatedDateFormatted: item.createdDateTime ? formatDate(item.createdDateTime, 'mediumDate', localeId) : '',\r\n Url: itemUrl,\r\n Id: item.id\r\n });\r\n return fancypants;\r\n }\r\n\r\n static fromPlanner(item: PlannerTask, localeId: string, tenantName: string) {\r\n\r\n let status = TaskStatus.NOTSTARTED;\r\n if (item.percentComplete === 50) {\r\n status = TaskStatus.INPROGRESS;\r\n } else if (item.percentComplete === 100) {\r\n status = TaskStatus.COMPLETED;\r\n }\r\n\r\n return new MyTask({\r\n Type: TaskType.Planner,\r\n Body: '',\r\n Subject: item.title,\r\n Status: status,\r\n Owner: '',\r\n CompletedDate: item.completedDateTime ? parseISO(item.completedDateTime) : null,\r\n CompletedDateFormatted: item.completedDateTime ? formatDate(item.completedDateTime, 'mediumDate', localeId) : '',\r\n DueDate: item.dueDateTime ? parseISO(item.dueDateTime) : null,\r\n DueDateFormatted: item.dueDateTime ? formatDate(item.dueDateTime, 'mediumDate', localeId) : '',\r\n StartDate: item.startDateTime ? parseISO(item.startDateTime) : null,\r\n StartDateFormatted: item.startDateTime ? formatDate(item.startDateTime, 'shortTime', localeId) : '',\r\n Created: item.createdDateTime ? parseISO(item.createdDateTime) : null,\r\n CreatedDateFormatted: item.createdDateTime ? formatDate(item.createdDateTime, 'mediumDate', localeId) : '',\r\n Url: `https://tasks.office.com/${tenantName}/en-US/Home/Task/${item.id}?Type=TaskLink&Channel=Link`,\r\n Id: item.id,\r\n Etag: item['@odata.etag'],\r\n });\r\n }\r\n}\r\n","import { HttpClient, HttpHeaders } from '@angular/common/http';\r\nimport { Injectable } from '@angular/core';\r\nimport { Constants } from '@app/common/constants';\r\nimport { HttpHelper } from '@app/common/http-helper';\r\nimport { MyTask } from '@app/models/my-task';\r\nimport { CacheService } from '@app/services/cache.service';\r\nimport { PlannerBucket, PlannerPlan, PlannerTask, PlannerTaskDetails } from '@microsoft/microsoft-graph-types';\r\nimport { concat, Observable, of } from 'rxjs';\r\nimport { catchError, map, tap } from 'rxjs/operators';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class PlannerService {\r\n\r\n constructor(private http: HttpClient, private cache: CacheService, private httpHelper: HttpHelper) { }\r\n\r\n public useCache = true;\r\n private readonly cacheKeyPrefix = 'PlannerService';\r\n\r\n getMyPlannerTasks(top: number): Observable> {\r\n\r\n const cacheKey = `${this.cacheKeyPrefix}-getMyPlannerTasks-${top}`;\r\n\r\n const fetchOperation = this.http.get(`${Constants.GRAPH_API_ENDPOINT + Constants.GRAPH_API_VERSION_ONE}/me/planner/tasks?$top=${top}`)\r\n .pipe(\r\n map(response => {\r\n console.log(`fetched result: getMyPlannerTasks `, response);\r\n this.useCache && this.cache.set(cacheKey, response.value);\r\n return response.value;\r\n }));\r\n\r\n if (this.useCache) {\r\n const cachedData = this.cache.get>(cacheKey);\r\n if (cachedData) {\r\n return concat(of(cachedData), fetchOperation);\r\n }\r\n }\r\n return fetchOperation;\r\n }\r\n\r\n getPlannerTaskDetails(id: string): Observable {\r\n\r\n const cacheKey = `${this.cacheKeyPrefix}-getPlannerTaskDetails-${id}`;\r\n\r\n const fetchOperation = this.http.get(`${Constants.GRAPH_API_ENDPOINT + Constants.GRAPH_API_VERSION_ONE}/planner/tasks/${id}/details`)\r\n .pipe(\r\n map(response => {\r\n console.log(`fetched result: getPlannerTaskDetails `);\r\n console.log(response);\r\n this.useCache && this.cache.set(cacheKey, response);\r\n return response;\r\n }));\r\n\r\n if (this.useCache) {\r\n const cachedData = this.cache.get(cacheKey);\r\n if (cachedData) {\r\n return concat(of(cachedData), fetchOperation);\r\n }\r\n }\r\n return fetchOperation;\r\n }\r\n\r\n getPlannerPlan(id: string): Observable {\r\n\r\n const cacheKey = `${this.cacheKeyPrefix}-getPlannerPlan-${id}`;\r\n\r\n const fetchOperation = this.http.get(`${Constants.GRAPH_API_ENDPOINT + Constants.GRAPH_API_VERSION_ONE}/planner/plans/${id}`)\r\n .pipe(\r\n map(response => {\r\n console.log(`fetched result: getPlannerPlan `);\r\n console.log(response);\r\n this.useCache && this.cache.set(cacheKey, response);\r\n return response;\r\n }));\r\n\r\n if (this.useCache) {\r\n const cachedData = this.cache.get(cacheKey);\r\n if (cachedData) {\r\n return concat(of(cachedData), fetchOperation);\r\n }\r\n }\r\n return fetchOperation;\r\n }\r\n\r\n getPlannerBucket(id: string): Observable {\r\n\r\n const cacheKey = `${this.cacheKeyPrefix}-getPlannerBucket-${id}`;\r\n\r\n const fetchOperation = this.http.get(`${Constants.GRAPH_API_ENDPOINT + Constants.GRAPH_API_VERSION_ONE}/planner/buckets/${id}`)\r\n .pipe(\r\n map(response => {\r\n console.log(`fetched result: getPlannerBucket `);\r\n console.log(response);\r\n this.useCache && this.cache.set(cacheKey, response);\r\n return response;\r\n }));\r\n\r\n if (this.useCache) {\r\n const cachedData = this.cache.get(cacheKey);\r\n if (cachedData) {\r\n return concat(of(cachedData), fetchOperation);\r\n }\r\n }\r\n return fetchOperation;\r\n }\r\n\r\n completePlannerTask(task: MyTask): Observable {\r\n\r\n const completed = {\r\n 'percentComplete': 100\r\n };\r\n\r\n const headers = new HttpHeaders().append('If-Match', task.Etag);\r\n return this.http.patch(`${Constants.GRAPH_API_ENDPOINT + Constants.GRAPH_API_VERSION_ONE}/planner/tasks/${task.Id}`, completed, {\r\n headers\r\n })\r\n .pipe(\r\n tap(response => {\r\n console.log(`completed planner task: `);\r\n console.log(response);\r\n }),\r\n catchError(this.httpHelper.handleError({ operation: 'completePlannerTask', result: {}, rethrow: true })));\r\n }\r\n}\r\n","import { HttpClient, HttpParams } from '@angular/common/http';\r\nimport { Injectable } from '@angular/core';\r\nimport { Constants } from '@app/common/constants';\r\nimport { HttpHelper } from '@app/common/http-helper';\r\nimport { MyTask } from '@app/models/my-task';\r\nimport { CacheService } from '@app/services/cache.service';\r\nimport { OutlookTask, OutlookTaskFolder } from '@microsoft/microsoft-graph-types-beta';\r\nimport { startOfToday } from 'date-fns';\r\nimport { concat, from, Observable, of, Subject } from 'rxjs';\r\nimport { catchError, map, mergeMap, shareReplay, takeUntil, tap } from 'rxjs/operators';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class OutlookService {\r\n\r\n constructor(private http: HttpClient, private cache: CacheService, private httpHelper: HttpHelper) { }\r\n\r\n public useCache = true;\r\n private readonly cacheKeyPrefix = 'OutlookService';\r\n private cuncurrencyValue = 4;\r\n\r\n private getMyOutlookTaskFolders$: Observable>;\r\n\r\n private reloadGetOutlookTasks$ = new Subject();\r\n\r\n reloadGetOutlookTasks() {\r\n this.reloadGetOutlookTasks$.next();\r\n this.getMyOutlookTaskFolders$ = null;\r\n }\r\n\r\n getMyOutlookTasks(top: number): Observable> {\r\n\r\n const cacheKey = `${this.cacheKeyPrefix}-getMyOutlookTasks-${top}`;\r\n\r\n const fetchOperation = this.http.get(`${Constants.GRAPH_API_ENDPOINT + Constants.GRAPH_API_BETA_VERSION}/me/outlook/tasks?$top=${top}`)\r\n .pipe(\r\n map(response => {\r\n this.useCache && this.cache.set(cacheKey, response.value);\r\n return response.value;\r\n }));\r\n\r\n if (this.useCache) {\r\n const cachedData = this.cache.get>(cacheKey);\r\n if (cachedData) {\r\n return concat(of(cachedData), fetchOperation);\r\n }\r\n }\r\n return fetchOperation;\r\n }\r\n\r\n getMyOutlookTaskFolders(): Observable> {\r\n\r\n if (this.getMyOutlookTaskFolders$) {\r\n return this.getMyOutlookTaskFolders$;\r\n } else {\r\n const cacheKey = `${this.cacheKeyPrefix}-getMyOutlookTaskFolders`;\r\n\r\n this.getMyOutlookTaskFolders$ = this.http.get(`${Constants.GRAPH_API_ENDPOINT + Constants.GRAPH_API_BETA_VERSION}/me/outlook/taskFolders`)\r\n .pipe(\r\n map(response => {\r\n this.useCache && this.cache.set(cacheKey, response.value);\r\n return response.value;\r\n }))\r\n .pipe(\r\n catchError(this.httpHelper.handleError({ operation: 'getMyOutlookTaskFolders', result: new Array(), rethrow: true })),\r\n takeUntil(this.reloadGetOutlookTasks$),\r\n shareReplay({ bufferSize: 1, refCount: true }));\r\n\r\n if (this.useCache) {\r\n const cachedData = this.cache.get>(cacheKey);\r\n if (cachedData) {\r\n return concat(of(cachedData), this.getMyOutlookTaskFolders$);\r\n }\r\n }\r\n\r\n return this.getMyOutlookTaskFolders$;\r\n }\r\n }\r\n\r\n getMyOutlookTasksFromFoldersBatch(ids: Array, top: number): Observable> {\r\n\r\n const todayDate = startOfToday();\r\n const tasks = [];\r\n const httpParams = new HttpParams()\r\n .append('$filter', 'completedDateTime/dateTime ge \\'' + todayDate.toISOString() + '\\' or status ne \\'completed\\'')\r\n .append('$top', top.toString());\r\n\r\n if (ids.length === 0) {\r\n return of(null);\r\n }\r\n\r\n return from(ids)\r\n .pipe(\r\n mergeMap(id =>\r\n this.http.get(`${Constants.GRAPH_API_ENDPOINT + Constants.GRAPH_API_BETA_VERSION}/me/outlook/taskFolders/${id}/tasks`,\r\n {\r\n params: httpParams\r\n })\r\n .pipe(\r\n map(response => {\r\n response.value.forEach(r => {\r\n tasks.push(r);\r\n });\r\n\r\n return tasks;\r\n }),\r\n catchError(this.httpHelper.handleError({ operation: 'getMyOutlookTasksFromFoldersBatch', result: ({} as Array) }))),\r\n this.cuncurrencyValue));\r\n }\r\n\r\n completeOutlookTask(task: MyTask): Observable {\r\n\r\n return this.http.post(`${Constants.GRAPH_API_ENDPOINT + Constants.GRAPH_API_BETA_VERSION}/me/outlook/tasks/${task.Id}/complete`, {})\r\n .pipe(\r\n tap(response => {\r\n console.log(`completed outlook task: `);\r\n console.log(response);\r\n }),\r\n catchError(this.httpHelper.handleError({ operation: 'completeOutlookTask', result: {}, rethrow: true })));\r\n }\r\n\r\n}\r\n","import { HttpClient, HttpParams } from '@angular/common/http';\r\nimport { Injectable } from '@angular/core';\r\nimport { Constants } from '@app/common/constants';\r\nimport { HttpHelper } from '@app/common/http-helper';\r\nimport { CacheService } from '@app/services/cache.service';\r\nimport { Event } from '@microsoft/microsoft-graph-types';\r\nimport { concat, Observable, of } from 'rxjs';\r\nimport { catchError, map, tap } from 'rxjs/operators';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class EventsService {\r\n\r\n constructor(private http: HttpClient, private cache: CacheService, private httpHelper: HttpHelper) { }\r\n\r\n private readonly cacheKeyPrefix = 'EventsService';\r\n\r\n public useCache = true;\r\n\r\n getMyEvents(numItems: number, startDateInUTC: Date, endDateInUTC: Date): Observable> {\r\n\r\n const cacheKey = `${this.cacheKeyPrefix}-${'getMyEvents'}-${numItems.toString()}`;\r\n\r\n const httpParamsMyEvents = new HttpParams()\r\n .append('startDateTime', startDateInUTC.toISOString())\r\n .append('endDateTime', endDateInUTC.toISOString())\r\n .append('$orderBy', 'start/dateTime')\r\n .append('$top', numItems.toString());\r\n\r\n // Graph API call to fetch user events\r\n const fetchOperation = this.http.get(`${Constants.GRAPH_API_ENDPOINT + Constants.GRAPH_API_VERSION_ONE}/me/calendar/calendarView`,\r\n {\r\n params: httpParamsMyEvents\r\n })\r\n .pipe(\r\n map(result => {\r\n return result.value as Array;\r\n }),\r\n tap(data => {\r\n this.useCache && this.cache.set(cacheKey, data);\r\n }),\r\n catchError(this.httpHelper.handleError({ operation: 'getMyEvents', result: new Array(), cacheKey: cacheKey })));\r\n\r\n if (this.useCache) {\r\n const cachedData = this.cache.get>(cacheKey);\r\n if (cachedData) {\r\n return concat(of(cachedData), fetchOperation);\r\n }\r\n }\r\n return fetchOperation;\r\n }\r\n\r\n acceptEvent(id: string): Observable {\r\n return this.http.post(`${Constants.GRAPH_API_ENDPOINT + Constants.GRAPH_API_VERSION_ONE}/me/calendar/events/${id}/accept`, { observe: 'response' })\r\n .pipe(\r\n tap(response => {\r\n console.log(`accepted event: `);\r\n console.log(response);\r\n }),\r\n catchError(this.httpHelper.handleError({ operation: 'acceptEvent', result: {}, rethrow: true })));\r\n }\r\n\r\n tentativelyAcceptEvent(id: string): Observable {\r\n return this.http.post(`${Constants.GRAPH_API_ENDPOINT + Constants.GRAPH_API_VERSION_ONE}/me/calendar/events/${id}/tentativelyAccept`, {})\r\n .pipe(\r\n tap(response => {\r\n console.log(`tentatively accepted event: `);\r\n console.log(response);\r\n }),\r\n catchError(this.httpHelper.handleError({ operation: 'tentativelyAcceptEvent', result: {}, rethrow: true })));\r\n }\r\n\r\n declineEvent(id: string): Observable {\r\n return this.http.post(`${Constants.GRAPH_API_ENDPOINT + Constants.GRAPH_API_VERSION_ONE}/me/calendar/events/${id}/decline`, {})\r\n .pipe(\r\n tap(response => {\r\n console.log(`declined event: `);\r\n console.log(response);\r\n }),\r\n catchError(this.httpHelper.handleError({ operation: 'declineEvent', result: {}, rethrow: true })));\r\n }\r\n\r\n cancelEvent(id: string): Observable {\r\n return this.http.post(`${Constants.GRAPH_API_ENDPOINT + Constants.GRAPH_API_BETA_VERSION}/me/events/${id}/cancel`, {})\r\n .pipe(\r\n tap(response => {\r\n console.log(`canceled event: `);\r\n console.log(response);\r\n }),\r\n catchError(this.httpHelper.handleError({ operation: 'cancelEvent', result: {}, rethrow: true })));\r\n }\r\n\r\n deleteEvent(id: string): Observable {\r\n return this.http.delete(`${Constants.GRAPH_API_ENDPOINT + Constants.GRAPH_API_VERSION_ONE}/me/calendar/events/${id}`, {})\r\n .pipe(\r\n tap(response => {\r\n console.log(`deleted event: `);\r\n console.log(response);\r\n }),\r\n catchError(this.httpHelper.handleError({ operation: 'deleteEvent', result: {}, rethrow: true })));\r\n }\r\n\r\n getEvent(id: string): Observable {\r\n return this.http.get(`${Constants.GRAPH_API_ENDPOINT + Constants.GRAPH_API_VERSION_ONE}/me/events/${id}`)\r\n .pipe(\r\n map(result => {\r\n return result as Event;\r\n }),\r\n catchError(this.httpHelper.handleError({ operation: 'getEvent', result: {} })));\r\n }\r\n}\r\n","
\r\n

\r\n Today {{today}}\r\n

\r\n

\r\n Here is a list of all your assigned tasks and booked meetings for today. Tasks with a due date up to one week ahead are listed.\r\n

\r\n\r\n\r\n
\r\n\r\n \r\n \r\n
\r\n \r\n Tasks\r\n \r\n
\r\n \r\n \r\n \r\n
\r\n \r\n {{task.DueDateFormatted}}\r\n {{task.Subject}}\r\n
\r\n
\r\n \r\n \r\n
\r\n \r\n
\r\n \r\n To Do\r\n \r\n \r\n Planner\r\n \r\n
\r\n
\r\n \r\n 0\" [innerHTML]=\"task.Body\">\r\n \r\n \r\n
Plan: {{plan.title}}
\r\n
Bucket: {{bucket.name}}
\r\n
{{details.description}}
\r\n
\r\n
\r\n \r\n \r\n \r\n \r\n Task details\r\n
\r\n
\r\n showLessTasksCount\">\r\n Show more tasks\r\n \r\n showLessTasksCount\" i18n=\"show less tasks@@show-less-tasks\">Show less tasks\r\n showLessTasksCount\" class=\"ml-2 ms-Icon ms-Icon--ChevronUp align-bottom\" aria-hidden=\"true\">\r\n \r\n
\r\n\r\n \r\n \r\n
\r\n \r\n Tasks\r\n \r\n
\r\n\r\n
\r\n You have no tasks today, create new ones using the links below:\r\n
\r\n\r\n \r\n
\r\n To-Do\r\n
\r\n
\r\n\r\n \r\n
\r\n Planner\r\n
\r\n
\r\n
\r\n\r\n\r\n \r\n \r\n
\r\n \r\n Events\r\n \r\n
\r\n \r\n \r\n \r\n
\r\n \r\n (All day)\r\n \r\n {{event.EventStartDateFormatted}}\r\n \r\n {{event.Subject}}\r\n
\r\n
\r\n \r\n \r\n
\r\n \r\n
\r\n {{BodyPreview}}\r\n
\r\n
{{event.Location}}
\r\n
\r\n \r\n (All day)\r\n {{event.EventStartDateFormatted}} - {{event.EventEndDateFormatted}}\r\n
\r\n
\r\n
\r\n
\r\n {{event.Accepted}} attending\r\n {{event.Declined}} declined\r\n {{event.NoResponse}} not responded\r\n {{event.Tentative}} tentative\r\n
\r\n \r\n
0\" class=\"position-relative event-users d-inline-block\">\r\n \r\n
\r\n \r\n \r\n
\r\n {{ getPreferredNameLetters(photo) }}\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n \r\n \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 Event details\r\n
\r\n
\r\n
\r\n
\r\n
\r\n\r\n \r\n \r\n
\r\n \r\n Events\r\n \r\n
\r\n\r\n
\r\n
\r\n Your day is empty, create new events in outlook using the link below:\r\n
\r\n
\r\n\r\n \r\n Outlook\r\n \r\n
\r\n\r\n
\r\n
\r\n","import { CommonModule, formatDate } from '@angular/common';\r\nimport { Component, Inject, Input, LOCALE_ID, NgModule, OnDestroy, OnInit, QueryList, ViewChildren } from '@angular/core';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatExpansionModule, MatExpansionPanel } from '@angular/material/expansion';\r\nimport { CUSTOMERENVIRONMENT } from '@app/common/app-tokens';\r\nimport { Utilities } from '@app/common/utilities';\r\nimport { ActionButtonModule } from '@app/components/actions/action-button/action-button.component';\r\nimport { ActionLinkModule } from '@app/components/actions/action-link/action-link.component';\r\nimport { TextPlaceholderModule } from '@app/components/text-placeholder/text-placeholder.component';\r\nimport { MyEvent, Response } from '@app/models/my-event';\r\nimport { MyTask, TaskStatus, TaskType } from '@app/models/my-task';\r\nimport { LinkModule } from '@app/directives/link.directive';\r\nimport { SafeModule } from '@app/pipes/safe.pipe';\r\nimport { EventsService } from '@app/services/events.service';\r\nimport { OutlookService } from '@app/services/outlook.service';\r\nimport { PlannerService } from '@app/services/planner.service';\r\nimport { UserService } from '@app/services/user.service';\r\nimport { Environment } from '@environments/interface.environment';\r\nimport { Event, PlannerTask } from '@microsoft/microsoft-graph-types';\r\nimport { OutlookTask, OutlookTaskFolder } from '@microsoft/microsoft-graph-types-beta';\r\nimport { addDays, isBefore, isEqual, isSameDay, parseISO, startOfDay } from 'date-fns';\r\nimport { combineLatest, Observable, Subscription } from 'rxjs';\r\nimport { catchError, concatMap, mergeMap, tap } from 'rxjs/operators';\r\n\r\n@Component({\r\n selector: 'app-my-day',\r\n templateUrl: './my-day.component.html',\r\n styleUrls: ['./my-day.component.scss']\r\n})\r\nexport class MyDayComponent implements OnInit, OnDestroy {\r\n\r\n subscription: Subscription;\r\n userPhotos$: Observable>;\r\n\r\n completeSubScription: Subscription;\r\n responseSubscription: Subscription;\r\n\r\n taskFolders: Array;\r\n defaultTaskFolderId: string;\r\n tasks: Array;\r\n events: Array;\r\n\r\n todoLink = 'https://to-do.office.com/tasks';\r\n plannerLink = 'https://tasks.office.com';\r\n calendarLink = 'https://outlook.office.com/owa/?path=/calendar';\r\n\r\n today: string;\r\n todayMidnight: Date;\r\n tenantName: string;\r\n domain: string;\r\n\r\n tasksCount = 0;\r\n eventsCount = 0;\r\n showLessTasksCount = 0;\r\n\r\n @Input() minTasks = 5;\r\n @Input() showMore = 5;\r\n @Input() showMoreInterval = 5;\r\n @Input() tasksToRequestFromApi = 100;\r\n\r\n @ViewChildren(MatExpansionPanel) accordion: QueryList;\r\n\r\n constructor(@Inject(LOCALE_ID) public localeId: string,\r\n @Inject(CUSTOMERENVIRONMENT) private environment: Environment,\r\n private plannerService: PlannerService,\r\n private outlookService: OutlookService,\r\n private userService: UserService,\r\n private eventService: EventsService) { }\r\n\r\n ngOnInit() {\r\n this.tasks = [];\r\n this.events = [];\r\n this.today = formatDate(new Date(), 'mediumDate', this.localeId);\r\n this.tenantName = this.environment.tenantHostUrl.replace(/(^\\w+:|^)\\/\\//, '').split('.')[0];\r\n this.domain = this.tenantName + '.onmicrosoft.com';\r\n\r\n const currentDate = new Date();\r\n this.todayMidnight = startOfDay(currentDate);\r\n const tomorrowMidnight = startOfDay(addDays(currentDate, 1));\r\n const nextWeek = addDays(this.todayMidnight, 7);\r\n\r\n this.subscription = this.outlookService\r\n .getMyOutlookTaskFolders()\r\n .pipe(\r\n mergeMap(taskFolders => {\r\n this.taskFolders = taskFolders;\r\n this.defaultTaskFolderId = taskFolders.filter(item => item.isDefaultFolder === true)[0].id;\r\n const taskFolderIds = this.taskFolders.map(folder => folder.id);\r\n return combineLatest(\r\n [this.plannerService.getMyPlannerTasks(this.tasksToRequestFromApi),\r\n this.outlookService.getMyOutlookTasksFromFoldersBatch(taskFolderIds, this.tasksToRequestFromApi),\r\n this.eventService.getMyEvents(100, this.todayMidnight, tomorrowMidnight)]\r\n );\r\n }))\r\n .subscribe(\r\n ([plannerResults, outlookResults, eventsResult]) => {\r\n\r\n const filteredEvents = eventsResult.filter(event => {\r\n const endDateUTC = parseISO(event.end.dateTime);\r\n return !isEqual(endDateUTC, this.todayMidnight);\r\n });\r\n\r\n this.eventsCount = filteredEvents.length;\r\n this.tasks = this.parseTasks(plannerResults, outlookResults, currentDate, nextWeek);\r\n this.events = filteredEvents.map(event => this.parseEvent(event));\r\n });\r\n }\r\n\r\n parseTasks(plannerResults: Array, outlookResults: Array, currentDate: Date, nextWeek: Date) {\r\n const plannerTasks = plannerResults && plannerResults.map ? plannerResults.map(task => {\r\n return this.fromPlanner(task, this.localeId, this.domain);\r\n }) : [];\r\n\r\n const outlookTasks = outlookResults && outlookResults.map ? outlookResults.map(task => {\r\n return MyTask.fromOutlook(task, this.localeId, this.defaultTaskFolderId);\r\n }) : [];\r\n\r\n const filteredTasks = plannerTasks.concat(outlookTasks).filter(task => {\r\n // exclude tasks that are completed before today\r\n if (task.CompletedDate) {\r\n return isSameDay(task.CompletedDate, currentDate);\r\n } else if (task.DueDate) {\r\n return isBefore(task.DueDate, nextWeek);\r\n } else {\r\n return true;\r\n }\r\n });\r\n\r\n const todaysDueDateTasks = filteredTasks.filter(task => {\r\n return task.DueDate && isSameDay(task.DueDate, currentDate) || task.DueDate && isBefore(task.DueDate, this.todayMidnight);\r\n });\r\n\r\n if (todaysDueDateTasks.length > this.eventsCount) {\r\n this.showMore = todaysDueDateTasks.length > this.minTasks ? todaysDueDateTasks.length : this.minTasks;\r\n } else {\r\n this.showMore = this.eventsCount > this.minTasks ? this.eventsCount : this.minTasks;\r\n }\r\n\r\n this.showLessTasksCount = this.showMore;\r\n\r\n // sort tasks ascending on created date first, so that tasks without due date should be oldest task on top after tasks with due date.\r\n const sortedOnCreatedDate = filteredTasks.sort((a, b) => (a.Created < b.Created) ? -1 : ((b.Created < a.Created) ? 1 : 0));\r\n\r\n // sort tasks descending on due date, sort tasks with no due date last\r\n const sortedTasks = sortedOnCreatedDate.sort((a, b) => {\r\n if (a.DueDateFormatted.length === 0) { return 1; }\r\n if (b.DueDateFormatted.length === 0) { return -1; }\r\n return a.DueDate.getTime() - b.DueDate.getTime();\r\n });\r\n\r\n this.tasksCount = sortedTasks.length;\r\n return sortedTasks;\r\n }\r\n\r\n fromPlanner(item: PlannerTask, localeId: string, tenantName: string) {\r\n\r\n let status = TaskStatus.NOTSTARTED;\r\n if (item.percentComplete === 50) {\r\n status = TaskStatus.INPROGRESS;\r\n } else if (item.percentComplete === 100) {\r\n status = TaskStatus.COMPLETED;\r\n }\r\n\r\n return new MyTask({\r\n Type: TaskType.Planner,\r\n Body: '',\r\n Subject: item.title,\r\n Status: status,\r\n Owner: '',\r\n CompletedDate: item.completedDateTime ? parseISO(item.completedDateTime) : null,\r\n CompletedDateFormatted: item.completedDateTime ? formatDate(item.completedDateTime, 'mediumDate', localeId) : '',\r\n DueDate: item.dueDateTime ? parseISO(item.dueDateTime) : null,\r\n DueDateFormatted: item.dueDateTime ? formatDate(item.dueDateTime, 'mediumDate', localeId) : '',\r\n StartDate: item.startDateTime ? parseISO(item.startDateTime) : null,\r\n StartDateFormatted: item.startDateTime ? formatDate(item.startDateTime, 'shortTime', localeId) : '',\r\n Created: item.createdDateTime ? parseISO(item.createdDateTime) : null,\r\n CreatedDateFormatted: item.createdDateTime ? formatDate(item.createdDateTime, 'mediumDate', localeId) : '',\r\n Url: `https://tasks.office.com/${tenantName}/en-US/Home/Task/${item.id}?Type=TaskLink&Channel=Link`,\r\n Id: item.id,\r\n Etag: item['@odata.etag'],\r\n PlannerTaskDetails$: this.plannerService.getPlannerTaskDetails(item.id),\r\n PlannerPlan$: this.plannerService.getPlannerPlan(item.planId),\r\n PlannerBucket$: this.plannerService.getPlannerBucket(item.bucketId)\r\n });\r\n }\r\n\r\n parseEvent(event: Event) {\r\n const currentTime = new Date().getTime();\r\n const timeZoneSuffix = event.start.timeZone === 'UTC' ? 'Z' : '';\r\n const localStartDate = parseISO(event.start.dateTime + timeZoneSuffix);\r\n const localEndDate = parseISO(event.end.dateTime + timeZoneSuffix);\r\n const localEndDateFormatted = isSameDay(localStartDate, localEndDate) ? formatDate(localEndDate, 'shortTime', this.localeId) : formatDate(localEndDate, 'EEE, MMM d, ', this.localeId) + formatDate(localEndDate, 'shortTime', this.localeId);\r\n\r\n let attendees = event.attendees;\r\n if (!event.isOrganizer) {\r\n attendees = event.attendees.filter(a => a.emailAddress.address !== event.organizer.emailAddress.address);\r\n }\r\n const acceptedUpns = event.attendees.filter(a => {\r\n return a.status.response === 'accepted';\r\n }).map(a => a.emailAddress.address);\r\n\r\n if (acceptedUpns.indexOf(event.organizer.emailAddress.address) === -1) {\r\n acceptedUpns.push(event.organizer.emailAddress.address);\r\n }\r\n\r\n let userResponse = Response.None;\r\n if (event.responseStatus.response === 'tentativelyAccepted') { userResponse = Response.Tentative; }\r\n if (event.responseStatus.response === 'declined') { userResponse = Response.Decline; }\r\n if (event.responseStatus.response === 'accepted' || event.isOrganizer) { userResponse = Response.Accepted; }\r\n\r\n const responses = attendees.map(a => a.status.response);\r\n\r\n return new MyEvent({\r\n Id: event.id,\r\n Subject: event.subject,\r\n BodyPreview: event.bodyPreview,\r\n EventStartDate: localStartDate,\r\n EventStartDateFormatted: formatDate(localStartDate, 'shortTime', this.localeId),\r\n EventStartDateAllDayFormatted: formatDate(localStartDate, 'fullDate', this.localeId),\r\n EventEndDate: localEndDate,\r\n EventEndDateFormatted: localEndDateFormatted,\r\n Location: event.location.displayName,\r\n Recurring: event.type,\r\n WebLink: event.webLink,\r\n IsAllDay: event.isAllDay,\r\n Attendees: event.attendees.length,\r\n Accepted: acceptedUpns.length,\r\n Declined: responses.filter(r => r === 'declined').length,\r\n NoResponse: responses.filter(r => r === 'none').length,\r\n Tentative: responses.filter(r => r === 'tentativelyAccepted').length,\r\n Expired: localEndDate.getTime() < currentTime,\r\n IsCancelled: event.isCancelled,\r\n IsOrganizer: event.isOrganizer,\r\n Response: userResponse,\r\n UserPhotos$: this.userService.getBatchUserPhotoByUpn(acceptedUpns),\r\n });\r\n }\r\n\r\n completeTask(task: MyTask, index: number) {\r\n task.Status = TaskStatus.COMPLETED;\r\n this.outlookService.reloadGetOutlookTasks();\r\n\r\n if (task.Type === TaskType.Planner) {\r\n this.completeSubScription = this.plannerService.completePlannerTask(task).subscribe();\r\n } else if (task.Type === TaskType.Outlook) {\r\n this.completeSubScription = this.outlookService.completeOutlookTask(task).subscribe();\r\n }\r\n\r\n this.accordion.toArray()[index].close();\r\n }\r\n\r\n acceptEvent(event: MyEvent, index: number, events: Array) {\r\n event.Response = Response.Accepted;\r\n this.responseSubscription = this.eventService.acceptEvent(event.Id).pipe(\r\n concatMap((response) => {\r\n return this.eventService.getEvent(event.Id).pipe(tap(updatedEvent => {\r\n if (updatedEvent) {\r\n // show updated event\r\n events[index] = this.parseEvent(updatedEvent);\r\n }\r\n }));\r\n }),\r\n catchError(err => {\r\n return this.eventService.getEvent(event.Id).pipe(tap(updatedEvent => {\r\n if (updatedEvent) {\r\n // show updated event\r\n events[index] = this.parseEvent(updatedEvent);\r\n }\r\n }));\r\n }))\r\n .subscribe();\r\n\r\n this.accordion.toArray()[this.showMore + index].close();\r\n }\r\n\r\n tentativeAcceptEvent(event: MyEvent, index: number, events: Array) {\r\n event.Response = Response.Tentative;\r\n this.responseSubscription = this.eventService.tentativelyAcceptEvent(event.Id).pipe(\r\n concatMap((response) => {\r\n return this.eventService.getEvent(event.Id).pipe(tap(updatedEvent => {\r\n if (updatedEvent) {\r\n // show updated event\r\n events[index] = this.parseEvent(updatedEvent);\r\n }\r\n }));\r\n }),\r\n catchError(err => {\r\n return this.eventService.getEvent(event.Id).pipe(tap(updatedEvent => {\r\n if (updatedEvent) {\r\n // show updated event\r\n events[index] = this.parseEvent(updatedEvent);\r\n }\r\n }));\r\n }))\r\n .subscribe();\r\n\r\n this.accordion.toArray()[this.showMore + index].close();\r\n }\r\n\r\n declineEvent(event: MyEvent, index: number, events: Array) {\r\n event.Response = Response.Decline;\r\n this.responseSubscription = this.eventService.declineEvent(event.Id).subscribe(result => {\r\n events.splice(index, 1);\r\n });\r\n }\r\n\r\n cancelEvent(event: MyEvent, index: number, events: Array) {\r\n this.responseSubscription = this.eventService.cancelEvent(event.Id).subscribe(result => {\r\n events.splice(index, 1);\r\n });\r\n }\r\n\r\n deleteEvent(event: MyEvent, index: number, events: Array) {\r\n this.responseSubscription = this.eventService.deleteEvent(event.Id).subscribe(result => {\r\n events.splice(index, 1);\r\n });\r\n }\r\n\r\n getPreferredNameLetters(displayName: string) {\r\n return Utilities.generateInitials(displayName);\r\n }\r\n\r\n getImageSpacing(index: number) {\r\n const styles = {};\r\n const spacing = 1.625 * index;\r\n styles['left'] = spacing + 'rem';\r\n styles['top'] = '0';\r\n return styles;\r\n }\r\n\r\n toggleShowMore() {\r\n this.showMore = this.showMore === this.showLessTasksCount ? this.tasksCount : this.showLessTasksCount;\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.completeSubScription && this.completeSubScription.unsubscribe();\r\n this.responseSubscription && this.responseSubscription.unsubscribe();\r\n }\r\n}\r\n@NgModule({\r\n declarations: [MyDayComponent],\r\n exports: [MyDayComponent],\r\n imports: [\r\n CommonModule,\r\n MatExpansionModule,\r\n MatButtonModule,\r\n ActionLinkModule,\r\n ActionButtonModule,\r\n TextPlaceholderModule,\r\n SafeModule,\r\n LinkModule,\r\n ]\r\n})\r\nexport class MyDayModule { }\r\n","
\r\n

Uploading file

\r\n \r\n The file is being uploaded to your OneDrive.\r\n \r\n The file was uploaded successfully. Click \r\n here\r\n to open.\r\n \r\n \r\n \r\n

Could not upload the document due to network issue. Please try again later.

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

Uploading file

\r\n \r\n A file with this name already exists. Would you like to replace the existing one?\r\n \r\n\r\n\r\n \r\n \r\n \r\n \r\n
\r\n","import { CommonModule } from '@angular/common';\r\nimport { Component, EventEmitter, Input, NgModule, OnInit, Output } from '@angular/core';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatDialogModule } from '@angular/material/dialog';\r\nimport { MatProgressBarModule } from '@angular/material/progress-bar';\r\nimport { ActionLinkModule } from '@app/components/actions/action-link/action-link.component';\r\nimport { LinkModule } from '@app/directives/link.directive';\r\n\r\n@Component({\r\n selector: 'app-upload-document-modal',\r\n templateUrl: './upload-document-modal.component.html',\r\n styleUrls: ['./upload-document-modal.component.scss']\r\n})\r\nexport class UploadDocumentModalComponent implements OnInit {\r\n @Output() emitData = new EventEmitter();\r\n @Input() uploading: boolean;\r\n @Input() fileUrl: string;\r\n @Input() docExists: boolean;\r\n @Input() error: boolean;\r\n\r\n constructor() { }\r\n\r\n ngOnInit() {\r\n this.emitData.emit({ cancel: false, override: false });\r\n this.uploading = true;\r\n }\r\n replaceDoc() {\r\n this.emitData.emit({ cancel: false, override: true });\r\n this.uploading = false;\r\n this.docExists = false;\r\n }\r\n\r\n cancelUpload() {\r\n this.emitData.emit({ cancel: true, override: false });\r\n this.uploading = false;\r\n this.docExists = false;\r\n }\r\n}\r\n@NgModule({\r\n declarations: [UploadDocumentModalComponent],\r\n entryComponents: [\r\n UploadDocumentModalComponent],\r\n imports: [\r\n CommonModule,\r\n MatButtonModule,\r\n MatDialogModule,\r\n ActionLinkModule,\r\n MatProgressBarModule,\r\n LinkModule,\r\n ]\r\n})\r\nexport class UploadDocumentModalModule { }\r\n","import { CommonModule } from '@angular/common';\r\nimport { Component, NgModule, OnInit } from '@angular/core';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatDialogModule } from '@angular/material/dialog';\r\nimport { ActionLinkModule } from '@app/components/actions/action-link/action-link.component';\r\nimport { LinkModule } from '@app/directives/link.directive';\r\n\r\n@Component({\r\n selector: 'app-upload-document-warning-message',\r\n templateUrl: './upload-document-warning-message.component.html',\r\n styleUrls: ['./upload-document-warning-message.component.scss']\r\n})\r\nexport class UploadDocumentWarningMessageComponent implements OnInit {\r\n onedriveLink: string;\r\n\r\n constructor() { }\r\n\r\n ngOnInit() {\r\n }\r\n\r\n}\r\n@NgModule({\r\n declarations: [UploadDocumentWarningMessageComponent],\r\n entryComponents: [\r\n UploadDocumentWarningMessageComponent\r\n ],\r\n imports: [\r\n CommonModule,\r\n MatButtonModule,\r\n MatDialogModule,\r\n ActionLinkModule,\r\n LinkModule,\r\n ]\r\n})\r\nexport class UploadDocumentWarningMessageModule { }\r\n","

File is too large

\r\n\r\n \r\n \r\n Please upload the file from your\r\n \r\n \r\n Onedrive\r\n .\r\n \r\n\r\n\r\n \r\n\r\n","import { HttpClient, HttpParams } from '@angular/common/http';\r\nimport { Injectable } from '@angular/core';\r\nimport { HttpHelper } from '@app/common/http-helper';\r\nimport { CacheService } from '@app/services/cache.service';\r\nimport { Drive, DriveItem } from '@microsoft/microsoft-graph-types';\r\nimport { Observable, of } from 'rxjs';\r\nimport { catchError, shareReplay, tap } from 'rxjs/operators';\r\nimport { Constants } from '../common/constants';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class OneDriveService {\r\n\r\n constructor(private http: HttpClient, private cache: CacheService, private httpHelper: HttpHelper) { }\r\n\r\n private readonly cacheKey = 'OnedriveService-getOneDrive';\r\n public useCache = true;\r\n private getOneDrive$: Observable;\r\n\r\n getOneDrive(): Observable {\r\n if (this.getOneDrive$) {\r\n return this.getOneDrive$;\r\n } else {\r\n const httpParams = new HttpParams()\r\n .append('select', 'webUrl');\r\n\r\n this.getOneDrive$ = this.http.get(`${Constants.GRAPH_API_ENDPOINT + Constants.GRAPH_API_VERSION_ONE}/me/drive`, { params: httpParams })\r\n .pipe(\r\n tap(response => {\r\n console.log(`fetched result: onedrive `, response);\r\n this.useCache && this.cache.set(this.cacheKey, response);\r\n }),\r\n catchError(this.httpHelper.handleError({ operation: 'getOneDrive', result: ({} as Drive), rethrow: true })),\r\n shareReplay({ bufferSize: 1, refCount: true }));\r\n\r\n if (this.useCache) {\r\n const cachedData = this.cache.get(this.cacheKey);\r\n if (cachedData) {\r\n this.getOneDrive$ = of(cachedData);\r\n }\r\n }\r\n return this.getOneDrive$;\r\n }\r\n }\r\n\r\n getFile(fileName: string): Observable {\r\n\r\n const fetchOperation = this.http.get(`${Constants.GRAPH_API_ENDPOINT + Constants.GRAPH_API_VERSION_ONE}/me/drive/root:/` + fileName)\r\n .pipe(\r\n tap(response => {\r\n console.log(`fetched result: file from onedrive `, response);\r\n }),\r\n catchError(error => {\r\n return of(error.status);\r\n }));\r\n return fetchOperation;\r\n }\r\n\r\n uploadFile(fileName: string, rawData: string | ArrayBuffer): Observable {\r\n return this.http.put(`${Constants.GRAPH_API_ENDPOINT + Constants.GRAPH_API_VERSION_ONE}/me/drive/root:/` + fileName + `:/content`, rawData)\r\n .pipe(\r\n tap(response => {\r\n console.log(`uploadFile result: upload document to onedrive `, response);\r\n this.useCache && this.cache.removeFromPersistentCache(this.cacheKey);\r\n }));\r\n }\r\n}\r\n","import { CommonModule } from '@angular/common';\r\nimport { Component, Input, NgModule, OnDestroy, OnInit } from '@angular/core';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatDialog, MatDialogModule, MatDialogRef } from '@angular/material/dialog';\r\nimport { ActionLinkModule } from '@app/components/actions/action-link/action-link.component';\r\nimport { LinkModule } from '@app/directives/link.directive';\r\nimport { DriveItem } from '@microsoft/microsoft-graph-types';\r\nimport { of, Subscription } from 'rxjs';\r\nimport { concatMap, switchMap } from 'rxjs/operators';\r\nimport { OneDriveService } from '../../../../services/onedrive.service';\r\nimport { UploadDocumentModalComponent, UploadDocumentModalModule } from '../upload-document-modal/upload-document-modal.component';\r\nimport { UploadDocumentWarningMessageComponent, UploadDocumentWarningMessageModule } from '../upload-document-warning-message/upload-document-warning-message.component';\r\n\r\n@Component({\r\n selector: 'app-upload-document-button',\r\n templateUrl: './upload-document-button.component.html',\r\n styleUrls: ['./upload-document-button.component.scss']\r\n})\r\nexport class UploadDocumentButtonComponent implements OnInit, OnDestroy {\r\n @Input() onedriveLink: string;\r\n uploadedFile: DriveItem;\r\n private subscription: Subscription = new Subscription();\r\n\r\n private dialogRef: MatDialogRef;\r\n\r\n constructor(public dialog: MatDialog, private onedriveService: OneDriveService) { }\r\n\r\n ngOnInit() {\r\n }\r\n\r\n uploadFile(e: Event) {\r\n const target: HTMLInputElement = e.target as HTMLInputElement;\r\n const file = target.files[0];\r\n const reader = new FileReader();\r\n const fileSizeLimit = 4194304;\r\n\r\n // reset input field\r\n target.value = '';\r\n\r\n if (!file) {\r\n return;\r\n }\r\n\r\n // check filesize - max limit is 4MB\r\n if (file.size > fileSizeLimit) {\r\n const warningDialogRef = this.dialog.open(UploadDocumentWarningMessageComponent, {});\r\n warningDialogRef.componentInstance.onedriveLink = this.onedriveLink;\r\n } else {\r\n reader.onload = () => {\r\n const rawData = reader.result;\r\n\r\n // open dialog\r\n this.dialogRef = this.dialog.open(UploadDocumentModalComponent, {});\r\n\r\n // listens for cancel and override event from dialog in case the user wants to stop/replace the upload\r\n this.subscription.add(\r\n this.dialogRef.componentInstance.emitData\r\n .pipe(switchMap(event => {\r\n if (event.cancel) {\r\n return of(null);\r\n } else if (event.override) {\r\n return this.onedriveService.uploadFile(file.name, rawData);\r\n } else {\r\n return this.onedriveService.getFile(file.name).pipe(concatMap(res => {\r\n // Document already exists in one drive\r\n if (res && res.id) {\r\n return of('doc exists');\r\n } else if (res === 404) {\r\n return this.onedriveService.uploadFile(file.name, rawData);\r\n } else {\r\n return of('error');\r\n }\r\n }));\r\n }\r\n }))\r\n .subscribe(result => {\r\n if (result && result !== 'doc exists' && result !== 'error') {\r\n this.uploadedFile = result;\r\n this.dialogRef.componentInstance.fileUrl = this.uploadedFile.webUrl;\r\n this.dialogRef.componentInstance.uploading = false;\r\n this.dialogRef.componentInstance.docExists = false;\r\n } else if (result === 'doc exists') {\r\n this.dialogRef.componentInstance.docExists = true;\r\n } else {\r\n console.log('Error status' + result);\r\n this.dialogRef.componentInstance.docExists = false;\r\n this.dialogRef.componentInstance.uploading = true;\r\n this.dialogRef.componentInstance.error = true;\r\n }\r\n }));\r\n };\r\n\r\n reader.readAsArrayBuffer(file);\r\n }\r\n }\r\n\r\n ngOnDestroy() {\r\n this.subscription && this.subscription.unsubscribe();\r\n }\r\n}\r\n@NgModule({\r\n declarations: [UploadDocumentButtonComponent],\r\n exports: [UploadDocumentButtonComponent],\r\n imports: [\r\n CommonModule,\r\n MatButtonModule,\r\n MatDialogModule,\r\n ActionLinkModule,\r\n UploadDocumentModalModule,\r\n LinkModule,\r\n UploadDocumentWarningMessageModule,\r\n ]\r\n})\r\nexport class UploadDocumentButtonModule { }\r\n","\r\n\r\n\r\n\r\n","import { SharedInsight, Trending, UsedInsight } from '@microsoft/microsoft-graph-types';\r\nimport { isAfter, parseISO } from 'date-fns';\r\n\r\nexport class MyDocument {\r\n public Title: string;\r\n public IconClasses: string;\r\n public Path: string;\r\n public EdgeAction: number;\r\n public EdgeDate: Date;\r\n public LastModified: Date;\r\n public Rank: number;\r\n public SharedBy: string;\r\n public ContainerUrl: string;\r\n\r\n constructor(opt?: Partial) {\r\n Object.assign(this, opt);\r\n }\r\n\r\n static fromSharedInsight(val: SharedInsight, versionIE) {\r\n let path = val.resourceReference.webUrl ? val.resourceReference.webUrl : val.resourceVisualization.containerWebUrl;\r\n path = val.resourceVisualization.type === 'Web' && path !== null ? MyDocument.getWebUrl(path, val.resourceVisualization.title) : path;\r\n\r\n return new MyDocument({\r\n Title: versionIE > 0 ? MyDocument.getIETitle(val.resourceVisualization.title) : val.resourceVisualization.title,\r\n Path: path,\r\n IconClasses: MyDocument.getDocumentIcon(val.resourceVisualization.type),\r\n EdgeAction: 3,\r\n SharedBy: val.lastShared.sharedBy.displayName,\r\n ContainerUrl: val.resourceVisualization.containerWebUrl\r\n });\r\n }\r\n\r\n static fromTrendingDocuments(val: Trending, versionIE) {\r\n let path = val.resourceReference.webUrl ? val.resourceReference.webUrl : val.resourceVisualization.containerWebUrl;\r\n path = val.resourceVisualization.type === 'Web' && path !== null ? this.getWebUrl(path, val.resourceVisualization.title) : path;\r\n\r\n return new MyDocument({\r\n Title: versionIE > 0 ? this.getIETitle(val.resourceVisualization.title) : val.resourceVisualization.title,\r\n Path: path,\r\n IconClasses: this.getDocumentIcon(val.resourceVisualization.type),\r\n EdgeAction: 3,\r\n Rank: val.weight,\r\n ContainerUrl: val.resourceVisualization.containerWebUrl\r\n });\r\n }\r\n\r\n static fromUsedInsight(val: UsedInsight, versionIE): MyDocument {\r\n let path = val.resourceReference.webUrl ? val.resourceReference.webUrl : val.resourceVisualization.containerWebUrl;\r\n path = val.resourceVisualization.type === 'Web' && path !== null ? this.getWebUrl(path, val.resourceVisualization.title) : path;\r\n\r\n const lastModifiedDateTime = parseISO(val.lastUsed.lastModifiedDateTime);\r\n const lastAccessedDateTime = parseISO(val.lastUsed.lastAccessedDateTime);\r\n\r\n return new MyDocument({\r\n Title: versionIE > 0 ? this.getIETitle(val.resourceVisualization.title) : val.resourceVisualization.title,\r\n Path: path,\r\n IconClasses: MyDocument.getDocumentIcon(val.resourceVisualization.type),\r\n EdgeAction: isAfter(lastAccessedDateTime, lastModifiedDateTime) ? 1 : 2,\r\n EdgeDate: lastAccessedDateTime,\r\n LastModified: lastModifiedDateTime,\r\n ContainerUrl: val.resourceVisualization.containerWebUrl\r\n });\r\n }\r\n\r\n /*\r\n * Matches the file type of the file search result to a specfic icon.\r\n */\r\n static getDocumentIcon(fileType: string): string {\r\n let iconClasses = 'ms-Icon ';\r\n\r\n switch (fileType.toLowerCase()) {\r\n case 'pdf':\r\n iconClasses += 'ms-Icon--PDF';\r\n break;\r\n case 'word':\r\n iconClasses += 'ms-Icon--WordDocument';\r\n break;\r\n case 'excel':\r\n iconClasses += 'ms-Icon--ExcelDocument';\r\n break;\r\n case 'powerpoint':\r\n iconClasses += 'ms-Icon--PowerPointDocument';\r\n break;\r\n case 'onenote':\r\n iconClasses += 'ms-Icon--OneNoteLogo';\r\n break;\r\n case 'visio':\r\n iconClasses += 'ms-Icon--VisioLogo';\r\n break;\r\n default:\r\n iconClasses += 'ms-Icon--TextDocument';\r\n break;\r\n }\r\n\r\n return iconClasses;\r\n }\r\n\r\n /*\r\n * IE fix for hypenations where the title of the file is one long word and IE can't hypenate correctly.\r\n */\r\n static getIETitle(title: string): string {\r\n\r\n let trimmedTitle: string;\r\n const words = title.split(' ');\r\n\r\n if (words[0].length > 17) {\r\n words[0] = words[0].substring(0, 14);\r\n trimmedTitle = words[0] + '...';\r\n } else {\r\n trimmedTitle = title;\r\n }\r\n return trimmedTitle;\r\n }\r\n\r\n /*\r\n * Assemble a complete link to a page using the metadata provided in the object.\r\n */\r\n static getWebUrl(path: string, filename: string): string {\r\n let webFilePath: string;\r\n const index = path.indexOf('/Forms/');\r\n webFilePath = path.substring(0, index + 1);\r\n webFilePath += filename + '.aspx';\r\n return webFilePath;\r\n }\r\n}\r\n","
\r\n
\r\n
\r\n

Your documents

\r\n

\r\n Here you'll find your recent documents and documents that are trending among your colleagues. Use the button to upload, or drag and drop a document to this area to upload it to your OneDrive.\r\n

\r\n
\r\n
\r\n \r\n
\r\n
\r\n\r\n \r\n
\r\n \r\n \r\n \r\n
\r\n
\r\n\r\n \r\n \r\n \r\n \r\n Recent\r\n \r\n \r\n \r\n \r\n Trending\r\n \r\n \r\n \r\n \r\n Shared\r\n \r\n \r\n \r\n\r\n \r\n
\r\n
\r\n
\r\n \r\n

No documents were found.

\r\n
\r\n
\r\n \r\n \r\n \r\n \r\n \r\n \r\n Title\r\n \r\n \r\n \r\n \r\n \r\n \r\n {{document.Title}}\r\n {{getUrlAsBreadCrumbs(document.ContainerUrl)}}\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n Activity\r\n \r\n \r\n \r\n Viewed by you\r\n {{document.EdgeDate| date:'mediumDate'}}\r\n \r\n \r\n Edited by you\r\n {{document.LastModified| date:'mediumDate'}}\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n
\r\n minDocuments\">\r\n Show more\r\n \r\n Show less\r\n \r\n \r\n
\r\n
\r\n
\r\n\r\n \r\n
\r\n
\r\n
\r\n \r\n

No documents were found.

\r\n
\r\n
\r\n \r\n \r\n \r\n \r\n \r\n \r\n Title\r\n \r\n \r\n \r\n \r\n \r\n \r\n {{document.Title}}\r\n {{getUrlAsBreadCrumbs(document.ContainerUrl)}}\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n
\r\n minDocuments\">\r\n Show more\r\n \r\n Show less\r\n \r\n \r\n
\r\n\r\n
\r\n
\r\n\r\n \r\n
\r\n
\r\n
\r\n \r\n

No documents were found.

\r\n
\r\n
\r\n \r\n \r\n \r\n \r\n \r\n \r\n Title\r\n \r\n \r\n \r\n \r\n \r\n \r\n {{document.Title}}\r\n {{getUrlAsBreadCrumbs(document.ContainerUrl)}}\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n
\r\n minDocuments\">\r\n Show more\r\n \r\n Show less\r\n \r\n \r\n
\r\n
\r\n
\r\n\r\n
\r\n \r\n Go to OneDrive\r\n \r\n
\r\n
\r\n

Drag a file here to upload and open

\r\n
\r\n
\r\n
\r\n
\r\n\r\n
\r\n
\r\n\r\n \r\n
\r\n
\r\n \r\n
\r\n \r\n \r\n \r\n
\r\n
\r\n\r\n
\r\n","import { Platform, PlatformModule } from '@angular/cdk/platform';\r\nimport { CommonModule } from '@angular/common';\r\nimport { ChangeDetectorRef, Component, Inject, Input, NgModule, OnDestroy, OnInit, Renderer2, ViewEncapsulation } from '@angular/core';\r\nimport { MatDialog, MatDialogRef } from '@angular/material/dialog';\r\nimport { MatTableModule } from '@angular/material/table';\r\nimport { MatTabChangeEvent, MatTabsModule } from '@angular/material/tabs';\r\nimport { CUSTOMERENVIRONMENT, WINDOW } from '@app/common/app-tokens';\r\nimport { Utilities } from '@app/common/utilities';\r\nimport { ActionButtonModule } from '@app/components/actions/action-button/action-button.component';\r\nimport { ActionLinkModule } from '@app/components/actions/action-link/action-link.component';\r\nimport { ErrorTemplatesModule } from '@app/components/error-templates/error-templates.component';\r\nimport { UploadDocumentButtonModule } from '@app/components/my-documents/upload-document/upload-document-button/upload-document-button.component';\r\nimport { TextPlaceholderModule } from '@app/components/text-placeholder/text-placeholder.component';\r\nimport { WidgetPlaceholderModule } from '@app/components/widget-placeholder/widget-placeholder.component';\r\nimport { MyDocument } from '@app/models/my-document';\r\nimport { LinkModule } from '@app/directives/link.directive';\r\nimport { MyDocumentsService } from '@app/services/my-documents.service';\r\nimport { OneDriveService } from '@app/services/onedrive.service';\r\nimport { Environment } from '@environments/interface.environment';\r\nimport { FileSystemDirectoryEntry, FileSystemFileEntry, NgxFileDropEntry, NgxFileDropModule } from 'ngx-file-drop';\r\nimport { Observable, of, Subject, Subscription } from 'rxjs';\r\nimport { catchError, concatMap, map, switchMap, tap } from 'rxjs/operators';\r\nimport { UploadDocumentModalComponent } from '../upload-document/upload-document-modal/upload-document-modal.component';\r\nimport { UploadDocumentWarningMessageComponent } from '../upload-document/upload-document-warning-message/upload-document-warning-message.component';\r\n\r\n@Component({\r\n selector: 'app-my-documents',\r\n templateUrl: './my-documents.component.html',\r\n styleUrls: ['./my-documents.component.scss'],\r\n encapsulation: ViewEncapsulation.None\r\n})\r\nexport class MyDocumentsComponent implements OnInit, OnDestroy {\r\n\r\n @Input() numberOfRecentDocuments = 10;\r\n @Input() numberOfTrendingDocuments = 10;\r\n @Input() numberOfSharedDocuments = 10;\r\n onedriveLink: string;\r\n private versionIE: number;\r\n loading = true;\r\n myRecentDocuments$: Observable;\r\n myTrendingDocuments$: Observable;\r\n mySharedResult$: Observable;\r\n onedriveLink$: Observable;\r\n private errorSubject$ = new Subject();\r\n @Input() showMore = 5;\r\n @Input() minDocuments = 5;\r\n @Input() maxDocuments = 10;\r\n selectedIndex = 0;\r\n private originalShowMoreValue: number;\r\n private dialogRef: MatDialogRef;\r\n fileSizeLimit = 4194304;\r\n private subscription: Subscription = new Subscription();\r\n isMobileDevice = false;\r\n componentName = 'Your documents';\r\n\r\n constructor(@Inject(CUSTOMERENVIRONMENT) private environment: Environment,\r\n @Inject(WINDOW) private window: Window,\r\n private renderer2: Renderer2,\r\n private myDocumentsService: MyDocumentsService,\r\n private onedriveService: OneDriveService,\r\n private cdRef: ChangeDetectorRef,\r\n public dialog: MatDialog,\r\n private platform: Platform) {\r\n this.originalShowMoreValue = this.showMore;\r\n this.isMobileDevice = this.platform.ANDROID || this.platform.IOS;\r\n }\r\n\r\n getUrl(url: string) {\r\n return Utilities.getRealUrlFromTokenBasedUrl(this.environment, url);\r\n }\r\n\r\n handleChange(event: MatTabChangeEvent) {\r\n this.loading = true;\r\n this.showMore = this.originalShowMoreValue;\r\n this.cdRef.detectChanges();\r\n }\r\n\r\n toggleShowMore() {\r\n this.showMore = this.showMore === this.minDocuments ? this.maxDocuments : this.minDocuments;\r\n }\r\n\r\n getUrlAsBreadCrumbs(url) {\r\n const a = this.renderer2.createElement('a');\r\n a.setAttribute('href', url);\r\n\r\n const escapedPathName = unescape(a.pathname);\r\n const paths = escapedPathName.split('/');\r\n\r\n if (a.pathname.endsWith('.aspx')) {\r\n paths.pop();\r\n }\r\n\r\n if (a.pathname.startsWith('/')) {\r\n paths.shift();\r\n }\r\n\r\n const breadcrumbUrl = [a.hostname].concat(paths).join(' > ');\r\n a.remove();\r\n return breadcrumbUrl;\r\n }\r\n\r\n ngOnInit() {\r\n this.versionIE = Utilities.detectIE(this.window.navigator.userAgent);\r\n\r\n this.myRecentDocuments$ = this.myDocumentsService.getMyRecentDocuments(this.numberOfRecentDocuments)\r\n .pipe(map(result => {\r\n return result.filter(doc => {\r\n return doc.resourceVisualization.title;\r\n }).map(doc => {\r\n return MyDocument.fromUsedInsight(doc, this.versionIE);\r\n });\r\n }), tap(() => {\r\n this.loading = false;\r\n this.cdRef.detectChanges();\r\n }),\r\n catchError(err => {\r\n this.errorSubject$.next(err);\r\n return of(null);\r\n }));\r\n\r\n this.myTrendingDocuments$ = this.myDocumentsService.getMyTrendingDocuments(this.numberOfTrendingDocuments)\r\n .pipe(map(result => {\r\n return result.filter(doc => {\r\n return doc.resourceVisualization.title;\r\n }).map(doc => {\r\n return MyDocument.fromTrendingDocuments(doc, this.versionIE);\r\n });\r\n }), tap(() => {\r\n this.loading = false;\r\n this.cdRef.detectChanges();\r\n }),\r\n catchError(err => {\r\n this.errorSubject$.next(err);\r\n return of(null);\r\n }));\r\n\r\n this.mySharedResult$ = this.myDocumentsService.getMySharedDocuments(this.numberOfSharedDocuments)\r\n .pipe(map(result => {\r\n return result.filter(doc => {\r\n return doc.resourceVisualization.title;\r\n }).map(doc => {\r\n return MyDocument.fromSharedInsight(doc, this.versionIE);\r\n });\r\n }), tap(() => {\r\n this.loading = false;\r\n this.cdRef.detectChanges();\r\n }),\r\n catchError(err => {\r\n this.errorSubject$.next(err);\r\n return of(null);\r\n }));\r\n\r\n this.onedriveLink$ = this.onedriveService\r\n .getOneDrive()\r\n .pipe(\r\n map(result => result.webUrl));\r\n }\r\n\r\n // drag and drop functionality\r\n dropped(files: NgxFileDropEntry[]) {\r\n\r\n for (const droppedFile of files) {\r\n if (droppedFile.fileEntry.isFile) {\r\n const fileEntry = droppedFile.fileEntry as FileSystemFileEntry;\r\n\r\n fileEntry.file((file: File) => {\r\n if (!file) {\r\n return;\r\n }\r\n\r\n const reader = new FileReader();\r\n\r\n // check filesize - max limit is 4MB\r\n if (file.size > this.fileSizeLimit) {\r\n const warningDialogRef = this.dialog.open(UploadDocumentWarningMessageComponent, {});\r\n warningDialogRef.componentInstance.onedriveLink = this.onedriveLink;\r\n } else {\r\n reader.onload = () => {\r\n const rawData = reader.result;\r\n\r\n // open dialog\r\n this.dialogRef = this.dialog.open(UploadDocumentModalComponent, {});\r\n\r\n // listens for cancel and override event from dialog in case the user wants to stop/replace the upload\r\n this.subscription.add(\r\n this.dialogRef.componentInstance.emitData\r\n .pipe(switchMap(userEvent => {\r\n if (userEvent.cancel) {\r\n return of(null);\r\n } else if (userEvent.override) {\r\n return this.onedriveService.uploadFile(file.name, rawData);\r\n } else {\r\n return this.onedriveService.getFile(file.name).pipe(concatMap(res => {\r\n // Document already exists in one drive\r\n if (res && res.id) {\r\n return of('doc exists');\r\n } else if (res === 404) {\r\n return this.onedriveService.uploadFile(file.name, rawData);\r\n } else {\r\n return of('error');\r\n }\r\n }));\r\n }\r\n }))\r\n .subscribe(result => {\r\n if (result && result !== 'doc exists' && result !== 'error') {\r\n this.dialogRef.componentInstance.fileUrl = result.webUrl;\r\n this.dialogRef.componentInstance.uploading = false;\r\n this.dialogRef.componentInstance.docExists = false;\r\n } else if (result === 'doc exists') {\r\n this.dialogRef.componentInstance.docExists = true;\r\n } else {\r\n console.log('Error status' + result);\r\n this.dialogRef.componentInstance.docExists = false;\r\n this.dialogRef.componentInstance.uploading = true;\r\n this.dialogRef.componentInstance.error = true;\r\n }\r\n }));\r\n };\r\n\r\n reader.readAsArrayBuffer(file);\r\n }\r\n\r\n });\r\n } else {\r\n const fileEntry = droppedFile.fileEntry as FileSystemDirectoryEntry;\r\n console.log(droppedFile.relativePath, fileEntry);\r\n }\r\n }\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.subscription && this.subscription.unsubscribe();\r\n }\r\n\r\n}\r\n@NgModule({\r\n declarations: [MyDocumentsComponent],\r\n exports: [MyDocumentsComponent],\r\n imports: [\r\n CommonModule,\r\n PlatformModule,\r\n MatTabsModule,\r\n MatTableModule,\r\n ActionButtonModule,\r\n ActionLinkModule,\r\n NgxFileDropModule,\r\n TextPlaceholderModule,\r\n ErrorTemplatesModule,\r\n WidgetPlaceholderModule,\r\n UploadDocumentButtonModule,\r\n LinkModule,\r\n ]\r\n})\r\nexport class MyDocumentsModule { }\r\n","
\r\n
\r\n
\r\n \r\n
\r\n
\r\n \r\n
\r\n
\r\n
\r\n
\r\n \r\n
\r\n
\r\n
\r\n
\r\n \r\n
\r\n
\r\n
\r\n
\r\n \r\n
\r\n
\r\n \r\n
\r\n
\r\n

All components are turned off. Go to settings to turn them on.

\r\n
\r\n
\r\n
\r\n
\r\n","import { CommonModule } from '@angular/common';\r\nimport { Component, NgModule, OnInit } from '@angular/core';\r\nimport { Router, RouterModule } from '@angular/router';\r\nimport { Constants } from '@app/common/constants';\r\nimport { MyAppTilesModule } from '@app/components/apps-and-tools/my-app-tiles/my-app-tiles.component';\r\nimport { MyDayModule } from '@app/components/my-day/my-day.component';\r\nimport { MyDocumentsModule } from '@app/components/my-documents/my-documents-widget/my-documents.component';\r\nimport { SmartLinksModule } from '@app/components/smart-links/smart-links.component';\r\nimport { PowerBIModule } from '@app/components/power-bi/power-bi.component';\r\nimport { HideParentIfEmptyModule } from '@app/directives/hide-parent-if-empty.directive';\r\nimport { MarkComponentVisitedModule } from '@app/directives/mark-component-visited.directive';\r\nimport { NgSubscribeModule } from '@app/directives/ng-subscribe.directive';\r\nimport { UserTabComponentConfiguration } from '@app/models/user-tab-configuration';\r\nimport { LinkModule } from '@app/directives/link.directive';\r\nimport { UserTabComponentConfigurationsService } from '@app/services/user-tab-config.service';\r\nimport { Observable } from 'rxjs';\r\nimport { map } from 'rxjs/operators';\r\n\r\n@Component({\r\n selector: 'app-my-board',\r\n templateUrl: './my-board.component.html',\r\n styleUrls: ['./my-board.component.scss']\r\n})\r\nexport class MyBoardComponent implements OnInit {\r\n\r\n tabConfig$: Observable>;\r\n\r\n constructor(private router: Router, private userTabConfigService: UserTabComponentConfigurationsService) { }\r\n\r\n getTabConfigClassesForComponentId(componentId: string, normalPosition: number, userTabConfig: Array) {\r\n if (userTabConfig && userTabConfig.length > 0) {\r\n const conf = userTabConfig.find(u => u.ComponentId === componentId);\r\n if (conf) {\r\n if (conf.Hidden) {\r\n return 'd-none';\r\n }\r\n return `order-${conf.Order + 1}`;\r\n }\r\n }\r\n return `order-${normalPosition}`;\r\n }\r\n\r\n areAllComponentsTurnedOff(numberOfComponents: number, userTabConfig: Array) {\r\n if (userTabConfig && userTabConfig.length > 0) {\r\n const tabsForThisRoute = userTabConfig.filter(u => this.router.url.endsWith(u.TabId));\r\n if (tabsForThisRoute.length === numberOfComponents) {\r\n return tabsForThisRoute.every(u => u.Hidden === true);\r\n }\r\n }\r\n return false;\r\n }\r\n\r\n ngOnInit() {\r\n const configurableRoutes = this.router.config.filter(r => r.data && r.data[Constants.ROUTE_DATA_CONFIGURABLE_KEY] && '/' + r.path === this.router.url);\r\n\r\n if (configurableRoutes && configurableRoutes.length === 1) {\r\n this.tabConfig$ = this.userTabConfigService.getUserTabConfig()\r\n .pipe(\r\n map(result => {\r\n return result.filter(r => r.TabId === '/' + configurableRoutes[0].path);\r\n }));\r\n }\r\n }\r\n\r\n}\r\n@NgModule({\r\n declarations: [MyBoardComponent],\r\n exports: [MyBoardComponent],\r\n imports: [\r\n CommonModule,\r\n LinkModule,\r\n MyAppTilesModule,\r\n SmartLinksModule,\r\n MyDayModule,\r\n MyDocumentsModule,\r\n HideParentIfEmptyModule,\r\n MarkComponentVisitedModule,\r\n NgSubscribeModule,\r\n RouterModule,\r\n PowerBIModule\r\n ]\r\n})\r\nexport class MyBoardModule { }\r\n","
\r\n
\r\n

News from:

\r\n
\r\n \r\n \r\n \r\n
\r\n
\r\n
\r\n","import { CommonModule } from '@angular/common';\r\nimport { Component, Host, NgModule, OnInit, Optional } from '@angular/core';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { Router, RouterModule } from '@angular/router';\r\nimport { HideParentIfEmptyDirective, HideParentIfEmptyModule } from '@app/directives/hide-parent-if-empty.directive';\r\nimport { Observable } from 'rxjs';\r\nimport { map } from 'rxjs/operators';\r\nimport { LinkModule } from '@app/directives/link.directive';\r\nimport { ChannelService } from '@app/services/channel.service';\r\nimport { FeatureSettingsStoreService } from '@app/services/feature-settings-store.service';\r\nimport { PageModule } from '@app/views/pages/page/page.component';\r\nimport { PagesViewModule } from '@app/views/pages/pages-view.module';\r\nimport { FilterButtonInfo } from '@app/models/filter-button-info';\r\n\r\n@Component({\r\n selector: 'app-filter-by-department',\r\n templateUrl: './filter-by-department.component.html',\r\n styleUrls: ['./filter-by-department.component.scss']\r\n})\r\nexport class FilterByDepartmentComponent implements OnInit {\r\n definedChannels: Array;\r\n showComponent: boolean;\r\n channels$: Observable>;\r\n newsFilterButtons = this.featureSettingsStoreService.state.newsFilterButtonConfig;\r\n\r\n constructor(private featureSettingsStoreService: FeatureSettingsStoreService,\r\n private router: Router,\r\n @Host() @Optional() private hideParentIfEmptyDirective: HideParentIfEmptyDirective,\r\n private channelService: ChannelService) {\r\n }\r\n\r\n ngOnInit(): void {\r\n this.showComponent = this.featureSettingsStoreService.state.showFilterByDepartmentButtons;\r\n this.definedChannels = this.newsFilterButtons;\r\n if (this.showComponent && this.definedChannels && this.definedChannels.length > 0) {\r\n this.hideParentIfEmptyDirective && this.hideParentIfEmptyDirective.showElement();\r\n this.channels$ =\r\n this.channelService.getChannels()\r\n .pipe(\r\n map(channels => {\r\n // Modify channels for selection (recursively)\r\n channels = channels.flattenRecursive('Terms');\r\n this.definedChannels = this.definedChannels.filter(r => channels.map(c => c.Guid).indexOf(r.GUID) >= 0);\r\n this.definedChannels.sort((a, b) => a.SortOrder - b.SortOrder);\r\n\r\n if (this.definedChannels.length < 1) {\r\n this.hideParentIfEmptyDirective && this.hideParentIfEmptyDirective.hideElement();\r\n }\r\n return this.definedChannels;\r\n }));\r\n } else {\r\n this.hideParentIfEmptyDirective && this.hideParentIfEmptyDirective.hideElement();\r\n }\r\n }\r\n\r\n}\r\n@NgModule({\r\n declarations: [FilterByDepartmentComponent],\r\n exports: [\r\n FilterByDepartmentComponent\r\n ],\r\n imports: [\r\n CommonModule,\r\n MatButtonModule,\r\n LinkModule,\r\n PageModule,\r\n PagesViewModule,\r\n RouterModule,\r\n HideParentIfEmptyModule\r\n ]\r\n})\r\nexport class FilterByDepartmentModule { }\r\n","
\r\n\r\n \r\n \r\n Go to the news center\r\n \r\n \r\n \r\n Go to the news center\r\n \r\n \r\n \r\n \r\n
\r\n
\r\n
\r\n
\r\n \r\n \r\n
\r\n \"{{truncate(newsItem.Title)}}\"\r\n \r\n \r\n \"{{truncate(newsItem.Title)}}\"\r\n \r\n
\r\n
\r\n \r\n \r\n
\r\n
\r\n
\r\n
\r\n \r\n
\r\n \r\n
\r\n \r\n
\r\n
\r\n {{newsItem.PublishedDate | date}}\r\n 0) || (!newsItem.IsSharePointNews && newsItem.LikesCount > 0)\">\r\n \r\n {{newsItem.LikesCount}}\r\n \r\n 0) || (!newsItem.IsSharePointNews && newsItem.CommentsCount > 0)\">\r\n \r\n {{newsItem.CommentsCount}}\r\n \r\n
\r\n \r\n
\r\n
\r\n {{getSenderTagString(newsItem)}}\r\n
\r\n
\r\n \r\n
\r\n \r\n
\r\n \r\n
\r\n \r\n
\r\n \r\n
\r\n \r\n
\r\n
\r\n {{newsItem.PublishedDate | date}}\r\n 0)\">\r\n \r\n {{newsItem.LikesCount}}\r\n \r\n 0)\">\r\n \r\n {{newsItem.CommentsCount}}\r\n \r\n
\r\n \r\n \r\n New\r\n

\r\n {{truncate(newsItem.Title)}}\r\n

\r\n
\r\n \r\n
\r\n \r\n {{newsItem.Description}}\r\n \r\n
\r\n \r\n \r\n Open this page in sharepoint\r\n \r\n \r\n
\r\n \r\n
\r\n \r\n
\r\n
\r\n \r\n

No featured news could be found.

\r\n
\r\n
\r\n
\r\n
\r\n
\r\n \r\n
\r\n \r\n \r\n \r\n
\r\n
\r\n \r\n \r\n
\r\n For older news, open News Center\r\n For older news, open News Center\r\n
\r\n
\r\n \r\n
\r\n
\r\n \r\n
\r\n \r\n \r\n
\r\n
\r\n \r\n
\r\n
\r\n \r\n
\r\n \"{{truncate(newsItem.Title)}}\"\r\n\r\n \r\n \r\n \"{{truncate(newsItem.Title)}}\"\r\n\r\n \r\n
\r\n
\r\n \r\n \r\n
\r\n
\r\n
\r\n
\r\n \r\n
\r\n \r\n
\r\n \r\n
\r\n
\r\n {{newsItem.PublishedDate | date}}\r\n 0) || (!newsItem.IsSharePointNews && newsItem.LikesCount > 0)\">\r\n \r\n {{newsItem.LikesCount}}\r\n \r\n 0) || (!newsItem.IsSharePointNews && newsItem.CommentsCount > 0)\">\r\n \r\n {{newsItem.CommentsCount}}\r\n \r\n
\r\n \r\n \r\n New\r\n

\r\n {{truncate(newsItem.Title)}}\r\n

\r\n
\r\n
\r\n
\r\n {{getSenderTagString(newsItem)}}\r\n
\r\n
\r\n \r\n
\r\n \r\n
\r\n \r\n
\r\n \r\n
\r\n \r\n
\r\n \r\n
\r\n
\r\n {{newsItem.PublishedDate | date}}\r\n 0)\">\r\n \r\n {{newsItem.LikesCount}}\r\n \r\n 0)\">\r\n \r\n {{newsItem.CommentsCount}}\r\n \r\n
\r\n \r\n \r\n New\r\n

\r\n {{truncate(newsItem.Title)}}\r\n

\r\n
\r\n \r\n
\r\n \r\n {{newsItem.Description}}\r\n \r\n
\r\n \r\n \r\n Open this page in\r\n sharepoint\r\n \r\n \r\n
\r\n \r\n
\r\n
\r\n
\r\n
\r\n
","import { BreakpointObserver, Breakpoints, BreakpointState } from '@angular/cdk/layout';\r\nimport { CommonModule, DOCUMENT } from '@angular/common';\r\nimport { ChangeDetectionStrategy, Component, ElementRef, Inject, Input, NgModule, OnDestroy, OnInit, Optional, ViewEncapsulation } from '@angular/core';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { Router, RouterModule } from '@angular/router';\r\nimport { CUSTOMERENVIRONMENT } from '@app/common/app-tokens';\r\nimport { Utilities } from '@app/common/utilities';\r\nimport { ActionLinkModule } from '@app/components/actions/action-link/action-link.component';\r\nimport { ActionRouterLinkModule } from '@app/components/actions/action-router-link/action-router-link.component';\r\nimport { ErrorTemplatesModule } from '@app/components/error-templates/error-templates.component';\r\nimport { TextPlaceholderModule } from '@app/components/text-placeholder/text-placeholder.component';\r\nimport { WidgetPlaceholderModule } from '@app/components/widget-placeholder/widget-placeholder.component';\r\nimport { ImgSrcProxyModule } from '@app/directives/img-src-proxy.directive';\r\nimport { NewsPage } from '@app/models/news-page';\r\nimport { LinkModule } from '@app/directives/link.directive';\r\nimport { ComponentStatesOnRoutesService } from '@app/services/component-states-on-routes.service';\r\nimport { FeatureSettingsStoreService } from '@app/services/feature-settings-store.service';\r\nimport { LicenseService } from '@app/services/license.service';\r\nimport { NewsService } from '@app/services/news.service';\r\nimport { UserLanguageTermService } from '@app/services/user-language-term.service';\r\nimport { Environment } from '@environments/interface.environment';\r\nimport { forkJoin, Observable, of, Subject, Subscription } from 'rxjs';\r\nimport { catchError, map, mergeMap, startWith, switchMap, tap } from 'rxjs/operators';\r\nimport { trigger, style, transition, animate } from '@angular/animations';\r\nimport { BaseTrackingService } from '@app/tracking/base-tracking.service';\r\nimport { TrackingEvent } from '@app/models/tracking-event';\r\nimport { Constants } from '@app/common/constants';\r\nimport { SwiperConfigInterface, SwiperModule } from 'ngx-swiper-wrapper';\r\n\r\n@Component({\r\n selector: 'app-compact-featured-news',\r\n templateUrl: './compact-featured-news.component.html',\r\n styleUrls: ['./compact-featured-news.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n encapsulation: ViewEncapsulation.None,\r\n animations: [\r\n trigger('slideInOut', [\r\n transition(':enter', [\r\n style({ transform: 'translateY(70%)' }),\r\n animate('200ms ease-in', style({ transform: 'translateY(0)' } )),\r\n ]),\r\n transition(':leave', [\r\n animate('200ms ease-out', style({ transform: 'translateY(100%)' }))\r\n ])\r\n ])\r\n ]\r\n})\r\nexport class CompactFeaturedNewsComponent implements OnInit, OnDestroy {\r\n\r\n @Input() amountOfDaysBackInTime = 365;\r\n @Input() amountOfNewsToDisplay = 0 ;\r\n @Input() titleMaxLength = 60;\r\n @Input() maxNumberOfShowMore = 2; // How may times can you press the show more button\r\n amountOfNewsToIncreaseWith = 0;\r\n fetchedAmountOfNews = 0;\r\n newsCenterUrl: string;\r\n amountOfNewsToDisplayCurrently: number;\r\n featuredNewsItems$: Observable>;\r\n loading = false;\r\n private moreNewsSubject = new Subject();\r\n private errorSubject$ = new Subject();\r\n featureSettings = this.featureSettingsStoreService.state;\r\n objectFitFallback = false;\r\n fetchFromGraph = true;\r\n isUserLicensed$: Observable;\r\n workplaceName: string;\r\n numberOfShowMoreClicks = 0;\r\n showNewsDesc = this.featureSettingsStoreService.state.showNewsDescription;\r\n isQuickView = false;\r\n amountOfNewsToDisplayConfigured = false;\r\n subscription: Subscription;\r\n componentName = 'Featured news';\r\n enableCompactDesign: boolean = this.featureSettingsStoreService.state.enableCompactDesign;\r\n\r\n config: SwiperConfigInterface = {\r\n // a11y: true,\r\n direction: 'horizontal',\r\n slidesPerView: 1,\r\n slideToClickedSlide: true,\r\n mousewheel: true,\r\n scrollbar: false,\r\n watchSlidesProgress: true,\r\n navigation: true,\r\n keyboard: true,\r\n pagination: true,\r\n centeredSlides: true,\r\n loop: true,\r\n roundLengths: true,\r\n // slidesOffsetBefore: 100,\r\n // slidesOffsetAfter: 100,\r\n spaceBetween: 10,\r\n breakpoints: {\r\n // when window width is >= 320px\r\n 320: {\r\n slidesPerView: 1.1\r\n },\r\n 576: {\r\n slidesPerView: 1\r\n }\r\n }\r\n};\r\n\r\n constructor(@Inject(CUSTOMERENVIRONMENT) private environment: Environment,\r\n @Inject(DOCUMENT) private document: Document,\r\n private service: NewsService,\r\n private router: Router,\r\n private componentEventService: ComponentStatesOnRoutesService,\r\n private featureSettingsStoreService: FeatureSettingsStoreService,\r\n public elementRef: ElementRef,\r\n private licenseService: LicenseService,\r\n private userLanguageTermService: UserLanguageTermService,\r\n private breakpointObserver: BreakpointObserver,\r\n @Optional() private trackingService?: BaseTrackingService) {\r\n this.workplaceName = this.featureSettingsStoreService.state.workplaceName;\r\n }\r\n\r\n ngOnInit() {\r\n\r\n this.amountOfNewsToIncreaseWith = this.amountOfNewsToDisplay;\r\n this.amountOfNewsToDisplayConfigured = this.amountOfNewsToDisplay > 0;\r\n // Vary amount of news to load based on screen size to ensure display is even\r\n this.subscription = this.breakpointObserver.observe(['(min-width: 1200px)', '(min-width: 768px)', '(min-width: 992px)', Breakpoints.Medium, Breakpoints.Large, Breakpoints.XLarge])\r\n .subscribe((state: BreakpointState) => {\r\n if (!this.amountOfNewsToDisplayConfigured) { // amountOfNewsToDisplay is not configured by customers\r\n if (state.breakpoints[Breakpoints.Medium]) {\r\n this.amountOfNewsToDisplay = 3;\r\n this.amountOfNewsToDisplayCurrently = this.amountOfNewsToDisplay;\r\n this.moreNewsSubject.next(this.amountOfNewsToDisplayCurrently + 1);\r\n } else {\r\n this.amountOfNewsToDisplay = 4;\r\n this.amountOfNewsToDisplayCurrently = this.amountOfNewsToDisplay;\r\n this.moreNewsSubject.next(this.amountOfNewsToDisplayCurrently + 1);\r\n }\r\n } else {\r\n if (state.breakpoints['(min-width: 992px)'] && !state.breakpoints['(min-width: 1200px)']) {\r\n this.amountOfNewsToDisplay = 4;\r\n this.amountOfNewsToDisplayCurrently = this.amountOfNewsToDisplay;\r\n } else if (state.breakpoints['(min-width: 768px)'] && !state.breakpoints['(min-width: 1200px)']) {\r\n this.amountOfNewsToDisplay = 2;\r\n this.amountOfNewsToDisplayCurrently = this.amountOfNewsToDisplay;\r\n // this.moreNewsSubject.next(this.amountOfNewsToDisplayCurrently + 1);\r\n } else if (state.breakpoints['(min-width: 1200px)']) {\r\n this.amountOfNewsToDisplay = 6;\r\n this.amountOfNewsToDisplayCurrently = this.amountOfNewsToDisplay;\r\n } else {\r\n this.amountOfNewsToDisplayCurrently = 6;\r\n }\r\n this.moreNewsSubject.next(this.amountOfNewsToDisplayCurrently + 1);\r\n }\r\n\r\n this.amountOfNewsToIncreaseWith = this.amountOfNewsToDisplay;\r\n });\r\n\r\n this.newsCenterUrl = `${this.featureSettingsStoreService.state.newsArchiveLink}`;\r\n this.amountOfNewsToDisplayCurrently = this.amountOfNewsToDisplay;\r\n\r\n const componentEvent = this.componentEventService.state.RouteMap.has(this.router.url) && this.componentEventService.state.RouteMap.get(this.router.url).find(x => x.ComponentId === this.elementRef.nativeElement.localName);\r\n const componentEventData = componentEvent ? componentEvent.Data as Array : undefined;\r\n\r\n if ('objectFit' in this.document.documentElement.style === false) {\r\n this.objectFitFallback = true;\r\n }\r\n\r\n const subjectsToListenOn$ = this.moreNewsSubject\r\n .pipe(map((amount) => {\r\n this.service.reloadAllTopNews();\r\n return Number.isInteger(amount) ? Number(amount) : this.amountOfNewsToDisplayCurrently + 1;\r\n }));\r\n\r\n this.featuredNewsItems$ = subjectsToListenOn$\r\n .pipe(\r\n startWith(this.amountOfNewsToDisplayCurrently + 1),\r\n switchMap((amount) => {\r\n this.loading = true;\r\n const userLanguageTerms$ = this.userLanguageTermService.getUserLanguageTerms();\r\n if (this.environment.enableWorkplaceLight) {\r\n // Workplace light enabled\r\n return this.licenseService.hasUserAny365License()\r\n .pipe(\r\n mergeMap(licensed => {\r\n if (licensed) {\r\n // Workplace light + SharePoint licensed\r\n return forkJoin([\r\n this.service.getTopNewsFromApi(amount, userLanguageTerms$),\r\n this.service.getModernTopNewsFromGraph(amount, userLanguageTerms$)\r\n ])\r\n .pipe(\r\n map(([apiItems, graphItems]) => {\r\n // Concat the results from sharepoint + api and resort them, the dates seem to still be strings so we have to parse them again\r\n return apiItems.concat(graphItems).sort((a, b) => new Date(b.PublishedDate).getTime() - new Date(a.PublishedDate).getTime());\r\n })\r\n );\r\n } else {\r\n // Only Workplace Light\r\n return this.service.getTopNewsFromApi(amount, userLanguageTerms$);\r\n }\r\n })\r\n );\r\n } else {\r\n // Only SharePoint\r\n return this.service.getModernTopNewsFromGraph(amount, userLanguageTerms$);\r\n }\r\n }),\r\n map(pages => {\r\n this.fetchedAmountOfNews = pages.length;\r\n if (this.fetchedAmountOfNews > this.amountOfNewsToDisplayCurrently) {\r\n pages = pages.slice(0, this.amountOfNewsToDisplayCurrently);\r\n }\r\n return pages.map(page => {\r\n if (componentEventData) {\r\n const foundNewsPage = componentEventData.find(ced => ced.Path === page.Path);\r\n if (foundNewsPage) {\r\n page.ShowNewOrModifiedBadge = true;\r\n }\r\n } else {\r\n page.ShowNewOrModifiedBadge = false;\r\n }\r\n return page;\r\n });\r\n }),\r\n tap(() => {\r\n this.loading = false;\r\n }),\r\n catchError(err => {\r\n this.errorSubject$.next(err);\r\n return of(null);\r\n }));\r\n }\r\n\r\n setFallBackStyle(newsItem: HTMLImageElement) {\r\n if (this.objectFitFallback) {\r\n newsItem.parentElement.style.backgroundImage = `url(${newsItem.src})`;\r\n newsItem.parentElement.style.backgroundSize = `cover`;\r\n newsItem.parentElement.style.backgroundPosition = `50% 50%`;\r\n return {\r\n 'display': `none`\r\n };\r\n }\r\n }\r\n\r\n truncate(text: string) {\r\n return Utilities.truncate(text, this.titleMaxLength);\r\n }\r\n\r\n showMoreNews() {\r\n this.numberOfShowMoreClicks++;\r\n this.amountOfNewsToDisplayCurrently = this.amountOfNewsToDisplayCurrently + this.amountOfNewsToIncreaseWith;\r\n this.moreNewsSubject.next(this.amountOfNewsToDisplayCurrently + 1);\r\n }\r\n\r\n showLessNews() {\r\n this.numberOfShowMoreClicks = 0;\r\n this.amountOfNewsToDisplayCurrently = this.amountOfNewsToDisplay;\r\n this.moreNewsSubject.next(this.amountOfNewsToDisplayCurrently + 1);\r\n this.scrollIntoFeatureView();\r\n }\r\n\r\n scrollIntoFeatureView() {\r\n const elementId = 'app-featured-news';\r\n const element = this.document.getElementById(elementId);\r\n\r\n if (element) {\r\n if (!/^(?:a|select|input|button|textarea)$/i.test(element.tagName)) {\r\n element.scrollIntoView();\r\n }\r\n element.focus();\r\n }\r\n }\r\n\r\n showNewsDescription(newsItem: NewsPage) {\r\n if (newsItem.hide !== undefined) {\r\n newsItem.hide = !newsItem.hide;\r\n } else {\r\n newsItem.hide = true;\r\n if (this.trackingService && this.trackingService.trackEvent) {\r\n const trackingEvent = new TrackingEvent({\r\n name: Constants.TRACKING_EVENT_TYPE_NEWS_DESCR_CLICK,\r\n properties: {\r\n href: newsItem.Path,\r\n label: newsItem.Title,\r\n componentId: this.elementRef.nativeElement.localName\r\n }\r\n });\r\n this.trackingService.trackEvent(trackingEvent);\r\n }\r\n }\r\n }\r\n\r\n getSenderTagString(newsItem: NewsPage) {\r\n return Utilities.getSenderTagString(newsItem);\r\n }\r\n\r\n getMobileClass() {\r\n return this.enableCompactDesign ? 'd-none d-lg-block d-md-block' : '';\r\n }\r\n\r\n onIndexChange(event) {\r\n console.log(event);\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.subscription?.unsubscribe();\r\n }\r\n}\r\n\r\n@NgModule({\r\n declarations: [CompactFeaturedNewsComponent],\r\n exports: [\r\n CompactFeaturedNewsComponent\r\n ],\r\n imports: [\r\n CommonModule,\r\n ImgSrcProxyModule,\r\n ActionLinkModule,\r\n ActionRouterLinkModule,\r\n TextPlaceholderModule,\r\n ErrorTemplatesModule,\r\n WidgetPlaceholderModule,\r\n MatButtonModule,\r\n LinkModule,\r\n RouterModule,\r\n SwiperModule\r\n ]\r\n})\r\nexport class CompactFeaturedNewsModule { }\r\n","
\r\n
\r\n
\r\n
\r\n \r\n \r\n
\r\n \r\n
\r\n
\r\n
\r\n \r\n \r\n \r\n \r\n
\r\n \r\n
\r\n
\r\n
\r\n
\r\n {{newsItem.PublishedDate | date}}\r\n \r\n 0)\">\r\n \r\n {{pageInfo.LikesCount}}\r\n \r\n 0)\">\r\n \r\n {{pageInfo.CommentsCount}}\r\n \r\n \r\n \r\n 0) || (!newsItem.IsSharePointNews && newsItem.LikesCount > 0)\">\r\n \r\n {{newsItem.LikesCount}}\r\n \r\n 0 || (!newsItem.IsSharePointNews && newsItem.CommentsCount > 0))\">\r\n \r\n {{newsItem.CommentsCount}}\r\n \r\n \r\n \r\n 0\"\r\n (click)=\"showChannelTagsPrintoutClick(newsItem)\" title=\"{{getChannelsString(newsItem)}}\">\r\n \r\n \r\n
\r\n
\r\n
\r\n {{getSenderTagString(newsItem)}}\r\n
\r\n
\r\n \r\n
\r\n \r\n \r\n \r\n \r\n {{getChannelsString(newsItem)}}\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n \r\n
\r\n \r\n
\r\n
\r\n \r\n {{truncate(newsItem.Description, 180)}}\r\n \r\n
\r\n \r\n \r\n Open this page in sharepoint\r\n \r\n \r\n
\r\n
\r\n
\r\n
\r\n
\r\n \r\n \r\n \r\n
\r\n
\r\n \r\n
\r\n
\r\n \r\n \r\n
\r\n \r\n
\r\n
\r\n
\r\n \r\n \r\n \r\n \r\n
\r\n \r\n
\r\n
\r\n
\r\n
\r\n {{newsItem.PublishedDate | date}}\r\n \r\n 0)\">\r\n \r\n {{pageInfo.LikesCount}}\r\n \r\n 0)\">\r\n \r\n {{pageInfo.CommentsCount}}\r\n \r\n \r\n \r\n 0) || (!newsItem.IsSharePointNews && newsItem.LikesCount > 0)\">\r\n \r\n {{newsItem.LikesCount}}\r\n \r\n 0 || (!newsItem.IsSharePointNews && newsItem.CommentsCount > 0))\">\r\n \r\n {{newsItem.CommentsCount}}\r\n \r\n \r\n \r\n 0\"\r\n (click)=\"showChannelTagsPrintoutClick(newsItem)\" title=\"{{getChannelsString(newsItem)}}\">\r\n \r\n \r\n
\r\n
\r\n
\r\n {{getSenderTagString(newsItem)}}\r\n
\r\n
\r\n \r\n
\r\n \r\n \r\n \r\n \r\n {{getChannelsString(newsItem)}}\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n \r\n
\r\n \r\n
\r\n
\r\n \r\n {{truncate(newsItem.Description, 180)}}\r\n \r\n
\r\n \r\n \r\n Open this page in sharepoint\r\n \r\n \r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n","import { CommonModule, DOCUMENT } from '@angular/common';\r\nimport { Component, Inject, Input, NgModule, OnInit, Optional, ElementRef, ViewEncapsulation } from '@angular/core';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { Utilities } from '@app/common/utilities';\r\nimport { ActionLinkModule } from '@app/components/actions/action-link/action-link.component';\r\nimport { ErrorTemplatesModule } from '@app/components/error-templates/error-templates.component';\r\nimport { TextPlaceholderModule } from '@app/components/text-placeholder/text-placeholder.component';\r\nimport { WidgetPlaceholderModule } from '@app/components/widget-placeholder/widget-placeholder.component';\r\nimport { ImgSrcProxyModule } from '@app/directives/img-src-proxy.directive';\r\nimport { NewsPage } from '@app/models/news-page';\r\nimport { LinkModule } from '@app/directives/link.directive';\r\nimport { FeatureSettingsStoreService } from '@app/services/feature-settings-store.service';\r\nimport { BaseTrackingService } from '@app/tracking/base-tracking.service';\r\nimport { TrackingEvent } from '@app/models/tracking-event';\r\nimport { Constants } from '@app/common/constants';\r\nimport { trigger, transition, style, animate } from '@angular/animations';\r\nimport { SwiperConfigInterface, SwiperModule } from 'ngx-swiper-wrapper';\r\n\r\n@Component({\r\n selector: 'app-compact-news-card-list',\r\n templateUrl: './compact-news-card-list.component.html',\r\n styleUrls: ['./compact-news-card-list.component.scss'],\r\n animations: [\r\n trigger('slideInOut', [\r\n transition(':enter', [\r\n style({ transform: 'translateY(100%)' }),\r\n animate('200ms ease-in', style({ transform: 'translateY(0)' })),\r\n ]),\r\n transition(':leave', [\r\n animate('200ms ease-out', style({ transform: 'translateY(100%)' }))\r\n ])\r\n ])\r\n ],\r\n encapsulation: ViewEncapsulation.None,\r\n})\r\nexport class CompactNewsCardListComponent implements OnInit {\r\n\r\n @Input() personalNewsItems: Array;\r\n @Input() titleMaxLength = 70;\r\n featureSettings = this.featureStore.state;\r\n objectFitFallback = false;\r\n showNewsDesc = this.featureStore.state.showNewsDescription;\r\n isQuickView = false;\r\n showChannelTagsPrintout = {};\r\n enableCompactDesign: boolean = this.featureStore.state.enableCompactDesign;\r\n\r\n config: SwiperConfigInterface = {\r\n // a11y: true,\r\n direction: 'horizontal',\r\n slidesPerView: 1,\r\n slideToClickedSlide: true,\r\n mousewheel: true,\r\n scrollbar: false,\r\n watchSlidesProgress: true,\r\n navigation: true,\r\n keyboard: true,\r\n pagination: true,\r\n centeredSlides: true,\r\n loop: true,\r\n roundLengths: true,\r\n // slidesOffsetBefore: 100,\r\n // slidesOffsetAfter: 100,\r\n spaceBetween: 10,\r\n breakpoints: {\r\n // when window width is >= 320px\r\n 320: {\r\n slidesPerView: 1.1\r\n },\r\n 576: {\r\n slidesPerView: 1\r\n }\r\n }\r\n};\r\n\r\n constructor(@Inject(DOCUMENT) private document: Document,\r\n private featureStore: FeatureSettingsStoreService,\r\n public elementRef: ElementRef,\r\n @Optional() private trackingService?: BaseTrackingService) {\r\n }\r\n\r\n ngOnInit(): void {\r\n if ('objectFit' in this.document.documentElement.style === false) {\r\n this.objectFitFallback = true;\r\n }\r\n }\r\n\r\n setFallBackStyle(newsItem: HTMLImageElement) {\r\n if (this.objectFitFallback) {\r\n if (newsItem) {\r\n newsItem.parentElement.style.backgroundImage = `url(${newsItem.src})`;\r\n newsItem.parentElement.style.backgroundSize = `cover`;\r\n newsItem.parentElement.style.backgroundPosition = `50% 50%`;\r\n }\r\n return {\r\n 'display': `none`\r\n };\r\n }\r\n }\r\n\r\n showNewsDescription(newsItem: NewsPage) {\r\n if (newsItem.hide !== undefined) {\r\n newsItem.hide = !newsItem.hide;\r\n } else {\r\n newsItem.hide = true;\r\n if (this.trackingService && this.trackingService.trackEvent) {\r\n const trackingEvent = new TrackingEvent({\r\n name: Constants.TRACKING_EVENT_TYPE_NEWS_DESCR_CLICK,\r\n properties: {\r\n href: newsItem.Path,\r\n label: newsItem.Title,\r\n componentId: this.elementRef.nativeElement.localName\r\n }\r\n });\r\n this.trackingService.trackEvent(trackingEvent);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Creates a user friendly string by concatenting the news item channel labels\r\n * @param newsItem Newsitem to get channels from\r\n * @returns string for displaying the tags for users\r\n */\r\n getChannelsString(newsItem: NewsPage) {\r\n if (newsItem.Channels && newsItem.Channels.length) {\r\n let channelsString = '';\r\n for (let i = 0; i < newsItem.Channels.length; i++) {\r\n if (i > 0) {\r\n channelsString += ', ';\r\n }\r\n channelsString += '#' + newsItem.Channels[i].Label;\r\n }\r\n return channelsString;\r\n }\r\n return null;\r\n }\r\n\r\n getSenderTagString(newsItem: NewsPage) {\r\n return Utilities.getSenderTagString(newsItem);\r\n }\r\n\r\n /**\r\n * Toggles if the news tags should be shown in the UI, needed since there is no title attribute on mobile devices\r\n * @param newsItem Newsitem to get channels from\r\n */\r\n showChannelTagsPrintoutClick(newsItem: NewsPage) {\r\n // Path is unique, no ID on the NewsPage object\r\n this.showChannelTagsPrintout[newsItem.Path] = !this.showChannelTagsPrintout[newsItem.Path];\r\n }\r\n\r\n truncate(text: string, length = this.titleMaxLength) {\r\n return Utilities.truncate(text, length);\r\n }\r\n\r\n getMobileClass() {\r\n return this.enableCompactDesign ? 'd-none d-lg-block d-md-block' : '';\r\n }\r\n\r\n onIndexChange(event) {\r\n console.log(event);\r\n }\r\n\r\n}\r\n\r\n@NgModule({\r\n declarations: [\r\n CompactNewsCardListComponent\r\n ],\r\n exports: [\r\n CompactNewsCardListComponent\r\n ],\r\n imports: [\r\n CommonModule,\r\n LinkModule,\r\n ImgSrcProxyModule,\r\n ErrorTemplatesModule,\r\n TextPlaceholderModule,\r\n WidgetPlaceholderModule,\r\n ActionLinkModule,\r\n MatButtonModule,\r\n SwiperModule\r\n ]\r\n})\r\nexport class CompactNewsCardListModule { }\r\n","
\r\n \r\n \r\n Go to the news center\r\n \r\n \r\n \r\n Go to the news center\r\n \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

No news could be found according to your channel selections.

\r\n
\r\n
\r\n\r\n
\r\n
\r\n \r\n
\r\n
\r\n
\r\n
\r\n\r\n \r\n
\r\n \r\n
\r\n
\r\n\r\n \r\n
\r\n For older news, open News Center\r\n For older news, open News Center\r\n
\r\n
\r\n
\r\n","import { CommonModule, DOCUMENT } from '@angular/common';\r\nimport { ChangeDetectionStrategy, Component, Inject, Input, NgModule, OnInit } from '@angular/core';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { RouterModule } from '@angular/router';\r\nimport { CUSTOMERENVIRONMENT } from '@app/common/app-tokens';\r\nimport { NewsModePersonalNews } from '@app/common/news-mode';\r\nimport { ActionLinkModule } from '@app/components/actions/action-link/action-link.component';\r\nimport { ActionRouterLinkModule } from '@app/components/actions/action-router-link/action-router-link.component';\r\nimport { ErrorTemplatesModule } from '@app/components/error-templates/error-templates.component';\r\nimport { TextPlaceholderModule } from '@app/components/text-placeholder/text-placeholder.component';\r\nimport { WidgetPlaceholderModule } from '@app/components/widget-placeholder/widget-placeholder.component';\r\nimport { NewsPage } from '@app/models/news-page';\r\nimport { User } from '@app/models/user';\r\nimport { UserLanguageTerm } from '@app/models/user-language-term';\r\nimport { LinkModule } from '@app/directives/link.directive';\r\nimport { FeatureSettingsStoreService } from '@app/services/feature-settings-store.service';\r\nimport { LicenseService } from '@app/services/license.service';\r\nimport { MyFollowedSitesService } from '@app/services/my-followed-sites.service';\r\nimport { NewsService } from '@app/services/news.service';\r\nimport { SiteService } from '@app/services/site.service';\r\nimport { UserChannelTermsService } from '@app/services/user-channel-terms.service';\r\nimport { UserLanguageTermService } from '@app/services/user-language-term.service';\r\nimport { UserService } from '@app/services/user.service';\r\nimport { Environment } from '@environments/interface.environment';\r\nimport { combineLatest, Observable, of, race, Subject } from 'rxjs';\r\nimport { catchError, map, mergeMap, startWith, switchMap } from 'rxjs/operators';\r\nimport { CompactNewsCardListModule } from '../compact-news-card-list/compact-news-card-list.component';\r\n\r\n@Component({\r\n selector: 'app-compact-your-news',\r\n templateUrl: './compact-your-news.component.html',\r\n styleUrls: ['./compact-your-news.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush\r\n})\r\nexport class CompactYourNewsComponent implements OnInit {\r\n @Input() amountOfDaysBackInTime = 365;\r\n @Input() amountOfNewsToDisplay = 6;\r\n @Input() amountOfFollowedSitesToGet = 100; // max is 100, NOTE: we need to add paginated api calls if we should be able to fetch more\r\n @Input() preambleTextMaxLength = 140;\r\n @Input() maxNumberOfShowMore = 2; // How may times can you press the show more button\r\n\r\n fetchedAmountOfNews = 0;\r\n followedSiteNewsBatch = 50; // set to 50 because it gets very slow otherwise.\r\n amountOfNewsToIncreaseWith = 0;\r\n newsCenterUrl: string;\r\n amountOfNewsToDisplayCurrently = 0;\r\n personalNewsItems$: Observable>;\r\n personalNewsFromSharePoint$: Observable>;\r\n private errorSubject$ = new Subject();\r\n loading = false;\r\n featureSettings = this.featureStore.state;\r\n private moreNewsSubject = new Subject();\r\n numberOfShowMoreClicks = 0;\r\n componentName = 'Your news';\r\n enableCompactDesign: boolean = this.featureStore.state.enableCompactDesign;\r\n\r\n constructor(@Inject(CUSTOMERENVIRONMENT) private environment: Environment,\r\n private service: NewsService,\r\n private featureStore: FeatureSettingsStoreService,\r\n private followedSitesService: MyFollowedSitesService,\r\n private siteService: SiteService,\r\n private userService: UserService,\r\n private licenseService: LicenseService,\r\n private userChannelTermsService: UserChannelTermsService,\r\n private userLanguageTermsService: UserLanguageTermService,\r\n @Inject(DOCUMENT) private document: Document) { }\r\n\r\n ngOnInit() {\r\n\r\n this.amountOfNewsToIncreaseWith = this.amountOfNewsToDisplay;\r\n this.amountOfNewsToDisplayCurrently = this.amountOfNewsToDisplay;\r\n\r\n this.newsCenterUrl = `${this.featureStore.state.newsArchiveLink}`;\r\n\r\n const userChannelTerms$ = this.userChannelTermsService.getUserChannelTerms();\r\n\r\n const userLanguageTerms$ = this.userLanguageTermsService.getUserLanguageTerms();\r\n\r\n const user$ = this.userService.getOrCreateMe();\r\n\r\n const subjectsToListenOn$ = race([this.moreNewsSubject, this.service.reloadAllPersonalNews$])\r\n .pipe(map((amount) => {\r\n return Number.isInteger(amount) ? Number(amount) : this.amountOfNewsToDisplayCurrently + 1;\r\n }));\r\n\r\n this.personalNewsFromSharePoint$ = this.licenseService.hasUserAny365License()\r\n .pipe(\r\n mergeMap(isLicensed => {\r\n if (isLicensed) {\r\n return subjectsToListenOn$\r\n .pipe(\r\n startWith(this.amountOfNewsToDisplayCurrently + 1),\r\n mergeMap((amount) => {\r\n this.loading = true;\r\n\r\n const myPersonalNewsFromGraph$ = this.service.getMyModernPersonalNewsFromGraph(userChannelTerms$, userLanguageTerms$);\r\n\r\n if (this.featureStore.state.newsModePersonalNews === NewsModePersonalNews.GraphFromNewsCenterSiteAndSearchFromFollowedSites) {\r\n\r\n const newsfromMyFollowedSites$ = this.getNewsFromMyFollowedSites$(user$, amount, userLanguageTerms$);\r\n\r\n return combineLatest([myPersonalNewsFromGraph$, newsfromMyFollowedSites$])\r\n .pipe(\r\n map(([personalNews, newsFromFollowedSites]) => {\r\n return personalNews.concat(newsFromFollowedSites);\r\n })\r\n );\r\n } else if (this.featureStore.state.newsModePersonalNews === NewsModePersonalNews.SearchNewsFromAnySiteWithChannelField) {\r\n return this.service.getPersonalModernNewsFromAllSitesFromSearch(userChannelTerms$, userLanguageTerms$, amount);\r\n } else {\r\n return myPersonalNewsFromGraph$;\r\n }\r\n }),\r\n map((pages) => {\r\n if (this.featureStore.state.newsModePersonalNews === NewsModePersonalNews.GraphFromNewsCenterSiteAndSearchFromFollowedSites\r\n ||\r\n this.featureStore.state.newsModePersonalNews === NewsModePersonalNews.SearchNewsFromAnySiteWithChannelField) {\r\n // only fetch site names when news mode that fetch from different sites\r\n // Also fetch likes and comments from individual site page instead search\r\n pages.forEach(page => {\r\n if (page && (!page.SiteName || !page.SiteUrl)) {\r\n page.SiteInfo$ = this.siteService.getSiteInfoFromUrl(page.Path);\r\n page.PageInfo$ = this.service.getModernNewsItemInfoFromPagePath(page);\r\n }\r\n });\r\n }\r\n return pages;\r\n }));\r\n } else {\r\n return of([]);\r\n }\r\n })\r\n );\r\n\r\n this.personalNewsItems$ = subjectsToListenOn$\r\n .pipe(\r\n startWith(this.amountOfNewsToDisplayCurrently + 1),\r\n switchMap(amount => {\r\n // If amount has changed we don't need to wait for the old call to fetch/concat/sort etc, cancel it and switch to the new\r\n // If workplace light is enabled concat with workplace light news\r\n if (this.environment.enableWorkplaceLight) {\r\n return combineLatest([\r\n this.personalNewsFromSharePoint$,\r\n this.service.getPersonalNewsFromApi(userChannelTerms$, userLanguageTerms$, amount)])\r\n .pipe(\r\n map(([personalNews, newsFromApi]) => {\r\n return personalNews.concat(newsFromApi);\r\n })\r\n );\r\n } else {\r\n return this.personalNewsFromSharePoint$;\r\n }\r\n }),\r\n map((pages) => {\r\n // Since pages can be concatinated from multiple sources it could be unsorted\r\n pages = pages.sort((a, b) => {\r\n return new Date(b.PublishedDate).getTime() - new Date(a.PublishedDate).getTime();\r\n });\r\n this.fetchedAmountOfNews = pages.length;\r\n if (this.fetchedAmountOfNews > this.amountOfNewsToDisplayCurrently) {\r\n pages = pages.slice(0, this.amountOfNewsToDisplayCurrently);\r\n }\r\n\r\n this.loading = false;\r\n return pages;\r\n }),\r\n catchError(err => {\r\n this.errorSubject$.next(err);\r\n return of(null);\r\n }));\r\n }\r\n\r\n private getNewsFromMyFollowedSites$(user$: Observable, amount: number, userLanguageTerms$: Observable) {\r\n return user$\r\n .pipe(\r\n mergeMap(user => {\r\n if (user && user.ShowNewsFromFollowedSites) {\r\n // the user has selected/deselected to show news from followed sites\r\n return this.followedSitesService\r\n .getMyFollowedSitesFromSpHome(0, this.amountOfFollowedSitesToGet)\r\n .pipe(\r\n map(followedSites => followedSites.map(s => s.OriginalUrl))\r\n );\r\n } else {\r\n return of([]);\r\n }\r\n }),\r\n mergeMap(urls => {\r\n const amountToFetch = this.followedSiteNewsBatch <= amount ? amount : this.followedSiteNewsBatch;\r\n return this.service.getModernNewsFromAllSitesExceptNewsCenterFromSearch(userLanguageTerms$, amountToFetch)\r\n .pipe(\r\n map(\r\n // we could filter on url directly in the getModernNewsFromAllSitesExceptNewsCenterFromSearch request, but it seems to give a 400 error if we have a lot of followed sites, so we filter manually instead\r\n newsFromSearch => {\r\n return newsFromSearch.filter(page => urls.indexOf(page.SiteUrl) !== -1);\r\n }));\r\n }));\r\n }\r\n\r\n showMoreNews() {\r\n this.numberOfShowMoreClicks++;\r\n this.amountOfNewsToDisplayCurrently = this.amountOfNewsToDisplayCurrently + this.amountOfNewsToIncreaseWith;\r\n this.loading = true;\r\n if (this.featureStore.state.newsModePersonalNews === NewsModePersonalNews.GraphFromNewsCenterSite) {\r\n this.moreNewsSubject.next();\r\n } else {\r\n this.moreNewsSubject.next(this.amountOfNewsToDisplayCurrently + 1);\r\n }\r\n }\r\n\r\n showLessNews() {\r\n this.numberOfShowMoreClicks = 0;\r\n this.amountOfNewsToDisplayCurrently = this.amountOfNewsToDisplay;\r\n this.moreNewsSubject.next(this.amountOfNewsToDisplayCurrently + 1);\r\n this.scrollIntoFeatureView();\r\n }\r\n\r\n scrollIntoFeatureView() {\r\n const elementId = 'app-my-news';\r\n const element = this.document.getElementById(elementId);\r\n\r\n if (element) {\r\n if (!/^(?:a|select|input|button|textarea)$/i.test(element.tagName)) {\r\n element.scrollIntoView();\r\n }\r\n element.focus();\r\n }\r\n }\r\n\r\n}\r\n\r\n@NgModule({\r\n declarations: [CompactYourNewsComponent],\r\n exports: [CompactYourNewsComponent],\r\n imports: [\r\n CommonModule,\r\n CompactNewsCardListModule,\r\n LinkModule,\r\n ActionLinkModule,\r\n ActionRouterLinkModule,\r\n MatButtonModule,\r\n RouterModule,\r\n ErrorTemplatesModule,\r\n TextPlaceholderModule,\r\n WidgetPlaceholderModule\r\n ]\r\n})\r\nexport class CompactYourNewsModule { }\r\n","
\r\n
\r\n

Featured news

\r\n

Read the featured news from {{workplaceName}}! When you click on a post, it will open in a new tab.

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

Your news

\r\n

Your personal feed. Update your channels on settings page.

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

Featured news

\r\n

Read the featured news from {{workplaceName}}! When you click on a post, it will open in a new tab.

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

Your news

\r\n

Your personal feed. Update your channels on settings page.

\r\n
\r\n \r\n
\r\n\r\n
\r\n\r\n\r\n\r\n \r\n","import { CommonModule } from '@angular/common';\r\nimport { Component, NgModule, OnInit } from '@angular/core';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { RouterModule } from '@angular/router';\r\nimport { ActionRouterLinkModule } from '@app/components/actions/action-router-link/action-router-link.component';\r\nimport { CompactFeaturedNewsModule } from '@app/components/compact-featured-news/compact-featured-news.component';\r\nimport { CompactYourNewsModule } from '@app/components/compact-your-news/compact-your-news.component';\r\nimport { LinkModule } from '@app/directives/link.directive';\r\nimport { FeatureSettingsStoreService } from '@app/services/feature-settings-store.service';\r\n\r\n@Component({\r\n selector: 'app-news-layout',\r\n templateUrl: './news-layout.component.html',\r\n styleUrls: ['./news-layout.component.scss']\r\n})\r\nexport class NewsLayoutComponent implements OnInit {\r\n\r\n newsCenterUrl: string;\r\n cardsGridLayoutClass: string;\r\n workplaceName: string;\r\n selectedIndex = 0;\r\n constructor(private featureSettingsStoreService: FeatureSettingsStoreService) {\r\n this.newsCenterUrl = `${this.featureSettingsStoreService.state.newsArchiveLink}`;\r\n this.workplaceName = this.featureSettingsStoreService.state.workplaceName;\r\n }\r\n\r\n ngOnInit(): void {\r\n }\r\n\r\n}\r\n\r\n@NgModule({\r\n declarations: [NewsLayoutComponent],\r\n exports: [\r\n NewsLayoutComponent\r\n ],\r\n imports: [\r\n CommonModule,\r\n LinkModule,\r\n CompactYourNewsModule,\r\n MatButtonModule,\r\n CompactFeaturedNewsModule,\r\n RouterModule,\r\n ActionRouterLinkModule\r\n ]\r\n})\r\nexport class NewsLayoutModule { }\r\n","

Birthday calendar

\r\n\r\n\r\n
0\" class=\"mt-2 compact-birthday-component-container\">\r\n \r\n
\r\n
\r\n\r\n
4\" class=\"row justify-content-start\">\r\n
\r\n \r\n
\r\n
\r\n \r\n \r\n \r\n
\r\n
\r\n \r\n
\r\n
\r\n\r\n\r\n
\r\n \r\n
\r\n \r\n
\r\n \r\n
\r\n
\r\n
\r\n\r\n","import { CommonModule } from '@angular/common';\r\nimport { Component, EventEmitter, Inject, Input, NgModule, OnInit, Output } from '@angular/core';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { CUSTOMERENVIRONMENT, WINDOW } from '@app/common/app-tokens';\r\nimport { Utilities } from '@app/common/utilities';\r\nimport { BreakPoints } from '@app/common/breakpoints';\r\nimport { ErrorTemplatesModule } from '@app/components/error-templates/error-templates.component';\r\nimport { WidgetPlaceholderModule } from '@app/components/widget-placeholder/widget-placeholder.component';\r\nimport { SearchResult } from '@app/models/search-result';\r\nimport { LinkModule } from '@app/directives/link.directive';\r\nimport { SafeModule } from '@app/pipes/safe.pipe';\r\nimport { SearchService } from '@app/services/search.service';\r\nimport { UserService } from '@app/services/user.service';\r\nimport { Environment } from '@environments/interface.environment';\r\nimport { formatISO } from 'date-fns';\r\nimport { Observable, of, Subject } from 'rxjs';\r\nimport { catchError, concatMap, map, startWith, tap } from 'rxjs/operators';\r\nimport { FeatureSettingsStoreService } from '@app/services/feature-settings-store.service';\r\n\r\n@Component({\r\n selector: 'app-compact-birthdays',\r\n templateUrl: './compact-birthdays.component.html',\r\n styleUrls: ['./compact-birthdays.component.scss']\r\n})\r\nexport class CompactBirthdaysComponent implements OnInit {\r\n\r\n // Amount of birthdays to display on each row\r\n @Input() useTeamsCongratulations = true;\r\n\r\n amountOfBirthdaysToDisplay: number;\r\n amountOfBirthdaysToIncreaseWith: number;\r\n amountOfBirthdaysToDisplayCurrently: number;\r\n\r\n loading = false;\r\n birthdayPersonsToday$: Observable>;\r\n today = new Date();\r\n errorSubject$ = new Subject();\r\n moreBirthdaysSubject = new Subject();\r\n fetchedAmount = 0;\r\n dateToQuery: string;\r\n componentName = 'Your birthday';\r\n startIndex = 0;\r\n numberOfShowMoreClicks = 0;\r\n showNext = false;\r\n onLoad = true;\r\n sliced = false;\r\n @Output() hideBirthdays = new EventEmitter();\r\n\r\n constructor(private searchService: SearchService,\r\n private userService: UserService,\r\n @Inject(CUSTOMERENVIRONMENT) private environment: Environment,\r\n @Inject(WINDOW) private window: Window,\r\n private featureSettingsStoreService: FeatureSettingsStoreService) { }\r\n\r\n ngOnInit() {\r\n\r\n // Set querydate to ask for year 2000 since the property SPS-Birthday always stores the birthday date with year 2000.\r\n // The date format for queries should be in this format 2000-MM-dd (ISO8601).\r\n // For development purpose we set this to 21 november becasue we know we'll get some values then.\r\n const date = this.environment.production ? new Date(2000, new Date().getMonth(), new Date().getDate()) : new Date(2000, 11, 17);\r\n this.dateToQuery = formatISO(date, { representation: 'date' });\r\n\r\n // Set amount to load dynamically based on screen size\r\n const breakPoint = Utilities.getCurrentBootstrapBreakpoint(this.window);\r\n this.amountOfBirthdaysToDisplay = 4;\r\n if (breakPoint === BreakPoints.xxxl || breakPoint === BreakPoints.xxl) {\r\n this.amountOfBirthdaysToDisplay = 6;\r\n }\r\n if (breakPoint === BreakPoints.xs) {\r\n this.amountOfBirthdaysToDisplay = 3;\r\n }\r\n this.amountOfBirthdaysToDisplay = this.featureSettingsStoreService.state.enableCompactDesign ? 4 : this.amountOfBirthdaysToDisplay;\r\n this.amountOfBirthdaysToIncreaseWith = this.amountOfBirthdaysToDisplay;\r\n this.amountOfBirthdaysToDisplayCurrently = this.amountOfBirthdaysToDisplay;\r\n\r\n this.birthdayPersonsToday$ = this.moreBirthdaysSubject\r\n .pipe(\r\n startWith(this.amountOfBirthdaysToDisplayCurrently + 1),\r\n concatMap((amount) => {\r\n this.loading = true;\r\n return this.searchService.getPeopleWithBirthdayDate(this.dateToQuery, amount);\r\n }),\r\n map((results) => {\r\n this.fetchedAmount = results.length;\r\n\r\n if (results.length === 0) {\r\n this.hideBirthdays.emit(true);\r\n } else {\r\n this.hideBirthdays.emit(false);\r\n }\r\n if (this.onLoad) {\r\n results = results.slice(0, this.amountOfBirthdaysToDisplayCurrently);\r\n } else {\r\n if (this.showNext) {\r\n results = results.slice(this.startIndex, this.startIndex + 4);\r\n } else {\r\n\r\n if (!this.sliced) {\r\n this.sliced = true;\r\n results = results.slice(this.startIndex - 4, this.startIndex);\r\n }\r\n }\r\n }\r\n return results.map(result => {\r\n if (result.WorkEmail) {\r\n result.photoUrl$ = this.userService.getUserPhotoByUpn(result.WorkEmail);\r\n }\r\n return result;\r\n });\r\n }),\r\n tap(() => {\r\n this.loading = false;\r\n }),\r\n catchError(err => {\r\n this.errorSubject$.next(err);\r\n return of(null);\r\n }));\r\n }\r\n\r\n getPreferredNameLetters(preferredName: string) {\r\n return Utilities.generateInitials(preferredName);\r\n }\r\n\r\n clickShowNext() {\r\n this.numberOfShowMoreClicks++;\r\n this.startIndex = this.amountOfBirthdaysToDisplayCurrently * this.numberOfShowMoreClicks;\r\n this.showNext = true;\r\n this.onLoad = false;\r\n\r\n this.amountOfBirthdaysToDisplayCurrently = this.amountOfBirthdaysToDisplayCurrently + this.amountOfBirthdaysToIncreaseWith;\r\n this.moreBirthdaysSubject.next(this.amountOfBirthdaysToDisplayCurrently + 1);\r\n }\r\n\r\n clickShowPrevious() {\r\n this.amountOfBirthdaysToDisplayCurrently = this.amountOfBirthdaysToDisplay;\r\n this.showNext = false;\r\n this.onLoad = false;\r\n\r\n this.amountOfBirthdaysToDisplayCurrently = this.amountOfBirthdaysToDisplay;\r\n this.moreBirthdaysSubject.next(this.amountOfBirthdaysToDisplayCurrently + 1);\r\n this.numberOfShowMoreClicks -= 1; // 1\r\n this.startIndex -= 4;\r\n }\r\n}\r\n\r\n@NgModule({\r\n declarations: [CompactBirthdaysComponent],\r\n exports: [CompactBirthdaysComponent],\r\n imports: [\r\n CommonModule,\r\n WidgetPlaceholderModule,\r\n LinkModule,\r\n MatButtonModule,\r\n ErrorTemplatesModule,\r\n SafeModule\r\n ],\r\n})\r\nexport class CompactBirthdaysModule { }\r\n","export interface RestaurantMenu {\r\n Id: number;\r\n Restaurant: Restaurant;\r\n RestaurantId: number;\r\n Year: number;\r\n WeekNumber: number;\r\n Monday: string;\r\n Tuesday: string;\r\n Wednesday: string;\r\n Thursday: string;\r\n Friday: string;\r\n Saturday: string;\r\n Sunday: string;\r\n AllWeek: string;\r\n}\r\n\r\nexport interface Restaurant {\r\n // Only used client side to destinguish a restaurant that matches with the users selected channels\r\n UserChannelMatched: boolean;\r\n Id: number;\r\n Name: string;\r\n Address: string;\r\n ChannelTermRestaurants: Array;\r\n}\r\n\r\nexport interface ChannelTermRestaurant {\r\n ChannelTermId: string;\r\n RestaurantId: number;\r\n}\r\n\r\nexport class WeeklyRestaurantMenu {\r\n WeekNumber: number;\r\n WeekDay: string;\r\n menu: Array;\r\n constructor(opt?: Partial) {\r\n Object.assign(this, opt);\r\n }\r\n}\r\n\r\nexport class MenuText {\r\n value: string;\r\n constructor(opt?: Partial) {\r\n Object.assign(this, opt);\r\n }\r\n}\r\n","

Restaurant menu

\r\n
\r\n
\r\n Restaurant:\r\n
\r\n
\r\n \r\n {{restaurant.Name}}\r\n \r\n
\r\n
\r\n\r\n
\r\n
    \r\n
  • \r\n
    \r\n
    \r\n
    W {{restaurantMenu.WeekNumber}}
    \r\n
    {{restaurantMenu.WeekDay | slice:0:3}}
    \r\n
    \r\n

    \r\n {{truncate(menu.value)}}\r\n

    \r\n
    \r\n
  • \r\n
\r\n
\r\n \r\n

There are no menus for the restaurant this week.

\r\n
\r\n
\r\n
\r\n\r\n
4\">\r\n
\r\n \r\n
\r\n
\r\n \r\n \r\n \r\n
\r\n
\r\n \r\n
\r\n
\r\n\r\n\r\n
\r\n \r\n
\r\n \r\n
\r\n \r\n
\r\n
\r\n
\r\n\r\n","import { CommonModule } from '@angular/common';\r\nimport { Component, EventEmitter, NgModule, OnInit, Output } from '@angular/core';\r\nimport { MatSelectChange, MatSelectModule } from '@angular/material/select';\r\nimport { Utilities } from '@app/common/utilities';\r\nimport { TextPlaceholderModule } from '@app/components/text-placeholder/text-placeholder.component';\r\nimport { WidgetPlaceholderModule } from '@app/components/widget-placeholder/widget-placeholder.component';\r\nimport { MenuText, Restaurant, RestaurantMenu, WeeklyRestaurantMenu } from '@app/models/restaurant-menu';\r\nimport { LinkModule } from '@app/directives/link.directive';\r\nimport { RestaurantMenuService } from '@app/services/restaurant-menu.service';\r\nimport { RestaurantService } from '@app/services/restaurant.service';\r\nimport { UserChannelTermsService } from '@app/services/user-channel-terms.service';\r\nimport { endOfISOWeek, getISOWeek, startOfISOWeek } from 'date-fns';\r\nimport { BehaviorSubject, EMPTY, forkJoin, Observable } from 'rxjs';\r\nimport { map, mergeMap, tap } from 'rxjs/operators';\r\nimport { MatButtonModule } from '@angular/material/button';\r\n\r\n@Component({\r\n selector: 'app-compact-restaurant-menu',\r\n templateUrl: './compact-restaurant-menu.component.html',\r\n styleUrls: ['./compact-restaurant-menu.component.scss']\r\n})\r\nexport class CompactRestaurantMenuComponent implements OnInit {\r\n\r\n private changeSubject = new BehaviorSubject(0);\r\n selectedRestaurant: number;\r\n restaurants$: Observable;\r\n restaurantMenus$: Observable;\r\n currentWeekNumber: number;\r\n startOfISOWeek: Date;\r\n endOfISOWeek: Date;\r\n weeks: WeeklyRestaurantMenu[];\r\n menuCardsToDisplay: WeeklyRestaurantMenu[];\r\n numberOfMenuCardPerLoad = 5;\r\n currentMenusToShow: WeeklyRestaurantMenu[];\r\n startIndex = 0;\r\n numberOfShowMoreClicks = 0;\r\n @Output() hideRestaurantMenu = new EventEmitter();\r\n\r\n constructor(private restaurantService: RestaurantService,\r\n private userChannelTermsService: UserChannelTermsService,\r\n private lunchMenuService: RestaurantMenuService) { }\r\n\r\n handleSelection(event: MatSelectChange) {\r\n this.changeSubject.next(event.value);\r\n }\r\n\r\n truncate(text: string) {\r\n return Utilities.truncate(text, 100);\r\n }\r\n\r\n ngOnInit() {\r\n // we treat week number according to ISO-8601 https://date-fns.org/docs/getISOWeek\r\n this.currentWeekNumber = getISOWeek(new Date());\r\n this.startOfISOWeek = startOfISOWeek(new Date());\r\n this.endOfISOWeek = endOfISOWeek(new Date());\r\n\r\n this.restaurants$ = forkJoin(\r\n [\r\n this.restaurantService.getAllRestaurants(),\r\n this.userChannelTermsService.getUserChannelTerms()\r\n ])\r\n .pipe(\r\n map(([restaurants, userChannels]) => {\r\n return restaurants.map(restaurant => {\r\n restaurant.UserChannelMatched = restaurant.ChannelTermRestaurants.some(restaurantChannel => userChannels.some(userChannel => userChannel.ChannelTermId === restaurantChannel.ChannelTermId));\r\n return restaurant;\r\n });\r\n }),\r\n tap(restaurants => {\r\n if (restaurants && restaurants.length > 0) {\r\n const matchedRestaurant = restaurants.find(restaurant => restaurant.UserChannelMatched) ?? restaurants.find(restaurant => restaurant.ChannelTermRestaurants.length === 0) ?? restaurants[0];\r\n this.selectedRestaurant = matchedRestaurant.Id;\r\n this.changeSubject.next(this.selectedRestaurant);\r\n this.hideRestaurantMenu.emit(false);\r\n } else {\r\n this.hideRestaurantMenu.emit(true);\r\n }\r\n }));\r\n\r\n this.restaurantMenus$ = this.changeSubject\r\n .pipe(\r\n mergeMap(id => {\r\n if (id > 0) {\r\n return this.lunchMenuService.getCurrentAndFutureRestaurantMenusForRestaurant(id)\r\n .pipe(\r\n map(menus => {\r\n // get today's date day\r\n this.weeks = new Array();\r\n const todayDate = new Date();\r\n const today = todayDate.toLocaleDateString('en-US', { weekday: 'long' });\r\n const currentWeekNumber = getISOWeek(new Date());\r\n menus.map(weekMenu => {\r\n const week = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday'];\r\n // if week number is current week then skip the days passed to update.\r\n if (weekMenu.WeekNumber === currentWeekNumber) {\r\n // get the index of the week day from the array of week\r\n const weekIndex = week.findIndex(d => d === today);\r\n const daysInCurrentWeek = week.slice(weekIndex, week.length);\r\n this.parseWeekDays(daysInCurrentWeek, weekMenu);\r\n } else {\r\n this.parseWeekDays(week, weekMenu);\r\n }\r\n });\r\n this.menuCardsToDisplay = this.weeks.slice(0, this.numberOfMenuCardPerLoad);\r\n return menus;\r\n }));\r\n } else {\r\n return EMPTY;\r\n }\r\n }));\r\n }\r\n\r\n parseWeekDays(weekDays: string[], weekMenu: RestaurantMenu) {\r\n weekDays.forEach(d => {\r\n if (weekMenu[d] !== null && weekMenu[d] !== '') {\r\n // check if a week number and day already exists in the weeks array\r\n if (!this.weeks.some(w => w.WeekNumber === weekMenu.WeekNumber && w.WeekDay === d)) {\r\n this.weeks.push(this.parseWeeklyMenus(weekMenu.WeekNumber, d, weekMenu[d]));\r\n } else {\r\n const week = this.weeks.find(w => w.WeekNumber === weekMenu.WeekNumber && w.WeekDay === d);\r\n week.menu.push(new MenuText({\r\n value: weekMenu[d]\r\n }));\r\n }\r\n }\r\n });\r\n if (weekMenu['AllWeek'] !== null && weekMenu['AllWeek'] !== '') {\r\n if (!this.weeks.some(w => w.WeekNumber === weekMenu.WeekNumber && w.WeekDay === 'w' + weekMenu.WeekNumber)) {\r\n this.weeks.push(this.parseWeeklyMenus(weekMenu.WeekNumber, 'w' + weekMenu.WeekNumber, weekMenu.AllWeek));\r\n } else {\r\n const week = this.weeks.find(w => w.WeekNumber === weekMenu.WeekNumber && w.WeekDay === 'w' + weekMenu.WeekNumber);\r\n week.menu.push(new MenuText({\r\n value: weekMenu.AllWeek\r\n }));\r\n }\r\n }\r\n }\r\n\r\n parseWeeklyMenus(WeekNumber: number, day: string, dayMenu: string): WeeklyRestaurantMenu {\r\n return new WeeklyRestaurantMenu({\r\n WeekNumber: WeekNumber,\r\n WeekDay: day,\r\n menu: [{value: dayMenu}] as MenuText[]\r\n });\r\n }\r\n\r\n clickShowPrevious() {\r\n this.menuCardsToDisplay = this.weeks.slice(this.startIndex - this.numberOfMenuCardPerLoad , this.startIndex);\r\n this.numberOfShowMoreClicks -= 1; // 1\r\n this.startIndex -= this.numberOfMenuCardPerLoad;\r\n }\r\n\r\n clickShowNext() {\r\n this.numberOfShowMoreClicks++;\r\n this.startIndex = this.numberOfMenuCardPerLoad * this.numberOfShowMoreClicks;\r\n this.menuCardsToDisplay = this.weeks.slice(this.startIndex, this.startIndex + this.numberOfMenuCardPerLoad);\r\n }\r\n}\r\n\r\n@NgModule({\r\n declarations: [CompactRestaurantMenuComponent],\r\n exports: [CompactRestaurantMenuComponent],\r\n imports: [\r\n CommonModule,\r\n MatSelectModule,\r\n TextPlaceholderModule,\r\n WidgetPlaceholderModule,\r\n LinkModule,\r\n MatButtonModule\r\n ],\r\n})\r\nexport class CompactRestaurantMenuModule { }\r\n","
\r\n

RSS feed

\r\n\r\n
\r\n
\r\n
\r\n \r\n
\r\n
\r\n
\r\n\r\n
4\" class=\"row justify-content-start\">\r\n
\r\n \r\n
\r\n
\r\n \r\n \r\n 8\" class=\"dot\"\r\n [ngClass]=\"numberOfShowMoreClicks === 2 ? 'accent-2-bg-color' : 'dot-bg-color'\">\r\n
\r\n
\r\n \r\n
\r\n
\r\n
\r\n \r\n \r\n \r\n
\r\n \r\n
\r\n \r\n
\r\n \r\n
\r\n
\r\n
\r\n\r\n \r\n
\r\n \r\n

Please configure the feed source URI.

\r\n
\r\n
\r\n
\r\n","import { CommonModule, DOCUMENT } from '@angular/common';\r\nimport { ChangeDetectionStrategy, Component, EventEmitter, Inject, Input, NgModule, OnInit, Output } from '@angular/core';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { WINDOW } from '@app/common/app-tokens';\r\nimport { BreakPoints } from '@app/common/breakpoints';\r\nimport { Utilities } from '@app/common/utilities';\r\nimport { TextPlaceholderModule } from '@app/components/text-placeholder/text-placeholder.component';\r\nimport { WidgetPlaceholderModule } from '@app/components/widget-placeholder/widget-placeholder.component';\r\nimport { FeedItem } from '@app/models/feed-item';\r\nimport { FeedInfo } from '@app/models/feed-source-info';\r\nimport { LinkModule } from '@app/directives/link.directive';\r\nimport { FeedService } from '@app/services/feed.service';\r\nimport { Observable, of, Subject } from 'rxjs';\r\nimport { concatMap, startWith, tap } from 'rxjs/operators';\r\nimport { RssFeedAmount } from '@app/common/rss-feed';\r\nimport { FeatureSettingsStoreService } from '@app/services/feature-settings-store.service';\r\nimport { UserLanguageTermService } from '@app/services/user-language-term.service';\r\n\r\n@Component({\r\n selector: 'app-compact-rss-feeds',\r\n templateUrl: './compact-rss-feeds.component.html',\r\n styleUrls: ['./compact-rss-feeds.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush\r\n})\r\nexport class CompactRssFeedsComponent implements OnInit {\r\n\r\n @Input() maxNumberOfShowMore = 2; // How may times can you press the show more button\r\n @Input() titleMaxLength = 100;\r\n amountToFetch: number;\r\n amountToShowPerLoad: number;\r\n amountCurrentlyShowing: number;\r\n feedLoading: boolean;\r\n fetchedAmountOfFeeds: number;\r\n feedsFrom: Array;\r\n tagName: string;\r\n isFeedUrlConfigured: boolean;\r\n subscribedToRssFeature: boolean;\r\n feeds$: Observable;\r\n private moreFeedsSubject = new Subject();\r\n rssFeedConfig = this.featureSettingsStoreService.state.rssFeedConfig;\r\n startIndex = 0;\r\n numberOfShowMoreClicks = 0;\r\n showNext = false;\r\n onLoad = true;\r\n feedsToShow: FeedItem[];\r\n sliced = false;\r\n @Output() hideRssFeed = new EventEmitter();\r\n\r\n constructor(private featureSettingsStoreService: FeatureSettingsStoreService,\r\n @Inject(WINDOW) private window: Window,\r\n private service: FeedService,\r\n private userLanguageTermService: UserLanguageTermService,\r\n @Inject(DOCUMENT) private document: Document ) { }\r\n\r\n ngOnInit() {\r\n this.onLoad = true;\r\n if (this.rssFeedConfig) {\r\n\r\n // Vary amount of items to show based on screen size (and thus breakpoint).\r\n // Goal: 1) display even amount, and 2) show suitable amount for the resolution\r\n const smallModes = { [BreakPoints.xs]: 2, [BreakPoints.sm]: 2, [BreakPoints.md]: 4, [BreakPoints.lg]: 3, [BreakPoints.xl]: 3, [BreakPoints.xxl]: 4, [BreakPoints.xxxl]: 4 };\r\n const mediumModes = { [BreakPoints.xs]: 4, [BreakPoints.sm]: 4, [BreakPoints.md]: 8, [BreakPoints.lg]: 6, [BreakPoints.xl]: 6, [BreakPoints.xxl]: 8, [BreakPoints.xxxl]: 8 };\r\n const breakpoint = Utilities.getCurrentBootstrapBreakpoint(this.window);\r\n if (this.rssFeedConfig.amountToShowPerLoad === RssFeedAmount.Small) {\r\n this.amountToShowPerLoad = smallModes[breakpoint];\r\n } else { // Medium\r\n this.amountToShowPerLoad = mediumModes[breakpoint];\r\n }\r\n this.amountToShowPerLoad = this.featureSettingsStoreService.state.enableCompactDesign ? 4 : this.amountToShowPerLoad;\r\n this.amountToFetch = this.amountToShowPerLoad * (this.maxNumberOfShowMore + 1);\r\n\r\n this.subscribedToRssFeature = true;\r\n this.feedsFrom = this.rssFeedConfig.feedLinksAndTagName;\r\n this.amountCurrentlyShowing = this.amountToShowPerLoad;\r\n\r\n if (this.feedsFrom.length > 0) {\r\n this.hideRssFeed.emit(false);\r\n this.isFeedUrlConfigured = true;\r\n this.feeds$ = this.moreFeedsSubject\r\n .pipe(startWith(this.amountCurrentlyShowing))\r\n .pipe(concatMap((amount) => {\r\n this.amountCurrentlyShowing = amount;\r\n this.feedLoading = true;\r\n this.sliced = false;\r\n // filter feed links based on user interests to rss feed language setting in admin center\r\n return this.userLanguageTermService.getUserLanguageTerms()\r\n .pipe(\r\n concatMap((userChannelTerms) => {\r\n const feedinfo = this.feedsFrom.filter(feeds => userChannelTerms.some(channelTerm => (channelTerm.LanguageTermId === feeds.Language)) || !feeds.Language || feeds.Language === '');\r\n if (feedinfo.length > 0) {\r\n return this.service.getRssFeeds(feedinfo, this.amountToFetch);\r\n } else {\r\n return of([]);\r\n }\r\n })\r\n );\r\n }))\r\n .pipe(tap((feeds) => {\r\n if (feeds.length === 0) {\r\n this.hideRssFeed.emit(true);\r\n } else {\r\n this.hideRssFeed.emit(false);\r\n this.fetchedAmountOfFeeds = feeds.length;\r\n\r\n if (this.onLoad) {\r\n this.feedsToShow = feeds.slice(0, this.amountToShowPerLoad);\r\n } else {\r\n if (this.showNext) {\r\n this.feedsToShow = feeds.slice(this.startIndex, this.startIndex + 4);\r\n } else {\r\n\r\n if (!this.sliced) {\r\n this.sliced = true;\r\n this.feedsToShow = feeds.slice(this.startIndex - 4 , this.startIndex);\r\n }\r\n }\r\n this.amountCurrentlyShowing = 4;\r\n }\r\n this.feedLoading = false;\r\n }\r\n }));\r\n } else {\r\n this.isFeedUrlConfigured = false;\r\n this.hideRssFeed.emit(true);\r\n }\r\n } else {\r\n this.hideRssFeed.emit(true);\r\n this.subscribedToRssFeature = false;\r\n }\r\n }\r\n\r\n clickShowNext() {\r\n this.numberOfShowMoreClicks++;\r\n this.startIndex = this.amountCurrentlyShowing * this.numberOfShowMoreClicks;\r\n this.showNext = true;\r\n this.onLoad = false;\r\n\r\n this.amountCurrentlyShowing = this.amountCurrentlyShowing + this.amountToShowPerLoad;\r\n this.moreFeedsSubject.next(this.amountCurrentlyShowing);\r\n }\r\n\r\n clickShowPrevious() {\r\n this.amountCurrentlyShowing = this.amountToShowPerLoad;\r\n this.showNext = false;\r\n this.onLoad = false;\r\n\r\n this.moreFeedsSubject.next(this.amountCurrentlyShowing);\r\n this.numberOfShowMoreClicks -= 1;\r\n this.startIndex -= 4;\r\n this.scrollIntoFeatureView();\r\n }\r\n\r\n scrollIntoFeatureView() {\r\n const elementId = 'app-compact-rss-feeds';\r\n const element = this.document.getElementById(elementId);\r\n\r\n if (element) {\r\n if (!/^(?:a|select|input|button|textarea)$/i.test(element.tagName)) {\r\n element.scrollIntoView();\r\n }\r\n element.focus();\r\n }\r\n }\r\n\r\n truncate(text: string) {\r\n return Utilities.truncate(text, this.titleMaxLength);\r\n }\r\n}\r\n@NgModule({\r\n declarations: [CompactRssFeedsComponent],\r\n exports: [CompactRssFeedsComponent],\r\n imports: [\r\n CommonModule,\r\n MatButtonModule,\r\n TextPlaceholderModule,\r\n WidgetPlaceholderModule,\r\n LinkModule,\r\n ]\r\n})\r\nexport class CompactRssFeedsModule { }\r\n","

Upcoming events

\r\n

\r\n Go to the calendar\r\n

\r\n\r\n
\r\n
    0; else noEvents\">\r\n
  • \r\n
    \r\n
    \r\n
    {{event.EventDate| date:'d'}}
    \r\n
    {{event.EventDate| date:'LLL'}}
    \r\n
    \r\n

    {{event.Title}}

    \r\n \r\n {{(event.Location.length>30)? (event.Location | slice:0:30)+'...':(event.Location)}}\r\n \r\n \r\n {{event.EventDate| date:'d LLL'}} {{event.EventDate| date:'H:mm'}} - {{event.EndDate| date:'d LLL'}} {{event.EndDate| date:'H:mm'}}\r\n {{event.EventDate| date:'d LLL'}} {{event.EventDate| date:'H:mm'}} - {{event.EndDate | date:'H:mm'}}\r\n {{event.EventDate| date:'d LLL'}} - {{event.EndDate| date:'d LLL'}}(All day)\r\n {{event.EventDate| date:'d LLL'}}(All day)\r\n \r\n
    \r\n
  • \r\n
\r\n
\r\n\r\n
4\" class=\"row justify-content-start\">\r\n
\r\n \r\n
\r\n
\r\n \r\n \r\n 8\" class=\"dot\" [ngClass]=\"numberOfShowMoreClicks === 2 ? 'accent-2-bg-color' : 'dot-bg-color'\">\r\n
\r\n
\r\n \r\n
\r\n
\r\n \r\n\r\n
\r\n Find more events in the Calendar\r\n
\r\n
\r\n\r\n\r\n
\r\n \r\n
\r\n \r\n
\r\n \r\n
\r\n
\r\n
\r\n\r\n\r\n
\r\n \r\n
\r\n \r\n
\r\n \r\n

No future events.

\r\n
\r\n
\r\n
\r\n
\r\n","import { CommonModule, DOCUMENT } from '@angular/common';\r\nimport { ChangeDetectorRef, Component, ElementRef, EventEmitter, Inject, Input, NgModule, OnDestroy, OnInit, Output } from '@angular/core';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { Router } from '@angular/router';\r\nimport { CUSTOMERENVIRONMENT } from '@app/common/app-tokens';\r\nimport { CssBackgroundImageProxyModule } from '@app/directives/css-background-image-proxy.directive';\r\nimport { LinkModule } from '@app/directives/link.directive';\r\nimport { OrganizationEvent } from '@app/models/organization-events';\r\nimport { ComponentStatesOnRoutesService } from '@app/services/component-states-on-routes.service';\r\nimport { FeatureSettingsStoreService } from '@app/services/feature-settings-store.service';\r\nimport { OrganizationCalendarService } from '@app/services/organization-calendar.service';\r\nimport { Environment } from '@environments/interface.environment';\r\nimport { Subject, Subscription } from 'rxjs';\r\nimport { ActionLinkModule } from '../actions/action-link/action-link.component';\r\nimport { ErrorTemplatesModule } from '../error-templates/error-templates.component';\r\nimport { TextPlaceholderModule } from '../text-placeholder/text-placeholder.component';\r\nimport { WidgetPlaceholderModule } from '../widget-placeholder/widget-placeholder.component';\r\nimport { differenceInSeconds, isSameDay } from 'date-fns';\r\nimport { Utilities } from '@app/common/utilities';\r\n\r\n@Component({\r\n selector: 'app-compact-upcoming-events',\r\n templateUrl: './compact-upcoming-events.component.html',\r\n styleUrls: ['./compact-upcoming-events.component.scss'],\r\n})\r\nexport class CompactUpcomingEventsComponent implements OnInit, OnDestroy {\r\n\r\n organizationEvents: OrganizationEvent[];\r\n allEvents: any[];\r\n eventsToDisplay: any[];\r\n groupedEvents: any;\r\n @Input() maxNumberOfShowMore = 2; // How may times can you press the show more button\r\n @Input() numEventsPerLoad = 6; // 6 is a good number since it will work with all screen breakpoints\r\n maxEventsToShow: number;\r\n numEventsShowing: number;\r\n listGuid: string;\r\n calendarUrl = `${this.environment.coreWorkplaceSiteUrl}/_layouts/15/Events.aspx`;\r\n singleEventCalendarUrl = `${this.environment.coreWorkplaceSiteUrl}/_layouts/15/Event.aspx`;\r\n loadEventSubscription: Subscription;\r\n private errorSubject$ = new Subject();\r\n numberOfShowMoreClicks = 0;\r\n calendarPageInfoUrl = this.featureSettingsStoreService.state.calendarPageInfoUrl;\r\n componentName = 'Upcoming events';\r\n startIndex = 0;\r\n maxEventsToFetch = 12;\r\n @Output() hideEvents = new EventEmitter();\r\n\r\n constructor(@Inject(CUSTOMERENVIRONMENT) private environment: Environment,\r\n private service: OrganizationCalendarService,\r\n private router: Router,\r\n private componentEventService: ComponentStatesOnRoutesService,\r\n public elementRef: ElementRef,\r\n private cdRef: ChangeDetectorRef,\r\n private featureSettingsStoreService: FeatureSettingsStoreService,\r\n @Inject(DOCUMENT) private document: Document) {\r\n }\r\n\r\n clickShowNext(): void {\r\n this.numberOfShowMoreClicks++;\r\n this.startIndex = this.numEventsPerLoad * this.numberOfShowMoreClicks;\r\n this.eventsToDisplay = this.allEvents.slice(this.startIndex, this.startIndex + 4);\r\n }\r\n\r\n clickShowPrevious(): void {\r\n\r\n this.eventsToDisplay = this.allEvents.slice(this.startIndex - 4 , this.startIndex);\r\n this.numberOfShowMoreClicks -= 1; // 1\r\n this.startIndex -= 4;\r\n }\r\n\r\n ngOnInit() {\r\n\r\n this.maxEventsToShow = this.numEventsPerLoad * (this.maxNumberOfShowMore + 1);\r\n this.numEventsShowing = this.numEventsPerLoad;\r\n\r\n const componentEvent = this.componentEventService.state.RouteMap.has(this.router.url) && this.componentEventService.state.RouteMap.get(this.router.url).find(x => x.ComponentId === this.elementRef.nativeElement.localName);\r\n const componentEventData = componentEvent ? componentEvent.Data as Array : undefined;\r\n\r\n this.loadEventSubscription = this.service.getOrganizationCalendarEventsFromGraph(this.maxEventsToFetch)\r\n .subscribe(events => {\r\n this.organizationEvents = events.map(val => {\r\n if (this.calendarUrl.indexOf('ListGuid') === -1) {\r\n this.calendarUrl = `${this.calendarUrl}?ListGuid=${val.ListGuid}`;\r\n }\r\n return this.parseEvents(val);\r\n });\r\n\r\n let allEvents = [];\r\n for (let i = 0; i < this.organizationEvents.length; i++) {\r\n allEvents = allEvents.concat(this.parseRecurringEvents(this.organizationEvents[i]));\r\n }\r\n\r\n this.allEvents = this.orderByDate(allEvents, 'EventDate');\r\n\r\n this.allEvents = this.allEvents.map(event => {\r\n if (componentEventData) {\r\n const foundEvent = componentEventData.find(ced => ced.Id === event.Id);\r\n if (foundEvent) {\r\n event.ShowNewOrModifiedBadge = true;\r\n }\r\n } else {\r\n event.ShowNewOrModifiedBadge = false;\r\n }\r\n return event;\r\n });\r\n\r\n if (this.allEvents.length === 0) {\r\n this.hideEvents.emit(true);\r\n } else {\r\n this.hideEvents.emit(false);\r\n }\r\n\r\n // take top 5\r\n if (this.allEvents.length > this.numEventsPerLoad) {\r\n this.eventsToDisplay = this.allEvents.slice(0, this.numEventsPerLoad);\r\n } else {\r\n this.eventsToDisplay = this.allEvents;\r\n }\r\n this.cdRef.detectChanges();\r\n },\r\n err => {\r\n this.errorSubject$.next(err);\r\n this.cdRef.detectChanges();\r\n });\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.loadEventSubscription && this.loadEventSubscription.unsubscribe();\r\n }\r\n\r\n orderByDate(arr, dateProp) {\r\n return arr.slice().sort(function (a, b) {\r\n return a[dateProp] < b[dateProp] ? -1 : 1;\r\n });\r\n }\r\n\r\n parseEvents(event: OrganizationEvent): OrganizationEvent {\r\n\r\n let eventInstance;\r\n\r\n if (event.AllDayEvent) {\r\n eventInstance = '';\r\n } else {\r\n if (isSameDay(new Date(event.EventDate), new Date(event.EndDate))) {\r\n eventInstance = 'on same day';\r\n } else {\r\n eventInstance = 'on diff day';\r\n }\r\n }\r\n\r\n return new OrganizationEvent({\r\n EventDate: event.EventDate,\r\n EndDate: event.EndDate,\r\n EventInstance: eventInstance,\r\n Description: event.Description,\r\n AllDayEvent: event.AllDayEvent,\r\n Location: event.Location,\r\n Recurrence: event.Recurrence,\r\n Title: event.Title,\r\n RecurrenceData: event.RecurrenceData,\r\n Id: event.Id,\r\n ListGuid: event.ListGuid,\r\n OrganizationCalendarName: event.OrganizationCalendarName,\r\n BannerUrl: event.BannerUrl && event.BannerUrl !== 'https://none' ? event.BannerUrl.split('?')[0] : null,\r\n ItemUrl: `${this.singleEventCalendarUrl}?ListGuid=${event.ListGuid}&ItemId=${event.Id}`\r\n });\r\n }\r\n\r\n parseRecurringEvents(e: OrganizationEvent): OrganizationEvent[] {\r\n\r\n let start, end, durationInSec, eventInstance;\r\n const er = []; let total = 0; let rTotal = 0;\r\n const startDate = new Date(e.EventDate);\r\n const endDate = new Date(e.EndDate);\r\n\r\n durationInSec = differenceInSeconds(endDate, startDate); // (new Date(endDate).getHours() - new Date(startDate).getHours()) * 60 * 60;\r\n\r\n start = new Date(this.parseDate(e.EventDate, e.AllDayEvent));\r\n end = new Date(this.parseDate(e.EndDate, e.AllDayEvent));\r\n\r\n if (isSameDay(new Date(start), new Date(end))) {\r\n eventInstance = 'on same day';\r\n } else {\r\n eventInstance = 'on diff day';\r\n }\r\n const url = `${this.singleEventCalendarUrl}?ListGuid=${e.ListGuid}&ItemId=${e.Id}`;\r\n // normal events on diff day\r\n if (!e.Recurrence) {\r\n if (eventInstance === 'on diff day') {\r\n const init = new Date(this.parseDate(e.EventDate, e.AllDayEvent));\r\n const ed = new Date(this.parseDate(e.EndDate, e.AllDayEvent));\r\n if ((new Date(init)).getTime() >= start.getTime()) {\r\n const ni = this.cloneObj(e);\r\n ni.EventDate = init;\r\n ni.EndDate = ed;\r\n ni.fRecurrence = false;\r\n ni.AllDayEvent = e.AllDayEvent;\r\n ni.EventInstance = eventInstance;\r\n ni.Id = e.Id;\r\n ni.ID = ni.Id;\r\n ni.itemUrl = url;\r\n if (new Date(ed) >= new Date()) {\r\n er.push(ni);\r\n }\r\n }\r\n } else {\r\n // normal events on same day\r\n e.EventDate = new Date(this.parseDate(e.EventDate, e.AllDayEvent));\r\n e.EndDate = new Date(this.parseDate(e.EndDate, e.AllDayEvent));\r\n e.AllDayEvent = e.AllDayEvent;\r\n e.EventInstance = eventInstance;\r\n e.ItemUrl = url;\r\n if (er.length <= 11) {\r\n er.push(e);\r\n } else { return; }\r\n }\r\n return er;\r\n } else {\r\n const wd = ['su', 'mo', 'tu', 'we', 'th', 'fr', 'sa'];\r\n const wom = ['first', 'second', 'third', 'fourth'];\r\n let rTotalstring = '';\r\n if (e.RecurrenceData.indexOf('') !== -1) {\r\n rTotalstring = e.RecurrenceData.substring(e.RecurrenceData.indexOf('') + 17);\r\n rTotal = parseInt(rTotalstring.substring(0, rTotalstring.indexOf('<')), 10);\r\n }\r\n // daily recurrence expansion\r\n if (e.RecurrenceData.indexOf('') - 1);\r\n const arr = this.formatString(str);\r\n if (arr.indexOf('dayFrequency') !== -1) {\r\n const frequency = parseInt(arr[arr.indexOf('dayFrequency') + 1], 10);\r\n let loop = true;\r\n const init = new Date(this.parseDate(e.EventDate, e.AllDayEvent));\r\n while (loop) {\r\n total++;\r\n if ((new Date(init)).getTime() >= start.getTime()) {\r\n\r\n const ed = new Date(init);\r\n ed.setSeconds(ed.getSeconds() + durationInSec);\r\n const ni = this.cloneObj(e);\r\n ni.EventDate = new Date(init);\r\n ni.EndDate = ed;\r\n ni.fRecurrence = false;\r\n ni.AllDayEvent = e.AllDayEvent;\r\n ni.EventInstance = 'on same day';\r\n ni.Id = e.Id;\r\n ni.ID = ni.Id;\r\n ni.ItemUrl = url;\r\n if (new Date(ni.EventDate) >= new Date()) {\r\n if (er.length <= 11) {\r\n er.push(ni);\r\n } else { break; }\r\n }\r\n }\r\n init.setDate(init.getDate() + frequency);\r\n if ((new Date(init) > end) || (rTotal > 0 && rTotal <= total)) { loop = false; }\r\n }\r\n } else if (arr.indexOf('weekday') !== -1) {\r\n e.RecurrenceData = e.RecurrenceData + ''; // change from daily on every weekday to weekly on every weekday\r\n }\r\n }\r\n\r\n // weekly recurrence expansion\r\n if (e.RecurrenceData.indexOf('') - 1);\r\n const arr = this.formatString(str);\r\n const frequency = parseInt(arr[arr.indexOf('weekFrequency') + 1], 10);\r\n let loop = true;\r\n const init = new Date(this.parseDate(e.EventDate, e.AllDayEvent));\r\n let initDay = new Date(init).getDay();\r\n while (loop) {\r\n for (let i = initDay; i < 7; i++) {\r\n if (arr.indexOf(wd[i]) !== -1 && (rTotal > total || rTotal === 0)) {\r\n total++;\r\n if ((new Date(init)).getTime() >= start.getTime()) {\r\n\r\n const nd = new Date(init);\r\n nd.setDate(nd.getDate() + (i - initDay));\r\n const ed = new Date(nd);\r\n ed.setSeconds(ed.getSeconds() + durationInSec);\r\n const ni = this.cloneObj(e);\r\n ni.EventDate = new Date(nd);\r\n ni.EndDate = ed;\r\n ni.fRecurrence = false;\r\n ni.AllDayEvent = e.AllDayEvent;\r\n ni.EventInstance = 'on same day';\r\n ni.Id = e.Id;\r\n ni.ID = ni.Id;\r\n ni.ItemUrl = url;\r\n if (new Date(ni.EventDate) >= new Date()) {\r\n if (er.length <= 11) {\r\n er.push(ni);\r\n } else { break; }\r\n }\r\n }\r\n }\r\n }\r\n init.setDate(init.getDate() + ((7 * frequency) - initDay));\r\n initDay = 0;\r\n if ((new Date(init) > end) || (rTotal > 0 && rTotal <= total)) { loop = false; }\r\n }\r\n }\r\n\r\n // monthly recurrence expansion\r\n if (e.RecurrenceData.indexOf('') - 1);\r\n const arr = this.formatString(str);\r\n const frequency = parseInt(arr[arr.indexOf('monthFrequency') + 1], 10);\r\n let loop = true;\r\n const init = new Date(this.parseDate(e.EventDate, e.AllDayEvent));\r\n const day = parseInt(arr[arr.indexOf('day') + 1], 10);\r\n while (loop) {\r\n total++;\r\n if ((new Date(init)).getTime() >= start.getTime()) {\r\n const nd = new Date(init);\r\n nd.setDate(day);\r\n if (nd.getMonth() === init.getMonth()) {\r\n\r\n const ed = new Date(nd);\r\n ed.setSeconds(ed.getSeconds() + durationInSec);\r\n const ni = this.cloneObj(e);\r\n ni.EventDate = new Date(nd);\r\n ni.EndDate = ed;\r\n ni.fRecurrence = false;\r\n ni.AllDayEvent = e.AllDayEvent;\r\n ni.EventInstance = 'on same day';\r\n ni.Id = e.Id;\r\n ni.ID = ni.Id;\r\n ni.ItemUrl = url;\r\n if (new Date(ni.EventDate) >= new Date()) {\r\n if (er.length <= 11) {\r\n er.push(ni);\r\n } else { break; }\r\n }\r\n }\r\n }\r\n init.setMonth(init.getMonth() + frequency);\r\n if ((new Date(init) > end) || (rTotal > 0 && rTotal <= total)) { loop = false; }\r\n }\r\n }\r\n\r\n // monthlyByDay recurrence expansion\r\n if (e.RecurrenceData.indexOf('') - 1);\r\n const arr = this.formatString(str);\r\n const frequency = parseInt(arr[arr.indexOf('monthFrequency') + 1], 10);\r\n let loop = true;\r\n const init = new Date(this.parseDate(e.EventDate, e.AllDayEvent));\r\n const weekdayOfMonth = arr[arr.indexOf('weekdayOfMonth') + 1];\r\n let temp = new Date();\r\n while (loop) {\r\n total++;\r\n if ((new Date(init)).getTime() >= start.getTime()) {\r\n let nd = new Date(init);\r\n nd.setDate(1); // set to first day of month\r\n if (arr.indexOf('weekday') !== -1) { // find first weekday - if not saturday or sunday, then current date is a weekday\r\n if (nd.getDay() === 0) { nd.setDate(nd.getDate() + 1); } else if (nd.getDay() === 6) { nd.setDate(nd.getDate() + 2); } // add two days to saturday\r\n if (weekdayOfMonth === 'last') {\r\n while (nd.getMonth() === init.getMonth()) {\r\n temp = new Date(nd);\r\n if (nd.getDay() === 5) { nd.setDate(nd.getDate() + 3); } else { nd.setDate(nd.getDate() + 1); } // otherwise, just add one day\r\n }\r\n nd = new Date(temp);\r\n } else {\r\n for (let i = 0; i < wom.indexOf(weekdayOfMonth); i++) {\r\n if (nd.getDay() === 5) { nd.setDate(nd.getDate() + 3); } else { nd.setDate(nd.getDate() + 1); } // otherwise, just add one day\r\n }\r\n }\r\n } else if (arr.indexOf('weekend_day') !== -1) { // find first weekend day\r\n if (nd.getDay() !== 0 && nd.getDay() !== 6) { nd.setDate(nd.getDate() + (6 - nd.getDay())); } // if not saturday or sunday, then add days to get to saturday\r\n if (weekdayOfMonth === 'last') {\r\n while (nd.getMonth() === init.getMonth()) {\r\n temp = new Date(nd);\r\n if (nd.getDay() === 0) { nd.setDate(nd.getDate() + 6); } else { nd.setDate(nd.getDate() + 1); } // otherwise, just add one day\r\n }\r\n nd = new Date(temp);\r\n } else {\r\n for (let i = 0; i < wom.indexOf(weekdayOfMonth); i++) {\r\n if (nd.getDay() === 0) { nd.setDate(nd.getDate() + 6); } else { nd.setDate(nd.getDate() + 1); } // otherwise, just add one day\r\n }\r\n }\r\n } else if (arr.indexOf('day') !== -1) {// just looking for the Nth day in the month...\r\n if (weekdayOfMonth === 'last') {\r\n nd.setMonth(nd.getMonth() + 1);\r\n nd.setDate(0);\r\n } else { nd.setDate(nd.getDate() + (wom.indexOf(weekdayOfMonth))); } // now add days to get to the Nth instance of this day\r\n } else {\r\n for (let i = 0; i < wd.length; i++) { // get first instance of the specified day\r\n if (arr.indexOf(wd[i]) !== -1) {\r\n if (nd.getDate() > i) { nd.setDate(nd.getDate() + (7 - (nd.getDay() - i))); } else { nd.setDate(nd.getDate() + (i - nd.getDay())); }\r\n }\r\n }\r\n if (weekdayOfMonth === 'last') {\r\n while (nd.getMonth() === init.getMonth()) {\r\n temp = new Date(nd);\r\n nd.setDate(nd.getDate() + 7); // add a week to each instance to get the Nth instance\r\n }\r\n nd = new Date(temp);\r\n } else {\r\n for (let i = 0; i < wom.indexOf(weekdayOfMonth); i++) {\r\n nd.setDate(nd.getDate() + 7); // add a week to each instance to get the Nth instance\r\n }\r\n }\r\n }\r\n if (nd.getMonth() === init.getMonth()) { // make sure the new date calculated actually falls within the current month (sometimes there may be no 4th instance of a day)\r\n\r\n const ed = new Date(nd);\r\n ed.setSeconds(ed.getSeconds() + durationInSec);\r\n const ni = this.cloneObj(e);\r\n ni.EventDate = new Date(nd);\r\n ni.EndDate = ed;\r\n ni.fRecurrence = false;\r\n ni.AllDayEvent = e.AllDayEvent;\r\n ni.EventInstance = 'on same day';\r\n ni.Id = e.Id;\r\n ni.ID = ni.Id;\r\n ni.ItemUrl = url;\r\n if (new Date(ni.EventDate) >= new Date()) {\r\n if (er.length <= 11) {\r\n er.push(ni);\r\n } else { break; }\r\n }\r\n }\r\n }\r\n init.setMonth(init.getMonth() + frequency);\r\n if ((new Date(init) > end) || (rTotal > 0 && rTotal <= total)) { loop = false; }\r\n }\r\n }\r\n\r\n // yearly recurrence expansion\r\n if (e.RecurrenceData.indexOf('') - 1);\r\n const arr = this.formatString(str);\r\n const frequency = parseInt(arr[arr.indexOf('yearFrequency') + 1], 10);\r\n let loop = true;\r\n const init = new Date(this.parseDate(e.EventDate, e.AllDayEvent));\r\n const month = (parseInt(arr[arr.indexOf('month') + 1], 10) - 1);\r\n const day = parseInt(arr[arr.indexOf('day') + 1], 10);\r\n while (loop) {\r\n const nd = new Date(init);\r\n nd.setMonth(month);\r\n nd.setDate(day);\r\n if ((new Date(init)).getTime() >= nd.getTime()) {\r\n total++;\r\n if ((new Date(init)).getTime() >= start.getTime()) {\r\n\r\n const ed = new Date(nd);\r\n ed.setSeconds(ed.getSeconds() + durationInSec);\r\n const ni = this.cloneObj(e);\r\n ni.EventDate = new Date(nd);\r\n ni.EndDate = ed;\r\n ni.fRecurrence = false;\r\n ni.AllDayEvent = e.AllDayEvent;\r\n ni.EventInstance = 'on same day';\r\n ni.Id = e.Id;\r\n ni.ID = ni.Id;\r\n ni.ItemUrl = url;\r\n if (new Date(ni.EventDate) >= new Date()) {\r\n if (er.length <= 11) {\r\n er.push(ni);\r\n } else { break; }\r\n }\r\n }\r\n }\r\n init.setFullYear(init.getFullYear() + frequency);\r\n if ((new Date(init) > end) || (rTotal > 0 && rTotal <= total)) { loop = false; }\r\n }\r\n }\r\n\r\n // yearlyByDay recurrence expansion\r\n if (e.RecurrenceData.indexOf('') - 1);\r\n const arr = this.formatString(str);\r\n const frequency = parseInt(arr[arr.indexOf('yearFrequency') + 1], 10);\r\n let loop = true;\r\n const init = new Date(this.parseDate(e.EventDate, e.AllDayEvent));\r\n const month = (parseInt(arr[arr.indexOf('month') + 1], 10) - 1);\r\n const weekdayOfMonth = arr[arr.indexOf('weekdayOfMonth') + 1];\r\n let day = 0;\r\n for (let i = 0; i < wd.length; i++) {\r\n if (arr.indexOf(wd[i]) !== -1) {\r\n if (arr[arr.indexOf(wd[i]) + 1].toLowerCase() === 'true') { day = i; }\r\n }\r\n }\r\n while (loop) {\r\n let nd = new Date(init);\r\n nd.setMonth(month);\r\n if ((new Date(init)).getTime() >= nd.getTime()) {\r\n total++;\r\n if ((new Date(init)).getTime() >= start.getTime()) {\r\n nd.setDate(1);\r\n const dayOfMonth = nd.getDay();\r\n if (day < dayOfMonth) { nd.setDate(nd.getDate() + ((7 - dayOfMonth) + day)); } else { nd.setDate(nd.getDate() + (day - dayOfMonth)); }\r\n if (weekdayOfMonth === 'last') {\r\n const temp = new Date(nd);\r\n while (temp.getMonth() === month) {\r\n nd = new Date(temp);\r\n temp.setDate(temp.getDate() + 7); // loop from first instance of month to last instance of month\r\n }\r\n } else {\r\n nd.setDate(nd.getDate() + (7 * (wom.indexOf(weekdayOfMonth))));\r\n }\r\n if (nd.getMonth() === month) {\r\n\r\n const ed = new Date(nd);\r\n ed.setSeconds(ed.getSeconds() + durationInSec);\r\n const ni = this.cloneObj(e);\r\n ni.EventDate = new Date(nd);\r\n ni.EndDate = ed;\r\n ni.fRecurrence = false;\r\n ni.AllDayEvent = e.AllDayEvent;\r\n ni.EventInstance = 'on same day';\r\n ni.Id = e.Id;\r\n ni.ID = ni.Id;\r\n ni.ItemUrl = url;\r\n if (new Date(ni.EventDate) >= new Date()) {\r\n if (er.length <= 11) {\r\n er.push(ni);\r\n } else { break; }\r\n }\r\n }\r\n }\r\n }\r\n init.setFullYear(init.getFullYear() + frequency);\r\n init.setMonth(month);\r\n init.setDate(1);\r\n if ((new Date(init) > end) || (rTotal > 0 && rTotal <= total)) { loop = false; }\r\n }\r\n }\r\n\r\n return er;\r\n } // end recurrence check\r\n }\r\n\r\n parseDate(date, allDay): Date {\r\n if (typeof date === 'string') {\r\n if (allDay) {\r\n if (date.lastIndexOf('Z') === date.length - 1) {\r\n const dt = date.substring(0, date.length - 1);\r\n return new Date(dt);\r\n }\r\n } else {\r\n return new Date(date);\r\n }\r\n }\r\n return date;\r\n }\r\n\r\n formatString(str: string) {\r\n let arr = str.split('\\'');\r\n str = arr.join('');\r\n arr = str.split('\"');\r\n str = arr.join('');\r\n arr = str.split('=');\r\n str = arr.join(' ');\r\n str.trim();\r\n return str.split(' ');\r\n }\r\n\r\n cloneObj(obj: any) {\r\n let copy;\r\n if (null === obj || 'object' !== typeof obj) { return obj; }\r\n if (obj instanceof Date) {\r\n copy = new Date();\r\n copy.setTime(obj.getTime());\r\n return copy;\r\n }\r\n if (obj instanceof Array) {\r\n copy = [];\r\n for (let i = 0, len = obj.length; i < len; i++) {\r\n copy[i] = this.cloneObj(obj[i]);\r\n }\r\n return copy;\r\n }\r\n if (obj instanceof Object) {\r\n copy = {};\r\n for (const attr in obj) {\r\n if (obj.hasOwnProperty(attr)) { copy[attr] = this.cloneObj(obj[attr]); }\r\n }\r\n return copy;\r\n }\r\n throw new Error('Unable to copy obj! Its type isn\\'t supported.');\r\n }\r\n\r\n setCalendarStyle(event: OrganizationEvent) {\r\n let cssClass: string;\r\n\r\n if (!event.BannerUrl || event.BannerUrl === 'https://none') {\r\n cssClass = 'calendar-box-background';\r\n }\r\n return cssClass;\r\n }\r\n\r\n setLayOverStyle(event: OrganizationEvent) {\r\n let cssClass = {};\r\n if (event.BannerUrl) {\r\n cssClass = 'calendar-banner-overlay';\r\n }\r\n return cssClass;\r\n }\r\n\r\n getInitials(appTile: any) {\r\n return Utilities.generateInitials(appTile.Title);\r\n }\r\n}\r\n\r\n@NgModule({\r\n declarations: [CompactUpcomingEventsComponent],\r\n exports: [CompactUpcomingEventsComponent],\r\n imports: [\r\n CommonModule,\r\n ActionLinkModule,\r\n MatButtonModule,\r\n CssBackgroundImageProxyModule,\r\n ErrorTemplatesModule,\r\n TextPlaceholderModule,\r\n WidgetPlaceholderModule,\r\n LinkModule,\r\n ]\r\n})\r\nexport class CompactUpcomingEventsModule { }\r\n","
\r\n
\r\n \r\n
\r\n
\r\n \r\n
\r\n
\r\n \r\n
\r\n
\r\n \r\n
\r\n
\r\n\r\n
\r\n
\r\n \r\n \r\n \r\n \r\n

Upcoming events

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

Restuarant menu

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

Birthday calendar

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

Rss feed

\r\n
\r\n
\r\n \r\n
\r\n
\r\n
\r\n ","import { CommonModule } from '@angular/common';\r\nimport { Component, NgModule, OnInit } from '@angular/core';\r\nimport { MatExpansionModule } from '@angular/material/expansion';\r\nimport { ActionLinkModule } from '@app/components/actions/action-link/action-link.component';\r\nimport { CompactBirthdaysModule } from '@app/components/compact-birthdays/compact-birthdays.component';\r\nimport { CompactRestaurantMenuModule } from '@app/components/compact-restaurant-menu/compact-restaurant-menu.component';\r\nimport { CompactRssFeedsModule } from '@app/components/compact-rss-feeds/compact-rss-feeds.component';\r\nimport { CompactUpcomingEventsModule } from '@app/components/compact-upcoming-events/compact-upcoming-events.component';\r\nimport { TextPlaceholderModule } from '@app/components/text-placeholder/text-placeholder.component';\r\nimport { WidgetPlaceholderModule } from '@app/components/widget-placeholder/widget-placeholder.component';\r\nimport { HideParentIfEmptyModule } from '@app/directives/hide-parent-if-empty.directive';\r\nimport { LinkModule } from '@app/directives/link.directive';\r\n\r\n@Component({\r\n selector: 'app-compact-layout',\r\n templateUrl: './compact-layout.component.html',\r\n styleUrls: ['./compact-layout.component.scss']\r\n})\r\nexport class CompactLayoutComponent implements OnInit {\r\n\r\n panelOpenState = false;\r\n hideRssComponent = false;\r\n hideResturantMenuComponent = false;\r\n hideBirthdaysComponent = false;\r\n hideEventsComponent = false;\r\n\r\n constructor() { }\r\n\r\n ngOnInit(): void {\r\n }\r\n\r\n hideRssFeed(event) {\r\n this.hideRssComponent = event;\r\n\r\n }\r\n\r\n hideRestaurantMenu(event) {\r\n this.hideResturantMenuComponent = event;\r\n\r\n }\r\n\r\n hideBirthdays(event) {\r\n this.hideBirthdaysComponent = event;\r\n\r\n }\r\n\r\n hideEvents(event) {\r\n this.hideEventsComponent = event;\r\n\r\n }\r\n\r\n}\r\n\r\n@NgModule({\r\n declarations: [CompactLayoutComponent],\r\n exports: [CompactLayoutComponent],\r\n imports: [\r\n CommonModule,\r\n ActionLinkModule,\r\n TextPlaceholderModule,\r\n WidgetPlaceholderModule,\r\n LinkModule,\r\n CompactUpcomingEventsModule,\r\n CompactRssFeedsModule,\r\n CompactRestaurantMenuModule,\r\n CompactBirthdaysModule,\r\n MatExpansionModule,\r\n HideParentIfEmptyModule\r\n ]\r\n})\r\nexport class CompactLayoutModule { }\r\n","import { CommonModule } from '@angular/common';\r\nimport { Component, NgModule } from '@angular/core';\r\nimport { KpiChartsModule } from '@app/components/kpi-charts/kpi-charts.component';\r\nimport { FeatureToggleModule } from '@app/directives/feature-toggle.directive';\r\nimport { HideParentIfEmptyModule } from '@app/directives/hide-parent-if-empty.directive';\r\nimport { MarkComponentVisitedModule } from '@app/directives/mark-component-visited.directive';\r\nimport { LinkModule } from '@app/directives/link.directive';\r\nimport { InfoboxZoneModule } from '@app/components/infobox-zone/infobox-zone.component';\r\nimport { FilterByDepartmentModule } from '../../components/filter-by-department/filter-by-department.component';\r\nimport { PowerBIModule } from '@app/components/power-bi/power-bi.component';\r\nimport { NewsLayoutModule } from '../news-layout/news-layout.component';\r\nimport { CompactLayoutModule } from '../compact-layout/compact-layout.component';\r\n\r\n@Component({\r\n selector: 'app-today',\r\n templateUrl: './today.component.html',\r\n styleUrls: ['./today.component.scss']\r\n})\r\nexport class TodayComponent { }\r\n@NgModule({\r\n declarations: [TodayComponent],\r\n exports: [TodayComponent],\r\n imports: [\r\n CommonModule,\r\n LinkModule,\r\n InfoboxZoneModule,\r\n HideParentIfEmptyModule,\r\n MarkComponentVisitedModule,\r\n FeatureToggleModule,\r\n KpiChartsModule,\r\n FilterByDepartmentModule,\r\n PowerBIModule,\r\n NewsLayoutModule,\r\n CompactLayoutModule\r\n ]\r\n})\r\nexport class TodayModule { }\r\n","
\r\n
\r\n \r\n
\r\n
\r\n\r\n\r\n
\r\n
\r\n \r\n
\r\n
\r\n
\r\n
\r\n
\r\n \r\n
\r\n
\r\n
\r\n
\r\n
\r\n \r\n
\r\n
\r\n\r\n
\r\n
\r\n \r\n
\r\n
\r\n\r\n
\r\n
\r\n \r\n
\r\n
\r\n\r\n\r\n\r\n","import { Component, NgModule } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { LinkModule } from '@app/directives/link.directive';\r\nimport { MarkComponentVisitedModule } from '@app/directives/mark-component-visited.directive';\r\nimport { FeaturedNewsModule } from '@app/components/featured-news/featured-news.component';\r\nimport { MyNewsModule } from '@app/components/my-news/my-news.component';\r\nimport { MyAppTilesModule } from '@app/components/apps-and-tools/my-app-tiles/my-app-tiles.component';\r\nimport { SmartLinksModule } from '@app/components/smart-links/smart-links.component';\r\nimport { HideParentIfEmptyModule } from '@app/directives/hide-parent-if-empty.directive';\r\nimport { KpiChartsModule } from '@app/components/kpi-charts/kpi-charts.component';\r\nimport { InfoboxZoneModule } from '@app/components/infobox-zone/infobox-zone.component';\r\n\r\n@Component({\r\n selector: 'wplight-today',\r\n templateUrl: './today-light.component.html',\r\n styleUrls: ['./today-light.component.scss']\r\n})\r\nexport class TodayLightComponent {\r\n}\r\n@NgModule({\r\n declarations: [TodayLightComponent],\r\n exports: [TodayLightComponent],\r\n imports: [\r\n CommonModule,\r\n LinkModule,\r\n MyAppTilesModule,\r\n SmartLinksModule,\r\n HideParentIfEmptyModule,\r\n FeaturedNewsModule,\r\n MyNewsModule,\r\n MarkComponentVisitedModule,\r\n KpiChartsModule,\r\n InfoboxZoneModule\r\n ]\r\n})\r\nexport class TodayLightModule { }\r\n","
\r\n
\r\n
\r\n \r\n \r\n
\r\n
\r\n
\r\n
\r\n
\r\n \r\n
\r\n
\r\n \r\n
\r\n
\r\n\r\n
\r\n
\r\n \r\n
\r\n
\r\n\r\n
\r\n
\r\n \r\n
\r\n
\r\n\r\n
\r\n
\r\n \r\n
\r\n
\r\n\r\n
\r\n
\r\n \r\n
\r\n
\r\n","\r\n
\r\n
\r\n \r\n
\r\n
\r\n
\r\n

Edit find information

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

\r\n \r\n Channels: \r\n \r\n Adding a channel tag to a navigation\r\n node makes that node only appear for users following that channel. Nodes that are targeted using\r\n channels will have a tag icon displayed next to them. In edit mode you can see all nodes regardless of\r\n channel.\r\n \r\n \r\n

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

\r\n \r\n Headings: \r\n \r\n Headings without links beneath them will\r\n be displayed as links when exiting edit mode. this is to allow having only one level of links directly\r\n under a section.\r\n \r\n \r\n

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

\r\n \r\n Order: \r\n \r\n You can change the order of sections,\r\n headings and links through drag-and-drop. However you can only move nodes within a given level. For\r\n example you can change the order of headings in a section but you cannot move a heading into another\r\n section.\r\n \r\n \r\n

\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n Edit\r\n
\r\n
\r\n\r\n
\r\n\r\n \r\n \r\n
\r\n\r\n \r\n
\r\n

\r\n \r\n {{node.Title}}\r\n \r\n \r\n \r\n {{node.Title}} 0\" [ngClass]=\"{'fa-tag': node.ChannelTermNavigationNodes.length === 1, 'fa-tags': node.ChannelTermNavigationNodes.length > 1}\" class=\"fa ml-2\">\r\n \r\n

\r\n
\r\n 0\">\r\n \r\n {{getNodeLanguages(node.LanguageTermNavigationNodes)}} \r\n \r\n\r\n \r\n \r\n
    \r\n
  • \r\n \r\n 0) ? hasChildrenTmpl : noChildrenTmpl ; context { $implicit: subNode }\">\r\n \r\n\r\n
  • \r\n
\r\n\r\n \r\n
\r\n
\r\n \r\n
\r\n
\r\n
\r\n\r\n \r\n
\r\n
\r\n
\r\n
\r\n \r\n
\r\n
\r\n
\r\n
\r\n\r\n\r\n\r\n
\r\n\r\n {{subNode.Title}}\r\n \r\n \r\n {{subNode.Title}}\r\n 0\"\r\n [ngClass]=\"{'fa-tag': subNode.ChannelTermNavigationNodes.length === 1, 'fa-tags': subNode.ChannelTermNavigationNodes.length > 1}\"\r\n class=\"fa ml-2\">\r\n \r\n
\r\n 0\">\r\n \r\n {{getNodeLanguages(subNode.LanguageTermNavigationNodes)}} \r\n \r\n\r\n \r\n \r\n
    \r\n
  • \r\n \r\n
  • \r\n
\r\n\r\n \r\n \r\n \r\n \r\n
\r\n
\r\n\r\n\r\n\r\n {{subNode.Title}}\r\n \r\n \r\n {{subNode.Title}}\r\n 0\"\r\n [ngClass]=\"{'fa-tag': subNode.ChannelTermNavigationNodes.length === 1, 'fa-tags': subNode.ChannelTermNavigationNodes.length > 1}\"\r\n class=\"fa ml-2\">\r\n \r\n
\r\n 0\">\r\n \r\n {{getNodeLanguages(subNode.LanguageTermNavigationNodes)}} \r\n \r\n
\r\n\r\n\r\n\r\n
\r\n \r\n
\r\n
\r\n","import { CommonModule } from '@angular/common';\r\nimport { Component, NgModule, OnDestroy, OnInit } from '@angular/core';\r\nimport { ReactiveFormsModule } from '@angular/forms';\r\nimport { MatSlideToggleChange, MatSlideToggleModule } from '@angular/material/slide-toggle';\r\nimport { RouterModule } from '@angular/router';\r\nimport { applyLanguageFilteringMulti } from '@app/common/filtering-behavior';\r\nimport { Roles } from '@app/common/roles';\r\nimport { WidgetPlaceholderModule } from '@app/components/widget-placeholder/widget-placeholder.component';\r\nimport { WPNavigationNode } from '@app/models/navigation-node';\r\nimport { UserLanguageTerm } from '@app/models/user-language-term';\r\nimport { LinkModule } from '@app/directives/link.directive';\r\nimport { FeatureSettingsStoreService } from '@app/services/feature-settings-store.service';\r\nimport { NavigationNodeService } from '@app/services/navigation-node.service';\r\nimport { SecurityService } from '@app/services/security.service';\r\nimport { UserChannelTermsService } from '@app/services/user-channel-terms.service';\r\nimport { UserLanguageTermService } from '@app/services/user-language-term.service';\r\nimport { SortablejsModule } from 'ngx-sortablejs';\r\nimport { forkJoin, Observable, of, Subscription } from 'rxjs';\r\nimport { first, map, mergeMap, switchMap } from 'rxjs/operators';\r\nimport { Options } from 'sortablejs';\r\nimport { LanguageTermService } from '@app/services/language-term.service';\r\nimport { SimplifiedTerm } from '@app/models/simplified-term';\r\nimport { LanguageTermNavigationNode } from '@app/models/language-term-navigation-node';\r\n\r\n@Component({\r\n selector: 'app-find-information-light-menu',\r\n templateUrl: './find-information-light-menu.component.html',\r\n styleUrls: ['./find-information-light-menu.component.scss']\r\n})\r\nexport class FindInformationLightMenuComponent implements OnInit, OnDestroy {\r\n\r\n navigationNodes$: Observable;\r\n hasPermissionEditorOrAdmin$: Observable;\r\n navigationNodes: WPNavigationNode[];\r\n editMode = false;\r\n isLoading = false; // used to avoid skippy rendering when switching to edit mode.\r\n updateNodeOrderSubscription: Subscription;\r\n options: Options;\r\n languages: Array;\r\n getLanguagesSubscription: Subscription;\r\n languageFilteringEnabled = this.featureSettingsStoreService.state.enableLanguageFilteringForWorkplace;\r\n\r\n constructor(\r\n private navigationNodeService: NavigationNodeService,\r\n private securityService: SecurityService,\r\n private userChannelTermsService: UserChannelTermsService,\r\n private featureSettingsStoreService: FeatureSettingsStoreService,\r\n private languageTermService: LanguageTermService,\r\n private userLanguageTermService: UserLanguageTermService) {\r\n\r\n this.options = {\r\n disabled: false,\r\n handle: '.drag-handle',\r\n filter: '.ignore-elements',\r\n onMove: (event: any) => {\r\n // to ignore the top level add button in the sorting.\r\n return !event.related.classList.contains('ignore-elements');\r\n },\r\n onUpdate: () => {\r\n this.onSortUpdate();\r\n }\r\n\r\n };\r\n }\r\n\r\n private onSortUpdate() {\r\n const movedNodes = new Array();\r\n this.navigationNodes.forEach((node, i) => {\r\n if (node.Order !== i) {\r\n node.Order = i;\r\n movedNodes.push(node);\r\n }\r\n node.Children.forEach((subNode, j) => {\r\n if (subNode.Order !== j) {\r\n subNode.Order = j;\r\n movedNodes.push(subNode);\r\n }\r\n subNode.Children.forEach((subsubNode, y) => {\r\n if (subsubNode.Order !== y) {\r\n subsubNode.Order = y;\r\n movedNodes.push(subsubNode);\r\n }\r\n });\r\n });\r\n\r\n });\r\n\r\n this.updateNodeOrderSubscription = this.navigationNodeService.updateNavigationNodeOrder(movedNodes).subscribe(\r\n {\r\n error: () => {\r\n console.log('ordering update failed');\r\n this.navigationNodeService.reload();\r\n }\r\n });\r\n }\r\n\r\n getOrder(parent: WPNavigationNode = null) {\r\n return parent && parent.Children ? parent.Children.length : this.navigationNodes.length;\r\n }\r\n\r\n ngOnInit(): void {\r\n const navigationNodes$ = this.navigationNodeService\r\n .refresh$\r\n .pipe(\r\n mergeMap(() => {\r\n return forkJoin([\r\n this.navigationNodeService.getAllNavigationNodes(),\r\n this.userChannelTermsService.getUserChannelTerms()\r\n ]);\r\n }),\r\n map(([nodes, userChannelTerms]) => {\r\n\r\n // don't filter in edit mode\r\n if (this.editMode) {\r\n return nodes;\r\n }\r\n\r\n // filter nodes based on userChannels\r\n return nodes.filter(n => {\r\n\r\n let nodeHasTerms = (n.ChannelTermNavigationNodes && n.ChannelTermNavigationNodes.length > 0);\r\n let matchesUserTerms = false;\r\n\r\n if (nodeHasTerms) {\r\n matchesUserTerms = n.ChannelTermNavigationNodes.some(c => userChannelTerms.some(uct => uct.ChannelTermId === c.ChannelTermId));\r\n }\r\n if (nodeHasTerms && !matchesUserTerms) {\r\n // The node isn't targeted to the user, hence it _and_ it's children shouldn't be further processed\r\n return false;\r\n }\r\n n.Children = n.Children.filter(nc => {\r\n\r\n // filter children\r\n nc = (nc as WPNavigationNode);\r\n nodeHasTerms = (nc.ChannelTermNavigationNodes && nc.ChannelTermNavigationNodes.length > 0);\r\n matchesUserTerms = false;\r\n if (nodeHasTerms) {\r\n matchesUserTerms = nc.ChannelTermNavigationNodes.some(c => userChannelTerms.some(uct => uct.ChannelTermId === c.ChannelTermId));\r\n }\r\n if (nodeHasTerms && !matchesUserTerms) {\r\n // The node isn't targeted to the user, hence it _and_ it's children shouldn't be further processed\r\n return false;\r\n }\r\n nc.Children = nc.Children.filter(ngc => {\r\n // filter grandchildren\r\n nodeHasTerms = (ngc.ChannelTermNavigationNodes && ngc.ChannelTermNavigationNodes.length > 0);\r\n if (nodeHasTerms) {\r\n return ngc.ChannelTermNavigationNodes.some(c => userChannelTerms.some(uct => uct.ChannelTermId === c.ChannelTermId));\r\n }\r\n // node doesn't have terms\r\n return true;\r\n });\r\n // node doesn't have terms OR has terms matching the user\r\n return true;\r\n });\r\n // node doesn't have terms OR has terms matching the user\r\n return true;\r\n });\r\n })\r\n );\r\n\r\n this.navigationNodes$ = navigationNodes$\r\n .pipe(\r\n switchMap((navigationNodes) => {\r\n // Language filter toggle\r\n if (this.featureSettingsStoreService.state.enableLanguageFilteringForWorkplace && !this.editMode) {\r\n return this.userLanguageTermService\r\n .getUserLanguageTerms()\r\n .pipe(\r\n map((userLanguageTerms) => {\r\n // Make sure to apply lanugage filtering through all of the levels, so call a recursive wrapper method around applyLanguageFilteringMulti\r\n return this.languageFilterNavigationNodes(navigationNodes, 'LanguageTermNavigationNodes', userLanguageTerms);\r\n }));\r\n } else {\r\n return of(navigationNodes);\r\n }\r\n }),\r\n map(data => {\r\n // sort top level nodes\r\n return data.sort((a: WPNavigationNode, b: WPNavigationNode) => {\r\n return a.Order - b.Order;\r\n });\r\n }),\r\n map(data => {\r\n // sort second and third level nodes\r\n data.forEach((node => {\r\n node.Children.sort((a: WPNavigationNode, b: WPNavigationNode) => {\r\n return a.Order - b.Order;\r\n });\r\n node.Children.forEach(subNode => {\r\n subNode.Children = subNode.Children.sort((a: WPNavigationNode, b: WPNavigationNode) => {\r\n return a.Order - b.Order;\r\n });\r\n });\r\n }));\r\n this.navigationNodes = data;\r\n this.isLoading = false;\r\n return data;\r\n }));\r\n\r\n this.hasPermissionEditorOrAdmin$ = this.securityService.hasUserAnyAppRole([Roles.Admin, Roles.Editor]);\r\n\r\n if (this.languageFilteringEnabled) {\r\n this.getLanguagesSubscription = this.languageTermService.getLanguages().pipe(first()).subscribe(l => { this.languages = l; });\r\n }\r\n }\r\n\r\n languageFilterNavigationNodes(elements: WPNavigationNode[], propertyName: string, userLanguages: UserLanguageTerm[]) {\r\n const filteredNodes = applyLanguageFilteringMulti(elements, propertyName, userLanguages, this.featureSettingsStoreService.state.enableShowNonLanguageContentForAllUsers, this.featureSettingsStoreService.state.defaultLanguageTermId);\r\n filteredNodes.forEach(node => {\r\n if (node?.Children?.length > 0) {\r\n node.Children = this.languageFilterNavigationNodes(node.Children, propertyName, userLanguages);\r\n }\r\n });\r\n return filteredNodes;\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.updateNodeOrderSubscription && this.updateNodeOrderSubscription.unsubscribe();\r\n this.getLanguagesSubscription && this.getLanguagesSubscription.unsubscribe();\r\n }\r\n\r\n handleEditMode(change: MatSlideToggleChange) {\r\n this.isLoading = true;\r\n this.editMode = change.checked;\r\n this.navigationNodeService.useCache = !this.editMode; // disable the service cache in edit mode.\r\n this.navigationNodeService.reload();\r\n }\r\n\r\n getNodeLanguages(nodeLanguages: LanguageTermNavigationNode[]): string {\r\n if (!this.languages || this.languages.length === 0 || !nodeLanguages || nodeLanguages.length === 0) { return ''; }\r\n const result = new Array();\r\n nodeLanguages.forEach(nodeLanguage => {\r\n const matchingLanguage = this.languages.find(l => l.Guid.toLowerCase() === nodeLanguage.LanguageTermId.toLowerCase());\r\n if (matchingLanguage && matchingLanguage.Name) {\r\n result.push(matchingLanguage.Name);\r\n }\r\n });\r\n result.sort();\r\n return ' ' + result.join(', ');\r\n }\r\n}\r\n\r\n@NgModule({\r\n declarations: [FindInformationLightMenuComponent],\r\n exports: [\r\n FindInformationLightMenuComponent\r\n ],\r\n imports: [\r\n CommonModule,\r\n WidgetPlaceholderModule,\r\n LinkModule,\r\n MatSlideToggleModule,\r\n ReactiveFormsModule,\r\n SortablejsModule,\r\n RouterModule,\r\n ]\r\n})\r\nexport class FindInformationLightMenuModule { }\r\n","import { CommonModule } from '@angular/common';\r\nimport { Component, NgModule, OnInit } from '@angular/core';\r\nimport { FindInformationLightMenuModule } from '@app/components/find-information/find-information-light-menu/find-information-light-menu.component';\r\nimport { LinkModule } from '@app/directives/link.directive';\r\n\r\n@Component({\r\n selector: 'app-find-information-light',\r\n templateUrl: './find-information-light.component.html',\r\n styleUrls: ['./find-information-light.component.scss']\r\n})\r\nexport class FindInformationLightComponent implements OnInit {\r\n\r\n constructor() { }\r\n\r\n ngOnInit(): void {\r\n }\r\n\r\n}\r\n@NgModule({\r\n declarations: [FindInformationLightComponent],\r\n exports: [FindInformationLightComponent],\r\n imports: [\r\n CommonModule,\r\n LinkModule,\r\n FindInformationLightMenuModule\r\n ]\r\n})\r\nexport class FindInformationLightModule { }\r\n","
\r\n
\r\n
\r\n
\r\n \r\n
\r\n
\r\n
\r\n
\r\n\r\n\r\n\r\n\r\n","import { Constants } from '@app/common/constants';\r\nimport { AuthGuard } from '@app/guards/auth.guard';\r\nimport { CollaborationComponent } from '@app/views/collaboration/collaboration.component';\r\nimport { FindInformationComponent } from '@app/views/find-information/find-information.component';\r\nimport { MyBoardComponent } from '@app/views/my-board/my-board.component';\r\nimport { TodayComponent } from '@app/views/today/today.component';\r\nimport { Roles } from '@app/common/roles';\r\nimport { AuthorizeAccessGuard } from '@app/guards/authorize-access.guard';\r\nimport { Route } from '@angular/router';\r\nimport { LicenseGuard } from '@app/guards/license.guard';\r\nimport { TodayLightComponent } from 'projects/workplace-light/src/app/today-light/today-light.component';\r\nimport { FindInformationLightComponent } from '@app/views/find-information-light/find-information-light.component';\r\n\r\nexport namespace DefaultRoutes {\r\n export const TODAY_LIGHT: Route = {\r\n path: 'light', component: TodayLightComponent, canActivate: [AuthGuard], data: Constants.TODAY_LIGHT_DEFAULT_DATA\r\n };\r\n export const FIND_INFO_LIGHT: Route = {\r\n path: 'find-information-light', component: FindInformationLightComponent, canActivate: [AuthGuard], data: Constants.FIND_LIGHT_INFO_DEFAULT_DATA\r\n };\r\n export const TODAY: Route = {\r\n path: '', component: TodayComponent, canActivate: [AuthGuard], data: Constants.TODAY_DEFAULT_DATA\r\n };\r\n export const TODAY_WITH_LICENSE_CHECK: Route = {\r\n ...TODAY, ...{ canActivate: [AuthGuard, LicenseGuard] }\r\n };\r\n export const YOUR_BOARD: Route = {\r\n path: 'your-board', component: MyBoardComponent, canActivate: [AuthGuard], data: Constants.YOUR_BOARD_DEFAULT_DATA\r\n };\r\n export const YOUR_BOARD_WITH_LICENSE_CHECK: Route = {\r\n ...YOUR_BOARD, ...{ canActivate: [AuthGuard, LicenseGuard] }\r\n };\r\n export const COLLABORATION: Route = {\r\n path: 'collaboration', component: CollaborationComponent, canActivate: [AuthGuard], data: Constants.COLLABORATION_DEFAULT_DATA\r\n };\r\n export const COLLABORATION_WITH_LICENSE_CHECK: Route = {\r\n ...COLLABORATION, ...{ canActivate: [AuthGuard, LicenseGuard] }\r\n };\r\n export const FIND_INFO: Route = {\r\n path: 'find-information', component: FindInformationComponent, canActivate: [AuthGuard], data: Constants.FIND_INFO_DEFAULT_DATA\r\n };\r\n export const FIND_INFO_WITH_LICENSE_CHECK: Route = {\r\n ...FIND_INFO, ...{ canActivate: [AuthGuard, LicenseGuard] }\r\n };\r\n export const APPS_TOOLS: Route = {\r\n path: 'apps-and-tools', loadChildren: () => import('@app/views/apps-and-tools/apps-and-tools-view.module').then(m => m.AppsAndToolsViewModule), canActivate: [AuthGuard],\r\n data: Constants.APP_CENTER_DEFAULT_DATA\r\n };\r\n export const SETTINGS: Route = {\r\n path: 'settings', loadChildren: () => import('@app/views/settings/settings-view.module').then(m => m.SettingsViewModule), canActivate: [AuthGuard],\r\n data: Constants.SETTINGS_DEFAULT_DATA\r\n };\r\n export const CREATE_SITE: Route = {\r\n path: 'create-site', loadChildren: () => import('@app/views/create-site/create-site-view.module').then(m => m.CreateSiteViewModule), canActivate: [AuthorizeAccessGuard, LicenseGuard],\r\n data: Constants.CREATE_SITE_DEFAULT_DATA\r\n };\r\n export const EDITOR_DASHBOARD: Route = {\r\n path: 'editor-dashboard', loadChildren: () => import('@app/views/editor-dashboard/editor-dashboard-view.module').then(m => m.EditorDashboardViewModule), canActivate: [AuthorizeAccessGuard],\r\n data: Constants.EDITOR_DASHBOARD_DEFAULT_DATA\r\n };\r\n export const FIRST_DAY: Route = {\r\n path: 'first-day', loadChildren: () => import('@app/views/first-day-wizard/first-day-view.module').then(m => m.FirstDayViewModule), canActivate: [AuthGuard],\r\n data: Constants.FIRST_DAY_DEFAULT_DATA\r\n };\r\n export const ADMIN: Route = {\r\n path: 'admin', loadChildren: () => import('@app/views/admin/admin-view.module').then(m => m.AdminViewModule), canActivate: [AuthorizeAccessGuard],\r\n data: Constants.ADMIN_DASHBOARD_DEFAULT_DATA\r\n };\r\n export const ABOUT: Route = {\r\n path: 'about', loadChildren: () => import('@app/views/about/about-view.module').then(m => m.AboutViewModule), canActivate: [AuthorizeAccessGuard],\r\n data: { roles: [Roles.Admin] }\r\n };\r\n export const PEOPLE: Route = {\r\n path: 'people', loadChildren: () => import('@app/views/find-colleague/find-colleague-view.module').then(m => m.FindColleagueViewModule), canActivate: [AuthGuard],\r\n data: Constants.FIND_COLLEAGUE_DEFAULT_DATA\r\n };\r\n export const BROADCAST_MESSAGES: Route = {\r\n path: 'broadcast-messages', loadChildren: () => import('@app/views/broadcast-messages/broadcast-messages-view.module').then(m => m.BroadcastMessagesViewModule), canActivate: [AuthorizeAccessGuard],\r\n data: Constants.BROADCAST_MESSAGES_DEFAULT_DATA\r\n };\r\n export const RESTAURANT: Route = {\r\n path: 'restaurant-menus', loadChildren: () => import('@app/views/restaurant-menu/restaurant-menu-view.module').then(m => m.RestaurantMenuViewModule), canActivate: [AuthorizeAccessGuard],\r\n data: Constants.RESTAURANT_DEFAULT_DATA\r\n };\r\n export const KPI_CHARTS: Route = {\r\n path: 'kpi-charts', loadChildren: () => import('@app/views/kpi-charts/kpi-charts-view.module').then(m => m.KpiChartsViewModule), canActivate: [AuthorizeAccessGuard],\r\n data: Constants.KPI_CHARTS_DEFAULT_DATA\r\n };\r\n export const MSTEAMS_AUTH: Route = {\r\n path: 'msteams-auth', outlet: 'auth', loadChildren: () => import('@app/views/msteams-auth/msteams-auth-view.module').then(m => m.MsteamsAuthViewModule)\r\n };\r\n export const PAGES: Route = {\r\n path: 'pages', loadChildren: () => import('@app/views/pages/pages-view.module').then(m => m.PagesViewModule), canActivate: [AuthGuard],\r\n data: Constants.PAGES_DEFAULT_DATA\r\n };\r\n export const INFOBOXES: Route = {\r\n path: 'infoboxes', loadChildren: () => import('@app/views/infobox/infobox-view.module').then(m => m.InfoBoxViewModule), canActivate: [AuthorizeAccessGuard],\r\n data: Constants.INFOBOXES_DEFAULT_DATA\r\n };\r\n export const USER: Route = {\r\n // this needs a specific license to be allowed to run\r\n path: 'user', loadChildren: () => import('@app/views/user/user-view.module').then(m => m.UserViewModule), canActivate: [AuthGuard], data: Constants.MY_PROFILE_DEFAULT_DATA\r\n };\r\n export const POWER_BI: Route = {\r\n path: 'power-bi', loadChildren: () => import('@app/views/power-bi/power-bi-frames-view.module').then(m => m.PowerBIFramesViewModule), canActivate: [AuthorizeAccessGuard],\r\n data: Constants.POWER_BI_DEFAULT_DATA\r\n };\r\n}\r\n","import { Routes } from '@angular/router';\r\nimport { CustomTodayComponent } from './custom-today/custom-today.component';\r\nimport { AuthGuard } from '@app/guards/auth.guard';\r\nimport { Constants } from '@app/common/constants';\r\nimport { DEFAULT_MODAL_ROUTE_CONFIG } from '@app/common/default-modal-route-config';\r\nimport { CustomFindInformationComponent } from './views/custom-find-information/custom-find-information.component';\r\nimport { DefaultRoutes } from '@app/common/default-routes';\r\nimport { CustomCollaborationComponent } from './views/custom-collaboration/custom-collaboration.component';\r\n\r\nexport const CAFCASS_CUSTOM_ROUTE_CONFIG: Routes = [\r\n {\r\n path: '', component: CustomTodayComponent, pathMatch: 'full', canActivate: [AuthGuard], data: Constants.TODAY_DEFAULT_DATA\r\n },\r\n DefaultRoutes.YOUR_BOARD,\r\n {\r\n path: 'collaboration', component: CustomCollaborationComponent, canActivate: [AuthGuard], data: Constants.COLLABORATION_DEFAULT_DATA\r\n },\r\n {\r\n path: 'find-information', component: CustomFindInformationComponent, canActivate: [AuthGuard], data: Constants.FIND_INFO_DEFAULT_DATA\r\n },\r\n DefaultRoutes.APPS_TOOLS,\r\n DefaultRoutes.SETTINGS,\r\n DefaultRoutes.CREATE_SITE,\r\n DefaultRoutes.EDITOR_DASHBOARD,\r\n DefaultRoutes.FIRST_DAY,\r\n DefaultRoutes.ADMIN,\r\n DefaultRoutes.ABOUT,\r\n DefaultRoutes.PEOPLE,\r\n DefaultRoutes.BROADCAST_MESSAGES,\r\n DefaultRoutes.RESTAURANT,\r\n DefaultRoutes.PAGES,\r\n DefaultRoutes.KPI_CHARTS,\r\n DefaultRoutes.INFOBOXES,\r\n DefaultRoutes.POWER_BI,\r\n {\r\n path: '**', redirectTo: ''\r\n },\r\n ...DEFAULT_MODAL_ROUTE_CONFIG\r\n];\r\n","import { CommonModule } from '@angular/common';\r\nimport { Component, NgModule } from '@angular/core';\r\nimport { ColleaguesModule } from '@app/components/colleagues/colleagues.component';\r\nimport { MyCollaborationActivitiesModule } from '@app/components/my-collaboration-activities/my-collaboration-activities-widget/my-collaboration-activities-widget.component';\r\nimport { MyLatestSitesModule } from '@app/components/my-latest-sites/my-latest-sites.component';\r\nimport { SiteIndexModule } from '@app/components/site-index/site-index.component';\r\nimport { LinkModule } from '@app/directives/link.directive';\r\n\r\n@Component({\r\n selector: 'cafcass-custom-collaboration',\r\n templateUrl: './custom-collaboration.component.html',\r\n styleUrls: ['./custom-collaboration.component.scss']\r\n})\r\nexport class CustomCollaborationComponent { }\r\n@NgModule({\r\n declarations: [CustomCollaborationComponent],\r\n exports: [CustomCollaborationComponent],\r\n imports: [\r\n CommonModule,\r\n LinkModule,\r\n MyCollaborationActivitiesModule,\r\n MyLatestSitesModule,\r\n ColleaguesModule,\r\n SiteIndexModule,\r\n ]\r\n})\r\nexport class CustomCollaborationModule { }\r\n","
\r\n
\r\n \r\n
\r\n
\r\n
\r\n
\r\n \r\n
\r\n
\r\n
\r\n
\r\n \r\n
\r\n
\r\n
\r\n
\r\n \r\n
\r\n
\r\n","import { NgModule } from '@angular/core';\r\nimport { RouterModule } from '@angular/router';\r\nimport { CAFCASS_CUSTOM_ROUTE_CONFIG } from './custom-route-config';\r\nimport { CustomTodayModule } from './custom-today/custom-today.component';\r\nimport { MyBoardModule } from '@app/views/my-board/my-board.component';\r\nimport { CustomFindInformationModule } from './views/custom-find-information/custom-find-information.component';\r\n\r\n@NgModule({\r\n imports: [\r\n CustomTodayModule,\r\n MyBoardModule,\r\n CustomFindInformationModule,\r\n RouterModule.forRoot(CAFCASS_CUSTOM_ROUTE_CONFIG, {\r\n scrollPositionRestoration: 'enabled',\r\n anchorScrolling: 'enabled',\r\n relativeLinkResolution: 'legacy'\r\n})\r\n ]\r\n})\r\nexport class CafcassAppRoutingModule { }\r\n","import { NgModule } from '@angular/core';\r\nimport { WorkplaceAppModule } from '@app/app.module';\r\nimport { AppComponent } from '@app/app.component';\r\nimport { BrowserModule } from '@angular/platform-browser';\r\nimport { environment } from '../environments/environment';\r\nimport { CUSTOMERENVIRONMENT } from '@app/common/app-tokens';\r\nimport { BaseTrackingService } from '@app/tracking/base-tracking.service';\r\nimport { AppInsightsService } from '@app/tracking/app-insights.service';\r\nimport { CafcassAppRoutingModule } from './app-routing.module';\r\nimport { BrowserAnimationsModule } from '@angular/platform-browser/animations';\r\nimport { ServiceWorkerModule } from '@angular/service-worker';\r\n\r\n@NgModule({\r\n declarations: [],\r\n imports: [\r\n BrowserModule,\r\n BrowserAnimationsModule,\r\n WorkplaceAppModule.forRoot(),\r\n CafcassAppRoutingModule,\r\n ServiceWorkerModule.register('ngsw-worker.js', { enabled: environment.production }),\r\n ],\r\n providers: [\r\n { provide: CUSTOMERENVIRONMENT, useValue: environment },\r\n { provide: BaseTrackingService, useClass: AppInsightsService }\r\n ],\r\n bootstrap: [AppComponent]\r\n})\r\nexport class AppModule { }\r\n","import { enableProdMode } from '@angular/core';\r\nimport { platformBrowserDynamic } from '@angular/platform-browser-dynamic';\r\n\r\nimport { AppModule } from './app/app.module';\r\nimport { environment } from './environments/environment';\r\n\r\nif (environment.production) {\r\n enableProdMode();\r\n}\r\n\r\nplatformBrowserDynamic().bootstrapModule(AppModule).catch(err => console.log(err));\r\n","import { HttpClient, HttpParams } from '@angular/common/http';\r\nimport { Inject, Injectable } from '@angular/core';\r\nimport { CUSTOMERENVIRONMENT } from '@app/common/app-tokens';\r\nimport { Constants } from '@app/common/constants';\r\nimport { HttpHelper } from '@app/common/http-helper';\r\nimport { PageQuery } from '@app/common/page-query';\r\nimport { Audit } from '@app/models/audit';\r\nimport { Page, PageType } from '@app/models/page';\r\nimport { AuditsService } from '@app/services/audits.service';\r\nimport { CacheService } from '@app/services/cache.service';\r\nimport { NewsService } from '@app/services/news.service';\r\nimport { Environment } from '@environments/interface.environment';\r\nimport { BehaviorSubject, concat, Observable, of, Subject, throwError } from 'rxjs';\r\nimport { catchError, map, shareReplay, takeUntil, tap } from 'rxjs/operators';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class PagesService implements AuditsService {\r\n\r\n constructor(\r\n @Inject(CUSTOMERENVIRONMENT) private environment: Environment,\r\n private http: HttpClient,\r\n private httpHelper: HttpHelper,\r\n private cache: CacheService,\r\n private newsService: NewsService) { }\r\n\r\n private readonly cacheKeyPrefix = 'PagesService-';\r\n public useCache = true;\r\n private internalReload$ = new Subject();\r\n public reload$ = new BehaviorSubject(null);\r\n public updatedPageFromAudit$ = new Subject();\r\n private getAllPages$: Observable;\r\n private getImages$: Observable;\r\n private getNewsPagesMap$ = new Map>();\r\n private getNewsPageMap$ = new Map>();\r\n private getContentPagesMap$ = new Map>();\r\n private getContentPageMap$ = new Map>();\r\n private getPublishedContentPages$: Observable;\r\n private getPublishedNewsPages$: Observable;\r\n\r\n public reload() {\r\n this.getAllPages$ = null;\r\n this.getPublishedContentPages$ = null;\r\n this.getPublishedNewsPages$ = null;\r\n\r\n this.getNewsPagesMap$.clear();\r\n this.getContentPagesMap$.clear();\r\n this.getNewsPageMap$.clear();\r\n this.getContentPageMap$.clear();\r\n\r\n this.internalReload$.next();\r\n\r\n if (this.useCache) {\r\n this.cache.removeAllItemsInPersistentCacheWithGeneratedKeyPrefix(this.cacheKeyPrefix);\r\n }\r\n\r\n this.reload$.next(null);\r\n\r\n this.newsService.reloadGetTopNewsApi();\r\n this.newsService.reloadGetPersonalNewsFromApi();\r\n }\r\n\r\n addPage(page: Page): Observable {\r\n // We need to append the siteUrl because there will be an authorization check in the backend against the workplace admin group on this site\r\n const httpParams = new HttpParams().append('siteUrl', encodeURI(this.environment.coreWorkplaceSiteUrl));\r\n return this.http\r\n .post(`${Constants.API_ENDPOINT}/pages`, page, { params: httpParams })\r\n .pipe(\r\n tap(() => {\r\n this.reload();\r\n }),\r\n catchError(this.httpHelper.handleError({ operation: 'addPage', result: null, rethrow: true })));\r\n }\r\n\r\n getImages(): Observable> {\r\n if (this.getImages$) {\r\n return this.getImages$;\r\n } else {\r\n const cacheKey = `${this.cacheKeyPrefix}-getImages`;\r\n this.getImages$ = this.http\r\n .get>(`${Constants.API_ENDPOINT}/Image`)\r\n .pipe(\r\n tap(data => {\r\n this.useCache && this.cache.set(cacheKey, data);\r\n }),\r\n catchError(this.httpHelper.handleError({ operation: 'getImages', result: new Array(), rethrow: true, cacheKey: cacheKey })),\r\n takeUntil(this.internalReload$),\r\n shareReplay({ bufferSize: 1, refCount: true })\r\n );\r\n\r\n if (this.useCache) {\r\n const cachedData = this.cache.get>(cacheKey);\r\n if (cachedData) {\r\n return concat(of(cachedData), this.getImages$);\r\n }\r\n }\r\n return this.getImages$;\r\n }\r\n }\r\n\r\n /** returns an url to the uploaded picture */\r\n addImage(image: File): Observable {\r\n // We need to append the siteUrl because there will be an authorization check in the backend against the workplace admin group on this site\r\n const httpParams = new HttpParams().append('siteUrl', encodeURI(this.environment.coreWorkplaceSiteUrl));\r\n // Because the backend expects data as a multipart form\r\n const formData = new FormData();\r\n formData.append('file', image);\r\n return this.http\r\n .post(`${Constants.API_ENDPOINT}/Image`, formData,\r\n {\r\n params: httpParams,\r\n observe: 'response',\r\n })\r\n .pipe(\r\n map(data => data.headers.get('location')),\r\n tap(() => {\r\n this.reload();\r\n }),\r\n catchError(this.httpHelper.handleError({ operation: 'addImage', result: null, rethrow: true })));\r\n }\r\n\r\n updatePage(id: number, page: Page): Observable {\r\n // We need to append the siteUrl because there will be an authorization check in the backend against the workplace admin group on this site\r\n const httpParams = new HttpParams().append('siteUrl', encodeURI(this.environment.coreWorkplaceSiteUrl));\r\n return this.http\r\n .put(`${Constants.API_ENDPOINT}/pages/${id}`, page, { params: httpParams })\r\n .pipe(\r\n tap(() => {\r\n this.reload();\r\n }),\r\n catchError(this.httpHelper.handleError({ operation: 'updatePage', result: null, rethrow: true })));\r\n }\r\n\r\n deletePage(id: number): Observable {\r\n // We need to append the siteUrl because there will be an authorization check in the backend against the workplace admin group on this site\r\n const httpParams = new HttpParams().append('siteUrl', encodeURI(this.environment.coreWorkplaceSiteUrl));\r\n const deleteOperation = this.http.delete(`${Constants.API_ENDPOINT}/pages/${id}`, {\r\n\r\n params: httpParams\r\n })\r\n .pipe(\r\n map(response => {\r\n console.log(`deleted result: `);\r\n console.log(response);\r\n this.reload();\r\n return response;\r\n }),\r\n catchError(this.httpHelper.handleError({ operation: 'deletePage', result: {} as Page })));\r\n\r\n return deleteOperation;\r\n }\r\n\r\n getPage(id: number): Observable {\r\n return this.http\r\n .get(`${Constants.API_ENDPOINT}/pages/${id}`)\r\n .pipe(\r\n catchError(this.httpHelper.handleError({ operation: 'getPage', result: null, rethrow: true })));\r\n }\r\n\r\n getAllPages(): Observable> {\r\n if (this.getAllPages$) {\r\n return this.getAllPages$;\r\n } else {\r\n const cacheKey = `${this.cacheKeyPrefix}-getAllPages`;\r\n this.getAllPages$ = this.http\r\n .get>(`${Constants.API_ENDPOINT}/pages`)\r\n .pipe(\r\n tap(data => {\r\n this.useCache && this.cache.set(cacheKey, data);\r\n }),\r\n catchError(this.httpHelper.handleError({ operation: 'getAllPages', result: new Array(), rethrow: true, cacheKey: cacheKey })),\r\n takeUntil(this.internalReload$),\r\n shareReplay({ bufferSize: 1, refCount: true }));\r\n\r\n if (this.useCache) {\r\n const cachedData = this.cache.get>(cacheKey);\r\n if (cachedData) {\r\n return concat(of(cachedData), this.getAllPages$);\r\n }\r\n }\r\n return this.getAllPages$;\r\n }\r\n }\r\n\r\n getPublishedContentPages(): Observable> {\r\n if (this.getPublishedContentPages$) {\r\n return this.getPublishedContentPages$;\r\n } else {\r\n const cacheKey = `${this.cacheKeyPrefix}-getPublishedContentPages`;\r\n const pq: PageQuery = { PageType: PageType.Content, IncludeDrafts: false };\r\n this.getPublishedContentPages$ = this.getPagesByQuery(pq)\r\n .pipe(\r\n tap(data => {\r\n this.useCache && this.cache.set(cacheKey, data);\r\n }),\r\n catchError(this.httpHelper.handleError({ operation: 'getPublishedContentPages', result: new Array(), rethrow: true, cacheKey: cacheKey })),\r\n takeUntil(this.internalReload$),\r\n shareReplay({ bufferSize: 1, refCount: true }));\r\n\r\n if (this.useCache) {\r\n const cachedData = this.cache.get>(cacheKey);\r\n if (cachedData) {\r\n return concat(of(cachedData), this.getPublishedContentPages$);\r\n }\r\n }\r\n return this.getPublishedContentPages$;\r\n }\r\n }\r\n\r\n getPublishedNewsPages(): Observable> {\r\n if (this.getPublishedNewsPages$) {\r\n return this.getPublishedNewsPages$;\r\n } else {\r\n const cacheKey = `${this.cacheKeyPrefix}-getPublishedNewsPages`;\r\n const pq: PageQuery = { PageType: PageType.News, IncludeDrafts: false };\r\n this.getPublishedNewsPages$ = this.getPagesByQuery(pq)\r\n .pipe(\r\n tap(data => {\r\n this.useCache && this.cache.set(cacheKey, data);\r\n }),\r\n catchError(this.httpHelper.handleError({ operation: 'getPublishedContentPages', result: new Array(), rethrow: true, cacheKey: cacheKey })),\r\n takeUntil(this.internalReload$),\r\n shareReplay({ bufferSize: 1, refCount: true }));\r\n\r\n if (this.useCache) {\r\n const cachedData = this.cache.get>(cacheKey);\r\n if (cachedData) {\r\n return concat(of(cachedData), this.getPublishedNewsPages$);\r\n }\r\n }\r\n return this.getPublishedNewsPages$;\r\n }\r\n }\r\n\r\n getContentPages(isFeaturedPage: boolean = false): Observable> {\r\n if (this.getContentPagesMap$.has(isFeaturedPage.toString())) {\r\n return this.getContentPagesMap$.get(isFeaturedPage.toString());\r\n } else {\r\n const httpParams = new HttpParams()\r\n .append('isFeaturedPage', isFeaturedPage.toString());\r\n const cacheKey = `${this.cacheKeyPrefix}-getContentPages-${isFeaturedPage.toString()}`;\r\n this.getContentPagesMap$.set(isFeaturedPage.toString(), this.http\r\n .get>(`${Constants.API_ENDPOINT}/pages/content`, {\r\n params: httpParams,\r\n })\r\n .pipe(\r\n tap(data => {\r\n this.useCache && this.cache.set(cacheKey, data);\r\n }),\r\n catchError(this.httpHelper.handleError({ operation: 'getContentPages', result: new Array(), rethrow: true, cacheKey: cacheKey })),\r\n takeUntil(this.internalReload$),\r\n shareReplay({ bufferSize: 1, refCount: true })));\r\n\r\n if (this.useCache) {\r\n const cachedData = this.cache.get>(cacheKey);\r\n if (cachedData) {\r\n return concat(of(cachedData), this.getContentPagesMap$.get(isFeaturedPage.toString()));\r\n }\r\n }\r\n return this.getContentPagesMap$.get(isFeaturedPage.toString());\r\n }\r\n }\r\n\r\n getContentPagesBySearchQuery(query: string, amount: number, isPublished = true): Observable> {\r\n const httpParams = new HttpParams()\r\n .append('query', query)\r\n .append('amount', amount.toString())\r\n .append('isPublished', isPublished.toString());\r\n const fetchOperation = this.http\r\n .get>(`${Constants.API_ENDPOINT}/pages/content/search`, {\r\n params: httpParams,\r\n })\r\n .pipe(\r\n catchError(this.httpHelper.handleError({ operation: 'getContentPagesBySearchQuery', result: new Array(), rethrow: true })),\r\n takeUntil(this.internalReload$),\r\n shareReplay({ bufferSize: 1, refCount: true }));\r\n\r\n return fetchOperation;\r\n }\r\n\r\n getNewsPages(isFeaturedPage: boolean = false): Observable> {\r\n if (this.getNewsPagesMap$.has(isFeaturedPage.toString())) {\r\n return this.getNewsPagesMap$.get(isFeaturedPage.toString());\r\n } else {\r\n const httpParams = new HttpParams()\r\n .append('isFeaturedPage', isFeaturedPage.toString());\r\n const cacheKey = `${this.cacheKeyPrefix}-getNewsPages-${isFeaturedPage.toString()}`;\r\n this.getNewsPagesMap$.set(isFeaturedPage.toString(), this.http\r\n .get>(`${Constants.API_ENDPOINT}/pages/news`, {\r\n params: httpParams,\r\n })\r\n .pipe(\r\n tap(data => {\r\n this.useCache && this.cache.set(cacheKey, data);\r\n }),\r\n catchError(this.httpHelper.handleError({ operation: 'getNewsPages', result: new Array(), rethrow: true, cacheKey: cacheKey })),\r\n takeUntil(this.internalReload$),\r\n shareReplay({ bufferSize: 1, refCount: true })));\r\n\r\n if (this.useCache) {\r\n const cachedData = this.cache.get>(cacheKey);\r\n if (cachedData) {\r\n return concat(of(cachedData), this.getNewsPagesMap$.get(isFeaturedPage.toString()));\r\n }\r\n }\r\n return this.getNewsPagesMap$.get(isFeaturedPage.toString());\r\n }\r\n }\r\n\r\n /*\r\n * slugTitleWithId should match /[a-z0-9-]+-\\d+$/g e.g (my-nice-title-4)\r\n */\r\n getNewsPage(slugTitleWithId: string): Observable {\r\n if (/[a-z0-9-]+-\\d+$/g.test(slugTitleWithId) !== true) {\r\n return throwError(`${slugTitleWithId} does not match recognized pattern`);\r\n }\r\n\r\n const cacheKey = `${this.cacheKeyPrefix}-getNewsPage-${slugTitleWithId}`;\r\n\r\n if (this.getNewsPageMap$.has(cacheKey)) {\r\n return this.getNewsPageMap$.get(cacheKey);\r\n } else {\r\n this.getNewsPageMap$.set(cacheKey, this.http\r\n .get(`${Constants.API_ENDPOINT}/pages/news/${slugTitleWithId}`)\r\n .pipe(\r\n tap(data => {\r\n this.useCache && this.cache.set(cacheKey, data);\r\n }),\r\n catchError(this.httpHelper.handleError({ operation: 'getNewsPage', result: null, rethrow: true, cacheKey: cacheKey })),\r\n takeUntil(this.internalReload$),\r\n shareReplay({ bufferSize: 1, refCount: true })));\r\n\r\n if (this.useCache) {\r\n const cachedData = this.cache.get(cacheKey);\r\n if (cachedData) {\r\n return concat(of(cachedData), this.getNewsPageMap$.get(cacheKey));\r\n }\r\n }\r\n return this.getNewsPageMap$.get(cacheKey);\r\n }\r\n }\r\n\r\n /*\r\n * slugTitleWithId should match /[a-z0-9-]+-\\d+$/g e.g (my-nice-title-4)\r\n */\r\n getContentPage(slugTitleWithId: string): Observable {\r\n if (/[a-z0-9-]+-\\d+$/g.test(slugTitleWithId) !== true) {\r\n return throwError(`${slugTitleWithId} does not match recognized pattern`);\r\n }\r\n\r\n const cacheKey = `${this.cacheKeyPrefix}-getContentPage-${slugTitleWithId}`;\r\n\r\n if (this.getContentPageMap$.has(cacheKey)) {\r\n return this.getContentPageMap$.get(cacheKey);\r\n } else {\r\n this.getContentPageMap$.set(cacheKey, this.http\r\n .get(`${Constants.API_ENDPOINT}/pages/content/${slugTitleWithId}`)\r\n .pipe(\r\n tap(data => {\r\n this.useCache && this.cache.set(cacheKey, data);\r\n }),\r\n catchError(this.httpHelper.handleError({ operation: 'getContentPage', result: null, rethrow: true, cacheKey: cacheKey })),\r\n takeUntil(this.internalReload$),\r\n shareReplay({ bufferSize: 1, refCount: true })));\r\n\r\n if (this.useCache) {\r\n const cachedData = this.cache.get(cacheKey);\r\n if (cachedData) {\r\n return concat(of(cachedData), this.getContentPageMap$.get(cacheKey));\r\n }\r\n }\r\n return this.getContentPageMap$.get(cacheKey);\r\n }\r\n }\r\n\r\n getAudits(id: number): Observable> {\r\n // We need to append the siteUrl because there will be an authorization check in the backend against the workplace admin group on this site\r\n const httpParams = new HttpParams().append('siteUrl', encodeURI(this.environment.coreWorkplaceSiteUrl));\r\n return this.http.\r\n get>(`${Constants.API_ENDPOINT}/pages/${id}/audits`, { params: httpParams })\r\n .pipe(\r\n map(results => {\r\n return results.map(r => new Audit(r));\r\n }),\r\n catchError(this.httpHelper.handleError({ operation: 'getAudits', result: null, rethrow: true }))\r\n );\r\n }\r\n\r\n restoreToAudit(id: number, auditId: number): Observable {\r\n // We need to append the siteUrl because there will be an authorization check in the backend against the workplace admin group on this site\r\n const httpParams = new HttpParams().append('siteUrl', encodeURI(this.environment.coreWorkplaceSiteUrl));\r\n return this.http.post(`${Constants.API_ENDPOINT}/pages/${id}/audits/${auditId}/restore`, {}, {\r\n params: httpParams\r\n })\r\n .pipe(\r\n tap((page) => {\r\n this.reload();\r\n this.updatedPageFromAudit$.next(new Page(page));\r\n }),\r\n catchError(this.httpHelper.handleError({ operation: 'restoreToAudit', result: null, rethrow: true })));\r\n }\r\n\r\n getPagesByQuery(q: PageQuery): Observable> {\r\n const fetchOperation = this.http.post>(`${Constants.API_ENDPOINT}/pages/query/`, q, {\r\n\r\n })\r\n .pipe(\r\n catchError(this.httpHelper.handleError({ operation: 'query for pages', result: new Array(), rethrow: true })),\r\n takeUntil(this.internalReload$));\r\n return fetchOperation;\r\n }\r\n\r\n}\r\n","export class SimplifiedTerm {\r\n public Guid: string;\r\n public Name: string;\r\n public InternalName: string;\r\n public Url: string;\r\n public FriendlyUrl: string;\r\n public TermCount = 0;\r\n public LastModified: Date;\r\n public Terms: Array = new Array();\r\n public Labels: Array;\r\n public LocalCustomProperties: { [key: string]: string; } = {};\r\n public IsRoot: boolean;\r\n public IsAvailableForTagging: boolean;\r\n public IsDeprecated: boolean;\r\n public ParentTermGuid?: string;\r\n\r\n public Selected: boolean;\r\n public DisableSelection: boolean;\r\n public UseRadioButtons: boolean; // Use \"single select\" on child terms\r\n\r\n constructor(opt?: Partial) {\r\n Object.assign(this, opt);\r\n this.Terms = this.Terms.map(t => new SimplifiedTerm(t));\r\n this.TermCount = this.Terms.length;\r\n }\r\n}\r\n\r\nexport interface TermLabel {\r\n Name: string;\r\n Language: number;\r\n}\r\n","import { HttpClient, HttpParams } from '@angular/common/http';\r\nimport { Inject, Injectable, LOCALE_ID } from '@angular/core';\r\nimport { CUSTOMERENVIRONMENT } from '@app/common/app-tokens';\r\nimport { Constants } from '@app/common/constants';\r\nimport { HttpHelper } from '@app/common/http-helper';\r\nimport { LanguageTerm } from '@app/models/language-term';\r\nimport { SimplifiedTerm } from '@app/models/simplified-term';\r\nimport { CacheService } from '@app/services/cache.service';\r\nimport { LicenseService } from '@app/services/license.service';\r\nimport { TaxonomyService } from '@app/services/taxonomy.service';\r\nimport { Environment } from '@environments/interface.environment';\r\nimport { addHours, differenceInMinutes } from 'date-fns';\r\nimport { Observable, of } from 'rxjs';\r\nimport { catchError, map, mergeMap, tap } from 'rxjs/operators';\r\nimport { CultureService } from './culture.service';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class LanguageTermService {\r\n\r\n constructor(\r\n @Inject(LOCALE_ID) private localeId: string,\r\n @Inject(CUSTOMERENVIRONMENT) private environment: Environment,\r\n private http: HttpClient,\r\n private cache: CacheService,\r\n private httpHelper: HttpHelper,\r\n private taxonomyService: TaxonomyService,\r\n private licenseService: LicenseService,\r\n private cultureService: CultureService) { }\r\n\r\n private readonly cacheKeyPrefix = 'LanguageTermService';\r\n public useCache = true;\r\n\r\n getLanguages(noCache?: boolean): Observable> {\r\n return this.licenseService.hasUserAny365License()\r\n .pipe(\r\n mergeMap(hasUser365License => {\r\n if (hasUser365License) {\r\n return this.getLanguageTermsFromSharePoint(noCache);\r\n } else {\r\n return this.getLanguageTermsFromApi();\r\n }\r\n }));\r\n }\r\n\r\n getLanguageTermsFromSharePoint(noCache?: boolean, filterDeprecated = false): Observable> {\r\n const cacheKey = `${this.cacheKeyPrefix}-getLanguageTermsFromSharePoint-${this.localeId}`;\r\n\r\n const fetchOperation = this.taxonomyService.getTermSet(Constants.LANGUAGE_TERMSET_GUID, filterDeprecated)\r\n .pipe(\r\n map(response => {\r\n return response.map(term => new SimplifiedTerm(term)).sort((a, b) => a?.Name?.localeCompare(b?.Name));\r\n }),\r\n tap(data => {\r\n this.useCache && this.cache.set(cacheKey, data, addHours(new Date(), 1)); // expire cache within one hour\r\n }),\r\n catchError(this.httpHelper.handleError({ operation: 'getLanguageTermsFromSharePoint', result: new Array(), rethrow: true, cacheKey: cacheKey })));\r\n\r\n if (this.useCache && !noCache) {\r\n const cachedData = this.cache.getCachableInfo>(cacheKey);\r\n if (cachedData) {\r\n if (differenceInMinutes(new Date(cachedData.AbsoluteExpirationDate), new Date) <= 30) {\r\n // If we have cached data and its about to expire within 30 min we check for any changes since last fetch)\r\n return this.taxonomyService\r\n .getAmountOfChangesSince(new Date(cachedData.AddedToCache))\r\n .pipe(\r\n mergeMap(amount => {\r\n if (amount > 0) {\r\n return fetchOperation;\r\n } else {\r\n return of(cachedData.Data)\r\n .pipe(\r\n tap(data => {\r\n // We'll assume the cache is good and set the expire time one hour from now before we check for new changes.\r\n this.cache.set(cacheKey, data, addHours(new Date(), 1)); // expire cache within one hour\r\n }));\r\n }\r\n })\r\n );\r\n } else {\r\n return of(cachedData.Data);\r\n }\r\n }\r\n }\r\n return fetchOperation;\r\n }\r\n\r\n getLanguageTermsFromApi(): Observable> {\r\n return this.cultureService.getLcidForCurrentLocale().pipe(\r\n mergeMap(lcid => {\r\n return this.http\r\n .get>(`${Constants.API_ENDPOINT}/languageterms/localized/${lcid}`)\r\n .pipe(\r\n map(results => results.map(r => new SimplifiedTerm(r)).sort((a, b) => a?.Name?.localeCompare(b?.Name)))\r\n );\r\n }),\r\n catchError(this.httpHelper.handleError({ operation: 'getLanguageTermsFromApi', result: null, rethrow: true })));\r\n }\r\n\r\n removeLanguageTermsFromApi(termId: string): Observable {\r\n return this.http\r\n .delete(`${Constants.API_ENDPOINT}/languageterms/${termId}`)\r\n .pipe(\r\n catchError(this.httpHelper.handleError({ operation: 'removeLanguageTermsFromApi', result: null, rethrow: true }))\r\n );\r\n }\r\n\r\n addOrUpdateLanguageTermsInApi(terms: Array): Observable> {\r\n // We need to append the siteUrl because there will be an authorization check in the backend against the workplace admin group on this site\r\n const httpParams = new HttpParams().append('siteUrl', encodeURI(this.environment.coreWorkplaceSiteUrl));\r\n return this.http.\r\n post>(`${Constants.API_ENDPOINT}/LanguageTerms/`, terms, { params: httpParams })\r\n .pipe(\r\n catchError(this.httpHelper.handleError({ operation: 'addOrUpdateLanguageTermsInApi', result: null, rethrow: true }))\r\n );\r\n }\r\n}\r\n","import { parseISO } from 'date-fns';\r\nimport { Observable } from 'rxjs';\r\nimport { ChannelTermAppTile } from './channel-term-app-tile';\r\nimport { LanguageTermAppTile } from './language-term-app-tile';\r\nimport { AppTileBroadcastMessages } from './message-broadcast-app-tile';\r\n\r\nexport class AppTile {\r\n public Id: number;\r\n public Title: string;\r\n public Description: string;\r\n public Url: string;\r\n public IconClass: string;\r\n public IconUrl: string;\r\n public ColorClass: string;\r\n public ColorHexCode: string;\r\n public IntegrationEndpointUrl: string;\r\n public IsPersonal: boolean;\r\n public ShowAsNewUntilThisDate: Date;\r\n public Modified: Date;\r\n public ChannelTermAppTiles: Array;\r\n public LanguageTermAppTiles: Array;\r\n public AppTileBroadcastMessages: Array;\r\n public Subscribed: boolean;\r\n public ChannelSubscribed: boolean;\r\n public UnreadCounter$: Observable;\r\n public O365ServiceName: string;\r\n public UserIsLicensed: boolean;\r\n public Introduction: string;\r\n public IntroductionVideo: string;\r\n\r\n /** If the current tile is a smart link > this will have add special behaviour, such as rounding the image corner */\r\n public IsSmartLink?: boolean;\r\n public Start?: Date;\r\n public End?: Date;\r\n\r\n /** Cron expression\r\n\r\n ┌───────────── minute (0 - 59)\r\n │ ┌───────────── hour (0 - 23)\r\n │ │ ┌───────────── day of the month (1 - 31)\r\n │ │ │ ┌───────────── month (1 - 12)\r\n │ │ │ │ ┌───────────── day of the week (0 - 6) (Sunday to Saturday)\r\n │ │ │ │ │\r\n │ │ │ │ │\r\n * * * * *\r\n\r\n Validation site: https://crontab.guru/\r\n */\r\n public CronSchedule?: string;\r\n\r\n public CronTimeZoneId?: string;\r\n\r\n public IsRecurring?: boolean;\r\n\r\n public IsWithinTimeSpan?: boolean;\r\n\r\n /** How long to show the link each time it recurrs. */\r\n public RecurringDuration?: {\r\n Hours: number;\r\n Minutes: number;\r\n };\r\n\r\n constructor(opt?: Partial) {\r\n if (opt) {\r\n if (opt.ShowAsNewUntilThisDate && typeof opt.ShowAsNewUntilThisDate === 'string') {\r\n opt.ShowAsNewUntilThisDate = parseISO(opt.ShowAsNewUntilThisDate);\r\n }\r\n\r\n if (opt.Modified && typeof opt.Modified === 'string') {\r\n opt.Modified = parseISO(opt.Modified);\r\n }\r\n\r\n // scheduling for smart links (parse dates)\r\n if (opt.IsSmartLink) {\r\n if (opt && opt.Start && typeof opt.Start === 'string') {\r\n opt.Start = parseISO(opt.Start);\r\n }\r\n\r\n if (opt.End && typeof opt.End === 'string') {\r\n opt.End = parseISO(opt.End);\r\n }\r\n }\r\n\r\n if (opt.ChannelTermAppTiles && opt.ChannelTermAppTiles.length > 0) {\r\n opt.ChannelTermAppTiles = opt.ChannelTermAppTiles.map(c => new ChannelTermAppTile({ AppTileId: c.AppTileId, ChannelTermId: c.ChannelTermId }));\r\n }\r\n\r\n if (opt.LanguageTermAppTiles && opt.LanguageTermAppTiles.length > 0) {\r\n opt.LanguageTermAppTiles = opt.LanguageTermAppTiles.map(c => new LanguageTermAppTile({ AppTileId: c.AppTileId, LanguageTermId: c.LanguageTermId }));\r\n }\r\n }\r\n\r\n Object.assign(this, opt);\r\n }\r\n}\r\n","export interface Principal {\r\n Id: string; // The ObjectId in Azure AD\r\n PrincipalType: PrincipalType;\r\n}\r\n\r\nexport enum PrincipalType {\r\n Group = 0,\r\n User = 1\r\n}\r\n","import { HttpClient, HttpParams } from '@angular/common/http';\r\nimport { Injectable } from '@angular/core';\r\nimport { Constants } from '@app/common/constants';\r\nimport { HttpHelper } from '@app/common/http-helper';\r\nimport { PrincipalType } from '@app/models/principal';\r\nimport { UserItemToRead } from '@app/models/user-item-to-read';\r\nimport { FeatureSettingsStoreService } from '@app/services/feature-settings-store.service';\r\nimport { SecurityService } from '@app/services/security.service';\r\nimport { UserService } from '@app/services/user.service';\r\nimport { forkJoin, Observable, of } from 'rxjs';\r\nimport { catchError, concatMap, map } from 'rxjs/operators';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class UserItemsToReadService {\r\n\r\n constructor(\r\n private http: HttpClient,\r\n private securityService: SecurityService,\r\n private userService: UserService,\r\n private httpHelper: HttpHelper,\r\n private featureSettingsStore: FeatureSettingsStoreService) { }\r\n\r\n getAllUserItemsToRead(): Observable> {\r\n const httpParams = new HttpParams().append('includeDrafts', `${this.featureSettingsStore.state.includeDraftsInReqReadList}`);\r\n\r\n return this.http.get>(`${Constants.API_ENDPOINT}/me/useritemstoread`,\r\n {\r\n params: httpParams\r\n })\r\n .pipe(\r\n concatMap(result => {\r\n if (result && result.length > 0) {\r\n let groupIds = new Array();\r\n result.forEach(r => {\r\n const groupPrincipalIds = r.ItemToRead.ItemsToReadForPrincipal.filter(p => p.Principal.PrincipalType === PrincipalType.Group).map(p => p.PrincipalId);\r\n groupIds = groupIds.concat(groupPrincipalIds);\r\n });\r\n return forkJoin([this.securityService.checkMembershipToOffice365Groups(groupIds), this.userService.getMyDetailsFromMsGraph(), of(result)])\r\n .pipe(\r\n map(([groupMemberships, userDetails, itemsToRead]) => {\r\n return itemsToRead.filter(i => {\r\n if (i.ItemToRead.ItemsToReadForPrincipal.some(p => p.Principal.PrincipalType === PrincipalType.User && p.PrincipalId === userDetails.id)) {\r\n // always return when user is explicitly assigned\r\n return i;\r\n }\r\n const groupPrincipalIds = i.ItemToRead.ItemsToReadForPrincipal.filter(p => p.Principal.PrincipalType === PrincipalType.Group).map(p => p.PrincipalId);\r\n const userIsMemberOfOneOfTheGroups = groupMemberships.some(g => groupPrincipalIds.some(p => p === g.GroupId && g.UserIsMember));\r\n if (userIsMemberOfOneOfTheGroups) {\r\n return i;\r\n }\r\n });\r\n }));\r\n } else {\r\n return of(new Array());\r\n }\r\n }),\r\n catchError(this.httpHelper.handleError({ operation: 'getAllUserItemsToRead', result: null, rethrow: true })));\r\n }\r\n\r\n getNewOrUpdatedUserToReadSinceLastVisit(lastVisitedDate: Date): Observable> {\r\n const httpParams = new HttpParams()\r\n .append('lastVisitedDate', `${lastVisitedDate.toISOString()}`)\r\n .append('includeDrafts', `${this.featureSettingsStore.state.includeDraftsInReqReadList}`);\r\n\r\n return this.http\r\n .get>(`${Constants.API_ENDPOINT}/me/useritemstoread/updates`, {\r\n params: httpParams\r\n })\r\n .pipe(\r\n concatMap(result => {\r\n if (result && result.length > 0) {\r\n let groupIds = new Array();\r\n result.forEach(r => {\r\n const groupPrincipalIds = r.ItemToRead.ItemsToReadForPrincipal.filter(p => p.Principal.PrincipalType === PrincipalType.Group).map(p => p.PrincipalId);\r\n groupIds = groupIds.concat(groupPrincipalIds);\r\n });\r\n return forkJoin([this.securityService.checkMembershipToOffice365Groups(groupIds), this.userService.getMyDetailsFromMsGraph(), of(result)])\r\n .pipe(\r\n map(([groupMemberships, userDetails, itemsToRead]) => {\r\n return itemsToRead.filter(i => {\r\n if (i.ItemToRead.ItemsToReadForPrincipal.some(p => p.Principal.PrincipalType === PrincipalType.User && p.PrincipalId === userDetails.id)) {\r\n // always return when user is explicitly assigned\r\n return i;\r\n }\r\n const groupPrincipalIds = i.ItemToRead.ItemsToReadForPrincipal.filter(p => p.Principal.PrincipalType === PrincipalType.Group).map(p => p.PrincipalId);\r\n const userIsMemberOfOneOfTheGroups = groupMemberships.some(g => groupPrincipalIds.some(p => p === g.GroupId && g.UserIsMember));\r\n if (userIsMemberOfOneOfTheGroups) {\r\n return i;\r\n }\r\n });\r\n }));\r\n } else {\r\n return of(new Array());\r\n }\r\n }),\r\n catchError(this.httpHelper.handleError({ operation: 'getNewOrUpdatedUserToReadSinceLastVisit', result: null, rethrow: true })));\r\n }\r\n\r\n updateUserItem(guid: string, userItemToRead: UserItemToRead): Observable {\r\n return this.http.put(`${Constants.API_ENDPOINT}/me/useritemstoread?guid=${guid}`, userItemToRead)\r\n .pipe(\r\n catchError(this.httpHelper.handleError({ operation: 'updateUserItem', result: null, rethrow: true })));\r\n }\r\n\r\n getAllUserItemsHasRead(): Observable> {\r\n return this.http.get>(`${Constants.API_ENDPOINT}/me/useritemstoread/hasread`)\r\n .pipe(\r\n catchError(this.httpHelper.handleError({ operation: 'getAllUserItemsHasRead', result: null, rethrow: true })));\r\n }\r\n}\r\n","export enum FirstDayWizardStep {\r\n None = 0,\r\n SetupYourFeed = 1,\r\n SetupYourBoard = 2,\r\n SetupLanguage = 3,\r\n}\r\n","import { Injectable, Inject } from '@angular/core';\r\nimport { UserChannelTermsService } from '@app/services/user-channel-terms.service';\r\nimport { UserLanguageTermService } from '@app/services/user-language-term.service';\r\nimport { HttpClient, HttpParams } from '@angular/common/http';\r\nimport { CacheService } from '@app/services/cache.service';\r\nimport { FeatureSettingsStoreService } from '@app/services/feature-settings-store.service';\r\nimport { ChannelTermInfoBox, InfoB, InfoBoxArea, InfoBoxHeight, InfoBoxStyle, InfoBoxType, InfoBoxWidth } from '@app/models/infobox';\r\nimport { Constants } from '@app/common/constants';\r\nimport { Subject, BehaviorSubject, Observable, concat, of, forkJoin } from 'rxjs';\r\nimport { map, tap, catchError, takeUntil, shareReplay, mergeMap, filter, concatMap, first } from 'rxjs/operators';\r\nimport { HttpHelper } from '@app/common/http-helper';\r\nimport { Environment } from '@environments/interface.environment';\r\nimport { CUSTOMERENVIRONMENT } from '@app/common/app-tokens';\r\nimport { applyLanguageFilteringSingle } from '@app/common/filtering-behavior';\r\nimport { ComponentStatesOnRoutesService } from '@app/services/component-states-on-routes.service';\r\nimport { ListItem } from '@microsoft/microsoft-graph-types';\r\nimport { ImageService } from '@app/services/image.service';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class InfoboxService {\r\n\r\n constructor(\r\n @Inject(CUSTOMERENVIRONMENT) private environment: Environment,\r\n private http: HttpClient,\r\n private userChannelTermsService: UserChannelTermsService,\r\n private userLanguageTermService: UserLanguageTermService,\r\n private featureSettingsStoreService: FeatureSettingsStoreService,\r\n private componentStatesOnRoutesService: ComponentStatesOnRoutesService,\r\n private httpHelper: HttpHelper,\r\n private cache: CacheService,\r\n private imageService: ImageService) {\r\n\r\n this.componentStatesOnRoutesService\r\n .state$\r\n .pipe(\r\n filter(componentsOnRouteState => {\r\n let shouldReload = false;\r\n if (componentsOnRouteState) {\r\n componentsOnRouteState.RouteMap.forEach(val => {\r\n if (val.some(s => s.ComponentId === 'app-infobox-zone' && s.Refresh)) {\r\n shouldReload = true;\r\n }\r\n });\r\n }\r\n return shouldReload;\r\n }))\r\n .subscribe(componentsOnRouteState => {\r\n if (componentsOnRouteState) {\r\n this.reload();\r\n }\r\n });\r\n }\r\n\r\n private readonly cacheKey = 'InfoboxService-getInfoBoxes';\r\n private readonly myActiveCacheKey = `${this.cacheKey}-active`;\r\n private readonly futureCacheKey = `${this.cacheKey}-future`;\r\n private readonly allCacheKey = `${this.cacheKey}-all`;\r\n public useCache = true;\r\n private reload$ = new Subject();\r\n public refresh$ = new BehaviorSubject(null);\r\n currentEditMode$ = new BehaviorSubject(false);\r\n editMode = this.currentEditMode$.value;\r\n\r\n getAllInfoBoxes$: Observable>;\r\n private getMyActiveInfoBoxes$ = new Map>>();\r\n private getActiveAndFutureInfoBoxes$ = new Map>>();\r\n\r\n public reload() {\r\n this.getMyActiveInfoBoxes$.clear();\r\n this.getActiveAndFutureInfoBoxes$.clear();\r\n this.getAllInfoBoxes$ = null;\r\n if (this.useCache) {\r\n this.cache.removeAllItemsInPersistentCacheWithGeneratedKeyPrefix(this.cacheKey);\r\n }\r\n this.reload$.next();\r\n this.refresh$.next(null);\r\n }\r\n\r\n getMyActiveInfoBoxes(route: string, area: string): Observable> {\r\n const cacheKey = `${this.myActiveCacheKey}-${route}-${area}`;\r\n if (this.getMyActiveInfoBoxes$.has(cacheKey)) {\r\n return this.getMyActiveInfoBoxes$.get(cacheKey);\r\n } else {\r\n const httpParams = new HttpParams().append('route', route).append('area', area);\r\n const infoBoxes$ = forkJoin([\r\n this.http.get>(`${Constants.API_ENDPOINT}/infoboxes`, { params: httpParams }),\r\n this.userChannelTermsService.getUserChannelTerms()\r\n ])\r\n .pipe(\r\n map(([response, userChannelTerms]) => {\r\n console.log(`fetched result getMyActiveInfoBoxes: `, response);\r\n return response\r\n .map(p => new InfoB(p))\r\n .filter(infoBox => {\r\n const channelTerms = infoBox.ChannelTermInfoBoxes;\r\n if (channelTerms && channelTerms.length > 0) {\r\n let found = true;\r\n const matchingChannels = channelTerms.filter(channel => {\r\n found = userChannelTerms.some(ct => ct.ChannelTermId === channel.ChannelTermId);\r\n if (found) {\r\n return channel;\r\n }\r\n });\r\n if (matchingChannels && matchingChannels.length > 0) {\r\n return infoBox;\r\n }\r\n } else {\r\n return infoBox;\r\n }\r\n });\r\n })\r\n );\r\n\r\n this.getMyActiveInfoBoxes$.set(cacheKey,\r\n infoBoxes$\r\n .pipe(\r\n mergeMap((infoBoxes) => {\r\n infoBoxes = infoBoxes.filter(ib => !ib.Hidden);\r\n // Language filter toggle\r\n if (this.featureSettingsStoreService.state.enableLanguageFilteringForWorkplaceInfoboxes) {\r\n return this.userLanguageTermService\r\n .getUserLanguageTerms()\r\n .pipe(\r\n map((userLanguageTerms) => {\r\n return applyLanguageFilteringSingle(infoBoxes, userLanguageTerms, this.featureSettingsStoreService.state.enableShowNonLanguageContentForAllUsers, this.featureSettingsStoreService.state.defaultLanguageTermId);\r\n }));\r\n } else {\r\n return of(infoBoxes);\r\n }\r\n }),\r\n tap(data => {\r\n this.useCache && this.cache.set(cacheKey, data);\r\n }),\r\n catchError(this.httpHelper.handleError({ operation: 'getMyActiveInfoBoxes', result: new Array(), cacheKey: cacheKey })),\r\n takeUntil(this.reload$),\r\n shareReplay({ bufferSize: 1, refCount: true })));\r\n\r\n if (this.useCache) {\r\n const cachedData = this.cache.get>(cacheKey);\r\n if (cachedData) {\r\n return concat(of(cachedData), this.getMyActiveInfoBoxes$.get(cacheKey));\r\n }\r\n }\r\n return this.getMyActiveInfoBoxes$.get(cacheKey);\r\n }\r\n }\r\n\r\n getActiveAndFutureInfoBoxes(route: string, area: string): Observable> {\r\n const cacheKey = `${this.futureCacheKey}-${route}-${area}`;\r\n if (this.getActiveAndFutureInfoBoxes$.has(cacheKey)) {\r\n return this.getActiveAndFutureInfoBoxes$.get(cacheKey);\r\n } else {\r\n const httpParams = new HttpParams()\r\n .append('route', route)\r\n .append('area', area)\r\n .append('includeFuture', 'true');\r\n\r\n const infoBoxes$ = forkJoin([\r\n this.http.get>(`${Constants.API_ENDPOINT}/infoboxes`, { params: httpParams })\r\n ])\r\n .pipe(\r\n map(([response]) => {\r\n console.log(`fetched result getActiveAndFutureInfoBoxes: `, response);\r\n return response\r\n .map(p => new InfoB(p));\r\n })\r\n );\r\n\r\n this.getActiveAndFutureInfoBoxes$.set(cacheKey,\r\n infoBoxes$\r\n .pipe(\r\n mergeMap((infoBoxes) => {\r\n infoBoxes = infoBoxes.filter(ib => !ib.Hidden);\r\n // Language filter toggle\r\n if (this.featureSettingsStoreService.state.enableLanguageFilteringForWorkplaceInfoboxes) {\r\n return this.userLanguageTermService\r\n .getUserLanguageTerms()\r\n .pipe(\r\n map((userLanguageTerms) => {\r\n return applyLanguageFilteringSingle(infoBoxes, userLanguageTerms, this.featureSettingsStoreService.state.enableShowNonLanguageContentForAllUsers, this.featureSettingsStoreService.state.defaultLanguageTermId);\r\n }));\r\n } else {\r\n return of(infoBoxes);\r\n }\r\n }),\r\n tap(data => {\r\n this.useCache && this.cache.set(cacheKey, data);\r\n }),\r\n catchError(this.httpHelper.handleError({ operation: 'getFutureInfoBoxes', result: new Array(), cacheKey: cacheKey })),\r\n takeUntil(this.reload$),\r\n shareReplay({ bufferSize: 1, refCount: true })));\r\n\r\n if (this.useCache) {\r\n const cachedData = this.cache.get>(cacheKey);\r\n if (cachedData) {\r\n return concat(of(cachedData), this.getActiveAndFutureInfoBoxes$.get(cacheKey));\r\n }\r\n }\r\n return this.getActiveAndFutureInfoBoxes$.get(cacheKey);\r\n }\r\n }\r\n\r\n getInfoBox(id: number): Observable {\r\n return this.http.get(`${Constants.API_ENDPOINT}/infoboxes/${id}`)\r\n .pipe(\r\n map(response => {\r\n console.log(`fetched result getInfoBox: `, response);\r\n return new InfoB(response);\r\n }),\r\n catchError(this.httpHelper.handleError({ operation: 'getInfoBox', result: null }))\r\n );\r\n }\r\n\r\n getInfoBoxAreas(): Observable> {\r\n return this.http.get(`${Constants.API_ENDPOINT}/infoboxes/areas`)\r\n .pipe(\r\n catchError(this.httpHelper.handleError({ operation: 'getInfoBoxAreas', result: null }))\r\n );\r\n }\r\n\r\n getAllInfoBoxes(filterOnLanguageIfEnabled = false): Observable> {\r\n if (this.getAllInfoBoxes$) {\r\n return this.getAllInfoBoxes$;\r\n } else {\r\n this.getAllInfoBoxes$ = this.http.get>(`${Constants.API_ENDPOINT}/infoboxes/all`)\r\n .pipe(\r\n map(response => {\r\n console.log(`fetched result getAllInfoBoxes: `, response);\r\n return response.map(p => new InfoB(p));\r\n }),\r\n mergeMap(boxes => {\r\n // Language filter toggle\r\n if (filterOnLanguageIfEnabled && this.featureSettingsStoreService.state.enableLanguageFilteringForWorkplaceInfoboxes) {\r\n return this.userLanguageTermService\r\n .getUserLanguageTerms()\r\n .pipe(\r\n map((userLanguageTerms) => {\r\n return applyLanguageFilteringSingle(boxes, userLanguageTerms, this.featureSettingsStoreService.state.enableShowNonLanguageContentForAllUsers, this.featureSettingsStoreService.state.defaultLanguageTermId);\r\n }));\r\n } else {\r\n return of(boxes);\r\n }\r\n }),\r\n tap(data => {\r\n this.useCache && this.cache.set(this.allCacheKey, data);\r\n }),\r\n catchError(this.httpHelper.handleError({ operation: 'getAllInfoBoxes', result: new Array(), cacheKey: this.allCacheKey })),\r\n takeUntil(this.reload$),\r\n shareReplay({ bufferSize: 1, refCount: true }));\r\n\r\n if (this.useCache) {\r\n const cachedData = this.cache.get>(this.allCacheKey);\r\n if (cachedData) {\r\n return concat(of(cachedData), this.getAllInfoBoxes$);\r\n }\r\n }\r\n return this.getAllInfoBoxes$;\r\n }\r\n }\r\n\r\n updateInfoboxes(infoBoxes: Array): Observable> {\r\n // We need to append the siteUrl because there will be an authorization check in the backend against the workplace admin group on this site\r\n const httpParams = new HttpParams().append('siteUrl', encodeURI(this.environment.coreWorkplaceSiteUrl));\r\n const fetchOperation = this.http.put>(`${Constants.API_ENDPOINT}/infoboxes`, infoBoxes, {\r\n params: httpParams\r\n })\r\n .pipe(\r\n map(response => {\r\n console.log(`updated result: `);\r\n console.log(response);\r\n this.reload();\r\n return infoBoxes;\r\n }),\r\n catchError(this.httpHelper.handleError({ operation: 'updateInfoboxes', result: ({} as InfoB[]), rethrow: true })));\r\n\r\n return fetchOperation;\r\n }\r\n\r\n updateInfobox(id: number, infobox: InfoB): Observable {\r\n // We need to append the siteUrl because there will be an authorization check in the backend against the workplace admin group on this site\r\n const httpParams = new HttpParams().append('siteUrl', encodeURI(this.environment.coreWorkplaceSiteUrl));\r\n const fetchOperation = this.http.put(`${Constants.API_ENDPOINT}/infoboxes/${id}`, infobox, {\r\n params: httpParams\r\n })\r\n .pipe(\r\n map(response => {\r\n console.log(`updated result: `);\r\n console.log(response);\r\n this.reload();\r\n return infobox;\r\n }));\r\n\r\n return fetchOperation;\r\n }\r\n\r\n deleteInfobox(id: number): Observable {\r\n // We need to append the siteUrl because there will be an authorization check in the backend against the workplace admin group on this site\r\n const httpParams = new HttpParams().append('siteUrl', encodeURI(this.environment.coreWorkplaceSiteUrl));\r\n const fetchOperation = this.http.delete(`${Constants.API_ENDPOINT}/infoboxes/${id}`, {\r\n params: httpParams\r\n })\r\n .pipe(\r\n map(response => {\r\n console.log(`deleted result: `);\r\n console.log(response);\r\n this.reload();\r\n return response;\r\n }),\r\n catchError(this.httpHelper.handleError({ operation: 'deleteInfobox', result: new InfoB() })));\r\n\r\n return fetchOperation;\r\n }\r\n\r\n hideInfobox(id: number): Observable {\r\n // We need to append the siteUrl because there will be an authorization check in the backend against the workplace admin group on this site\r\n const httpParams = new HttpParams().append('siteUrl', encodeURI(this.environment.coreWorkplaceSiteUrl));\r\n const updateOperation = this.http.put(`${Constants.API_ENDPOINT}/infoboxes/${id}/hide`, {\r\n params: httpParams\r\n })\r\n .pipe(\r\n map(response => {\r\n console.log(`updated result: `);\r\n console.log(response);\r\n this.reload();\r\n return response;\r\n }));\r\n\r\n return updateOperation;\r\n }\r\n\r\n addInfobox(infoBox: InfoB): Observable {\r\n // We need to append the siteUrl because there will be an authorization check in the backend against the workplace admin group on this site\r\n const httpParams = new HttpParams().append('siteUrl', encodeURI(this.environment.coreWorkplaceSiteUrl));\r\n const fetchOperation = this.http.post(`${Constants.API_ENDPOINT}/infoboxes`, infoBox, {\r\n params: httpParams\r\n })\r\n .pipe(\r\n map(response => {\r\n console.log(`added result: `);\r\n console.log(response);\r\n this.reload();\r\n return new InfoB(response);\r\n }));\r\n\r\n return fetchOperation;\r\n }\r\n\r\n getInfoboxesFromGraphAndCopyToWorkplace() {\r\n const listsRequest = `${this.environment.coreWorkplaceSiteUrl}/_api/v2.0/sharePoint/getBaseItemByUrl(url='/lists/InfoBoxes')/items`;\r\n const now = new Date().toISOString();\r\n const httpParams = new HttpParams()\r\n .append('expand', 'fields')\r\n .append('filter', '(fields/BoolField_ContentStartDate le \\'' + now + '\\' or fields/BoolField_ContentStartDate eq null) and (fields/BoolField_ContentEndDate ge \\'' + now + '\\' or fields/BoolField_ContentEndDate eq null)')\r\n .append('orderby', 'fields/Modified desc')\r\n .append('select', 'fields,id,parentReference,contentType')\r\n .append('top', '500');\r\n\r\n return this.http\r\n .get(listsRequest, {\r\n params: httpParams,\r\n headers: {\r\n 'Prefer': 'HonorNonIndexedQueriesWarningMayFailRandomly'\r\n }\r\n })\r\n .pipe(\r\n concatMap((listItemResult) => {\r\n const mappedItems = (listItemResult.value as ListItem[])\r\n .map(item => {\r\n const contentType = item.contentType.id;\r\n let typeOfInfoBox: InfoBoxType;\r\n let imageUrlToFetch: string;\r\n if (contentType.indexOf(Constants.CT_WORKPLACE_INFOBOX_TEXT_GUID) > -1) {\r\n typeOfInfoBox = InfoBoxType.Text;\r\n }\r\n if (contentType.indexOf(Constants.CT_WORKPLACE_INFOBOX_PICTURE_GUID) > -1) {\r\n typeOfInfoBox = InfoBoxType.Picture;\r\n imageUrlToFetch = `${this.environment.coreWorkplaceSiteUrl}/_api/web/lists(guid'${item.parentReference['listId']}')/items(${item.id})/FieldValuesAsHtml?$select=BoolField_InfoboxPicture`;\r\n }\r\n if (contentType.indexOf(Constants.CT_WORKPLACE_INFOBOX_VIDEO_GUID) > -1) {\r\n typeOfInfoBox = InfoBoxType.Video;\r\n imageUrlToFetch = `${this.environment.coreWorkplaceSiteUrl}/_api/web/lists(guid'${item.parentReference['listId']}')/items(${item.id})/FieldValuesAsHtml?$select=BoolField_InfoboxPicture`;\r\n }\r\n\r\n if (imageUrlToFetch) {\r\n return this.imageService.getPublishingImageUrl(imageUrlToFetch, undefined)\r\n .pipe(\r\n first(),\r\n map(url => {\r\n return this.buildOldInfoBox(item, typeOfInfoBox, url);\r\n })\r\n );\r\n } else {\r\n return of(this.buildOldInfoBox(item, typeOfInfoBox));\r\n }\r\n });\r\n return concat(...mappedItems);\r\n }),\r\n concatMap((item) => {\r\n const newItem = new InfoB({\r\n Type: item.Type,\r\n Title: item.Title,\r\n ShowTitle: item.ApplyTitle,\r\n Content: item.Text,\r\n LinkUrl: item.LinkUrl,\r\n LinkDescription: item.LinkDescription,\r\n PictureUrl: item.ImageUrl,\r\n VideoEmbedCode: item.VideoEmbed,\r\n Style: this.getStyle(item.WorkplaceStyle),\r\n Width: this.getWidth(item.WorkplaceSize),\r\n Height: (item.WorkplaceArea as string).toLowerCase().indexOf('compact') > -1 ? InfoBoxHeight.Compact : InfoBoxHeight.Normal,\r\n Order: this.getOrder(item.WorkplaceOrder),\r\n StartDate: item.StartDate,\r\n EndDate: item.EndDate,\r\n ChannelTermInfoBoxes: this.getChannels(item.Channels),\r\n LanguageTermId: item.LanguageTermId,\r\n AreaId: this.getArea(item.WorkplaceArea),\r\n RouteId: this.getRouteId(item.WorkplaceArea)\r\n });\r\n return this.addInfobox(newItem);\r\n })\r\n );\r\n }\r\n\r\n getChannels(channels: Array) {\r\n return channels?.map(c => {\r\n return {\r\n ChannelTermId: c.TermGuid\r\n } as ChannelTermInfoBox;\r\n });\r\n }\r\n\r\n getRouteId(area: string) {\r\n const areaInLowerCase = area.toLowerCase();\r\n if (areaInLowerCase.indexOf('hero') > -1) {\r\n return '/';\r\n }\r\n\r\n if (areaInLowerCase === 'workplace' || areaInLowerCase === 'workplace start') {\r\n return '/';\r\n }\r\n\r\n if (areaInLowerCase.indexOf('collab') > -1) {\r\n return '/collaboration';\r\n }\r\n\r\n if (areaInLowerCase.indexOf('board') > -1) {\r\n return '/your-board';\r\n }\r\n\r\n if (areaInLowerCase === 'find information') {\r\n return '/find-information';\r\n }\r\n\r\n if (areaInLowerCase.indexOf('welcome') > -1) {\r\n return '/first-day';\r\n }\r\n\r\n return area;\r\n }\r\n\r\n getArea(area: string) {\r\n const areaInLowerCase = area.toLowerCase();\r\n\r\n if (areaInLowerCase.indexOf('hero') > -1) {\r\n return 'Hero';\r\n }\r\n\r\n if (areaInLowerCase === 'workplace' || areaInLowerCase === 'workplace start') {\r\n return 'Default';\r\n }\r\n\r\n if (areaInLowerCase.indexOf('collab') > -1) {\r\n return 'Collaboration';\r\n }\r\n\r\n if (areaInLowerCase.indexOf('board') > -1) {\r\n return 'YourBoard';\r\n }\r\n\r\n if (areaInLowerCase === 'find information') {\r\n return 'FindInformation';\r\n }\r\n\r\n if (areaInLowerCase.indexOf('welcome') > -1) {\r\n return 'Welcome';\r\n }\r\n\r\n return area;\r\n }\r\n\r\n getStyle(style: string) {\r\n const styleInLower = style.toLowerCase();\r\n switch (styleInLower) {\r\n case '1. none':\r\n return InfoBoxStyle.None;\r\n case '2. accent 1':\r\n return InfoBoxStyle.Accent1;\r\n case '3. accent 2':\r\n return InfoBoxStyle.Accent2;\r\n case '4. accent 3':\r\n return InfoBoxStyle.Accent3;\r\n default:\r\n return InfoBoxStyle.None;\r\n }\r\n }\r\n\r\n getWidth(size: string) {\r\n const sizeInLower = size.toLowerCase();\r\n switch (sizeInLower) {\r\n case 'auto':\r\n return InfoBoxWidth.Auto;\r\n case '25%':\r\n return InfoBoxWidth.Width25Percent;\r\n case '33%':\r\n return InfoBoxWidth.Width33Percent;\r\n case '50%':\r\n return InfoBoxWidth.Width50Percent;\r\n case '66%':\r\n return InfoBoxWidth.Width66Percent;\r\n case '75%':\r\n return InfoBoxWidth.Width75Percent;\r\n case '100%':\r\n return InfoBoxWidth.Width100Percent;\r\n default:\r\n return InfoBoxWidth.Auto;\r\n }\r\n }\r\n\r\n getOrder(order: string): number {\r\n const firstTwoNumbers = Number.parseInt(order.substr(0, 2), 10);\r\n if (!isNaN(firstTwoNumbers)) {\r\n return firstTwoNumbers;\r\n }\r\n\r\n const firstNumber = Number.parseInt(order.substr(0, 1), 10);\r\n if (!isNaN(firstNumber)) {\r\n return firstNumber;\r\n }\r\n\r\n return 9999;\r\n }\r\n\r\n private buildOldInfoBox(item: ListItem, typeOfInfoBox: InfoBoxType, url?: string) {\r\n return {\r\n Title: item.fields['BoolField_InfoBoxTitle'],\r\n ApplyTitle: item.fields['BoolField_InfoBoxApplyHeading'] !== undefined ? item.fields['BoolField_InfoBoxApplyHeading'] : true, // Setting true when undefined to handle existing items\r\n StartDate: item.fields['BoolField_ContentStartDate'],\r\n EndDate: item.fields['BoolField_ContentEndDate'],\r\n WorkplaceArea: item.fields['BoolField_InfoboxArea'],\r\n WorkplaceOrder: item.fields['BoolField_InfoboxOrder'],\r\n WorkplaceSize: item.fields['BoolField_InfoboxSize'],\r\n WorkplaceStyle: item.fields['BoolField_InfoboxStyle'],\r\n LinkUrl: item.fields['BoolField_InfoBoxLinkUrl'] ? item.fields['BoolField_InfoBoxLinkUrl'].Url : null,\r\n LinkDescription: item.fields['BoolField_InfoBoxLinkUrl'] ? item.fields['BoolField_InfoBoxLinkUrl'].Description : null,\r\n Text: item.fields['BoolField_InfoBoxTextContent'],\r\n VideoEmbed: item.fields['BoolField_InfoBoxVideoEmbed'],\r\n Channels: item.fields['BoolField_Channel'],\r\n LanguageTermId: (item.fields['BoolField_Language'] && item.fields['BoolField_Language'].TermGuid) ? item.fields['BoolField_Language'].TermGuid : undefined,\r\n Type: typeOfInfoBox,\r\n ImageUrl: url\r\n };\r\n }\r\n\r\n}\r\n","import { HttpClient, HttpParams } from '@angular/common/http';\r\nimport { Inject, Injectable } from '@angular/core';\r\nimport { CUSTOMERENVIRONMENT } from '@app/common/app-tokens';\r\nimport { Constants } from '@app/common/constants';\r\nimport { HttpHelper } from '@app/common/http-helper';\r\nimport { RestaurantMenu } from '@app/models/restaurant-menu';\r\nimport { CacheService } from '@app/services/cache.service';\r\nimport { Environment } from '@environments/interface.environment';\r\nimport { endOfISOWeek, getISOWeek, getISOWeekYear } from 'date-fns';\r\nimport { BehaviorSubject, concat, Observable, of, Subject } from 'rxjs';\r\nimport { catchError, map, shareReplay, takeUntil, tap } from 'rxjs/operators';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class RestaurantMenuService {\r\n\r\n constructor(@Inject(CUSTOMERENVIRONMENT) private environment: Environment,\r\n private http: HttpClient,\r\n private cache: CacheService,\r\n private httpHelper: HttpHelper) { }\r\n\r\n private readonly cacheKey = 'RestaurantMenuService-getAllRestaurantMenus';\r\n private readonly cacheKeyPrefix = 'RestaurantMenuService-getCurrentRestaurantMenusForRestaurant';\r\n public useCache = true;\r\n private internalReload$ = new Subject();\r\n public reload$ = new BehaviorSubject(null);\r\n private getAllRestaurantMenus$: Observable;\r\n private getCurrentRestaurantMenusForRestaurant$ = new Map>();\r\n\r\n public reload() {\r\n this.getAllRestaurantMenus$ = null;\r\n this.getCurrentRestaurantMenusForRestaurant$.clear();\r\n if (this.useCache) {\r\n this.cache.removeAllItemsInPersistentCacheWithGeneratedKeyPrefix(this.cacheKey);\r\n this.cache.removeAllItemsInPersistentCacheWithGeneratedKeyPrefix(this.cacheKeyPrefix);\r\n }\r\n this.internalReload$.next();\r\n this.reload$.next(null);\r\n }\r\n\r\n getCurrentRestaurantMenusForRestaurant(restaurantId: number): Observable> {\r\n const currentWeekNumber = getISOWeek(new Date()).toString();\r\n const currentWeekYear = getISOWeekYear(new Date()).toString();\r\n\r\n const cacheKey = `${this.cacheKeyPrefix}-${restaurantId}-${currentWeekNumber}-${currentWeekYear}`;\r\n\r\n if (this.getCurrentRestaurantMenusForRestaurant$.has(cacheKey)) {\r\n return this.getCurrentRestaurantMenusForRestaurant$.get(cacheKey);\r\n } else {\r\n const httpParams = new HttpParams()\r\n .append('weekNumber', currentWeekNumber)\r\n .append('year', currentWeekYear)\r\n .append('restaurantId', restaurantId.toString());\r\n\r\n this.getCurrentRestaurantMenusForRestaurant$.set(cacheKey, this.http\r\n .get>(`${Constants.API_ENDPOINT}/restaurantmenus`, {\r\n params: httpParams,\r\n })\r\n .pipe(\r\n tap(data => {\r\n this.useCache && this.cache.set(cacheKey, data, endOfISOWeek(new Date()));\r\n }),\r\n catchError(this.httpHelper.handleError({ operation: 'getCurrentRestaurantMenusForRestaurant', result: new Array(), rethrow: true, cacheKey: cacheKey })),\r\n takeUntil(this.internalReload$),\r\n shareReplay({ bufferSize: 1, refCount: true })\r\n ));\r\n\r\n if (this.useCache) {\r\n const cachedData = this.cache.get>(cacheKey);\r\n if (cachedData) {\r\n return concat(of(cachedData), this.getCurrentRestaurantMenusForRestaurant$.get(cacheKey));\r\n }\r\n }\r\n return this.getCurrentRestaurantMenusForRestaurant$.get(cacheKey);\r\n }\r\n }\r\n\r\n getCurrentAndFutureRestaurantMenusForRestaurant(restaurantId: number): Observable> {\r\n const currentWeekNumber = getISOWeek(new Date());\r\n const nextWeekNumber = getISOWeek(new Date()) + 1;\r\n const nextSecondWeekNumber = getISOWeek(new Date()) + 2;\r\n const currentWeekYear = getISOWeekYear(new Date()).toString();\r\n\r\n const cacheKey = `${this.cacheKeyPrefix}-${restaurantId}-${currentWeekNumber + ',' + nextWeekNumber + ',' + nextSecondWeekNumber}-${currentWeekYear}`;\r\n\r\n if (this.getCurrentRestaurantMenusForRestaurant$.has(cacheKey)) {\r\n return this.getCurrentRestaurantMenusForRestaurant$.get(cacheKey);\r\n } else {\r\n const httpParams = new HttpParams()\r\n .append('weekNumber', currentWeekNumber + ',' + nextWeekNumber + ',' + nextSecondWeekNumber)\r\n .append('year', currentWeekYear)\r\n .append('restaurantId', restaurantId.toString());\r\n\r\n this.getCurrentRestaurantMenusForRestaurant$.set(cacheKey, this.http\r\n .get>(`${Constants.API_ENDPOINT}/restaurantmenus/weeks`, {\r\n params: httpParams,\r\n })\r\n .pipe(\r\n tap(data => {\r\n this.useCache && this.cache.set(cacheKey, data, endOfISOWeek(new Date()));\r\n }),\r\n catchError(this.httpHelper.handleError({ operation: 'getCurrentRestaurantMenusForRestaurant', result: new Array(), rethrow: true, cacheKey: cacheKey })),\r\n takeUntil(this.internalReload$),\r\n shareReplay({ bufferSize: 1, refCount: true })\r\n ));\r\n\r\n if (this.useCache) {\r\n const cachedData = this.cache.get>(cacheKey);\r\n if (cachedData) {\r\n return concat(of(cachedData), this.getCurrentRestaurantMenusForRestaurant$.get(cacheKey));\r\n }\r\n }\r\n return this.getCurrentRestaurantMenusForRestaurant$.get(cacheKey);\r\n }\r\n }\r\n\r\n getAllRestaurantMenus(): Observable> {\r\n if (this.getAllRestaurantMenus$) {\r\n return this.getAllRestaurantMenus$;\r\n } else {\r\n this.getAllRestaurantMenus$ = this.http\r\n .get>(`${Constants.API_ENDPOINT}/restaurantmenus/all`)\r\n .pipe(\r\n tap(data => {\r\n this.useCache && this.cache.set(this.cacheKey, data);\r\n }),\r\n catchError(this.httpHelper.handleError({ operation: 'getAllRestaurantMenus', result: new Array(), rethrow: true, cacheKey: this.cacheKey })),\r\n takeUntil(this.internalReload$),\r\n shareReplay({ bufferSize: 1, refCount: true }));\r\n\r\n if (this.useCache) {\r\n const cachedData = this.cache.get>(this.cacheKey);\r\n if (cachedData) {\r\n return concat(of(cachedData), this.getAllRestaurantMenus$);\r\n }\r\n }\r\n return this.getAllRestaurantMenus$;\r\n }\r\n }\r\n\r\n addRestaurantMenu(restaurantMenu: RestaurantMenu): Observable {\r\n // We need to append the siteUrl because there will be an authorization check in the backend against the workplace admin group on this site\r\n const httpParams = new HttpParams().append('siteUrl', encodeURI(this.environment.coreWorkplaceSiteUrl));\r\n return this.http\r\n .post(`${Constants.API_ENDPOINT}/restaurantmenus`, restaurantMenu, { params: httpParams })\r\n .pipe(\r\n tap(() => {\r\n this.reload();\r\n }),\r\n catchError(this.httpHelper.handleError({ operation: 'addRestaurantMenu', result: null, rethrow: true })));\r\n }\r\n\r\n updateRestaurantMenu(id: number, restaurantMenu: RestaurantMenu): Observable {\r\n // We need to append the siteUrl because there will be an authorization check in the backend against the workplace admin group on this site\r\n const httpParams = new HttpParams().append('siteUrl', encodeURI(this.environment.coreWorkplaceSiteUrl));\r\n return this.http\r\n .put(`${Constants.API_ENDPOINT}/restaurantmenus/${id}`, restaurantMenu, { params: httpParams })\r\n .pipe(\r\n tap(() => {\r\n this.reload();\r\n }),\r\n catchError(this.httpHelper.handleError({ operation: 'updateRestaurantMenu', result: null, rethrow: true })));\r\n }\r\n\r\n deleteRestaurantMenu(id: number): Observable {\r\n // We need to append the siteUrl because there will be an authorization check in the backend against the workplace admin group on this site\r\n const httpParams = new HttpParams().append('siteUrl', encodeURI(this.environment.coreWorkplaceSiteUrl));\r\n const fetchOperation = this.http.delete(`${Constants.API_ENDPOINT}/restaurantmenus/${id}`, {\r\n params: httpParams\r\n })\r\n .pipe(\r\n map(response => {\r\n console.log(`deleted result: `);\r\n console.log(response);\r\n this.reload();\r\n return response;\r\n }),\r\n catchError(this.httpHelper.handleError({ operation: 'deleteRestaurantMenu', result: ({} as RestaurantMenu) })));\r\n\r\n return fetchOperation;\r\n }\r\n\r\n getRestaurantMenu(id: number): Observable {\r\n return this.http\r\n .get(`${Constants.API_ENDPOINT}/restaurantmenus/${id}`)\r\n .pipe(catchError(this.httpHelper.handleError({ operation: 'getRestaurantMenu', result: null, rethrow: true })));\r\n }\r\n\r\n}\r\n","import { Directive, ElementRef, HostBinding, HostListener, Input, NgModule, Optional, Inject } from '@angular/core';\r\nimport { Constants } from '@app/common/constants';\r\nimport { TrackingEvent } from '@app/models/tracking-event';\r\nimport { FeatureSettingsStoreService } from '@app/services/feature-settings-store.service';\r\nimport { BaseTrackingService } from '@app/tracking/base-tracking.service';\r\nimport { Utilities } from '@app/common/utilities';\r\nimport { WINDOW } from '@app/common/app-tokens';\r\n\r\n@Directive({\r\n /* tslint:disable */\r\n selector: 'a:not([routerLink])',\r\n /* tslint:enable */\r\n})\r\nexport class LinkDirective {\r\n\r\n @Input() componentId: string;\r\n\r\n @HostBinding('rel') @Input() rel = 'noopener';\r\n\r\n @HostBinding('target') @Input() target = '_blank';\r\n\r\n parentElement: HTMLElement;\r\n\r\n constructor(\r\n private featureSettingsStoreService: FeatureSettingsStoreService,\r\n private elementRef: ElementRef,\r\n @Inject(WINDOW) private window: Window,\r\n @Optional() private trackingService?: BaseTrackingService) {\r\n const targetElement = this.elementRef.nativeElement as HTMLElement;\r\n const parentElement = this.getParentComponentElementThatStartWithPrefix(targetElement, 'app-app-tile-box');\r\n const componentIdentifier = parentElement && parentElement.localName.toLowerCase();\r\n\r\n // If openAllLinksInSameTab setting is enabled, then change the target attribute of the link to \"_self\"\r\n if ((this.featureSettingsStoreService.state.openAllLinksInSameTab || Utilities.isInTeamsApp(this.window)) && !componentIdentifier) {\r\n this.target = '_self';\r\n }\r\n if (this.featureSettingsStoreService.state.openAppAndToolsInSameTab && componentIdentifier) {\r\n this.target = '_self';\r\n }\r\n }\r\n\r\n @HostListener('click') onClick() {\r\n if (this.trackingService && this.trackingService.trackEvent) {\r\n const targetElement = this.elementRef.nativeElement as HTMLElement;\r\n if (targetElement) {\r\n const hrefAttribute = targetElement.attributes.getNamedItem('href');\r\n\r\n const href = hrefAttribute ? hrefAttribute.value : null;\r\n let componentIdentifier = this.componentId;\r\n\r\n if (!componentIdentifier) {\r\n this.parentElement = this.getParentComponentElementThatStartWithPrefix(targetElement, 'app-');\r\n componentIdentifier = this.parentElement && this.parentElement.localName.toLowerCase();\r\n }\r\n\r\n const trackingEvent = new TrackingEvent({\r\n name: Constants.TRACKING_EVENT_TYPE_LINK_CLICK,\r\n properties: {\r\n href: href,\r\n componentId: componentIdentifier\r\n }\r\n });\r\n\r\n if (targetElement.innerText && targetElement.innerText !== '') {\r\n const innerTxtArr = targetElement.innerText.split('\\n');\r\n trackingEvent.properties.label = innerTxtArr.join(', ');\r\n }\r\n\r\n if (componentIdentifier === 'app-app-tile-box') {\r\n trackingEvent.properties.label = this.parentElement && this.parentElement.innerText;\r\n trackingEvent.name = Constants.TRACKING_EVENT_TYPE_APP_CLICK;\r\n }\r\n\r\n this.trackingService.trackEvent(trackingEvent);\r\n }\r\n }\r\n }\r\n\r\n getParentComponentElementThatStartWithPrefix(el: HTMLElement, str: string): HTMLElement {\r\n if (el) {\r\n if (el.localName.toLowerCase().startsWith(str.toLowerCase())) {\r\n return el;\r\n } else {\r\n return this.getParentComponentElementThatStartWithPrefix(el.parentElement, str);\r\n }\r\n }\r\n }\r\n\r\n}\r\n@NgModule({\r\n declarations: [LinkDirective],\r\n exports: [LinkDirective],\r\n})\r\nexport class LinkModule { }\r\n","import { AfterViewInit, Directive, ElementRef, Input, NgModule } from '@angular/core';\r\nimport * as Stickyfill from 'stickyfilljs';\r\n\r\n@Directive({\r\n selector: '[appStickyFill]'\r\n})\r\nexport class StickyFillDirective implements AfterViewInit {\r\n\r\n @Input('appStickyFill') enabled: boolean;\r\n\r\n constructor(private elementRef: ElementRef) { }\r\n\r\n ngAfterViewInit() {\r\n if (this.enabled) {\r\n Stickyfill.add(this.elementRef.nativeElement);\r\n }\r\n }\r\n}\r\n@NgModule({\r\n declarations: [StickyFillDirective],\r\n exports: [StickyFillDirective],\r\n})\r\nexport class StickyFillModule { }\r\n","// values from _variables.scss\r\nexport enum BreakPoints {\r\n xs = 0,\r\n sm = 576,\r\n md = 768,\r\n lg = 992,\r\n xl = 1200,\r\n xxl = 1420,\r\n xxxl = 1640\r\n}\r\n","import { ChangeDetectorRef, Directive, ElementRef, Input, NgModule, OnDestroy, OnInit, Renderer2 } from '@angular/core';\r\nimport { Constants } from '@app/common/constants';\r\nimport { ImageService } from '@app/services/image.service';\r\nimport { Subscription } from 'rxjs';\r\n\r\n@Directive({\r\n selector: '[appImgSrcProxy]'\r\n})\r\nexport class ImgSrcProxyDirective implements OnInit, OnDestroy {\r\n subscription: Subscription;\r\n @Input('appImgSrcProxy') originalUrl: string;\r\n\r\n constructor(private el: ElementRef,\r\n private imageService: ImageService,\r\n private renderer2: Renderer2,\r\n private cdRef: ChangeDetectorRef) {\r\n this.renderer2.setAttribute(this.el.nativeElement, 'src', '');\r\n }\r\n\r\n ngOnInit(): void {\r\n\r\n if (this.originalUrl.startsWith('data:') || this.originalUrl.indexOf('//privatecdn.') !== -1 || this.originalUrl.indexOf('/_vti_bin/') !== -1) {\r\n if (this.originalUrl.indexOf('//privatecdn.') !== -1) {\r\n this.originalUrl = this.originalUrl.replace('privatecdn.sharepointonline.com/', '');\r\n }\r\n this.renderer2.setAttribute(this.el.nativeElement, 'src', this.originalUrl);\r\n this.cdRef.detectChanges();\r\n\r\n } else if (this.originalUrl.endsWith('sitepagethumbnail.png')) {\r\n\r\n this.renderer2.setAttribute(this.el.nativeElement, 'src', Constants.TRANSPARENT_IMAGE);\r\n this.cdRef.detectChanges();\r\n\r\n } else if (this.originalUrl.indexOf('getpreview.ashx') !== -1) {\r\n\r\n this.subscription = this.imageService\r\n .getSharePointImageThumbnailFromPreviewHandlerUrl(this.originalUrl)\r\n .subscribe(result => {\r\n if (result) {\r\n this.renderer2.setAttribute(this.el.nativeElement, 'src', result);\r\n } else {\r\n this.renderer2.setAttribute(this.el.nativeElement, 'src', Constants.TRANSPARENT_IMAGE);\r\n }\r\n this.cdRef.detectChanges();\r\n },\r\n (err) => {\r\n this.renderer2.setAttribute(this.el.nativeElement, 'src', Constants.TRANSPARENT_IMAGE);\r\n });\r\n\r\n } else if (this.originalUrl.indexOf('/_api/v2.1/') !== -1 || this.originalUrl.indexOf('/_api/v2.0/') !== -1 || this.originalUrl.indexOf('//cdn.') !== -1) {\r\n\r\n this.subscription = this.imageService\r\n .getThumbnailFromApiUrl(this.originalUrl)\r\n .subscribe(result => {\r\n if (result) {\r\n this.renderer2.setAttribute(this.el.nativeElement, 'src', result);\r\n } else {\r\n this.renderer2.setAttribute(this.el.nativeElement, 'src', Constants.TRANSPARENT_IMAGE);\r\n }\r\n this.cdRef.detectChanges();\r\n },\r\n (err) => {\r\n this.renderer2.setAttribute(this.el.nativeElement, 'src', Constants.TRANSPARENT_IMAGE);\r\n });\r\n\r\n } else {\r\n this.subscription = this.imageService\r\n .getSharePointImageThumbnailFromOriginalUrlWithStandardDimensions(this.originalUrl)\r\n .subscribe(result => {\r\n if (result) {\r\n this.renderer2.setAttribute(this.el.nativeElement, 'src', result);\r\n } else {\r\n this.renderer2.setAttribute(this.el.nativeElement, 'src', this.originalUrl);\r\n }\r\n this.cdRef.detectChanges();\r\n },\r\n (err) => {\r\n this.renderer2.setAttribute(this.el.nativeElement, 'src', this.originalUrl);\r\n });\r\n }\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.subscription && this.subscription.unsubscribe();\r\n }\r\n}\r\n@NgModule({\r\n declarations: [ImgSrcProxyDirective],\r\n exports: [ImgSrcProxyDirective],\r\n})\r\nexport class ImgSrcProxyModule { }\r\n","import { HttpClient, HttpHeaders } from '@angular/common/http';\r\nimport { Inject, Injectable } from '@angular/core';\r\nimport { CUSTOMERENVIRONMENT } from '@app/common/app-tokens';\r\nimport { SimplifiedTerm } from '@app/models/simplified-term';\r\nimport { CultureService } from '@app/services/culture.service';\r\nimport { Environment } from '@environments/interface.environment';\r\nimport { FetchOptions, HttpClientImpl } from '@pnp/common';\r\nimport { ILabel, ILabelData, ITerm, ITermData, Session } from '@pnp/sp-taxonomy';\r\nimport { from, Observable } from 'rxjs';\r\nimport { map, mergeMap } from 'rxjs/operators';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class TaxonomyService {\r\n\r\n private readonly taxonomy: Session;\r\n private readonly labelsPropertyKey = 'Labels';\r\n private readonly parentPropertyKey = 'Parent';\r\n private readonly childItemsPropertyKey = '_Child_Items_';\r\n private readonly simpleLinkPropertyKey = '_Sys_Nav_SimpleLinkUrl';\r\n\r\n constructor(\r\n private http: HttpClient,\r\n private cultureService: CultureService,\r\n @Inject(CUSTOMERENVIRONMENT) private environment: Environment) {\r\n this.taxonomy = new Session(this.environment.coreWorkplaceSiteUrl);\r\n this.taxonomy.setup({\r\n sp: {\r\n fetchClientFactory: () => {\r\n return new CustomSPHttpClient(this.http);\r\n }\r\n }\r\n });\r\n }\r\n\r\n getAmountOfChangesSince(date: Date): Observable {\r\n return from(\r\n this.taxonomy\r\n .getDefaultSiteCollectionTermStore()\r\n .getChanges({ StartTime: date.toISOString() })\r\n .then(changes => {\r\n return changes.length;\r\n }));\r\n }\r\n\r\n getTermByIdWithFullHierarchy(termId: string): Observable {\r\n const selects = ['Id',\r\n 'Name',\r\n 'IsRoot',\r\n 'TermsCount',\r\n this.labelsPropertyKey,\r\n 'LastModifiedDate',\r\n 'IsAvailableForTagging',\r\n 'IsDeprecated',\r\n 'PathOfTerm',\r\n 'LocalCustomProperties',\r\n this.parentPropertyKey];\r\n return this.cultureService.getLcidForCurrentLocale()\r\n .pipe(\r\n mergeMap(lcid => {\r\n return from(\r\n this.taxonomy\r\n .getDefaultSiteCollectionTermStore()\r\n .getTermById(termId)\r\n .select(...selects)\r\n .get()\r\n .then(term => Promise.all([term.termSet.terms.select(...selects).get(), Promise.resolve(term)]))\r\n .then(([termsData, termData]) => {\r\n return this.buildSimplifiedTermRecursively(termData, lcid, termsData);\r\n }));\r\n })\r\n );\r\n }\r\n\r\n getTermSet(termSetId: string, filterDeprecated = false): Observable> {\r\n return this.cultureService.getLcidForCurrentLocale()\r\n .pipe(\r\n mergeMap(lcid => {\r\n return from(\r\n this.taxonomy\r\n .getDefaultSiteCollectionTermStore()\r\n .getTermSetById(termSetId)\r\n .terms\r\n .select(\r\n 'Id',\r\n 'Name',\r\n 'IsRoot',\r\n 'TermsCount',\r\n this.labelsPropertyKey,\r\n 'LastModifiedDate',\r\n 'IsAvailableForTagging',\r\n 'IsDeprecated',\r\n 'PathOfTerm',\r\n 'LocalCustomProperties',\r\n this.parentPropertyKey\r\n )\r\n .get()\r\n .then(termsData => {\r\n return termsData\r\n .map((termData, index, allTermsData) => {\r\n if (termData.IsRoot && !(filterDeprecated && termData.IsDeprecated)) {\r\n return this.buildSimplifiedTermRecursively(termData, lcid, allTermsData, filterDeprecated);\r\n }\r\n })\r\n .filter(t => t); // get rid of nulls\r\n }));\r\n })\r\n );\r\n }\r\n\r\n // get all terms in the termset in a flat list\r\n getTermSetFlat(termSetId: string): Observable> {\r\n return this.cultureService.getLcidForCurrentLocale()\r\n .pipe(\r\n mergeMap(lcid => {\r\n return from(\r\n this.taxonomy\r\n .getDefaultSiteCollectionTermStore()\r\n .getTermSetById(termSetId)\r\n .terms\r\n .select(\r\n 'Id',\r\n 'Name',\r\n 'IsRoot',\r\n 'TermsCount',\r\n this.labelsPropertyKey,\r\n 'LastModifiedDate',\r\n 'IsAvailableForTagging',\r\n 'IsDeprecated',\r\n 'PathOfTerm',\r\n 'LocalCustomProperties',\r\n this.parentPropertyKey\r\n )\r\n .get()\r\n .then(termsData => {\r\n return termsData\r\n .map((termData, index, allTermsData) => {\r\n return this.buildSimplifiedTermFlat(termData, lcid, allTermsData);\r\n })\r\n .filter(t => t); // get rid of nulls\r\n }));\r\n })\r\n );\r\n }\r\n\r\n // build a simplifiedTerm without populating the children (.Terms property)\r\n private buildSimplifiedTermFlat(termData: (ITerm & ITermData), languageCode: number, allTermsData: (ITerm & ITermData)[]): SimplifiedTerm {\r\n let labels = new Array();\r\n if (termData[this.labelsPropertyKey] && termData[this.labelsPropertyKey].hasOwnProperty(this.childItemsPropertyKey)) {\r\n labels = termData[this.labelsPropertyKey][this.childItemsPropertyKey];\r\n }\r\n const termLabel = labels.find(l => l.Language === languageCode);\r\n return this.buildSimplifiedTerm(termData, termLabel, labels);\r\n\r\n }\r\n\r\n private buildSimplifiedTermRecursively(termData: (ITerm & ITermData), languageCode: number, allTermsData: (ITerm & ITermData)[], filterDeprecated = false): SimplifiedTerm {\r\n let labels = new Array();\r\n if (termData[this.labelsPropertyKey] && termData[this.labelsPropertyKey].hasOwnProperty(this.childItemsPropertyKey)) {\r\n labels = termData[this.labelsPropertyKey][this.childItemsPropertyKey];\r\n }\r\n const termLabel = labels.find(l => l.Language === languageCode);\r\n\r\n if (termData.TermsCount > 0) {\r\n const childTerms = allTermsData.filter(term => term[this.parentPropertyKey] && term[this.parentPropertyKey].Id === termData.Id);\r\n const simplifiedTerm = this.buildSimplifiedTerm(termData, termLabel, labels);\r\n simplifiedTerm.Terms = childTerms.filter(item => !(filterDeprecated && item.IsDeprecated)).map(item => {\r\n const term = this.buildSimplifiedTermRecursively(item, languageCode, allTermsData, filterDeprecated);\r\n term.ParentTermGuid = simplifiedTerm.Guid;\r\n return term;\r\n }).sort((a, b) => a?.Name?.localeCompare(b?.Name));\r\n return simplifiedTerm;\r\n } else {\r\n return this.buildSimplifiedTerm(termData, termLabel, labels);\r\n }\r\n }\r\n\r\n private buildSimplifiedTerm(term: ITerm & ITermData, termLabel: ILabel & ILabelData, labels: (ILabel & ILabelData)[]): SimplifiedTerm {\r\n\r\n return new SimplifiedTerm({\r\n Guid: term.Id.replace('/Guid(', '').replace(')/', ''), // GUIDs come in this format: /Guid(89243421-026c-41de-80fd-03a09d0d4805)/\r\n Name: termLabel ? termLabel.Value : term.Name,\r\n InternalName: term.Name,\r\n Labels: labels.map(label => {\r\n return {\r\n Language: label.Language,\r\n Name: label.Value\r\n };\r\n }),\r\n TermCount: term.TermsCount,\r\n LastModified: this.getDateFromAspNetFormat(term.LastModifiedDate),\r\n Url: this.getUrlForTerm(term),\r\n FriendlyUrl: this.getFriendlyUrl(term),\r\n IsRoot: term.IsRoot,\r\n LocalCustomProperties: term.LocalCustomProperties,\r\n IsAvailableForTagging: term.IsAvailableForTagging,\r\n IsDeprecated: term.IsDeprecated,\r\n ParentTermGuid: term[this.parentPropertyKey] ? term[this.parentPropertyKey].Id.replace('/Guid(', '').replace(')/', '') : ''\r\n });\r\n }\r\n\r\n // Dates come in this format /Date(1486309038000)/\r\n private getDateFromAspNetFormat(date: string) {\r\n const dateTicks = /-?\\d+/.exec(date);\r\n return new Date(Number.parseInt(dateTicks[0], 10));\r\n }\r\n\r\n private getFriendlyUrl(term: ITermData) {\r\n return '/' + term.PathOfTerm.replace(';', '/').replace(' ', '-').replace('&', '&');\r\n }\r\n\r\n private getUrlForTerm(term: ITermData) {\r\n const customProps = term.LocalCustomProperties;\r\n if (customProps && customProps.hasOwnProperty(this.simpleLinkPropertyKey)) {\r\n return customProps[this.simpleLinkPropertyKey];\r\n }\r\n return null;\r\n }\r\n\r\n}\r\n\r\nexport class CustomSPHttpClient implements HttpClientImpl {\r\n\r\n private defaultHttpHeaders = new HttpHeaders()\r\n .append('Accept', 'application/json;odata=verbose')\r\n .append('Content-type', 'application/json;odata=verbose;charset=utf-8');\r\n\r\n constructor(private http: HttpClient) { }\r\n\r\n fetch(url: string, options: FetchOptions): Promise {\r\n let localHttpHeaders = new HttpHeaders();\r\n const headers = options.headers as Headers;\r\n if (headers) {\r\n headers.forEach((val, key) => {\r\n localHttpHeaders = localHttpHeaders.append(key, val);\r\n });\r\n }\r\n\r\n if (localHttpHeaders.keys().length === 0) {\r\n localHttpHeaders = this.defaultHttpHeaders;\r\n }\r\n\r\n return this.http\r\n .request(\r\n options.method,\r\n url,\r\n {\r\n body: options.body,\r\n headers: localHttpHeaders,\r\n observe: 'response',\r\n responseType: 'text'\r\n })\r\n .pipe(\r\n map(response =>\r\n new Response(\r\n response.body,\r\n {\r\n status: response.status,\r\n statusText: response.statusText\r\n })))\r\n .toPromise();\r\n }\r\n\r\n}\r\n","import { HttpClient, HttpParams } from '@angular/common/http';\r\nimport { Inject, Injectable, LOCALE_ID } from '@angular/core';\r\nimport { Constants } from '@app/common/constants';\r\nimport { Observable } from 'rxjs';\r\nimport { shareReplay } from 'rxjs/operators';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class CultureService {\r\n\r\n private getLcidForCurrentLocale$: Observable;\r\n private getRegionCodeForCurrentLocale$: Observable;\r\n\r\n constructor(\r\n private http: HttpClient,\r\n @Inject(LOCALE_ID) private localeId: string) {\r\n }\r\n\r\n getLcidForCurrentLocale(): Observable {\r\n if (this.getLcidForCurrentLocale$) {\r\n return this.getLcidForCurrentLocale$;\r\n }\r\n\r\n const httpParams = new HttpParams().append('languageCode', this.getLocaleWithSuffix(false));\r\n this.getLcidForCurrentLocale$ = this.http.get(`${Constants.API_ENDPOINT}/culture`, { params: httpParams })\r\n .pipe(\r\n shareReplay({ bufferSize: 1, refCount: true })\r\n );\r\n\r\n return this.getLcidForCurrentLocale$;\r\n }\r\n\r\n getRegionCodeForCurrentLocale(): Observable {\r\n if (this.getRegionCodeForCurrentLocale$) {\r\n return this.getRegionCodeForCurrentLocale$;\r\n }\r\n const httpParams = new HttpParams().append('languageCode', this.getLocaleWithSuffix(false));\r\n this.getRegionCodeForCurrentLocale$ = this.http.get(`${Constants.API_ENDPOINT}/culture/region`, { params: httpParams, responseType: 'text' })\r\n .pipe(\r\n shareReplay({ bufferSize: 1, refCount: true })\r\n );\r\n\r\n return this.getRegionCodeForCurrentLocale$;\r\n }\r\n\r\n /**\r\n * Gets the full locale in format en-us, sv-se etc.\r\n * @param useSpTranslationFormat\r\n * Because sharepoint only supports one variant of norwegian (nb-no)\r\n * we rewrite nn-no to nb-no when fetching pages from sharepoint.\r\n */\r\n getLocaleWithSuffix(useSpTranslationFormat = true): string {\r\n let localIdWithSuffix = this.localeId;\r\n if (localIdWithSuffix?.length === 2) {\r\n if (localIdWithSuffix === 'en') {\r\n localIdWithSuffix = `${localIdWithSuffix}-us`;\r\n } else if (localIdWithSuffix === 'sv') {\r\n localIdWithSuffix = `${localIdWithSuffix}-se`;\r\n } else if (localIdWithSuffix === 'da') {\r\n localIdWithSuffix = `${localIdWithSuffix}-dk`;\r\n } else if (localIdWithSuffix === 'fi') {\r\n localIdWithSuffix = `${localIdWithSuffix}-fi`;\r\n } else if (localIdWithSuffix === 'nb') {\r\n localIdWithSuffix = `${localIdWithSuffix}-no`;\r\n } else if (localIdWithSuffix === 'nn') {\r\n if (useSpTranslationFormat) {\r\n localIdWithSuffix = `nb-no`;\r\n } else {\r\n localIdWithSuffix = `${localIdWithSuffix}-no`;\r\n }\r\n } else if (localIdWithSuffix === 'no') {\r\n localIdWithSuffix = `nb-no`;\r\n }\r\n }\r\n return localIdWithSuffix;\r\n }\r\n}\r\n","// Copied from 'https://github.com/angular/angular/blob/master/packages/router/src/shared.ts' to set a reason in navigation canceled event\r\nexport const NAVIGATION_CANCELING_ERROR = 'ngNavigationCancelingError';\r\n\r\nexport function navigationCancelingError(message: string) {\r\n const error = Error('NavigationCancelingError: ' + message);\r\n (error as any)[NAVIGATION_CANCELING_ERROR] = true;\r\n return error;\r\n}\r\n","import { CommonModule } from '@angular/common';\r\nimport { Component, NgModule, OnInit } from '@angular/core';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatDialogModule, MatDialogRef } from '@angular/material/dialog';\r\nimport { LinkModule } from '@app/directives/link.directive';\r\n\r\n@Component({\r\n selector: 'app-app-tile-hide-dialog',\r\n templateUrl: './app-tile-hide-dialog.component.html',\r\n styleUrls: ['./app-tile-hide-dialog.component.scss']\r\n})\r\nexport class AppTileHideDialogComponent implements OnInit {\r\n\r\n constructor(public dialogRef: MatDialogRef) {\r\n }\r\n\r\n hide() {\r\n this.dialogRef.close(true);\r\n }\r\n\r\n ngOnInit(): void {\r\n }\r\n}\r\n@NgModule({\r\n declarations: [\r\n AppTileHideDialogComponent\r\n ],\r\n entryComponents: [\r\n AppTileHideDialogComponent\r\n ],\r\n imports: [\r\n CommonModule,\r\n LinkModule,\r\n MatDialogModule,\r\n MatButtonModule\r\n ]\r\n})\r\nexport class AppTileHideDialogModule { }\r\n","

Hide app

\r\n\r\n Are you sure you want to hide this app?\r\n\r\n\r\n \r\n \r\n\r\n","\r\n \r\n\r\n \r\n {{getInitials(appTile)}}\r\n\r\n \r\n \"\"\r\n = 0\" [appImgSrcProxy]=\"appTile.IconUrl\" alt=\"\" />\r\n\r\n \r\n \r\n \r\n \r\n\r\n \r\n 0) && !hideInfo\" class=\"info-section pr-1 clickable\"\r\n (click)=\"appClick($event)\" (keyup.enter)=\"appClick($event)\" [style.color]=\"appTile.ColorHexCode ? getColor(appTile.ColorHexCode) : null\">\r\n \r\n 0\" class=\"fa fa-bullhorn ml-2\" aria-hidden=\"true\">\r\n \r\n \r\n\r\n\r\n \r\n New\r\n \r\n {{appTile.Title}}\r\n\r\n\r\n\r\n \r\n Edit\r\n \r\n \r\n \r\n \r\n\r\n","import { CommonModule } from '@angular/common';\r\nimport { Component, EventEmitter, Inject, Input, NgModule, OnDestroy, OnInit, Output, ViewEncapsulation } from '@angular/core';\r\nimport { MatBadgeModule } from '@angular/material/badge';\r\nimport { MatDialog } from '@angular/material/dialog';\r\nimport { MatMenuModule } from '@angular/material/menu';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\nimport { Router, RouterModule } from '@angular/router';\r\nimport { CUSTOMERENVIRONMENT } from '@app/common/app-tokens';\r\nimport { Utilities } from '@app/common/utilities';\r\nimport { AppTileHideDialogComponent, AppTileHideDialogModule } from '@app/components/apps-and-tools/dialogs/app-tile-hide-dialog/app-tile-hide-dialog.component';\r\nimport { ConfirmDialogComponent, ConfirmDialogModule } from '@app/components/confirm-dialog/confirm-dialog.component';\r\nimport { FeatureToggleModule } from '@app/directives/feature-toggle.directive';\r\nimport { ImgSrcProxyModule } from '@app/directives/img-src-proxy.directive';\r\nimport { AppTile } from '@app/models/app-tile';\r\nimport { UserAppTile } from '@app/models/user-app-tile';\r\nimport { LinkModule } from '@app/directives/link.directive';\r\nimport { AppTileService } from '@app/services/app-tile.service';\r\nimport { UserAppTileService } from '@app/services/user-app-tile.service';\r\nimport { Environment } from '@environments/interface.environment';\r\nimport { isAfter, isSameDay } from 'date-fns';\r\nimport { of, Subscription } from 'rxjs';\r\nimport { concatMap } from 'rxjs/operators';\r\n\r\n@Component({\r\n selector: 'app-app-tile-box',\r\n templateUrl: './app-tile-box.component.html',\r\n styleUrls: ['./app-tile-box.component.scss'],\r\n encapsulation: ViewEncapsulation.None\r\n})\r\nexport class AppTileBoxComponent implements OnInit, OnDestroy {\r\n\r\n @Input() appTile: AppTile;\r\n @Input() userAppTile: UserAppTile;\r\n @Input() editMode: boolean;\r\n @Input() hideTitle: boolean;\r\n @Input() hideInfo: boolean;\r\n @Output() removalEvents = new EventEmitter(true);\r\n private subscription: Subscription = new Subscription();\r\n\r\n constructor(\r\n @Inject(CUSTOMERENVIRONMENT) private environment: Environment,\r\n private dialog: MatDialog,\r\n private userAppTileService: UserAppTileService,\r\n private router: Router,\r\n private appTileService: AppTileService) {\r\n }\r\n\r\n getInitials(appTile: AppTile) {\r\n return Utilities.generateInitials(appTile.Title);\r\n }\r\n\r\n shouldDisplayNew(appTile: AppTile) {\r\n if (appTile.ShowAsNewUntilThisDate) {\r\n if (isAfter(appTile.ShowAsNewUntilThisDate, new Date()) || isSameDay(appTile.ShowAsNewUntilThisDate, new Date())) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n\r\n getBgColor(colorHexCode: string) {\r\n return Utilities.hexToRGBA(colorHexCode, '0.3');\r\n }\r\n\r\n getColor(colorHexCode: string) {\r\n return Utilities.hexToRGBA(colorHexCode, '1');\r\n }\r\n\r\n getUrl(url: string) {\r\n return Utilities.getRealUrlFromTokenBasedUrl(this.environment, url);\r\n }\r\n\r\n remove() {\r\n const dialogRef = this.dialog.open(ConfirmDialogComponent);\r\n this.subscription.add(\r\n dialogRef.afterClosed()\r\n .pipe(concatMap(result => {\r\n if (result) {\r\n return this.userAppTileService.deleteUserAppTile(this.appTile.Id);\r\n } else {\r\n return of(null);\r\n }\r\n }))\r\n .subscribe(result => {\r\n if (result) {\r\n this.removalEvents.emit(result);\r\n }\r\n }));\r\n }\r\n\r\n hide() {\r\n const dialogRef = this.dialog.open(AppTileHideDialogComponent);\r\n this.subscription.add(\r\n dialogRef.afterClosed()\r\n .pipe(\r\n concatMap(result => {\r\n if (result) {\r\n this.userAppTile.HideFromUI = true;\r\n return this.userAppTileService.updateUserAppTile(this.userAppTile.AppTileId, this.userAppTile);\r\n } else {\r\n return of(null);\r\n }\r\n }))\r\n .subscribe(result => {\r\n if (result) {\r\n this.removalEvents.emit(result);\r\n }\r\n }));\r\n }\r\n\r\n unhide() {\r\n this.userAppTile.HideFromUI = false;\r\n this.subscription.add(\r\n this.userAppTileService.updateUserAppTile(this.userAppTile.AppTileId, this.userAppTile)\r\n .subscribe(result => {\r\n if (result) {\r\n this.appTile = result.AppTile;\r\n }\r\n }));\r\n }\r\n\r\n appClick(event: any) {\r\n event.preventDefault();\r\n this.router.navigate(['', { outlets: { modal: ['app-tile-intro', this.appTile.Id] } }]);\r\n }\r\n\r\n ngOnInit() {\r\n if (this.appTile && this.appTile.IntegrationEndpointUrl) {\r\n this.appTile.UnreadCounter$ = this.appTileService.getUnreadCounterFromEndpoint(this.appTile);\r\n }\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.subscription && this.subscription.unsubscribe();\r\n }\r\n\r\n}\r\n@NgModule({\r\n declarations: [AppTileBoxComponent],\r\n exports: [AppTileBoxComponent],\r\n imports: [\r\n CommonModule,\r\n ImgSrcProxyModule,\r\n FeatureToggleModule,\r\n MatMenuModule,\r\n MatBadgeModule,\r\n MatTooltipModule,\r\n LinkModule,\r\n RouterModule,\r\n ConfirmDialogModule,\r\n AppTileHideDialogModule\r\n ]\r\n})\r\nexport class AppTileBoxModule { }\r\n","import { HttpClient, HttpParams } from '@angular/common/http';\r\nimport { Inject, Injectable } from '@angular/core';\r\nimport { CUSTOMERENVIRONMENT } from '@app/common/app-tokens';\r\nimport { Constants } from '@app/common/constants';\r\nimport { HttpHelper } from '@app/common/http-helper';\r\nimport { FeatureSetting } from '@app/models/feature-setting';\r\nimport { CacheService } from '@app/services/cache.service';\r\nimport { FeatureSettingsStoreService } from '@app/services/feature-settings-store.service';\r\nimport { Environment } from '@environments/interface.environment';\r\nimport { concat, Observable, of, Subject } from 'rxjs';\r\nimport { catchError, map, shareReplay, takeUntil, tap } from 'rxjs/operators';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class FeatureSettingsService {\r\n\r\n constructor(\r\n private http: HttpClient,\r\n private cache: CacheService,\r\n @Inject(CUSTOMERENVIRONMENT) private environment: Environment,\r\n private httpHelper: HttpHelper,\r\n private featureSettingsStoreService: FeatureSettingsStoreService) { }\r\n\r\n public readonly getFeatureSettingsCacheKey = 'FeatureSettingsService-getFeatureSettings';\r\n public useCache = true;\r\n private getFeatureSettings$: Observable>;\r\n private getAzureADApplicationObjectId$: Observable;\r\n private reload$ = new Subject();\r\n\r\n public reload() {\r\n this.reload$.next();\r\n this.getFeatureSettings$ = null;\r\n this.getAzureADApplicationObjectId$ = null;\r\n\r\n if (this.useCache) {\r\n this.cache.removeFromPersistentCache(this.getFeatureSettingsCacheKey);\r\n }\r\n }\r\n\r\n getAzureADApplicationObjectId(): Observable {\r\n if (!this.getAzureADApplicationObjectId$) {\r\n this.getAzureADApplicationObjectId$ = this.http.get(`${Constants.GRAPH_API_ENDPOINT + Constants.GRAPH_API_VERSION_ONE}/${this.environment.msalConfig.tenant}/servicePrincipals?$filter=appId eq '${this.environment.msalConfig.auth.clientId}'&$select=id`)\r\n .pipe(\r\n map(result => {\r\n return result?.value[0]?.id;\r\n }),\r\n catchError(this.httpHelper.handleError({ operation: 'getAzureADApplicationObjectId', result: null, rethrow: true })),\r\n takeUntil(this.reload$),\r\n shareReplay({ bufferSize: 1, refCount: true }));\r\n }\r\n return this.getAzureADApplicationObjectId$;\r\n }\r\n\r\n /**\r\n * This will get automatically invoked on app init\r\n * */\r\n getFeatureSettings(): Observable> {\r\n if (this.getFeatureSettings$) {\r\n return this.getFeatureSettings$;\r\n } else {\r\n this.getFeatureSettings$ = this.http.get>(`${Constants.API_ENDPOINT}/featuresettings`)\r\n .pipe(\r\n map(response => {\r\n console.log(`fetched result getFeatureSettings: `, response);\r\n return response.map(p => new FeatureSetting(p));\r\n }),\r\n tap(data => {\r\n this.useCache && this.cache.set(this.getFeatureSettingsCacheKey, data);\r\n data.forEach(f => this.featureSettingsStoreService.updateState(f));\r\n }),\r\n catchError(this.httpHelper.handleError({ operation: 'getFeatureSettings', result: new Array(), rethrow: true, cacheKey: this.getFeatureSettingsCacheKey })),\r\n takeUntil(this.reload$),\r\n shareReplay({ bufferSize: 1, refCount: true }));\r\n\r\n if (this.useCache) {\r\n const cachedData = this.cache.get>(this.getFeatureSettingsCacheKey);\r\n if (cachedData) {\r\n return concat(of(cachedData), this.getFeatureSettings$);\r\n }\r\n }\r\n return this.getFeatureSettings$;\r\n }\r\n }\r\n\r\n updateFeatureSetting(id: string, featureSetting: FeatureSetting): Observable {\r\n // We need to append the siteUrl because there will be an authorization check in the backend against the workplace admin group on this site\r\n const httpParams = new HttpParams().append('siteUrl', encodeURI(this.environment.coreWorkplaceSiteUrl));\r\n const fetchOperation = this.http.put(`${Constants.API_ENDPOINT}/featuresettings/${id}`, featureSetting, {\r\n params: httpParams\r\n })\r\n .pipe(\r\n map(response => {\r\n console.log(`updated result: `);\r\n console.log(response);\r\n this.reload();\r\n return featureSetting;\r\n }),\r\n tap(setting => {\r\n this.featureSettingsStoreService.updateState(setting);\r\n }),\r\n catchError(this.httpHelper.handleError({ operation: 'updateFeatureSetting', result: new FeatureSetting(), rethrow: true })));\r\n\r\n return fetchOperation;\r\n }\r\n\r\n deleteFeatureSetting(id: string): Observable {\r\n // We need to append the siteUrl because there will be an authorization check in the backend against the workplace admin group on this site\r\n const httpParams = new HttpParams().append('siteUrl', encodeURI(this.environment.coreWorkplaceSiteUrl));\r\n const fetchOperation = this.http.delete(`${Constants.API_ENDPOINT}/featuresettings/${id}`, {\r\n params: httpParams\r\n })\r\n .pipe(\r\n map(response => {\r\n console.log(`deleted result: `);\r\n console.log(response);\r\n this.reload();\r\n return response;\r\n }),\r\n catchError(this.httpHelper.handleError({ operation: 'deleteFeatureSetting', result: new FeatureSetting(), rethrow: true })));\r\n\r\n return fetchOperation;\r\n }\r\n\r\n addOrUpdateFeatureSetting(featureSetting: FeatureSetting): Observable {\r\n // We need to append the siteUrl because there will be an authorization check in the backend against the workplace admin group on this site\r\n const httpParams = new HttpParams().append('siteUrl', encodeURI(this.environment.coreWorkplaceSiteUrl));\r\n const fetchOperation = this.http.post(`${Constants.API_ENDPOINT}/featuresettings`, featureSetting, {\r\n params: httpParams\r\n })\r\n .pipe(\r\n map(response => {\r\n console.log(`added result: `);\r\n console.log(response);\r\n this.reload();\r\n if (response) {\r\n return new FeatureSetting(response);\r\n } else {\r\n return featureSetting;\r\n }\r\n }),\r\n tap(setting => {\r\n this.featureSettingsStoreService.updateState(setting);\r\n }),\r\n catchError(this.httpHelper.handleError({ operation: 'addFeatureSetting', result: new FeatureSetting(), rethrow: true })));\r\n\r\n return fetchOperation;\r\n }\r\n}\r\n","import { HttpClient, HttpParams } from '@angular/common/http';\r\nimport { Inject, Injectable, LOCALE_ID } from '@angular/core';\r\nimport { Constants } from '@app/common/constants';\r\nimport { HttpHelper } from '@app/common/http-helper';\r\nimport { AppTile } from '@app/models/app-tile';\r\nimport { TimeZoneItem } from '@app/models/time-zone-item';\r\nimport { UserAppTile } from '@app/models/user-app-tile';\r\nimport { CacheService } from '@app/services/cache.service';\r\nimport { CultureService } from '@app/services/culture.service';\r\nimport { format } from 'date-fns';\r\nimport { BehaviorSubject, concat, Observable, of, Subject } from 'rxjs';\r\nimport { catchError, map, mergeMap, shareReplay, takeUntil, tap } from 'rxjs/operators';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class SmartLinksService {\r\n\r\n private getUserSmartLinks$: Observable>;\r\n private getAllSmartLinks$: Observable>;\r\n private getSystemTimeZones$: Observable>;\r\n\r\n public readonly cacheKeyPrefix = 'SmartLinksService-smartlinks-';\r\n public useCache = true;\r\n private reload$ = new Subject();\r\n public refresh$ = new BehaviorSubject(null);\r\n\r\n constructor(private http: HttpClient, private cache: CacheService, private cultureService: CultureService, @Inject(LOCALE_ID) private localeId: string, private httpHelper: HttpHelper) { }\r\n\r\n public reload() {\r\n this.reload$.next();\r\n this.getUserSmartLinks$ = null;\r\n this.getAllSmartLinks$ = null;\r\n\r\n if (this.useCache) {\r\n this.cache.removeAllItemsInPersistentCacheWithGeneratedKeyPrefix(this.cacheKeyPrefix);\r\n }\r\n this.refresh$.next(null);\r\n }\r\n\r\n /** Gets smart links for a user (for my board) */\r\n getUserSmartLinks(): Observable> {\r\n const cacheKey = this.cacheKeyPrefix + 'my';\r\n\r\n if (this.getUserSmartLinks$) {\r\n return this.getUserSmartLinks$;\r\n } else {\r\n this.getUserSmartLinks$ = this.http.get>(`${Constants.API_ENDPOINT}/me/UserAppTiles/smartlinks`, {\r\n\r\n })\r\n .pipe(\r\n map(response => {\r\n console.log(`getUserSmartLinks: `, response);\r\n const userTiles = response.map(p => new UserAppTile(p));\r\n return userTiles.map(t => new AppTile(t.AppTile));\r\n }),\r\n tap(data => {\r\n this.useCache && this.cache.set(cacheKey, data);\r\n }),\r\n catchError(this.httpHelper.handleError({ operation: 'getUserSmartLinks', result: new Array(), cacheKey: cacheKey })),\r\n takeUntil(this.reload$),\r\n shareReplay({ bufferSize: 1, refCount: true }));\r\n\r\n if (this.useCache) {\r\n const cachedData = this.cache.get>(cacheKey);\r\n if (cachedData) {\r\n return concat(of(cachedData), this.getUserSmartLinks$);\r\n }\r\n }\r\n return this.getUserSmartLinks$;\r\n }\r\n }\r\n\r\n /** Gets all smart links, used when fetching for app center. */\r\n getAdminSmartLinks(): Observable> {\r\n const cacheKey = this.cacheKeyPrefix + 'all';\r\n\r\n const httpParams = new HttpParams()\r\n .append('smartlinks', 'true');\r\n\r\n if (this.getAllSmartLinks$) {\r\n return this.getAllSmartLinks$;\r\n } else {\r\n this.getAllSmartLinks$ = this.http.get>(`${Constants.API_ENDPOINT}/apptiles`, {\r\n params: httpParams,\r\n })\r\n .pipe(\r\n map(response => {\r\n console.log(`getAdminSmartLinks: `, response);\r\n return response.map(p => new AppTile(p));\r\n }),\r\n tap(data => {\r\n this.useCache && this.cache.set(cacheKey, data);\r\n }),\r\n catchError(this.httpHelper.handleError({ operation: 'getAdminSmartLinks', result: new Array() })),\r\n takeUntil(this.reload$),\r\n shareReplay({ bufferSize: 1, refCount: true }));\r\n\r\n if (this.useCache) {\r\n const cachedData = this.cache.get>(cacheKey);\r\n if (cachedData) {\r\n return concat(of(cachedData), this.getAllSmartLinks$);\r\n }\r\n }\r\n\r\n return this.getAllSmartLinks$;\r\n }\r\n }\r\n\r\n guessCurrentTimeZone(zones: Array): TimeZoneItem {\r\n // Since most customers are swedish we always try this first to make it quick and easy\r\n if (this.localeId === 'sv') {\r\n const stockholmZone = zones.find(z => z.IANAName.toLowerCase().indexOf('stockholm') !== -1 || z.DisplayName.toLowerCase().indexOf('stockholm') !== -1);\r\n if (stockholmZone) {\r\n return stockholmZone;\r\n }\r\n }\r\n\r\n // The following logic has been copied nad modified from Moment timezone https://github.com/moment/moment-timezone/blob/develop/moment-timezone.js#L335\r\n try {\r\n const intlName = Intl.DateTimeFormat().resolvedOptions().timeZone;\r\n if (intlName && intlName.length > 3) {\r\n const timeZoneItem = zones.find(z => z.IANAName.toLowerCase() === intlName.toLowerCase());\r\n if (timeZoneItem) {\r\n return timeZoneItem;\r\n }\r\n }\r\n } catch (e) {\r\n // Intl unavailable, fall back to manual guessing.\r\n }\r\n\r\n // Narrow down zones by trying to match the offset value https://date-fns.org/v2.9.0/docs/format\r\n const localTimeOffset = format(new Date(), 'xxx');\r\n const matchingZones = zones.filter(r => r.DisplayName.indexOf(localTimeOffset) !== -1);\r\n // force en-us so get the zone name in english to try and match with windows names\r\n // zone will look like this in working browsers: \"1/29/2020, Central European Standard Time\"\r\n let zone = new Date().toLocaleDateString('en-us', { timeZoneName: 'long' });\r\n if (zone && zone.indexOf(',') > -1) {\r\n zone = zone.split(',')[1];\r\n const matchingZone = matchingZones.find(z => z.StandardName.toLowerCase() === zone.trim().toLowerCase());\r\n if (matchingZone) {\r\n return matchingZone;\r\n }\r\n }\r\n // Fall back to the first one with the same UTC offset.\r\n return matchingZones[0];\r\n }\r\n\r\n getSystemTimeZones(): Observable> {\r\n if (this.getSystemTimeZones$) {\r\n return this.getSystemTimeZones$;\r\n } else {\r\n this.getSystemTimeZones$ = this.cultureService.getRegionCodeForCurrentLocale()\r\n .pipe(\r\n mergeMap(regionCode => {\r\n const params = new HttpParams().append('regionCode', regionCode);\r\n return this.http.get>(`${Constants.API_ENDPOINT}/datetime/zones`, {\r\n params: params,\r\n });\r\n }),\r\n catchError(this.httpHelper.handleError({ operation: 'getSystemTimeZones', result: new Array() })),\r\n shareReplay({ bufferSize: 1, refCount: true })\r\n );\r\n\r\n return this.getSystemTimeZones$;\r\n }\r\n }\r\n\r\n}\r\n","import { SelectionModel } from '@angular/cdk/collections';\r\nimport { NestedTreeControl } from '@angular/cdk/tree';\r\nimport { CommonModule } from '@angular/common';\r\nimport { Component, EventEmitter, Input, NgModule, OnInit, Output, ViewEncapsulation } from '@angular/core';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatCheckboxModule } from '@angular/material/checkbox';\r\nimport { MatTreeModule, MatTreeNestedDataSource } from '@angular/material/tree';\r\nimport '@app/common/array-extensions';\r\nimport { SimplifiedTerm } from '@app/models/simplified-term';\r\n\r\n@Component({\r\n selector: 'app-channel-control',\r\n templateUrl: './channel-control.component.html',\r\n styleUrls: ['./channel-control.component.scss'],\r\n encapsulation: ViewEncapsulation.None\r\n})\r\nexport class ChannelControlComponent implements OnInit {\r\n nestedTreeControl: NestedTreeControl;\r\n nestedDataSource: MatTreeNestedDataSource;\r\n checklistSelection = new SelectionModel(true);\r\n @Output() selectionChange = new EventEmitter();\r\n @Input() channels: Array;\r\n hasChannelSelected = false;\r\n\r\n constructor() {\r\n this.nestedTreeControl = new NestedTreeControl(this._getChildren);\r\n this.nestedDataSource = new MatTreeNestedDataSource();\r\n }\r\n\r\n todoLeafItemSelectionToggle(node: SimplifiedTerm): void {\r\n this.checklistSelection.toggle(node);\r\n const selectedChannels = this.channels.filterRecursive(c => c.Selected, 'Terms');\r\n selectedChannels.length > 1\r\n ? this.hasChannelSelected = true\r\n : this.hasChannelSelected = false;\r\n\r\n }\r\n\r\n /** Toggle the to-do item selection. Select/deselect all the descendants node */\r\n todoItemSelectionToggle(node: SimplifiedTerm): void {\r\n this.checklistSelection.toggle(node);\r\n\r\n const descendants = this.nestedTreeControl.getDescendants(node) // remove depricated and non tagable child nodes from auto selection.\r\n .filter(cn => {\r\n if (cn.IsDeprecated || !cn.IsAvailableForTagging) {\r\n return false;\r\n } else { return true; }\r\n });\r\n\r\n this.checklistSelection.isSelected(node)\r\n ? this.checklistSelection.select(...descendants)\r\n : this.checklistSelection.deselect(...descendants);\r\n\r\n // Force update for the parent\r\n descendants.every(child =>\r\n this.checklistSelection.isSelected(child)\r\n );\r\n\r\n const selectedChannels = this.channels.filterRecursive(c => c.Selected, 'Terms');\r\n selectedChannels.length > 1\r\n ? this.hasChannelSelected = true\r\n : this.hasChannelSelected = false;\r\n }\r\n\r\n hasNestedChild = (_: number, node: SimplifiedTerm) => node?.Terms?.length > 0;\r\n\r\n private _getChildren = (node: SimplifiedTerm) => node.Terms;\r\n\r\n ngOnInit() {\r\n if (this.channels) {\r\n this.nestedDataSource.data = this.channels;\r\n\r\n const selectedChannels = this.channels.filterRecursive(c => c.Selected, 'Terms');\r\n\r\n if (selectedChannels.length > 0) {\r\n this.checklistSelection.select(...selectedChannels);\r\n }\r\n\r\n selectedChannels.length > 1\r\n ? this.hasChannelSelected = true\r\n : this.hasChannelSelected = false;\r\n }\r\n this.checklistSelection.changed.subscribe(change => {\r\n change.added.forEach(c => c.Selected = true);\r\n change.removed.forEach(c => c.Selected = false);\r\n this.selectionChange.emit(this.checklistSelection.selected);\r\n });\r\n\r\n }\r\n\r\n clear() {\r\n\r\n const allTerms = this.channels.filterRecursive(c => c, 'Terms');\r\n\r\n this.nestedTreeControl.dataNodes = allTerms;\r\n for (let i = 0; i < this.nestedTreeControl.dataNodes.length; i++) {\r\n if (this.checklistSelection.isSelected(this.nestedTreeControl.dataNodes[i])) {\r\n this.checklistSelection.toggle(this.nestedTreeControl.dataNodes[i]);\r\n }\r\n }\r\n this.hasChannelSelected = false;\r\n }\r\n}\r\n\r\n@NgModule({\r\n declarations: [ChannelControlComponent],\r\n exports: [ChannelControlComponent],\r\n imports: [\r\n CommonModule,\r\n MatTreeModule,\r\n MatButtonModule,\r\n MatCheckboxModule,\r\n ]\r\n})\r\nexport class ChannelControlModule { }\r\n","
\r\n
\r\n \r\n
\r\n
\r\n\r\n \r\n
  • \r\n \r\n {{node.Name}}\r\n {{node.Name}}\r\n
  • \r\n
    \r\n\r\n \r\n
  • \r\n
    \r\n \r\n {{node.Name}}\r\n {{node.Name}}\r\n
    \r\n
      \r\n \r\n
    \r\n
  • \r\n
    \r\n
    \r\n","import { ChannelTermPage } from '@app/models/channel-term-page';\r\nimport { SearchResult } from '@app/models/search-result';\r\nimport { parseISO } from 'date-fns';\r\nimport { Observable } from 'rxjs';\r\n\r\nexport enum PageType {\r\n Content = 0,\r\n News = 1,\r\n NewsQuickRead = 2\r\n}\r\n\r\nexport class Page {\r\n public Id: number;\r\n public Title: string;\r\n public SlugTitle: string;\r\n public Content: string;\r\n public BannerImageUrl: string;\r\n public BannerImageText: string;\r\n public BannerImageAltText: string;\r\n public PageType: PageType;\r\n public IsFeaturedPage: boolean;\r\n public IsCommentsEnabled: boolean;\r\n public ModifiedByUserUpnId: string;\r\n public OwnerUserUpnId: string;\r\n public LanguageTermId?: string;\r\n public Created: Date;\r\n public Modified: Date;\r\n public PublishingDate: Date;\r\n public ChannelTermPages: Array;\r\n public ModifiedByUserPhotoUrl$?: Observable;\r\n public OwnerUserPhotoUrl$?: Observable;\r\n public Path?: string;\r\n public IsSharePointPage?: boolean;\r\n public Notify: boolean;\r\n public SenderTags?: Array;\r\n\r\n constructor(opt?: Partial) {\r\n if (opt) {\r\n\r\n if (opt.Created && typeof opt.Created === 'string') {\r\n opt.Created = parseISO(opt.Created);\r\n }\r\n\r\n if (opt.Modified && typeof opt.Modified === 'string') {\r\n opt.Modified = parseISO(opt.Modified);\r\n }\r\n\r\n if (opt.PublishingDate && typeof opt.PublishingDate === 'string') {\r\n opt.PublishingDate = parseISO(opt.PublishingDate);\r\n }\r\n }\r\n\r\n Object.assign(this, opt);\r\n }\r\n\r\n static fromSearchResult(result: SearchResult, featuredPageMP: string, newsChannelMP: string, pageLanguageMP: string, pageType: PageType, newsSenderTagMP: string): Page {\r\n return new Page({\r\n Title: result ? result.Title : null,\r\n Content: result ? result.Description : null,\r\n Path: result ? result.Path : null,\r\n BannerImageUrl: result && result.PictureThumbnailURL && !result.PictureThumbnailURL.endsWith('/sitepagethumbnail.png') ? result.PictureThumbnailURL : null,\r\n PublishingDate: pageType === PageType.News ? (result ? result.FirstPublishedDate : null) : (result ? result.Created : null),\r\n Created: result ? result.Created : null,\r\n IsFeaturedPage: result[featuredPageMP] === '1' ? true : false,\r\n ChannelTermPages: result && result[newsChannelMP] ? this.parseManagedMetaDataStringAsChannelTerms(result[newsChannelMP]) : [],\r\n LanguageTermId: result && result[pageLanguageMP] ? this.getManagedMetaDataTermId(result[pageLanguageMP]) : '',\r\n PageType: pageType,\r\n IsSharePointPage: true,\r\n SenderTags: result && result[newsSenderTagMP] ? this.parseManagedMetaDataString(result[newsSenderTagMP]) : null\r\n });\r\n }\r\n\r\n static getManagedMetaDataTermId(metadatastring: string): string {\r\n // The language used always have 3 parts split by | and the guid starts with '#0' so slice away those two\r\n // Example:\r\n // \"GP0|#8718ab35-a7d9-4d99-9945-1f5cc5742224;\"\r\n // \"L0|#08718ab35-a7d9-4d99-9945-1f5cc5742224|English;\"\r\n // \"GTSet|#d1a62611-0513-4d6a-92e2-9b250a08c5c3;\"\r\n return metadatastring.split(';').filter(c => c.split('|').length === 3).map(c => c.split('|')[1])[0].slice(2);\r\n }\r\n\r\n static parseManagedMetaDataStringAsChannelTerms(channels: string): Array {\r\n // The channel used always have 3 parts split by | and the guid starts with '#0' so slice away those two\r\n // Example:\r\n // GP0|#1780e01b-8e93-4887-a7de-74e04ae2105d;L0|#01780e01b-8e93-4887-a7de-74e04ae2105d|Civil;GTSet|#d1a62611-0513-4d6a-92e2-9b250a08c5c3;GPP|#fdc4ef06-e425-40ca-8483-57e0e7118a0f\r\n // Is only the channel 'Civil' with guid '1780e01b-8e93-4887-a7de-74e04ae2105d'\r\n return channels.split(';').filter(c => c.split('|').length === 3).map(c => c.split('|')[1].slice(2)).map(id => ({ ChannelTermId: id, PageId: null }));\r\n }\r\n\r\n static parseManagedMetaDataString(metadatastring: string): string[] {\r\n // EXAMPLE:\r\n // \"GP0|#fa47a309-9bf1-41c5-ae0e-c96fec918fb0;\"\r\n // \"L0|#0fa47a309-9bf1-41c5-ae0e-c96fec918fb0|Lund;\"\r\n // \"GTSet|#d1a62611-0513-4d6a-92e2-9b250a08c5c3;\r\n // \"GPP|#bf474651-16af-430b-a1c7-3be0003f0f98;\"\r\n // \"GPP|#cd878a30-546c-4275-9e88-08114d03c079;\"\r\n // \"GPP|#48dfae2a-0b81-46dd-872f-d60b08a7c702;\"\r\n // \"GP0|#5ae92d29-5d4a-440e-b0a2-2e8bf0468ba0;\"\r\n // \"L0|#05ae92d29-5d4a-440e-b0a2-2e8bf0468ba0|Chef;\"\r\n // \"GPP|#601ef509-add9-4237-a80f-039f87615b6b;\"\r\n // \"GPP|#79a51917-cf59-4470-81c4-a74e12be48cc\"\r\n return metadatastring.split(';').filter(c => c.split('|').length === 3).map(c => c.split('|')[2]);\r\n }\r\n\r\n toSearchResult(): SearchResult {\r\n const searchResult = new SearchResult();\r\n searchResult.Title = this.Title;\r\n searchResult.FirstPublishedDate = this.Created;\r\n if (this.PageType === PageType.News) {\r\n searchResult.Path = `/pages/news/${this.SlugTitle}-${this.Id}`;\r\n } else if (this.PageType === PageType.Content) {\r\n searchResult.Path = `/pages/content/${this.SlugTitle}-${this.Id}`;\r\n }\r\n return searchResult;\r\n }\r\n}\r\n","import { NgModule } from '@angular/core';\r\n\r\n/**\r\n * This module is needed for when you want to integrate the workplace application\r\n * within MS Teams. It doesnt do anything really right now but is here for furture use.\r\n * */\r\n@NgModule({\r\n declarations: [],\r\n imports: [],\r\n exports: []\r\n})\r\nexport class MsTeamsModule {}\r\n","import { Injectable, Inject } from '@angular/core';\r\nimport { Observable, bindCallback, Subject } from 'rxjs';\r\nimport * as microsoftTeams from '@microsoft/teams-js';\r\nimport { WINDOW } from '@app/common/app-tokens';\r\nimport { shareReplay } from 'rxjs/operators';\r\nimport { MsTeamsModule } from '@app/modules/msteams/msteams.module';\r\nimport { Constants } from '@app/common/constants';\r\n\r\n@Injectable({\r\n providedIn: MsTeamsModule\r\n})\r\nexport class MsteamsService {\r\n\r\n isTeamsInitialized: boolean;\r\n authenticateWindowOpen = false;\r\n subject = new Subject();\r\n queue = new Array();\r\n authResultMap$ = new Map>();\r\n\r\n constructor(@Inject(WINDOW) private window: Window) { }\r\n\r\n public initMsTeams(): Observable {\r\n return new Observable((subscriber) => {\r\n microsoftTeams.initialize(() => {\r\n this.isTeamsInitialized = true;\r\n this.notifyAppLoaded();\r\n this.notifyAppSuccess();\r\n subscriber.next();\r\n subscriber.complete();\r\n });\r\n });\r\n }\r\n\r\n public notifyAppLoaded() {\r\n microsoftTeams.appInitialization.notifyAppLoaded();\r\n }\r\n\r\n public notifyAppSuccess() {\r\n microsoftTeams.appInitialization.notifySuccess();\r\n }\r\n\r\n public notifyAuthSuccess(result?: string) {\r\n microsoftTeams.authentication.notifySuccess(result);\r\n }\r\n\r\n public notifyAuthFailure() {\r\n microsoftTeams.authentication.notifyFailure();\r\n }\r\n\r\n public getContext(): Observable {\r\n const ctx = bindCallback(microsoftTeams.getContext);\r\n return ctx();\r\n }\r\n\r\n public authenticate(scope?: string): Observable {\r\n const key = scope || 'none';\r\n // We will have lots of the same keys so we just return the replay of those.\r\n if (this.authResultMap$.has(key)) {\r\n return this.authResultMap$.get(key);\r\n } else {\r\n const authenticateUsingTeams$ = new Observable(\r\n (subscriber) => {\r\n // Tell the service that auth window is open, we should not have multiple opened.\r\n this.authenticateWindowOpen = true;\r\n const params = {\r\n url: `${this.window.location.origin}/(auth:msteams-auth)?${Constants.IN_TEAMS_AUTH_POPUP_REDIRECT_KEY}=true&${Constants.SHOULD_NOT_LOAD_MAIN_KEY}=true${scope ? '&scope=' + scope : ''}`,\r\n successCallback: (result?: string) => {\r\n // Tell the service that the window is closed/done\r\n this.authenticateWindowOpen = false;\r\n subscriber.next(result);\r\n subscriber.complete();\r\n },\r\n failureCallback: (reason?: string) => {\r\n subscriber.error(reason);\r\n }\r\n } as microsoftTeams.authentication.AuthenticateParameters;\r\n\r\n microsoftTeams.authentication.authenticate(params);\r\n })\r\n .pipe(\r\n shareReplay({ bufferSize: 1, refCount: true }),\r\n );\r\n\r\n this.authResultMap$.set(key, authenticateUsingTeams$);\r\n\r\n return this.authResultMap$.get(key);\r\n }\r\n }\r\n}\r\n","export enum TrendingResult {\r\n Modern = 'Modern', // Uses search to find SharePoint default trending results from team sites and communication sites (the same way as SharePoint Home does it).\r\n ModernOnlyFromCoreRootSite = 'ModernOnlyFromCoreRootSite' // Same as 'Modern' but limited to only return trending results from the root site\r\n}\r\n","import { AppTile } from './app-tile';\r\n\r\nexport class ChannelTermAppTile {\r\n public AppTile: AppTile;\r\n public AppTileId: number;\r\n public ChannelTermId: string;\r\n\r\n constructor(opt?: Partial) {\r\n Object.assign(this, opt);\r\n }\r\n}\r\n","var map = {\n\t\"./af\": \"K/tc\",\n\t\"./af.js\": \"K/tc\",\n\t\"./ar\": \"jnO4\",\n\t\"./ar-dz\": \"o1bE\",\n\t\"./ar-dz.js\": \"o1bE\",\n\t\"./ar-kw\": \"Qj4J\",\n\t\"./ar-kw.js\": \"Qj4J\",\n\t\"./ar-ly\": \"HP3h\",\n\t\"./ar-ly.js\": \"HP3h\",\n\t\"./ar-ma\": \"CoRJ\",\n\t\"./ar-ma.js\": \"CoRJ\",\n\t\"./ar-sa\": \"gjCT\",\n\t\"./ar-sa.js\": \"gjCT\",\n\t\"./ar-tn\": \"bYM6\",\n\t\"./ar-tn.js\": \"bYM6\",\n\t\"./ar.js\": \"jnO4\",\n\t\"./az\": \"SFxW\",\n\t\"./az.js\": \"SFxW\",\n\t\"./be\": \"H8ED\",\n\t\"./be.js\": \"H8ED\",\n\t\"./bg\": \"hKrs\",\n\t\"./bg.js\": \"hKrs\",\n\t\"./bm\": \"p/rL\",\n\t\"./bm.js\": \"p/rL\",\n\t\"./bn\": \"kEOa\",\n\t\"./bn-bd\": \"loYQ\",\n\t\"./bn-bd.js\": \"loYQ\",\n\t\"./bn.js\": \"kEOa\",\n\t\"./bo\": \"0mo+\",\n\t\"./bo.js\": \"0mo+\",\n\t\"./br\": \"aIdf\",\n\t\"./br.js\": \"aIdf\",\n\t\"./bs\": \"JVSJ\",\n\t\"./bs.js\": \"JVSJ\",\n\t\"./ca\": \"1xZ4\",\n\t\"./ca.js\": \"1xZ4\",\n\t\"./cs\": \"PA2r\",\n\t\"./cs.js\": \"PA2r\",\n\t\"./cv\": \"A+xa\",\n\t\"./cv.js\": \"A+xa\",\n\t\"./cy\": \"l5ep\",\n\t\"./cy.js\": \"l5ep\",\n\t\"./da\": \"DxQv\",\n\t\"./da.js\": \"DxQv\",\n\t\"./de\": \"tGlX\",\n\t\"./de-at\": \"s+uk\",\n\t\"./de-at.js\": \"s+uk\",\n\t\"./de-ch\": \"u3GI\",\n\t\"./de-ch.js\": \"u3GI\",\n\t\"./de.js\": \"tGlX\",\n\t\"./dv\": \"WYrj\",\n\t\"./dv.js\": \"WYrj\",\n\t\"./el\": \"jUeY\",\n\t\"./el.js\": \"jUeY\",\n\t\"./en-au\": \"Dmvi\",\n\t\"./en-au.js\": \"Dmvi\",\n\t\"./en-ca\": \"OIYi\",\n\t\"./en-ca.js\": \"OIYi\",\n\t\"./en-gb\": \"Oaa7\",\n\t\"./en-gb.js\": \"Oaa7\",\n\t\"./en-ie\": \"4dOw\",\n\t\"./en-ie.js\": \"4dOw\",\n\t\"./en-il\": \"czMo\",\n\t\"./en-il.js\": \"czMo\",\n\t\"./en-in\": \"7C5Q\",\n\t\"./en-in.js\": \"7C5Q\",\n\t\"./en-nz\": \"b1Dy\",\n\t\"./en-nz.js\": \"b1Dy\",\n\t\"./en-sg\": \"t+mt\",\n\t\"./en-sg.js\": \"t+mt\",\n\t\"./eo\": \"Zduo\",\n\t\"./eo.js\": \"Zduo\",\n\t\"./es\": \"iYuL\",\n\t\"./es-do\": \"CjzT\",\n\t\"./es-do.js\": \"CjzT\",\n\t\"./es-mx\": \"tbfe\",\n\t\"./es-mx.js\": \"tbfe\",\n\t\"./es-us\": \"Vclq\",\n\t\"./es-us.js\": \"Vclq\",\n\t\"./es.js\": \"iYuL\",\n\t\"./et\": \"7BjC\",\n\t\"./et.js\": \"7BjC\",\n\t\"./eu\": \"D/JM\",\n\t\"./eu.js\": \"D/JM\",\n\t\"./fa\": \"jfSC\",\n\t\"./fa.js\": \"jfSC\",\n\t\"./fi\": \"gekB\",\n\t\"./fi.js\": \"gekB\",\n\t\"./fil\": \"1ppg\",\n\t\"./fil.js\": \"1ppg\",\n\t\"./fo\": \"ByF4\",\n\t\"./fo.js\": \"ByF4\",\n\t\"./fr\": \"nyYc\",\n\t\"./fr-ca\": \"2fjn\",\n\t\"./fr-ca.js\": \"2fjn\",\n\t\"./fr-ch\": \"Dkky\",\n\t\"./fr-ch.js\": \"Dkky\",\n\t\"./fr.js\": \"nyYc\",\n\t\"./fy\": \"cRix\",\n\t\"./fy.js\": \"cRix\",\n\t\"./ga\": \"USCx\",\n\t\"./ga.js\": \"USCx\",\n\t\"./gd\": \"9rRi\",\n\t\"./gd.js\": \"9rRi\",\n\t\"./gl\": \"iEDd\",\n\t\"./gl.js\": \"iEDd\",\n\t\"./gom-deva\": \"qvJo\",\n\t\"./gom-deva.js\": \"qvJo\",\n\t\"./gom-latn\": \"DKr+\",\n\t\"./gom-latn.js\": \"DKr+\",\n\t\"./gu\": \"4MV3\",\n\t\"./gu.js\": \"4MV3\",\n\t\"./he\": \"x6pH\",\n\t\"./he.js\": \"x6pH\",\n\t\"./hi\": \"3E1r\",\n\t\"./hi.js\": \"3E1r\",\n\t\"./hr\": \"S6ln\",\n\t\"./hr.js\": \"S6ln\",\n\t\"./hu\": \"WxRl\",\n\t\"./hu.js\": \"WxRl\",\n\t\"./hy-am\": \"1rYy\",\n\t\"./hy-am.js\": \"1rYy\",\n\t\"./id\": \"UDhR\",\n\t\"./id.js\": \"UDhR\",\n\t\"./is\": \"BVg3\",\n\t\"./is.js\": \"BVg3\",\n\t\"./it\": \"bpih\",\n\t\"./it-ch\": \"bxKX\",\n\t\"./it-ch.js\": \"bxKX\",\n\t\"./it.js\": \"bpih\",\n\t\"./ja\": \"B55N\",\n\t\"./ja.js\": \"B55N\",\n\t\"./jv\": \"tUCv\",\n\t\"./jv.js\": \"tUCv\",\n\t\"./ka\": \"IBtZ\",\n\t\"./ka.js\": \"IBtZ\",\n\t\"./kk\": \"bXm7\",\n\t\"./kk.js\": \"bXm7\",\n\t\"./km\": \"6B0Y\",\n\t\"./km.js\": \"6B0Y\",\n\t\"./kn\": \"PpIw\",\n\t\"./kn.js\": \"PpIw\",\n\t\"./ko\": \"Ivi+\",\n\t\"./ko.js\": \"Ivi+\",\n\t\"./ku\": \"JCF/\",\n\t\"./ku.js\": \"JCF/\",\n\t\"./ky\": \"lgnt\",\n\t\"./ky.js\": \"lgnt\",\n\t\"./lb\": \"RAwQ\",\n\t\"./lb.js\": \"RAwQ\",\n\t\"./lo\": \"sp3z\",\n\t\"./lo.js\": \"sp3z\",\n\t\"./lt\": \"JvlW\",\n\t\"./lt.js\": \"JvlW\",\n\t\"./lv\": \"uXwI\",\n\t\"./lv.js\": \"uXwI\",\n\t\"./me\": \"KTz0\",\n\t\"./me.js\": \"KTz0\",\n\t\"./mi\": \"aIsn\",\n\t\"./mi.js\": \"aIsn\",\n\t\"./mk\": \"aQkU\",\n\t\"./mk.js\": \"aQkU\",\n\t\"./ml\": \"AvvY\",\n\t\"./ml.js\": \"AvvY\",\n\t\"./mn\": \"lYtQ\",\n\t\"./mn.js\": \"lYtQ\",\n\t\"./mr\": \"Ob0Z\",\n\t\"./mr.js\": \"Ob0Z\",\n\t\"./ms\": \"6+QB\",\n\t\"./ms-my\": \"ZAMP\",\n\t\"./ms-my.js\": \"ZAMP\",\n\t\"./ms.js\": \"6+QB\",\n\t\"./mt\": \"G0Uy\",\n\t\"./mt.js\": \"G0Uy\",\n\t\"./my\": \"honF\",\n\t\"./my.js\": \"honF\",\n\t\"./nb\": \"bOMt\",\n\t\"./nb.js\": \"bOMt\",\n\t\"./ne\": \"OjkT\",\n\t\"./ne.js\": \"OjkT\",\n\t\"./nl\": \"+s0g\",\n\t\"./nl-be\": \"2ykv\",\n\t\"./nl-be.js\": \"2ykv\",\n\t\"./nl.js\": \"+s0g\",\n\t\"./nn\": \"uEye\",\n\t\"./nn.js\": \"uEye\",\n\t\"./oc-lnc\": \"Fnuy\",\n\t\"./oc-lnc.js\": \"Fnuy\",\n\t\"./pa-in\": \"8/+R\",\n\t\"./pa-in.js\": \"8/+R\",\n\t\"./pl\": \"jVdC\",\n\t\"./pl.js\": \"jVdC\",\n\t\"./pt\": \"8mBD\",\n\t\"./pt-br\": \"0tRk\",\n\t\"./pt-br.js\": \"0tRk\",\n\t\"./pt.js\": \"8mBD\",\n\t\"./ro\": \"lyxo\",\n\t\"./ro.js\": \"lyxo\",\n\t\"./ru\": \"lXzo\",\n\t\"./ru.js\": \"lXzo\",\n\t\"./sd\": \"Z4QM\",\n\t\"./sd.js\": \"Z4QM\",\n\t\"./se\": \"//9w\",\n\t\"./se.js\": \"//9w\",\n\t\"./si\": \"7aV9\",\n\t\"./si.js\": \"7aV9\",\n\t\"./sk\": \"e+ae\",\n\t\"./sk.js\": \"e+ae\",\n\t\"./sl\": \"gVVK\",\n\t\"./sl.js\": \"gVVK\",\n\t\"./sq\": \"yPMs\",\n\t\"./sq.js\": \"yPMs\",\n\t\"./sr\": \"zx6S\",\n\t\"./sr-cyrl\": \"E+lV\",\n\t\"./sr-cyrl.js\": \"E+lV\",\n\t\"./sr.js\": \"zx6S\",\n\t\"./ss\": \"Ur1D\",\n\t\"./ss.js\": \"Ur1D\",\n\t\"./sv\": \"X709\",\n\t\"./sv.js\": \"X709\",\n\t\"./sw\": \"dNwA\",\n\t\"./sw.js\": \"dNwA\",\n\t\"./ta\": \"PeUW\",\n\t\"./ta.js\": \"PeUW\",\n\t\"./te\": \"XLvN\",\n\t\"./te.js\": \"XLvN\",\n\t\"./tet\": \"V2x9\",\n\t\"./tet.js\": \"V2x9\",\n\t\"./tg\": \"Oxv6\",\n\t\"./tg.js\": \"Oxv6\",\n\t\"./th\": \"EOgW\",\n\t\"./th.js\": \"EOgW\",\n\t\"./tk\": \"Wv91\",\n\t\"./tk.js\": \"Wv91\",\n\t\"./tl-ph\": \"Dzi0\",\n\t\"./tl-ph.js\": \"Dzi0\",\n\t\"./tlh\": \"z3Vd\",\n\t\"./tlh.js\": \"z3Vd\",\n\t\"./tr\": \"DoHr\",\n\t\"./tr.js\": \"DoHr\",\n\t\"./tzl\": \"z1FC\",\n\t\"./tzl.js\": \"z1FC\",\n\t\"./tzm\": \"wQk9\",\n\t\"./tzm-latn\": \"tT3J\",\n\t\"./tzm-latn.js\": \"tT3J\",\n\t\"./tzm.js\": \"wQk9\",\n\t\"./ug-cn\": \"YRex\",\n\t\"./ug-cn.js\": \"YRex\",\n\t\"./uk\": \"raLr\",\n\t\"./uk.js\": \"raLr\",\n\t\"./ur\": \"UpQW\",\n\t\"./ur.js\": \"UpQW\",\n\t\"./uz\": \"Loxo\",\n\t\"./uz-latn\": \"AQ68\",\n\t\"./uz-latn.js\": \"AQ68\",\n\t\"./uz.js\": \"Loxo\",\n\t\"./vi\": \"KSF8\",\n\t\"./vi.js\": \"KSF8\",\n\t\"./x-pseudo\": \"/X5v\",\n\t\"./x-pseudo.js\": \"/X5v\",\n\t\"./yo\": \"fzPg\",\n\t\"./yo.js\": \"fzPg\",\n\t\"./zh-cn\": \"XDpg\",\n\t\"./zh-cn.js\": \"XDpg\",\n\t\"./zh-hk\": \"SatO\",\n\t\"./zh-hk.js\": \"SatO\",\n\t\"./zh-mo\": \"OmwH\",\n\t\"./zh-mo.js\": \"OmwH\",\n\t\"./zh-tw\": \"kOpN\",\n\t\"./zh-tw.js\": \"kOpN\"\n};\n\n\nfunction webpackContext(req) {\n\tvar id = webpackContextResolve(req);\n\treturn __webpack_require__(id);\n}\nfunction webpackContextResolve(req) {\n\tif(!__webpack_require__.o(map, req)) {\n\t\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\t\te.code = 'MODULE_NOT_FOUND';\n\t\tthrow e;\n\t}\n\treturn map[req];\n}\nwebpackContext.keys = function webpackContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackContext.resolve = webpackContextResolve;\nmodule.exports = webpackContext;\nwebpackContext.id = \"RnhZ\";","import { Directive, ElementRef, Input, NgModule, Renderer2 } from '@angular/core';\r\n\r\n@Directive({\r\n selector: '[appHideParentIfEmpty]'\r\n})\r\nexport class HideParentIfEmptyDirective {\r\n\r\n @Input('appHideParentIfEmpty') element: ElementRef;\r\n\r\n constructor(private renderer2: Renderer2) { }\r\n\r\n hideElement(hideClass = 'd-none') {\r\n if (this.element) {\r\n this.renderer2.addClass(this.element, hideClass);\r\n }\r\n }\r\n\r\n showElement(hideClass = 'd-none') {\r\n if (this.element) {\r\n this.renderer2.removeClass(this.element, hideClass);\r\n }\r\n }\r\n\r\n}\r\n@NgModule({\r\n declarations: [HideParentIfEmptyDirective],\r\n exports: [HideParentIfEmptyDirective],\r\n})\r\nexport class HideParentIfEmptyModule { }\r\n","import { HttpClient } from '@angular/common/http';\r\nimport { Injectable } from '@angular/core';\r\nimport { MatSnackBar } from '@angular/material/snack-bar';\r\nimport { Constants } from '@app/common/constants';\r\nimport { HttpHelper } from '@app/common/http-helper';\r\nimport { Utilities } from '@app/common/utilities';\r\nimport { AlertTemplatesComponent } from '@app/components/alert-templates/alert-templates.component';\r\nimport { SimplifiedTerm } from '@app/models/simplified-term';\r\nimport { ChannelType, UserChannelTerm } from '@app/models/user-channel-term';\r\nimport { BroadcastService } from '@app/services/broadcast.service';\r\nimport { CacheService } from '@app/services/cache.service';\r\nimport { ChannelService } from '@app/services/channel.service';\r\nimport { RestaurantMenuService } from '@app/services/restaurant-menu.service';\r\nimport { RestaurantService } from '@app/services/restaurant.service';\r\nimport { UserService } from '@app/services/user.service';\r\nimport { AppTileService } from '@app/services/app-tile.service';\r\nimport { NewsService } from '@app/services/news.service';\r\nimport { UserAppTileService } from '@app/services/user-app-tile.service';\r\nimport { GroupsService } from '@app/services/groups.service';\r\nimport { FeatureSettingsStoreService } from '@app/services/feature-settings-store.service';\r\nimport { addHours } from 'date-fns';\r\nimport { concat, forkJoin, iif, Observable, of, Subject } from 'rxjs';\r\nimport { catchError, map, mergeMap, shareReplay, takeUntil, tap } from 'rxjs/operators';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class UserChannelTermsService {\r\n\r\n constructor(private http: HttpClient,\r\n private cache: CacheService,\r\n private httpHelper: HttpHelper,\r\n private snackBar: MatSnackBar,\r\n private newsService: NewsService,\r\n private userAppTileService: UserAppTileService,\r\n private appTileService: AppTileService,\r\n private channelService: ChannelService,\r\n private broadcastService: BroadcastService,\r\n private restaurantService: RestaurantService,\r\n private restaurantMenuService: RestaurantMenuService,\r\n private userService: UserService,\r\n private groupsService: GroupsService,\r\n private featureSettingsStoreService: FeatureSettingsStoreService) { }\r\n\r\n private readonly cacheKey = 'UserChannelTermsService-getUserChannelTerms';\r\n public useCache = true;\r\n private getUserChannelTerms$: Observable>;\r\n private reload$ = new Subject();\r\n\r\n reload() {\r\n this.useCache && this.cache.removeFromPersistentCache(this.cacheKey);\r\n this.getUserChannelTerms$ = null;\r\n this.reload$.next();\r\n\r\n this.newsService.reloadAllPersonalNews();\r\n this.newsService.reloadAllTopNews();\r\n this.userAppTileService.reload();\r\n this.appTileService.reload();\r\n this.broadcastService.reload();\r\n this.restaurantService.reload();\r\n this.restaurantMenuService.reload();\r\n }\r\n\r\n getUserChannelTerms(): Observable> {\r\n if (this.getUserChannelTerms$) {\r\n return this.getUserChannelTerms$;\r\n } else {\r\n this.getUserChannelTerms$ = this.http.get>(`${Constants.API_ENDPOINT}/me/userchannelterms/`)\r\n .pipe(\r\n map(response => {\r\n return response.map(p => new UserChannelTerm(p));\r\n }),\r\n tap(data => {\r\n this.useCache && this.cache.set(this.cacheKey, data);\r\n }),\r\n catchError(this.httpHelper.handleError({ operation: 'getUserChannelTerms', result: new Array(), rethrow: true })),\r\n takeUntil(this.reload$),\r\n shareReplay({ bufferSize: 1, refCount: true }));\r\n\r\n if (this.useCache) {\r\n const cachedData = this.cache.get>(this.cacheKey);\r\n if (cachedData) {\r\n return concat(of(cachedData), this.getUserChannelTerms$);\r\n }\r\n }\r\n return this.getUserChannelTerms$;\r\n }\r\n }\r\n\r\n add(personalization: UserChannelTerm, doReload = true): Observable {\r\n return this.http.post>(`${Constants.API_ENDPOINT}/me/userchannelterms`, personalization)\r\n .pipe(\r\n tap(() => {\r\n if (doReload) {\r\n this.reload();\r\n }\r\n }),\r\n catchError(this.httpHelper.handleError({ operation: 'add', result: {}, rethrow: true })));\r\n }\r\n\r\n delete(id: string): Observable {\r\n return this.http.delete(`${Constants.API_ENDPOINT}/me/userchannelterms/${id}`, {\r\n\r\n })\r\n .pipe(\r\n tap(() => {\r\n this.reload();\r\n }),\r\n catchError(this.httpHelper.handleError({ operation: 'delete', result: {}, rethrow: true })));\r\n }\r\n\r\n syncUserChannelsWithAD(currentRouteUrl: string): Observable {\r\n const pushedFromAdPersonalization = new Array();\r\n const alreadyPushedCacheKey = `${this.cacheKey}-alreadyPushed`;\r\n const alreadyPushed = this.cache.get(alreadyPushedCacheKey); // use this to make sure we only try to do the push/sync operation once per 24h\r\n const requestedPath = this.cache.getWithCustomKey(Constants.WANTED_ROUTE_PATH);\r\n if (currentRouteUrl.endsWith('settings') || requestedPath?.endsWith('settings')) {\r\n return of(null);\r\n }\r\n\r\n if (!alreadyPushed) {\r\n\r\n const userGroups$ = iif(() => this.featureSettingsStoreService.state.enableAzureADGroupSync,\r\n this.groupsService.getAllMyTransitiveMemeberGroups()\r\n .pipe(\r\n map((groups) => {\r\n if (groups?.length) {\r\n return groups;\r\n } else {\r\n return null;\r\n }\r\n })\r\n ), of(null));\r\n\r\n return forkJoin(\r\n [\r\n this.channelService.getChannels(true),\r\n this.userService.getMyDetailsFromMsGraph(true),\r\n this.getUserChannelTerms(),\r\n userGroups$,\r\n ])\r\n .pipe(\r\n mergeMap(([channels, myDetails, userChannelTerms, userGroups]) => {\r\n\r\n channels.forEach(c => {\r\n const channel = new SimplifiedTerm(c);\r\n let azureADUserProperty: string;\r\n const mappingProperty = channel?.LocalCustomProperties[Constants.SETTINGS_GRAPH_API_PERSONALIZATION_MAPPING_KEY];\r\n\r\n if (mappingProperty && myDetails) {\r\n const mappingPropertyKey = Object.keys(myDetails).find(key => key.toLowerCase() === mappingProperty.toLowerCase());\r\n if (mappingPropertyKey) {\r\n azureADUserProperty = myDetails[mappingPropertyKey];\r\n }\r\n }\r\n\r\n if (channel.Terms) {\r\n channel.Terms.forEach(term => {\r\n this.setSelectedTerms(term, userChannelTerms, azureADUserProperty, userGroups, pushedFromAdPersonalization);\r\n });\r\n }\r\n });\r\n\r\n this.cache.set(alreadyPushedCacheKey, true, addHours(new Date(), 24));\r\n\r\n if (pushedFromAdPersonalization.length > 0 && !alreadyPushed) {\r\n const personalizationsToAdd = pushedFromAdPersonalization.map(p => this.add(p, false));\r\n const concatenatedAdds = concat(...personalizationsToAdd);\r\n return forkJoin([concatenatedAdds]);\r\n } else {\r\n return of(null);\r\n }\r\n }),\r\n tap((result) => {\r\n if (result) {\r\n Utilities.openSnackBar(this.snackBar, AlertTemplatesComponent, AlertTemplatesComponent.interestsselectionsynced);\r\n }\r\n this.reload();\r\n })\r\n );\r\n } else {\r\n return of(null);\r\n }\r\n }\r\n\r\n syncUserChannels(currentRouteUrl: string): Observable {\r\n let termsToDelete = new Array ();\r\n const alreadySyncedCacheKey = `${this.cacheKey}-alreadySyncedChannels`;\r\n const alreadySynced = this.cache.get(alreadySyncedCacheKey); // use this to make sure we only try to do the push/sync operation once per 24h\r\n const requestedPath = this.cache.getWithCustomKey(Constants.WANTED_ROUTE_PATH);\r\n if (currentRouteUrl.endsWith('settings') || requestedPath?.endsWith('settings')) {\r\n return of(null);\r\n }\r\n\r\n if (!alreadySynced) {\r\n return forkJoin(\r\n [\r\n this.channelService.getChannels(true),\r\n this.getUserChannelTerms()\r\n ])\r\n .pipe(\r\n mergeMap(([channels, userChannelTerms]) => {\r\n const flattenChannels = channels.flattenRecursive('Terms');\r\n\r\n // check so that we get channels from SharePoint/Api\r\n if (flattenChannels.length > 0) {\r\n termsToDelete = userChannelTerms.filter(p => !flattenChannels.some(c => c.Guid === p.ChannelTermId));\r\n }\r\n\r\n this.cache.set(alreadySyncedCacheKey, true, addHours(new Date(), 24));\r\n\r\n if (termsToDelete.length > 0 && !alreadySynced) {\r\n const deleteObservables = termsToDelete.map(term =>\r\n this.delete(term.ChannelTermId)\r\n );\r\n return forkJoin(deleteObservables);\r\n } else {\r\n return of(null);\r\n }\r\n\r\n }),\r\n tap((result) => {\r\n if (result) {\r\n Utilities.openSnackBar(this.snackBar, AlertTemplatesComponent, AlertTemplatesComponent.interestsselectionsynced);\r\n }\r\n this.reload();\r\n })\r\n );\r\n } else {\r\n return of(null);\r\n }\r\n }\r\n\r\n private setSelectedTerms(term: SimplifiedTerm, userChannelTerms: UserChannelTerm[], userProfileProperty: string, userGroups: string[], pushedFromAdPersonalization: UserChannelTerm[]) {\r\n // if term has sub terms, recursively run this function on them first\r\n if (term.Terms) {\r\n term.Terms.forEach(t => {\r\n this.setSelectedTerms(t, userChannelTerms, userProfileProperty, userGroups, pushedFromAdPersonalization);\r\n });\r\n }\r\n // check personalizations (settings in database) to see if this should be selected\r\n const personalization = userChannelTerms.find(p => p.ChannelTermId === term.Guid);\r\n if (personalization) {\r\n term.Selected = true;\r\n }\r\n\r\n let azureADGroupMatch: boolean;\r\n let matchingProperty: boolean;\r\n\r\n // check if users groups match with channel\r\n if (userGroups) {\r\n const azureADGroupMappingKeys: string[] = term.LocalCustomProperties[Constants.SETTINGS_AZURE_AD_GROUP_MAPPING_KEYS] ? term.LocalCustomProperties[Constants.SETTINGS_AZURE_AD_GROUP_MAPPING_KEYS].split(',').map(key => key.trim()) : null;\r\n if (azureADGroupMappingKeys) {\r\n azureADGroupMatch = azureADGroupMappingKeys.some(id => userGroups.some(groupId => groupId.toLowerCase() === id.toLowerCase()));\r\n }\r\n }\r\n\r\n // Do not check if azureADGroupMatch is true. The channel will be pushed either way\r\n // check for channels pushed from AD to this user\r\n if (!azureADGroupMatch && userProfileProperty) {\r\n matchingProperty = term.Name.replace(/&/g, '&').toLowerCase() === userProfileProperty.toLowerCase();\r\n if (!matchingProperty) {\r\n if (!term.Labels) {\r\n matchingProperty = false;\r\n } else {\r\n matchingProperty = term.Labels.some(l => l.Name.replace(/&/g, '&').toLowerCase() === userProfileProperty.toLowerCase());\r\n }\r\n }\r\n }\r\n\r\n if (azureADGroupMatch || matchingProperty) {\r\n term.DisableSelection = true;\r\n if (!term.Selected) {\r\n term.Selected = true;\r\n\r\n // channel will be pushed to db if not exists\r\n if (!personalization) {\r\n if (!pushedFromAdPersonalization.find(p => p.ChannelTermId === term.Guid) && !userChannelTerms.find(p => p.ChannelTermId === term.Guid)) {\r\n pushedFromAdPersonalization.push(new UserChannelTerm({ ChannelTermId: term.Guid, ChannelType: ChannelType.FromAd }));\r\n }\r\n }\r\n }\r\n }\r\n\r\n // selected should traverse upwards, to check child terms if any is selected and set this too in that case\r\n if (term.Terms) {\r\n const pushedTerms = term.Terms.filter(t => {\r\n return t.Selected && t.DisableSelection;\r\n });\r\n if (pushedTerms.length > 0) {\r\n term.Selected = true;\r\n term.DisableSelection = true;\r\n if (!pushedFromAdPersonalization.find(p => p.ChannelTermId === term.Guid) && !userChannelTerms.find(p => p.ChannelTermId === term.Guid)) {\r\n pushedFromAdPersonalization.push(new UserChannelTerm({ ChannelTermId: term.Guid, ChannelType: ChannelType.FromAd }));\r\n }\r\n }\r\n }\r\n }\r\n}\r\n","import { CommonModule } from '@angular/common';\r\nimport { ChangeDetectionStrategy, Component, ElementRef, Host, Inject, Input, NgModule, OnDestroy, OnInit, Optional } from '@angular/core';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatDialog } from '@angular/material/dialog';\r\nimport { MatMenuModule } from '@angular/material/menu';\r\nimport { Router, RouterModule } from '@angular/router';\r\nimport { CUSTOMERENVIRONMENT } from '@app/common/app-tokens';\r\nimport { applyLanguageFilteringMulti } from '@app/common/filtering-behavior';\r\nimport { Utilities } from '@app/common/utilities';\r\nimport { AppTileBoxModule } from '@app/components/apps-and-tools/app-tile-box/app-tile-box.component';\r\nimport { WidgetPlaceholderModule } from '@app/components/widget-placeholder/widget-placeholder.component';\r\nimport { FeatureToggleModule } from '@app/directives/feature-toggle.directive';\r\nimport { HideParentIfEmptyDirective } from '@app/directives/hide-parent-if-empty.directive';\r\nimport { AppTile } from '@app/models/app-tile';\r\nimport { SimplifiedTerm } from '@app/models/simplified-term';\r\nimport { LinkModule } from '@app/directives/link.directive';\r\nimport { AppTileService } from '@app/services/app-tile.service';\r\nimport { ComponentStatesOnRoutesService } from '@app/services/component-states-on-routes.service';\r\nimport { FeatureSettingsStoreService } from '@app/services/feature-settings-store.service';\r\nimport { LanguageTermService } from '@app/services/language-term.service';\r\nimport { SmartLinksService } from '@app/services/smart-links.service';\r\nimport { UserLanguageTermService } from '@app/services/user-language-term.service';\r\nimport { Environment } from '@environments/interface.environment';\r\nimport { isAfter, isBefore, isSameDay } from 'date-fns';\r\nimport { iif, Observable, of, Subject, Subscription } from 'rxjs';\r\nimport { catchError, concatMap, filter, first, map, mergeMap, switchMap, tap } from 'rxjs/operators';\r\nimport { ConfirmDialogComponent, ConfirmDialogModule } from '../confirm-dialog/confirm-dialog.component';\r\n\r\n@Component({\r\n selector: 'app-smart-links',\r\n templateUrl: './smart-links.component.html',\r\n styleUrls: ['./smart-links.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush\r\n})\r\nexport class SmartLinksComponent implements OnInit, OnDestroy {\r\n\r\n /** All tiles */\r\n appTiles$: Observable;\r\n\r\n /** Parent component can send edit mode flag, such as when in app center edit mode. */\r\n @Input() editMode: boolean;\r\n @Input() maxDescriptionLength = 100;\r\n private errorSubject$ = new Subject();\r\n\r\n subscriptions = new Subscription();\r\n languages: Array;\r\n\r\n constructor(@Inject(CUSTOMERENVIRONMENT) private environment: Environment,\r\n private smartLinksService: SmartLinksService,\r\n private appTileService: AppTileService,\r\n private userLanguageTermService: UserLanguageTermService,\r\n private featureSettingsStoreService: FeatureSettingsStoreService,\r\n private componentStatesOnRoutesService: ComponentStatesOnRoutesService,\r\n private router: Router,\r\n private elementRef: ElementRef,\r\n private dialog: MatDialog,\r\n @Host() @Optional() private hideParentIfEmptyDirective: HideParentIfEmptyDirective,\r\n private languageTermService: LanguageTermService) { }\r\n\r\n ngOnInit(): void {\r\n const appTiles$ = this.smartLinksService\r\n .refresh$\r\n .pipe(\r\n mergeMap(() => {\r\n return iif(\r\n () => this.editMode,\r\n this.smartLinksService.getAdminSmartLinks(),\r\n this.smartLinksService.getUserSmartLinks()\r\n .pipe(\r\n map(items => {\r\n return items.filter(appTile => {\r\n if ((!appTile.End || isAfter(appTile.End, new Date())) && (!appTile.Start || isBefore(appTile.Start, new Date()))) {\r\n if (appTile.IsRecurring) {\r\n if (appTile.IsWithinTimeSpan) {\r\n return appTile;\r\n }\r\n } else {\r\n return appTile;\r\n }\r\n }\r\n });\r\n })\r\n )\r\n );\r\n }\r\n ));\r\n\r\n this.appTiles$ = appTiles$\r\n .pipe(\r\n switchMap((appTiles) => {\r\n // Language filter toggle\r\n return iif(\r\n () => this.featureSettingsStoreService.state.enableLanguageFilteringForWorkplace && !this.editMode,\r\n this.userLanguageTermService.getUserLanguageTerms()\r\n .pipe(\r\n map((userLanguageTerms) => {\r\n return applyLanguageFilteringMulti(appTiles, 'LanguageTermAppTiles', userLanguageTerms, this.featureSettingsStoreService.state.enableShowNonLanguageContentForAllUsers, this.featureSettingsStoreService.state.defaultLanguageTermId);\r\n })\r\n ),\r\n of(appTiles)\r\n );\r\n }),\r\n tap(items => {\r\n if (items && items.length === 0) {\r\n this.hideParentIfEmptyDirective && this.hideParentIfEmptyDirective.hideElement();\r\n } else {\r\n this.hideParentIfEmptyDirective && this.hideParentIfEmptyDirective.showElement();\r\n }\r\n }),\r\n catchError(err => {\r\n this.errorSubject$.next(err);\r\n return of(null);\r\n })\r\n );\r\n\r\n if (!this.editMode) {\r\n this.subscriptions.add(this.componentStatesOnRoutesService\r\n .state$\r\n .pipe(\r\n filter(componentsOnRouteState => {\r\n return componentsOnRouteState.RouteMap.has(this.router.url) && componentsOnRouteState.RouteMap.get(this.router.url).some(x => x.ComponentId === this.elementRef.nativeElement.localName && x.Refresh);\r\n }))\r\n .subscribe(componentsOnRouteState => {\r\n if (componentsOnRouteState) {\r\n this.smartLinksService.reload();\r\n const componentState = componentsOnRouteState.RouteMap.get(this.router.url).find(x => x.ComponentId === this.elementRef.nativeElement.localName && x.Refresh);\r\n componentState.Refresh = false;\r\n if (componentState.Routes.some(r => this.router.url === r)) {\r\n // If we're on the same route theres no need to show the badge\r\n componentState.ShowBadge = false;\r\n }\r\n this.componentStatesOnRoutesService.updateStates(componentState);\r\n }\r\n }));\r\n }\r\n\r\n if (this.featureSettingsStoreService.state.enableLanguageFilteringForWorkplace && this.editMode) {\r\n this.subscriptions.add(\r\n this.languageTermService\r\n .getLanguages()\r\n .pipe(\r\n first()\r\n )\r\n .subscribe(l => {\r\n this.languages = l;\r\n })\r\n );\r\n }\r\n }\r\n\r\n truncate(text: string) {\r\n return Utilities.truncate(text, this.maxDescriptionLength);\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.subscriptions.unsubscribe();\r\n }\r\n\r\n remove(appTile: AppTile) {\r\n const dialogRef = this.dialog.open(ConfirmDialogComponent);\r\n this.subscriptions.add(dialogRef.afterClosed()\r\n .pipe(concatMap(result => {\r\n if (result) {\r\n return this.appTileService.deleteAppTile(appTile.Id);\r\n } else {\r\n return of(null);\r\n }\r\n }))\r\n .subscribe(result => {\r\n if (result) {\r\n this.smartLinksService.reload();\r\n }\r\n }));\r\n }\r\n\r\n /** New app info popup */\r\n showNewAppInfo(event, appTile: AppTile) {\r\n event.preventDefault();\r\n this.router.navigate(['', { outlets: { modal: ['app-tile-intro', appTile.Id] } }]);\r\n }\r\n\r\n /** Util for parsing app url */\r\n getUrl = (url: string) => Utilities.getRealUrlFromTokenBasedUrl(this.environment, url);\r\n\r\n /** Get text color for tile */\r\n getColor = (colorHexCode: string) => Utilities.hexToRGBA(colorHexCode, '1');\r\n\r\n /** If \"new\"-label should show for tile */\r\n shouldDisplayNew = (appTile: AppTile) => appTile.ShowAsNewUntilThisDate && isAfter(appTile.ShowAsNewUntilThisDate, new Date()) || isSameDay(appTile.ShowAsNewUntilThisDate, new Date());\r\n\r\n /** Resolve app language term id to string */\r\n getAppLanguages(appLanguages): string {\r\n if (!this.languages || this.languages.length === 0 || !appLanguages || appLanguages.length === 0) { return ''; }\r\n const result = new Array();\r\n appLanguages.forEach(term => {\r\n const matchingLanguage = this.languages.find(l => l.Guid.toLowerCase() === term.LanguageTermId.toLowerCase());\r\n if (matchingLanguage && matchingLanguage.Name) {\r\n result.push(matchingLanguage.Name);\r\n }\r\n });\r\n return ' [' + result.join(', ') + ']';\r\n }\r\n}\r\n@NgModule({\r\n declarations: [SmartLinksComponent],\r\n exports: [SmartLinksComponent],\r\n imports: [\r\n CommonModule,\r\n LinkModule,\r\n AppTileBoxModule,\r\n MatMenuModule,\r\n MatButtonModule,\r\n WidgetPlaceholderModule,\r\n FeatureToggleModule,\r\n ConfirmDialogModule,\r\n RouterModule\r\n ]\r\n})\r\nexport class SmartLinksModule { }\r\n","\r\n\r\n\r\n\r\n\r\n\r\n \r\n Edit\r\n \r\n \r\n\r\n\r\n\r\n\r\n
    \r\n \r\n
    \r\n
    \r\n","export class CachableData {\r\n public Data: T;\r\n public AddedToCache: Date;\r\n public AbsoluteExpirationDate?: Date;\r\n\r\n constructor(opt?: Partial>) {\r\n Object.assign(this, opt);\r\n }\r\n}\r\n","import { Inject, Injectable } from '@angular/core';\r\nimport { WINDOW } from '@app/common/app-tokens';\r\nimport { CachableData } from '@app/models/cacheable-data';\r\nimport { AuthService } from '@app/services/auth.service';\r\nimport { addMonths, isAfter, isBefore } from 'date-fns';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class CacheService {\r\n\r\n // The cache is created to work with the approach of fetching any local data first and showing that to the\r\n // User while fetching the real data in background and updating the cache and data when the network request is complete.\r\n\r\n private persistentCache;\r\n private sessionCache;\r\n private readonly cachePrefix = 'core-wp';\r\n\r\n constructor(private authService: AuthService, @Inject(WINDOW) private window: Window) {\r\n this.persistentCache = this.window.localStorage;\r\n this.sessionCache = this.window.sessionStorage;\r\n }\r\n\r\n private generateCacheKey(cacheKey: string) {\r\n if (this.authService.accountInfo) {\r\n if (this.authService.accountInfo.username) {\r\n return `${this.cachePrefix}-${this.authService.accountInfo.username}-${cacheKey}`;\r\n }\r\n }\r\n return null;\r\n }\r\n\r\n public get(cacheKey: string): T {\r\n try {\r\n const generatedKey = this.generateCacheKey(cacheKey);\r\n if (generatedKey) {\r\n const cachedItem = this.persistentCache.getItem(generatedKey);\r\n if (cachedItem) {\r\n const cachableData = JSON.parse(cachedItem) as CachableData;\r\n if (cachableData.AbsoluteExpirationDate) {\r\n const expirationDate = new Date(cachableData.AbsoluteExpirationDate);\r\n if (isAfter(expirationDate, new Date())) {\r\n return cachableData.Data;\r\n } else {\r\n this.removeFromPersistentCache(cacheKey);\r\n return null;\r\n }\r\n }\r\n return cachableData.Data;\r\n }\r\n }\r\n return null;\r\n } catch {\r\n return null;\r\n }\r\n }\r\n\r\n public getCachableInfo(cacheKey: string): CachableData {\r\n try {\r\n const generatedKey = this.generateCacheKey(cacheKey);\r\n if (generatedKey) {\r\n const cachedItem = this.persistentCache.getItem(generatedKey);\r\n if (cachedItem) {\r\n const cachableData = JSON.parse(cachedItem) as CachableData;\r\n if (cachableData.AbsoluteExpirationDate) {\r\n const expirationDate = new Date(cachableData.AbsoluteExpirationDate);\r\n if (isAfter(expirationDate, new Date())) {\r\n return cachableData;\r\n } else {\r\n this.removeFromPersistentCache(cacheKey);\r\n return null;\r\n }\r\n }\r\n return cachableData;\r\n }\r\n }\r\n return null;\r\n } catch {\r\n return null;\r\n }\r\n }\r\n\r\n public getItemAsStringFromSessionCache(key: string): string {\r\n return this.sessionCache.getItem(key);\r\n }\r\n\r\n public set(cacheKey: string, value: T, absoluteExpirationDate?: Date) {\r\n const generatedKey = this.generateCacheKey(cacheKey);\r\n\r\n if (!absoluteExpirationDate) {\r\n absoluteExpirationDate = addMonths(new Date(), 3);\r\n }\r\n\r\n if (generatedKey) {\r\n this.persistentCache.setItem(generatedKey, JSON.stringify(\r\n new CachableData({\r\n Data: value,\r\n AddedToCache: new Date(),\r\n AbsoluteExpirationDate: absoluteExpirationDate ? absoluteExpirationDate : null\r\n })));\r\n }\r\n }\r\n\r\n public setWithCustomKey(cacheKey: string, value: T) {\r\n const generatedKey = `${this.cachePrefix}-${cacheKey}`;\r\n this.sessionCache.setItem(generatedKey, JSON.stringify(\r\n new CachableData({\r\n Data: value,\r\n AddedToCache: new Date(),\r\n })));\r\n }\r\n\r\n public getWithCustomKey(cacheKey: string, defaultValue?: T) {\r\n const generatedKey = `${this.cachePrefix}-${cacheKey}`;\r\n const cachedItem = this.sessionCache.getItem(generatedKey);\r\n if (cachedItem) {\r\n return (JSON.parse(cachedItem) as CachableData).Data;\r\n }\r\n if (typeof (defaultValue) !== 'undefined') {\r\n return defaultValue;\r\n } else {\r\n return null;\r\n }\r\n }\r\n\r\n public removeFromSessionCache(cacheKey: string) {\r\n const generatedKey = `${this.cachePrefix}-${cacheKey}`;\r\n if (generatedKey) {\r\n this.sessionCache.removeItem(generatedKey);\r\n }\r\n }\r\n\r\n public removeFromPersistentCache(cacheKey: string) {\r\n const generatedKey = this.generateCacheKey(cacheKey);\r\n if (generatedKey) {\r\n this.persistentCache.removeItem(generatedKey);\r\n }\r\n }\r\n\r\n public removeAllExpiredItemsInPersistentCache() {\r\n for (let i = 0; i < this.persistentCache.length; i++) {\r\n const key = this.persistentCache.key(i);\r\n if (key.startsWith(this.cachePrefix)) {\r\n const cachedItem = JSON.parse(this.persistentCache.getItem(key)) as CachableData;\r\n if (cachedItem) {\r\n if (cachedItem.AbsoluteExpirationDate) {\r\n const expirationDate = new Date(cachedItem.AbsoluteExpirationDate);\r\n if (isBefore(expirationDate, new Date())) {\r\n this.removeFromPersistentCache(key);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n public removeAllItemsInPersistentCacheWithGeneratedKeyPrefix(cacheKey: string) {\r\n const generatedKey = this.generateCacheKey(cacheKey);\r\n if (generatedKey) {\r\n this.removeAllItemsInPersistentCacheWithPrefix(generatedKey);\r\n }\r\n }\r\n\r\n public removeAllItemsInPersistentCacheWithPrefix(cacheKeyPrefix: string) {\r\n const tmpArr = []; // Array to hold the keys\r\n\r\n // Iterate over localStorage and insert the keys that meet the condition into arr\r\n for (let i = 0; i < this.persistentCache.length; i++) {\r\n if (this.persistentCache.key(i).indexOf(cacheKeyPrefix) !== -1) {\r\n tmpArr.push(this.persistentCache.key(i));\r\n }\r\n }\r\n // Iterate over arr and remove the items by key\r\n for (let i = 0; i < tmpArr.length; i++) {\r\n this.persistentCache.removeItem(tmpArr[i]);\r\n }\r\n }\r\n\r\n public clearPersistentCacheFromCoreWP() {\r\n this.removeAllItemsInPersistentCacheWithPrefix(this.cachePrefix);\r\n }\r\n\r\n public clearAllPersistentCache() {\r\n this.persistentCache.clear();\r\n }\r\n\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { ActivatedRouteSnapshot, CanActivate, RouterStateSnapshot } from '@angular/router';\r\nimport { navigationCancelingError } from '@app/guards/navigation-canceling-error';\r\nimport { Observable } from 'rxjs';\r\nimport { SecurityService } from '@app/services/security.service';\r\nimport { tap } from 'rxjs/operators';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class AuthorizeAccessGuard implements CanActivate {\r\n\r\n constructor(private securityService: SecurityService) { }\r\n\r\n canActivate(\r\n next: ActivatedRouteSnapshot,\r\n state: RouterStateSnapshot): Observable | Promise | boolean {\r\n if (next?.data?.roles) {\r\n return this.securityService.hasUserAnyAppRole(next.data.roles)\r\n .pipe(\r\n tap(hasUserAppRole => {\r\n if (!hasUserAppRole) {\r\n throw navigationCancelingError('unauthenticated');\r\n }\r\n }));\r\n } else {\r\n return true;\r\n }\r\n }\r\n}\r\n","interface Array {\r\n findRecursive(predicate: (value: T, index: number, obj: T[]) => boolean, childrenPropertyName: string): T | undefined;\r\n filterRecursive(predicate: (value: T, index: number, array: T[]) => any, childrenPropertyName: string): T[];\r\n flattenRecursive(propertyName: string): T[];\r\n}\r\n\r\nArray.prototype.findRecursive = function (predicate, childrenPropertyName) {\r\n if (!childrenPropertyName) {\r\n throw new Error('findRecursive requires parameter `childrenPropertyName`');\r\n }\r\n let array = [];\r\n array = this;\r\n const initialFind = array.find(predicate);\r\n const elementsWithChildren = array.filter(x => x[childrenPropertyName]);\r\n if (initialFind) {\r\n return initialFind;\r\n } else if (elementsWithChildren.length) {\r\n const childElements = [];\r\n elementsWithChildren.forEach(x => {\r\n childElements.push(...x[childrenPropertyName]);\r\n });\r\n return childElements.findRecursive(predicate, childrenPropertyName);\r\n } else {\r\n return undefined;\r\n }\r\n};\r\n\r\nArray.prototype.filterRecursive = function (predicate, childProperty) {\r\n const filterResults = [];\r\n const filterAndPushResults = (arrayToFilter) => {\r\n const elementsWithChildren = arrayToFilter.filter(x => x[childProperty]);\r\n const filtered = arrayToFilter.filter(predicate);\r\n filterResults.push(...filtered);\r\n if (elementsWithChildren.length) {\r\n const childElements = [];\r\n elementsWithChildren.forEach(x => {\r\n childElements.push(...x[childProperty]);\r\n });\r\n filterAndPushResults(childElements);\r\n }\r\n };\r\n filterAndPushResults(this);\r\n return filterResults;\r\n};\r\n\r\nArray.prototype.flattenRecursive = function (propertyName) {\r\n const results = [];\r\n const flattenAndPushResults = (arrayToFilter) => {\r\n const elementsWithChildren = arrayToFilter.filter(x => x[propertyName]);\r\n results.push(...elementsWithChildren);\r\n if (elementsWithChildren.length) {\r\n const childElements = [];\r\n elementsWithChildren.forEach(x => {\r\n childElements.push(...x[propertyName]);\r\n });\r\n flattenAndPushResults(childElements);\r\n }\r\n };\r\n flattenAndPushResults(this);\r\n return results;\r\n};\r\n","import { InjectionToken } from '@angular/core';\r\nimport { Environment } from '@environments/interface.environment';\r\n\r\nexport const CUSTOMERENVIRONMENT = new InjectionToken('core-wp-customer-environment');\r\nexport const WINDOW = new InjectionToken('core-wp-window');\r\nexport const PORTAL_DATA = new InjectionToken('PORTAL_DATA');\r\n","import { HttpClient, HttpParams } from '@angular/common/http';\r\nimport { Inject, Injectable } from '@angular/core';\r\nimport { CUSTOMERENVIRONMENT } from '@app/common/app-tokens';\r\nimport { Constants } from '@app/common/constants';\r\nimport { HttpHelper } from '@app/common/http-helper';\r\nimport { Restaurant } from '@app/models/restaurant-menu';\r\nimport { CacheService } from '@app/services/cache.service';\r\nimport { RestaurantMenuService } from '@app/services/restaurant-menu.service';\r\nimport { Environment } from '@environments/interface.environment';\r\nimport { BehaviorSubject, concat, Observable, of, Subject } from 'rxjs';\r\nimport { catchError, map, shareReplay, takeUntil, tap } from 'rxjs/operators';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class RestaurantService {\r\n\r\n constructor(@Inject(CUSTOMERENVIRONMENT) private environment: Environment,\r\n private http: HttpClient,\r\n private cache: CacheService,\r\n private restaurantMenuService: RestaurantMenuService,\r\n private httpHelper: HttpHelper) { }\r\n\r\n private readonly cacheKey = 'RestaurantService-getAllRestaurants';\r\n public useCache = true;\r\n private internalReload$ = new Subject();\r\n public reload$ = new BehaviorSubject(null);\r\n private getAllRestaurants$: Observable;\r\n\r\n public reload() {\r\n this.getAllRestaurants$ = null;\r\n\r\n if (this.useCache) {\r\n this.cache.removeAllItemsInPersistentCacheWithGeneratedKeyPrefix(this.cacheKey);\r\n }\r\n\r\n this.restaurantMenuService.reload();\r\n this.internalReload$.next();\r\n this.reload$.next(null);\r\n }\r\n\r\n addRestaurant(restaurantMenu: Restaurant): Observable {\r\n // We need to append the siteUrl because there will be an authorization check in the backend against the workplace admin group on this site\r\n const httpParams = new HttpParams().append('siteUrl', encodeURI(this.environment.coreWorkplaceSiteUrl));\r\n return this.http\r\n .post(`${Constants.API_ENDPOINT}/restaurants`, restaurantMenu, { params: httpParams })\r\n .pipe(\r\n tap(() => {\r\n this.reload();\r\n }),\r\n catchError(this.httpHelper.handleError({ operation: 'addRestaurant', result: null, rethrow: true })));\r\n }\r\n\r\n updateRestaurant(id: number, restaurantMenu: Restaurant): Observable {\r\n // We need to append the siteUrl because there will be an authorization check in the backend against the workplace admin group on this site\r\n const httpParams = new HttpParams().append('siteUrl', encodeURI(this.environment.coreWorkplaceSiteUrl));\r\n return this.http\r\n .put(`${Constants.API_ENDPOINT}/restaurants/${id}`, restaurantMenu, { params: httpParams })\r\n .pipe(\r\n tap(() => {\r\n this.reload();\r\n }),\r\n catchError(this.httpHelper.handleError({ operation: 'updateRestaurant', result: null, rethrow: true })));\r\n }\r\n\r\n deleteRestaurant(id: number): Observable {\r\n // We need to append the siteUrl because there will be an authorization check in the backend against the workplace admin group on this site\r\n const httpParams = new HttpParams().append('siteUrl', encodeURI(this.environment.coreWorkplaceSiteUrl));\r\n const fetchOperation = this.http.delete(`${Constants.API_ENDPOINT}/restaurants/${id}`, {\r\n params: httpParams\r\n })\r\n .pipe(\r\n map(response => {\r\n console.log(`deleted result: `);\r\n console.log(response);\r\n this.reload();\r\n return response;\r\n }),\r\n catchError(this.httpHelper.handleError({ operation: 'deleteRestaurant', result: ({} as Restaurant) })));\r\n\r\n return fetchOperation;\r\n }\r\n\r\n getRestaurant(id: number): Observable {\r\n return this.http\r\n .get(`${Constants.API_ENDPOINT}/restaurants/${id}`)\r\n .pipe(\r\n catchError(this.httpHelper.handleError({ operation: 'getRestaurant', result: null, rethrow: true })));\r\n }\r\n\r\n getAllRestaurants(): Observable> {\r\n if (this.getAllRestaurants$) {\r\n return this.getAllRestaurants$;\r\n } else {\r\n this.getAllRestaurants$ = this.http\r\n .get>(`${Constants.API_ENDPOINT}/restaurants`)\r\n .pipe(\r\n tap(data => {\r\n this.useCache && this.cache.set(this.cacheKey, data);\r\n }),\r\n catchError(this.httpHelper.handleError({ operation: 'getAllRestaurants', result: new Array(), rethrow: true, cacheKey: this.cacheKey })),\r\n takeUntil(this.internalReload$),\r\n shareReplay({ bufferSize: 1, refCount: true }));\r\n\r\n if (this.useCache) {\r\n const cachedData = this.cache.get>(this.cacheKey);\r\n if (cachedData) {\r\n return concat(of(cachedData), this.getAllRestaurants$);\r\n }\r\n }\r\n return this.getAllRestaurants$;\r\n }\r\n }\r\n}\r\n","import { RouteData } from '@app/common/route-data';\r\nimport { Roles } from '@app/common/roles';\r\n\r\nexport namespace Constants {\r\n export const API_ENDPOINT = '/api';\r\n export const GRAPH_API_ENDPOINT = 'https://graph.microsoft.com/';\r\n export const GRAPH_API_VERSION_ONE = 'v1.0';\r\n export const GRAPH_API_BETA_VERSION = 'beta';\r\n export const POWERBI_API_ENDPOINT = 'https://api.powerbi.com/';\r\n export const POWERBI_APP_ENDPOINT = 'https://app.powerbi.com/';\r\n export const POWERBI_API_VERSION_ONE = 'v1.0';\r\n export const SYSTEM_USER_NAME = 'system';\r\n export const COLLAB_SITE_CREATION_GROUP_TITLE = 'Workplace Collab Creators';\r\n export const WORKPLACE_EDITORS_GROUP_TITLE = 'Workplace Editors';\r\n export const WORKPLACE_ADMINISTRATORS_GROUP_TITLE = 'Workplace Administrators';\r\n export const WORKPLACE_ADMINISTRATORS_ROLE_NAME = 'Admin';\r\n export const WORKPLACE_EDITORS_ROLE_NAME = 'Editor';\r\n export const WORKPLACE_COLLABSITECREATOR_ROLE_NAME = 'CollabSiteCreator';\r\n\r\n export const WORKPLACE_APP_EDITOR_ROLE_NAME = 'AppEditor';\r\n export const WORKPLACE_MESSAGEBROADCAST_EDITOR_ROLE_NAME = 'MessageBroadcastEditor';\r\n export const WORKPLACE_FOOTER_EDITOR_ROLE_NAME = 'FooterEditor';\r\n export const WORKPLACE_EDITORDASHBOARD_EDITOR_ROLE_NAME = 'EditorDashboardEditor';\r\n export const WORKPLACE_POWER_BI_EDITOR_ROLE_NAME = 'PowerBIEditor';\r\n\r\n export const COLLAB_UNIFIED_GROUPS_LINK_TARGET = 'site';\r\n export const COLLAB_UNIFIED_GROUPS_CONVERSATION_LINK_TARGET = 'conversations';\r\n export const COLLAB_UNIFIED_GROUPS_FILES_LINK_TARGET = 'documents';\r\n export const COLLAB_UNIFIED_GROUPS_CALENDER_LINK_TARGET = 'calendar';\r\n export const COLLAB_UNIFIED_GROUPS_PLANNER_LINK_TARGET = 'planner';\r\n export const COLLAB_UNIFIED_GROUPS_TEAMS_LINK_TARGET = 'TEAM';\r\n export const SETTINGS_GRAPH_API_PERSONALIZATION_MAPPING_KEY = 'graph api personalization mapping';\r\n export const SETTINGS_GRAPH_API_PERSONALIZATION_HIDE_NON_MAPPED_KEY = 'hide non-mapped channels';\r\n export const SETTINGS_GRAPH_API_PERSONALIZATION_DESELECT_NON_MAPPED_KEY = 'deselect non-pushed channel';\r\n export const SETTINGS_AZURE_AD_GROUP_MAPPING_KEYS = 'azure ad group mapping';\r\n export const SETTINGS_CHANNEL_TERM_USE_RADIO_BUTTONS = 'use radio buttons';\r\n export const SETTINGS_CHANNEL_TERM_HUB_SITE_HOME_LIST = 'hub site home list';\r\n export const SETTINGS_CHANNEL_TERM_HUB_SITE_URL = 'site url';\r\n export const BOOTSTRAP_MEDIUM_DEVICE_BREAKPOINT = '(max-width: 991.98px)'; // media-breakpoint-down(md)\r\n export const ADAL_EXPIRATION_KEY = 'adal.expiration.key';\r\n export const DEFAULT_TITLE = 'Workplace';\r\n export const TRACKING_EVENT_TYPE_APP_CLICK = 'AppClick';\r\n export const TRACKING_EVENT_TYPE_LINK_CLICK = 'LinkClick';\r\n export const TRACKING_EVENT_TYPE_NEWS_DESCR_CLICK = 'NewsDescrClick';\r\n export const TRACKING_EVENT_TYPE_WORKPLACE_SEARCH = 'WPSearch';\r\n export const TRACKING_EVENT_TYPE_WORKPLACE_SEARCH_CLOSE = 'WPSearchClose';\r\n export const TRACKING_EVENT_TYPE_WORKPLACE_SEARCH_NO_RESULT = 'WPSearchNoResult';\r\n export const TRACKING_EVENT_TYPE_WORKPLACE_USER_CHANNELS = 'WPUserChannels';\r\n export const WANTED_ROUTE_PATH = 'AppComponent-Current-Path';\r\n export const INSIGHT_API_ENDPOINT = 'https://api.applicationinsights.io';\r\n export const INSIGHT_API_VERSION_ONE = 'v1';\r\n export const INSIGHT_API_APPS = 'apps';\r\n export const CHANNEL_TERMSET_GUID = 'd1a62611-0513-4d6a-92e2-9b250a08c5c3';\r\n export const LANGUAGE_TERMSET_GUID = 'bbd0c1a9-2244-46e8-8b54-e864edeb4f17';\r\n export const NAVIGATION_TERMSET_GUID = '2ec99bee-07f3-47a7-b359-a8b3bedfe517';\r\n export const LAST_7_Days = '7d';\r\n export const LAST_30_Days = '30d';\r\n export const LAST_90_Days = '90d';\r\n export const COMPONENT_VISITED_CACHEKEY_SUFFIX = 'Visited';\r\n export const ROUTE_DATA_CONFIGURABLE_KEY = 'configurableByUser';\r\n export const TODAY_DEFAULT_DATA: RouteData = { title: $localize`:@@topnav-topnav:Today`, exact: true, prefix: true, onlyShowForLicensedUsers: true, showInTopNav: true };\r\n export const TODAY_LIGHT_DEFAULT_DATA: RouteData = { title: $localize`:@@topnav-topnav:Today`, exact: true, prefix: true, onlyShowForLicensedUsers: false, showInTopNav: true };\r\n export const YOUR_BOARD_DEFAULT_DATA: RouteData = { title: $localize`:@@topnav-your-board:Your board`, configurableByUser: true, onlyShowForLicensedUsers: true, showInTopNav: true };\r\n export const COLLABORATION_DEFAULT_DATA: RouteData = { title: $localize`:@@topnav-collaboration:Collaboration`, onlyShowForLicensedUsers: true, showInTopNav: true };\r\n export const FIND_INFO_DEFAULT_DATA: RouteData = { title: $localize`:@@topnav-menu:Find information`, onlyShowForLicensedUsers: true, showInTopNav: true };\r\n export const FIND_LIGHT_INFO_DEFAULT_DATA: RouteData = { title: $localize`:@@topnav-menu:Find information`, onlyShowForLicensedUsers: false, showInTopNav: true };\r\n export const FIND_COLLEAGUE_DEFAULT_DATA: RouteData = { title: $localize`:@@topnav-find-colleague:Find colleague` };\r\n export const SETTINGS_DEFAULT_DATA: RouteData = { title: $localize`:@@settings-link-help-and-settings:Settings` };\r\n export const ADMIN_DASHBOARD_DEFAULT_DATA: RouteData = { title: $localize`:@@admin-dashboard:Admin dashboard`, roles: [Roles.Admin] };\r\n export const EDITOR_DASHBOARD_DEFAULT_DATA: RouteData = { title: $localize`:@@editor-dashboard:Editor dashboard`, roles: [Roles.Admin, Roles.EditorDashboardEditor, Roles.Editor, Roles.PowerBIEditor] };\r\n export const MY_PROFILE_DEFAULT_DATA: RouteData = { title: $localize`:@@my-profile:My profile` };\r\n export const FIND_YOUR_COLLEAGUES_DEFAULT_DATA: RouteData = { title: $localize`:@@my-colleagues-header:Find your colleagues` };\r\n export const APP_CENTER_DEFAULT_DATA: RouteData = { title: $localize`:@@app-center-title:App center` };\r\n export const CREATE_SITE_DEFAULT_DATA: RouteData = { title: $localize`:@@create-group:Create collaboration site`, roles: [Roles.Admin, Roles.CollabSiteCreator, Roles.Editor] };\r\n export const BROADCAST_MESSAGES_DEFAULT_DATA: RouteData = { title: $localize`:@@information-alerts-header-title:Information alerts`, roles: [Roles.Admin, Roles.MessageBroadcastEditor, Roles.Editor] };\r\n export const RESTAURANT_DEFAULT_DATA: RouteData = { title: $localize`:@@restaurant-menu-header-title:Restaurant menus`, roles: [Roles.Admin, Roles.Editor] };\r\n export const KPI_CHARTS_DEFAULT_DATA: RouteData = { title: $localize`:@@kpi-chart-header-title:KPI Charts`, roles: [Roles.Admin, Roles.Editor] };\r\n export const APP_TILE_ADD_DEFAULT_DATA: RouteData = { title: $localize`:@@add-app-tile:Add app` };\r\n export const APP_TILE_EDIT_DEFAULT_DATA: RouteData = { title: $localize`:@@edit-app-tile:Edit app` };\r\n export const BROADCASTFORM_EDIT_DEFAULT_DATA: RouteData = { title: $localize`:@@edit-information-alert:Edit alert` };\r\n export const BROADCASTFORM_ADD_DEFAULT_DATA: RouteData = { title: $localize`:@@add-information-alert:Add alert` };\r\n export const SEARCH_DEFAULT_DATA: RouteData = { title: $localize`:@@search-form-placeholder:Search` };\r\n export const INFOBOX_EDIT_DEFAULT_DATA: RouteData = { title: $localize`:@@edit-infobox-form:Edit infobox` };\r\n export const INFOBOX_ADD_DEFAULT_DATA: RouteData = { title: $localize`:@@add-infobox-form:Add infobox` };\r\n export const INFOBOXES_DEFAULT_DATA: RouteData = { title: $localize`:@@infoboxes-title:Infoboxes`, roles: [Roles.Admin, Roles.Editor] };\r\n export const FIRST_DAY_DEFAULT_DATA: RouteData = { title: $localize`:@@first-day:First day` };\r\n export const PAGES_DEFAULT_DATA: RouteData = { title: $localize`:@@pages-route-title:Pages` };\r\n export const POWERBIFORM_EDIT_DEFAULT_DATA: RouteData = { title: $localize`:@@edit-power-bi:Edit visual` };\r\n export const POWERBIFORM_ADD_DEFAULT_DATA: RouteData = { title: $localize`:@@add-power-bi:Add visual` };\r\n export const POWER_BI_DEFAULT_DATA: RouteData = { title: $localize`:@@power-bi-header-title:Power BI Visuals`, roles: [Roles.Admin, Roles.PowerBIEditor] };\r\n\r\n export const IOS_BANNER_CLOSED_COOKIE = 'ios_banner_closed=1';\r\n export const SEARCH_DIALOG_ID = 'search-view-component-dialog';\r\n export const IN_TEAMS_KEY = 'inTeams';\r\n export const IN_TEAMS_AUTH_POPUP_REDIRECT_KEY = 'inTeamsAuthPopupRedirect';\r\n export const SHOULD_NOT_LOAD_MAIN_KEY = 'shouldNotLoadMain';\r\n\r\n // CONTENT TYPES\r\n export const CT_WORKPLACE_INFOBOX_BASE_GUID = '0x010061D2B0AC2DCF604AADA25DBD56C94DC8';\r\n export const CT_WORKPLACE_INFOBOX_TEXT_GUID = '0x010061D2B0AC2DCF604AADA25DBD56C94DC801';\r\n export const CT_WORKPLACE_INFOBOX_PICTURE_GUID = '0x010061D2B0AC2DCF604AADA25DBD56C94DC802';\r\n export const CT_WORKPLACE_INFOBOX_VIDEO_GUID = '0x010061D2B0AC2DCF604AADA25DBD56C94DC803';\r\n export const TRANSPARENT_IMAGE = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAHUlEQVR4nGNkYGCQZKAAMFGiedSAUQNGDRhMBgAAqjwAOXZaz4wAAAAASUVORK5CYII=';\r\n}\r\n","import { ChangeDetectorRef, Directive, ElementRef, Inject, Input, NgModule, OnDestroy, OnInit, Renderer2, OnChanges, SimpleChanges } from '@angular/core';\r\nimport { WINDOW } from '@app/common/app-tokens';\r\nimport { ImageService } from '@app/services/image.service';\r\nimport { of, Subscription } from 'rxjs';\r\nimport { mergeMap } from 'rxjs/operators';\r\n\r\n@Directive({\r\n selector: '[appCssBackgroundImageProxy]'\r\n})\r\nexport class CssBackgroundImageProxyDirective implements OnInit, OnDestroy, OnChanges {\r\n subscriptions = new Subscription();\r\n @Input('appCssBackgroundImageProxy') originalUrl: string;\r\n\r\n constructor(private el: ElementRef,\r\n private imageService: ImageService,\r\n @Inject(WINDOW) private window: Window,\r\n private cdRef: ChangeDetectorRef,\r\n private renderer2: Renderer2) { }\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (changes.originalUrl.currentValue !== changes.originalUrl.previousValue && !changes.originalUrl.isFirstChange()) {\r\n this.setBackgroundImageOfCurrentElement(changes.originalUrl.currentValue);\r\n }\r\n }\r\n\r\n ngOnInit(): void {\r\n this.setBackgroundImageOfCurrentElement(this.originalUrl);\r\n }\r\n\r\n private setBackgroundImageOfCurrentElement(url: string) {\r\n if (url) {\r\n\r\n if (url.startsWith('data:') || url.indexOf('sharepoint.com') === -1) {\r\n // already in correct format\r\n this.renderer2.setStyle(this.el.nativeElement, 'background-image', `url(\"${url}\")`);\r\n this.cdRef.detectChanges();\r\n } else {\r\n if (url.startsWith('!')) {\r\n // get original image\r\n const replacedUrl = url.replace('!', '');\r\n\r\n if (url.toLowerCase().indexOf('/_api/web/lists'.toLowerCase()) !== -1) {\r\n this.subscriptions.add(this.imageService\r\n .getPublishingImageUrl(replacedUrl)\r\n .pipe(\r\n mergeMap(result => {\r\n if (result) {\r\n if (result.startsWith('data:')) {\r\n return of(result);\r\n } else {\r\n return this.imageService.getSharePointImageThumbnailFromOriginalUrlWithStandardDimensions(result);\r\n }\r\n } else {\r\n return of(null);\r\n }\r\n }))\r\n .subscribe(result => {\r\n if (result) {\r\n this.renderer2.setStyle(this.el.nativeElement, 'background-image', `url(\"${result}\")`);\r\n }\r\n this.cdRef.detectChanges();\r\n }));\r\n } else {\r\n this.subscriptions.add(this.imageService\r\n .getSharePointImageThumbnailFromOriginalUrlWithStandardDimensions(replacedUrl)\r\n .subscribe(result => {\r\n if (result) {\r\n this.renderer2.setStyle(this.el.nativeElement, 'background-image', `url(\"${result}\")`);\r\n }\r\n this.cdRef.detectChanges();\r\n }));\r\n }\r\n } else {\r\n // generate thumnail\r\n // setTimeout: Need to wait to let browser draw flexboxes so we can measure them and figure out what image rendition to use\r\n this.window.setTimeout(() => {\r\n\r\n let w = this.el.nativeElement.clientWidth;\r\n if (w > 960 && w < 1400) {\r\n w = 960; // 960 seems like the most common \"large\" image size so we \"lock it\" between these sizes\r\n }\r\n w = Math.max(w, 576); // 576 is the smallest boostrap breakpoint, where layout turns fluid\r\n const h = 99999; // using 99999 to get the thumbnail generation to keep aspect ratio based on width. (this.el.nativeElement.clientHeight)\r\n\r\n if (url.toLowerCase().indexOf('/_api/web/lists'.toLowerCase()) !== -1) {\r\n this.subscriptions.add(this.imageService\r\n .getPublishingImageUrl(url)\r\n .pipe(\r\n mergeMap(result => {\r\n if (result) {\r\n if (result.startsWith('data:')) {\r\n return of(result);\r\n } else {\r\n return this.imageService.getSharePointImageThumbnailFromOriginalUrlWithCustomDimensions(result, w, h);\r\n }\r\n } else {\r\n return of(null);\r\n }\r\n }))\r\n .subscribe(result => {\r\n if (result) {\r\n this.renderer2.setStyle(this.el.nativeElement, 'background-image', `url(\"${result}\")`);\r\n }\r\n this.cdRef.detectChanges();\r\n }));\r\n } else {\r\n this.subscriptions.add(this.imageService\r\n .getSharePointImageThumbnailFromOriginalUrlWithCustomDimensions(url, w, h)\r\n .subscribe(result => {\r\n if (result) {\r\n this.renderer2.setStyle(this.el.nativeElement, 'background-image', `url(\"${result}\")`);\r\n }\r\n this.cdRef.detectChanges();\r\n }));\r\n }\r\n }, 1);\r\n }\r\n }\r\n }\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.subscriptions.unsubscribe();\r\n }\r\n}\r\n@NgModule({\r\n declarations: [CssBackgroundImageProxyDirective],\r\n exports: [CssBackgroundImageProxyDirective],\r\n})\r\nexport class CssBackgroundImageProxyModule { }\r\n","// source: https://medium.com/@swarnakishore/angular-safe-pipe-implementation-to-bypass-domsanitizer-stripping-out-content-c1bf0f1cc36b\r\nimport { NgModule, Pipe, PipeTransform } from '@angular/core';\r\nimport { DomSanitizer, SafeHtml, SafeResourceUrl, SafeScript, SafeStyle, SafeUrl } from '@angular/platform-browser';\r\n\r\n@Pipe({\r\n name: 'safe'\r\n})\r\nexport class SafePipe implements PipeTransform {\r\n\r\n constructor(protected sanitizer: DomSanitizer) { }\r\n\r\n public transform(value: any, type: string): SafeHtml | SafeStyle | SafeScript | SafeUrl | SafeResourceUrl {\r\n switch (type) {\r\n case 'html': return this.sanitizer.bypassSecurityTrustHtml(value);\r\n case 'style': return this.sanitizer.bypassSecurityTrustStyle(value);\r\n case 'script': return this.sanitizer.bypassSecurityTrustScript(value);\r\n case 'url': return this.sanitizer.bypassSecurityTrustUrl(value);\r\n case 'resourceUrl': return this.sanitizer.bypassSecurityTrustResourceUrl(value);\r\n default: throw new Error(`Invalid safe type specified: ${type}`);\r\n }\r\n }\r\n}\r\n@NgModule({\r\n declarations: [SafePipe],\r\n exports: [SafePipe],\r\n})\r\nexport class SafeModule { }\r\n","import { SearchResult } from '@app/models/search-result';\r\nimport { Person, User } from '@microsoft/microsoft-graph-types';\r\nimport { Observable } from 'rxjs';\r\n\r\nexport class PersonExtended implements User {\r\n id?: string;\r\n displayName?: string;\r\n mail?: string;\r\n mobilePhone?: string;\r\n businessPhones?: string[]; // Matches property on Graph User type. Copied from Graph: NOTE: Although this is a string collection, only one number can be set for this property.\r\n officeLocation?: string;\r\n jobTitle?: string;\r\n department?: string;\r\n photoUrl?: string;\r\n photoUrl$?: Observable;\r\n userPrincipalName?: string;\r\n fallbackUrl?: string;\r\n Expanded?: boolean; // Used by top search\r\n SearchTermHits?: string[]; // used by our comma separated search\r\n\r\n static fromPerson(person: Person): PersonExtended {\r\n return {\r\n id: person.id,\r\n userPrincipalName: person.userPrincipalName,\r\n displayName: person.displayName,\r\n mail: person.scoredEmailAddresses ? person.scoredEmailAddresses.map(emailAddresses => emailAddresses.address).shift() : null,\r\n department: person.department,\r\n officeLocation: person.officeLocation,\r\n jobTitle: person.jobTitle,\r\n mobilePhone: person.phones ? person.phones.filter(p => p.type === 'mobile').map(p => p.number).shift() : null,\r\n businessPhones: person.phones ? person.phones.filter(p => p.type === 'business').map(p => [p.number]).shift() : null\r\n } as PersonExtended;\r\n }\r\n\r\n static fromSearchResult(searchResult: SearchResult): PersonExtended {\r\n return {\r\n fallbackUrl: searchResult.Path,\r\n userPrincipalName: searchResult.AccountName.indexOf('|') !== -1 ? searchResult.AccountName.split('|')[2] : searchResult.AccountName,\r\n displayName: searchResult.PreferredName,\r\n mail: searchResult.WorkEmail,\r\n photoUrl: searchResult.PictureURL,\r\n department: searchResult.Department,\r\n officeLocation: searchResult.BaseOfficeLocation,\r\n jobTitle: searchResult.JobTitle\r\n } as PersonExtended;\r\n }\r\n}\r\n","import { HttpClient, HttpParams } from '@angular/common/http';\r\nimport { Inject, Injectable } from '@angular/core';\r\nimport { CUSTOMERENVIRONMENT } from '@app/common/app-tokens';\r\nimport { Constants } from '@app/common/constants';\r\nimport { HttpHelper } from '@app/common/http-helper';\r\nimport { AppTile } from '@app/models/app-tile';\r\nimport { Audit } from '@app/models/audit';\r\nimport { AppTileBroadcastMessages } from '@app/models/message-broadcast-app-tile';\r\nimport { AuditsService } from '@app/services/audits.service';\r\nimport { CacheService } from '@app/services/cache.service';\r\nimport { SmartLinksService } from '@app/services/smart-links.service';\r\nimport { UserService } from '@app/services/user.service';\r\nimport { Environment } from '@environments/interface.environment';\r\nimport { isAfter, isBefore } from 'date-fns';\r\nimport { BehaviorSubject, concat, forkJoin, Observable, of, Subject } from 'rxjs';\r\nimport { catchError, map, shareReplay, takeUntil, tap } from 'rxjs/operators';\r\nimport { UserAppTileService } from './user-app-tile.service';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class AppTileService implements AuditsService {\r\n\r\n constructor(private http: HttpClient,\r\n private cache: CacheService,\r\n private userService: UserService,\r\n private userAppTileService: UserAppTileService,\r\n private smartLinksService: SmartLinksService,\r\n @Inject(CUSTOMERENVIRONMENT) private environment: Environment,\r\n private httpHelper: HttpHelper) { }\r\n\r\n public readonly getAppTilesCacheKey = 'AppTileService-getAppTiles';\r\n\r\n public useCache = true;\r\n private getAppTiles$: Observable>;\r\n\r\n private reload$ = new Subject();\r\n public refresh$ = new BehaviorSubject(null);\r\n\r\n public reload() {\r\n this.reload$.next();\r\n this.getAppTiles$ = null;\r\n if (this.useCache) {\r\n this.cache.removeAllItemsInPersistentCacheWithGeneratedKeyPrefix(this.getAppTilesCacheKey);\r\n }\r\n this.userAppTileService.reload();\r\n this.smartLinksService.reload();\r\n this.refresh$.next(null);\r\n }\r\n\r\n /*\r\n * Returns app tiles that the current user is licensed to use\r\n * If keepUnlicensed is set to true, ALL app are returned -> instead property UserIsLicensed is populated\r\n */\r\n getLicensedAppTiles(keepUnlicensed = false): Observable> {\r\n const appTiles$ = this.getAppTiles();\r\n const userDetails$ = this.userService.getMyDetailsFromMsGraph();\r\n\r\n return forkJoin([appTiles$, userDetails$])\r\n .pipe(\r\n map(([appTiles, userDetails]) => {\r\n // remove apps that the user does not have a license to user\r\n if (!keepUnlicensed) {\r\n appTiles = appTiles.filter(app => {\r\n if (!app.O365ServiceName || app.O365ServiceName === '') { return true; } // no license required\r\n const foundLicense = userDetails.assignedPlans.find(plan => {\r\n return plan.service.toLowerCase() === app.O365ServiceName.toLowerCase();\r\n });\r\n return foundLicense !== undefined && foundLicense.capabilityStatus === 'Enabled';\r\n });\r\n }\r\n\r\n appTiles.map(app => {\r\n if (!app.O365ServiceName || app.O365ServiceName === '') {\r\n app.UserIsLicensed = true;\r\n } else {\r\n const foundLicense = userDetails.assignedPlans.find(plan => {\r\n return plan.service.toLowerCase() === app.O365ServiceName.toLowerCase();\r\n });\r\n app.UserIsLicensed = foundLicense !== undefined && foundLicense.capabilityStatus === 'Enabled';\r\n }\r\n });\r\n return appTiles;\r\n })\r\n );\r\n }\r\n\r\n getAppTiles(): Observable> {\r\n if (this.getAppTiles$) {\r\n return this.getAppTiles$;\r\n } else {\r\n this.getAppTiles$ = this.http.get>(`${Constants.API_ENDPOINT}/apptiles`)\r\n .pipe(\r\n map(response => {\r\n console.log(`getAppTiles: `, response);\r\n return response.map(p => new AppTile(p));\r\n }),\r\n tap(data => {\r\n this.useCache && this.cache.set(this.getAppTilesCacheKey, data);\r\n }),\r\n catchError(this.httpHelper.handleError({ operation: 'getAppTiles', result: new Array(), rethrow: true, cacheKey: this.getAppTilesCacheKey })),\r\n takeUntil(this.reload$),\r\n shareReplay({ bufferSize: 1, refCount: true }));\r\n\r\n if (this.useCache) {\r\n const cachedData = this.cache.get>(this.getAppTilesCacheKey);\r\n if (cachedData) {\r\n return concat(of(cachedData), this.getAppTiles$);\r\n }\r\n }\r\n return this.getAppTiles$;\r\n }\r\n }\r\n\r\n getAppTile(id: number): Observable {\r\n return this.http.get(`${Constants.API_ENDPOINT}/apptiles/${id}`)\r\n .pipe(\r\n map(response => {\r\n console.log(`getAppTile: `, response);\r\n const appTile = response as AppTile;\r\n // filter AppTileBroadcastMessages to get only active messages on app tile.\r\n const activeAptileBroadcastMessages: AppTileBroadcastMessages[] = appTile.AppTileBroadcastMessages.filter(b => (!b.BroadcastMessage.EndDate || isAfter(new Date(b.BroadcastMessage.EndDate), new Date())) && (!b.BroadcastMessage.StartDate || isBefore(new Date(b.BroadcastMessage.StartDate), new Date())));\r\n appTile.AppTileBroadcastMessages = activeAptileBroadcastMessages;\r\n\r\n return new AppTile(appTile);\r\n }),\r\n catchError(this.httpHelper.handleError({ operation: 'getAppTile', result: null, rethrow: true }))\r\n );\r\n }\r\n\r\n updateAppTile(id: number, appTile: AppTile): Observable {\r\n // We need to append the siteUrl because there will be an authorization check in the backend against the workplace admin group on this site\r\n const httpParams = new HttpParams().append('siteUrl', encodeURI(this.environment.coreWorkplaceSiteUrl));\r\n const fetchOperation = this.http.put(`${Constants.API_ENDPOINT}/apptiles/${id}`, appTile, {\r\n params: httpParams\r\n })\r\n .pipe(\r\n map(response => {\r\n console.log(`updateAppTile: `, response);\r\n this.reload();\r\n return appTile;\r\n }),\r\n catchError(this.httpHelper.handleError({ operation: 'updateAppTile', result: null, rethrow: true })));\r\n\r\n return fetchOperation;\r\n }\r\n\r\n deleteAppTile(id: number): Observable {\r\n // We need to append the siteUrl because there will be an authorization check in the backend against the workplace admin group on this site\r\n const httpParams = new HttpParams().append('siteUrl', encodeURI(this.environment.coreWorkplaceSiteUrl));\r\n const fetchOperation = this.http.delete(`${Constants.API_ENDPOINT}/apptiles/${id}`, {\r\n params: httpParams\r\n })\r\n .pipe(\r\n map(response => {\r\n console.log(`deleteAppTile `, response);\r\n this.reload();\r\n return response;\r\n }),\r\n catchError(this.httpHelper.handleError({ operation: 'deleteAppTile', result: null, rethrow: true })));\r\n\r\n return fetchOperation;\r\n }\r\n\r\n addAppTile(userAppTile: AppTile): Observable {\r\n // We need to append the siteUrl because there will be an authorization check in the backend against the workplace admin group on this site\r\n const httpParams = new HttpParams().append('siteUrl', encodeURI(this.environment.coreWorkplaceSiteUrl));\r\n const fetchOperation = this.http.post(`${Constants.API_ENDPOINT}/apptiles`, userAppTile, {\r\n params: httpParams\r\n })\r\n .pipe(\r\n map(response => {\r\n console.log(`addAppTile: `, response);\r\n this.reload();\r\n return new AppTile(response);\r\n }),\r\n catchError(this.httpHelper.handleError({ operation: 'addAppTile', result: null, rethrow: true })));\r\n\r\n return fetchOperation;\r\n }\r\n\r\n getUnreadCounterFromEndpoint(appTile: AppTile): Observable {\r\n return this.http.get(`${appTile.IntegrationEndpointUrl}`).\r\n pipe(\r\n map(response => {\r\n let result = null;\r\n if (appTile.IntegrationEndpointUrl.startsWith('https://graph.microsoft.com/v1.0/me/mailFolders')) {\r\n result = response['unreadItemCount'] as number;\r\n } else {\r\n if (appTile.IntegrationEndpointUrl.startsWith('https://graph.microsoft.com')) {\r\n result = response['@odata.count'] as number;\r\n } else if (appTile.IntegrationEndpointUrl.indexOf('/api/me/yammer/notifications') !== -1) {\r\n if (response && response.length) {\r\n result = response[0].unseen_notification_count + response[0].unseen_message_count;\r\n }\r\n } else if (Array.isArray(response)) {\r\n result = (response as Array).length;\r\n }\r\n }\r\n\r\n if (result && result > 0) {\r\n return result;\r\n }\r\n return null;\r\n }));\r\n }\r\n\r\n getAudits(id: number): Observable> {\r\n // We need to append the siteUrl because there will be an authorization check in the backend against the workplace admin group on this site\r\n const httpParams = new HttpParams().append('siteUrl', encodeURI(this.environment.coreWorkplaceSiteUrl));\r\n return this.http.\r\n get>(`${Constants.API_ENDPOINT}/apptiles/${id}/audits`, {\r\n params: httpParams\r\n })\r\n .pipe(\r\n map(results => {\r\n return results.map(r => new Audit(r));\r\n }),\r\n catchError(this.httpHelper.handleError({ operation: 'getAudits', result: null, rethrow: true }))\r\n );\r\n }\r\n\r\n restoreToAudit(id: number, auditId: number): Observable {\r\n // We need to append the siteUrl because there will be an authorization check in the backend against the workplace admin group on this site\r\n const httpParams = new HttpParams().append('siteUrl', encodeURI(this.environment.coreWorkplaceSiteUrl));\r\n return this.http.post(`${Constants.API_ENDPOINT}/apptiles/${id}/audits/${auditId}/restore`, {}, {\r\n params: httpParams\r\n })\r\n .pipe(\r\n tap(() => {\r\n this.reload();\r\n }),\r\n catchError(this.httpHelper.handleError({ operation: 'restoreToAudit', result: null, rethrow: true })));\r\n }\r\n\r\n searchAppTile(keyword: string, max: number): Observable> {\r\n\r\n // abort if no keyword provided\r\n if (!keyword) {\r\n return of([]);\r\n }\r\n\r\n const cacheKey = `${this.getAppTilesCacheKey}-searchForApps-${keyword}-${max}`;\r\n const cachedData = this.cache.get>(cacheKey);\r\n if (cachedData) {\r\n return of(cachedData);\r\n }\r\n\r\n const httpParams = new HttpParams()\r\n .append('key', keyword.toLowerCase())\r\n .append('max', max.toString());\r\n\r\n const fetchOperation = this.http.get>(`${Constants.API_ENDPOINT}/apptiles/suggestions`, {\r\n params: httpParams\r\n })\r\n .pipe(\r\n tap(result => {\r\n this.useCache && this.cache.set(cacheKey, result);\r\n }),\r\n catchError(this.httpHelper.handleError({ operation: 'searchAppTile', result: new Array(), rethrow: true, cacheKey: cacheKey }))\r\n );\r\n return fetchOperation;\r\n }\r\n}\r\n","import { Directive, EmbeddedViewRef, Input, NgModule, OnDestroy, OnInit, TemplateRef, ViewContainerRef } from '@angular/core';\r\nimport { FeatureSettingsStoreService } from '@app/services/feature-settings-store.service';\r\nimport { Subscription } from 'rxjs';\r\n\r\n@Directive({\r\n selector: '[appFeatureToggle]'\r\n})\r\nexport class FeatureToggleDirective implements OnInit, OnDestroy {\r\n\r\n @Input('appFeatureToggle') featureSettingKey: string;\r\n subscription: Subscription;\r\n embeddedView: EmbeddedViewRef;\r\n\r\n constructor(\r\n private featureSettingsStoreService: FeatureSettingsStoreService,\r\n private vcr: ViewContainerRef,\r\n private tpl: TemplateRef) { }\r\n\r\n ngOnInit(): void {\r\n if (this.featureSettingKey) {\r\n this.subscription = this.featureSettingsStoreService.state$.subscribe(state => {\r\n if (state[this.featureSettingKey]) {\r\n if (!this.embeddedView) {\r\n this.embeddedView = this.vcr.createEmbeddedView(this.tpl);\r\n }\r\n } else {\r\n this.vcr.clear();\r\n this.embeddedView = null;\r\n }\r\n });\r\n }\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.subscription && this.subscription.unsubscribe();\r\n }\r\n\r\n}\r\n@NgModule({\r\n declarations: [FeatureToggleDirective],\r\n exports: [FeatureToggleDirective],\r\n})\r\nexport class FeatureToggleModule { }\r\n","export class TrackingEvent {\r\n name: string;\r\n properties: EventProperties;\r\n constructor(opt?: Partial) {\r\n Object.assign(this, opt);\r\n }\r\n}\r\n\r\nexport interface EventProperties {\r\n href?: string;\r\n label?: string;\r\n componentId?: string;\r\n currentRoute?: string;\r\n query?: string;\r\n}\r\n","import { ChangeDetectorRef, Directive, Input, NgModule, OnDestroy, TemplateRef, ViewContainerRef } from '@angular/core';\r\nimport { Observable, Subscription } from 'rxjs';\r\n\r\nexport class NgSubscribeContext {\r\n public ngSubscribe: any = null;\r\n}\r\n\r\n@Directive({\r\n /* tslint:disable */\r\n selector: '[ngSubscribe]'\r\n /* tslint:enable */\r\n})\r\nexport class NgSubscribeDirective implements OnDestroy {\r\n // This directive is copied from here where you can find an explanation about what it does. HINT, its basically *ngIf but always creates the child view regardless.\r\n // https://netbasal.com/diy-subscription-handling-directive-in-angular-c8f6e762697f\r\n private observable: Observable;\r\n private context: NgSubscribeContext = new NgSubscribeContext();\r\n private subscription: Subscription;\r\n\r\n @Input() set ngSubscribe(inputObservable: Observable) {\r\n if (this.observable !== inputObservable) {\r\n this.observable = inputObservable;\r\n this.subscription && this.subscription.unsubscribe();\r\n this.subscription = this.observable.subscribe(value => {\r\n this.context.ngSubscribe = value;\r\n this.cdr.markForCheck();\r\n });\r\n }\r\n }\r\n\r\n constructor(\r\n private viewContainer: ViewContainerRef,\r\n private cdr: ChangeDetectorRef,\r\n private templateRef: TemplateRef\r\n ) {\r\n this.viewContainer.createEmbeddedView(this.templateRef, this.context);\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.subscription && this.subscription.unsubscribe();\r\n }\r\n}\r\n@NgModule({\r\n declarations: [NgSubscribeDirective],\r\n exports: [NgSubscribeDirective],\r\n})\r\nexport class NgSubscribeModule { }\r\n","import { HttpClient, HttpParams } from '@angular/common/http';\r\nimport { Inject, Injectable } from '@angular/core';\r\nimport { CUSTOMERENVIRONMENT } from '@app/common/app-tokens';\r\nimport { HttpHelper } from '@app/common/http-helper';\r\nimport { Environment } from '@environments/interface.environment';\r\nimport { BehaviorSubject, concat, Observable, of, Subject } from 'rxjs';\r\nimport { catchError, map, shareReplay, takeUntil, tap } from 'rxjs/operators';\r\nimport { Constants } from '@app/common/constants';\r\nimport { PowerBIFrame } from '@app/models/power-bi-frame';\r\nimport { CacheService } from './cache.service';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class PowerBIService {\r\n constructor(@Inject(CUSTOMERENVIRONMENT) private environment: Environment,\r\n private http: HttpClient,\r\n private httpHelper: HttpHelper,\r\n private cache: CacheService) { }\r\n\r\n private readonly cacheKey = 'PowerBIService-getPowerBIFrames';\r\n public useCache = true;\r\n private reload$ = new Subject();\r\n public refresh$ = new BehaviorSubject(null);\r\n\r\n getAllPowerBIFrames$: Observable>;\r\n\r\n public reload() {\r\n this.getAllPowerBIFrames$ = null;\r\n if (this.useCache) {\r\n this.cache.removeAllItemsInPersistentCacheWithGeneratedKeyPrefix(this.cacheKey);\r\n }\r\n this.reload$.next();\r\n this.refresh$.next(null);\r\n }\r\n\r\n getAllPowerBIFrames(): Observable> {\r\n if (this.getAllPowerBIFrames$) {\r\n return this.getAllPowerBIFrames$;\r\n } else {\r\n this.getAllPowerBIFrames$ = this.http.get>(`${Constants.API_ENDPOINT}/powerbiframes`)\r\n .pipe(\r\n map(response => {\r\n console.log(`fetched result getAllPowerBIFrames: `, response);\r\n return response.map(p => new PowerBIFrame(p));\r\n }),\r\n tap(data => {\r\n this.useCache && this.cache.set(`${this.cacheKey}-all`, data);\r\n }),\r\n catchError(this.httpHelper.handleError({ operation: 'getAllPowerBIFrames', result: new Array(), cacheKey: `${this.cacheKey}-all` })),\r\n takeUntil(this.reload$),\r\n shareReplay({ bufferSize: 1, refCount: true }));\r\n\r\n if (this.useCache) {\r\n const cachedData = this.cache.get>(`${this.cacheKey}-all`);\r\n if (cachedData) {\r\n return concat(of(cachedData), this.getAllPowerBIFrames$);\r\n }\r\n }\r\n return this.getAllPowerBIFrames$;\r\n }\r\n }\r\n\r\n getPowerBIFrame(id: number): Observable {\r\n return this.http.get(`${Constants.API_ENDPOINT}/powerbiframes/${id}`)\r\n .pipe(\r\n map(response => {\r\n console.log(`fetched result getPowerBIFrame: `, response);\r\n return new PowerBIFrame(response);\r\n }));\r\n }\r\n\r\n updatePowerBIFrame(id: number, frame: PowerBIFrame): Observable {\r\n const httpParams = new HttpParams().append('siteUrl', encodeURI(this.environment.coreWorkplaceSiteUrl));\r\n const fetchOperation = this.http.put(`${Constants.API_ENDPOINT}/powerbiframes/${id}`, frame, {\r\n params: httpParams\r\n })\r\n .pipe(\r\n map(response => {\r\n console.log(`updated result: `);\r\n console.log(response);\r\n this.reload();\r\n return frame;\r\n }));\r\n\r\n return fetchOperation;\r\n }\r\n\r\n addPowerBIFrame(frame: PowerBIFrame): Observable {\r\n // We need to append the siteUrl because there will be an authorization check in the backend against the workplace admin group on this site\r\n const httpParams = new HttpParams().append('siteUrl', encodeURI(this.environment.coreWorkplaceSiteUrl));\r\n const fetchOperation = this.http.post(`${Constants.API_ENDPOINT}/powerbiframes`, frame, {\r\n params: httpParams\r\n })\r\n .pipe(\r\n map(response => {\r\n console.log(`added result: `);\r\n console.log(response);\r\n this.reload();\r\n return new PowerBIFrame(response);\r\n }));\r\n\r\n return fetchOperation;\r\n }\r\n\r\n deletePowerBIFrame(id: number): Observable {\r\n // We need to append the siteUrl because there will be an authorization check in the backend against the workplace admin group on this site\r\n const httpParams = new HttpParams().append('siteUrl', encodeURI(this.environment.coreWorkplaceSiteUrl));\r\n const fetchOperation = this.http.delete(`${Constants.API_ENDPOINT}/powerbiframes/${id}`, {\r\n params: httpParams\r\n })\r\n .pipe(\r\n map(response => {\r\n console.log(`deleted result: `);\r\n console.log(response);\r\n this.reload();\r\n return response;\r\n }),\r\n catchError(this.httpHelper.handleError({ operation: 'deletePowerBIFrame', result: new PowerBIFrame() })));\r\n\r\n return fetchOperation;\r\n }\r\n\r\n}\r\n","import { HttpClient, HttpParams } from '@angular/common/http';\r\nimport { Inject, Injectable } from '@angular/core';\r\nimport { CUSTOMERENVIRONMENT } from '@app/common/app-tokens';\r\nimport { HttpHelper } from '@app/common/http-helper';\r\nimport { SPHomeContext } from '@app/models/sphome-context';\r\nimport { CacheService } from '@app/services/cache.service';\r\nimport { Environment } from '@environments/interface.environment';\r\nimport { Observable } from 'rxjs';\r\nimport { catchError, shareReplay, tap } from 'rxjs/operators';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class SphomeService {\r\n\r\n constructor(private http: HttpClient,\r\n @Inject(CUSTOMERENVIRONMENT) private environment: Environment,\r\n private cache: CacheService,\r\n private httpHelper: HttpHelper) { }\r\n\r\n private getSPHomeContext$: Observable;\r\n public useCache = true;\r\n private cacheKey = 'SphomeService-getSPHomeContext';\r\n\r\n getSPHomeContext(): Observable {\r\n if (!this.getSPHomeContext$) {\r\n const httpParams = new HttpParams().append('$expand', 'Token,Payload');\r\n this.getSPHomeContext$ = this.http\r\n .get(`${this.environment.tenantHostUrl}/_api/sphomeservice/context`, { params: httpParams })\r\n .pipe(\r\n tap(data => {\r\n this.useCache && this.cache.set(this.cacheKey, data);\r\n }),\r\n catchError(this.httpHelper.handleError({ operation: 'getSPHomeContext', cacheKey: this.cacheKey })),\r\n shareReplay({ bufferSize: 1, refCount: true }));\r\n }\r\n return this.getSPHomeContext$;\r\n }\r\n}\r\n","import { Directive, ElementRef, EventEmitter, NgModule, OnDestroy, OnInit, Output } from '@angular/core';\r\n\r\n@Directive({\r\n selector: '[appDomChange]'\r\n})\r\nexport class DomChangeDirective implements OnDestroy, OnInit {\r\n\r\n private changes: MutationObserver;\r\n\r\n @Output('appDomChange') domChange = new EventEmitter();\r\n\r\n constructor(private elementRef: ElementRef) { }\r\n\r\n ngOnInit(): void {\r\n const element = this.elementRef.nativeElement;\r\n\r\n this.changes = new MutationObserver((mutations: MutationRecord[]) => {\r\n mutations.forEach((mutation: MutationRecord) => {\r\n this.domChange.emit(mutation);\r\n });\r\n });\r\n\r\n this.changes.observe(element, {\r\n childList: true,\r\n characterData: true,\r\n subtree: true,\r\n });\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.changes && this.changes.disconnect();\r\n }\r\n}\r\n@NgModule({\r\n declarations: [DomChangeDirective],\r\n exports: [DomChangeDirective],\r\n})\r\nexport class DomChangeModule { }\r\n","import { CommonModule, DOCUMENT } from '@angular/common';\r\nimport { Component, ElementRef, forwardRef, Inject, NgModule, QueryList, Renderer2, ViewChild, ViewChildren, ViewEncapsulation } from '@angular/core';\r\nimport { ControlValueAccessor, FormsModule, NG_VALUE_ACCESSOR } from '@angular/forms';\r\nimport { MatButton, MatButtonModule } from '@angular/material/button';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { MatSelectModule } from '@angular/material/select';\r\nimport { DomChangeModule } from '@app/directives/dom-change.directive';\r\nimport { StickyFillModule } from '@app/directives/stickyfill.directive';\r\nimport { LinkModule } from '@app/directives/link.directive';\r\nimport { FeatureSettingsStoreService } from '@app/services/feature-settings-store.service';\r\n\r\n@Component({\r\n selector: 'app-html-editor',\r\n templateUrl: './html-editor.component.html',\r\n styleUrls: ['./html-editor.component.scss'],\r\n encapsulation: ViewEncapsulation.None,\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => HtmlEditorComponent),\r\n multi: true\r\n }\r\n ]\r\n})\r\nexport class HtmlEditorComponent implements ControlValueAccessor {\r\n @ViewChild('editor', { static: true }) editor: ElementRef;\r\n @ViewChild('codeEditor', { static: true }) codeElement: ElementRef;\r\n @ViewChild('selector', { static: true }) selector: ElementRef;\r\n @ViewChildren(MatButton) actionBarButtons: QueryList;\r\n @ViewChild('lblLinkUrl', { static: true }) lblLinkUrl: ElementRef;\r\n @ViewChild('lblImageUrl', { static: true }) lblImageUrl: ElementRef;\r\n readonly formatBlock = 'formatBlock';\r\n private readonly defaultParagraphSeparator = ``;\r\n private onChange;\r\n private onTouch;\r\n htmlMode = false;\r\n selectedHeading: string;\r\n\r\n constructor(@Inject(DOCUMENT) private document: Document, private renderer: Renderer2, private featureSettingsStoreService: FeatureSettingsStoreService) { }\r\n\r\n writeValue(obj: any): void {\r\n if (!obj) {\r\n obj = '';\r\n }\r\n if (this.htmlMode) {\r\n this.renderer.setProperty(this.codeElement.nativeElement, 'textContent', obj);\r\n } else {\r\n this.renderer.setProperty(this.editor.nativeElement, 'innerHTML', obj);\r\n }\r\n\r\n }\r\n\r\n getHeaderHeight() {\r\n if (this.featureSettingsStoreService.state.stickyHeader) {\r\n return this.document.querySelector('header').clientHeight;\r\n }\r\n return 0;\r\n }\r\n\r\n registerOnChange(fn: any): void {\r\n this.onChange = fn;\r\n }\r\n\r\n registerOnTouched(fn: any): void {\r\n this.onTouch = fn;\r\n }\r\n\r\n setDisabledState?(isDisabled: boolean): void {\r\n if (isDisabled) {\r\n this.renderer.addClass(this.editor.nativeElement, 'disabled');\r\n } else {\r\n this.renderer.removeClass(this.editor.nativeElement, 'disabled');\r\n }\r\n }\r\n\r\n changeEditorMode() {\r\n if (this.htmlMode) {\r\n this.htmlMode = false;\r\n this.renderer.setProperty(this.editor.nativeElement, 'innerHTML', this.codeElement.nativeElement.textContent);\r\n this.actionBarButtons.forEach(button => {\r\n button.disabled = false;\r\n });\r\n this.renderer.setProperty(this.selector.nativeElement, 'disabled', false);\r\n } else {\r\n this.htmlMode = true;\r\n this.renderer.setProperty(this.codeElement.nativeElement, 'textContent', this.editor.nativeElement.innerHTML);\r\n this.actionBarButtons.forEach(button => {\r\n if (button._elementRef.nativeElement.id.length > 0) {\r\n button.disabled = true;\r\n }\r\n });\r\n this.renderer.setProperty(this.selector.nativeElement, 'disabled', true);\r\n }\r\n }\r\n\r\n handleAction(command: string, value = null) {\r\n if (command === 'createLink') {\r\n const url = prompt(this.lblLinkUrl.nativeElement.innerHTML, 'https://');\r\n if (url.length > 8) {\r\n value = url;\r\n } else { return; }\r\n } else if (command === 'insertImage') {\r\n const url = prompt(this.lblImageUrl.nativeElement.innerHTML, 'https://');\r\n if (url.length > 8) {\r\n value = url;\r\n } else { return; }\r\n }\r\n this.exec(command, value);\r\n }\r\n\r\n exec(command, value = null): boolean {\r\n return this.document.execCommand(command, false, value);\r\n }\r\n\r\n queryCommandValue(command): string {\r\n return this.document.queryCommandValue(command);\r\n }\r\n\r\n queryCommandState(command): boolean {\r\n return this.document.queryCommandState(command);\r\n }\r\n\r\n private highlightSelectedActionBarButton(target: HTMLElement): void {\r\n if (target) {\r\n this.actionBarButtons.forEach(button => {\r\n const state = this.queryCommandState(button._elementRef.nativeElement.id);\r\n if (state) {\r\n this.renderer.addClass(button._elementRef.nativeElement, 'active');\r\n } else {\r\n this.renderer.removeClass(button._elementRef.nativeElement, 'active');\r\n }\r\n });\r\n\r\n const selectorElement = this.selector.nativeElement as HTMLSelectElement;\r\n if (selectorElement) {\r\n this.selectedHeading = '';\r\n for (let i = 0; i < selectorElement.options.length; i++) {\r\n if (selectorElement.options.item(i).value.toLowerCase() === target.nodeName.toLowerCase()) {\r\n this.selectedHeading = selectorElement.options.item(i).value;\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n private addOpenInNewWindowAttributeToLinks(target: HTMLElement): void {\r\n\r\n if (target.tagName === 'A') {\r\n target.setAttribute('target', '_blank');\r\n }\r\n }\r\n\r\n onClick(target: HTMLElement): void {\r\n this.highlightSelectedActionBarButton(target);\r\n }\r\n\r\n onDomChange(target: HTMLElement): void {\r\n if (target) {\r\n if (this.htmlMode) {\r\n this.onChange(this.codeElement.nativeElement.textContent);\r\n this.onTouch(this.codeElement.nativeElement.textContent);\r\n } else {\r\n if (target.firstChild && target.firstChild.nodeType === 3) {\r\n this.exec(this.formatBlock, this.defaultParagraphSeparator);\r\n }\r\n this.addOpenInNewWindowAttributeToLinks(target);\r\n this.onChange(this.editor.nativeElement.innerHTML);\r\n this.onTouch(this.editor.nativeElement.innerHTML);\r\n this.highlightSelectedActionBarButton(target);\r\n\r\n }\r\n }\r\n }\r\n}\r\n@NgModule({\r\n declarations: [HtmlEditorComponent],\r\n exports: [HtmlEditorComponent],\r\n imports: [\r\n CommonModule,\r\n FormsModule,\r\n MatButtonModule,\r\n MatFormFieldModule,\r\n MatInputModule,\r\n MatSelectModule,\r\n DomChangeModule,\r\n LinkModule,\r\n StickyFillModule\r\n ]\r\n})\r\nexport class HtmlEditorModule { }\r\n","
    \r\n
    \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n Select Heading\r\n \r\n \r\n \r\n \r\n
    \r\n\r\n
    \r\n
    \r\n\r\n
    \r\n
    \r\n        \r\n  
    \r\n
    \r\n
    \r\n","import { CommonModule } from '@angular/common';\r\nimport { ChangeDetectionStrategy, Component, ElementRef, Host, NgModule, OnDestroy, OnInit, Optional } from '@angular/core';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatDialog } from '@angular/material/dialog';\r\nimport { MatSlideToggleModule } from '@angular/material/slide-toggle';\r\nimport { ConfirmDialogComponent, ConfirmDialogModule } from '@app/components/confirm-dialog/confirm-dialog.component';\r\nimport { HideParentIfEmptyDirective } from '@app/directives/hide-parent-if-empty.directive';\r\nimport { UserItemToRead } from '@app/models/user-item-to-read';\r\nimport { LinkModule } from '@app/directives/link.directive';\r\nimport { FeatureSettingsStoreService } from '@app/services/feature-settings-store.service';\r\nimport { UserItemsToReadService } from '@app/services/user-items-to-read.service';\r\nimport { BehaviorSubject, forkJoin, iif, Observable, of, Subscription } from 'rxjs';\r\nimport { map, mergeMap, tap } from 'rxjs/operators';\r\n\r\n@Component({\r\n selector: 'app-required-reading',\r\n templateUrl: './required-reading.component.html',\r\n styleUrls: ['./required-reading.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush\r\n})\r\nexport class RequiredReadingComponent implements OnInit, OnDestroy {\r\n\r\n readingItems$: Observable>;\r\n showHasRead: boolean;\r\n allowMarkAsReadFromReqReadList = this.featureSettingsStoreService.state.allowMarkAsReadFromReqReadList;\r\n private showHasReadSubject = new BehaviorSubject(false);\r\n updateSubscription: Subscription;\r\n\r\n constructor(private service: UserItemsToReadService,\r\n public elementRef: ElementRef,\r\n private featureSettingsStoreService: FeatureSettingsStoreService,\r\n private dialog: MatDialog,\r\n @Host() @Optional() private hideParentIfEmptyDirective: HideParentIfEmptyDirective) {\r\n }\r\n\r\n handleShowHasRead(change: any) {\r\n this.showHasRead = change.checked;\r\n // key board right arrow event\r\n if (change.keyCode && change.keyCode === 39) {\r\n this.showHasRead = true;\r\n }\r\n // key board left arrow event\r\n if (change.keyCode && change.keyCode === 37) {\r\n this.showHasRead = false;\r\n }\r\n\r\n this.showHasReadSubject.next(this.showHasRead);\r\n }\r\n\r\n markAsRead(item: UserItemToRead) {\r\n\r\n const dialogRef = this.dialog.open(ConfirmDialogComponent);\r\n\r\n this.updateSubscription = dialogRef.afterClosed()\r\n .pipe(\r\n mergeMap(confirm => {\r\n return iif(() =>\r\n confirm,\r\n this.service.updateUserItem(item.ItemToRead.Guid, { ...item, ...{ HasRead: true } })\r\n .pipe(\r\n tap(() => {\r\n this.showHasReadSubject.next(this.showHasRead);\r\n })),\r\n of(null));\r\n }))\r\n .subscribe();\r\n }\r\n\r\n ngOnInit() {\r\n this.readingItems$ = this.showHasReadSubject\r\n .pipe(mergeMap((hasRead) => {\r\n if (hasRead) {\r\n return forkJoin([this.service.getAllUserItemsToRead(), this.service.getAllUserItemsHasRead()])\r\n .pipe(\r\n map(([r1, r2]) => r1.concat(r2)),\r\n tap(items => {\r\n if (items && items.length === 0) {\r\n this.hideParentIfEmptyDirective && this.hideParentIfEmptyDirective.hideElement();\r\n } else {\r\n this.hideParentIfEmptyDirective && this.hideParentIfEmptyDirective.showElement();\r\n }\r\n })\r\n );\r\n } else {\r\n return this.service.getAllUserItemsToRead()\r\n .pipe(\r\n tap(items => {\r\n if (items && items.length === 0) {\r\n this.hideParentIfEmptyDirective && this.hideParentIfEmptyDirective.hideElement();\r\n } else {\r\n this.hideParentIfEmptyDirective && this.hideParentIfEmptyDirective.showElement();\r\n }\r\n }));\r\n }\r\n }));\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.updateSubscription && this.updateSubscription.unsubscribe();\r\n }\r\n\r\n}\r\n@NgModule({\r\n declarations: [RequiredReadingComponent],\r\n exports: [RequiredReadingComponent],\r\n imports: [\r\n CommonModule,\r\n MatSlideToggleModule,\r\n LinkModule,\r\n MatButtonModule,\r\n ConfirmDialogModule\r\n ]\r\n})\r\nexport class RequiredReadingModule { }\r\n","
    \r\n
    \r\n
    \r\n

    Your required reading

    \r\n

    \r\n \r\n In the list below you'll find content that you are required to read by your organisation. After reading, you can confirm by hovering over the title of the content item and clicking the check mark.\r\n \r\n \r\n When you click on an item it will open in a new tab. You can navigate back here at any time by closing or switching the tab.\r\n \r\n

    \r\n
    \r\n
    \r\n Show read\r\n
    \r\n
    \r\n
    \r\n
    \r\n \r\n
    \r\n \r\n
    \r\n
    \r\n
    \r\n
    \r\n","import { HttpParameterCodec } from '@angular/common/http';\r\n\r\nexport class CustomEncoder implements HttpParameterCodec {\r\n encodeKey(key: string): string {\r\n return key;\r\n }\r\n\r\n encodeValue(value: string): string {\r\n return value;\r\n }\r\n\r\n decodeKey(key: string): string {\r\n return key;\r\n }\r\n\r\n decodeValue(value: string): string {\r\n return value;\r\n }\r\n}\r\n","import { HttpClient, HttpParams } from '@angular/common/http';\r\nimport { Injectable } from '@angular/core';\r\nimport { Constants } from '@app/common/constants';\r\nimport { CustomEncoder } from '@app/common/custom-http-param-encode';\r\nimport { HttpHelper } from '@app/common/http-helper';\r\nimport { CacheService } from '@app/services/cache.service';\r\nimport { Group } from '@microsoft/microsoft-graph-types-beta';\r\nimport { endOfDay } from 'date-fns';\r\nimport { concat, EMPTY, Observable, of } from 'rxjs';\r\nimport { catchError, expand, map, shareReplay, tap, toArray } from 'rxjs/operators';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class GroupsService {\r\n\r\n private readonly cacheKeyAllGroups = 'GroupsService-getAllGroups';\r\n private readonly cacheKeyAllOwnedGroups = 'GroupsService-getAllMyOwnedGroups';\r\n private readonly cacheKeyMemberGroups = 'GroupsService-getAllMyMemberGroups';\r\n private readonly cacheKeyGroupsWithFilter = 'GroupsService-getAllO365Groups';\r\n private readonly cacheKeyAllMyTransitiveMemberGroups = 'Group-Service-getAllMyTransitiveMemberGroups';\r\n public useCache = true;\r\n private getAllOwnedGroups$: Observable>;\r\n private getAllMemberGroups$: Observable>;\r\n private getAllGroups$: Observable>;\r\n\r\n constructor(private http: HttpClient, private cache: CacheService, private httpHelper: HttpHelper) { }\r\n\r\n getAllGroups(doNotIncludeSecurityGroups?: boolean): Observable> {\r\n if (this.getAllGroups$) {\r\n return this.getAllGroups$;\r\n } else {\r\n let httpParams = new HttpParams({ encoder: new CustomEncoder() })\r\n .append('$select', `id,displayname,description,resourceProvisioningOptions,creationOptions,visibility,mailNickname,groupTypes`)\r\n .append('$top', `500`);\r\n\r\n if (doNotIncludeSecurityGroups) {\r\n httpParams = httpParams\r\n .append('$filter', `groupTypes/any(c:c+eq+'Unified')`);\r\n }\r\n\r\n this.getAllGroups$ = this.http.get(`${Constants.GRAPH_API_ENDPOINT}${Constants.GRAPH_API_BETA_VERSION}/groups`, { params: httpParams })\r\n .pipe(\r\n expand((results) => {\r\n if (results.hasOwnProperty('@odata.nextLink')) {\r\n return this.http.get(results['@odata.nextLink']);\r\n } else {\r\n return EMPTY;\r\n }\r\n }),\r\n toArray(),\r\n map(results => {\r\n console.log(`fetched All groups result: `);\r\n let allGroups = new Array();\r\n results.forEach(result => {\r\n allGroups = allGroups.concat(result.value as Array);\r\n });\r\n return allGroups;\r\n }),\r\n tap(response => {\r\n this.useCache && this.cache.set(this.cacheKeyAllGroups, response as Array);\r\n }),\r\n shareReplay({ bufferSize: 1, refCount: true }));\r\n\r\n if (this.useCache) {\r\n const cachedData = this.cache.get>(this.cacheKeyAllGroups);\r\n if (cachedData) {\r\n return concat(of(cachedData), this.getAllGroups$);\r\n }\r\n }\r\n return this.getAllGroups$;\r\n }\r\n }\r\n\r\n getAllMyOwnedGroups(doNotIncludeSecurityGroups?: boolean): Observable> {\r\n if (this.getAllOwnedGroups$) {\r\n return this.getAllOwnedGroups$;\r\n } else {\r\n const httpParams = new HttpParams({ encoder: new CustomEncoder() })\r\n .append('$select', `id,displayname,description,resourceProvisioningOptions,creationOptions,visibility,groupTypes,mailNickname`)\r\n .append('$top', `500`);\r\n\r\n this.getAllOwnedGroups$ = this.http.get(`${Constants.GRAPH_API_ENDPOINT}${Constants.GRAPH_API_VERSION_ONE}/me/ownedObjects/$/microsoft.graph.group`, { params: httpParams })\r\n .pipe(\r\n expand((results) => {\r\n if (results.hasOwnProperty('@odata.nextLink')) {\r\n return this.http.get(results['@odata.nextLink']);\r\n } else {\r\n return EMPTY;\r\n }\r\n }),\r\n toArray(),\r\n map(results => {\r\n console.log(`fetched owned groups result: ` + results);\r\n let ownedGroups = new Array();\r\n results.forEach(result => {\r\n const groups = doNotIncludeSecurityGroups ? (result.value as Array).filter(g => g.groupTypes.indexOf('Unified') > -1) : (result.value as Array);\r\n ownedGroups = ownedGroups.concat(groups);\r\n });\r\n return ownedGroups;\r\n }),\r\n tap(response => {\r\n this.useCache && this.cache.set(this.cacheKeyAllOwnedGroups, response);\r\n }),\r\n shareReplay({ bufferSize: 1, refCount: true }));\r\n\r\n if (this.useCache) {\r\n const cachedData = this.cache.get>(this.cacheKeyAllOwnedGroups);\r\n if (cachedData) {\r\n return concat(of(cachedData), this.getAllOwnedGroups$);\r\n }\r\n }\r\n return this.getAllOwnedGroups$;\r\n }\r\n }\r\n\r\n getAllMyMemberGroups(doNotIncludeSecurityGroups?: boolean): Observable> {\r\n if (this.getAllMemberGroups$) {\r\n return this.getAllMemberGroups$;\r\n } else {\r\n const httpParams = new HttpParams({ encoder: new CustomEncoder() })\r\n .append('$select', `id,displayname,description,resourceProvisioningOptions,creationOptions,visibility,groupTypes,mailNickname`)\r\n .append('$top', `500`);\r\n\r\n this.getAllMemberGroups$ = this.http.get(`${Constants.GRAPH_API_ENDPOINT}${Constants.GRAPH_API_VERSION_ONE}/me/memberOf/$/microsoft.graph.group`, { params: httpParams })\r\n .pipe(\r\n expand((results) => {\r\n if (results.hasOwnProperty('@odata.nextLink')) {\r\n return this.http.get(results['@odata.nextLink']);\r\n } else {\r\n return EMPTY;\r\n }\r\n }),\r\n toArray(),\r\n map(results => {\r\n console.log(`fetched member groups result: `, results);\r\n let memberGroups = new Array();\r\n results.forEach(result => {\r\n const groups = doNotIncludeSecurityGroups ? (result.value as Array).filter(g => g.groupTypes.indexOf('Unified') > -1) : (result.value as Array);\r\n memberGroups = memberGroups.concat(groups);\r\n });\r\n return memberGroups;\r\n }),\r\n tap(response => {\r\n this.useCache && this.cache.set(this.cacheKeyMemberGroups, response, endOfDay(new Date()));\r\n }),\r\n shareReplay({ bufferSize: 1, refCount: true }));\r\n\r\n if (this.useCache) {\r\n const cachedData = this.cache.get>(this.cacheKeyMemberGroups);\r\n if (cachedData) {\r\n return concat(of(cachedData), this.getAllMemberGroups$);\r\n }\r\n }\r\n return this.getAllMemberGroups$;\r\n }\r\n }\r\n\r\n getGroupsWithFilter(top: number, filter: string): Observable> {\r\n // HACK: the normal angular encoder does not work with this graph api.\r\n\r\n filter = filter.replace(/&/, '%26').replace(/'/, '\\'\\''); // escape & and '\r\n const httpParams = new HttpParams({ encoder: new CustomEncoder() })\r\n .append('$filter', `groupTypes/any(c:c eq 'Unified') and startswith(displayName, '${filter}')`)\r\n .append('$top', top.toString());\r\n\r\n const fetchOperation = this.http.get(`${Constants.GRAPH_API_ENDPOINT + Constants.GRAPH_API_VERSION_ONE}/groups`, { params: httpParams })\r\n .pipe(map(result => {\r\n console.log(`fetched groups result: `, result.value);\r\n console.log(result.value);\r\n return result.value as Array;\r\n }),\r\n tap(data => {\r\n this.useCache && this.cache.set(this.cacheKeyGroupsWithFilter, data);\r\n }),\r\n catchError(this.httpHelper.handleError({ operation: 'getGroupsWithFilter', result: new Array() })));\r\n\r\n if (this.useCache) {\r\n const cachedData = this.cache.get>(this.cacheKeyGroupsWithFilter);\r\n if (cachedData) {\r\n return concat(of(cachedData), fetchOperation);\r\n }\r\n }\r\n return fetchOperation;\r\n }\r\n\r\n // Return all the groups that the user is a member of. The check is transitive, unlike reading the memberOf navigation property, which returns only the groups that the user is a direct member of.\r\n getAllMyTransitiveMemeberGroups(): Observable> {\r\n const fetchOperation = this.http.post(`${Constants.GRAPH_API_ENDPOINT + Constants.GRAPH_API_VERSION_ONE}/me/getMemberGroups`, { securityEnabledOnly: false })\r\n .pipe(map(result => {\r\n console.log(`fetched transitive group result: `, (result.value).length);\r\n return result.value as Array;\r\n }),\r\n tap(data => {\r\n this.useCache && this.cache.set(this.cacheKeyAllMyTransitiveMemberGroups, data);\r\n }),\r\n catchError(this.httpHelper.handleError({ operation: 'getAllMyTransitiveMemeberGroups', result: new Array() })));\r\n\r\n if (this.useCache) {\r\n const cachedData = this.cache.get>(this.cacheKeyAllMyTransitiveMemberGroups);\r\n if (cachedData) {\r\n return concat(of(cachedData), fetchOperation);\r\n }\r\n }\r\n return fetchOperation;\r\n }\r\n}\r\n","import { CommonModule } from '@angular/common';\r\nimport { Component, Inject, NgModule } from '@angular/core';\r\nimport { MatSnackBarModule, MAT_SNACK_BAR_DATA } from '@angular/material/snack-bar';\r\nimport { ErrorTemplatesModule } from '@app/components/error-templates/error-templates.component';\r\n\r\n@Component({\r\n selector: 'app-alert-templates',\r\n templateUrl: './alert-templates.component.html',\r\n styleUrls: ['./alert-templates.component.scss']\r\n})\r\nexport class AlertTemplatesComponent {\r\n\r\n public static readonly interestssyncing = 'interestssyncing';\r\n public static readonly interestsselectionupdated = 'interestsselectionupdated';\r\n public static readonly languageselectionupdated = 'languageselectionupdated';\r\n public static readonly interestsselectionsynced = 'interestsselectionsynced';\r\n public static readonly updatedorder = 'updatedorder';\r\n public static readonly newssettingsupdated = 'newssettingsupdated';\r\n public static readonly tabconfigupdated = 'tabconfigupdated';\r\n public static readonly channelcachecleared = 'channelcachecleared';\r\n public static readonly operationcompleted = 'operationcompleted';\r\n public static readonly updatedsetting = 'updatedsetting';\r\n public static readonly genericupdated = 'genericupdated';\r\n public static readonly genericadded = 'genericadded';\r\n public static readonly genericdeleted = 'genericdeleted';\r\n public static readonly unlicensed = 'unlicensed';\r\n public static readonly offline = 'offline';\r\n componentName = '';\r\n errorCode: number ;\r\n\r\n constructor(@Inject(MAT_SNACK_BAR_DATA) public data: any) { }\r\n\r\n isNumber(val) {\r\n const errorInfo = val.split(';');\r\n if (errorInfo.length > 1 ) {\r\n this.errorCode = +errorInfo[0];\r\n this.componentName = errorInfo[1];\r\n } else {\r\n this.errorCode = errorInfo;\r\n }\r\n return typeof this.errorCode === 'number';\r\n }\r\n\r\n}\r\n@NgModule({\r\n declarations: [AlertTemplatesComponent],\r\n entryComponents: [AlertTemplatesComponent],\r\n imports: [\r\n CommonModule,\r\n ErrorTemplatesModule,\r\n MatSnackBarModule\r\n ]\r\n})\r\nexport class AlertTemplatesModule { }\r\n","\r\n \r\n\r\n
    Syncronizing...
    \r\n\r\n
    Your interests has been updated
    \r\n\r\n
    Your interests has been syncronized with your profile
    \r\n\r\n
    Your languages has been updated
    \r\n\r\n
    Sorting has been updated
    \r\n\r\n
    News settings has been updated
    \r\n\r\n
    Your board settings has been updated
    \r\n\r\n
    Channel cache was cleared
    \r\n\r\n
    Operation was completed
    \r\n\r\n
    Updated setting
    \r\n\r\n
    Updated!
    \r\n\r\n
    Added!
    \r\n\r\n
    Deleted!
    \r\n\r\n
    No internet - Only locally saved data available
    \r\n\r\n
    You are not licensed to view the requested page
    \r\n\r\n
    {{data}}
    \r\n
    \r\n\r\n
    \r\n\r\n\r\n
    \r\n \r\n
    \r\n
    \r\n\r\n\r\n\r\n \r\n Click to Sign in\r\n You can skip this step by allowing popups for this site in your browser (see below).\r\n\r\n","import { HttpClient, HttpParams } from '@angular/common/http';\r\nimport { Injectable } from '@angular/core';\r\nimport { Constants } from '@app/common/constants';\r\nimport { HttpHelper } from '@app/common/http-helper';\r\nimport { CacheService } from '@app/services/cache.service';\r\nimport { SharedInsight, Trending, UsedInsight } from '@microsoft/microsoft-graph-types-beta';\r\nimport { concat, Observable, of } from 'rxjs';\r\nimport { catchError, map, tap } from 'rxjs/operators';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class MyDocumentsService {\r\n\r\n constructor(private http: HttpClient, private cache: CacheService, private httpHelper: HttpHelper) { }\r\n\r\n private readonly cacheKeyPrefix = 'MyDocumentsService';\r\n\r\n public useCache = true;\r\n\r\n getMyRecentDocuments(top: number): Observable> {\r\n const httpParamsMyRecentDocuments = new HttpParams()\r\n .append('$top', top.toString())\r\n .append('$orderby', 'lastUsed/lastAccessedDateTime desc')\r\n .append('$filter', 'resourceVisualization/type ne \\'spsite\\' AND resourceVisualization/type ne \\'Web\\'');\r\n\r\n const cacheKey = `${this.cacheKeyPrefix}-getMyRecentDocuments-${top ? top.toString() : ''}`;\r\n\r\n const fetchOperation = this.http.get(`${Constants.GRAPH_API_ENDPOINT + Constants.GRAPH_API_VERSION_ONE}/me/insights/used`,\r\n { params: httpParamsMyRecentDocuments })\r\n .pipe(\r\n map(response => {\r\n console.log(`fetched result: my recent documents: `, response);\r\n return response.value as Array;\r\n }),\r\n tap(data => {\r\n this.useCache && this.cache.set(cacheKey, data);\r\n }),\r\n catchError(this.httpHelper.handleError({ operation: 'getMyRecentDocuments', result: new Array(), cacheKey: cacheKey })));\r\n\r\n if (this.useCache) {\r\n const cachedData = this.cache.get>(cacheKey);\r\n if (cachedData) {\r\n return concat(of(cachedData), fetchOperation);\r\n }\r\n }\r\n return fetchOperation;\r\n }\r\n\r\n getMyTrendingDocuments(top: number): Observable> {\r\n const httpParams = new HttpParams()\r\n .append('$top', top.toString())\r\n .append('$filter', 'resourceVisualization/type ne \\'spsite\\' AND resourceVisualization/type ne \\'Web\\'');\r\n\r\n const cacheKey = `${this.cacheKeyPrefix}-getMyTrendingDocuments-${top ? top.toString() : ''}`;\r\n\r\n const fetchOperation = this.http.get(`${Constants.GRAPH_API_ENDPOINT + Constants.GRAPH_API_VERSION_ONE}/me/insights/trending`,\r\n { params: httpParams })\r\n .pipe(\r\n map(response => {\r\n console.log(`fetched result: my trending documents: `);\r\n console.log(response);\r\n return response.value as Array;\r\n }),\r\n tap(data => {\r\n this.useCache && this.cache.set(cacheKey, data);\r\n }),\r\n catchError(this.httpHelper.handleError({ operation: 'getMyTrendingDocuments', result: new Array(), cacheKey: cacheKey })));\r\n\r\n if (this.useCache) {\r\n const cachedData = this.cache.get>(cacheKey);\r\n if (cachedData) {\r\n return concat(of(cachedData), fetchOperation);\r\n }\r\n }\r\n return fetchOperation;\r\n }\r\n\r\n getMySharedDocuments(top: number): Observable> {\r\n const httpParams = new HttpParams()\r\n .append('$top', top.toString())\r\n .append('$filter', 'resourceVisualization/type ne \\'spsite\\' AND resourceVisualization/type ne \\'Web\\'');\r\n\r\n const cacheKey = `${this.cacheKeyPrefix}-getMySharedDocuments-${top ? top.toString() : ''}`;\r\n\r\n const fetchOperation = this.http.get(`${Constants.GRAPH_API_ENDPOINT + Constants.GRAPH_API_VERSION_ONE}/me/insights/shared`,\r\n { params: httpParams })\r\n .pipe(\r\n map(response => {\r\n console.log(`fetched result: my shared documents: `);\r\n console.log(response);\r\n return response.value as Array;\r\n }),\r\n tap(data => {\r\n this.useCache && this.cache.set(cacheKey, data);\r\n }),\r\n catchError(this.httpHelper.handleError({ operation: 'getMySharedDocuments', result: new Array(), cacheKey: cacheKey })));\r\n\r\n if (this.useCache) {\r\n const cachedData = this.cache.get>(cacheKey);\r\n if (cachedData) {\r\n return concat(of(cachedData), fetchOperation);\r\n }\r\n }\r\n return fetchOperation;\r\n }\r\n}\r\n","import { Injector, StaticProvider } from '@angular/core';\r\nimport { PORTAL_DATA } from '@app/common/app-tokens';\r\n\r\nexport class PortalInjectorFactory {\r\n\r\n public static create(injector: Injector, dataToPass: any): Injector {\r\n const providers: StaticProvider[] = [\r\n { provide: PORTAL_DATA, useValue: dataToPass }\r\n ];\r\n return Injector.create({ parent: injector, providers: providers });\r\n }\r\n\r\n}\r\n","import { FeedInfo } from '@app/models/feed-source-info';\r\n\r\nexport interface RssFeeds {\r\n feedLinksAndTagName: Array;\r\n\r\n amountToShowPerLoad: RssFeedAmount;\r\n}\r\n\r\nexport enum RssFeedAmount {\r\n Small = 0,\r\n Medium = 1\r\n}\r\n","import { HttpClient, HttpHeaders, HttpParams } from '@angular/common/http';\r\nimport { Inject, Injectable } from '@angular/core';\r\nimport { CUSTOMERENVIRONMENT } from '@app/common/app-tokens';\r\nimport { Constants } from '@app/common/constants';\r\nimport { HttpHelper } from '@app/common/http-helper';\r\nimport { NewsModePersonalNews } from '@app/common/news-mode';\r\nimport { PageQuery } from '@app/common/page-query';\r\nimport { PageType } from '@app/models/page';\r\nimport { SearchPostQuery } from '@app/models/search-post-query';\r\nimport { SearchResult } from '@app/models/search-result';\r\nimport { SearchSuggestion } from '@app/models/search-suggestion';\r\nimport { SharePointJsonSearchResult } from '@app/models/sharepoint-json-search-result';\r\nimport { CacheService } from '@app/services/cache.service';\r\nimport { FeatureSettingsStoreService } from '@app/services/feature-settings-store.service';\r\nimport { Environment } from '@environments/interface.environment';\r\nimport { addMinutes, parseISO } from 'date-fns';\r\nimport { defer, EMPTY, iif, Observable, of } from 'rxjs';\r\nimport { catchError, expand, map, shareReplay, switchMap, tap, toArray } from 'rxjs/operators';\r\nimport { LicenseService } from './license.service';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class SearchService {\r\n\r\n constructor(private http: HttpClient,\r\n @Inject(CUSTOMERENVIRONMENT) private environment: Environment,\r\n private featureSettingsStoreService: FeatureSettingsStoreService,\r\n private httpHelper: HttpHelper,\r\n private cache: CacheService,\r\n private licenseService: LicenseService) { }\r\n\r\n public readonly getAllSiteCollectionsCacheKey = 'SearchService-getAllSiteCollections';\r\n public readonly getAllHubConnectedContentPagesCacheKey = 'SearchService-getAllHubConnectedContentPages';\r\n public readonly getAllModernNewsPagesCacheKey = 'SearchService-getAllModernNewsPages';\r\n\r\n public useCache = true;\r\n private getAllSiteCollections$: Observable>;\r\n private getAllHubConnectedContentPages$ = new Map>>();\r\n private getAllModernNewsPages$: Observable>;\r\n private disableLocalStorage = this.featureSettingsStoreService.state.disableLocalStorage ? this.featureSettingsStoreService.state.disableLocalStorage : false;\r\n\r\n getSuggestions(query: string, sourceId: string = '8413cd39-2156-4e00-b54d-11efd9abdb89', amountOfSuggestions: number = 5): Observable {\r\n const httpParams = new HttpParams()\r\n .append('querytext', `'${this.escapeQueryTextForSharePoint(query)}'`)\r\n .append('showpeoplenamesuggestions', `true`)\r\n .append('fprequerysuggestions', `true`)\r\n .append('enablestemming', `true`)\r\n .append('fprefixmatchallterms', `false`)\r\n .append('clienttype', `'custom'`)\r\n .append('fhithighlighting', `false`)\r\n .append('sourceid', `'${sourceId}'`)\r\n .append('inumberofquerysuggestions', `${amountOfSuggestions}`)\r\n .append('inumberofresultsuggestions', `${amountOfSuggestions}`)\r\n .append('inumberofpopularresultsuggestions', `${amountOfSuggestions}`)\r\n .append('fcapitalizefirstletters', `true`);\r\n return this.http.get(`${this.environment.coreWorkplaceSiteUrl}/_api/search/suggest`, { params: httpParams });\r\n }\r\n\r\n recordPageClick(searchResult: SearchResult) {\r\n\r\n const httpParams = new HttpParams()\r\n .append('pageInfo', `'${searchResult.piPageImpression}'`)\r\n .append('clickType', `'Result'`)\r\n .append('blockType', `${searchResult.piPageImpressionBlockType}`)\r\n .append('clickedResultId', `'${searchResult.piSearchResultId}'`)\r\n .append('subResultIndex', `${0}`)\r\n .append('immediacySourceId', `'${searchResult.SourceId}'`)\r\n .append('immediacyQueryString', `'${searchResult.SearchTerm}'`)\r\n .append('immediacyTitle', `'${searchResult.Title || searchResult.PreferredName}'`)\r\n .append('immediacyUrl', `'${searchResult.Path}'`);\r\n\r\n return this.http.get(`${this.environment.coreWorkplaceSiteUrl}/_api/search/recordpageclick`, { params: httpParams });\r\n }\r\n\r\n getPeopleWithBirthdayDate(dateToQuery, rowLimit): Observable> {\r\n\r\n // Set birthday filter to today\r\n const refinementFilters = `'${this.featureSettingsStoreService.state.managedPropertyConfig.birthDayDateManagedProperty}:${dateToQuery}'`;\r\n const birthdaysQuery = '*';\r\n const birthdayOtherParams = new Map();\r\n\r\n birthdayOtherParams.set('sourceid', `'` + this.featureSettingsStoreService.state.peopleResultSourceId + `'`); // local people results\r\n birthdayOtherParams.set('selectproperties', `'AccountName,FirstName,LastName,PreferredName,JobTitle,Department,Path,WorkEmail,PictureURL,${this.featureSettingsStoreService.state.managedPropertyConfig.birthDayDateManagedProperty}'`);\r\n birthdayOtherParams.set('refinementfilters', refinementFilters);\r\n birthdayOtherParams.set('sortlist', `'FirstName:ascending'`);\r\n\r\n return this.executeSearch(birthdaysQuery, rowLimit, false, birthdayOtherParams);\r\n }\r\n\r\n /** Generic search functionality */\r\n getResults(query: string, rowLimit?: number, includeOneDriveFiles?: boolean, selectProperties?: string[]): Observable> {\r\n const otherParams = new Map();\r\n if (selectProperties) {\r\n otherParams.set('selectproperties', `'${selectProperties.join(',')}'`);\r\n }\r\n return this.executeSearch(this.escapeQueryTextForSharePoint(query), rowLimit, includeOneDriveFiles, otherParams);\r\n }\r\n\r\n /** Search for people */\r\n getPeople(query: string, rowLimit?: number): Observable> {\r\n const otherParams = new Map();\r\n otherParams.set('sourceid', `'` + this.featureSettingsStoreService.state.peopleResultSourceId + `'`);\r\n // In case we use a custom result source the properties have to be explicitly requested\r\n otherParams.set('selectproperties', `'AccountName,FirstName,LastName,PreferredName,JobTitle,Department,Path,WorkEmail,PictureURL,${this.featureSettingsStoreService.state.managedPropertyConfig.birthDayDateManagedProperty}'`);\r\n return this.executeSearch(this.escapeQueryTextForSharePoint(query), rowLimit, false, otherParams);\r\n }\r\n\r\n /** Search for documents */\r\n getDocuments(query: string, fileTypes?: string[], rowLimit?: number, includeOneDriveFiles?: boolean, selectProperties?: string[], hubSiteId?: string, includeNewsSiteContentIfHubSiteQuery?: boolean): Observable> {\r\n\r\n let hubSiteQuery = '';\r\n if (hubSiteId) {\r\n if (includeNewsSiteContentIfHubSiteQuery === true) {\r\n hubSiteQuery = ` AND ( DepartmentId:{${hubSiteId}} OR Path:${this.featureSettingsStoreService.state.newsCenterSiteUrl}) `;\r\n } else {\r\n hubSiteQuery = ` AND DepartmentId:{${hubSiteId}} `;\r\n }\r\n }\r\n\r\n const documentsQuery = this.escapeQueryTextForSharePoint(query) + hubSiteQuery + ' AND isDocument=true';\r\n const otherParams = new Map();\r\n if (selectProperties) {\r\n selectProperties.push('contentclass');\r\n otherParams.set('selectproperties', `'${selectProperties.join(',')}'`);\r\n }\r\n otherParams.set('refinementfilters', `'or(ProgID:OneNote.Notebook,fileExtension:or(${fileTypes.join(', ')}))'`);\r\n return this.executeSearch(documentsQuery, rowLimit, includeOneDriveFiles, otherParams, true, true);\r\n }\r\n\r\n /** Search for documents */\r\n getGuideDocuments(query: string, fileTypes?: string[], rowLimit?: number, selectProperties?: string[]): Observable> {\r\n const documentsQuery = this.escapeQueryTextForSharePoint(query) + ` AND Path:${this.featureSettingsStoreService.state.guideSiteUrl}`;\r\n const otherParams = new Map();\r\n if (selectProperties) {\r\n otherParams.set('selectproperties', `'${selectProperties.join(',')}'`);\r\n }\r\n otherParams.set('refinementfilters', `'or(ProgID:OneNote.Notebook,fileExtension:or(${fileTypes.join(', ')}))'`);\r\n return this.executeSearch(documentsQuery, rowLimit, false, otherParams, true);\r\n }\r\n\r\n /** Search for pages */\r\n getGuidePages(query: string, rowLimit?: number, includeOneDriveFiles?: boolean, selectProperties?: string[]): Observable> {\r\n\r\n const pagesQuery = this.escapeQueryTextForSharePoint(query)\r\n + ` AND contentclass:STS_ListItem_WebPageLibrary AND Path:${this.featureSettingsStoreService.state.guideSiteUrl} AND ((ContentTypeId:0x0101009D1CB255DA76424F860D91F20E6C4118* AND PromotedState:0) OR (ContentTypeId:0x010100C568DB52D9D0A14D9B2FDCC96666E9F2007948130EC3DB064584E219954237AF39*))`;\r\n\r\n const otherParams = new Map();\r\n if (selectProperties) {\r\n if (this.featureSettingsStoreService.state.showDescriptionInSearchResult) {\r\n selectProperties.push('Description');\r\n }\r\n otherParams.set('selectproperties', `'${selectProperties.join(',')}'`);\r\n }\r\n return this.executeSearch(pagesQuery, rowLimit, includeOneDriveFiles, otherParams);\r\n }\r\n\r\n /** Search for site collections */\r\n getSites(query: string, rowlimit?: number): Observable> {\r\n const sitesQuery = this.escapeQueryTextForSharePoint(query) + ' AND contentclass:sts_site';\r\n return this.executeSearch(sitesQuery, rowlimit, false);\r\n }\r\n\r\n /** Get all sites connected to a hub site */\r\n getHubSiteSites(hubSiteId: string, rowlimit?: number): Observable> {\r\n const sitesQuery = `contentclass:sts_site AND DepartmentId={${hubSiteId}}`;\r\n return this.executeSearch(sitesQuery, rowlimit, false);\r\n }\r\n\r\n /** Search for all pages connected to the hubsite */\r\n getAllHubConnectedContentPages(hubSiteId: string): Observable> {\r\n const cacheKey = `${this.getAllHubConnectedContentPagesCacheKey}-getAllHubConnectedContentPages-${hubSiteId}`;\r\n\r\n if (this.getAllHubConnectedContentPages$.has(cacheKey)) {\r\n return this.getAllHubConnectedContentPages$.get(cacheKey);\r\n } else {\r\n const sitesQuery = `PromotedState=0 AND DepartmentId={${hubSiteId}}`;\r\n const otherParams = new Map();\r\n otherParams.set('selectproperties', `'Title,Path,Created,LastModifiedTime,SiteName,SiteTitle,${this.environment.featureSettings.managedPropertyConfig.newsLanguageManagedProperty}'`);\r\n this.getAllHubConnectedContentPages$.set(cacheKey, this.executeRecursiveSPSearch(sitesQuery, 500, 0, otherParams, false)\r\n .pipe(\r\n tap(data => {\r\n // Cache for 15 min and then return only return the cached value if available since this is an expensive request\r\n this.useCache && !this.disableLocalStorage && this.cache.set(cacheKey, data, addMinutes(new Date(), 15));\r\n }),\r\n shareReplay({ bufferSize: 1, refCount: true })\r\n ));\r\n\r\n if (this.useCache) {\r\n const cachedData = this.cache.get>(this.getAllHubConnectedContentPagesCacheKey);\r\n if (cachedData) {\r\n return of(cachedData);\r\n }\r\n }\r\n return this.getAllHubConnectedContentPages$.get(cacheKey);\r\n }\r\n }\r\n\r\n /** Search for all modern newspages connected to the newscenter site if NewsModePersonalNews.GraphFromNewsCenterSite is set, otherwise all */\r\n getAllModernNewsPagesFromNewsCenter(): Observable> {\r\n if (this.getAllModernNewsPages$) {\r\n return this.getAllModernNewsPages$;\r\n } else {\r\n let sitesQuery = `ContentTypeId:0x0101009D1CB255DA76424F860D91F20E6C4118* AND PromotedState=2`;\r\n if (this.featureSettingsStoreService.state.newsModePersonalNews === NewsModePersonalNews.GraphFromNewsCenterSite) {\r\n sitesQuery += ` AND (SiteName:${this.featureSettingsStoreService.state.newsCenterSiteUrl})`;\r\n }\r\n const otherParams = new Map();\r\n otherParams.set('selectproperties', `'Title,Path,Created,LastModifiedTime,FirstPublishedDate,SiteName,SiteTitle,${this.environment.featureSettings.managedPropertyConfig.newsLanguageManagedProperty}'`);\r\n this.getAllModernNewsPages$ = this.executeRecursiveSPSearch(sitesQuery, 500, 0, otherParams, false).pipe(\r\n tap(data => {\r\n // Cache for 15 min and then return only return the cached value if available since this is an expensive request\r\n this.useCache && !this.disableLocalStorage && this.cache.set(this.getAllModernNewsPagesCacheKey, data, addMinutes(new Date(), 15));\r\n }),\r\n shareReplay({ bufferSize: 1, refCount: true }));\r\n\r\n if (this.useCache) {\r\n const cachedData = this.cache.get>(this.getAllModernNewsPagesCacheKey);\r\n if (cachedData) {\r\n return of(cachedData);\r\n }\r\n }\r\n return this.getAllModernNewsPages$;\r\n }\r\n }\r\n\r\n /** Fetch all site collections */\r\n getAllSiteCollections(): Observable> {\r\n if (this.getAllSiteCollections$) {\r\n return this.getAllSiteCollections$;\r\n } else {\r\n const sitesQuery = '-WebTemplate:SPSPERS -SiteId:null -WebId:null contentclass=STS_Site';\r\n const otherParams = new Map();\r\n otherParams.set('selectproperties', `'Title,Path,GroupId'`);\r\n\r\n this.getAllSiteCollections$ = this.executeRecursiveSPSearch(sitesQuery, 500, 0, otherParams, false)\r\n .pipe(\r\n tap(data => {\r\n // Cache for 15 min and then return only return the cached value if available since this is an expensive request\r\n this.useCache && this.cache.set(this.getAllSiteCollectionsCacheKey, data, addMinutes(new Date(), 15));\r\n }),\r\n shareReplay({ bufferSize: 1, refCount: true }));\r\n\r\n if (this.useCache) {\r\n const cachedData = this.cache.get>(this.getAllSiteCollectionsCacheKey);\r\n if (cachedData) {\r\n return of(cachedData);\r\n }\r\n }\r\n return this.getAllSiteCollections$;\r\n }\r\n }\r\n\r\n /** Search for modern news */\r\n getModernNewsPages(query: string, rowLimit?: number, includeOneDriveFiles?: boolean, selectProperties?: string[], hubSiteId?: string, includeNewsSiteContentIfHubSiteQuery?: boolean): Observable> {\r\n\r\n let hubSiteQuery = '';\r\n if (hubSiteId) {\r\n if (includeNewsSiteContentIfHubSiteQuery === true) {\r\n hubSiteQuery = ` AND ( DepartmentId:{${hubSiteId}} OR Path:${this.featureSettingsStoreService.state.newsCenterSiteUrl}) `;\r\n } else {\r\n hubSiteQuery = ` AND DepartmentId:{${hubSiteId}} `;\r\n }\r\n }\r\n\r\n const newsQuery = this.escapeQueryTextForSharePoint(query)\r\n + ' AND contentclass:STS_ListItem_WebPageLibrary AND ContentTypeId:0x0101009D1CB255DA76424F860D91F20E6C4118* AND PromotedState:2'\r\n + hubSiteQuery;\r\n\r\n const otherParams = new Map();\r\n if (selectProperties) {\r\n if (this.featureSettingsStoreService.state.showDescriptionInSearchResult) {\r\n selectProperties.push('Description');\r\n }\r\n selectProperties.push('contentclass');\r\n otherParams.set('selectproperties', `'${selectProperties.join(',')}'`);\r\n }\r\n\r\n otherParams.set('hithighlightedproperties', `'Title'`);\r\n\r\n return this.executeSearch(newsQuery, rowLimit, includeOneDriveFiles, otherParams, true, true);\r\n }\r\n\r\n /** Search for pages */\r\n getPages(query: string, rowLimit?: number, includeOneDriveFiles?: boolean, selectProperties?: string[], hubSiteId?: string, includeNewsSiteContentIfHubSiteQuery?: boolean): Observable> {\r\n\r\n let hubSiteQuery = '';\r\n if (hubSiteId) {\r\n if (includeNewsSiteContentIfHubSiteQuery === true) {\r\n hubSiteQuery = ` AND ( DepartmentId:{${hubSiteId}} OR Path:${this.featureSettingsStoreService.state.newsCenterSiteUrl}) `;\r\n } else {\r\n hubSiteQuery = ` AND DepartmentId:{${hubSiteId}} `;\r\n }\r\n }\r\n\r\n const pagesQuery = this.escapeQueryTextForSharePoint(query)\r\n + ' AND contentclass:STS_ListItem_WebPageLibrary AND ((ContentTypeId:0x0101009D1CB255DA76424F860D91F20E6C4118* AND PromotedState:0) OR (ContentTypeId:0x010100C568DB52D9D0A14D9B2FDCC96666E9F2007948130EC3DB064584E219954237AF39*))'\r\n + hubSiteQuery;\r\n const otherParams = new Map();\r\n if (selectProperties) {\r\n if (this.featureSettingsStoreService.state.showDescriptionInSearchResult) {\r\n selectProperties.push('Description');\r\n }\r\n selectProperties.push('contentclass');\r\n otherParams.set('selectproperties', `'${selectProperties.join(',')}'`);\r\n }\r\n return this.executeSearch(pagesQuery, rowLimit, includeOneDriveFiles, otherParams, true, true);\r\n }\r\n\r\n /** Finds pages matching the PageQuery */\r\n getModernPagesByPageQuery(query: PageQuery) {\r\n let queryText = query.FindText ? '\"' + this.escapeQueryTextForSharePoint(query.FindText) + '*\"' + ' AND ' : '';\r\n queryText += `contentclass:STS_ListItem_WebPageLibrary AND ContentTypeId:0x0101009D1CB255DA76424F860D91F20E6C4118*` + ' AND ' + `PromotedState=${query.PageType === PageType.News ? 2 : 0}`;\r\n if (query.PageType === PageType.News && this.featureSettingsStoreService.state.newsModePersonalNews === NewsModePersonalNews.GraphFromNewsCenterSite) {\r\n queryText += ' AND ' + `Path:${this.featureSettingsStoreService.state.newsCenterSiteUrl}`;\r\n }\r\n if (query.StartDate) {\r\n queryText += ' AND ' + (query.PageType === PageType.News ? `FirstPublishedDate>=${query.StartDate.toISOString()}` : `Created>=${query.StartDate.toISOString()}`);\r\n }\r\n if (query.EndDate) {\r\n queryText += ' AND ' + (query.PageType === PageType.News ? `FirstPublishedDate<=${query.EndDate.toISOString()}` : `Created<=${query.EndDate.toISOString()}`);\r\n }\r\n if (query.Featured) {\r\n queryText += ' AND ' + `${this.environment.featureSettings.managedPropertyConfig.newsIsTopNewsManagedProperty}:1`;\r\n }\r\n if (query.OwnerOrEditorUpnId) {\r\n queryText += ' AND ' + `(ModifiedById:${query.OwnerOrEditorUpnId}* OR AuthorOWSUSER:${query.OwnerOrEditorUpnId}*)`;\r\n }\r\n if (query.hubSiteId) {\r\n queryText += ' AND ' + `DepartmentId:{${query.hubSiteId}}`;\r\n }\r\n const otherParams = new Map();\r\n otherParams.set('selectproperties', `'Title,EditorOwsUser,Description,Path,PictureThumbnailURL,Created,FirstPublishedDate,LastModifiedTime,ModifiedById,AuthorOWSUSER,${this.environment.featureSettings.managedPropertyConfig.newsChannelManagedProperty},${this.environment.featureSettings.managedPropertyConfig.newsLanguageManagedProperty},${this.environment.featureSettings.managedPropertyConfig.newsIsTopNewsManagedProperty},${this.environment.featureSettings.managedPropertyConfig.newsSenderTagsManagedProperty}'`);\r\n return this.executeRecursiveSPSearch(queryText, 500, 0, otherParams, false).pipe(\r\n shareReplay({ bufferSize: 1, refCount: true }));\r\n }\r\n\r\n /** Search for other (not pages, news, documents or people) */\r\n getOther(query: string, rowLimit?: number, fileTypesToExclude?: string[], includeOneDriveFiles?: boolean, selectProperties?: string[], hubSiteId?: string, includeNewsSiteContentIfHubSiteQuery?: boolean): Observable> {\r\n\r\n let hubSiteQuery = '';\r\n if (hubSiteId) {\r\n if (includeNewsSiteContentIfHubSiteQuery === true) {\r\n hubSiteQuery = ` AND ( DepartmentId:{${hubSiteId}} OR Path:${this.featureSettingsStoreService.state.newsCenterSiteUrl}) `;\r\n } else {\r\n hubSiteQuery = ` AND DepartmentId:{${hubSiteId}} `;\r\n }\r\n }\r\n\r\n const pagesQuery = this.escapeQueryTextForSharePoint(query)\r\n + ' AND (NOT ((contentclass:STS_List AND ContentTypeId:0x0101009D1CB255DA76424F860D91F20E6C4118*) OR (ContentTypeId:0x010100C568DB52D9D0A14D9B2FDCC96666E9F2007948130EC3DB064584E219954237AF39*) OR (ProgID:OneNote.Notebook) OR (FileType:onetoc2)))'\r\n + hubSiteQuery;\r\n\r\n const otherParams = new Map();\r\n if (fileTypesToExclude && fileTypesToExclude.length > 0) {\r\n\r\n const multipleFileTypes = fileTypesToExclude.length > 1 ? 'and' : '';\r\n otherParams.set('refinementfilters', `'${multipleFileTypes}(${fileTypesToExclude.map(fileType => `fileExtension: not(${fileType})`)})'`);\r\n }\r\n\r\n if (selectProperties) {\r\n otherParams.set('selectproperties', `'${selectProperties.join(',')}'`);\r\n }\r\n\r\n return this.executeSearch(pagesQuery, rowLimit, includeOneDriveFiles, otherParams);\r\n }\r\n\r\n getPromotedResults(query: string, rowLimit: number, hubSiteId?: string, includeNewsSiteContentIfHubSiteQuery?: boolean): Observable> {\r\n\r\n let hubSiteQuery = '';\r\n if (hubSiteId) {\r\n if (includeNewsSiteContentIfHubSiteQuery === true) {\r\n hubSiteQuery = ` AND ( DepartmentId:{${hubSiteId}} OR Path:${this.featureSettingsStoreService.state.newsCenterSiteUrl}) `;\r\n } else {\r\n hubSiteQuery = ` AND DepartmentId:{${hubSiteId}} `;\r\n }\r\n }\r\n\r\n const promotedQuery = this.escapeQueryTextForSharePoint(query) + hubSiteQuery;\r\n let httpParams = new HttpParams()\r\n .append('querytext', `'${promotedQuery}'`)\r\n .append('trimduplicates', 'false')\r\n .append('bypassresulttypes', 'true')\r\n .append('clienttype', `'custom'`)\r\n .append('properties', `'EnableDynamicGroups:true'`) // this property enables us to include results from private O365 groups\r\n .append('enablesorting', 'true');\r\n\r\n if (rowLimit) {\r\n httpParams = httpParams.append('rowLimit', encodeURI(rowLimit.toString()));\r\n }\r\n return this.licenseService.hasUserAny365License().pipe(\r\n switchMap(isUserLicensed =>\r\n iif(() => isUserLicensed,\r\n this.http.get(`${this.environment.coreWorkplaceSiteUrl}/_api/search/query`, {\r\n params: httpParams,\r\n })\r\n .pipe(\r\n map(data => {\r\n console.log(`fetched promoted results by search: `);\r\n console.log(data);\r\n const results = data as SharePointJsonSearchResult;\r\n let resultsToReturn = new Array();\r\n results.SecondaryQueryResults.forEach(r => {\r\n if (r.SpecialTermResults && r.SpecialTermResults.Results) {\r\n const tmp = r.SpecialTermResults.Results.map(promotedResult => {\r\n return new SearchResult({\r\n Title: promotedResult.Title,\r\n Path: promotedResult.Url\r\n });\r\n });\r\n resultsToReturn = resultsToReturn.concat(tmp);\r\n }\r\n });\r\n return resultsToReturn;\r\n }),\r\n catchError(this.httpHelper.handleError({ operation: 'getPromotedResults', result: new Array() }))),\r\n of([])\r\n ))\r\n );\r\n }\r\n\r\n /* Sends a post search query to SP search api */\r\n sendPostSearchQuery(postQuery: SearchPostQuery): Observable> {\r\n\r\n const httpHeaders = new HttpHeaders({\r\n 'Accept': 'application/json',\r\n 'Content-Type': 'application/json',\r\n });\r\n const options = {\r\n headers: httpHeaders\r\n };\r\n\r\n return this.http.post(`${this.environment.coreWorkplaceSiteUrl}/_api/search/postquery`, postQuery, options)\r\n .pipe(\r\n map(data => {\r\n const results = data as SharePointJsonSearchResult;\r\n if (results && results.PrimaryQueryResult) {\r\n const resultsToReturn = results.PrimaryQueryResult.RelevantResults.Table.Rows.map(row => {\r\n const searchResults = {};\r\n row.Cells.forEach(c => {\r\n if (c.ValueType.endsWith('Double') || c.ValueType.endsWith('Int32') || c.ValueType.endsWith('Int64')) {\r\n searchResults[c.Key] = Number(c.Value);\r\n } else if (c.ValueType.endsWith('DateTime')) {\r\n searchResults[c.Key] = parseISO(c.Value);\r\n } else {\r\n searchResults[c.Key] = c.Value;\r\n }\r\n });\r\n return new SearchResult(searchResults);\r\n });\r\n return resultsToReturn;\r\n } else {\r\n return new Array();\r\n }\r\n }),\r\n catchError(this.httpHelper.handleError({ operation: 'sendPostSearchQuery', result: new Array() })));\r\n }\r\n\r\n public executeSearch(query: string, rowLimit?: number, includeOneDriveFiles?: boolean, otherParams?: Map, trimDuplicates?: boolean, msSearch = false): Observable> {\r\n // Note: we are responsible here to format otherParams correctly so it can be appended to search query, for example: &sourceid='b09a7990-05ea-4af9-81ef-edfab16c4e31'\r\n return this.licenseService.hasUserAny365License().pipe(\r\n switchMap(isUserLicensed =>\r\n defer(() =>\r\n isUserLicensed ? !msSearch ?\r\n this.executeSPSearch(query, rowLimit, includeOneDriveFiles, otherParams, trimDuplicates) :\r\n this.executeMSSearch(query, rowLimit, includeOneDriveFiles, otherParams, trimDuplicates)\r\n : of([])\r\n )));\r\n }\r\n\r\n /* sends search queries to microsoft graph*/\r\n private executeMSSearch(query: string, rowLimit?: number, includeOneDriveFiles?: boolean, otherParams?: Map, trimDuplicates?: boolean): Observable> {\r\n\r\n const fields = otherParams.get('selectproperties').substring(1, otherParams.get('selectproperties').length - 1).split(',');\r\n let request;\r\n if (fields.includes('FileExtension')) {\r\n request = {\r\n requests: [\r\n {\r\n entityTypes: [\r\n 'driveItem'\r\n ],\r\n query: {\r\n queryString: query\r\n },\r\n from: 0,\r\n size: rowLimit,\r\n }\r\n ]\r\n };\r\n } else {\r\n request = {\r\n requests: [\r\n {\r\n entityTypes: [\r\n 'listItem'\r\n ],\r\n query: {\r\n queryString: query\r\n },\r\n from: 0,\r\n size: rowLimit,\r\n fields: fields\r\n }\r\n ]\r\n };\r\n\r\n }\r\n const searchResponse = request;\r\n\r\n return this.http.post(`${Constants.GRAPH_API_ENDPOINT + Constants.GRAPH_API_VERSION_ONE}/search/query`, searchResponse)\r\n .pipe(\r\n map(data => {\r\n const results = data.value[0].hitsContainers[0].hits ? data.value[0].hitsContainers[0].hits : [];\r\n const resultsToReturn: SearchResult[] = results.map(item => {\r\n if (item.resource.fields) {\r\n const searchResult = new SearchResult(item.resource.fields);\r\n searchResult.Title = item.resource.fields.title;\r\n searchResult.Path = item.resource.fields.path;\r\n searchResult.Description = item.resource.fields.description;\r\n searchResult.LastModifiedTime = item.resource.fields.lastModifiedTime;\r\n searchResult.SiteTitle = item.resource.fields.siteTitle;\r\n searchResult.FirstPublishedDate = item.resource.fields.firstPublishedDate;\r\n\r\n return searchResult;\r\n } else {\r\n // document search results\r\n const searchResult = new SearchResult(item.resource);\r\n searchResult.Title = item.resource.name.split('.')[0];\r\n searchResult.FileExtension = item.resource.name.split('.')[1];\r\n searchResult.Path = item.resource.webUrl + '?web=1';\r\n searchResult.LastModifiedTime = item.resource.lastModifiedDateTime;\r\n searchResult.ModifiedBy = item.resource.lastModifiedBy.user.displayName;\r\n\r\n return searchResult;\r\n }\r\n\r\n });\r\n return resultsToReturn;\r\n }),\r\n catchError(this.httpHelper.handleError({ operation: 'executeMSSearch', result: new Array() })));\r\n }\r\n\r\n /* Sends search queries to our api */\r\n private executeSPSearch(query: string, rowLimit?: number, includeOneDriveFiles?: boolean, otherParams?: Map, trimDuplicates?: boolean): Observable> {\r\n\r\n let httpParams = new HttpParams()\r\n .append('querytext', `'${query}'`)\r\n .append('trimduplicates', `${trimDuplicates ? 'true' : 'false'}`)\r\n .append('bypassresulttypes', 'true')\r\n .append('clienttype', `'custom'`)\r\n .append('enablesorting', 'true');\r\n\r\n if (rowLimit) {\r\n httpParams = httpParams.append('rowLimit', encodeURI(rowLimit.toString()));\r\n }\r\n\r\n if (includeOneDriveFiles) {\r\n httpParams = httpParams.append('properties', `'EnableDynamicGroups:true,ContentSetting:3'`);\r\n } else {\r\n httpParams = httpParams.append('properties', `'EnableDynamicGroups:true'`); // this property enables us to include results from private O365 groups\r\n }\r\n\r\n if (otherParams) {\r\n otherParams.forEach((val, key) => {\r\n httpParams = httpParams.append(key, val);\r\n });\r\n }\r\n return this.http.get(`${this.environment.coreWorkplaceSiteUrl}/_api/search/query`, {\r\n params: httpParams,\r\n })\r\n .pipe(\r\n map(data => {\r\n const results = data as SharePointJsonSearchResult;\r\n let listOfOneDriveResults = new Array();\r\n\r\n const pageImpresssion = results.Properties.find(val => val.Key === 'piPageImpression');\r\n const sourceId = results.Properties.find(val => val.Key === 'SourceId');\r\n const piPageImpressionBlockType = results.PrimaryQueryResult && results.PrimaryQueryResult.RelevantResults.Properties.find(val => val.Key === 'piPageImpressionBlockType');\r\n let resultsToReturn = results.PrimaryQueryResult.RelevantResults.Table.Rows.map(row => {\r\n const tmpObj = {\r\n piPageImpression: pageImpresssion.Value,\r\n piPageImpressionBlockType: piPageImpressionBlockType.Value,\r\n SourceId: sourceId.Value,\r\n SearchTerm: query\r\n };\r\n row.Cells.forEach(c => {\r\n if (c.ValueType.endsWith('Double') || c.ValueType.endsWith('Int32') || c.ValueType.endsWith('Int64')) {\r\n tmpObj[c.Key] = Number(c.Value);\r\n } else if (c.ValueType.endsWith('DateTime')) {\r\n tmpObj[c.Key] = parseISO(c.Value);\r\n } else {\r\n tmpObj[c.Key] = c.Value;\r\n }\r\n });\r\n return new SearchResult(tmpObj);\r\n });\r\n\r\n if (includeOneDriveFiles) {\r\n results.SecondaryQueryResults.forEach(r => {\r\n const tmpResults = r.RelevantResults.Table.Rows.map(row => {\r\n const tmpObj = {};\r\n row.Cells.forEach(c => {\r\n if (c.ValueType.endsWith('Double') || c.ValueType.endsWith('Int32') || c.ValueType.endsWith('Int64')) {\r\n tmpObj[c.Key] = Number(c.Value);\r\n } else if (c.ValueType.endsWith('DateTime')) {\r\n tmpObj[c.Key] = parseISO(c.Value);\r\n } else {\r\n tmpObj[c.Key] = c.Value;\r\n }\r\n });\r\n return new SearchResult(tmpObj);\r\n });\r\n listOfOneDriveResults = listOfOneDriveResults.concat(tmpResults);\r\n });\r\n\r\n resultsToReturn = resultsToReturn.concat(listOfOneDriveResults).sort(((a, b) => a.Rank - b.Rank)).slice(0, rowLimit);\r\n }\r\n\r\n return resultsToReturn;\r\n }),\r\n catchError(this.httpHelper.handleError({ operation: 'executeSPSearch', result: new Array() })));\r\n }\r\n\r\n private executeRecursiveSPSearch(query: string, rowLimit: number, startRow: number = 0, otherParams?: Map, trimDuplicates?: boolean): Observable> {\r\n\r\n let httpParams = new HttpParams()\r\n .append('querytext', `'${query}'`)\r\n .append('trimduplicates', `${trimDuplicates ? 'true' : 'false'}`)\r\n .append('bypassresulttypes', 'true')\r\n .append('clienttype', `'custom'`)\r\n .append('enablesorting', 'true')\r\n .append('properties', `'EnableDynamicGroups:true'`) // this property enables us to include results from private O365 groups\r\n .append('rowLimit', encodeURI(rowLimit.toString()))\r\n .append('startRow', encodeURI(startRow.toString()));\r\n\r\n if (otherParams) {\r\n otherParams.forEach((val, key) => {\r\n httpParams = httpParams.append(key, val);\r\n });\r\n }\r\n\r\n return this.http.get(`${this.environment.coreWorkplaceSiteUrl}/_api/search/query`, {\r\n params: httpParams,\r\n })\r\n .pipe(\r\n expand((results: SharePointJsonSearchResult) => {\r\n if (results) {\r\n if (results.PrimaryQueryResult.RelevantResults.TotalRows > startRow + results.PrimaryQueryResult.RelevantResults.RowCount) {\r\n startRow = startRow + results.PrimaryQueryResult.RelevantResults.RowCount;\r\n const updatedParams = httpParams.set('startRow', startRow.toString());\r\n return this.http.get(`${this.environment.coreWorkplaceSiteUrl}/_api/search/query`, { params: updatedParams });\r\n } else {\r\n return EMPTY;\r\n }\r\n } else {\r\n return EMPTY;\r\n }\r\n }),\r\n toArray(),\r\n map((results: SharePointJsonSearchResult[]) => {\r\n const allResults = new Array();\r\n results.forEach(result => {\r\n result.PrimaryQueryResult.RelevantResults.Table.Rows.forEach(row => {\r\n const tmpObj = {};\r\n row.Cells.forEach(c => {\r\n if (c.ValueType.endsWith('Double') || c.ValueType.endsWith('Int32') || c.ValueType.endsWith('Int64')) {\r\n tmpObj[c.Key] = Number(c.Value);\r\n } else if (c.ValueType.endsWith('DateTime')) {\r\n tmpObj[c.Key] = parseISO(c.Value);\r\n } else {\r\n tmpObj[c.Key] = c.Value;\r\n }\r\n });\r\n allResults.push(new SearchResult(tmpObj));\r\n });\r\n });\r\n return allResults;\r\n }),\r\n catchError(this.httpHelper.handleError({ operation: 'executeRecursiveSPSearch', result: new Array() })));\r\n }\r\n\r\n private escapeQueryTextForSharePoint(query: string) {\r\n // Remove ' , the rest is taken care of by angular\r\n query = query.replace(/'/, '');\r\n return query;\r\n }\r\n\r\n}\r\n\r\n/*\r\nResult Source \t ID\r\nDocuments \t e7ec8cee-ded8-43c9-beb5-436b54b31e84 Microsoft Office documents and PDF documents\r\nItems matching a content type \t 5dc9f503-801e-4ced-8a2c-5d1237132419 Items that match a content type that the incoming query specifies\r\nItems matching a tag \t e1327b9c-2b8c-4b23-99c9-3730cb29c3f7 Documents or list items that match a managed metadata term that the incoming query specifies\r\nItems related to current user \t 48fec42e-4a92-48ce-8363-c2703a40e67d Documents or list items that are related to the user in a way that the query template specifies\r\nItems with same keyword as this item \t 5c069288-1d17-454a-8ac6-9c642a065f48\r\nLocal People Results \t b09a7990-05ea-4af9-81ef-edfab16c4e31 People items from the profile database of the User Profile service application\r\nLocal Reports And Data Results \t 203fba36-2763-4060-9931-911ac8c0583b Excel, Office Data Connection (ODC), or Report Definition Language (RDL) items, or items in a report library\r\nLocal SharePoint Results \t 8413cd39-2156-4e00-b54d-11efd9abdb89 All items from the local SharePoint search index except People items\r\nLocal Video Results \t 78b793ce-7956-4669-aa3b-451fc5defebf\r\nPages \t 5e34578e-4d08-4edc-8bf3-002acf3cdbcc\r\nPictures \t 38403c8c-3975-41a8-826e-717f2d41568a\r\nPopular \t 97c71db1-58ce-4891-8b64-585bc2326c12 Documents and list items sorted by view count\r\nRecently changed items \t ba63bbae-fa9c-42c0-b027-9a878f16557c Documents and list items sorted by Modified date\r\nRecommended Items \t ec675252-14fa-4fbe-84dd-8d098ed74181 Documents and list items that you recommend for the incoming query\r\nWiki \t 9479bf85-e257-4318-b5a8-81a180f5faa1\r\n */\r\n\r\n/*\r\n * contentclass:\"STS_Site\"\r\n\"STS_Web\": // Site\r\n\"STS_List_850\": // Page Library\r\n\"STS_ListItem_850\": // Page\r\n\"STS_List_DocumentLibrary\": // Document Library\r\n\"STS_ListItem_DocumentLibrary\": // Document Library Items\r\n\"STS_List_GenericList\": // Custom List\r\n\"STS_ListItem_GenericList\": // Custom List Item\r\n\"STS_List_Links\": // Links List\r\n\"STS_ListItem_Links\": // Links List Item\r\n\"STS_List_Tasks\": // Tasks List\r\n\"STS_ListItem_Tasks\": // Tasks List Item\r\n\"STS_List_Events\": // Events List\r\n\"STS_ListItem_Events\": // Events List Item\r\n\"STS_List_Announcements\": // Announcements List\r\n\"STS_ListItem_Announcements\": // Announcements List Item\r\n\"STS_List_Contacts\": // Contacts List\r\n\"STS_ListItem_Contacts\": // Contacts List Item\r\n\"STS_List_DiscussionBoard\": // Discussion List\r\n\"STS_ListItem_DiscussionBoard\": // Discussion List Item\r\n\"STS_List_IssueTracking\": // Issue Tracking List\r\n\"STS_ListItem_IssueTracking\": // Issue Tracking List Item\r\n\"STS_List_GanttTasks\": // Project Tasks List\r\n\"STS_ListItem_GanttTasks\": // Project Tasks List Item\r\n\"STS_List_Survey\": // Survey List\r\n\"STS_ListItem_Survey\": // Survey List Item\r\n\"STS_List_PictureLibrary\": // Picture Library\r\n\"STS_ListItem_PictureLibrary\": // Picture Library Item\r\n\"STS_List_WebPageLibrary\": // Web Page Library\r\n\"STS_ListItem_WebPageLibrary\": // Web Page Library Item\r\n\"STS_List_XMLForm\": // Form Library\r\n\"STS_ListItem_XMLForm\": // Form Library Item\r\n*/\r\n","import '@app/common/array-extensions';\r\nimport { UserLanguageTerm } from '@app/models/user-language-term';\r\n\r\n/**\r\n * Will filter the elements so that the items languages matches at least on of the user languages\r\n * @param elements the elements to be filtered\r\n * @param elementLanguagePropertyName the name of the property where the languages resides. Can be nested for example \"AppTile.LanguageTermAppTiles\"\r\n * @param userLanguages an array of the users languages\r\n * @param showItemsWithoutLanguage if set to true, items without any specified languages should be shown to all. Otherwise they will be hidden\r\n * @param defaultLanguageTermId If specified, the termGuid will be used as a default language for users who haven't selected any languages.\r\n */\r\nexport function applyLanguageFilteringMulti(elements: T[], elementLanguagePropertyName: string, userLanguages: UserLanguageTerm[], showItemsWithoutLanguage = true, defaultLanguageTermId = null) {\r\n\r\n // If empty, return right away\r\n if (elements.length === 0) {\r\n return elements;\r\n }\r\n\r\n // If the user doesn't have any selected languages, filter the elements based on the defaultLanguageTermId if specified\r\n if (defaultLanguageTermId && userLanguages.length === 0) {\r\n userLanguages.push(new UserLanguageTerm({ LanguageTermId: defaultLanguageTermId }));\r\n }\r\n\r\n const filteredElements = elements.filter(element => {\r\n const elementLanguages = getNestedObject(element, elementLanguagePropertyName);\r\n // if there isn't any languages on the item, return true or false based on setting showItemsWithoutLanguage\r\n if (elementLanguages.length === 0) {\r\n return showItemsWithoutLanguage;\r\n }\r\n\r\n // get the element languages that matches any of the users languages\r\n const userElementLanguage = elementLanguages.filter(l => userLanguages.some(ul => ul.LanguageTermId === l['LanguageTermId']));\r\n return userElementLanguage.length > 0;\r\n });\r\n return filteredElements;\r\n}\r\n\r\n/**\r\n * Will filter the elements so that the item language matches any of the users languages\r\n * @param elements the elements to be filtered\r\n * @param userLanguages an array of the users languages\r\n * @param showItemsWithoutLanguage if set to true, items without any specified languages should be shown to all. Otherwise they will be hidden\r\n * @param defaultLanguageTermId If specified, the termGuid will be used as a default language for users who haven't selected any languages.\r\n */\r\nexport function applyLanguageFilteringSingle(elements: T[], userLanguages: UserLanguageTerm[], showItemsWithoutLanguage = true, defaultLanguageTermId = null) {\r\n\r\n // If empty, return right away\r\n if (elements.length === 0) {\r\n return elements;\r\n }\r\n\r\n // If the user doesn't have any selected languages, filter the elements based on the defaultLanguageTermId if specified\r\n if (defaultLanguageTermId && userLanguages.length === 0) {\r\n userLanguages.push(new UserLanguageTerm({ LanguageTermId: defaultLanguageTermId }));\r\n }\r\n\r\n const filteredElements = elements.filter(element => {\r\n if (element['LanguageTermId']) {\r\n return userLanguages.some(ul => ul.LanguageTermId === element['LanguageTermId']);\r\n }\r\n // if there isn't any languages on the item, return true or false based on setting showItemsWithoutLanguage\r\n return showItemsWithoutLanguage;\r\n });\r\n return filteredElements;\r\n}\r\n\r\nconst getNestedObject = (nestedObj, pathArr: string) => {\r\n return pathArr.split('.').reduce((obj, key) =>\r\n (obj && obj[key] !== 'undefined') ? obj[key] : undefined, nestedObj);\r\n};\r\n","import { Inject, Injectable, Optional } from '@angular/core';\r\nimport { CUSTOMERENVIRONMENT, WINDOW } from '@app/common/app-tokens';\r\nimport { Utilities } from '@app/common/utilities';\r\nimport { AccountInfo, AuthenticationResult, EndSessionRequest, InteractionRequiredAuthError, PopupRequest, PublicClientApplication, RedirectRequest, SilentRequest, SsoSilentRequest } from '@azure/msal-browser';\r\nimport { BaseAuthRequest, ClientAuthErrorMessage, CommonAuthorizationUrlRequest } from '@azure/msal-common';\r\nimport { Environment } from '@environments/interface.environment';\r\nimport { from, Observable, of, throwError } from 'rxjs';\r\nimport { catchError, mergeMap, map, tap } from 'rxjs/operators';\r\nimport { Platform } from '@angular/cdk/platform';\r\nimport { MsteamsService } from '@app/services/msteams.service';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class AuthService {\r\n\r\n public useRedirect: boolean;\r\n\r\n public readonly MSALObj: PublicClientApplication;\r\n\r\n public accountInfo: AccountInfo;\r\n\r\n public storedAccountInfo: AccountInfo;\r\n\r\n public loginRequest: Partial;\r\n\r\n private protectedResourceEndpoints: Map;\r\n\r\n public idTokenClaims = new Map();\r\n\r\n constructor(@Inject(CUSTOMERENVIRONMENT) private environment: Environment, @Inject(WINDOW) private window: Window, private platform: Platform, @Optional() private msteamsService?: MsteamsService) {\r\n // If IE, recommendation is that you sign-in using Redirect APIs (https://github.com/AzureAD/microsoft-authentication-library-for-js/blob/dev/samples/msal-browser-samples/TypescriptTestApp2.0/src/index.ts#L7)\r\n // If iOS we have to force redirect otherwise safari popup wont work in a good way\r\n // If we are in teams we set this to redirect because we have to open the special MS Teams auth popup manually and trigger a redirect in that popup.\r\n // If the customer has configured to use redirect we set this to true as well\r\n this.useRedirect = Utilities.detectIE(this.window.navigator.userAgent) > -1 ||\r\n (this.platform.IOS && Utilities.isSafari(this.window)) ||\r\n Utilities.isInTeamsApp(this.window) ||\r\n Utilities.inTeamsAuthPopupRedirect(this.window) ||\r\n this.environment.msalConfig.useRedirect;\r\n\r\n // This should be set if IE according to MSAL docs.\r\n this.environment.msalConfig.cache = { ...{ storeAuthStateInCookie: Utilities.detectIE(this.window.navigator.userAgent) > -1 }, ...this.environment.msalConfig.cache };\r\n\r\n if (Utilities.isElectron(this.window) || Utilities.isInTeamsApp(this.window) || Utilities.inTeamsAuthPopupRedirect(this.window) || this.environment.featureSettings.coreIntranetEnabled) {\r\n // Set this to localstorage to help minimize the needs for logging in multiple times since each tab change will cause a new session.\r\n // This also needs to be set to localStorage because the special MS teams auth popup needs to store the info in a shared storage between the parent window since we have no way of force setting auth properties in MSAL.\r\n this.environment.msalConfig.cache.cacheLocation = 'localStorage';\r\n }\r\n\r\n if (!this.environment.msalConfig.auth.redirectUri) {\r\n this.environment.msalConfig.auth.redirectUri = this.window.location.origin;\r\n }\r\n\r\n if (Utilities.inTeamsAuthPopupRedirect(this.window)) {\r\n // Because when we are within this special auth popup we want to get rid of it as quick as possible and tell it to close in the initializer we dont want to trigger any extra navigations.\r\n this.environment.msalConfig.auth.navigateToLoginRequestUrl = false;\r\n }\r\n\r\n this.MSALObj = new PublicClientApplication(this.environment.msalConfig);\r\n\r\n this.loginRequest = {\r\n scopes: ['openid', 'profile', 'offline_access', `${this.environment.msalConfig.auth.clientId}/.default`],\r\n extraQueryParameters: this.environment.msalConfig.extraQueryParameters,\r\n loginHint: this.environment.msalConfig.loginHint,\r\n domainHint: this.environment.msalConfig.domainHint,\r\n };\r\n\r\n // If the user has logged in before we check if there is some previous account info saved, this will check the browser storage.\r\n // If there is one account saved we use that info to prime the login request and then we can check that info and try with ssoSilent first or try to speed up the login with prompt=none\r\n const storedAccountInfos = this.MSALObj.getAllAccounts();\r\n if (storedAccountInfos) {\r\n if (storedAccountInfos.length === 1) {\r\n this.storedAccountInfo = storedAccountInfos[0];\r\n this.accountInfo = storedAccountInfos[0];\r\n this.loginRequest = { ...this.loginRequest, ...{ account: this.storedAccountInfo, prompt: 'none' } };\r\n }\r\n if (storedAccountInfos.length > 1) {\r\n this.loginRequest = { ...this.loginRequest, ...{ prompt: 'select_account' } };\r\n }\r\n }\r\n\r\n this.protectedResourceEndpoints = new Map(this.environment.msalConfig.protectedResourceScopeMap);\r\n }\r\n\r\n handleRedirect(): Observable {\r\n return from(this.MSALObj.handleRedirectPromise())\r\n .pipe(\r\n tap((authenticationResult: AuthenticationResult) => {\r\n this.setFields(authenticationResult);\r\n })\r\n );\r\n }\r\n\r\n private setFields(authenticationResult: AuthenticationResult) {\r\n if (authenticationResult) {\r\n Object.keys(authenticationResult.idTokenClaims)\r\n .forEach((key) => {\r\n this.idTokenClaims.set(key, authenticationResult.idTokenClaims[key]);\r\n });\r\n if (!this.accountInfo) {\r\n this.accountInfo = authenticationResult.account;\r\n }\r\n }\r\n }\r\n\r\n loginRedirect(request?: RedirectRequest): Observable {\r\n return from(this.MSALObj.loginRedirect(request));\r\n }\r\n\r\n loginPopup(request?: PopupRequest): Observable {\r\n return from(this.MSALObj.loginPopup(request))\r\n .pipe(\r\n tap((authResult: AuthenticationResult) => {\r\n this.setFields(authResult);\r\n })\r\n );\r\n }\r\n\r\n logOut(request?: EndSessionRequest): Observable {\r\n return from(this.MSALObj.logout(request));\r\n }\r\n\r\n acquireTokenSilent(request: SilentRequest): Observable {\r\n request.account = this.accountInfo;\r\n return from(this.MSALObj.acquireTokenSilent(request));\r\n }\r\n\r\n acquireTokenSilentWithFallBackToPopup(request: SilentRequest, fallbackRequest: BaseAuthRequest): Observable {\r\n return this.acquireTokenSilent(request)\r\n .pipe(\r\n catchError((err) => {\r\n if (err instanceof InteractionRequiredAuthError) {\r\n return this.acquireTokenPopup(fallbackRequest);\r\n }\r\n return throwError(err);\r\n }));\r\n }\r\n\r\n acquireTokenPopup(request: PopupRequest): Observable {\r\n return from(this.MSALObj.acquireTokenPopup(request));\r\n }\r\n\r\n acquireTokenRedirect(request: RedirectRequest): Observable {\r\n request.account = this.accountInfo;\r\n return this.handleRedirect()\r\n .pipe(\r\n mergeMap(authenticationResult => {\r\n if (authenticationResult) {\r\n return of(authenticationResult);\r\n } else {\r\n return from(this.MSALObj.acquireTokenRedirect(request))\r\n .pipe(\r\n map(() => null)\r\n );\r\n }\r\n })\r\n );\r\n }\r\n\r\n acquireTokenSilentWithFallBackToRedirect(request: SilentRequest, fallbackRequest: RedirectRequest): Observable {\r\n return this.acquireTokenSilent(request)\r\n .pipe(\r\n catchError((err) => {\r\n if (err instanceof InteractionRequiredAuthError) {\r\n if ((Utilities.isInTeamsApp(this.window) && this.msteamsService) || this.msteamsService?.isTeamsInitialized) {\r\n return this.acquireTokenUsingTeamsAuth(fallbackRequest);\r\n } else {\r\n return this.acquireTokenRedirect(fallbackRequest);\r\n }\r\n }\r\n if (err?.errorCode === ClientAuthErrorMessage.noTokensFoundError.code) {\r\n if ((Utilities.isInTeamsApp(this.window) && this.msteamsService) || this.msteamsService?.isTeamsInitialized) {\r\n return this.acquireTokenUsingTeamsAuth(fallbackRequest);\r\n } else {\r\n return this.acquireTokenRedirect((this.loginRequest as RedirectRequest));\r\n }\r\n }\r\n return throwError(err);\r\n }));\r\n }\r\n\r\n private acquireTokenUsingTeamsAuth(fallbackRequest: RedirectRequest) {\r\n return this.msteamsService.initMsTeams()\r\n .pipe(\r\n mergeMap(() => {\r\n return this.msteamsService.authenticate(fallbackRequest.scopes.join(','));\r\n }),\r\n map(result => {\r\n return JSON.parse(result) as AuthenticationResult;\r\n }));\r\n }\r\n\r\n ssoSilent(request: SsoSilentRequest): Observable {\r\n return from(this.MSALObj.ssoSilent(request))\r\n .pipe(\r\n tap((authenticationResult: AuthenticationResult) => {\r\n this.setFields(authenticationResult);\r\n })\r\n );\r\n }\r\n\r\n getScopesForEndpoint(url: string): BaseAuthRequest {\r\n let request: BaseAuthRequest;\r\n\r\n for (const [resource, scopes] of this.protectedResourceEndpoints) {\r\n if (url.indexOf(resource) > -1) {\r\n request = { scopes: scopes, authority: this.environment.msalConfig.auth.authority, correlationId: '' };\r\n break;\r\n }\r\n }\r\n return request;\r\n }\r\n}\r\n","import { AppTile } from './app-tile';\r\n\r\nexport class UserAppTile {\r\n public UserUpnId: string;\r\n public AppTile: AppTile;\r\n public AppTileId: number;\r\n public HideFromUI: boolean;\r\n public ChannelSubscribed: boolean;\r\n public Order: number;\r\n public ShowNewOrModifiedBadge: boolean;\r\n\r\n constructor(opt?: Partial) {\r\n if (opt) {\r\n if (opt.AppTile && opt.AppTile.ShowAsNewUntilThisDate && typeof opt.AppTile.ShowAsNewUntilThisDate === 'string') {\r\n opt.AppTile = new AppTile(opt.AppTile);\r\n }\r\n }\r\n\r\n Object.assign(this, opt);\r\n }\r\n}\r\n","import { CommonModule, DOCUMENT } from '@angular/common';\r\nimport { Component, HostBinding, Inject, Input, NgModule, OnDestroy, OnInit, Renderer2 } from '@angular/core';\r\nimport { LinkModule } from '@app/directives/link.directive';\r\nimport { FeatureSettingsStoreService } from '@app/services/feature-settings-store.service';\r\n\r\n@Component({\r\n selector: 'app-commento',\r\n templateUrl: './commento.component.html',\r\n styleUrls: ['./commento.component.scss']\r\n})\r\nexport class CommentoComponent implements OnInit, OnDestroy {\r\n\r\n @HostBinding('class.w-100') get fullWidth() { return true; }\r\n @Input() dataPageId: string;\r\n\r\n script: any;\r\n\r\n constructor(\r\n @Inject(DOCUMENT) private document: Document,\r\n private renderer2: Renderer2,\r\n private featureStore: FeatureSettingsStoreService) { }\r\n\r\n ngOnInit(): void {\r\n const scriptSrc = this.featureStore.state.commentoScriptUrl;\r\n if (scriptSrc) {\r\n this.script = this.renderer2.createElement('script');\r\n this.script.src = scriptSrc;\r\n if (this.dataPageId) {\r\n this.script.setAttribute('data-page-id', this.dataPageId);\r\n }\r\n this.renderer2.appendChild(this.document.head, this.script);\r\n }\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.script && this.script.remove();\r\n }\r\n\r\n}\r\n@NgModule({\r\n declarations: [CommentoComponent],\r\n exports: [CommentoComponent],\r\n imports: [\r\n CommonModule,\r\n LinkModule,\r\n ]\r\n})\r\nexport class CommentoModule { }\r\n","
    \r\n","
    \r\n\r\n
    \r\n

    {{page.Title}}

    \r\n
    \r\n
    \r\n
    Publishing date: {{publishingDate|date}}
    \r\n \r\n
    Publishing date: Draft
    \r\n
    \r\n
    \r\n Edit page\r\n
    \r\n
    \r\n
    \r\n
    \r\n \"{{page.BannerImageAltText}}\"\r\n
    \r\n
    \r\n
    \r\n {{ page.BannerImageText }}\r\n
    \r\n\r\n
    \r\n
    \r\n
    \r\n\r\n
    \r\n
    \r\n
    \r\n \r\n \"\"\r\n \r\n \r\n
    \r\n {{ getPreferredNameLetters(modifiedByUser.UPN)}}\r\n
    \r\n
    \r\n
    \r\n
    \r\n {{modifiedByUser.Name}}\r\n \r\n Edited {{page.Modified|date}}\r\n \r\n
    \r\n
    \r\n
    \r\n
    \r\n \r\n \"\"\r\n \r\n \r\n
    \r\n {{ getPreferredNameLetters(ownerUser.UPN)}}\r\n
    \r\n
    \r\n
    \r\n
    \r\n {{ownerUser.Name}}\r\n \r\n Information owner\r\n \r\n
    \r\n
    \r\n
    \r\n
    \r\n \r\n \r\n \r\n {{language}}\r\n \r\n \r\n \r\n {{channel.Name}}\r\n \r\n \r\n
    \r\n
    \r\n \r\n
    \r\n
    \r\n","import { CommonModule } from '@angular/common';\r\nimport { Component, NgModule, OnInit, ViewEncapsulation } from '@angular/core';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatChipsModule } from '@angular/material/chips';\r\nimport { ActivatedRoute, RouterModule } from '@angular/router';\r\nimport { Roles } from '@app/common/roles';\r\nimport { Utilities } from '@app/common/utilities';\r\nimport { CommentoModule } from '@app/components/commento/commento.component';\r\nimport { ChannelControlModule } from '@app/components/form-controls/channel-control/channel-control.component';\r\nimport { GalleryModule } from '@app/components/gallery/gallery.component';\r\nimport { Page, PageType } from '@app/models/page';\r\nimport { PeoplePickerUser } from '@app/models/people-picker-user';\r\nimport { SimplifiedTerm } from '@app/models/simplified-term';\r\nimport { LinkModule } from '@app/directives/link.directive';\r\nimport { SafeModule } from '@app/pipes/safe.pipe';\r\nimport { ChannelService } from '@app/services/channel.service';\r\nimport { LanguageTermService } from '@app/services/language-term.service';\r\nimport { PagesService } from '@app/services/pages.service';\r\nimport { SecurityService } from '@app/services/security.service';\r\nimport { UserService } from '@app/services/user.service';\r\nimport { combineLatest, Observable, of } from 'rxjs';\r\nimport { filter, map, switchMap } from 'rxjs/operators';\r\n\r\n@Component({\r\n selector: 'app-page',\r\n templateUrl: './page.component.html',\r\n styleUrls: ['./page.component.scss'],\r\n encapsulation: ViewEncapsulation.None\r\n})\r\nexport class PageComponent implements OnInit {\r\n page$: Observable;\r\n showEditMode$: Observable;\r\n selectedChannels$: Observable>;\r\n language$: Observable;\r\n modifiedByUser$: Observable;\r\n ownerUser$: Observable;\r\n galleryImages$: Observable>;\r\n\r\n constructor(private activatedRoute: ActivatedRoute,\r\n private securityService: SecurityService,\r\n private channelService: ChannelService,\r\n private languageTermService: LanguageTermService,\r\n private userService: UserService,\r\n private pagesService: PagesService) { }\r\n\r\n ngOnInit() {\r\n this.page$ = this.activatedRoute.data\r\n .pipe(\r\n filter(data => data.page),\r\n map((data: any) => {\r\n return new Page(data.page);\r\n })\r\n );\r\n this.modifiedByUser$ = this.page$.pipe(\r\n switchMap(page => (page.ModifiedByUserUpnId ? this.userService.getUserByUpn(page.ModifiedByUserUpnId) : of(null))),\r\n map(user => {\r\n // map to PeoplePickerUser because we don't need all attributes\r\n return user ? {\r\n GraphId: user.id,\r\n Name: user.displayName,\r\n // for external users, use email if it exists to prevent showing #EXT# in adress\r\n UPN: user.userPrincipalName.match('EXT') && user.mail ? user.mail : user.userPrincipalName,\r\n } as PeoplePickerUser : null;\r\n })\r\n );\r\n this.ownerUser$ = this.page$.pipe(\r\n switchMap(page => (page.OwnerUserUpnId ? this.userService.getUserByUpn(page.OwnerUserUpnId) : of(null))),\r\n map(user => {\r\n // map to PeoplePickerUser because we don't need all attributes\r\n return user ? {\r\n GraphId: user.id,\r\n Name: user.displayName,\r\n // for external users, use email if it exists to prevent showing #EXT# in adress\r\n UPN: user.userPrincipalName.match('EXT') && user.mail ? user.mail : user.userPrincipalName,\r\n } as PeoplePickerUser : null;\r\n })\r\n );\r\n\r\n this.selectedChannels$ = combineLatest([this.page$, this.channelService.getChannels()])\r\n .pipe(\r\n map(([page, fetchedChannels]) => {\r\n let selectedChannels = new Array();\r\n if (page.ChannelTermPages && page.ChannelTermPages.length > 0) {\r\n selectedChannels = page.ChannelTermPages.map(ct => {\r\n const selectedChannel = fetchedChannels.findRecursive(fc => fc.Guid === ct.ChannelTermId, 'Terms');\r\n if (selectedChannel) {\r\n return selectedChannel;\r\n }\r\n });\r\n }\r\n return selectedChannels;\r\n })\r\n );\r\n\r\n this.language$ = combineLatest([this.page$, this.languageTermService.getLanguages()])\r\n .pipe(\r\n map(([page, languages]) => {\r\n if (!page.LanguageTermId || languages.length === 0) { return null; }\r\n const matchingLanguage = languages.find(l => l.Guid.toLowerCase() === page.LanguageTermId.toLowerCase());\r\n if (matchingLanguage && matchingLanguage.Name) {\r\n return matchingLanguage.Name;\r\n }\r\n })\r\n );\r\n\r\n this.showEditMode$ = this.securityService.hasUserAnyAppRole([Roles.Admin, Roles.Editor]);\r\n this.galleryImages$ = this.pagesService.getImages();\r\n }\r\n\r\n getPreferredNameLetters(userName: string) {\r\n return Utilities.generateInitials(userName);\r\n }\r\n\r\n getCommentoPageId(page: Page) {\r\n return `workplace/pages/${(page.PageType === PageType.News ? 'news' : 'content')}/${page.Id}`;\r\n }\r\n}\r\n\r\n@NgModule({\r\n declarations: [\r\n PageComponent\r\n ],\r\n exports: [\r\n PageComponent\r\n ],\r\n imports: [\r\n CommonModule,\r\n LinkModule,\r\n RouterModule,\r\n SafeModule,\r\n ChannelControlModule,\r\n MatButtonModule,\r\n MatChipsModule,\r\n GalleryModule,\r\n CommentoModule\r\n ]\r\n})\r\nexport class PageModule { }\r\n","import { Component, OnInit, Input, NgModule, Host, Optional, ViewEncapsulation, ViewChild, OnDestroy } from '@angular/core';\r\nimport { InfoboxService } from '@app/services/infobox.service';\r\nimport { Observable, combineLatest, Subscription, of } from 'rxjs';\r\nimport { InfoB, InfoBoxWidth } from '@app/models/infobox';\r\nimport { CommonModule } from '@angular/common';\r\nimport { HideParentIfEmptyDirective } from '@app/directives/hide-parent-if-empty.directive';\r\nimport { tap, mergeMap, map } from 'rxjs/operators';\r\nimport { ActivatedRoute, RouterModule, Router } from '@angular/router';\r\nimport { FeatureSettingsStoreService } from '@app/services/feature-settings-store.service';\r\nimport { SecurityService } from '@app/services/security.service';\r\nimport { Roles } from '@app/common/roles';\r\nimport { MatSlideToggleModule } from '@angular/material/slide-toggle';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatMenuModule } from '@angular/material/menu';\r\nimport { SortablejsModule, SortablejsDirective } from 'ngx-sortablejs';\r\nimport { Options, SortableEvent } from 'sortablejs';\r\nimport { MatSnackBar } from '@angular/material/snack-bar';\r\nimport { Utilities } from '@app/common/utilities';\r\nimport { AlertTemplatesComponent } from '@app/components/alert-templates/alert-templates.component';\r\nimport { ConfirmDialogComponent } from '@app/components/confirm-dialog/confirm-dialog.component';\r\nimport { MatDialog } from '@angular/material/dialog';\r\nimport { NgSubscribeModule } from '@app/directives/ng-subscribe.directive';\r\nimport { InfoBoxUtilities } from '@app/components/infobox-zone/infobox-utility';\r\nimport { InfoboxModule } from '@app/components/infobox-zone/infobox/infobox.component';\r\nimport { WidgetPlaceholderModule } from '@app/components/widget-placeholder/widget-placeholder.component';\r\n\r\n@Component({\r\n selector: 'app-infobox-zone',\r\n templateUrl: './infobox-zone.component.html',\r\n styleUrls: ['./infobox-zone.component.scss'],\r\n encapsulation: ViewEncapsulation.None\r\n})\r\nexport class InfoboxZoneComponent implements OnInit, OnDestroy {\r\n\r\n @Input() area: string;\r\n @Input() textAlignmentClass: string;\r\n boxes$: Observable>;\r\n subscription = new Subscription();\r\n featureSettings = this.featureSettingsStoreService.state;\r\n hasUserPermissionToEdit$: Observable;\r\n options: Options;\r\n editMode$ = this.service.currentEditMode$;\r\n @ViewChild(SortablejsDirective) sortable: SortablejsDirective;\r\n\r\n constructor(\r\n private dialog: MatDialog,\r\n private snackBar: MatSnackBar,\r\n private service: InfoboxService,\r\n private router: Router,\r\n private activatedRoute: ActivatedRoute,\r\n private securityService: SecurityService,\r\n private featureSettingsStoreService: FeatureSettingsStoreService,\r\n\r\n @Host() @Optional() public hideParentIfEmptyDirective: HideParentIfEmptyDirective) {\r\n this.options = {\r\n disabled: false,\r\n filter: '.ignore-elements',\r\n handle: '.move-icon',\r\n onUpdate: (event: SortableEvent) => {\r\n this.onSortUpdate();\r\n }\r\n };\r\n }\r\n\r\n get routerUrl() {\r\n return this.router.url;\r\n }\r\n\r\n get isAreaHero() {\r\n return this.area.toLowerCase().indexOf('hero') > -1;\r\n }\r\n\r\n ngOnInit(): void {\r\n this.hasUserPermissionToEdit$ = this.securityService.hasUserAnyAppRole([Roles.Admin, Roles.Editor]);\r\n const activatedRouteForPrimaryOutlet = this.activatedRoute.root.children.find(_ => _.outlet === 'primary');\r\n\r\n this.boxes$ =\r\n combineLatest([activatedRouteForPrimaryOutlet.url, this.service.refresh$, this.service.currentEditMode$])\r\n .pipe(\r\n mergeMap(([url, , currentEditMode]) => {\r\n if (currentEditMode) {\r\n return this.service.getActiveAndFutureInfoBoxes('/' + url.join('/'), this.area)\r\n .pipe(\r\n map(boxes => {\r\n return boxes\r\n .filter(b => !b.Hidden);\r\n }),\r\n tap(this.hideParentElement(currentEditMode))\r\n );\r\n } else {\r\n return this.service.getMyActiveInfoBoxes('/' + url.join('/'), this.area)\r\n .pipe(\r\n tap(this.hideParentElement(currentEditMode))\r\n );\r\n }\r\n })\r\n );\r\n }\r\n\r\n private hideParentElement(currentEditMode): (x: InfoB[]) => void {\r\n return (boxes) => {\r\n if (currentEditMode) {\r\n this.hideParentIfEmptyDirective && this.hideParentIfEmptyDirective.showElement();\r\n } else {\r\n if (boxes.length === 0) {\r\n this.hideParentIfEmptyDirective && this.hideParentIfEmptyDirective.hideElement();\r\n } else {\r\n this.hideParentIfEmptyDirective && this.hideParentIfEmptyDirective.showElement();\r\n }\r\n }\r\n };\r\n }\r\n\r\n private onSortUpdate() {\r\n const boxesToUpdate = (this.sortable.sortablejs as Array).map((box, index) => {\r\n box.Order = index;\r\n return box;\r\n });\r\n\r\n this.subscription.add(\r\n this.service.updateInfoboxes(boxesToUpdate)\r\n .subscribe(() => {\r\n Utilities.openSnackBar(this.snackBar, AlertTemplatesComponent, AlertTemplatesComponent.updatedorder);\r\n }));\r\n }\r\n\r\n setSize(size: InfoBoxWidth, box: InfoB) {\r\n box.Width = size;\r\n this.save(box);\r\n }\r\n\r\n save(box: InfoB) {\r\n this.subscription.add(\r\n this.service.updateInfobox(box.Id, box)\r\n .subscribe(() => {\r\n Utilities.openSnackBar(this.snackBar, AlertTemplatesComponent, AlertTemplatesComponent.genericupdated);\r\n }));\r\n }\r\n\r\n duplicate(box: InfoB) {\r\n box.Id = undefined;\r\n this.subscription.add(\r\n this.service.addInfobox(box)\r\n .subscribe(() => {\r\n Utilities.openSnackBar(this.snackBar, AlertTemplatesComponent, AlertTemplatesComponent.genericadded);\r\n }));\r\n }\r\n\r\n hide(box: InfoB) {\r\n this.subscription.add(\r\n this.service.hideInfobox(box.Id)\r\n .subscribe());\r\n }\r\n\r\n remove(box: InfoB) {\r\n const dialogRef = this.dialog.open(ConfirmDialogComponent);\r\n this.subscription.add(\r\n dialogRef.afterClosed()\r\n .pipe(mergeMap(result => {\r\n if (result) {\r\n return this.service.deleteInfobox(box.Id);\r\n } else {\r\n return of(null);\r\n }\r\n }))\r\n .subscribe(result => {\r\n if (result) {\r\n Utilities.openSnackBar(this.snackBar, AlertTemplatesComponent, AlertTemplatesComponent.genericdeleted);\r\n }\r\n }));\r\n }\r\n\r\n getWidthClasses(box: InfoB) {\r\n return InfoBoxUtilities.getWidthClasses(box);\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.subscription.unsubscribe();\r\n }\r\n\r\n}\r\n@NgModule({\r\n declarations: [InfoboxZoneComponent],\r\n exports: [InfoboxZoneComponent],\r\n imports: [\r\n CommonModule,\r\n MatSlideToggleModule,\r\n MatButtonModule,\r\n RouterModule,\r\n MatMenuModule,\r\n SortablejsModule,\r\n NgSubscribeModule,\r\n WidgetPlaceholderModule,\r\n InfoboxModule\r\n ]\r\n})\r\nexport class InfoboxZoneModule { }\r\n","\r\n \r\n
    \r\n \r\n
    \r\n Area:{{area}}\r\n
    \r\n
    \r\n
    \r\n \r\n \r\n
    \r\n \r\n
    \r\n Area:{{area}}\r\n
    \r\n
    \r\n
    \r\n
    \r\n\r\n
    \r\n
    \r\n
    \r\n
    \r\n \r\n
    \r\n
    \r\n \r\n
    \r\n
    \r\n \r\n
    \r\n
    \r\n {{box.StartDateAsDate | date:'short'}}\r\n - \r\n {{box.EndDateAsDate | date:'short'}}\r\n
    \r\n
    \r\n \r\n
    \r\n
    \r\n\r\n
    \r\n\r\n\r\n
    \r\n \r\n
    \r\n
    \r\n\r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n\r\n\r\n\r\n \r\n Edit\r\n \r\n \r\n \r\n\r\n","import { CommonModule } from '@angular/common';\r\nimport { Component, EventEmitter, Input, NgModule, OnInit, Output, Inject } from '@angular/core';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatExpansionModule } from '@angular/material/expansion';\r\nimport { RouterModule } from '@angular/router';\r\nimport { Roles } from '@app/common/roles';\r\nimport { FeatureToggleModule } from '@app/directives/feature-toggle.directive';\r\nimport { BroadcastMessage } from '@app/models/broadcast-message';\r\nimport { AppTileBroadcastMessages } from '@app/models/message-broadcast-app-tile';\r\nimport { LinkModule } from '@app/directives/link.directive';\r\nimport { BroadcastService } from '@app/services/broadcast.service';\r\nimport { SecurityService } from '@app/services/security.service';\r\nimport { Observable } from 'rxjs';\r\nimport { CUSTOMERENVIRONMENT, WINDOW } from '@app/common/app-tokens';\r\nimport { Utilities } from '@app/common/utilities';\r\nimport { Environment } from '@environments/interface.environment';\r\n\r\n@Component({\r\n selector: 'app-broadcast-banner-list',\r\n templateUrl: './broadcast-banner-list.component.html',\r\n styleUrls: ['./broadcast-banner-list.component.scss']\r\n})\r\nexport class BroadcastBannerListComponent implements OnInit {\r\n\r\n @Output() clickOnEditBtnEvent = new EventEmitter();\r\n @Input() broadcastMessages: Array;\r\n @Input() appTileBroadcastMessages: Array;\r\n @Input() showHideButton = true;\r\n @Input() titleTextMaxLength = 77; // title texts gets truncated if longer\r\n hasPermissionEditorOrAdmin$: Observable;\r\n\r\n constructor(private securityService: SecurityService,\r\n private service: BroadcastService,\r\n @Inject(CUSTOMERENVIRONMENT) private environment: Environment,\r\n @Inject(WINDOW) private window: Window) { }\r\n\r\n ngOnInit(): void {\r\n if (this.appTileBroadcastMessages) {\r\n this.broadcastMessages = this.appTileBroadcastMessages.map(broadcastMessage => {\r\n return broadcastMessage.BroadcastMessage;\r\n });\r\n }\r\n this.hasPermissionEditorOrAdmin$ = this.securityService.hasUserAnyAppRole([Roles.Admin, Roles.Editor, Roles.MessageBroadcastEditor]);\r\n }\r\n\r\n whenEditBtnClicked() {\r\n Utilities.postMessageToCoreIntranet('edit-broadcast', this.window, this.environment.tenantHostUrl);\r\n this.clickOnEditBtnEvent.emit(true);\r\n }\r\n\r\n hide(id: number) {\r\n this.service.hideBroadcastMessage(id).subscribe();\r\n }\r\n\r\n}\r\n\r\n@NgModule({\r\n declarations: [BroadcastBannerListComponent],\r\n exports: [BroadcastBannerListComponent],\r\n imports: [\r\n CommonModule,\r\n RouterModule,\r\n MatExpansionModule,\r\n MatButtonModule,\r\n FeatureToggleModule,\r\n LinkModule,\r\n ]\r\n})\r\nexport class BroadcastBannerListComponentModule { }\r\n","\r\n\r\n \r\n\r\n \r\n \r\n
    \r\n
    \r\n
    \r\n
    \r\n \r\n \r\n Critical\r\n |\r\n \r\n \r\n \r\n \r\n Warning\r\n |\r\n \r\n \r\n \r\n \r\n Information\r\n |\r\n \r\n \r\n {{broadcast.Title}}\r\n
    \r\n
    \r\n
    \r\n
    \r\n \r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n\r\n
    \r\n \r\n
    \r\n
    \r\n \r\n {{broadcast.StartDateAsDate | date:'short'}}\r\n - \r\n {{broadcast.EndDateAsDate | date:'short'}}\r\n \r\n
    \r\n
    \r\n \r\n \r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n","import { DOCUMENT } from '@angular/common';\r\nimport { HttpClient, HttpParams, HttpErrorResponse } from '@angular/common/http';\r\nimport { Inject, Injectable, Renderer2, RendererFactory2 } from '@angular/core';\r\nimport { CUSTOMERENVIRONMENT } from '@app/common/app-tokens';\r\nimport { Constants } from '@app/common/constants';\r\nimport { HttpHelper } from '@app/common/http-helper';\r\nimport { CacheService } from '@app/services/cache.service';\r\nimport { FeatureSettingsStoreService } from '@app/services/feature-settings-store.service';\r\nimport { UrlHelperService } from '@app/services/url-helper.service';\r\nimport { Environment } from '@environments/interface.environment';\r\nimport { ListItem } from '@microsoft/microsoft-graph-types-beta';\r\nimport { concat, Observable, of, throwError } from 'rxjs';\r\nimport { catchError, finalize, map, mergeMap, shareReplay, tap } from 'rxjs/operators';\r\nimport { SingleValueLegacyExtendedProperty } from '@microsoft/microsoft-graph-types';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class ImageService {\r\n\r\n constructor(\r\n @Inject(CUSTOMERENVIRONMENT) private environment: Environment,\r\n @Inject(DOCUMENT) private document: Document,\r\n private http: HttpClient,\r\n private urlHelperService: UrlHelperService,\r\n private featureSettingsStore: FeatureSettingsStoreService,\r\n private cache: CacheService,\r\n private httpHelper: HttpHelper,\r\n rendererFactory: RendererFactory2) {\r\n this.renderer = rendererFactory.createRenderer(null, null);\r\n }\r\n\r\n private readonly cacheKeyPrefix = 'ImageService';\r\n private readonly contentAndQueryStringEndpoint = 'content?preferNoRedirect=true&clientType=modernWebPart&prefer=extendCacheMaxAge';\r\n public useCache = true;\r\n private renderer: Renderer2;\r\n\r\n private getThumbnailFromApiUrl$ = new Map>();\r\n private getPublishingImageUrl$ = new Map>();\r\n private getSharePointImageThumbnailFromOriginalUrlWithCustomDimensions$ = new Map>();\r\n private getSharePointImageThumbnailFromOriginalUrlWithStandardDimensions$ = new Map>();\r\n\r\n resizeBase64Img(base64: string, origBlobSize: number): Observable {\r\n\r\n const canvas: HTMLCanvasElement = this.renderer.createElement('canvas');\r\n const context: CanvasRenderingContext2D = canvas.getContext('2d');\r\n const img: HTMLImageElement = this.renderer.createElement('img');\r\n img.src = base64;\r\n\r\n return new Observable((subscriber) => {\r\n img.onload = function () {\r\n let scale = 0.75; // Scale down to 75 %\r\n let quality = 0.92; // Default setting\r\n let error = false;\r\n if (origBlobSize > 6291456) {\r\n subscriber.error('Image was too large! Try again with a smaller size');\r\n error = true;\r\n } else if (origBlobSize > 5242880) {\r\n // If larger than 5 mb\r\n scale = 0.25;\r\n quality = 0.5;\r\n } else if (origBlobSize > 3145728) {\r\n // If larger than 3 mb\r\n scale = 0.4;\r\n quality = 0.6;\r\n } else if (origBlobSize > 2097152) {\r\n // If larger than 2 mb\r\n scale = 0.6;\r\n quality = 0.8;\r\n } else if (origBlobSize > 1048576) {\r\n // If larger than 1 mb\r\n scale = 0.6;\r\n quality = 0.8;\r\n } else {\r\n // run with default if under 1mb\r\n }\r\n\r\n if (!error) {\r\n // Set the canvas to the resulting \"destination\" size\r\n canvas.width = img.width * scale;\r\n canvas.height = img.height * scale;\r\n // Paste our resized image using the params\r\n context.drawImage(img, 0, 0, img.width, img.height, 0, 0, canvas.width, canvas.height);\r\n const dataUrl = canvas.toDataURL('image/jpeg', quality);\r\n\r\n subscriber.next(dataUrl);\r\n }\r\n\r\n subscriber.complete();\r\n };\r\n })\r\n .pipe(\r\n finalize(() => {\r\n img.remove();\r\n canvas.remove();\r\n })\r\n );\r\n }\r\n\r\n getThumbnailFromApiUrl(apiUrl: string): Observable {\r\n if (this.getThumbnailFromApiUrl$.has(apiUrl)) {\r\n return this.getThumbnailFromApiUrl$.get(apiUrl);\r\n } else {\r\n this.getThumbnailFromApiUrl$.set(apiUrl,\r\n this.http.request('GET', apiUrl,\r\n {\r\n observe: 'response',\r\n responseType: 'blob',\r\n })\r\n .pipe(\r\n map(result => {\r\n return URL.createObjectURL(result.body);\r\n }),\r\n catchError(err => {\r\n if (err.status === 404) {\r\n return of(null);\r\n } else {\r\n return throwError(err);\r\n }\r\n }),\r\n shareReplay({ bufferSize: 1, refCount: true })));\r\n\r\n return this.getThumbnailFromApiUrl$.get(apiUrl);\r\n }\r\n }\r\n\r\n getPublishingImageUrl(originalUrl: string, fallbackImageUrl = Constants.TRANSPARENT_IMAGE): Observable {\r\n if (this.getPublishingImageUrl$.has(originalUrl)) {\r\n return this.getPublishingImageUrl$.get(originalUrl);\r\n } else {\r\n const cacheKey = `${this.cacheKeyPrefix}-getPublishingImageUrl-${originalUrl}`;\r\n\r\n this.getPublishingImageUrl$.set(originalUrl, this.http.get(originalUrl)\r\n .pipe(\r\n map(result => {\r\n const imageHtml = result['BoolField_x005f_InfoboxPicture'];\r\n if (imageHtml && imageHtml.length > 0) {\r\n const tmp = this.document.implementation.createHTMLDocument('virtual').createElement('div');\r\n tmp.innerHTML = imageHtml;\r\n const imageUrl = `${this.urlHelperService.getAuthorityUrlWithoutQueryStrings(originalUrl)}${tmp.querySelector('img').getAttribute('src')}`;\r\n tmp.remove();\r\n return imageUrl;\r\n } else {\r\n return fallbackImageUrl;\r\n }\r\n }),\r\n tap(result => {\r\n this.useCache && this.cache.set(cacheKey, result);\r\n }),\r\n catchError(this.httpHelper.handleError({ operation: 'getPublishingImageUrl', result: Constants.TRANSPARENT_IMAGE, cacheKey: cacheKey, showErrorSnackbar: false })),\r\n shareReplay({ bufferSize: 1, refCount: true })));\r\n\r\n if (this.useCache) {\r\n const cachedData = this.cache.get(cacheKey);\r\n if (cachedData) {\r\n return concat(of(cachedData), this.getPublishingImageUrl$.get(originalUrl));\r\n }\r\n }\r\n\r\n return this.getPublishingImageUrl$.get(originalUrl);\r\n }\r\n }\r\n\r\n // Obtains a large thumbnail of an image in SPO from the getpreviewhandler endpoint. Thumbnail is generated by SharePoint\r\n getSharePointImageThumbnailFromPreviewHandlerUrl(originalUrl: string, size: string = this.featureSettingsStore.state.defaultImageThumbnailSize): Observable {\r\n const hostName = this.urlHelperService.getHostName(originalUrl);\r\n const params = this.urlHelperService.getParamsFromUrl(originalUrl);\r\n if (params.has('path') && !params.has('guidFile')) {\r\n return this.getSharePointImageThumbnailFromOriginalUrlWithStandardDimensions(params.get('path'));\r\n } else {\r\n const apiUrl = `https://${hostName}/_api/v2.1/sites/${hostName},${params.get('guidSite')},${params.get('guidWeb')}/items/${params.get('guidFile')}/driveItem/thumbnails/0/${size}/${this.contentAndQueryStringEndpoint}`;\r\n return this.getThumbnailFromApiUrl(apiUrl)\r\n .pipe(\r\n catchError(this.handleImageRedirectError())\r\n );\r\n }\r\n }\r\n\r\n // Obtains a thumbnail of an image in SPO. Thumbnail is generated by SharePoint\r\n getSharePointImageThumbnailFromOriginalUrlWithStandardDimensions(originalUrl: string, size: string = this.featureSettingsStore.state.defaultImageThumbnailSize): Observable {\r\n if (originalUrl.length > 0) {\r\n originalUrl = originalUrl[0] === '/' ? this.environment.tenantHostUrl + originalUrl : originalUrl;\r\n }\r\n if (this.getSharePointImageThumbnailFromOriginalUrlWithStandardDimensions$.has(originalUrl)) {\r\n return this.getSharePointImageThumbnailFromOriginalUrlWithStandardDimensions$.get(originalUrl);\r\n } else {\r\n const httpParams = new HttpParams()\r\n .append('url', `'${originalUrl}'`)\r\n .append('select', `id,parentReference`);\r\n this.getSharePointImageThumbnailFromOriginalUrlWithStandardDimensions$.set(originalUrl,\r\n this.http.get(`${this.environment.coreWorkplaceSiteUrl}/_api/v2.0/sharePoint/getBaseItemByUrl`, { params: httpParams })\r\n .pipe(\r\n mergeMap(listItem => {\r\n if (listItem?.id && listItem?.parentReference?.id && listItem?.parentReference?.siteId && listItem?.parentReference['listId']) {\r\n const authorityUrl = this.urlHelperService.getAuthorityUrlWithoutQueryStrings(originalUrl);\r\n const hostName = this.urlHelperService.getHostName(originalUrl);\r\n let url = `${authorityUrl}/_api/v2.1/sites/${hostName},${listItem.parentReference.siteId}/lists/${listItem?.parentReference['listId']}/items/${listItem.id}`;\r\n url = `${url}/driveItem/thumbnails/0/${size}/${this.contentAndQueryStringEndpoint}`;\r\n return this.getThumbnailFromApiUrl(url);\r\n } else {\r\n return of(originalUrl);\r\n }\r\n }),\r\n catchError(this.handleImageRedirectError()),\r\n catchError(this.httpHelper.handleError({ operation: 'getSharePointImageThumbnailFromOriginalUrlWithStandardDimensions', result: originalUrl, showErrorSnackbar: false })),\r\n shareReplay({ bufferSize: 1, refCount: true })));\r\n\r\n return this.getSharePointImageThumbnailFromOriginalUrlWithStandardDimensions$.get(originalUrl);\r\n }\r\n }\r\n\r\n // Obtains a thumbnail of an image in SPO. Thumbnail is generated by SharePoint\r\n getSharePointImageThumbnailFromOriginalUrlWithCustomDimensions(originalUrl: string, width: number, height: number): Observable {\r\n if (originalUrl.length > 0) {\r\n originalUrl = originalUrl[0] === '/' ? this.environment.tenantHostUrl + originalUrl : originalUrl;\r\n }\r\n\r\n if (this.getSharePointImageThumbnailFromOriginalUrlWithCustomDimensions$.has(originalUrl)) {\r\n return this.getSharePointImageThumbnailFromOriginalUrlWithCustomDimensions$.get(originalUrl);\r\n } else {\r\n const httpParams = new HttpParams()\r\n .append('url', `'${originalUrl}'`)\r\n .append('select', `id,parentReference`);\r\n this.getSharePointImageThumbnailFromOriginalUrlWithCustomDimensions$.set(originalUrl,\r\n this.http.get(`${this.environment.coreWorkplaceSiteUrl}/_api/v2.0/sharePoint/getBaseItemByUrl`, { params: httpParams })\r\n .pipe(\r\n mergeMap(listItem => {\r\n if (listItem?.id && listItem?.parentReference?.id && listItem?.parentReference?.siteId && listItem?.parentReference['listId']) {\r\n const authorityUrl = this.urlHelperService.getAuthorityUrlWithoutQueryStrings(originalUrl);\r\n const hostName = this.urlHelperService.getHostName(originalUrl);\r\n let url = `${authorityUrl}/_api/v2.1/sites/${hostName},${listItem.parentReference.siteId}/lists/${listItem?.parentReference['listId']}/items/${listItem.id}`;\r\n url = `${url}/driveItem/thumbnails/0/c${width}x${height}/${this.contentAndQueryStringEndpoint}`;\r\n return this.getThumbnailFromApiUrl(url);\r\n } else {\r\n return of(originalUrl);\r\n }\r\n }),\r\n catchError(this.handleImageRedirectError()),\r\n catchError(this.httpHelper.handleError({ operation: 'getSharePointImageThumbnailFromOriginalUrlWithCustomDimensions', result: Constants.TRANSPARENT_IMAGE, showErrorSnackbar: false })),\r\n shareReplay({ bufferSize: 1, refCount: true })));\r\n\r\n return this.getSharePointImageThumbnailFromOriginalUrlWithCustomDimensions$.get(originalUrl);\r\n }\r\n }\r\n\r\n private handleImageRedirectError(): (err: any, caught: Observable) => Observable {\r\n return (err: HttpErrorResponse) => {\r\n if (err?.status === 0 && err?.url) {\r\n // In some cases the browser (e.g. MS Edge legacy) wont follow the automatic redirect that may occur when sharepoint cant deliver a cached image from the normal url.\r\n // In those cases we try to fetch the actual url to the image service which is something like this: https://northeurope1-mediap.svc.ms/transform/thumbnail?provider=spo&inputFormat=jpg&cs=xxx&docid=https://tenant.sharepoint.com/_api/v2.0/drives/{driveid}/items/{itemdid}?tempauth=XXXX&version=Publishe&width=000&height=000&cb=0000\r\n // and then return it directly. It is a bit slower but it will atleast return the image and not our fallback transparent image.\r\n return this.http.get(err.url.replace(`/${this.contentAndQueryStringEndpoint}`, '/url'))\r\n .pipe(\r\n map((result => {\r\n return result?.value;\r\n }))\r\n );\r\n } else {\r\n return throwError(err);\r\n }\r\n };\r\n }\r\n}\r\n","export enum NewsModeFeaturedNews {\r\n GraphFromNewsCenterSite = 'GraphFromNewsCenterSite', // Uses graph api and fetches from the specifed news center site. Only news marked as Top News is fetched. No channel filtering.\r\n}\r\n\r\nexport enum NewsModePersonalNews {\r\n GraphFromNewsCenterSite = 'GraphFromNewsCenterSite', // Uses graph api and fetches from a specifed news center site, filtered on channel\r\n GraphFromNewsCenterSiteAndSearchFromFollowedSites = 'GraphFromNewsCenterSiteAndSearchFromFollowedSites', // Uses Graph to fetch news from Core Root site (filtered on channel) plus Search to fetch modern news from other sites that the user is following. News from followed sites return all modern news, and is NOT filtered by channel.\r\n SearchNewsFromAnySiteWithChannelField = 'SearchNewsFromAnySiteWithChannelField', // Uses Search to fetch modern news from any site (including core root site), provided that pages library have the Bool channel column. Filtered by the user's channel. If no channel is set, on the root site it shows for everyone, on other sites it will not be fetched.\r\n}\r\n","
    \r\n
    \r\n \r\n

    \r\n {{_box.Title}}\r\n

    \r\n \r\n

    \r\n {{_box.Title}}\r\n

    \r\n \r\n

    \r\n {{_box.Title}}\r\n

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

    \r\n

    \r\n

    \r\n

    \r\n
    \r\n
    \r\n\r\n \r\n \r\n {{_box.Title}}\r\n \r\n
    \r\n","import { Component, OnInit, Input, NgModule, ChangeDetectionStrategy, ChangeDetectorRef } from '@angular/core';\r\nimport { InfoB } from '@app/models/infobox';\r\nimport { CommonModule } from '@angular/common';\r\nimport { LinkModule } from '@app/directives/link.directive';\r\n\r\n@Component({\r\n selector: 'app-text',\r\n templateUrl: './text.component.html',\r\n styleUrls: ['./text.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush\r\n})\r\nexport class TextComponent implements OnInit {\r\n _box: InfoB;\r\n\r\n @Input() set box(value) {\r\n this._box = value;\r\n this.cdr.markForCheck();\r\n }\r\n @Input() styleClasses: string | string[] | Set | { [klass: string]: any; };\r\n @Input() customStyle: { [klass: string]: any; };\r\n @Input() isAreaHero: boolean;\r\n constructor(private cdr: ChangeDetectorRef) { }\r\n\r\n ngOnInit(): void {\r\n\r\n }\r\n\r\n}\r\n@NgModule({\r\n declarations: [TextComponent],\r\n exports: [TextComponent],\r\n imports: [\r\n CommonModule,\r\n LinkModule,\r\n ]\r\n})\r\nexport class TextInfoboxModule { }\r\n","
    \r\n
    \r\n \r\n

    \r\n {{_box.Title}}\r\n

    \r\n \r\n

    \r\n {{_box.Title}}\r\n

    \r\n \r\n

    \r\n {{_box.Title}}\r\n

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

    \r\n

    \r\n

    \r\n

    \r\n
    \r\n
    \r\n\r\n \r\n \r\n {{_box.Title}}\r\n \r\n\r\n\r\n
    \r\n","import { Component, OnInit, Input, NgModule, ChangeDetectorRef, ChangeDetectionStrategy } from '@angular/core';\r\nimport { InfoB } from '@app/models/infobox';\r\nimport { CommonModule } from '@angular/common';\r\nimport { CssBackgroundImageProxyModule } from '@app/directives/css-background-image-proxy.directive';\r\nimport { LinkModule } from '@app/directives/link.directive';\r\n\r\n@Component({\r\n selector: 'app-picture',\r\n templateUrl: './picture.component.html',\r\n styleUrls: ['./picture.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush\r\n})\r\nexport class PictureComponent implements OnInit {\r\n _box: InfoB;\r\n\r\n @Input() set box(value) {\r\n this._box = value;\r\n this.cdr.markForCheck();\r\n }\r\n\r\n @Input() styleClasses: string | string[] | Set | { [klass: string]: any; };\r\n @Input() customStyle: { [klass: string]: any; };\r\n @Input() isAreaHero: boolean;\r\n constructor(private cdr: ChangeDetectorRef) { }\r\n\r\n ngOnInit(): void {\r\n\r\n }\r\n\r\n}\r\n@NgModule({\r\n declarations: [PictureComponent],\r\n exports: [PictureComponent],\r\n imports: [\r\n CommonModule,\r\n CssBackgroundImageProxyModule,\r\n LinkModule,\r\n ]\r\n})\r\nexport class PictureInfoboxModule { }\r\n","
    \r\n
    \r\n \r\n

    \r\n {{_box.Title}}\r\n

    \r\n \r\n

    \r\n {{_box.Title}}\r\n

    \r\n
    \r\n \r\n
    \r\n\r\n \r\n \r\n {{_box.Title}}\r\n \r\n\r\n
    \r\n\r\n\r\n\r\n
    \r\n \r\n
    \r\n
    \r\n
    \r\n","import { Component, OnInit, Input, NgModule, ViewChild, TemplateRef, ViewEncapsulation, ChangeDetectionStrategy, ChangeDetectorRef } from '@angular/core';\r\nimport { InfoB } from '@app/models/infobox';\r\nimport { CommonModule } from '@angular/common';\r\nimport { CssBackgroundImageProxyModule } from '@app/directives/css-background-image-proxy.directive';\r\nimport { MatDialog } from '@angular/material/dialog';\r\nimport { SafeModule } from '@app/pipes/safe.pipe';\r\nimport { LinkModule } from '@app/directives/link.directive';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatButtonModule } from '@angular/material/button';\r\n\r\n@Component({\r\n selector: 'app-video',\r\n templateUrl: './video.component.html',\r\n styleUrls: ['./video.component.scss'],\r\n encapsulation: ViewEncapsulation.None,\r\n changeDetection: ChangeDetectionStrategy.OnPush\r\n})\r\nexport class VideoComponent implements OnInit {\r\n _box: InfoB;\r\n\r\n @Input() set box(value) {\r\n this._box = value;\r\n this.cdr.markForCheck();\r\n }\r\n @Input() styleClasses: string | string[] | Set | { [klass: string]: any; };\r\n @Input() customStyle: { [klass: string]: any; };\r\n @Input() isAreaHero: boolean;\r\n @ViewChild('videoTmpl', { static: true }) videoTmpl: TemplateRef;\r\n\r\n constructor(private dialog: MatDialog, private cdr: ChangeDetectorRef) { }\r\n\r\n ngOnInit(): void {\r\n }\r\n\r\n openVideoDialog(event: any) {\r\n event.preventDefault();\r\n this.dialog.open(this.videoTmpl, {\r\n id: 'videoTmpl',\r\n hasBackdrop: true,\r\n closeOnNavigation: true,\r\n panelClass: 'infobox-videoplayingcontainer',\r\n autoFocus: true,\r\n });\r\n }\r\n closeVideo() {\r\n this.dialog.getDialogById('videoTmpl').close();\r\n }\r\n}\r\n@NgModule({\r\n declarations: [VideoComponent],\r\n exports: [VideoComponent],\r\n imports: [\r\n CommonModule,\r\n CssBackgroundImageProxyModule,\r\n SafeModule,\r\n LinkModule,\r\n MatIconModule,\r\n MatButtonModule,\r\n ]\r\n})\r\nexport class VideoInfoboxModule { }\r\n","
    \r\n \r\n \r\n \r\n \r\n \r\n
    \r\n","import { Component, OnInit, Input, NgModule, ViewEncapsulation, ChangeDetectionStrategy, ChangeDetectorRef } from '@angular/core';\r\nimport { InfoB, InfoBoxType } from '@app/models/infobox';\r\nimport { CommonModule } from '@angular/common';\r\nimport { RouterModule } from '@angular/router';\r\nimport { FeatureSettingsStoreService } from '@app/services/feature-settings-store.service';\r\nimport { MatSlideToggleModule } from '@angular/material/slide-toggle';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatMenuModule } from '@angular/material/menu';\r\nimport { SortablejsModule } from 'ngx-sortablejs';\r\nimport { NgSubscribeModule } from '@app/directives/ng-subscribe.directive';\r\nimport { InfoBoxUtilities } from '@app/components/infobox-zone/infobox-utility';\r\nimport { TextInfoboxModule } from '@app/components/infobox-zone/text/text.component';\r\nimport { PictureInfoboxModule } from '@app/components/infobox-zone/picture/picture.component';\r\nimport { VideoInfoboxModule } from '@app/components/infobox-zone/video/video.component';\r\n\r\n@Component({\r\n selector: 'app-infobox',\r\n templateUrl: './infobox.component.html',\r\n styleUrls: ['./infobox.component.scss'],\r\n encapsulation: ViewEncapsulation.None,\r\n changeDetection: ChangeDetectionStrategy.OnPush\r\n})\r\nexport class InfoboxComponent implements OnInit {\r\n\r\n _box: InfoB;\r\n\r\n @Input() set box(value) {\r\n this._box = value;\r\n this.cdr.markForCheck();\r\n }\r\n\r\n @Input() isAreaHero: boolean;\r\n @Input() textAlignmentClass: string;\r\n featureSettings = this.featureSettingsStoreService.state;\r\n\r\n constructor(\r\n private featureSettingsStoreService: FeatureSettingsStoreService, private cdr: ChangeDetectorRef) {\r\n }\r\n\r\n ngOnInit(): void {\r\n\r\n }\r\n\r\n getOverlayClass(box: InfoB) {\r\n if (box.Type === InfoBoxType.Picture || box.Type === InfoBoxType.Video) {\r\n return this.featureSettings.disableOverlayOnInfoBoxes ? 'gradient-overlay-only-hover' : 'gradient-overlay';\r\n } else {\r\n return '';\r\n }\r\n }\r\n\r\n getStyleClasses(box: InfoB) {\r\n return `${InfoBoxUtilities.getStyleClasses(box)} ${this.textAlignmentClass ? this.textAlignmentClass : 'justify-content-center'}`;\r\n }\r\n\r\n getCustomStyle(box: InfoB) {\r\n return InfoBoxUtilities.getCustomStyle(box);\r\n }\r\n\r\n}\r\n@NgModule({\r\n declarations: [InfoboxComponent],\r\n exports: [InfoboxComponent],\r\n imports: [\r\n CommonModule,\r\n TextInfoboxModule,\r\n PictureInfoboxModule,\r\n VideoInfoboxModule,\r\n MatSlideToggleModule,\r\n MatButtonModule,\r\n RouterModule,\r\n MatMenuModule,\r\n SortablejsModule,\r\n NgSubscribeModule\r\n ]\r\n})\r\nexport class InfoboxModule { }\r\n","import { UserTabComponentConfiguration } from './user-tab-configuration';\r\n\r\nexport class Component {\r\n public Id: string;\r\n public Title?: string;\r\n public Description?: string;\r\n public IconClass?: string;\r\n public IconUrl?: string;\r\n public UserTabConfigurations?: UserTabComponentConfiguration;\r\n public Configurations: { [key: string]: any; } = {};\r\n\r\n constructor(opt?: Partial) {\r\n Object.assign(this, opt);\r\n }\r\n}\r\n","import { HttpClient } from '@angular/common/http';\r\nimport { Injectable } from '@angular/core';\r\nimport { MatSnackBar } from '@angular/material/snack-bar';\r\nimport { Constants } from '@app/common/constants';\r\nimport { HttpHelper } from '@app/common/http-helper';\r\nimport { Utilities } from '@app/common/utilities';\r\nimport { AlertTemplatesComponent } from '@app/components/alert-templates/alert-templates.component';\r\nimport { LanguageType, UserLanguageTerm } from '@app/models/user-language-term';\r\nimport { BroadcastService } from '@app/services/broadcast.service';\r\nimport { CacheService } from '@app/services/cache.service';\r\nimport { LanguageTermService } from '@app/services/language-term.service';\r\nimport { RestaurantMenuService } from '@app/services/restaurant-menu.service';\r\nimport { RestaurantService } from '@app/services/restaurant.service';\r\nimport { UserService } from '@app/services/user.service';\r\nimport { addHours } from 'date-fns';\r\nimport { concat, forkJoin, Observable, of, Subject } from 'rxjs';\r\nimport { catchError, map, mergeMap, shareReplay, takeUntil, tap } from 'rxjs/operators';\r\nimport { AppTileService } from './app-tile.service';\r\nimport { NewsService } from './news.service';\r\nimport { UserAppTileService } from './user-app-tile.service';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class UserLanguageTermService {\r\n\r\n constructor(private http: HttpClient,\r\n private cache: CacheService,\r\n private httpHelper: HttpHelper,\r\n private snackBar: MatSnackBar,\r\n private newsService: NewsService,\r\n private userAppTileService: UserAppTileService,\r\n private appTileService: AppTileService,\r\n private broadcastService: BroadcastService,\r\n private restaurantService: RestaurantService,\r\n private restaurantMenuService: RestaurantMenuService,\r\n private userService: UserService,\r\n private languageTermService: LanguageTermService) { }\r\n\r\n private readonly cacheKey = 'UserLanguageTermsService-getUserLanguageTerms';\r\n public useCache = true;\r\n private getUserLanguageTerms$: Observable>;\r\n private reload$ = new Subject();\r\n\r\n reload() {\r\n this.useCache && this.cache.removeFromPersistentCache(this.cacheKey);\r\n this.getUserLanguageTerms$ = null;\r\n this.reload$.next();\r\n\r\n this.newsService.reloadAllPersonalNews();\r\n this.newsService.reloadAllTopNews();\r\n this.userAppTileService.reload();\r\n this.appTileService.reload();\r\n this.broadcastService.reload();\r\n this.restaurantService.reload();\r\n this.restaurantMenuService.reload();\r\n }\r\n\r\n getUserLanguageTerms(): Observable> {\r\n if (this.getUserLanguageTerms$) {\r\n return this.getUserLanguageTerms$;\r\n } else {\r\n this.getUserLanguageTerms$ = this.http.get>(`${Constants.API_ENDPOINT}/me/userlanguageterms`)\r\n .pipe(\r\n map(response => {\r\n return response.map(p => new UserLanguageTerm(p));\r\n }),\r\n tap(data => {\r\n this.useCache && this.cache.set(this.cacheKey, data);\r\n }),\r\n catchError(this.httpHelper.handleError({ operation: 'getUserLanguageTerms', result: new Array(), rethrow: true })),\r\n takeUntil(this.reload$),\r\n shareReplay({ bufferSize: 1, refCount: true }));\r\n\r\n if (this.useCache) {\r\n const cachedData = this.cache.get>(this.cacheKey);\r\n if (cachedData) {\r\n return concat(of(cachedData), this.getUserLanguageTerms$);\r\n }\r\n }\r\n return this.getUserLanguageTerms$;\r\n }\r\n }\r\n\r\n add(personalization: UserLanguageTerm, doReload = true): Observable {\r\n return this.http.post>(`${Constants.API_ENDPOINT}/me/userlanguageterms`, personalization)\r\n .pipe(\r\n tap(response => {\r\n console.log(`added user language: `);\r\n console.log(response);\r\n if (doReload) {\r\n this.reload();\r\n }\r\n }),\r\n catchError(this.httpHelper.handleError({ operation: 'add', result: {}, rethrow: true })));\r\n }\r\n\r\n delete(id: string): Observable {\r\n return this.http.delete(`${Constants.API_ENDPOINT}/me/userlanguageterms/${id}`, {\r\n\r\n })\r\n .pipe(\r\n tap(response => {\r\n console.log(`deleted user language: `);\r\n console.log(response);\r\n this.reload();\r\n }),\r\n catchError(this.httpHelper.handleError({ operation: 'delete', result: {}, rethrow: true })));\r\n }\r\n\r\n syncUserLanguageTermsWithAD(currentRouteUrl: string): Observable {\r\n const languagesToPushFromAD = new Array();\r\n const alreadyPushedCacheKey = `${this.cacheKey}-alreadyPushed`;\r\n const alreadyPushed = this.cache.get(alreadyPushedCacheKey); // use this to make sure we only try to do the push/sync operation once per 24h\r\n const requestedPath = this.cache.getWithCustomKey(Constants.WANTED_ROUTE_PATH);\r\n if (currentRouteUrl.endsWith('settings') || requestedPath?.endsWith('settings')) {\r\n return of(null);\r\n }\r\n\r\n if (!alreadyPushed) {\r\n return forkJoin(\r\n [\r\n this.languageTermService.getLanguages(true),\r\n this.userService.getMyDetailsFromMsGraph(true),\r\n this.getUserLanguageTerms()\r\n ])\r\n .pipe(\r\n mergeMap(([languages, myProperties, userLanguageTerms]) => {\r\n\r\n languages.forEach(language => {\r\n\r\n // check userLanguages (settings in database) to see if this should be selected\r\n const matchingUserLanguageTerm = userLanguageTerms.find(p => p.LanguageTermId === language.Guid);\r\n\r\n let azureADUserProperty: string;\r\n\r\n const mappingProperty = language.LocalCustomProperties[Constants.SETTINGS_GRAPH_API_PERSONALIZATION_MAPPING_KEY];\r\n\r\n if (mappingProperty && myProperties) {\r\n const mappingPropertyKey = Object.keys(myProperties).find(key => key.toLowerCase() === mappingProperty.toLowerCase());\r\n if (mappingProperty) {\r\n azureADUserProperty = myProperties[mappingPropertyKey];\r\n }\r\n }\r\n\r\n // check for languages pushed from AD to this user\r\n if (azureADUserProperty) {\r\n let matchingProperty = language.Name.replace(/&/g, '&').toLowerCase() === azureADUserProperty.toLowerCase();\r\n if (!matchingProperty) {\r\n matchingProperty = language.Labels.some(l => l.Name.replace(/&/g, '&').toLowerCase() === azureADUserProperty.toLowerCase());\r\n }\r\n\r\n if (matchingProperty) {\r\n if (!matchingUserLanguageTerm) {\r\n if (!languagesToPushFromAD.find(p => p.LanguageTermId === language.Guid) && !userLanguageTerms.find(p => p.LanguageTermId === language.Guid)) {\r\n languagesToPushFromAD.push(new UserLanguageTerm({ LanguageTermId: language.Guid, LanguageType: LanguageType.FromAd }));\r\n }\r\n }\r\n }\r\n }\r\n });\r\n\r\n this.cache.set(alreadyPushedCacheKey, true, addHours(new Date(), 24));\r\n\r\n if (languagesToPushFromAD.length > 0 && !alreadyPushed) {\r\n const languagesToAdd = languagesToPushFromAD.map(p => this.add(p, false));\r\n const concatenatedAdds = concat(...languagesToAdd);\r\n return forkJoin([concatenatedAdds]);\r\n } else {\r\n return of(null);\r\n }\r\n }),\r\n tap((result) => {\r\n if (result) {\r\n Utilities.openSnackBar(this.snackBar, AlertTemplatesComponent, AlertTemplatesComponent.languageselectionupdated);\r\n }\r\n this.reload();\r\n })\r\n );\r\n } else {\r\n return of(null);\r\n }\r\n }\r\n\r\n}\r\n","import { FirstDayWizardStep } from '@app/models/first-day-step';\r\n\r\nexport class User {\r\n // The user principal name and identifier in db.\r\n public UpnId: string;\r\n public ShowNewsFromFollowedSites: boolean;\r\n public FirstDayWizardStep: FirstDayWizardStep;\r\n\r\n constructor(opt?: Partial) {\r\n Object.assign(this, opt);\r\n }\r\n}\r\n","import { HttpClient, HttpParams } from '@angular/common/http';\r\nimport { Injectable } from '@angular/core';\r\nimport { Constants } from '@app/common/constants';\r\nimport { HttpHelper } from '@app/common/http-helper';\r\nimport { GraphBatchData, GraphBatchRequest } from '@app/models/graph-batch-request';\r\nimport { PersonExtended } from '@app/models/person-extended';\r\nimport { User as UserModel } from '@app/models/user';\r\nimport { CacheService } from '@app/services/cache.service';\r\nimport { Person, User } from '@microsoft/microsoft-graph-types';\r\nimport { concat, forkJoin, iif, Observable, of, Subject, throwError } from 'rxjs';\r\nimport { catchError, map, shareReplay, takeUntil, tap } from 'rxjs/operators';\r\nimport { FeatureSettingsStoreService } from './feature-settings-store.service';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class UserService {\r\n constructor(private http: HttpClient, private cache: CacheService, private featureStoreSettingsService: FeatureSettingsStoreService, private httpHelper: HttpHelper) { }\r\n\r\n private readonly cacheKeyPrefix = 'UserService';\r\n\r\n public useCache = true;\r\n\r\n private getMyDetailsFromMsGraph$: Observable;\r\n private getUserPhotoByUpn$ = new Map>();\r\n private getUserByUpn$ = new Map>();\r\n private getSingleUserByUpn$ = new Map>();\r\n private getOrCreateMe$: Observable;\r\n private reload$ = new Subject();\r\n private getUserPhotoOfBlobByUpn$ = new Map>();\r\n private defaultSelectProperties = 'id,userPrincipalName,displayName,givenName,surname,businessPhones,mobilePhone,displayName,postalCode,jobTitle,department,officeLocation,mail,department,state,city,proxyAddresses,postalAddress,birthday,streetAddress';\r\n\r\n public reload() {\r\n this.reload$.next();\r\n this.getOrCreateMe$ = null;\r\n if (this.useCache) {\r\n const cacheKey = `${this.cacheKeyPrefix}-getOrCreateMe`;\r\n this.cache.removeFromPersistentCache(cacheKey);\r\n }\r\n }\r\n\r\n getOrCreateMe(): Observable {\r\n if (this.getOrCreateMe$) {\r\n return this.getOrCreateMe$;\r\n } else {\r\n const cacheKey = `${this.cacheKeyPrefix}-getOrCreateMe`;\r\n this.getOrCreateMe$ = this.http.get(`${Constants.API_ENDPOINT}/users/me`)\r\n .pipe(map(user => {\r\n if (user) {\r\n if (user.ShowNewsFromFollowedSites === null) {\r\n user.ShowNewsFromFollowedSites = true;\r\n }\r\n this.useCache && this.cache.set(cacheKey, user);\r\n return user;\r\n }\r\n }),\r\n catchError(err => {\r\n return iif(() =>\r\n err.status === 404,\r\n this.http.post(`${Constants.API_ENDPOINT}/users`, new UserModel({ ShowNewsFromFollowedSites: true, }))\r\n .pipe(map(user => {\r\n this.useCache && this.cache.set(cacheKey, user);\r\n return user;\r\n })),\r\n throwError(err)\r\n );\r\n }),\r\n catchError(this.httpHelper.handleError({ operation: 'getOrCreateMe', result: null, rethrow: true, cacheKey: cacheKey })),\r\n takeUntil(this.reload$),\r\n shareReplay({ bufferSize: 1, refCount: true }));\r\n\r\n if (this.useCache) {\r\n const cachedData = this.cache.get(cacheKey);\r\n if (cachedData) {\r\n return concat(of(cachedData), this.getOrCreateMe$);\r\n }\r\n }\r\n return this.getOrCreateMe$;\r\n }\r\n }\r\n\r\n updateMe(user: UserModel): Observable {\r\n const fetchOperation = this.http.put(`${Constants.API_ENDPOINT}/users/`, user, {\r\n\r\n })\r\n .pipe(\r\n map(response => {\r\n // invalidate cache\r\n this.reload();\r\n return true;\r\n }),\r\n catchError(this.httpHelper.handleError({ operation: 'updateMe', result: false, rethrow: true })));\r\n\r\n return fetchOperation;\r\n }\r\n\r\n getUserPhotoByUpn(userPrincipalName: string): Observable {\r\n if (this.getUserPhotoByUpn$.has(userPrincipalName)) {\r\n return this.getUserPhotoByUpn$.get(userPrincipalName);\r\n } else {\r\n const apiEndPoint = `${Constants.GRAPH_API_ENDPOINT}${Constants.GRAPH_API_VERSION_ONE}/users/${userPrincipalName}/photo/$value`;\r\n\r\n this.getUserPhotoByUpn$.set(userPrincipalName, this.http.get(apiEndPoint, {\r\n responseType: 'blob',\r\n })\r\n .pipe(map(result => {\r\n return URL.createObjectURL(result);\r\n }),\r\n catchError(err => {\r\n if (err.status === 404) {\r\n return of(null);\r\n } else {\r\n return throwError(err);\r\n }\r\n }),\r\n shareReplay({ bufferSize: 1, refCount: true })));\r\n return this.getUserPhotoByUpn$.get(userPrincipalName);\r\n }\r\n }\r\n\r\n // This method returns blob response from graph api which is used in the api to write on the user cv\r\n getUserPhotoOfBlobByUpn(userPrincipalName: string): Observable {\r\n if (this.getUserPhotoOfBlobByUpn$.has(userPrincipalName)) {\r\n return this.getUserPhotoOfBlobByUpn$.get(userPrincipalName);\r\n } else {\r\n const apiEndPoint = `${Constants.GRAPH_API_ENDPOINT}${Constants.GRAPH_API_VERSION_ONE}/users/${userPrincipalName}/photo/$value`;\r\n\r\n this.getUserPhotoOfBlobByUpn$.set(userPrincipalName, this.http.get(apiEndPoint,\r\n { responseType: 'blob' })\r\n .pipe(map(result => {\r\n return result;\r\n }),\r\n catchError(err => {\r\n if (err.status === 404) {\r\n return of(null);\r\n } else {\r\n return throwError(err);\r\n }\r\n }),\r\n shareReplay({ bufferSize: 1, refCount: true })));\r\n return this.getUserPhotoOfBlobByUpn$.get(userPrincipalName);\r\n }\r\n }\r\n\r\n getSingleUserByUpn(userPrincipalName: string): Observable {\r\n if (this.getSingleUserByUpn$.has(userPrincipalName)) {\r\n return this.getSingleUserByUpn$.get(userPrincipalName);\r\n } else {\r\n const httpParams = new HttpParams()\r\n .append('$select', this.defaultSelectProperties);\r\n\r\n const apiEndPoint = `${Constants.GRAPH_API_ENDPOINT}${Constants.GRAPH_API_BETA_VERSION}/users/${userPrincipalName}`;\r\n\r\n this.getSingleUserByUpn$.set(userPrincipalName, this.http.get(apiEndPoint, { params: httpParams })\r\n .pipe(\r\n map(response => {\r\n return response as Array;\r\n }),\r\n catchError(err => {\r\n if (err.status === 404) {\r\n return of(null);\r\n } else {\r\n return throwError(err);\r\n }\r\n }),\r\n shareReplay({ bufferSize: 1, refCount: true })));\r\n\r\n return this.getSingleUserByUpn$.get(userPrincipalName);\r\n }\r\n }\r\n\r\n getUserByUpn(userPrincipalName: string): Observable {\r\n if (this.getUserByUpn$.has(userPrincipalName)) {\r\n return this.getUserByUpn$.get(userPrincipalName);\r\n } else {\r\n const apiEndPoint = `${Constants.GRAPH_API_ENDPOINT}${Constants.GRAPH_API_VERSION_ONE}/users/${userPrincipalName}`;\r\n this.getUserByUpn$.set(userPrincipalName,\r\n this.http.get(apiEndPoint, {\r\n responseType: 'json',\r\n })\r\n .pipe(\r\n map(result => {\r\n return result as User;\r\n }),\r\n catchError(err => {\r\n if (err.status === 404) {\r\n return this.searchMsGraphForUsers(userPrincipalName, 1)\r\n .pipe(\r\n map(results => {\r\n if (results?.length > 0) {\r\n return results[0];\r\n } else {\r\n return null;\r\n }\r\n })\r\n );\r\n } else {\r\n return throwError(err);\r\n }\r\n }),\r\n shareReplay({ bufferSize: 1, refCount: true })));\r\n return this.getUserByUpn$.get(userPrincipalName);\r\n }\r\n }\r\n\r\n /*\r\n * Queries MS Graph for multiple user photos.\r\n */\r\n getBatchUserPhotoByUpn(userPrincipalNames: Array): Observable> {\r\n\r\n if (userPrincipalNames.length === 0) {\r\n return of(userPrincipalNames);\r\n }\r\n\r\n const data = {} as GraphBatchData;\r\n data.requests = userPrincipalNames.map((upn, index) => {\r\n return {\r\n id: index.toString(),\r\n method: 'GET',\r\n url: `/users/${upn}/photo/$value`,\r\n headers: {\r\n 'responseType': 'blob'\r\n },\r\n } as GraphBatchRequest;\r\n });\r\n\r\n const fetchOperation = this.http.post(`${Constants.GRAPH_API_ENDPOINT + Constants.GRAPH_API_VERSION_ONE}/$batch`, data)\r\n .pipe(\r\n map(response => {\r\n return response.responses.map(r => {\r\n const upn = userPrincipalNames[r.id];\r\n\r\n if (r.status.toString().startsWith('4')) {\r\n return upn;\r\n }\r\n\r\n return `data:image/png;base64,${r.body}`;\r\n });\r\n }),\r\n catchError(this.httpHelper.handleError({ operation: 'getBatchUserPhotoByUpn', result: ({} as Array), rethrow: true })));\r\n\r\n return fetchOperation;\r\n }\r\n\r\n /** Batch get user entries by UPN */\r\n getBatchUserByUpn(userPrincipalNames: Array): Observable> {\r\n\r\n // remove empty entries\r\n if (userPrincipalNames) {\r\n userPrincipalNames = userPrincipalNames.filter(f => f);\r\n }\r\n\r\n // abort if null\r\n if (!userPrincipalNames || !userPrincipalNames.length) {\r\n return of([]);\r\n }\r\n\r\n // limit for each batch request is 20 names\r\n const chunkSize = 20;\r\n const allRequests: Observable>[] = [];\r\n for (let i = 0, j = userPrincipalNames.length; i < j; i += chunkSize) {\r\n const currentUpnChunk = userPrincipalNames.slice(i, i + chunkSize);\r\n allRequests.push(this.getBatchUserByUpnWorker(currentUpnChunk));\r\n }\r\n\r\n return forkJoin(allRequests).pipe(map(allResults => allResults.reduce((a, b) => [...a, ...b], [])));\r\n }\r\n\r\n /** Actual worker method for getBatchUserByUpn, note that limit is 20 names. */\r\n private getBatchUserByUpnWorker(userPrincipalNames: Array): Observable> {\r\n\r\n // since this is a private function called by the above call function, this should never exceed 20 upns\r\n // if someone calls it wrongly, log error\r\n if (userPrincipalNames.length > 20) {\r\n userPrincipalNames = userPrincipalNames.slice(0, 20);\r\n console.error('getBatchUserByUpnWorker called with moe than 20 names, will only process 20x');\r\n }\r\n\r\n const data = {} as GraphBatchData;\r\n data.requests = userPrincipalNames.map((upn, index) => {\r\n return {\r\n id: index.toString(),\r\n method: 'GET',\r\n url: `/users/${upn}`,\r\n headers: {\r\n 'responseType': 'json'\r\n },\r\n } as GraphBatchRequest;\r\n });\r\n\r\n return this.http.post(`${Constants.GRAPH_API_ENDPOINT + Constants.GRAPH_API_VERSION_ONE}/$batch`, data)\r\n .pipe(\r\n map(response => {\r\n return response.responses.map(r => {\r\n const upn = userPrincipalNames[r.id];\r\n\r\n if (r.status.toString().startsWith('4')) {\r\n return {\r\n displayName: upn,\r\n mail: upn\r\n };\r\n }\r\n\r\n return r.body as Person;\r\n });\r\n }),\r\n catchError(this.httpHelper.handleError({ operation: 'getBatchUserByUpn', result: ({} as Array), rethrow: true })));\r\n }\r\n\r\n /*\r\n * Queries MS Graph for details about the signed in user.\r\n * Only specified properties are returned. Add more if you\r\n * need, see: https://docs.microsoft.com/en-us/graph/api/resources/user?view=graph-rest-1.0\r\n * For reference about return values for assignedPlans and assignedLicenses see https://docs.microsoft.com/en-us/azure/active-directory/users-groups-roles/licensing-service-plan-reference\r\n */\r\n getMyDetailsFromMsGraph(noCache?: boolean): Observable {\r\n if (this.getMyDetailsFromMsGraph$) {\r\n return this.getMyDetailsFromMsGraph$;\r\n } else {\r\n const cacheKey = `${this.cacheKeyPrefix}-myDetails`;\r\n const properties = this.featureStoreSettingsService.state.myDetailsMsGraphProperties.join(',');\r\n\r\n this.getMyDetailsFromMsGraph$ = this.http\r\n .get(`${Constants.GRAPH_API_ENDPOINT + Constants.GRAPH_API_VERSION_ONE}/me/?$select=${properties}`)\r\n .pipe(\r\n map(response => {\r\n const result = response as User;\r\n // console.log(`fetched current user details: `, result);\r\n return result;\r\n }),\r\n tap((data) => {\r\n this.useCache && this.cache.set(cacheKey, data);\r\n }),\r\n catchError(this.httpHelper.handleError({ operation: 'getMyDetailsFromMsGraph', result: ({} as User), rethrow: true, cacheKey: cacheKey })),\r\n shareReplay({ bufferSize: 1, refCount: true })\r\n );\r\n\r\n if (this.useCache && !noCache) {\r\n const cachedData = this.cache.get(cacheKey);\r\n if (cachedData) {\r\n return concat(of(cachedData), this.getMyDetailsFromMsGraph$);\r\n }\r\n }\r\n\r\n return this.getMyDetailsFromMsGraph$;\r\n }\r\n }\r\n\r\n getUserFromMsGraph(upn: string): Observable {\r\n const cacheKey = `${this.cacheKeyPrefix}-getUserFromMsGraph-${upn}`;\r\n\r\n const fetchOperation = this.http\r\n .get(`${Constants.GRAPH_API_ENDPOINT + Constants.GRAPH_API_VERSION_ONE}/users/${upn}`)\r\n .pipe(\r\n map(response => {\r\n const result = response as User;\r\n return result;\r\n }),\r\n tap((data) => {\r\n this.useCache && this.cache.set(cacheKey, data);\r\n }),\r\n catchError(this.httpHelper.handleError({ operation: 'getUserFromMsGraph', result: ({} as User), rethrow: true, cacheKey: cacheKey })),\r\n shareReplay({ bufferSize: 1, refCount: true })\r\n );\r\n\r\n if (this.useCache) {\r\n const cachedData = this.cache.get(cacheKey);\r\n if (cachedData) {\r\n return of(cachedData);\r\n }\r\n }\r\n\r\n return fetchOperation;\r\n\r\n }\r\n\r\n /*\r\n * Search for users using MS Graph and comma separated keywords (each having a graph call of its own)\r\n * Each user returned will contain information of which keyword(s) was matched in PersonExtended.SearchTermHits\r\n */\r\n searchMsGraphForUsersWithMultipleKeywords(keywords: string, max: number): Observable> {\r\n\r\n // If there is only a single search term, search normally using the parameter 'max'\r\n if (keywords.indexOf(',') === -1) {\r\n const t = this.searchMsGraphForUsersWithKeyword(keywords, max);\r\n return t;\r\n }\r\n\r\n // If there is more than one search term, upp the max count to the supported max (999). TODO: implement pagination\r\n // This is so that we have a better chance of combining a correct 'AND' match later on (the graph results will be combined with results from our CV database)\r\n const multiKeyWordMax = 999;\r\n\r\n const searchTerms = keywords.split(',');\r\n const uniqueUsers: PersonExtended[] = [];\r\n const graphCalls = searchTerms.map(keyword => this.searchMsGraphForUsersWithKeyword(keyword.trim(), multiKeyWordMax));\r\n return forkJoin([...graphCalls]).pipe(\r\n map(resultSets => {\r\n resultSets.forEach(userList => {\r\n\r\n userList.forEach(user => {\r\n\r\n // if the user is already in the unique list of users then only update the SearchTermHits\r\n const matchingUser = uniqueUsers.find(u => {\r\n if (u.userPrincipalName && user.userPrincipalName) {\r\n return u.userPrincipalName.toLowerCase() === user.userPrincipalName.toLowerCase();\r\n }\r\n return false;\r\n });\r\n if (matchingUser) {\r\n user.SearchTermHits.forEach(term => {\r\n if (matchingUser.SearchTermHits.indexOf(term) === -1) {\r\n matchingUser.SearchTermHits.push(term);\r\n }\r\n });\r\n } else {\r\n\r\n // user not already in the list, add it\r\n uniqueUsers.push(user);\r\n }\r\n });\r\n });\r\n\r\n uniqueUsers.sort((x, y) => y.SearchTermHits.length - x.SearchTermHits.length);\r\n // note that we don't trim down to 'max' number of hits here\r\n // This is on purpose so that we have a better chance of combining a correct 'AND' match later on (this result will be combined with results from our CV database)\r\n return uniqueUsers;\r\n })\r\n );\r\n }\r\n\r\n /*\r\n * Search for users using MS Graph\r\n * cast to PersonExtended and include the search term used in the result\r\n */\r\n searchMsGraphForUsersWithKeyword(keyword: string, max: number): Observable> {\r\n\r\n // use searchMsGraphForUser but cast to PersonExtended so we can set the 'SearchTermHits' property. This is so that we can do a proper 'AND' matching between keywords later on.\r\n return this.searchMsGraphForUsers(keyword, max)\r\n .pipe(\r\n map(results => {\r\n // cast to PersonExtended\r\n const users = results as Array;\r\n users.map(user => {\r\n user.SearchTermHits = [keyword];\r\n return user;\r\n });\r\n return users;\r\n }));\r\n }\r\n\r\n /*\r\n * Search for users using MS Graph\r\n */\r\n searchMsGraphForUsers(keyword: string, max: number): Observable> {\r\n\r\n // abort if no keyword provided\r\n if (!keyword || !keyword.trim()) {\r\n return of([]);\r\n }\r\n\r\n // Note: MS Graph does not have free form search on\r\n // users objects, so until this is available we use\r\n // multiple startsWith fitlers\r\n const filter = `accountEnabled eq true and (` +\r\n `startswith(displayName,'${keyword}') or startswith(givenName,'${keyword}') or startswith(surname,'${keyword}') or startswith(mail,'${keyword}') or startswith(userPrincipalName,'${keyword}')` +\r\n ` or startswith(city, '${keyword}')` +\r\n ` or startswith(department, '${keyword}')` +\r\n ` or startswith(jobTitle, '${keyword}')` +\r\n ` or startswith(state, '${keyword}')` +\r\n `)` + // close the and clause in \"accountEnabled eq true and (\" here\r\n this.featureStoreSettingsService.state.userServiceAppendedFilter; // Allows adding additional clauese to the filter, by default this is an empty string\r\n\r\n const httpParams = new HttpParams()\r\n .append('$filter', filter)\r\n .append('$top', `${max}`);\r\n\r\n const fetchOperation = this.http.get(`${Constants.GRAPH_API_ENDPOINT + Constants.GRAPH_API_BETA_VERSION}/users`, { params: httpParams })\r\n .pipe(\r\n map(response => {\r\n const result = response.value as Array;\r\n return result;\r\n }),\r\n catchError(this.httpHelper.handleError({ operation: 'searchMsGraphForUsers', result: new Array(), rethrow: true}))\r\n );\r\n return fetchOperation;\r\n }\r\n\r\n /*\r\n * Search for related people using MS Graph\r\n */\r\n getRelatedPeople(top: number): Observable> {\r\n\r\n const filter = 'personType/class eq \\'Person\\' and personType/subclass eq \\'OrganizationUser\\'' + this.featureStoreSettingsService.state.userServiceAppendedFilter;\r\n const cacheKey = `${this.cacheKeyPrefix}-getRelatedPeople-${top}`;\r\n const httpParams = new HttpParams()\r\n .append('$top', top.toString())\r\n .append('$filter', filter);\r\n\r\n const fetchOperation = this.http.get(`${Constants.GRAPH_API_ENDPOINT + Constants.GRAPH_API_VERSION_ONE}/me/people`,\r\n { params: httpParams })\r\n .pipe(\r\n map(response => {\r\n return response.value as Array;\r\n }),\r\n tap(data => {\r\n this.useCache && this.cache.set(cacheKey, data);\r\n }),\r\n catchError(this.httpHelper.handleError({ operation: 'getRelatedPeople', result: new Array(), rethrow: true, cacheKey: cacheKey })));\r\n\r\n if (this.useCache) {\r\n const cachedData = this.cache.get>(cacheKey);\r\n if (cachedData) {\r\n return concat(of(cachedData), fetchOperation);\r\n }\r\n }\r\n return fetchOperation;\r\n }\r\n\r\n /*\r\n * Figures out if the user is licensed to use specified O365 services\r\n * Checks assignedLicenses (subscriptions) and assignedPlans (individual licenses?) on the graph user object\r\n * Pass arrays with GUIDs, first required licenses then licenses that are disallowed\r\n * For assignedPlans the \"String ID\" can be used as well. This is however not available for subscriptions.\r\n * OR logic is used when passing more than one license\r\n * Rejected licenses take presidence over required ones\r\n * Resources to find GUIDs and String IDs:\r\n * In graph explorer (https://developer.microsoft.com/en-us/graph/graph-explorer) use query: https://graph.microsoft.com/v1.0/me/?$select=assignedLicenses,assignedPlans\r\n * MS doc: https://docs.microsoft.com/en-us/azure/active-directory/users-groups-roles/licensing-service-plan-reference\r\n */\r\n isUserLicensed(requiredLicenses: string[], rejectedLicenses: string[]): Observable {\r\n\r\n if (requiredLicenses.length === 0 && rejectedLicenses.length === 0) {\r\n return of(true);\r\n }\r\n\r\n return this.getMyDetailsFromMsGraph().pipe(\r\n map(user => {\r\n const enabledAssignedPlans = user.assignedPlans.filter(plan => plan.capabilityStatus === 'Enabled');\r\n const licenses =\r\n user.assignedLicenses.map(d => d.skuId.toLowerCase())\r\n .concat(enabledAssignedPlans.map(d => d.servicePlanId.toLowerCase()))\r\n .concat(enabledAssignedPlans.map(d => d.service.toLowerCase()));\r\n\r\n const rejected = rejectedLicenses.map(d => d.toLowerCase());\r\n const matchingRejectedLicenses = rejected.filter(element => licenses.includes(element));\r\n if (matchingRejectedLicenses.length > 0) {\r\n return false;\r\n }\r\n\r\n if (requiredLicenses.length === 0) {\r\n return true;\r\n }\r\n\r\n const required = requiredLicenses.map(d => d.toLowerCase());\r\n const matchingRequiredLicenses = required.filter(element => licenses.includes(element));\r\n return matchingRequiredLicenses.length > 0;\r\n })\r\n );\r\n\r\n }\r\n\r\n}\r\n","export enum Roles {\r\n Admin = 0,\r\n Editor = 1,\r\n CollabSiteCreator = 2,\r\n AppEditor = 3,\r\n MessageBroadcastEditor = 4,\r\n FooterEditor = 5,\r\n EditorDashboardEditor = 6,\r\n PowerBIEditor = 7\r\n}\r\n","import { parseISO } from 'date-fns';\r\nimport { LanguageTerm } from '@app/models/language-term';\r\nimport { ChannelTerm } from '@app/models/channel-term';\r\n\r\nexport class InfoB {\r\n public Id: number;\r\n public Type: InfoBoxType;\r\n public Title: string;\r\n public ShowTitle: boolean;\r\n public Content?: string;\r\n public LinkUrl?: string;\r\n public LinkDescription?: string;\r\n public PictureUrl?: string;\r\n public VideoEmbedCode?: string;\r\n public Style: InfoBoxStyle;\r\n public Width: InfoBoxWidth;\r\n public Height: InfoBoxHeight;\r\n public Order: number;\r\n public StartDate?: string;\r\n public EndDate?: string;\r\n public StartDateAsDate?: Date;\r\n public EndDateAsDate?: Date;\r\n public CustomTextColorHexCode?: string;\r\n public CustomBackgroundColorHexCode?: string;\r\n public CustomSize?: string;\r\n public ChannelTermInfoBoxes: Array;\r\n public LanguageTerm?: LanguageTerm;\r\n public LanguageTermId?: string;\r\n public Area: InfoBoxArea;\r\n public AreaId: string;\r\n public Route: InfoBoxRoute;\r\n public RouteId: string;\r\n public Modified: Date;\r\n public ModifiedBy: string;\r\n public CreatedBy: string;\r\n public Hidden: boolean;\r\n\r\n constructor(opt?: Partial) {\r\n if (opt) {\r\n if (opt.Modified && typeof opt.Modified === 'string') {\r\n opt.Modified = parseISO(opt.Modified);\r\n }\r\n\r\n if (opt.StartDate && typeof opt.StartDate === 'string') {\r\n opt.StartDateAsDate = parseISO(opt.StartDate);\r\n }\r\n\r\n if (opt.EndDate && typeof opt.EndDate === 'string') {\r\n opt.EndDateAsDate = parseISO(opt.EndDate);\r\n }\r\n }\r\n\r\n Object.assign(this, opt);\r\n }\r\n}\r\n\r\nexport interface InfoBoxArea {\r\n Id: string;\r\n}\r\n\r\nexport interface InfoBoxRoute {\r\n Id: string;\r\n}\r\n\r\nexport interface ChannelTermInfoBox {\r\n ChannelTerm: ChannelTerm;\r\n ChannelTermId: string;\r\n InfoBox: InfoB;\r\n InfoBoxId: number;\r\n}\r\n\r\nexport interface LanguageTermInfoBox {\r\n LanguageTerm: LanguageTerm;\r\n LanguageTermId: string;\r\n InfoBox: InfoB;\r\n InfoBoxId: number;\r\n}\r\n\r\nexport enum InfoBoxHeight {\r\n Normal = 0,\r\n Compact = 1,\r\n}\r\n\r\nexport enum InfoBoxWidth {\r\n Auto = 0,\r\n Width25Percent = 25,\r\n Width33Percent = 33,\r\n Width50Percent = 50,\r\n Width66Percent = 66,\r\n Width75Percent = 75,\r\n Width100Percent = 100,\r\n}\r\n\r\nexport enum InfoBoxStyle {\r\n None = 0,\r\n Accent1 = 1,\r\n Accent2 = 2,\r\n Accent3 = 3\r\n}\r\n\r\nexport enum InfoBoxType {\r\n Text = 0,\r\n Picture = 1,\r\n Video = 2\r\n}\r\n","import { AppTileBroadcastMessage } from '@app/models/app-tile-broadcast-message';\r\nimport { ChannelTermBroadcastMessage } from '@app/models/channel-term-broadcast-message';\r\nimport { parseISO } from 'date-fns';\r\n\r\nexport enum BroadcastType {\r\n Critical = 1,\r\n Warning = 2,\r\n Information = 3\r\n}\r\n\r\nexport class BroadcastMessage {\r\n public Id: number;\r\n public BroadcastType: BroadcastType;\r\n public Title: string;\r\n public Target?: string;\r\n public LinkUrl?: string;\r\n public LinkText?: string;\r\n public Message: string;\r\n public StartDate?: string;\r\n public EndDate?: string;\r\n public Modified?: string;\r\n public Hidden?: boolean;\r\n public StartDateAsDate?: Date;\r\n public EndDateAsDate?: Date;\r\n public ChannelTermBroadcastMessages: Array;\r\n public LanguageTermId?: string;\r\n public AppTileBroadcastMessages: Array;\r\n public Notify: boolean;\r\n\r\n constructor(opt?: Partial) {\r\n\r\n if (opt && opt.StartDate && typeof opt.StartDate === 'string') {\r\n opt.StartDateAsDate = parseISO(opt.StartDate);\r\n }\r\n\r\n if (opt && opt.EndDate && typeof opt.EndDate === 'string') {\r\n opt.EndDateAsDate = parseISO(opt.EndDate);\r\n }\r\n\r\n if (opt && opt.LinkUrl === '') {\r\n opt.LinkUrl = null;\r\n }\r\n\r\n Object.assign(this, opt);\r\n }\r\n}\r\n","import { ComponentType } from '@angular/cdk/overlay/index';\r\nimport { MatSnackBar, MatSnackBarRef } from '@angular/material/snack-bar';\r\nimport { BreakPoints } from '@app/common/breakpoints';\r\nimport { Environment } from '@environments/interface.environment';\r\nimport { Constants } from '@app/common/constants';\r\nimport { FormControl, ValidatorFn } from '@angular/forms';\r\nimport { ComponentState } from '@app/models/component-state';\r\nimport { ElementRef, ComponentFactoryResolver, ViewContainerRef } from '@angular/core';\r\nimport { Route } from '@angular/router';\r\nimport { NewsPage } from '@app/models/news-page';\r\n\r\nexport class Utilities {\r\n\r\n public static nameof = (name: keyof T) => name;\r\n\r\n public static openSnackBar(snackbar: MatSnackBar, component: ComponentType, id: string, duration: number = 2500): MatSnackBarRef {\r\n const snackBar = snackbar.openFromComponent(component, {\r\n verticalPosition: 'bottom',\r\n data: id,\r\n horizontalPosition: 'right',\r\n panelClass: ['workplace-snackbar'],\r\n duration: duration\r\n });\r\n return snackBar;\r\n }\r\n\r\n /**\r\n * https://github.com/ReactiveX/rxjs/blob/master/src/internal/util/isNumeric.ts\r\n * @param val\r\n */\r\n public static isNumeric(val: any): val is number | string {\r\n // parseFloat NaNs numeric-cast false positives (null|true|false|\"\")\r\n // ...but misinterprets leading-number strings, particularly hex literals (\"0x...\")\r\n // subtraction forces infinities to NaN\r\n // adding 1 corrects loss of precision from parseFloat (#15100)\r\n return !Array.isArray(val) && (val - parseFloat(val) + 1) >= 0;\r\n }\r\n\r\n public static isUrl(value: string) {\r\n const decodedValue = decodeURI(value);\r\n const encodedValue = encodeURI(decodedValue);\r\n return /^(?:http(s)?:\\/\\/)([\\w.-])+(?:[\\w\\.-]+)+([\\w\\-\\.%_~:/?#[\\]@!\\$&'\\(\\)\\*\\+,;=.])+$/.test(encodedValue);\r\n }\r\n\r\n public static getRealUrlFromTokenBasedUrl(environment: Environment, url: string) {\r\n if (url) {\r\n if (url.indexOf('') !== -1) {\r\n const matches = environment.coreWorkplaceSiteUrl.match(/https?:\\/\\/([a-z0-9]+)/);\r\n if (matches.length > 0) {\r\n return url.replace('', matches[1]);\r\n } else {\r\n return url;\r\n }\r\n } else if (url.indexOf('') !== -1) {\r\n return url.replace('', environment.coreWorkplaceSiteUrl);\r\n } else if (url.indexOf('') !== -1) {\r\n return url.replace('', environment.featureSettings.newsCenterSiteUrl ? environment.featureSettings.newsCenterSiteUrl : environment.coreWorkplaceSiteUrl);\r\n } else {\r\n return url;\r\n }\r\n } else {\r\n return null;\r\n }\r\n }\r\n\r\n /**\r\n * detect IE\r\n * returns version of IE or -1, if browser is not Internet Explorer\r\n */\r\n public static detectIE(userAgent: string): number {\r\n\r\n const msie = userAgent.indexOf('MSIE ');\r\n if (msie > 0) {\r\n // IE 10 or older => return version number\r\n return parseInt(userAgent.substring(msie + 5, userAgent.indexOf('.', msie)), 10);\r\n }\r\n\r\n const trident = userAgent.indexOf('Trident/');\r\n if (trident > 0) {\r\n // IE 11 => return version number\r\n const rv = userAgent.indexOf('rv:');\r\n return parseInt(userAgent.substring(rv + 3, userAgent.indexOf('.', rv)), 10);\r\n }\r\n\r\n const edge = userAgent.indexOf('Edge/');\r\n if (edge > 0) {\r\n // Edge (IE 12+) => return version number\r\n return parseInt(userAgent.substring(edge + 5, userAgent.indexOf('.', edge)), 10);\r\n }\r\n\r\n // other browser\r\n return -1;\r\n }\r\n\r\n public static getRootUrlFromInput(input) {\r\n if (input) {\r\n input = input.replace(/(www\\.)/i, '');\r\n if (!input.replace(/(www\\.)/i, '')) {\r\n input = 'https://' + input;\r\n }\r\n\r\n const reg = /:\\/\\/(.[^/]+)/;\r\n return 'https://' + input.match(reg)[1];\r\n }\r\n return '';\r\n }\r\n\r\n public static generateInitials(title: string): string {\r\n if (title) {\r\n const upperCaseLetters = title.replace(/[^A-Z]/g, '');\r\n if (upperCaseLetters.length >= 2) {\r\n return upperCaseLetters.substr(0, 2).toUpperCase();\r\n } else {\r\n return title.substr(0, 2).toUpperCase();\r\n }\r\n }\r\n return null;\r\n }\r\n\r\n public static truncate(text: string, maxLength: number): string {\r\n if (text && text.length > maxLength) {\r\n return text.substring(0, maxLength - 1) + '\\u2026';\r\n } else {\r\n return text;\r\n }\r\n }\r\n\r\n /*\r\n * Matches the file type to a specfic icon.\r\n */\r\n public static getMSIcon(fileType: string): string {\r\n const type = fileType ? fileType.toLowerCase() : '';\r\n let iconClasses = 'ms-Icon ';\r\n\r\n switch (type) {\r\n case 'pdf':\r\n iconClasses += 'ms-Icon--PDF';\r\n break;\r\n case 'word':\r\n iconClasses += 'ms-Icon--WordLogo';\r\n break;\r\n case 'docx':\r\n iconClasses += 'ms-Icon--WordLogo';\r\n break;\r\n case 'excel':\r\n iconClasses += 'ms-Icon--ExcelLogo';\r\n break;\r\n case 'xlsx':\r\n iconClasses += 'ms-Icon--ExcelLogo';\r\n break;\r\n case 'powerpoint':\r\n iconClasses += 'ms-Icon--PowerPointLogo';\r\n break;\r\n case 'ppt':\r\n iconClasses += 'ms-Icon--PowerPointLogo';\r\n break;\r\n case 'onenote':\r\n iconClasses += 'ms-Icon--OneNoteLogo';\r\n break;\r\n case 'one':\r\n iconClasses += 'ms-Icon--OneNoteLogo';\r\n break;\r\n case 'visio':\r\n iconClasses += 'ms-Icon--VisioLogo';\r\n break;\r\n case 'vsdx':\r\n iconClasses += 'ms-Icon--VisioLogo';\r\n break;\r\n default:\r\n iconClasses += 'ms-Icon--TextDocument';\r\n break;\r\n }\r\n\r\n return iconClasses;\r\n }\r\n\r\n public static hexToRGBA(hex: string, alpha: string) {\r\n let r: number, g: number, b: number;\r\n if (hex.length === 4) {\r\n // short format: #f0f\r\n r = parseInt(hex.substr(1, 1) + hex.substr(1, 1), 16);\r\n g = parseInt(hex.substr(2, 1) + hex.substr(2, 1), 16);\r\n b = parseInt(hex.substr(3, 1) + hex.substr(3, 1), 16);\r\n } else {\r\n // full format: #ff00ff\r\n r = parseInt(hex.substr(1, 2), 16);\r\n g = parseInt(hex.substr(3, 2), 16);\r\n b = parseInt(hex.substr(5, 2), 16);\r\n }\r\n return 'rgba(' + r + ', ' + g + ', ' + b + ', ' + alpha + ')';\r\n }\r\n\r\n public static getRange(startFrom: number, until: number) {\r\n return Array.from({ length: (until + 1 - startFrom) }, (_, k) => k + startFrom);\r\n }\r\n\r\n public static getCurrentBootstrapBreakpoint(window: Window): BreakPoints {\r\n // values from _variables.scss\r\n const w = window.innerWidth;\r\n\r\n if (w > BreakPoints.xxxl) {\r\n return BreakPoints.xxxl;\r\n } else if (w > BreakPoints.xxl) {\r\n return BreakPoints.xxl;\r\n } else if (w > BreakPoints.xl) {\r\n return BreakPoints.xl;\r\n } else if (w > BreakPoints.lg) {\r\n return BreakPoints.lg;\r\n } else if (w > BreakPoints.md) {\r\n return BreakPoints.md;\r\n } else if (w > BreakPoints.sm) {\r\n return BreakPoints.sm;\r\n }\r\n return BreakPoints.xs;\r\n }\r\n\r\n // Detects if Safari is the browser https://stackoverflow.com/questions/7944460/detect-safari-browser/42189492\r\n public static isSafari(window: Window) {\r\n return window.navigator.vendor &&\r\n window.navigator.vendor.indexOf('Apple') > -1 &&\r\n window.navigator.userAgent &&\r\n window.navigator.userAgent.indexOf('CriOS') === -1 &&\r\n window.navigator.userAgent.indexOf('FxiOS') === -1;\r\n }\r\n\r\n public static isInIframe(window: Window) {\r\n try {\r\n return window.self !== window.top;\r\n } catch (e) {\r\n return true;\r\n }\r\n }\r\n\r\n /**\r\n * For the MS Teams tab the inTeams query string should be set to true because of authentication reasons.\r\n * @param window\r\n */\r\n public static isInTeamsApp(window: Window) {\r\n const inTeams = window.location.search.indexOf(Constants.IN_TEAMS_KEY) > -1 || window.location.hash.indexOf(Constants.IN_TEAMS_KEY) > -1 || window.name === 'extension-tab-frame';\r\n return inTeams;\r\n }\r\n\r\n /**\r\n * Checks if the magic in MS Teams popup querystring/hash is present\r\n * @param window\r\n */\r\n public static inTeamsAuthPopupRedirect(window: Window) {\r\n const popQueryString = (window.location.search.indexOf(Constants.IN_TEAMS_AUTH_POPUP_REDIRECT_KEY) > -1 || window.location.hash.indexOf(Constants.IN_TEAMS_AUTH_POPUP_REDIRECT_KEY) > -1);\r\n return popQueryString;\r\n }\r\n\r\n /**\r\n * This checks a magic querystring to block the main view from loading.\r\n * @param window\r\n */\r\n public static shouldLoadMain(window: Window) {\r\n const loadMain = (window.location.search.indexOf(Constants.SHOULD_NOT_LOAD_MAIN_KEY) === -1 && window.location.hash.indexOf(Constants.SHOULD_NOT_LOAD_MAIN_KEY) === -1);\r\n return loadMain;\r\n }\r\n\r\n /**\r\n * This can be used to detect if Workplace is browsed from within an Electron app such as MS Teams\r\n * @param window\r\n */\r\n public static isElectron(window: Window) {\r\n const userAgent = window.navigator.userAgent.toLowerCase();\r\n return userAgent.indexOf(' electron/') > -1;\r\n }\r\n\r\n public static postMessageToCoreIntranet(message: string, window: Window, origin: string) {\r\n if (this.isInIframe(window)) {\r\n window.parent.postMessage(message, `${origin}/*`);\r\n }\r\n }\r\n\r\n public static trimValidator: ValidatorFn = (control: FormControl) => {\r\n if (control.value && control.value.startsWith(' ')) {\r\n return {\r\n 'trimError': { value: 'control has leading whitespace' }\r\n };\r\n }\r\n return null;\r\n }\r\n\r\n public static getComponentsOnRoute(route: Route, componentFactoryResolver: ComponentFactoryResolver, vcr: ViewContainerRef) {\r\n let components: ComponentState[] = [];\r\n if (route) {\r\n if (route.component) {\r\n const routeComponentFactory = componentFactoryResolver.resolveComponentFactory(route.component);\r\n const routeComponentRef = routeComponentFactory.create(vcr.injector);\r\n const elementRef = routeComponentRef.location;\r\n if (elementRef) {\r\n components = components.concat(Utilities.getComponentsWithinElementRef(elementRef, `/${route.path}`));\r\n }\r\n routeComponentRef?.destroy();\r\n }\r\n if (route.children?.length > 0) {\r\n route.children.forEach(childRoute => {\r\n if (childRoute.component) {\r\n const routeComponentFactory = componentFactoryResolver.resolveComponentFactory(childRoute.component);\r\n const routeComponentRef = routeComponentFactory.create(vcr.injector);\r\n\r\n const elementRef = routeComponentRef.location;\r\n if (elementRef) {\r\n components = components.concat(Utilities.getComponentsWithinElementRef(elementRef, `/${childRoute.path}`));\r\n }\r\n routeComponentRef?.destroy();\r\n }\r\n });\r\n }\r\n }\r\n return components;\r\n }\r\n\r\n public static getComponentsWithinElementRef(elementRef: ElementRef, route?: string): ComponentState[] {\r\n const viewAsHTMLElement = elementRef.nativeElement as HTMLElement;\r\n return Utilities.getComponentsWithinElement(viewAsHTMLElement, route);\r\n }\r\n\r\n public static getComponentsWithinElement(viewAsHTMLElement: HTMLElement, route?: string) {\r\n const componentList = Array.from(viewAsHTMLElement.querySelectorAll('*')).filter(el => el.localName.startsWith('app-'));\r\n const allComponentEventsOnRoute = componentList.map(element => {\r\n const componentEvent = new ComponentState({ ComponentId: element.localName, ShowBadge: false, Routes: route ? [route] : [] });\r\n const headerElement = element.querySelector('.widget-header');\r\n if (headerElement) {\r\n componentEvent.Component.Title = headerElement.innerText.trim();\r\n }\r\n const subHeaderElement = element.querySelector('h3.text-muted');\r\n if (subHeaderElement) {\r\n componentEvent.Component.Description = subHeaderElement.innerText.trim();\r\n }\r\n for (let i = 0; i < element.attributes.length; i++) {\r\n if (!element.attributes[i].name.startsWith('_')) {\r\n componentEvent.Component.Configurations[element.attributes[i].name] = element.attributes[i].value;\r\n }\r\n }\r\n return componentEvent;\r\n });\r\n return allComponentEventsOnRoute;\r\n }\r\n\r\n // https://gist.github.com/erikvullings/ada7af09925082cbb89f40ed962d475e#file-deep-copy-ts\r\n public static deepCopy(target: T) {\r\n if (target === null) {\r\n return target;\r\n }\r\n if (target instanceof Date) {\r\n return new Date(target.getTime()) as any;\r\n }\r\n if (target instanceof Array) {\r\n const cp = [] as any[];\r\n (target as any[]).forEach((v) => { cp.push(v); });\r\n return cp.map((n: any) => Utilities.deepCopy(n)) as any;\r\n }\r\n if (typeof target === 'object' && target !== {}) {\r\n const cp = { ...(target as { [key: string]: any }) } as { [key: string]: any };\r\n Object.keys(cp).forEach(k => {\r\n cp[k] = Utilities.deepCopy(cp[k]);\r\n });\r\n return cp as T;\r\n }\r\n return target;\r\n }\r\n\r\n /**\r\n * Creates a user friendly string by concatenting the news item SenderTag labels\r\n * @param newsItem Newsitem to get SenderTag from\r\n * @returns string for displaying the tags for users\r\n */\r\n public static getSenderTagString(newsItem: NewsPage) {\r\n if (newsItem.SenderTags && newsItem.SenderTags.length) {\r\n let senderTagString = '';\r\n let maxSenderTags = 2; // Set max to show 2 sendertags\r\n // If the length of SenderTags array is less than max, set to length of sendertags\r\n if (newsItem.SenderTags.length < maxSenderTags) {\r\n maxSenderTags = newsItem.SenderTags.length;\r\n }\r\n for (let i = 0; i < maxSenderTags; i++) {\r\n if (i > 0) {\r\n senderTagString += ' | ';\r\n }\r\n // check if SenderTag is from graph or search\r\n if (newsItem.SenderTags[i].Label) {\r\n senderTagString += newsItem.SenderTags[i].Label;\r\n } else {\r\n senderTagString += newsItem.SenderTags[i];\r\n }\r\n }\r\n return senderTagString;\r\n }\r\n return null;\r\n }\r\n}\r\n","/*\r\n\r\n Product names and service plan identifiers for licensing\r\n Derived from https://docs.microsoft.com/en-us/azure/active-directory/users-groups-roles/licensing-service-plan-reference\r\n\r\n Licenses for a user can be viewed on /about page, or by using graph\r\n explorer (https://developer.microsoft.com/en-us/graph/graph-explorer)\r\n with query: https://graph.microsoft.com/v1.0/me/?$select=assignedLicenses,assignedPlans\r\n\r\n*/\r\nexport namespace O365Licenses {\r\n export const AUDIO_CONFERENCING = '0c266dff-15dd-4b49-8397-2bb16070ed52';\r\n export const AZURE_ACTIVE_DIRECTORY_BASIC = '2b9c8e7c-319c-43a2-a2a0-48c5c6161de7';\r\n export const AZURE_ACTIVE_DIRECTORY_PREMIUM_P1 = '078d2b04-f1bd-4111-bbd4-b4b1b354cef4';\r\n export const AZURE_ACTIVE_DIRECTORY_PREMIUM_P2 = '84a661c4-e949-4bd2-a560-ed7766fcaf2b';\r\n export const AZURE_INFORMATION_PROTECTION_PLAN_1 = 'c52ea49f-fe5d-4e95-93ba-1de91d380f89';\r\n export const DYNAMICS_365_CUSTOMER_ENGAGEMENT_PLAN_ENTERPRISE_EDITION = 'ea126fc5-a19e-42e2-a731-da9d437bffcf';\r\n export const DYNAMICS_365_FOR_CUSTOMER_SERVICE_ENTERPRISE_EDITION = '749742bf-0d37-4158-a120-33567104deeb';\r\n export const DYNAMICS_365_FOR_FINANCIALS_BUSINESS_EDITION = 'cc13a803-544e-4464-b4e4-6d6169a138fa';\r\n export const DYNAMICS_365_FOR_SALES_AND_CUSTOMER_SERVICE_ENTERPRISE_EDITION = '8edc2cf8-6438-4fa9-b6e3-aa1660c640cc';\r\n export const DYNAMICS_365_FOR_SALES_ENTERPRISE_EDITION = '1e1a282c-9c54-43a2-9310-98ef728faace';\r\n export const DYNAMICS_365_FOR_TEAM_MEMBERS_ENTERPRISE_EDITION = '8e7a3d30-d97d-43ab-837c-d7701cef83dc';\r\n export const DYNAMICS_365_UNF_OPS_PLAN_ENT_EDITION = 'ccba3cfe-71ef-423a-bd87-b6df3dce59a9';\r\n export const ENTERPRISE_MOBILITY_SECURITY_E3 = 'efccb6f7-5641-4e0e-bd10-b4976e1bf68e';\r\n export const ENTERPRISE_MOBILITY_SECURITY_E5 = 'b05e124f-c7cc-45a0-a6aa-8cf78c946968';\r\n export const EXCHANGE_ONLINE_PLAN_1 = '4b9405b0-7788-4568-add1-99614e613b69';\r\n export const EXCHANGE_ONLINE_PLAN_2 = '19ec0d23-8335-4cbd-94ac-6050e30712fa';\r\n export const EXCHANGE_ONLINE_ARCHIVING_FOR_EXCHANGE_ONLINE = 'ee02fd1b-340e-4a4b-b355-4a514e4c8943';\r\n export const EXCHANGE_ONLINE_ARCHIVING_FOR_EXCHANGE_SERVER = '90b5e015-709a-4b8b-b08e-3200f994494c';\r\n export const EXCHANGE_ONLINE_ESSENTIALS = '7fc0182e-d107-4556-8329-7caaa511197b';\r\n export const EXCHANGE_S_ONLINE_ESSENTIALS = 'e8f81a67-bd96-4074-b108-cf193eb9433b';\r\n export const EXCHANGE_ONLINE_KIOSK = '80b2d799-d2ba-4d2a-8842-fb0d0f3a4b82';\r\n export const EXCHANGE_ONLINE_POP = 'cb0a98a8-11bc-494c-83d9-c1b1ac65327e';\r\n export const INTUNE = '061f9ace-7d42-4136-88ac-31dc755f143f';\r\n export const MICROSOFT_365_BUSINESS = 'cbdc14ab-d96c-4c30-b9f4-6ada7cdc1d46';\r\n export const MICROSOFT_365_E3 = '05e9a617-0261-4cee-bb44-138d3ef5d965';\r\n export const MICROSOFT_DYNAMICS_CRM_ONLINE_BASIC = '906af65a-2970-46d5-9b58-4e9aa50f0657';\r\n export const MICROSOFT_DYNAMICS_CRM_ONLINE = 'd17b27af-3f49-4822-99f9-56a661538792';\r\n export const MICROSOFT_INTUNE_A_DIRECT = '061f9ace-7d42-4136-88ac-31dc755f143f';\r\n export const MS_IMAGINE_ACADEMY = 'ba9a34de-4489-469d-879c-0f0f145321cd';\r\n export const OFFICE_365_BUSINESS = 'cdd28e44-67e3-425e-be4c-737fab2899d3';\r\n export const SMB_BUSINESS = 'b214fe43-f5a3-4703-beeb-fa97188220fc';\r\n export const O365_BUSINESS_ESSENTIALS = '3b555118-da6a-4418-894f-7df1e2096870';\r\n export const SMB_BUSINESS_ESSENTIALS = 'dab7782a-93b1-4074-8bb1-0e61318bea0b';\r\n export const O365_BUSINESS_PREMIUM = 'f245ecc8-75af-4f8e-b61f-27d8114de5f3';\r\n export const SMB_BUSINESS_PREMIUM = 'ac5cef5d-921b-4f97-9ef3-c99076e5470f';\r\n export const OFFICE_365_ENTERPRISE_E1 = '18181a46-0d4e-45cd-891e-60aabd171b4e';\r\n export const OFFICE_365_ENTERPRISE_E2 = '6634e0ce-1a9f-428c-a498-f84ec7b8aa2e';\r\n export const OFFICE_365_ENTERPRISE_E3 = '6fd2c87f-b296-42f0-b197-1e91e994b900';\r\n export const OFFICE_365_ENTERPRISE_E3_DEVELOPER = '189a915c-fe4f-4ffa-bde4-85b9628d07a0';\r\n export const OFFICE_365_ENTERPRISE_E4 = '1392051d-0cb9-4b7a-88d5-621fee5e8711';\r\n export const OFFICE_365_ENTERPRISE_E5 = 'c7df2760-2c81-4ef7-b578-5b5392b571df';\r\n export const OFFICE_365_ENTERPRISE_E5_WITHOUT_AUDIO_CONFERENCING = '26d45bd9-adf1-46cd-a9e1-51e9a5524128';\r\n export const OFFICE_365_F1 = '4b585984-651b-448a-9e53-3b10f069cf7f';\r\n export const OFFICE_365_MIDSIZE_BUSINESS = '04a7fb0d-32e0-4241-b4f5-3f7618cd1162';\r\n export const OFFICE_365_PROPLUS = 'c2273bd0-dff7-4215-9ef5-2c7bcfb06425';\r\n export const OFFICE_365_SMALL_BUSINESS = 'bd09678e-b83c-4d3f-aaba-3dad4abd128b';\r\n export const OFFICE_365_SMALL_BUSINESS_PREMIUM = 'fc14ec4a-4169-49a4-a51e-2c852931814b';\r\n export const ONEDRIVE_FOR_BUSINESS_PLAN_1 = 'e6778190-713e-4e4f-9119-8b8238de25df';\r\n export const ONEDRIVE_FOR_BUSINESS_PLAN_2 = 'ed01faf2-1d88-4947-ae91-45ca18703a96';\r\n export const POWER_BI_FOR_OFFICE_365_ADD_ON = '45bc2c81-6072-436a-9b0b-3b12eefbc402';\r\n export const POWER_BI_PRO = 'f8a1db68-be16-40ed-86d5-cb42ce701560';\r\n export const POWER_BI_FREE = 'a403ebcc-fae0-4ca2-8c8c-7a907fd6c235';\r\n export const PROJECT_FOR_OFFICE_365 = 'a10d5e58-74da-4312-95c8-76be4e5b75a0';\r\n export const PROJECT_ONLINE_ESSENTIALS = '776df282-9fc0-4862-99e2-70e561b9909e';\r\n export const PROJECT_ONLINE_PREMIUM = '09015f9f-377f-4538-bbb5-f75ceb09358a';\r\n export const PROJECT_ONLINE_PREMIUM_WITHOUT_PROJECT_CLIENT = '2db84718-652c-47a7-860c-f10d8abbdae3';\r\n export const PROJECT_ONLINE_PROFESSIONAL = '53818b1b-4a27-454b-8896-0dba576410e6';\r\n export const PROJECT_ONLINE_WITH_PROJECT_FOR_OFFICE_365 = 'f82a60b8-1ee3-4cfb-a4fe-1c6a53c2656c';\r\n export const SHAREPOINT_ONLINE_PLAN_1 = '1fc08a02-8b3d-43b9-831e-f76859e04e1a';\r\n export const SHAREPOINT_ONLINE_PLAN_2 = 'a9732ec9-17d9-494c-a51c-d6b45b384dcb';\r\n export const SKYPE_FOR_BUSINESS_CLOUD_PBX = 'e43b5b99-8dfb-405f-9987-dc307f34bcbd';\r\n export const SKYPE_FOR_BUSINESS_ONLINE_PLAN_1 = 'b8b749f8-a4ef-4887-9539-c95b1eaa5db7';\r\n export const SKYPE_FOR_BUSINESS_ONLINE_PLAN_2 = 'd42c793f-6c78-4f43-92ca-e8f6a02b035f';\r\n export const SKYPE_FOR_BUSINESS_PSTN_CONFERENCING = '0c266dff-15dd-4b49-8397-2bb16070ed52';\r\n export const SKYPE_FOR_BUSINESS_PSTN_DOMESTIC_AND_INTERNATIONAL_CALLING = 'd3b4fe1f-9992-4930-8acb-ca6ec609365e';\r\n export const SKYPE_FOR_BUSINESS_PSTN_DOMESTIC_CALLING = '0dab259f-bf13-4952-b7f8-7db8f131b28d';\r\n export const SKYPE_FOR_BUSINESS_PSTN_DOMESTIC_CALLING_120_MINUTES = '54a152dc-90de-4996-93d2-bc47e670fc06';\r\n export const VISIO_ONLINE_PLAN_1 = '4b244418-9658-4451-a2b8-b5e2b364e9bd';\r\n export const VISIO_Online_Plan_2 = 'c5928f49-12ba-48f7-ada3-0d743a3601d5';\r\n export const Microsoft_365_E5 = '06ebc4ee-1bb5-47dd-8120-11324bc54e06';\r\n export const Microsoft_365_E3_USGOV_DOD = 'd61d61cc-f992-433f-a577-5bd016037eeb';\r\n export const Microsoft_365_E3_USGOV_GCCHIGH = 'ca9d1dd9-dfe9-4fef-b97c-9bc1ea3c3658';\r\n export const Microsoft_365_F1 = '66b55226-6b4f-492c-910c-a3b7a3c9d993';\r\n export const Office_365_E3_USGOV_DOD = 'b107e5a3-3e60-4c0d-a184-a7e4395eb44c';\r\n export const Office_365_E3_USGOV_GCCHIGH = 'aea38a85-9bd5-4981-aa00-616b411205bf';\r\n export const WINDOWS_10_ENTERPRISE_E3 = 'cb10e6cd-9da4-4992-867b-67546b1db821';\r\n export const CRMPLAN1 = '119cf168-b6cf-41fb-b82e-7fee7bae5814';\r\n export const CRMPLAN2 = 'bf36ca64-95c6-4918-9275-eb9f4ce2c04f';\r\n export const CRMSTANDARD = 'f9646fb2-e3b2-4309-95de-dc4833737456';\r\n export const DYN365_ENTERPRISE_CUSTOMER_SERVICE = '99340b49-fb81-4b1e-976b-8f2ae8e9394f';\r\n export const DYN365_ENTERPRISE_P1 = 'd56f3deb-50d8-465a-bedb-f079817ccac1';\r\n export const DYN365_ENTERPRISE_P1_IW = '056a5f80-b4e0-4983-a8be-7ad254a113c9';\r\n export const DYN365_ENTERPRISE_SALES = '2da8e897-7791-486b-b08f-cc63c8129df7';\r\n export const DYN365_ENTERPRISE_TEAM_MEMBERS = '6a54b05e-4fab-40e7-9828-428db3b336fa';\r\n export const EMPLOYEE_SELF_SERVICE = 'ba5f0cfa-d54a-4ea0-8cf4-a7e1dc4423d8';\r\n export const EXCHANGE_B_STANDARD = '90927877-dcff-4af6-b346-2332c0b15bb7';\r\n export const EXCHANGE_L_STANDARD = 'd42bdbd6-c335-4231-ab3d-c8f348d5aff5';\r\n export const EXCHANGE_S_ARCHIVE = 'da040e0a-b393-4bea-bb76-928b3fa1cf5a';\r\n export const EXCHANGE_S_DESKLESS = '4a82b400-a79f-41a4-b4e2-e94f5787b113';\r\n export const EXCHANGE_S_ENTERPRISE = 'efb87545-963c-4e0d-99df-69c6916d9eb0';\r\n export const EXCHANGE_S_ESSENTIALS = '1126bef5-da20-4f07-b45e-ad25d2581aa8';\r\n export const EXCHANGE_S_STANDARD = '9aaf7827-d63c-4b61-89c3-182f06f82e5c';\r\n export const EXCHANGE_S_STANDARD_MIDMARKET = 'fc52cc4b-ed7d-472d-bbe7-b081c23ecc56';\r\n export const INTUNE_A = 'c1ec4a95-1f05-45b3-a911-aa3fa01094f5';\r\n export const INTUNE_A_VL = '3e170737-c728-4eae-bbb9-3f3360f7184c';\r\n export const INTUNE_B = '2dc63b8a-df3d-448f-b683-8655877c9360';\r\n export const ONEDRIVEENTERPRISE = 'afcafa6a-d966-4462-918c-ec0b4e0fe642';\r\n export const SHAREPOINT_S_DEVELOPER = 'a361d6e2-509e-4e25-a8ad-950060064ef4';\r\n export const SHAREPOINTDESKLESS = '902b47e5-dcb2-4fdc-858b-c63a90a2bdb9';\r\n export const SHAREPOINTENTERPRISE = '5dbe027f-2339-4123-9542-606e4d348a72';\r\n export const SHAREPOINTENTERPRISE_EDU = '63038b2c-28d0-45f6-bc36-33062963b498';\r\n export const SHAREPOINTENTERPRISE_MIDMARKET = '6b5b6a67-fc72-4a1f-a2b5-beecf05de761';\r\n export const SHAREPOINTLITE = 'a1f3d0a8-84c0-4ae0-bae4-685917b8ab48';\r\n export const SHAREPOINTSTANDARD = 'c7699d2e-19aa-44de-8edf-1736da088ca1';\r\n export const SHAREPOINTSTANDARD_EDU = '0a4983bb-d3e5-4a09-95d8-b2d0127b3df5';\r\n export const SHAREPOINTSTANDARD_YAMMERSHADOW = '4c9efd0c-8de7-4c71-8295-9f5fdb0dd048';\r\n export const MCOIMP = 'afc06cb0-b4f4-4473-8286-d644f70d8faf';\r\n export const MCOSTANDARD_MIDMARKET = 'b2669e95-76ef-4e7e-a367-002f60a39f3e';\r\n export const MCOSTANDARD = '0feaeb32-d00e-4d66-bd5a-43b5b83db82c';\r\n export const MCOLITE = '70710b6b-3ab4-4a38-9f6d-9f169461650a';\r\n export const MCOPSTN1 = '4ed3ff63-69d7-4fb7-b984-5aec7f605ca8';\r\n export const MCOPSTN2 = '5a10155d-f5c1-411a-a8ec-e99aae125390';\r\n export const MCOPSTN5 = '54a152dc-90de-4996-93d2-bc47e670fc06';\r\n export const YAMMER_ENTERPRISE = '7547a3fe-08ee-4ccb-b430-5077c5041653';\r\n export const YAMMER_EDU = '2078e8df-cff6-4290-98cb-5408261a760a';\r\n export const YAMMER_MIDSIZE = '41bf139a-4e60-409f-9346-a1361efc6dfb';\r\n}\r\n","\r\nexport enum ChannelType {\r\n UserSelection = 0,\r\n FromAd = 1\r\n}\r\n\r\nexport class UserChannelTerm {\r\n\r\n public ChannelTermId: string;\r\n\r\n public UserUpnId: string;\r\n\r\n public ChannelType: ChannelType;\r\n\r\n constructor(opt?: Partial) {\r\n Object.assign(this, opt);\r\n }\r\n}\r\n","
    \r\n
    \r\n \r\n
    \r\n \r\n \r\n \r\n
    \r\n \r\n \r\n
    \r\n
    \r\n \"{{bannerImageAltText}}\"\r\n
    \r\n \r\n \r\n
    \r\n
    \r\n
    \r\n
    \r\n {{ bannerImageText }}\r\n
    \r\n\r\n
    \r\n\r\n \r\n\r\n
    \r\n
    \r\n
    \r\n \"{{bannerImageAltText}}\"\r\n
    \r\n
    \r\n
    \r\n
    \r\n {{ bannerImageText }}\r\n
    \r\n\r\n
    \r\n
    \r\n\r\n
    \r\n Image selected\r\n \r\n
    \r\n\r\n \r\n \r\n \r\n \r\n Select image\r\n \r\n \r\n\r\n
    \r\n \r\n Upload image from computer\r\n \r\n \r\n
    \r\n\r\n \r\n \r\n \r\n \r\n \r\n Choose image from gallery\r\n \r\n \r\n
    \r\n \r\n \r\n
    \r\n
    \r\n\r\n \r\n\r\n \r\n \r\n \r\n \r\n Add image from URL\r\n \r\n \r\n
    \r\n \r\n \r\n \r\n
    \r\n
    \r\n
    \r\n
    \r\n\r\n \r\n \r\n \r\n Image info\r\n \r\n \r\n
    \r\n \r\n \r\n \r\n This text will be shown beneath the image, if this page has one.\r\n \r\n \r\n \r\n \r\n \r\n \r\n Provide alternative text to describe this image. Alternative text helps people with screen readers understand the content of pictures.\r\n \r\n \r\n \r\n
    \r\n
    \r\n\r\n
    \r\n\r\n
    \r\n
    \r\n\r\n
    \r\n\r\n \r\n
    \r\n \r\n
    \r\n \r\n
    \r\n \r\n \r\n \r\n {{selectedOwner.Name}}\r\n cancel\r\n \r\n \r\n \r\n \r\n \r\n {{user.Name}}\r\n \r\n \r\n \r\n \r\n no users found\r\n \r\n \r\n \r\n \r\n \r\n
    \r\n \r\n
    \r\n \r\n \r\n \r\n \r\n \r\n
    \r\n\r\n
    \r\n \r\n \r\n Language\r\n \r\n None\r\n {{language.Name}}\r\n \r\n \r\n \r\n \r\n
    \r\n\r\n \r\n
    \r\n \r\n \r\n \r\n {{channel.Name}}\r\n cancel\r\n \r\n \r\n 1\" matSuffix tabindex=\"0\" class=\"info-icon\" (click)=\"removeAllChannels()\" (keyup.enter)=\"removeAllChannels()\">\r\n \r\n \r\n \r\n One channel was removed because it no longer exists in SharePoint\r\n 1\" class=\"channel-removed-error\" i18n=\"@@channels-removed-error\">{{removedChannels}} channels were removed because they no longer exist in SharePoint\r\n \r\n \r\n \r\n
    \r\n \r\n
    \r\n
    \r\n
    \r\n \r\n
    \r\n Show as top news\r\n
    \r\n \r\n
    \r\n Enable comments\r\n
    \r\n \r\n
    \r\n Send notification\r\n
    \r\n \r\n
    \r\n \r\n \r\n \r\n \r\n
    \r\n
    \r\n
    \r\n\r\n\r\n
    \r\n \r\n
    \r\n
    \r\n","import { CdkOverlayOrigin, OverlayModule } from '@angular/cdk/overlay';\r\nimport { TextFieldModule } from '@angular/cdk/text-field';\r\nimport { CommonModule } from '@angular/common';\r\nimport { ChangeDetectorRef, Component, ElementRef, NgModule, OnDestroy, OnInit, ViewChild, ViewEncapsulation } from '@angular/core';\r\nimport { FormControl, FormGroup, ReactiveFormsModule, Validators } from '@angular/forms';\r\nimport { MatAutocompleteModule, MatAutocompleteSelectedEvent } from '@angular/material/autocomplete';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatChipsModule } from '@angular/material/chips';\r\nimport { MatNativeDateModule } from '@angular/material/core';\r\nimport { MatDatepickerModule } from '@angular/material/datepicker';\r\nimport { MatDialog } from '@angular/material/dialog';\r\nimport { MatExpansionModule } from '@angular/material/expansion';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { MatProgressSpinnerModule } from '@angular/material/progress-spinner';\r\nimport { MatSelectModule } from '@angular/material/select';\r\nimport { MatSlideToggleModule } from '@angular/material/slide-toggle';\r\nimport { MatSnackBar } from '@angular/material/snack-bar';\r\nimport { ActivatedRoute, Router, RouterModule } from '@angular/router';\r\nimport { Utilities } from '@app/common/utilities';\r\nimport { AlertTemplatesComponent } from '@app/components/alert-templates/alert-templates.component';\r\nimport { ConfirmDialogComponent } from '@app/components/confirm-dialog/confirm-dialog.component';\r\nimport { ChannelControlModule } from '@app/components/form-controls/channel-control/channel-control.component';\r\nimport { GalleryModule } from '@app/components/gallery/gallery.component';\r\nimport { HtmlEditorModule } from '@app/components/html-editor/html-editor.component';\r\nimport { WidgetPlaceholderModule } from '@app/components/widget-placeholder/widget-placeholder.component';\r\nimport { NgSubscribeModule } from '@app/directives/ng-subscribe.directive';\r\nimport { ChannelTermPage } from '@app/models/channel-term-page';\r\nimport { Page, PageType } from '@app/models/page';\r\nimport { PeoplePickerUser } from '@app/models/people-picker-user';\r\nimport { SimplifiedTerm } from '@app/models/simplified-term';\r\nimport { LinkModule } from '@app/directives/link.directive';\r\nimport { SafeModule } from '@app/pipes/safe.pipe';\r\nimport { ChannelService } from '@app/services/channel.service';\r\nimport { FeatureSettingsStoreService } from '@app/services/feature-settings-store.service';\r\nimport { LanguageTermService } from '@app/services/language-term.service';\r\nimport { PagesService } from '@app/services/pages.service';\r\nimport { UserService } from '@app/services/user.service';\r\nimport { BehaviorSubject, combineLatest, Observable, of, Subscription } from 'rxjs';\r\nimport { concatMap, debounceTime, distinctUntilChanged, filter, map, switchMap, tap } from 'rxjs/operators';\r\n\r\nenum ImageAlternative {\r\n COMPUTER,\r\n GALLERY,\r\n URL\r\n}\r\n\r\n@Component({\r\n selector: 'app-add-edit-page',\r\n templateUrl: './add-edit-page.component.html',\r\n styleUrls: ['../add-edit-page/add-edit-page.component.scss'],\r\n encapsulation: ViewEncapsulation.None\r\n})\r\nexport class AddEditPageComponent implements OnInit, OnDestroy {\r\n\r\n page$: Observable;\r\n existingPage: Page;\r\n subscription = new Subscription();\r\n pageEditorForm: FormGroup;\r\n isNewsPage: boolean;\r\n saveBtnDisabled: boolean;\r\n auditsEnabled = this.featureSettingsStoreService.state.auditsEnabled;\r\n enableFeaturedPages = this.featureSettingsStoreService.state.enableFeaturedPages;\r\n enableNotificationSubscriptions = this.featureSettingsStoreService.state.enableNotificationSubscriptions;\r\n imageVaultUrl = this.featureSettingsStoreService.state.imageVaultUrl;\r\n\r\n /** Channel picker variables */\r\n channels$: Observable>;\r\n languages$: Observable>;\r\n selectedChannels: Array;\r\n removedChannel$ = new BehaviorSubject(null);\r\n removedChannels = 0;\r\n channelMenuOpen: boolean;\r\n languageFilteringEnabled: boolean;\r\n _triggerRect: ClientRect;\r\n @ViewChild('overlayOrigin') trigger: CdkOverlayOrigin;\r\n\r\n /** People picker variables */\r\n foundUsers$: Observable>;\r\n searchingForUsers = false;\r\n noUsersFound = false;\r\n selectedOwner$: Observable;\r\n searchString: string;\r\n OwnerInputControl: FormControl;\r\n @ViewChild('ownerInput') ownerInput: ElementRef;\r\n fetchedChannels: Array;\r\n\r\n /** Image variables */\r\n isInPictureEditMode = false;\r\n galleryImages$: Observable>;\r\n originalImageUrl: string;\r\n currentlySelectedImageData: any;\r\n currentlySelectedImageFileContents: any;\r\n currentlySelectedImageType: ImageAlternative;\r\n hasSelectedImage = false;\r\n hasTrashedImage = false;\r\n clearGallerySelections = false;\r\n\r\n constructor(private channelService: ChannelService,\r\n private activatedRoute: ActivatedRoute,\r\n private userService: UserService,\r\n private pageService: PagesService,\r\n private featureSettingsStoreService: FeatureSettingsStoreService,\r\n private router: Router,\r\n private snackBar: MatSnackBar,\r\n private dialog: MatDialog,\r\n private cdr: ChangeDetectorRef,\r\n private languageTermService: LanguageTermService) {\r\n\r\n this.languageFilteringEnabled = this.featureSettingsStoreService.state.enableLanguageFilteringForWorkplace;\r\n this.pageEditorForm = new FormGroup({\r\n Title: new FormControl('', Validators.required),\r\n Content: new FormControl('', Validators.required),\r\n ChannelTermPages: new FormControl(null),\r\n OwnerUserUpnId: new FormControl(null),\r\n BannerImageUrl: new FormControl(null),\r\n BannerImageText: new FormControl(null),\r\n BannerImageAltText: new FormControl(null),\r\n PublishingDate: new FormControl(null),\r\n IsCommentsEnabled: new FormControl(false),\r\n IsFeaturedPage: new FormControl(false),\r\n LanguageTermId: new FormControl(),\r\n });\r\n\r\n if (this.enableNotificationSubscriptions) {\r\n this.pageEditorForm.addControl('Notify', new FormControl(false));\r\n }\r\n\r\n this.OwnerInputControl = new FormControl('');\r\n }\r\n\r\n /** Set owner from people picker selection */\r\n setOwner(event: MatAutocompleteSelectedEvent): void {\r\n let userIdentifier = (event.option.value as PeoplePickerUser).UPN;\r\n if (userIdentifier.indexOf('#EXT#') !== -1) {\r\n userIdentifier = (event.option.value as PeoplePickerUser).Mail;\r\n }\r\n this.pageEditorForm.get('OwnerUserUpnId').setValue(userIdentifier);\r\n // Clear input field\r\n this.ownerInput.nativeElement.value = '';\r\n }\r\n\r\n /** Remove owner from people picker */\r\n removeOwner(): void {\r\n this.pageEditorForm.get('OwnerUserUpnId').setValue(null);\r\n }\r\n\r\n /** When channelinput is focused */\r\n channelFocus() {\r\n this.channelMenuOpen = !this.channelMenuOpen;\r\n }\r\n\r\n removeChannel(channel: SimplifiedTerm): void {\r\n const index = this.selectedChannels.indexOf(channel, 0);\r\n if (index > -1) {\r\n this.selectedChannels.splice(index, 1);\r\n }\r\n this.mapChannelTermPages();\r\n this.removedChannel$.next(channel);\r\n this.removedChannels = 0; // reset error message\r\n this.cdr.detectChanges();\r\n }\r\n\r\n handleChange(event: SimplifiedTerm[]): void {\r\n this.selectedChannels = event;\r\n this.mapChannelTermPages();\r\n this.removedChannels = 0; // reset error message\r\n }\r\n\r\n mapChannelTermPages(): void {\r\n const channelTermPages = this.selectedChannels.map(sc => {\r\n if (this.existingPage) {\r\n return {\r\n PageId: this.existingPage.Id,\r\n ChannelTermId: sc.Guid\r\n } as ChannelTermPage;\r\n } else {\r\n return {\r\n ChannelTermId: sc.Guid\r\n } as ChannelTermPage;\r\n }\r\n });\r\n this.pageEditorForm.get('ChannelTermPages').setValue(channelTermPages);\r\n }\r\n\r\n handleImageUpload(imageInput: any) {\r\n this.clearGallerySelections = true;\r\n this.hasSelectedImage = true;\r\n this.hasTrashedImage = false;\r\n\r\n this.currentlySelectedImageType = ImageAlternative.COMPUTER;\r\n if (imageInput.target.files.length) {\r\n this.currentlySelectedImageData = (imageInput.target.files[0] as File);\r\n const reader = new FileReader();\r\n reader.readAsDataURL(this.currentlySelectedImageData);\r\n reader.onload = (_event) => {\r\n const imageContent = reader.result.toString();\r\n this.bannerImageUrl = imageContent;\r\n this.currentlySelectedImageFileContents = imageContent;\r\n };\r\n }\r\n }\r\n\r\n handleImageUrl() {\r\n this.clearGallerySelections = true;\r\n this.hasSelectedImage = true;\r\n this.hasTrashedImage = false;\r\n\r\n this.currentlySelectedImageData = this.bannerImageUrl;\r\n this.currentlySelectedImageType = ImageAlternative.URL;\r\n }\r\n\r\n previewImageGallery(image: string) {\r\n this.bannerImageUrl = image;\r\n this.clearGallerySelections = false;\r\n }\r\n\r\n resetImageGalleryPreview() {\r\n if (this.hasSelectedImage && this.currentlySelectedImageType === ImageAlternative.COMPUTER) {\r\n this.bannerImageUrl = this.currentlySelectedImageFileContents;\r\n } else if (this.hasTrashedImage) {\r\n this.bannerImageUrl = null;\r\n } else if (this.hasSelectedImage) {\r\n this.bannerImageUrl = this.currentlySelectedImageData;\r\n } else if (!this.hasSelectedImage) {\r\n this.bannerImageUrl = this.originalImageUrl;\r\n } else {\r\n this.bannerImageUrl = null;\r\n }\r\n }\r\n\r\n handleImageGalleryChange(images: Array) {\r\n this.hasSelectedImage = images.length > 0;\r\n if (this.hasSelectedImage) {\r\n // We can only receive one image so pick the first element\r\n const galleryImage = images[0];\r\n\r\n this.bannerImageUrl = galleryImage;\r\n this.currentlySelectedImageData = galleryImage;\r\n this.currentlySelectedImageType = ImageAlternative.GALLERY;\r\n this.hasTrashedImage = false;\r\n }\r\n }\r\n\r\n editBannerImage() {\r\n this.isInPictureEditMode = true;\r\n }\r\n\r\n removeBannerImage() {\r\n this.bannerImageUrl = null;\r\n this.hasSelectedImage = false;\r\n this.hasTrashedImage = true;\r\n this.currentlySelectedImageData = null;\r\n this.currentlySelectedImageFileContents = null;\r\n this.isInPictureEditMode = true;\r\n this.clearGallerySelections = true;\r\n }\r\n\r\n private handleSave(val: Page, newPage: boolean): void {\r\n if (newPage) {\r\n this.router.navigate([`../${val.SlugTitle}-${val.Id}`], { relativeTo: this.activatedRoute });\r\n Utilities.openSnackBar(this.snackBar, AlertTemplatesComponent, AlertTemplatesComponent.genericadded);\r\n } else {\r\n this.router.navigate([`../../${val.SlugTitle}-${val.Id}`], { relativeTo: this.activatedRoute });\r\n Utilities.openSnackBar(this.snackBar, AlertTemplatesComponent, AlertTemplatesComponent.genericupdated);\r\n }\r\n }\r\n\r\n private handleError(error: any): void {\r\n if (error && error.error.errors) {\r\n Object.keys(error.error.errors).forEach(key => {\r\n const control = this.pageEditorForm.get(key);\r\n if (control) {\r\n control.setErrors({ key: error.error.errors[key][0] });\r\n }\r\n });\r\n }\r\n this.saveBtnDisabled = false;\r\n }\r\n\r\n get bannerImageUrl() {\r\n return this.pageEditorForm.get('BannerImageUrl').value;\r\n }\r\n\r\n set bannerImageUrl(value: string) {\r\n this.pageEditorForm.get('BannerImageUrl').setValue(value);\r\n }\r\n\r\n get bannerImageText() {\r\n return this.pageEditorForm.get('BannerImageText').value;\r\n }\r\n\r\n get bannerImageAltText() {\r\n return this.pageEditorForm.get('BannerImageAltText').value;\r\n }\r\n\r\n ngOnInit() {\r\n this.subscription.add(this.activatedRoute.url.subscribe(urlsegments => {\r\n this.isNewsPage = urlsegments[0].path === 'news';\r\n }));\r\n\r\n this.subscription.add(this.pageService.updatedPageFromAudit$.subscribe(updatedPage => {\r\n if (this.existingPage.Id === updatedPage.Id) {\r\n this.handleSave(updatedPage, false);\r\n }\r\n }));\r\n\r\n this.selectedOwner$ = this.pageEditorForm.get('OwnerUserUpnId')\r\n .valueChanges\r\n .pipe(\r\n switchMap(upnId => {\r\n return upnId ? this.userService.getUserByUpn(upnId) : of(null);\r\n }),\r\n map(user => {\r\n // map to PeoplePickerUser because we don't need all attributes\r\n return user ? {\r\n GraphId: user.id,\r\n Name: user.displayName,\r\n UPN: user.userPrincipalName,\r\n Mail: user.mail\r\n } as PeoplePickerUser : null;\r\n })\r\n );\r\n\r\n this.page$ = this.activatedRoute.data.pipe(\r\n map(data => {\r\n const page = data.page as Page;\r\n return page;\r\n }),\r\n tap(page => {\r\n if (page) {\r\n this.existingPage = page;\r\n // Fill the form with data from the fetched page\r\n Object.keys(page).forEach(prop => {\r\n if (this.pageEditorForm.contains(prop) && page[prop]) {\r\n if (prop !== 'Notify') {\r\n this.pageEditorForm.get(prop).patchValue(page[prop]);\r\n }\r\n }\r\n });\r\n // Save the original image URL so we can use previews / \"selected but not yet saved\" modes\r\n this.originalImageUrl = page.BannerImageUrl;\r\n this.currentlySelectedImageData = this.originalImageUrl;\r\n\r\n // Force angular to detect the changes\r\n this.cdr.detectChanges();\r\n }\r\n })\r\n );\r\n\r\n this.languages$ = combineLatest([this.languageTermService.getLanguages(), this.page$]).pipe(\r\n map(([fetchedLanguages, page]) => {\r\n if (page) {\r\n if (page.LanguageTermId) {\r\n\r\n // Get the selected simplifiedTerms based on the languageTermAppTiles from the apptile.\r\n const selectedLanguage = fetchedLanguages.filter(fl => fl.Guid === page.LanguageTermId);\r\n\r\n if (selectedLanguage[0]) {\r\n // set the selected values in the from\r\n this.pageEditorForm.patchValue({\r\n LanguageTermId: selectedLanguage[0].Guid\r\n });\r\n }\r\n }\r\n }\r\n console.log('Fetched languages: ', fetchedLanguages);\r\n return fetchedLanguages;\r\n }));\r\n\r\n this.channels$ = combineLatest([this.removedChannel$, this.channelService.getChannels(), this.page$])\r\n .pipe(\r\n map(([removedChannel, fetchedChannels, page]) => {\r\n if (removedChannel) {\r\n fetchedChannels.findRecursive(fc => fc.Guid === removedChannel.Guid, 'Terms').Selected = false;\r\n } else if (page) {\r\n if (page.ChannelTermPages && page.ChannelTermPages.length > 0) {\r\n this.selectedChannels = page.ChannelTermPages.map(ct => {\r\n const selectedChannel = fetchedChannels.findRecursive(fc => fc.Guid === ct.ChannelTermId, 'Terms');\r\n if (selectedChannel) {\r\n selectedChannel.Selected = true;\r\n }\r\n return selectedChannel;\r\n });\r\n this.removedChannels = this.selectedChannels.filter(c => !c).length;\r\n if (this.removedChannels > 0) {\r\n this.selectedChannels = this.selectedChannels.filter(c => c);\r\n }\r\n }\r\n }\r\n this.fetchedChannels = fetchedChannels;\r\n return fetchedChannels;\r\n })\r\n );\r\n\r\n this.foundUsers$ = this.OwnerInputControl\r\n .valueChanges\r\n .pipe(\r\n debounceTime(300),\r\n distinctUntilChanged(),\r\n filter(searchTerm => typeof searchTerm === 'string' && searchTerm.length > 0),\r\n switchMap(searchTerm => {\r\n this.noUsersFound = false;\r\n this.searchingForUsers = true;\r\n return this.userService.searchMsGraphForUsers(searchTerm, 5);\r\n }),\r\n map(userArray => {\r\n // map results and return\r\n return userArray.map(u => {\r\n return {\r\n GraphId: u.id,\r\n Name: u.displayName,\r\n UPN: u.userPrincipalName,\r\n Mail: u.mail\r\n } as PeoplePickerUser;\r\n });\r\n }),\r\n tap((users) => {\r\n this.searchingForUsers = false;\r\n if (users.length === 0) {\r\n this.noUsersFound = true;\r\n }\r\n })\r\n );\r\n\r\n this.galleryImages$ = this.pageService.getImages();\r\n }\r\n\r\n save() {\r\n if (this.pageEditorForm.valid) {\r\n this.saveBtnDisabled = true;\r\n const newOrUpdatedPage = this.pageEditorForm.value as Page;\r\n newOrUpdatedPage.PageType = this.isNewsPage ? PageType.News : PageType.Content;\r\n if (this.existingPage) {\r\n\r\n // If languagefiltering is disabled, don't change the language value\r\n if (!this.languageFilteringEnabled) {\r\n newOrUpdatedPage.LanguageTermId = this.existingPage.LanguageTermId;\r\n }\r\n\r\n newOrUpdatedPage.Id = this.existingPage.Id;\r\n if (this.currentlySelectedImageData && this.currentlySelectedImageType === ImageAlternative.COMPUTER) {\r\n this.pageService\r\n .addImage(this.currentlySelectedImageData).pipe(\r\n concatMap(url => {\r\n newOrUpdatedPage.BannerImageUrl = url;\r\n return this.pageService.updatePage(newOrUpdatedPage.Id, newOrUpdatedPage);\r\n })\r\n ).subscribe(\r\n (val) => this.handleSave(val, false),\r\n (err) => this.handleError(err)\r\n );\r\n } else {\r\n this.pageService\r\n .updatePage(newOrUpdatedPage.Id, newOrUpdatedPage).subscribe(\r\n (val) => this.handleSave(val, false),\r\n (err) => this.handleError(err)\r\n );\r\n }\r\n } else {\r\n if (this.currentlySelectedImageData && this.currentlySelectedImageType === ImageAlternative.COMPUTER) {\r\n this.subscription.add(\r\n this.pageService\r\n .addImage(this.currentlySelectedImageData).pipe(\r\n concatMap(url => {\r\n newOrUpdatedPage.BannerImageUrl = url;\r\n return this.pageService.addPage(newOrUpdatedPage);\r\n })\r\n ).subscribe(\r\n (val) => this.handleSave(val, true),\r\n (err) => this.handleError(err))\r\n );\r\n } else {\r\n this.subscription.add(\r\n this.pageService\r\n .addPage(newOrUpdatedPage).subscribe(\r\n (val) => this.handleSave(val, true),\r\n (err) => this.handleError(err))\r\n );\r\n }\r\n }\r\n }\r\n }\r\n\r\n delete() {\r\n if (this.existingPage) {\r\n const dialogRef = this.dialog.open(ConfirmDialogComponent);\r\n this.subscription.add(dialogRef.afterClosed().pipe(\r\n filter(result => result),\r\n concatMap(result =>\r\n this.pageService\r\n .deletePage(this.existingPage.Id)\r\n )).subscribe(\r\n (val) => {\r\n this.router.navigate(['../../'], { relativeTo: this.activatedRoute });\r\n Utilities.openSnackBar(this.snackBar, AlertTemplatesComponent, AlertTemplatesComponent.genericdeleted);\r\n },\r\n (err) => this.handleError(err))\r\n );\r\n }\r\n }\r\n\r\n removeAllChannels() {\r\n this.selectedChannels = [];\r\n const allTerms = this.fetchedChannels.filterRecursive(c => c.Selected, 'Terms');\r\n allTerms.forEach(ch => {\r\n this.removedChannel$.next(ch);\r\n this.cdr.detectChanges();\r\n });\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.subscription.unsubscribe();\r\n }\r\n}\r\n@NgModule({\r\n declarations: [\r\n AddEditPageComponent\r\n ],\r\n exports: [\r\n AddEditPageComponent\r\n ],\r\n imports: [\r\n CommonModule,\r\n LinkModule,\r\n RouterModule,\r\n MatSlideToggleModule,\r\n HtmlEditorModule,\r\n ReactiveFormsModule,\r\n SafeModule,\r\n MatFormFieldModule,\r\n MatInputModule,\r\n ChannelControlModule,\r\n MatButtonModule,\r\n OverlayModule,\r\n MatChipsModule,\r\n MatAutocompleteModule,\r\n MatProgressSpinnerModule,\r\n NgSubscribeModule,\r\n MatIconModule,\r\n MatNativeDateModule,\r\n MatDatepickerModule,\r\n MatExpansionModule,\r\n GalleryModule,\r\n WidgetPlaceholderModule,\r\n TextFieldModule,\r\n MatSelectModule\r\n ]\r\n})\r\nexport class AddEditPageModule { }\r\n","
    \r\n
    \r\n \r\n
    \r\n \r\n
    \r\n
    \r\n \r\n
    \r\n
    \r\n \r\n Search:\r\n \r\n
    \r\n \r\n Search text\r\n \r\n \r\n
    \r\n \r\n
    \r\n
    \r\n \r\n \r\n \r\n \r\n Start date must be before end date\r\n \r\n \r\n \r\n \r\n \r\n End date must be after start date\r\n \r\n
    \r\n
    \r\n \r\n
    \r\n
    \r\n \r\n Show:\r\n \r\n
    \r\n
    \r\n \r\n
    \r\n \r\n All news\r\n \r\n
    \r\n
    \r\n \r\n Only top news\r\n \r\n
    \r\n
    \r\n
    \r\n
    \r\n Only in my language(s)\r\n
    \r\n
    \r\n
    \r\n
    \r\n Only owned or modified by me\r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n \r\n Workplace:\r\n \r\n
    \r\n
    \r\n
    \r\n
    \r\n Include drafts\r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n \r\n
    \r\n
    \r\n
    \r\n \r\n Channel filter:\r\n \r\n
    \r\n
    \r\n
    \r\n
    \r\n \r\n \r\n \r\n {{channel.Name}}\r\n cancel\r\n \r\n \r\n \r\n \r\n \r\n \r\n
    \r\n \r\n
    \r\n
    \r\n
    \r\n
    \r\n \r\n
    \r\n \r\n \r\n Match any selected channel\r\n \r\n \r\n
    \r\n
    \r\n \r\n \r\n Match all selected channels\r\n \r\n \r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n","import { CdkOverlayOrigin, OverlayModule } from '@angular/cdk/overlay';\r\nimport { CommonModule } from '@angular/common';\r\nimport { ChangeDetectorRef, Component, EventEmitter, Input, NgModule, OnDestroy, OnInit, Output, ViewChild } from '@angular/core';\r\nimport { FormBuilder, FormControl, FormGroup, ReactiveFormsModule } from '@angular/forms';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatCheckboxModule } from '@angular/material/checkbox';\r\nimport { MatChipsModule } from '@angular/material/chips';\r\nimport { MatNativeDateModule } from '@angular/material/core';\r\nimport { MatDatepickerModule } from '@angular/material/datepicker';\r\nimport { MatExpansionModule } from '@angular/material/expansion';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { MatRadioModule } from '@angular/material/radio';\r\nimport { Router } from '@angular/router';\r\nimport { dateValueIsAfterOrBeforeOtherControl } from '@app/common/date-value-is-after-or-before-other-control-validator';\r\nimport { ChannelMatchingMode } from '@app/common/page-query';\r\nimport { ChannelControlModule } from '@app/components/form-controls/channel-control/channel-control.component';\r\nimport { PageType } from '@app/models/page';\r\nimport { SimplifiedTerm } from '@app/models/simplified-term';\r\nimport { FeatureSettingsStoreService } from '@app/services/feature-settings-store.service';\r\nimport { subDays } from 'date-fns';\r\nimport { combineLatest, Subscription } from 'rxjs';\r\nimport { debounceTime, filter, startWith } from 'rxjs/operators';\r\n\r\nexport enum TopNewsOnlyOption {\r\n All = 0,\r\n TopNewsOnly = 1\r\n}\r\n\r\n@Component({\r\n selector: 'app-page-filter',\r\n templateUrl: './page-filter.component.html',\r\n styleUrls: ['./page-filter.component.scss']\r\n})\r\nexport class PageFilterComponent implements OnInit, OnDestroy {\r\n\r\n // Channel picker stuff\r\n @ViewChild('trigger') trigger: CdkOverlayOrigin;\r\n _domTrigger: ClientRect;\r\n channelMenuOpen: boolean;\r\n\r\n @Input() channels: Array;\r\n @Input() editorOptionsEnabled: boolean;\r\n @Input() set pageType(pageType: PageType) {\r\n if (pageType === PageType.News) {\r\n this.isNews = true;\r\n }\r\n }\r\n\r\n @Output() queryOptionsChange = new EventEmitter();\r\n @Output() channelOptionsChange = new EventEmitter();\r\n\r\n languageFilteringEnabled: Boolean;\r\n isNews: Boolean;\r\n selectedChannels = new Array();\r\n searchText: FormControl;\r\n queryOptionsForm: FormGroup;\r\n channelFilterForm: FormGroup;\r\n subscription: Subscription;\r\n filterOpen = this.featureSettingsStoreService.state.showFilterInNewsCenter;\r\n newsDaysBack = this.featureSettingsStoreService.state.newsNumberOfDaysBack;\r\n\r\n constructor(private fb: FormBuilder,\r\n private cdRef: ChangeDetectorRef,\r\n private featureSettingsStoreService: FeatureSettingsStoreService,\r\n private router: Router) {\r\n\r\n const now: Date = new Date();\r\n this.searchText = this.fb.control('');\r\n this.queryOptionsForm = this.fb.group({\r\n onlyCurrentUserPages: [false],\r\n onlyInCurrentUserLanguages: [true],\r\n includeDrafts: false,\r\n startDate: [subDays(now, this.newsDaysBack ? this.newsDaysBack : 30), dateValueIsAfterOrBeforeOtherControl('endDate', false)],\r\n endDate: [now, dateValueIsAfterOrBeforeOtherControl('startDate', true)],\r\n topNewsOnlyOption: [TopNewsOnlyOption.All]\r\n });\r\n this.channelFilterForm = this.fb.group({\r\n selectedChannels: [[]],\r\n channelsMatchingOption: [ChannelMatchingMode.Or]\r\n });\r\n }\r\n\r\n ngOnInit(): void {\r\n // If language filtering is enabled for sharepoint or Workplace, show the 'only in my language(s)' option.\r\n const feature = this.featureSettingsStoreService.state;\r\n this.languageFilteringEnabled = feature.enableLanguageFilteringForWorkplace ||\r\n feature.enableLanguageFilteringForSharepointPages;\r\n\r\n // Combine searchtext and queryoptions changes with a debounce on searchtext\r\n this.subscription = combineLatest([\r\n this.searchText.valueChanges.pipe(\r\n startWith(this.searchText.value),\r\n filter(() => this.searchText.valid),\r\n debounceTime(500)\r\n ),\r\n this.queryOptionsForm.valueChanges.pipe(\r\n startWith(this.queryOptionsForm.value),\r\n filter(() => this.queryOptionsForm.valid)\r\n )\r\n ]).subscribe(([searchText, queryOptions]) => this.queryOptionsChange.next({ ...queryOptions, searchText: searchText }));\r\n\r\n this.subscription.add(this.channelFilterForm.valueChanges.pipe(\r\n filter(() => this.channelFilterForm.valid)).subscribe(\r\n data => {\r\n this.channelOptionsChange.next(data);\r\n }\r\n ));\r\n\r\n // apply filter from the url parameter passed from parent component page-center\r\n const selectedChannels = this.channels.filterRecursive(c => c.Selected, 'Terms');\r\n if (selectedChannels?.length > 0) {\r\n this.selectedChannels = selectedChannels;\r\n this.channelFilterForm.get('selectedChannels').setValue(selectedChannels);\r\n }\r\n }\r\n\r\n channelFocus() {\r\n this._domTrigger = this.trigger.elementRef.nativeElement.getBoundingClientRect();\r\n this.channelMenuOpen = !this.channelMenuOpen;\r\n }\r\n\r\n handleRemoveSelectedChannel(cn: SimplifiedTerm) {\r\n cn.Selected = false;\r\n const selectedChannelsWithoutRemovedChannel = this.selectedChannels.filter(sc => sc.Guid !== cn.Guid);\r\n this.handleSelectedChannelsChange(selectedChannelsWithoutRemovedChannel);\r\n this.cdRef.detectChanges();\r\n }\r\n\r\n handleSelectedChannelsChange(event: SimplifiedTerm[]) {\r\n this.selectedChannels = event;\r\n this.channelFilterForm.get('selectedChannels').setValue(this.selectedChannels);\r\n this.appendQueryParam(this.selectedChannels);\r\n }\r\n\r\n appendQueryParam(terms: Array) {\r\n let queryParam = { channel: '' };\r\n if (terms.length === 1) {\r\n queryParam = { channel: terms[0].Guid };\r\n }\r\n\r\n const urlTree = this.router.createUrlTree([], {\r\n queryParams: queryParam,\r\n queryParamsHandling: 'merge',\r\n preserveFragment: true\r\n });\r\n\r\n this.router.navigateByUrl(urlTree);\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.subscription && this.subscription.unsubscribe();\r\n }\r\n\r\n toggleFilter() {\r\n console.log('asd');\r\n this.filterOpen = !this.filterOpen;\r\n }\r\n\r\n}\r\n@NgModule({\r\n declarations: [\r\n PageFilterComponent\r\n ],\r\n exports: [\r\n PageFilterComponent\r\n ],\r\n imports: [\r\n CommonModule,\r\n ReactiveFormsModule,\r\n MatDatepickerModule,\r\n MatNativeDateModule,\r\n MatFormFieldModule,\r\n MatInputModule,\r\n MatChipsModule,\r\n MatExpansionModule,\r\n MatRadioModule,\r\n ChannelControlModule,\r\n MatIconModule,\r\n OverlayModule,\r\n MatCheckboxModule,\r\n MatButtonModule\r\n ]\r\n})\r\nexport class PageFilterModule { }\r\n","
    \r\n
    \r\n
    \r\n
    \r\n \"Banner\r\n \r\n \"Banner\r\n \r\n
    \r\n
    \r\n

    \r\n \r\n

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

    \r\n \r\n Featured\r\n \r\n \r\n \r\n {{page.Title}}\r\n \r\n \r\n \r\n \r\n {{page.Title}}\r\n \r\n \r\n

    \r\n \r\n Draft\r\n \r\n \r\n Scheduled\r\n \r\n
    \r\n {{publishingDate|date}}\r\n
    \r\n
    \r\n {{getSenderTagString(page)}}\r\n
    \r\n
    \r\n

    {{HTMLToPlainText(page.Content)}}

    \r\n
    \r\n
    \r\n \r\n \r\n {{getLanguageNameForPage(page)}}\r\n \r\n \r\n {{channelName}}\r\n \r\n \r\n
    \r\n
    \r\n
    \r\n
    \r\n

    No pages found

    \r\n
    \r\n
    \r\n\r\n\r\n \r\n \r\n \r\n \r\n\r\n\r\n
    \r\n \r\n
    \r\n
    \r\n","import { CommonModule } from '@angular/common';\r\nimport { Component, EventEmitter, Input, NgModule, OnDestroy, OnInit, Output, Renderer2, RendererFactory2 } from '@angular/core';\r\nimport { MatChipsModule } from '@angular/material/chips';\r\nimport { MatDialog } from '@angular/material/dialog';\r\nimport { MatMenuModule } from '@angular/material/menu';\r\nimport { RouterModule } from '@angular/router';\r\nimport { Page, PageType } from '@app/models/page';\r\nimport { SimplifiedTerm } from '@app/models/simplified-term';\r\nimport { ChannelService } from '@app/services/channel.service';\r\nimport { LanguageTermService } from '@app/services/language-term.service';\r\nimport { isAfter, parseISO } from 'date-fns';\r\nimport { forkJoin, Subscription } from 'rxjs';\r\nimport { first } from 'rxjs/operators';\r\nimport { ConfirmDialogComponent } from '../confirm-dialog/confirm-dialog.component';\r\nimport { WidgetPlaceholderModule } from '../widget-placeholder/widget-placeholder.component';\r\nimport { ImgSrcProxyModule } from '@app/directives/img-src-proxy.directive';\r\nimport { LinkModule } from '@app/directives/link.directive';\r\n\r\n@Component({\r\n selector: 'app-page-list',\r\n templateUrl: './page-list.component.html',\r\n styleUrls: ['./page-list.component.scss']\r\n})\r\nexport class PageListComponent implements OnInit, OnDestroy {\r\n @Input() pages: Array;\r\n @Input() editorOptionsEnabled: boolean;\r\n @Input() showSharePointExternalIcon: boolean;\r\n @Input() pageType: PageType;\r\n @Input() loading: boolean;\r\n @Output() deleteEvent = new EventEmitter();\r\n\r\n channels: SimplifiedTerm[];\r\n languages: SimplifiedTerm[];\r\n termsLoaded = false;\r\n subscription = new Subscription();\r\n\r\n private renderer: Renderer2; // Used to convert the light page content HTML to plain text\r\n\r\n constructor(private dialog: MatDialog,\r\n private channelService: ChannelService,\r\n private languageTermService: LanguageTermService,\r\n private rendererFactory: RendererFactory2) {\r\n\r\n this.renderer = this.rendererFactory.createRenderer(null, null);\r\n }\r\n\r\n ngOnInit(): void {\r\n\r\n this.subscription.add(\r\n forkJoin([\r\n this.channelService.getChannels(),\r\n this.languageTermService.getLanguages()])\r\n .pipe(\r\n first()\r\n )\r\n .subscribe(([channels, languages]) => {\r\n this.channels = channels;\r\n this.languages = languages;\r\n this.termsLoaded = true;\r\n })\r\n );\r\n }\r\n\r\n deletePage(page: Page) {\r\n const dialogRef = this.dialog.open(ConfirmDialogComponent);\r\n this.subscription.add(\r\n dialogRef\r\n .afterClosed()\r\n .subscribe(\r\n result => {\r\n if (result) {\r\n this.deleteEvent.emit(page);\r\n }\r\n }));\r\n }\r\n\r\n getLanguageNameForPage(page: Page): string {\r\n // Set language to empty string if there is no LanguageTerm set for page\r\n if (!page.LanguageTermId) {\r\n return '';\r\n }\r\n const matchingLanguage = this.languages.find(l => l.Guid.toLowerCase() === page.LanguageTermId.toLowerCase());\r\n if (matchingLanguage && matchingLanguage.Name) {\r\n return matchingLanguage.Name;\r\n }\r\n return '';\r\n }\r\n\r\n getChannelNamesForPage(page: Page): string[] {\r\n const result = new Array();\r\n page.ChannelTermPages.forEach (ct => {\r\n const pageChannel = this.channels.findRecursive(fc => fc.Guid === ct.ChannelTermId, 'Terms');\r\n if (pageChannel && pageChannel.Name) {\r\n result.push(pageChannel.Name);\r\n }\r\n });\r\n\r\n return result;\r\n }\r\n\r\n isScheduledDraft(date: Date): boolean {\r\n return date && isAfter((typeof date === 'string' ? parseISO(date) : date), new Date());\r\n }\r\n\r\n HTMLToPlainText(htmlContent: string): string {\r\n const htmlParser = this.renderer.createElement('div');\r\n htmlParser.innerHTML = htmlContent;\r\n const plainText = htmlParser.innerText;\r\n htmlParser.remove();\r\n return plainText;\r\n }\r\n\r\n /**\r\n * Creates a user friendly string by concatenting the news item SenderTag labels\r\n * @param pageItem Newsitem to get SenderTag from\r\n * @returns string for displaying the tags for users\r\n */\r\n getSenderTagString(pageItem: Page): string {\r\n if (pageItem.SenderTags && pageItem.SenderTags.length) {\r\n let senderTagString = '';\r\n let maxSenderTags = 2; // Set max to show 2 sendertags\r\n // If the length of SenderTags array is less than max, set to length of sendertags\r\n if (pageItem.SenderTags.length < maxSenderTags) {\r\n maxSenderTags = pageItem.SenderTags.length;\r\n }\r\n for (let i = 0; i < maxSenderTags; i++) {\r\n if (i > 0) {\r\n senderTagString += ' | ';\r\n }\r\n // check if SenderTag is from graph or search\r\n if (pageItem.SenderTags[i].Label) {\r\n senderTagString += pageItem.SenderTags[i].Label;\r\n } else {\r\n senderTagString += pageItem.SenderTags[i];\r\n }\r\n }\r\n return senderTagString;\r\n }\r\n return null;\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.subscription && this.subscription.unsubscribe();\r\n }\r\n}\r\n@NgModule({\r\n declarations: [\r\n PageListComponent\r\n ],\r\n exports: [\r\n PageListComponent\r\n ],\r\n imports: [\r\n CommonModule,\r\n MatChipsModule,\r\n MatMenuModule,\r\n RouterModule,\r\n WidgetPlaceholderModule,\r\n ImgSrcProxyModule,\r\n LinkModule,\r\n ]\r\n})\r\nexport class PageListModule { }\r\n","import { Inject, Injectable } from '@angular/core';\r\nimport { CUSTOMERENVIRONMENT } from '@app/common/app-tokens';\r\nimport { applyLanguageFilteringSingle } from '@app/common/filtering-behavior';\r\nimport { PageQuery } from '@app/common/page-query';\r\nimport { Page } from '@app/models/page';\r\nimport { SearchService } from '@app/services/search.service';\r\nimport { Environment } from '@environments/interface.environment';\r\nimport { combineLatest, iif, Observable, of } from 'rxjs';\r\nimport { map, mergeMap } from 'rxjs/operators';\r\nimport { FeatureSettingsStoreService } from './feature-settings-store.service';\r\nimport { LicenseService } from './license.service';\r\nimport { PagesService } from './pages.service';\r\nimport { UserLanguageTermService } from './user-language-term.service';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class PageCenterService {\r\n\r\n constructor(@Inject(CUSTOMERENVIRONMENT) private environment: Environment,\r\n private pagesService: PagesService,\r\n private searchService: SearchService,\r\n private featureSettingsStoreService: FeatureSettingsStoreService,\r\n private licenseService: LicenseService,\r\n private userLanguageTermService: UserLanguageTermService,\r\n ) { }\r\n\r\n /**\r\n * Returns all pages matching the query. Filtered by language if: language filtering is enabled/configured in the environment and the parameter overrideLanguageFilter is false\r\n * The returned result could depending on configuration and user licenses be sharepoint pages or workplace pages or a combination of both.\r\n * @param query the page query\r\n * @param overrideLanguageFilter override the language filter if true. This doesn't have any effect if the filtering is disabled to begin with.\r\n */\r\n public getAllPagesByQuery(query: PageQuery, overrideLanguageFilter: boolean): Observable> {\r\n\r\n const pagesFromSharePoint$ = this.licenseService.hasUserAny365License().pipe(\r\n mergeMap(isLicensed =>\r\n iif(() => isLicensed,\r\n this.searchService.getModernPagesByPageQuery(query).pipe(\r\n map(searchResultFromSharePoint => {\r\n // console.log(searchResultFromSharePoint);\r\n return searchResultFromSharePoint.map(item =>\r\n Page.fromSearchResult(item,\r\n this.environment.featureSettings.managedPropertyConfig.newsIsTopNewsManagedProperty,\r\n this.environment.featureSettings.managedPropertyConfig.newsChannelManagedProperty,\r\n this.environment.featureSettings.managedPropertyConfig.newsLanguageManagedProperty,\r\n query.PageType,\r\n this.environment.featureSettings.managedPropertyConfig.newsSenderTagsManagedProperty)\r\n );\r\n })\r\n ),\r\n of([]),\r\n )\r\n )\r\n );\r\n\r\n // Returns sharepoint pages matching the query. If language filtering is enabled and configured in the environment they will be filtered by user selected language as well.\r\n const languageFilteredPagesFromSharePoint$ = pagesFromSharePoint$\r\n .pipe(\r\n mergeMap((pages) => {\r\n if (this.featureSettingsStoreService.state.enableLanguageFilteringForSharepointPages && !overrideLanguageFilter) {\r\n return this.userLanguageTermService.getUserLanguageTerms()\r\n .pipe(\r\n map((userLanguageTerms) => {\r\n return applyLanguageFilteringSingle(pages, userLanguageTerms, this.featureSettingsStoreService.state.enableShowNonLanguageContentForAllUsers, this.featureSettingsStoreService.state.defaultLanguageTermId);\r\n })\r\n );\r\n } else {\r\n return of(pages);\r\n }\r\n }));\r\n\r\n // Returns workplace pages matching the query. If language filtering is enabled and configured in the environment they will be filtered by user selected language as well.\r\n const languageFilteredPagesFromWorkplace$ = this.pagesService.getPagesByQuery(query)\r\n .pipe(\r\n mergeMap((pages) => {\r\n if (this.featureSettingsStoreService.state.enableLanguageFilteringForWorkplace && !overrideLanguageFilter) {\r\n return this.userLanguageTermService.getUserLanguageTerms()\r\n .pipe(\r\n map((userLanguageTerms) => {\r\n return applyLanguageFilteringSingle(pages, userLanguageTerms, this.featureSettingsStoreService.state.enableShowNonLanguageContentForAllUsers, this.featureSettingsStoreService.state.defaultLanguageTermId);\r\n })\r\n );\r\n } else {\r\n return of(pages);\r\n }\r\n }));\r\n\r\n return iif(\r\n () => this.environment.enableWorkplaceLight,\r\n combineLatest([languageFilteredPagesFromWorkplace$, languageFilteredPagesFromSharePoint$])\r\n .pipe(\r\n map(([pagesFromApi, pagesFromSharePoint]) => {\r\n // return workplace light and sharepoint pages\r\n // note that for unlicensed users (light users) the sharepoint pages is a empty array due to a earlier check\r\n return pagesFromApi.concat(pagesFromSharePoint);\r\n })\r\n ),\r\n // if workplace light isn't enabled then return only sharepoint pages\r\n languageFilteredPagesFromSharePoint$);\r\n }\r\n}\r\n","
    \r\n
    \r\n \r\n
    \r\n \r\n
    \r\n
    \r\n \r\n \r\n
    \r\n
    \r\n\r\n
    amountOfPagesToDisplayCurrently\">\r\n
    \r\n \r\n
    \r\n
    \r\n\r\n
    amountOfPagesToDisplay\">\r\n
    \r\n \r\n
    \r\n
    \r\n
    \r\n\r\n\r\n
    \r\n \r\n
    \r\n
    \r\n","import { CommonModule } from '@angular/common';\r\nimport { Component, Inject, Input, NgModule, OnDestroy, OnInit } from '@angular/core';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { CUSTOMERENVIRONMENT } from '@app/common/app-tokens';\r\nimport { ChannelMatchingMode, PageQuery } from '@app/common/page-query';\r\nimport { Roles } from '@app/common/roles';\r\nimport { PageFilterModule, TopNewsOnlyOption } from '@app/components/page-filter/page-filter.component';\r\nimport { PageListModule } from '@app/components/page-list/page-list.component';\r\nimport { WidgetPlaceholderModule } from '@app/components/widget-placeholder/widget-placeholder.component';\r\nimport { Page, PageType } from '@app/models/page';\r\nimport { PeoplePickerUser } from '@app/models/people-picker-user';\r\nimport { SimplifiedTerm } from '@app/models/simplified-term';\r\nimport { ChannelService } from '@app/services/channel.service';\r\nimport { PageCenterService } from '@app/services/page-center.service';\r\nimport { PagesService } from '@app/services/pages.service';\r\nimport { SecurityService } from '@app/services/security.service';\r\nimport { UserService } from '@app/services/user.service';\r\nimport { Environment } from '@environments/interface.environment';\r\nimport { User } from '@microsoft/microsoft-graph-types';\r\nimport { BehaviorSubject, combineLatest, Observable, Subject, Subscription } from 'rxjs';\r\nimport { map, shareReplay, startWith, switchMap, tap } from 'rxjs/operators';\r\n\r\n@Component({\r\n selector: 'app-page-center',\r\n templateUrl: './page-center.component.html',\r\n styleUrls: ['./page-center.component.scss']\r\n})\r\nexport class PageCenterComponent implements OnInit, OnDestroy {\r\n\r\n @Input() pageType: PageType;\r\n @Input() editorOptionsEnabled: boolean;\r\n @Input() filterChannelGuid: string;\r\n\r\n amountOfPagesToDisplay = 5;\r\n fetchedAmountOfPages = 0;\r\n amountOfNewsToIncreaseWith = 5;\r\n amountOfPagesToDisplayCurrently = this.amountOfNewsToIncreaseWith;\r\n amountOfPagesMatchingFilter = 0;\r\n\r\n lightEnabled: boolean;\r\n allowedToCreateNew$: Observable;\r\n\r\n allPagesFromQuery$: Observable>;\r\n filteredPages$: Observable>;\r\n channels$: Observable>;\r\n userInfo$: Observable;\r\n\r\n morePagesSubject: BehaviorSubject;\r\n reloadPagesSubject: BehaviorSubject;\r\n queryOptionsChanged$: Subject;\r\n channelFilterChanged$: Subject<{\r\n selectedChannels: Array,\r\n channelsMatchingOption: ChannelMatchingMode\r\n }>;\r\n selectedOwner$: Observable;\r\n\r\n loading = true;\r\n selectedChannelsNameMappings = new Map();\r\n\r\n deleteSubscription: Subscription;\r\n\r\n constructor(@Inject(CUSTOMERENVIRONMENT) private environment: Environment,\r\n private channelService: ChannelService,\r\n private pagesService: PagesService,\r\n private pageCenterService: PageCenterService,\r\n private securityService: SecurityService,\r\n private userService: UserService) {\r\n }\r\n\r\n ngOnInit() {\r\n this.lightEnabled = this.environment.enableWorkplaceLight;\r\n this.allowedToCreateNew$ = this.securityService.hasUserAnyAppRole([Roles.Admin, Roles.Editor]);\r\n this.userInfo$ = this.userService.getMyDetailsFromMsGraph();\r\n this.morePagesSubject = new BehaviorSubject(this.amountOfPagesToDisplay);\r\n this.reloadPagesSubject = new BehaviorSubject(null);\r\n this.channelFilterChanged$ = new BehaviorSubject({\r\n selectedChannels: (this.filterChannelGuid && [{ Guid: this.filterChannelGuid }]) || [],\r\n channelsMatchingOption: ChannelMatchingMode.Or\r\n });\r\n this.queryOptionsChanged$ = new Subject();\r\n\r\n this.allPagesFromQuery$ = combineLatest([\r\n this.queryOptionsChanged$,\r\n this.userInfo$,\r\n this.reloadPagesSubject\r\n ]).pipe(\r\n tap(() => this.loading = true),\r\n switchMap(([queryOptions, user]) => {\r\n const query: PageQuery = {\r\n PageType: this.pageType,\r\n FindText: queryOptions.searchText,\r\n StartDate: queryOptions.startDate,\r\n EndDate: queryOptions.endDate,\r\n OwnerOrEditorUpnId: queryOptions.OwnerOrEditorUpnId,\r\n Featured: this.pageType === PageType.Content ? null : queryOptions.topNewsOnlyOption === TopNewsOnlyOption.TopNewsOnly ? true : null,\r\n IncludeDrafts: queryOptions.includeDrafts,\r\n Channels: null,\r\n ChannelMatchingMode: null\r\n };\r\n if (queryOptions.onlyCurrentUserPages) {\r\n query.OwnerOrEditorUpnId = user.userPrincipalName;\r\n }\r\n // Override language filtering functionality if \"onlyInCurrentUserLanguages\" option is false.\r\n // Note that this has no effect if the language filter isn't enabled/configured for the environment to begin with. And the option shouldn't show either.\r\n const overrideLanguageFilter = queryOptions.onlyInCurrentUserLanguages ? false : true;\r\n return this.pageCenterService.getAllPagesByQuery(query, overrideLanguageFilter);\r\n }),\r\n tap(allPagesFromQuery => {\r\n this.loading = false;\r\n this.fetchedAmountOfPages = allPagesFromQuery.length;\r\n }),\r\n startWith([]),\r\n shareReplay());\r\n\r\n this.filteredPages$ = combineLatest([\r\n this.allPagesFromQuery$,\r\n this.channelFilterChanged$,\r\n this.morePagesSubject]).pipe(\r\n map(([pages, channelFilterValues]) => {\r\n if (channelFilterValues.selectedChannels.length === 0) {\r\n // Send back all pages if no channels are selected\r\n return pages;\r\n } else if (channelFilterValues.channelsMatchingOption === ChannelMatchingMode.Or) {\r\n return pages.filter(p => channelFilterValues.selectedChannels.some(c => p.ChannelTermPages.some(ctp => ctp.ChannelTermId === c.Guid)));\r\n } else if (channelFilterValues.channelsMatchingOption === ChannelMatchingMode.And) {\r\n return pages.filter(p => channelFilterValues.selectedChannels.every(c => p.ChannelTermPages.some(ctp => ctp.ChannelTermId === c.Guid)));\r\n }\r\n }),\r\n map(filteredPages => {\r\n // Sort the returned pages based on publishing date\r\n return filteredPages.sort((a, b) => {\r\n if (a.PublishingDate === null && b.PublishingDate === null) {\r\n return 0;\r\n }\r\n if (a.PublishingDate === null) {\r\n return -1; // Sort null values to the top, i.e drafts should show first\r\n }\r\n if (b.PublishingDate === null) {\r\n return 1; // Sort null values to the top, i.e drafts should show first\r\n }\r\n // If both items have a date specified, sort the most recent one on top\r\n return new Date(b.PublishingDate).getTime() - new Date(a.PublishingDate).getTime();\r\n });\r\n }),\r\n map((sortedAndfilteredPages) => {\r\n // If the filtering and sorted results in less amount of news showing than the current amount to display, reset the display counter\r\n this.amountOfPagesMatchingFilter = sortedAndfilteredPages.length;\r\n if (this.amountOfPagesMatchingFilter < this.amountOfPagesToDisplay) {\r\n this.amountOfPagesToDisplayCurrently = this.amountOfPagesToDisplay;\r\n }\r\n return sortedAndfilteredPages.slice(0, this.amountOfPagesToDisplayCurrently);\r\n }),\r\n shareReplay());\r\n\r\n this.channels$ = combineLatest([\r\n this.channelService.getChannels(),\r\n this.allPagesFromQuery$,\r\n this.channelFilterChanged$\r\n ])\r\n .pipe(\r\n map(([channels, allPagesFromQuery, channelFilter]) => {\r\n\r\n // Get the available channels from the fetched news\r\n const availableChannels: string[] = [...new Set(allPagesFromQuery.map(n => n.ChannelTermPages.map(ctp => ctp.ChannelTermId)).reduce((acc, val) => acc.concat(val), []))];\r\n // Modify channels for selection (recursively)\r\n channels.forEach(cn => {\r\n this.modifyChannelForSelection(cn, allPagesFromQuery, availableChannels, channelFilter);\r\n });\r\n\r\n return channels;\r\n }));\r\n\r\n }\r\n\r\n modifyChannelForSelection(channel: SimplifiedTerm, allPages: Page[], availableChannels: string[], channelFilter: { selectedChannels: Array, channelsMatchingOption: ChannelMatchingMode }) {\r\n if (!this.selectedChannelsNameMappings.has(channel.Guid)) {\r\n this.selectedChannelsNameMappings.set(channel.Guid, channel.Name);\r\n }\r\n\r\n let pagesHavingTerm = 0;\r\n const isChannelSelected = channel.Selected || channelFilter.selectedChannels.some(sc => sc.Guid === channel.Guid);\r\n // Edge case: never automatically disable channels which are already selected by the user; prevents \"lockout\" from the filter\r\n if (!availableChannels.some(ac => ac === channel.Guid) && !isChannelSelected) {\r\n channel.IsAvailableForTagging = false;\r\n } else if (availableChannels.some(ac => ac === channel.Guid) && !isChannelSelected) {\r\n // Channel isn't selected\r\n if (channelFilter.channelsMatchingOption === ChannelMatchingMode.Or) {\r\n // Any option\r\n pagesHavingTerm = allPages.map(n => n.ChannelTermPages.filter(ctp => ctp.ChannelTermId === channel.Guid)).reduce((acc, val) => acc.concat(val), []).length;\r\n } else if (channelFilter.channelsMatchingOption === ChannelMatchingMode.And) {\r\n // All option\r\n pagesHavingTerm = allPages.filter(p => {\r\n return p.ChannelTermPages.some(ctp => ctp.ChannelTermId === channel.Guid) && channelFilter.selectedChannels.every(sc => p.ChannelTermPages.some(ctp => ctp.ChannelTermId === sc.Guid));\r\n }).length;\r\n }\r\n } else if (isChannelSelected) {\r\n // Channel is selected\r\n channel.Selected = true;\r\n }\r\n if (pagesHavingTerm > 0) {\r\n channel.IsAvailableForTagging = true;\r\n channel.Name = `${this.selectedChannelsNameMappings.get(channel.Guid)} (${pagesHavingTerm})`;\r\n } else {\r\n channel.IsAvailableForTagging = false;\r\n channel.Name = this.selectedChannelsNameMappings.get(channel.Guid);\r\n }\r\n channel.Terms?.forEach(c => {\r\n this.modifyChannelForSelection(c, allPages, availableChannels, channelFilter);\r\n });\r\n }\r\n\r\n showMorePages() {\r\n this.amountOfPagesToDisplayCurrently = this.amountOfPagesToDisplayCurrently + this.amountOfNewsToIncreaseWith;\r\n this.morePagesSubject.next(this.amountOfPagesToDisplayCurrently + 1);\r\n }\r\n\r\n showLessPages() {\r\n this.amountOfPagesToDisplayCurrently = this.amountOfPagesToDisplay;\r\n this.morePagesSubject.next(this.amountOfPagesToDisplayCurrently + 1);\r\n }\r\n\r\n deletePage(page: Page) {\r\n this.deleteSubscription = this.pagesService.deletePage(page.Id)\r\n .subscribe(result => {\r\n if (result) {\r\n this.reloadPagesSubject.next(null);\r\n }\r\n });\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.deleteSubscription && this.deleteSubscription.unsubscribe();\r\n }\r\n\r\n}\r\n@NgModule({\r\n declarations: [\r\n PageCenterComponent\r\n ],\r\n exports: [\r\n PageCenterComponent\r\n ],\r\n imports: [\r\n WidgetPlaceholderModule,\r\n CommonModule,\r\n PageListModule,\r\n PageFilterModule,\r\n MatButtonModule\r\n ]\r\n})\r\nexport class PageCenterModule { }\r\n","import { Injectable } from '@angular/core';\r\nimport { ActivatedRouteSnapshot, Resolve, Router, RouterStateSnapshot } from '@angular/router';\r\nimport { Page } from '@app/models/page';\r\nimport { PagesService } from '@app/services/pages.service';\r\nimport { UserService } from '@app/services/user.service';\r\nimport { EMPTY, Observable } from 'rxjs';\r\nimport { catchError, map } from 'rxjs/operators';\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class NewsPageResolver implements Resolve {\r\n\r\n constructor(private service: PagesService, private userService: UserService, private router: Router) { }\r\n\r\n resolve(\r\n route: ActivatedRouteSnapshot,\r\n state: RouterStateSnapshot\r\n ): Observable {\r\n const slugTitleWithId = route.paramMap.get('slugWithId');\r\n return this.service.getNewsPage(slugTitleWithId).pipe(\r\n map(data => {\r\n return new Page({ ...data, ModifiedByUserPhotoUrl$: this.userService.getUserPhotoByUpn(data.ModifiedByUserUpnId), OwnerUserPhotoUrl$: this.userService.getUserPhotoByUpn(data.OwnerUserUpnId) });\r\n }),\r\n catchError(() => {\r\n this.router.navigate(['']);\r\n return EMPTY;\r\n })\r\n );\r\n }\r\n}\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class ContentPageResolver implements Resolve {\r\n\r\n constructor(private service: PagesService, private userService: UserService, private router: Router) { }\r\n\r\n resolve(\r\n route: ActivatedRouteSnapshot,\r\n state: RouterStateSnapshot\r\n ): Observable {\r\n const slugTitleWithId = route.paramMap.get('slugWithId');\r\n return this.service.getContentPage(slugTitleWithId).pipe(\r\n map(data => {\r\n return new Page({ ...data, ModifiedByUserPhotoUrl$: this.userService.getUserPhotoByUpn(data.ModifiedByUserUpnId), OwnerUserPhotoUrl$: this.userService.getUserPhotoByUpn(data.OwnerUserUpnId) });\r\n }),\r\n catchError(() => {\r\n this.router.navigate(['']);\r\n return EMPTY;\r\n })\r\n );\r\n }\r\n}\r\n","
    \r\n \r\n
    \r\n
    \r\n

    Page Center

    \r\n
    \r\n \r\n
    \r\n \r\n
    ","import { CommonModule } from '@angular/common';\r\nimport { Component, NgModule, OnInit } from '@angular/core';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { RouterModule } from '@angular/router';\r\nimport { Roles } from '@app/common/roles';\r\nimport { NgSubscribeModule } from '@app/directives/ng-subscribe.directive';\r\nimport { PageType } from '@app/models/page';\r\nimport { SecurityService } from '@app/services/security.service';\r\nimport { Observable } from 'rxjs';\r\nimport { PageCenterModule } from '../page-center/page-center.component';\r\n\r\n@Component({\r\n selector: 'app-content-page-center-view',\r\n templateUrl: './content-page-center-view.component.html',\r\n styleUrls: ['./content-page-center-view.component.scss']\r\n})\r\nexport class ContentPageCenterViewComponent implements OnInit {\r\n\r\n allowedToCreateNew$: Observable;\r\n pageType: PageType = PageType.Content;\r\n\r\n constructor(private securityService: SecurityService) { }\r\n\r\n ngOnInit() {\r\n this.allowedToCreateNew$ = this.securityService.hasUserAnyAppRole([Roles.Admin, Roles.Editor]);\r\n }\r\n}\r\n@NgModule({\r\n declarations: [\r\n ContentPageCenterViewComponent\r\n ],\r\n exports: [\r\n ContentPageCenterViewComponent\r\n ],\r\n imports: [\r\n MatButtonModule,\r\n CommonModule,\r\n RouterModule,\r\n PageCenterModule,\r\n NgSubscribeModule\r\n ]\r\n})\r\nexport class ContentPageCenterViewModule { }\r\n","
    \r\n \r\n
    \r\n
    \r\n

    News Center

    \r\n \r\n \r\n SharePoint news center\r\n \r\n \r\n
    \r\n \r\n
    \r\n \r\n \r\n \r\n
    \r\n","import { CommonModule } from '@angular/common';\r\nimport { Component, Inject, NgModule, OnInit } from '@angular/core';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { ActivatedRoute, RouterModule } from '@angular/router';\r\nimport { CUSTOMERENVIRONMENT } from '@app/common/app-tokens';\r\nimport { Roles } from '@app/common/roles';\r\nimport { ActionLinkModule } from '@app/components/actions/action-link/action-link.component';\r\nimport { NgSubscribeModule } from '@app/directives/ng-subscribe.directive';\r\nimport { PageType } from '@app/models/page';\r\nimport { FeatureSettingsStoreService } from '@app/services/feature-settings-store.service';\r\nimport { LicenseService } from '@app/services/license.service';\r\nimport { SecurityService } from '@app/services/security.service';\r\nimport { Environment } from '@environments/interface.environment';\r\nimport { Observable, Subscription } from 'rxjs';\r\nimport { PageCenterModule } from '@app/views/pages/page-center/page-center.component';\r\nimport { map } from 'rxjs/operators';\r\n\r\n@Component({\r\n selector: 'app-news-center-view',\r\n templateUrl: './news-center-view.component.html',\r\n styleUrls: ['./news-center-view.component.scss']\r\n})\r\nexport class NewsCenterViewComponent implements OnInit {\r\n\r\n allowedToCreateNew$: Observable;\r\n queryParamSubcription: Subscription;\r\n channel$: Observable;\r\n lightEnabled: boolean;\r\n licensed$: Observable;\r\n pageType: PageType = PageType.News;\r\n newsCenterUrl: string;\r\n showNewsCenterLink = this.featureSettingsStoreService.state.showSharePointNewsCenterLink;\r\n filterChannelGuid$: Observable;\r\n\r\n constructor(@Inject(CUSTOMERENVIRONMENT) private environment: Environment,\r\n private securityService: SecurityService,\r\n private licenseService: LicenseService,\r\n private featureSettingsStoreService: FeatureSettingsStoreService,\r\n private activatedRoute: ActivatedRoute) {\r\n }\r\n\r\n ngOnInit() {\r\n this.newsCenterUrl = this.featureSettingsStoreService.state.sharePointNewsCenterUrl;\r\n this.allowedToCreateNew$ = this.securityService.hasUserAnyAppRole([Roles.Admin, Roles.Editor]);\r\n this.lightEnabled = this.environment.enableWorkplaceLight;\r\n this.licensed$ = this.licenseService.hasUserAny365License();\r\n this.filterChannelGuid$ = this.activatedRoute.queryParamMap\r\n .pipe(\r\n map(params => {\r\n if (params.has('channel')) {\r\n return params.get('channel');\r\n }\r\n return undefined;\r\n }));\r\n }\r\n\r\n}\r\n@NgModule({\r\n declarations: [\r\n NewsCenterViewComponent\r\n ],\r\n exports: [\r\n NewsCenterViewComponent\r\n ],\r\n imports: [\r\n MatButtonModule,\r\n CommonModule,\r\n NgSubscribeModule,\r\n RouterModule,\r\n PageCenterModule,\r\n ActionLinkModule\r\n ]\r\n})\r\nexport class NewsCenterViewModule { }\r\n","import { NgModule } from '@angular/core';\r\nimport { RouterModule } from '@angular/router';\r\nimport { AddEditPageComponent, AddEditPageModule } from '@app/views/pages/add-edit-page/add-edit-page.component';\r\nimport { PageCenterModule } from '@app/views/pages/page-center/page-center.component';\r\nimport { PageComponent, PageModule } from '@app/views/pages/page/page.component';\r\nimport { NewsPageResolver } from '@app/views/pages/page/page.resolver';\r\nimport { ContentPageCenterViewComponent, ContentPageCenterViewModule } from './content-page-center-view/content-page-center-view.component';\r\nimport { NewsCenterViewComponent, NewsCenterViewModule } from './news-center-view/news-center-view.component';\r\nimport { ContentPageResolver } from './page/page.resolver';\r\nimport { Roles } from '@app/common/roles';\r\nimport { AuthorizeAccessGuard } from '@app/guards/authorize-access.guard';\r\n\r\n@NgModule({\r\n imports: [\r\n RouterModule.forChild(\r\n [\r\n {\r\n path: 'content', component: ContentPageCenterViewComponent,\r\n },\r\n {\r\n path: 'content/add', component: AddEditPageComponent, canActivate: [AuthorizeAccessGuard], data: { roles: [Roles.Admin, Roles.Editor] }\r\n },\r\n {\r\n path: 'content/:slugWithId', component: PageComponent, resolve: { page: ContentPageResolver }\r\n },\r\n {\r\n path: 'content/:slugWithId/edit', component: AddEditPageComponent, resolve: { page: ContentPageResolver }, canActivate: [AuthorizeAccessGuard], data: { roles: [Roles.Admin, Roles.Editor] }\r\n },\r\n {\r\n path: 'news', component: NewsCenterViewComponent,\r\n },\r\n {\r\n path: 'news/add', component: AddEditPageComponent, canActivate: [AuthorizeAccessGuard], data: { roles: [Roles.Admin, Roles.Editor] }\r\n },\r\n {\r\n path: 'news/:slugWithId', component: PageComponent, resolve: { page: NewsPageResolver }\r\n },\r\n {\r\n path: 'news/:slugWithId/edit', component: AddEditPageComponent, resolve: { page: NewsPageResolver }, canActivate: [AuthorizeAccessGuard], data: { roles: [Roles.Admin, Roles.Editor] }\r\n }\r\n ]),\r\n PageModule,\r\n PageCenterModule,\r\n AddEditPageModule,\r\n NewsCenterViewModule,\r\n ContentPageCenterViewModule\r\n ]\r\n})\r\nexport class PagesViewModule { }\r\n","import { Observable } from 'rxjs';\r\n\r\nexport class SearchResult {\r\n public AccountName: string;\r\n public Rank: number;\r\n public Title: string;\r\n public Filename: string;\r\n public HitHighlightedTitle: string;\r\n public Author: string;\r\n public AuthorOWSUSER: string;\r\n public Path: string;\r\n public Description?: string;\r\n public LastModifiedTime: Date;\r\n public FirstPublishedDate: Date;\r\n public HitHighlightedSummary: string;\r\n public FileExtension: string;\r\n public SiteName: string;\r\n public SiteTitle: string;\r\n public IsDocument: boolean;\r\n public IsContainer: boolean;\r\n public UniqueId: string;\r\n public Created: Date;\r\n public Culture: string;\r\n public PictureURL: string;\r\n public PictureThumbnailURL: string;\r\n public WorkEmail: string;\r\n public BaseOfficeLocation: string;\r\n public Department: string;\r\n public JobTitle: string;\r\n public PreferredName: string;\r\n public ViewsLifeTimeUniqueUsers: number;\r\n public RefinableInt00: number;\r\n public RefinableInt01: number;\r\n public BoolFieldNewsIsTopNewsOWSBOOL: string;\r\n public RefinableString20: string;\r\n public RefinableString21: string;\r\n public WebTemplate: string;\r\n public contentclass: string;\r\n public EditorOwsUser: string;\r\n public ModifiedBy: string;\r\n public SPWebUrl: string;\r\n public LikesCount: number;\r\n public ServerRedirectedURL: string;\r\n public GroupId: string;\r\n public Expanded: boolean;\r\n public RefinableString22: string;\r\n\r\n public ProgID: string;\r\n // The following are used to track pageclick in sharepoint\r\n public piPageImpression: string;\r\n public piSearchResultId: string;\r\n public piPageImpressionBlockType: string;\r\n public SourceId: string;\r\n public SearchTerm: string;\r\n\r\n public photoUrl$: Observable;\r\n\r\n constructor(opt?: Partial) {\r\n Object.assign(this, opt);\r\n }\r\n}\r\n","import { Observable } from 'rxjs';\r\nimport { Component } from './component';\r\n\r\nexport class ComponentState {\r\n ShowBadge: boolean;\r\n Routes?: Array = [];\r\n Data?: Array;\r\n Component: Component = new Component();\r\n ComponentId: string;\r\n Refresh?: boolean;\r\n CheckForUpdatedContent?: Observable;\r\n LastCheckedForNewContent?: Date;\r\n\r\n constructor(opt?: Partial) {\r\n Object.assign(this, opt);\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { ActivatedRouteSnapshot, CanActivate, CanActivateChild, Router, RouterStateSnapshot, UrlTree } from '@angular/router';\r\nimport { RouteData } from '@app/common/route-data';\r\nimport { LicenseService } from '@app/services/license.service';\r\nimport { from, Observable, of } from 'rxjs';\r\nimport { mergeMap } from 'rxjs/operators';\r\nimport { navigationCancelingError } from '@app/guards/navigation-canceling-error';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class LicenseGuard implements CanActivate, CanActivateChild {\r\n\r\n constructor(private licenseService: LicenseService, private router: Router) { }\r\n\r\n canActivate(\r\n next: ActivatedRouteSnapshot,\r\n state: RouterStateSnapshot): Observable | Promise | boolean | UrlTree {\r\n return this.licenseService.hasUserAny365License()\r\n .pipe(\r\n mergeMap(hasUserAny365License => {\r\n if (hasUserAny365License) {\r\n return of(true);\r\n } else {\r\n const routeToShowInstead = this.router.config.find(route => (route.data as RouteData)?.onlyShowForLicensedUsers === false);\r\n if (routeToShowInstead) {\r\n return from(this.router.navigateByUrl(routeToShowInstead.path));\r\n } else {\r\n throw navigationCancelingError('unlicensed');\r\n }\r\n }\r\n })\r\n );\r\n }\r\n\r\n canActivateChild(\r\n childRoute: ActivatedRouteSnapshot,\r\n state: RouterStateSnapshot\r\n ): Observable | Promise | boolean | UrlTree {\r\n return this.canActivate(childRoute, state);\r\n }\r\n}\r\n","import { AppTile } from './app-tile';\r\n\r\nexport class LanguageTermAppTile {\r\n public AppTile: AppTile;\r\n public AppTileId: number;\r\n public LanguageTermId: string;\r\n\r\n constructor(opt?: Partial) {\r\n Object.assign(this, opt);\r\n }\r\n}\r\n","import { HttpClient, HttpHeaders } from '@angular/common/http';\r\nimport { Injectable } from '@angular/core';\r\nimport { HttpHelper } from '@app/common/http-helper';\r\nimport { Observable } from 'rxjs';\r\nimport { catchError, concatMap, map, shareReplay } from 'rxjs/operators';\r\nimport { CacheService } from './cache.service';\r\nimport { SphomeService } from './sphome.service';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class MyFollowedSitesService {\r\n\r\n public useCache = true;\r\n private readonly cacheKeyPrefix = 'MyFollowedSitesService';\r\n\r\n private getMyFollowedSitesFromSpHome$ = new Map>>();\r\n\r\n constructor(private http: HttpClient,\r\n private cache: CacheService,\r\n private spHomeService: SphomeService,\r\n private httpHelper: HttpHelper) { }\r\n\r\n getMyFollowedSitesFromSpHome(start: number = 0, count: number = 10) {\r\n const params = `${start.toString()}-${count.toString()}`;\r\n if (this.getMyFollowedSitesFromSpHome$.has(params)) {\r\n return this.getMyFollowedSitesFromSpHome$.get(params);\r\n } else {\r\n const cacheKey = `${this.cacheKeyPrefix}-${'getMyFollowedSitesFromSpHome'}-${start.toString()}-${count.toString()}`;\r\n\r\n this.getMyFollowedSitesFromSpHome$.set(params, this.spHomeService.getSPHomeContext()\r\n .pipe(concatMap(ctx => {\r\n const httpHeaders = new HttpHeaders().append('SPHome-ApiContext', ctx.Payload);\r\n return this.http.get(`${ctx.Urls[0]}/api/v1/sites/followed?mostRecentFirst=true&start=${start}&count=${count}&fillSiteData=true`, {\r\n headers: httpHeaders\r\n })\r\n .pipe(\r\n map(data => {\r\n this.useCache && this.cache.set(cacheKey, data.Items);\r\n return data.Items;\r\n }));\r\n }))\r\n .pipe(\r\n catchError(this.httpHelper.handleError({ operation: 'getMyFollowedSitesFromSpHome', result: [], rethrow: true, cacheKey: cacheKey })),\r\n shareReplay({ bufferSize: 1, refCount: true })));\r\n\r\n return this.getMyFollowedSitesFromSpHome$.get(params);\r\n }\r\n }\r\n}\r\n","import { Inject, Injectable } from '@angular/core';\r\nimport { WINDOW } from '@app/common/app-tokens';\r\nimport { Store } from '@app/common/store';\r\nimport { InternetStatus } from '@app/models/internet-status';\r\nimport { fromEvent } from 'rxjs';\r\nimport { tap } from 'rxjs/operators';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class InternetStatusService extends Store {\r\n\r\n constructor(@Inject(WINDOW) private window: Window) {\r\n super({ online: window.navigator.onLine });\r\n }\r\n\r\n whenOnline() {\r\n return fromEvent(this.window, 'online')\r\n .pipe(\r\n tap(() => {\r\n this.setState({ online: true });\r\n }));\r\n }\r\n\r\n whenOffline() {\r\n return fromEvent(this.window, 'offline')\r\n .pipe(\r\n tap(() => {\r\n this.setState({ online: false });\r\n }));\r\n }\r\n}\r\n","import { CommonModule } from '@angular/common';\r\nimport { Component, NgModule, OnInit } from '@angular/core';\r\n\r\n@Component({\r\n selector: 'app-text-placeholder',\r\n templateUrl: './text-placeholder.component.html',\r\n styleUrls: ['./text-placeholder.component.scss']\r\n})\r\nexport class TextPlaceholderComponent implements OnInit {\r\n\r\n constructor() { }\r\n\r\n ngOnInit() {\r\n }\r\n\r\n}\r\n\r\n@NgModule({\r\n declarations: [TextPlaceholderComponent],\r\n exports: [TextPlaceholderComponent],\r\n imports: [CommonModule],\r\n})\r\nexport class TextPlaceholderModule { }\r\n","
    \r\n \r\n
    \r\n\r\n","import { InfoB, InfoBoxStyle, InfoBoxType, InfoBoxWidth } from '@app/models/infobox';\r\n\r\nexport class InfoBoxUtilities {\r\n\r\n public static getStyleClasses(box: InfoB) {\r\n switch (box.Style) {\r\n case InfoBoxStyle.None:\r\n return box.Type !== InfoBoxType.Text ? 'picvid-style-1' : 'text-style-1';\r\n case InfoBoxStyle.Accent1:\r\n return box.Type !== InfoBoxType.Text ? 'picvid-style-2' : 'text-style-2';\r\n case InfoBoxStyle.Accent2:\r\n return box.Type !== InfoBoxType.Text ? 'picvid-style-3' : 'text-style-3';\r\n case InfoBoxStyle.Accent3:\r\n return box.Type !== InfoBoxType.Text ? 'picvid-style-4' : 'text-style-4';\r\n default:\r\n return box.Type !== InfoBoxType.Text ? 'picvid-style-1' : 'text-style-1';\r\n }\r\n }\r\n\r\n public static getWidthClasses(box: InfoB) {\r\n switch (box.Width) {\r\n case InfoBoxWidth.Auto:\r\n return 'w-auto';\r\n case InfoBoxWidth.Width100Percent:\r\n return 'w-100';\r\n case InfoBoxWidth.Width75Percent:\r\n return 'w-75';\r\n case InfoBoxWidth.Width66Percent:\r\n return 'w-66';\r\n case InfoBoxWidth.Width50Percent:\r\n return 'w-50';\r\n case InfoBoxWidth.Width33Percent:\r\n return 'w-33';\r\n case InfoBoxWidth.Width25Percent:\r\n return 'w-25';\r\n default:\r\n return 'w-auto';\r\n }\r\n }\r\n\r\n public static getCustomStyle(box: InfoB) {\r\n let bgStyle;\r\n let textStyle;\r\n if (box.CustomBackgroundColorHexCode) {\r\n bgStyle = { 'background-color': box.CustomBackgroundColorHexCode };\r\n }\r\n if (box.CustomTextColorHexCode) {\r\n textStyle = { 'color': box.CustomTextColorHexCode };\r\n }\r\n return {...bgStyle, ...textStyle};\r\n }\r\n}\r\n","import { HttpClient, HttpParams } from '@angular/common/http';\r\nimport { Inject, Injectable } from '@angular/core';\r\nimport { CUSTOMERENVIRONMENT } from '@app/common/app-tokens';\r\nimport { Constants } from '@app/common/constants';\r\nimport { HttpHelper } from '@app/common/http-helper';\r\nimport { CacheService } from '@app/services/cache.service';\r\nimport { Environment } from '@environments/interface.environment';\r\nimport { BehaviorSubject, concat, Observable, of, Subject } from 'rxjs';\r\nimport { catchError, map, shareReplay, takeUntil, tap } from 'rxjs/operators';\r\nimport { KpiChartGroup } from '../models/kpi-chart-group';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class KpiChartGroupService {\r\n\r\n constructor(@Inject(CUSTOMERENVIRONMENT) private environment: Environment,\r\n private http: HttpClient,\r\n private cache: CacheService,\r\n private httpHelper: HttpHelper) { }\r\n\r\n private readonly cacheKey = 'ChartGroupService-getKpiChartGroups';\r\n private readonly activeCacheKey = 'ActiveChartGroupService-getKpiChartGroups';\r\n public useCache = true;\r\n private reload$ = new Subject();\r\n public refresh$ = new BehaviorSubject(null);\r\n\r\n getActiveKpiChartGroups$: Observable>;\r\n getAllKpiChartGroups$: Observable>;\r\n\r\n public reload() {\r\n this.reload$.next();\r\n this.getActiveKpiChartGroups$ = null;\r\n this.getAllKpiChartGroups$ = null;\r\n if (this.useCache) {\r\n this.cache.removeAllItemsInPersistentCacheWithGeneratedKeyPrefix(this.cacheKey);\r\n }\r\n this.refresh$.next(null);\r\n }\r\n\r\n public reloadSelf() {\r\n this.getActiveKpiChartGroups$ = null;\r\n this.getAllKpiChartGroups$ = null;\r\n }\r\n\r\n getAllKPIChartGroups(): Observable> {\r\n if (this.getAllKpiChartGroups$) {\r\n return this.getAllKpiChartGroups$;\r\n } else {\r\n this.getAllKpiChartGroups$ = this.http.get>(`${Constants.API_ENDPOINT}/chartgroups`)\r\n .pipe(\r\n map(response => {\r\n console.log(`fetched result getAllKpiChartGroups: `, response);\r\n return response;\r\n }),\r\n tap(data => {\r\n this.useCache && this.cache.set(`${this.cacheKey}-all`, data);\r\n }),\r\n catchError(this.httpHelper.handleError({ operation: 'getAllKPIChartGroups', result: new Array(), rethrow: true, cacheKey: this.cacheKey })),\r\n takeUntil(this.reload$),\r\n shareReplay({ bufferSize: 1, refCount: true }));\r\n\r\n if (this.useCache) {\r\n const cachedData = this.cache.get>(`${this.cacheKey}-all`);\r\n if (cachedData) {\r\n return concat(of(cachedData), this.getAllKpiChartGroups$);\r\n }\r\n }\r\n return this.getAllKpiChartGroups$;\r\n }\r\n }\r\n\r\n getActiveKPIChartGroups(): Observable> {\r\n if (this.getActiveKpiChartGroups$) {\r\n return this.getActiveKpiChartGroups$;\r\n } else {\r\n this.getActiveKpiChartGroups$ = this.http.get>(`${Constants.API_ENDPOINT}/chartgroups/active`)\r\n .pipe(\r\n tap(data => {\r\n this.useCache && this.cache.set(this.activeCacheKey, data);\r\n }),\r\n catchError(this.httpHelper.handleError({ operation: 'getActiveKPIChartGroups', result: new Array(), rethrow: true, cacheKey: this.activeCacheKey })),\r\n takeUntil(this.reload$),\r\n shareReplay({ bufferSize: 1, refCount: true }));\r\n\r\n if (this.useCache) {\r\n const cachedData = this.cache.get>(this.activeCacheKey);\r\n if (cachedData) {\r\n return concat(of(cachedData), this.getActiveKpiChartGroups$);\r\n }\r\n }\r\n return this.getActiveKpiChartGroups$;\r\n }\r\n }\r\n\r\n getKpiChartGroup(id: number): Observable {\r\n return this.http.get(`${Constants.API_ENDPOINT}/chartgroups/${id}`)\r\n .pipe(\r\n map(response => {\r\n console.log(`fetched result getKpiChartGroup: `, response);\r\n return response;\r\n }));\r\n }\r\n\r\n updateKpiChartGroup(id: number, kpiChartGroup: KpiChartGroup): Observable {\r\n // We need to append the siteUrl because there will be an authorization check in the backend against the workplace admin group on this site\r\n const httpParams = new HttpParams().append('siteUrl', encodeURI(this.environment.coreWorkplaceSiteUrl));\r\n const fetchOperation = this.http.put(`${Constants.API_ENDPOINT}/chartgroups/${id}`, kpiChartGroup, {\r\n params: httpParams\r\n })\r\n .pipe(\r\n map(response => {\r\n console.log(`updated result: `);\r\n console.log(response);\r\n this.reload();\r\n return kpiChartGroup;\r\n }),\r\n catchError(this.httpHelper.handleError({ operation: 'updateKpiChartGroup', result: null, rethrow: true })));\r\n\r\n return fetchOperation;\r\n }\r\n\r\n deleteKPIChartGroup(id: number): Observable {\r\n // We need to append the siteUrl because there will be an authorization check in the backend against the workplace admin group on this site\r\n const httpParams = new HttpParams().append('siteUrl', encodeURI(this.environment.coreWorkplaceSiteUrl));\r\n const fetchOperation = this.http.delete(`${Constants.API_ENDPOINT}/chartgroups/${id}`, {\r\n params: httpParams\r\n })\r\n .pipe(\r\n map(response => {\r\n console.log(`deleted result: `);\r\n console.log(response);\r\n this.reload();\r\n return response;\r\n }),\r\n catchError(this.httpHelper.handleError({ operation: 'deleteKPIChartGroup', result: null, rethrow: true })));\r\n\r\n return fetchOperation;\r\n }\r\n\r\n addKpiChartGroup(kpiChartGroup: KpiChartGroup): Observable {\r\n // We need to append the siteUrl because there will be an authorization check in the backend against the workplace admin group on this site\r\n const httpParams = new HttpParams().append('siteUrl', encodeURI(this.environment.coreWorkplaceSiteUrl));\r\n const fetchOperation = this.http.post(`${Constants.API_ENDPOINT}/chartgroups`, kpiChartGroup, {\r\n params: httpParams\r\n })\r\n .pipe(\r\n map(response => {\r\n console.log(`added result: `);\r\n console.log(response);\r\n this.reload();\r\n return response;\r\n }),\r\n catchError(this.httpHelper.handleError({ operation: 'addKpiChartGroup', result: null, rethrow: true })));\r\n\r\n return fetchOperation;\r\n }\r\n}\r\n","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 = \"zn8P\";"],"sourceRoot":"webpack:///"}