@ministryofjustice/hmpps-digital-prison-reporting-frontend 4.20.2 → 4.21.1
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/_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/types.d.js.map +1 -1
- package/dpr/components/_filters/types.d.ts +6 -4
- 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/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/utils/ErrorHandler.js +1 -1
- package/dpr/utils/ErrorHandler.js.map +3 -3
- package/dpr/utils/ErrorHandler.ts +16 -0
- 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
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../../src/dpr/components/_charts/chart/line-timeseries/LineTimeseriesChart.ts"],
|
|
4
|
+
"sourcesContent": ["/* eslint-disable prefer-destructuring */\nimport {\n DashboardVisualisationType,\n DashboardVisualisationData,\n} from '../../../_dashboards/dashboard-visualisation/types'\nimport { components } from '../../../../types/api'\nimport { LineTimeseriesDefinitionType } from './types'\nimport LineTimeseriesChartSchemas from './validate'\nimport TimeseriesChart from '../ChartTimeseries'\nimport LineChart from '../line/LineChart'\n\nclass LineTimeseriesChart extends TimeseriesChart {\n private definition!: LineTimeseriesDefinitionType\n\n private lineChartBuilder: LineChart = new LineChart()\n\n withDefinition = (definition: components['schemas']['DashboardVisualisationDefinition']) => {\n this.definition = LineTimeseriesChartSchemas.LineTimeseriesSchema.parse(definition)\n this.initFromDefinition(this.definition)\n return this\n }\n\n build = (): DashboardVisualisationData => {\n this.buildDatasets()\n this.datasets = this.lineChartBuilder.augmentDataset(this.datasets)\n this.setStyles()\n this.config = this.lineChartBuilder.setBespokeOptions()\n\n return {\n type: DashboardVisualisationType.LINE,\n options: {\n unit: this.unit,\n timeseries: true,\n },\n data: {\n labels: this.labels,\n datasets: this.datasets,\n config: this.config,\n partialDate: this.partialDate,\n },\n }\n }\n\n private setStyles = () => {\n this.datasets = this.datasets.map((set, datasetIndex) => {\n const colour = this.hexColours[datasetIndex]\n return {\n ...set,\n backgroundColor: colour,\n borderColor: colour,\n }\n })\n }\n}\n\nexport { LineTimeseriesChart }\nexport default LineTimeseriesChart\n"],
|
|
5
|
+
"mappings": "0jBAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,yBAAAE,EAAA,YAAAC,IAAA,eAAAC,EAAAJ,GACA,IAAAK,EAGO,8DAGPC,EAAuC,yBACvCC,EAA4B,iCAC5BC,EAAsB,gCAEtB,MAAMN,UAA4B,EAAAO,OAAgB,CAAlD,kCAGE,KAAQ,iBAA8B,IAAI,EAAAC,QAE1C,oBAAkBC,IAChB,KAAK,WAAa,EAAAC,QAA2B,qBAAqB,MAAMD,CAAU,EAClF,KAAK,mBAAmB,KAAK,UAAU,EAChC,MAGT,WAAQ,KACN,KAAK,cAAc,EACnB,KAAK,SAAW,KAAK,iBAAiB,eAAe,KAAK,QAAQ,EAClE,KAAK,UAAU,EACf,KAAK,OAAS,KAAK,iBAAiB,kBAAkB,EAE/C,CACL,KAAM,6BAA2B,KACjC,QAAS,CACP,KAAM,KAAK,KACX,WAAY,EACd,EACA,KAAM,CACJ,OAAQ,KAAK,OACb,SAAU,KAAK,SACf,OAAQ,KAAK,OACb,YAAa,KAAK,WACpB,CACF,GAGF,KAAQ,UAAY,IAAM,CACxB,KAAK,SAAW,KAAK,SAAS,IAAI,CAACE,EAAKC,IAAiB,CACvD,MAAMC,EAAS,KAAK,WAAWD,CAAY,EAC3C,MAAO,CACL,GAAGD,EACH,gBAAiBE,EACjB,YAAaA,CACf,CACF,CAAC,CACH,EACF,CAGA,IAAOZ,EAAQD",
|
|
6
|
+
"names": ["LineTimeseriesChart_exports", "__export", "LineTimeseriesChart", "LineTimeseriesChart_default", "__toCommonJS", "import_types", "import_validate", "import_ChartTimeseries", "import_LineChart", "TimeseriesChart", "LineChart", "definition", "LineTimeseriesChartSchemas", "set", "datasetIndex", "colour"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/* eslint-disable prefer-destructuring */
|
|
2
|
+
import {
|
|
3
|
+
DashboardVisualisationType,
|
|
4
|
+
DashboardVisualisationData,
|
|
5
|
+
} from '../../../_dashboards/dashboard-visualisation/types'
|
|
6
|
+
import { components } from '../../../../types/api'
|
|
7
|
+
import { LineTimeseriesDefinitionType } from './types'
|
|
8
|
+
import LineTimeseriesChartSchemas from './validate'
|
|
9
|
+
import TimeseriesChart from '../ChartTimeseries'
|
|
10
|
+
import LineChart from '../line/LineChart'
|
|
11
|
+
|
|
12
|
+
class LineTimeseriesChart extends TimeseriesChart {
|
|
13
|
+
private definition!: LineTimeseriesDefinitionType
|
|
14
|
+
|
|
15
|
+
private lineChartBuilder: LineChart = new LineChart()
|
|
16
|
+
|
|
17
|
+
withDefinition = (definition: components['schemas']['DashboardVisualisationDefinition']) => {
|
|
18
|
+
this.definition = LineTimeseriesChartSchemas.LineTimeseriesSchema.parse(definition)
|
|
19
|
+
this.initFromDefinition(this.definition)
|
|
20
|
+
return this
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
build = (): DashboardVisualisationData => {
|
|
24
|
+
this.buildDatasets()
|
|
25
|
+
this.datasets = this.lineChartBuilder.augmentDataset(this.datasets)
|
|
26
|
+
this.setStyles()
|
|
27
|
+
this.config = this.lineChartBuilder.setBespokeOptions()
|
|
28
|
+
|
|
29
|
+
return {
|
|
30
|
+
type: DashboardVisualisationType.LINE,
|
|
31
|
+
options: {
|
|
32
|
+
unit: this.unit,
|
|
33
|
+
timeseries: true,
|
|
34
|
+
},
|
|
35
|
+
data: {
|
|
36
|
+
labels: this.labels,
|
|
37
|
+
datasets: this.datasets,
|
|
38
|
+
config: this.config,
|
|
39
|
+
partialDate: this.partialDate,
|
|
40
|
+
},
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
private setStyles = () => {
|
|
45
|
+
this.datasets = this.datasets.map((set, datasetIndex) => {
|
|
46
|
+
const colour = this.hexColours[datasetIndex]
|
|
47
|
+
return {
|
|
48
|
+
...set,
|
|
49
|
+
backgroundColor: colour,
|
|
50
|
+
borderColor: colour,
|
|
51
|
+
}
|
|
52
|
+
})
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
export { LineTimeseriesChart }
|
|
57
|
+
export default LineTimeseriesChart
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";var m=Object.defineProperty;var t=Object.getOwnPropertyDescriptor;var a=Object.getOwnPropertyNames;var o=Object.prototype.hasOwnProperty;var p=(i,e,n,s)=>{if(e&&typeof e=="object"||typeof e=="function")for(let r of a(e))!o.call(i,r)&&r!==n&&m(i,r,{get:()=>e[r],enumerable:!(s=t(e,r))||s.enumerable});return i};var f=i=>p(m({},"__esModule",{value:!0}),i);var h={};module.exports=f(h);
|
|
2
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../../src/dpr/components/_charts/chart/line-timeseries/types.ts"],
|
|
4
|
+
"sourcesContent": ["import z from 'zod'\nimport LineTimeseriesChartSchemas from './validate'\n\nexport type LineTimeseriesDefinitionType = z.infer<typeof LineTimeseriesChartSchemas.LineTimeseriesSchema>\nexport type LineTimeseriesDefinitionMeasure = z.infer<typeof LineTimeseriesChartSchemas.LineTimeseriesMeasureSchema>\n"],
|
|
5
|
+
"mappings": "+WAAA,IAAAA,EAAA,kBAAAC,EAAAD",
|
|
6
|
+
"names": ["types_exports", "__toCommonJS"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import z from 'zod'
|
|
2
|
+
import LineTimeseriesChartSchemas from './validate'
|
|
3
|
+
|
|
4
|
+
export type LineTimeseriesDefinitionType = z.infer<typeof LineTimeseriesChartSchemas.LineTimeseriesSchema>
|
|
5
|
+
export type LineTimeseriesDefinitionMeasure = z.infer<typeof LineTimeseriesChartSchemas.LineTimeseriesMeasureSchema>
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";var n=Object.defineProperty;var l=Object.getOwnPropertyDescriptor;var c=Object.getOwnPropertyNames;var p=Object.prototype.hasOwnProperty;var h=(i,s)=>{for(var a in s)n(i,a,{get:s[a],enumerable:!0})},u=(i,s,a,r)=>{if(s&&typeof s=="object"||typeof s=="function")for(let t of c(s))!p.call(i,t)&&t!==a&&n(i,t,{get:()=>s[t],enumerable:!(r=l(s,t))||r.enumerable});return i};var b=i=>u(n({},"__esModule",{value:!0}),i);var f={};h(f,{default:()=>T});module.exports=b(f);var e=require("zod"),o=require("../../../_dashboards/dashboard-visualisation/Validate");const m=e.z.object({id:e.z.string(),display:e.z.string().optional(),unit:e.z.enum(["NUMBER","PERCENTAGE"]).optional()}),d=e.z.object({showLatest:e.z.literal(!1)}),j=e.z.object({...o.DashboardVisualisationSchema.shape,display:e.z.string(),type:e.z.literal("line-timeseries"),options:e.z.object(d.shape).optional(),columns:e.z.object({...o.DashboardColumns.shape,measures:e.z.array(m).min(1,"Measure must contain at least one item")})}),L={LineTimeseriesMeasureSchema:m,LineTimeseriesSchema:j};var T=L;
|
|
2
|
+
//# sourceMappingURL=validate.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../../src/dpr/components/_charts/chart/line-timeseries/validate.ts"],
|
|
4
|
+
"sourcesContent": ["import { z } from 'zod'\nimport { DashboardVisualisationSchema, DashboardColumns } from '../../../_dashboards/dashboard-visualisation/Validate'\n\nconst LineTimeseriesMeasureSchema = z.object({\n id: z.string(),\n display: z.string().optional(),\n unit: z.enum(['NUMBER', 'PERCENTAGE']).optional(),\n})\n\nconst LineTimeseriesOptions = z.object({\n showLatest: z.literal(false),\n})\n\nconst LineTimeseriesSchema = z.object({\n ...DashboardVisualisationSchema.shape,\n display: z.string(),\n type: z.literal('line-timeseries'),\n options: z.object(LineTimeseriesOptions.shape).optional(),\n columns: z.object({\n ...DashboardColumns.shape,\n measures: z.array(LineTimeseriesMeasureSchema).min(1, 'Measure must contain at least one item'),\n }),\n})\n\nconst LineTimeseriesChartSchemas = {\n LineTimeseriesMeasureSchema,\n LineTimeseriesSchema,\n}\n\nexport default LineTimeseriesChartSchemas\n"],
|
|
5
|
+
"mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,aAAAE,IAAA,eAAAC,EAAAH,GAAA,IAAAI,EAAkB,eAClBC,EAA+D,iEAE/D,MAAMC,EAA8B,IAAE,OAAO,CAC3C,GAAI,IAAE,OAAO,EACb,QAAS,IAAE,OAAO,EAAE,SAAS,EAC7B,KAAM,IAAE,KAAK,CAAC,SAAU,YAAY,CAAC,EAAE,SAAS,CAClD,CAAC,EAEKC,EAAwB,IAAE,OAAO,CACrC,WAAY,IAAE,QAAQ,EAAK,CAC7B,CAAC,EAEKC,EAAuB,IAAE,OAAO,CACpC,GAAG,+BAA6B,MAChC,QAAS,IAAE,OAAO,EAClB,KAAM,IAAE,QAAQ,iBAAiB,EACjC,QAAS,IAAE,OAAOD,EAAsB,KAAK,EAAE,SAAS,EACxD,QAAS,IAAE,OAAO,CAChB,GAAG,mBAAiB,MACpB,SAAU,IAAE,MAAMD,CAA2B,EAAE,IAAI,EAAG,wCAAwC,CAChG,CAAC,CACH,CAAC,EAEKG,EAA6B,CACjC,4BAAAH,EACA,qBAAAE,CACF,EAEA,IAAON,EAAQO",
|
|
6
|
+
"names": ["validate_exports", "__export", "validate_default", "__toCommonJS", "import_zod", "import_Validate", "LineTimeseriesMeasureSchema", "LineTimeseriesOptions", "LineTimeseriesSchema", "LineTimeseriesChartSchemas"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { z } from 'zod'
|
|
2
|
+
import { DashboardVisualisationSchema, DashboardColumns } from '../../../_dashboards/dashboard-visualisation/Validate'
|
|
3
|
+
|
|
4
|
+
const LineTimeseriesMeasureSchema = z.object({
|
|
5
|
+
id: z.string(),
|
|
6
|
+
display: z.string().optional(),
|
|
7
|
+
unit: z.enum(['NUMBER', 'PERCENTAGE']).optional(),
|
|
8
|
+
})
|
|
9
|
+
|
|
10
|
+
const LineTimeseriesOptions = z.object({
|
|
11
|
+
showLatest: z.literal(false),
|
|
12
|
+
})
|
|
13
|
+
|
|
14
|
+
const LineTimeseriesSchema = z.object({
|
|
15
|
+
...DashboardVisualisationSchema.shape,
|
|
16
|
+
display: z.string(),
|
|
17
|
+
type: z.literal('line-timeseries'),
|
|
18
|
+
options: z.object(LineTimeseriesOptions.shape).optional(),
|
|
19
|
+
columns: z.object({
|
|
20
|
+
...DashboardColumns.shape,
|
|
21
|
+
measures: z.array(LineTimeseriesMeasureSchema).min(1, 'Measure must contain at least one item'),
|
|
22
|
+
}),
|
|
23
|
+
})
|
|
24
|
+
|
|
25
|
+
const LineTimeseriesChartSchemas = {
|
|
26
|
+
LineTimeseriesMeasureSchema,
|
|
27
|
+
LineTimeseriesSchema,
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
export default LineTimeseriesChartSchemas
|
|
@@ -1,4 +1,8 @@
|
|
|
1
|
-
{% macro dprChart(id, type, chartData,
|
|
1
|
+
{% macro dprChart(id, type, chartData, options) %}
|
|
2
|
+
{% set timeseries = options.timeseries %}
|
|
3
|
+
{% set unit = options.unit %}
|
|
4
|
+
{% set height = options.height %}
|
|
5
|
+
|
|
2
6
|
<div id="{{ id }}-chart-wrapper"
|
|
3
7
|
class="dpr-chart dpr-{{ type }}-chart"
|
|
4
8
|
data-dpr-module="{{ type }}-chart"
|
|
@@ -6,6 +10,9 @@
|
|
|
6
10
|
data-dpr-chart-type="{{ type }}"
|
|
7
11
|
data-dpr-chart-unit="{{ unit }}"
|
|
8
12
|
data-dpr-chart-timeseries="{{ timeseries }}"
|
|
13
|
+
{% if options.height %}
|
|
14
|
+
style="height: {{ height }}px"
|
|
15
|
+
{% endif %}
|
|
9
16
|
>
|
|
10
17
|
<div class="dpr-canvas-wrapper"><canvas id="{{ id }}" class="chart-canvas"></canvas></div>
|
|
11
18
|
<div id="js-legend-{{ id }}" class="dpr-chart-legend"></div>
|
|
@@ -10,23 +10,24 @@
|
|
|
10
10
|
|
|
11
11
|
{% set type = chartData.type %}
|
|
12
12
|
{% set data = chartData.data %}
|
|
13
|
-
|
|
14
|
-
{
|
|
13
|
+
|
|
14
|
+
{# Options #}
|
|
15
|
+
{% set options = chartData.options %}
|
|
15
16
|
|
|
16
17
|
{% if chartData %}
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
18
|
+
{% set chartHtml %}
|
|
19
|
+
{{ dprChart(id, type, data, options) }}
|
|
20
|
+
{% endset -%}
|
|
21
|
+
|
|
22
|
+
{% set tabContent = {
|
|
23
|
+
label: type | capitalize,
|
|
24
|
+
id: id + "_" + type + "_tab",
|
|
25
|
+
panel: {
|
|
26
|
+
html: chartHtml
|
|
27
|
+
}
|
|
28
|
+
} %}
|
|
28
29
|
|
|
29
|
-
|
|
30
|
+
{% set tabItems = (tabItems.push(tabContent), tabItems) %}
|
|
30
31
|
{% endif %}
|
|
31
32
|
|
|
32
33
|
{% if tableData %}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";var
|
|
1
|
+
"use strict";var N=Object.create;var p=Object.defineProperty;var A=Object.getOwnPropertyDescriptor;var G=Object.getOwnPropertyNames;var P=Object.getPrototypeOf,H=Object.prototype.hasOwnProperty;var O=(a,t)=>{for(var e in t)p(a,e,{get:t[e],enumerable:!0})},C=(a,t,e,s)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of G(t))!H.call(a,o)&&o!==e&&p(a,o,{get:()=>t[o],enumerable:!(s=A(t,o))||s.enumerable});return a};var u=(a,t,e)=>(e=a!=null?N(P(a)):{},C(t||!a||!a.__esModule?p(e,"default",{value:a,enumerable:!0}):e,a)),_=a=>C(p({},"__esModule",{value:!0}),a);var $={};O($,{createChart:()=>x,createTimeseriesCharts:()=>L,default:()=>Y});module.exports=_($);var y=u(require("dayjs")),T=u(require("dayjs/plugin/weekOfYear")),D=u(require("../../utils/datasetHelper")),b=u(require("../_dashboards/dashboard-list/utils")),V=require("../_inputs/granular-date-range/types"),g=u(require("./chart/heatmap/HeatmapChart")),k=u(require("./chart/bar/BarChart")),f=require("../_dashboards/dashboard-visualisation/types"),M=u(require("./chart/doughnut/DoughnutChart")),E=u(require("./chart/line/LineChart")),I=u(require("./chart/line-timeseries/LineTimeseriesChart")),S=u(require("./chart/bar-timeseries/BarTimeseriesChart"));y.default.extend(T.default);const x=(a,t,e)=>{let s,o,r;const{dataSetRows:i,snapshotData:l}=j(a,t);if(i.length){switch(e){case f.DashboardVisualisationType.BAR:o=new k.default().withDefinition(a).withData(l).build();break;case f.DashboardVisualisationType.DONUT:o=new M.default().withDefinition(a).withData(l).build();break;case f.DashboardVisualisationType.LINE:o=new E.default().withDefinition(a).withData(l).build();break;default:break}s=U(a,i),r=R(a,i)}return{details:r,table:s,chart:o}},L=(a,t,e,s,o)=>{let r,i,l,d=V.Granularity.DAILY;s&&Object.keys(s).forEach(h=>{h.includes("granularity")&&(d=s[h])});const{latestData:m,dataSetRows:c,timeseriesData:n}=v(a,t);if(c.length){switch(e){case f.DashboardVisualisationType.MATRIX_TIMESERIES:i=new g.default().withDefinition(a).withGranularity(d).withData(n).build();break;case f.DashboardVisualisationType.LINE_TIMESERIES:i=new I.default().withDefinition(a).withData(n).withPartialDate(o).build();break;case f.DashboardVisualisationType.BAR_TIMESERIES:i=new S.default().withDefinition(a).withData(n).withPartialDate(o).build();break;default:break}r=W(a,n),l=R(a,m,!0)}return{details:l,table:r,chart:i}},j=(a,t)=>{const e=D.default.getLastestDataset(t),s=D.default.getDatasetRows(a,e),o=D.default.filterRowsByDisplayColumns(a,s,!0);return{dataSetRows:s,snapshotData:o}},v=(a,t)=>{const e=D.default.getLastestDataset(t),s=D.default.getDatasetRows(a,t),o=D.default.filterRowsByDisplayColumns(a,s,!0);return{latestData:e,dataSetRows:s,timeseriesData:o}},R=(a,t,e=!1)=>{const s=[],o=F(a,t,e);return t[0]?.ts?.raw&&s.push({label:"Values for:",value:t[0]?.ts.raw}),{meta:s,headlines:o}},F=(a,t,e=!1)=>{const s=[],{columns:o}=a,{measures:r}=o,i=!!r.find(n=>n.axis);let l,d,m,c;if(e){if(d=r.find(n=>n.id!=="ts"),d){const{id:n}=d,{raw:h}=t[0][n];c=`${t[0].ts.raw}`,m=h?Number(h):void 0,m&&(l={label:c,value:m})}}else if(d=i?r.find(n=>n.axis&&n.axis==="y"):r[0],d){const n=d.display?.toLowerCase();c=n?`Total ${n}`:"Total",m=t.reduce((h,B)=>{if(d){const{id:J}=d,{raw:w}=B[J];if(w)return h+Number(w)}return h},0),l={label:c,value:m}}return l&&s.push(l),s},U=(a,t)=>{const{columns:e}=a,{measures:s}=e,i=[...e.keys||[],...s].map(m=>({text:m.display||""})),l=D.default.filterRowsByDisplayColumns(a,t,!0),d=b.default.createTableRows(l);return{head:i,rows:d}},W=(a,t)=>{const{columns:e}=a,{keys:s,measures:o}=e;let r=t.flat(),i=[...o];if(t.length>1){const m=i.findIndex(h=>h.id==="ts"),c=i[m];i.splice(m,1),i=[...s?s.filter(h=>h.id!=="ts"):[],...i],i.unshift(c)}else r=D.default.filterRowsByDisplayColumns(a,r);const l=i.map(m=>({text:m.display})),d=b.default.createTableRows(r);return{head:l,rows:d}};var Y={createChart:x,createTimeseriesCharts:L};0&&(module.exports={createChart,createTimeseriesCharts});
|
|
2
2
|
//# sourceMappingURL=utils.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/dpr/components/_charts/utils.ts"],
|
|
4
|
-
"sourcesContent": ["import dayjs from 'dayjs'\nimport weekOfYear from 'dayjs/plugin/weekOfYear'\nimport { ChartDetails, ChartMetaData } from '../../types/Charts'\nimport { DashboardDataResponse } from '../../types/Metrics'\nimport DatasetHelper from '../../utils/datasetHelper'\nimport DashboardListUtils from '../_dashboards/dashboard-list/utils'\nimport { Granularity } from '../_inputs/granular-date-range/types'\nimport HeatmapChart from './chart/heatmap/HeatmapChart'\nimport { components } from '../../types/api'\nimport {\n DashboardVisualisationData,\n DashboardVisualisationDataSet,\n DashboardVisualisatonCardData,\n MoJTable,\n} from '../_dashboards/dashboard-visualisation/types'\n\ndayjs.extend(weekOfYear)\n\nexport const createChart = (\n chartDefinition: components['schemas']['DashboardVisualisationDefinition'],\n rawData: DashboardDataResponse[],\n): DashboardVisualisatonCardData | undefined => {\n let table: MoJTable | undefined\n let chart: DashboardVisualisationData | undefined\n let details: ChartDetails | undefined\n\n const { dataSetRows, snapshotData } = getDataForSnapshotCharts(chartDefinition, rawData)\n if (dataSetRows.length) {\n chart = createSnapshotChart(chartDefinition, snapshotData)\n table = createSnapshotTable(chartDefinition, dataSetRows)\n details = getChartDetails(chartDefinition, dataSetRows)\n }\n\n return {\n details,\n table,\n chart,\n }\n}\n\nexport const createTimeseriesCharts = (\n chartDefinition: components['schemas']['DashboardVisualisationDefinition'],\n rawData: DashboardDataResponse[],\n): DashboardVisualisatonCardData => {\n let table: MoJTable | undefined\n let chart: DashboardVisualisationData | undefined\n let details: ChartDetails | undefined\n\n const { latestData, dataSetRows, timeseriesData } = getDataForTimeseriesCharts(chartDefinition, rawData)\n if (dataSetRows.length) {\n chart = createTimeseriesChart(chartDefinition, timeseriesData)\n table = createTimeseriesTable(chartDefinition, timeseriesData)\n details = getChartDetails(chartDefinition, latestData, true)\n }\n return {\n details,\n table,\n chart,\n }\n}\n\nexport const createMatrixChart = (\n chartDefinition: components['schemas']['DashboardVisualisationDefinition'],\n rawData: DashboardDataResponse[],\n query: Record<string, string | string[]>,\n) => {\n let table: MoJTable | undefined\n let chart: DashboardVisualisationData | undefined\n let details: ChartDetails | undefined\n let granularity: Granularity = Granularity.DAILY\n\n Object.keys(query).forEach((key) => {\n if (key.includes('granularity')) {\n granularity = <Granularity>query[key]\n }\n })\n\n const { latestData, dataSetRows, timeseriesData } = getDataForTimeseriesCharts(chartDefinition, rawData)\n if (dataSetRows.length) {\n chart = new HeatmapChart(timeseriesData, granularity, chartDefinition).build()\n table = createTimeseriesTable(chartDefinition, timeseriesData)\n details = getChartDetails(chartDefinition, latestData, true)\n }\n return {\n details,\n table,\n chart,\n }\n}\n\nconst getDataForSnapshotCharts = (\n chartDefinition: components['schemas']['DashboardVisualisationDefinition'],\n rawData: DashboardDataResponse[],\n) => {\n const data = DatasetHelper.getLastestDataset(rawData)\n const dataSetRows = DatasetHelper.getDatasetRows(chartDefinition, data)\n const snapshotData = DatasetHelper.filterRowsByDisplayColumns(chartDefinition, dataSetRows, true)\n\n return {\n dataSetRows,\n snapshotData,\n }\n}\n\nconst getDataForTimeseriesCharts = (\n chartDefinition: components['schemas']['DashboardVisualisationDefinition'],\n rawData: DashboardDataResponse[],\n) => {\n const latestData = DatasetHelper.getLastestDataset(rawData)\n const dataSetRows = DatasetHelper.getDatasetRows(chartDefinition, rawData)\n const timeseriesData = DatasetHelper.filterRowsByDisplayColumns(chartDefinition, dataSetRows, true)\n\n return {\n latestData,\n dataSetRows,\n timeseriesData,\n }\n}\n\nconst getChartDetails = (\n chartDefinition: components['schemas']['DashboardVisualisationDefinition'],\n data: DashboardDataResponse[],\n timeseries = false,\n): ChartDetails => {\n const meta: ChartMetaData[] = []\n const headlines: ChartMetaData[] = createHeadlines(chartDefinition, data, timeseries)\n\n if (data[0]?.['ts']?.raw) {\n meta.push({\n label: 'Values for:',\n value: data[0]?.['ts'].raw,\n })\n }\n\n return {\n meta,\n headlines,\n }\n}\n\nconst createHeadlines = (\n chartDefinition: components['schemas']['DashboardVisualisationDefinition'],\n data: DashboardDataResponse[],\n timeseries = false,\n) => {\n const headlines: ChartMetaData[] = []\n const { columns } = chartDefinition\n const { measures } = columns\n const isListChart = !!measures.find((col) => col.axis)\n let headline: ChartMetaData | undefined\n\n let headlineColumn: components['schemas']['DashboardVisualisationColumnDefinition'] | undefined\n let value: number | undefined\n let label: string\n\n if (timeseries) {\n headlineColumn = measures.find((col) => col.id !== 'ts')\n if (headlineColumn) {\n const { id } = headlineColumn\n const { raw } = data[0][id]\n label = `${data[0]['ts'].raw}`\n value = raw ? Number(raw) : undefined\n\n if (value) {\n headline = {\n label,\n value,\n }\n }\n }\n } else {\n headlineColumn = !isListChart ? measures[0] : measures.find((col) => col.axis && col.axis === 'y')\n\n if (headlineColumn) {\n const display = headlineColumn.display?.toLowerCase()\n label = display ? `Total ${display}` : 'Total'\n value = data.reduce((acc: number, d: DashboardDataResponse) => {\n if (headlineColumn) {\n const { id } = headlineColumn\n const { raw } = d[id]\n if (raw) {\n return acc + Number(raw)\n }\n }\n return acc\n }, 0)\n\n headline = {\n label,\n value,\n }\n }\n }\n\n if (headline) headlines.push(headline)\n\n return headlines\n}\n\nconst createSnapshotChart = (\n chartDefinition: components['schemas']['DashboardVisualisationDefinition'],\n snapshotData: DashboardDataResponse[],\n): DashboardVisualisationData => {\n const { type, columns } = chartDefinition\n const { measures } = columns\n const isListChart = !!measures.find((col) => col.axis)\n\n let labels: string[]\n let unit\n let datasets: DashboardVisualisationDataSet[]\n\n if (!isListChart) {\n const chart = buildChart(columns, snapshotData)\n labels = chart.labels\n unit = chart.unit\n datasets = chart.datasets\n } else {\n ;({ labels, unit, datasets } = buildChartFromListData(columns, snapshotData))\n }\n\n return {\n type,\n unit,\n data: {\n labels,\n datasets,\n },\n }\n}\n\nconst buildChart = (\n columns: components['schemas']['DashboardVisualisationColumnsDefinition'],\n rawData: DashboardDataResponse[],\n) => {\n const { keys, measures } = columns\n const labels = measures.map((col) => col.display || '')\n const labelId = keys ? (keys[keys.length - 1]?.id as keyof DashboardDataResponse) : undefined\n const unit = measures[0].unit ? measures[0].unit : undefined\n\n const datasets = rawData.map((row) => {\n const label = labelId && row[labelId] ? `${row[labelId].raw}` : 'All'\n const data = measures.map((c) => {\n const rowId = c.id as keyof DashboardDataResponse\n return row[rowId] && row[rowId].raw ? Number(row[rowId].raw) : 0\n })\n const total = data.reduce((acc: number, val: number) => acc + val, 0)\n return { label, data, total } as DashboardVisualisationDataSet\n })\n\n return {\n labels,\n unit,\n datasets,\n }\n}\n\nconst buildChartFromListData = (\n columns: components['schemas']['DashboardVisualisationColumnsDefinition'],\n rawData: DashboardDataResponse[],\n) => {\n const { measures, keys } = columns\n\n const xAxisColumn = measures.find((col) => col.axis === 'x') || measures[0]\n const yAxisColumn = measures.find((col) => col.axis === 'y') || measures[1]\n\n if (!xAxisColumn || !yAxisColumn) {\n throw new Error('No X of Y Axis found in definition')\n }\n\n const unit = yAxisColumn?.unit || undefined\n const groupKey = DatasetHelper.getGroupKey(rawData, keys)\n const groupsData = groupKey ? DatasetHelper.groupRowsByKey(rawData, groupKey.id) : [rawData]\n\n const labels = groupsData.flatMap((gd) => {\n return gd.map((row) => {\n const { id: xId } = xAxisColumn\n const field = row[xId]\n return field ? `${field.raw}` : ''\n })\n })\n\n const datasets: DashboardVisualisationDataSet[] = groupsData.map((groupData) => {\n const data = Array(labels.length)\n groupData.forEach((row) => {\n const { id: yId } = yAxisColumn\n const { id: xId } = xAxisColumn\n const labelField = row[xId]\n const valueField = row[yId]\n const raw = valueField && valueField.raw ? Number(valueField.raw) : 0\n const dataIndex = labels.findIndex((l) => l === labelField.raw)\n if (dataIndex !== -1) {\n data[dataIndex] = Number(raw)\n }\n })\n\n let label = ''\n if (groupKey) {\n const groupKeyId = groupKey.id\n const groupRow = groupData[0]\n label = groupRow && groupRow[groupKeyId] ? `${groupRow[groupKeyId].raw}` : ''\n } else {\n label = yAxisColumn.display || label\n }\n\n return {\n label,\n data,\n total: data.reduce((acc: number, val: number) => acc + val, 0),\n }\n })\n\n return {\n labels,\n unit,\n datasets,\n }\n}\n\nconst createSnapshotTable = (\n chartDefinition: components['schemas']['DashboardVisualisationDefinition'],\n data: DashboardDataResponse[],\n): MoJTable => {\n const { columns } = chartDefinition\n const { measures } = columns\n const keys = columns.keys || []\n\n const headerColumns = [...keys, ...measures]\n const head = headerColumns.map((column) => {\n return { text: column.display || '' }\n })\n\n const filteredRowData = DatasetHelper.filterRowsByDisplayColumns(chartDefinition, data, true)\n const rows = DashboardListUtils.createTableRows(filteredRowData)\n\n return {\n head,\n rows,\n }\n}\n\nconst createTimeseriesChart = (\n chartDefinition: components['schemas']['DashboardVisualisationDefinition'],\n timeseriesData: DashboardDataResponse[],\n): DashboardVisualisationData => {\n const { columns } = chartDefinition\n const { keys, measures } = columns\n\n const unit = measures[0].unit ? measures[0].unit : undefined\n const type = <components['schemas']['DashboardVisualisationDefinition']['type']>chartDefinition.type.split('-')[0]\n const groupKey = DatasetHelper.getGroupKey(timeseriesData, keys)\n const labelId = groupKey?.id as keyof DashboardDataResponse\n\n const timeBlockData = DatasetHelper.groupRowsByTimestamp(timeseriesData)\n const labels = timeBlockData.map((d: DashboardDataResponse[]) => d[0]['ts'].raw as unknown as string)\n const datasetCount = timeBlockData[0].length\n\n const datasets: DashboardVisualisationDataSet[] = []\n for (let index = 0; index < datasetCount; index += 1) {\n const data = timeBlockData.map((timeperiod) => {\n const { raw } = timeperiod[index][measures[1].id]\n return raw ? Number(raw) : 0\n })\n const total = data.reduce((a, c) => a + c, 0)\n const rawValue = timeBlockData[0][index][labelId].raw\n const label = rawValue ? <string>rawValue : ''\n\n datasets.push({\n data,\n label,\n total,\n })\n }\n\n return {\n type,\n unit,\n timeseries: true,\n data: {\n labels,\n datasets,\n },\n }\n}\n\nconst createTimeseriesTable = (\n chartDefinition: components['schemas']['DashboardVisualisationDefinition'],\n timeseriesData: DashboardDataResponse[],\n): MoJTable => {\n const { columns } = chartDefinition\n const { keys, measures } = columns\n\n let flatTimeseriesData = timeseriesData.flat()\n let headerColumns = [...measures]\n\n if (timeseriesData.length > 1) {\n // Add keys as columns as well as measures, and put TS first:\n // Get TS column an remove it from headings\n const timestampIndex = headerColumns.findIndex((m) => m.id === 'ts')\n const timestampCol = headerColumns[timestampIndex]\n headerColumns.splice(timestampIndex, 1)\n // Remove duplicate TS from keys if present and add keys to headings\n const keysWithoutTs = keys ? keys.filter((k) => k.id !== 'ts') : []\n headerColumns = [...keysWithoutTs, ...headerColumns]\n // Add TS column to the start\n headerColumns.unshift(timestampCol)\n } else {\n flatTimeseriesData = DatasetHelper.filterRowsByDisplayColumns(chartDefinition, flatTimeseriesData)\n }\n\n const head = headerColumns.map((column) => {\n return { text: column.display }\n })\n\n const rows = DashboardListUtils.createTableRows(flatTimeseriesData)\n\n return {\n head,\n rows,\n } as MoJTable\n}\n\nexport default {\n createChart,\n createTimeseriesCharts,\n createMatrixChart,\n}\n"],
|
|
5
|
-
"mappings": "0jBAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,iBAAAE,EAAA,
|
|
6
|
-
"names": ["utils_exports", "__export", "createChart", "
|
|
4
|
+
"sourcesContent": ["import dayjs from 'dayjs'\nimport weekOfYear from 'dayjs/plugin/weekOfYear'\nimport { ChartDetails, ChartMetaData } from '../../types/Charts'\nimport { DashboardDataResponse } from '../../types/Metrics'\nimport DatasetHelper from '../../utils/datasetHelper'\nimport DashboardListUtils from '../_dashboards/dashboard-list/utils'\nimport { Granularity } from '../_inputs/granular-date-range/types'\nimport HeatmapChart from './chart/heatmap/HeatmapChart'\nimport BarChart from './chart/bar/BarChart'\nimport { components } from '../../types/api'\nimport {\n DashboardVisualisationData,\n DashboardVisualisationType,\n DashboardVisualisatonCardData,\n MoJTable,\n} from '../_dashboards/dashboard-visualisation/types'\nimport DoughnutChart from './chart/doughnut/DoughnutChart'\nimport LineChart from './chart/line/LineChart'\nimport LineTimeseriesChart from './chart/line-timeseries/LineTimeseriesChart'\nimport BarTimeseriesChart from './chart/bar-timeseries/BarTimeseriesChart'\nimport { PartialDate } from '../_filters/types'\n\ndayjs.extend(weekOfYear)\n\nexport const createChart = (\n chartDefinition: components['schemas']['DashboardVisualisationDefinition'],\n rawData: DashboardDataResponse[],\n type: components['schemas']['DashboardVisualisationDefinition']['type'],\n): DashboardVisualisatonCardData | undefined => {\n let table: MoJTable | undefined\n let chart: DashboardVisualisationData | undefined\n let details: ChartDetails | undefined\n\n const { dataSetRows, snapshotData } = getDataForSnapshotCharts(chartDefinition, rawData)\n if (dataSetRows.length) {\n switch (type) {\n case DashboardVisualisationType.BAR:\n chart = new BarChart().withDefinition(chartDefinition).withData(snapshotData).build()\n break\n case DashboardVisualisationType.DONUT:\n chart = new DoughnutChart().withDefinition(chartDefinition).withData(snapshotData).build()\n break\n case DashboardVisualisationType.LINE:\n chart = new LineChart().withDefinition(chartDefinition).withData(snapshotData).build()\n break\n default:\n break\n }\n\n table = createSnapshotTable(chartDefinition, dataSetRows)\n details = getChartDetails(chartDefinition, dataSetRows)\n }\n\n return {\n details,\n table,\n chart,\n }\n}\n\nexport const createTimeseriesCharts = (\n chartDefinition: components['schemas']['DashboardVisualisationDefinition'],\n rawData: DashboardDataResponse[],\n type: components['schemas']['DashboardVisualisationDefinition']['type'],\n query: Record<string, string | string[]>,\n partialDate?: PartialDate,\n) => {\n let table: MoJTable | undefined\n let chart: DashboardVisualisationData | undefined\n let details: ChartDetails | undefined\n let granularity: Granularity = Granularity.DAILY\n\n if (query) {\n Object.keys(query).forEach((key) => {\n if (key.includes('granularity')) {\n granularity = <Granularity>query[key]\n }\n })\n }\n\n const { latestData, dataSetRows, timeseriesData } = getDataForTimeseriesCharts(chartDefinition, rawData)\n\n if (dataSetRows.length) {\n switch (type) {\n case DashboardVisualisationType.MATRIX_TIMESERIES:\n chart = new HeatmapChart()\n .withDefinition(chartDefinition)\n .withGranularity(granularity)\n .withData(timeseriesData)\n .build()\n break\n case DashboardVisualisationType.LINE_TIMESERIES:\n chart = new LineTimeseriesChart()\n .withDefinition(chartDefinition)\n .withData(timeseriesData)\n .withPartialDate(partialDate)\n .build()\n break\n case DashboardVisualisationType.BAR_TIMESERIES:\n chart = new BarTimeseriesChart()\n .withDefinition(chartDefinition)\n .withData(timeseriesData)\n .withPartialDate(partialDate)\n .build()\n break\n default:\n break\n }\n\n table = createTimeseriesTable(chartDefinition, timeseriesData)\n details = getChartDetails(chartDefinition, latestData, true)\n }\n\n return {\n details,\n table,\n chart,\n }\n}\n\nconst getDataForSnapshotCharts = (\n chartDefinition: components['schemas']['DashboardVisualisationDefinition'],\n rawData: DashboardDataResponse[],\n) => {\n const data = DatasetHelper.getLastestDataset(rawData)\n const dataSetRows = DatasetHelper.getDatasetRows(chartDefinition, data)\n const snapshotData = DatasetHelper.filterRowsByDisplayColumns(chartDefinition, dataSetRows, true)\n\n return {\n dataSetRows,\n snapshotData,\n }\n}\n\nconst getDataForTimeseriesCharts = (\n chartDefinition: components['schemas']['DashboardVisualisationDefinition'],\n rawData: DashboardDataResponse[],\n) => {\n const latestData = DatasetHelper.getLastestDataset(rawData)\n const dataSetRows = DatasetHelper.getDatasetRows(chartDefinition, rawData)\n const timeseriesData = DatasetHelper.filterRowsByDisplayColumns(chartDefinition, dataSetRows, true)\n\n return {\n latestData,\n dataSetRows,\n timeseriesData,\n }\n}\n\nconst getChartDetails = (\n chartDefinition: components['schemas']['DashboardVisualisationDefinition'],\n data: DashboardDataResponse[],\n timeseries = false,\n): ChartDetails => {\n const meta: ChartMetaData[] = []\n const headlines: ChartMetaData[] = createHeadlines(chartDefinition, data, timeseries)\n\n if (data[0]?.['ts']?.raw) {\n meta.push({\n label: 'Values for:',\n value: data[0]?.['ts'].raw,\n })\n }\n\n return {\n meta,\n headlines,\n }\n}\n\nconst createHeadlines = (\n chartDefinition: components['schemas']['DashboardVisualisationDefinition'],\n data: DashboardDataResponse[],\n timeseries = false,\n) => {\n const headlines: ChartMetaData[] = []\n const { columns } = chartDefinition\n const { measures } = columns\n const isListChart = !!measures.find((col) => col.axis)\n let headline: ChartMetaData | undefined\n\n let headlineColumn: components['schemas']['DashboardVisualisationColumnDefinition'] | undefined\n let value: number | undefined\n let label: string\n\n if (timeseries) {\n headlineColumn = measures.find((col) => col.id !== 'ts')\n if (headlineColumn) {\n const { id } = headlineColumn\n const { raw } = data[0][id]\n label = `${data[0]['ts'].raw}`\n value = raw ? Number(raw) : undefined\n\n if (value) {\n headline = {\n label,\n value,\n }\n }\n }\n } else {\n headlineColumn = !isListChart ? measures[0] : measures.find((col) => col.axis && col.axis === 'y')\n\n if (headlineColumn) {\n const display = headlineColumn.display?.toLowerCase()\n label = display ? `Total ${display}` : 'Total'\n value = data.reduce((acc: number, d: DashboardDataResponse) => {\n if (headlineColumn) {\n const { id } = headlineColumn\n const { raw } = d[id]\n if (raw) {\n return acc + Number(raw)\n }\n }\n return acc\n }, 0)\n\n headline = {\n label,\n value,\n }\n }\n }\n\n if (headline) headlines.push(headline)\n\n return headlines\n}\n\nconst createSnapshotTable = (\n chartDefinition: components['schemas']['DashboardVisualisationDefinition'],\n data: DashboardDataResponse[],\n): MoJTable => {\n const { columns } = chartDefinition\n const { measures } = columns\n const keys = columns.keys || []\n\n const headerColumns = [...keys, ...measures]\n const head = headerColumns.map((column) => {\n return { text: column.display || '' }\n })\n\n const filteredRowData = DatasetHelper.filterRowsByDisplayColumns(chartDefinition, data, true)\n const rows = DashboardListUtils.createTableRows(filteredRowData)\n\n return {\n head,\n rows,\n }\n}\n\nconst createTimeseriesTable = (\n chartDefinition: components['schemas']['DashboardVisualisationDefinition'],\n timeseriesData: DashboardDataResponse[],\n): MoJTable => {\n const { columns } = chartDefinition\n const { keys, measures } = columns\n\n let flatTimeseriesData = timeseriesData.flat()\n let headerColumns = [...measures]\n\n if (timeseriesData.length > 1) {\n // Add keys as columns as well as measures, and put TS first:\n // Get TS column an remove it from headings\n const timestampIndex = headerColumns.findIndex((m) => m.id === 'ts')\n const timestampCol = headerColumns[timestampIndex]\n headerColumns.splice(timestampIndex, 1)\n // Remove duplicate TS from keys if present and add keys to headings\n const keysWithoutTs = keys ? keys.filter((k) => k.id !== 'ts') : []\n headerColumns = [...keysWithoutTs, ...headerColumns]\n // Add TS column to the start\n headerColumns.unshift(timestampCol)\n } else {\n flatTimeseriesData = DatasetHelper.filterRowsByDisplayColumns(chartDefinition, flatTimeseriesData)\n }\n\n const head = headerColumns.map((column) => {\n return { text: column.display }\n })\n\n const rows = DashboardListUtils.createTableRows(flatTimeseriesData)\n\n return {\n head,\n rows,\n } as MoJTable\n}\n\nexport default {\n createChart,\n createTimeseriesCharts,\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["utils_exports", "__export", "createChart", "createTimeseriesCharts", "utils_default", "__toCommonJS", "import_dayjs", "import_weekOfYear", "import_datasetHelper", "import_utils", "import_types", "import_HeatmapChart", "import_BarChart", "import_DoughnutChart", "import_LineChart", "import_LineTimeseriesChart", "import_BarTimeseriesChart", "dayjs", "weekOfYear", "chartDefinition", "rawData", "type", "table", "chart", "details", "dataSetRows", "snapshotData", "getDataForSnapshotCharts", "BarChart", "DoughnutChart", "LineChart", "createSnapshotTable", "getChartDetails", "query", "partialDate", "granularity", "key", "latestData", "timeseriesData", "getDataForTimeseriesCharts", "HeatmapChart", "LineTimeseriesChart", "BarTimeseriesChart", "createTimeseriesTable", "data", "DatasetHelper", "timeseries", "meta", "headlines", "createHeadlines", "columns", "measures", "isListChart", "col", "headline", "headlineColumn", "value", "label", "id", "raw", "display", "acc", "d", "head", "column", "filteredRowData", "rows", "DashboardListUtils", "keys", "flatTimeseriesData", "headerColumns", "timestampIndex", "m", "timestampCol", "k"]
|
|
7
7
|
}
|
|
@@ -38,19 +38,21 @@ describe('ChartCard Utils', () => {
|
|
|
38
38
|
describe('createChart', () => {
|
|
39
39
|
it('should get the snapshot chart data', async () => {
|
|
40
40
|
const expectedResult = barChartDataHasEthnicity
|
|
41
|
-
const result = ChartCardUtils.createChart(snapshotVisualisationDefinition, dashboardMetricsData.flat())
|
|
41
|
+
const result = ChartCardUtils.createChart(snapshotVisualisationDefinition, dashboardMetricsData.flat(), 'bar')
|
|
42
|
+
console.log(JSON.stringify(result, null, 2))
|
|
42
43
|
expect(result).toEqual(expectedResult)
|
|
43
44
|
})
|
|
44
45
|
|
|
45
46
|
it('should get the snapshot chart data from a list', async () => {
|
|
46
47
|
const expectedResult = chartFromList
|
|
47
|
-
const result = ChartCardUtils.createChart(snapshotVisualisationFromListDefinition, dashboardMockDietData)
|
|
48
|
+
const result = ChartCardUtils.createChart(snapshotVisualisationFromListDefinition, dashboardMockDietData, 'bar')
|
|
48
49
|
expect(result).toEqual(expectedResult)
|
|
49
50
|
})
|
|
50
51
|
|
|
51
52
|
it('should create the snapshot chart data from a list', () => {
|
|
52
53
|
const expectedResult = barChartFromListDataHasEthnicity
|
|
53
|
-
const result = ChartCardUtils.createChart(snapshotVisualisationDefinition, dashboardMetricsData.flat())
|
|
54
|
+
const result = ChartCardUtils.createChart(snapshotVisualisationDefinition, dashboardMetricsData.flat(), 'bar')
|
|
55
|
+
|
|
54
56
|
expect(result).toEqual(expectedResult)
|
|
55
57
|
})
|
|
56
58
|
|
|
@@ -59,7 +61,11 @@ describe('ChartCard Utils', () => {
|
|
|
59
61
|
const result = ChartCardUtils.createTimeseriesCharts(
|
|
60
62
|
timeseriesVisualisationDefinition,
|
|
61
63
|
dashboardMetricsData.flat(),
|
|
64
|
+
'line-timeseries',
|
|
65
|
+
{},
|
|
62
66
|
)
|
|
67
|
+
|
|
68
|
+
console.log(JSON.stringify(result, null, 2))
|
|
63
69
|
expect(result).toEqual(expectedResult)
|
|
64
70
|
})
|
|
65
71
|
})
|