{"version":3,"file":"49.448754fc58622e32.js","mappings":"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","names":["LoadSupplierInsightsDetail","createAction","props","LoadSupplierInsightsDetailSuccess","LoadSupplierInsightsDetailFailure","LoadSupplierInsightsOverview","LoadSupplierInsightsOverviewSuccess","LoadSupplierInsightsOverviewFailure","SetFilter","supplierInsightsFeatureKey","initialDetailState","supplierName","supplierDetailCards","goalScore","serviceStats","reducer","createReducer","overview","supplierOverviewCards","detail","filter","period","TimeValueOptions","homes","hosts","units","levels","moves","initialState","on","SupActions","state","data","handleOverviewDates","filterOptions","getFilterOptionsFromOverview","error","handleDetailDates","getFilterOptionsFromDetail","sorted","value","Set","sort","a","b","localeCompare","map","c","homeCountryName","hostCountryName","workerBusinessUnit","workerJobLevel","moveType","v","inviteDate","Date","selectSupplierInsightsState","createFeatureSelector","selectSupplierInsightsTimePeriod","createSelector","selectSupplierInsightsOverview","periodStartDate","getPeriodStartDate","filterOverviewCard","card","length","indexOf","selectSupplierInsightsDetail","filterDetailCard","selectPeriodStartDate","selectFilterOptions","selectCurrentFilter","now","setMonth","getMonth","getFullYear","selectSupplierDetailCards","selectSupplierServiceTypes","serviceType","selectSupplierServiceStats","selectSupplierName","supplier","selectSupplierInsightsDetailsGoalScore","selectSupplierInsightsDetailSupplierName","types","selectSupplierInsightsDetailsCurrentScore","sum","reduce","score","Math","round","selectSupplierInsightsOverviewGoalScore","selectSupplierInsightsOverviewCurrentScore","suppliers","concat","supplierScores","selectSupplierOverviewList","fromDate","fromDateMonthEnd","Array","scores","flatMap","s","service","steps","journeySteps","asg","assignmentId","acc","x","services","initial","initialCount","scoreCount","push","Object","entries","serviceValues","values","trend","scoreReducer","count","serviceScores","currSupplier","toLowerCase","nextSupplier","selectPeriodLabels","numberOfMonths","getNumberOfMonthsInPeriod","labels","currentMonth","i","date","unshift","toLocaleString","month","selectSupplierTrendDataOverview","lookups","Map","forEach","l","set","TrendLookupHelper","key","get","addScore","returnValue","prev","curr","helper","currDatapoint","counter","label","toDatapoint","constructor","this","_key","toString","_counter","_score","selectSupplierTrendDataDetail","SupplierTrendLineComponent","store","route","maintainAspectRatio","plugins","legend","display","tooltip","mode","intersect","position","backgroundColor","tooltipBg","scales","y","suggestedMin","suggestedMax","ticks","stepSize","grid","drawBorder","callback","val","index","getLabelForValue","Number","substring","toLocaleLowerCase","color","ngOnInit","lineData$","select","pipe","combineLatestWith","of","d","datasets","type","order","fill","spanGaps","borderDash","borderDashOffset","borderWidth","showLine","tension","pointRadius","borderColor","barThickness","snapshot","paramMap","pointBackgroundColor","core","selectors","i0","TrendColorService","colorByScore","COLORS","factory","AbsValuePipe","transform","absValue","abs","pure","SupplierListComponent","_class","trendColor","MatTableDataSource","subscribe","dataSource","ngAfterContentInit","ngOnDestroy","MatSort","tslib_es6","Unsubscriber","SupplierInsightsPageComponent","SupInsights","dispatch","onFilterChange","ctx","MediumScoreDoughnutComponent","colorService","cutout","enabled","normalized","CategoryScoreListComponent","detailCards","categoryScores","getScore","categories","cats","cat","evaluationCategory","category","SurveyServiceExerptsComponent","ServiceDetailCardsComponent","filteredCards","cards","serviceLineStats","find","avg","cumulativeCount","cumulativeSum","e","respondedOn","valueOf","highLowLights","exerpt","answer","excerpts","currentScore","average","serviceStatsColor","getCategories","previousValue","currentValue","SupplierDetailsComponent","services$","SupplierInsightsDetailsComponent","supplier_insights_details_component_class","params","firstService","split","clientId","routes","path","component","title","ExperienceInsightsRoutingModule","RouterModule","SupplierInsightsService","http","getOverview","getDetail","supplierServices","SupplierInsightsEffects","actions$","insights","createEffect","ofType","switchMap","catchError","SupplierInsightsStoreModule","CommonModule","StoreModule","EffectsModule","SupplierInsightsModule","SharedModule","DashboardModule","ChartsModule","MatTableModule","MatSortModule","MatButtonModule"],"sourceRoot":"webpack:///","sources":["./src/app/pages/supplier-insights/store/actions/load-supplier-insights-detail.actions.ts","./src/app/pages/supplier-insights/store/actions/load-supplier-insights-overview.actions.ts","./src/app/pages/supplier-insights/store/actions/supplier-insights-filter.actions.ts","./src/app/pages/supplier-insights/store/reducers/supplier-insights.reducer.ts","./src/app/pages/supplier-insights/store/selectors/supplier-insights-root.selector.ts","./src/app/pages/supplier-insights/store/selectors/service-card-selectors.selector.ts","./src/app/pages/supplier-insights/store/selectors/supplier-insights-details-scores.selector.ts","./src/app/pages/supplier-insights/store/selectors/supplier-insights-detail-supplier-name.selector.ts","./src/app/pages/supplier-insights/store/selectors/supplier-insights-overview-scores.selector.ts","./src/app/pages/supplier-insights/store/selectors/supplier-insights-overview-datatable.selector.ts","./src/app/pages/supplier-insights/store/selectors/supplier-trendline.selector.ts","./src/app/pages/supplier-insights/store/selectors/supplier-detail-trendline.selector.ts","./src/app/pages/supplier-insights/components/supplier-trend-line/supplier-trend-line.component.ts","./src/app/pages/supplier-insights/components/supplier-trend-line/supplier-trend-line.component.html","./src/app/charts/services/trend-color.service.ts","./src/app/pages/supplier-insights/services/abs-value.pipe.ts","./src/app/pages/supplier-insights/components/supplier-list/supplier-list.component.html","./src/app/pages/supplier-insights/components/supplier-list/supplier-list.component.ts","./src/app/pages/supplier-insights/components/supplier-insights-page/supplier-insights-page.component.ts","./src/app/pages/supplier-insights/components/supplier-insights-page/supplier-insights-page.component.html","./src/app/charts/medium-score-doughnut/medium-score-doughnut.component.ts","./src/app/charts/medium-score-doughnut/medium-score-doughnut.component.html","./src/app/pages/supplier-insights/components/category-score-list/category-score-list.component.ts","./src/app/pages/supplier-insights/components/category-score-list/category-score-list.component.html","./src/app/pages/supplier-insights/components/survey-service-exerpts/survey-service-exerpts.component.html","./src/app/pages/supplier-insights/components/survey-service-exerpts/survey-service-exerpts.component.ts","./src/app/pages/supplier-insights/components/service-detail-cards/service-detail-cards.component.html","./src/app/pages/supplier-insights/components/service-detail-cards/service-detail-cards.component.ts","./src/app/pages/supplier-insights/components/supplier-details/supplier-details.component.html","./src/app/pages/supplier-insights/components/supplier-details/supplier-details.component.ts","./src/app/pages/supplier-insights/components/supplier-insights-details/supplier-insights-details.component.ts","./src/app/pages/supplier-insights/components/supplier-insights-details/supplier-insights-details.component.html","./src/app/pages/supplier-insights/supplier-insights-routing.module.ts","./src/app/pages/supplier-insights/services/supplier-insights.service.ts","./src/app/pages/supplier-insights/store/effects/supplier-insights.effects.ts","./src/app/pages/supplier-insights/store/supplier-insights-store.module.ts","./src/app/pages/supplier-insights/supplier-insights.module.ts"],"sourcesContent":["import { createAction, props } from '@ngrx/store';\r\nimport { ISupplierDetailDto } from '../../models/supplier-detail-dto.model';\r\n\r\nexport const LoadSupplierInsightsDetail = createAction(\r\n '[Supplier Insights Component] Load Supplier Insights Detail',\r\n props<{ clientId: string, supplier: string, services: string[] }>()\r\n);\r\n\r\nexport const LoadSupplierInsightsDetailSuccess = createAction(\r\n '[Supplier Insights Effects] Load Supplier Insights Detail Success',\r\n props()\r\n);\r\n\r\nexport const LoadSupplierInsightsDetailFailure = createAction(\r\n '[Supplier Insights Effects] Load Supplier Insights Detail Failure',\r\n props<{ error: any }>()\r\n);\r\n","import { createAction, props } from '@ngrx/store';\r\nimport { ISupplierOverviewDto } from '../../models/supplier-overview-dto.model';\r\n\r\nexport const LoadSupplierInsightsOverview = createAction(\r\n '[Supplier Insights Component] Load Supplier Insights Overview');\r\n\r\nexport const LoadSupplierInsightsOverviewSuccess = createAction(\r\n '[Supplier Insights Effects] Load Supplier Insights Overview Success',\r\n props()\r\n);\r\n\r\nexport const LoadSupplierInsightsOverviewFailure = createAction(\r\n '[Supplier Insights Effects] Load Supplier Insights Overview Failure',\r\n props<{ error: any }>()\r\n);\r\n","import { createAction, props } from '@ngrx/store';\r\nimport { ICurrentFilter } from 'src/app/dashboard';\r\n\r\nexport const SetFilter = createAction(\r\n '[Supplier Insights Page] Set Supplier Insights filter',\r\n props<{filter: ICurrentFilter}>()\r\n);\r\n","import { createReducer, on } from '@ngrx/store';\r\n\r\nimport { ISupplierDetailDto, ISupplierOverviewDto } from '../../models';\r\nimport { ICurrentFilter, IFilterValue, TimeValueOptions } from 'src/app/dashboard';\r\nimport * as SupActions from '../actions';\r\n\r\nexport const supplierInsightsFeatureKey = 'supplierInsights';\r\n\r\nexport interface SupplierInsightsState {\r\n overview: ISupplierOverviewDto;\r\n detail: ISupplierDetailDto;\r\n filter: ICurrentFilter,\r\n filterOptions?: IFilterValue,\r\n error?: any;\r\n};\r\n\r\nconst initialOverviewState: ISupplierOverviewDto = {\r\n goalScore: 85,\r\n supplierOverviewCards: [],\r\n};\r\n\r\nconst initialDetailState: ISupplierDetailDto = {\r\n supplierName: '',\r\n supplierDetailCards: [],\r\n goalScore: 85,\r\n serviceStats: []\r\n};\r\n\r\nconst initialState: SupplierInsightsState = {\r\n overview: initialOverviewState,\r\n detail: initialDetailState,\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 reducer = createReducer(\r\n initialState,\r\n\r\n on(SupActions.LoadSupplierInsightsOverviewSuccess, (state, data) => ({\r\n ...state,\r\n overview: handleOverviewDates(data),\r\n filterOptions: getFilterOptionsFromOverview(data)\r\n })),\r\n\r\n on(SupActions.LoadSupplierInsightsOverviewFailure, (state, { error }) => ({\r\n ...state,\r\n error,\r\n })),\r\n\r\n on(SupActions.LoadSupplierInsightsDetail, (state, data) => ({\r\n ...state,\r\n detail: initialDetailState\r\n })),\r\n\r\n on(SupActions.LoadSupplierInsightsDetailSuccess, (state, data) => ({\r\n ...state,\r\n detail: handleDetailDates(data),\r\n filterOptions: getFilterOptionsFromDetail(data)\r\n })),\r\n\r\n on(SupActions.LoadSupplierInsightsDetailFailure, (state, { error }) => ({\r\n ...state,\r\n error,\r\n })),\r\n\r\n on(SupActions.SetFilter, (state, { filter }) => ({\r\n ...state,\r\n filter\r\n }))\r\n\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\n\r\nfunction getFilterOptionsFromOverview(value: ISupplierOverviewDto): IFilterValue {\r\n const homes: string[] = sorted(value.supplierOverviewCards.map(c => c.homeCountryName));\r\n const hosts: string[] = sorted(value.supplierOverviewCards.map(c => c.hostCountryName));\r\n const units: string[] = sorted(value.supplierOverviewCards.map(c => c.workerBusinessUnit));\r\n const levels: string[] = sorted(value.supplierOverviewCards.map(c => c.workerJobLevel));\r\n const moves: string[] = sorted(value.supplierOverviewCards.map(c => c.moveType));\r\n\r\n return { homes, hosts, units, levels, moves };\r\n}\r\n\r\nfunction getFilterOptionsFromDetail(value: ISupplierDetailDto): IFilterValue {\r\n const homes: string[] = sorted(value.supplierDetailCards.map(c => c.homeCountryName));\r\n const hosts: string[] = sorted(value.supplierDetailCards.map(c => c.hostCountryName));\r\n const units: string[] = sorted(value.supplierDetailCards.map(c => c.workerBusinessUnit));\r\n const levels: string[] = sorted(value.supplierDetailCards.map(c => c.workerJobLevel));\r\n const moves: string[] = sorted(value.supplierDetailCards.map(c => c.moveType));\r\n\r\n return { homes, hosts, units, levels, moves };\r\n}\r\n\r\nfunction handleOverviewDates(value: ISupplierOverviewDto):ISupplierOverviewDto {\r\n if (!value) return value;\r\n\r\n const supplierOverviewCards = value.supplierOverviewCards.map(v => {\r\n const inviteDate = new Date(v.inviteDate);\r\n return { ...v, inviteDate };\r\n });\r\n\r\n return { ...value, supplierOverviewCards };\r\n}\r\n\r\nfunction handleDetailDates(value: ISupplierDetailDto):ISupplierDetailDto {\r\n if (!value) return value;\r\n\r\n const supplierDetailCards = value.supplierDetailCards.map(v => {\r\n const inviteDate = new Date(v.inviteDate);\r\n return { ...v, inviteDate };\r\n });\r\n return { ...value, supplierDetailCards };\r\n}\r\n","import { createFeatureSelector, createSelector } from '@ngrx/store';\r\nimport { ICurrentFilter, TimeValueOptions } from 'src/app/dashboard';\r\nimport { supplierInsightsFeatureKey, SupplierInsightsState } from '../reducers/supplier-insights.reducer';\r\nimport { ISupplierOverviewCard, ISupplierDetailCard, ISupplierOverviewDto, ISupplierDetailDto } from '../../models';\r\n\r\nconst selectSupplierInsightsState = createFeatureSelector(supplierInsightsFeatureKey);\r\n\r\nexport const selectSupplierInsightsTimePeriod = createSelector(selectSupplierInsightsState,\r\n (state) => state.filter.period)\r\n\r\nexport const selectSupplierInsightsOverview = createSelector(\r\n selectSupplierInsightsState,\r\n (state) => {\r\n const periodStartDate = getPeriodStartDate(state.filter.period);\r\n const supplierOverviewCards = state.overview.supplierOverviewCards.filter(v =>\r\n v.inviteDate >= periodStartDate && filterOverviewCard(v, state.filter)\r\n );\r\n return { ...state.overview, supplierOverviewCards } as ISupplierOverviewDto;\r\n }\r\n);\r\n\r\nexport const selectSupplierInsightsDetail = createSelector(\r\n selectSupplierInsightsState,\r\n (state) => {\r\n const periodStartDate = getPeriodStartDate(state.filter.period);\r\n const supplierDetailCards = state.detail.supplierDetailCards.filter(v =>\r\n v.inviteDate >= periodStartDate && filterDetailCard(v, state.filter)\r\n );\r\n return { ...state.detail, supplierDetailCards } as ISupplierDetailDto;\r\n }\r\n);\r\n\r\nexport const selectPeriodStartDate = createSelector(\r\n selectSupplierInsightsState,\r\n state => getPeriodStartDate(state.filter.period)\r\n);\r\n\r\nexport const selectFilterOptions = createSelector(selectSupplierInsightsState, state => state.filterOptions);\r\n\r\nexport const selectCurrentFilter = createSelector(selectSupplierInsightsState, state => state.filter);\r\n\r\n\r\nfunction filterOverviewCard(card: ISupplierOverviewCard, 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 filterDetailCard(card: ISupplierDetailCard, 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 let 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 { selectSupplierInsightsDetail } from '../selectors/supplier-insights-root.selector';\r\n\r\nexport const selectSupplierDetailCards = createSelector(\r\n selectSupplierInsightsDetail,\r\n (state) => state.supplierDetailCards\r\n)\r\n\r\nexport const selectSupplierServiceTypes = createSelector(\r\n selectSupplierInsightsDetail,\r\n (state) => state.supplierDetailCards.map(c => c.serviceType)\r\n)\r\n\r\nexport const selectSupplierServiceStats = createSelector(\r\n selectSupplierInsightsDetail,\r\n (state) => state.serviceStats\r\n)\r\n\r\nexport const selectSupplierName = createSelector(\r\n selectSupplierInsightsDetail,\r\n (state) => state.supplierDetailCards.map(c => c.supplier)\r\n)\r\n","import { selectSupplierInsightsDetail } from './supplier-insights-root.selector';\r\nimport { createSelector } from '@ngrx/store';\r\n\r\nexport const selectSupplierInsightsDetailsGoalScore = createSelector(\r\n selectSupplierInsightsDetail,\r\n (detail) => detail.goalScore\r\n);\r\n\r\nexport const selectSupplierInsightsDetailsCurrentScore = createSelector(\r\n selectSupplierInsightsDetail,\r\n (detail) => {\r\n if (detail.supplierDetailCards.length === 0) return 0;\r\n const sum = detail.supplierDetailCards.reduce((a, b) => a + b.score, 0);\r\n return Math.round(sum * 100 / detail.supplierDetailCards.length);\r\n }\r\n);\r\n","import { selectSupplierInsightsDetail } from './supplier-insights-root.selector';\r\nimport { createSelector } from '@ngrx/store';\r\nimport { selectSupplierName, selectSupplierServiceTypes } from './service-card-selectors.selector';\r\nimport { of } from 'rxjs';\r\n\r\nexport const selectSupplierInsightsDetailSupplierName = createSelector(\r\n selectSupplierName,\r\n selectSupplierServiceTypes,\r\n (supplier, types) => supplier[0] || types[0]\r\n);\r\n","import { selectSupplierInsightsOverview } from './supplier-insights-root.selector';\r\nimport { createSelector } from '@ngrx/store';\r\nimport { ISupplierPerformanceSummary } from '../../models';\r\n\r\nexport const selectSupplierInsightsOverviewGoalScore = createSelector(\r\n selectSupplierInsightsOverview,\r\n (overview) => overview.goalScore\r\n);\r\n\r\nexport const selectSupplierInsightsOverviewCurrentScore = createSelector(\r\n selectSupplierInsightsOverview,\r\n (overview) => {\r\n var suppliers = overview.supplierOverviewCards.reduce((a, b) => a.concat(b.supplierScores), [] as ISupplierPerformanceSummary[]);\r\n if (suppliers.length === 0) return 0;\r\n return Math.round(suppliers.reduce((a, b) => a + b.score, 0) / suppliers.length * 100);\r\n }\r\n);\r\n","import { createSelector } from '@ngrx/store';\r\nimport { selectPeriodStartDate, selectSupplierInsightsOverview } from 'src/app/pages/supplier-insights/store/selectors/supplier-insights-root.selector';\r\n\r\nexport interface ISupplierOverviewRow {\r\n supplier?: string;\r\n score: number;\r\n services: IServiceOverview[];\r\n steps: string[];\r\n moves: number;\r\n}\r\n\r\nexport interface IServiceOverview {\r\n service: string;\r\n trend: number;\r\n score: number;\r\n}\r\n\r\nexport const selectSupplierOverviewList = createSelector(\r\n selectSupplierInsightsOverview,\r\n selectPeriodStartDate,\r\n (overview, fromDate) => {\r\n\r\n const fromDateMonthEnd = new Date(fromDate.getFullYear(), fromDate.getMonth() + 1, 1, 0, 0, -1);\r\n const suppliers = new Array();\r\n\r\n const scores = overview.supplierOverviewCards\r\n .filter(c => c.supplierScores.length > 0)\r\n .flatMap<{\r\n on: Date,\r\n score: number,\r\n service: string,\r\n steps: string[],\r\n supplier: string,\r\n asg: string\r\n }>(c => {\r\n var model: Array = c.supplierScores.map(s => ({\r\n on: c.inviteDate,\r\n score: s.score * 100,\r\n service: s.serviceType,\r\n steps: s.journeySteps,\r\n supplier: s.supplier,\r\n asg: s.assignmentId\r\n }))\r\n\r\n return model;\r\n });\r\n\r\n var supplierScores = scores\r\n .filter(s => !!s.supplier)\r\n .reduce<{\r\n [key: string]: {\r\n services: {\r\n [service: string]: {\r\n initial: number,\r\n initialCount: number,\r\n score: number,\r\n scoreCount: number,\r\n service: string\r\n }\r\n },\r\n asg: Array,\r\n steps: Array\r\n }\r\n }>((acc, v) => {\r\n let x = acc[ v.supplier ] || { asg: new Array, steps: new Array, services: {}};\r\n\r\n let service = x.services[v.service] || {\r\n initial: 0,\r\n initialCount: 0,\r\n score: 0,\r\n scoreCount: 0,\r\n service: ''\r\n };\r\n\r\n if (v.on <= fromDateMonthEnd) {\r\n service.initial += v.score;\r\n service.initialCount += 1;\r\n }\r\n service.score += v.score;\r\n service.scoreCount += 1;\r\n service.service = v.service;\r\n\r\n x.services[v.service] = service;\r\n x.asg.push(v.asg);\r\n x.steps.push(...v.steps);\r\n\r\n return { ...acc, [v.supplier]: x };\r\n }, { });\r\n\r\n for (const [supplier, s] of Object.entries(supplierScores)) {\r\n const serviceValues = Object.values(s.services);\r\n const services = serviceValues.map(v => ({ service: v.service, score: v.score / v.scoreCount, trend: v.score / v.scoreCount - (v.initialCount ? v.initial / v.initialCount : 0) }));\r\n const scoreReducer = serviceValues.reduce<{ score: number, count: number }>((a, b) => {\r\n a.score += b.score;\r\n a.count += b.scoreCount;\r\n return a;\r\n }, { score: 0, count: 0 });\r\n const score = scoreReducer.score / scoreReducer.count;\r\n const moves = [...new Set(s.asg)].length;\r\n const steps = [...new Set(s.steps)];\r\n\r\n suppliers.push({\r\n supplier,\r\n moves,\r\n score,\r\n steps,\r\n services\r\n });\r\n }\r\n\r\n var serviceScores = scores\r\n .filter(s => !s.supplier)\r\n .reduce<{\r\n [key: string]: {\r\n initial: number,\r\n initialCount: number,\r\n score: number,\r\n scoreCount: number,\r\n asg: Array,\r\n steps: Array\r\n }\r\n }>((acc, v) => {\r\n let service = acc[ v.service ] || {\r\n initial: 0,\r\n initialCount: 0,\r\n score: 0,\r\n scoreCount: 0,\r\n steps: new Array,\r\n asg: new Array\r\n };\r\n\r\n if (v.on <= fromDateMonthEnd) {\r\n service.initial += v.score;\r\n service.initialCount += 1;\r\n }\r\n\r\n service.score += v.score;\r\n service.scoreCount += 1;\r\n service.steps = [...v.steps];\r\n service.asg.push(v.asg);\r\n\r\n return { ...acc, [v.service]: service };\r\n }, {});\r\n\r\n for (const [service, s] of Object.entries(serviceScores)) {\r\n suppliers.push({\r\n score: s.score / s.scoreCount,\r\n moves: [...new Set(s.asg)].length,\r\n steps: [...new Set(s.steps)],\r\n services: [ { service, score: s.score / s.scoreCount, trend: s.score / s.scoreCount - (s.initialCount ? s.initial / s.initialCount : 0) }]\r\n });\r\n }\r\n\r\n return suppliers.sort((a, b) => {\r\n const currSupplier = a?.supplier?.toLowerCase();\r\n const nextSupplier = b?.supplier?.toLowerCase();\r\n\r\n if (!nextSupplier) return 0;\r\n\r\n // sort alphabetically\r\n // cards with no suppliernames to display first\r\n\r\n if (!currSupplier || currSupplier < nextSupplier) {\r\n return -1;\r\n }\r\n\r\n if (currSupplier > nextSupplier) {\r\n return 1;\r\n }\r\n\r\n return 0;\r\n });\r\n }\r\n)\r\n","import { createSelector } from '@ngrx/store';\r\nimport { TimeValueOptions } from 'src/app/dashboard';\r\nimport { ISupplierOverviewDto } from '../../models/supplier-overview-dto.model';\r\nimport { selectSupplierInsightsOverview } from './supplier-insights-root.selector';\r\nimport { selectSupplierInsightsTimePeriod } from './supplier-insights-root.selector';\r\n\r\n\r\nexport const selectPeriodLabels = createSelector(\r\n selectSupplierInsightsTimePeriod,\r\n period => {\r\n let 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 return labels;\r\n }\r\n)\r\n\r\nexport const selectSupplierTrendDataOverview = createSelector(\r\n selectSupplierInsightsOverview,\r\n selectPeriodLabels,\r\n (overview: ISupplierOverviewDto, labels: string[]) => {\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 overview.supplierOverviewCards.forEach(card => {\r\n if (!card.inviteDate || !card.supplierScores) 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 card.supplierScores.forEach(s => v.addScore(s.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, curr) => {\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\nexport interface ITrendlineDatapoint {\r\n label: string;\r\n score: number;\r\n count: number;\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}","import { createSelector } from '@ngrx/store';\r\nimport { TimeValueOptions } from 'src/app/dashboard';\r\nimport { ISupplierDetailDto } from '../../models/supplier-detail-dto.model';\r\nimport { selectSupplierInsightsDetail } from './supplier-insights-root.selector';\r\nimport { selectSupplierInsightsTimePeriod } from './supplier-insights-root.selector';\r\nimport { ITrendlineDatapoint } from './supplier-trendline.selector';\r\n\r\n\r\nexport const selectPeriodLabels = createSelector(\r\n selectSupplierInsightsTimePeriod,\r\n period => {\r\n let 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 return labels;\r\n }\r\n)\r\n\r\nexport const selectSupplierTrendDataDetail = createSelector(\r\n selectSupplierInsightsDetail,\r\n selectPeriodLabels,\r\n (overview: ISupplierDetailDto, labels: string[]) => {\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 overview.supplierDetailCards.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, curr) => {\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}","import { Component, Input, OnInit } from '@angular/core';\r\nimport { Observable, of } from 'rxjs';\r\nimport { combineLatestWith, map } from 'rxjs/operators';\r\nimport { SupplierInsightsState } from '../../store/reducers/supplier-insights.reducer';\r\nimport { ITrendlineDatapoint, selectSupplierTrendDataOverview } from '../../store/selectors/supplier-trendline.selector';\r\nimport { selectSupplierTrendDataDetail } from '../../store/selectors/supplier-detail-trendline.selector';\r\nimport { ChartData, ChartOptions, ChartDataset } from 'chart.js';\r\nimport { Store } from '@ngrx/store';\r\nimport { ActivatedRoute } from '@angular/router';\r\nimport { tooltipBg } from 'src/scss/constants';\r\n\r\n@Component({\r\n selector: 'maas-supplier-trend-line',\r\n templateUrl: './supplier-trend-line.component.html',\r\n styleUrls: ['./supplier-trend-line.component.scss'],\r\n})\r\nexport class SupplierTrendLineComponent implements OnInit {\r\n @Input() detail = false;\r\n\r\n lineData$: Observable | undefined;\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\r\n scales: {\r\n y:\r\n {\r\n display: true,\r\n suggestedMin: 0,\r\n suggestedMax: 100,\r\n ticks: {\r\n stepSize: 25,\r\n },\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): string | string[] | number | number[] {\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 }\r\n\r\n ngOnInit(): void {\r\n this.lineData$ = this.store.select(selectSupplierTrendDataOverview).pipe(\r\n combineLatestWith(this.detail ? this.store.select(selectSupplierTrendDataDetail) : of(null)),\r\n map(([overview, detail]: [ITrendlineDatapoint[], ITrendlineDatapoint[] | null]) => {\r\n const data = overview.map((d) => d.score);\r\n let datasets: ChartDataset[] = [\r\n {\r\n type: 'line',\r\n label: 'goal',\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 backgroundColor: 'black',\r\n },\r\n {\r\n label: 'overall score',\r\n backgroundColor: this.detail ? 'rgba(189, 212, 231, .2)' : 'rgba(4, 106, 174,0.7)',\r\n borderColor: this.detail ? 'rgba(189, 212, 231, 1)' : 'rgba(4, 106, 174, 0.2)',\r\n barThickness: 6,\r\n tension: 0.35,\r\n fill: true,\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('supplier') ?? '',\r\n backgroundColor: 'rgba(4, 106, 174,0.7)',\r\n borderColor: 'rgba(248, 207, 78, 1)',\r\n pointBackgroundColor: 'rgba(248, 207, 78, 1)',\r\n barThickness: 6,\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","
supplier trend
\r\n
\r\n \r\n
\r\n","import { Injectable } from '@angular/core';\r\nimport { COLORS } from './color-constants';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class TrendColorService {\r\n\r\n colorByScore(score?: number) {\r\n if (!score) return COLORS.EMPTY;\r\n\r\n if (score > 0) {\r\n return COLORS.HIGH;\r\n }\r\n\r\n if (score < 0) {\r\n return COLORS.LOW;\r\n }\r\n }\r\n}\r\n","import { Pipe, PipeTransform } from '@angular/core';\r\n@Pipe({\r\n name: 'absValue'\r\n})\r\nexport class AbsValuePipe implements PipeTransform {\r\n transform(value: number): unknown {\r\n if (!value) return 0;\r\n const absValue = Math.abs(value)\r\n return Math.round(absValue);\r\n }\r\n}\r\n\r\n","\r\n\r\n\r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n\r\n \r\n\r\n \r\n\r\n \r\n\r\n \r\n\r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n\r\n
supplier {{ element.supplier }} \r\n \r\n service trend\r\n \r\n \r\n
\r\n 0\">\r\n \r\n \r\n \r\n \r\n +\r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n -\r\n \r\n\r\n \r\n {{ step.trend | absValue }}\r\n \r\n
\r\n
\r\n \r\n score\r\n \r\n \r\n
\r\n \r\n
\r\n
\r\n service type(s)\r\n \r\n\r\n \r\n
\r\n
\r\n {{ step.service }} \r\n
\r\n
\r\n\r\n
\r\n # of moves\r\n \r\n {{element.moves || 0}}\r\n journey step(s) \r\n \r\n {{i !==element.steps.length-1 ? step + ',' : step }} \r\n \r\n \r\n \r\n view details\r\n \r\n \r\n
\r\n","import { AfterContentInit, Component, OnDestroy, ViewChild } from '@angular/core';\r\nimport { MatSort } from '@angular/material/sort';\r\nimport { MatTableDataSource } from '@angular/material/table';\r\nimport { ChartColorService } from 'src/app/charts/services/chart-color.service';\r\nimport { TrendColorService } from 'src/app/charts/services/trend-color.service';\r\nimport { Store } from '@ngrx/store';\r\nimport { SupplierInsightsState } from 'src/app/pages/supplier-insights/store/reducers/supplier-insights.reducer';\r\nimport { Unsubscriber } from '@core';\r\nimport { ISupplierOverviewRow, selectSupplierOverviewList } from '../../store/selectors';\r\n\r\n@Unsubscriber()\r\n@Component({\r\n selector: 'maas-supplier-list',\r\n templateUrl: './supplier-list.component.html',\r\n styleUrls: ['./supplier-list.component.scss'],\r\n})\r\nexport class SupplierListComponent implements AfterContentInit, OnDestroy {\r\n\r\n displayedColumns: string[] = [\r\n 'supplier',\r\n 'score',\r\n 'service types',\r\n 'services trend',\r\n 'moves',\r\n 'journey steps',\r\n 'star'\r\n ];\r\n\r\n @ViewChild(MatSort) sort: MatSort | undefined;\r\n dataSource = new MatTableDataSource();\r\n\r\n constructor(\r\n private store: Store,\r\n public color: ChartColorService,\r\n public trendColor: TrendColorService,\r\n ) {\r\n this.store.select(selectSupplierOverviewList).subscribe(c => {\r\n this.dataSource.data = c;\r\n });\r\n }\r\n\r\n ngAfterContentInit() {\r\n if (this.sort) this.dataSource.sort = this.sort;\r\n }\r\n\r\n ngOnDestroy() { }\r\n}\r\n","import { Component, OnInit } from '@angular/core';\r\nimport { Store } from '@ngrx/store';\r\n\r\nimport { SupActions, SupInsights } from '../../store';\r\nimport { SupplierInsightsState } from '../../store/reducers/supplier-insights.reducer';\r\nimport { ICurrentFilter } from 'src/app/dashboard';\r\n\r\n@Component({\r\n selector: 'maas-supplier-insights-page',\r\n templateUrl: './supplier-insights-page.component.html',\r\n styleUrls: ['./supplier-insights-page.component.scss'],\r\n})\r\nexport class SupplierInsightsPageComponent implements OnInit {\r\n goalScore$ = this.store.select(SupInsights.selectSupplierInsightsOverviewGoalScore);\r\n currentScore$ = this.store.select(SupInsights.selectSupplierInsightsOverviewCurrentScore);\r\n filterOptions$ = this.store.select(SupInsights.selectFilterOptions);\r\n filter$ = this.store.select(SupInsights.selectCurrentFilter);\r\n\r\n constructor(private store: Store) {}\r\n\r\n ngOnInit() {\r\n this.store.dispatch(SupActions.LoadSupplierInsightsOverview());\r\n }\r\n\r\n onFilterChange(filter: ICurrentFilter) {\r\n this.store.dispatch(SupActions.SetFilter({ filter }));\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 overview
\r\n
\r\n \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, Input, OnInit } 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-medium-score-doughnut',\r\n templateUrl: './medium-score-doughnut.component.html',\r\n styleUrls: ['./medium-score-doughnut.component.scss']\r\n})\r\nexport class MediumScoreDoughnutComponent implements OnInit {\r\n @Input() score: number | undefined;\r\n @Input() text: string = '';\r\n\r\n data!: ChartData;\r\n options = {\r\n maintainAspectRatio: false,\r\n cutout: '85%',\r\n plugins: {\r\n tooltip: {\r\n enabled: false\r\n }\r\n },\r\n };\r\n\r\n constructor(private colorService: ChartColorService) { }\r\n\r\n ngOnInit(): void {\r\n if (!this.score) return;\r\n this.data = {\r\n datasets: [\r\n {\r\n backgroundColor: [this.colorService.colorByScore(this.score), '#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","
\r\n \r\n\r\n
\r\n {{ score }}\r\n {{ text }}\r\n
\r\n
\r\n","import { Component, OnInit, Input, ChangeDetectionStrategy } from '@angular/core';\r\nimport { ICategoryScore } from '../../models/category-score.model';\r\nimport { ISupplierDetailCard } from '../../models/supplier-detail-card.model';\r\n\r\n@Component({\r\n selector: 'maas-category-score-list',\r\n templateUrl: './category-score-list.component.html',\r\n styleUrls: ['./category-score-list.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush\r\n})\r\nexport class CategoryScoreListComponent implements OnInit {\r\n @Input() category = '';\r\n @Input() detailCards: ISupplierDetailCard[] = [];\r\n\r\n score = '';\r\n scores: ICategoryScore[][] = [];\r\n cats: ICategoryScore[] = [];\r\n\r\n ngOnInit(): void {\r\n this.scores = this.detailCards.map((c) => c.categoryScores);\r\n this.score = this.getScore(this.detailCards.map((c) => c.categoryScores));\r\n }\r\n\r\n getScore(categories: ICategoryScore[][]): string {\r\n let score = 0;\r\n let count = 0;\r\n for (const c of categories) {\r\n const cats = c.map((x) => x);\r\n for (const cat of cats) {\r\n if (cat.evaluationCategory === this.category) {\r\n score += cat.score * 100;\r\n count++;\r\n }\r\n }\r\n }\r\n\r\n if (count > 0)\r\n return Math.round(score / count).toString();\r\n\r\n return 'N/A';\r\n }\r\n}\r\n","
\r\n
{{ category }}
\r\n
{{ score }}
\r\n
\r\n","
\r\n

experience excerpt(s)

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

\r\n
\r\n {{ v.answer }}\r\n

\r\n\r\n
\r\n
\r\n","import { ChangeDetectionStrategy, Component, Input } from '@angular/core';\r\nimport { IExcerptDetails } from 'src/app/pages/supplier-insights/models/excerpt.model';\r\n\r\n@Component({\r\n selector: 'maas-survey-service-exerpts',\r\n templateUrl: './survey-service-exerpts.component.html',\r\n styleUrls: ['./survey-service-exerpts.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush\r\n})\r\nexport class SurveyServiceExerptsComponent {\r\n @Input() excerpts: IExcerptDetails[] = [];\r\n}\r\n","
\r\n
\r\n

{{ serviceType }}

\r\n
\r\n
\r\n \r\n
\r\n\r\n
\r\n
\r\n {{ avg }}\r\n average\r\n
\r\n
\r\n
\r\n
\r\n

categories

\r\n \r\n
\r\n
\r\n\r\n 0\">\r\n
\r\n","import { ChangeDetectionStrategy, Component, Input, OnInit } from '@angular/core';\r\nimport { ISupplierDetailCard } from '../../models/supplier-detail-card.model';\r\nimport { ChartColorService } from '../../../../charts/services/chart-color.service';\r\nimport { ISupplierServiceStats } from '../../models';\r\nimport { IExcerptDetails } from 'src/app/pages/supplier-insights/models/excerpt.model';\r\n\r\n@Component({\r\n selector: 'maas-service-detail-cards',\r\n templateUrl: './service-detail-cards.component.html',\r\n styleUrls: ['./service-detail-cards.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush\r\n})\r\nexport class ServiceDetailCardsComponent implements OnInit {\r\n @Input() detailCards: ISupplierDetailCard[] = [];\r\n @Input() serviceType: string = '';\r\n @Input() serviceStats: ISupplierServiceStats[] = [];\r\n\r\n cats: string[] = [];\r\n currentScore: number = 0;\r\n serviceStatsColor: string = '';\r\n filteredCards: ISupplierDetailCard[] = [];\r\n avg: number = 0;\r\n excerpts: IExcerptDetails[] = [];\r\n\r\n constructor(private colorService: ChartColorService) { }\r\n\r\n ngOnInit(): void {\r\n this.filteredCards = this.detailCards.filter((c) => c.serviceType === this.serviceType).map((cards) => cards);\r\n const serviceLineStats = this.serviceStats.find(s => s.serviceType === this.serviceType);\r\n\r\n if (serviceLineStats) {\r\n this.avg = serviceLineStats?.cumulativeCount > 0\r\n ? Math.round((serviceLineStats?.cumulativeSum / serviceLineStats.cumulativeCount))\r\n : 0;\r\n }\r\n\r\n for (const e of (this.filteredCards.sort((a, b) => {\r\n if (b.respondedOn && a.respondedOn)\r\n return b.respondedOn.valueOf() - a.respondedOn.valueOf();\r\n\r\n return 0;\r\n })\r\n .map(c => c.highLowLights))) {\r\n for (const exerpt of e) {\r\n if (exerpt.answer.length >= 30) {\r\n this.excerpts.push(exerpt)\r\n }\r\n }\r\n };\r\n\r\n this.currentScore = this.average(\r\n this.filteredCards.map((c) => c.score)\r\n );\r\n\r\n this.serviceStatsColor = this.colorService.colorByScore(this.avg) ?? '';\r\n\r\n\r\n this.cats = this.getCategories();\r\n }\r\n\r\n average(scores: number[]): number {\r\n const reducer = (previousValue: number, currentValue: number) => previousValue + currentValue;\r\n return Math.round((scores.reduce(reducer) / scores.length) * 100);\r\n }\r\n\r\n getCategories(): string[] {\r\n switch(this.serviceType) {\r\n case 'Cultural Training Provider':\r\n return ['Effectiveness'];\r\n case 'Destination Service Provider':\r\n return ['Communication', 'Customer Focus', 'Knowledgeable', 'Responsiveness'];\r\n case 'Health Insurance Provider':\r\n return ['Accessibility', 'Clarity', 'Coverage'];\r\n case 'Household Goods Mover':\r\n return [\r\n 'Clarity',\r\n 'Communication',\r\n 'Courteous',\r\n 'Ease of Use',\r\n 'Integrity',\r\n 'Issue Resolution',\r\n 'Timeliness'];\r\n case 'Immigration Provider':\r\n return [\r\n 'Clarity',\r\n 'Convenience',\r\n 'Coordination',\r\n 'Customer Focus',\r\n 'Depth of Knowledge',\r\n 'Ease of Use',\r\n 'Timeliness'];\r\n case 'Language Training Provider':\r\n return ['Effectiveness'];\r\n case 'Relocation Management Company Provider':\r\n return [\r\n 'Clarity',\r\n 'Communication',\r\n 'Coordination',\r\n 'Customer Focus',\r\n 'Knowledgeable',\r\n 'Responsiveness'];\r\n case 'Tax Service Provider':\r\n return [\r\n 'Clarity',\r\n 'Communication',\r\n 'Convenience',\r\n 'Coordination',\r\n 'Customer Focus',\r\n 'Depth of Knowledge',\r\n 'Ease of Use',\r\n 'Timeliness'];\r\n case 'Temporary Living Provider':\r\n return [\r\n 'Cleanliness',\r\n 'Convenience',\r\n 'Length of Stay',\r\n 'Location',\r\n 'Safety',\r\n 'Spaciousness'];\r\n default:\r\n return [];\r\n }\r\n }\r\n}\r\n","
supplier service type(s)
\r\n
\r\n
\r\n
\r\n \r\n \r\n
\r\n
\r\n
\r\n","import { Component } from '@angular/core';\r\nimport { SupplierInsightsState } from '../../store/reducers/supplier-insights.reducer';\r\nimport { selectSupplierDetailCards, selectSupplierServiceStats, selectSupplierServiceTypes } from '../../store/selectors/service-card-selectors.selector';\r\nimport { select, Store } from '@ngrx/store';\r\nimport { filter, map } from 'rxjs/operators';\r\n\r\n@Component({\r\n selector: 'maas-supplier-details',\r\n templateUrl: './supplier-details.component.html',\r\n styleUrls: ['./supplier-details.component.scss']\r\n})\r\nexport class SupplierDetailsComponent {\r\n detailCards$ = this.store.pipe(select(selectSupplierDetailCards), filter(s => s.length > 0));\r\n services$ = this.store.select(selectSupplierServiceTypes);\r\n serviceStats$ = this.store.select(selectSupplierServiceStats);\r\n types$ = this.services$.pipe(map(services => new Set(services)));\r\n\r\n constructor(private store: Store) { }\r\n}\r\n","import { Component, OnInit } from '@angular/core';\r\nimport { Store } from '@ngrx/store';\r\nimport { ActivatedRoute } from '@angular/router';\r\nimport { map } from 'rxjs/operators';\r\nimport { Unsubscriber } from '../../../../@core';\r\nimport { SupInsights, SupActions } from '../../store';\r\nimport { ICurrentFilter } from 'src/app/dashboard';\r\nimport { LoadSupplierInsightsDetail } from '../../store/actions';\r\nimport { Observable } from 'rxjs';\r\n\r\n@Unsubscriber()\r\n@Component({\r\n selector: 'maas-supplier-insights-details',\r\n templateUrl: './supplier-insights-details.component.html',\r\n styleUrls: ['./supplier-insights-details.component.scss'],\r\n})\r\nexport class SupplierInsightsDetailsComponent implements OnInit {\r\n goalScore$ = this.store.select(SupInsights.selectSupplierInsightsDetailsGoalScore);\r\n currentScore$ = this.store.select(SupInsights.selectSupplierInsightsDetailsCurrentScore);\r\n supplierValid: string = '';\r\n filterOptions$ = this.store.select(SupInsights.selectFilterOptions);\r\n filter$ = this.store.select(SupInsights.selectCurrentFilter);\r\n\r\n supplierName$: Observable = this.route.params.pipe(\r\n map(({ services, supplier }) => {\r\n const firstService = services.split(',')[0];\r\n\r\n return supplier === firstService ? firstService.toLowerCase() : supplier;\r\n })\r\n );\r\n\r\n constructor(private store: Store, private route: ActivatedRoute) {}\r\n\r\n ngOnInit(): void {\r\n this.route.params.subscribe((params) => {\r\n const services = params.services.split(',');\r\n const supplier = params.supplier !== services[0] ? params.supplier : '';\r\n this.store.dispatch(\r\n LoadSupplierInsightsDetail(\r\n { clientId: params.clientId,\r\n supplier,\r\n services\r\n })\r\n );\r\n });\r\n }\r\n\r\n onFilterChange(filter: ICurrentFilter) {\r\n this.store.dispatch(SupActions.SetFilter({ filter }));\r\n }\r\n}\r\n","
\r\n
\r\n \r\n \r\n
\r\n\r\n
\r\n
\r\n
\r\n \r\n \"go-back\r\n \r\n
{{(supplierName$ | async)}}
\r\n
\r\n
\r\n \r\n
\r\n
\r\n
\r\n \r\n
\r\n
\r\n\r\n
\r\n \r\n
\r\n
\r\n","import { NgModule } from '@angular/core';\r\nimport { Routes, RouterModule } from '@angular/router';\r\nimport { SupplierInsightsPageComponent } from '../supplier-insights/components/supplier-insights-page/supplier-insights-page.component';\r\nimport { SupplierInsightsDetailsComponent } from './components/supplier-insights-details/supplier-insights-details.component';\r\n\r\nconst routes: Routes = [\r\n { path: '', component: SupplierInsightsPageComponent, title: 'Supplier insights overview' },\r\n { path: ':supplier', component: SupplierInsightsDetailsComponent, title: 'Supplier insights 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 { Injectable } from '@angular/core';\r\nimport { HttpClient } from '@angular/common/http';\r\nimport { ISupplierOverviewDto } from '../models/supplier-overview-dto.model';\r\nimport { Observable } from 'rxjs';\r\nimport { ISupplierDetailDto } from '../models/supplier-detail-dto.model';\r\n\r\n@Injectable({providedIn: 'root'})\r\nexport class SupplierInsightsService {\r\n constructor(private http: HttpClient) {}\r\n\r\n getOverview() {\r\n return this.http.get('insights/supplier');\r\n }\r\n\r\n getDetail(supplier: string, services: string[]): Observable {\r\n let params = {\r\n 'supplierName': supplier,\r\n 'supplierServices': services\r\n };\r\n\r\n return this.http.get('insights/supplier/detail', { params });\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { Actions, createEffect, ofType } from '@ngrx/effects';\r\nimport { SupplierInsightsService } from '../../services/supplier-insights.service';\r\nimport { catchError, map, switchMap } from 'rxjs/operators';\r\nimport { of } from 'rxjs';\r\nimport {\r\n LoadSupplierInsightsOverview,\r\n LoadSupplierInsightsOverviewSuccess,\r\n LoadSupplierInsightsOverviewFailure,\r\n} from '../actions/load-supplier-insights-overview.actions';\r\nimport {\r\n LoadSupplierInsightsDetail, LoadSupplierInsightsDetailFailure,\r\n LoadSupplierInsightsDetailSuccess\r\n} from '../actions/load-supplier-insights-detail.actions';\r\n\r\n\r\n@Injectable()\r\nexport class SupplierInsightsEffects {\r\n LoadSupplierInsightsOverview$ = createEffect(() =>\r\n this.actions$.pipe(\r\n ofType(LoadSupplierInsightsOverview),\r\n switchMap(() =>\r\n this.insights.getOverview().pipe(\r\n map(data => LoadSupplierInsightsOverviewSuccess(data)),\r\n catchError(error => of(LoadSupplierInsightsOverviewFailure({ error })))\r\n )\r\n )\r\n )\r\n );\r\n\r\n LoadSupplierInsightsDetails$ = createEffect(() =>\r\n this.actions$.pipe(\r\n ofType(LoadSupplierInsightsDetail),\r\n switchMap(({ supplier, services }) =>\r\n this.insights.getDetail(supplier, services).pipe(\r\n map(data => LoadSupplierInsightsDetailSuccess(data)),\r\n catchError(error => of(LoadSupplierInsightsDetailFailure({ error })))\r\n )\r\n )\r\n )\r\n );\r\n\r\n constructor(private actions$: Actions, private insights: SupplierInsightsService) {}\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\nimport { reducer, supplierInsightsFeatureKey } from './reducers/supplier-insights.reducer';\r\nimport { SupplierInsightsEffects } from './effects/supplier-insights.effects';\r\n\r\n@NgModule({\r\n declarations: [],\r\n imports: [\r\n CommonModule,\r\n StoreModule.forFeature(supplierInsightsFeatureKey, reducer),\r\n EffectsModule.forFeature([SupplierInsightsEffects]),\r\n ]\r\n})\r\nexport class SupplierInsightsStoreModule { }\r\n","import { NgModule } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { MatTableModule } from '@angular/material/table';\r\nimport { MatButtonModule } from '@angular/material/button';\r\n\r\nimport { SharedModule } from '@shared';\r\nimport { ChartsModule } from 'src/app/charts/charts.module';\r\n\r\nimport {\r\n SupplierDetailsComponent,\r\n SupplierInsightsDetailsComponent,\r\n SupplierInsightsPageComponent,\r\n SupplierListComponent,\r\n SupplierTrendLineComponent,\r\n} from '../supplier-insights/components';\r\nimport { ExperienceInsightsRoutingModule } from './supplier-insights-routing.module';\r\nimport { MatSortModule } from '@angular/material/sort';\r\nimport { SupplierInsightsStoreModule } from './store/supplier-insights-store.module';\r\nimport { ServiceDetailCardsComponent } from '../supplier-insights/components/service-detail-cards/service-detail-cards.component';\r\nimport { CategoryScoreListComponent } from '../supplier-insights/components/category-score-list/category-score-list.component';\r\nimport { SurveyServiceExerptsComponent } from './components/survey-service-exerpts/survey-service-exerpts.component';\r\nimport { AbsValuePipe } from './services/abs-value.pipe';\r\nimport { DashboardModule } from '../../dashboard/dashboard.module';\r\n\r\n@NgModule({\r\n declarations: [\r\n SupplierInsightsPageComponent,\r\n SupplierTrendLineComponent,\r\n SupplierDetailsComponent,\r\n SupplierInsightsDetailsComponent,\r\n SupplierListComponent,\r\n ServiceDetailCardsComponent,\r\n CategoryScoreListComponent,\r\n SurveyServiceExerptsComponent,\r\n AbsValuePipe,\r\n ],\r\n imports: [\r\n CommonModule,\r\n SharedModule,\r\n DashboardModule,\r\n ExperienceInsightsRoutingModule,\r\n ChartsModule,\r\n MatTableModule,\r\n MatSortModule,\r\n MatButtonModule,\r\n SupplierInsightsStoreModule\r\n ]\r\n})\r\nexport class SupplierInsightsModule {}\r\n"],"x_google_ignoreList":[]}