@ministryofjustice/hmpps-digital-prison-reporting-frontend 4.15.0 → 4.15.2

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.
Files changed (38) hide show
  1. package/dpr/components/_charts/chart/heatmap/Heatmap.js +2 -0
  2. package/dpr/components/_charts/chart/heatmap/Heatmap.js.map +7 -0
  3. package/dpr/components/_charts/chart/heatmap/Heatmap.ts +278 -0
  4. package/dpr/components/_charts/utils.js +1 -1
  5. package/dpr/components/_charts/utils.js.map +3 -3
  6. package/dpr/components/_charts/utils.ts +2 -2
  7. package/dpr/components/_dashboards/dashboard/types.js +1 -1
  8. package/dpr/components/_dashboards/dashboard/types.js.map +2 -2
  9. package/dpr/components/_dashboards/dashboard/types.ts +8 -0
  10. package/dpr/components/_dashboards/dashboard-list/utils.js +1 -1
  11. package/dpr/components/_dashboards/dashboard-list/utils.js.map +3 -3
  12. package/dpr/components/_dashboards/dashboard-list/utils.ts +3 -2
  13. package/dpr/components/user-reports/utils.js +1 -1
  14. package/dpr/components/user-reports/utils.js.map +3 -3
  15. package/dpr/components/user-reports/utils.ts +13 -3
  16. package/dpr/routes/journeys/view-report/async/report/tests.cy.js +1 -1
  17. package/dpr/routes/journeys/view-report/async/report/tests.cy.js.map +2 -2
  18. package/dpr/routes/journeys/view-report/async/report/tests.cy.ts +44 -8
  19. package/dpr/routes/journeys/view-report/utils.js +1 -1
  20. package/dpr/routes/journeys/view-report/utils.js.map +3 -3
  21. package/dpr/routes/journeys/view-report/utils.ts +6 -1
  22. package/dpr/utils/DataTableBuilder/DataTableBuilder.js +1 -1
  23. package/dpr/utils/DataTableBuilder/DataTableBuilder.js.map +2 -2
  24. package/dpr/utils/DataTableBuilder/DataTableBuilder.ts +37 -19
  25. package/dpr/utils/ParentChildDataTableBuilder/ParentChildDataTableBuilder.js +1 -1
  26. package/dpr/utils/ParentChildDataTableBuilder/ParentChildDataTableBuilder.js.map +2 -2
  27. package/dpr/utils/ParentChildDataTableBuilder/ParentChildDataTableBuilder.ts +6 -3
  28. package/dpr/utils/SectionedDataTableBuilder/SectionedDataTableBuilder.js.map +2 -2
  29. package/dpr/utils/SectionedDataTableBuilder/SectionedDataTableBuilder.ts +5 -2
  30. package/dpr/utils/SummaryDataTableBuilder/SummaryDataTableBuilder.js +1 -1
  31. package/dpr/utils/SummaryDataTableBuilder/SummaryDataTableBuilder.js.map +2 -2
  32. package/dpr/utils/SummaryDataTableBuilder/SummaryDataTableBuilder.ts +2 -1
  33. package/dpr/utils/UserStoreItemBuilder.js.map +1 -1
  34. package/dpr/utils/UserStoreItemBuilder.ts +1 -1
  35. package/package.json +1 -1
  36. package/dpr/components/_charts/chart/heatmap/utils.js +0 -2
  37. package/dpr/components/_charts/chart/heatmap/utils.js.map +0 -7
  38. package/dpr/components/_charts/chart/heatmap/utils.ts +0 -182
@@ -0,0 +1,2 @@
1
+ var k=Object.create;var m=Object.defineProperty;var C=Object.getOwnPropertyDescriptor;var v=Object.getOwnPropertyNames;var x=Object.getPrototypeOf,g=Object.prototype.hasOwnProperty;var M=(o,t)=>{for(var i in t)m(o,i,{get:t[i],enumerable:!0})},d=(o,t,i,e)=>{if(t&&typeof t=="object"||typeof t=="function")for(let s of v(t))!g.call(o,s)&&s!==i&&m(o,s,{get:()=>t[s],enumerable:!(e=C(t,s))||e.enumerable});return o};var b=(o,t,i)=>(i=o!=null?k(x(o)):{},d(t||!o||!o.__esModule?m(i,"default",{value:o,enumerable:!0}):i,o)),B=o=>d(m({},"__esModule",{value:!0}),o);var R={};M(R,{HeatmapChart:()=>p,default:()=>T});module.exports=B(R);var u=b(require("dayjs")),D=require("with-alpha-hex"),f=require("../../../_dashboards/dashboard/types"),y=b(require("../../../../utils/datasetHelper"));class p{constructor(t,i,e){this.baseColour="#1d70b8";this.ragColours=["#00703c","#ffdd00","#d4351c"];this.buckets=[];this.data=[];this.dayDateFormat="DD/MM/YYYY";this.hasRag=!1;this.options={};this.initFromResponseData=t=>{this.hasRag=t[0][this.valueKey].rag!==void 0,this.responseData=t};this.initFromDefinition=t=>{this.definition=t,this.columns=t.columns,this.unit=this.columns.measures[0].unit?this.columns.measures[0].unit:void 0,this.type=this.definition.type.split("-")[0],this.options=t.options,this.baseColour=this.options.baseColour||this.baseColour,this.valueKey=this.columns.measures[1].id,this.label=this.columns.measures[1].display,this.onlyBucketColoursDefined=this.options?.buckets?.every(i=>!i.max&&!i.min&&i.hexColour!==void 0)};this.initBuckets=()=>{const{buckets:t}=this.options;this.setBucketCount(),this.initBucketColours(),t?this.onlyBucketColoursDefined?this.initAutomaticThresholdBucket():this.initCustomThresholdBuckets():this.hasRag||this.initAutomaticThresholdBucket()};this.initCustomThresholdBuckets=()=>{this.buckets=this.options.buckets.map((t,i)=>({...this.buckets[i],...t}))};this.initAutomaticThresholdBucket=()=>{const{min:t,max:i,bucketSize:e}=this.setAutomaticThresholdSize();let s=0;this.buckets=this.buckets.map((a,r)=>{let n=t;return r!==0&&(n=s+1),s=e*(r+1),r===this.buckets.length-1&&(s=i),{hexColour:this.options?.buckets?this.options.buckets[r]?.hexColour:a.hexColour,min:n,max:s}})};this.initBucketColours=()=>{const{useRagColours:t}=this.options;if(t&&this.bucketCount===3)this.buckets=Array.from(new Array(this.bucketCount)).map((i,e)=>({hexColour:this.ragColours[e]}));else{const i=1/this.bucketCount;this.buckets=Array.from(new Array(this.bucketCount)).map((e,s)=>{const a=i*(s+1);return{hexColour:(0,D.withAlphaHex)(this.baseColour,a)}})}};this.setAutomaticThresholdSize=()=>{const t=this.responseData.map(a=>Number(a[this.valueKey].raw)),i=Math.min(...t),e=Math.max(...t),s=Math.ceil((e-i)/this.bucketCount);return{min:i,max:e,bucketSize:s}};this.setBucketCount=()=>{const{buckets:t}=this.options;this.hasRag?this.bucketCount=Math.max(...this.responseData.map(i=>i[this.valueKey].rag))+1:t?this.bucketCount=t.length:this.bucketCount=3};this.validateDefinition=()=>{const{id:t,columns:i,type:e}=this.definition,s=[];if(i.measures.length!==2?s.push(`Measures should only have 2 columns defined. Only found ${i.measures.length}`):e===f.DashboardVisualisationType.MATRIX_TIMESERIES&&i.measures[0].id!=="ts"&&s.push(`measure at index 0 has incorrect ID. Expected ID to be "ts". Found "${i.measures[0].id}"`),s.length){const a=`Validation: Visualisaton definition: ID: ${t}, type: ${e}, errors: ${s.join(",")}`;throw new Error(a)}};this.initTimeseriesData=()=>{const t=y.default.groupRowsByTimestamp(this.responseData);this.data=t.map(i=>{const{raw:e,rag:s}=i[0][this.valueKey],a=i[0].ts.raw,r=Number(e),n=s!==void 0?Number(i[0][this.valueKey].rag):void 0;let h,l;switch(this.granularity){case"hourly":break;case"weekly":h=(0,u.default)(a,this.dayDateFormat).format("ddd"),l=(0,u.default)(a,this.dayDateFormat).week();break;case"daily":h=(0,u.default)(a,this.dayDateFormat).format("MMM YY"),l=(0,u.default)(a,this.dayDateFormat).format("D");break;case"monthly":{const c=a.split(" ");h=c[1],l=c[0]}break;case"annually":h="year",l=a;break;default:h=(0,u.default)(a,this.dayDateFormat).format("MMM YY"),l=(0,u.default)(a,this.dayDateFormat).format("D");break}return{y:l,x:h,v:r,r:n}})};this.binDataIntoBuckets=()=>{this.data=this.data.map(t=>{const{v:i,r:e}=t;let s;return e!==void 0?s=this.buckets[e].hexColour:this.buckets.forEach(a=>{const{min:r,max:n}=a;!r&&n&&i<=n&&(s=a.hexColour),r&&i>=a.min&&n&&i<=a.max&&(s=a.hexColour),r&&!n&&i>=r&&(s=a.hexColour)}),{...t,c:s}})};this.build=()=>(this.validateDefinition(),this.initTimeseriesData(),this.binDataIntoBuckets(),{type:this.type,unit:this.unit,timeseries:!0,data:{datasets:[{label:this.label,data:this.data}]}});this.granularity=i,this.initFromDefinition(e),this.initFromResponseData(t),this.initBuckets()}}var T=p;0&&(module.exports={HeatmapChart});
2
+ //# sourceMappingURL=Heatmap.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../../src/dpr/components/_charts/chart/heatmap/Heatmap.ts"],
4
+ "sourcesContent": ["/* eslint-disable prefer-destructuring */\nimport dayjs from 'dayjs'\nimport { withAlphaHex } from 'with-alpha-hex'\nimport { Granularity } from '../../../_inputs/granular-date-range/types'\nimport { DashboardDataResponse } from '../../../../types/Metrics'\nimport {\n DashboardVisualisation,\n DashboardVisualisationColumns,\n DashboardVisualisationType,\n MatrixDashboardVisualisationBucket,\n MatrixDashboardVisualisationOptions,\n} from '../../../_dashboards/dashboard/types'\nimport { ChartData, ChartType, MatrixChartData, UnitType } from '../../../../types/Charts'\nimport DatasetHelper from '../../../../utils/datasetHelper'\n\nclass HeatmapChart {\n private baseColour = '#1d70b8'\n\n private ragColours: string[] = ['#00703c', '#ffdd00', '#d4351c']\n\n private buckets: MatrixDashboardVisualisationBucket[] = []\n\n private bucketCount: number\n\n private onlyBucketColoursDefined: boolean\n\n private granularity: Granularity\n\n private responseData: DashboardDataResponse[]\n\n private data: MatrixChartData[] = []\n\n private definition: DashboardVisualisation\n\n private columns: DashboardVisualisationColumns\n\n private unit: UnitType\n\n private type: ChartType\n\n private dayDateFormat = 'DD/MM/YYYY'\n\n private hasRag = false\n\n private valueKey: string\n\n private options: MatrixDashboardVisualisationOptions = {}\n\n private label: string\n\n constructor(responseData: DashboardDataResponse[], granularity: Granularity, definition: DashboardVisualisation) {\n this.granularity = granularity\n this.initFromDefinition(definition)\n this.initFromResponseData(responseData)\n this.initBuckets()\n }\n\n private initFromResponseData = (responseData: DashboardDataResponse[]) => {\n this.hasRag = responseData[0][this.valueKey].rag !== undefined\n this.responseData = responseData\n }\n\n private initFromDefinition = (definition: DashboardVisualisation) => {\n this.definition = definition\n this.columns = definition.columns\n this.unit = this.columns.measures[0].unit ? this.columns.measures[0].unit : undefined\n this.type = this.definition.type.split('-')[0] as ChartType\n\n this.options = <MatrixDashboardVisualisationOptions>definition.options\n this.baseColour = this.options.baseColour || this.baseColour\n this.valueKey = this.columns.measures[1].id\n this.label = this.columns.measures[1].display\n this.onlyBucketColoursDefined = this.options?.buckets?.every(\n (bucket) => !bucket.max && !bucket.min && bucket.hexColour !== undefined,\n )\n }\n\n private initBuckets = () => {\n const { buckets } = this.options\n this.setBucketCount()\n this.initBucketColours()\n if (buckets) {\n if (this.onlyBucketColoursDefined) {\n this.initAutomaticThresholdBucket()\n } else {\n this.initCustomThresholdBuckets()\n }\n } else if (!this.hasRag) this.initAutomaticThresholdBucket()\n }\n\n private initCustomThresholdBuckets = () => {\n this.buckets = this.options.buckets.map((bucket, i) => {\n return {\n ...this.buckets[i],\n ...bucket,\n }\n })\n }\n\n /**\n * Initialises the bucket thresholds by defining the range between the min and max\n * and dividing into 3 equal parts\n */\n private initAutomaticThresholdBucket = () => {\n const { min, max, bucketSize } = this.setAutomaticThresholdSize()\n let maxValue = 0\n this.buckets = this.buckets.map((bucket, i) => {\n let minValue = min\n if (i !== 0) minValue = maxValue + 1\n maxValue = bucketSize * (i + 1)\n if (i === this.buckets.length - 1) maxValue = max\n\n return {\n hexColour: this.options?.buckets ? this.options.buckets[i]?.hexColour : bucket.hexColour,\n min: minValue,\n max: maxValue,\n }\n })\n }\n\n private initBucketColours = () => {\n const { useRagColours } = this.options\n if (useRagColours && this.bucketCount === 3) {\n this.buckets = Array.from(new Array(this.bucketCount)).map((d, i) => {\n return {\n hexColour: this.ragColours[i],\n }\n })\n } else {\n const alphaDivision = 1 / this.bucketCount\n this.buckets = Array.from(new Array(this.bucketCount)).map((d, i) => {\n const division = alphaDivision * (i + 1)\n return {\n hexColour: withAlphaHex(this.baseColour, division),\n }\n })\n }\n }\n\n private setAutomaticThresholdSize = () => {\n const values = this.responseData.map((resData) => Number(resData[this.valueKey].raw))\n const min = Math.min(...values)\n const max = Math.max(...values)\n const bucketSize = Math.ceil((max - min) / this.bucketCount)\n\n return {\n min,\n max,\n bucketSize,\n }\n }\n\n private setBucketCount = () => {\n const { buckets } = this.options\n if (this.hasRag) {\n this.bucketCount =\n Math.max(...this.responseData.map((resData: DashboardDataResponse) => resData[this.valueKey].rag)) + 1\n } else if (buckets) {\n this.bucketCount = buckets.length\n } else {\n this.bucketCount = 3\n }\n }\n\n private validateDefinition = () => {\n const { id, columns, type } = this.definition\n const errors = []\n\n // Validate measures\n if (columns.measures.length !== 2) {\n errors.push(`Measures should only have 2 columns defined. Only found ${columns.measures.length}`)\n } else if (type === DashboardVisualisationType.MATRIX_TIMESERIES) {\n if (columns.measures[0].id !== 'ts') {\n errors.push(`measure at index 0 has incorrect ID. Expected ID to be \"ts\". Found \"${columns.measures[0].id}\"`)\n }\n }\n\n // Throw the error\n if (errors.length) {\n const message = `Validation: Visualisaton definition: ID: ${id}, type: ${type}, errors: ${errors.join(',')}`\n throw new Error(message)\n }\n }\n\n private initTimeseriesData = () => {\n const timeBlockData = DatasetHelper.groupRowsByTimestamp(this.responseData)\n\n this.data = timeBlockData.map((tsData) => {\n const { raw, rag } = tsData[0][this.valueKey]\n const tsRaw = tsData[0].ts.raw\n\n const v = Number(raw)\n const r = rag !== undefined ? Number(tsData[0][this.valueKey].rag) : undefined\n let x\n let y\n\n switch (this.granularity) {\n case 'hourly':\n break\n case 'weekly':\n x = dayjs(tsRaw, this.dayDateFormat).format('ddd')\n y = dayjs(tsRaw, this.dayDateFormat).week()\n break\n case 'daily':\n x = dayjs(tsRaw, this.dayDateFormat).format('MMM YY')\n y = dayjs(tsRaw, this.dayDateFormat).format('D')\n break\n case 'monthly':\n {\n const ts = (<string>tsRaw).split(' ')\n x = ts[1]\n y = ts[0]\n }\n break\n case 'annually':\n x = 'year'\n y = <string>tsRaw\n break\n default:\n x = dayjs(tsRaw, this.dayDateFormat).format('MMM YY')\n y = dayjs(tsRaw, this.dayDateFormat).format('D')\n break\n }\n return { y, x, v, r }\n })\n }\n\n private binDataIntoBuckets = () => {\n this.data = this.data.map((d) => {\n const { v, r } = d\n let c\n if (r !== undefined) {\n c = this.buckets[r].hexColour\n } else {\n this.buckets.forEach((bucket) => {\n const { min, max } = bucket\n // First bucket\n if (!min && max && v <= max) {\n c = bucket.hexColour\n }\n // middle buckets\n if (min && v >= bucket.min && max && v <= bucket.max) {\n c = bucket.hexColour\n }\n // last bucket\n if (min && !max && v >= min) {\n c = bucket.hexColour\n }\n })\n }\n\n return { ...d, c }\n })\n }\n\n build = (): ChartData => {\n this.validateDefinition()\n this.initTimeseriesData()\n this.binDataIntoBuckets()\n\n return {\n type: this.type,\n unit: this.unit,\n timeseries: true,\n data: {\n datasets: [\n {\n label: this.label,\n data: this.data,\n },\n ],\n },\n }\n }\n}\n\nexport { HeatmapChart }\nexport default HeatmapChart\n"],
5
+ "mappings": "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",
6
+ "names": ["Heatmap_exports", "__export", "HeatmapChart", "Heatmap_default", "__toCommonJS", "import_dayjs", "import_with_alpha_hex", "import_types", "import_datasetHelper", "responseData", "granularity", "definition", "bucket", "buckets", "min", "max", "bucketSize", "maxValue", "i", "minValue", "useRagColours", "d", "alphaDivision", "division", "values", "resData", "id", "columns", "type", "errors", "message", "timeBlockData", "DatasetHelper", "tsData", "raw", "rag", "tsRaw", "v", "r", "x", "y", "dayjs", "ts", "c"]
7
+ }
@@ -0,0 +1,278 @@
1
+ /* eslint-disable prefer-destructuring */
2
+ import dayjs from 'dayjs'
3
+ import { withAlphaHex } from 'with-alpha-hex'
4
+ import { Granularity } from '../../../_inputs/granular-date-range/types'
5
+ import { DashboardDataResponse } from '../../../../types/Metrics'
6
+ import {
7
+ DashboardVisualisation,
8
+ DashboardVisualisationColumns,
9
+ DashboardVisualisationType,
10
+ MatrixDashboardVisualisationBucket,
11
+ MatrixDashboardVisualisationOptions,
12
+ } from '../../../_dashboards/dashboard/types'
13
+ import { ChartData, ChartType, MatrixChartData, UnitType } from '../../../../types/Charts'
14
+ import DatasetHelper from '../../../../utils/datasetHelper'
15
+
16
+ class HeatmapChart {
17
+ private baseColour = '#1d70b8'
18
+
19
+ private ragColours: string[] = ['#00703c', '#ffdd00', '#d4351c']
20
+
21
+ private buckets: MatrixDashboardVisualisationBucket[] = []
22
+
23
+ private bucketCount: number
24
+
25
+ private onlyBucketColoursDefined: boolean
26
+
27
+ private granularity: Granularity
28
+
29
+ private responseData: DashboardDataResponse[]
30
+
31
+ private data: MatrixChartData[] = []
32
+
33
+ private definition: DashboardVisualisation
34
+
35
+ private columns: DashboardVisualisationColumns
36
+
37
+ private unit: UnitType
38
+
39
+ private type: ChartType
40
+
41
+ private dayDateFormat = 'DD/MM/YYYY'
42
+
43
+ private hasRag = false
44
+
45
+ private valueKey: string
46
+
47
+ private options: MatrixDashboardVisualisationOptions = {}
48
+
49
+ private label: string
50
+
51
+ constructor(responseData: DashboardDataResponse[], granularity: Granularity, definition: DashboardVisualisation) {
52
+ this.granularity = granularity
53
+ this.initFromDefinition(definition)
54
+ this.initFromResponseData(responseData)
55
+ this.initBuckets()
56
+ }
57
+
58
+ private initFromResponseData = (responseData: DashboardDataResponse[]) => {
59
+ this.hasRag = responseData[0][this.valueKey].rag !== undefined
60
+ this.responseData = responseData
61
+ }
62
+
63
+ private initFromDefinition = (definition: DashboardVisualisation) => {
64
+ this.definition = definition
65
+ this.columns = definition.columns
66
+ this.unit = this.columns.measures[0].unit ? this.columns.measures[0].unit : undefined
67
+ this.type = this.definition.type.split('-')[0] as ChartType
68
+
69
+ this.options = <MatrixDashboardVisualisationOptions>definition.options
70
+ this.baseColour = this.options.baseColour || this.baseColour
71
+ this.valueKey = this.columns.measures[1].id
72
+ this.label = this.columns.measures[1].display
73
+ this.onlyBucketColoursDefined = this.options?.buckets?.every(
74
+ (bucket) => !bucket.max && !bucket.min && bucket.hexColour !== undefined,
75
+ )
76
+ }
77
+
78
+ private initBuckets = () => {
79
+ const { buckets } = this.options
80
+ this.setBucketCount()
81
+ this.initBucketColours()
82
+ if (buckets) {
83
+ if (this.onlyBucketColoursDefined) {
84
+ this.initAutomaticThresholdBucket()
85
+ } else {
86
+ this.initCustomThresholdBuckets()
87
+ }
88
+ } else if (!this.hasRag) this.initAutomaticThresholdBucket()
89
+ }
90
+
91
+ private initCustomThresholdBuckets = () => {
92
+ this.buckets = this.options.buckets.map((bucket, i) => {
93
+ return {
94
+ ...this.buckets[i],
95
+ ...bucket,
96
+ }
97
+ })
98
+ }
99
+
100
+ /**
101
+ * Initialises the bucket thresholds by defining the range between the min and max
102
+ * and dividing into 3 equal parts
103
+ */
104
+ private initAutomaticThresholdBucket = () => {
105
+ const { min, max, bucketSize } = this.setAutomaticThresholdSize()
106
+ let maxValue = 0
107
+ this.buckets = this.buckets.map((bucket, i) => {
108
+ let minValue = min
109
+ if (i !== 0) minValue = maxValue + 1
110
+ maxValue = bucketSize * (i + 1)
111
+ if (i === this.buckets.length - 1) maxValue = max
112
+
113
+ return {
114
+ hexColour: this.options?.buckets ? this.options.buckets[i]?.hexColour : bucket.hexColour,
115
+ min: minValue,
116
+ max: maxValue,
117
+ }
118
+ })
119
+ }
120
+
121
+ private initBucketColours = () => {
122
+ const { useRagColours } = this.options
123
+ if (useRagColours && this.bucketCount === 3) {
124
+ this.buckets = Array.from(new Array(this.bucketCount)).map((d, i) => {
125
+ return {
126
+ hexColour: this.ragColours[i],
127
+ }
128
+ })
129
+ } else {
130
+ const alphaDivision = 1 / this.bucketCount
131
+ this.buckets = Array.from(new Array(this.bucketCount)).map((d, i) => {
132
+ const division = alphaDivision * (i + 1)
133
+ return {
134
+ hexColour: withAlphaHex(this.baseColour, division),
135
+ }
136
+ })
137
+ }
138
+ }
139
+
140
+ private setAutomaticThresholdSize = () => {
141
+ const values = this.responseData.map((resData) => Number(resData[this.valueKey].raw))
142
+ const min = Math.min(...values)
143
+ const max = Math.max(...values)
144
+ const bucketSize = Math.ceil((max - min) / this.bucketCount)
145
+
146
+ return {
147
+ min,
148
+ max,
149
+ bucketSize,
150
+ }
151
+ }
152
+
153
+ private setBucketCount = () => {
154
+ const { buckets } = this.options
155
+ if (this.hasRag) {
156
+ this.bucketCount =
157
+ Math.max(...this.responseData.map((resData: DashboardDataResponse) => resData[this.valueKey].rag)) + 1
158
+ } else if (buckets) {
159
+ this.bucketCount = buckets.length
160
+ } else {
161
+ this.bucketCount = 3
162
+ }
163
+ }
164
+
165
+ private validateDefinition = () => {
166
+ const { id, columns, type } = this.definition
167
+ const errors = []
168
+
169
+ // Validate measures
170
+ if (columns.measures.length !== 2) {
171
+ errors.push(`Measures should only have 2 columns defined. Only found ${columns.measures.length}`)
172
+ } else if (type === DashboardVisualisationType.MATRIX_TIMESERIES) {
173
+ if (columns.measures[0].id !== 'ts') {
174
+ errors.push(`measure at index 0 has incorrect ID. Expected ID to be "ts". Found "${columns.measures[0].id}"`)
175
+ }
176
+ }
177
+
178
+ // Throw the error
179
+ if (errors.length) {
180
+ const message = `Validation: Visualisaton definition: ID: ${id}, type: ${type}, errors: ${errors.join(',')}`
181
+ throw new Error(message)
182
+ }
183
+ }
184
+
185
+ private initTimeseriesData = () => {
186
+ const timeBlockData = DatasetHelper.groupRowsByTimestamp(this.responseData)
187
+
188
+ this.data = timeBlockData.map((tsData) => {
189
+ const { raw, rag } = tsData[0][this.valueKey]
190
+ const tsRaw = tsData[0].ts.raw
191
+
192
+ const v = Number(raw)
193
+ const r = rag !== undefined ? Number(tsData[0][this.valueKey].rag) : undefined
194
+ let x
195
+ let y
196
+
197
+ switch (this.granularity) {
198
+ case 'hourly':
199
+ break
200
+ case 'weekly':
201
+ x = dayjs(tsRaw, this.dayDateFormat).format('ddd')
202
+ y = dayjs(tsRaw, this.dayDateFormat).week()
203
+ break
204
+ case 'daily':
205
+ x = dayjs(tsRaw, this.dayDateFormat).format('MMM YY')
206
+ y = dayjs(tsRaw, this.dayDateFormat).format('D')
207
+ break
208
+ case 'monthly':
209
+ {
210
+ const ts = (<string>tsRaw).split(' ')
211
+ x = ts[1]
212
+ y = ts[0]
213
+ }
214
+ break
215
+ case 'annually':
216
+ x = 'year'
217
+ y = <string>tsRaw
218
+ break
219
+ default:
220
+ x = dayjs(tsRaw, this.dayDateFormat).format('MMM YY')
221
+ y = dayjs(tsRaw, this.dayDateFormat).format('D')
222
+ break
223
+ }
224
+ return { y, x, v, r }
225
+ })
226
+ }
227
+
228
+ private binDataIntoBuckets = () => {
229
+ this.data = this.data.map((d) => {
230
+ const { v, r } = d
231
+ let c
232
+ if (r !== undefined) {
233
+ c = this.buckets[r].hexColour
234
+ } else {
235
+ this.buckets.forEach((bucket) => {
236
+ const { min, max } = bucket
237
+ // First bucket
238
+ if (!min && max && v <= max) {
239
+ c = bucket.hexColour
240
+ }
241
+ // middle buckets
242
+ if (min && v >= bucket.min && max && v <= bucket.max) {
243
+ c = bucket.hexColour
244
+ }
245
+ // last bucket
246
+ if (min && !max && v >= min) {
247
+ c = bucket.hexColour
248
+ }
249
+ })
250
+ }
251
+
252
+ return { ...d, c }
253
+ })
254
+ }
255
+
256
+ build = (): ChartData => {
257
+ this.validateDefinition()
258
+ this.initTimeseriesData()
259
+ this.binDataIntoBuckets()
260
+
261
+ return {
262
+ type: this.type,
263
+ unit: this.unit,
264
+ timeseries: true,
265
+ data: {
266
+ datasets: [
267
+ {
268
+ label: this.label,
269
+ data: this.data,
270
+ },
271
+ ],
272
+ },
273
+ }
274
+ }
275
+ }
276
+
277
+ export { HeatmapChart }
278
+ export default HeatmapChart
@@ -1,2 +1,2 @@
1
- var G=Object.create;var C=Object.defineProperty;var $=Object.getOwnPropertyDescriptor;var A=Object.getOwnPropertyNames;var F=Object.getPrototypeOf,j=Object.prototype.hasOwnProperty;var v=(a,t)=>{for(var e in t)C(a,e,{get:t[e],enumerable:!0})},w=(a,t,e,s)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of A(t))!j.call(a,o)&&o!==e&&C(a,o,{get:()=>t[o],enumerable:!(s=$(t,o))||s.enumerable});return a};var b=(a,t,e)=>(e=a!=null?G(F(a)):{},w(t||!a||!a.__esModule?C(e,"default",{value:a,enumerable:!0}):e,a)),H=a=>w(C({},"__esModule",{value:!0}),a);var Q={};v(Q,{createChart:()=>M,createMatrixChart:()=>S,createTimeseriesCharts:()=>L,default:()=>P});module.exports=H(Q);var T=b(require("dayjs")),x=b(require("dayjs/plugin/weekOfYear")),B=require("./chart/heatmap/utils"),D=b(require("../../utils/datasetHelper")),f=b(require("../_dashboards/dashboard-list/utils")),k=require("../_inputs/granular-date-range/types");T.default.extend(x.default);const M=(a,t)=>{let e,s,o;const{dataSetRows:r,snapshotData:l}=O(a,t);return r.length&&(s=Y(a,l),e=z(a,r),o=R(a,r)),{details:o,table:e,chart:s}},L=(a,t)=>{let e,s,o;const{latestData:r,dataSetRows:l,timeseriesData:u}=g(a,t);return l.length&&(s=N(a,u),e=V(a,u),o=R(a,r,!0)),{details:o,table:e,chart:s}},S=(a,t,e)=>{let s,o,r,l=k.Granularity.DAILY;Object.keys(e).forEach(h=>{h.includes("granularity")&&(l=e[h])});const{latestData:u,dataSetRows:n,timeseriesData:i}=g(a,t);return n.length&&(o=(0,B.createTimeseriesMatrixChart)(a,i,l),s=V(a,i),r=R(a,u,!0)),{details:r,table:s,chart:o}},O=(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}},g=(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=W(a,t,e);return t[0]?.ts&&s.push({label:"Values for:",value:t[0]?.ts.raw}),{meta:s,headlines:o}},W=(a,t,e=!1)=>{const s=[],{columns:o}=a,{measures:r}=o,l=!!r.find(d=>d.axis);let u,n,i,h;return e?(n=r.find(d=>d.id!=="ts"),n&&(h=`${t[0].ts.raw}`,i=+t[0][n.id].raw,u={label:h,value:i})):(n=l?r.find(d=>d.axis&&d.axis==="y"):r[0],n&&(h=`Total ${n.display.toLowerCase()}`,i=t.reduce((d,c)=>d+ +c[n.id].raw,0),u={label:h,value:i})),s.push(u),s},Y=(a,t)=>{const{type:e,columns:s}=a,{measures:o}=s,r=!!o.find(i=>i.axis);let l,u,n;return r?{labels:l,unit:u,datasets:n}=U(s,t):{labels:l,unit:u,datasets:n}=E(s,t),{type:e,unit:u,data:{labels:l,datasets:n}}},E=(a,t)=>{const{keys:e,measures:s}=a,o=s.map(n=>n.display),r=e[e.length-1]?.id,l=s[0].unit?s[0].unit:void 0,u=t.map(n=>{const i=n[r]?`${n[r].raw}`:"All",h=s.map(c=>{const m=c.id;return n[m]?+n[m].raw:0}),d=h.reduce((c,m)=>c+m,0);return{label:i,data:h,total:d}});return{labels:o,unit:l,datasets:u}},U=(a,t)=>{const{measures:e,keys:s}=a,o=e.find(d=>d.axis==="x"),r=e.find(d=>d.axis==="y"),l=r?.unit||void 0,u=D.default.getGroupKey(s,t),n=u?D.default.groupRowsByKey(t,u.id):[t],i=n[0]?.map(d=>`${d[o.id].raw}`),h=n.map(d=>{const c=d.map(m=>+m[r.id].raw);return{label:u?`${d[0][u.id].raw}`:r.display,data:c,total:c.reduce((m,p)=>m+p,0)}});return{labels:i,unit:l,datasets:h}},z=(a,t)=>{const{columns:e}=a,{keys:s,measures:o}=e,l=[...s,...o].map(i=>({text:i.display})),u=D.default.filterRowsByDisplayColumns(a,t,!0),n=f.default.createTableRows(u);return{head:l,rows:n}},N=(a,t)=>{const{columns:e}=a,{keys:s,measures:o}=e,r=o[0].unit?o[0].unit:void 0,l=a.type.split("-")[0],n=D.default.getGroupKey(s,t).id,i=D.default.groupRowsByTimestamp(t),h=i.map(m=>m[0].ts.raw),d=i[0].length,c=[];for(let m=0;m<d;m+=1){const p=i.map(y=>+y[m][o[1].id].raw),J=p.reduce((y,K)=>y+K,0),I=i[0][m][n].raw;c.push({data:p,label:I,total:J})}return{type:l,unit:r,timeseries:!0,data:{labels:h,datasets:c}}},V=(a,t)=>{const{columns:e}=a,{keys:s,measures:o}=e;let r=t.flat(),l=[...o];if(t.length>1){const i=l.findIndex(c=>c.id==="ts"),h=l[i];l.splice(i,1),l=[...s.filter(c=>c.id!=="ts"),...l],l.unshift(h)}else r=D.default.filterRowsByDisplayColumns(a,r);const u=l.map(i=>({text:i.display})),n=f.default.createTableRows(r);return{head:u,rows:n}};var P={createChart:M,createTimeseriesCharts:L,createMatrixChart:S};0&&(module.exports={createChart,createMatrixChart,createTimeseriesCharts});
1
+ var G=Object.create;var b=Object.defineProperty;var $=Object.getOwnPropertyDescriptor;var A=Object.getOwnPropertyNames;var F=Object.getPrototypeOf,H=Object.prototype.hasOwnProperty;var j=(a,t)=>{for(var e in t)b(a,e,{get:t[e],enumerable:!0})},w=(a,t,e,s)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of A(t))!H.call(a,o)&&o!==e&&b(a,o,{get:()=>t[o],enumerable:!(s=$(t,o))||s.enumerable});return a};var p=(a,t,e)=>(e=a!=null?G(F(a)):{},w(t||!a||!a.__esModule?b(e,"default",{value:a,enumerable:!0}):e,a)),v=a=>w(b({},"__esModule",{value:!0}),a);var Q={};j(Q,{createChart:()=>M,createMatrixChart:()=>S,createTimeseriesCharts:()=>L,default:()=>P});module.exports=v(Q);var T=p(require("dayjs")),x=p(require("dayjs/plugin/weekOfYear")),D=p(require("../../utils/datasetHelper")),f=p(require("../_dashboards/dashboard-list/utils")),B=require("../_inputs/granular-date-range/types"),k=p(require("./chart/heatmap/Heatmap"));T.default.extend(x.default);const M=(a,t)=>{let e,s,o;const{dataSetRows:r,snapshotData:l}=O(a,t);return r.length&&(s=Y(a,l),e=z(a,r),o=R(a,r)),{details:o,table:e,chart:s}},L=(a,t)=>{let e,s,o;const{latestData:r,dataSetRows:l,timeseriesData:u}=g(a,t);return l.length&&(s=N(a,u),e=V(a,u),o=R(a,r,!0)),{details:o,table:e,chart:s}},S=(a,t,e)=>{let s,o,r,l=B.Granularity.DAILY;Object.keys(e).forEach(h=>{h.includes("granularity")&&(l=e[h])});const{latestData:u,dataSetRows:n,timeseriesData:i}=g(a,t);return n.length&&(o=new k.default(i,l,a).build(),s=V(a,i),r=R(a,u,!0)),{details:r,table:s,chart:o}},O=(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}},g=(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=W(a,t,e);return t[0]?.ts&&s.push({label:"Values for:",value:t[0]?.ts.raw}),{meta:s,headlines:o}},W=(a,t,e=!1)=>{const s=[],{columns:o}=a,{measures:r}=o,l=!!r.find(d=>d.axis);let u,n,i,h;return e?(n=r.find(d=>d.id!=="ts"),n&&(h=`${t[0].ts.raw}`,i=+t[0][n.id].raw,u={label:h,value:i})):(n=l?r.find(d=>d.axis&&d.axis==="y"):r[0],n&&(h=`Total ${n.display.toLowerCase()}`,i=t.reduce((d,c)=>d+ +c[n.id].raw,0),u={label:h,value:i})),s.push(u),s},Y=(a,t)=>{const{type:e,columns:s}=a,{measures:o}=s,r=!!o.find(i=>i.axis);let l,u,n;return r?{labels:l,unit:u,datasets:n}=U(s,t):{labels:l,unit:u,datasets:n}=E(s,t),{type:e,unit:u,data:{labels:l,datasets:n}}},E=(a,t)=>{const{keys:e,measures:s}=a,o=s.map(n=>n.display),r=e[e.length-1]?.id,l=s[0].unit?s[0].unit:void 0,u=t.map(n=>{const i=n[r]?`${n[r].raw}`:"All",h=s.map(c=>{const m=c.id;return n[m]?+n[m].raw:0}),d=h.reduce((c,m)=>c+m,0);return{label:i,data:h,total:d}});return{labels:o,unit:l,datasets:u}},U=(a,t)=>{const{measures:e,keys:s}=a,o=e.find(d=>d.axis==="x"),r=e.find(d=>d.axis==="y"),l=r?.unit||void 0,u=D.default.getGroupKey(s,t),n=u?D.default.groupRowsByKey(t,u.id):[t],i=n[0]?.map(d=>`${d[o.id].raw}`),h=n.map(d=>{const c=d.map(m=>+m[r.id].raw);return{label:u?`${d[0][u.id].raw}`:r.display,data:c,total:c.reduce((m,C)=>m+C,0)}});return{labels:i,unit:l,datasets:h}},z=(a,t)=>{const{columns:e}=a,{keys:s,measures:o}=e,l=[...s,...o].map(i=>({text:i.display})),u=D.default.filterRowsByDisplayColumns(a,t,!0),n=f.default.createTableRows(u);return{head:l,rows:n}},N=(a,t)=>{const{columns:e}=a,{keys:s,measures:o}=e,r=o[0].unit?o[0].unit:void 0,l=a.type.split("-")[0],n=D.default.getGroupKey(s,t).id,i=D.default.groupRowsByTimestamp(t),h=i.map(m=>m[0].ts.raw),d=i[0].length,c=[];for(let m=0;m<d;m+=1){const C=i.map(y=>+y[m][o[1].id].raw),J=C.reduce((y,K)=>y+K,0),I=i[0][m][n].raw;c.push({data:C,label:I,total:J})}return{type:l,unit:r,timeseries:!0,data:{labels:h,datasets:c}}},V=(a,t)=>{const{columns:e}=a,{keys:s,measures:o}=e;let r=t.flat(),l=[...o];if(t.length>1){const i=l.findIndex(c=>c.id==="ts"),h=l[i];l.splice(i,1),l=[...s.filter(c=>c.id!=="ts"),...l],l.unshift(h)}else r=D.default.filterRowsByDisplayColumns(a,r);const u=l.map(i=>({text:i.display})),n=f.default.createTableRows(r);return{head:u,rows:n}};var P={createChart:M,createTimeseriesCharts:L,createMatrixChart:S};0&&(module.exports={createChart,createMatrixChart,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 {\n ChartData,\n MoJTable,\n ChartCardData,\n ChartDataset,\n ChartType,\n ChartDetails,\n ChartMetaData,\n} from '../../types/Charts'\nimport { createTimeseriesMatrixChart } from './chart/heatmap/utils'\nimport { DashboardDataResponse } from '../../types/Metrics'\nimport {\n BarChartVisualisationColumn,\n DashboardVisualisation,\n DashboardVisualisationColumns,\n} from '../_dashboards/dashboard/types'\nimport DatasetHelper from '../../utils/datasetHelper'\nimport DashboardListUtils from '../_dashboards/dashboard-list/utils'\nimport { Granularity } from '../_inputs/granular-date-range/types'\n\ndayjs.extend(weekOfYear)\n\nexport const createChart = (\n chartDefinition: DashboardVisualisation,\n rawData: DashboardDataResponse[],\n): ChartCardData => {\n let table: MoJTable\n let chart: ChartData\n let details: ChartDetails\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: DashboardVisualisation,\n rawData: DashboardDataResponse[],\n): ChartCardData => {\n let table: MoJTable\n let chart: ChartData\n let details: ChartDetails\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: DashboardVisualisation,\n rawData: DashboardDataResponse[],\n query: Record<string, string | string[]>,\n) => {\n let table: MoJTable\n let chart: ChartData\n let details: ChartDetails\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 = createTimeseriesMatrixChart(chartDefinition, timeseriesData, granularity)\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 = (chartDefinition: DashboardVisualisation, rawData: DashboardDataResponse[]) => {\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 = (chartDefinition: DashboardVisualisation, rawData: DashboardDataResponse[]) => {\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: DashboardVisualisation,\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) {\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: DashboardVisualisation,\n data: DashboardDataResponse[],\n timeseries = false,\n) => {\n const headlines: ChartMetaData[] = []\n const { columns } = chartDefinition\n const { measures } = columns\n const isListChart = !!(<BarChartVisualisationColumn[]>measures).find((col) => col.axis)\n let headline: ChartMetaData\n\n let headlineColumn: BarChartVisualisationColumn\n let value: number\n let label: string\n\n if (timeseries) {\n headlineColumn = <BarChartVisualisationColumn>measures.find((col) => col.id !== 'ts')\n if (headlineColumn) {\n label = `${data[0].ts.raw}`\n value = +data[0][headlineColumn.id].raw\n\n headline = {\n label,\n value,\n }\n }\n } else {\n headlineColumn = !isListChart\n ? <BarChartVisualisationColumn>measures[0]\n : measures.find((col: BarChartVisualisationColumn) => col.axis && col.axis === 'y')\n\n if (headlineColumn) {\n label = `Total ${headlineColumn.display.toLowerCase()}`\n value = data.reduce((acc: number, d: DashboardDataResponse) => acc + +d[headlineColumn.id].raw, 0)\n\n headline = {\n label,\n value,\n }\n }\n }\n\n headlines.push(headline)\n\n return headlines\n}\n\nconst createSnapshotChart = (\n chartDefinition: DashboardVisualisation,\n snapshotData: DashboardDataResponse[],\n): ChartData => {\n const { type, columns } = chartDefinition\n const { measures } = columns\n const isListChart = !!(<BarChartVisualisationColumn[]>measures).find((col) => col.axis)\n\n let labels: string[]\n let unit\n let datasets: ChartDataset[]\n\n if (!isListChart) {\n ;({ labels, unit, datasets } = buildChart(columns, snapshotData))\n } else {\n ;({ labels, unit, datasets } = buildChartFromListData(columns, snapshotData))\n }\n\n return {\n type: type as unknown as ChartType,\n unit,\n data: {\n labels,\n datasets,\n },\n }\n}\n\nconst buildChart = (columns: DashboardVisualisationColumns, rawData: DashboardDataResponse[]) => {\n const { keys, measures } = columns\n const labels = measures.map((col) => col.display)\n const labelId = keys[keys.length - 1]?.id as keyof DashboardDataResponse\n const unit = measures[0].unit ? measures[0].unit : undefined\n\n const datasets = rawData.map((row) => {\n const label = 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 : 0\n })\n const total = data.reduce((acc: number, val: number) => acc + val, 0)\n return { label, data, total } as ChartDataset\n })\n\n return {\n labels,\n unit,\n datasets,\n }\n}\n\nconst buildChartFromListData = (columns: DashboardVisualisationColumns, rawData: DashboardDataResponse[]) => {\n const { measures, keys } = columns\n\n const xAxisColumn = (<BarChartVisualisationColumn[]>measures).find((col) => col.axis === 'x')\n const yAxisColumn = (<BarChartVisualisationColumn[]>measures).find((col) => col.axis === 'y')\n\n const unit = yAxisColumn?.unit || undefined\n const groupKey = DatasetHelper.getGroupKey(keys, rawData)\n const groupsData = groupKey ? DatasetHelper.groupRowsByKey(rawData, groupKey.id) : [rawData]\n\n const labels = groupsData[0]?.map((row) => {\n return `${row[xAxisColumn.id].raw}`\n })\n\n const datasets: ChartDataset[] = groupsData.map((groupData) => {\n const data = groupData.map((row) => +row[yAxisColumn.id].raw)\n return {\n label: groupKey ? `${groupData[0][groupKey.id].raw}` : yAxisColumn.display,\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 = (chartDefinition: DashboardVisualisation, data: DashboardDataResponse[]): MoJTable => {\n const { columns } = chartDefinition\n const { keys, measures } = columns\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: DashboardVisualisation,\n timeseriesData: DashboardDataResponse[],\n): ChartData => {\n const { columns } = chartDefinition\n const { keys, measures } = columns\n\n const unit = measures[0].unit ? measures[0].unit : undefined\n const type = chartDefinition.type.split('-')[0]\n const groupKey = DatasetHelper.getGroupKey(keys, timeseriesData)\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: ChartDataset[] = []\n for (let index = 0; index < datasetCount; index += 1) {\n const data = timeBlockData.map((timeperiod) => {\n return +timeperiod[index][measures[1].id].raw\n })\n const total = data.reduce((a, c) => a + c, 0)\n const label = timeBlockData[0][index][labelId].raw as string\n\n datasets.push({\n data,\n label,\n total,\n })\n }\n\n return {\n type: type as unknown as ChartType,\n unit,\n timeseries: true,\n data: {\n labels,\n datasets,\n },\n }\n}\n\nconst createTimeseriesTable = (\n chartDefinition: DashboardVisualisation,\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.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": "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",
6
- "names": ["utils_exports", "__export", "createChart", "createMatrixChart", "createTimeseriesCharts", "utils_default", "__toCommonJS", "import_dayjs", "import_weekOfYear", "import_utils", "import_datasetHelper", "import_types", "dayjs", "weekOfYear", "chartDefinition", "rawData", "table", "chart", "details", "dataSetRows", "snapshotData", "getDataForSnapshotCharts", "createSnapshotChart", "createSnapshotTable", "getChartDetails", "latestData", "timeseriesData", "getDataForTimeseriesCharts", "createTimeseriesChart", "createTimeseriesTable", "query", "granularity", "key", "data", "DatasetHelper", "timeseries", "meta", "headlines", "createHeadlines", "columns", "measures", "isListChart", "col", "headline", "headlineColumn", "value", "label", "acc", "d", "type", "labels", "unit", "datasets", "buildChartFromListData", "buildChart", "keys", "labelId", "row", "rowId", "total", "val", "xAxisColumn", "yAxisColumn", "groupKey", "groupsData", "groupData", "head", "column", "filteredRowData", "rows", "DashboardListUtils", "timeBlockData", "datasetCount", "index", "timeperiod", "a", "c", "flatTimeseriesData", "headerColumns", "timestampIndex", "m", "timestampCol", "k"]
4
+ "sourcesContent": ["import dayjs from 'dayjs'\nimport weekOfYear from 'dayjs/plugin/weekOfYear'\nimport {\n ChartData,\n MoJTable,\n ChartCardData,\n ChartDataset,\n ChartType,\n ChartDetails,\n ChartMetaData,\n} from '../../types/Charts'\nimport { DashboardDataResponse } from '../../types/Metrics'\nimport {\n BarChartVisualisationColumn,\n DashboardVisualisation,\n DashboardVisualisationColumns,\n} from '../_dashboards/dashboard/types'\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/Heatmap'\n\ndayjs.extend(weekOfYear)\n\nexport const createChart = (\n chartDefinition: DashboardVisualisation,\n rawData: DashboardDataResponse[],\n): ChartCardData => {\n let table: MoJTable\n let chart: ChartData\n let details: ChartDetails\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: DashboardVisualisation,\n rawData: DashboardDataResponse[],\n): ChartCardData => {\n let table: MoJTable\n let chart: ChartData\n let details: ChartDetails\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: DashboardVisualisation,\n rawData: DashboardDataResponse[],\n query: Record<string, string | string[]>,\n) => {\n let table: MoJTable\n let chart: ChartData\n let details: ChartDetails\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 = (chartDefinition: DashboardVisualisation, rawData: DashboardDataResponse[]) => {\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 = (chartDefinition: DashboardVisualisation, rawData: DashboardDataResponse[]) => {\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: DashboardVisualisation,\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) {\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: DashboardVisualisation,\n data: DashboardDataResponse[],\n timeseries = false,\n) => {\n const headlines: ChartMetaData[] = []\n const { columns } = chartDefinition\n const { measures } = columns\n const isListChart = !!(<BarChartVisualisationColumn[]>measures).find((col) => col.axis)\n let headline: ChartMetaData\n\n let headlineColumn: BarChartVisualisationColumn\n let value: number\n let label: string\n\n if (timeseries) {\n headlineColumn = <BarChartVisualisationColumn>measures.find((col) => col.id !== 'ts')\n if (headlineColumn) {\n label = `${data[0].ts.raw}`\n value = +data[0][headlineColumn.id].raw\n\n headline = {\n label,\n value,\n }\n }\n } else {\n headlineColumn = !isListChart\n ? <BarChartVisualisationColumn>measures[0]\n : measures.find((col: BarChartVisualisationColumn) => col.axis && col.axis === 'y')\n\n if (headlineColumn) {\n label = `Total ${headlineColumn.display.toLowerCase()}`\n value = data.reduce((acc: number, d: DashboardDataResponse) => acc + +d[headlineColumn.id].raw, 0)\n\n headline = {\n label,\n value,\n }\n }\n }\n\n headlines.push(headline)\n\n return headlines\n}\n\nconst createSnapshotChart = (\n chartDefinition: DashboardVisualisation,\n snapshotData: DashboardDataResponse[],\n): ChartData => {\n const { type, columns } = chartDefinition\n const { measures } = columns\n const isListChart = !!(<BarChartVisualisationColumn[]>measures).find((col) => col.axis)\n\n let labels: string[]\n let unit\n let datasets: ChartDataset[]\n\n if (!isListChart) {\n ;({ labels, unit, datasets } = buildChart(columns, snapshotData))\n } else {\n ;({ labels, unit, datasets } = buildChartFromListData(columns, snapshotData))\n }\n\n return {\n type: type as unknown as ChartType,\n unit,\n data: {\n labels,\n datasets,\n },\n }\n}\n\nconst buildChart = (columns: DashboardVisualisationColumns, rawData: DashboardDataResponse[]) => {\n const { keys, measures } = columns\n const labels = measures.map((col) => col.display)\n const labelId = keys[keys.length - 1]?.id as keyof DashboardDataResponse\n const unit = measures[0].unit ? measures[0].unit : undefined\n\n const datasets = rawData.map((row) => {\n const label = 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 : 0\n })\n const total = data.reduce((acc: number, val: number) => acc + val, 0)\n return { label, data, total } as ChartDataset\n })\n\n return {\n labels,\n unit,\n datasets,\n }\n}\n\nconst buildChartFromListData = (columns: DashboardVisualisationColumns, rawData: DashboardDataResponse[]) => {\n const { measures, keys } = columns\n\n const xAxisColumn = (<BarChartVisualisationColumn[]>measures).find((col) => col.axis === 'x')\n const yAxisColumn = (<BarChartVisualisationColumn[]>measures).find((col) => col.axis === 'y')\n\n const unit = yAxisColumn?.unit || undefined\n const groupKey = DatasetHelper.getGroupKey(keys, rawData)\n const groupsData = groupKey ? DatasetHelper.groupRowsByKey(rawData, groupKey.id) : [rawData]\n\n const labels = groupsData[0]?.map((row) => {\n return `${row[xAxisColumn.id].raw}`\n })\n\n const datasets: ChartDataset[] = groupsData.map((groupData) => {\n const data = groupData.map((row) => +row[yAxisColumn.id].raw)\n return {\n label: groupKey ? `${groupData[0][groupKey.id].raw}` : yAxisColumn.display,\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 = (chartDefinition: DashboardVisualisation, data: DashboardDataResponse[]): MoJTable => {\n const { columns } = chartDefinition\n const { keys, measures } = columns\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: DashboardVisualisation,\n timeseriesData: DashboardDataResponse[],\n): ChartData => {\n const { columns } = chartDefinition\n const { keys, measures } = columns\n\n const unit = measures[0].unit ? measures[0].unit : undefined\n const type = chartDefinition.type.split('-')[0]\n const groupKey = DatasetHelper.getGroupKey(keys, timeseriesData)\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: ChartDataset[] = []\n for (let index = 0; index < datasetCount; index += 1) {\n const data = timeBlockData.map((timeperiod) => {\n return +timeperiod[index][measures[1].id].raw\n })\n const total = data.reduce((a, c) => a + c, 0)\n const label = timeBlockData[0][index][labelId].raw as string\n\n datasets.push({\n data,\n label,\n total,\n })\n }\n\n return {\n type: type as unknown as ChartType,\n unit,\n timeseries: true,\n data: {\n labels,\n datasets,\n },\n }\n}\n\nconst createTimeseriesTable = (\n chartDefinition: DashboardVisualisation,\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.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": "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",
6
+ "names": ["utils_exports", "__export", "createChart", "createMatrixChart", "createTimeseriesCharts", "utils_default", "__toCommonJS", "import_dayjs", "import_weekOfYear", "import_datasetHelper", "import_utils", "import_types", "import_Heatmap", "dayjs", "weekOfYear", "chartDefinition", "rawData", "table", "chart", "details", "dataSetRows", "snapshotData", "getDataForSnapshotCharts", "createSnapshotChart", "createSnapshotTable", "getChartDetails", "latestData", "timeseriesData", "getDataForTimeseriesCharts", "createTimeseriesChart", "createTimeseriesTable", "query", "granularity", "key", "HeatmapChart", "data", "DatasetHelper", "timeseries", "meta", "headlines", "createHeadlines", "columns", "measures", "isListChart", "col", "headline", "headlineColumn", "value", "label", "acc", "d", "type", "labels", "unit", "datasets", "buildChartFromListData", "buildChart", "keys", "labelId", "row", "rowId", "total", "val", "xAxisColumn", "yAxisColumn", "groupKey", "groupsData", "groupData", "head", "column", "filteredRowData", "rows", "DashboardListUtils", "timeBlockData", "datasetCount", "index", "timeperiod", "a", "c", "flatTimeseriesData", "headerColumns", "timestampIndex", "m", "timestampCol", "k"]
7
7
  }
@@ -9,7 +9,6 @@ import {
9
9
  ChartDetails,
10
10
  ChartMetaData,
11
11
  } from '../../types/Charts'
12
- import { createTimeseriesMatrixChart } from './chart/heatmap/utils'
13
12
  import { DashboardDataResponse } from '../../types/Metrics'
14
13
  import {
15
14
  BarChartVisualisationColumn,
@@ -19,6 +18,7 @@ import {
19
18
  import DatasetHelper from '../../utils/datasetHelper'
20
19
  import DashboardListUtils from '../_dashboards/dashboard-list/utils'
21
20
  import { Granularity } from '../_inputs/granular-date-range/types'
21
+ import HeatmapChart from './chart/heatmap/Heatmap'
22
22
 
23
23
  dayjs.extend(weekOfYear)
24
24
 
@@ -83,7 +83,7 @@ export const createMatrixChart = (
83
83
 
84
84
  const { latestData, dataSetRows, timeseriesData } = getDataForTimeseriesCharts(chartDefinition, rawData)
85
85
  if (dataSetRows.length) {
86
- chart = createTimeseriesMatrixChart(chartDefinition, timeseriesData, granularity)
86
+ chart = new HeatmapChart(timeseriesData, granularity, chartDefinition).build()
87
87
  table = createTimeseriesTable(chartDefinition, timeseriesData)
88
88
  details = getChartDetails(chartDefinition, latestData, true)
89
89
  }
@@ -1,2 +1,2 @@
1
- var e=Object.defineProperty;var u=Object.getOwnPropertyDescriptor;var d=Object.getOwnPropertyNames;var c=Object.prototype.hasOwnProperty;var p=(s,a)=>{for(var t in a)e(s,t,{get:a[t],enumerable:!0})},m=(s,a,t,r)=>{if(a&&typeof a=="object"||typeof a=="function")for(let o of d(a))!c.call(s,o)&&o!==t&&e(s,o,{get:()=>a[o],enumerable:!(r=u(a,o))||r.enumerable});return s};var b=s=>m(e({},"__esModule",{value:!0}),s);var x={};p(x,{AggregateType:()=>l,DashboardVisualisationType:()=>n});module.exports=b(x);var n=(i=>(i.LIST="list",i.DONUT="doughnut",i.BAR="bar",i.LINE="line",i.MATRIX="matrix",i.MATRIX_TIMESERIES="matrix-timeseries",i.BAR_TIMESERIES="bar-timeseries",i.LINE_TIMESERIES="line-timeseries",i.SCORECARD="scorecard",i.SCORECARD_GROUP="scorecard-group",i))(n||{}),l=(t=>(t.SUM="sum",t.AVG="average",t))(l||{});0&&(module.exports={AggregateType,DashboardVisualisationType});
1
+ var e=Object.defineProperty;var u=Object.getOwnPropertyDescriptor;var d=Object.getOwnPropertyNames;var c=Object.prototype.hasOwnProperty;var p=(s,a)=>{for(var t in a)e(s,t,{get:a[t],enumerable:!0})},b=(s,a,t,r)=>{if(a&&typeof a=="object"||typeof a=="function")for(let o of d(a))!c.call(s,o)&&o!==t&&e(s,o,{get:()=>a[o],enumerable:!(r=u(a,o))||r.enumerable});return s};var m=s=>b(e({},"__esModule",{value:!0}),s);var x={};p(x,{AggregateType:()=>l,DashboardVisualisationType:()=>n});module.exports=m(x);var n=(i=>(i.LIST="list",i.DONUT="doughnut",i.BAR="bar",i.LINE="line",i.MATRIX="matrix",i.MATRIX_TIMESERIES="matrix-timeseries",i.BAR_TIMESERIES="bar-timeseries",i.LINE_TIMESERIES="line-timeseries",i.SCORECARD="scorecard",i.SCORECARD_GROUP="scorecard-group",i))(n||{}),l=(t=>(t.SUM="sum",t.AVG="average",t))(l||{});0&&(module.exports={AggregateType,DashboardVisualisationType});
2
2
  //# sourceMappingURL=types.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../src/dpr/components/_dashboards/dashboard/types.ts"],
4
- "sourcesContent": ["import { components } from '../../../types/api'\nimport { ChartCardData, MoJTable, UnitType } from '../../../types/Charts'\nimport { Scorecard, ScorecardGroup } from '../scorecard/types'\n\nexport interface DashboardDefinition {\n id: string\n name: string\n description?: string\n sections: DashboardSection[]\n isMissing?: boolean\n filterFields: components['schemas']['FieldDefinition'][]\n}\n\nexport interface DashboardSection {\n id: string\n display?: string\n description?: string\n visualisations: DashboardVisualisation[]\n}\n\nexport interface DashboardUISection {\n id: string\n title?: string\n description?: string\n visualisations?: DashboardUIVisualisation[]\n}\n\nexport interface DashboardUIVisualisation {\n id: string\n type: DashboardVisualisationType\n title?: string\n description?: string\n data: Scorecard | Scorecard[] | ScorecardGroup[] | ChartCardData | { table: MoJTable; ts: string }\n}\n\nexport interface DashboardVisualisation {\n id: string\n type: DashboardVisualisationType\n display?: string\n description?: string\n columns: DashboardVisualisationColumns\n options: DashboardVisualisationOptions\n}\n\nexport type DashboardVisualisationOptions = ListDashboardVisualisationOptions | MatrixDashboardVisualisationOptions\n\nexport interface ListDashboardVisualisationOptions {\n showLatest?: boolean\n columnsAsList?: boolean\n}\n\nexport interface MatrixDashboardVisualisationOptions {\n useRagColours?: boolean\n}\n\nexport interface ListVisualisation extends DashboardVisualisation {\n type: DashboardVisualisationType.LIST\n}\n\nexport enum DashboardVisualisationType {\n LIST = 'list',\n DONUT = 'doughnut',\n BAR = 'bar',\n LINE = 'line',\n MATRIX = 'matrix',\n MATRIX_TIMESERIES = 'matrix-timeseries',\n BAR_TIMESERIES = 'bar-timeseries',\n LINE_TIMESERIES = 'line-timeseries',\n SCORECARD = 'scorecard',\n SCORECARD_GROUP = 'scorecard-group',\n}\n\nexport interface DashboardVisualisationColumns {\n keys?: DashboardVisualisationColumnKey[]\n measures: DashboardVisualisationColumnMeasure[]\n filters?: DashboardVisualisationColumnFilter[]\n expectNulls: boolean\n}\n\nexport interface DashboardVisualisationColumn {\n id: string\n display?: string\n}\n\nexport interface DashboardVisualisationColumnKey extends DashboardVisualisationColumn {\n optional?: boolean\n}\n\nexport interface DashboardVisualisationColumnMeasure extends DashboardVisualisationColumn {\n aggregate?: AggregateType\n displayValue?: boolean\n unit?: UnitType\n axis?: 'x' | 'y'\n}\n\nexport interface DashboardVisualisationColumnFilter {\n id: string\n equals: string | number\n}\n\nexport interface BarChartVisualisationColumn extends DashboardVisualisationColumnMeasure {\n axis?: 'x' | 'y'\n}\n\nexport interface ScorecardVisualisationColumn extends DashboardVisualisationColumn {\n displayValue: boolean\n}\n\nexport enum AggregateType {\n SUM = 'sum',\n AVG = 'average',\n}\n"],
5
- "mappings": "4ZAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,mBAAAE,EAAA,+BAAAC,IAAA,eAAAC,EAAAJ,GA2DO,IAAKG,OACVA,EAAA,KAAO,OACPA,EAAA,MAAQ,WACRA,EAAA,IAAM,MACNA,EAAA,KAAO,OACPA,EAAA,OAAS,SACTA,EAAA,kBAAoB,oBACpBA,EAAA,eAAiB,iBACjBA,EAAA,gBAAkB,kBAClBA,EAAA,UAAY,YACZA,EAAA,gBAAkB,kBAVRA,OAAA,IAiDAD,OACVA,EAAA,IAAM,MACNA,EAAA,IAAM,UAFIA,OAAA",
4
+ "sourcesContent": ["import { components } from '../../../types/api'\nimport { ChartCardData, MoJTable, UnitType } from '../../../types/Charts'\nimport { Scorecard, ScorecardGroup } from '../scorecard/types'\n\nexport interface DashboardDefinition {\n id: string\n name: string\n description?: string\n sections: DashboardSection[]\n isMissing?: boolean\n filterFields: components['schemas']['FieldDefinition'][]\n}\n\nexport interface DashboardSection {\n id: string\n display?: string\n description?: string\n visualisations: DashboardVisualisation[]\n}\n\nexport interface DashboardUISection {\n id: string\n title?: string\n description?: string\n visualisations?: DashboardUIVisualisation[]\n}\n\nexport interface DashboardUIVisualisation {\n id: string\n type: DashboardVisualisationType\n title?: string\n description?: string\n data: Scorecard | Scorecard[] | ScorecardGroup[] | ChartCardData | { table: MoJTable; ts: string }\n}\n\nexport interface DashboardVisualisation {\n id: string\n type: DashboardVisualisationType\n display?: string\n description?: string\n columns: DashboardVisualisationColumns\n options: DashboardVisualisationOptions\n}\n\nexport type DashboardVisualisationOptions = ListDashboardVisualisationOptions | MatrixDashboardVisualisationOptions\n\nexport interface ListDashboardVisualisationOptions {\n showLatest?: boolean\n columnsAsList?: boolean\n}\n\nexport interface MatrixDashboardVisualisationOptions {\n useRagColours?: boolean\n buckets?: MatrixDashboardVisualisationBucket[]\n baseColour?: string\n}\n\nexport interface MatrixDashboardVisualisationBucket {\n min?: number\n max?: number\n hexColour?: string\n}\n\nexport interface ListVisualisation extends DashboardVisualisation {\n type: DashboardVisualisationType.LIST\n}\n\nexport enum DashboardVisualisationType {\n LIST = 'list',\n DONUT = 'doughnut',\n BAR = 'bar',\n LINE = 'line',\n MATRIX = 'matrix',\n MATRIX_TIMESERIES = 'matrix-timeseries',\n BAR_TIMESERIES = 'bar-timeseries',\n LINE_TIMESERIES = 'line-timeseries',\n SCORECARD = 'scorecard',\n SCORECARD_GROUP = 'scorecard-group',\n}\n\nexport interface DashboardVisualisationColumns {\n keys?: DashboardVisualisationColumnKey[]\n measures: DashboardVisualisationColumnMeasure[]\n filters?: DashboardVisualisationColumnFilter[]\n expectNulls: boolean\n}\n\nexport interface DashboardVisualisationColumn {\n id: string\n display?: string\n}\n\nexport interface DashboardVisualisationColumnKey extends DashboardVisualisationColumn {\n optional?: boolean\n}\n\nexport interface DashboardVisualisationColumnMeasure extends DashboardVisualisationColumn {\n aggregate?: AggregateType\n displayValue?: boolean\n unit?: UnitType\n axis?: 'x' | 'y'\n}\n\nexport interface DashboardVisualisationColumnFilter {\n id: string\n equals: string | number\n}\n\nexport interface BarChartVisualisationColumn extends DashboardVisualisationColumnMeasure {\n axis?: 'x' | 'y'\n}\n\nexport interface ScorecardVisualisationColumn extends DashboardVisualisationColumn {\n displayValue: boolean\n}\n\nexport enum AggregateType {\n SUM = 'sum',\n AVG = 'average',\n}\n"],
5
+ "mappings": "4ZAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,mBAAAE,EAAA,+BAAAC,IAAA,eAAAC,EAAAJ,GAmEO,IAAKG,OACVA,EAAA,KAAO,OACPA,EAAA,MAAQ,WACRA,EAAA,IAAM,MACNA,EAAA,KAAO,OACPA,EAAA,OAAS,SACTA,EAAA,kBAAoB,oBACpBA,EAAA,eAAiB,iBACjBA,EAAA,gBAAkB,kBAClBA,EAAA,UAAY,YACZA,EAAA,gBAAkB,kBAVRA,OAAA,IAiDAD,OACVA,EAAA,IAAM,MACNA,EAAA,IAAM,UAFIA,OAAA",
6
6
  "names": ["types_exports", "__export", "AggregateType", "DashboardVisualisationType", "__toCommonJS"]
7
7
  }
@@ -51,6 +51,14 @@ export interface ListDashboardVisualisationOptions {
51
51
 
52
52
  export interface MatrixDashboardVisualisationOptions {
53
53
  useRagColours?: boolean
54
+ buckets?: MatrixDashboardVisualisationBucket[]
55
+ baseColour?: string
56
+ }
57
+
58
+ export interface MatrixDashboardVisualisationBucket {
59
+ min?: number
60
+ max?: number
61
+ hexColour?: string
54
62
  }
55
63
 
56
64
  export interface ListVisualisation extends DashboardVisualisation {
@@ -1,2 +1,2 @@
1
- var R=Object.create;var b=Object.defineProperty;var D=Object.getOwnPropertyDescriptor;var f=Object.getOwnPropertyNames;var x=Object.getPrototypeOf,L=Object.prototype.hasOwnProperty;var y=(t,s)=>{for(var e in s)b(t,e,{get:s[e],enumerable:!0})},d=(t,s,e,a)=>{if(s&&typeof s=="object"||typeof s=="function")for(let o of f(s))!L.call(t,o)&&o!==e&&b(t,o,{get:()=>s[o],enumerable:!(a=D(s,o))||a.enumerable});return t};var M=(t,s,e)=>(e=t!=null?R(x(t)):{},d(s||!t||!t.__esModule?b(e,"default",{value:t,enumerable:!0}):e,t)),T=t=>d(b({},"__esModule",{value:!0}),t);var A={};y(A,{createList:()=>g,createTableRows:()=>w,default:()=>O});module.exports=T(A);var p=M(require("../../../utils/datasetHelper"));const g=(t,s)=>{const{columns:e,options:a}=t,o=a?.showLatest||!0,l=a?.columnsAsList,{measures:n,keys:i}=e,r=!n&&!i||!n.length&&!i;let c=[...s];o&&(c=p.default.getLastestDataset(c));let u,h,m;return r?{head:u,rows:h,ts:m}=C(c):l?{head:u,rows:h,ts:m}=V(t,c):{head:u,rows:h,ts:m}=J(t,c),h.length&&n&&(h=E(h,n)),{table:{head:u,rows:h},ts:m}},V=(t,s)=>{const{columns:e}=t,{keys:a,measures:o}=e,l=p.default.getGroupKey(a||[],s),n=s[0]?.ts?.raw,i=n?`${n}`:"",r=[];r.push({text:""}),s.forEach(u=>{r.push({text:l?u[l.id].raw:""})});const c=[];return o.forEach(u=>{c.push([{text:u.display}])}),o.forEach((u,h)=>{s.forEach(m=>{c[h].push({text:`${m[u.id].raw}`})})}),{rows:c,head:r,ts:i}},w=(t,s)=>t.map(e=>{const a=s?.length?Array(s.length):Array(Object.keys(t[0]).length);return Object.keys(e).forEach((o,l)=>{const n=s?.length?s.findIndex(r=>r.id===o):l,i=e[o].raw;a.splice(n,1,{text:i})}),a}),J=(t,s)=>{const{measures:e}=t.columns,a=e.map(c=>({text:c.display})),o=p.default.getDatasetRows(t,s),l=p.default.filterRowsByDisplayColumns(t,o),n=w(l,e),i=o[0]?.ts?.raw,r=i?`${i}`:"";return{head:a,rows:n,ts:r}},C=t=>{const s=Object.keys(t[0]).map(n=>({text:n})),e=w(t),o=p.default.getLastestDataset(t)[0]?.ts?.raw,l=o?`${o}`:"";return{head:s,rows:e,ts:l}},E=(t,s)=>{const e=s.flatMap((a,o)=>a.aggregate?[o]:[]);if(e.length){const a=[{html:"<strong>Total<strong>"}];for(let o=1;o<s.length;o+=1)a[o]={text:""};t.push(a),e.forEach(o=>{const l=t.reduce((n,i)=>{const r=i[o];return r&&r.text&&(n+=Number(r.text)),n},0);t[t.length-1][o]={html:`<strong>${l}<strong>`}})}return t};var O={createList:g,createTableRows:w};0&&(module.exports={createList,createTableRows});
1
+ var D=Object.create;var w=Object.defineProperty;var f=Object.getOwnPropertyDescriptor;var x=Object.getOwnPropertyNames;var L=Object.getPrototypeOf,y=Object.prototype.hasOwnProperty;var M=(t,s)=>{for(var e in s)w(t,e,{get:s[e],enumerable:!0})},g=(t,s,e,a)=>{if(s&&typeof s=="object"||typeof s=="function")for(let o of x(s))!y.call(t,o)&&o!==e&&w(t,o,{get:()=>s[o],enumerable:!(a=f(s,o))||a.enumerable});return t};var T=(t,s,e)=>(e=t!=null?D(L(t)):{},g(s||!t||!t.__esModule?w(e,"default",{value:t,enumerable:!0}):e,t)),J=t=>g(w({},"__esModule",{value:!0}),t);var $={};M($,{createList:()=>R,createTableRows:()=>d,default:()=>A});module.exports=J($);var p=T(require("../../../utils/datasetHelper"));const R=(t,s)=>{const{columns:e,options:a}=t,o=a,c=o?.showLatest!==void 0?o.showLatest:!0,r=o?.columnsAsList,{measures:l,keys:n}=e,h=!l&&!n||!l.length&&!n;let i=[...s];c&&(i=p.default.getLastestDataset(i));let m,u,b;return h?{head:m,rows:u,ts:b}=E(i):r?{head:m,rows:u,ts:b}=V(t,i):{head:m,rows:u,ts:b}=C(t,i),u.length&&l&&(u=O(u,l)),{table:{head:m,rows:u},ts:b}},V=(t,s)=>{const{columns:e}=t,{keys:a,measures:o}=e,c=p.default.getGroupKey(a||[],s),r=s[0]?.ts?.raw,l=r?`${r}`:"",n=[];n.push({text:""}),s.forEach(i=>{n.push({text:c?i[c.id].raw:""})});const h=[];return o.forEach(i=>{h.push([{text:i.display}])}),o.forEach((i,m)=>{s.forEach(u=>{h[m].push({text:`${u[i.id].raw}`})})}),{rows:h,head:n,ts:l}},d=(t,s)=>t.map(e=>{const a=s?.length?Array(s.length):Array(Object.keys(t[0]).length);return Object.keys(e).forEach((o,c)=>{const r=s?.length?s.findIndex(n=>n.id===o):c,l=e[o].raw;a.splice(r,1,{text:l})}),a}),C=(t,s)=>{const{measures:e}=t.columns,a=e.map(h=>({text:h.display})),o=p.default.getDatasetRows(t,s),c=p.default.filterRowsByDisplayColumns(t,o),r=d(c,e),l=o[0]?.ts?.raw,n=l?`${l}`:"";return{head:a,rows:r,ts:n}},E=t=>{const s=Object.keys(t[0]).map(r=>({text:r})),e=d(t),o=p.default.getLastestDataset(t)[0]?.ts?.raw,c=o?`${o}`:"";return{head:s,rows:e,ts:c}},O=(t,s)=>{const e=s.flatMap((a,o)=>a.aggregate?[o]:[]);if(e.length){const a=[{html:"<strong>Total<strong>"}];for(let o=1;o<s.length;o+=1)a[o]={text:""};t.push(a),e.forEach(o=>{const c=t.reduce((r,l)=>{const n=l[o];return n&&n.text&&(r+=Number(n.text)),r},0);t[t.length-1][o]={html:`<strong>${c}<strong>`}})}return t};var A={createList:R,createTableRows:d};0&&(module.exports={createList,createTableRows});
2
2
  //# sourceMappingURL=utils.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../src/dpr/components/_dashboards/dashboard-list/utils.ts"],
4
- "sourcesContent": ["/* eslint-disable no-param-reassign */\nimport { MoJTable, MoJTableRow } from '../../../types/Charts'\nimport { DashboardDataResponse } from '../../../types/Metrics'\nimport {\n DashboardVisualisationColumn,\n DashboardVisualisationColumnMeasure,\n ListDashboardVisualisationOptions,\n ListVisualisation,\n} from '../dashboard/types'\nimport DatasetHelper from '../../../utils/datasetHelper'\n\nexport const createList = (\n listDefinition: ListVisualisation,\n dashboardData: DashboardDataResponse[],\n): { table: MoJTable; ts: string } => {\n const { columns, options } = listDefinition\n const showLatest = (<ListDashboardVisualisationOptions>options)?.showLatest || true\n const columnsAsList = (<ListDashboardVisualisationOptions>options)?.columnsAsList\n const { measures, keys } = columns\n const showAllData = (!measures && !keys) || (!measures.length && !keys)\n\n let datasetData: DashboardDataResponse[] = [...dashboardData]\n if (showLatest) {\n datasetData = DatasetHelper.getLastestDataset(datasetData)\n }\n\n let head\n let rows\n let ts\n\n if (showAllData) {\n ;({ head, rows, ts } = createFullList(datasetData))\n } else if (columnsAsList) {\n ;({ head, rows, ts } = createListFromColumns(listDefinition, datasetData))\n } else {\n ;({ head, rows, ts } = creatListFromRows(listDefinition, datasetData))\n }\n\n if (rows.length && measures) rows = sumColumns(rows, measures)\n\n return {\n table: {\n head,\n rows,\n },\n ts,\n }\n}\n\nconst createListFromColumns = (listDefinition: ListVisualisation, dashboardData: DashboardDataResponse[]) => {\n const { columns } = listDefinition\n const { keys, measures } = columns\n const groupKey = DatasetHelper.getGroupKey(keys || [], dashboardData)\n\n const timestampData = dashboardData[0]?.ts?.raw\n const ts = timestampData ? `${timestampData}` : ''\n\n const head = []\n head.push({ text: '' })\n dashboardData.forEach((row) => {\n head.push({\n text: groupKey ? row[groupKey.id].raw : '',\n })\n })\n\n const rows: MoJTableRow[][] = []\n measures.forEach((measure) => {\n rows.push([{ text: measure.display }] as MoJTableRow[])\n })\n\n measures.forEach((measure, index) => {\n dashboardData.forEach((row) => {\n rows[index].push({ text: `${row[measure.id].raw}` })\n })\n })\n\n return {\n rows,\n head,\n ts,\n }\n}\n\nexport const createTableRows = (\n data: DashboardDataResponse[],\n measures?: DashboardVisualisationColumn[],\n): MoJTableRow[][] => {\n return data.map((dataRow) => {\n const row: MoJTableRow[] = measures?.length ? Array(measures.length) : Array(Object.keys(data[0]).length)\n Object.keys(dataRow).forEach((key, index) => {\n const headIndex = measures?.length ? measures.findIndex((m) => m.id === key) : index\n const text = dataRow[key].raw\n row.splice(headIndex, 1, { text } as MoJTableRow)\n })\n\n return row\n })\n}\n\nconst creatListFromRows = (listDefinition: ListVisualisation, dashboardData: DashboardDataResponse[]) => {\n const { measures } = listDefinition.columns\n\n const head = measures.map((column) => {\n return { text: column.display }\n })\n\n const dataSetRows = DatasetHelper.getDatasetRows(listDefinition, dashboardData)\n const displayRows = DatasetHelper.filterRowsByDisplayColumns(listDefinition, dataSetRows)\n const rows = createTableRows(displayRows, measures)\n\n const timestampData = dataSetRows[0]?.ts?.raw\n const ts = timestampData ? `${timestampData}` : ''\n\n return {\n head,\n rows,\n ts,\n }\n}\n\nconst createFullList = (dashboardData: DashboardDataResponse[]) => {\n const head = Object.keys(dashboardData[0]).map((key) => {\n return { text: key }\n })\n const rows = createTableRows(dashboardData)\n\n const latestData = DatasetHelper.getLastestDataset(dashboardData)\n const timestampData = latestData[0]?.ts?.raw\n const ts = timestampData ? `${timestampData}` : ''\n\n return {\n head,\n rows,\n ts,\n }\n}\n\nconst sumColumns = (rowsData: MoJTableRow[][], measures: DashboardVisualisationColumnMeasure[]) => {\n const sumColumnIndexes: number[] = measures.flatMap((col, idx) => (col.aggregate ? [idx] : []))\n\n if (sumColumnIndexes.length) {\n const sumRow: MoJTableRow[] = [{ html: `<strong>Total<strong>` }]\n for (let index = 1; index < measures.length; index += 1) {\n sumRow[index] = { text: '' }\n }\n\n rowsData.push(sumRow)\n sumColumnIndexes.forEach((index) => {\n const total = rowsData.reduce((acc, row) => {\n const rowIndex = row[index]\n if (rowIndex && rowIndex.text) {\n acc += Number(rowIndex.text)\n }\n return acc\n }, 0)\n rowsData[rowsData.length - 1][index] = {\n html: `<strong>${total}<strong>`,\n }\n })\n }\n\n return rowsData\n}\n\nexport default {\n createList,\n createTableRows,\n}\n"],
5
- "mappings": "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",
6
- "names": ["utils_exports", "__export", "createList", "createTableRows", "utils_default", "__toCommonJS", "import_datasetHelper", "listDefinition", "dashboardData", "columns", "options", "showLatest", "columnsAsList", "measures", "keys", "showAllData", "datasetData", "DatasetHelper", "head", "rows", "ts", "createFullList", "createListFromColumns", "creatListFromRows", "sumColumns", "groupKey", "timestampData", "row", "measure", "index", "data", "dataRow", "key", "headIndex", "m", "text", "column", "dataSetRows", "displayRows", "rowsData", "sumColumnIndexes", "col", "idx", "sumRow", "total", "acc", "rowIndex"]
4
+ "sourcesContent": ["/* eslint-disable no-param-reassign */\nimport { MoJTable, MoJTableRow } from '../../../types/Charts'\nimport { DashboardDataResponse } from '../../../types/Metrics'\nimport {\n DashboardVisualisationColumn,\n DashboardVisualisationColumnMeasure,\n ListDashboardVisualisationOptions,\n ListVisualisation,\n} from '../dashboard/types'\nimport DatasetHelper from '../../../utils/datasetHelper'\n\nexport const createList = (\n listDefinition: ListVisualisation,\n dashboardData: DashboardDataResponse[],\n): { table: MoJTable; ts: string } => {\n const { columns, options } = listDefinition\n const listOptions = <ListDashboardVisualisationOptions>options\n const showLatest = listOptions?.showLatest !== undefined ? listOptions.showLatest : true\n const columnsAsList = listOptions?.columnsAsList\n const { measures, keys } = columns\n const showAllData = (!measures && !keys) || (!measures.length && !keys)\n\n let datasetData: DashboardDataResponse[] = [...dashboardData]\n if (showLatest) {\n datasetData = DatasetHelper.getLastestDataset(datasetData)\n }\n\n let head\n let rows\n let ts\n\n if (showAllData) {\n ;({ head, rows, ts } = createFullList(datasetData))\n } else if (columnsAsList) {\n ;({ head, rows, ts } = createListFromColumns(listDefinition, datasetData))\n } else {\n ;({ head, rows, ts } = creatListFromRows(listDefinition, datasetData))\n }\n\n if (rows.length && measures) rows = sumColumns(rows, measures)\n\n return {\n table: {\n head,\n rows,\n },\n ts,\n }\n}\n\nconst createListFromColumns = (listDefinition: ListVisualisation, dashboardData: DashboardDataResponse[]) => {\n const { columns } = listDefinition\n const { keys, measures } = columns\n const groupKey = DatasetHelper.getGroupKey(keys || [], dashboardData)\n\n const timestampData = dashboardData[0]?.ts?.raw\n const ts = timestampData ? `${timestampData}` : ''\n\n const head = []\n head.push({ text: '' })\n dashboardData.forEach((row) => {\n head.push({\n text: groupKey ? row[groupKey.id].raw : '',\n })\n })\n\n const rows: MoJTableRow[][] = []\n measures.forEach((measure) => {\n rows.push([{ text: measure.display }] as MoJTableRow[])\n })\n\n measures.forEach((measure, index) => {\n dashboardData.forEach((row) => {\n rows[index].push({ text: `${row[measure.id].raw}` })\n })\n })\n\n return {\n rows,\n head,\n ts,\n }\n}\n\nexport const createTableRows = (\n data: DashboardDataResponse[],\n measures?: DashboardVisualisationColumn[],\n): MoJTableRow[][] => {\n return data.map((dataRow) => {\n const row: MoJTableRow[] = measures?.length ? Array(measures.length) : Array(Object.keys(data[0]).length)\n Object.keys(dataRow).forEach((key, index) => {\n const headIndex = measures?.length ? measures.findIndex((m) => m.id === key) : index\n const text = dataRow[key].raw\n row.splice(headIndex, 1, { text } as MoJTableRow)\n })\n\n return row\n })\n}\n\nconst creatListFromRows = (listDefinition: ListVisualisation, dashboardData: DashboardDataResponse[]) => {\n const { measures } = listDefinition.columns\n\n const head = measures.map((column) => {\n return { text: column.display }\n })\n\n const dataSetRows = DatasetHelper.getDatasetRows(listDefinition, dashboardData)\n const displayRows = DatasetHelper.filterRowsByDisplayColumns(listDefinition, dataSetRows)\n const rows = createTableRows(displayRows, measures)\n\n const timestampData = dataSetRows[0]?.ts?.raw\n const ts = timestampData ? `${timestampData}` : ''\n\n return {\n head,\n rows,\n ts,\n }\n}\n\nconst createFullList = (dashboardData: DashboardDataResponse[]) => {\n const head = Object.keys(dashboardData[0]).map((key) => {\n return { text: key }\n })\n const rows = createTableRows(dashboardData)\n\n const latestData = DatasetHelper.getLastestDataset(dashboardData)\n const timestampData = latestData[0]?.ts?.raw\n const ts = timestampData ? `${timestampData}` : ''\n\n return {\n head,\n rows,\n ts,\n }\n}\n\nconst sumColumns = (rowsData: MoJTableRow[][], measures: DashboardVisualisationColumnMeasure[]) => {\n const sumColumnIndexes: number[] = measures.flatMap((col, idx) => (col.aggregate ? [idx] : []))\n\n if (sumColumnIndexes.length) {\n const sumRow: MoJTableRow[] = [{ html: `<strong>Total<strong>` }]\n for (let index = 1; index < measures.length; index += 1) {\n sumRow[index] = { text: '' }\n }\n\n rowsData.push(sumRow)\n sumColumnIndexes.forEach((index) => {\n const total = rowsData.reduce((acc, row) => {\n const rowIndex = row[index]\n if (rowIndex && rowIndex.text) {\n acc += Number(rowIndex.text)\n }\n return acc\n }, 0)\n rowsData[rowsData.length - 1][index] = {\n html: `<strong>${total}<strong>`,\n }\n })\n }\n\n return rowsData\n}\n\nexport default {\n createList,\n createTableRows,\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["utils_exports", "__export", "createList", "createTableRows", "utils_default", "__toCommonJS", "import_datasetHelper", "listDefinition", "dashboardData", "columns", "options", "listOptions", "showLatest", "columnsAsList", "measures", "keys", "showAllData", "datasetData", "DatasetHelper", "head", "rows", "ts", "createFullList", "createListFromColumns", "creatListFromRows", "sumColumns", "groupKey", "timestampData", "row", "measure", "index", "data", "dataRow", "key", "headIndex", "m", "text", "column", "dataSetRows", "displayRows", "rowsData", "sumColumnIndexes", "col", "idx", "sumRow", "total", "acc", "rowIndex"]
7
7
  }
@@ -14,8 +14,9 @@ export const createList = (
14
14
  dashboardData: DashboardDataResponse[],
15
15
  ): { table: MoJTable; ts: string } => {
16
16
  const { columns, options } = listDefinition
17
- const showLatest = (<ListDashboardVisualisationOptions>options)?.showLatest || true
18
- const columnsAsList = (<ListDashboardVisualisationOptions>options)?.columnsAsList
17
+ const listOptions = <ListDashboardVisualisationOptions>options
18
+ const showLatest = listOptions?.showLatest !== undefined ? listOptions.showLatest : true
19
+ const columnsAsList = listOptions?.columnsAsList
19
20
  const { measures, keys } = columns
20
21
  const showAllData = (!measures && !keys) || (!measures.length && !keys)
21
22