@ministryofjustice/hmpps-digital-prison-reporting-frontend 4.15.3 → 4.16.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dpr/components/_async/async-filters-form/view.njk +2 -2
- package/dpr/components/_catalogue/catalogue-list/utils.test.ts +1 -1
- package/dpr/components/_charts/chart/Buckets.js +2 -0
- package/dpr/components/_charts/chart/Buckets.js.map +7 -0
- package/dpr/components/_charts/chart/Buckets.ts +198 -0
- package/dpr/components/_charts/chart/DashboardVisualisation.js +2 -0
- package/dpr/components/_charts/chart/DashboardVisualisation.js.map +7 -0
- package/dpr/components/_charts/chart/DashboardVisualisation.ts +43 -0
- package/dpr/components/_charts/chart/heatmap/HeatmapChart.js +2 -0
- package/dpr/components/_charts/chart/heatmap/HeatmapChart.js.map +7 -0
- package/dpr/components/_charts/chart/heatmap/HeatmapChart.ts +144 -0
- package/dpr/components/_charts/utils.js +1 -1
- package/dpr/components/_charts/utils.js.map +3 -3
- package/dpr/components/_charts/utils.ts +1 -1
- package/dpr/components/_dashboards/dashboard/types.js.map +1 -1
- package/dpr/components/_dashboards/dashboard/types.ts +4 -4
- package/dpr/components/_dashboards/scorecard/Scorecard.js +2 -0
- package/dpr/components/_dashboards/scorecard/Scorecard.js.map +7 -0
- package/dpr/components/_dashboards/scorecard/Scorecard.ts +315 -0
- 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 +20 -1
- package/dpr/components/_dashboards/scorecard/utils.js +1 -1
- package/dpr/components/_dashboards/scorecard/utils.js.map +3 -3
- package/dpr/components/_dashboards/scorecard/utils.test.ts +8 -437
- package/dpr/components/_dashboards/scorecard/utils.ts +2 -265
- package/dpr/components/_dashboards/scorecard/view.njk +2 -2
- package/dpr/components/_filters/types.d.js.map +1 -1
- package/dpr/components/_filters/types.d.ts +1 -0
- package/dpr/components/_filters/utils.js +1 -1
- package/dpr/components/_filters/utils.js.map +3 -3
- package/dpr/components/_filters/utils.ts +17 -12
- package/dpr/routes/journeys/request-report/filters/tests.cy.js +1 -1
- package/dpr/routes/journeys/request-report/filters/tests.cy.js.map +3 -3
- package/dpr/routes/journeys/request-report/filters/tests.cy.ts +40 -0
- 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 +3 -2
- package/dpr/types/api.d.js.map +1 -1
- package/dpr/types/api.d.ts +2 -0
- package/dpr/utils/datasetHelper.js +1 -1
- package/dpr/utils/datasetHelper.js.map +2 -2
- package/dpr/utils/datasetHelper.ts +1 -1
- package/package.json +1 -1
- package/dpr/components/_charts/chart/heatmap/Heatmap.js +0 -2
- package/dpr/components/_charts/chart/heatmap/Heatmap.js.map +0 -7
- package/dpr/components/_charts/chart/heatmap/Heatmap.ts +0 -278
|
@@ -1,266 +1,5 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
DashboardUIVisualisation,
|
|
4
|
-
DashboardVisualisation,
|
|
5
|
-
DashboardVisualisationColumn,
|
|
6
|
-
DashboardVisualisationColumns,
|
|
7
|
-
DashboardVisualisationType,
|
|
8
|
-
ScorecardVisualisationColumn,
|
|
9
|
-
} from '../dashboard/types'
|
|
10
|
-
import { Scorecard, ScorecardGroup, ScorecardTrend } from './types'
|
|
11
|
-
import DatasetHelper from '../../../utils/datasetHelper'
|
|
12
|
-
|
|
13
|
-
export const createScorecards = (
|
|
14
|
-
scorecardDefinition: DashboardVisualisation,
|
|
15
|
-
rawData: DashboardDataResponse[],
|
|
16
|
-
): ScorecardGroup[] => {
|
|
17
|
-
const { columns } = scorecardDefinition
|
|
18
|
-
const { measures, keys } = columns
|
|
19
|
-
const dataset = getDataset(scorecardDefinition, rawData)
|
|
20
|
-
const { earliest, latest, earliestTs, latestTs } = dataset
|
|
21
|
-
|
|
22
|
-
const scorecardFromListValueColumn = (<ScorecardVisualisationColumn[]>measures).find((col) => col.displayValue)
|
|
23
|
-
const groupKey = DatasetHelper.getGroupKey(keys, latest)
|
|
24
|
-
|
|
25
|
-
let scorecardGroup: ScorecardGroup[]
|
|
26
|
-
if (!scorecardFromListValueColumn) {
|
|
27
|
-
scorecardGroup = createScorecardGroupFromColumns(columns, earliest, earliestTs, latest, latestTs, groupKey)
|
|
28
|
-
} else if (groupKey) {
|
|
29
|
-
scorecardGroup = createScorecardGroupFromListWithGroups(columns, earliest, earliestTs, latest, latestTs, groupKey)
|
|
30
|
-
} else {
|
|
31
|
-
scorecardGroup = createScorecardGroupFromList(columns, earliest, earliestTs, latest, latestTs)
|
|
32
|
-
}
|
|
33
|
-
return scorecardGroup
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
const getDataset = (scorecardDefinition: DashboardVisualisation, rawData: DashboardDataResponse[]) => {
|
|
37
|
-
const latestData = DatasetHelper.getLastestDataset(rawData)
|
|
38
|
-
const latestDataSetRows = DatasetHelper.getDatasetRows(scorecardDefinition, latestData)
|
|
39
|
-
const latestTs = latestDataSetRows[0]?.ts?.raw
|
|
40
|
-
const latestFiltered = DatasetHelper.filterRowsByDisplayColumns(scorecardDefinition, latestDataSetRows, true)
|
|
41
|
-
|
|
42
|
-
const earliestData = DatasetHelper.getEarliestDataset(rawData)
|
|
43
|
-
const earliestDataSetRows = DatasetHelper.getDatasetRows(scorecardDefinition, earliestData)
|
|
44
|
-
const earliestTs = earliestDataSetRows[0]?.ts?.raw
|
|
45
|
-
const earliestfiltered = DatasetHelper.filterRowsByDisplayColumns(scorecardDefinition, earliestDataSetRows, true)
|
|
46
|
-
|
|
47
|
-
return {
|
|
48
|
-
earliest: earliestfiltered,
|
|
49
|
-
earliestTs,
|
|
50
|
-
latest: latestFiltered,
|
|
51
|
-
latestTs,
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
const createScorecardData = ({
|
|
56
|
-
title,
|
|
57
|
-
value,
|
|
58
|
-
rag,
|
|
59
|
-
valueFor,
|
|
60
|
-
valueFrom,
|
|
61
|
-
prevVal,
|
|
62
|
-
groupTitle,
|
|
63
|
-
}: {
|
|
64
|
-
title: string
|
|
65
|
-
value: string | number
|
|
66
|
-
rag?: number
|
|
67
|
-
valueFor: string
|
|
68
|
-
valueFrom: string
|
|
69
|
-
prevVal: string | number
|
|
70
|
-
groupTitle?: string
|
|
71
|
-
}) => {
|
|
72
|
-
return {
|
|
73
|
-
title,
|
|
74
|
-
value,
|
|
75
|
-
...(rag && { rag: getRag(rag) }),
|
|
76
|
-
valueFor,
|
|
77
|
-
trend: createTrend(valueFor, valueFrom, value, prevVal),
|
|
78
|
-
...(groupTitle && {
|
|
79
|
-
group: groupTitle,
|
|
80
|
-
}),
|
|
81
|
-
}
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
export const createScorecard = (scorecardDefinition: DashboardVisualisation, rawData: DashboardDataResponse[]) => {
|
|
85
|
-
const { columns } = scorecardDefinition
|
|
86
|
-
const { measures } = columns
|
|
87
|
-
const displayColumn = measures[0]
|
|
88
|
-
const { id: valueColumnId, display } = displayColumn
|
|
89
|
-
|
|
90
|
-
const dataset = getDataset(scorecardDefinition, rawData)
|
|
91
|
-
const { earliest, latest, earliestTs, latestTs } = dataset
|
|
92
|
-
|
|
93
|
-
const scorecordArr: Scorecard[] = latest.map((datasetRow: DashboardDataResponse, index: number) => {
|
|
94
|
-
const title = display
|
|
95
|
-
const { rag, raw: value } = datasetRow[valueColumnId]
|
|
96
|
-
const prevVal = earliest[index][valueColumnId].raw
|
|
97
|
-
const valueFor = `${latestTs}`
|
|
98
|
-
const valueFrom = `${earliestTs}`
|
|
99
|
-
|
|
100
|
-
return createScorecardData({
|
|
101
|
-
title,
|
|
102
|
-
value,
|
|
103
|
-
rag,
|
|
104
|
-
prevVal,
|
|
105
|
-
valueFor,
|
|
106
|
-
valueFrom,
|
|
107
|
-
})
|
|
108
|
-
})
|
|
109
|
-
|
|
110
|
-
return scorecordArr[0]
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
const createScorecardGroupFromList = (
|
|
114
|
-
columns: DashboardVisualisationColumns,
|
|
115
|
-
earliest: DashboardDataResponse[],
|
|
116
|
-
earliestTs: string | number,
|
|
117
|
-
latest: DashboardDataResponse[],
|
|
118
|
-
latestTs: string | number,
|
|
119
|
-
): ScorecardGroup[] => {
|
|
120
|
-
const { measures } = columns
|
|
121
|
-
const valueColumn = (<ScorecardVisualisationColumn[]>measures).find((col) => col.displayValue)
|
|
122
|
-
const displayColumn = measures.find((col) => {
|
|
123
|
-
return col.display || col.display === ''
|
|
124
|
-
})
|
|
125
|
-
return [
|
|
126
|
-
{
|
|
127
|
-
title: '',
|
|
128
|
-
scorecards: latest.map((datasetRow: DashboardDataResponse, index: number) => {
|
|
129
|
-
const title = displayColumn
|
|
130
|
-
? `${displayColumn.display} ${datasetRow[displayColumn.id].raw}`
|
|
131
|
-
: displayColumn.display
|
|
132
|
-
const { rag, raw: value } = datasetRow[valueColumn.id]
|
|
133
|
-
const prevVal = earliest[index][valueColumn.id].raw
|
|
134
|
-
const valueFor = `${latestTs}`
|
|
135
|
-
const valueFrom = `${earliestTs}`
|
|
136
|
-
|
|
137
|
-
return createScorecardData({
|
|
138
|
-
title,
|
|
139
|
-
value,
|
|
140
|
-
rag,
|
|
141
|
-
prevVal,
|
|
142
|
-
valueFor,
|
|
143
|
-
valueFrom,
|
|
144
|
-
})
|
|
145
|
-
}),
|
|
146
|
-
},
|
|
147
|
-
]
|
|
148
|
-
}
|
|
149
|
-
|
|
150
|
-
const createScorecardGroupFromColumns = (
|
|
151
|
-
columns: DashboardVisualisationColumns,
|
|
152
|
-
earliest: DashboardDataResponse[],
|
|
153
|
-
earliestTs: string | number,
|
|
154
|
-
latest: DashboardDataResponse[],
|
|
155
|
-
latestTs: string | number,
|
|
156
|
-
groupKey: DashboardVisualisationColumn,
|
|
157
|
-
) => {
|
|
158
|
-
const { measures } = columns
|
|
159
|
-
|
|
160
|
-
return latest.map((row, rowIndex) => {
|
|
161
|
-
const groupTitle = `${row[groupKey?.id]?.raw}` || ''
|
|
162
|
-
|
|
163
|
-
return {
|
|
164
|
-
title: groupKey.display ? `${groupKey.display}: ${groupTitle}` : groupTitle,
|
|
165
|
-
scorecards: Object.keys(row)
|
|
166
|
-
.filter((colId) => colId !== groupKey?.id)
|
|
167
|
-
.map((colId) => {
|
|
168
|
-
const comparisonRow = earliest[rowIndex]
|
|
169
|
-
const measure = measures.find((m) => m.id === colId)
|
|
170
|
-
const title = measure?.display || colId
|
|
171
|
-
const value = +row[colId].raw
|
|
172
|
-
const rag = +row[colId].rag
|
|
173
|
-
const prevVal = comparisonRow[colId]?.raw
|
|
174
|
-
const valueFor = `${latestTs}`
|
|
175
|
-
const valueFrom = `${earliestTs}`
|
|
176
|
-
|
|
177
|
-
return createScorecardData({
|
|
178
|
-
title,
|
|
179
|
-
value,
|
|
180
|
-
rag,
|
|
181
|
-
prevVal,
|
|
182
|
-
valueFor,
|
|
183
|
-
valueFrom,
|
|
184
|
-
})
|
|
185
|
-
}),
|
|
186
|
-
}
|
|
187
|
-
})
|
|
188
|
-
}
|
|
189
|
-
|
|
190
|
-
const createScorecardGroupFromListWithGroups = (
|
|
191
|
-
columns: DashboardVisualisationColumns,
|
|
192
|
-
earliest: DashboardDataResponse[],
|
|
193
|
-
earliestTs: string | number,
|
|
194
|
-
latest: DashboardDataResponse[],
|
|
195
|
-
latestTs: string | number,
|
|
196
|
-
groupKey: DashboardVisualisationColumn,
|
|
197
|
-
) => {
|
|
198
|
-
const { measures } = columns
|
|
199
|
-
|
|
200
|
-
const latestGroupedByKey = DatasetHelper.groupRowsByKey(latest, groupKey.id)
|
|
201
|
-
const earliestGroupedByKey = DatasetHelper.groupRowsByKey(earliest, groupKey.id)
|
|
202
|
-
const valueColumn = (<ScorecardVisualisationColumn[]>measures).find((col) => col.displayValue)
|
|
203
|
-
const displayColumn = measures.find((col) => {
|
|
204
|
-
return col.display || col.display === ''
|
|
205
|
-
})
|
|
206
|
-
|
|
207
|
-
const scorecardGroup = latestGroupedByKey.map((group, groupIndex) => {
|
|
208
|
-
const groupTitle = `${group[0][groupKey?.id]?.raw}` || ''
|
|
209
|
-
return {
|
|
210
|
-
title: groupKey.display ? `${groupKey.display}: ${groupTitle}` : groupTitle,
|
|
211
|
-
scorecards: group.map((row, rowIndex) => {
|
|
212
|
-
const title = displayColumn ? `${displayColumn.display} ${row[displayColumn.id].raw}` : displayColumn.display
|
|
213
|
-
const value = +row[valueColumn.id].raw
|
|
214
|
-
const rag = +row[valueColumn.id].rag
|
|
215
|
-
const valueFor = `${latestTs}`
|
|
216
|
-
const valueFrom = `${earliestTs}`
|
|
217
|
-
|
|
218
|
-
const comparisonRow = earliestGroupedByKey[groupIndex][rowIndex]
|
|
219
|
-
const prevVal = comparisonRow[valueColumn.id]?.raw
|
|
220
|
-
|
|
221
|
-
return createScorecardData({
|
|
222
|
-
title,
|
|
223
|
-
value,
|
|
224
|
-
rag,
|
|
225
|
-
prevVal,
|
|
226
|
-
valueFor,
|
|
227
|
-
valueFrom,
|
|
228
|
-
})
|
|
229
|
-
}),
|
|
230
|
-
}
|
|
231
|
-
})
|
|
232
|
-
|
|
233
|
-
return scorecardGroup
|
|
234
|
-
}
|
|
235
|
-
|
|
236
|
-
const getRag = (ragScore: number) => {
|
|
237
|
-
const ragColors = ['green', 'yellow', 'red']
|
|
238
|
-
return {
|
|
239
|
-
score: ragScore,
|
|
240
|
-
color: ragColors[ragScore],
|
|
241
|
-
}
|
|
242
|
-
}
|
|
243
|
-
|
|
244
|
-
const createTrend = (
|
|
245
|
-
valueFor: string,
|
|
246
|
-
valueFrom: string,
|
|
247
|
-
latestValue: string | number,
|
|
248
|
-
earliestValue: string | number,
|
|
249
|
-
): ScorecardTrend | undefined => {
|
|
250
|
-
let trendData
|
|
251
|
-
|
|
252
|
-
if (valueFrom !== valueFor) {
|
|
253
|
-
const value = +latestValue - +earliestValue
|
|
254
|
-
const direction = Math.sign(value)
|
|
255
|
-
trendData = {
|
|
256
|
-
direction,
|
|
257
|
-
value: Math.abs(value),
|
|
258
|
-
from: valueFrom,
|
|
259
|
-
}
|
|
260
|
-
}
|
|
261
|
-
|
|
262
|
-
return trendData
|
|
263
|
-
}
|
|
1
|
+
import { DashboardUIVisualisation, DashboardVisualisationType } from '../dashboard/types'
|
|
2
|
+
import { Scorecard } from './types'
|
|
264
3
|
|
|
265
4
|
export const mergeScorecardsIntoGroup = (visualisations: DashboardUIVisualisation[]) => {
|
|
266
5
|
const groupedScorecardIndexes: number[][] = visualisations
|
|
@@ -302,7 +41,5 @@ export const mergeScorecardsIntoGroup = (visualisations: DashboardUIVisualisatio
|
|
|
302
41
|
}
|
|
303
42
|
|
|
304
43
|
export default {
|
|
305
|
-
createScorecard,
|
|
306
|
-
createScorecards,
|
|
307
44
|
mergeScorecardsIntoGroup,
|
|
308
45
|
}
|
|
@@ -25,8 +25,8 @@
|
|
|
25
25
|
{{ title }}
|
|
26
26
|
</p>
|
|
27
27
|
|
|
28
|
-
<p class="govuk-body dpr-scorecard__value {% if rag %}govuk-tag--{{ rag.
|
|
29
|
-
{% if rag %}
|
|
28
|
+
<p style="background-color: {{ rag.colour }}" class="govuk-body dpr-scorecard__value {% if rag %}govuk-tag--{{ rag.colour }}{% endif %}">{{ value }}</p>
|
|
29
|
+
{% if rag.score %}
|
|
30
30
|
<p class="govuk-body dpr-scorecard__value-description">Status: {{ rag.score }}</p>
|
|
31
31
|
{% endif %}
|
|
32
32
|
|
|
@@ -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\n}\n\nexport interface TextFilterValue extends BaseFilterValue {\n minimumLength?: number\n pattern?: string\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\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\n index?: number\n}\n\nexport interface TextFilterValue extends BaseFilterValue {\n minimumLength?: number\n pattern?: string\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\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"],
|
|
5
5
|
"mappings": "kWAAA,IAAAA,EAAA,kBAAAC,EAAAD",
|
|
6
6
|
"names": ["types_d_exports", "__toCommonJS"]
|
|
7
7
|
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
var
|
|
1
|
+
var j=Object.create;var V=Object.defineProperty;var N=Object.getOwnPropertyDescriptor;var M=Object.getOwnPropertyNames;var A=Object.getPrototypeOf,W=Object.prototype.hasOwnProperty;var _=(i,a)=>{for(var t in a)V(i,t,{get:a[t],enumerable:!0})},C=(i,a,t,r)=>{if(a&&typeof a=="object"||typeof a=="function")for(let e of M(a))!W.call(i,e)&&e!==t&&V(i,e,{get:()=>a[e],enumerable:!(r=N(a,e))||r.enumerable});return i};var y=(i,a,t)=>(t=i!=null?j(A(i)):{},C(a||!i||!i.__esModule?V(t,"default",{value:i,enumerable:!0}):t,i)),H=i=>C(V({},"__esModule",{value:!0}),i);var B={};_(B,{default:()=>z,getFilters:()=>U,getFiltersFromDefinition:()=>k,getPersonalisedFilters:()=>L,redirectWithDefaultFilters:()=>O,setFilterQueryFromFilterDefinition:()=>S,setFilterValuesFromRequest:()=>w,setRequestQueryFromFilterValues:()=>E});module.exports=H(B);var u=require("./filter-input/enum"),p=require("../../types/ReportQuery"),x=y(require("./filters-selected/utils")),D=y(require("../_inputs/date-range/utils")),h=y(require("../_inputs/date-input/utils")),R=y(require("../_inputs/granular-date-range/utils")),b=y(require("../_inputs/multi-select/utils")),Q=y(require("../../utils/Personalisation/personalisationUtils")),G=y(require("../../utils/urlHelper")),q=require("./filtersTypeEnum"),T=y(require("../../utils/localsHelper"));const w=(i,a,t="filters.")=>{const{preventDefault:r}=a.query;return Object.keys(a.query).every(e=>!e.includes(t))&&!r?i:i.map(e=>{let n,l;switch(e.type.toLowerCase()){case u.FilterType.dateRange.toLowerCase():n=D.default.setValueFromRequest(e,a,t);break;case u.FilterType.granularDateRange.toLowerCase():n=R.default.setValueFromRequest(e,a,t);break;case u.FilterType.date.toLowerCase():n=h.default.setValueFromRequest(e,a,t);break;case u.FilterType.multiselect.toLowerCase():({requestfilterValue:n,requestfilterValues:l}=b.default.setValueFromRequest(e,a,t));break;default:n=a.query[`${t}${e.name}`];break}let o=null;return n?o=n:r&&(o=""),{...e,value:o,...l&&{values:l}}})},S=(i,a)=>{let t=i.filter(r=>r.filter);return a&&(t=t.filter(r=>r.filter.interactive)),t.filter(r=>r.filter!==void 0).filter(r=>r.filter.defaultValue!==void 0).map(r=>{const e=r.filter;switch(e.type.toLocaleLowerCase()){case u.FilterType.dateRange.toLowerCase():return D.default.getQueryFromDefinition(e,r.name,p.DEFAULT_FILTERS_PREFIX);case u.FilterType.multiselect.toLowerCase():return b.default.getQueryFromDefinition(e,r.name,p.DEFAULT_FILTERS_PREFIX);case u.FilterType.granularDateRange.toLowerCase():{const l=D.default.getQueryFromDefinition(e,r.name,p.DEFAULT_FILTERS_PREFIX);return R.default.getQueryFromDefinition(e,r.name,p.DEFAULT_FILTERS_PREFIX,l)}default:return`${p.DEFAULT_FILTERS_PREFIX}${r.name}=${e.defaultValue}`}}).join("&")},k=(i,a)=>{const t=i.filter(e=>e.filter).filter(e=>a!==void 0?e.filter.interactive===void 0?!a:a===e.filter.interactive:!0).map(e=>{const{display:n,name:l}=e,f=e.filter,{type:o,staticOptions:s,dynamicOptions:m,defaultValue:F,mandatory:d,pattern:I,index:P}=f,g=s?s.map($=>({value:$.name,text:$.display})):[];let c={text:n,name:l,type:o,value:F||null,minimumLength:m?.minimumLength,mandatory:d||!1,pattern:I,index:P};const v={value:"no-filter",text:"None",disabled:!1};switch(o){case u.FilterType.autocomplete.toLowerCase():c={...c,options:g};break;case u.FilterType.radio:d||g.unshift(v),c={...c,options:g};break;case u.FilterType.select:{d||g.unshift(v),g.unshift({value:"",text:"Select your option",disabled:!0,selected:!0}),c={...c,options:g};break}case u.FilterType.multiselect.toLowerCase():c={...c,options:g,values:F?F.split(","):[]};break;case u.FilterType.dateRange.toLowerCase():c=D.default.getFilterFromDefinition(f,c);break;case u.FilterType.date.toLowerCase():c=h.default.getFilterFromDefinition(f,c);break;case u.FilterType.granularDateRange.toLocaleLowerCase():{c=R.default.getFilterFromDefinition(f,c);break}default:break}return c});return X(t)},X=i=>{const a=i.filter(r=>r.index===void 0);return i.filter(r=>r.index!==void 0).forEach(r=>{a.splice(r.index,0,r)}),a},E=i=>i.filter(t=>t.value).reduce((t,r)=>{const{value:e,name:n}=r,l=`filters.${n}`;switch(r.type){case u.FilterType.granularDateRange.toLowerCase():{const f=e;Object.keys(f).forEach(o=>{let s=f[o];o.includes("partialDate")?t={...t}:((o.includes("granularity")||o.includes("quickFilter"))&&(s=s.value),t={...t,[`${l}.${o}`]:s})})}break;case u.FilterType.dateRange.toLowerCase():Object.keys(e).forEach(f=>{t={...t,[`${l}.${f}`]:e[f]}});break;case u.FilterType.multiselect.toLowerCase():t={...t,[`${l}`]:e.split(",")};break;default:t={...t,[`${l}`]:e};break}return t},{}),O=(i,a,t,r)=>{const e={},{specification:n}=a,l=n?n.fields:[],{preventDefault:f}=r.query;if(Object.keys(i.filters).length===0&&!f&&l.filter(s=>s.filter&&s.filter.defaultValue).forEach(s=>{const{filter:m}=s;if(m)if(m.type.toLowerCase()===u.FilterType.dateRange.toLowerCase()){const{defaultValue:F}=m,d=F?F.split(" - "):"";d.length>=1&&(e[`${p.DEFAULT_FILTERS_PREFIX}${s.name}.start`]=d[0],d.length>=2&&(e[`${p.DEFAULT_FILTERS_PREFIX}${s.name}.end`]=d[1]))}else e[`${p.DEFAULT_FILTERS_PREFIX}${s.name}`]=m.defaultValue||""}),Object.keys(e).length>0){const s=(0,G.default)(i.toRecordWithFilterPrefix(),e,l);return t.redirect(`${r.baseUrl}${r.path}${s}`),!0}return!1},L=async(i,a,t,r,e)=>{const{reportId:n,id:l}=a.params,{dprUser:f}=T.default.getValues(t),o=await r.defaultFilterValuesService.get(f.id,n,l,e);let s=i;return o&&(s=Q.default.setFilterValuesFromSavedDefaults(i,[],o).filters),{filters:s,defaultFilterValues:o}},U=async({fields:i,req:a,res:t,prefix:r="filters.",services:e,filtersType:n})=>{let l=await k(i,n===q.FiltersType.INTERACTIVE),f,o=!1;if(e){const{filters:m,defaultFilterValues:F}=await L(l,a,t,e,n);l=m,f=F?.length>0,o=!0}a.query&&(l=w(l,a));const s=x.default.getSelectedFilters(l,r);return{filters:l,selectedFilters:s,hasDefaults:f,canSaveDefaults:o}};var z={getFiltersFromDefinition:k,setFilterValuesFromRequest:w,getFilters:U,setFilterQueryFromFilterDefinition:S,redirectWithDefaultFilters:O,setRequestQueryFromFilterValues:E,getPersonalisedFilters:L};0&&(module.exports={getFilters,getFiltersFromDefinition,getPersonalisedFilters,redirectWithDefaultFilters,setFilterQueryFromFilterDefinition,setFilterValuesFromRequest,setRequestQueryFromFilterValues});
|
|
2
2
|
//# sourceMappingURL=utils.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/dpr/components/_filters/utils.ts"],
|
|
4
|
-
"sourcesContent": ["/* eslint-disable no-param-reassign */\nimport { Request, Response } from 'express'\nimport { GranularDateRangeQuickFilterValue } from './types'\nimport { FilterType } from './filter-input/enum'\nimport type { components } from '../../types/api'\nimport type { FilterOption } from './filter-input/types'\nimport type {\n DateFilterValue,\n FilterValueType,\n DateRangeFilterValue,\n FilterValue,\n MultiselectFilterValue,\n GranularDateRangeFilterValue,\n GranularDateRange,\n GranularDateRangeGranularityValue,\n} from './types'\nimport ReportQuery, { DEFAULT_FILTERS_PREFIX } from '../../types/ReportQuery'\n\nimport SelectedFiltersUtils from './filters-selected/utils'\nimport DateRangeInputUtils from '../_inputs/date-range/utils'\nimport DateInputUtils from '../_inputs/date-input/utils'\nimport GranularDateRangeInputUtils from '../_inputs/granular-date-range/utils'\nimport MultiSelectUtils from '../_inputs/multi-select/utils'\nimport { Granularity, QuickFilters } from '../_inputs/granular-date-range/types'\nimport PersonalistionUtils from '../../utils/Personalisation/personalisationUtils'\nimport createUrlForParameters from '../../utils/urlHelper'\nimport { Services } from '../../types/Services'\nimport { FiltersType } from './filtersTypeEnum'\nimport LocalsHelper from '../../utils/localsHelper'\nimport { defaultFilterValue } from '../../utils/Personalisation/types'\n\n/**\n * Given a FilterValue[], will update the values to match the req.query values if present\n *\n * @param {FilterValue[]} filters\n * @param {Request} req\n * @param {string} [prefix='filters.']\n * @return {*} {FilterValue[]}\n */\nexport const setFilterValuesFromRequest = (\n filters: FilterValue[],\n req: Request,\n prefix = 'filters.',\n): FilterValue[] => {\n const { preventDefault } = req.query\n\n if (Object.keys(req.query).every((key) => !key.includes(prefix)) && !preventDefault) {\n return filters\n }\n\n return filters.map((filter: FilterValue) => {\n let requestfilterValue: FilterValueType\n let requestfilterValues: string[] | undefined\n\n const type = filter.type.toLowerCase()\n switch (type) {\n case FilterType.dateRange.toLowerCase():\n requestfilterValue = DateRangeInputUtils.setValueFromRequest(<DateRangeFilterValue>filter, req, prefix)\n break\n case FilterType.granularDateRange.toLowerCase():\n requestfilterValue = GranularDateRangeInputUtils.setValueFromRequest(\n <GranularDateRangeFilterValue>filter,\n req,\n prefix,\n )\n break\n case FilterType.date.toLowerCase():\n requestfilterValue = DateInputUtils.setValueFromRequest(<DateFilterValue>filter, req, prefix)\n break\n case FilterType.multiselect.toLowerCase():\n ;({ requestfilterValue, requestfilterValues } = MultiSelectUtils.setValueFromRequest(\n <MultiselectFilterValue>filter,\n req,\n prefix,\n ))\n break\n default:\n requestfilterValue = <string>req.query[`${prefix}${filter.name}`]\n break\n }\n\n let value: FilterValueType = null\n if (requestfilterValue) {\n value = requestfilterValue\n } else if (preventDefault) {\n value = ''\n }\n\n return {\n ...filter,\n value,\n ...(requestfilterValues && { values: requestfilterValues }),\n }\n })\n}\n\nexport const setFilterQueryFromFilterDefinition = (\n fields: components['schemas']['FieldDefinition'][],\n interactive?: boolean,\n) => {\n let filterFields: components['schemas']['FieldDefinition'][] = fields.filter((f) => f.filter)\n if (interactive) {\n filterFields = filterFields.filter(\n (f) => (<components['schemas']['FilterDefinition'] & { interactive?: boolean }>f.filter).interactive,\n )\n }\n\n return filterFields\n .filter((field) => field.filter !== undefined)\n .filter((field) => (<components['schemas']['FilterDefinition']>field.filter).defaultValue !== undefined)\n .map((field) => {\n const filter = <components['schemas']['FilterDefinition']>field.filter\n const type = filter.type.toLocaleLowerCase()\n\n switch (type) {\n case FilterType.dateRange.toLowerCase():\n return DateRangeInputUtils.getQueryFromDefinition(filter, field.name, DEFAULT_FILTERS_PREFIX)\n\n case FilterType.multiselect.toLowerCase():\n return MultiSelectUtils.getQueryFromDefinition(filter, field.name, DEFAULT_FILTERS_PREFIX)\n\n case FilterType.granularDateRange.toLowerCase(): {\n const startEndParams = DateRangeInputUtils.getQueryFromDefinition(filter, field.name, DEFAULT_FILTERS_PREFIX)\n return GranularDateRangeInputUtils.getQueryFromDefinition(\n filter as unknown as components['schemas']['FilterDefinition'] & {\n defaultGranularity: Granularity\n defaultQuickFilterValue: QuickFilters\n },\n field.name,\n DEFAULT_FILTERS_PREFIX,\n startEndParams,\n )\n }\n\n default:\n return `${DEFAULT_FILTERS_PREFIX}${field.name}=${filter.defaultValue}`\n }\n })\n .join('&')\n}\n\nexport const getFiltersFromDefinition = (\n fields: components['schemas']['FieldDefinition'][],\n interactive?: boolean,\n): FilterValue[] => {\n return fields\n .filter((f) => f.filter)\n .filter((f) => {\n if (interactive !== undefined) {\n const interactiveFilterValue = (<\n components['schemas']['FieldDefinition'] & {\n interactive?: boolean\n }\n >f.filter).interactive\n\n // NOTE: Uncomment if filters are meant to be both interactive and non interactive.\n if (interactiveFilterValue === undefined) {\n return !interactive\n }\n\n return interactive === interactiveFilterValue\n }\n return true\n })\n .map((f) => {\n const { display: text, name } = f\n const filter = <components['schemas']['FilterDefinition']>f.filter\n const { type, staticOptions, dynamicOptions, defaultValue, mandatory, pattern } = filter\n\n const options: FilterOption[] = staticOptions\n ? staticOptions.map((opt) => {\n return { value: opt.name, text: opt.display }\n })\n : []\n\n let filterData: FilterValue = {\n text,\n name,\n type: type as FilterType,\n value: defaultValue || null,\n minimumLength: dynamicOptions?.minimumLength,\n mandatory: mandatory || false,\n pattern,\n }\n\n const noFilterOption = {\n value: 'no-filter',\n text: 'None',\n disabled: false,\n }\n\n switch (type) {\n case FilterType.autocomplete.toLowerCase():\n filterData = {\n ...filterData,\n options,\n }\n break\n\n case FilterType.radio:\n if (!mandatory) options.unshift(noFilterOption)\n filterData = {\n ...filterData,\n options,\n }\n break\n\n case FilterType.select: {\n if (!mandatory) options.unshift(noFilterOption)\n options.unshift({\n value: '',\n text: 'Select your option',\n disabled: true,\n selected: true,\n })\n\n filterData = {\n ...filterData,\n options,\n }\n break\n }\n\n case FilterType.multiselect.toLowerCase():\n filterData = {\n ...filterData,\n options,\n values: defaultValue ? defaultValue.split(',') : [],\n }\n break\n\n case FilterType.dateRange.toLowerCase():\n filterData = DateRangeInputUtils.getFilterFromDefinition(filter, filterData)\n break\n\n case FilterType.date.toLowerCase():\n filterData = DateInputUtils.getFilterFromDefinition(filter, filterData)\n break\n\n case FilterType.granularDateRange.toLocaleLowerCase(): {\n filterData = GranularDateRangeInputUtils.getFilterFromDefinition(filter, filterData)\n break\n }\n\n default:\n break\n }\n\n return filterData\n })\n}\n\nexport const setRequestQueryFromFilterValues = (filterValues: FilterValue[]) => {\n const requestQuery = filterValues\n .filter((fv) => fv.value)\n .reduce((acc, curr) => {\n const { value, name } = curr\n const filterPrefix = `filters.${name}`\n switch (curr.type) {\n case FilterType.granularDateRange.toLowerCase():\n {\n const granularDateRangeValue = <GranularDateRange>value\n Object.keys(granularDateRangeValue).forEach((key) => {\n let v = granularDateRangeValue[key as keyof GranularDateRange]\n if (key.includes('partialDate')) {\n acc = {\n ...acc,\n }\n } else {\n if (key.includes('granularity') || key.includes('quickFilter')) {\n v = (<GranularDateRangeGranularityValue | GranularDateRangeQuickFilterValue>v).value\n }\n acc = {\n ...acc,\n [`${filterPrefix}.${key}`]: v,\n }\n }\n })\n }\n break\n case FilterType.dateRange.toLowerCase():\n Object.keys(value).forEach((key) => {\n acc = {\n ...acc,\n [`${filterPrefix}.${key}`]: value[key as keyof FilterValueType],\n }\n })\n break\n case FilterType.multiselect.toLowerCase():\n acc = {\n ...acc,\n [`${filterPrefix}`]: (<string>value).split(','),\n }\n break\n default:\n acc = {\n ...acc,\n [`${filterPrefix}`]: value,\n }\n break\n }\n return acc\n }, {})\n\n return requestQuery\n}\n\nexport const redirectWithDefaultFilters = (\n reportQuery: ReportQuery,\n variantDefinition: components['schemas']['VariantDefinition'],\n response: Response,\n request: Request,\n) => {\n const defaultFilters: Record<string, string> = {}\n const { specification } = variantDefinition\n const fields = specification ? specification.fields : []\n const { preventDefault } = request.query\n const hasNoQueryFilters = Object.keys(reportQuery.filters).length === 0 && !preventDefault\n if (hasNoQueryFilters) {\n fields\n .filter((f) => f.filter && f.filter.defaultValue)\n .forEach((f) => {\n const { filter } = f\n if (filter) {\n if (filter.type.toLowerCase() === FilterType.dateRange.toLowerCase()) {\n const { defaultValue } = <components['schemas']['FilterDefinition']>filter\n const dates = defaultValue ? defaultValue.split(' - ') : ''\n\n if (dates.length >= 1) {\n // eslint-disable-next-line prefer-destructuring\n defaultFilters[`${DEFAULT_FILTERS_PREFIX}${f.name}.start`] = dates[0]\n\n if (dates.length >= 2) {\n // eslint-disable-next-line prefer-destructuring\n defaultFilters[`${DEFAULT_FILTERS_PREFIX}${f.name}.end`] = dates[1]\n }\n }\n } else {\n defaultFilters[`${DEFAULT_FILTERS_PREFIX}${f.name}`] = filter.defaultValue || ''\n }\n }\n })\n }\n\n if (Object.keys(defaultFilters).length > 0) {\n const querystring = createUrlForParameters(reportQuery.toRecordWithFilterPrefix(), defaultFilters, fields)\n response.redirect(`${request.baseUrl}${request.path}${querystring}`)\n return true\n }\n\n return false\n}\n\nexport const getPersonalisedFilters = async (\n filters: FilterValue[],\n req: Request,\n res: Response,\n services: Services,\n filtersType: FiltersType,\n) => {\n const { reportId, id } = req.params\n const { dprUser } = LocalsHelper.getValues(res)\n const defaultFilterValues: defaultFilterValue[] = await services.defaultFilterValuesService.get(\n dprUser.id,\n reportId,\n id,\n filtersType,\n )\n let defaultFilters = filters\n if (defaultFilterValues) {\n const personalisedFilters = PersonalistionUtils.setFilterValuesFromSavedDefaults(filters, [], defaultFilterValues)\n defaultFilters = personalisedFilters.filters\n }\n\n return { filters: defaultFilters, defaultFilterValues }\n}\n\nexport const getFilters = async ({\n fields,\n req,\n res,\n prefix = 'filters.',\n services,\n filtersType,\n}: {\n fields: components['schemas']['FieldDefinition'][]\n req: Request\n res?: Response\n prefix?: string\n services?: Services\n filtersType: FiltersType\n}) => {\n // 1. Set the filters from the product definition\n let filters = await getFiltersFromDefinition(fields, filtersType === FiltersType.INTERACTIVE)\n\n let hasDefaults\n let canSaveDefaults = false\n if (services) {\n // 2. If there are personalised filters, overwrite fiters with the personalised filter values.\n const { filters: personalisedFilterValues, defaultFilterValues } = await getPersonalisedFilters(\n filters,\n req,\n res,\n services,\n filtersType,\n )\n filters = personalisedFilterValues\n hasDefaults = defaultFilterValues?.length > 0\n canSaveDefaults = true\n }\n\n // If there is a request query, overwrite the filters with the query params\n if (req.query) {\n filters = setFilterValuesFromRequest(filters, req)\n }\n\n // Set the selected filters\n const selectedFilters = SelectedFiltersUtils.getSelectedFilters(filters, prefix)\n\n return {\n filters,\n selectedFilters,\n hasDefaults,\n canSaveDefaults,\n }\n}\n\nexport default {\n getFiltersFromDefinition,\n setFilterValuesFromRequest,\n getFilters,\n setFilterQueryFromFilterDefinition,\n redirectWithDefaultFilters,\n setRequestQueryFromFilterValues,\n getPersonalisedFilters,\n}\n"],
|
|
5
|
-
"mappings": "6iBAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,aAAAE,EAAA,eAAAC,EAAA,6BAAAC,EAAA,2BAAAC,EAAA,+BAAAC,EAAA,uCAAAC,EAAA,+BAAAC,EAAA,oCAAAC,IAAA,eAAAC,EAAAV,GAGA,IAAAW,EAA2B,+BAa3BC,EAAoD,mCAEpDC,EAAiC,uCACjCA,EAAgC,0CAChCA,EAA2B,0CAC3BA,EAAwC,mDACxCA,EAA6B,4CAE7BC,EAAgC,+DAChCC,EAAmC,oCAEnCC,EAA4B,6BAC5BC,EAAyB,uCAWlB,MAAMT,EAA6B,CACxCU,EACAC,EACAC,EAAS,aACS,CAClB,KAAM,CAAE,eAAAC,CAAe,EAAIF,EAAI,MAE/B,OAAI,OAAO,KAAKA,EAAI,KAAK,EAAE,MAAOG,GAAQ,CAACA,EAAI,SAASF,CAAM,CAAC,GAAK,CAACC,EAC5DH,EAGFA,EAAQ,IAAKK,GAAwB,CAC1C,IAAIC,EACAC,EAGJ,OADaF,EAAO,KAAK,YAAY,EACvB,CACZ,KAAK,aAAW,UAAU,YAAY,EACpCC,EAAqB,EAAAE,QAAoB,oBAA0CH,EAAQJ,EAAKC,CAAM,EACtG,MACF,KAAK,aAAW,kBAAkB,YAAY,EAC5CI,EAAqB,EAAAG,QAA4B,oBACjBJ,EAC9BJ,EACAC,CACF,EACA,MACF,KAAK,aAAW,KAAK,YAAY,EAC/BI,EAAqB,EAAAI,QAAe,oBAAqCL,EAAQJ,EAAKC,CAAM,EAC5F,MACF,KAAK,aAAW,YAAY,YAAY,GACpC,CAAE,mBAAAI,EAAoB,oBAAAC,CAAoB,EAAI,EAAAI,QAAiB,oBACvCN,EACxBJ,EACAC,CACF,GACA,MACF,QACEI,EAA6BL,EAAI,MAAM,GAAGC,CAAM,GAAGG,EAAO,IAAI,EAAE,EAChE,KACJ,CAEA,IAAIO,EAAyB,KAC7B,OAAIN,EACFM,EAAQN,EACCH,IACTS,EAAQ,IAGH,CACL,GAAGP,EACH,MAAAO,EACA,GAAIL,GAAuB,CAAE,OAAQA,CAAoB,CAC3D,CACF,CAAC,CACH,EAEalB,EAAqC,CAChDwB,EACAC,IACG,CACH,IAAIC,EAA2DF,EAAO,OAAQG,GAAMA,EAAE,MAAM,EAC5F,OAAIF,IACFC,EAAeA,EAAa,OACzBC,GAA8EA,EAAE,OAAQ,WAC3F,GAGKD,EACJ,OAAQE,GAAUA,EAAM,SAAW,MAAS,EAC5C,OAAQA,GAAsDA,EAAM,OAAQ,eAAiB,MAAS,EACtG,IAAKA,GAAU,CACd,MAAMZ,EAAoDY,EAAM,OAGhE,OAFaZ,EAAO,KAAK,kBAAkB,EAE7B,CACZ,KAAK,aAAW,UAAU,YAAY,EACpC,OAAO,EAAAG,QAAoB,uBAAuBH,EAAQY,EAAM,KAAM,wBAAsB,EAE9F,KAAK,aAAW,YAAY,YAAY,EACtC,OAAO,EAAAN,QAAiB,uBAAuBN,EAAQY,EAAM,KAAM,wBAAsB,EAE3F,KAAK,aAAW,kBAAkB,YAAY,EAAG,CAC/C,MAAMC,EAAiB,EAAAV,QAAoB,uBAAuBH,EAAQY,EAAM,KAAM,wBAAsB,EAC5G,OAAO,EAAAR,QAA4B,uBACjCJ,EAIAY,EAAM,KACN,yBACAC,CACF,CACF,CAEA,QACE,MAAO,GAAG,wBAAsB,GAAGD,EAAM,IAAI,IAAIZ,EAAO,YAAY,EACxE,CACF,CAAC,EACA,KAAK,GAAG,CACb,EAEanB,EAA2B,CACtC2B,EACAC,
|
|
6
|
-
"names": ["utils_exports", "__export", "utils_default", "getFilters", "getFiltersFromDefinition", "getPersonalisedFilters", "redirectWithDefaultFilters", "setFilterQueryFromFilterDefinition", "setFilterValuesFromRequest", "setRequestQueryFromFilterValues", "__toCommonJS", "import_enum", "import_ReportQuery", "import_utils", "import_personalisationUtils", "import_urlHelper", "import_filtersTypeEnum", "import_localsHelper", "filters", "req", "prefix", "preventDefault", "key", "filter", "requestfilterValue", "requestfilterValues", "DateRangeInputUtils", "GranularDateRangeInputUtils", "DateInputUtils", "MultiSelectUtils", "value", "fields", "interactive", "filterFields", "f", "field", "startEndParams", "
|
|
4
|
+
"sourcesContent": ["/* eslint-disable no-param-reassign */\nimport { Request, Response } from 'express'\nimport { GranularDateRangeQuickFilterValue } from './types'\nimport { FilterType } from './filter-input/enum'\nimport type { components } from '../../types/api'\nimport type { FilterOption } from './filter-input/types'\nimport type {\n DateFilterValue,\n FilterValueType,\n DateRangeFilterValue,\n FilterValue,\n MultiselectFilterValue,\n GranularDateRangeFilterValue,\n GranularDateRange,\n GranularDateRangeGranularityValue,\n} from './types'\nimport ReportQuery, { DEFAULT_FILTERS_PREFIX } from '../../types/ReportQuery'\n\nimport SelectedFiltersUtils from './filters-selected/utils'\nimport DateRangeInputUtils from '../_inputs/date-range/utils'\nimport DateInputUtils from '../_inputs/date-input/utils'\nimport GranularDateRangeInputUtils from '../_inputs/granular-date-range/utils'\nimport MultiSelectUtils from '../_inputs/multi-select/utils'\nimport { Granularity, QuickFilters } from '../_inputs/granular-date-range/types'\nimport PersonalistionUtils from '../../utils/Personalisation/personalisationUtils'\nimport createUrlForParameters from '../../utils/urlHelper'\nimport { Services } from '../../types/Services'\nimport { FiltersType } from './filtersTypeEnum'\nimport LocalsHelper from '../../utils/localsHelper'\nimport { defaultFilterValue } from '../../utils/Personalisation/types'\n\n/**\n * Given a FilterValue[], will update the values to match the req.query values if present\n *\n * @param {FilterValue[]} filters\n * @param {Request} req\n * @param {string} [prefix='filters.']\n * @return {*} {FilterValue[]}\n */\nexport const setFilterValuesFromRequest = (\n filters: FilterValue[],\n req: Request,\n prefix = 'filters.',\n): FilterValue[] => {\n const { preventDefault } = req.query\n\n if (Object.keys(req.query).every((key) => !key.includes(prefix)) && !preventDefault) {\n return filters\n }\n\n return filters.map((filter: FilterValue) => {\n let requestfilterValue: FilterValueType\n let requestfilterValues: string[] | undefined\n\n const type = filter.type.toLowerCase()\n switch (type) {\n case FilterType.dateRange.toLowerCase():\n requestfilterValue = DateRangeInputUtils.setValueFromRequest(<DateRangeFilterValue>filter, req, prefix)\n break\n case FilterType.granularDateRange.toLowerCase():\n requestfilterValue = GranularDateRangeInputUtils.setValueFromRequest(\n <GranularDateRangeFilterValue>filter,\n req,\n prefix,\n )\n break\n case FilterType.date.toLowerCase():\n requestfilterValue = DateInputUtils.setValueFromRequest(<DateFilterValue>filter, req, prefix)\n break\n case FilterType.multiselect.toLowerCase():\n ;({ requestfilterValue, requestfilterValues } = MultiSelectUtils.setValueFromRequest(\n <MultiselectFilterValue>filter,\n req,\n prefix,\n ))\n break\n default:\n requestfilterValue = <string>req.query[`${prefix}${filter.name}`]\n break\n }\n\n let value: FilterValueType = null\n if (requestfilterValue) {\n value = requestfilterValue\n } else if (preventDefault) {\n value = ''\n }\n\n return {\n ...filter,\n value,\n ...(requestfilterValues && { values: requestfilterValues }),\n }\n })\n}\n\nexport const setFilterQueryFromFilterDefinition = (\n fields: components['schemas']['FieldDefinition'][],\n interactive?: boolean,\n) => {\n let filterFields: components['schemas']['FieldDefinition'][] = fields.filter((f) => f.filter)\n if (interactive) {\n filterFields = filterFields.filter(\n (f) => (<components['schemas']['FilterDefinition'] & { interactive?: boolean }>f.filter).interactive,\n )\n }\n\n return filterFields\n .filter((field) => field.filter !== undefined)\n .filter((field) => (<components['schemas']['FilterDefinition']>field.filter).defaultValue !== undefined)\n .map((field) => {\n const filter = <components['schemas']['FilterDefinition']>field.filter\n const type = filter.type.toLocaleLowerCase()\n\n switch (type) {\n case FilterType.dateRange.toLowerCase():\n return DateRangeInputUtils.getQueryFromDefinition(filter, field.name, DEFAULT_FILTERS_PREFIX)\n\n case FilterType.multiselect.toLowerCase():\n return MultiSelectUtils.getQueryFromDefinition(filter, field.name, DEFAULT_FILTERS_PREFIX)\n\n case FilterType.granularDateRange.toLowerCase(): {\n const startEndParams = DateRangeInputUtils.getQueryFromDefinition(filter, field.name, DEFAULT_FILTERS_PREFIX)\n return GranularDateRangeInputUtils.getQueryFromDefinition(\n filter as unknown as components['schemas']['FilterDefinition'] & {\n defaultGranularity: Granularity\n defaultQuickFilterValue: QuickFilters\n },\n field.name,\n DEFAULT_FILTERS_PREFIX,\n startEndParams,\n )\n }\n\n default:\n return `${DEFAULT_FILTERS_PREFIX}${field.name}=${filter.defaultValue}`\n }\n })\n .join('&')\n}\n\nexport const getFiltersFromDefinition = (\n fields: components['schemas']['FieldDefinition'][],\n interactive?: boolean,\n): FilterValue[] => {\n const filters = fields\n .filter((f) => f.filter)\n .filter((f) => {\n if (interactive !== undefined) {\n if (f.filter.interactive === undefined) {\n return !interactive\n }\n return interactive === f.filter.interactive\n }\n return true\n })\n .map((f) => {\n const { display: text, name } = f\n const filter = <components['schemas']['FilterDefinition']>f.filter\n const { type, staticOptions, dynamicOptions, defaultValue, mandatory, pattern, index } = filter\n\n const options: FilterOption[] = staticOptions\n ? staticOptions.map((opt) => {\n return { value: opt.name, text: opt.display }\n })\n : []\n\n let filterData: FilterValue = {\n text,\n name,\n type: type as FilterType,\n value: defaultValue || null,\n minimumLength: dynamicOptions?.minimumLength,\n mandatory: mandatory || false,\n pattern,\n index,\n }\n\n const noFilterOption = {\n value: 'no-filter',\n text: 'None',\n disabled: false,\n }\n\n switch (type) {\n case FilterType.autocomplete.toLowerCase():\n filterData = {\n ...filterData,\n options,\n }\n break\n\n case FilterType.radio:\n if (!mandatory) options.unshift(noFilterOption)\n filterData = {\n ...filterData,\n options,\n }\n break\n\n case FilterType.select: {\n if (!mandatory) options.unshift(noFilterOption)\n options.unshift({\n value: '',\n text: 'Select your option',\n disabled: true,\n selected: true,\n })\n\n filterData = {\n ...filterData,\n options,\n }\n break\n }\n\n case FilterType.multiselect.toLowerCase():\n filterData = {\n ...filterData,\n options,\n values: defaultValue ? defaultValue.split(',') : [],\n }\n break\n\n case FilterType.dateRange.toLowerCase():\n filterData = DateRangeInputUtils.getFilterFromDefinition(filter, filterData)\n break\n\n case FilterType.date.toLowerCase():\n filterData = DateInputUtils.getFilterFromDefinition(filter, filterData)\n break\n\n case FilterType.granularDateRange.toLocaleLowerCase(): {\n filterData = GranularDateRangeInputUtils.getFilterFromDefinition(filter, filterData)\n break\n }\n\n default:\n break\n }\n\n return filterData\n })\n\n const orderedFilters = orderFilters(filters)\n return orderedFilters\n}\n\nconst orderFilters = (filterValues: FilterValue[]) => {\n const noIndexFilters = filterValues.filter((f) => f.index === undefined)\n const indexFilters = filterValues.filter((f) => f.index !== undefined)\n indexFilters.forEach((f) => {\n noIndexFilters.splice(f.index, 0, f)\n })\n return noIndexFilters\n}\n\nexport const setRequestQueryFromFilterValues = (filterValues: FilterValue[]) => {\n const requestQuery = filterValues\n .filter((fv) => fv.value)\n .reduce((acc, curr) => {\n const { value, name } = curr\n const filterPrefix = `filters.${name}`\n switch (curr.type) {\n case FilterType.granularDateRange.toLowerCase():\n {\n const granularDateRangeValue = <GranularDateRange>value\n Object.keys(granularDateRangeValue).forEach((key) => {\n let v = granularDateRangeValue[key as keyof GranularDateRange]\n if (key.includes('partialDate')) {\n acc = {\n ...acc,\n }\n } else {\n if (key.includes('granularity') || key.includes('quickFilter')) {\n v = (<GranularDateRangeGranularityValue | GranularDateRangeQuickFilterValue>v).value\n }\n acc = {\n ...acc,\n [`${filterPrefix}.${key}`]: v,\n }\n }\n })\n }\n break\n case FilterType.dateRange.toLowerCase():\n Object.keys(value).forEach((key) => {\n acc = {\n ...acc,\n [`${filterPrefix}.${key}`]: value[key as keyof FilterValueType],\n }\n })\n break\n case FilterType.multiselect.toLowerCase():\n acc = {\n ...acc,\n [`${filterPrefix}`]: (<string>value).split(','),\n }\n break\n default:\n acc = {\n ...acc,\n [`${filterPrefix}`]: value,\n }\n break\n }\n return acc\n }, {})\n\n return requestQuery\n}\n\nexport const redirectWithDefaultFilters = (\n reportQuery: ReportQuery,\n variantDefinition: components['schemas']['VariantDefinition'],\n response: Response,\n request: Request,\n) => {\n const defaultFilters: Record<string, string> = {}\n const { specification } = variantDefinition\n const fields = specification ? specification.fields : []\n const { preventDefault } = request.query\n const hasNoQueryFilters = Object.keys(reportQuery.filters).length === 0 && !preventDefault\n if (hasNoQueryFilters) {\n fields\n .filter((f) => f.filter && f.filter.defaultValue)\n .forEach((f) => {\n const { filter } = f\n if (filter) {\n if (filter.type.toLowerCase() === FilterType.dateRange.toLowerCase()) {\n const { defaultValue } = <components['schemas']['FilterDefinition']>filter\n const dates = defaultValue ? defaultValue.split(' - ') : ''\n\n if (dates.length >= 1) {\n // eslint-disable-next-line prefer-destructuring\n defaultFilters[`${DEFAULT_FILTERS_PREFIX}${f.name}.start`] = dates[0]\n\n if (dates.length >= 2) {\n // eslint-disable-next-line prefer-destructuring\n defaultFilters[`${DEFAULT_FILTERS_PREFIX}${f.name}.end`] = dates[1]\n }\n }\n } else {\n defaultFilters[`${DEFAULT_FILTERS_PREFIX}${f.name}`] = filter.defaultValue || ''\n }\n }\n })\n }\n\n if (Object.keys(defaultFilters).length > 0) {\n const querystring = createUrlForParameters(reportQuery.toRecordWithFilterPrefix(), defaultFilters, fields)\n response.redirect(`${request.baseUrl}${request.path}${querystring}`)\n return true\n }\n\n return false\n}\n\nexport const getPersonalisedFilters = async (\n filters: FilterValue[],\n req: Request,\n res: Response,\n services: Services,\n filtersType: FiltersType,\n) => {\n const { reportId, id } = req.params\n const { dprUser } = LocalsHelper.getValues(res)\n const defaultFilterValues: defaultFilterValue[] = await services.defaultFilterValuesService.get(\n dprUser.id,\n reportId,\n id,\n filtersType,\n )\n let defaultFilters = filters\n if (defaultFilterValues) {\n const personalisedFilters = PersonalistionUtils.setFilterValuesFromSavedDefaults(filters, [], defaultFilterValues)\n defaultFilters = personalisedFilters.filters\n }\n\n return { filters: defaultFilters, defaultFilterValues }\n}\n\nexport const getFilters = async ({\n fields,\n req,\n res,\n prefix = 'filters.',\n services,\n filtersType,\n}: {\n fields: components['schemas']['FieldDefinition'][]\n req: Request\n res?: Response\n prefix?: string\n services?: Services\n filtersType: FiltersType\n}) => {\n // 1. Set the filters from the product definition\n let filters = await getFiltersFromDefinition(fields, filtersType === FiltersType.INTERACTIVE)\n\n let hasDefaults\n let canSaveDefaults = false\n if (services) {\n // 2. If there are personalised filters, overwrite fiters with the personalised filter values.\n const { filters: personalisedFilterValues, defaultFilterValues } = await getPersonalisedFilters(\n filters,\n req,\n res,\n services,\n filtersType,\n )\n filters = personalisedFilterValues\n hasDefaults = defaultFilterValues?.length > 0\n canSaveDefaults = true\n }\n\n // If there is a request query, overwrite the filters with the query params\n if (req.query) {\n filters = setFilterValuesFromRequest(filters, req)\n }\n\n // Set the selected filters\n const selectedFilters = SelectedFiltersUtils.getSelectedFilters(filters, prefix)\n\n return {\n filters,\n selectedFilters,\n hasDefaults,\n canSaveDefaults,\n }\n}\n\nexport default {\n getFiltersFromDefinition,\n setFilterValuesFromRequest,\n getFilters,\n setFilterQueryFromFilterDefinition,\n redirectWithDefaultFilters,\n setRequestQueryFromFilterValues,\n getPersonalisedFilters,\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["utils_exports", "__export", "utils_default", "getFilters", "getFiltersFromDefinition", "getPersonalisedFilters", "redirectWithDefaultFilters", "setFilterQueryFromFilterDefinition", "setFilterValuesFromRequest", "setRequestQueryFromFilterValues", "__toCommonJS", "import_enum", "import_ReportQuery", "import_utils", "import_personalisationUtils", "import_urlHelper", "import_filtersTypeEnum", "import_localsHelper", "filters", "req", "prefix", "preventDefault", "key", "filter", "requestfilterValue", "requestfilterValues", "DateRangeInputUtils", "GranularDateRangeInputUtils", "DateInputUtils", "MultiSelectUtils", "value", "fields", "interactive", "filterFields", "f", "field", "startEndParams", "text", "name", "type", "staticOptions", "dynamicOptions", "defaultValue", "mandatory", "pattern", "index", "options", "opt", "filterData", "noFilterOption", "orderFilters", "filterValues", "noIndexFilters", "fv", "acc", "curr", "filterPrefix", "granularDateRangeValue", "v", "reportQuery", "variantDefinition", "response", "request", "defaultFilters", "specification", "dates", "querystring", "createUrlForParameters", "res", "services", "filtersType", "reportId", "id", "dprUser", "LocalsHelper", "defaultFilterValues", "PersonalistionUtils", "hasDefaults", "canSaveDefaults", "personalisedFilterValues", "selectedFilters", "SelectedFiltersUtils"]
|
|
7
7
|
}
|
|
@@ -143,29 +143,21 @@ export const getFiltersFromDefinition = (
|
|
|
143
143
|
fields: components['schemas']['FieldDefinition'][],
|
|
144
144
|
interactive?: boolean,
|
|
145
145
|
): FilterValue[] => {
|
|
146
|
-
|
|
146
|
+
const filters = fields
|
|
147
147
|
.filter((f) => f.filter)
|
|
148
148
|
.filter((f) => {
|
|
149
149
|
if (interactive !== undefined) {
|
|
150
|
-
|
|
151
|
-
components['schemas']['FieldDefinition'] & {
|
|
152
|
-
interactive?: boolean
|
|
153
|
-
}
|
|
154
|
-
>f.filter).interactive
|
|
155
|
-
|
|
156
|
-
// NOTE: Uncomment if filters are meant to be both interactive and non interactive.
|
|
157
|
-
if (interactiveFilterValue === undefined) {
|
|
150
|
+
if (f.filter.interactive === undefined) {
|
|
158
151
|
return !interactive
|
|
159
152
|
}
|
|
160
|
-
|
|
161
|
-
return interactive === interactiveFilterValue
|
|
153
|
+
return interactive === f.filter.interactive
|
|
162
154
|
}
|
|
163
155
|
return true
|
|
164
156
|
})
|
|
165
157
|
.map((f) => {
|
|
166
158
|
const { display: text, name } = f
|
|
167
159
|
const filter = <components['schemas']['FilterDefinition']>f.filter
|
|
168
|
-
const { type, staticOptions, dynamicOptions, defaultValue, mandatory, pattern } = filter
|
|
160
|
+
const { type, staticOptions, dynamicOptions, defaultValue, mandatory, pattern, index } = filter
|
|
169
161
|
|
|
170
162
|
const options: FilterOption[] = staticOptions
|
|
171
163
|
? staticOptions.map((opt) => {
|
|
@@ -181,6 +173,7 @@ export const getFiltersFromDefinition = (
|
|
|
181
173
|
minimumLength: dynamicOptions?.minimumLength,
|
|
182
174
|
mandatory: mandatory || false,
|
|
183
175
|
pattern,
|
|
176
|
+
index,
|
|
184
177
|
}
|
|
185
178
|
|
|
186
179
|
const noFilterOption = {
|
|
@@ -248,6 +241,18 @@ export const getFiltersFromDefinition = (
|
|
|
248
241
|
|
|
249
242
|
return filterData
|
|
250
243
|
})
|
|
244
|
+
|
|
245
|
+
const orderedFilters = orderFilters(filters)
|
|
246
|
+
return orderedFilters
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
const orderFilters = (filterValues: FilterValue[]) => {
|
|
250
|
+
const noIndexFilters = filterValues.filter((f) => f.index === undefined)
|
|
251
|
+
const indexFilters = filterValues.filter((f) => f.index !== undefined)
|
|
252
|
+
indexFilters.forEach((f) => {
|
|
253
|
+
noIndexFilters.splice(f.index, 0, f)
|
|
254
|
+
})
|
|
255
|
+
return noIndexFilters
|
|
251
256
|
}
|
|
252
257
|
|
|
253
258
|
export const setRequestQueryFromFilterValues = (filterValues: FilterValue[]) => {
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
describe("Request a report",()=>{const f="/embedded/platform/dpr/request-report/report/request-examples/request-example-success/filters";let c,a,s,n,d,r,o;const t=()=>{for(let e=0;e<5;e+=1)cy.get("#dpr-selected-filters > a:nth-child(1)").click(1,1)},l=()=>{cy.findByRole("combobox",{name:"Field 2"}).select("value2.2"),cy.findByRole("textbox",{name:"From"}).type("1/2/2003"),cy.findByRole("textbox",{name:"To"}).type("4/5/2007"),cy.findByRole("combobox",{name:"Field 4"}).type("Inigo Montoya"),cy.findByRole("textbox",{name:"Field 6"}).type("Value 6.1"),cy.findByRole("textbox",{name:"Field 7"}).type("05/05/2005"),cy.findByRole("checkbox",{name:"Value 8.1"}).check(),cy.findByRole("checkbox",{name:"Value 8.2"}).check(),cy.findByRole("checkbox",{name:"Value 8.3"}).check(),cy.findByRole("checkbox",{name:"Value 8.4"}).check()};before(()=>{cy.task("resetStubs"),cy.task("resetRedis"),cy.task("stubDefinitions"),cy.task("stubDefinitionRequestExamplesSuccess"),cy.task("stubViewAsyncReportingResults"),cy.task("stubReportsFinishedStatus"),cy.task("stubRequestSuccessResult20"),cy.task("stubRequestSuccessReportTablesCount")}),beforeEach(()=>{cy.visit(f),c=cy.findByRole("combobox",{name:"Field 2"}),a=cy.findByRole("textbox",{name:"From"}),s=cy.findByRole("textbox",{name:"To"}),n=cy.findByRole("combobox",{name:"Field 4"}),d=cy.findByRole("combobox",{name:"Field 5"}),r=cy.findByRole("textbox",{name:"Field 6"}),o=cy.findByRole("textbox",{name:"Field 7"})}),it("is accessible",()=>{cy.injectAxe(),cy.checkA11y()}),context("Selected filters",()=>{it("should show the default selected filters",()=>{cy.findByLabelText(/Selected filters.*/i).within(()=>{cy.findAllByRole("link").should("have.length",6).each((e,i)=>{switch(i){case 0:cy.wrap(e).contains("Field 1"),cy.wrap(e).contains("Value 1.2");break;case 1:cy.wrap(e).contains("Field 3 start"),cy.wrap(e).contains("01/02/2003");break;case 2:cy.wrap(e).contains("Field 3 end"),cy.wrap(e).contains("04/05/2006");break;case 3:cy.wrap(e).contains("Field 7"),cy.wrap(e).contains("01/02/2005");break;case 4:cy.wrap(e).contains("Field 8"),cy.wrap(e).contains("Value 8.2, Value 8.3");break;case 5:cy.wrap(e).contains("Reset filters");break;default:break}})})}),it("should remove the selected filter and reset the input",()=>{cy.findByLabelText(/Selected filters.*/i).within(()=>{cy.findAllByRole("link").should("have.length",6)}),t(),cy.findByLabelText(/Selected filters.*/i).within(()=>{cy.findAllByRole("link").should("have.length",1)}),cy.findByRole("radio",{name:"None"}).should("not.be.checked"),cy.findByRole("radio",{name:"Value 1.1"}).should("not.be.checked"),cy.findByRole("radio",{name:"Value 1.2"}).should("not.be.checked"),cy.findByRole("radio",{name:"Value 1.3"}).should("not.be.checked"),c.find("option:selected").should("have.text","Select your option"),a.should("have.value",""),s.should("have.value",""),n.should("have.value",""),d.should("have.value",""),r.should("have.value",""),o.should("have.value","")}),it("should add selected filters when inputs values are updated",()=>{t(),cy.findByLabelText(/Selected filters.*/i).within(()=>{cy.findAllByRole("link").should("have.length",1)}),l(),cy.findByLabelText(/Selected filters.*/i).within(()=>{cy.findAllByRole("link").should("have.length",8).each((e,i)=>{switch(i){case 0:cy.wrap(e).contains("Field 2"),cy.wrap(e).contains("Value 2.2");break;case 1:cy.wrap(e).contains("Field 3 start"),cy.wrap(e).contains("01/02/2003");break;case 2:cy.wrap(e).contains("Field 3 end"),cy.wrap(e).contains("4/5/2007");break;case 3:cy.wrap(e).contains("Field 4"),cy.wrap(e).contains("Inigo Montoya");break;case 4:cy.wrap(e).contains("Field 6"),cy.wrap(e).contains("Value 6.1");break;case 5:cy.wrap(e).contains("Field 7"),cy.wrap(e).contains("05/05/2005");break;case 6:cy.wrap(e).contains("Field 8"),cy.wrap(e).contains("Value 8.1, Value 8.2, Value 8.3 + 1 more");break;default:break}})}),cy.location().should(e=>{expect(e.search).to.contain("filters.field2=value2.2"),expect(e.search).to.contain("filters.field3.start=2003-02-01"),expect(e.search).to.contain("filters.field3.end=2007-05-04"),expect(e.search).to.contain("filters.field4=Inigo+Montoya"),expect(e.search).to.contain("filters.field6=Value+6.1"),expect(e.search).to.contain("filters.field7=2005-05-05")})}),it("should reset the filters back to their DPD defaults",()=>{cy.findByLabelText(/Selected filters.*/i).within(()=>{cy.findAllByRole("link").should("have.length",6)}),t(),cy.findByLabelText(/Selected filters.*/i).within(()=>{cy.findAllByRole("link").should("have.length",1)}),cy.findByRole("link",{name:"Reset filters"}).click(),cy.findByLabelText(/Selected filters.*/i).within(()=>{cy.findAllByRole("link").should("have.length",6)})})}),context("Request query parameters",()=>{it("should correctly set the request query parameters from DPD defaults",()=>{cy.location().should(e=>{expect(e.search).to.contain("filters.field1=value1.2"),expect(e.search).to.contain("filters.field3.start=2003-02-01"),expect(e.search).to.contain("filters.field3.end=2006-05-04"),expect(e.search).to.contain("filters.field7=2005-02-01"),expect(e.search).to.contain("filters.field8=value8.2&filters.field8=value8.3")}),t(),l(),cy.location().should(e=>{expect(e.search).to.contain("filters.field2=value2.2"),expect(e.search).to.contain("filters.field3.start=2003-02-01"),expect(e.search).to.contain("filters.field3.end=2007-05-04"),expect(e.search).to.contain("filters.field4=Inigo+Montoya"),expect(e.search).to.contain("filters.field6=Value+6.1"),expect(e.search).to.contain("filters.field7=2005-05-05"),expect(e.search).to.contain("filters.field8=value8.1&filters.field8=value8.2&filters.field8=value8.3&filters.field8=value8.4")})}),it("should correctly set the request query parameters when inputs are updated",()=>{t(),l(),cy.location().should(e=>{expect(e.search).to.contain("filters.field2=value2.2"),expect(e.search).to.contain("filters.field3.start=2003-02-01"),expect(e.search).to.contain("filters.field3.end=2007-05-04"),expect(e.search).to.contain("filters.field4=Inigo+Montoya"),expect(e.search).to.contain("filters.field6=Value+6.1"),expect(e.search).to.contain("filters.field7=2005-05-05"),expect(e.search).to.contain("filters.field8=value8.1&filters.field8=value8.2&filters.field8=value8.3&filters.field8=value8.4")})})}),context("User defined defaults",()=>{it("should save the user defined defaults",()=>{t(),l(),cy.findByRole("button",{name:"Save current filter values as defaults"}).click(),cy.location().should(e=>{expect(e.search).to.contain("defaultsSaved=true")}),cy.findByRole("button",{name:"Update defaults"}).should("exist"),cy.findByRole("button",{name:"Delete defaults"}).should("exist")}),it("should pre-fill the filter values with the saved defaults next visit",()=>{cy.location().should(e=>{expect(e.search).to.contain("filters.field2=value2.2"),expect(e.search).to.contain("filters.field3.start=2003-02-01"),expect(e.search).to.contain("filters.field3.end=2007-05-04"),expect(e.search).to.contain("filters.field4=Inigo+Montoya"),expect(e.search).to.contain("filters.field6=Value+6.1"),expect(e.search).to.contain("filters.field7=2005-05-05"),expect(e.search).not.to.contain("defaultsSaved=true"),expect(e.search).to.contain("filters.field8=value8.1&filters.field8=value8.2&filters.field8=value8.3&filters.field8=value8.4")}),cy.findByRole("button",{name:"Update defaults"}).should("exist"),cy.findByRole("button",{name:"Delete defaults"}).should("exist")}),it("should update the saved defaults",()=>{cy.findByLabelText(/Selected filters.*/i).within(()=>{cy.findAllByRole("link").eq(1).click(1,1),cy.findAllByRole("link").eq(1).click(1,1),cy.findAllByRole("link").eq(1).click(1,1)}),cy.findByRole("checkbox",{name:"Value 8.2"}).uncheck(),cy.findByRole("checkbox",{name:"Value 8.3"}).uncheck(),cy.findByRole("combobox",{name:"Field 2"}).select("value2.3"),cy.findByRole("button",{name:"Update defaults"}).click(),cy.findByLabelText(/Selected filters.*/i).within(()=>{cy.findAllByRole("link").should("have.length",5)}),cy.location().should(e=>{expect(e.search).to.contain("filters.field2=value2.3"),expect(e.search).not.to.contain("filters.field3.start=2003-02-01"),expect(e.search).not.to.contain("filters.field3.end=2007-05-04"),expect(e.search).to.contain("filters.field6=Value+6.1"),expect(e.search).to.contain("filters.field7=2005-05-05"),expect(e.search).to.contain("defaultsSaved=true"),expect(e.search).not.to.contain("filters.field4=Inigo+Montoya"),expect(e.search).not.to.contain("filters.field8=value8.1&filters.field8=value8.2&filters.field8=value8.3&filters.field8=value8.4"),expect(e.search).to.contain("&filters.field8=value8.1&filters.field8=value8.4")}),cy.reload(),cy.location().should(e=>{expect(e.search).to.contain("filters.field2=value2.3"),expect(e.search).to.contain("filters.field3.start=2003-02-01"),expect(e.search).to.contain("filters.field3.end=2007-05-04"),expect(e.search).to.contain("filters.field6=Value+6.1"),expect(e.search).to.contain("filters.field7=2005-05-05"),expect(e.search).to.contain("defaultsSaved=true"),expect(e.search).not.to.contain("filters.field4=Inigo+Montoya"),expect(e.search).not.to.contain("filters.field8=value8.1&filters.field8=value8.2&filters.field8=value8.3&filters.field8=value8.4"),expect(e.search).to.contain("&filters.field8=value8.1&filters.field8=value8.4")})}),it("should reset the defaults back to the user saved defaults",()=>{cy.findByLabelText(/Selected filters.*/i).within(()=>{cy.findAllByRole("link").eq(1).click(1,1),cy.findAllByRole("link").eq(1).click(1,1),cy.findAllByRole("link").eq(1).click(1,1)}),cy.findByLabelText(/Selected filters.*/i).within(()=>{cy.findAllByRole("link").should("have.length",2)}),cy.findByRole("link",{name:"Reset filters"}).click(),cy.findByLabelText(/Selected filters.*/i).within(()=>{cy.findAllByRole("link").should("have.length",5)})}),it("should remove the save defaults",()=>{cy.findByRole("button",{name:"Delete defaults"}).click(),cy.location().should(e=>{expect(e.search).to.contain("filters.field1=value1.2"),expect(e.search).to.contain("filters.field3.start=2003-02-01"),expect(e.search).to.contain("filters.field3.end=2006-05-04"),expect(e.search).to.contain("filters.field7=2005-02-01"),expect(e.search).to.contain("filters.field8=value8.2&filters.field8=value8.3")})})}),context("Submission",()=>{it("should submit the report details in the request",()=>{cy.intercept({method:"POST",url:"/embedded/platform/dpr/request-report/report/**/**/filters?**"}).as("requestSubmit"),cy.findByRole("button",{name:/Request/}).click(),cy.wait("@requestSubmit").its("request").then(e=>{cy.wrap(e).its("body").should("include","reportId=request-examples"),cy.wrap(e).its("body").should("include","name=Successful+Report"),cy.wrap(e).its("body").should("include","reportName=Successful+Report"),cy.wrap(e).its("body").should("include","id=request-example-success")})}),it("should submit the request with the correct query params",()=>{cy.intercept({method:"POST",url:"/embedded/platform/dpr/request-report/report/**/**/filters?**"}).as("requestSubmit"),cy.findByRole("button",{name:/Request/}).click(),cy.wait("@requestSubmit").its("request").then(e=>{expect(e.query).to.have.property("filters.field1","value1.2"),expect(e.query).to.have.property("filters.field3.end","2006-05-04"),expect(e.query).to.have.property("filters.field3.start","2003-02-01"),expect(e.query).to.have.property("filters.field7","2005-02-01"),expect(e.query).to.have.property("filters.field8"),cy.wrap(e.query["filters.field8"]).should("deep.eq",["value8.2","value8.3"]),expect(e.query).to.have.property("sortColumn","field1"),expect(e.query).to.have.property("sortedAsc","false")})})})});
|
|
1
|
+
describe("Request a report",()=>{const y="/embedded/platform/dpr/request-report/report/request-examples/request-example-success/filters",u="/embedded/platform/dpr/request-report/report/feature-testing/feature-testing-filter-order/filters";let c,s,n,d,r,o,f;const t=()=>{for(let e=0;e<5;e+=1)cy.get("#dpr-selected-filters > a:nth-child(1)").click(1,1)},a=()=>{cy.findByRole("combobox",{name:"Field 2"}).select("value2.2"),cy.findByRole("textbox",{name:"From"}).type("1/2/2003"),cy.findByRole("textbox",{name:"To"}).type("4/5/2007"),cy.findByRole("combobox",{name:"Field 4"}).type("Inigo Montoya"),cy.findByRole("textbox",{name:"Field 6"}).type("Value 6.1"),cy.findByRole("textbox",{name:"Field 7"}).type("05/05/2005"),cy.findByRole("checkbox",{name:"Value 8.1"}).check(),cy.findByRole("checkbox",{name:"Value 8.2"}).check(),cy.findByRole("checkbox",{name:"Value 8.3"}).check(),cy.findByRole("checkbox",{name:"Value 8.4"}).check()};before(()=>{cy.task("resetStubs"),cy.task("resetRedis"),cy.task("stubDefinitions"),cy.task("stubDefinitionRequestExamplesSuccess"),cy.task("stubViewAsyncReportingResults"),cy.task("stubReportsFinishedStatus"),cy.task("stubRequestSuccessResult20"),cy.task("stubRequestSuccessReportTablesCount"),cy.task("stubDefinitionOrderFilters")}),beforeEach(()=>{cy.visit(y),c=cy.findByRole("combobox",{name:"Field 2"}),s=cy.findByRole("textbox",{name:"From"}),n=cy.findByRole("textbox",{name:"To"}),d=cy.findByRole("combobox",{name:"Field 4"}),r=cy.findByRole("combobox",{name:"Field 5"}),o=cy.findByRole("textbox",{name:"Field 6"}),f=cy.findByRole("textbox",{name:"Field 7"})}),it("is accessible",()=>{cy.injectAxe(),cy.checkA11y()}),context("Selected filters",()=>{it("should show the default selected filters",()=>{cy.findByLabelText(/Selected filters.*/i).within(()=>{cy.findAllByRole("link").should("have.length",6).each((e,l)=>{switch(l){case 0:cy.wrap(e).contains("Field 1"),cy.wrap(e).contains("Value 1.2");break;case 1:cy.wrap(e).contains("Field 3 start"),cy.wrap(e).contains("01/02/2003");break;case 2:cy.wrap(e).contains("Field 3 end"),cy.wrap(e).contains("04/05/2006");break;case 3:cy.wrap(e).contains("Field 7"),cy.wrap(e).contains("01/02/2005");break;case 4:cy.wrap(e).contains("Field 8"),cy.wrap(e).contains("Value 8.2, Value 8.3");break;case 5:cy.wrap(e).contains("Reset filters");break;default:break}})})}),it("should remove the selected filter and reset the input",()=>{cy.findByLabelText(/Selected filters.*/i).within(()=>{cy.findAllByRole("link").should("have.length",6)}),t(),cy.findByLabelText(/Selected filters.*/i).within(()=>{cy.findAllByRole("link").should("have.length",1)}),cy.findByRole("radio",{name:"None"}).should("not.be.checked"),cy.findByRole("radio",{name:"Value 1.1"}).should("not.be.checked"),cy.findByRole("radio",{name:"Value 1.2"}).should("not.be.checked"),cy.findByRole("radio",{name:"Value 1.3"}).should("not.be.checked"),c.find("option:selected").should("have.text","Select your option"),s.should("have.value",""),n.should("have.value",""),d.should("have.value",""),r.should("have.value",""),o.should("have.value",""),f.should("have.value","")}),it("should add selected filters when inputs values are updated",()=>{t(),cy.findByLabelText(/Selected filters.*/i).within(()=>{cy.findAllByRole("link").should("have.length",1)}),a(),cy.findByLabelText(/Selected filters.*/i).within(()=>{cy.findAllByRole("link").should("have.length",8).each((e,l)=>{switch(l){case 0:cy.wrap(e).contains("Field 2"),cy.wrap(e).contains("Value 2.2");break;case 1:cy.wrap(e).contains("Field 3 start"),cy.wrap(e).contains("01/02/2003");break;case 2:cy.wrap(e).contains("Field 3 end"),cy.wrap(e).contains("4/5/2007");break;case 3:cy.wrap(e).contains("Field 4"),cy.wrap(e).contains("Inigo Montoya");break;case 4:cy.wrap(e).contains("Field 6"),cy.wrap(e).contains("Value 6.1");break;case 5:cy.wrap(e).contains("Field 7"),cy.wrap(e).contains("05/05/2005");break;case 6:cy.wrap(e).contains("Field 8"),cy.wrap(e).contains("Value 8.1, Value 8.2, Value 8.3 + 1 more");break;default:break}})}),cy.location().should(e=>{expect(e.search).to.contain("filters.field2=value2.2"),expect(e.search).to.contain("filters.field3.start=2003-02-01"),expect(e.search).to.contain("filters.field3.end=2007-05-04"),expect(e.search).to.contain("filters.field4=Inigo+Montoya"),expect(e.search).to.contain("filters.field6=Value+6.1"),expect(e.search).to.contain("filters.field7=2005-05-05")})}),it("should reset the filters back to their DPD defaults",()=>{cy.findByLabelText(/Selected filters.*/i).within(()=>{cy.findAllByRole("link").should("have.length",6)}),t(),cy.findByLabelText(/Selected filters.*/i).within(()=>{cy.findAllByRole("link").should("have.length",1)}),cy.findByRole("link",{name:"Reset filters"}).click(),cy.findByLabelText(/Selected filters.*/i).within(()=>{cy.findAllByRole("link").should("have.length",6)})})}),context("Request query parameters",()=>{it("should correctly set the request query parameters from DPD defaults",()=>{cy.location().should(e=>{expect(e.search).to.contain("filters.field1=value1.2"),expect(e.search).to.contain("filters.field3.start=2003-02-01"),expect(e.search).to.contain("filters.field3.end=2006-05-04"),expect(e.search).to.contain("filters.field7=2005-02-01"),expect(e.search).to.contain("filters.field8=value8.2&filters.field8=value8.3")}),t(),a(),cy.location().should(e=>{expect(e.search).to.contain("filters.field2=value2.2"),expect(e.search).to.contain("filters.field3.start=2003-02-01"),expect(e.search).to.contain("filters.field3.end=2007-05-04"),expect(e.search).to.contain("filters.field4=Inigo+Montoya"),expect(e.search).to.contain("filters.field6=Value+6.1"),expect(e.search).to.contain("filters.field7=2005-05-05"),expect(e.search).to.contain("filters.field8=value8.1&filters.field8=value8.2&filters.field8=value8.3&filters.field8=value8.4")})}),it("should correctly set the request query parameters when inputs are updated",()=>{t(),a(),cy.location().should(e=>{expect(e.search).to.contain("filters.field2=value2.2"),expect(e.search).to.contain("filters.field3.start=2003-02-01"),expect(e.search).to.contain("filters.field3.end=2007-05-04"),expect(e.search).to.contain("filters.field4=Inigo+Montoya"),expect(e.search).to.contain("filters.field6=Value+6.1"),expect(e.search).to.contain("filters.field7=2005-05-05"),expect(e.search).to.contain("filters.field8=value8.1&filters.field8=value8.2&filters.field8=value8.3&filters.field8=value8.4")})})}),context("User defined defaults",()=>{it("should save the user defined defaults",()=>{t(),a(),cy.findByRole("button",{name:"Save current filter values as defaults"}).click(),cy.location().should(e=>{expect(e.search).to.contain("defaultsSaved=true")}),cy.findByRole("button",{name:"Update defaults"}).should("exist"),cy.findByRole("button",{name:"Delete defaults"}).should("exist")}),it("should pre-fill the filter values with the saved defaults next visit",()=>{cy.location().should(e=>{expect(e.search).to.contain("filters.field2=value2.2"),expect(e.search).to.contain("filters.field3.start=2003-02-01"),expect(e.search).to.contain("filters.field3.end=2007-05-04"),expect(e.search).to.contain("filters.field4=Inigo+Montoya"),expect(e.search).to.contain("filters.field6=Value+6.1"),expect(e.search).to.contain("filters.field7=2005-05-05"),expect(e.search).not.to.contain("defaultsSaved=true"),expect(e.search).to.contain("filters.field8=value8.1&filters.field8=value8.2&filters.field8=value8.3&filters.field8=value8.4")}),cy.findByRole("button",{name:"Update defaults"}).should("exist"),cy.findByRole("button",{name:"Delete defaults"}).should("exist")}),it("should update the saved defaults",()=>{cy.findByLabelText(/Selected filters.*/i).within(()=>{cy.findAllByRole("link").eq(1).click(1,1),cy.findAllByRole("link").eq(1).click(1,1),cy.findAllByRole("link").eq(1).click(1,1)}),cy.findByRole("checkbox",{name:"Value 8.2"}).uncheck(),cy.findByRole("checkbox",{name:"Value 8.3"}).uncheck(),cy.findByRole("combobox",{name:"Field 2"}).select("value2.3"),cy.findByRole("button",{name:"Update defaults"}).click(),cy.findByLabelText(/Selected filters.*/i).within(()=>{cy.findAllByRole("link").should("have.length",5)}),cy.location().should(e=>{expect(e.search).to.contain("filters.field2=value2.3"),expect(e.search).not.to.contain("filters.field3.start=2003-02-01"),expect(e.search).not.to.contain("filters.field3.end=2007-05-04"),expect(e.search).to.contain("filters.field6=Value+6.1"),expect(e.search).to.contain("filters.field7=2005-05-05"),expect(e.search).to.contain("defaultsSaved=true"),expect(e.search).not.to.contain("filters.field4=Inigo+Montoya"),expect(e.search).not.to.contain("filters.field8=value8.1&filters.field8=value8.2&filters.field8=value8.3&filters.field8=value8.4"),expect(e.search).to.contain("&filters.field8=value8.1&filters.field8=value8.4")}),cy.reload(),cy.location().should(e=>{expect(e.search).to.contain("filters.field2=value2.3"),expect(e.search).to.contain("filters.field3.start=2003-02-01"),expect(e.search).to.contain("filters.field3.end=2007-05-04"),expect(e.search).to.contain("filters.field6=Value+6.1"),expect(e.search).to.contain("filters.field7=2005-05-05"),expect(e.search).to.contain("defaultsSaved=true"),expect(e.search).not.to.contain("filters.field4=Inigo+Montoya"),expect(e.search).not.to.contain("filters.field8=value8.1&filters.field8=value8.2&filters.field8=value8.3&filters.field8=value8.4"),expect(e.search).to.contain("&filters.field8=value8.1&filters.field8=value8.4")})}),it("should reset the defaults back to the user saved defaults",()=>{cy.findByLabelText(/Selected filters.*/i).within(()=>{cy.findAllByRole("link").eq(1).click(1,1),cy.findAllByRole("link").eq(1).click(1,1),cy.findAllByRole("link").eq(1).click(1,1)}),cy.findByLabelText(/Selected filters.*/i).within(()=>{cy.findAllByRole("link").should("have.length",2)}),cy.findByRole("link",{name:"Reset filters"}).click(),cy.findByLabelText(/Selected filters.*/i).within(()=>{cy.findAllByRole("link").should("have.length",5)})}),it("should remove the save defaults",()=>{cy.findByRole("button",{name:"Delete defaults"}).click(),cy.location().should(e=>{expect(e.search).to.contain("filters.field1=value1.2"),expect(e.search).to.contain("filters.field3.start=2003-02-01"),expect(e.search).to.contain("filters.field3.end=2006-05-04"),expect(e.search).to.contain("filters.field7=2005-02-01"),expect(e.search).to.contain("filters.field8=value8.2&filters.field8=value8.3")})})}),context("Submission",()=>{it("should submit the report details in the request",()=>{cy.intercept({method:"POST",url:"/embedded/platform/dpr/request-report/report/**/**/filters?**"}).as("requestSubmit"),cy.findByRole("button",{name:/Request/}).click(),cy.wait("@requestSubmit").its("request").then(e=>{cy.wrap(e).its("body").should("include","reportId=request-examples"),cy.wrap(e).its("body").should("include","name=Successful+Report"),cy.wrap(e).its("body").should("include","reportName=Successful+Report"),cy.wrap(e).its("body").should("include","id=request-example-success")})}),it("should submit the request with the correct query params",()=>{cy.intercept({method:"POST",url:"/embedded/platform/dpr/request-report/report/**/**/filters?**"}).as("requestSubmit"),cy.findByRole("button",{name:/Request/}).click(),cy.wait("@requestSubmit").its("request").then(e=>{expect(e.query).to.have.property("filters.field1","value1.2"),expect(e.query).to.have.property("filters.field3.end","2006-05-04"),expect(e.query).to.have.property("filters.field3.start","2003-02-01"),expect(e.query).to.have.property("filters.field7","2005-02-01"),expect(e.query).to.have.property("filters.field8"),cy.wrap(e.query["filters.field8"]).should("deep.eq",["value8.2","value8.3"]),expect(e.query).to.have.property("sortColumn","field1"),expect(e.query).to.have.property("sortedAsc","false")})})}),context("Filter order",()=>{beforeEach(()=>{cy.visit(u)}),it("should order the filters correctly",()=>{cy.findAllByLabelText(/Filters/).within(()=>{cy.findAllByRole("textbox").each((e,l)=>{switch(l){case 0:cy.wrap(e).should("have.attr","display-name").then(i=>{expect(i).contains("Field 2")});break;case 1:cy.wrap(e).should("have.attr","display-name").then(i=>{expect(i).contains("Field 3")});break;case 2:cy.wrap(e).should("have.attr","display-name").then(i=>{expect(i).contains("Field 1")});break;default:break}})})})})});
|
|
2
2
|
//# sourceMappingURL=tests.cy.js.map
|