@ministryofjustice/hmpps-digital-prison-reporting-frontend 4.20.2 → 4.21.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (134) hide show
  1. package/dpr/components/_catalogue/catalogue-list/utils.test.ts +1 -1
  2. package/dpr/components/_charts/chart/Chart.js +2 -0
  3. package/dpr/components/_charts/chart/Chart.js.map +7 -0
  4. package/dpr/components/_charts/chart/Chart.ts +89 -0
  5. package/dpr/components/_charts/chart/ChartColours.js +2 -0
  6. package/dpr/components/_charts/chart/ChartColours.js.map +7 -0
  7. package/dpr/components/_charts/chart/ChartColours.ts +36 -0
  8. package/dpr/components/_charts/chart/ChartTimeseries.js +2 -0
  9. package/dpr/components/_charts/chart/ChartTimeseries.js.map +7 -0
  10. package/dpr/components/_charts/chart/ChartTimeseries.ts +95 -0
  11. package/dpr/components/_charts/chart/bar/BarChart.js +2 -0
  12. package/dpr/components/_charts/chart/bar/BarChart.js.map +7 -0
  13. package/dpr/components/_charts/chart/bar/BarChart.ts +204 -0
  14. package/dpr/components/_charts/chart/bar/clientClass.mjs +0 -58
  15. package/dpr/components/_charts/chart/bar/types.js +2 -0
  16. package/dpr/components/_charts/chart/bar/types.js.map +7 -0
  17. package/dpr/components/_charts/chart/bar/types.ts +6 -0
  18. package/dpr/components/_charts/chart/bar/validate.js +2 -0
  19. package/dpr/components/_charts/chart/bar/validate.js.map +7 -0
  20. package/dpr/components/_charts/chart/bar/validate.ts +59 -0
  21. package/dpr/components/_charts/chart/bar-timeseries/BarTimeseriesChart.js +2 -0
  22. package/dpr/components/_charts/chart/bar-timeseries/BarTimeseriesChart.js.map +7 -0
  23. package/dpr/components/_charts/chart/bar-timeseries/BarTimeseriesChart.ts +57 -0
  24. package/dpr/components/_charts/chart/bar-timeseries/types.js +2 -0
  25. package/dpr/components/_charts/chart/bar-timeseries/types.js.map +7 -0
  26. package/dpr/components/_charts/chart/bar-timeseries/types.ts +5 -0
  27. package/dpr/components/_charts/chart/bar-timeseries/validate.js +2 -0
  28. package/dpr/components/_charts/chart/bar-timeseries/validate.js.map +7 -0
  29. package/dpr/components/_charts/chart/bar-timeseries/validate.ts +30 -0
  30. package/dpr/components/_charts/chart/buckets/Buckets.js +2 -0
  31. package/dpr/components/_charts/chart/buckets/Buckets.js.map +7 -0
  32. package/dpr/components/_charts/chart/{Buckets.ts → buckets/Buckets.ts} +18 -14
  33. package/dpr/components/_charts/chart/buckets/types.js +2 -0
  34. package/dpr/components/_charts/chart/buckets/types.js.map +7 -0
  35. package/dpr/components/_charts/chart/buckets/types.ts +4 -0
  36. package/dpr/components/_charts/chart/buckets/validate.js +2 -0
  37. package/dpr/components/_charts/chart/buckets/validate.js.map +7 -0
  38. package/dpr/components/_charts/chart/buckets/validate.ts +15 -0
  39. package/dpr/components/_charts/chart/chart-config.js +2 -0
  40. package/dpr/components/_charts/chart/chart-config.js.map +7 -0
  41. package/dpr/components/_charts/chart/chart-config.ts +108 -0
  42. package/dpr/components/_charts/chart/clientClass.mjs +28 -106
  43. package/dpr/components/_charts/chart/doughnut/DoughnutChart.js +2 -0
  44. package/dpr/components/_charts/chart/doughnut/DoughnutChart.js.map +7 -0
  45. package/dpr/components/_charts/chart/doughnut/DoughnutChart.ts +77 -0
  46. package/dpr/components/_charts/chart/doughnut/clientClass.mjs +0 -45
  47. package/dpr/components/_charts/chart/doughnut/types.js +2 -0
  48. package/dpr/components/_charts/chart/doughnut/types.js.map +7 -0
  49. package/dpr/components/_charts/chart/doughnut/types.ts +5 -0
  50. package/dpr/components/_charts/chart/doughnut/validate.js +2 -0
  51. package/dpr/components/_charts/chart/doughnut/validate.js.map +7 -0
  52. package/dpr/components/_charts/chart/doughnut/validate.ts +30 -0
  53. package/dpr/components/_charts/chart/heatmap/HeatmapChart.js +1 -1
  54. package/dpr/components/_charts/chart/heatmap/HeatmapChart.js.map +3 -3
  55. package/dpr/components/_charts/chart/heatmap/HeatmapChart.ts +122 -44
  56. package/dpr/components/_charts/chart/heatmap/clientClass.mjs +7 -89
  57. package/dpr/components/_charts/chart/heatmap/types.js +1 -1
  58. package/dpr/components/_charts/chart/heatmap/types.js.map +1 -1
  59. package/dpr/components/_charts/chart/heatmap/types.ts +5 -0
  60. package/dpr/components/_charts/chart/heatmap/validate.js +2 -0
  61. package/dpr/components/_charts/chart/heatmap/validate.js.map +7 -0
  62. package/dpr/components/_charts/chart/heatmap/validate.ts +25 -0
  63. package/dpr/components/_charts/chart/line/LineChart.js +2 -0
  64. package/dpr/components/_charts/chart/line/LineChart.js.map +7 -0
  65. package/dpr/components/_charts/chart/line/LineChart.ts +89 -0
  66. package/dpr/components/_charts/chart/line/clientClass.mjs +5 -36
  67. package/dpr/components/_charts/chart/line/types.js +2 -0
  68. package/dpr/components/_charts/chart/line/types.js.map +7 -0
  69. package/dpr/components/_charts/chart/line/types.ts +5 -0
  70. package/dpr/components/_charts/chart/line/validate.js +2 -0
  71. package/dpr/components/_charts/chart/line/validate.js.map +7 -0
  72. package/dpr/components/_charts/chart/line/validate.ts +30 -0
  73. package/dpr/components/_charts/chart/line-timeseries/LineTimeseriesChart.js +2 -0
  74. package/dpr/components/_charts/chart/line-timeseries/LineTimeseriesChart.js.map +7 -0
  75. package/dpr/components/_charts/chart/line-timeseries/LineTimeseriesChart.ts +57 -0
  76. package/dpr/components/_charts/chart/line-timeseries/types.js +2 -0
  77. package/dpr/components/_charts/chart/line-timeseries/types.js.map +7 -0
  78. package/dpr/components/_charts/chart/line-timeseries/types.ts +5 -0
  79. package/dpr/components/_charts/chart/line-timeseries/validate.js +2 -0
  80. package/dpr/components/_charts/chart/line-timeseries/validate.js.map +7 -0
  81. package/dpr/components/_charts/chart/line-timeseries/validate.ts +30 -0
  82. package/dpr/components/_charts/chart/view.njk +8 -1
  83. package/dpr/components/_charts/chart-tabs/view.njk +15 -14
  84. package/dpr/components/_charts/utils.js +1 -1
  85. package/dpr/components/_charts/utils.js.map +3 -3
  86. package/dpr/components/_charts/utils.test.ts +9 -3
  87. package/dpr/components/_charts/utils.ts +59 -193
  88. package/dpr/components/_dashboards/dashboard-list/types.js +2 -0
  89. package/dpr/components/_dashboards/dashboard-list/types.js.map +7 -0
  90. package/dpr/components/_dashboards/dashboard-list/types.ts +4 -0
  91. package/dpr/components/_dashboards/dashboard-list/validate.js +2 -0
  92. package/dpr/components/_dashboards/dashboard-list/validate.js.map +7 -0
  93. package/dpr/components/_dashboards/dashboard-list/validate.ts +28 -0
  94. package/dpr/components/_dashboards/dashboard-visualisation/Validate.js +2 -0
  95. package/dpr/components/_dashboards/dashboard-visualisation/Validate.js.map +7 -0
  96. package/dpr/components/_dashboards/dashboard-visualisation/Validate.ts +71 -0
  97. package/dpr/components/_dashboards/dashboard-visualisation/types.js +1 -1
  98. package/dpr/components/_dashboards/dashboard-visualisation/types.js.map +2 -2
  99. package/dpr/components/_dashboards/dashboard-visualisation/types.ts +32 -2
  100. package/dpr/components/_dashboards/scorecard/Scorecard.js +1 -1
  101. package/dpr/components/_dashboards/scorecard/Scorecard.js.map +3 -3
  102. package/dpr/components/_dashboards/scorecard/Scorecard.ts +82 -213
  103. package/dpr/components/_dashboards/scorecard/types.js +1 -1
  104. package/dpr/components/_dashboards/scorecard/types.js.map +1 -1
  105. package/dpr/components/_dashboards/scorecard/types.ts +11 -1
  106. package/dpr/components/_dashboards/scorecard/validate.js +2 -0
  107. package/dpr/components/_dashboards/scorecard/validate.js.map +7 -0
  108. package/dpr/components/_dashboards/scorecard/validate.ts +36 -0
  109. package/dpr/components/_dashboards/scorecard-group/ScorecardGroup.js +2 -0
  110. package/dpr/components/_dashboards/scorecard-group/ScorecardGroup.js.map +7 -0
  111. package/dpr/components/_dashboards/scorecard-group/ScorecardGroup.ts +228 -0
  112. package/dpr/components/_dashboards/scorecard-group/types.js +2 -0
  113. package/dpr/components/_dashboards/scorecard-group/types.js.map +7 -0
  114. package/dpr/components/_dashboards/scorecard-group/types.ts +5 -0
  115. package/dpr/components/_dashboards/scorecard-group/validate.js +2 -0
  116. package/dpr/components/_dashboards/scorecard-group/validate.js.map +7 -0
  117. package/dpr/components/_dashboards/scorecard-group/validate.ts +37 -0
  118. package/dpr/components/_filters/types.d.js.map +1 -1
  119. package/dpr/components/_filters/types.d.ts +6 -4
  120. package/dpr/routes/journeys/view-report/async/dashboard/utils.js +1 -1
  121. package/dpr/routes/journeys/view-report/async/dashboard/utils.js.map +3 -3
  122. package/dpr/routes/journeys/view-report/async/dashboard/utils.ts +22 -10
  123. package/dpr/routes/journeys/view-report/controller.js +1 -1
  124. package/dpr/routes/journeys/view-report/controller.js.map +3 -3
  125. package/dpr/routes/journeys/view-report/controller.ts +3 -1
  126. package/dpr/utils/ErrorHandler.js +1 -1
  127. package/dpr/utils/ErrorHandler.js.map +3 -3
  128. package/dpr/utils/ErrorHandler.ts +16 -0
  129. package/package.json +1 -1
  130. package/dpr/components/_charts/chart/Buckets.js +0 -2
  131. package/dpr/components/_charts/chart/Buckets.js.map +0 -7
  132. package/dpr/components/_dashboards/dashboard-visualisation/DashboardVisualisation.js +0 -2
  133. package/dpr/components/_dashboards/dashboard-visualisation/DashboardVisualisation.js.map +0 -7
  134. package/dpr/components/_dashboards/dashboard-visualisation/DashboardVisualisation.ts +0 -40
@@ -0,0 +1,228 @@
1
+ /* eslint-disable prefer-destructuring */
2
+ import { DashboardDataResponse } from '../../../types/Metrics'
3
+ import DatasetHelper from '../../../utils/datasetHelper'
4
+ import { ScorecardDataset, ScorecardGroup } from '../scorecard/types'
5
+ import Buckets from '../../_charts/chart/buckets/Buckets'
6
+ import { components } from '../../../types/api'
7
+ import ScorecardVisualisation from '../scorecard/Scorecard'
8
+ import { ScorecardGroupDefinitionType, ScorecardGroupDefinitionMeasure } from './types'
9
+ import { DashboardVisualisationBucket } from '../dashboard-visualisation/types'
10
+ import ScorecardGroupSchemas from './validate'
11
+
12
+ class ScorecardGroupVisualisation {
13
+ private definition!: ScorecardGroupDefinitionType
14
+
15
+ private id!: string
16
+
17
+ private measures!: ScorecardGroupDefinitionType['columns']['measures']
18
+
19
+ private keys!: ScorecardGroupDefinitionType['columns']['keys']
20
+
21
+ private options!: ScorecardGroupDefinitionType['options']
22
+
23
+ private dataset!: ScorecardDataset
24
+
25
+ private groupKey: ScorecardGroupDefinitionMeasure | undefined
26
+
27
+ private groupKeyId: string | undefined
28
+
29
+ private groupKeyDisplay: string | undefined
30
+
31
+ private bucketsHelper: Buckets | undefined
32
+
33
+ private buckets: DashboardVisualisationBucket[] = []
34
+
35
+ private valueColumn: ScorecardGroupDefinitionMeasure | undefined
36
+
37
+ private valueKey = ''
38
+
39
+ private titleColumn: ScorecardGroupDefinitionMeasure | undefined
40
+
41
+ private titleKey = ''
42
+
43
+ private unit: 'NUMBER' | 'PERCENTAGE' | undefined
44
+
45
+ responseData: DashboardDataResponse[] = []
46
+
47
+ scoreCardBuilder: ScorecardVisualisation
48
+
49
+ constructor() {
50
+ this.scoreCardBuilder = new ScorecardVisualisation()
51
+ }
52
+
53
+ withDefinition = (definition: components['schemas']['DashboardVisualisationDefinition']) => {
54
+ this.definition = ScorecardGroupSchemas.ScorecardGroupSchema.parse(definition)
55
+ this.init()
56
+
57
+ return this
58
+ }
59
+
60
+ withData = (responseData: DashboardDataResponse[]) => {
61
+ this.responseData = responseData
62
+ this.dataset = this.scoreCardBuilder.getDataset(this.definition, this.responseData)
63
+ this.initBuckets(this.responseData, this.valueKey)
64
+ this.initGroupVars()
65
+ return this
66
+ }
67
+
68
+ private init = () => {
69
+ this.id = this.definition.id
70
+ this.measures = this.definition.columns.measures
71
+ this.keys = this.definition.columns.keys
72
+ this.options = this.definition.options
73
+ this.valueKey = this.measures[0].id
74
+ this.titleColumn = { display: this.definition.display || '', id: this.valueKey }
75
+ this.unit = this.definition.columns.measures[0].unit ? this.definition.columns.measures[0].unit : undefined
76
+ }
77
+
78
+ private initBuckets = (responseData: DashboardDataResponse[], valueKey: string) => {
79
+ if (this.options?.buckets || this.options?.useRagColour) {
80
+ this.bucketsHelper = new Buckets(responseData, this.definition, valueKey, false, this.scoreCardBuilder.ragColours)
81
+ this.buckets = this.bucketsHelper.getBuckets()
82
+ }
83
+ }
84
+
85
+ private initGroupVars = () => {
86
+ this.groupKey = DatasetHelper.getGroupKey(
87
+ this.dataset.latest,
88
+ <Array<components['schemas']['DashboardVisualisationColumnDefinition']>>this.keys || [],
89
+ )
90
+ this.groupKeyId = this.groupKey?.id
91
+ this.groupKeyDisplay = this.groupKey?.display
92
+
93
+ this.valueColumn = this.measures.find((col) => col.displayValue)
94
+ if (this.valueColumn) {
95
+ this.valueKey = this.valueColumn?.id
96
+ this.titleColumn = this.measures.find((col) => {
97
+ return col.display || col.display === ''
98
+ })
99
+ this.titleKey = this.titleColumn?.id || ''
100
+ }
101
+ }
102
+
103
+ private createScorecardGroupFromColumns = () => {
104
+ const { latest, earliest, latestTs, earliestTs } = this.dataset
105
+
106
+ return latest.map((row, rowIndex) => {
107
+ return {
108
+ title: this.createGroupTitle(row),
109
+ scorecards: Object.keys(row)
110
+ .filter((colId) => colId !== this.groupKeyId)
111
+ .map((colId) => {
112
+ const measure = this.measures.find((m) => m.id === colId)
113
+ const title = measure?.display || colId
114
+ const rowCol = row[colId]
115
+ const { raw, rag } = rowCol
116
+ const value = Number(raw)
117
+
118
+ const ragValue = rag !== undefined ? Number(rag) : undefined
119
+ this.initBuckets([row], colId)
120
+
121
+ const valueFor = `${latestTs}`
122
+ const valueFrom = `${earliestTs}`
123
+
124
+ const comparisonRow = earliest[rowIndex]
125
+ const prevVal = comparisonRow[colId]?.raw
126
+ const ragScore = this.scoreCardBuilder.setRagScore(value, ragValue, this.buckets, this.bucketsHelper)
127
+
128
+ return this.scoreCardBuilder.createScorecardData({
129
+ id: this.id,
130
+ title,
131
+ value,
132
+ rag: ragScore,
133
+ prevVal,
134
+ valueFor,
135
+ valueFrom,
136
+ })
137
+ }),
138
+ }
139
+ })
140
+ }
141
+
142
+ private createScorecardGroupFromList = (): ScorecardGroup[] => {
143
+ const { latest, earliest } = this.dataset
144
+ return [
145
+ {
146
+ title: '',
147
+ scorecards: latest.map((row: DashboardDataResponse, index: number) => {
148
+ const values = this.getScorecardValues(row)
149
+ const prevVal = earliest[index][this.valueKey].raw
150
+ return this.scoreCardBuilder.createScorecardData({
151
+ ...values,
152
+ prevVal,
153
+ })
154
+ }),
155
+ },
156
+ ]
157
+ }
158
+
159
+ private createScorecardGroupFromListWithGroups = () => {
160
+ const { latest, earliest } = this.dataset
161
+
162
+ let earliestGroupedByKey = DatasetHelper.groupRowsByKey(earliest, <string>this.groupKeyId)
163
+ let latestGroupedByKey = DatasetHelper.groupRowsByKey(latest, <string>this.groupKeyId)
164
+ if (this.groupKeyId === this.titleKey) {
165
+ latestGroupedByKey = [latestGroupedByKey.flat()]
166
+ earliestGroupedByKey = [earliestGroupedByKey.flat()]
167
+ }
168
+
169
+ const scorecardGroup = latestGroupedByKey.map((group, groupIndex) => {
170
+ return {
171
+ title: this.groupKeyDisplay ? `By ${this.groupKeyDisplay}` : '',
172
+ scorecards: group.map((row, rowIndex) => {
173
+ const values = this.getScorecardValues(row)
174
+ const comparisonRow = earliestGroupedByKey[groupIndex][rowIndex]
175
+ const prevVal = comparisonRow[this.valueKey]?.raw
176
+
177
+ return this.scoreCardBuilder.createScorecardData({
178
+ ...values,
179
+ prevVal,
180
+ })
181
+ }),
182
+ }
183
+ })
184
+
185
+ return scorecardGroup
186
+ }
187
+
188
+ private getScorecardValues = (row: DashboardDataResponse) => {
189
+ const { latestTs, earliestTs } = this.dataset
190
+ const title = `${this.titleColumn?.display} ${row[this.titleKey].raw}`
191
+ const rowCol = row[this.valueKey]
192
+ const { raw, rag: ragScore } = rowCol
193
+ const value = Number(raw)
194
+ const rag = ragScore !== undefined ? Number(ragScore) : undefined
195
+ this.initBuckets([row], this.valueKey)
196
+ const valueFor = `${latestTs}`
197
+ const valueFrom = `${earliestTs}`
198
+
199
+ return {
200
+ id: this.id,
201
+ title,
202
+ value,
203
+ rag: this.scoreCardBuilder.setRagScore(value, rag, this.buckets, this.bucketsHelper),
204
+ valueFor,
205
+ valueFrom,
206
+ }
207
+ }
208
+
209
+ private createGroupTitle = (row: DashboardDataResponse) => {
210
+ const title = this.groupKeyId ? `${row[this.groupKeyId]?.raw}` : ''
211
+ return this.groupKeyDisplay && this.groupKeyDisplay.length ? `${this.groupKeyDisplay}: ${title}` : title
212
+ }
213
+
214
+ build = () => {
215
+ let scorecardGroup: ScorecardGroup[]
216
+ if (!this.valueColumn) {
217
+ scorecardGroup = this.createScorecardGroupFromColumns()
218
+ } else if (this.groupKey) {
219
+ scorecardGroup = this.createScorecardGroupFromListWithGroups()
220
+ } else {
221
+ scorecardGroup = this.createScorecardGroupFromList()
222
+ }
223
+ return scorecardGroup
224
+ }
225
+ }
226
+
227
+ export { ScorecardGroupVisualisation }
228
+ export default ScorecardGroupVisualisation
@@ -0,0 +1,2 @@
1
+ "use strict";var p=Object.defineProperty;var S=Object.getOwnPropertyDescriptor;var i=Object.getOwnPropertyNames;var t=Object.prototype.hasOwnProperty;var m=(e,r,a,c)=>{if(r&&typeof r=="object"||typeof r=="function")for(let o of i(r))!t.call(e,o)&&o!==a&&p(e,o,{get:()=>r[o],enumerable:!(c=S(r,o))||c.enumerable});return e};var f=e=>m(p({},"__esModule",{value:!0}),e);var d={};module.exports=f(d);
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../src/dpr/components/_dashboards/scorecard-group/types.ts"],
4
+ "sourcesContent": ["import z from 'zod'\nimport ScorecardSchema from './validate'\n\nexport type ScorecardGroupDefinitionType = z.infer<typeof ScorecardSchema.ScorecardGroupSchema>\nexport type ScorecardGroupDefinitionMeasure = z.infer<typeof ScorecardSchema.ScorecardGroupColumn>\n"],
5
+ "mappings": "+WAAA,IAAAA,EAAA,kBAAAC,EAAAD",
6
+ "names": ["types_exports", "__toCommonJS"]
7
+ }
@@ -0,0 +1,5 @@
1
+ import z from 'zod'
2
+ import ScorecardSchema from './validate'
3
+
4
+ export type ScorecardGroupDefinitionType = z.infer<typeof ScorecardSchema.ScorecardGroupSchema>
5
+ export type ScorecardGroupDefinitionMeasure = z.infer<typeof ScorecardSchema.ScorecardGroupColumn>
@@ -0,0 +1,2 @@
1
+ "use strict";var n=Object.defineProperty;var u=Object.getOwnPropertyDescriptor;var p=Object.getOwnPropertyNames;var c=Object.prototype.hasOwnProperty;var d=(o,a)=>{for(var t in a)n(o,t,{get:a[t],enumerable:!0})},m=(o,a,t,s)=>{if(a&&typeof a=="object"||typeof a=="function")for(let i of p(a))!c.call(o,i)&&i!==t&&n(o,i,{get:()=>a[i],enumerable:!(s=u(a,i))||s.enumerable});return o};var h=o=>m(n({},"__esModule",{value:!0}),o);var f={};d(f,{default:()=>b});module.exports=h(f);var e=require("zod"),r=require("../dashboard-visualisation/Validate");const l=e.z.object({id:e.z.string(),display:e.z.string().optional(),displayValue:e.z.boolean().optional(),unit:e.z.enum(["NUMBER","PERCENTAGE"]).optional()}),y=e.z.object({...r.DashboardVisualisationSchema.shape,type:e.z.literal("scorecard-group"),options:e.z.object(r.BucketOptionsSchema.shape).optional(),columns:e.z.object({...r.DashboardColumns.shape,measures:e.z.array(l).min(2,"Measure must contain two or more items").refine(o=>o.find(t=>t.displayValue!==void 0)?o.length===2:!0,{error:"Measure must have length 2 when displayValue is defined"})})});var b={ScorecardGroupSchema:y,ScorecardGroupColumn:l};
2
+ //# sourceMappingURL=validate.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../src/dpr/components/_dashboards/scorecard-group/validate.ts"],
4
+ "sourcesContent": ["import { z } from 'zod'\nimport {\n DashboardVisualisationSchema,\n DashboardColumns,\n BucketOptionsSchema,\n} from '../dashboard-visualisation/Validate'\n\nconst ScorecardGroupColumn = z.object({\n id: z.string(),\n display: z.string().optional(),\n displayValue: z.boolean().optional(),\n unit: z.enum(['NUMBER', 'PERCENTAGE']).optional(),\n})\n\nconst ScorecardGroupSchema = z.object({\n ...DashboardVisualisationSchema.shape,\n type: z.literal('scorecard-group'),\n options: z.object(BucketOptionsSchema.shape).optional(),\n columns: z.object({\n ...DashboardColumns.shape,\n measures: z\n .array(ScorecardGroupColumn)\n .min(2, 'Measure must contain two or more items')\n .refine(\n (measures) => {\n const displayValue = measures.find((m) => m.displayValue !== undefined)\n return displayValue ? measures.length === 2 : true\n },\n { error: 'Measure must have length 2 when displayValue is defined' },\n ),\n }),\n})\n\nexport default {\n ScorecardGroupSchema,\n ScorecardGroupColumn,\n}\n"],
5
+ "mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,aAAAE,IAAA,eAAAC,EAAAH,GAAA,IAAAI,EAAkB,eAClBC,EAIO,+CAEP,MAAMC,EAAuB,IAAE,OAAO,CACpC,GAAI,IAAE,OAAO,EACb,QAAS,IAAE,OAAO,EAAE,SAAS,EAC7B,aAAc,IAAE,QAAQ,EAAE,SAAS,EACnC,KAAM,IAAE,KAAK,CAAC,SAAU,YAAY,CAAC,EAAE,SAAS,CAClD,CAAC,EAEKC,EAAuB,IAAE,OAAO,CACpC,GAAG,+BAA6B,MAChC,KAAM,IAAE,QAAQ,iBAAiB,EACjC,QAAS,IAAE,OAAO,sBAAoB,KAAK,EAAE,SAAS,EACtD,QAAS,IAAE,OAAO,CAChB,GAAG,mBAAiB,MACpB,SAAU,IACP,MAAMD,CAAoB,EAC1B,IAAI,EAAG,wCAAwC,EAC/C,OACEE,GACsBA,EAAS,KAAMC,GAAMA,EAAE,eAAiB,MAAS,EAChDD,EAAS,SAAW,EAAI,GAEhD,CAAE,MAAO,yDAA0D,CACrE,CACJ,CAAC,CACH,CAAC,EAED,IAAON,EAAQ,CACb,qBAAAK,EACA,qBAAAD,CACF",
6
+ "names": ["validate_exports", "__export", "validate_default", "__toCommonJS", "import_zod", "import_Validate", "ScorecardGroupColumn", "ScorecardGroupSchema", "measures", "m"]
7
+ }
@@ -0,0 +1,37 @@
1
+ import { z } from 'zod'
2
+ import {
3
+ DashboardVisualisationSchema,
4
+ DashboardColumns,
5
+ BucketOptionsSchema,
6
+ } from '../dashboard-visualisation/Validate'
7
+
8
+ const ScorecardGroupColumn = z.object({
9
+ id: z.string(),
10
+ display: z.string().optional(),
11
+ displayValue: z.boolean().optional(),
12
+ unit: z.enum(['NUMBER', 'PERCENTAGE']).optional(),
13
+ })
14
+
15
+ const ScorecardGroupSchema = z.object({
16
+ ...DashboardVisualisationSchema.shape,
17
+ type: z.literal('scorecard-group'),
18
+ options: z.object(BucketOptionsSchema.shape).optional(),
19
+ columns: z.object({
20
+ ...DashboardColumns.shape,
21
+ measures: z
22
+ .array(ScorecardGroupColumn)
23
+ .min(2, 'Measure must contain two or more items')
24
+ .refine(
25
+ (measures) => {
26
+ const displayValue = measures.find((m) => m.displayValue !== undefined)
27
+ return displayValue ? measures.length === 2 : true
28
+ },
29
+ { error: 'Measure must have length 2 when displayValue is defined' },
30
+ ),
31
+ }),
32
+ })
33
+
34
+ export default {
35
+ ScorecardGroupSchema,
36
+ ScorecardGroupColumn,
37
+ }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/dpr/components/_filters/types.d.ts"],
4
- "sourcesContent": ["import { Granularity, QuickFilters } from '../_inputs/granular-date-range/types'\nimport { FilterType } from './filter-input/enum'\nimport RelativeDateRange from '../_inputs/date-range/types'\n\nexport interface FilterOption {\n value: string\n text: string\n disabled?: boolean\n selected?: boolean\n sortedAsc?: boolean\n}\n\nexport type FilterValue =\n | TextFilterValue\n | FilterValueWithOptions\n | MultiselectFilterValue\n | DateFilterValue\n | DateRangeFilterValue\n | GranularDateRangeFilterValue\n\nexport type FilterValueType = string | DateRange | GranularDateRange | null\nexport interface BaseFilterValue {\n text: string\n name: string\n type: FilterType\n value: FilterValueType\n mandatory?: boolean | undefined\n index?: number | undefined\n}\n\nexport interface TextFilterValue extends BaseFilterValue {\n minimumLength?: number | undefined\n pattern?: string | undefined\n}\n\nexport interface FilterValueWithOptions extends BaseFilterValue {\n options: Array<FilterOption>\n staticOptionNameValue?: string\n dynamicResourceEndpoint?: string\n}\n\nexport interface MultiselectFilterValue extends Omit<BaseFilterValue, 'value'>, FilterValueWithOptions {\n value: string | null\n values: string[]\n}\n\nexport interface DateFilterValue extends Omit<BaseFilterValue, 'value'> {\n value: string | null\n min?: string\n max?: string\n}\n\nexport interface DateRangeFilterValue extends Omit<BaseFilterValue, 'value'> {\n value: DateRange\n min?: string\n max?: string\n relativeOptions?: { value: string; text: string; disabled?: boolean }[]\n}\n\nexport interface GranularDateRangeFilterValue extends Omit<BaseFilterValue, 'value'> {\n value: GranularDateRange\n min?: string\n max?: string\n relativeOptions?: { value: string; text: string; disabled?: boolean }[]\n quickFilterOptions?: { value: string; text: string; disabled?: boolean }[]\n granularityOptions?: { value: string; text: string }[]\n}\n\nexport interface SelectedFilter {\n text: string\n href: string\n classes: string\n}\n\nexport interface DateRange {\n start: string\n end: string\n relative?: RelativeDateRange | undefined\n}\n\nexport interface GranularDateRange extends DateRange {\n granularity: GranularDateRangeGranularityValue\n quickFilter?: GranularDateRangeQuickFilterValue\n partialDate?: {\n start: boolean\n end: boolean\n }\n}\n\ninterface GranularDateRangeGranularityValue {\n value: Granularity\n display: string\n}\n\nexport interface GranularDateRangeQuickFilterValue {\n value: QuickFilters\n display: string\n}\n\nexport interface FilterOptions {\n filters: Array<FilterValue>\n selectedFilters: Array<SelectedFilter>\n urlWithNoFilters: string\n}\n"],
4
+ "sourcesContent": ["import { Granularity, QuickFilters } from '../_inputs/granular-date-range/types'\nimport { FilterType } from './filter-input/enum'\nimport RelativeDateRange from '../_inputs/date-range/types'\n\nexport interface FilterOption {\n value: string\n text: string\n disabled?: boolean\n selected?: boolean\n sortedAsc?: boolean\n}\n\nexport type FilterValue =\n | TextFilterValue\n | FilterValueWithOptions\n | MultiselectFilterValue\n | DateFilterValue\n | DateRangeFilterValue\n | GranularDateRangeFilterValue\n\nexport type FilterValueType = string | DateRange | GranularDateRange | null\nexport interface BaseFilterValue {\n text: string\n name: string\n type: FilterType\n value: FilterValueType\n mandatory?: boolean | undefined\n index?: number | undefined\n}\n\nexport interface TextFilterValue extends BaseFilterValue {\n minimumLength?: number | undefined\n pattern?: string | undefined\n}\n\nexport interface FilterValueWithOptions extends BaseFilterValue {\n options: Array<FilterOption>\n staticOptionNameValue?: string\n dynamicResourceEndpoint?: string\n}\n\nexport interface MultiselectFilterValue extends Omit<BaseFilterValue, 'value'>, FilterValueWithOptions {\n value: string | null\n values: string[]\n}\n\nexport interface DateFilterValue extends Omit<BaseFilterValue, 'value'> {\n value: string | null\n min?: string\n max?: string\n}\n\nexport interface DateRangeFilterValue extends Omit<BaseFilterValue, 'value'> {\n value: DateRange\n min?: string\n max?: string\n relativeOptions?: { value: string; text: string; disabled?: boolean }[]\n}\n\nexport interface GranularDateRangeFilterValue extends Omit<BaseFilterValue, 'value'> {\n value: GranularDateRange\n min?: string\n max?: string\n relativeOptions?: { value: string; text: string; disabled?: boolean }[]\n quickFilterOptions?: { value: string; text: string; disabled?: boolean }[]\n granularityOptions?: { value: string; text: string }[]\n}\n\nexport interface SelectedFilter {\n text: string\n href: string\n classes: string\n}\n\nexport interface DateRange {\n start: string\n end: string\n relative?: RelativeDateRange | undefined\n}\n\nexport interface GranularDateRange extends DateRange {\n granularity: GranularDateRangeGranularityValue\n quickFilter?: GranularDateRangeQuickFilterValue\n partialDate?: PartialDate\n}\n\nexport interface PartialDate {\n start: boolean\n end: boolean\n}\n\ninterface GranularDateRangeGranularityValue {\n value: Granularity\n display: string\n}\n\nexport interface GranularDateRangeQuickFilterValue {\n value: QuickFilters\n display: string\n}\n\nexport interface FilterOptions {\n filters: Array<FilterValue>\n selectedFilters: Array<SelectedFilter>\n urlWithNoFilters: string\n}\n"],
5
5
  "mappings": "+WAAA,IAAAA,EAAA,kBAAAC,EAAAD",
6
6
  "names": ["types_d_exports", "__toCommonJS"]
7
7
  }
@@ -81,10 +81,12 @@ export interface DateRange {
81
81
  export interface GranularDateRange extends DateRange {
82
82
  granularity: GranularDateRangeGranularityValue
83
83
  quickFilter?: GranularDateRangeQuickFilterValue
84
- partialDate?: {
85
- start: boolean
86
- end: boolean
87
- }
84
+ partialDate?: PartialDate
85
+ }
86
+
87
+ export interface PartialDate {
88
+ start: boolean
89
+ end: boolean
88
90
  }
89
91
 
90
92
  interface GranularDateRangeGranularityValue {
@@ -1,2 +1,2 @@
1
- "use strict";var v=Object.create;var y=Object.defineProperty;var H=Object.getOwnPropertyDescriptor;var Q=Object.getOwnPropertyNames;var G=Object.getPrototypeOf,J=Object.prototype.hasOwnProperty;var W=(e,t)=>{for(var r in t)y(e,r,{get:t[r],enumerable:!0})},E=(e,t,r,a)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of Q(t))!J.call(e,o)&&o!==r&&y(e,o,{get:()=>t[o],enumerable:!(a=H(t,o))||a.enumerable});return e};var d=(e,t,r)=>(r=e!=null?v(G(e)):{},E(t||!e||!e.__esModule?y(r,"default",{value:e,enumerable:!0}):r,e)),X=e=>E(y({},"__esModule",{value:!0}),e);var K={};W(K,{default:()=>z,renderAsyncDashboard:()=>O});module.exports=X(K);var m=require("../../../../../components/_dashboards/dashboard-visualisation/types"),S=require("../../../../../types/UserReports"),b=d(require("../../../../../components/_charts/utils")),F=d(require("../../../../../utils/definitionUtils")),C=d(require("../../../../../components/user-reports/utils")),B=d(require("../../../../../components/_dashboards/dashboard-list/utils")),g=d(require("../../../../../components/_filters/utils")),L=d(require("../../../../../components/_dashboards/scorecard/utils")),I=d(require("../../../../../components/_dashboards/scorecard/Scorecard")),N=d(require("../../../../../components/_reports/report-actions/utils")),x=d(require("../../../../../types/ReportQuery")),A=d(require("../../../../../utils/localsHelper")),M=require("../../../../../components/_filters/filtersTypeEnum");const w=(e,t,r)=>{const a=t.name,{name:o}=e,i=r?.url?.request?.fullUrl,c=r?.executionId;let s={};return i&&(s={share:{reportName:a,name:o,url:i},copy:{url:i}},c&&(s={...s,refresh:{url:i,executionId:c}})),N.default.getActions(s)},V=async({req:e,res:t,services:r,queryData:a})=>{const{token:o}=A.default.getValues(t),{reportId:i,id:c}=e.params,s=e.query.dataProductDefinitionsPath,p=await r.dashboardService.getDefinition(o,i,c,s,a),n=await F.default.getReportSummary(i,r.reportingService,o,s),u=await g.default.getFilters({fields:p.filterFields||[],req:e,filtersType:M.FiltersType.INTERACTIVE}),f=g.default.setRequestQueryFromFilterValues(u.filters);return{query:new x.default({fields:p.filterFields||[],queryParams:f,definitionsPath:s,reportType:S.ReportType.DASHBOARD}).toRecordWithFilterPrefix(!0),filters:u,dashboardDefinition:p,reportDefinition:n}},P=(e,t,r)=>e.sections.map(a=>{const{id:o,display:i,description:c}=a;let s=!1;const p=a.visualisations.map(n=>{const{type:u,display:f,description:D,id:R}=n;let l;switch(u){case m.DashboardVisualisationType.LIST:l=B.default.createList(n,t);break;case m.DashboardVisualisationType.SCORECARD:s=!0,l=new I.default(t,n).build();break;case m.DashboardVisualisationType.SCORECARD_GROUP:l=new I.default(t,n,!0).build();break;case m.DashboardVisualisationType.BAR:case m.DashboardVisualisationType.LINE:case m.DashboardVisualisationType.DONUT:{l=b.default.createChart(n,t);break}case m.DashboardVisualisationType.MATRIX_TIMESERIES:{l=b.default.createMatrixChart(n,t,r);break}case m.DashboardVisualisationType.BAR_TIMESERIES:case m.DashboardVisualisationType.LINE_TIMESERIES:{l=b.default.createTimeseriesCharts(n,t);break}default:break}return{id:R,title:f||"",description:D||"",type:u,data:l}});return s&&L.default.mergeScorecardsIntoGroup(p),{id:o,title:i||"",description:c||"",visualisations:p}}),j=async(e,t,r,a,o,i)=>{const{requestedReportService:c}=e,s=await c.getReportByTableId(t,r);return a&&a.length&&s&&C.default.updateLastViewed({services:e,reportStateData:s,userId:r,req:o,filters:i}),s},O=async({req:e,res:t,services:r})=>{const{token:a,csrfToken:o,dprUser:i,nestedBaseUrl:c}=A.default.getValues(t),{reportId:s,id:p,tableId:n}=e.params,{bookmarkService:u,requestedReportService:f}=r,{id:D}=i;let R=await f.getReportByTableId(n,D);const l=R?.query?.data,{query:U,filters:q,reportDefinition:T,dashboardDefinition:h}=await V({req:e,res:t,services:r,queryData:l}),_=(await r.dashboardService.getAsyncDashboard(a,p,s,n,U)).flat(),k=P(h,_,U);return f&&(R=await j(r,n,i.id,k,e,q.filters)),{dashboardData:{token:a,id:p,reportId:s,name:h.name,description:h.description,reportName:T.name,bookmarked:await u.isBookmarked(p,s,i.id),nestedBaseUrl:c,csrfToken:o,sections:k,filters:q,type:S.ReportType.DASHBOARD,actions:w(h,T,R)}}};var z={renderAsyncDashboard:O,getDefinitionData:V,getSections:P,setDashboardActions:w};0&&(module.exports={renderAsyncDashboard});
1
+ "use strict";var Q=Object.create;var y=Object.defineProperty;var J=Object.getOwnPropertyDescriptor;var W=Object.getOwnPropertyNames;var X=Object.getPrototypeOf,j=Object.prototype.hasOwnProperty;var z=(e,t)=>{for(var r in t)y(e,r,{get:t[r],enumerable:!0})},q=(e,t,r,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let i of W(t))!j.call(e,i)&&i!==r&&y(e,i,{get:()=>t[i],enumerable:!(o=J(t,i))||o.enumerable});return e};var c=(e,t,r)=>(r=e!=null?Q(X(e)):{},q(t||!e||!e.__esModule?y(r,"default",{value:e,enumerable:!0}):r,e)),K=e=>q(y({},"__esModule",{value:!0}),e);var ee={};z(ee,{default:()=>$,renderAsyncDashboard:()=>M});module.exports=K(ee);var l=require("../../../../../components/_dashboards/dashboard-visualisation/types"),g=require("../../../../../types/UserReports"),I=c(require("../../../../../components/_charts/utils")),F=c(require("../../../../../utils/definitionUtils")),P=c(require("../../../../../components/user-reports/utils")),C=c(require("../../../../../components/_dashboards/dashboard-list/utils")),w=c(require("../../../../../components/_filters/utils")),B=c(require("../../../../../components/_dashboards/scorecard/utils")),L=c(require("../../../../../components/_dashboards/scorecard/Scorecard")),N=c(require("../../../../../components/_dashboards/scorecard-group/ScorecardGroup")),O=c(require("../../../../../components/_reports/report-actions/utils")),v=c(require("../../../../../types/ReportQuery")),A=c(require("../../../../../utils/localsHelper")),x=require("../../../../../components/_filters/filtersTypeEnum"),G=require("../../../../../components/_filters/filter-input/enum");const V=(e,t,r)=>{const o=t.name,{name:i}=e,s=r?.url?.request?.fullUrl,p=r?.executionId;let a={};return s&&(a={share:{reportName:o,name:i,url:s},copy:{url:s}},p&&(a={...a,refresh:{url:s,executionId:p}})),O.default.getActions(a)},k=async({req:e,res:t,services:r,queryData:o})=>{const{token:i}=A.default.getValues(t),{reportId:s,id:p}=e.params,a=e.query.dataProductDefinitionsPath,d=await r.dashboardService.getDefinition(i,s,p,a,o),f=await F.default.getReportSummary(s,r.reportingService,i,a),n=await w.default.getFilters({fields:d.filterFields||[],req:e,filtersType:x.FiltersType.INTERACTIVE}),m=w.default.setRequestQueryFromFilterValues(n.filters);return{query:new v.default({fields:d.filterFields||[],queryParams:m,definitionsPath:a,reportType:g.ReportType.DASHBOARD}).toRecordWithFilterPrefix(!0),filters:n,dashboardDefinition:d,reportDefinition:f}},E=(e,t,r,o)=>e.sections.map(i=>{const{id:s,display:p,description:a}=i;let d=!1;const f=i.visualisations.map(n=>{const{type:m,display:R,description:D,id:b}=n;let u;switch(m){case l.DashboardVisualisationType.LIST:u=C.default.createList(n,t);break;case l.DashboardVisualisationType.SCORECARD:d=!0,u=new L.default().withDefinition(n).withData(t).build();break;case l.DashboardVisualisationType.SCORECARD_GROUP:u=new N.default().withDefinition(n).withData(t).build();break;case l.DashboardVisualisationType.BAR:case l.DashboardVisualisationType.LINE:case l.DashboardVisualisationType.DONUT:{u=I.default.createChart(n,t,m);break}case l.DashboardVisualisationType.MATRIX_TIMESERIES:case l.DashboardVisualisationType.BAR_TIMESERIES:case l.DashboardVisualisationType.LINE_TIMESERIES:{u=I.default.createTimeseriesCharts(n,t,m,r,o);break}default:break}return{id:b,title:R||"",description:D||"",type:m,data:u}});return d&&B.default.mergeScorecardsIntoGroup(f),{id:s,title:p||"",description:a||"",visualisations:f}}),Y=async(e,t,r,o,i,s)=>{const{requestedReportService:p}=e,a=await p.getReportByTableId(t,r);return o&&o.length&&a&&P.default.updateLastViewed({services:e,reportStateData:a,userId:r,req:i,filters:s}),a},Z=e=>{let t;const r=e.find(o=>o.type===G.FilterType.granularDateRange.toLowerCase());return r&&(t=r.value.partialDate),t},M=async({req:e,res:t,services:r})=>{const{token:o,csrfToken:i,dprUser:s,nestedBaseUrl:p}=A.default.getValues(t),{reportId:a,id:d,tableId:f}=e.params,{bookmarkService:n,requestedReportService:m}=r,{id:R}=s;let D=await m.getReportByTableId(f,R);const b=D?.query?.data,{query:u,filters:S,reportDefinition:T,dashboardDefinition:h}=await k({req:e,res:t,services:r,queryData:b}),_=(await r.dashboardService.getAsyncDashboard(o,d,a,f,u)).flat(),H=Z(S.filters),U=E(h,_,u,H);return m&&(D=await Y(r,f,s.id,U,e,S.filters)),{dashboardData:{token:o,id:d,reportId:a,name:h.name,description:h.description,reportName:T.name,bookmarked:await n.isBookmarked(d,a,s.id),nestedBaseUrl:p,csrfToken:i,sections:U,filters:S,type:g.ReportType.DASHBOARD,actions:V(h,T,D)}}};var $={renderAsyncDashboard:M,getDefinitionData:k,getSections:E,setDashboardActions:V};0&&(module.exports={renderAsyncDashboard});
2
2
  //# sourceMappingURL=utils.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../../../src/dpr/routes/journeys/view-report/async/dashboard/utils.ts"],
4
- "sourcesContent": ["import { Request, Response } from 'express'\nimport { Services } from '../../../../../types/Services'\nimport Dict = NodeJS.Dict\nimport {\n DashboardSection,\n DashboardVisualisation,\n DashboardVisualisationType,\n} from '../../../../../components/_dashboards/dashboard-visualisation/types'\nimport type { AsyncReportUtilsParams } from '../../../../../types/AsyncReportUtils'\n\nimport type { DashboardDataResponse } from '../../../../../types/Metrics'\nimport type { RequestedReport } from '../../../../../types/UserReports'\nimport { ReportType } from '../../../../../types/UserReports'\nimport type { components } from '../../../../../types/api'\n\nimport ChartUtils from '../../../../../components/_charts/utils'\nimport DefinitionUtils from '../../../../../utils/definitionUtils'\nimport UserReportsUtils from '../../../../../components/user-reports/utils'\nimport DashboardListUtils from '../../../../../components/_dashboards/dashboard-list/utils'\nimport FilterUtils from '../../../../../components/_filters/utils'\nimport ScorecardsUtils from '../../../../../components/_dashboards/scorecard/utils'\nimport ScorecardVisualisation from '../../../../../components/_dashboards/scorecard/Scorecard'\nimport ReportActionsUtils from '../../../../../components/_reports/report-actions/utils'\nimport ReportQuery from '../../../../../types/ReportQuery'\nimport LocalsHelper from '../../../../../utils/localsHelper'\nimport { FilterValue } from '../../../../../components/_filters/types'\nimport { FiltersType } from '../../../../../components/_filters/filtersTypeEnum'\n\nconst setDashboardActions = (\n dashboardDefinition: components['schemas']['DashboardDefinition'],\n reportDefinition: components['schemas']['ReportDefinitionSummary'],\n requestData?: RequestedReport,\n) => {\n const reportName = reportDefinition.name\n const { name } = dashboardDefinition\n const actionsUrl = requestData?.url?.request?.fullUrl\n const executionId = requestData?.executionId\n\n let actions = {}\n if (actionsUrl) {\n actions = {\n share: {\n reportName,\n name,\n url: actionsUrl,\n },\n copy: {\n url: actionsUrl,\n },\n }\n if (executionId) {\n actions = {\n ...actions,\n refresh: {\n url: actionsUrl,\n executionId,\n },\n }\n }\n }\n\n return ReportActionsUtils.getActions(actions)\n}\n\nconst getDefinitionData = async ({\n req,\n res,\n services,\n queryData,\n}: {\n req: Request\n res: Response\n services: Services\n queryData?: Dict<string | string[]> | undefined\n}) => {\n const { token } = LocalsHelper.getValues(res)\n const { reportId, id } = req.params\n const dataProductDefinitionsPath = <string>req.query['dataProductDefinitionsPath']\n\n // Dashboard Definition,\n const dashboardDefinition = await services.dashboardService.getDefinition(\n token,\n reportId,\n id,\n dataProductDefinitionsPath,\n queryData,\n )\n\n // Report summary data\n const reportDefinition = await DefinitionUtils.getReportSummary(\n reportId,\n services.reportingService,\n token,\n <string>dataProductDefinitionsPath,\n )\n\n // Get the filters\n const filtersData = await FilterUtils.getFilters({\n fields: dashboardDefinition.filterFields || [],\n req,\n filtersType: FiltersType.INTERACTIVE,\n })\n\n const filtersQuery = FilterUtils.setRequestQueryFromFilterValues(filtersData.filters)\n\n // Create the query\n const query = new ReportQuery({\n fields: dashboardDefinition.filterFields || [],\n queryParams: filtersQuery,\n definitionsPath: <string>dataProductDefinitionsPath,\n reportType: ReportType.DASHBOARD,\n }).toRecordWithFilterPrefix(true)\n\n return {\n query,\n filters: filtersData,\n dashboardDefinition,\n reportDefinition,\n }\n}\n\nconst getSections = (\n dashboardDefinition: components['schemas']['DashboardDefinition'],\n dashboardData: DashboardDataResponse[],\n query: Record<string, string | string[]>,\n): DashboardSection[] => {\n return dashboardDefinition.sections.map((section: components['schemas']['DashboardSectionDefinition']) => {\n const { id, display: title, description } = section\n\n let hasScorecard = false\n const visualisations: DashboardVisualisation[] = section.visualisations.map(\n (visDefinition: components['schemas']['DashboardVisualisationDefinition']) => {\n const { type, display, description: visDescription, id: visId } = visDefinition\n\n let data: DashboardVisualisation['data'] | undefined\n\n switch (type) {\n case DashboardVisualisationType.LIST:\n data = DashboardListUtils.createList(visDefinition, dashboardData)\n break\n\n case DashboardVisualisationType.SCORECARD:\n hasScorecard = true\n data = new ScorecardVisualisation(dashboardData, visDefinition).build()\n break\n\n case DashboardVisualisationType.SCORECARD_GROUP:\n data = new ScorecardVisualisation(dashboardData, visDefinition, true).build()\n break\n\n case DashboardVisualisationType.BAR:\n case DashboardVisualisationType.LINE:\n case DashboardVisualisationType.DONUT: {\n data = ChartUtils.createChart(visDefinition, dashboardData)\n break\n }\n case DashboardVisualisationType.MATRIX_TIMESERIES: {\n data = ChartUtils.createMatrixChart(visDefinition, dashboardData, query)\n break\n }\n case DashboardVisualisationType.BAR_TIMESERIES:\n case DashboardVisualisationType.LINE_TIMESERIES: {\n data = ChartUtils.createTimeseriesCharts(visDefinition, dashboardData)\n break\n }\n default:\n break\n }\n\n return {\n id: visId,\n title: display || '',\n description: visDescription || '',\n type,\n data,\n }\n },\n )\n\n if (hasScorecard) ScorecardsUtils.mergeScorecardsIntoGroup(visualisations)\n\n return { id, title: title || '', description: description || '', visualisations }\n })\n}\n\nconst updateStore = async (\n services: Services,\n tableId: string,\n userId: string,\n sections: DashboardSection[],\n req: Request,\n filters: FilterValue[],\n): Promise<RequestedReport | undefined> => {\n const { requestedReportService } = services\n const dashboardRequestData = await requestedReportService.getReportByTableId(tableId, userId)\n\n // Add to recently viewed\n if (sections && sections.length && dashboardRequestData) {\n UserReportsUtils.updateLastViewed({\n services,\n reportStateData: dashboardRequestData,\n userId,\n req,\n filters,\n })\n }\n\n return dashboardRequestData\n}\n\nexport const renderAsyncDashboard = async ({ req, res, services }: AsyncReportUtilsParams) => {\n const { token, csrfToken, dprUser, nestedBaseUrl } = LocalsHelper.getValues(res)\n const { reportId, id, tableId } = req.params\n const { bookmarkService, requestedReportService } = services\n const { id: userId } = dprUser\n\n let requestData: RequestedReport | undefined = await requestedReportService.getReportByTableId(tableId, userId)\n const queryData = requestData?.query?.data\n\n // Get the definition Data\n const { query, filters, reportDefinition, dashboardDefinition } = await getDefinitionData({\n req,\n res,\n services,\n queryData,\n })\n\n // Get the results data\n const dashboardData: DashboardDataResponse[][] = await services.dashboardService.getAsyncDashboard(\n token,\n id,\n reportId,\n tableId,\n query,\n )\n\n const flattenedData: DashboardDataResponse[] = dashboardData.flat()\n\n // Get the dashboard parts\n const sections: DashboardSection[] = getSections(dashboardDefinition, flattenedData, query)\n\n // Update the store\n if (requestedReportService) {\n requestData = await updateStore(services, tableId, dprUser.id, sections, req, filters.filters)\n }\n\n return {\n dashboardData: {\n token,\n id,\n reportId,\n name: dashboardDefinition.name,\n description: dashboardDefinition.description,\n reportName: reportDefinition.name,\n bookmarked: await bookmarkService.isBookmarked(id, reportId, dprUser.id),\n nestedBaseUrl,\n csrfToken,\n sections,\n filters,\n type: ReportType.DASHBOARD,\n actions: setDashboardActions(dashboardDefinition, reportDefinition, requestData),\n },\n }\n}\n\nexport default {\n renderAsyncDashboard,\n getDefinitionData,\n getSections,\n setDashboardActions,\n}\n"],
5
- "mappings": "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",
6
- "names": ["utils_exports", "__export", "utils_default", "renderAsyncDashboard", "__toCommonJS", "import_types", "import_UserReports", "import_utils", "import_definitionUtils", "import_Scorecard", "import_ReportQuery", "import_localsHelper", "import_filtersTypeEnum", "setDashboardActions", "dashboardDefinition", "reportDefinition", "requestData", "reportName", "name", "actionsUrl", "executionId", "actions", "ReportActionsUtils", "getDefinitionData", "req", "res", "services", "queryData", "token", "LocalsHelper", "reportId", "id", "dataProductDefinitionsPath", "DefinitionUtils", "filtersData", "FilterUtils", "filtersQuery", "ReportQuery", "getSections", "dashboardData", "query", "section", "title", "description", "hasScorecard", "visualisations", "visDefinition", "type", "display", "visDescription", "visId", "data", "DashboardListUtils", "ScorecardVisualisation", "ChartUtils", "ScorecardsUtils", "updateStore", "tableId", "userId", "sections", "filters", "requestedReportService", "dashboardRequestData", "UserReportsUtils", "csrfToken", "dprUser", "nestedBaseUrl", "bookmarkService", "flattenedData"]
4
+ "sourcesContent": ["import { Request, Response } from 'express'\nimport { Services } from '../../../../../types/Services'\nimport Dict = NodeJS.Dict\nimport {\n DashboardSection,\n DashboardVisualisation,\n DashboardVisualisationType,\n} from '../../../../../components/_dashboards/dashboard-visualisation/types'\nimport type { AsyncReportUtilsParams } from '../../../../../types/AsyncReportUtils'\n\nimport type { DashboardDataResponse } from '../../../../../types/Metrics'\nimport type { RequestedReport } from '../../../../../types/UserReports'\nimport { ReportType } from '../../../../../types/UserReports'\nimport type { components } from '../../../../../types/api'\n\nimport ChartUtils from '../../../../../components/_charts/utils'\nimport DefinitionUtils from '../../../../../utils/definitionUtils'\nimport UserReportsUtils from '../../../../../components/user-reports/utils'\nimport DashboardListUtils from '../../../../../components/_dashboards/dashboard-list/utils'\nimport FilterUtils from '../../../../../components/_filters/utils'\nimport ScorecardsUtils from '../../../../../components/_dashboards/scorecard/utils'\nimport ScorecardVisualisation from '../../../../../components/_dashboards/scorecard/Scorecard'\nimport ScorecardGroupVisualisation from '../../../../../components/_dashboards/scorecard-group/ScorecardGroup'\nimport ReportActionsUtils from '../../../../../components/_reports/report-actions/utils'\nimport ReportQuery from '../../../../../types/ReportQuery'\nimport LocalsHelper from '../../../../../utils/localsHelper'\nimport { FilterValue, GranularDateRangeFilterValue, PartialDate } from '../../../../../components/_filters/types'\nimport { FiltersType } from '../../../../../components/_filters/filtersTypeEnum'\nimport { FilterType } from '../../../../../components/_filters/filter-input/enum'\n\nconst setDashboardActions = (\n dashboardDefinition: components['schemas']['DashboardDefinition'],\n reportDefinition: components['schemas']['ReportDefinitionSummary'],\n requestData?: RequestedReport,\n) => {\n const reportName = reportDefinition.name\n const { name } = dashboardDefinition\n const actionsUrl = requestData?.url?.request?.fullUrl\n const executionId = requestData?.executionId\n\n let actions = {}\n if (actionsUrl) {\n actions = {\n share: {\n reportName,\n name,\n url: actionsUrl,\n },\n copy: {\n url: actionsUrl,\n },\n }\n if (executionId) {\n actions = {\n ...actions,\n refresh: {\n url: actionsUrl,\n executionId,\n },\n }\n }\n }\n\n return ReportActionsUtils.getActions(actions)\n}\n\nconst getDefinitionData = async ({\n req,\n res,\n services,\n queryData,\n}: {\n req: Request\n res: Response\n services: Services\n queryData?: Dict<string | string[]> | undefined\n}) => {\n const { token } = LocalsHelper.getValues(res)\n const { reportId, id } = req.params\n const dataProductDefinitionsPath = <string>req.query['dataProductDefinitionsPath']\n\n // Dashboard Definition,\n const dashboardDefinition = await services.dashboardService.getDefinition(\n token,\n reportId,\n id,\n dataProductDefinitionsPath,\n queryData,\n )\n\n // Report summary data\n const reportDefinition = await DefinitionUtils.getReportSummary(\n reportId,\n services.reportingService,\n token,\n <string>dataProductDefinitionsPath,\n )\n\n // Get the filters\n const filtersData = await FilterUtils.getFilters({\n fields: dashboardDefinition.filterFields || [],\n req,\n filtersType: FiltersType.INTERACTIVE,\n })\n\n const filtersQuery = FilterUtils.setRequestQueryFromFilterValues(filtersData.filters)\n\n // Create the query\n const query = new ReportQuery({\n fields: dashboardDefinition.filterFields || [],\n queryParams: filtersQuery,\n definitionsPath: <string>dataProductDefinitionsPath,\n reportType: ReportType.DASHBOARD,\n }).toRecordWithFilterPrefix(true)\n\n return {\n query,\n filters: filtersData,\n dashboardDefinition,\n reportDefinition,\n }\n}\n\nconst getSections = (\n dashboardDefinition: components['schemas']['DashboardDefinition'],\n dashboardData: DashboardDataResponse[],\n query: Record<string, string | string[]>,\n partialDate?: PartialDate,\n): DashboardSection[] => {\n return dashboardDefinition.sections.map((section: components['schemas']['DashboardSectionDefinition']) => {\n const { id, display: title, description } = section\n\n let hasScorecard = false\n const visualisations: DashboardVisualisation[] = section.visualisations.map(\n (visDefinition: components['schemas']['DashboardVisualisationDefinition']) => {\n const { type, display, description: visDescription, id: visId } = visDefinition\n\n let data: DashboardVisualisation['data'] | undefined\n\n switch (type) {\n case DashboardVisualisationType.LIST:\n data = DashboardListUtils.createList(visDefinition, dashboardData)\n break\n\n case DashboardVisualisationType.SCORECARD:\n hasScorecard = true\n data = new ScorecardVisualisation().withDefinition(visDefinition).withData(dashboardData).build()\n break\n\n case DashboardVisualisationType.SCORECARD_GROUP:\n data = new ScorecardGroupVisualisation().withDefinition(visDefinition).withData(dashboardData).build()\n break\n\n case DashboardVisualisationType.BAR:\n case DashboardVisualisationType.LINE:\n case DashboardVisualisationType.DONUT: {\n data = ChartUtils.createChart(visDefinition, dashboardData, type)\n break\n }\n case DashboardVisualisationType.MATRIX_TIMESERIES:\n case DashboardVisualisationType.BAR_TIMESERIES:\n case DashboardVisualisationType.LINE_TIMESERIES: {\n data = ChartUtils.createTimeseriesCharts(visDefinition, dashboardData, type, query, partialDate)\n break\n }\n default:\n break\n }\n\n return {\n id: visId,\n title: display || '',\n description: visDescription || '',\n type,\n data,\n }\n },\n )\n\n if (hasScorecard) ScorecardsUtils.mergeScorecardsIntoGroup(visualisations)\n\n return { id, title: title || '', description: description || '', visualisations }\n })\n}\n\nconst updateStore = async (\n services: Services,\n tableId: string,\n userId: string,\n sections: DashboardSection[],\n req: Request,\n filters: FilterValue[],\n): Promise<RequestedReport | undefined> => {\n const { requestedReportService } = services\n const dashboardRequestData = await requestedReportService.getReportByTableId(tableId, userId)\n\n // Add to recently viewed\n if (sections && sections.length && dashboardRequestData) {\n UserReportsUtils.updateLastViewed({\n services,\n reportStateData: dashboardRequestData,\n userId,\n req,\n filters,\n })\n }\n\n return dashboardRequestData\n}\n\nconst getPartialDate = (filters: FilterValue[]) => {\n let partialDate: PartialDate | undefined\n const granularDateRangeFilter = <GranularDateRangeFilterValue | undefined>(\n filters.find((f) => f.type === FilterType.granularDateRange.toLowerCase())\n )\n if (granularDateRangeFilter) {\n partialDate = granularDateRangeFilter.value.partialDate\n }\n return partialDate\n}\n\nexport const renderAsyncDashboard = async ({ req, res, services }: AsyncReportUtilsParams) => {\n const { token, csrfToken, dprUser, nestedBaseUrl } = LocalsHelper.getValues(res)\n const { reportId, id, tableId } = req.params\n const { bookmarkService, requestedReportService } = services\n const { id: userId } = dprUser\n\n let requestData: RequestedReport | undefined = await requestedReportService.getReportByTableId(tableId, userId)\n const queryData = requestData?.query?.data\n\n // Get the definition Data\n const { query, filters, reportDefinition, dashboardDefinition } = await getDefinitionData({\n req,\n res,\n services,\n queryData,\n })\n\n // Get the results data\n const dashboardData: DashboardDataResponse[][] = await services.dashboardService.getAsyncDashboard(\n token,\n id,\n reportId,\n tableId,\n query,\n )\n\n const flattenedData: DashboardDataResponse[] = dashboardData.flat()\n const partialDate = getPartialDate(filters.filters)\n\n // Get the dashboard parts\n const sections: DashboardSection[] = getSections(dashboardDefinition, flattenedData, query, partialDate)\n\n // Update the store\n if (requestedReportService) {\n requestData = await updateStore(services, tableId, dprUser.id, sections, req, filters.filters)\n }\n\n return {\n dashboardData: {\n token,\n id,\n reportId,\n name: dashboardDefinition.name,\n description: dashboardDefinition.description,\n reportName: reportDefinition.name,\n bookmarked: await bookmarkService.isBookmarked(id, reportId, dprUser.id),\n nestedBaseUrl,\n csrfToken,\n sections,\n filters,\n type: ReportType.DASHBOARD,\n actions: setDashboardActions(dashboardDefinition, reportDefinition, requestData),\n },\n }\n}\n\nexport default {\n renderAsyncDashboard,\n getDefinitionData,\n getSections,\n setDashboardActions,\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["utils_exports", "__export", "utils_default", "renderAsyncDashboard", "__toCommonJS", "import_types", "import_UserReports", "import_utils", "import_definitionUtils", "import_Scorecard", "import_ScorecardGroup", "import_ReportQuery", "import_localsHelper", "import_filtersTypeEnum", "import_enum", "setDashboardActions", "dashboardDefinition", "reportDefinition", "requestData", "reportName", "name", "actionsUrl", "executionId", "actions", "ReportActionsUtils", "getDefinitionData", "req", "res", "services", "queryData", "token", "LocalsHelper", "reportId", "id", "dataProductDefinitionsPath", "DefinitionUtils", "filtersData", "FilterUtils", "filtersQuery", "ReportQuery", "getSections", "dashboardData", "query", "partialDate", "section", "title", "description", "hasScorecard", "visualisations", "visDefinition", "type", "display", "visDescription", "visId", "data", "DashboardListUtils", "ScorecardVisualisation", "ScorecardGroupVisualisation", "ChartUtils", "ScorecardsUtils", "updateStore", "tableId", "userId", "sections", "filters", "requestedReportService", "dashboardRequestData", "UserReportsUtils", "getPartialDate", "granularDateRangeFilter", "f", "csrfToken", "dprUser", "nestedBaseUrl", "bookmarkService", "flattenedData"]
7
7
  }
@@ -20,11 +20,13 @@ import DashboardListUtils from '../../../../../components/_dashboards/dashboard-
20
20
  import FilterUtils from '../../../../../components/_filters/utils'
21
21
  import ScorecardsUtils from '../../../../../components/_dashboards/scorecard/utils'
22
22
  import ScorecardVisualisation from '../../../../../components/_dashboards/scorecard/Scorecard'
23
+ import ScorecardGroupVisualisation from '../../../../../components/_dashboards/scorecard-group/ScorecardGroup'
23
24
  import ReportActionsUtils from '../../../../../components/_reports/report-actions/utils'
24
25
  import ReportQuery from '../../../../../types/ReportQuery'
25
26
  import LocalsHelper from '../../../../../utils/localsHelper'
26
- import { FilterValue } from '../../../../../components/_filters/types'
27
+ import { FilterValue, GranularDateRangeFilterValue, PartialDate } from '../../../../../components/_filters/types'
27
28
  import { FiltersType } from '../../../../../components/_filters/filtersTypeEnum'
29
+ import { FilterType } from '../../../../../components/_filters/filter-input/enum'
28
30
 
29
31
  const setDashboardActions = (
30
32
  dashboardDefinition: components['schemas']['DashboardDefinition'],
@@ -123,6 +125,7 @@ const getSections = (
123
125
  dashboardDefinition: components['schemas']['DashboardDefinition'],
124
126
  dashboardData: DashboardDataResponse[],
125
127
  query: Record<string, string | string[]>,
128
+ partialDate?: PartialDate,
126
129
  ): DashboardSection[] => {
127
130
  return dashboardDefinition.sections.map((section: components['schemas']['DashboardSectionDefinition']) => {
128
131
  const { id, display: title, description } = section
@@ -141,26 +144,23 @@ const getSections = (
141
144
 
142
145
  case DashboardVisualisationType.SCORECARD:
143
146
  hasScorecard = true
144
- data = new ScorecardVisualisation(dashboardData, visDefinition).build()
147
+ data = new ScorecardVisualisation().withDefinition(visDefinition).withData(dashboardData).build()
145
148
  break
146
149
 
147
150
  case DashboardVisualisationType.SCORECARD_GROUP:
148
- data = new ScorecardVisualisation(dashboardData, visDefinition, true).build()
151
+ data = new ScorecardGroupVisualisation().withDefinition(visDefinition).withData(dashboardData).build()
149
152
  break
150
153
 
151
154
  case DashboardVisualisationType.BAR:
152
155
  case DashboardVisualisationType.LINE:
153
156
  case DashboardVisualisationType.DONUT: {
154
- data = ChartUtils.createChart(visDefinition, dashboardData)
155
- break
156
- }
157
- case DashboardVisualisationType.MATRIX_TIMESERIES: {
158
- data = ChartUtils.createMatrixChart(visDefinition, dashboardData, query)
157
+ data = ChartUtils.createChart(visDefinition, dashboardData, type)
159
158
  break
160
159
  }
160
+ case DashboardVisualisationType.MATRIX_TIMESERIES:
161
161
  case DashboardVisualisationType.BAR_TIMESERIES:
162
162
  case DashboardVisualisationType.LINE_TIMESERIES: {
163
- data = ChartUtils.createTimeseriesCharts(visDefinition, dashboardData)
163
+ data = ChartUtils.createTimeseriesCharts(visDefinition, dashboardData, type, query, partialDate)
164
164
  break
165
165
  }
166
166
  default:
@@ -208,6 +208,17 @@ const updateStore = async (
208
208
  return dashboardRequestData
209
209
  }
210
210
 
211
+ const getPartialDate = (filters: FilterValue[]) => {
212
+ let partialDate: PartialDate | undefined
213
+ const granularDateRangeFilter = <GranularDateRangeFilterValue | undefined>(
214
+ filters.find((f) => f.type === FilterType.granularDateRange.toLowerCase())
215
+ )
216
+ if (granularDateRangeFilter) {
217
+ partialDate = granularDateRangeFilter.value.partialDate
218
+ }
219
+ return partialDate
220
+ }
221
+
211
222
  export const renderAsyncDashboard = async ({ req, res, services }: AsyncReportUtilsParams) => {
212
223
  const { token, csrfToken, dprUser, nestedBaseUrl } = LocalsHelper.getValues(res)
213
224
  const { reportId, id, tableId } = req.params
@@ -235,9 +246,10 @@ export const renderAsyncDashboard = async ({ req, res, services }: AsyncReportUt
235
246
  )
236
247
 
237
248
  const flattenedData: DashboardDataResponse[] = dashboardData.flat()
249
+ const partialDate = getPartialDate(filters.filters)
238
250
 
239
251
  // Get the dashboard parts
240
- const sections: DashboardSection[] = getSections(dashboardDefinition, flattenedData, query)
252
+ const sections: DashboardSection[] = getSections(dashboardDefinition, flattenedData, query, partialDate)
241
253
 
242
254
  // Update the store
243
255
  if (requestedReportService) {
@@ -1,2 +1,2 @@
1
- "use strict";var p=Object.create;var s=Object.defineProperty;var u=Object.getOwnPropertyDescriptor;var y=Object.getOwnPropertyNames;var c=Object.getPrototypeOf,d=Object.prototype.hasOwnProperty;var m=(e,r)=>{for(var o in r)s(e,o,{get:r[o],enumerable:!0})},l=(e,r,o,a)=>{if(r&&typeof r=="object"||typeof r=="function")for(let t of y(r))!d.call(e,t)&&t!==o&&s(e,t,{get:()=>r[t],enumerable:!(a=u(r,t))||a.enumerable});return e};var h=(e,r,o)=>(o=e!=null?p(c(e)):{},l(r||!e||!e.__esModule?s(o,"default",{value:e,enumerable:!0}):o,e)),v=e=>l(s({},"__esModule",{value:!0}),e);var g={};m(g,{ViewReportController:()=>i,default:()=>f});module.exports=v(g);var n=h(require("../../../utils/logger"));class i{constructor(r,o){this.errorHandler=async(r,o,a)=>{n.default.error(`Error: ${JSON.stringify(r.body)}`),o.render("dpr/routes/journeys/view-report/error",{layoutPath:this.layoutPath,...r.body,...r.params,error:r.body.error,params:r.params})};this.layoutPath=r,this.services=o}}var f=i;0&&(module.exports={ViewReportController});
1
+ "use strict";var c=Object.create;var s=Object.defineProperty;var d=Object.getOwnPropertyDescriptor;var u=Object.getOwnPropertyNames;var y=Object.getPrototypeOf,f=Object.prototype.hasOwnProperty;var h=(o,r)=>{for(var e in r)s(o,e,{get:r[e],enumerable:!0})},n=(o,r,e,a)=>{if(r&&typeof r=="object"||typeof r=="function")for(let t of u(r))!f.call(o,t)&&t!==e&&s(o,t,{get:()=>r[t],enumerable:!(a=d(r,t))||a.enumerable});return o};var l=(o,r,e)=>(e=o!=null?c(y(o)):{},n(r||!o||!o.__esModule?s(e,"default",{value:o,enumerable:!0}):e,o)),v=o=>n(s({},"__esModule",{value:!0}),o);var H={};h(H,{ViewReportController:()=>i,default:()=>g});module.exports=v(H);var m=l(require("../../../utils/ErrorHandler")),p=l(require("../../../utils/logger"));class i{constructor(r,e){this.errorHandler=async(r,e,a)=>{p.default.error(`Error: ${JSON.stringify(r.body)}`);const t=new m.default(r.body.error).formatError();e.render("dpr/routes/journeys/view-report/error",{layoutPath:this.layoutPath,...r.body,...r.params,error:t,params:r.params})};this.layoutPath=r,this.services=e}}var g=i;0&&(module.exports={ViewReportController});
2
2
  //# sourceMappingURL=controller.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../src/dpr/routes/journeys/view-report/controller.ts"],
4
- "sourcesContent": ["import { RequestHandler } from 'express'\nimport { Services } from '../../../types/Services'\nimport logger from '../../../utils/logger'\n\nclass ViewReportController {\n layoutPath: string\n\n services: Services\n\n constructor(layoutPath: string, services: Services) {\n this.layoutPath = layoutPath\n this.services = services\n }\n\n errorHandler: RequestHandler = async (req, res, _next) => {\n logger.error(`Error: ${JSON.stringify(req.body)}`)\n\n res.render(`dpr/routes/journeys/view-report/error`, {\n layoutPath: this.layoutPath,\n ...req.body,\n ...req.params,\n error: req.body.error,\n params: req.params,\n })\n }\n}\n\nexport { ViewReportController }\nexport default ViewReportController\n"],
5
- "mappings": "0jBAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,0BAAAE,EAAA,YAAAC,IAAA,eAAAC,EAAAJ,GAEA,IAAAK,EAAmB,oCAEnB,MAAMH,CAAqB,CAKzB,YAAYI,EAAoBC,EAAoB,CAKpD,kBAA+B,MAAOC,EAAKC,EAAKC,IAAU,CACxD,EAAAC,QAAO,MAAM,UAAU,KAAK,UAAUH,EAAI,IAAI,CAAC,EAAE,EAEjDC,EAAI,OAAO,wCAAyC,CAClD,WAAY,KAAK,WACjB,GAAGD,EAAI,KACP,GAAGA,EAAI,OACP,MAAOA,EAAI,KAAK,MAChB,OAAQA,EAAI,MACd,CAAC,CACH,EAdE,KAAK,WAAaF,EAClB,KAAK,SAAWC,CAClB,CAaF,CAGA,IAAOJ,EAAQD",
6
- "names": ["controller_exports", "__export", "ViewReportController", "controller_default", "__toCommonJS", "import_logger", "layoutPath", "services", "req", "res", "_next", "logger"]
4
+ "sourcesContent": ["import { RequestHandler } from 'express'\nimport ErrorHandler from '../../../utils/ErrorHandler'\nimport { Services } from '../../../types/Services'\nimport logger from '../../../utils/logger'\n\nclass ViewReportController {\n layoutPath: string\n\n services: Services\n\n constructor(layoutPath: string, services: Services) {\n this.layoutPath = layoutPath\n this.services = services\n }\n\n errorHandler: RequestHandler = async (req, res, _next) => {\n logger.error(`Error: ${JSON.stringify(req.body)}`)\n const error = new ErrorHandler(req.body.error).formatError()\n\n res.render(`dpr/routes/journeys/view-report/error`, {\n layoutPath: this.layoutPath,\n ...req.body,\n ...req.params,\n error,\n params: req.params,\n })\n }\n}\n\nexport { ViewReportController }\nexport default ViewReportController\n"],
5
+ "mappings": "0jBAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,0BAAAE,EAAA,YAAAC,IAAA,eAAAC,EAAAJ,GACA,IAAAK,EAAyB,0CAEzBC,EAAmB,oCAEnB,MAAMJ,CAAqB,CAKzB,YAAYK,EAAoBC,EAAoB,CAKpD,kBAA+B,MAAOC,EAAKC,EAAKC,IAAU,CACxD,EAAAC,QAAO,MAAM,UAAU,KAAK,UAAUH,EAAI,IAAI,CAAC,EAAE,EACjD,MAAMI,EAAQ,IAAI,EAAAC,QAAaL,EAAI,KAAK,KAAK,EAAE,YAAY,EAE3DC,EAAI,OAAO,wCAAyC,CAClD,WAAY,KAAK,WACjB,GAAGD,EAAI,KACP,GAAGA,EAAI,OACP,MAAAI,EACA,OAAQJ,EAAI,MACd,CAAC,CACH,EAfE,KAAK,WAAaF,EAClB,KAAK,SAAWC,CAClB,CAcF,CAGA,IAAOL,EAAQD",
6
+ "names": ["controller_exports", "__export", "ViewReportController", "controller_default", "__toCommonJS", "import_ErrorHandler", "import_logger", "layoutPath", "services", "req", "res", "_next", "logger", "error", "ErrorHandler"]
7
7
  }
@@ -1,4 +1,5 @@
1
1
  import { RequestHandler } from 'express'
2
+ import ErrorHandler from '../../../utils/ErrorHandler'
2
3
  import { Services } from '../../../types/Services'
3
4
  import logger from '../../../utils/logger'
4
5
 
@@ -14,12 +15,13 @@ class ViewReportController {
14
15
 
15
16
  errorHandler: RequestHandler = async (req, res, _next) => {
16
17
  logger.error(`Error: ${JSON.stringify(req.body)}`)
18
+ const error = new ErrorHandler(req.body.error).formatError()
17
19
 
18
20
  res.render(`dpr/routes/journeys/view-report/error`, {
19
21
  layoutPath: this.layoutPath,
20
22
  ...req.body,
21
23
  ...req.params,
22
- error: req.body.error,
24
+ error,
23
25
  params: req.params,
24
26
  })
25
27
  }
@@ -1,2 +1,2 @@
1
- "use strict";var h=Object.create;var o=Object.defineProperty;var p=Object.getOwnPropertyDescriptor;var u=Object.getOwnPropertyNames;var d=Object.getPrototypeOf,f=Object.prototype.hasOwnProperty;var c=(s,e)=>{for(var r in e)o(s,r,{get:e[r],enumerable:!0})},g=(s,e,r,i)=>{if(e&&typeof e=="object"||typeof e=="function")for(let t of u(e))!f.call(s,t)&&t!==r&&o(s,t,{get:()=>e[t],enumerable:!(i=p(e,t))||i.enumerable});return s};var m=(s,e,r)=>(r=s!=null?h(d(s)):{},g(e||!s||!s.__esModule?o(r,"default",{value:s,enumerable:!0}):r,s)),l=s=>g(o({},"__esModule",{value:!0}),s);var E={};c(E,{ErrorHandler:()=>n,default:()=>M});module.exports=l(E);var a=m(require("./logger"));class n{constructor(e){this.formatError=()=>this.handleError();this.handleError=()=>{if(typeof this.error=="string")this.developerMessage=this.error;else if(this.error.data){const r=this.error.data;this.developerMessage=r.developerMessage,this.userMessage=r.userMessage,this.moreInfo=r.moreInfo,this.status=r.status}else if(Object.prototype.hasOwnProperty.call(this.error,"message")){const r=this.error;this.userMessage=r.message,this.stack=r.stack,this.status=500}else if(Object.prototype.hasOwnProperty.call(this.error,"developerMessage")){const r=this.error;this.developerMessage=r.developerMessage,this.userMessage=r.userMessage,this.moreInfo=r.moreInfo,this.status=r.status}const e={...this.developerMessage&&{developerMessage:this.developerMessage},...this.userMessage&&{userMessage:this.userMessage},...this.moreInfo&&{moreInfo:this.moreInfo},...this.stack&&{stack:this.stack},...this.status&&{status:this.status}};return a.default.error(JSON.stringify(e,null,2)),e};this.error=e,a.default.error(`Error: ${JSON.stringify(e)}`)}}var M=n;0&&(module.exports={ErrorHandler});
1
+ "use strict";var h=Object.create;var a=Object.defineProperty;var p=Object.getOwnPropertyDescriptor;var u=Object.getOwnPropertyNames;var c=Object.getPrototypeOf,d=Object.prototype.hasOwnProperty;var f=(s,e)=>{for(var r in e)a(s,r,{get:e[r],enumerable:!0})},g=(s,e,r,o)=>{if(e&&typeof e=="object"||typeof e=="function")for(let t of u(e))!d.call(s,t)&&t!==r&&a(s,t,{get:()=>e[t],enumerable:!(o=p(e,t))||o.enumerable});return s};var l=(s,e,r)=>(r=s!=null?h(c(s)):{},g(e||!s||!s.__esModule?a(r,"default",{value:s,enumerable:!0}):r,s)),m=s=>g(a({},"__esModule",{value:!0}),s);var E={};f(E,{ErrorHandler:()=>i,default:()=>M});module.exports=m(E);var n=l(require("./logger"));class i{constructor(e){this.formatError=()=>this.handleError();this.handleError=()=>{if(typeof this.error=="string")this.developerMessage=this.error;else if(this.error.data){const r=this.error.data;this.developerMessage=r.developerMessage,this.userMessage=r.userMessage,this.moreInfo=r.moreInfo,this.status=r.status}else if(Object.prototype.hasOwnProperty.call(this.error,"message")){const r=this.error;this.userMessage=r.message,this.stack=r.stack,this.status=500}else if(Object.prototype.hasOwnProperty.call(this.error,"developerMessage")){const r=this.error;this.developerMessage=r.developerMessage,this.userMessage=r.userMessage,this.moreInfo=r.moreInfo,this.status=r.status}else if(Object.prototype.hasOwnProperty.call(this.error,"userMessage")){const r=this.error;if(r.stack&&r.stack.includes("ZodError")){const o=JSON.parse(r.userMessage);this.userMessage=o.map(t=>t.message).join(", "),this.status=500,this.stack=r.stack}}const e={...this.developerMessage&&{developerMessage:this.developerMessage},...this.userMessage&&{userMessage:this.userMessage},...this.moreInfo&&{moreInfo:this.moreInfo},...this.stack&&{stack:this.stack},...this.status&&{status:this.status}};return n.default.error(JSON.stringify(e,null,2)),e};this.error=e,n.default.error(`Error: ${JSON.stringify(e)}`)}}var M=i;0&&(module.exports={ErrorHandler});
2
2
  //# sourceMappingURL=ErrorHandler.js.map