@ministryofjustice/hmpps-digital-prison-reporting-frontend 4.15.3 → 4.16.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (47) hide show
  1. package/dpr/components/_async/async-filters-form/view.njk +2 -2
  2. package/dpr/components/_catalogue/catalogue-list/utils.test.ts +1 -1
  3. package/dpr/components/_charts/chart/Buckets.js +2 -0
  4. package/dpr/components/_charts/chart/Buckets.js.map +7 -0
  5. package/dpr/components/_charts/chart/Buckets.ts +198 -0
  6. package/dpr/components/_charts/chart/DashboardVisualisation.js +2 -0
  7. package/dpr/components/_charts/chart/DashboardVisualisation.js.map +7 -0
  8. package/dpr/components/_charts/chart/DashboardVisualisation.ts +43 -0
  9. package/dpr/components/_charts/chart/heatmap/HeatmapChart.js +2 -0
  10. package/dpr/components/_charts/chart/heatmap/HeatmapChart.js.map +7 -0
  11. package/dpr/components/_charts/chart/heatmap/HeatmapChart.ts +144 -0
  12. package/dpr/components/_charts/utils.js +1 -1
  13. package/dpr/components/_charts/utils.js.map +3 -3
  14. package/dpr/components/_charts/utils.ts +1 -1
  15. package/dpr/components/_dashboards/dashboard/types.js.map +1 -1
  16. package/dpr/components/_dashboards/dashboard/types.ts +4 -4
  17. package/dpr/components/_dashboards/scorecard/Scorecard.js +2 -0
  18. package/dpr/components/_dashboards/scorecard/Scorecard.js.map +7 -0
  19. package/dpr/components/_dashboards/scorecard/Scorecard.ts +315 -0
  20. package/dpr/components/_dashboards/scorecard/types.js +1 -1
  21. package/dpr/components/_dashboards/scorecard/types.js.map +1 -1
  22. package/dpr/components/_dashboards/scorecard/types.ts +20 -1
  23. package/dpr/components/_dashboards/scorecard/utils.js +1 -1
  24. package/dpr/components/_dashboards/scorecard/utils.js.map +3 -3
  25. package/dpr/components/_dashboards/scorecard/utils.test.ts +8 -437
  26. package/dpr/components/_dashboards/scorecard/utils.ts +2 -265
  27. package/dpr/components/_dashboards/scorecard/view.njk +2 -2
  28. package/dpr/components/_filters/types.d.js.map +1 -1
  29. package/dpr/components/_filters/types.d.ts +1 -0
  30. package/dpr/components/_filters/utils.js +1 -1
  31. package/dpr/components/_filters/utils.js.map +3 -3
  32. package/dpr/components/_filters/utils.ts +17 -12
  33. package/dpr/routes/journeys/request-report/filters/tests.cy.js +1 -1
  34. package/dpr/routes/journeys/request-report/filters/tests.cy.js.map +3 -3
  35. package/dpr/routes/journeys/request-report/filters/tests.cy.ts +40 -0
  36. package/dpr/routes/journeys/view-report/async/dashboard/utils.js +1 -1
  37. package/dpr/routes/journeys/view-report/async/dashboard/utils.js.map +3 -3
  38. package/dpr/routes/journeys/view-report/async/dashboard/utils.ts +3 -2
  39. package/dpr/types/api.d.js.map +1 -1
  40. package/dpr/types/api.d.ts +2 -0
  41. package/dpr/utils/datasetHelper.js +1 -1
  42. package/dpr/utils/datasetHelper.js.map +2 -2
  43. package/dpr/utils/datasetHelper.ts +1 -1
  44. package/package.json +1 -1
  45. package/dpr/components/_charts/chart/heatmap/Heatmap.js +0 -2
  46. package/dpr/components/_charts/chart/heatmap/Heatmap.js.map +0 -7
  47. package/dpr/components/_charts/chart/heatmap/Heatmap.ts +0 -278
@@ -75,9 +75,9 @@
75
75
 
76
76
  {# MAIN FILTERS #}
77
77
  {% if filters.length %}
78
- <div class="dpr-async-request-filters__section">
78
+ <div class="dpr-async-request-filters__section" aria-labelledby="async-filters-title">
79
79
  <div class="dpr-async-request-filters__section--heading">
80
- <h2 class="govuk-heading-m govuk-!-margin-bottom-0">Filters</strong></h2>
80
+ <h2 id="async-filters-title" class="govuk-heading-m govuk-!-margin-bottom-0">Filters</strong></h2>
81
81
  </div>
82
82
 
83
83
  <div class='dpr-request-selected-filters-container'>
@@ -29,7 +29,7 @@ describe('CatalogueUtils', () => {
29
29
  const reportsTableData = await CatalogueUtils.getReportsList(res, services)
30
30
 
31
31
  expect(reportsTableData.head.length).toEqual(4)
32
- expect(reportsTableData.rows.length).toEqual(70)
32
+ expect(reportsTableData.rows.length).toEqual(72)
33
33
  })
34
34
  })
35
35
  })
@@ -0,0 +1,2 @@
1
+ var h=Object.defineProperty;var p=Object.getOwnPropertyDescriptor;var k=Object.getOwnPropertyNames;var b=Object.prototype.hasOwnProperty;var m=(a,t)=>{for(var s in t)h(a,s,{get:t[s],enumerable:!0})},C=(a,t,s,e)=>{if(t&&typeof t=="object"||typeof t=="function")for(let i of k(t))!b.call(a,i)&&i!==s&&h(a,i,{get:()=>t[i],enumerable:!(e=p(t,i))||e.enumerable});return a};var d=a=>C(h({},"__esModule",{value:!0}),a);var g={};m(g,{Buckets:()=>c,default:()=>f});module.exports=d(g);var l=require("with-alpha-hex");class c{constructor(t,s,e,i,o){this.baseColour="#1d70b8";this.ragColours=["#00703c","#ffdd00","#d4351c"];this.buckets=[];this.hasRagScore=!1;this.initFromOptions=t=>{this.options=t.options||{},this.baseColour=this.options?.baseColour||this.baseColour,this.useRagColours=this.options?.useRagColours||!1,this.onlyBucketColoursDefined=this.options?.buckets?.every(s=>!s.max&&!s.min&&s.hexColour!==void 0)};this.initBuckets=()=>{const{buckets:t}=this.options;this.setBucketCount(),this.initBucketColours(),t?this.hasRagScore?this.onlyBucketColoursDefined&&(this.buckets=t):!this.hasRagScore&&this.onlyBucketColoursDefined&&this.autoBucketing?this.initAutomaticThresholdBucket():this.initCustomThresholdBuckets():!t&&!this.hasRagScore&&this.autoBucketing&&this.initAutomaticThresholdBucket()};this.initCustomThresholdBuckets=()=>{this.buckets=this.options.buckets.map((t,s)=>({...this.buckets[s],...t}))};this.initAutomaticThresholdBucket=()=>{const{min:t,max:s,bucketSize:e}=this.setAutomaticThresholdSize();let i=0;this.buckets=this.buckets.map((o,u)=>{let r=t;return u!==0&&(r=i+1),i=e*(u+1)+t,u===this.buckets.length-1&&(i=s),{hexColour:this.options?.buckets?this.options.buckets[u]?.hexColour:o.hexColour,min:r,max:i}})};this.initBucketColours=()=>{if(this.useRagColours&&this.bucketCount===3)this.buckets=Array.from(new Array(this.bucketCount)).map((t,s)=>({hexColour:this.ragColours[s]}));else{const t=1/this.bucketCount;this.buckets=Array.from(new Array(this.bucketCount)).map((s,e)=>{const i=t*(e+1);return{hexColour:(0,l.withAlphaHex)(this.baseColour,i)}})}};this.setAutomaticThresholdSize=()=>{const t=this.responseData.map(o=>Number(o[this.valueKey].raw)),s=Math.min(...t),e=Math.max(...t),i=Math.ceil((e-s)/this.bucketCount);return{min:s,max:e,bucketSize:i}};this.setBucketCount=()=>{const{buckets:t}=this.options;this.hasRagScore?this.useRagColours?this.bucketCount=3:this.bucketCount=Math.max(...this.responseData.map(s=>s[this.valueKey].rag))+1:t?this.bucketCount=t.length:this.bucketCount=3};this.getBucketForValue=(t,s)=>{let e,i;return s!==void 0?{colour:this.buckets[s].hexColour,score:s}:(this.buckets.forEach((o,u)=>{const{min:r,max:n}=o;!r&&n&&t<=n&&(e=o.hexColour,i=u.toString()),r&&t>=o.min&&n&&t<=o.max&&(e=o.hexColour,i=u.toString()),r&&!n&&t>=r&&(e=o.hexColour,i=u.toString())}),{colour:e,score:i})};this.getBuckets=()=>this.buckets;this.responseData=t,this.initFromOptions(s),this.valueKey=e,this.hasRagScore=t[0][this.valueKey].rag!==void 0,this.autoBucketing=i,o&&(this.ragColours=o),this.initBuckets()}}var f=c;0&&(module.exports={Buckets});
2
+ //# sourceMappingURL=Buckets.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../src/dpr/components/_charts/chart/Buckets.ts"],
4
+ "sourcesContent": ["/* eslint-disable prefer-destructuring */\nimport { withAlphaHex } from 'with-alpha-hex'\nimport { DashboardDataResponse } from '../../../types/Metrics'\nimport {\n DashboardVisualisation,\n DashboardVisualisationBucket,\n BucketDashboardVisualisationOptions,\n} from '../../_dashboards/dashboard/types'\n\nclass Buckets {\n private baseColour = '#1d70b8'\n\n private ragColours: string[] = ['#00703c', '#ffdd00', '#d4351c']\n\n private buckets: DashboardVisualisationBucket[] = []\n\n private useRagColours: boolean\n\n private bucketCount: number\n\n private onlyBucketColoursDefined: boolean\n\n private autoBucketing: boolean\n\n private hasRagScore = false\n\n private valueKey: string\n\n private options: BucketDashboardVisualisationOptions\n\n responseData: DashboardDataResponse[]\n\n constructor(\n responseData: DashboardDataResponse[],\n definition: DashboardVisualisation,\n valueKey: string,\n autoBucketing?: boolean,\n ragColours?: string[],\n ) {\n this.responseData = responseData\n this.initFromOptions(definition)\n this.valueKey = valueKey\n this.hasRagScore = responseData[0][this.valueKey].rag !== undefined\n this.autoBucketing = autoBucketing\n if (ragColours) this.ragColours = ragColours\n this.initBuckets()\n }\n\n private initFromOptions = (definition: DashboardVisualisation) => {\n this.options = <BucketDashboardVisualisationOptions>definition.options || {}\n this.baseColour = this.options?.baseColour || this.baseColour\n this.useRagColours = this.options?.useRagColours || false\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\n this.setBucketCount()\n this.initBucketColours()\n\n if (buckets) {\n if (this.hasRagScore) {\n if (this.onlyBucketColoursDefined) {\n this.buckets = buckets\n }\n } else if (!this.hasRagScore && this.onlyBucketColoursDefined && this.autoBucketing) {\n this.initAutomaticThresholdBucket()\n } else {\n this.initCustomThresholdBuckets()\n }\n } else if (!buckets && !this.hasRagScore && this.autoBucketing) {\n this.initAutomaticThresholdBucket()\n }\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) + min\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 if (this.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.hasRagScore) {\n if (this.useRagColours) {\n this.bucketCount = 3\n } else {\n this.bucketCount =\n Math.max(...this.responseData.map((resData: DashboardDataResponse) => resData[this.valueKey].rag)) + 1\n }\n } else if (buckets) {\n this.bucketCount = buckets.length\n } else {\n this.bucketCount = 3\n }\n }\n\n getBucketForValue = (value: number, ragScore?: number) => {\n let colour\n let score\n\n if (ragScore !== undefined) {\n return {\n colour: this.buckets[ragScore].hexColour,\n score: ragScore,\n }\n }\n\n this.buckets.forEach((bucket, index) => {\n const { min, max } = bucket\n // First bucket\n if (!min && max && value <= max) {\n colour = bucket.hexColour\n score = index.toString()\n }\n // middle buckets\n if (min && value >= bucket.min && max && value <= bucket.max) {\n colour = bucket.hexColour\n score = index.toString()\n }\n // last bucket\n if (min && !max && value >= min) {\n colour = bucket.hexColour\n score = index.toString()\n }\n })\n\n return {\n colour,\n score,\n }\n }\n\n getBuckets = () => {\n return this.buckets\n }\n}\n\nexport { Buckets }\nexport default Buckets\n"],
5
+ "mappings": "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",
6
+ "names": ["Buckets_exports", "__export", "Buckets", "Buckets_default", "__toCommonJS", "import_with_alpha_hex", "responseData", "definition", "valueKey", "autoBucketing", "ragColours", "bucket", "buckets", "i", "min", "max", "bucketSize", "maxValue", "minValue", "d", "alphaDivision", "division", "values", "resData", "value", "ragScore", "colour", "score", "index"]
7
+ }
@@ -0,0 +1,198 @@
1
+ /* eslint-disable prefer-destructuring */
2
+ import { withAlphaHex } from 'with-alpha-hex'
3
+ import { DashboardDataResponse } from '../../../types/Metrics'
4
+ import {
5
+ DashboardVisualisation,
6
+ DashboardVisualisationBucket,
7
+ BucketDashboardVisualisationOptions,
8
+ } from '../../_dashboards/dashboard/types'
9
+
10
+ class Buckets {
11
+ private baseColour = '#1d70b8'
12
+
13
+ private ragColours: string[] = ['#00703c', '#ffdd00', '#d4351c']
14
+
15
+ private buckets: DashboardVisualisationBucket[] = []
16
+
17
+ private useRagColours: boolean
18
+
19
+ private bucketCount: number
20
+
21
+ private onlyBucketColoursDefined: boolean
22
+
23
+ private autoBucketing: boolean
24
+
25
+ private hasRagScore = false
26
+
27
+ private valueKey: string
28
+
29
+ private options: BucketDashboardVisualisationOptions
30
+
31
+ responseData: DashboardDataResponse[]
32
+
33
+ constructor(
34
+ responseData: DashboardDataResponse[],
35
+ definition: DashboardVisualisation,
36
+ valueKey: string,
37
+ autoBucketing?: boolean,
38
+ ragColours?: string[],
39
+ ) {
40
+ this.responseData = responseData
41
+ this.initFromOptions(definition)
42
+ this.valueKey = valueKey
43
+ this.hasRagScore = responseData[0][this.valueKey].rag !== undefined
44
+ this.autoBucketing = autoBucketing
45
+ if (ragColours) this.ragColours = ragColours
46
+ this.initBuckets()
47
+ }
48
+
49
+ private initFromOptions = (definition: DashboardVisualisation) => {
50
+ this.options = <BucketDashboardVisualisationOptions>definition.options || {}
51
+ this.baseColour = this.options?.baseColour || this.baseColour
52
+ this.useRagColours = this.options?.useRagColours || false
53
+ this.onlyBucketColoursDefined = this.options?.buckets?.every(
54
+ (bucket) => !bucket.max && !bucket.min && bucket.hexColour !== undefined,
55
+ )
56
+ }
57
+
58
+ private initBuckets = () => {
59
+ const { buckets } = this.options
60
+
61
+ this.setBucketCount()
62
+ this.initBucketColours()
63
+
64
+ if (buckets) {
65
+ if (this.hasRagScore) {
66
+ if (this.onlyBucketColoursDefined) {
67
+ this.buckets = buckets
68
+ }
69
+ } else if (!this.hasRagScore && this.onlyBucketColoursDefined && this.autoBucketing) {
70
+ this.initAutomaticThresholdBucket()
71
+ } else {
72
+ this.initCustomThresholdBuckets()
73
+ }
74
+ } else if (!buckets && !this.hasRagScore && this.autoBucketing) {
75
+ this.initAutomaticThresholdBucket()
76
+ }
77
+ }
78
+
79
+ private initCustomThresholdBuckets = () => {
80
+ this.buckets = this.options.buckets.map((bucket, i) => {
81
+ return {
82
+ ...this.buckets[i],
83
+ ...bucket,
84
+ }
85
+ })
86
+ }
87
+
88
+ /**
89
+ * Initialises the bucket thresholds by defining the range between the min and max
90
+ * and dividing into 3 equal parts
91
+ */
92
+ private initAutomaticThresholdBucket = () => {
93
+ const { min, max, bucketSize } = this.setAutomaticThresholdSize()
94
+ let maxValue = 0
95
+ this.buckets = this.buckets.map((bucket, i) => {
96
+ let minValue = min
97
+ if (i !== 0) minValue = maxValue + 1
98
+ maxValue = bucketSize * (i + 1) + min
99
+ if (i === this.buckets.length - 1) maxValue = max
100
+
101
+ return {
102
+ hexColour: this.options?.buckets ? this.options.buckets[i]?.hexColour : bucket.hexColour,
103
+ min: minValue,
104
+ max: maxValue,
105
+ }
106
+ })
107
+ }
108
+
109
+ private initBucketColours = () => {
110
+ if (this.useRagColours && this.bucketCount === 3) {
111
+ this.buckets = Array.from(new Array(this.bucketCount)).map((d, i) => {
112
+ return {
113
+ hexColour: this.ragColours[i],
114
+ }
115
+ })
116
+ } else {
117
+ const alphaDivision = 1 / this.bucketCount
118
+ this.buckets = Array.from(new Array(this.bucketCount)).map((d, i) => {
119
+ const division = alphaDivision * (i + 1)
120
+ return {
121
+ hexColour: withAlphaHex(this.baseColour, division),
122
+ }
123
+ })
124
+ }
125
+ }
126
+
127
+ private setAutomaticThresholdSize = () => {
128
+ const values = this.responseData.map((resData) => Number(resData[this.valueKey].raw))
129
+ const min = Math.min(...values)
130
+ const max = Math.max(...values)
131
+ const bucketSize = Math.ceil((max - min) / this.bucketCount)
132
+
133
+ return {
134
+ min,
135
+ max,
136
+ bucketSize,
137
+ }
138
+ }
139
+
140
+ private setBucketCount = () => {
141
+ const { buckets } = this.options
142
+ if (this.hasRagScore) {
143
+ if (this.useRagColours) {
144
+ this.bucketCount = 3
145
+ } else {
146
+ this.bucketCount =
147
+ Math.max(...this.responseData.map((resData: DashboardDataResponse) => resData[this.valueKey].rag)) + 1
148
+ }
149
+ } else if (buckets) {
150
+ this.bucketCount = buckets.length
151
+ } else {
152
+ this.bucketCount = 3
153
+ }
154
+ }
155
+
156
+ getBucketForValue = (value: number, ragScore?: number) => {
157
+ let colour
158
+ let score
159
+
160
+ if (ragScore !== undefined) {
161
+ return {
162
+ colour: this.buckets[ragScore].hexColour,
163
+ score: ragScore,
164
+ }
165
+ }
166
+
167
+ this.buckets.forEach((bucket, index) => {
168
+ const { min, max } = bucket
169
+ // First bucket
170
+ if (!min && max && value <= max) {
171
+ colour = bucket.hexColour
172
+ score = index.toString()
173
+ }
174
+ // middle buckets
175
+ if (min && value >= bucket.min && max && value <= bucket.max) {
176
+ colour = bucket.hexColour
177
+ score = index.toString()
178
+ }
179
+ // last bucket
180
+ if (min && !max && value >= min) {
181
+ colour = bucket.hexColour
182
+ score = index.toString()
183
+ }
184
+ })
185
+
186
+ return {
187
+ colour,
188
+ score,
189
+ }
190
+ }
191
+
192
+ getBuckets = () => {
193
+ return this.buckets
194
+ }
195
+ }
196
+
197
+ export { Buckets }
198
+ export default Buckets
@@ -0,0 +1,2 @@
1
+ var o=Object.defineProperty;var u=Object.getOwnPropertyDescriptor;var r=Object.getOwnPropertyNames;var h=Object.prototype.hasOwnProperty;var l=(a,s)=>{for(var i in s)o(a,i,{get:s[i],enumerable:!0})},m=(a,s,i,e)=>{if(s&&typeof s=="object"||typeof s=="function")for(let t of r(s))!h.call(a,t)&&t!==i&&o(a,t,{get:()=>s[t],enumerable:!(e=u(s,t))||e.enumerable});return a};var p=a=>m(o({},"__esModule",{value:!0}),a);var D={};l(D,{DashboardVisualisationClass:()=>n,default:()=>d});module.exports=p(D);class n{constructor(s,i){this.initUnit=()=>{this.unit=this.columns.measures[0].unit?this.columns.measures[0].unit:void 0};this.definition=i,this.columns=i.columns,this.measures=this.columns.measures,this.keys=this.columns.keys,this.type=this.definition.type.split("-")[0],this.initUnit(),this.responseData=s}}var d=n;0&&(module.exports={DashboardVisualisationClass});
2
+ //# sourceMappingURL=DashboardVisualisation.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../src/dpr/components/_charts/chart/DashboardVisualisation.ts"],
4
+ "sourcesContent": ["/* eslint-disable prefer-destructuring */\nimport { ChartType, UnitType } from '../../../types/Charts'\nimport { DashboardDataResponse } from '../../../types/Metrics'\nimport {\n DashboardVisualisation,\n DashboardVisualisationColumnKey,\n DashboardVisualisationColumnMeasure,\n DashboardVisualisationColumns,\n} from '../../_dashboards/dashboard/types'\n\nclass DashboardVisualisationClass {\n responseData: DashboardDataResponse[]\n\n definition: DashboardVisualisation\n\n columns: DashboardVisualisationColumns\n\n measures: DashboardVisualisationColumnMeasure[]\n\n keys: DashboardVisualisationColumnKey[]\n\n unit: UnitType\n\n type: ChartType\n\n constructor(responseData: DashboardDataResponse[], definition: DashboardVisualisation) {\n this.definition = definition\n this.columns = definition.columns\n this.measures = this.columns.measures\n this.keys = this.columns.keys\n this.type = this.definition.type.split('-')[0] as ChartType\n this.initUnit()\n this.responseData = responseData\n }\n\n initUnit = () => {\n // todo\n this.unit = this.columns.measures[0].unit ? this.columns.measures[0].unit : undefined\n }\n}\n\nexport { DashboardVisualisationClass }\nexport default DashboardVisualisationClass\n"],
5
+ "mappings": "4ZAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,iCAAAE,EAAA,YAAAC,IAAA,eAAAC,EAAAJ,GAUA,MAAME,CAA4B,CAehC,YAAYG,EAAuCC,EAAoC,CAUvF,cAAW,IAAM,CAEf,KAAK,KAAO,KAAK,QAAQ,SAAS,CAAC,EAAE,KAAO,KAAK,QAAQ,SAAS,CAAC,EAAE,KAAO,MAC9E,EAZE,KAAK,WAAaA,EAClB,KAAK,QAAUA,EAAW,QAC1B,KAAK,SAAW,KAAK,QAAQ,SAC7B,KAAK,KAAO,KAAK,QAAQ,KACzB,KAAK,KAAO,KAAK,WAAW,KAAK,MAAM,GAAG,EAAE,CAAC,EAC7C,KAAK,SAAS,EACd,KAAK,aAAeD,CACtB,CAMF,CAGA,IAAOF,EAAQD",
6
+ "names": ["DashboardVisualisation_exports", "__export", "DashboardVisualisationClass", "DashboardVisualisation_default", "__toCommonJS", "responseData", "definition"]
7
+ }
@@ -0,0 +1,43 @@
1
+ /* eslint-disable prefer-destructuring */
2
+ import { ChartType, UnitType } from '../../../types/Charts'
3
+ import { DashboardDataResponse } from '../../../types/Metrics'
4
+ import {
5
+ DashboardVisualisation,
6
+ DashboardVisualisationColumnKey,
7
+ DashboardVisualisationColumnMeasure,
8
+ DashboardVisualisationColumns,
9
+ } from '../../_dashboards/dashboard/types'
10
+
11
+ class DashboardVisualisationClass {
12
+ responseData: DashboardDataResponse[]
13
+
14
+ definition: DashboardVisualisation
15
+
16
+ columns: DashboardVisualisationColumns
17
+
18
+ measures: DashboardVisualisationColumnMeasure[]
19
+
20
+ keys: DashboardVisualisationColumnKey[]
21
+
22
+ unit: UnitType
23
+
24
+ type: ChartType
25
+
26
+ constructor(responseData: DashboardDataResponse[], definition: DashboardVisualisation) {
27
+ this.definition = definition
28
+ this.columns = definition.columns
29
+ this.measures = this.columns.measures
30
+ this.keys = this.columns.keys
31
+ this.type = this.definition.type.split('-')[0] as ChartType
32
+ this.initUnit()
33
+ this.responseData = responseData
34
+ }
35
+
36
+ initUnit = () => {
37
+ // todo
38
+ this.unit = this.columns.measures[0].unit ? this.columns.measures[0].unit : undefined
39
+ }
40
+ }
41
+
42
+ export { DashboardVisualisationClass }
43
+ export default DashboardVisualisationClass
@@ -0,0 +1,2 @@
1
+ var g=Object.create;var h=Object.defineProperty;var M=Object.getOwnPropertyDescriptor;var w=Object.getOwnPropertyNames;var F=Object.getPrototypeOf,V=Object.prototype.hasOwnProperty;var x=(e,i)=>{for(var t in i)h(e,t,{get:i[t],enumerable:!0})},p=(e,i,t,a)=>{if(i&&typeof i=="object"||typeof i=="function")for(let s of w(i))!V.call(e,s)&&s!==t&&h(e,s,{get:()=>i[s],enumerable:!(a=M(i,s))||a.enumerable});return e};var d=(e,i,t)=>(t=e!=null?g(F(e)):{},p(i||!e||!e.__esModule?h(t,"default",{value:e,enumerable:!0}):t,e)),B=e=>p(h({},"__esModule",{value:!0}),e);var C={};x(C,{HeatmapChart:()=>m,default:()=>Y});module.exports=B(C);var n=d(require("dayjs")),y=require("../../../_dashboards/dashboard/types"),D=d(require("../../../../utils/datasetHelper")),b=d(require("../DashboardVisualisation")),f=d(require("../Buckets"));class m extends b.default{constructor(t,a,s){super(t,s);this.data=[];this.dayDateFormat="DD/MM/YYYY";this.buckets=[];this.initUnit=()=>{this.unit=this.columns.measures[0].unit?this.columns.measures[0].unit:void 0};this.setLabel=()=>{const{id:t,display:a}=this.columns.measures[1];this.valueKey=t,this.label=a};this.validateDefinition=()=>{const{id:t,columns:a,type:s}=this.definition,o=[];if(a.measures.length!==2?o.push(`Measures should only have 2 columns defined. Only found ${a.measures.length}`):s===y.DashboardVisualisationType.MATRIX_TIMESERIES&&a.measures[0].id!=="ts"&&o.push(`measure at index 0 has incorrect ID. Expected ID to be "ts". Found "${a.measures[0].id}"`),o.length){const r=`Validation: Visualisaton definition: ID: ${t}, type: ${s}, errors: ${o.join(",")}`;throw new Error(r)}};this.initTimeseriesData=()=>{const t=D.default.groupRowsByTimestamp(this.responseData);this.data=t.map(a=>{const{raw:s,rag:o}=a[0][this.valueKey],r=a[0].ts.raw,k=Number(s),v=o!==void 0?Number(a[0][this.valueKey].rag):void 0;let u,l;switch(this.granularity){case"hourly":break;case"weekly":u=(0,n.default)(r,this.dayDateFormat).format("ddd"),l=(0,n.default)(r,this.dayDateFormat).week();break;case"daily":u=(0,n.default)(r,this.dayDateFormat).format("MMM YY"),l=(0,n.default)(r,this.dayDateFormat).format("D");break;case"monthly":{const c=r.split(" ");u=c[1],l=c[0]}break;case"annually":u="year",l=r;break;default:u=(0,n.default)(r,this.dayDateFormat).format("MMM YY"),l=(0,n.default)(r,this.dayDateFormat).format("D");break}return{y:l,x:u,v:k,r:v}})};this.bucketData=()=>{this.data=this.data.map(t=>{const{v:a,r:s}=t,o=this.bucketsHelper.getBucketForValue(a,s);return{...t,c:o.colour}})};this.build=()=>(this.validateDefinition(),this.initTimeseriesData(),this.bucketData(),{type:this.type,unit:this.unit,timeseries:!0,data:{datasets:[{label:this.label,data:this.data}]}});this.granularity=a,this.setLabel(),this.initUnit(),this.bucketsHelper=new f.default(t,this.definition,this.valueKey,!0),this.buckets=this.bucketsHelper.getBuckets()}}var Y=m;0&&(module.exports={HeatmapChart});
2
+ //# sourceMappingURL=HeatmapChart.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../../src/dpr/components/_charts/chart/heatmap/HeatmapChart.ts"],
4
+ "sourcesContent": ["/* eslint-disable prefer-destructuring */\nimport dayjs from 'dayjs'\nimport { Granularity } from '../../../_inputs/granular-date-range/types'\nimport { DashboardDataResponse } from '../../../../types/Metrics'\nimport {\n DashboardVisualisation,\n DashboardVisualisationType,\n DashboardVisualisationBucket,\n} from '../../../_dashboards/dashboard/types'\nimport { ChartData, MatrixChartData } from '../../../../types/Charts'\nimport DatasetHelper from '../../../../utils/datasetHelper'\nimport DashboardVisualisationClass from '../DashboardVisualisation'\nimport Buckets from '../Buckets'\n\nclass HeatmapChart extends DashboardVisualisationClass {\n private granularity: Granularity\n\n private data: MatrixChartData[] = []\n\n private dayDateFormat = 'DD/MM/YYYY'\n\n private valueKey: string\n\n private label: string\n\n private buckets: DashboardVisualisationBucket[] = []\n\n private bucketsHelper: Buckets\n\n constructor(responseData: DashboardDataResponse[], granularity: Granularity, definition: DashboardVisualisation) {\n super(responseData, definition)\n\n this.granularity = granularity\n this.setLabel()\n this.initUnit()\n this.bucketsHelper = new Buckets(responseData, this.definition, this.valueKey, true)\n this.buckets = this.bucketsHelper.getBuckets()\n }\n\n initUnit = () => {\n // todo\n this.unit = this.columns.measures[0].unit ? this.columns.measures[0].unit : undefined\n }\n\n private setLabel = () => {\n const { id, display } = this.columns.measures[1]\n this.valueKey = id\n this.label = display\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 bucketData = () => {\n this.data = this.data.map((d) => {\n const { v, r } = d\n const bucketData = this.bucketsHelper.getBucketForValue(v, r)\n return { ...d, c: bucketData.colour }\n })\n }\n\n build = (): ChartData => {\n this.validateDefinition()\n this.initTimeseriesData()\n this.bucketData()\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": ["HeatmapChart_exports", "__export", "HeatmapChart", "HeatmapChart_default", "__toCommonJS", "import_dayjs", "import_types", "import_datasetHelper", "import_DashboardVisualisation", "import_Buckets", "DashboardVisualisationClass", "responseData", "granularity", "definition", "id", "display", "columns", "type", "errors", "message", "timeBlockData", "DatasetHelper", "tsData", "raw", "rag", "tsRaw", "v", "r", "x", "y", "dayjs", "ts", "d", "bucketData", "Buckets"]
7
+ }
@@ -0,0 +1,144 @@
1
+ /* eslint-disable prefer-destructuring */
2
+ import dayjs from 'dayjs'
3
+ import { Granularity } from '../../../_inputs/granular-date-range/types'
4
+ import { DashboardDataResponse } from '../../../../types/Metrics'
5
+ import {
6
+ DashboardVisualisation,
7
+ DashboardVisualisationType,
8
+ DashboardVisualisationBucket,
9
+ } from '../../../_dashboards/dashboard/types'
10
+ import { ChartData, MatrixChartData } from '../../../../types/Charts'
11
+ import DatasetHelper from '../../../../utils/datasetHelper'
12
+ import DashboardVisualisationClass from '../DashboardVisualisation'
13
+ import Buckets from '../Buckets'
14
+
15
+ class HeatmapChart extends DashboardVisualisationClass {
16
+ private granularity: Granularity
17
+
18
+ private data: MatrixChartData[] = []
19
+
20
+ private dayDateFormat = 'DD/MM/YYYY'
21
+
22
+ private valueKey: string
23
+
24
+ private label: string
25
+
26
+ private buckets: DashboardVisualisationBucket[] = []
27
+
28
+ private bucketsHelper: Buckets
29
+
30
+ constructor(responseData: DashboardDataResponse[], granularity: Granularity, definition: DashboardVisualisation) {
31
+ super(responseData, definition)
32
+
33
+ this.granularity = granularity
34
+ this.setLabel()
35
+ this.initUnit()
36
+ this.bucketsHelper = new Buckets(responseData, this.definition, this.valueKey, true)
37
+ this.buckets = this.bucketsHelper.getBuckets()
38
+ }
39
+
40
+ initUnit = () => {
41
+ // todo
42
+ this.unit = this.columns.measures[0].unit ? this.columns.measures[0].unit : undefined
43
+ }
44
+
45
+ private setLabel = () => {
46
+ const { id, display } = this.columns.measures[1]
47
+ this.valueKey = id
48
+ this.label = display
49
+ }
50
+
51
+ private validateDefinition = () => {
52
+ const { id, columns, type } = this.definition
53
+ const errors = []
54
+
55
+ // Validate measures
56
+ if (columns.measures.length !== 2) {
57
+ errors.push(`Measures should only have 2 columns defined. Only found ${columns.measures.length}`)
58
+ } else if (type === DashboardVisualisationType.MATRIX_TIMESERIES) {
59
+ if (columns.measures[0].id !== 'ts') {
60
+ errors.push(`measure at index 0 has incorrect ID. Expected ID to be "ts". Found "${columns.measures[0].id}"`)
61
+ }
62
+ }
63
+
64
+ // Throw the error
65
+ if (errors.length) {
66
+ const message = `Validation: Visualisaton definition: ID: ${id}, type: ${type}, errors: ${errors.join(',')}`
67
+ throw new Error(message)
68
+ }
69
+ }
70
+
71
+ private initTimeseriesData = () => {
72
+ const timeBlockData = DatasetHelper.groupRowsByTimestamp(this.responseData)
73
+
74
+ this.data = timeBlockData.map((tsData) => {
75
+ const { raw, rag } = tsData[0][this.valueKey]
76
+ const tsRaw = tsData[0].ts.raw
77
+
78
+ const v = Number(raw)
79
+ const r = rag !== undefined ? Number(tsData[0][this.valueKey].rag) : undefined
80
+ let x
81
+ let y
82
+
83
+ switch (this.granularity) {
84
+ case 'hourly':
85
+ break
86
+ case 'weekly':
87
+ x = dayjs(tsRaw, this.dayDateFormat).format('ddd')
88
+ y = dayjs(tsRaw, this.dayDateFormat).week()
89
+ break
90
+ case 'daily':
91
+ x = dayjs(tsRaw, this.dayDateFormat).format('MMM YY')
92
+ y = dayjs(tsRaw, this.dayDateFormat).format('D')
93
+ break
94
+ case 'monthly':
95
+ {
96
+ const ts = (<string>tsRaw).split(' ')
97
+ x = ts[1]
98
+ y = ts[0]
99
+ }
100
+ break
101
+ case 'annually':
102
+ x = 'year'
103
+ y = <string>tsRaw
104
+ break
105
+ default:
106
+ x = dayjs(tsRaw, this.dayDateFormat).format('MMM YY')
107
+ y = dayjs(tsRaw, this.dayDateFormat).format('D')
108
+ break
109
+ }
110
+ return { y, x, v, r }
111
+ })
112
+ }
113
+
114
+ private bucketData = () => {
115
+ this.data = this.data.map((d) => {
116
+ const { v, r } = d
117
+ const bucketData = this.bucketsHelper.getBucketForValue(v, r)
118
+ return { ...d, c: bucketData.colour }
119
+ })
120
+ }
121
+
122
+ build = (): ChartData => {
123
+ this.validateDefinition()
124
+ this.initTimeseriesData()
125
+ this.bucketData()
126
+
127
+ return {
128
+ type: this.type,
129
+ unit: this.unit,
130
+ timeseries: true,
131
+ data: {
132
+ datasets: [
133
+ {
134
+ label: this.label,
135
+ data: this.data,
136
+ },
137
+ ],
138
+ },
139
+ }
140
+ }
141
+ }
142
+
143
+ export { HeatmapChart }
144
+ export default HeatmapChart
@@ -1,2 +1,2 @@
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});
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/HeatmapChart"));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 { 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"]
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/HeatmapChart'\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_HeatmapChart", "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
  }
@@ -18,7 +18,7 @@ import {
18
18
  import DatasetHelper from '../../utils/datasetHelper'
19
19
  import DashboardListUtils from '../_dashboards/dashboard-list/utils'
20
20
  import { Granularity } from '../_inputs/granular-date-range/types'
21
- import HeatmapChart from './chart/heatmap/Heatmap'
21
+ import HeatmapChart from './chart/heatmap/HeatmapChart'
22
22
 
23
23
  dayjs.extend(weekOfYear)
24
24