{"version":3,"file":"28.e9c641687693edca.js","mappings":"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","names":["LoadOverview","createAction","LoadOverviewSuccess","props","LoadDetails","LoadDetailsSuccess","SetFilter","LoadMaps","LoadMapsSkipped","LoadMapsSuccess","LoadPhaseMaps","LoadPhaseMapsSkipped","LoadPhaseMapsSuccess","storeFeatureKey","expStateReducer","createReducer","overview","goalScore","cards","loadingOverview","details","experienceDetailCards","surveyIdQuestionMap","loadingDetails","maps","movePhases","filter","period","TimeValueOptions","homes","hosts","units","levels","moves","initialState","on","ExpActions","state","action","handleOverviewDates","filterOptions","getFilterOptionsFromOverview","handleDetailDates","getFilterOptionsFromDetail","payload","sorted","value","Set","sort","a","b","localeCompare","map","c","home","host","unit","job","move","homeCountryName","hostCountryName","workerBusinessUnit","workerJobLevel","moveType","v","invitedOn","Date","inviteDate","selectExperienceInsightsState","createFeatureSelector","selectTimePeriod","createSelector","selectOverviewGoalScore","selectMaps","selectMovePhases","selectMovesFilter","selectExperienceInsightsOverview","periodStartDate","getPeriodStartDate","filterCard","card","length","indexOf","selectCards","respondedOn","selectExperienceInsightsDetail","filterDetailCard","selectExperienceFilterOptions","selectCurrentExperienceFilter","selectLoadingOverview","selectLoadingDetails","selectOverviewCurrentScore","allScores","x","undefined","score","reduce","selectOverviewSupplierAverages","supplierScoresMap","Map","forEach","serviceScores","summary","key","supplier","service","toLowerCase","has","get","push","set","suppliersAveragesMap","average","selectJourneyMap","movesFilter","journeys","Array","m","flatMap","journey","current","find","j","updated","order","steps","splice","selectPhaseMap","phases","p","name","now","setMonth","getMonth","getFullYear","selectTrendDataDetail","detail","numberOfMonths","getNumberOfMonthsInPeriod","labels","currentMonth","i","date","unshift","toLocaleString","month","lookups","l","TrendLookupHelper","addScore","returnValue","prev","curr","helper","currDatapoint","counter","label","count","Math","round","toDatapoint","constructor","this","_key","toString","_counter","_score","selectDetailsGoalScore","selectDetailsCurrentScore","journeyPhases","selectDetailsMaxScore","max","selectDetailsMinScore","min","selectPhaseStats","model","phase","complete","selectExperienceInsightsQuestions","questionsMap","scoredQuestions","id","sum","questionRef","values","question","selectSortedSupplierAverages","averages","entries","entry","supplierName","supplierScore","selectOverviewHighestSupplier","selectSupplierCount","selectOverviewHighestSupplierName","selectOverviewHighestSupplierScore","selectOverviewLowestSupplier","selectOverviewLowestSupplierName","selectOverviewLowestSupplierScore","selectSurveyScorecardInfo","sent","isNaN","viewed","started","completed","viewedList","toFixed","selectPeriodLabels","selectTrendDataOverview","selectExcerptHighlights","title","experience","selectExcerptLowlights","selectHighLowLights","valueOf","ag","highLowLights","selectJourneySteps","journeyScoresMap","y","journeyScores","step","scores","phaseMap","journeyStep","isArray","i0","SmallScoreDoughnutComponent","colorService","maintainAspectRatio","cutout","color","drawnColor","redraw","doughnutData","datasets","backgroundColor","borderWidth","normalized","data","colorByScore","core","selectors","TrendLineComponent","store","route","plugins","legend","display","tooltip","mode","intersect","position","tooltipBg","scales","ticks","stepSize","suggestedMin","suggestedMax","grid","drawBorder","callback","val","index","getLabelForValue","Number","substring","toLocaleLowerCase","ngOnInit","lineData$","select","ExpInsights","pipe","withLatestFrom","of","type","fill","spanGaps","borderDash","borderDashOffset","showLine","tension","pointRadius","borderColor","barThickness","d","snapshot","paramMap","SurveyScorecardContainerComponent","ChartColorPipe","transform","pure","JourneyStepComponent","JourneyComponent","JourneyListComponent","dispatch","defaultSort","LabeledProgressBarComponent","percent","ExperienceInsightsSurveyProgressBarsComponent","ExperienceInsightsPageComponent","COLORS","onFilterChange","BackArrowComponent","shareReplay","configOrBufferSize","windowTime","scheduler","bufferSize","refCount","Infinity","share","connector","ReplaySubject","resetOnError","resetOnComplete","resetOnRefCountZero","selectExperienceInsightsDetailSuppliersScores","suppliersScoresMap","suppliers","Object","keys","k","selectExperienceInsightsDetailHighestSupplier","selectExperienceInsightsDetailLowestSupplier","HighLowQuestionsService","high","questions","endIndex","slice","low","startIndex","validQuestions","factory","ScoringQuestionPresentationComponent","text","scoreColor","ExcerptsContainerComponent","excerpts","_excerpts","skip","ExperienceDetailsLowerPanelContainerComponent","_class","highLowQuestionsService","s","layout$","combineLatest","highLowLights$","hasSuppliers","hasHighLowLights","tslib_es6","Unsubscriber","routes","path","component","ExperienceDetailDashboardComponent","journeyPhase","ExperienceInsightsRoutingModule","RouterModule","ExperienceInsightsService","http","getInsightsOverview","getInsightsDetail","getJourneyMap","getPhaseMap","ExperienceInsightsEffects","actions$","insights","createEffect","ofType","ExperienceInsightsActions","switchMap","_","ExperienceInsightsModule","imports","CommonModule","ChartsModule","SharedModule","DashboardModule","MatBadgeModule","StoreModule","EffectsModule","nextId","_MatBadgeBase","mixinDisabled","BADGE_CONTENT_CLASS","MatBadge","_color","_setColor","overlap","_overlap","coerceBooleanProperty","content","_content","newContent","_updateRenderedContent","description","_description","newDescription","_updateHostAriaDescription","hidden","_hidden","_ngZone","_elementRef","_ariaDescriber","_renderer","_animationMode","super","size","_id","_isInitialized","isAbove","isAfter","getBadgeElement","_badgeElement","_clearExistingBadges","_createBadgeElement","ngOnDestroy","destroyNode","removeDescription","nativeElement","badgeElement","createElement","activeClass","setAttribute","classList","add","appendChild","requestAnimationFrame","runOutsideAngular","newContentNormalized","trim","textContent","describe","colorPalette","remove","badges","querySelectorAll","from","ɵfac","i1","ANIMATION_MODULE_TYPE","ɵdir","ɵmod","ɵinj","A11yModule","MatCommonModule"],"sourceRoot":"webpack:///","sources":["./src/app/pages/experience-insights/store/actions/load-experience-insights-overview.actions.ts","./src/app/pages/experience-insights/store/experience-insights.reducer.ts","./src/app/pages/experience-insights/store/selectors/experience-insights.selectors.ts","./src/app/pages/experience-insights/store/selectors/detail-trendline-selector.ts","./src/app/pages/experience-insights/store/selectors/experience-details.selectors.ts","./src/app/pages/experience-insights/constants/constants.ts","./src/app/pages/experience-insights/store/selectors/experience-insights-survey-summary.selectors.ts","./src/app/pages/experience-insights/store/selectors/high-low-scoring-questions.selectors.ts","./src/app/pages/experience-insights/store/selectors/high-low-suppliers.selectors.ts","./src/app/pages/experience-insights/store/selectors/survey-scorecard.selectors.ts","./src/app/pages/experience-insights/store/selectors/period.selectors.ts","./src/app/pages/experience-insights/store/selectors/trendline.selectors.ts","./src/app/pages/experience-insights/store/selectors/exerps.selector.ts","./src/app/pages/experience-insights/store/selectors/journey-step.selector.ts","./src/app/charts/small-score-doughnut/small-score-doughnut.component.html","./src/app/charts/small-score-doughnut/small-score-doughnut.component.ts","./src/app/pages/experience-insights/components/trend-line/trend-line.component.ts","./src/app/pages/experience-insights/components/trend-line/trend-line.component.html","./src/app/pages/experience-insights/components/survey-scoreboard/survey-scorecard-container/survey-scorecard-container.component.html","./src/app/pages/experience-insights/components/survey-scoreboard/survey-scorecard-container/survey-scorecard-container.component.ts","./src/app/pages/experience-insights/services/chart-color.pipe.ts","./src/app/pages/experience-insights/components/journey-step/journey-step.component.html","./src/app/pages/experience-insights/components/journey-step/journey-step.component.ts","./src/app/pages/experience-insights/components/journey/journey.component.html","./src/app/pages/experience-insights/components/journey/journey.component.ts","./src/app/pages/experience-insights/components/journey-list/journey-list.component.html","./src/app/pages/experience-insights/components/journey-list/journey-list.component.ts","./src/app/pages/experience-insights/components/labeled-progress-bar/labeled-progress-bar.component.ts","./src/app/pages/experience-insights/components/labeled-progress-bar/labeled-progress-bar.component.html","./src/app/pages/experience-insights/components/experience-insights-survey-progress-bars/experience-insights-survey-progress-bars.component.html","./src/app/pages/experience-insights/components/experience-insights-survey-progress-bars/experience-insights-survey-progress-bars.component.ts","./src/app/pages/experience-insights/components/experience-insights-page/experience-insights-page.component.html","./src/app/pages/experience-insights/components/experience-insights-page/experience-insights-page.component.ts","./src/app/pages/experience-insights/components/back-arrow/back-arrow.component.ts","./node_modules/rxjs/dist/esm/internal/operators/shareReplay.js","./src/app/pages/experience-insights/store/selectors/detail-suppliers-scores.selector.ts","./src/app/pages/experience-insights/services/high-low-questions.service.ts","./src/app/pages/experience-insights/components/scoring-question-presentation/scoring-question-presentation.component.html","./src/app/pages/experience-insights/components/scoring-question-presentation/scoring-question-presentation.component.ts","./src/app/pages/experience-insights/components/excerpts/excerpts-container/excerpts-container.component.html","./src/app/pages/experience-insights/components/excerpts/excerpts-container/excerpts-container.component.ts","./src/app/pages/experience-insights/components/experience-details-lower-panel-container/experience-details-lower-panel-container.component.html","./src/app/pages/experience-insights/components/experience-details-lower-panel-container/experience-details-lower-panel-container.component.ts","./src/app/pages/experience-insights/components/experience-detail-dashboard/experience-detail-dashboard.component.html","./src/app/pages/experience-insights/experience-insights-routing.module.ts","./src/app/pages/experience-insights/components/experience-detail-dashboard/experience-detail-dashboard.component.ts","./src/app/pages/experience-insights/services/experience-insights.service.ts","./src/app/pages/experience-insights/store/experience-insights.effects.ts","./src/app/pages/experience-insights/experience-insights.module.ts","./node_modules/@angular/material/fesm2020/badge.mjs"],"sourcesContent":["import { createAction, props } from '@ngrx/store';\r\nimport { ICurrentFilter } from 'src/app/dashboard';\r\nimport { IXpDetails, IXpOverview, IMoveMapRecord, IMovePhaseMap } from '../../models';\r\n\r\nexport const LoadOverview = createAction(\r\n '[Experience Insights Component] Load Experience Insights Overview');\r\n\r\nexport const LoadOverviewSuccess = createAction(\r\n '[Experience Insights Effects] Load Experience Insights Overview Success',\r\n props()\r\n);\r\n\r\nexport const LoadDetails = createAction(\r\n '[Experience Insights Component] Load Experience Insights Detail',\r\n props<{ journeyPhase: string; journeyStep: string }>()\r\n);\r\n\r\nexport const LoadDetailsSuccess = createAction(\r\n '[Experience Insights Effects] Load Experience Insights Detail Success',\r\n props()\r\n);\r\n\r\nexport const SetFilter = createAction(\r\n '[Experience Insights Filter] Set Experience Insights filter',\r\n props<{ filter: ICurrentFilter }>()\r\n);\r\n\r\nexport const LoadMaps = createAction('[Journey Map Component] Load journey map');\r\n\r\nexport const LoadMapsSkipped = createAction('[Insights Effects] Maps already loaded');\r\n\r\nexport const LoadMapsSuccess = createAction(\r\n '[Insights Effects] Load journey map success',\r\n props< { maps: IMoveMapRecord[] }>()\r\n);\r\n\r\nexport const LoadPhaseMaps = createAction('[Journey Map Component] Load phases map');\r\n\r\nexport const LoadPhaseMapsSkipped = createAction('[Insights Effects] Phase maps already loaded');\r\n\r\nexport const LoadPhaseMapsSuccess = createAction(\r\n '[Insights Effects] Load phases map success',\r\n props< { maps: IMovePhaseMap[] }>()\r\n);\r\n","import { createReducer, on } from '@ngrx/store';\r\n\r\nimport { TimeValueOptions, IFilterValue, ICurrentFilter } from 'src/app/dashboard';\r\nimport * as ExpActions from './actions';\r\nimport {\r\n IXpOverview,\r\n IXpDetails,\r\n IMoveMapRecord,\r\n IMovePhaseMap\r\n} from '../models';\r\n\r\nexport const storeFeatureKey = 'experienceInsights';\r\n\r\nexport interface ExperienceInsightsState {\r\n overview: IXpOverview;\r\n loadingOverview: boolean;\r\n details: IXpDetails;\r\n loadingDetails: boolean;\r\n filter: ICurrentFilter;\r\n filterOptions?: IFilterValue;\r\n maps: IMoveMapRecord[];\r\n movePhases: IMovePhaseMap[];\r\n}\r\n\r\nconst initialOverviewState: IXpOverview = {\r\n goalScore: 85,\r\n cards: [],\r\n};\r\n\r\nconst initialDetailState: IXpDetails = {\r\n experienceDetailCards: [],\r\n goalScore: 85,\r\n surveyIdQuestionMap: {},\r\n};\r\n\r\nexport const initialState: ExperienceInsightsState = {\r\n overview: initialOverviewState,\r\n loadingOverview: true,\r\n details: initialDetailState,\r\n loadingDetails: true,\r\n maps: [],\r\n movePhases: [],\r\n filter: {\r\n period: TimeValueOptions.twelveMonths,\r\n homes: [],\r\n hosts: [],\r\n units: [],\r\n levels: [],\r\n moves: [],\r\n },\r\n};\r\n\r\nexport const expStateReducer = createReducer(\r\n initialState,\r\n\r\n on(ExpActions.SetFilter, (state, action) => ({\r\n ...state, filter: action.filter\r\n })),\r\n\r\n on(ExpActions.LoadOverview, (state) => ({\r\n ...state,\r\n loadingOverview: true\r\n })),\r\n\r\n on(ExpActions.LoadOverviewSuccess, (state, action) => ({\r\n ...state,\r\n overview: handleOverviewDates(action),\r\n filterOptions: getFilterOptionsFromOverview(action),\r\n loadingOverview: false\r\n })),\r\n\r\n on(ExpActions.LoadDetails, (state) => ({\r\n ...state,\r\n loadingDetails: true\r\n })),\r\n\r\n on(ExpActions.LoadDetailsSuccess, (state, action) => ({\r\n ...state,\r\n details: handleDetailDates(action),\r\n filterOptions: getFilterOptionsFromDetail(action),\r\n loadingDetails: false\r\n })),\r\n\r\n on(ExpActions.LoadMapsSuccess, (state, action) => ({\r\n ...state,\r\n maps: action.maps\r\n })),\r\n\r\n\r\n on(ExpActions.LoadPhaseMapsSuccess, (state, action) => ({\r\n ...state,\r\n movePhases: action.maps\r\n })),\r\n\r\n on(ExpActions.SetFilter, (state, payload) => ({ ...state, filter: payload.filter }))\r\n\r\n);\r\n\r\nfunction sorted(value: string[]): string[] {\r\n return [...new Set(value)].sort((a, b) => a.localeCompare(b));\r\n}\r\n\r\nfunction getFilterOptionsFromOverview(value: IXpOverview): IFilterValue {\r\n const homes: string[] = sorted(value.cards.map((c) => c.home));\r\n const hosts: string[] = sorted(value.cards.map((c) => c.host));\r\n const units: string[] = sorted(value.cards.map((c) => c.unit));\r\n const levels: string[] = sorted(value.cards.map((c) => c.job));\r\n const moves: string[] = sorted(value.cards.map((c) => c.move));\r\n\r\n return { homes, hosts, units, levels, moves };\r\n}\r\n\r\nfunction getFilterOptionsFromDetail(value: IXpDetails): IFilterValue {\r\n const homes: string[] = sorted(value.experienceDetailCards.map((c) => c.homeCountryName));\r\n const hosts: string[] = sorted(value.experienceDetailCards.map((c) => c.hostCountryName));\r\n const units: string[] = sorted(value.experienceDetailCards.map((c) => c.workerBusinessUnit));\r\n const levels: string[] = sorted(value.experienceDetailCards.map((c) => c.workerJobLevel));\r\n const moves: string[] = sorted(value.experienceDetailCards.map((c) => c.moveType));\r\n\r\n return { homes, hosts, units, levels, moves };\r\n}\r\n\r\nfunction handleOverviewDates(value: IXpOverview): IXpOverview {\r\n if (!value) return value;\r\n\r\n const cards = value.cards.map(v => {\r\n const invitedOn = new Date(v.invitedOn);\r\n return { ...v, invitedOn };\r\n });\r\n\r\n return { goalScore: value.goalScore, cards };\r\n}\r\n\r\nfunction handleDetailDates(value: IXpDetails):IXpDetails {\r\n if (!value) return value;\r\n\r\n const experienceDetailCards = value.experienceDetailCards.map(v => {\r\n const inviteDate = new Date(v.inviteDate);\r\n return { ...v, inviteDate };\r\n });\r\n return { ...value, experienceDetailCards: experienceDetailCards };\r\n}\r\n\r\n","import { createFeatureSelector, createSelector } from '@ngrx/store';\r\nimport { ICurrentFilter, TimeValueOptions } from 'src/app/dashboard';\r\n\r\nimport { IXpOverview, IXpDetails, IOverviewCard, IXpDetailsCard } from '../../models';\r\nimport { ExperienceInsightsState, storeFeatureKey } from '../experience-insights.reducer';\r\n\r\nconst selectExperienceInsightsState = createFeatureSelector(storeFeatureKey);\r\n\r\nexport const selectTimePeriod = createSelector(selectExperienceInsightsState, state => state.filter.period)\r\n\r\nexport const selectOverviewGoalScore = createSelector(selectExperienceInsightsState, (state) => state.overview?.goalScore);\r\n\r\nexport const selectMaps = createSelector(selectExperienceInsightsState, state => state.maps);\r\n\r\nexport const selectMovePhases = createSelector(selectExperienceInsightsState, state => state.movePhases);\r\n\r\nexport const selectMovesFilter = createSelector(selectExperienceInsightsState, state => state.filter.moves);\r\n\r\nexport const selectExperienceInsightsOverview = createSelector(selectExperienceInsightsState, selectTimePeriod, (state, period) => {\r\n const periodStartDate = getPeriodStartDate(period);\r\n const cards = state.overview.cards.filter(v =>\r\n v.invitedOn >= periodStartDate && filterCard(v, state.filter)\r\n );\r\n\r\n const overviewState: IXpOverview = {\r\n ...state.overview,\r\n goalScore: state.overview.goalScore,\r\n cards\r\n };\r\n\r\n return overviewState;\r\n});\r\n\r\nexport const selectCards = createSelector(selectExperienceInsightsOverview, overview =>\r\n overview?.cards.filter(c => !!c.respondedOn));\r\n\r\nexport const selectExperienceInsightsDetail = createSelector(selectExperienceInsightsState, selectTimePeriod, (state, period) => {\r\n const periodStartDate = getPeriodStartDate(period);\r\n const experienceDetailCards = state.details.experienceDetailCards.filter(v =>\r\n v.inviteDate >= periodStartDate && filterDetailCard(v, state.filter));\r\n\r\n const detailState: IXpDetails = {\r\n ...state.details,\r\n goalScore: state.details.goalScore,\r\n experienceDetailCards: experienceDetailCards\r\n };\r\n\r\n return detailState;\r\n});\r\n\r\nexport const selectExperienceFilterOptions = createSelector(selectExperienceInsightsState, state => state.filterOptions);\r\n\r\nexport const selectCurrentExperienceFilter = createSelector(selectExperienceInsightsState, state => state.filter);\r\n\r\nexport const selectLoadingOverview = createSelector(selectExperienceInsightsState, state => state.loadingOverview);\r\n\r\nexport const selectLoadingDetails = createSelector(selectExperienceInsightsState, state => state.loadingDetails);\r\n\r\nexport const selectOverviewCurrentScore = createSelector(selectExperienceInsightsOverview, (overview) => {\r\n const allScores = overview.cards.filter(x => x.score != undefined).map((card) => card.score);\r\n return allScores.length > 0 ? allScores.reduce((a, b) => a + b, 0) / allScores.length * 100 : 0;\r\n});\r\n\r\nexport const selectOverviewSupplierAverages = createSelector(selectExperienceInsightsOverview, (overview) => {\r\n const supplierScoresMap = new Map();\r\n\r\n overview?.cards.forEach((card) => {\r\n card.serviceScores?.forEach((summary) => {\r\n const key = summary.supplier ? summary.supplier : summary.service.toLowerCase();\r\n if (supplierScoresMap.has(key)) {\r\n supplierScoresMap.get(key)?.push(summary.score);\r\n } else {\r\n supplierScoresMap.set(key, [summary.score]);\r\n }\r\n });\r\n });\r\n\r\n const suppliersAveragesMap = new Map();\r\n\r\n supplierScoresMap.forEach((value, key) => {\r\n const average = value.reduce((a, b) => a + b) / value.length;\r\n suppliersAveragesMap.set(key, average);\r\n });\r\n\r\n return suppliersAveragesMap;\r\n});\r\n\r\nexport const selectJourneyMap = createSelector(selectMaps, selectMovesFilter, selectExperienceFilterOptions, (maps, movesFilter, filterOptions) => {\r\n if (!maps || !filterOptions) return null;\r\n\r\n const moves = movesFilter.length > 0 ? movesFilter : filterOptions.moves;\r\n const journeys = new Array<{ journey: string, order: number, steps: Array }>();\r\n\r\n maps\r\n .filter(m => moves.indexOf(m.move) > -1)\r\n .flatMap(m => m.journeys)\r\n .forEach(journey => {\r\n let current = journeys.find(j => j.journey === journey.journey);\r\n if (current) {\r\n var updated = { journey: current.journey, order: current.order, steps: [...new Set([...current.steps, ...journey.steps])] };\r\n journeys.splice(journeys.indexOf(current), 1, updated);\r\n } else {\r\n journeys.push(journey);\r\n }\r\n });\r\n\r\n return journeys.sort((a, b) => a.order > b.order ? 1 : -1);\r\n});\r\n\r\nexport const selectPhaseMap = createSelector(selectMovesFilter, selectExperienceFilterOptions, selectMovePhases, (movesFilter, filterOptions, movePhases) => {\r\n if (!movePhases || !filterOptions) return null;\r\n\r\n const moves = movesFilter.length > 0 ? movesFilter : filterOptions.moves;\r\n const phases = new Array<{ name: string, order: number }>();\r\n\r\n movePhases\r\n .filter(m => moves.indexOf(m.move) > -1)\r\n .flatMap(m => m.phases)\r\n .forEach(p => {\r\n let current = phases.find(j => j.name === p.name);\r\n if (!current) phases.push(p);\r\n });\r\n\r\n return phases.sort((a, b) => a.order > b.order ? 1 : -1);\r\n});\r\n\r\n\r\n\r\n\r\nfunction filterCard(card: IOverviewCard, filter: ICurrentFilter) {\r\n return (filter.homes.length === 0 || filter.homes.indexOf(card.home) >- 1)\r\n && (filter.hosts.length === 0 || filter.hosts.indexOf(card.host) >- 1)\r\n && (filter.levels.length === 0 || filter.levels.indexOf(card.job) >- 1)\r\n && (filter.units.length === 0 || filter.units.indexOf(card.unit) >- 1)\r\n && (filter.moves.length === 0 || filter.moves.indexOf(card.move) >- 1);\r\n}\r\n\r\nfunction filterDetailCard(card: IXpDetailsCard, filter: ICurrentFilter) {\r\n return (filter.homes.length === 0 || filter.homes.indexOf(card.homeCountryName) >- 1)\r\n && (filter.hosts.length === 0 || filter.hosts.indexOf(card.hostCountryName) >- 1)\r\n && (filter.levels.length === 0 || filter.levels.indexOf(card.workerJobLevel) >- 1)\r\n && (filter.units.length === 0 || filter.units.indexOf(card.workerBusinessUnit) >- 1)\r\n && (filter.moves.length === 0 || filter.moves.indexOf(card.moveType) >- 1);\r\n}\r\n\r\nfunction getPeriodStartDate(period: TimeValueOptions): Date {\r\n const now = new Date();\r\n switch (period) {\r\n case TimeValueOptions.twelveMonths:\r\n now.setMonth(now.getMonth()-11);\r\n return new Date(now.getFullYear(), now.getMonth(), 1);\r\n case TimeValueOptions.threeMonths:\r\n now.setMonth(now.getMonth()-2);\r\n return new Date(now.getFullYear(), now.getMonth(), 1);\r\n case TimeValueOptions.currentYear:\r\n return new Date(now.getFullYear(), 0, 1);\r\n }\r\n}\r\n","import { createSelector } from '@ngrx/store';\r\nimport { TimeValueOptions } from 'src/app/dashboard';\r\nimport { selectExperienceInsightsDetail } from './experience-insights.selectors';\r\nimport { selectTimePeriod } from './experience-insights.selectors';\r\n\r\ninterface ITrendlineDatapoint {\r\n label: string;\r\n score: number;\r\n count: number;\r\n}\r\n\r\nexport const selectTrendDataDetail = createSelector(\r\n selectExperienceInsightsDetail,\r\n selectTimePeriod,\r\n (detail, period) => {\r\n\r\n var numberOfMonths = getNumberOfMonthsInPeriod(period);\r\n const labels: string[] = [];\r\n const currentMonth = new Date().getMonth();\r\n for (let i = 0; i < numberOfMonths; i++) {\r\n const date = new Date();\r\n date.setMonth(currentMonth - i);\r\n labels.unshift(date.toLocaleString('default', { month: 'long' }));\r\n }\r\n\r\n // create lookup map of all datapoints\r\n const lookups = new Map();\r\n labels.forEach(l => lookups.set(l, new TrendLookupHelper(l)));\r\n\r\n detail.experienceDetailCards.forEach(card => {\r\n if (!card.inviteDate) return;\r\n let date = (typeof card.inviteDate === 'string') ? new Date(card.inviteDate) : card.inviteDate;\r\n const key = date.toLocaleString('default', { month: 'long' });\r\n const v = lookups.get(key) ?? new TrendLookupHelper(key);\r\n v.addScore(card.score);\r\n lookups.set(key, v);\r\n });\r\n\r\n // create trendline dataset from the map\r\n // if there are cards in the month then use the count,\r\n // otherwise take previous month\r\n const returnValue: ITrendlineDatapoint[] = [];\r\n labels.reduce((prev: ITrendlineDatapoint, curr: string) => {\r\n const helper = lookups.get(curr);\r\n if (!helper) return prev;\r\n\r\n // if there are no responses this month return prev month score\r\n const currDatapoint = (helper.counter === 0)\r\n ? { label: curr, score: prev.score, count: prev.count }\r\n : {\r\n label: curr,\r\n score: Math.round(( prev.score * prev.count / 100 + helper.score ) / (prev.count + helper.counter) * 100),\r\n count: prev.count + helper.counter\r\n };\r\n\r\n returnValue.push(currDatapoint)\r\n\r\n return currDatapoint;\r\n }, new TrendLookupHelper('').toDatapoint());\r\n\r\n return returnValue;\r\n });\r\n\r\nfunction getNumberOfMonthsInPeriod(period: TimeValueOptions): number {\r\n switch (period) {\r\n case TimeValueOptions.twelveMonths:\r\n return 12;\r\n case TimeValueOptions.threeMonths:\r\n return 3;\r\n case TimeValueOptions.currentYear:\r\n return new Date().getMonth() + 1;\r\n }\r\n}\r\n\r\nclass TrendLookupHelper{\r\n private _counter: number = 0;\r\n private _score: number = 0;\r\n private _key: string;\r\n\r\n constructor(key: string) {\r\n this._key = key.toString();\r\n }\r\n\r\n public get counter(): number {\r\n return this._counter;\r\n }\r\n\r\n public get label(): string {\r\n return this._key;\r\n }\r\n\r\n public get score(): number {\r\n return this._score;\r\n }\r\n\r\n public addScore(score: number) {\r\n this._score += score;\r\n this._counter++;\r\n }\r\n\r\n public toDatapoint() : ITrendlineDatapoint {\r\n return {\r\n label: this._key,\r\n score: this._counter !== 0 ? Math.round(this._score / this._counter * 100) : 0,\r\n count: 0\r\n }\r\n }\r\n}\r\n","import { createSelector } from '@ngrx/store';\r\nimport { selectExperienceInsightsDetail } from './experience-insights.selectors';\r\n\r\n\r\nexport const selectDetailsGoalScore = createSelector(selectExperienceInsightsDetail, (details) => details.goalScore);\r\n\r\nexport const selectDetailsCurrentScore = createSelector(selectExperienceInsightsDetail, (details) => {\r\n const allScores = details.experienceDetailCards.map((card) => card.score);\r\n if (allScores.length === 0) return 0;\r\n const currentScore = allScores.reduce((a, b) => a + b) / allScores.length;\r\n return currentScore * 100;\r\n});\r\n\r\nexport const selectDetailsMaxScore = createSelector(selectExperienceInsightsDetail, (details) => {\r\n const allScores = details.experienceDetailCards.map((card) => card.score);\r\n if (allScores.length === 0) return 0;\r\n return Math.max(...allScores);\r\n});\r\n\r\nexport const selectDetailsMinScore = createSelector(selectExperienceInsightsDetail, (details) => {\r\n const allScores = details.experienceDetailCards.map((card) => card.score);\r\n if (allScores.length === 0) return 0;\r\n return Math.min(...allScores);\r\n});\r\n","export const journeyPhases: string[] = [\"pre-move\", \"arrival\", \"post-move\", \"annual\", \"returning home\", \"post-repatriation\"];","import { createSelector } from '@ngrx/store';\r\n\r\nimport { selectExperienceInsightsOverview, selectPhaseMap } from './experience-insights.selectors';\r\nimport { IJourneyPhase } from '../../models';\r\nimport { journeyPhases } from '../../constants/constants';\r\n\r\nexport const selectPhaseStats = createSelector(\r\n selectExperienceInsightsOverview,\r\n selectPhaseMap,\r\n (overview, phases) => {\r\n if (!phases) return new Array();\r\n const model = phases.map(v => {\r\n const cards = overview?.cards.filter(c => c.phase?.toLowerCase() === v.name.toLowerCase());\r\n return {\r\n phase: v.name,\r\n count: cards?.length ?? 0,\r\n complete: cards?.filter(c => !!c.respondedOn).length ?? 0,\r\n }\r\n });\r\n model.sort((a, b) => journeyPhases.indexOf(a.phase) - journeyPhases.indexOf(b.phase));\r\n return model;\r\n }\r\n);\r\n","import { selectExperienceInsightsDetail } from './experience-insights.selectors';\r\nimport { createSelector } from '@ngrx/store';\r\n\r\nexport const selectExperienceInsightsQuestions = createSelector(\r\n selectExperienceInsightsDetail,\r\n (detail) => {\r\n const questionsMap = new Map();\r\n\r\n detail.experienceDetailCards?.forEach(card => {\r\n card.scoredQuestions?.forEach(({ id, score }) => {\r\n if (!questionsMap.get(id)) {\r\n questionsMap.set(id, {\r\n id,\r\n sum: 0,\r\n count: 0,\r\n })\r\n }\r\n\r\n const questionRef: {id: string, sum: number, count: number } | undefined = questionsMap.get(id);\r\n if (!questionRef) return;\r\n questionRef.sum += score;\r\n questionRef.count += 1;\r\n })\r\n });\r\n\r\n const questions = [...questionsMap.values()]\r\n .map(({ id, sum, count }) => ({\r\n id,\r\n question: detail.surveyIdQuestionMap[id],\r\n score: sum / count,\r\n }))\r\n .sort((a, b) => b.score - a.score);\r\n\r\n return questions;\r\n }\r\n);\r\n","import { createSelector } from '@ngrx/store';\r\nimport { selectOverviewSupplierAverages } from './experience-insights.selectors';\r\n\r\nexport const selectSortedSupplierAverages = createSelector(\r\n selectOverviewSupplierAverages,\r\n (averages) =>\r\n [...averages.entries()]\r\n .map((entry) => ({supplierName: entry[0], supplierScore: entry[1]}))\r\n .sort((a, b) => b.supplierScore - a.supplierScore)\r\n);\r\n\r\nexport const selectOverviewHighestSupplier = createSelector(\r\n selectSortedSupplierAverages,\r\n (sorted) => sorted[0]\r\n);\r\n\r\nexport const selectSupplierCount = createSelector(\r\n selectOverviewSupplierAverages,\r\n averages => [...averages.entries()].length\r\n)\r\n\r\nexport const selectOverviewHighestSupplierName = createSelector(\r\n selectOverviewHighestSupplier,\r\n (supplier) => supplier?.supplierName\r\n);\r\n\r\nexport const selectOverviewHighestSupplierScore = createSelector(\r\n selectOverviewHighestSupplier,\r\n (supplier) => (supplier?.supplierScore * 100 ?? null)\r\n);\r\n\r\nexport const selectOverviewLowestSupplier = createSelector(\r\n selectSortedSupplierAverages,\r\n (sorted) => sorted[sorted.length - 1]\r\n);\r\n\r\nexport const selectOverviewLowestSupplierName = createSelector(\r\n selectOverviewLowestSupplier,\r\n (supplier) => supplier?.supplierName\r\n);\r\n\r\nexport const selectOverviewLowestSupplierScore = createSelector(\r\n selectOverviewLowestSupplier,\r\n (supplier) => (supplier?.supplierScore * 100 ?? null)\r\n);\r\n","import { selectExperienceInsightsOverview } from './experience-insights.selectors';\r\nimport { createSelector } from '@ngrx/store';\r\n\r\nexport const selectSurveyScorecardInfo = createSelector(\r\n selectExperienceInsightsOverview, overview => {\r\n\r\n const sent: number = overview?.cards?.length;\r\n if (sent === 0 || isNaN(sent)) {\r\n return { sent: 0, viewed: \"0%\", started: \"0%\", completed: \"0%\" };\r\n }\r\n\r\n const viewedList = overview.cards.filter(c => c.viewed);\r\n let viewedTotal = viewedList.length;\r\n const viewed = `${(viewedTotal / sent * 100).toFixed(0)}%`;\r\n\r\n let startedTotal = viewedList.filter(c => c.started).length;\r\n const started = `${(startedTotal / sent * 100).toFixed(0)}%`;\r\n\r\n const completedTotal = viewedList.filter(c => !!c.respondedOn).length ?? 0;\r\n const completed = `${(completedTotal / sent * 100).toFixed(0)}%`;\r\n\r\n return {\r\n sent,\r\n viewed,\r\n started,\r\n completed\r\n };\r\n }\r\n);\r\n","import { createSelector } from '@ngrx/store';\r\nimport { TimeValueOptions } from 'src/app/dashboard';\r\n\r\nimport { selectCurrentExperienceFilter } from './experience-insights.selectors';\r\n\r\nexport const selectPeriodLabels = createSelector\r\n(\r\n selectCurrentExperienceFilter,\r\n filter => {\r\n var numberOfMonths = getNumberOfMonthsInPeriod(filter.period);\r\n const labels: string[] = [];\r\n const currentMonth = new Date().getMonth();\r\n for (let i = 0; i < numberOfMonths; i++) {\r\n const date = new Date();\r\n date.setMonth(currentMonth - i);\r\n labels.unshift(date.toLocaleString('default', { month: 'long' }));\r\n }\r\n return labels;\r\n }\r\n)\r\n\r\nfunction getNumberOfMonthsInPeriod(period: TimeValueOptions): number {\r\n switch (period) {\r\n case TimeValueOptions.twelveMonths:\r\n return 12;\r\n case TimeValueOptions.threeMonths:\r\n return 3;\r\n case TimeValueOptions.currentYear:\r\n return new Date().getMonth() + 1;\r\n }\r\n}\r\n","import { createSelector } from '@ngrx/store';\r\nimport { selectCards } from './experience-insights.selectors';\r\nimport { selectPeriodLabels } from './period.selectors';\r\n\r\nexport const selectTrendDataOverview = createSelector(\r\n selectCards,\r\n selectPeriodLabels,\r\n (cards, labels) => {\r\n\r\n // create lookup map of all datapoints\r\n const lookups = new Map();\r\n labels.forEach(l => lookups.set(l, new TrendLookupHelper(l)));\r\n\r\n cards.forEach(card => {\r\n if (!card.invitedOn) return;\r\n var date = (typeof card.invitedOn == 'string') ? new Date(card.invitedOn) : card.invitedOn;\r\n const key = date.toLocaleString('default', { month: 'long' });\r\n const v = lookups.get(key) ?? new TrendLookupHelper(key);\r\n if (card.score != undefined) {\r\n v.addScore(card.score);\r\n lookups.set(key, v);\r\n }\r\n });\r\n\r\n // create trendline dataset from the map\r\n // if there are cards in the month then use the count,\r\n // otherwise take previous month\r\n const returnValue: ITrendlineDatapoint[] = [];\r\n labels.reduce((prev: ITrendlineDatapoint, curr: string) => {\r\n const helper = lookups.get(curr);\r\n if (!helper) return prev;\r\n\r\n // if there are no responses this month return prev month score\r\n const currDatapoint = (helper.counter === 0)\r\n ? { label: curr, score: prev.score, count: prev.count }\r\n : {\r\n label: curr,\r\n score: Math.round((prev.score * prev.count / 100 + helper.score) / (prev.count + helper.counter) * 100),\r\n count: prev.count + helper.counter\r\n };\r\n\r\n returnValue.push(currDatapoint)\r\n\r\n return currDatapoint;\r\n }, new TrendLookupHelper('').toDatapoint());\r\n\r\n return returnValue;\r\n });\r\n\r\n\r\ninterface ITrendlineDatapoint {\r\n label: string;\r\n score: number;\r\n count: number;\r\n}\r\n\r\nclass TrendLookupHelper {\r\n private _counter: number = 0;\r\n private _score: number = 0;\r\n private _key: string;\r\n\r\n constructor(key: string) {\r\n this._key = key.toString();\r\n }\r\n\r\n public get counter(): number {\r\n return this._counter;\r\n }\r\n\r\n public get label(): string {\r\n return this._key;\r\n }\r\n\r\n public get score(): number {\r\n return this._score;\r\n }\r\n\r\n public addScore(score: number) {\r\n this._score += score;\r\n this._counter++;\r\n }\r\n\r\n public toDatapoint(): ITrendlineDatapoint {\r\n return {\r\n label: this._key,\r\n score: this._counter !== 0 ? Math.round(this._score / this._counter * 100) : 0,\r\n count: 0\r\n }\r\n }\r\n}","import { selectExperienceInsightsDetail, selectExperienceInsightsOverview } from './experience-insights.selectors';\r\nimport { createSelector } from '@ngrx/store';\r\nimport { IExcerpts } from 'src/app/pages/experience-insights/models/excerpt.model';\r\nimport { IXpDetailsCard } from '../../models';\r\n\r\n// TODO integrate with api and replace mocks\r\n\r\nexport const selectExcerptHighlights = createSelector(selectExperienceInsightsOverview, (detail) => {\r\n const obj: IExcerpts[] = [{ title: 'employee highlights', experience: [{ name: 'cheese is a lucrative product' }] }];\r\n return obj;\r\n});\r\n\r\nexport const selectExcerptLowlights = createSelector(selectExperienceInsightsOverview, (detail) => {\r\n const obj: IExcerpts[] = [\r\n {\r\n title: 'employee lowlights',\r\n experience: [\r\n { name: 'lorem ipsum marcus est lupus cogito igo sum non max' },\r\n { name: 'these are some filler words' },\r\n { name: 'some terrible bagels my mans' },\r\n { name: 'dogs v cats is not good arg ' },\r\n ],\r\n },\r\n ];\r\n return obj;\r\n});\r\n\r\nexport const selectHighLowLights = createSelector(selectExperienceInsightsDetail, (detail) =>\r\n detail.experienceDetailCards.sort((a, b) => b.respondedOn.valueOf() - a.respondedOn.valueOf())\r\n .reduce((ag: string[], card: IXpDetailsCard) => {\r\n return [\r\n ...ag,\r\n ...card.highLowLights\r\n ]\r\n }, [])\r\n);\r\n","import { createSelector } from '@ngrx/store';\r\nimport { selectCards, selectJourneyMap } from './experience-insights.selectors';\r\n\r\nexport const selectJourneySteps = createSelector(\r\n selectCards,\r\n selectJourneyMap,\r\n (cards, journey) => {\r\n if (!journey) return null;\r\n\r\n const journeyScoresMap = new Map>();\r\n for (let i = 0; i < journey.length; i++) {\r\n const j = journey[i];\r\n const steps = new Map();\r\n for (let y = 0; y < j.steps.length; y++) {\r\n steps.set(j.steps[y], []);\r\n }\r\n journeyScoresMap.set(j.journey, steps);\r\n }\r\n\r\n cards?.forEach(card => {\r\n card?.journeyScores?.forEach(journey => {\r\n const phase = journey.journey;\r\n const step = journey.step;\r\n let scores = journeyScoresMap.get(phase)?.get(step) as number[];\r\n if (scores) scores.push(journey.score);\r\n });\r\n });\r\n\r\n journeyScoresMap.forEach((phaseMap, phase) => {\r\n phaseMap.forEach((scores: number | number[], journeyStep) => {\r\n if (!Array.isArray(scores)) return;\r\n const average = scores.length > 0 ? Math.round(scores.reduce((a, b) => a + b, 0) / scores.length * 100) : 0;\r\n journeyScoresMap.get(phase)?.set(journeyStep, average);\r\n })\r\n });\r\n\r\n\r\n return journeyScoresMap as Map>;\r\n }\r\n);\r\n","
\r\n

{{ title }}

\r\n
\r\n \r\n \r\n\r\n
\r\n {{ score }}\r\n
\r\n
\r\n\r\n
{{ label }}
\r\n
\r\n","import { Component, Input, ChangeDetectionStrategy } from '@angular/core';\r\nimport { ChartData } from 'chart.js';\r\nimport { ChartColorService } from '../services/chart-color.service';\r\n\r\n@Component({\r\n selector: 'maas-small-score-doughnut',\r\n templateUrl: './small-score-doughnut.component.html',\r\n styleUrls: ['./small-score-doughnut.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush\r\n})\r\n\r\nexport class SmallScoreDoughnutComponent {\r\n @Input() title: string = '';\r\n @Input() label: string = '';\r\n\r\n drawnColor: string = '';\r\n @Input() set color(value: string) {\r\n this.drawnColor = value;\r\n };\r\n\r\n private _score = 0;\r\n @Input() set score(value: number) {\r\n if (isNaN(value) || !value) {\r\n this._score = 0;\r\n } else if (value > 0 && value <= 1) {\r\n this._score = Math.round(value * 100)\r\n } else {\r\n this._score = Math.round(value);\r\n }\r\n\r\n this.redraw();\r\n }\r\n get score() {\r\n return this._score;\r\n }\r\n\r\n data: ChartData | undefined;\r\n\r\n options = {\r\n maintainAspectRatio: false,\r\n cutout: '88%'\r\n };\r\n\r\n constructor(private colorService: ChartColorService) { }\r\n\r\n private doughnutData(): ChartData {\r\n return {\r\n datasets: [\r\n {\r\n backgroundColor: [this.drawnColor, '#BDD4E7'],\r\n borderWidth: 0,\r\n normalized: true,\r\n data: [this._score, 100 - this._score],\r\n },\r\n ],\r\n };\r\n }\r\n\r\n private redraw(): void {\r\n this.drawnColor = this.color ?? this.colorService.colorByScore(this._score);\r\n this.data = this.doughnutData();\r\n }\r\n}\r\n","import { ChangeDetectionStrategy, Component, Input, OnInit } from '@angular/core';\r\nimport { Store } from '@ngrx/store';\r\nimport { Observable, of } from 'rxjs';\r\nimport { map, withLatestFrom } from 'rxjs/operators';\r\n\r\nimport { RootState } from '@core';\r\nimport { ExpInsights } from '../../store';\r\nimport { ActivatedRoute } from '@angular/router';\r\nimport { tooltipBg } from 'src/scss/constants';\r\nimport { ChartData, ChartDataset, ChartOptions } from 'chart.js';\r\n\r\n@Component({\r\n selector: 'maas-trend-line',\r\n templateUrl: './trend-line.component.html',\r\n styleUrls: ['./trend-line.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class TrendLineComponent implements OnInit {\r\n @Input() detail: boolean = false;\r\n lineData$: Observable | undefined;\r\n\r\n options: ChartOptions = {\r\n maintainAspectRatio: false,\r\n plugins:{\r\n legend: {\r\n display: false,\r\n },\r\n tooltip: {\r\n mode: 'index',\r\n intersect: false,\r\n position: 'nearest',\r\n backgroundColor: tooltipBg,\r\n },\r\n },\r\n scales: {\r\n y:\r\n {\r\n ticks: {\r\n stepSize: 50,\r\n },\r\n display: true,\r\n suggestedMin: 0,\r\n suggestedMax: 100,\r\n grid: {\r\n drawBorder: false,\r\n display: false,\r\n },\r\n },\r\n x:\r\n {\r\n grid: {\r\n display: false,\r\n },\r\n ticks: {\r\n callback: function(val: string | number, index) {\r\n return this.getLabelForValue(Number(val))?.toString().substring(0, 3)?.toLocaleLowerCase() // display the first 3 characters in lowercase\r\n },\r\n color: '#072b87',\r\n },\r\n },\r\n },\r\n };\r\n\r\n constructor(private store: Store, private route: ActivatedRoute) {}\r\n\r\n ngOnInit(): void {\r\n this.lineData$ = this.store.select(ExpInsights.selectTrendDataOverview).pipe(\r\n withLatestFrom(this.detail ? this.store.select(ExpInsights.selectTrendDataDetail) : of(null)),\r\n map(([overview, detail]) => {\r\n const data = overview.map((d) => d.score);\r\n let datasets: ChartDataset[] = [\r\n {\r\n type: 'line',\r\n label: 'goal score',\r\n data: [85,85,85,85,85,85,85,85,85,85,85,85,],\r\n order: 0,\r\n fill: false,\r\n spanGaps: true,\r\n borderDash: [2, 4],\r\n borderDashOffset: 50,\r\n borderWidth: 1,\r\n showLine: true,\r\n tension: 0,\r\n pointRadius: 0,\r\n borderColor: 'black',\r\n },\r\n {\r\n label: 'overall score',\r\n backgroundColor: 'rgba(4, 106, 174,0.7)',\r\n borderColor: 'rgba(4, 106, 174,0.2)',\r\n barThickness: 6,\r\n fill: true,\r\n tension: 0.35,\r\n data,\r\n },\r\n ];\r\n\r\n if (this.detail && detail) {\r\n datasets.push({\r\n label: this.route.snapshot.paramMap.get('step') ?? '',\r\n backgroundColor: 'rgba(229, 143, 68, 1)',\r\n borderColor: 'rgba(229, 143, 68, 1)',\r\n barThickness: 6,\r\n fill: false,\r\n data: detail.map((d) => d.score),\r\n });\r\n }\r\n\r\n const barData: ChartData = {\r\n labels: overview.map((d) => d.label),\r\n datasets,\r\n };\r\n\r\n return barData;\r\n })\r\n );\r\n }\r\n}\r\n","
aim score trend
\r\n\r\n","\r\n\r\n
\r\n
\r\n

total sent

\r\n \r\n
\r\n\r\n
{{ scores.sent }}
\r\n
\r\n\r\n
\r\n
\r\n

viewed

\r\n \r\n
\r\n\r\n
{{ scores.viewed }}
\r\n
\r\n\r\n
\r\n
\r\n

started

\r\n \r\n
\r\n\r\n
{{ scores.started }}
\r\n
\r\n\r\n
\r\n
\r\n

completed

\r\n \r\n
\r\n\r\n
{{ scores.completed }}
\r\n
\r\n\r\n
","import { ChangeDetectionStrategy, Component } from '@angular/core';\r\nimport { Store } from '@ngrx/store';\r\n\r\nimport { ExpInsights, ExperienceInsightsState } from '../../../store';\r\n\r\n@Component({\r\n selector: 'maas-survey-scorecard-container',\r\n templateUrl: './survey-scorecard-container.component.html',\r\n styleUrls: ['./survey-scorecard-container.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush\r\n})\r\nexport class SurveyScorecardContainerComponent {\r\n scores$ = this.store.select(ExpInsights.selectSurveyScorecardInfo);\r\n\r\n constructor(private store: Store) { }\r\n}\r\n","import { Pipe, PipeTransform } from '@angular/core';\r\nimport { ChartColorService } from 'src/app/charts/services/chart-color.service';\r\n\r\n@Pipe({\r\n name: 'chartColor'\r\n})\r\nexport class ChartColorPipe implements PipeTransform {\r\n constructor(private colorService: ChartColorService){}\r\n\r\n transform(value: number): string {\r\n return this.colorService.colorByScore(value) ?? '';\r\n }\r\n\r\n}\r\n","
\r\n \r\n \r\n
\r\n \r\n
{{ name }}
\r\n\r\n\r\n\r\n
\r\n
\r\n
{{ name }}
\r\n
\r\n
\r\n","import { ChangeDetectionStrategy, Component, Input } from '@angular/core';\r\n\r\n@Component({\r\n selector: 'maas-journey-step',\r\n templateUrl: './journey-step.component.html',\r\n styleUrls: ['./journey-step.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush\r\n})\r\nexport class JourneyStepComponent {\r\n @Input() journey: string = '';\r\n @Input() name: string = '';\r\n @Input() score?: number = 0;\r\n}\r\n","
\r\n\r\n
\r\n\r\n \r\n {{ journey.key }}\r\n
\r\n\r\n
\r\n \r\n \r\n
\r\n","import { ChangeDetectionStrategy, Component, Input } from '@angular/core';\r\n\r\n@Component({\r\n selector: 'maas-journey',\r\n templateUrl: './journey.component.html',\r\n styleUrls: ['./journey.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush\r\n})\r\nexport class JourneyComponent {\r\n @Input() journey: { key: string, value: Map } | undefined;\r\n}\r\n","
\r\n
journey at a glance
\r\n \r\n
\r\n\r\n
\r\n\r\n \r\n \r\n\r\n
\r\n","import { ChangeDetectionStrategy, Component } from '@angular/core';\r\nimport { Store } from '@ngrx/store';\r\n\r\nimport { ExpActions, ExperienceInsightsState, ExpInsights } from '../../store';\r\n\r\n@Component({\r\n selector: 'maas-journey-list',\r\n templateUrl: './journey-list.component.html',\r\n styleUrls: ['./journey-list.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush\r\n})\r\nexport class JourneyListComponent {\r\n journeys$ = this.store.select(ExpInsights.selectJourneySteps);\r\n\r\n constructor(private store: Store) {\r\n this.store.dispatch(ExpActions.LoadMaps());\r\n }\r\n\r\n // required to avoid default sort on the key name\r\n defaultSort() {\r\n return 0;\r\n };\r\n}\r\n","import { ChangeDetectionStrategy, Component, Input, OnInit } from '@angular/core';\r\n\r\n@Component({\r\n selector: 'maas-labeled-progress-bar',\r\n templateUrl: './labeled-progress-bar.component.html',\r\n styleUrls: ['./labeled-progress-bar.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush\r\n})\r\nexport class LabeledProgressBarComponent implements OnInit {\r\n @Input() value: number = 0;\r\n @Input() max: number = 0;\r\n @Input() label: string = '';\r\n percent = '0%';\r\n\r\n ngOnInit() {\r\n if (this.max !== 0) this.percent = `${(this.value / this.max * 100).toFixed(0)}%`;\r\n }\r\n}\r\n","\r\n\r\n
\r\n
\r\n
\r\n\r\n
\r\n {{ value }} completed\r\n
\r\n {{ max }}      {{ percent }}\r\n
\r\n
\r\n\r\n","
\r\n
journey phases
\r\n\r\n \r\n \r\n
\r\n","import { ChangeDetectionStrategy, Component } from '@angular/core';\r\nimport { Store } from '@ngrx/store';\r\n\r\nimport { ExperienceInsightsState, ExpInsights, ExpActions } from '../../store/';\r\n\r\n@Component({\r\n selector: 'maas-phase-list',\r\n templateUrl: './experience-insights-survey-progress-bars.component.html',\r\n styleUrls: ['./experience-insights-survey-progress-bars.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush\r\n})\r\nexport class ExperienceInsightsSurveyProgressBarsComponent {\r\n phases$ = this.store.select(ExpInsights.selectPhaseStats);\r\n constructor(private store: Store) {\r\n store.dispatch(ExpActions.LoadPhaseMaps());\r\n }\r\n}\r\n","
\r\n

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
aim score
\r\n
\r\n \r\n
\r\n
\r\n\r\n
\r\n
\r\n
scoreboard
\r\n
\r\n \r\n
\r\n
\r\n
\r\n
\r\n\r\n \r\n
\r\n
\r\n\r\n
\r\n \r\n
\r\n\r\n
\r\n
\r\n
suppliers   performance
\r\n\r\n
\r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n
\r\n\r\n
\r\n \r\n
\r\n
\r\n
\r\n
\r\n\r\n","import { Component, OnInit } from '@angular/core';\r\nimport { Store } from '@ngrx/store';\r\n\r\nimport { RootState } from '@core';\r\nimport { ICurrentFilter } from 'src/app/dashboard';\r\n\r\nimport { ExpInsights, ExpActions } from '../../store';\r\nimport { COLORS } from 'src/app/charts/services/color-constants';\r\n\r\n@Component({\r\n selector: 'maas-experience-insights-page',\r\n templateUrl: './experience-insights-page.component.html',\r\n styleUrls: ['./experience-insights-page.component.scss'],\r\n})\r\nexport class ExperienceInsightsPageComponent implements OnInit {\r\n highestScore$ = this.store.select(ExpInsights.selectOverviewHighestSupplierScore);\r\n lowestScore$ = this.store.select(ExpInsights.selectOverviewLowestSupplierScore);\r\n highestSupplier$ = this.store.select(ExpInsights.selectOverviewHighestSupplierName);\r\n lowestSupplier$ = this.store.select(ExpInsights.selectOverviewLowestSupplierName);\r\n suppliersCount$ = this.store.select(ExpInsights.selectSupplierCount);\r\n goalScore$ = this.store.select(ExpInsights.selectOverviewGoalScore);\r\n currentScore$ = this.store.select(ExpInsights.selectOverviewCurrentScore);\r\n loading$ = this.store.select(ExpInsights.selectLoadingOverview);\r\n\r\n filterOptions$ = this.store.select(ExpInsights.selectExperienceFilterOptions);\r\n filter$ = this.store.select(ExpInsights.selectCurrentExperienceFilter);\r\n\r\n colors = COLORS;\r\n\r\n constructor(private store: Store) {}\r\n\r\n ngOnInit() {\r\n this.store.dispatch(ExpActions.LoadOverview());\r\n }\r\n\r\n onFilterChange(filter: ICurrentFilter) {\r\n this.store.dispatch(ExpActions.SetFilter({ filter }));\r\n }\r\n}\r\n","import { ChangeDetectionStrategy, Component, ViewEncapsulation } from '@angular/core';\r\n\r\n@Component({\r\n selector: 'maas-back-arrow',\r\n template: `\r\n \"go\r\n `,\r\n styles:\r\n [\r\n `\r\n .go-back {\r\n background-color:var(--teal);\r\n font-size: 2.15rem;\r\n padding: 0;\r\n min-width: 0;\r\n width: 40px;\r\n height: 40px;\r\n flex-shrink: 0;\r\n line-height: 40px;\r\n border-radius: 50%;\r\n user-select: none;\r\n cursor: pointer;\r\n outline: none;\r\n display: inline-block;\r\n white-space: nowrap;\r\n text-decoration: none;\r\n vertical-align: baseline;\r\n text-align: center;\r\n margin: 0;\r\n }\r\n `],\r\n encapsulation: ViewEncapsulation.None,\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class BackArrowComponent {}\r\n","import { ReplaySubject } from '../ReplaySubject';\nimport { share } from './share';\nexport function shareReplay(configOrBufferSize, windowTime, scheduler) {\n let bufferSize;\n let refCount = false;\n if (configOrBufferSize && typeof configOrBufferSize === 'object') {\n ({ bufferSize = Infinity, windowTime = Infinity, refCount = false, scheduler } = configOrBufferSize);\n }\n else {\n bufferSize = configOrBufferSize !== null && configOrBufferSize !== void 0 ? configOrBufferSize : Infinity;\n }\n return share({\n connector: () => new ReplaySubject(bufferSize, windowTime, scheduler),\n resetOnError: true,\n resetOnComplete: false,\n resetOnRefCountZero: refCount,\n });\n}\n","import { createSelector } from '@ngrx/store';\r\nimport { selectExperienceInsightsDetail } from './experience-insights.selectors';\r\n\r\nexport const selectExperienceInsightsDetailSuppliersScores = createSelector(\r\n selectExperienceInsightsDetail,\r\n (detail) => {\r\n const suppliersScoresMap: { [supplierName: string]: number[] } = {};\r\n detail.experienceDetailCards.forEach(card => {\r\n card.serviceScores.forEach((score) => {\r\n const supplier = score.supplier || score.service;\r\n\r\n if (!suppliersScoresMap[supplier]) {\r\n suppliersScoresMap[supplier] = [];\r\n }\r\n\r\n suppliersScoresMap[supplier].push(score.score);\r\n });\r\n });\r\n\r\n const suppliers: { supplier: string, score: number }[] = [];\r\n\r\n Object.keys(suppliersScoresMap).forEach(k => {\r\n const sum = suppliersScoresMap[k].reduce((a, b) => a + b);\r\n const count = suppliersScoresMap[k].length;\r\n\r\n suppliers.push({\r\n supplier: k,\r\n score: sum / count\r\n })\r\n });\r\n\r\n return suppliers.filter(x => x.score > 0).sort((a, b) => b.score - a.score);\r\n }\r\n);\r\n\r\nexport const selectExperienceInsightsDetailHighestSupplier = createSelector(\r\n selectExperienceInsightsDetailSuppliersScores,\r\n (suppliers) => suppliers[0]\r\n);\r\n\r\nexport const selectExperienceInsightsDetailLowestSupplier = createSelector(\r\n selectExperienceInsightsDetailSuppliersScores,\r\n (suppliers) => suppliers[suppliers.length - 1]\r\n);\r\n","import { Injectable } from '@angular/core';\r\nimport { ExperienceInsightsState } from '../store';\r\nimport { Store } from '@ngrx/store';\r\nimport { Observable } from 'rxjs';\r\nimport { selectExperienceInsightsQuestions } from '../store/selectors';\r\nimport { IScoredQuestionSummary } from '../models/scored-question-summary.model';\r\nimport { filter, map, shareReplay } from 'rxjs/operators';\r\n\r\n@Injectable()\r\nexport class HighLowQuestionsService {\r\n constructor(private store: Store) {}\r\n\r\n high(i: number): Observable {\r\n return this.store.select(selectExperienceInsightsQuestions).pipe(\r\n filter((questions) => questions && questions.length > 0),\r\n map((questions) => {\r\n const endIndex = Math.round(questions.length / 2);\r\n const validQuestions = questions.slice(0, endIndex);\r\n\r\n return validQuestions[i];\r\n }),\r\n shareReplay({ refCount: true, bufferSize: 1 })\r\n );\r\n }\r\n\r\n low(i: number): Observable {\r\n return this.store.select(selectExperienceInsightsQuestions).pipe(\r\n filter((questions) => questions && questions.length > 0),\r\n map((questions) => {\r\n const startIndex = Math.round(questions.length / 2);\r\n const validQuestions = questions.slice(startIndex);\r\n\r\n return validQuestions[validQuestions.length - 1 - i];\r\n }),\r\n shareReplay({ refCount: true, bufferSize: 1 })\r\n );\r\n }\r\n}\r\n","
\r\n
\r\n
\r\n

\r\n {{ title }}\r\n

\r\n \r\n {{ text }}\r\n \r\n
\r\n\r\n
\r\n

score

\r\n \r\n {{ score }}\r\n \r\n
\r\n
\r\n
","import { Component, ChangeDetectionStrategy, Input } from '@angular/core';\r\nimport { ChartColorService } from 'src/app/charts/services/chart-color.service';\r\nimport { COLORS } from 'src/app/charts/services/color-constants';\r\n\r\n@Component({\r\n selector: 'maas-scoring-question-presentation',\r\n templateUrl: './scoring-question-presentation.component.html',\r\n styleUrls: ['./scoring-question-presentation.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush\r\n})\r\nexport class ScoringQuestionPresentationComponent {\r\n @Input() title: string = '';\r\n @Input()\r\n set question(value: { question: string, score: number }) {\r\n if (!value) {\r\n this.title = 'No question data available';\r\n this.text = '';\r\n this.scoreColor = COLORS.EMPTY;\r\n } else {\r\n this.score = Math.round(value.score * 100);\r\n this.text = value.question ?? 'No question data available';\r\n this.scoreColor = this.colorService.colorByScore(this.score) ?? '';\r\n }\r\n }\r\n score: number = 0;\r\n text = 'loading...';\r\n\r\n scoreColor: string = COLORS.EMPTY;\r\n\r\n constructor(private colorService: ChartColorService) { }\r\n}\r\n","
\r\n
\r\n

\r\n experience excerpts\r\n

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

\r\n
\r\n {{ item.answer }}\r\n

\r\n
\r\n
\r\n
\r\n
","import { Component, Input } from '@angular/core';\r\nimport { IExcerptDetails } from '../../../models/excerpt.model';\r\n\r\n@Component({\r\n selector: 'maas-excerpts-container',\r\n templateUrl: './excerpts-container.component.html',\r\n styleUrls: ['./excerpts-container.component.scss'],\r\n})\r\nexport class ExcerptsContainerComponent {\r\n @Input() count = 5;\r\n @Input() skip = 0;\r\n @Input() set excerpts(value: IExcerptDetails[]) {\r\n this._excerpts = value.slice(this.skip, this.count + this.skip)\r\n };\r\n\r\n get excerpts() {\r\n return this._excerpts\r\n }\r\n\r\n private _excerpts: IExcerptDetails[] = [];\r\n}\r\n","\r\n\r\n \r\n
\r\n \r\n
\r\n \r\n \r\n\r\n \r\n \r\n
\r\n\r\n \r\n
\r\n \r\n \r\n
\r\n\r\n \r\n
\r\n

suppliers performance

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

suppliers performance

\r\n\r\n
\r\n \r\n \r\n\r\n
\r\n \r\n \r\n
\r\n
\r\n
\r\n
\r\n\r\n
\r\n\r\n
\r\n\r\n\r\n","import { Component, OnInit } from '@angular/core';\r\nimport { ExperienceInsightsState } from '../../store';\r\nimport { Store, select } from '@ngrx/store';\r\nimport { Observable, combineLatest } from 'rxjs';\r\nimport { filter, map, shareReplay } from 'rxjs/operators';\r\nimport {\r\n selectExperienceInsightsDetailHighestSupplier,\r\n selectExperienceInsightsDetailLowestSupplier,\r\n selectExperienceInsightsDetailSuppliersScores,\r\n} from '../../store/selectors/detail-suppliers-scores.selector';\r\nimport { selectHighLowLights } from '../../store/selectors';\r\nimport { HighLowQuestionsService } from '../../services/high-low-questions.service';\r\nimport { Unsubscriber } from '../../../../@core';\r\n\r\n@Unsubscriber()\r\n@Component({\r\n selector: 'maas-xp-details-lower-panel',\r\n templateUrl: './experience-details-lower-panel-container.component.html',\r\n styleUrls: ['./experience-details-lower-panel-container.component.scss'],\r\n})\r\nexport class ExperienceDetailsLowerPanelContainerComponent implements OnInit {\r\n highLowLights$ = this.store.pipe(\r\n select(selectHighLowLights),\r\n shareReplay({ refCount: true, bufferSize: 1 })\r\n );\r\n\r\n highestSupplier$: Observable<{ supplier: string; score: number }> = this.store.pipe(\r\n select(selectExperienceInsightsDetailHighestSupplier),\r\n filter((s) => !!s),\r\n shareReplay({ refCount: true, bufferSize: 1 })\r\n );\r\n\r\n lowestSupplier$: Observable<{ supplier: string; score: number }> = this.store.pipe(\r\n select(selectExperienceInsightsDetailLowestSupplier),\r\n filter((s) => !!s),\r\n shareReplay({ refCount: true, bufferSize: 1 })\r\n );\r\n\r\n layout$: Observable | undefined;\r\n\r\n constructor(\r\n private store: Store,\r\n public highLowQuestionsService: HighLowQuestionsService\r\n ) {}\r\n\r\n ngOnInit(): void {\r\n\r\n this.layout$ = combineLatest([\r\n this.store.select(selectExperienceInsightsDetailSuppliersScores),\r\n this.highLowLights$]\r\n ).pipe(\r\n map(([suppliers, excerpts]) => {\r\n\r\n const hasSuppliers = suppliers.length > 0;\r\n const hasHighLowLights = excerpts.length > 0;\r\n\r\n if (hasHighLowLights && hasSuppliers) return 1;\r\n if (hasHighLowLights && !hasSuppliers) return 2;\r\n if (!hasHighLowLights && !hasSuppliers) return 3;\r\n if (!hasHighLowLights && hasSuppliers) return 4\r\n return 0;\r\n })\r\n );\r\n }\r\n}\r\n","
\r\n

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
{{ journeyPhase }}
\r\n
{{ journeyStep }}
\r\n
\r\n
\r\n
\r\n \r\n
\r\n
\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 { Routes, RouterModule } from '@angular/router';\r\nimport { ExperienceInsightsPageComponent } from '../experience-insights/components/experience-insights-page/experience-insights-page.component';\r\nimport { ExperienceDetailDashboardComponent } from './components/experience-detail-dashboard/experience-detail-dashboard.component';\r\n\r\nconst routes: Routes = [\r\n { path: '', component: ExperienceInsightsPageComponent, title: 'Experience insights overview' },\r\n { path: ':phase/:step', component: ExperienceDetailDashboardComponent, title: 'Experience insights step details' }\r\n];\r\n\r\n@NgModule({\r\n imports: [RouterModule.forChild(routes)],\r\n exports: [RouterModule],\r\n})\r\nexport class ExperienceInsightsRoutingModule {}\r\n","import { Component, OnInit } from '@angular/core';\r\nimport { Store } from '@ngrx/store';\r\nimport { ActivatedRoute } from '@angular/router';\r\nimport { ExpInsights, ExpActions, ExperienceInsightsState } from '../../store';\r\nimport { ICurrentFilter } from 'src/app/dashboard';\r\n\r\n@Component({\r\n selector: 'maas-exp-detail-container',\r\n templateUrl: './experience-detail-dashboard.component.html',\r\n styleUrls: ['./experience-detail-dashboard.component.scss'],\r\n})\r\nexport class ExperienceDetailDashboardComponent implements OnInit {\r\n currentScore$ = this.store.select(ExpInsights.selectDetailsCurrentScore);\r\n goalScore$ = this.store.select(ExpInsights.selectDetailsGoalScore);\r\n journeyStep: string = '';\r\n journeyPhase: string = '';\r\n filterOptions$ = this.store.select(ExpInsights.selectExperienceFilterOptions);\r\n filter$ = this.store.select(ExpInsights.selectCurrentExperienceFilter);\r\n loading$ = this.store.select(ExpInsights.selectLoadingDetails);\r\n\r\n constructor(private route: ActivatedRoute, private store: Store) {}\r\n\r\n ngOnInit(): void {\r\n this.journeyStep = this.route.snapshot.paramMap.get('step') ?? '';\r\n this.journeyPhase = this.route.snapshot.paramMap.get('phase') ?? '';\r\n this.store.dispatch(\r\n ExpActions.LoadDetails({\r\n journeyPhase: this.journeyPhase,\r\n journeyStep: this.journeyStep,\r\n })\r\n );\r\n }\r\n\r\n onFilterChange(filter: ICurrentFilter) {\r\n this.store.dispatch(ExpActions.SetFilter({ filter }));\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { HttpClient } from '@angular/common/http';\r\n\r\nimport { IMovePhaseMap, IXpOverview } from '../models';\r\nimport { IXpDetails } from '../models';\r\nimport { IMoveMapRecord } from '../models';\r\n\r\n@Injectable()\r\nexport class ExperienceInsightsService {\r\n constructor(private http: HttpClient) {}\r\n\r\n getInsightsOverview() {\r\n return this.http.get(`insights/experience`);\r\n }\r\n\r\n getInsightsDetail(journeyPhase: string, journeyStep: string) {\r\n return this.http.get(\r\n `insights/experience/${journeyPhase}/${journeyStep}`\r\n );\r\n }\r\n\r\n getJourneyMap() {\r\n return this.http.get('insights/journey-map');\r\n }\r\n\r\n getPhaseMap() {\r\n return this.http.get('insights/phases-map');\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { Actions, createEffect, ofType } from '@ngrx/effects';\r\nimport { Store } from '@ngrx/store';\r\nimport { of } from 'rxjs';\r\nimport { map, switchMap, withLatestFrom } from 'rxjs/operators';\r\n\r\nimport { ExperienceInsightsService } from '../services/experience-insights.service';\r\nimport * as ExperienceInsightsActions from './actions/load-experience-insights-overview.actions';\r\nimport { ExperienceInsightsState } from './experience-insights.reducer';\r\nimport { selectMaps, selectMovePhases } from './selectors/experience-insights.selectors';\r\n\r\n@Injectable()\r\nexport class ExperienceInsightsEffects {\r\n loadInsightsOverview$ = createEffect(() =>\r\n this.actions$.pipe(\r\n ofType(ExperienceInsightsActions.LoadOverview),\r\n switchMap(() =>\r\n this.insights.getInsightsOverview().pipe(\r\n map((data) => ExperienceInsightsActions.LoadOverviewSuccess(data))\r\n )\r\n )\r\n )\r\n );\r\n\r\n loadInsightsDetails$ = createEffect(() =>\r\n this.actions$.pipe(\r\n ofType(ExperienceInsightsActions.LoadDetails),\r\n switchMap(({ journeyPhase, journeyStep }) =>\r\n this.insights.getInsightsDetail(journeyPhase, journeyStep).pipe(\r\n map((data) => ExperienceInsightsActions.LoadDetailsSuccess(data))\r\n )\r\n )\r\n )\r\n );\r\n\r\n loadMaps$ = createEffect(() =>\r\n this.actions$.pipe(\r\n ofType(ExperienceInsightsActions.LoadMaps),\r\n withLatestFrom(this.store.select(selectMaps)),\r\n switchMap(([_, maps]) => maps.length > 0\r\n ? of(ExperienceInsightsActions.LoadMapsSkipped())\r\n : this.insights.getJourneyMap().pipe(\r\n map(maps => ExperienceInsightsActions.LoadMapsSuccess({ maps }))))\r\n )\r\n );\r\n\r\n\r\n loadPhaseMaps$ = createEffect(() =>\r\n this.actions$.pipe(\r\n ofType(ExperienceInsightsActions.LoadPhaseMaps),\r\n withLatestFrom(this.store.select(selectMovePhases)),\r\n switchMap(([_, maps]) => maps.length > 0\r\n ? of(ExperienceInsightsActions.LoadPhaseMapsSkipped())\r\n : this.insights.getPhaseMap().pipe(\r\n map(maps => ExperienceInsightsActions.LoadPhaseMapsSuccess({ maps }))))\r\n )\r\n );\r\n\r\n constructor(\r\n private actions$: Actions,\r\n private store: Store,\r\n private insights: ExperienceInsightsService)\r\n {}\r\n}\r\n","import { NgModule } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { StoreModule } from '@ngrx/store';\r\nimport { EffectsModule } from '@ngrx/effects';\r\n\r\nimport { SharedModule } from '@shared';\r\n\r\nimport { ExperienceInsightsRoutingModule } from './experience-insights-routing.module';\r\nimport { storeFeatureKey, expStateReducer } from './store/experience-insights.reducer';\r\nimport { ExperienceInsightsEffects } from './store/experience-insights.effects';\r\nimport { ChartsModule } from 'src/app/charts/charts.module';\r\nimport { JourneyListComponent, JourneyComponent, JourneyStepComponent } from './components';\r\nimport { ExperienceInsightsPageComponent } from './components/experience-insights-page/experience-insights-page.component';\r\nimport { TrendLineComponent } from './components/trend-line/trend-line.component';\r\nimport { SurveyScorecardContainerComponent } from 'src/app/pages/experience-insights/components/survey-scoreboard/survey-scorecard-container/survey-scorecard-container.component';\r\nimport { ExperienceDetailDashboardComponent } from './components/experience-detail-dashboard/experience-detail-dashboard.component';\r\nimport { ExperienceInsightsSurveyProgressBarsComponent } from './components/experience-insights-survey-progress-bars/experience-insights-survey-progress-bars.component';\r\nimport { ScoringQuestionPresentationComponent } from './components/scoring-question-presentation/scoring-question-presentation.component';\r\nimport { ExcerptsPresentationComponent } from './components/excerpts/excerpts-presentation/excerpts-presentation.component';\r\nimport { ExcerptsContainerComponent } from './components/excerpts/excerpts-container/excerpts-container.component';\r\nimport { BackArrowComponent } from './components/back-arrow/back-arrow.component';\r\nimport { LabeledProgressBarComponent } from './components/labeled-progress-bar/labeled-progress-bar.component';\r\nimport { ExperienceDetailsLowerPanelContainerComponent } from './components/experience-details-lower-panel-container/experience-details-lower-panel-container.component';\r\nimport { HighLowQuestionsService } from './services/high-low-questions.service';\r\nimport { ChartColorPipe } from './services/chart-color.pipe';\r\nimport { ExperienceInsightsService } from './services/experience-insights.service';\r\nimport { FormatScorePipe } from './format-score.pipe';\r\nimport { DashboardModule } from '../../dashboard/dashboard.module';\r\nimport { MatBadgeModule } from '@angular/material/badge';\r\n\r\n@NgModule({\r\n declarations: [\r\n ExperienceInsightsPageComponent,\r\n TrendLineComponent,\r\n SurveyScorecardContainerComponent,\r\n JourneyListComponent,\r\n JourneyComponent,\r\n JourneyStepComponent,\r\n ExperienceDetailDashboardComponent,\r\n ExperienceInsightsSurveyProgressBarsComponent,\r\n ScoringQuestionPresentationComponent,\r\n ExcerptsPresentationComponent,\r\n ExcerptsContainerComponent,\r\n BackArrowComponent,\r\n LabeledProgressBarComponent,\r\n ExperienceDetailsLowerPanelContainerComponent,\r\n ChartColorPipe,\r\n FormatScorePipe\r\n ],\r\n imports: [\r\n CommonModule,\r\n ChartsModule,\r\n SharedModule,\r\n DashboardModule,\r\n MatBadgeModule,\r\n ExperienceInsightsRoutingModule,\r\n StoreModule.forFeature(storeFeatureKey, expStateReducer),\r\n EffectsModule.forFeature([ExperienceInsightsEffects]),\r\n ],\r\n providers: [HighLowQuestionsService, ExperienceInsightsService],\r\n})\r\nexport class ExperienceInsightsModule {}\r\n","import * as i0 from '@angular/core';\nimport { Directive, Optional, Inject, Input, NgModule } from '@angular/core';\nimport { mixinDisabled, MatCommonModule } from '@angular/material/core';\nimport * as i1 from '@angular/cdk/a11y';\nimport { A11yModule } from '@angular/cdk/a11y';\nimport { coerceBooleanProperty } from '@angular/cdk/coercion';\nimport { ANIMATION_MODULE_TYPE } from '@angular/platform-browser/animations';\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\nlet nextId = 0;\n// Boilerplate for applying mixins to MatBadge.\n/** @docs-private */\nconst _MatBadgeBase = mixinDisabled(class {\n});\nconst BADGE_CONTENT_CLASS = 'mat-badge-content';\n/** Directive to display a text badge. */\nclass MatBadge extends _MatBadgeBase {\n /** The color of the badge. Can be `primary`, `accent`, or `warn`. */\n get color() {\n return this._color;\n }\n set color(value) {\n this._setColor(value);\n this._color = value;\n }\n /** Whether the badge should overlap its contents or not */\n get overlap() {\n return this._overlap;\n }\n set overlap(val) {\n this._overlap = coerceBooleanProperty(val);\n }\n /** The content for the badge */\n get content() {\n return this._content;\n }\n set content(newContent) {\n this._updateRenderedContent(newContent);\n }\n /** Message used to describe the decorated element via aria-describedby */\n get description() {\n return this._description;\n }\n set description(newDescription) {\n this._updateHostAriaDescription(newDescription);\n }\n /** Whether the badge is hidden. */\n get hidden() {\n return this._hidden;\n }\n set hidden(val) {\n this._hidden = coerceBooleanProperty(val);\n }\n constructor(_ngZone, _elementRef, _ariaDescriber, _renderer, _animationMode) {\n super();\n this._ngZone = _ngZone;\n this._elementRef = _elementRef;\n this._ariaDescriber = _ariaDescriber;\n this._renderer = _renderer;\n this._animationMode = _animationMode;\n this._color = 'primary';\n this._overlap = true;\n /**\n * Position the badge should reside.\n * Accepts any combination of 'above'|'below' and 'before'|'after'\n */\n this.position = 'above after';\n /** Size of the badge. Can be 'small', 'medium', or 'large'. */\n this.size = 'medium';\n /** Unique id for the badge */\n this._id = nextId++;\n /** Whether the OnInit lifecycle hook has run yet */\n this._isInitialized = false;\n if (typeof ngDevMode === 'undefined' || ngDevMode) {\n const nativeElement = _elementRef.nativeElement;\n if (nativeElement.nodeType !== nativeElement.ELEMENT_NODE) {\n throw Error('matBadge must be attached to an element node.');\n }\n }\n }\n /** Whether the badge is above the host or not */\n isAbove() {\n return this.position.indexOf('below') === -1;\n }\n /** Whether the badge is after the host or not */\n isAfter() {\n return this.position.indexOf('before') === -1;\n }\n /**\n * Gets the element into which the badge's content is being rendered. Undefined if the element\n * hasn't been created (e.g. if the badge doesn't have content).\n */\n getBadgeElement() {\n return this._badgeElement;\n }\n ngOnInit() {\n // We may have server-side rendered badge that we need to clear.\n // We need to do this in ngOnInit because the full content of the component\n // on which the badge is attached won't necessarily be in the DOM until this point.\n this._clearExistingBadges();\n if (this.content && !this._badgeElement) {\n this._badgeElement = this._createBadgeElement();\n this._updateRenderedContent(this.content);\n }\n this._isInitialized = true;\n }\n ngOnDestroy() {\n // ViewEngine only: when creating a badge through the Renderer, Angular remembers its index.\n // We have to destroy it ourselves, otherwise it'll be retained in memory.\n if (this._renderer.destroyNode) {\n this._renderer.destroyNode(this._badgeElement);\n }\n this._ariaDescriber.removeDescription(this._elementRef.nativeElement, this.description);\n }\n /** Creates the badge element */\n _createBadgeElement() {\n const badgeElement = this._renderer.createElement('span');\n const activeClass = 'mat-badge-active';\n badgeElement.setAttribute('id', `mat-badge-content-${this._id}`);\n // The badge is aria-hidden because we don't want it to appear in the page's navigation\n // flow. Instead, we use the badge to describe the decorated element with aria-describedby.\n badgeElement.setAttribute('aria-hidden', 'true');\n badgeElement.classList.add(BADGE_CONTENT_CLASS);\n if (this._animationMode === 'NoopAnimations') {\n badgeElement.classList.add('_mat-animation-noopable');\n }\n this._elementRef.nativeElement.appendChild(badgeElement);\n // animate in after insertion\n if (typeof requestAnimationFrame === 'function' && this._animationMode !== 'NoopAnimations') {\n this._ngZone.runOutsideAngular(() => {\n requestAnimationFrame(() => {\n badgeElement.classList.add(activeClass);\n });\n });\n }\n else {\n badgeElement.classList.add(activeClass);\n }\n return badgeElement;\n }\n /** Update the text content of the badge element in the DOM, creating the element if necessary. */\n _updateRenderedContent(newContent) {\n const newContentNormalized = `${newContent ?? ''}`.trim();\n // Don't create the badge element if the directive isn't initialized because we want to\n // append the badge element to the *end* of the host element's content for backwards\n // compatibility.\n if (this._isInitialized && newContentNormalized && !this._badgeElement) {\n this._badgeElement = this._createBadgeElement();\n }\n if (this._badgeElement) {\n this._badgeElement.textContent = newContentNormalized;\n }\n this._content = newContentNormalized;\n }\n /** Updates the host element's aria description via AriaDescriber. */\n _updateHostAriaDescription(newDescription) {\n this._ariaDescriber.removeDescription(this._elementRef.nativeElement, this.description);\n if (newDescription) {\n this._ariaDescriber.describe(this._elementRef.nativeElement, newDescription);\n }\n this._description = newDescription;\n }\n /** Adds css theme class given the color to the component host */\n _setColor(colorPalette) {\n const classList = this._elementRef.nativeElement.classList;\n classList.remove(`mat-badge-${this._color}`);\n if (colorPalette) {\n classList.add(`mat-badge-${colorPalette}`);\n }\n }\n /** Clears any existing badges that might be left over from server-side rendering. */\n _clearExistingBadges() {\n // Only check direct children of this host element in order to avoid deleting\n // any badges that might exist in descendant elements.\n const badges = this._elementRef.nativeElement.querySelectorAll(`:scope > .${BADGE_CONTENT_CLASS}`);\n for (const badgeElement of Array.from(badges)) {\n if (badgeElement !== this._badgeElement) {\n badgeElement.remove();\n }\n }\n }\n}\nMatBadge.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"15.2.0-rc.0\", ngImport: i0, type: MatBadge, deps: [{ token: i0.NgZone }, { token: i0.ElementRef }, { token: i1.AriaDescriber }, { token: i0.Renderer2 }, { token: ANIMATION_MODULE_TYPE, optional: true }], target: i0.ɵɵFactoryTarget.Directive });\nMatBadge.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: \"14.0.0\", version: \"15.2.0-rc.0\", type: MatBadge, selector: \"[matBadge]\", inputs: { disabled: [\"matBadgeDisabled\", \"disabled\"], color: [\"matBadgeColor\", \"color\"], overlap: [\"matBadgeOverlap\", \"overlap\"], position: [\"matBadgePosition\", \"position\"], content: [\"matBadge\", \"content\"], description: [\"matBadgeDescription\", \"description\"], size: [\"matBadgeSize\", \"size\"], hidden: [\"matBadgeHidden\", \"hidden\"] }, host: { properties: { \"class.mat-badge-overlap\": \"overlap\", \"class.mat-badge-above\": \"isAbove()\", \"class.mat-badge-below\": \"!isAbove()\", \"class.mat-badge-before\": \"!isAfter()\", \"class.mat-badge-after\": \"isAfter()\", \"class.mat-badge-small\": \"size === \\\"small\\\"\", \"class.mat-badge-medium\": \"size === \\\"medium\\\"\", \"class.mat-badge-large\": \"size === \\\"large\\\"\", \"class.mat-badge-hidden\": \"hidden || !content\", \"class.mat-badge-disabled\": \"disabled\" }, classAttribute: \"mat-badge\" }, usesInheritance: true, ngImport: i0 });\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"15.2.0-rc.0\", ngImport: i0, type: MatBadge, decorators: [{\n type: Directive,\n args: [{\n selector: '[matBadge]',\n inputs: ['disabled: matBadgeDisabled'],\n host: {\n 'class': 'mat-badge',\n '[class.mat-badge-overlap]': 'overlap',\n '[class.mat-badge-above]': 'isAbove()',\n '[class.mat-badge-below]': '!isAbove()',\n '[class.mat-badge-before]': '!isAfter()',\n '[class.mat-badge-after]': 'isAfter()',\n '[class.mat-badge-small]': 'size === \"small\"',\n '[class.mat-badge-medium]': 'size === \"medium\"',\n '[class.mat-badge-large]': 'size === \"large\"',\n '[class.mat-badge-hidden]': 'hidden || !content',\n '[class.mat-badge-disabled]': 'disabled',\n },\n }]\n }], ctorParameters: function () { return [{ type: i0.NgZone }, { type: i0.ElementRef }, { type: i1.AriaDescriber }, { type: i0.Renderer2 }, { type: undefined, decorators: [{\n type: Optional\n }, {\n type: Inject,\n args: [ANIMATION_MODULE_TYPE]\n }] }]; }, propDecorators: { color: [{\n type: Input,\n args: ['matBadgeColor']\n }], overlap: [{\n type: Input,\n args: ['matBadgeOverlap']\n }], position: [{\n type: Input,\n args: ['matBadgePosition']\n }], content: [{\n type: Input,\n args: ['matBadge']\n }], description: [{\n type: Input,\n args: ['matBadgeDescription']\n }], size: [{\n type: Input,\n args: ['matBadgeSize']\n }], hidden: [{\n type: Input,\n args: ['matBadgeHidden']\n }] } });\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\nclass MatBadgeModule {\n}\nMatBadgeModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"15.2.0-rc.0\", ngImport: i0, type: MatBadgeModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });\nMatBadgeModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: \"14.0.0\", version: \"15.2.0-rc.0\", ngImport: i0, type: MatBadgeModule, declarations: [MatBadge], imports: [A11yModule, MatCommonModule], exports: [MatBadge, MatCommonModule] });\nMatBadgeModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: \"12.0.0\", version: \"15.2.0-rc.0\", ngImport: i0, type: MatBadgeModule, imports: [A11yModule, MatCommonModule, MatCommonModule] });\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"15.2.0-rc.0\", ngImport: i0, type: MatBadgeModule, decorators: [{\n type: NgModule,\n args: [{\n imports: [A11yModule, MatCommonModule],\n exports: [MatBadge, MatCommonModule],\n declarations: [MatBadge],\n }]\n }] });\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\n/**\n * Generated bundle index. Do not edit.\n */\n\nexport { MatBadge, MatBadgeModule };\n"],"x_google_ignoreList":[34,49]}