@ministryofjustice/hmpps-digital-prison-reporting-frontend 5.2.3 → 5.2.4
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/README.md +26 -3
- package/_networkMocks/dashboard/definitions/visualisations/complete-dataset/list/definition-invalid-vis-defs.d.ts +2 -0
- package/_networkMocks/dashboard/definitions/visualisations/complete-dataset/list/definition-invalid.d.ts +2 -0
- package/_networkMocks/dashboard/definitions/visualisations/complete-dataset/list/vis-definitions/invalid.d.ts +2 -0
- package/_networkMocks/dashboard/definitions/visualisations/mocks.d.ts +34 -0
- package/_networkMocks/report/mocks.d.ts +15 -0
- package/cjs/dpr/components/_dashboards/dashboard-list/utils.js +2 -0
- package/cjs/dpr/components/_dashboards/dashboard-list/utils.js.map +1 -1
- package/cjs/dpr/components/_dashboards/dashboard-list/validate.js +23 -0
- package/cjs/dpr/components/_dashboards/dashboard-list/validate.js.map +1 -0
- package/cjs/dpr/components/_dashboards/dashboard-visualisation/Validate.js +13 -4
- package/cjs/dpr/components/_dashboards/dashboard-visualisation/Validate.js.map +1 -1
- package/cjs/dpr/data/reportingClient.js +8 -0
- package/cjs/dpr/data/reportingClient.js.map +1 -1
- package/cjs/dpr/routes/journeys/download-report/utils.js +22 -106
- package/cjs/dpr/routes/journeys/download-report/utils.js.map +1 -1
- package/cjs/dpr/routes/journeys/view-report/async/dashboard/utils.js +3 -0
- package/cjs/dpr/routes/journeys/view-report/async/dashboard/utils.js.map +1 -1
- package/cjs/dpr/routes/journeys/view-report/async/dashboard/validate.js +26 -0
- package/cjs/dpr/routes/journeys/view-report/async/dashboard/validate.js.map +1 -0
- package/cjs/dpr/services/reportingService.js +3 -0
- package/cjs/dpr/services/reportingService.js.map +1 -1
- package/cjs/dpr/utils/ErrorHandler.js +11 -11
- package/cjs/dpr/utils/ErrorHandler.js.map +1 -1
- package/cypress-tests/mockApis/dashboards.d.ts +2 -0
- package/cypress-tests/mockApis/reporting.d.ts +1 -0
- package/dpr/components/_dashboards/dashboard-list/utils.js +2 -0
- package/dpr/components/_dashboards/dashboard-list/utils.js.map +1 -1
- package/dpr/components/_dashboards/dashboard-list/validate.js +21 -0
- package/dpr/components/_dashboards/dashboard-list/validate.js.map +1 -0
- package/dpr/components/_dashboards/dashboard-visualisation/Validate.js +11 -5
- package/dpr/components/_dashboards/dashboard-visualisation/Validate.js.map +1 -1
- package/dpr/data/reportingClient.d.ts +1 -0
- package/dpr/data/reportingClient.js +8 -0
- package/dpr/data/reportingClient.js.map +1 -1
- package/dpr/routes/journeys/download-report/utils.js +23 -106
- package/dpr/routes/journeys/download-report/utils.js.map +1 -1
- package/dpr/routes/journeys/view-report/async/dashboard/utils.js +3 -0
- package/dpr/routes/journeys/view-report/async/dashboard/utils.js.map +1 -1
- package/dpr/routes/journeys/view-report/async/dashboard/validate.js +24 -0
- package/dpr/routes/journeys/view-report/async/dashboard/validate.js.map +1 -0
- package/dpr/services/reportingService.d.ts +1 -0
- package/dpr/services/reportingService.js +3 -0
- package/dpr/services/reportingService.js.map +1 -1
- package/dpr/utils/ErrorHandler.js +11 -11
- package/dpr/utils/ErrorHandler.js.map +1 -1
- package/package.json +1 -2
- package/playwright.config.d.ts +9 -0
- package/src/dpr/components/_charts/chart/bar/validate.d.ts +2 -2
- package/src/dpr/components/_charts/chart/bar-timeseries/validate.d.ts +2 -2
- package/src/dpr/components/_charts/chart/doughnut/validate.d.ts +2 -2
- package/src/dpr/components/_charts/chart/line/validate.d.ts +2 -2
- package/src/dpr/components/_charts/chart/line-timeseries/validate.d.ts +2 -2
- package/src/dpr/components/_dashboards/dashboard-list/validate.d.ts +4 -4
- package/src/dpr/components/_dashboards/dashboard-visualisation/Validate.d.ts +24 -16
- package/src/dpr/components/_dashboards/scorecard-group/validate.d.ts +2 -2
- package/src/dpr/data/reportingClient.d.ts +1 -0
- package/src/dpr/routes/journeys/download-report/async-tests.cy.d.ts +1 -0
- package/src/dpr/routes/journeys/download-report/sync-tests.cy.d.ts +1 -0
- package/src/dpr/routes/journeys/download-report/utils.d.ts +0 -5
- package/src/dpr/routes/journeys/view-report/async/dashboard/utils.d.ts +4 -4
- package/src/dpr/routes/journeys/view-report/async/dashboard/validate.d.ts +122 -0
- package/src/dpr/routes/journeys/view-report/async/report/utils.d.ts +2 -2
- package/src/dpr/routes/journeys/view-report/sync/dashboard/utils.d.ts +4 -4
- package/src/dpr/routes/journeys/view-report/sync/report/utils.d.ts +4 -4
- package/src/dpr/services/reportingService.d.ts +1 -0
- package/src/dpr/utils/localsHelper.d.ts +38 -24
- /package/src/dpr/{routes/journeys/download-report/tests.cy.d.ts → components/_dashboards/visual-regression-tests/bar-chart-complete-dataset.spec.d.ts} +0 -0
package/README.md
CHANGED
|
@@ -21,12 +21,35 @@ Both tasks use the `package` directory.
|
|
|
21
21
|
|
|
22
22
|
## Test Application
|
|
23
23
|
|
|
24
|
-
To start the Test Application, run: `npm run start
|
|
24
|
+
To start the Test Application, run: `npm run start:dev:noMockClients` as well as `npm run wiremock` in a separate tab. This builds the NPM package and starts the server at http://localhost:3010.
|
|
25
25
|
|
|
26
26
|
The Test Application is used both for visually checking components, and also by the integration tests (run using Cypress).
|
|
27
27
|
|
|
28
|
-
##
|
|
29
|
-
To run the
|
|
28
|
+
## Running and testing local builds
|
|
29
|
+
To run the main suite of browser-based tests, start up the main app by running `npm run start:dev:noMockClients` then `npm run int-test` or `npm run int-test-ui` for getting the cypress UI up to choose individual tests to run.
|
|
30
|
+
|
|
31
|
+
There are also a few jest tests - you can run these plus the small docs tests by running `npm run test`.
|
|
32
|
+
|
|
33
|
+
We also have a small number of visual regression tests using Playwright that are **only** for our chart based pages - you can run these with `npm run int-test-visual` which will start up the server and mocks itself. Please ensure any other running server processes are stopped before running this!
|
|
34
|
+
|
|
35
|
+
### How to update and create new visual regression tests
|
|
36
|
+
There may ocassionally be the need to create new visual regression tests, again, only for our charting based pages. To do this, you should develop the test as normal, but use `npm run int-test-visual-ui` which will allow you to see what the test is doing in the UI. Once you have the test on the page you want to capture a screenshot of for comparison, use
|
|
37
|
+
|
|
38
|
+
```typescript
|
|
39
|
+
await expect(page).toHaveScreenshot({
|
|
40
|
+
fullPage: true,
|
|
41
|
+
})
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
and then run your test. It will fail locally on this last step, which is expected, as you are not creating screenshots. These will be created by CI as screenshots on different OSes can have slightly different pixel values. You should push this branch and make a PR, which will set off the CI run, and if all is well, create the screenshots as an artifact of the CI run in GitHub Actions (but fail the run). You should create a folder based on the name of the file running the test - if the file is called `some-chart-test.spec.ts`, create a folder called `some-chart-test.spec.ts-screenshots/` and download the screenshots artifact and put the new screenshots in there. You should then double check these to ensure no sensitive data is being captured, then commit and push them up. This time, the CI run should use these screenshots and pass. If they do not, some common pitfalls include:
|
|
45
|
+
|
|
46
|
+
- Animations: Ideally set or disable animations so the snapshot isn't capturing charts, CSS animations etc half way through loading.
|
|
47
|
+
- Noise: Things like "Last Updated" timestamps can be very annoying and will break the test every time the clock ticks. You should mask those bits out so Playwright ignores them.
|
|
48
|
+
- As a last resort, look at having some **small** pixel tolerances - no more than 1 or 2% - on the `toHaveScreenshot` call - use `maxDiffPixelRatio` which has a range from 0-1, so no more than 0.01-0.02 here.
|
|
49
|
+
|
|
50
|
+
### Running the app in dev mode
|
|
51
|
+
|
|
52
|
+
To run the app in dev mode, use `start:dev:noMockClients` for the test app, and `docs:local` for the docs. To run the production build of docs, you should run `npm run docs`, then you'll need to configure a reverse proxy - nginx is the easiest. Install it through homebrew `brew install nginx`, then ensure it's running by running `brew services start nginx`. then run `sudo nginx -t` and you should see it's got a default config at `/opt/homebrew/etc/nginx/nginx.conf` - if it isn't there, just use whatever path it gives back, then add a new file into `/opt/homebrew/etc/nginx/servers/dev.conf` with this content:
|
|
30
53
|
|
|
31
54
|
```
|
|
32
55
|
server {
|
|
@@ -66,6 +66,40 @@ export declare const listPartialDatasetHistoricMock: {
|
|
|
66
66
|
fixedDelayMilliseconds: number;
|
|
67
67
|
};
|
|
68
68
|
};
|
|
69
|
+
export declare const listInvalidVisDefMock: {
|
|
70
|
+
priority: number;
|
|
71
|
+
request: {
|
|
72
|
+
method: "GET" | "POST" | "DELETE" | "PUT" | "OPTIONS";
|
|
73
|
+
queryParameters?: object | undefined;
|
|
74
|
+
bodyPatterns?: Array<object> | undefined;
|
|
75
|
+
urlPathPattern: string;
|
|
76
|
+
};
|
|
77
|
+
response: {
|
|
78
|
+
status: number;
|
|
79
|
+
headers: {
|
|
80
|
+
"Content-Type": "application/json;charset=UTF-8";
|
|
81
|
+
};
|
|
82
|
+
jsonBody: object;
|
|
83
|
+
fixedDelayMilliseconds: number;
|
|
84
|
+
};
|
|
85
|
+
};
|
|
86
|
+
export declare const listInvalidDefMock: {
|
|
87
|
+
priority: number;
|
|
88
|
+
request: {
|
|
89
|
+
method: "GET" | "POST" | "DELETE" | "PUT" | "OPTIONS";
|
|
90
|
+
queryParameters?: object | undefined;
|
|
91
|
+
bodyPatterns?: Array<object> | undefined;
|
|
92
|
+
urlPathPattern: string;
|
|
93
|
+
};
|
|
94
|
+
response: {
|
|
95
|
+
status: number;
|
|
96
|
+
headers: {
|
|
97
|
+
"Content-Type": "application/json;charset=UTF-8";
|
|
98
|
+
};
|
|
99
|
+
jsonBody: object;
|
|
100
|
+
fixedDelayMilliseconds: number;
|
|
101
|
+
};
|
|
102
|
+
};
|
|
69
103
|
export declare const scorecardsCompleteDatasetMock: {
|
|
70
104
|
priority: number;
|
|
71
105
|
request: {
|
|
@@ -99,6 +99,21 @@ export declare const getAsyncReportDownloadMock: {
|
|
|
99
99
|
body: string;
|
|
100
100
|
};
|
|
101
101
|
};
|
|
102
|
+
export declare const getSyncReportDownloadMock: {
|
|
103
|
+
priority: number;
|
|
104
|
+
request: {
|
|
105
|
+
method: string;
|
|
106
|
+
urlPathPattern: string;
|
|
107
|
+
};
|
|
108
|
+
response: {
|
|
109
|
+
status: number;
|
|
110
|
+
headers: {
|
|
111
|
+
'Content-Type': string;
|
|
112
|
+
'Content-Disposition': string;
|
|
113
|
+
};
|
|
114
|
+
body: string;
|
|
115
|
+
};
|
|
116
|
+
};
|
|
102
117
|
export declare const reportsFinishedStatusMock: {
|
|
103
118
|
priority: number;
|
|
104
119
|
request: {
|
|
@@ -3,8 +3,10 @@
|
|
|
3
3
|
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
4
|
|
|
5
5
|
var datasetHelper = require('../../../utils/datasetHelper.js');
|
|
6
|
+
var validate = require('./validate.js');
|
|
6
7
|
|
|
7
8
|
const createList = (listDefinition, dashboardData) => {
|
|
9
|
+
validate.ListSchema.parse(listDefinition);
|
|
8
10
|
const { columns, options } = listDefinition;
|
|
9
11
|
const listOptions = options;
|
|
10
12
|
const showLatest = listOptions?.showLatest !== undefined ? listOptions.showLatest : true;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","sources":["../../../../../../../../../../../src/dpr/components/_dashboards/dashboard-list/utils.ts"],"sourcesContent":["/* eslint-disable no-param-reassign */\nimport { DashboardDataResponse } from '../../../types/Metrics'\nimport {\n ListDashboardVisualisationOptions,\n MoJTable,\n MoJTableHead,\n MoJTableRow,\n} from '../dashboard-visualisation/types'\nimport DatasetHelper from '../../../utils/datasetHelper'\nimport { components } from '../../../types/api'\n\nexport const createList = (\n listDefinition: components['schemas']['DashboardVisualisationDefinition'],\n dashboardData: DashboardDataResponse[],\n): { table: MoJTable; ts: string } => {\n const { columns, options } = listDefinition\n const listOptions = <ListDashboardVisualisationOptions>options\n const showLatest = listOptions?.showLatest !== undefined ? listOptions.showLatest : true\n const columnsAsList = listOptions?.columnsAsList\n const { measures, keys } = columns\n const showAllData = (!measures && !keys) || (!measures.length && !keys)\n\n let datasetData: DashboardDataResponse[] = [...dashboardData]\n if (showLatest) {\n datasetData = DatasetHelper.getLastestDataset(datasetData)\n }\n\n let head\n let rows\n let ts\n\n if (showAllData) {\n ;({ head, rows, ts } = createFullList(datasetData))\n } else if (columnsAsList) {\n ;({ head, rows, ts } = createListFromColumns(listDefinition, datasetData))\n } else {\n ;({ head, rows, ts } = creatListFromRows(listDefinition, datasetData))\n }\n\n if (rows.length && measures) rows = sumColumns(rows, measures)\n\n return {\n table: {\n head,\n rows,\n },\n ts,\n }\n}\n\nconst createListFromColumns = (\n listDefinition: components['schemas']['DashboardVisualisationDefinition'],\n dashboardData: DashboardDataResponse[],\n) => {\n const { columns } = listDefinition\n const { keys, measures } = columns\n const groupKey = DatasetHelper.getGroupKey(dashboardData, keys || [])\n\n const timestampData = dashboardData[0]?.['ts']?.raw\n const ts = timestampData ? `${timestampData}` : ''\n\n const head: MoJTableHead[] = []\n head.push({ text: '' })\n dashboardData.forEach((row) => {\n head.push({\n text: groupKey ? `${row[groupKey.id].raw}` : '',\n })\n })\n\n const rows: MoJTableRow[][] = []\n measures.forEach((measure) => {\n rows.push([{ text: measure.display }] as MoJTableRow[])\n })\n\n measures.forEach((measure, index) => {\n dashboardData.forEach((row) => {\n rows[index].push({ text: `${row[measure.id].raw}` })\n })\n })\n\n return {\n rows,\n head,\n ts,\n }\n}\n\nexport const createTableRows = (\n data: DashboardDataResponse[],\n measures?: components['schemas']['DashboardVisualisationColumnDefinition'][],\n): MoJTableRow[][] => {\n return data.map((dataRow) => {\n const row: MoJTableRow[] = measures?.length ? Array(measures.length) : Array(Object.keys(data[0]).length)\n Object.keys(dataRow).forEach((key, index) => {\n const headIndex = measures?.length ? measures.findIndex((m) => m.id === key) : index\n const text = dataRow[key].raw\n row.splice(headIndex, 1, { text } as MoJTableRow)\n })\n\n return row\n })\n}\n\nconst creatListFromRows = (\n listDefinition: components['schemas']['DashboardVisualisationDefinition'],\n dashboardData: DashboardDataResponse[],\n) => {\n const { measures } = listDefinition.columns\n\n const head: MoJTableHead[] = measures.map((column) => {\n return { text: column.display || '' }\n })\n\n const dataSetRows = DatasetHelper.getDatasetRows(listDefinition, dashboardData)\n const displayRows = DatasetHelper.filterRowsByDisplayColumns(listDefinition, dataSetRows)\n const rows = createTableRows(displayRows, measures)\n\n const timestampData = dataSetRows[0]?.['ts']?.raw\n const ts = timestampData ? `${timestampData}` : ''\n\n return {\n head,\n rows,\n ts,\n }\n}\n\nconst createFullList = (dashboardData: DashboardDataResponse[]) => {\n const head: MoJTableHead[] = Object.keys(dashboardData[0]).map((key) => {\n return { text: key || '' }\n })\n const rows = createTableRows(dashboardData)\n\n const latestData = DatasetHelper.getLastestDataset(dashboardData)\n const timestampData = latestData[0]?.['ts']?.raw\n const ts = timestampData ? `${timestampData}` : ''\n\n return {\n head,\n rows,\n ts,\n }\n}\n\nconst sumColumns = (\n rowsData: MoJTableRow[][],\n measures: components['schemas']['DashboardVisualisationColumnDefinition'][],\n) => {\n const sumColumnIndexes: number[] = measures.flatMap((col, idx) => (col.aggregate ? [idx] : []))\n\n if (sumColumnIndexes.length) {\n const sumRow: MoJTableRow[] = [{ html: `<strong>Total<strong>` }]\n for (let index = 1; index < measures.length; index += 1) {\n sumRow[index] = { text: '' }\n }\n\n rowsData.push(sumRow)\n sumColumnIndexes.forEach((index) => {\n const total = rowsData.reduce((acc, row) => {\n const rowIndex = row[index]\n if (rowIndex && rowIndex.text) {\n acc += Number(rowIndex.text)\n }\n return acc\n }, 0)\n rowsData[rowsData.length - 1][index] = {\n html: `<strong>${total}<strong>`,\n }\n })\n }\n\n return rowsData\n}\n\nexport default {\n createList,\n createTableRows,\n}\n"],"names":["DatasetHelper"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"utils.js","sources":["../../../../../../../../../../../src/dpr/components/_dashboards/dashboard-list/utils.ts"],"sourcesContent":["/* eslint-disable no-param-reassign */\nimport { DashboardDataResponse } from '../../../types/Metrics'\nimport {\n ListDashboardVisualisationOptions,\n MoJTable,\n MoJTableHead,\n MoJTableRow,\n} from '../dashboard-visualisation/types'\nimport DatasetHelper from '../../../utils/datasetHelper'\nimport { components } from '../../../types/api'\nimport ListVisSchemas from './validate'\n\nexport const createList = (\n listDefinition: components['schemas']['DashboardVisualisationDefinition'],\n dashboardData: DashboardDataResponse[],\n): { table: MoJTable; ts: string } => {\n ListVisSchemas.ListSchema.parse(listDefinition)\n const { columns, options } = listDefinition\n const listOptions = <ListDashboardVisualisationOptions>options\n const showLatest = listOptions?.showLatest !== undefined ? listOptions.showLatest : true\n const columnsAsList = listOptions?.columnsAsList\n const { measures, keys } = columns\n const showAllData = (!measures && !keys) || (!measures.length && !keys)\n\n let datasetData: DashboardDataResponse[] = [...dashboardData]\n if (showLatest) {\n datasetData = DatasetHelper.getLastestDataset(datasetData)\n }\n\n let head\n let rows\n let ts\n\n if (showAllData) {\n ;({ head, rows, ts } = createFullList(datasetData))\n } else if (columnsAsList) {\n ;({ head, rows, ts } = createListFromColumns(listDefinition, datasetData))\n } else {\n ;({ head, rows, ts } = creatListFromRows(listDefinition, datasetData))\n }\n\n if (rows.length && measures) rows = sumColumns(rows, measures)\n\n return {\n table: {\n head,\n rows,\n },\n ts,\n }\n}\n\nconst createListFromColumns = (\n listDefinition: components['schemas']['DashboardVisualisationDefinition'],\n dashboardData: DashboardDataResponse[],\n) => {\n const { columns } = listDefinition\n const { keys, measures } = columns\n const groupKey = DatasetHelper.getGroupKey(dashboardData, keys || [])\n\n const timestampData = dashboardData[0]?.['ts']?.raw\n const ts = timestampData ? `${timestampData}` : ''\n\n const head: MoJTableHead[] = []\n head.push({ text: '' })\n dashboardData.forEach((row) => {\n head.push({\n text: groupKey ? `${row[groupKey.id].raw}` : '',\n })\n })\n\n const rows: MoJTableRow[][] = []\n measures.forEach((measure) => {\n rows.push([{ text: measure.display }] as MoJTableRow[])\n })\n\n measures.forEach((measure, index) => {\n dashboardData.forEach((row) => {\n rows[index].push({ text: `${row[measure.id].raw}` })\n })\n })\n\n return {\n rows,\n head,\n ts,\n }\n}\n\nexport const createTableRows = (\n data: DashboardDataResponse[],\n measures?: components['schemas']['DashboardVisualisationColumnDefinition'][],\n): MoJTableRow[][] => {\n return data.map((dataRow) => {\n const row: MoJTableRow[] = measures?.length ? Array(measures.length) : Array(Object.keys(data[0]).length)\n Object.keys(dataRow).forEach((key, index) => {\n const headIndex = measures?.length ? measures.findIndex((m) => m.id === key) : index\n const text = dataRow[key].raw\n row.splice(headIndex, 1, { text } as MoJTableRow)\n })\n\n return row\n })\n}\n\nconst creatListFromRows = (\n listDefinition: components['schemas']['DashboardVisualisationDefinition'],\n dashboardData: DashboardDataResponse[],\n) => {\n const { measures } = listDefinition.columns\n\n const head: MoJTableHead[] = measures.map((column) => {\n return { text: column.display || '' }\n })\n\n const dataSetRows = DatasetHelper.getDatasetRows(listDefinition, dashboardData)\n const displayRows = DatasetHelper.filterRowsByDisplayColumns(listDefinition, dataSetRows)\n const rows = createTableRows(displayRows, measures)\n\n const timestampData = dataSetRows[0]?.['ts']?.raw\n const ts = timestampData ? `${timestampData}` : ''\n\n return {\n head,\n rows,\n ts,\n }\n}\n\nconst createFullList = (dashboardData: DashboardDataResponse[]) => {\n const head: MoJTableHead[] = Object.keys(dashboardData[0]).map((key) => {\n return { text: key || '' }\n })\n const rows = createTableRows(dashboardData)\n\n const latestData = DatasetHelper.getLastestDataset(dashboardData)\n const timestampData = latestData[0]?.['ts']?.raw\n const ts = timestampData ? `${timestampData}` : ''\n\n return {\n head,\n rows,\n ts,\n }\n}\n\nconst sumColumns = (\n rowsData: MoJTableRow[][],\n measures: components['schemas']['DashboardVisualisationColumnDefinition'][],\n) => {\n const sumColumnIndexes: number[] = measures.flatMap((col, idx) => (col.aggregate ? [idx] : []))\n\n if (sumColumnIndexes.length) {\n const sumRow: MoJTableRow[] = [{ html: `<strong>Total<strong>` }]\n for (let index = 1; index < measures.length; index += 1) {\n sumRow[index] = { text: '' }\n }\n\n rowsData.push(sumRow)\n sumColumnIndexes.forEach((index) => {\n const total = rowsData.reduce((acc, row) => {\n const rowIndex = row[index]\n if (rowIndex && rowIndex.text) {\n acc += Number(rowIndex.text)\n }\n return acc\n }, 0)\n rowsData[rowsData.length - 1][index] = {\n html: `<strong>${total}<strong>`,\n }\n })\n }\n\n return rowsData\n}\n\nexport default {\n createList,\n createTableRows,\n}\n"],"names":["ListVisSchemas","DatasetHelper"],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var z = require('zod');
|
|
4
|
+
var Validate = require('../dashboard-visualisation/Validate.js');
|
|
5
|
+
|
|
6
|
+
const ListOptions = z.z.object({
|
|
7
|
+
showLatest: z.z.boolean().default(true),
|
|
8
|
+
columnsAsList: z.z.boolean().optional(),
|
|
9
|
+
});
|
|
10
|
+
const ListSchema = z.z.object({
|
|
11
|
+
...Validate.DashboardVisualisationSchema.shape,
|
|
12
|
+
type: z.z.literal('list'),
|
|
13
|
+
options: z.z.object(ListOptions.shape).optional(),
|
|
14
|
+
columns: z.z.object({
|
|
15
|
+
...Validate.DashboardColumns.shape,
|
|
16
|
+
measures: z.z.array(Validate.DashboardVisualisationMeasureSchema),
|
|
17
|
+
}),
|
|
18
|
+
});
|
|
19
|
+
const ListSchemas = {
|
|
20
|
+
ListSchema};
|
|
21
|
+
|
|
22
|
+
module.exports = ListSchemas;
|
|
23
|
+
//# sourceMappingURL=validate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate.js","sources":["../../../../../../../../../../../src/dpr/components/_dashboards/dashboard-list/validate.ts"],"sourcesContent":["import { z } from 'zod'\nimport {\n DashboardVisualisationSchema,\n DashboardColumns,\n DashboardVisualisationMeasureSchema,\n} from '../dashboard-visualisation/Validate'\n\nconst ListOptions = z.object({\n showLatest: z.boolean().default(true),\n columnsAsList: z.boolean().optional(),\n})\n\nconst ListSchema = z.object({\n ...DashboardVisualisationSchema.shape,\n type: z.literal('list'),\n options: z.object(ListOptions.shape).optional(),\n columns: z.object({\n ...DashboardColumns.shape,\n measures: z.array(DashboardVisualisationMeasureSchema),\n }),\n})\n\nconst ListSchemas = {\n ListSchema,\n ListOptions,\n}\n\nexport default ListSchemas\n"],"names":["z","DashboardVisualisationSchema","DashboardColumns","DashboardVisualisationMeasureSchema"],"mappings":";;;;;AAOA,MAAM,WAAW,GAAGA,GAAC,CAAC,MAAM,CAAC;IAC3B,UAAU,EAAEA,GAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC;AACrC,IAAA,aAAa,EAAEA,GAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;AACtC,CAAA,CAAC;AAEF,MAAM,UAAU,GAAGA,GAAC,CAAC,MAAM,CAAC;IAC1B,GAAGC,qCAA4B,CAAC,KAAK;AACrC,IAAA,IAAI,EAAED,GAAC,CAAC,OAAO,CAAC,MAAM,CAAC;IACvB,OAAO,EAAEA,GAAC,CAAC,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,QAAQ,EAAE;AAC/C,IAAA,OAAO,EAAEA,GAAC,CAAC,MAAM,CAAC;QAChB,GAAGE,yBAAgB,CAAC,KAAK;AACzB,QAAA,QAAQ,EAAEF,GAAC,CAAC,KAAK,CAACG,4CAAmC,CAAC;KACvD,CAAC;AACH,CAAA,CAAC;AAEF,MAAM,WAAW,GAAG;IAClB;;;;"}
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
+
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
|
+
|
|
3
5
|
var z = require('zod');
|
|
4
6
|
|
|
5
7
|
const dashboardBucket = z.z.object({
|
|
@@ -28,13 +30,17 @@ const DashboardVisualisationMeasureSchema = z.z.object({
|
|
|
28
30
|
aggregate: z.z.enum(['sum', 'average']).optional(),
|
|
29
31
|
});
|
|
30
32
|
const DashboardColumns = z.z.object({
|
|
31
|
-
keys: z.z.array(DashboardVisualisationKeySchema),
|
|
32
|
-
measures: z.z.array(DashboardVisualisationMeasureSchema
|
|
33
|
+
keys: z.z.array(DashboardVisualisationKeySchema).optional(),
|
|
34
|
+
measures: z.z.array(DashboardVisualisationMeasureSchema, {
|
|
35
|
+
error: (issue) => issue.input === undefined
|
|
36
|
+
? 'Dashboard visualisation definition: measures is required'
|
|
37
|
+
: 'Dashboard visualisation definition: measures must be an array',
|
|
38
|
+
}),
|
|
33
39
|
filters: z.z.array(dashboardVisFilter).min(1).optional(),
|
|
34
40
|
expectNulls: z.z.boolean().default(false),
|
|
35
41
|
});
|
|
36
42
|
const dashboardOptions = z.z.object({
|
|
37
|
-
...
|
|
43
|
+
...BucketOptionsSchema.shape,
|
|
38
44
|
showLatest: z.z.boolean().default(true),
|
|
39
45
|
columnsAsList: z.z.boolean().optional(),
|
|
40
46
|
});
|
|
@@ -53,12 +59,15 @@ const DashboardVisualisationSchema = z.z.object({
|
|
|
53
59
|
]),
|
|
54
60
|
display: z.z.string().optional(),
|
|
55
61
|
description: z.z.string().optional(),
|
|
56
|
-
options: z.z.object(dashboardOptions.shape),
|
|
62
|
+
options: z.z.object(dashboardOptions.shape).optional(),
|
|
57
63
|
columns: z.z.object(DashboardColumns.shape),
|
|
58
64
|
});
|
|
65
|
+
const DashboardVisualisationSchemas = {
|
|
66
|
+
DashboardVisualisationSchema};
|
|
59
67
|
|
|
60
68
|
exports.BucketOptionsSchema = BucketOptionsSchema;
|
|
61
69
|
exports.DashboardColumns = DashboardColumns;
|
|
62
70
|
exports.DashboardVisualisationMeasureSchema = DashboardVisualisationMeasureSchema;
|
|
63
71
|
exports.DashboardVisualisationSchema = DashboardVisualisationSchema;
|
|
72
|
+
exports.default = DashboardVisualisationSchemas;
|
|
64
73
|
//# sourceMappingURL=Validate.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Validate.js","sources":["../../../../../../../../../../../src/dpr/components/_dashboards/dashboard-visualisation/Validate.ts"],"sourcesContent":["import { z } from 'zod'\n\nconst dashboardBucket = z.object({\n min: z.number().optional(),\n max: z.number().optional(),\n hexColour: z.string().optional(),\n})\n\nexport const BucketOptionsSchema = z.object({\n useRagColour: z.boolean().default(false),\n buckets: z.array(dashboardBucket).default([]),\n baseColour: z.string().regex(/^#/).optional(),\n})\n\nconst dashboardVisFilter = z.object({\n id: z.string(),\n equals: z.string().nullable(),\n})\n\nconst DashboardVisualisationKeySchema = z.object({\n id: z.string(),\n display: z.string().optional(),\n optional: z.boolean().default(false),\n})\n\nexport const DashboardVisualisationMeasureSchema = z.object({\n id: z.string(),\n display: z.string().optional(),\n unit: z.enum(['NUMBER', 'PERCENTAGE']).optional(),\n aggregate: z.enum(['sum', 'average']).optional(),\n})\n\nexport const DashboardColumns = z.object({\n keys: z.array(DashboardVisualisationKeySchema),\n measures: z.array(DashboardVisualisationMeasureSchema).
|
|
1
|
+
{"version":3,"file":"Validate.js","sources":["../../../../../../../../../../../src/dpr/components/_dashboards/dashboard-visualisation/Validate.ts"],"sourcesContent":["import { z } from 'zod'\n\nconst dashboardBucket = z.object({\n min: z.number().optional(),\n max: z.number().optional(),\n hexColour: z.string().optional(),\n})\n\nexport const BucketOptionsSchema = z.object({\n useRagColour: z.boolean().default(false),\n buckets: z.array(dashboardBucket).default([]),\n baseColour: z.string().regex(/^#/).optional(),\n})\n\nconst dashboardVisFilter = z.object({\n id: z.string(),\n equals: z.string().nullable(),\n})\n\nconst DashboardVisualisationKeySchema = z.object({\n id: z.string(),\n display: z.string().optional(),\n optional: z.boolean().default(false),\n})\n\nexport const DashboardVisualisationMeasureSchema = z.object({\n id: z.string(),\n display: z.string().optional(),\n unit: z.enum(['NUMBER', 'PERCENTAGE']).optional(),\n aggregate: z.enum(['sum', 'average']).optional(),\n})\n\nexport const DashboardColumns = z.object({\n keys: z.array(DashboardVisualisationKeySchema).optional(),\n measures: z.array(DashboardVisualisationMeasureSchema, {\n error: (issue) =>\n issue.input === undefined\n ? 'Dashboard visualisation definition: measures is required'\n : 'Dashboard visualisation definition: measures must be an array',\n }),\n filters: z.array(dashboardVisFilter).min(1).optional(),\n expectNulls: z.boolean().default(false),\n})\n\nconst dashboardOptions = z.object({\n ...BucketOptionsSchema.shape,\n showLatest: z.boolean().default(true),\n columnsAsList: z.boolean().optional(),\n})\n\nexport const DashboardVisualisationSchema = z.object({\n id: z.string(),\n type: z.enum([\n 'list',\n 'doughnut',\n 'bar',\n 'bar-timeseries',\n 'line',\n 'scorecard',\n 'scorecard-group',\n 'matrix-timeseries',\n 'line-timeseries',\n ]),\n display: z.string().optional(),\n description: z.string().optional(),\n options: z.object(dashboardOptions.shape).optional(),\n columns: z.object(DashboardColumns.shape),\n})\n\nconst DashboardVisualisationSchemas = {\n DashboardVisualisationSchema,\n DashboardVisualisationMeasureSchema,\n DashboardVisualisationKeySchema,\n}\n\nexport default DashboardVisualisationSchemas\n"],"names":["z"],"mappings":"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"}
|
|
@@ -109,6 +109,14 @@ class ReportingClient {
|
|
|
109
109
|
token,
|
|
110
110
|
}, res);
|
|
111
111
|
}
|
|
112
|
+
downloadSyncReport(token, resourceName, reportQuery, res) {
|
|
113
|
+
this.logInfo('Streaming download data', { resourceName });
|
|
114
|
+
return this.restClient.getStream({
|
|
115
|
+
path: `/${resourceName}/download`,
|
|
116
|
+
query: reportQuery.toRecordWithFilterPrefix(true),
|
|
117
|
+
token,
|
|
118
|
+
}, res);
|
|
119
|
+
}
|
|
112
120
|
getAsyncReport(token, reportId, variantId, tableId, query) {
|
|
113
121
|
this.logInfo('Get Data', { reportId, variantId, tableId });
|
|
114
122
|
return this.restClient
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reportingClient.js","sources":["../../../../../../../../../src/dpr/data/reportingClient.ts"],"sourcesContent":["import { Response } from 'express'\nimport ReportQuery from '../types/ReportQuery'\nimport logger from '../utils/logger'\nimport RestClient from './restClient'\nimport Dict = NodeJS.Dict\nimport { components, operations } from '../types/api'\nimport { ApiConfig, Count, ListWithWarnings } from './types'\nimport type { ResultWithHeaders } from './restClient'\n\nclass ReportingClient {\n restClient: RestClient\n\n constructor(config: ApiConfig) {\n this.restClient = new RestClient('Reporting API Client', config)\n }\n\n getCount(resourceName: string, token: string, countRequest: ReportQuery): Promise<number> {\n logger.info(`Reporting client: Get count. { resourceName: ${resourceName} }`)\n\n return this.restClient\n .get({\n path: `/${resourceName}/count`,\n query: countRequest.toRecordWithFilterPrefix(true),\n token,\n })\n .then((response) => (<Count>response).count)\n }\n\n getList(resourceName: string, token: string, listRequest: ReportQuery): Promise<Array<Dict<string>>> {\n return this.getListWithWarnings(resourceName, token, listRequest).then((response) => response.data)\n }\n\n getListWithWarnings(resourceName: string, token: string, listRequest: ReportQuery): Promise<ListWithWarnings> {\n logger.info(`Reporting client: Get list. { resourceName: ${resourceName} }`)\n\n return this.restClient\n .getWithHeaders<Array<Dict<string>>>({\n path: `/${resourceName}`,\n query: listRequest.toRecordWithFilterPrefix(true),\n token,\n })\n .then((response: ResultWithHeaders<Array<Dict<string>>>) => ({\n data: response.data,\n warnings: {\n noDataAvailable: response.headers['x-no-data-warning'],\n },\n }))\n }\n\n getDefinitionSummary(\n token: string,\n reportId: string,\n definitionsPath?: string,\n ): Promise<components['schemas']['ReportDefinitionSummary']> {\n this.logInfo('Get definition summary', { reportId })\n\n const queryParams: operations['definitionSummary']['parameters']['query'] = {\n ...(definitionsPath && { dataProductDefinitionsPath: definitionsPath }),\n }\n\n return this.restClient\n .get({\n path: `/definitions/${reportId}`,\n query: queryParams,\n token,\n })\n .then((response) => <components['schemas']['ReportDefinitionSummary']>response)\n }\n\n getDefinitions(\n token: string,\n definitionsPath?: string,\n ): Promise<Array<components['schemas']['ReportDefinitionSummary']>> {\n this.logInfo('Get definitions')\n\n const queryParams: operations['definitions_1']['parameters']['query'] = {\n renderMethod: 'HTML',\n ...(definitionsPath && { dataProductDefinitionsPath: definitionsPath }),\n }\n\n return this.restClient\n .get({\n path: '/definitions',\n query: queryParams,\n token,\n })\n .then((response) => <Array<components['schemas']['ReportDefinitionSummary']>>response)\n }\n\n getDefinition(\n token: string,\n reportId: string,\n variantId: string,\n definitionsPath?: string,\n queryData?: Dict<string | string[]>,\n ): Promise<components['schemas']['SingleVariantReportDefinition']> {\n const query = {\n ...queryData,\n dataProductDefinitionsPath: definitionsPath,\n }\n\n this.logInfo('Get definition', { reportId, variantId, ...query })\n\n return this.restClient\n .get({\n path: `/definitions/${reportId}/${variantId}`,\n query,\n token,\n })\n .then((response) => <components['schemas']['SingleVariantReportDefinition']>response)\n }\n\n requestAsyncReport(\n token: string,\n reportId: string,\n variantId: string,\n query: Record<string, string | boolean | number>,\n ): Promise<Dict<string>> {\n this.logInfo('Request report', { reportId, variantId })\n\n return this.restClient\n .get({\n path: `/async/reports/${reportId}/${variantId}`,\n token,\n query,\n })\n .then((response) => <Dict<string>>response)\n }\n\n cancelAsyncRequest(\n token: string,\n reportId: string,\n variantId: string,\n executionId: string,\n dataProductDefinitionsPath?: string,\n ): Promise<Dict<string>> {\n this.logInfo('Cancel Request', { reportId, variantId, executionId })\n\n return this.restClient\n .delete({\n path: `/reports/${reportId}/${variantId}/statements/${executionId}`,\n token,\n query: {\n dataProductDefinitionsPath,\n },\n })\n .then((response) => <Dict<string>>response)\n }\n\n downloadAsyncReport(\n token: string,\n reportId: string,\n variantId: string,\n tableId: string,\n query: Record<string, string | string[]>,\n res: Response,\n ): Promise<void> {\n this.logInfo('Streaming download data', { reportId, variantId, tableId })\n\n return this.restClient.getStream(\n {\n path: `/reports/${reportId}/${variantId}/tables/${tableId}/download`,\n query,\n token,\n },\n res,\n )\n }\n\n getAsyncReport(\n token: string,\n reportId: string,\n variantId: string,\n tableId: string,\n query: Record<string, string | string[]>,\n ): Promise<Array<Record<string, string>>> {\n this.logInfo('Get Data', { reportId, variantId, tableId })\n\n return this.restClient\n .get({\n path: `/reports/${reportId}/${variantId}/tables/${tableId}/result`,\n token,\n query,\n })\n .then((response) => <Array<Record<string, string>>>response)\n }\n\n getAsyncSummaryReport(\n token: string,\n reportId: string,\n variantId: string,\n tableId: string,\n summaryId: string,\n query: Dict<string | number>,\n ): Promise<Array<Record<string, string>>> {\n this.logInfo('Get summary data', { reportId, variantId, tableId, summaryId })\n\n return this.restClient\n .get({\n path: `/reports/${reportId}/${variantId}/tables/${tableId}/result/summary/${summaryId}`,\n token,\n query,\n })\n .then((response) => <Array<Record<string, string>>>response)\n }\n\n getAsyncReportStatus(\n token: string,\n reportId: string,\n variantId: string,\n executionId: string,\n dataProductDefinitionsPath?: string,\n tableId?: string,\n ): Promise<components['schemas']['StatementExecutionStatus']> {\n this.logInfo('Get status', { reportId, variantId, tableId, executionId })\n\n return this.restClient\n .get({\n path: `/reports/${reportId}/${variantId}/statements/${executionId}/status`,\n token,\n query: {\n dataProductDefinitionsPath,\n tableId,\n },\n })\n .then((response) => <components['schemas']['StatementExecutionStatus']>response)\n }\n\n getAsyncCount(token: string, tableId: string, dataProductDefinitionsPath?: string): Promise<number> {\n this.logInfo('Get count', { tableId })\n\n return this.restClient\n .get({\n path: `/report/tables/${tableId}/count`,\n token,\n query: {\n dataProductDefinitionsPath,\n },\n })\n .then((response) => (<Count>response).count)\n }\n\n getAsyncInteractiveCount(\n token: string,\n tableId: string,\n reportId: string,\n id: string,\n filters: ReportQuery,\n ): Promise<number> {\n this.logInfo('Get interactive count', { tableId, reportId, id })\n\n return this.restClient\n .get({\n path: `/reports/${reportId}/${id}/tables/${tableId}/count`,\n token,\n query: filters.toRecordWithFilterPrefix(true),\n })\n .then((response) => (<Count>response).count)\n }\n\n logInfo(title: string, args?: Dict<string>) {\n logger.info(`Reporting Client: ${title}:`)\n if (args && Object.keys(args).length) logger.info(JSON.stringify(args, null, 2))\n }\n}\n\nexport { ReportingClient }\nexport default ReportingClient\n"],"names":["RestClient","logger"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"reportingClient.js","sources":["../../../../../../../../../src/dpr/data/reportingClient.ts"],"sourcesContent":["import { Response } from 'express'\nimport ReportQuery from '../types/ReportQuery'\nimport logger from '../utils/logger'\nimport RestClient from './restClient'\nimport Dict = NodeJS.Dict\nimport { components, operations } from '../types/api'\nimport { ApiConfig, Count, ListWithWarnings } from './types'\nimport type { ResultWithHeaders } from './restClient'\n\nclass ReportingClient {\n restClient: RestClient\n\n constructor(config: ApiConfig) {\n this.restClient = new RestClient('Reporting API Client', config)\n }\n\n getCount(resourceName: string, token: string, countRequest: ReportQuery): Promise<number> {\n logger.info(`Reporting client: Get count. { resourceName: ${resourceName} }`)\n\n return this.restClient\n .get({\n path: `/${resourceName}/count`,\n query: countRequest.toRecordWithFilterPrefix(true),\n token,\n })\n .then((response) => (<Count>response).count)\n }\n\n getList(resourceName: string, token: string, listRequest: ReportQuery): Promise<Array<Dict<string>>> {\n return this.getListWithWarnings(resourceName, token, listRequest).then((response) => response.data)\n }\n\n getListWithWarnings(resourceName: string, token: string, listRequest: ReportQuery): Promise<ListWithWarnings> {\n logger.info(`Reporting client: Get list. { resourceName: ${resourceName} }`)\n\n return this.restClient\n .getWithHeaders<Array<Dict<string>>>({\n path: `/${resourceName}`,\n query: listRequest.toRecordWithFilterPrefix(true),\n token,\n })\n .then((response: ResultWithHeaders<Array<Dict<string>>>) => ({\n data: response.data,\n warnings: {\n noDataAvailable: response.headers['x-no-data-warning'],\n },\n }))\n }\n\n getDefinitionSummary(\n token: string,\n reportId: string,\n definitionsPath?: string,\n ): Promise<components['schemas']['ReportDefinitionSummary']> {\n this.logInfo('Get definition summary', { reportId })\n\n const queryParams: operations['definitionSummary']['parameters']['query'] = {\n ...(definitionsPath && { dataProductDefinitionsPath: definitionsPath }),\n }\n\n return this.restClient\n .get({\n path: `/definitions/${reportId}`,\n query: queryParams,\n token,\n })\n .then((response) => <components['schemas']['ReportDefinitionSummary']>response)\n }\n\n getDefinitions(\n token: string,\n definitionsPath?: string,\n ): Promise<Array<components['schemas']['ReportDefinitionSummary']>> {\n this.logInfo('Get definitions')\n\n const queryParams: operations['definitions_1']['parameters']['query'] = {\n renderMethod: 'HTML',\n ...(definitionsPath && { dataProductDefinitionsPath: definitionsPath }),\n }\n\n return this.restClient\n .get({\n path: '/definitions',\n query: queryParams,\n token,\n })\n .then((response) => <Array<components['schemas']['ReportDefinitionSummary']>>response)\n }\n\n getDefinition(\n token: string,\n reportId: string,\n variantId: string,\n definitionsPath?: string,\n queryData?: Dict<string | string[]>,\n ): Promise<components['schemas']['SingleVariantReportDefinition']> {\n const query = {\n ...queryData,\n dataProductDefinitionsPath: definitionsPath,\n }\n\n this.logInfo('Get definition', { reportId, variantId, ...query })\n\n return this.restClient\n .get({\n path: `/definitions/${reportId}/${variantId}`,\n query,\n token,\n })\n .then((response) => <components['schemas']['SingleVariantReportDefinition']>response)\n }\n\n requestAsyncReport(\n token: string,\n reportId: string,\n variantId: string,\n query: Record<string, string | boolean | number>,\n ): Promise<Dict<string>> {\n this.logInfo('Request report', { reportId, variantId })\n\n return this.restClient\n .get({\n path: `/async/reports/${reportId}/${variantId}`,\n token,\n query,\n })\n .then((response) => <Dict<string>>response)\n }\n\n cancelAsyncRequest(\n token: string,\n reportId: string,\n variantId: string,\n executionId: string,\n dataProductDefinitionsPath?: string,\n ): Promise<Dict<string>> {\n this.logInfo('Cancel Request', { reportId, variantId, executionId })\n\n return this.restClient\n .delete({\n path: `/reports/${reportId}/${variantId}/statements/${executionId}`,\n token,\n query: {\n dataProductDefinitionsPath,\n },\n })\n .then((response) => <Dict<string>>response)\n }\n\n downloadAsyncReport(\n token: string,\n reportId: string,\n variantId: string,\n tableId: string,\n query: Record<string, string | string[]>,\n res: Response,\n ): Promise<void> {\n this.logInfo('Streaming download data', { reportId, variantId, tableId })\n\n return this.restClient.getStream(\n {\n path: `/reports/${reportId}/${variantId}/tables/${tableId}/download`,\n query,\n token,\n },\n res,\n )\n }\n\n downloadSyncReport(token: string, resourceName: string, reportQuery: ReportQuery, res: Response): Promise<void> {\n this.logInfo('Streaming download data', { resourceName })\n\n return this.restClient.getStream(\n {\n path: `/${resourceName}/download`,\n query: reportQuery.toRecordWithFilterPrefix(true),\n token,\n },\n res,\n )\n }\n\n getAsyncReport(\n token: string,\n reportId: string,\n variantId: string,\n tableId: string,\n query: Record<string, string | string[]>,\n ): Promise<Array<Record<string, string>>> {\n this.logInfo('Get Data', { reportId, variantId, tableId })\n\n return this.restClient\n .get({\n path: `/reports/${reportId}/${variantId}/tables/${tableId}/result`,\n token,\n query,\n })\n .then((response) => <Array<Record<string, string>>>response)\n }\n\n getAsyncSummaryReport(\n token: string,\n reportId: string,\n variantId: string,\n tableId: string,\n summaryId: string,\n query: Dict<string | number>,\n ): Promise<Array<Record<string, string>>> {\n this.logInfo('Get summary data', { reportId, variantId, tableId, summaryId })\n\n return this.restClient\n .get({\n path: `/reports/${reportId}/${variantId}/tables/${tableId}/result/summary/${summaryId}`,\n token,\n query,\n })\n .then((response) => <Array<Record<string, string>>>response)\n }\n\n getAsyncReportStatus(\n token: string,\n reportId: string,\n variantId: string,\n executionId: string,\n dataProductDefinitionsPath?: string,\n tableId?: string,\n ): Promise<components['schemas']['StatementExecutionStatus']> {\n this.logInfo('Get status', { reportId, variantId, tableId, executionId })\n\n return this.restClient\n .get({\n path: `/reports/${reportId}/${variantId}/statements/${executionId}/status`,\n token,\n query: {\n dataProductDefinitionsPath,\n tableId,\n },\n })\n .then((response) => <components['schemas']['StatementExecutionStatus']>response)\n }\n\n getAsyncCount(token: string, tableId: string, dataProductDefinitionsPath?: string): Promise<number> {\n this.logInfo('Get count', { tableId })\n\n return this.restClient\n .get({\n path: `/report/tables/${tableId}/count`,\n token,\n query: {\n dataProductDefinitionsPath,\n },\n })\n .then((response) => (<Count>response).count)\n }\n\n getAsyncInteractiveCount(\n token: string,\n tableId: string,\n reportId: string,\n id: string,\n filters: ReportQuery,\n ): Promise<number> {\n this.logInfo('Get interactive count', { tableId, reportId, id })\n\n return this.restClient\n .get({\n path: `/reports/${reportId}/${id}/tables/${tableId}/count`,\n token,\n query: filters.toRecordWithFilterPrefix(true),\n })\n .then((response) => (<Count>response).count)\n }\n\n logInfo(title: string, args?: Dict<string>) {\n logger.info(`Reporting Client: ${title}:`)\n if (args && Object.keys(args).length) logger.info(JSON.stringify(args, null, 2))\n }\n}\n\nexport { ReportingClient }\nexport default ReportingClient\n"],"names":["RestClient","logger"],"mappings":"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"}
|
|
@@ -2,69 +2,11 @@
|
|
|
2
2
|
|
|
3
3
|
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
4
|
|
|
5
|
-
var json2Csv = require('json-2-csv');
|
|
6
5
|
var UserReports = require('../../../types/UserReports.js');
|
|
7
6
|
var localsHelper = require('../../../utils/localsHelper.js');
|
|
8
7
|
var ReportQuery = require('../../../types/ReportQuery.js');
|
|
9
8
|
var logger = require('../../../utils/logger.js');
|
|
10
9
|
|
|
11
|
-
const convertToCsv = (reportData, options) => {
|
|
12
|
-
const csvData = json2Csv.json2csv(reportData, options);
|
|
13
|
-
return csvData;
|
|
14
|
-
};
|
|
15
|
-
const getKeys = (reportData, fields) => {
|
|
16
|
-
const keys = [];
|
|
17
|
-
const keyNames = [];
|
|
18
|
-
reportData.forEach((row) => {
|
|
19
|
-
Object.keys(row).forEach((key) => {
|
|
20
|
-
const field = fields.find((f) => f.name === key);
|
|
21
|
-
if (field && !keyNames.includes(key)) {
|
|
22
|
-
keyNames.push(key);
|
|
23
|
-
keys.push({
|
|
24
|
-
field: key,
|
|
25
|
-
title: field.display,
|
|
26
|
-
});
|
|
27
|
-
}
|
|
28
|
-
});
|
|
29
|
-
});
|
|
30
|
-
return keys;
|
|
31
|
-
};
|
|
32
|
-
const applyColumnsAndSort = (data, columns) => {
|
|
33
|
-
return data.map((row) => {
|
|
34
|
-
return Object.keys(row)
|
|
35
|
-
.filter((key) => columns.includes(key))
|
|
36
|
-
.reduce((obj, key) => {
|
|
37
|
-
// eslint-disable-next-line no-param-reassign
|
|
38
|
-
obj[key] = row[key];
|
|
39
|
-
return obj;
|
|
40
|
-
}, {});
|
|
41
|
-
});
|
|
42
|
-
};
|
|
43
|
-
const removeHtmlTags = (reportData, reportDefinition) => {
|
|
44
|
-
// Find HMTL field + name
|
|
45
|
-
const { specification } = reportDefinition.variant;
|
|
46
|
-
if (specification) {
|
|
47
|
-
const { fields } = specification;
|
|
48
|
-
const htmlFields = fields.filter((field) => {
|
|
49
|
-
return field.type === 'HTML';
|
|
50
|
-
});
|
|
51
|
-
if (htmlFields.length) {
|
|
52
|
-
reportData.map((d) => {
|
|
53
|
-
htmlFields.forEach((field) => {
|
|
54
|
-
const { name } = field;
|
|
55
|
-
const colValue = d[name];
|
|
56
|
-
if (colValue) {
|
|
57
|
-
const innerText = /target="_blank">(.*?)<\/a>/g.exec(colValue);
|
|
58
|
-
// eslint-disable-next-line prefer-destructuring, no-param-reassign
|
|
59
|
-
d[name] = innerText ? innerText[1] : colValue;
|
|
60
|
-
}
|
|
61
|
-
});
|
|
62
|
-
return d;
|
|
63
|
-
});
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
return reportData;
|
|
67
|
-
};
|
|
68
10
|
const streamDownloadAsyncData = async (args) => {
|
|
69
11
|
const { token, services, tableId, reportId, id, queryParams, res } = args;
|
|
70
12
|
const query = {
|
|
@@ -72,75 +14,51 @@ const streamDownloadAsyncData = async (args) => {
|
|
|
72
14
|
};
|
|
73
15
|
return services.reportingService.downloadAsyncReport(token, reportId, id, tableId, query, res);
|
|
74
16
|
};
|
|
75
|
-
const
|
|
76
|
-
const { token, services, queryParams, definition } = args;
|
|
17
|
+
const streamDownloadSyncData = async (args) => {
|
|
18
|
+
const { token, services, queryParams, definition, res } = args;
|
|
77
19
|
const { variant } = definition;
|
|
78
20
|
const { resourceName, specification } = variant;
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
fields: specification.fields,
|
|
83
|
-
template: specification.template,
|
|
84
|
-
queryParams,
|
|
85
|
-
definitionsPath: queryParams.dataProductDefinitionsPath,
|
|
86
|
-
});
|
|
87
|
-
const count = await services.reportingService.getCount(resourceName, token, countReportQuery);
|
|
88
|
-
const dataReportQuery = new ReportQuery.ReportQuery({
|
|
89
|
-
fields: specification.fields,
|
|
90
|
-
template: specification.template,
|
|
91
|
-
queryParams: {
|
|
92
|
-
...queryParams,
|
|
93
|
-
pageSize: count.toString(),
|
|
94
|
-
},
|
|
95
|
-
definitionsPath: queryParams.dataProductDefinitionsPath,
|
|
96
|
-
});
|
|
97
|
-
const reportData = await services.reportingService.getListWithWarnings(resourceName, token, dataReportQuery);
|
|
98
|
-
data = reportData.data;
|
|
21
|
+
if (!specification) {
|
|
22
|
+
logger.default.error(`No specification found for definition ID: ${definition.id} variant ID: ${variant.id}`);
|
|
23
|
+
throw new Error(`No specification found for definition ID: ${definition.id} variant ID: ${variant.id}`);
|
|
99
24
|
}
|
|
100
|
-
|
|
25
|
+
const reportQuery = new ReportQuery.ReportQuery({
|
|
26
|
+
fields: specification.fields,
|
|
27
|
+
template: specification.template,
|
|
28
|
+
queryParams: {
|
|
29
|
+
...queryParams,
|
|
30
|
+
},
|
|
31
|
+
definitionsPath: queryParams.dataProductDefinitionsPath,
|
|
32
|
+
});
|
|
33
|
+
return services.reportingService.downloadSyncReport(token, resourceName, reportQuery, res);
|
|
101
34
|
};
|
|
102
35
|
const downloadReport = async ({ req, services, res, redirect, loadType, }) => {
|
|
103
36
|
const { dprUser, token } = localsHelper.default.getValues(res);
|
|
104
|
-
const { reportId, id, tableId, dataProductDefinitionsPath,
|
|
37
|
+
const { reportId, id, tableId, dataProductDefinitionsPath, cols: columns, sortedAsc, sortColumn } = req.body;
|
|
105
38
|
const { downloadPermissionService } = services;
|
|
106
39
|
const canDownloadReport = await downloadPermissionService.downloadEnabledForReport(dprUser.id, reportId, id);
|
|
107
40
|
if (!canDownloadReport) {
|
|
108
41
|
res.redirect(redirect);
|
|
109
42
|
}
|
|
110
43
|
else {
|
|
111
|
-
const
|
|
112
|
-
const queryParams = {
|
|
44
|
+
const streamDownloadQueryParams = {
|
|
113
45
|
dataProductDefinitionsPath,
|
|
46
|
+
...(columns && { columns: JSON.parse(columns) }),
|
|
114
47
|
...(sortedAsc && { sortedAsc }),
|
|
115
48
|
...(sortColumn && { sortColumn }),
|
|
116
49
|
};
|
|
117
|
-
|
|
50
|
+
const definition = await services.reportingService.getDefinition(token, reportId, id, dataProductDefinitionsPath);
|
|
51
|
+
logger.default.info(`Initiating streaming...`);
|
|
118
52
|
if (loadType === UserReports.LoadType.SYNC) {
|
|
119
|
-
|
|
53
|
+
await streamDownloadSyncData({
|
|
120
54
|
definition,
|
|
121
55
|
services,
|
|
122
56
|
token,
|
|
123
|
-
queryParams,
|
|
57
|
+
queryParams: streamDownloadQueryParams,
|
|
58
|
+
res,
|
|
124
59
|
});
|
|
125
|
-
if (columns) {
|
|
126
|
-
reportData = applyColumnsAndSort(reportData, JSON.parse(columns));
|
|
127
|
-
}
|
|
128
|
-
reportData = removeHtmlTags(reportData, definition);
|
|
129
|
-
const fields = definition.variant.specification?.fields || [];
|
|
130
|
-
const keys = getKeys(reportData, fields);
|
|
131
|
-
const csvData = convertToCsv(reportData, { keys, emptyFieldValue: '' });
|
|
132
|
-
res.setHeader('Content-Type', 'application/json');
|
|
133
|
-
res.setHeader('Content-disposition', `attachment; filename=${reportName}-${name}-${new Date().toISOString()}.csv`);
|
|
134
|
-
res.end(csvData);
|
|
135
60
|
}
|
|
136
61
|
else {
|
|
137
|
-
logger.default.info(`Initiating streaming...`);
|
|
138
|
-
const streamDownloadQueryParams = {
|
|
139
|
-
dataProductDefinitionsPath,
|
|
140
|
-
...(columns && { columns: JSON.parse(columns) }),
|
|
141
|
-
...(sortedAsc && { sortedAsc }),
|
|
142
|
-
...(sortColumn && { sortColumn }),
|
|
143
|
-
};
|
|
144
62
|
await streamDownloadAsyncData({
|
|
145
63
|
services,
|
|
146
64
|
token,
|
|
@@ -155,10 +73,8 @@ const downloadReport = async ({ req, services, res, redirect, loadType, }) => {
|
|
|
155
73
|
};
|
|
156
74
|
var DownloadUtils = {
|
|
157
75
|
downloadReport,
|
|
158
|
-
getKeys,
|
|
159
76
|
};
|
|
160
77
|
|
|
161
78
|
exports.default = DownloadUtils;
|
|
162
79
|
exports.downloadReport = downloadReport;
|
|
163
|
-
exports.getKeys = getKeys;
|
|
164
80
|
//# sourceMappingURL=utils.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","sources":["../../../../../../../../../../../src/dpr/routes/journeys/download-report/utils.ts"],"sourcesContent":["import { Response, Request } from 'express'\nimport { json2csv, Json2CsvOptions } from 'json-2-csv'\nimport { KeysList } from 'json-2-csv/lib/types'\nimport { Services } from '../../../types/Services'\nimport Dict = NodeJS.Dict\nimport { LoadType } from '../../../types/UserReports'\nimport { components } from '../../../types/api'\nimport LocalsHelper from '../../../utils/localsHelper'\nimport { Template } from '../../../types/Templates'\nimport ReportQuery from '../../../types/ReportQuery'\nimport logger from '../../../utils/logger'\n\nconst convertToCsv = (reportData: Dict<string>[], options: Json2CsvOptions) => {\n const csvData = json2csv(reportData, options)\n return csvData\n}\n\nexport const getKeys = (reportData: Dict<string>[], fields: components['schemas']['FieldDefinition'][]): KeysList => {\n const keys: KeysList = []\n const keyNames: string[] = []\n reportData.forEach((row) => {\n Object.keys(row).forEach((key) => {\n const field = fields.find((f) => f.name === key)\n if (field && !keyNames.includes(key)) {\n keyNames.push(key)\n keys.push({\n field: key,\n title: field.display,\n })\n }\n })\n })\n return keys\n}\n\nconst applyColumnsAndSort = (data: Dict<string>[], columns: string[]) => {\n return data.map((row) => {\n return Object.keys(row)\n .filter((key) => columns.includes(key))\n .reduce((obj: Dict<string>, key) => {\n // eslint-disable-next-line no-param-reassign\n obj[key] = row[key]\n return obj\n }, {})\n })\n}\n\nconst removeHtmlTags = (\n reportData: Dict<string>[],\n reportDefinition: components['schemas']['SingleVariantReportDefinition'],\n) => {\n // Find HMTL field + name\n const { specification } = reportDefinition.variant\n if (specification) {\n const { fields } = specification\n const htmlFields = fields.filter((field) => {\n return field.type === 'HTML'\n })\n\n if (htmlFields.length) {\n reportData.map((d) => {\n htmlFields.forEach((field) => {\n const { name } = field\n const colValue = d[name]\n if (colValue) {\n const innerText = /target=\"_blank\">(.*?)<\\/a>/g.exec(colValue)\n // eslint-disable-next-line prefer-destructuring, no-param-reassign\n d[name] = innerText ? innerText[1] : colValue\n }\n })\n return d\n })\n }\n }\n return reportData\n}\n\nconst streamDownloadAsyncData = async (args: {\n services: Services\n token: string\n tableId: string\n reportId: string\n id: string\n queryParams: {\n dataProductDefinitionsPath: string\n columns: string[]\n sortedAsc?: string\n sortColumn?: string\n }\n res: Response\n}) => {\n const { token, services, tableId, reportId, id, queryParams, res } = args\n const query: Record<string, string | string[]> = {\n ...queryParams,\n }\n return services.reportingService.downloadAsyncReport(token, reportId, id, tableId, query, res)\n}\n\nconst downloadSyncData = async (args: {\n definition: components['schemas']['SingleVariantReportDefinition']\n services: Services\n token: string\n queryParams: {\n dataProductDefinitionsPath: string\n sortedAsc?: string\n sortColumn?: string\n }\n}) => {\n const { token, services, queryParams, definition } = args\n const { variant } = definition\n const { resourceName, specification } = variant\n let data: Dict<string>[] = []\n\n if (specification) {\n const countReportQuery = new ReportQuery({\n fields: specification.fields,\n template: specification.template as Template,\n queryParams,\n definitionsPath: <string>queryParams.dataProductDefinitionsPath,\n })\n const count = await services.reportingService.getCount(resourceName, token, countReportQuery)\n\n const dataReportQuery = new ReportQuery({\n fields: specification.fields,\n template: specification.template as Template,\n queryParams: {\n ...queryParams,\n pageSize: count.toString(),\n },\n definitionsPath: <string>queryParams.dataProductDefinitionsPath,\n })\n const reportData = await services.reportingService.getListWithWarnings(resourceName, token, dataReportQuery)\n data = reportData.data\n }\n\n return data\n}\n\nexport const downloadReport = async ({\n req,\n services,\n res,\n redirect,\n loadType,\n}: {\n req: Request\n services: Services\n res: Response\n redirect: string\n loadType?: LoadType\n}) => {\n const { dprUser, token } = LocalsHelper.getValues(res)\n const {\n reportId,\n id,\n tableId,\n dataProductDefinitionsPath,\n reportName,\n name,\n cols: columns,\n sortedAsc,\n sortColumn,\n } = req.body\n const { downloadPermissionService } = services\n const canDownloadReport = await downloadPermissionService.downloadEnabledForReport(dprUser.id, reportId, id)\n\n if (!canDownloadReport) {\n res.redirect(redirect)\n } else {\n const definition = await services.reportingService.getDefinition(token, reportId, id, dataProductDefinitionsPath)\n const queryParams = {\n dataProductDefinitionsPath,\n ...(sortedAsc && { sortedAsc }),\n ...(sortColumn && { sortColumn }),\n }\n\n let reportData\n if (loadType === LoadType.SYNC) {\n reportData = await downloadSyncData({\n definition,\n services,\n token,\n queryParams,\n })\n if (columns) {\n reportData = applyColumnsAndSort(reportData, JSON.parse(columns))\n }\n reportData = removeHtmlTags(reportData, definition)\n const fields = definition.variant.specification?.fields || []\n const keys: KeysList = getKeys(reportData, fields)\n const csvData = convertToCsv(reportData, { keys, emptyFieldValue: '' })\n\n res.setHeader('Content-Type', 'application/json')\n res.setHeader('Content-disposition', `attachment; filename=${reportName}-${name}-${new Date().toISOString()}.csv`)\n res.end(csvData)\n } else {\n logger.info(`Initiating streaming...`)\n const streamDownloadQueryParams = {\n dataProductDefinitionsPath,\n ...(columns && { columns: JSON.parse(columns) }),\n ...(sortedAsc && { sortedAsc }),\n ...(sortColumn && { sortColumn }),\n }\n await streamDownloadAsyncData({\n services,\n token,\n reportId,\n id,\n tableId,\n queryParams: streamDownloadQueryParams,\n res,\n })\n }\n }\n}\n\nexport default {\n downloadReport,\n getKeys,\n}\n"],"names":["json2csv","ReportQuery","LocalsHelper","LoadType","logger"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"utils.js","sources":["../../../../../../../../../../../src/dpr/routes/journeys/download-report/utils.ts"],"sourcesContent":["import { Response, Request } from 'express'\nimport { Services } from '../../../types/Services'\nimport { LoadType } from '../../../types/UserReports'\nimport { components } from '../../../types/api'\nimport LocalsHelper from '../../../utils/localsHelper'\nimport { Template } from '../../../types/Templates'\nimport ReportQuery from '../../../types/ReportQuery'\nimport logger from '../../../utils/logger'\n\nconst streamDownloadAsyncData = async (args: {\n services: Services\n token: string\n tableId: string\n reportId: string\n id: string\n queryParams: {\n dataProductDefinitionsPath: string\n columns: string[]\n sortedAsc?: string\n sortColumn?: string\n }\n res: Response\n}) => {\n const { token, services, tableId, reportId, id, queryParams, res } = args\n const query: Record<string, string | string[]> = {\n ...queryParams,\n }\n return services.reportingService.downloadAsyncReport(token, reportId, id, tableId, query, res)\n}\n\nconst streamDownloadSyncData = async (args: {\n definition: components['schemas']['SingleVariantReportDefinition']\n services: Services\n token: string\n queryParams: {\n dataProductDefinitionsPath: string\n sortedAsc?: string\n sortColumn?: string\n columns: string\n }\n res: Response\n}) => {\n const { token, services, queryParams, definition, res } = args\n const { variant } = definition\n const { resourceName, specification } = variant\n if (!specification) {\n logger.error(`No specification found for definition ID: ${definition.id} variant ID: ${variant.id}`)\n throw new Error(`No specification found for definition ID: ${definition.id} variant ID: ${variant.id}`)\n }\n const reportQuery = new ReportQuery({\n fields: specification.fields,\n template: specification.template as Template,\n queryParams: {\n ...queryParams,\n },\n definitionsPath: <string>queryParams.dataProductDefinitionsPath,\n })\n return services.reportingService.downloadSyncReport(token, resourceName, reportQuery, res)\n}\n\nexport const downloadReport = async ({\n req,\n services,\n res,\n redirect,\n loadType,\n}: {\n req: Request\n services: Services\n res: Response\n redirect: string\n loadType?: LoadType\n}) => {\n const { dprUser, token } = LocalsHelper.getValues(res)\n const { reportId, id, tableId, dataProductDefinitionsPath, cols: columns, sortedAsc, sortColumn } = req.body\n const { downloadPermissionService } = services\n const canDownloadReport = await downloadPermissionService.downloadEnabledForReport(dprUser.id, reportId, id)\n\n if (!canDownloadReport) {\n res.redirect(redirect)\n } else {\n const streamDownloadQueryParams = {\n dataProductDefinitionsPath,\n ...(columns && { columns: JSON.parse(columns) }),\n ...(sortedAsc && { sortedAsc }),\n ...(sortColumn && { sortColumn }),\n }\n const definition = await services.reportingService.getDefinition(token, reportId, id, dataProductDefinitionsPath)\n logger.info(`Initiating streaming...`)\n if (loadType === LoadType.SYNC) {\n await streamDownloadSyncData({\n definition,\n services,\n token,\n queryParams: streamDownloadQueryParams,\n res,\n })\n } else {\n await streamDownloadAsyncData({\n services,\n token,\n reportId,\n id,\n tableId,\n queryParams: streamDownloadQueryParams,\n res,\n })\n }\n }\n}\n\nexport default {\n downloadReport,\n}\n"],"names":["logger","ReportQuery","LocalsHelper","LoadType"],"mappings":"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"}
|
|
@@ -18,6 +18,7 @@ var localsHelper = require('../../../../../utils/localsHelper.js');
|
|
|
18
18
|
var filtersTypeEnum = require('../../../../../components/_filters/filtersTypeEnum.js');
|
|
19
19
|
var _enum = require('../../../../../components/_filters/filter-input/enum.js');
|
|
20
20
|
var featureFlagsHelper = require('../../../../../utils/featureFlagsHelper.js');
|
|
21
|
+
var validate = require('./validate.js');
|
|
21
22
|
|
|
22
23
|
const setDashboardActions = (dashboardDefinition, reportDefinition, requestData) => {
|
|
23
24
|
const reportName = reportDefinition.name;
|
|
@@ -54,6 +55,8 @@ const getDefinitionData = async ({ req, res, services, queryData, }) => {
|
|
|
54
55
|
const dataProductDefinitionsPath = req.query['dataProductDefinitionsPath'];
|
|
55
56
|
// Dashboard Definition,
|
|
56
57
|
const dashboardDefinition = await services.dashboardService.getDefinition(token, reportId, id, dataProductDefinitionsPath, queryData);
|
|
58
|
+
// Validate definition
|
|
59
|
+
validate.DashboardSchema.parse(dashboardDefinition);
|
|
57
60
|
// Report summary data
|
|
58
61
|
const reportDefinition = await definitionUtils.default.getReportSummary(reportId, services.reportingService, token, dataProductDefinitionsPath);
|
|
59
62
|
// Get the filters
|