@ministryofjustice/hmpps-digital-prison-reporting-frontend 4.20.1 → 4.21.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dpr/components/_async/async-filters-form/types.d.js +1 -1
- package/dpr/components/_async/async-filters-form/types.d.js.map +1 -1
- package/dpr/components/_async/async-filters-form/types.d.ts +7 -4
- package/dpr/components/_async/async-filters-form/utils.js +1 -1
- package/dpr/components/_async/async-filters-form/utils.js.map +2 -2
- package/dpr/components/_async/async-filters-form/utils.ts +18 -17
- package/dpr/components/_catalogue/catalogue-list/utils.test.ts +1 -1
- package/dpr/components/_charts/chart/Chart.js +2 -0
- package/dpr/components/_charts/chart/Chart.js.map +7 -0
- package/dpr/components/_charts/chart/Chart.ts +89 -0
- package/dpr/components/_charts/chart/ChartColours.js +2 -0
- package/dpr/components/_charts/chart/ChartColours.js.map +7 -0
- package/dpr/components/_charts/chart/ChartColours.ts +36 -0
- package/dpr/components/_charts/chart/ChartTimeseries.js +2 -0
- package/dpr/components/_charts/chart/ChartTimeseries.js.map +7 -0
- package/dpr/components/_charts/chart/ChartTimeseries.ts +95 -0
- package/dpr/components/_charts/chart/bar/BarChart.js +2 -0
- package/dpr/components/_charts/chart/bar/BarChart.js.map +7 -0
- package/dpr/components/_charts/chart/bar/BarChart.ts +204 -0
- package/dpr/components/_charts/chart/bar/clientClass.mjs +0 -58
- package/dpr/components/_charts/chart/bar/types.js +2 -0
- package/dpr/components/_charts/chart/bar/types.js.map +7 -0
- package/dpr/components/_charts/chart/bar/types.ts +6 -0
- package/dpr/components/_charts/chart/bar/validate.js +2 -0
- package/dpr/components/_charts/chart/bar/validate.js.map +7 -0
- package/dpr/components/_charts/chart/bar/validate.ts +59 -0
- package/dpr/components/_charts/chart/bar-timeseries/BarTimeseriesChart.js +2 -0
- package/dpr/components/_charts/chart/bar-timeseries/BarTimeseriesChart.js.map +7 -0
- package/dpr/components/_charts/chart/bar-timeseries/BarTimeseriesChart.ts +57 -0
- package/dpr/components/_charts/chart/bar-timeseries/types.js +2 -0
- package/dpr/components/_charts/chart/bar-timeseries/types.js.map +7 -0
- package/dpr/components/_charts/chart/bar-timeseries/types.ts +5 -0
- package/dpr/components/_charts/chart/bar-timeseries/validate.js +2 -0
- package/dpr/components/_charts/chart/bar-timeseries/validate.js.map +7 -0
- package/dpr/components/_charts/chart/bar-timeseries/validate.ts +30 -0
- package/dpr/components/_charts/chart/buckets/Buckets.js +2 -0
- package/dpr/components/_charts/chart/buckets/Buckets.js.map +7 -0
- package/dpr/components/_charts/chart/{Buckets.ts → buckets/Buckets.ts} +18 -14
- package/dpr/components/_charts/chart/buckets/types.js +2 -0
- package/dpr/components/_charts/chart/buckets/types.js.map +7 -0
- package/dpr/components/_charts/chart/buckets/types.ts +4 -0
- package/dpr/components/_charts/chart/buckets/validate.js +2 -0
- package/dpr/components/_charts/chart/buckets/validate.js.map +7 -0
- package/dpr/components/_charts/chart/buckets/validate.ts +15 -0
- package/dpr/components/_charts/chart/chart-config.js +2 -0
- package/dpr/components/_charts/chart/chart-config.js.map +7 -0
- package/dpr/components/_charts/chart/chart-config.ts +108 -0
- package/dpr/components/_charts/chart/clientClass.mjs +28 -106
- package/dpr/components/_charts/chart/doughnut/DoughnutChart.js +2 -0
- package/dpr/components/_charts/chart/doughnut/DoughnutChart.js.map +7 -0
- package/dpr/components/_charts/chart/doughnut/DoughnutChart.ts +77 -0
- package/dpr/components/_charts/chart/doughnut/clientClass.mjs +0 -45
- package/dpr/components/_charts/chart/doughnut/types.js +2 -0
- package/dpr/components/_charts/chart/doughnut/types.js.map +7 -0
- package/dpr/components/_charts/chart/doughnut/types.ts +5 -0
- package/dpr/components/_charts/chart/doughnut/validate.js +2 -0
- package/dpr/components/_charts/chart/doughnut/validate.js.map +7 -0
- package/dpr/components/_charts/chart/doughnut/validate.ts +30 -0
- package/dpr/components/_charts/chart/heatmap/HeatmapChart.js +1 -1
- package/dpr/components/_charts/chart/heatmap/HeatmapChart.js.map +3 -3
- package/dpr/components/_charts/chart/heatmap/HeatmapChart.ts +122 -44
- package/dpr/components/_charts/chart/heatmap/clientClass.mjs +7 -89
- package/dpr/components/_charts/chart/heatmap/types.js +1 -1
- package/dpr/components/_charts/chart/heatmap/types.js.map +1 -1
- package/dpr/components/_charts/chart/heatmap/types.ts +5 -0
- package/dpr/components/_charts/chart/heatmap/validate.js +2 -0
- package/dpr/components/_charts/chart/heatmap/validate.js.map +7 -0
- package/dpr/components/_charts/chart/heatmap/validate.ts +25 -0
- package/dpr/components/_charts/chart/line/LineChart.js +2 -0
- package/dpr/components/_charts/chart/line/LineChart.js.map +7 -0
- package/dpr/components/_charts/chart/line/LineChart.ts +89 -0
- package/dpr/components/_charts/chart/line/clientClass.mjs +5 -36
- package/dpr/components/_charts/chart/line/types.js +2 -0
- package/dpr/components/_charts/chart/line/types.js.map +7 -0
- package/dpr/components/_charts/chart/line/types.ts +5 -0
- package/dpr/components/_charts/chart/line/validate.js +2 -0
- package/dpr/components/_charts/chart/line/validate.js.map +7 -0
- package/dpr/components/_charts/chart/line/validate.ts +30 -0
- package/dpr/components/_charts/chart/line-timeseries/LineTimeseriesChart.js +2 -0
- package/dpr/components/_charts/chart/line-timeseries/LineTimeseriesChart.js.map +7 -0
- package/dpr/components/_charts/chart/line-timeseries/LineTimeseriesChart.ts +57 -0
- package/dpr/components/_charts/chart/line-timeseries/types.js +2 -0
- package/dpr/components/_charts/chart/line-timeseries/types.js.map +7 -0
- package/dpr/components/_charts/chart/line-timeseries/types.ts +5 -0
- package/dpr/components/_charts/chart/line-timeseries/validate.js +2 -0
- package/dpr/components/_charts/chart/line-timeseries/validate.js.map +7 -0
- package/dpr/components/_charts/chart/line-timeseries/validate.ts +30 -0
- package/dpr/components/_charts/chart/view.njk +8 -1
- package/dpr/components/_charts/chart-tabs/view.njk +15 -14
- package/dpr/components/_charts/utils.js +1 -1
- package/dpr/components/_charts/utils.js.map +3 -3
- package/dpr/components/_charts/utils.test.ts +9 -3
- package/dpr/components/_charts/utils.ts +59 -193
- package/dpr/components/_dashboards/dashboard-list/types.js +2 -0
- package/dpr/components/_dashboards/dashboard-list/types.js.map +7 -0
- package/dpr/components/_dashboards/dashboard-list/types.ts +4 -0
- package/dpr/components/_dashboards/dashboard-list/validate.js +2 -0
- package/dpr/components/_dashboards/dashboard-list/validate.js.map +7 -0
- package/dpr/components/_dashboards/dashboard-list/validate.ts +28 -0
- package/dpr/components/_dashboards/dashboard-visualisation/Validate.js +2 -0
- package/dpr/components/_dashboards/dashboard-visualisation/Validate.js.map +7 -0
- package/dpr/components/_dashboards/dashboard-visualisation/Validate.ts +71 -0
- package/dpr/components/_dashboards/dashboard-visualisation/types.js +1 -1
- package/dpr/components/_dashboards/dashboard-visualisation/types.js.map +2 -2
- package/dpr/components/_dashboards/dashboard-visualisation/types.ts +32 -2
- package/dpr/components/_dashboards/scorecard/Scorecard.js +1 -1
- package/dpr/components/_dashboards/scorecard/Scorecard.js.map +3 -3
- package/dpr/components/_dashboards/scorecard/Scorecard.ts +82 -213
- package/dpr/components/_dashboards/scorecard/types.js +1 -1
- package/dpr/components/_dashboards/scorecard/types.js.map +1 -1
- package/dpr/components/_dashboards/scorecard/types.ts +11 -1
- package/dpr/components/_dashboards/scorecard/validate.js +2 -0
- package/dpr/components/_dashboards/scorecard/validate.js.map +7 -0
- package/dpr/components/_dashboards/scorecard/validate.ts +36 -0
- package/dpr/components/_dashboards/scorecard-group/ScorecardGroup.js +2 -0
- package/dpr/components/_dashboards/scorecard-group/ScorecardGroup.js.map +7 -0
- package/dpr/components/_dashboards/scorecard-group/ScorecardGroup.ts +228 -0
- package/dpr/components/_dashboards/scorecard-group/types.js +2 -0
- package/dpr/components/_dashboards/scorecard-group/types.js.map +7 -0
- package/dpr/components/_dashboards/scorecard-group/types.ts +5 -0
- package/dpr/components/_dashboards/scorecard-group/validate.js +2 -0
- package/dpr/components/_dashboards/scorecard-group/validate.js.map +7 -0
- package/dpr/components/_dashboards/scorecard-group/validate.ts +37 -0
- package/dpr/components/_filters/filter-input/types.d.js.map +1 -1
- package/dpr/components/_filters/filter-input/types.d.ts +1 -1
- package/dpr/components/_filters/types.d.js.map +1 -1
- package/dpr/components/_filters/types.d.ts +6 -4
- package/dpr/components/_reports/report-actions/types.d.js.map +1 -1
- package/dpr/components/_reports/report-actions/types.d.ts +1 -1
- package/dpr/components/report-list/types.d.js.map +1 -1
- package/dpr/components/report-list/types.d.ts +1 -1
- package/dpr/data/types.d.js +1 -1
- package/dpr/data/types.d.js.map +1 -1
- package/dpr/data/types.d.ts +2 -1
- package/dpr/routes/journeys/view-report/async/dashboard/utils.js +1 -1
- package/dpr/routes/journeys/view-report/async/dashboard/utils.js.map +3 -3
- package/dpr/routes/journeys/view-report/async/dashboard/utils.ts +22 -10
- package/dpr/routes/journeys/view-report/async/report/utils.js +1 -1
- package/dpr/routes/journeys/view-report/async/report/utils.js.map +2 -2
- package/dpr/routes/journeys/view-report/async/report/utils.ts +1 -1
- package/dpr/routes/journeys/view-report/controller.js +1 -1
- package/dpr/routes/journeys/view-report/controller.js.map +3 -3
- package/dpr/routes/journeys/view-report/controller.ts +3 -1
- package/dpr/types/Services.d.js +1 -1
- package/dpr/types/Services.d.js.map +1 -1
- package/dpr/types/Services.d.ts +0 -2
- package/dpr/utils/DataTableBuilder/types.d.js +1 -1
- package/dpr/utils/DataTableBuilder/types.d.js.map +1 -1
- package/dpr/utils/DataTableBuilder/types.d.ts +2 -2
- package/dpr/utils/ErrorHandler.js +1 -1
- package/dpr/utils/ErrorHandler.js.map +3 -3
- package/dpr/utils/ErrorHandler.ts +16 -0
- package/dpr/utils/ParentChildDataTableBuilder/types.d.js +1 -1
- package/dpr/utils/ParentChildDataTableBuilder/types.d.js.map +1 -1
- package/dpr/utils/ParentChildDataTableBuilder/types.d.ts +1 -0
- package/dpr/utils/Personalisation/types.d.js +1 -1
- package/dpr/utils/Personalisation/types.d.js.map +1 -1
- package/dpr/utils/Personalisation/types.d.ts +1 -0
- package/dpr/utils/UserStoreItemBuilder.js.map +2 -2
- package/dpr/utils/UserStoreItemBuilder.ts +1 -1
- package/package.json +1 -1
- package/dpr/components/_charts/chart/Buckets.js +0 -2
- package/dpr/components/_charts/chart/Buckets.js.map +0 -7
- package/dpr/components/_dashboards/dashboard-visualisation/DashboardVisualisation.js +0 -2
- package/dpr/components/_dashboards/dashboard-visualisation/DashboardVisualisation.js.map +0 -7
- package/dpr/components/_dashboards/dashboard-visualisation/DashboardVisualisation.ts +0 -40
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../src/dpr/components/_dashboards/scorecard/Scorecard.ts"],
|
|
4
|
-
"sourcesContent": ["/* eslint-disable prefer-destructuring */\nimport { DashboardDataResponse } from '../../../types/Metrics'\nimport DashboardVisualisationClass from '../dashboard-visualisation/DashboardVisualisation'\nimport { DashboardVisualisationBucket } from '../dashboard-visualisation/types'\nimport DatasetHelper from '../../../utils/datasetHelper'\nimport { CreateScorecardDataArgs, Scorecard, ScorecardDataset, ScorecardGroup, ScorecardTrend } from './types'\nimport Buckets from '../../_charts/chart/Buckets'\nimport { components } from '../../../types/api'\n\nclass ScorecardVisualisation extends DashboardVisualisationClass {\n private dataset: ScorecardDataset\n\n private groupKey: components['schemas']['DashboardVisualisationColumnDefinition'] | undefined\n\n private groupKeyId: string | undefined\n\n private groupKeyDisplay: string | undefined\n\n private bucketsHelper: Buckets | undefined\n\n private buckets: DashboardVisualisationBucket[] = []\n\n private valueColumn: components['schemas']['DashboardVisualisationColumnDefinition'] | undefined\n\n private valueKey = ''\n\n private titleColumn: components['schemas']['DashboardVisualisationColumnDefinition'] | undefined\n\n private titleKey = ''\n\n private group: boolean\n\n private ragColours: string[] = ['#cce2d8', '#fff7bf', '#f4cdc6']\n\n constructor(\n responseData: DashboardDataResponse[],\n definition: components['schemas']['DashboardVisualisationDefinition'],\n group = false,\n ) {\n super(responseData, definition)\n this.group = group\n this.dataset = this.getDataset(definition, responseData)\n\n if (group) {\n this.initGroupVars()\n } else {\n this.valueKey = this.measures[0].id\n this.titleColumn = { display: definition.display || '', id: this.valueKey }\n this.initBuckets(responseData, this.valueKey)\n }\n }\n\n private initBuckets = (responseData: DashboardDataResponse[], valueKey: string) => {\n if (this.definition.options?.buckets || this.definition.options?.useRagColour) {\n this.bucketsHelper = new Buckets(responseData, this.definition, valueKey, false, this.ragColours)\n this.buckets = new Buckets(responseData, this.definition, valueKey, false, this.ragColours).getBuckets()\n }\n }\n\n private initGroupVars = () => {\n this.groupKey = DatasetHelper.getGroupKey(this.dataset.latest, this.keys)\n this.groupKeyId = this.groupKey?.id\n this.groupKeyDisplay = this.groupKey?.display\n\n this.valueColumn = this.measures.find((col) => col.displayValue)\n if (this.valueColumn) {\n this.valueKey = this.valueColumn?.id\n this.titleColumn = this.measures.find((col) => {\n return col.display || col.display === ''\n })\n this.titleKey = this.titleColumn?.id || ''\n }\n }\n\n private getDataset = (\n scorecardDefinition: components['schemas']['DashboardVisualisationDefinition'],\n rawData: DashboardDataResponse[],\n ): ScorecardDataset => {\n const latestData = DatasetHelper.getLastestDataset(rawData)\n const latestDataSetRows = DatasetHelper.getDatasetRows(scorecardDefinition, latestData)\n const latestTs = latestDataSetRows[0]?.['ts']?.raw\n const latestFiltered = DatasetHelper.filterRowsByDisplayColumns(scorecardDefinition, latestDataSetRows, true)\n\n const earliestData = DatasetHelper.getEarliestDataset(rawData)\n const earliestDataSetRows = DatasetHelper.getDatasetRows(scorecardDefinition, earliestData)\n const earliestTs = earliestDataSetRows[0]?.['ts']?.raw\n const earliestfiltered = DatasetHelper.filterRowsByDisplayColumns(scorecardDefinition, earliestDataSetRows, true)\n\n return {\n earliest: earliestfiltered,\n earliestTs,\n latest: latestFiltered,\n latestTs,\n }\n }\n\n private setRagScore = (value: number, rag?: number) => {\n return this.bucketsHelper?.getBucketForValue(value, rag)\n }\n\n private createScorecardData = ({\n title,\n value,\n rag,\n valueFor,\n valueFrom,\n prevVal,\n groupTitle,\n }: CreateScorecardDataArgs): Scorecard => {\n return {\n id: this.definition.id,\n title,\n value,\n ...(!Number.isNaN(value) &&\n this.buckets.length &&\n this.bucketsHelper && { rag: this.setRagScore(<number>value, rag) }),\n valueFor,\n trend: this.createTrend(valueFor, valueFrom, value, prevVal),\n ...(groupTitle && {\n group: groupTitle,\n }),\n }\n }\n\n private createTrend = (\n valueFor: string,\n valueFrom: string,\n latestValue: string | number,\n earliestValue: string | number | null | undefined,\n ): ScorecardTrend | undefined => {\n let trendData\n\n if (valueFrom !== valueFor) {\n const value = earliestValue ? Number(latestValue) - Number(earliestValue) : 0\n const direction = Math.sign(value)\n trendData = {\n direction,\n value: Math.abs(value),\n from: valueFrom,\n }\n }\n\n return trendData\n }\n\n private validateDefinition = () => {\n const { id, type } = this.definition\n const errors = []\n if (!this.group) {\n if (this.measures.length !== 1) {\n errors.push(`Measures should only have 1 column defined. Found ${this.measures.length}`)\n } else if (!this.titleColumn) {\n errors.push(`No title column defined. Expected measure to include \"display: string\" field`)\n } else if (!this.valueKey) {\n errors.push(`Missing ID in title measure. Expected measure to include \"id: string\" field`)\n }\n }\n\n if (errors.length) {\n // Throw the error\n const message = `Validation: Visualisaton definition: ID: ${id}, type: ${type}, errors: ${errors.join(',')}`\n throw new Error(message)\n }\n }\n\n private createScorecardGroupFromColumns = () => {\n const { latest, earliest, latestTs, earliestTs } = this.dataset\n\n return latest.map((row, rowIndex) => {\n return {\n title: this.createGroupTitle(row),\n scorecards: Object.keys(row)\n .filter((colId) => colId !== this.groupKeyId)\n .map((colId) => {\n const measure = this.measures.find((m) => m.id === colId)\n const title = measure?.display || colId\n const rowCol = row[colId]\n const { raw, rag: ragScore } = rowCol\n const value = Number(raw)\n\n const rag = ragScore !== undefined ? Number(ragScore) : undefined\n this.initBuckets([row], colId)\n\n const valueFor = `${latestTs}`\n const valueFrom = `${earliestTs}`\n\n const comparisonRow = earliest[rowIndex]\n const prevVal = comparisonRow[colId]?.raw\n\n return this.createScorecardData({\n title,\n value,\n rag,\n prevVal,\n valueFor,\n valueFrom,\n })\n }),\n }\n })\n }\n\n private createScorecardGroupFromList = (): ScorecardGroup[] => {\n const { latest, earliest } = this.dataset\n return [\n {\n title: '',\n scorecards: latest.map((row: DashboardDataResponse, index: number) => {\n const values = this.getScorecardValues(row)\n const prevVal = earliest[index][this.valueKey].raw\n return this.createScorecardData({\n ...values,\n prevVal,\n })\n }),\n },\n ]\n }\n\n private createScorecardGroupFromListWithGroups = () => {\n const { latest, earliest } = this.dataset\n\n let earliestGroupedByKey = DatasetHelper.groupRowsByKey(earliest, <string>this.groupKeyId)\n let latestGroupedByKey = DatasetHelper.groupRowsByKey(latest, <string>this.groupKeyId)\n if (this.groupKeyId === this.titleKey) {\n latestGroupedByKey = [latestGroupedByKey.flat()]\n earliestGroupedByKey = [earliestGroupedByKey.flat()]\n }\n\n const scorecardGroup = latestGroupedByKey.map((group, groupIndex) => {\n return {\n title: this.groupKeyDisplay ? `By ${this.groupKeyDisplay}` : '',\n scorecards: group.map((row, rowIndex) => {\n const values = this.getScorecardValues(row)\n const comparisonRow = earliestGroupedByKey[groupIndex][rowIndex]\n const prevVal = comparisonRow[this.valueKey]?.raw\n\n return this.createScorecardData({\n ...values,\n prevVal,\n })\n }),\n }\n })\n\n return scorecardGroup\n }\n\n private getScorecardValues = (row: DashboardDataResponse) => {\n const { latestTs, earliestTs } = this.dataset\n const title = `${this.titleColumn?.display} ${row[this.titleKey].raw}`\n const rowCol = row[this.valueKey]\n const { raw, rag: ragScore } = rowCol\n const value = Number(raw)\n const rag = ragScore !== undefined ? Number(ragScore) : undefined\n this.initBuckets([row], this.valueKey)\n const valueFor = `${latestTs}`\n const valueFrom = `${earliestTs}`\n\n return {\n title,\n value,\n rag,\n valueFor,\n valueFrom,\n }\n }\n\n /**\n * Builds a single scorecard\n *\n * @return {Scorecard}\n */\n private buildScorecard = () => {\n const { latest, earliest, latestTs, earliestTs } = this.dataset\n const scorecordArr: Scorecard[] = latest.map((datasetRow: DashboardDataResponse, index: number) => {\n const { raw: value, rag } = datasetRow[this.valueKey]\n const prevVal = earliest[index][this.valueKey].raw\n const valueFor = `${latestTs}`\n const valueFrom = `${earliestTs}`\n const title = this.titleColumn?.display\n\n return this.createScorecardData({\n title: title || '',\n value: value || '',\n rag,\n prevVal,\n valueFor,\n valueFrom,\n })\n })\n\n return scorecordArr[0]\n }\n\n private createGroupTitle = (row: DashboardDataResponse) => {\n const title = this.groupKeyId ? `${row[this.groupKeyId]?.raw}` : ''\n return this.groupKeyDisplay && this.groupKeyDisplay.length ? `${this.groupKeyDisplay}: ${title}` : title\n }\n\n private buildGroup = () => {\n let scorecardGroup: ScorecardGroup[]\n if (!this.valueColumn) {\n scorecardGroup = this.createScorecardGroupFromColumns()\n } else if (this.groupKey) {\n scorecardGroup = this.createScorecardGroupFromListWithGroups()\n } else {\n scorecardGroup = this.createScorecardGroupFromList()\n }\n return scorecardGroup\n }\n\n build = () => {\n this.validateDefinition()\n if (this.group) {\n return this.buildGroup()\n }\n return this.buildScorecard()\n }\n}\n\nexport { ScorecardVisualisation }\nexport default ScorecardVisualisation\n"],
|
|
5
|
-
"mappings": "0jBAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,4BAAAE,EAAA,YAAAC,IAAA,eAAAC,EAAAJ,
|
|
6
|
-
"names": ["Scorecard_exports", "__export", "ScorecardVisualisation", "Scorecard_default", "__toCommonJS", "
|
|
4
|
+
"sourcesContent": ["/* eslint-disable prefer-destructuring */\nimport { DashboardDataResponse } from '../../../types/Metrics'\nimport { DashboardVisualisationBucket } from '../dashboard-visualisation/types'\nimport { CreateScorecardDataArgs, Scorecard, ScorecardDataset, ScorecardDefinitionType, ScorecardTrend } from './types'\nimport Buckets from '../../_charts/chart/buckets/Buckets'\nimport { components } from '../../../types/api'\nimport DatasetHelper from '../../../utils/datasetHelper'\nimport ScorecardSchemas from './validate'\nimport { ScorecardGroupDefinitionType } from '../scorecard-group/types'\n\nclass ScorecardVisualisation {\n private definition!: ScorecardDefinitionType\n\n private id!: string\n\n private measures!: ScorecardDefinitionType['columns']['measures']\n\n private options!: ScorecardDefinitionType['options']\n\n private dataset!: ScorecardDataset\n\n private bucketsHelper: Buckets | undefined\n\n private buckets: DashboardVisualisationBucket[] = []\n\n private valueKey!: string\n\n private titleColumn: components['schemas']['DashboardVisualisationColumnDefinition'] | undefined\n\n private unit: 'NUMBER' | 'PERCENTAGE' | undefined\n\n responseData: DashboardDataResponse[] = []\n\n ragColours: string[] = ['#cce2d8', '#fff7bf', '#f4cdc6']\n\n withDefinition = (definition: components['schemas']['DashboardVisualisationDefinition']) => {\n this.definition = ScorecardSchemas.ScorecardSchema.parse(definition)\n this.init()\n\n return this\n }\n\n withData = (responseData: DashboardDataResponse[]) => {\n this.responseData = responseData\n this.dataset = this.getDataset(this.definition, this.responseData)\n this.initBuckets(this.responseData, this.valueKey)\n\n return this\n }\n\n private init = () => {\n this.id = this.definition.id\n this.measures = this.definition.columns.measures\n this.options = this.definition.options\n this.titleColumn = { display: this.definition.display, id: this.valueKey }\n this.initFromMeasures()\n }\n\n private initFromMeasures = () => {\n // Zod should throw an error on line 40 so should always pass\n if (this.measures[0] !== undefined) {\n this.valueKey = this.measures[0].id\n this.unit = this.measures[0].unit ? this.measures[0].unit : undefined\n }\n }\n\n private initBuckets = (responseData: DashboardDataResponse[], valueKey: string) => {\n if (this.options?.buckets || this.options?.useRagColour) {\n this.bucketsHelper = new Buckets(responseData, this.definition, valueKey, false, this.ragColours)\n this.buckets = this.bucketsHelper.getBuckets()\n }\n }\n\n getDataset = (\n definition: ScorecardDefinitionType | ScorecardGroupDefinitionType,\n rawData: DashboardDataResponse[],\n ): ScorecardDataset => {\n const latestData = DatasetHelper.getLastestDataset(rawData)\n const latestDataSetRows = DatasetHelper.getDatasetRows(\n <components['schemas']['DashboardVisualisationDefinition']>definition,\n latestData,\n )\n const latestTs = latestDataSetRows[0]?.['ts']?.raw\n const latestFiltered = DatasetHelper.filterRowsByDisplayColumns(\n <components['schemas']['DashboardVisualisationDefinition']>definition,\n latestDataSetRows,\n true,\n )\n\n const earliestData = DatasetHelper.getEarliestDataset(rawData)\n const earliestDataSetRows = DatasetHelper.getDatasetRows(\n <components['schemas']['DashboardVisualisationDefinition']>definition,\n earliestData,\n )\n const earliestTs = earliestDataSetRows[0]?.['ts']?.raw\n const earliestfiltered = DatasetHelper.filterRowsByDisplayColumns(\n <components['schemas']['DashboardVisualisationDefinition']>definition,\n earliestDataSetRows,\n true,\n )\n\n return {\n earliest: earliestfiltered,\n earliestTs,\n latest: latestFiltered,\n latestTs,\n }\n }\n\n createScorecardData = ({\n id,\n title,\n value,\n rag,\n valueFor,\n valueFrom,\n prevVal,\n groupTitle,\n }: CreateScorecardDataArgs): Scorecard => {\n return {\n id,\n title,\n value,\n ...(rag && { rag }),\n valueFor,\n trend: this.createTrend(valueFor, valueFrom, value, prevVal),\n ...(groupTitle && {\n group: groupTitle,\n }),\n }\n }\n\n createTrend = (\n valueFor: string,\n valueFrom: string,\n latestValue: string | number,\n earliestValue: string | number | null | undefined,\n ): ScorecardTrend | undefined => {\n let trendData\n\n if (valueFrom !== valueFor) {\n const value = earliestValue ? Number(latestValue) - Number(earliestValue) : 0\n const direction = Math.sign(value)\n trendData = {\n direction,\n value: Math.abs(value),\n from: valueFrom,\n }\n }\n\n return trendData\n }\n\n setRagScore = (\n value: string | number | undefined | null,\n rag: number | undefined,\n buckets: DashboardVisualisationBucket[] | undefined,\n bucketsHelper: Buckets | undefined,\n ) => {\n let ragScore\n if (!Number.isNaN(value) && buckets?.length && bucketsHelper) {\n ragScore = bucketsHelper.getBucketForValue(<number>value, rag)\n }\n return ragScore\n }\n\n build = () => {\n const { latest, earliest, latestTs, earliestTs } = this.dataset\n const scorecordArr: Scorecard[] = latest.map((datasetRow: DashboardDataResponse, index: number) => {\n const { raw: value, rag } = datasetRow[this.valueKey]\n const prevVal = earliest[index][this.valueKey].raw\n const valueFor = `${latestTs}`\n const valueFrom = `${earliestTs}`\n const title = this.titleColumn?.display\n\n return this.createScorecardData({\n id: this.id,\n title: title || '',\n value: value || '',\n rag: this.setRagScore(value, rag, this.buckets, this.bucketsHelper),\n prevVal,\n valueFor,\n valueFrom,\n })\n })\n\n return scorecordArr[0]\n }\n}\n\nexport { ScorecardVisualisation }\nexport default ScorecardVisualisation\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["Scorecard_exports", "__export", "ScorecardVisualisation", "Scorecard_default", "__toCommonJS", "import_Buckets", "import_datasetHelper", "import_validate", "definition", "ScorecardSchemas", "responseData", "valueKey", "Buckets", "rawData", "latestData", "DatasetHelper", "latestDataSetRows", "latestTs", "latestFiltered", "earliestData", "earliestDataSetRows", "earliestTs", "id", "title", "value", "rag", "valueFor", "valueFrom", "prevVal", "groupTitle", "latestValue", "earliestValue", "trendData", "buckets", "bucketsHelper", "ragScore", "latest", "earliest", "datasetRow", "index"]
|
|
7
7
|
}
|
|
@@ -1,90 +1,103 @@
|
|
|
1
1
|
/* eslint-disable prefer-destructuring */
|
|
2
2
|
import { DashboardDataResponse } from '../../../types/Metrics'
|
|
3
|
-
import DashboardVisualisationClass from '../dashboard-visualisation/DashboardVisualisation'
|
|
4
3
|
import { DashboardVisualisationBucket } from '../dashboard-visualisation/types'
|
|
5
|
-
import
|
|
6
|
-
import
|
|
7
|
-
import Buckets from '../../_charts/chart/Buckets'
|
|
4
|
+
import { CreateScorecardDataArgs, Scorecard, ScorecardDataset, ScorecardDefinitionType, ScorecardTrend } from './types'
|
|
5
|
+
import Buckets from '../../_charts/chart/buckets/Buckets'
|
|
8
6
|
import { components } from '../../../types/api'
|
|
7
|
+
import DatasetHelper from '../../../utils/datasetHelper'
|
|
8
|
+
import ScorecardSchemas from './validate'
|
|
9
|
+
import { ScorecardGroupDefinitionType } from '../scorecard-group/types'
|
|
9
10
|
|
|
10
|
-
class ScorecardVisualisation
|
|
11
|
-
private
|
|
11
|
+
class ScorecardVisualisation {
|
|
12
|
+
private definition!: ScorecardDefinitionType
|
|
12
13
|
|
|
13
|
-
private
|
|
14
|
+
private id!: string
|
|
14
15
|
|
|
15
|
-
private
|
|
16
|
+
private measures!: ScorecardDefinitionType['columns']['measures']
|
|
16
17
|
|
|
17
|
-
private
|
|
18
|
+
private options!: ScorecardDefinitionType['options']
|
|
19
|
+
|
|
20
|
+
private dataset!: ScorecardDataset
|
|
18
21
|
|
|
19
22
|
private bucketsHelper: Buckets | undefined
|
|
20
23
|
|
|
21
24
|
private buckets: DashboardVisualisationBucket[] = []
|
|
22
25
|
|
|
23
|
-
private
|
|
24
|
-
|
|
25
|
-
private valueKey = ''
|
|
26
|
+
private valueKey!: string
|
|
26
27
|
|
|
27
28
|
private titleColumn: components['schemas']['DashboardVisualisationColumnDefinition'] | undefined
|
|
28
29
|
|
|
29
|
-
private
|
|
30
|
+
private unit: 'NUMBER' | 'PERCENTAGE' | undefined
|
|
30
31
|
|
|
31
|
-
|
|
32
|
+
responseData: DashboardDataResponse[] = []
|
|
32
33
|
|
|
33
|
-
|
|
34
|
+
ragColours: string[] = ['#cce2d8', '#fff7bf', '#f4cdc6']
|
|
34
35
|
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
group = false,
|
|
39
|
-
) {
|
|
40
|
-
super(responseData, definition)
|
|
41
|
-
this.group = group
|
|
42
|
-
this.dataset = this.getDataset(definition, responseData)
|
|
36
|
+
withDefinition = (definition: components['schemas']['DashboardVisualisationDefinition']) => {
|
|
37
|
+
this.definition = ScorecardSchemas.ScorecardSchema.parse(definition)
|
|
38
|
+
this.init()
|
|
43
39
|
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
40
|
+
return this
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
withData = (responseData: DashboardDataResponse[]) => {
|
|
44
|
+
this.responseData = responseData
|
|
45
|
+
this.dataset = this.getDataset(this.definition, this.responseData)
|
|
46
|
+
this.initBuckets(this.responseData, this.valueKey)
|
|
47
|
+
|
|
48
|
+
return this
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
private init = () => {
|
|
52
|
+
this.id = this.definition.id
|
|
53
|
+
this.measures = this.definition.columns.measures
|
|
54
|
+
this.options = this.definition.options
|
|
55
|
+
this.titleColumn = { display: this.definition.display, id: this.valueKey }
|
|
56
|
+
this.initFromMeasures()
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
private initFromMeasures = () => {
|
|
60
|
+
// Zod should throw an error on line 40 so should always pass
|
|
61
|
+
if (this.measures[0] !== undefined) {
|
|
47
62
|
this.valueKey = this.measures[0].id
|
|
48
|
-
this.
|
|
49
|
-
this.initBuckets(responseData, this.valueKey)
|
|
63
|
+
this.unit = this.measures[0].unit ? this.measures[0].unit : undefined
|
|
50
64
|
}
|
|
51
65
|
}
|
|
52
66
|
|
|
53
67
|
private initBuckets = (responseData: DashboardDataResponse[], valueKey: string) => {
|
|
54
|
-
if (this.
|
|
68
|
+
if (this.options?.buckets || this.options?.useRagColour) {
|
|
55
69
|
this.bucketsHelper = new Buckets(responseData, this.definition, valueKey, false, this.ragColours)
|
|
56
|
-
this.buckets =
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
private initGroupVars = () => {
|
|
61
|
-
this.groupKey = DatasetHelper.getGroupKey(this.dataset.latest, this.keys)
|
|
62
|
-
this.groupKeyId = this.groupKey?.id
|
|
63
|
-
this.groupKeyDisplay = this.groupKey?.display
|
|
64
|
-
|
|
65
|
-
this.valueColumn = this.measures.find((col) => col.displayValue)
|
|
66
|
-
if (this.valueColumn) {
|
|
67
|
-
this.valueKey = this.valueColumn?.id
|
|
68
|
-
this.titleColumn = this.measures.find((col) => {
|
|
69
|
-
return col.display || col.display === ''
|
|
70
|
-
})
|
|
71
|
-
this.titleKey = this.titleColumn?.id || ''
|
|
70
|
+
this.buckets = this.bucketsHelper.getBuckets()
|
|
72
71
|
}
|
|
73
72
|
}
|
|
74
73
|
|
|
75
|
-
|
|
76
|
-
|
|
74
|
+
getDataset = (
|
|
75
|
+
definition: ScorecardDefinitionType | ScorecardGroupDefinitionType,
|
|
77
76
|
rawData: DashboardDataResponse[],
|
|
78
77
|
): ScorecardDataset => {
|
|
79
78
|
const latestData = DatasetHelper.getLastestDataset(rawData)
|
|
80
|
-
const latestDataSetRows = DatasetHelper.getDatasetRows(
|
|
79
|
+
const latestDataSetRows = DatasetHelper.getDatasetRows(
|
|
80
|
+
<components['schemas']['DashboardVisualisationDefinition']>definition,
|
|
81
|
+
latestData,
|
|
82
|
+
)
|
|
81
83
|
const latestTs = latestDataSetRows[0]?.['ts']?.raw
|
|
82
|
-
const latestFiltered = DatasetHelper.filterRowsByDisplayColumns(
|
|
84
|
+
const latestFiltered = DatasetHelper.filterRowsByDisplayColumns(
|
|
85
|
+
<components['schemas']['DashboardVisualisationDefinition']>definition,
|
|
86
|
+
latestDataSetRows,
|
|
87
|
+
true,
|
|
88
|
+
)
|
|
83
89
|
|
|
84
90
|
const earliestData = DatasetHelper.getEarliestDataset(rawData)
|
|
85
|
-
const earliestDataSetRows = DatasetHelper.getDatasetRows(
|
|
91
|
+
const earliestDataSetRows = DatasetHelper.getDatasetRows(
|
|
92
|
+
<components['schemas']['DashboardVisualisationDefinition']>definition,
|
|
93
|
+
earliestData,
|
|
94
|
+
)
|
|
86
95
|
const earliestTs = earliestDataSetRows[0]?.['ts']?.raw
|
|
87
|
-
const earliestfiltered = DatasetHelper.filterRowsByDisplayColumns(
|
|
96
|
+
const earliestfiltered = DatasetHelper.filterRowsByDisplayColumns(
|
|
97
|
+
<components['schemas']['DashboardVisualisationDefinition']>definition,
|
|
98
|
+
earliestDataSetRows,
|
|
99
|
+
true,
|
|
100
|
+
)
|
|
88
101
|
|
|
89
102
|
return {
|
|
90
103
|
earliest: earliestfiltered,
|
|
@@ -94,11 +107,8 @@ class ScorecardVisualisation extends DashboardVisualisationClass {
|
|
|
94
107
|
}
|
|
95
108
|
}
|
|
96
109
|
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
private createScorecardData = ({
|
|
110
|
+
createScorecardData = ({
|
|
111
|
+
id,
|
|
102
112
|
title,
|
|
103
113
|
value,
|
|
104
114
|
rag,
|
|
@@ -108,12 +118,10 @@ class ScorecardVisualisation extends DashboardVisualisationClass {
|
|
|
108
118
|
groupTitle,
|
|
109
119
|
}: CreateScorecardDataArgs): Scorecard => {
|
|
110
120
|
return {
|
|
111
|
-
id
|
|
121
|
+
id,
|
|
112
122
|
title,
|
|
113
123
|
value,
|
|
114
|
-
...(
|
|
115
|
-
this.buckets.length &&
|
|
116
|
-
this.bucketsHelper && { rag: this.setRagScore(<number>value, rag) }),
|
|
124
|
+
...(rag && { rag }),
|
|
117
125
|
valueFor,
|
|
118
126
|
trend: this.createTrend(valueFor, valueFrom, value, prevVal),
|
|
119
127
|
...(groupTitle && {
|
|
@@ -122,7 +130,7 @@ class ScorecardVisualisation extends DashboardVisualisationClass {
|
|
|
122
130
|
}
|
|
123
131
|
}
|
|
124
132
|
|
|
125
|
-
|
|
133
|
+
createTrend = (
|
|
126
134
|
valueFor: string,
|
|
127
135
|
valueFrom: string,
|
|
128
136
|
latestValue: string | number,
|
|
@@ -143,135 +151,20 @@ class ScorecardVisualisation extends DashboardVisualisationClass {
|
|
|
143
151
|
return trendData
|
|
144
152
|
}
|
|
145
153
|
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
errors.push(`Missing ID in title measure. Expected measure to include "id: string" field`)
|
|
156
|
-
}
|
|
157
|
-
}
|
|
158
|
-
|
|
159
|
-
if (errors.length) {
|
|
160
|
-
// Throw the error
|
|
161
|
-
const message = `Validation: Visualisaton definition: ID: ${id}, type: ${type}, errors: ${errors.join(',')}`
|
|
162
|
-
throw new Error(message)
|
|
163
|
-
}
|
|
164
|
-
}
|
|
165
|
-
|
|
166
|
-
private createScorecardGroupFromColumns = () => {
|
|
167
|
-
const { latest, earliest, latestTs, earliestTs } = this.dataset
|
|
168
|
-
|
|
169
|
-
return latest.map((row, rowIndex) => {
|
|
170
|
-
return {
|
|
171
|
-
title: this.createGroupTitle(row),
|
|
172
|
-
scorecards: Object.keys(row)
|
|
173
|
-
.filter((colId) => colId !== this.groupKeyId)
|
|
174
|
-
.map((colId) => {
|
|
175
|
-
const measure = this.measures.find((m) => m.id === colId)
|
|
176
|
-
const title = measure?.display || colId
|
|
177
|
-
const rowCol = row[colId]
|
|
178
|
-
const { raw, rag: ragScore } = rowCol
|
|
179
|
-
const value = Number(raw)
|
|
180
|
-
|
|
181
|
-
const rag = ragScore !== undefined ? Number(ragScore) : undefined
|
|
182
|
-
this.initBuckets([row], colId)
|
|
183
|
-
|
|
184
|
-
const valueFor = `${latestTs}`
|
|
185
|
-
const valueFrom = `${earliestTs}`
|
|
186
|
-
|
|
187
|
-
const comparisonRow = earliest[rowIndex]
|
|
188
|
-
const prevVal = comparisonRow[colId]?.raw
|
|
189
|
-
|
|
190
|
-
return this.createScorecardData({
|
|
191
|
-
title,
|
|
192
|
-
value,
|
|
193
|
-
rag,
|
|
194
|
-
prevVal,
|
|
195
|
-
valueFor,
|
|
196
|
-
valueFrom,
|
|
197
|
-
})
|
|
198
|
-
}),
|
|
199
|
-
}
|
|
200
|
-
})
|
|
201
|
-
}
|
|
202
|
-
|
|
203
|
-
private createScorecardGroupFromList = (): ScorecardGroup[] => {
|
|
204
|
-
const { latest, earliest } = this.dataset
|
|
205
|
-
return [
|
|
206
|
-
{
|
|
207
|
-
title: '',
|
|
208
|
-
scorecards: latest.map((row: DashboardDataResponse, index: number) => {
|
|
209
|
-
const values = this.getScorecardValues(row)
|
|
210
|
-
const prevVal = earliest[index][this.valueKey].raw
|
|
211
|
-
return this.createScorecardData({
|
|
212
|
-
...values,
|
|
213
|
-
prevVal,
|
|
214
|
-
})
|
|
215
|
-
}),
|
|
216
|
-
},
|
|
217
|
-
]
|
|
218
|
-
}
|
|
219
|
-
|
|
220
|
-
private createScorecardGroupFromListWithGroups = () => {
|
|
221
|
-
const { latest, earliest } = this.dataset
|
|
222
|
-
|
|
223
|
-
let earliestGroupedByKey = DatasetHelper.groupRowsByKey(earliest, <string>this.groupKeyId)
|
|
224
|
-
let latestGroupedByKey = DatasetHelper.groupRowsByKey(latest, <string>this.groupKeyId)
|
|
225
|
-
if (this.groupKeyId === this.titleKey) {
|
|
226
|
-
latestGroupedByKey = [latestGroupedByKey.flat()]
|
|
227
|
-
earliestGroupedByKey = [earliestGroupedByKey.flat()]
|
|
228
|
-
}
|
|
229
|
-
|
|
230
|
-
const scorecardGroup = latestGroupedByKey.map((group, groupIndex) => {
|
|
231
|
-
return {
|
|
232
|
-
title: this.groupKeyDisplay ? `By ${this.groupKeyDisplay}` : '',
|
|
233
|
-
scorecards: group.map((row, rowIndex) => {
|
|
234
|
-
const values = this.getScorecardValues(row)
|
|
235
|
-
const comparisonRow = earliestGroupedByKey[groupIndex][rowIndex]
|
|
236
|
-
const prevVal = comparisonRow[this.valueKey]?.raw
|
|
237
|
-
|
|
238
|
-
return this.createScorecardData({
|
|
239
|
-
...values,
|
|
240
|
-
prevVal,
|
|
241
|
-
})
|
|
242
|
-
}),
|
|
243
|
-
}
|
|
244
|
-
})
|
|
245
|
-
|
|
246
|
-
return scorecardGroup
|
|
247
|
-
}
|
|
248
|
-
|
|
249
|
-
private getScorecardValues = (row: DashboardDataResponse) => {
|
|
250
|
-
const { latestTs, earliestTs } = this.dataset
|
|
251
|
-
const title = `${this.titleColumn?.display} ${row[this.titleKey].raw}`
|
|
252
|
-
const rowCol = row[this.valueKey]
|
|
253
|
-
const { raw, rag: ragScore } = rowCol
|
|
254
|
-
const value = Number(raw)
|
|
255
|
-
const rag = ragScore !== undefined ? Number(ragScore) : undefined
|
|
256
|
-
this.initBuckets([row], this.valueKey)
|
|
257
|
-
const valueFor = `${latestTs}`
|
|
258
|
-
const valueFrom = `${earliestTs}`
|
|
259
|
-
|
|
260
|
-
return {
|
|
261
|
-
title,
|
|
262
|
-
value,
|
|
263
|
-
rag,
|
|
264
|
-
valueFor,
|
|
265
|
-
valueFrom,
|
|
154
|
+
setRagScore = (
|
|
155
|
+
value: string | number | undefined | null,
|
|
156
|
+
rag: number | undefined,
|
|
157
|
+
buckets: DashboardVisualisationBucket[] | undefined,
|
|
158
|
+
bucketsHelper: Buckets | undefined,
|
|
159
|
+
) => {
|
|
160
|
+
let ragScore
|
|
161
|
+
if (!Number.isNaN(value) && buckets?.length && bucketsHelper) {
|
|
162
|
+
ragScore = bucketsHelper.getBucketForValue(<number>value, rag)
|
|
266
163
|
}
|
|
164
|
+
return ragScore
|
|
267
165
|
}
|
|
268
166
|
|
|
269
|
-
|
|
270
|
-
* Builds a single scorecard
|
|
271
|
-
*
|
|
272
|
-
* @return {Scorecard}
|
|
273
|
-
*/
|
|
274
|
-
private buildScorecard = () => {
|
|
167
|
+
build = () => {
|
|
275
168
|
const { latest, earliest, latestTs, earliestTs } = this.dataset
|
|
276
169
|
const scorecordArr: Scorecard[] = latest.map((datasetRow: DashboardDataResponse, index: number) => {
|
|
277
170
|
const { raw: value, rag } = datasetRow[this.valueKey]
|
|
@@ -281,9 +174,10 @@ class ScorecardVisualisation extends DashboardVisualisationClass {
|
|
|
281
174
|
const title = this.titleColumn?.display
|
|
282
175
|
|
|
283
176
|
return this.createScorecardData({
|
|
177
|
+
id: this.id,
|
|
284
178
|
title: title || '',
|
|
285
179
|
value: value || '',
|
|
286
|
-
rag,
|
|
180
|
+
rag: this.setRagScore(value, rag, this.buckets, this.bucketsHelper),
|
|
287
181
|
prevVal,
|
|
288
182
|
valueFor,
|
|
289
183
|
valueFrom,
|
|
@@ -292,31 +186,6 @@ class ScorecardVisualisation extends DashboardVisualisationClass {
|
|
|
292
186
|
|
|
293
187
|
return scorecordArr[0]
|
|
294
188
|
}
|
|
295
|
-
|
|
296
|
-
private createGroupTitle = (row: DashboardDataResponse) => {
|
|
297
|
-
const title = this.groupKeyId ? `${row[this.groupKeyId]?.raw}` : ''
|
|
298
|
-
return this.groupKeyDisplay && this.groupKeyDisplay.length ? `${this.groupKeyDisplay}: ${title}` : title
|
|
299
|
-
}
|
|
300
|
-
|
|
301
|
-
private buildGroup = () => {
|
|
302
|
-
let scorecardGroup: ScorecardGroup[]
|
|
303
|
-
if (!this.valueColumn) {
|
|
304
|
-
scorecardGroup = this.createScorecardGroupFromColumns()
|
|
305
|
-
} else if (this.groupKey) {
|
|
306
|
-
scorecardGroup = this.createScorecardGroupFromListWithGroups()
|
|
307
|
-
} else {
|
|
308
|
-
scorecardGroup = this.createScorecardGroupFromList()
|
|
309
|
-
}
|
|
310
|
-
return scorecardGroup
|
|
311
|
-
}
|
|
312
|
-
|
|
313
|
-
build = () => {
|
|
314
|
-
this.validateDefinition()
|
|
315
|
-
if (this.group) {
|
|
316
|
-
return this.buildGroup()
|
|
317
|
-
}
|
|
318
|
-
return this.buildScorecard()
|
|
319
|
-
}
|
|
320
189
|
}
|
|
321
190
|
|
|
322
191
|
export { ScorecardVisualisation }
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";var
|
|
1
|
+
"use strict";var a=Object.defineProperty;var o=Object.getOwnPropertyDescriptor;var c=Object.getOwnPropertyNames;var s=Object.prototype.hasOwnProperty;var d=(e,r,i,t)=>{if(r&&typeof r=="object"||typeof r=="function")for(let n of c(r))!s.call(e,n)&&n!==i&&a(e,n,{get:()=>r[n],enumerable:!(t=o(r,n))||t.enumerable});return e};var u=e=>d(a({},"__esModule",{value:!0}),e);var g={};module.exports=u(g);
|
|
2
2
|
//# sourceMappingURL=types.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../src/dpr/components/_dashboards/scorecard/types.ts"],
|
|
4
|
-
"sourcesContent": ["import { DashboardDataResponse } from '../../../types/Metrics'\n\nexport interface Scorecard {\n id: string\n title: string\n group?: string\n value: number | string\n trend?: ScorecardTrend | undefined\n link?:\n | {\n href: '#'\n displayName: 'View breakdown'\n }\n | undefined\n valueFor?: string\n rag?: ScorecardRag | undefined\n}\n\nexport interface ScorecardSubGroup {\n name: string\n scorecards: Scorecard[]\n}\n\nexport interface ScorecardGroup {\n title?: string\n description?: string\n scorecards: Scorecard[]\n}\n\nexport interface ScorecardTrend {\n direction: number\n value: number\n from: string\n}\n\nexport interface ScorecardRag {\n score: number\n colour: string\n}\n\nexport interface ScorecardDataset {\n earliest: DashboardDataResponse[]\n earliestTs?: string | number | null | undefined\n latest: DashboardDataResponse[]\n latestTs?: string | number | null | undefined\n}\n\nexport interface CreateScorecardDataArgs {\n title: string\n value: string | number\n rag
|
|
4
|
+
"sourcesContent": ["import z from 'zod'\nimport { DashboardDataResponse } from '../../../types/Metrics'\nimport ScorecardSchema from './validate'\n\nexport interface Scorecard {\n id: string\n title: string\n group?: string\n value: number | string\n trend?: ScorecardTrend | undefined\n link?:\n | {\n href: '#'\n displayName: 'View breakdown'\n }\n | undefined\n valueFor?: string\n rag?: ScorecardRag | undefined\n}\n\nexport interface ScorecardSubGroup {\n name: string\n scorecards: Scorecard[]\n}\n\nexport interface ScorecardGroup {\n title?: string\n description?: string\n scorecards: Scorecard[]\n}\n\nexport interface ScorecardTrend {\n direction: number\n value: number\n from: string\n}\n\nexport interface ScorecardRag {\n score: number\n colour: string\n}\n\nexport interface ScorecardDataset {\n earliest: DashboardDataResponse[]\n earliestTs?: string | number | null | undefined\n latest: DashboardDataResponse[]\n latestTs?: string | number | null | undefined\n}\n\nexport interface CreateScorecardDataArgs {\n id: string\n title: string\n value: string | number\n rag?:\n | {\n colour: string\n score: number\n }\n | undefined\n valueFor: string\n valueFrom: string\n prevVal: string | number | null | undefined\n groupTitle?: string\n}\n\nexport type ScorecardDefinitionType = z.infer<typeof ScorecardSchema.ScorecardSchema>\n"],
|
|
5
5
|
"mappings": "+WAAA,IAAAA,EAAA,kBAAAC,EAAAD",
|
|
6
6
|
"names": ["types_exports", "__toCommonJS"]
|
|
7
7
|
}
|
|
@@ -1,4 +1,6 @@
|
|
|
1
|
+
import z from 'zod'
|
|
1
2
|
import { DashboardDataResponse } from '../../../types/Metrics'
|
|
3
|
+
import ScorecardSchema from './validate'
|
|
2
4
|
|
|
3
5
|
export interface Scorecard {
|
|
4
6
|
id: string
|
|
@@ -46,11 +48,19 @@ export interface ScorecardDataset {
|
|
|
46
48
|
}
|
|
47
49
|
|
|
48
50
|
export interface CreateScorecardDataArgs {
|
|
51
|
+
id: string
|
|
49
52
|
title: string
|
|
50
53
|
value: string | number
|
|
51
|
-
rag?:
|
|
54
|
+
rag?:
|
|
55
|
+
| {
|
|
56
|
+
colour: string
|
|
57
|
+
score: number
|
|
58
|
+
}
|
|
59
|
+
| undefined
|
|
52
60
|
valueFor: string
|
|
53
61
|
valueFrom: string
|
|
54
62
|
prevVal: string | number | null | undefined
|
|
55
63
|
groupTitle?: string
|
|
56
64
|
}
|
|
65
|
+
|
|
66
|
+
export type ScorecardDefinitionType = z.infer<typeof ScorecardSchema.ScorecardSchema>
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";var c=Object.defineProperty;var d=Object.getOwnPropertyDescriptor;var l=Object.getOwnPropertyNames;var m=Object.prototype.hasOwnProperty;var p=(o,a)=>{for(var r in a)c(o,r,{get:a[r],enumerable:!0})},u=(o,a,r,n)=>{if(a&&typeof a=="object"||typeof a=="function")for(let t of l(a))!m.call(o,t)&&t!==r&&c(o,t,{get:()=>a[t],enumerable:!(n=d(a,t))||n.enumerable});return o};var h=o=>u(c({},"__esModule",{value:!0}),o);var g={};p(g,{default:()=>S});module.exports=h(g);var e=require("zod"),s=require("../dashboard-visualisation/Validate");const b=e.z.object({id:e.z.string(),optional:e.z.boolean().default(!1)}),f=e.z.object({id:e.z.string(),unit:e.z.enum(["NUMBER","PERCENTAGE"]).optional()}),i=e.z.array(f).length(1,"Measure must contain a single item"),y=e.z.object({...s.DashboardVisualisationSchema.shape,type:e.z.literal("scorecard"),display:e.z.string(),description:e.z.undefined(),options:e.z.object(s.BucketOptionsSchema.shape).optional(),columns:e.z.object({...s.DashboardColumns.shape,keys:e.z.array(b).min(1),measures:i})});var S={ScorecardSchema:y,ScorecardMeasuresSchema:i};
|
|
2
|
+
//# sourceMappingURL=validate.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../src/dpr/components/_dashboards/scorecard/validate.ts"],
|
|
4
|
+
"sourcesContent": ["import { z } from 'zod'\nimport {\n DashboardVisualisationSchema,\n DashboardColumns,\n BucketOptionsSchema,\n} from '../dashboard-visualisation/Validate'\n\nconst scorecardKey = z.object({\n id: z.string(),\n optional: z.boolean().default(false),\n})\n\nconst scorecardMeasure = z.object({\n id: z.string(),\n unit: z.enum(['NUMBER', 'PERCENTAGE']).optional(),\n})\n\nconst ScorecardMeasuresSchema = z.array(scorecardMeasure).length(1, 'Measure must contain a single item')\n\nconst ScorecardSchema = z.object({\n ...DashboardVisualisationSchema.shape,\n type: z.literal('scorecard'),\n display: z.string(),\n description: z.undefined(),\n options: z.object(BucketOptionsSchema.shape).optional(),\n columns: z.object({\n ...DashboardColumns.shape,\n keys: z.array(scorecardKey).min(1),\n measures: ScorecardMeasuresSchema,\n }),\n})\n\nexport default {\n ScorecardSchema,\n ScorecardMeasuresSchema,\n}\n"],
|
|
5
|
+
"mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,aAAAE,IAAA,eAAAC,EAAAH,GAAA,IAAAI,EAAkB,eAClBC,EAIO,+CAEP,MAAMC,EAAe,IAAE,OAAO,CAC5B,GAAI,IAAE,OAAO,EACb,SAAU,IAAE,QAAQ,EAAE,QAAQ,EAAK,CACrC,CAAC,EAEKC,EAAmB,IAAE,OAAO,CAChC,GAAI,IAAE,OAAO,EACb,KAAM,IAAE,KAAK,CAAC,SAAU,YAAY,CAAC,EAAE,SAAS,CAClD,CAAC,EAEKC,EAA0B,IAAE,MAAMD,CAAgB,EAAE,OAAO,EAAG,oCAAoC,EAElGE,EAAkB,IAAE,OAAO,CAC/B,GAAG,+BAA6B,MAChC,KAAM,IAAE,QAAQ,WAAW,EAC3B,QAAS,IAAE,OAAO,EAClB,YAAa,IAAE,UAAU,EACzB,QAAS,IAAE,OAAO,sBAAoB,KAAK,EAAE,SAAS,EACtD,QAAS,IAAE,OAAO,CAChB,GAAG,mBAAiB,MACpB,KAAM,IAAE,MAAMH,CAAY,EAAE,IAAI,CAAC,EACjC,SAAUE,CACZ,CAAC,CACH,CAAC,EAED,IAAON,EAAQ,CACb,gBAAAO,EACA,wBAAAD,CACF",
|
|
6
|
+
"names": ["validate_exports", "__export", "validate_default", "__toCommonJS", "import_zod", "import_Validate", "scorecardKey", "scorecardMeasure", "ScorecardMeasuresSchema", "ScorecardSchema"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { z } from 'zod'
|
|
2
|
+
import {
|
|
3
|
+
DashboardVisualisationSchema,
|
|
4
|
+
DashboardColumns,
|
|
5
|
+
BucketOptionsSchema,
|
|
6
|
+
} from '../dashboard-visualisation/Validate'
|
|
7
|
+
|
|
8
|
+
const scorecardKey = z.object({
|
|
9
|
+
id: z.string(),
|
|
10
|
+
optional: z.boolean().default(false),
|
|
11
|
+
})
|
|
12
|
+
|
|
13
|
+
const scorecardMeasure = z.object({
|
|
14
|
+
id: z.string(),
|
|
15
|
+
unit: z.enum(['NUMBER', 'PERCENTAGE']).optional(),
|
|
16
|
+
})
|
|
17
|
+
|
|
18
|
+
const ScorecardMeasuresSchema = z.array(scorecardMeasure).length(1, 'Measure must contain a single item')
|
|
19
|
+
|
|
20
|
+
const ScorecardSchema = z.object({
|
|
21
|
+
...DashboardVisualisationSchema.shape,
|
|
22
|
+
type: z.literal('scorecard'),
|
|
23
|
+
display: z.string(),
|
|
24
|
+
description: z.undefined(),
|
|
25
|
+
options: z.object(BucketOptionsSchema.shape).optional(),
|
|
26
|
+
columns: z.object({
|
|
27
|
+
...DashboardColumns.shape,
|
|
28
|
+
keys: z.array(scorecardKey).min(1),
|
|
29
|
+
measures: ScorecardMeasuresSchema,
|
|
30
|
+
}),
|
|
31
|
+
})
|
|
32
|
+
|
|
33
|
+
export default {
|
|
34
|
+
ScorecardSchema,
|
|
35
|
+
ScorecardMeasuresSchema,
|
|
36
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";var V=Object.create;var h=Object.defineProperty;var w=Object.getOwnPropertyDescriptor;var T=Object.getOwnPropertyNames;var F=Object.getPrototypeOf,$=Object.prototype.hasOwnProperty;var H=(i,e)=>{for(var t in e)h(i,t,{get:e[t],enumerable:!0})},D=(i,e,t,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of T(e))!$.call(i,s)&&s!==t&&h(i,s,{get:()=>e[s],enumerable:!(r=w(e,s))||r.enumerable});return i};var m=(i,e,t)=>(t=i!=null?V(F(i)):{},D(e||!i||!i.__esModule?h(t,"default",{value:i,enumerable:!0}):t,i)),N=i=>D(h({},"__esModule",{value:!0}),i);var E={};H(E,{ScorecardGroupVisualisation:()=>f,default:()=>M});module.exports=N(E);var y=m(require("../../../utils/datasetHelper")),g=m(require("../../_charts/chart/buckets/Buckets")),K=m(require("../scorecard/Scorecard")),S=m(require("./validate"));class f{constructor(){this.buckets=[];this.valueKey="";this.titleKey="";this.responseData=[];this.withDefinition=e=>(this.definition=S.default.ScorecardGroupSchema.parse(e),this.init(),this);this.withData=e=>(this.responseData=e,this.dataset=this.scoreCardBuilder.getDataset(this.definition,this.responseData),this.initBuckets(this.responseData,this.valueKey),this.initGroupVars(),this);this.init=()=>{this.id=this.definition.id,this.measures=this.definition.columns.measures,this.keys=this.definition.columns.keys,this.options=this.definition.options,this.valueKey=this.measures[0].id,this.titleColumn={display:this.definition.display||"",id:this.valueKey},this.unit=this.definition.columns.measures[0].unit?this.definition.columns.measures[0].unit:void 0};this.initBuckets=(e,t)=>{(this.options?.buckets||this.options?.useRagColour)&&(this.bucketsHelper=new g.default(e,this.definition,t,!1,this.scoreCardBuilder.ragColours),this.buckets=this.bucketsHelper.getBuckets())};this.initGroupVars=()=>{this.groupKey=y.default.getGroupKey(this.dataset.latest,this.keys||[]),this.groupKeyId=this.groupKey?.id,this.groupKeyDisplay=this.groupKey?.display,this.valueColumn=this.measures.find(e=>e.displayValue),this.valueColumn&&(this.valueKey=this.valueColumn?.id,this.titleColumn=this.measures.find(e=>e.display||e.display===""),this.titleKey=this.titleColumn?.id||"")};this.createScorecardGroupFromColumns=()=>{const{latest:e,earliest:t,latestTs:r,earliestTs:s}=this.dataset;return e.map((o,u)=>({title:this.createGroupTitle(o),scorecards:Object.keys(o).filter(a=>a!==this.groupKeyId).map(a=>{const c=this.measures.find(R=>R.id===a)?.display||a,p=o[a],{raw:d,rag:l}=p,v=Number(d),G=l!==void 0?Number(l):void 0;this.initBuckets([o],a);const b=`${r}`,C=`${s}`,k=t[u][a]?.raw,B=this.scoreCardBuilder.setRagScore(v,G,this.buckets,this.bucketsHelper);return this.scoreCardBuilder.createScorecardData({id:this.id,title:c,value:v,rag:B,prevVal:k,valueFor:b,valueFrom:C})})}))};this.createScorecardGroupFromList=()=>{const{latest:e,earliest:t}=this.dataset;return[{title:"",scorecards:e.map((r,s)=>{const o=this.getScorecardValues(r),u=t[s][this.valueKey].raw;return this.scoreCardBuilder.createScorecardData({...o,prevVal:u})})}]};this.createScorecardGroupFromListWithGroups=()=>{const{latest:e,earliest:t}=this.dataset;let r=y.default.groupRowsByKey(t,this.groupKeyId),s=y.default.groupRowsByKey(e,this.groupKeyId);return this.groupKeyId===this.titleKey&&(s=[s.flat()],r=[r.flat()]),s.map((u,a)=>({title:this.groupKeyDisplay?`By ${this.groupKeyDisplay}`:"",scorecards:u.map((n,c)=>{const p=this.getScorecardValues(n),l=r[a][c][this.valueKey]?.raw;return this.scoreCardBuilder.createScorecardData({...p,prevVal:l})})}))};this.getScorecardValues=e=>{const{latestTs:t,earliestTs:r}=this.dataset,s=`${this.titleColumn?.display} ${e[this.titleKey].raw}`,o=e[this.valueKey],{raw:u,rag:a}=o,n=Number(u),c=a!==void 0?Number(a):void 0;this.initBuckets([e],this.valueKey);const p=`${t}`,d=`${r}`;return{id:this.id,title:s,value:n,rag:this.scoreCardBuilder.setRagScore(n,c,this.buckets,this.bucketsHelper),valueFor:p,valueFrom:d}};this.createGroupTitle=e=>{const t=this.groupKeyId?`${e[this.groupKeyId]?.raw}`:"";return this.groupKeyDisplay&&this.groupKeyDisplay.length?`${this.groupKeyDisplay}: ${t}`:t};this.build=()=>{let e;return this.valueColumn?this.groupKey?e=this.createScorecardGroupFromListWithGroups():e=this.createScorecardGroupFromList():e=this.createScorecardGroupFromColumns(),e};this.scoreCardBuilder=new K.default}}var M=f;0&&(module.exports={ScorecardGroupVisualisation});
|
|
2
|
+
//# sourceMappingURL=ScorecardGroup.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../src/dpr/components/_dashboards/scorecard-group/ScorecardGroup.ts"],
|
|
4
|
+
"sourcesContent": ["/* eslint-disable prefer-destructuring */\nimport { DashboardDataResponse } from '../../../types/Metrics'\nimport DatasetHelper from '../../../utils/datasetHelper'\nimport { ScorecardDataset, ScorecardGroup } from '../scorecard/types'\nimport Buckets from '../../_charts/chart/buckets/Buckets'\nimport { components } from '../../../types/api'\nimport ScorecardVisualisation from '../scorecard/Scorecard'\nimport { ScorecardGroupDefinitionType, ScorecardGroupDefinitionMeasure } from './types'\nimport { DashboardVisualisationBucket } from '../dashboard-visualisation/types'\nimport ScorecardGroupSchemas from './validate'\n\nclass ScorecardGroupVisualisation {\n private definition!: ScorecardGroupDefinitionType\n\n private id!: string\n\n private measures!: ScorecardGroupDefinitionType['columns']['measures']\n\n private keys!: ScorecardGroupDefinitionType['columns']['keys']\n\n private options!: ScorecardGroupDefinitionType['options']\n\n private dataset!: ScorecardDataset\n\n private groupKey: ScorecardGroupDefinitionMeasure | undefined\n\n private groupKeyId: string | undefined\n\n private groupKeyDisplay: string | undefined\n\n private bucketsHelper: Buckets | undefined\n\n private buckets: DashboardVisualisationBucket[] = []\n\n private valueColumn: ScorecardGroupDefinitionMeasure | undefined\n\n private valueKey = ''\n\n private titleColumn: ScorecardGroupDefinitionMeasure | undefined\n\n private titleKey = ''\n\n private unit: 'NUMBER' | 'PERCENTAGE' | undefined\n\n responseData: DashboardDataResponse[] = []\n\n scoreCardBuilder: ScorecardVisualisation\n\n constructor() {\n this.scoreCardBuilder = new ScorecardVisualisation()\n }\n\n withDefinition = (definition: components['schemas']['DashboardVisualisationDefinition']) => {\n this.definition = ScorecardGroupSchemas.ScorecardGroupSchema.parse(definition)\n this.init()\n\n return this\n }\n\n withData = (responseData: DashboardDataResponse[]) => {\n this.responseData = responseData\n this.dataset = this.scoreCardBuilder.getDataset(this.definition, this.responseData)\n this.initBuckets(this.responseData, this.valueKey)\n this.initGroupVars()\n return this\n }\n\n private init = () => {\n this.id = this.definition.id\n this.measures = this.definition.columns.measures\n this.keys = this.definition.columns.keys\n this.options = this.definition.options\n this.valueKey = this.measures[0].id\n this.titleColumn = { display: this.definition.display || '', id: this.valueKey }\n this.unit = this.definition.columns.measures[0].unit ? this.definition.columns.measures[0].unit : undefined\n }\n\n private initBuckets = (responseData: DashboardDataResponse[], valueKey: string) => {\n if (this.options?.buckets || this.options?.useRagColour) {\n this.bucketsHelper = new Buckets(responseData, this.definition, valueKey, false, this.scoreCardBuilder.ragColours)\n this.buckets = this.bucketsHelper.getBuckets()\n }\n }\n\n private initGroupVars = () => {\n this.groupKey = DatasetHelper.getGroupKey(\n this.dataset.latest,\n <Array<components['schemas']['DashboardVisualisationColumnDefinition']>>this.keys || [],\n )\n this.groupKeyId = this.groupKey?.id\n this.groupKeyDisplay = this.groupKey?.display\n\n this.valueColumn = this.measures.find((col) => col.displayValue)\n if (this.valueColumn) {\n this.valueKey = this.valueColumn?.id\n this.titleColumn = this.measures.find((col) => {\n return col.display || col.display === ''\n })\n this.titleKey = this.titleColumn?.id || ''\n }\n }\n\n private createScorecardGroupFromColumns = () => {\n const { latest, earliest, latestTs, earliestTs } = this.dataset\n\n return latest.map((row, rowIndex) => {\n return {\n title: this.createGroupTitle(row),\n scorecards: Object.keys(row)\n .filter((colId) => colId !== this.groupKeyId)\n .map((colId) => {\n const measure = this.measures.find((m) => m.id === colId)\n const title = measure?.display || colId\n const rowCol = row[colId]\n const { raw, rag } = rowCol\n const value = Number(raw)\n\n const ragValue = rag !== undefined ? Number(rag) : undefined\n this.initBuckets([row], colId)\n\n const valueFor = `${latestTs}`\n const valueFrom = `${earliestTs}`\n\n const comparisonRow = earliest[rowIndex]\n const prevVal = comparisonRow[colId]?.raw\n const ragScore = this.scoreCardBuilder.setRagScore(value, ragValue, this.buckets, this.bucketsHelper)\n\n return this.scoreCardBuilder.createScorecardData({\n id: this.id,\n title,\n value,\n rag: ragScore,\n prevVal,\n valueFor,\n valueFrom,\n })\n }),\n }\n })\n }\n\n private createScorecardGroupFromList = (): ScorecardGroup[] => {\n const { latest, earliest } = this.dataset\n return [\n {\n title: '',\n scorecards: latest.map((row: DashboardDataResponse, index: number) => {\n const values = this.getScorecardValues(row)\n const prevVal = earliest[index][this.valueKey].raw\n return this.scoreCardBuilder.createScorecardData({\n ...values,\n prevVal,\n })\n }),\n },\n ]\n }\n\n private createScorecardGroupFromListWithGroups = () => {\n const { latest, earliest } = this.dataset\n\n let earliestGroupedByKey = DatasetHelper.groupRowsByKey(earliest, <string>this.groupKeyId)\n let latestGroupedByKey = DatasetHelper.groupRowsByKey(latest, <string>this.groupKeyId)\n if (this.groupKeyId === this.titleKey) {\n latestGroupedByKey = [latestGroupedByKey.flat()]\n earliestGroupedByKey = [earliestGroupedByKey.flat()]\n }\n\n const scorecardGroup = latestGroupedByKey.map((group, groupIndex) => {\n return {\n title: this.groupKeyDisplay ? `By ${this.groupKeyDisplay}` : '',\n scorecards: group.map((row, rowIndex) => {\n const values = this.getScorecardValues(row)\n const comparisonRow = earliestGroupedByKey[groupIndex][rowIndex]\n const prevVal = comparisonRow[this.valueKey]?.raw\n\n return this.scoreCardBuilder.createScorecardData({\n ...values,\n prevVal,\n })\n }),\n }\n })\n\n return scorecardGroup\n }\n\n private getScorecardValues = (row: DashboardDataResponse) => {\n const { latestTs, earliestTs } = this.dataset\n const title = `${this.titleColumn?.display} ${row[this.titleKey].raw}`\n const rowCol = row[this.valueKey]\n const { raw, rag: ragScore } = rowCol\n const value = Number(raw)\n const rag = ragScore !== undefined ? Number(ragScore) : undefined\n this.initBuckets([row], this.valueKey)\n const valueFor = `${latestTs}`\n const valueFrom = `${earliestTs}`\n\n return {\n id: this.id,\n title,\n value,\n rag: this.scoreCardBuilder.setRagScore(value, rag, this.buckets, this.bucketsHelper),\n valueFor,\n valueFrom,\n }\n }\n\n private createGroupTitle = (row: DashboardDataResponse) => {\n const title = this.groupKeyId ? `${row[this.groupKeyId]?.raw}` : ''\n return this.groupKeyDisplay && this.groupKeyDisplay.length ? `${this.groupKeyDisplay}: ${title}` : title\n }\n\n build = () => {\n let scorecardGroup: ScorecardGroup[]\n if (!this.valueColumn) {\n scorecardGroup = this.createScorecardGroupFromColumns()\n } else if (this.groupKey) {\n scorecardGroup = this.createScorecardGroupFromListWithGroups()\n } else {\n scorecardGroup = this.createScorecardGroupFromList()\n }\n return scorecardGroup\n }\n}\n\nexport { ScorecardGroupVisualisation }\nexport default ScorecardGroupVisualisation\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["ScorecardGroup_exports", "__export", "ScorecardGroupVisualisation", "ScorecardGroup_default", "__toCommonJS", "import_datasetHelper", "import_Buckets", "import_Scorecard", "import_validate", "definition", "ScorecardGroupSchemas", "responseData", "valueKey", "Buckets", "DatasetHelper", "col", "latest", "earliest", "latestTs", "earliestTs", "row", "rowIndex", "colId", "title", "m", "rowCol", "raw", "rag", "value", "ragValue", "valueFor", "valueFrom", "prevVal", "ragScore", "index", "values", "earliestGroupedByKey", "latestGroupedByKey", "group", "groupIndex", "scorecardGroup", "ScorecardVisualisation"]
|
|
7
|
+
}
|