@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.
- package/dpr/components/_catalogue/catalogue-list/utils.test.ts +1 -1
- package/dpr/components/_charts/chart/Chart.js +2 -0
- package/dpr/components/_charts/chart/Chart.js.map +7 -0
- package/dpr/components/_charts/chart/Chart.ts +89 -0
- package/dpr/components/_charts/chart/ChartColours.js +2 -0
- package/dpr/components/_charts/chart/ChartColours.js.map +7 -0
- package/dpr/components/_charts/chart/ChartColours.ts +36 -0
- package/dpr/components/_charts/chart/ChartTimeseries.js +2 -0
- package/dpr/components/_charts/chart/ChartTimeseries.js.map +7 -0
- package/dpr/components/_charts/chart/ChartTimeseries.ts +95 -0
- package/dpr/components/_charts/chart/bar/BarChart.js +2 -0
- package/dpr/components/_charts/chart/bar/BarChart.js.map +7 -0
- package/dpr/components/_charts/chart/bar/BarChart.ts +204 -0
- package/dpr/components/_charts/chart/bar/clientClass.mjs +0 -58
- package/dpr/components/_charts/chart/bar/types.js +2 -0
- package/dpr/components/_charts/chart/bar/types.js.map +7 -0
- package/dpr/components/_charts/chart/bar/types.ts +6 -0
- package/dpr/components/_charts/chart/bar/validate.js +2 -0
- package/dpr/components/_charts/chart/bar/validate.js.map +7 -0
- package/dpr/components/_charts/chart/bar/validate.ts +59 -0
- package/dpr/components/_charts/chart/bar-timeseries/BarTimeseriesChart.js +2 -0
- package/dpr/components/_charts/chart/bar-timeseries/BarTimeseriesChart.js.map +7 -0
- package/dpr/components/_charts/chart/bar-timeseries/BarTimeseriesChart.ts +57 -0
- package/dpr/components/_charts/chart/bar-timeseries/types.js +2 -0
- package/dpr/components/_charts/chart/bar-timeseries/types.js.map +7 -0
- package/dpr/components/_charts/chart/bar-timeseries/types.ts +5 -0
- package/dpr/components/_charts/chart/bar-timeseries/validate.js +2 -0
- package/dpr/components/_charts/chart/bar-timeseries/validate.js.map +7 -0
- package/dpr/components/_charts/chart/bar-timeseries/validate.ts +30 -0
- package/dpr/components/_charts/chart/buckets/Buckets.js +2 -0
- package/dpr/components/_charts/chart/buckets/Buckets.js.map +7 -0
- package/dpr/components/_charts/chart/{Buckets.ts → buckets/Buckets.ts} +18 -14
- package/dpr/components/_charts/chart/buckets/types.js +2 -0
- package/dpr/components/_charts/chart/buckets/types.js.map +7 -0
- package/dpr/components/_charts/chart/buckets/types.ts +4 -0
- package/dpr/components/_charts/chart/buckets/validate.js +2 -0
- package/dpr/components/_charts/chart/buckets/validate.js.map +7 -0
- package/dpr/components/_charts/chart/buckets/validate.ts +15 -0
- package/dpr/components/_charts/chart/chart-config.js +2 -0
- package/dpr/components/_charts/chart/chart-config.js.map +7 -0
- package/dpr/components/_charts/chart/chart-config.ts +108 -0
- package/dpr/components/_charts/chart/clientClass.mjs +28 -106
- package/dpr/components/_charts/chart/doughnut/DoughnutChart.js +2 -0
- package/dpr/components/_charts/chart/doughnut/DoughnutChart.js.map +7 -0
- package/dpr/components/_charts/chart/doughnut/DoughnutChart.ts +77 -0
- package/dpr/components/_charts/chart/doughnut/clientClass.mjs +0 -45
- package/dpr/components/_charts/chart/doughnut/types.js +2 -0
- package/dpr/components/_charts/chart/doughnut/types.js.map +7 -0
- package/dpr/components/_charts/chart/doughnut/types.ts +5 -0
- package/dpr/components/_charts/chart/doughnut/validate.js +2 -0
- package/dpr/components/_charts/chart/doughnut/validate.js.map +7 -0
- package/dpr/components/_charts/chart/doughnut/validate.ts +30 -0
- package/dpr/components/_charts/chart/heatmap/HeatmapChart.js +1 -1
- package/dpr/components/_charts/chart/heatmap/HeatmapChart.js.map +3 -3
- package/dpr/components/_charts/chart/heatmap/HeatmapChart.ts +122 -44
- package/dpr/components/_charts/chart/heatmap/clientClass.mjs +7 -89
- package/dpr/components/_charts/chart/heatmap/types.js +1 -1
- package/dpr/components/_charts/chart/heatmap/types.js.map +1 -1
- package/dpr/components/_charts/chart/heatmap/types.ts +5 -0
- package/dpr/components/_charts/chart/heatmap/validate.js +2 -0
- package/dpr/components/_charts/chart/heatmap/validate.js.map +7 -0
- package/dpr/components/_charts/chart/heatmap/validate.ts +25 -0
- package/dpr/components/_charts/chart/line/LineChart.js +2 -0
- package/dpr/components/_charts/chart/line/LineChart.js.map +7 -0
- package/dpr/components/_charts/chart/line/LineChart.ts +89 -0
- package/dpr/components/_charts/chart/line/clientClass.mjs +5 -36
- package/dpr/components/_charts/chart/line/types.js +2 -0
- package/dpr/components/_charts/chart/line/types.js.map +7 -0
- package/dpr/components/_charts/chart/line/types.ts +5 -0
- package/dpr/components/_charts/chart/line/validate.js +2 -0
- package/dpr/components/_charts/chart/line/validate.js.map +7 -0
- package/dpr/components/_charts/chart/line/validate.ts +30 -0
- package/dpr/components/_charts/chart/line-timeseries/LineTimeseriesChart.js +2 -0
- package/dpr/components/_charts/chart/line-timeseries/LineTimeseriesChart.js.map +7 -0
- package/dpr/components/_charts/chart/line-timeseries/LineTimeseriesChart.ts +57 -0
- package/dpr/components/_charts/chart/line-timeseries/types.js +2 -0
- package/dpr/components/_charts/chart/line-timeseries/types.js.map +7 -0
- package/dpr/components/_charts/chart/line-timeseries/types.ts +5 -0
- package/dpr/components/_charts/chart/line-timeseries/validate.js +2 -0
- package/dpr/components/_charts/chart/line-timeseries/validate.js.map +7 -0
- package/dpr/components/_charts/chart/line-timeseries/validate.ts +30 -0
- package/dpr/components/_charts/chart/view.njk +8 -1
- package/dpr/components/_charts/chart-tabs/view.njk +15 -14
- package/dpr/components/_charts/utils.js +1 -1
- package/dpr/components/_charts/utils.js.map +3 -3
- package/dpr/components/_charts/utils.test.ts +9 -3
- package/dpr/components/_charts/utils.ts +59 -193
- package/dpr/components/_dashboards/dashboard-list/types.js +2 -0
- package/dpr/components/_dashboards/dashboard-list/types.js.map +7 -0
- package/dpr/components/_dashboards/dashboard-list/types.ts +4 -0
- package/dpr/components/_dashboards/dashboard-list/validate.js +2 -0
- package/dpr/components/_dashboards/dashboard-list/validate.js.map +7 -0
- package/dpr/components/_dashboards/dashboard-list/validate.ts +28 -0
- package/dpr/components/_dashboards/dashboard-visualisation/Validate.js +2 -0
- package/dpr/components/_dashboards/dashboard-visualisation/Validate.js.map +7 -0
- package/dpr/components/_dashboards/dashboard-visualisation/Validate.ts +71 -0
- package/dpr/components/_dashboards/dashboard-visualisation/types.js +1 -1
- package/dpr/components/_dashboards/dashboard-visualisation/types.js.map +2 -2
- package/dpr/components/_dashboards/dashboard-visualisation/types.ts +32 -2
- package/dpr/components/_dashboards/scorecard/Scorecard.js +1 -1
- package/dpr/components/_dashboards/scorecard/Scorecard.js.map +3 -3
- package/dpr/components/_dashboards/scorecard/Scorecard.ts +82 -213
- package/dpr/components/_dashboards/scorecard/types.js +1 -1
- package/dpr/components/_dashboards/scorecard/types.js.map +1 -1
- package/dpr/components/_dashboards/scorecard/types.ts +11 -1
- package/dpr/components/_dashboards/scorecard/validate.js +2 -0
- package/dpr/components/_dashboards/scorecard/validate.js.map +7 -0
- package/dpr/components/_dashboards/scorecard/validate.ts +36 -0
- package/dpr/components/_dashboards/scorecard-group/ScorecardGroup.js +2 -0
- package/dpr/components/_dashboards/scorecard-group/ScorecardGroup.js.map +7 -0
- package/dpr/components/_dashboards/scorecard-group/ScorecardGroup.ts +228 -0
- package/dpr/components/_dashboards/scorecard-group/types.js +2 -0
- package/dpr/components/_dashboards/scorecard-group/types.js.map +7 -0
- package/dpr/components/_dashboards/scorecard-group/types.ts +5 -0
- package/dpr/components/_dashboards/scorecard-group/validate.js +2 -0
- package/dpr/components/_dashboards/scorecard-group/validate.js.map +7 -0
- package/dpr/components/_dashboards/scorecard-group/validate.ts +37 -0
- package/dpr/components/_filters/types.d.js.map +1 -1
- package/dpr/components/_filters/types.d.ts +6 -4
- package/dpr/routes/journeys/view-report/async/dashboard/utils.js +1 -1
- package/dpr/routes/journeys/view-report/async/dashboard/utils.js.map +3 -3
- package/dpr/routes/journeys/view-report/async/dashboard/utils.ts +22 -10
- package/dpr/routes/journeys/view-report/controller.js +1 -1
- package/dpr/routes/journeys/view-report/controller.js.map +3 -3
- package/dpr/routes/journeys/view-report/controller.ts +3 -1
- package/dpr/utils/ErrorHandler.js +1 -1
- package/dpr/utils/ErrorHandler.js.map +3 -3
- package/dpr/utils/ErrorHandler.ts +16 -0
- package/package.json +1 -1
- package/dpr/components/_charts/chart/Buckets.js +0 -2
- package/dpr/components/_charts/chart/Buckets.js.map +0 -7
- package/dpr/components/_dashboards/dashboard-visualisation/DashboardVisualisation.js +0 -2
- package/dpr/components/_dashboards/dashboard-visualisation/DashboardVisualisation.js.map +0 -7
- package/dpr/components/_dashboards/dashboard-visualisation/DashboardVisualisation.ts +0 -40
|
@@ -0,0 +1,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,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
|
|
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
|
-
|
|
86
|
-
|
|
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
|
|
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(
|
|
5
|
-
"mappings": "0jBAAA,IAAAA,
|
|
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(
|
|
147
|
+
data = new ScorecardVisualisation().withDefinition(visDefinition).withData(dashboardData).build()
|
|
145
148
|
break
|
|
146
149
|
|
|
147
150
|
case DashboardVisualisationType.SCORECARD_GROUP:
|
|
148
|
-
data = new
|
|
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
|
|
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
|
|
5
|
-
"mappings": "0jBAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,0BAAAE,EAAA,YAAAC,IAAA,eAAAC,EAAAJ,
|
|
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
|
|
24
|
+
error,
|
|
23
25
|
params: req.params,
|
|
24
26
|
})
|
|
25
27
|
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";var h=Object.create;var
|
|
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
|