@ministryofjustice/hmpps-digital-prison-reporting-frontend 5.2.2 → 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.
Files changed (116) hide show
  1. package/README.md +26 -3
  2. package/_networkMocks/dashboard/data/complete-data/data.d.ts +6 -6
  3. package/_networkMocks/dashboard/definitions/visualisations/complete-dataset/bar/vis-definitions/cols-as-labels.d.ts +4 -4
  4. package/_networkMocks/dashboard/definitions/visualisations/complete-dataset/doughnut/vis-definitions/definitions.d.ts +12 -12
  5. package/_networkMocks/dashboard/definitions/visualisations/complete-dataset/line-timeseries/vis-definitions/defintitions.d.ts +6 -6
  6. package/_networkMocks/dashboard/definitions/visualisations/complete-dataset/list/definition-invalid-vis-defs.d.ts +2 -0
  7. package/_networkMocks/dashboard/definitions/visualisations/complete-dataset/list/definition-invalid.d.ts +2 -0
  8. package/_networkMocks/dashboard/definitions/visualisations/complete-dataset/list/vis-definitions/historic.d.ts +3 -3
  9. package/_networkMocks/dashboard/definitions/visualisations/complete-dataset/list/vis-definitions/invalid.d.ts +2 -0
  10. package/_networkMocks/dashboard/definitions/visualisations/complete-dataset/list/vis-definitions/rows-as-list.d.ts +3 -3
  11. package/_networkMocks/dashboard/definitions/visualisations/complete-dataset/matrix/vis-definitions/definitions.d.ts +1 -1
  12. package/_networkMocks/dashboard/definitions/visualisations/complete-dataset/scorecard/vis-definitions/definitions-buckets.d.ts +6 -6
  13. package/_networkMocks/dashboard/definitions/visualisations/complete-dataset/scorecard/vis-definitions/definitions.d.ts +7 -7
  14. package/_networkMocks/dashboard/definitions/visualisations/complete-dataset/scorecardGroup/vis-definitions/definitions.d.ts +6 -6
  15. package/_networkMocks/dashboard/definitions/visualisations/mocks.d.ts +34 -0
  16. package/_networkMocks/dashboard/definitions/visualisations/partial-dataset/line-timeseries/vis-definitions/definitions.d.ts +5 -5
  17. package/_networkMocks/dashboard/definitions/visualisations/partial-dataset/list/vis-definitions/historic.d.ts +4 -4
  18. package/_networkMocks/dashboard/definitions/visualisations/partial-dataset/matrix/vis-definitions/definitions.d.ts +1 -1
  19. package/_networkMocks/report/mocks.d.ts +15 -0
  20. package/cjs/dpr/components/_charts/chart/bar/BarChart.js +24 -14
  21. package/cjs/dpr/components/_charts/chart/bar/BarChart.js.map +1 -1
  22. package/cjs/dpr/components/_dashboards/dashboard-list/utils.js +2 -0
  23. package/cjs/dpr/components/_dashboards/dashboard-list/utils.js.map +1 -1
  24. package/cjs/dpr/components/_dashboards/dashboard-list/validate.js +23 -0
  25. package/cjs/dpr/components/_dashboards/dashboard-list/validate.js.map +1 -0
  26. package/cjs/dpr/components/_dashboards/dashboard-visualisation/Validate.js +13 -4
  27. package/cjs/dpr/components/_dashboards/dashboard-visualisation/Validate.js.map +1 -1
  28. package/cjs/dpr/data/reportingClient.js +8 -0
  29. package/cjs/dpr/data/reportingClient.js.map +1 -1
  30. package/cjs/dpr/routes/journeys/download-report/utils.js +22 -106
  31. package/cjs/dpr/routes/journeys/download-report/utils.js.map +1 -1
  32. package/cjs/dpr/routes/journeys/view-report/async/dashboard/utils.js +3 -0
  33. package/cjs/dpr/routes/journeys/view-report/async/dashboard/utils.js.map +1 -1
  34. package/cjs/dpr/routes/journeys/view-report/async/dashboard/validate.js +26 -0
  35. package/cjs/dpr/routes/journeys/view-report/async/dashboard/validate.js.map +1 -0
  36. package/cjs/dpr/services/featureFlagService.js +2 -0
  37. package/cjs/dpr/services/featureFlagService.js.map +1 -1
  38. package/cjs/dpr/services/reportingService.js +3 -0
  39. package/cjs/dpr/services/reportingService.js.map +1 -1
  40. package/cjs/dpr/utils/ErrorHandler.js +11 -11
  41. package/cjs/dpr/utils/ErrorHandler.js.map +1 -1
  42. package/cjs/dpr/utils/datasetHelper.js +13 -0
  43. package/cjs/dpr/utils/datasetHelper.js.map +1 -1
  44. package/cypress-tests/mockApis/dashboards.d.ts +2 -0
  45. package/cypress-tests/mockApis/reporting.d.ts +1 -0
  46. package/dpr/components/_charts/chart/bar/BarChart.js +24 -14
  47. package/dpr/components/_charts/chart/bar/BarChart.js.map +1 -1
  48. package/dpr/components/_charts/chart-card/view.njk +1 -0
  49. package/dpr/components/_dashboards/dashboard-list/utils.js +2 -0
  50. package/dpr/components/_dashboards/dashboard-list/utils.js.map +1 -1
  51. package/dpr/components/_dashboards/dashboard-list/validate.js +21 -0
  52. package/dpr/components/_dashboards/dashboard-list/validate.js.map +1 -0
  53. package/dpr/components/_dashboards/dashboard-visualisation/Validate.js +11 -5
  54. package/dpr/components/_dashboards/dashboard-visualisation/Validate.js.map +1 -1
  55. package/dpr/data/reportingClient.d.ts +1 -0
  56. package/dpr/data/reportingClient.js +8 -0
  57. package/dpr/data/reportingClient.js.map +1 -1
  58. package/dpr/routes/journeys/download-report/request-download/form/form.njk +1 -1
  59. package/dpr/routes/journeys/download-report/utils.js +23 -106
  60. package/dpr/routes/journeys/download-report/utils.js.map +1 -1
  61. package/dpr/routes/journeys/view-report/async/dashboard/utils.js +3 -0
  62. package/dpr/routes/journeys/view-report/async/dashboard/utils.js.map +1 -1
  63. package/dpr/routes/journeys/view-report/async/dashboard/validate.js +24 -0
  64. package/dpr/routes/journeys/view-report/async/dashboard/validate.js.map +1 -0
  65. package/dpr/services/featureFlagService.js +2 -0
  66. package/dpr/services/featureFlagService.js.map +1 -1
  67. package/dpr/services/reportingService.d.ts +1 -0
  68. package/dpr/services/reportingService.js +3 -0
  69. package/dpr/services/reportingService.js.map +1 -1
  70. package/dpr/utils/ErrorHandler.js +11 -11
  71. package/dpr/utils/ErrorHandler.js.map +1 -1
  72. package/dpr/utils/datasetHelper.js +13 -1
  73. package/dpr/utils/datasetHelper.js.map +1 -1
  74. package/package.json +1 -2
  75. package/playwright.config.d.ts +9 -0
  76. package/src/dpr/components/_charts/chart/bar/BarChart.d.ts +1 -0
  77. package/src/dpr/components/_charts/chart/bar/validate.d.ts +2 -2
  78. package/src/dpr/components/_charts/chart/bar-timeseries/validate.d.ts +2 -2
  79. package/src/dpr/components/_charts/chart/doughnut/validate.d.ts +2 -2
  80. package/src/dpr/components/_charts/chart/line/validate.d.ts +2 -2
  81. package/src/dpr/components/_charts/chart/line-timeseries/validate.d.ts +2 -2
  82. package/src/dpr/components/_dashboards/dashboard-list/validate.d.ts +4 -4
  83. package/src/dpr/components/_dashboards/dashboard-visualisation/Validate.d.ts +24 -16
  84. package/src/dpr/components/_dashboards/scorecard-group/validate.d.ts +2 -2
  85. package/src/dpr/data/reportingClient.d.ts +1 -0
  86. package/src/dpr/routes/journeys/download-report/sync-tests.cy.d.ts +1 -0
  87. package/src/dpr/routes/journeys/download-report/utils.d.ts +0 -5
  88. package/src/dpr/routes/journeys/view-report/async/dashboard/utils.d.ts +4 -4
  89. package/src/dpr/routes/journeys/view-report/async/dashboard/validate.d.ts +122 -0
  90. package/src/dpr/routes/journeys/view-report/async/report/utils.d.ts +2 -2
  91. package/src/dpr/routes/journeys/view-report/sync/dashboard/utils.d.ts +4 -4
  92. package/src/dpr/routes/journeys/view-report/sync/report/utils.d.ts +4 -4
  93. package/src/dpr/services/reportingService.d.ts +1 -0
  94. package/src/dpr/utils/datasetHelper.d.ts +2 -0
  95. package/src/dpr/utils/localsHelper.d.ts +38 -24
  96. package/test-app/mocks/mockClients/dashboards/data/age-breakdown/data.d.ts +8 -8
  97. package/test-app/mocks/mockClients/dashboards/data/data-quality-metrics/data.d.ts +6 -6
  98. package/test-app/mocks/mockClients/dashboards/definitions/age-breakdown/visualisations/chart-definitions.d.ts +2 -2
  99. package/test-app/mocks/mockClients/dashboards/definitions/age-breakdown/visualisations/index.d.ts +10 -10
  100. package/test-app/mocks/mockClients/dashboards/definitions/age-breakdown/visualisations/list-definitions-1.d.ts +4 -4
  101. package/test-app/mocks/mockClients/dashboards/definitions/age-breakdown/visualisations/list-definitions.d.ts +7 -7
  102. package/test-app/mocks/mockClients/dashboards/definitions/age-breakdown/visualisations/scorecard-definitions.d.ts +1 -1
  103. package/test-app/mocks/mockClients/dashboards/definitions/data-quality/chart-data.d.ts +2 -2
  104. package/test-app/mocks/mockClients/dashboards/definitions/data-quality/visualisations/chart-definitions.d.ts +8 -8
  105. package/test-app/mocks/mockClients/dashboards/definitions/data-quality/visualisations/index.d.ts +15 -15
  106. package/test-app/mocks/mockClients/dashboards/definitions/data-quality/visualisations/scorecard-definitions.d.ts +7 -7
  107. package/test-app/mocks/mockClients/dashboards/definitions/examples/visualisations/bar.d.ts +3 -3
  108. package/test-app/mocks/mockClients/dashboards/definitions/examples/visualisations/charts.d.ts +19 -19
  109. package/test-app/mocks/mockClients/dashboards/definitions/examples/visualisations/doughnut.d.ts +4 -4
  110. package/test-app/mocks/mockClients/dashboards/definitions/examples/visualisations/line.d.ts +2 -2
  111. package/test-app/mocks/mockClients/dashboards/definitions/examples/visualisations/lists.d.ts +11 -11
  112. package/test-app/mocks/mockClients/dashboards/definitions/examples/visualisations/scorecard.d.ts +13 -13
  113. package/test-app/mocks/mockClients/dashboards/definitions/examples/visualisations/scorecards.d.ts +6 -6
  114. package/src/dpr/components/card-group/utils.d.ts +0 -24
  115. /package/src/dpr/components/{card-group/utils.test.d.ts → _dashboards/visual-regression-tests/bar-chart-complete-dataset.spec.d.ts} +0 -0
  116. /package/src/dpr/routes/journeys/download-report/{tests.cy.d.ts → async-tests.cy.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-test-app`. This builds the NPM package and starts the server at http://localhost:3010.
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
- ## Running and testing local builds
29
- To run the app in dev mode, use `start:dev` 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:
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 {
@@ -12,22 +12,22 @@ export declare const completeDataSet: {
12
12
  establishment_id: {
13
13
  raw: string;
14
14
  };
15
- has_ethnicity: {
15
+ has_metric_one: {
16
16
  raw: number;
17
17
  };
18
- ethnicity_is_missing: {
18
+ metric_one_is_missing: {
19
19
  raw: number;
20
20
  };
21
- has_nationality: {
21
+ has_metric_two: {
22
22
  raw: number;
23
23
  };
24
- nationality_is_missing: {
24
+ metric_two_is_missing: {
25
25
  raw: number;
26
26
  };
27
- has_religion: {
27
+ has_metric_three: {
28
28
  raw: number;
29
29
  };
30
- religion_is_missing: {
30
+ metric_three_is_missing: {
31
31
  raw: number;
32
32
  };
33
33
  }[][];
@@ -1,7 +1,7 @@
1
1
  import { components } from '../../../../../../../src/dpr/types/api';
2
- export declare const dataQualityEthnicityBar: components['schemas']['DashboardVisualisationDefinition'];
3
- export declare const dataQualityEthnicityBarHorizontal: components['schemas']['DashboardVisualisationDefinition'];
4
- export declare const dataQualityReligionBar: components['schemas']['DashboardVisualisationDefinition'];
5
- export declare const dataQualityNationalityBar: components['schemas']['DashboardVisualisationDefinition'];
2
+ export declare const dataQualityMetricOneBar: components['schemas']['DashboardVisualisationDefinition'];
3
+ export declare const dataQualityMetricOneBarHorizontal: components['schemas']['DashboardVisualisationDefinition'];
4
+ export declare const dataQualityMetricThreeBar: components['schemas']['DashboardVisualisationDefinition'];
5
+ export declare const dataQualityMetricTwoBar: components['schemas']['DashboardVisualisationDefinition'];
6
6
  export declare const dataQualityAllBar: components['schemas']['DashboardVisualisationDefinition'];
7
7
  export declare const dataQualityAllBarHorizontal: components['schemas']['DashboardVisualisationDefinition'];
@@ -1,13 +1,13 @@
1
1
  import { components } from '../../../../../../../src/dpr/types/api';
2
- export declare const dataQualityEthnicityDoughnut: components['schemas']['DashboardVisualisationDefinition'];
3
- export declare const dataQualityReligionDoughnut: components['schemas']['DashboardVisualisationDefinition'];
4
- export declare const dataQualityNationalityDoughnut: components['schemas']['DashboardVisualisationDefinition'];
5
- export declare const dataQualityNationalityReligionDoughnut: components['schemas']['DashboardVisualisationDefinition'];
6
- export declare const dataQualityEthnicityDoughnutTwoEst: components['schemas']['DashboardVisualisationDefinition'];
7
- export declare const dataQualityReligionDoughnutTwoEst: components['schemas']['DashboardVisualisationDefinition'];
8
- export declare const dataQualityNationalityDoughnutTwoEst: components['schemas']['DashboardVisualisationDefinition'];
9
- export declare const dataQualityNationalityReligionDoughnutTwoEst: components['schemas']['DashboardVisualisationDefinition'];
10
- export declare const dataQualityEthnicityDoughnutAllEst: components['schemas']['DashboardVisualisationDefinition'];
11
- export declare const dataQualityReligionDoughnutAllEst: components['schemas']['DashboardVisualisationDefinition'];
12
- export declare const dataQualityNationalityDoughnutAllEst: components['schemas']['DashboardVisualisationDefinition'];
13
- export declare const dataQualityNationalityReligionDoughnutAllEst: components['schemas']['DashboardVisualisationDefinition'];
2
+ export declare const dataQualityMetricOneDoughnut: components['schemas']['DashboardVisualisationDefinition'];
3
+ export declare const dataQualityMetricThreeDoughnut: components['schemas']['DashboardVisualisationDefinition'];
4
+ export declare const dataQualityMetricTwoDoughnut: components['schemas']['DashboardVisualisationDefinition'];
5
+ export declare const dataQualityMetricTwoMetricThreeDoughnut: components['schemas']['DashboardVisualisationDefinition'];
6
+ export declare const dataQualityMetricOneDoughnutTwoEst: components['schemas']['DashboardVisualisationDefinition'];
7
+ export declare const dataQualityMetricThreeDoughnutTwoEst: components['schemas']['DashboardVisualisationDefinition'];
8
+ export declare const dataQualityMetricTwoDoughnutTwoEst: components['schemas']['DashboardVisualisationDefinition'];
9
+ export declare const dataQualityMetricTwoMetricThreeDoughnutTwoEst: components['schemas']['DashboardVisualisationDefinition'];
10
+ export declare const dataQualityMetricOneDoughnutAllEst: components['schemas']['DashboardVisualisationDefinition'];
11
+ export declare const dataQualityMetricThreeDoughnutAllEst: components['schemas']['DashboardVisualisationDefinition'];
12
+ export declare const dataQualityMetricTwoDoughnutAllEst: components['schemas']['DashboardVisualisationDefinition'];
13
+ export declare const dataQualityMetricTwoMetricThreeDoughnutAllEst: components['schemas']['DashboardVisualisationDefinition'];
@@ -1,7 +1,7 @@
1
1
  import { components } from '../../../../../../../src/dpr/types/api';
2
- export declare const mockEthnicityLineChartTimeseries: components['schemas']['DashboardVisualisationDefinition'];
3
- export declare const mockNationalityLineChartTimeseries: components['schemas']['DashboardVisualisationDefinition'];
4
- export declare const mockReligionLineChartTimeseries: components['schemas']['DashboardVisualisationDefinition'];
5
- export declare const mockEthnicityLineChartTimeseriesAllEst: components['schemas']['DashboardVisualisationDefinition'];
6
- export declare const mockNationalityLineChartTimeseriesAllEst: components['schemas']['DashboardVisualisationDefinition'];
7
- export declare const mockReligionLineChartTimeseriesAllEst: components['schemas']['DashboardVisualisationDefinition'];
2
+ export declare const mockMetricOneLineChartTimeseries: components['schemas']['DashboardVisualisationDefinition'];
3
+ export declare const mockMetricTwoLineChartTimeseries: components['schemas']['DashboardVisualisationDefinition'];
4
+ export declare const mockMetricThreeLineChartTimeseries: components['schemas']['DashboardVisualisationDefinition'];
5
+ export declare const mockMetricOneLineChartTimeseriesAllEst: components['schemas']['DashboardVisualisationDefinition'];
6
+ export declare const mockMetricTwoLineChartTimeseriesAllEst: components['schemas']['DashboardVisualisationDefinition'];
7
+ export declare const mockMetricThreeLineChartTimeseriesAllEst: components['schemas']['DashboardVisualisationDefinition'];
@@ -0,0 +1,2 @@
1
+ import { components } from '../../../../../../src/dpr/types/api';
2
+ export declare const definition: components['schemas']['DashboardDefinition'];
@@ -0,0 +1,2 @@
1
+ import { components } from '../../../../../../src/dpr/types/api';
2
+ export declare const definition: components['schemas']['DashboardDefinition'];
@@ -1,4 +1,4 @@
1
1
  import { components } from '../../../../../../../src/dpr/types/api';
2
- export declare const dataQualityEthnicityHistoric: components['schemas']['DashboardVisualisationDefinition'];
3
- export declare const dataQualityReligionHistoric: components['schemas']['DashboardVisualisationDefinition'];
4
- export declare const dataQualityNationalityHistoric: components['schemas']['DashboardVisualisationDefinition'];
2
+ export declare const dataQualityMetricOneHistoric: components['schemas']['DashboardVisualisationDefinition'];
3
+ export declare const dataQualityMetricThreeHistoric: components['schemas']['DashboardVisualisationDefinition'];
4
+ export declare const dataQualityMetricTwoHistoric: components['schemas']['DashboardVisualisationDefinition'];
@@ -0,0 +1,2 @@
1
+ import { components } from '../../../../../../../src/dpr/types/api';
2
+ export declare const invalidDefinition: components['schemas']['DashboardVisualisationDefinition'];
@@ -1,4 +1,4 @@
1
1
  import { components } from '../../../../../../../src/dpr/types/api';
2
- export declare const dataQualityEthnicity: components['schemas']['DashboardVisualisationDefinition'];
3
- export declare const dataQualityReligion: components['schemas']['DashboardVisualisationDefinition'];
4
- export declare const dataQualityNationality: components['schemas']['DashboardVisualisationDefinition'];
2
+ export declare const dataQualityMetricOne: components['schemas']['DashboardVisualisationDefinition'];
3
+ export declare const dataQualityMetricThree: components['schemas']['DashboardVisualisationDefinition'];
4
+ export declare const dataQualityMetricTwo: components['schemas']['DashboardVisualisationDefinition'];
@@ -1,2 +1,2 @@
1
1
  import { components } from '../../../../../../../src/dpr/types/api';
2
- export declare const dataQualityHasNationalityOvertime: components['schemas']['DashboardVisualisationDefinition'];
2
+ export declare const dataQualityHasMetricTwoOvertime: components['schemas']['DashboardVisualisationDefinition'];
@@ -1,7 +1,7 @@
1
1
  import { components } from '../../../../../../../src/dpr/types/api';
2
- export declare const simpleScorecardCustomBucketsNationality: components['schemas']['DashboardVisualisationDefinition'];
3
- export declare const simpleScorecardCustomBucketsEthnicity: components['schemas']['DashboardVisualisationDefinition'];
4
- export declare const simpleScorecardCustomBucketsReligion: components['schemas']['DashboardVisualisationDefinition'];
5
- export declare const simpleScorecardCustomBucketsBoundariesReligion: components['schemas']['DashboardVisualisationDefinition'];
6
- export declare const simpleScorecardCustomBucketsBoundariesNationality: components['schemas']['DashboardVisualisationDefinition'];
7
- export declare const simpleScorecardCustomBucketsBoundariesEthnicity: components['schemas']['DashboardVisualisationDefinition'];
2
+ export declare const simpleScorecardCustomBucketsMetricTwo: components['schemas']['DashboardVisualisationDefinition'];
3
+ export declare const simpleScorecardCustomBucketsMetricOne: components['schemas']['DashboardVisualisationDefinition'];
4
+ export declare const simpleScorecardCustomBucketsMetricThree: components['schemas']['DashboardVisualisationDefinition'];
5
+ export declare const simpleScorecardCustomBucketsBoundariesMetricThree: components['schemas']['DashboardVisualisationDefinition'];
6
+ export declare const simpleScorecardCustomBucketsBoundariesMetricTwo: components['schemas']['DashboardVisualisationDefinition'];
7
+ export declare const simpleScorecardCustomBucketsBoundariesMetricOne: components['schemas']['DashboardVisualisationDefinition'];
@@ -1,8 +1,8 @@
1
1
  import { components } from '../../../../../../../src/dpr/types/api';
2
- export declare const simpleScorecardNationality: components['schemas']['DashboardVisualisationDefinition'];
3
- export declare const simpleScorecardNationalityFilter: components['schemas']['DashboardVisualisationDefinition'];
4
- export declare const simpleScorecardReligion: components['schemas']['DashboardVisualisationDefinition'];
5
- export declare const simpleScorecardEthnicity: components['schemas']['DashboardVisualisationDefinition'];
6
- export declare const simpleScorecardRagColoursNationality: components['schemas']['DashboardVisualisationDefinition'];
7
- export declare const simpleScorecardRagColoursReligion: components['schemas']['DashboardVisualisationDefinition'];
8
- export declare const simpleScorecardRagColoursEthnicity: components['schemas']['DashboardVisualisationDefinition'];
2
+ export declare const simpleScorecardMetricTwo: components['schemas']['DashboardVisualisationDefinition'];
3
+ export declare const simpleScorecardMetricTwoFilter: components['schemas']['DashboardVisualisationDefinition'];
4
+ export declare const simpleScorecardMetricThree: components['schemas']['DashboardVisualisationDefinition'];
5
+ export declare const simpleScorecardMetricOne: components['schemas']['DashboardVisualisationDefinition'];
6
+ export declare const simpleScorecardRagColoursMetricTwo: components['schemas']['DashboardVisualisationDefinition'];
7
+ export declare const simpleScorecardRagColoursMetricThree: components['schemas']['DashboardVisualisationDefinition'];
8
+ export declare const simpleScorecardRagColoursMetricOne: components['schemas']['DashboardVisualisationDefinition'];
@@ -1,8 +1,8 @@
1
1
  import { components } from '../../../../../../../src/dpr/types/api';
2
- export declare const dataQualityAllEstablishmentsEthnicity: components['schemas']['DashboardVisualisationDefinition'];
3
- export declare const dataQualityAllEstablishmentsNoEthnicity: components['schemas']['DashboardVisualisationDefinition'];
4
- export declare const dataQualityAllEstablishmentsReligion: components['schemas']['DashboardVisualisationDefinition'];
5
- export declare const dataQualityAllEstablishmentsNoReligion: components['schemas']['DashboardVisualisationDefinition'];
6
- export declare const dataQualityAllEstablishmentsNationality: components['schemas']['DashboardVisualisationDefinition'];
7
- export declare const dataQualityAllEstablishmentsNoNationality: components['schemas']['DashboardVisualisationDefinition'];
2
+ export declare const dataQualityAllEstablishmentsMetricOne: components['schemas']['DashboardVisualisationDefinition'];
3
+ export declare const dataQualityAllEstablishmentsNoMetricOne: components['schemas']['DashboardVisualisationDefinition'];
4
+ export declare const dataQualityAllEstablishmentsMetricThree: components['schemas']['DashboardVisualisationDefinition'];
5
+ export declare const dataQualityAllEstablishmentsNoMetricThree: components['schemas']['DashboardVisualisationDefinition'];
6
+ export declare const dataQualityAllEstablishmentsMetricTwo: components['schemas']['DashboardVisualisationDefinition'];
7
+ export declare const dataQualityAllEstablishmentsNoMetricTwo: components['schemas']['DashboardVisualisationDefinition'];
8
8
  export declare const dataQualityAllCols: components['schemas']['DashboardVisualisationDefinition'];
@@ -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: {
@@ -1,8 +1,8 @@
1
1
  import { components } from '../../../../../../../src/dpr/types/api';
2
2
  export declare const dietTotalsOverTime: components['schemas']['DashboardVisualisationDefinition'];
3
3
  export declare const dietTotalsByEstablishmentOverTime: components['schemas']['DashboardVisualisationDefinition'];
4
- export declare const dietTotalsVegetarianOvertime: components['schemas']['DashboardVisualisationDefinition'];
5
- export declare const dietTotalsVeganOvertime: components['schemas']['DashboardVisualisationDefinition'];
6
- export declare const dietTotalsVegetarianOvertimeByEstLine: components['schemas']['DashboardVisualisationDefinition'];
7
- export declare const dietTotalsVegetarianOvertimeByEstByWingLine: components['schemas']['DashboardVisualisationDefinition'];
8
- export declare const dietTotalsVegetarianOvertimeByEstByWingAndCellLine: components['schemas']['DashboardVisualisationDefinition'];
4
+ export declare const dietTotalsDietOneOvertime: components['schemas']['DashboardVisualisationDefinition'];
5
+ export declare const dietTotalsDietThreeOvertime: components['schemas']['DashboardVisualisationDefinition'];
6
+ export declare const dietTotalsDietOneOvertimeByEstLine: components['schemas']['DashboardVisualisationDefinition'];
7
+ export declare const dietTotalsDietOneOvertimeByEstByWingLine: components['schemas']['DashboardVisualisationDefinition'];
8
+ export declare const dietTotalsDietOneOvertimeByEstByWingAndCellLine: components['schemas']['DashboardVisualisationDefinition'];
@@ -3,9 +3,9 @@ export declare const dietTotalsOverTime: components['schemas']['DashboardVisuali
3
3
  export declare const dietTotalsByEstablishmentOverTime: components['schemas']['DashboardVisualisationDefinition'];
4
4
  export declare const dietTotalsByEstablishmentByWingOverTime: components['schemas']['DashboardVisualisationDefinition'];
5
5
  export declare const dietTotalsByEstablishmentByWingOverTimeOptional: components['schemas']['DashboardVisualisationDefinition'];
6
- export declare const dietTotalsVegetarianOvertime: components['schemas']['DashboardVisualisationDefinition'];
7
- export declare const dietTotalsVegetarianOvertimeByEst: components['schemas']['DashboardVisualisationDefinition'];
8
- export declare const dietTotalsVegetarianOvertimeByEstByWing: components['schemas']['DashboardVisualisationDefinition'];
9
- export declare const dietTotalsVeganOvertime: components['schemas']['DashboardVisualisationDefinition'];
6
+ export declare const dietTotalsDietOneOvertime: components['schemas']['DashboardVisualisationDefinition'];
7
+ export declare const dietTotalsDietOneOvertimeByEst: components['schemas']['DashboardVisualisationDefinition'];
8
+ export declare const dietTotalsDietOneOvertimeByEstByWing: components['schemas']['DashboardVisualisationDefinition'];
9
+ export declare const dietTotalsDietThreeOvertime: components['schemas']['DashboardVisualisationDefinition'];
10
10
  export declare const dietTotalsAllDietOvertime: components['schemas']['DashboardVisualisationDefinition'];
11
11
  export declare const dietTotalsAllDietOvertimeByEst: components['schemas']['DashboardVisualisationDefinition'];
@@ -1,2 +1,2 @@
1
1
  import { components } from '../../../../../../../src/dpr/types/api';
2
- export declare const dietTotalsVegetarianOvertime: components['schemas']['DashboardVisualisationDefinition'];
2
+ export declare const dietTotalsDietOneOvertime: components['schemas']['DashboardVisualisationDefinition'];
@@ -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: {
@@ -113,10 +113,11 @@ class BarChart extends Chart.Chart {
113
113
  initListData = () => {
114
114
  this.xAxisColumn = this.measures.find((col) => col.axis === 'x');
115
115
  this.yAxisColumn = this.measures.find((col) => col.axis === 'y');
116
- this.groupKey = (datasetHelper.default.getGroupKey(this.responseData, this.keys));
117
- this.groupsData = this.groupKey
118
- ? datasetHelper.default.groupRowsByKey(this.responseData, this.groupKey.id)
119
- : [this.responseData];
116
+ this.groupKey = this.keys.map((key) => key.id);
117
+ this.groupsData =
118
+ this.groupKey && this.groupKey.length
119
+ ? datasetHelper.default.groupRowsBy(this.responseData, this.groupKey)
120
+ : [this.responseData];
120
121
  };
121
122
  createListDatasets = () => {
122
123
  this.hexColours = new ChartColours.ChartColours().getHexPallette();
@@ -134,15 +135,7 @@ class BarChart extends Chart.Chart {
134
135
  data[dataIndex] = Number(raw);
135
136
  }
136
137
  });
137
- let label = '';
138
- if (this.groupKey) {
139
- const groupKeyId = this.groupKey.id;
140
- const groupRow = groupData[0];
141
- label = groupRow && groupRow[groupKeyId] ? `${groupRow[groupKeyId].raw}` : '';
142
- }
143
- else {
144
- label = this.yAxisColumn?.display || label;
145
- }
138
+ const label = this.createGroupLabel(groupData);
146
139
  return {
147
140
  label,
148
141
  data,
@@ -151,14 +144,31 @@ class BarChart extends Chart.Chart {
151
144
  };
152
145
  });
153
146
  };
147
+ createGroupLabel = (group) => {
148
+ if (this.groupKey && this.groupKey.length) {
149
+ const firstRow = group[0];
150
+ return this.groupKey
151
+ ? this.groupKey
152
+ .map((id) => {
153
+ const key = this.keys.find((k) => k.id === 'id');
154
+ const label = key && key.display ? `${key.display}:` : '';
155
+ const value = firstRow[id]?.raw ?? '';
156
+ return `${label}${value}`;
157
+ })
158
+ .join(' - ')
159
+ : '';
160
+ }
161
+ return this.yAxisColumn?.display || '';
162
+ };
154
163
  createListLabels = () => {
155
- this.labels = this.groupsData.flatMap((gd) => {
164
+ const allLabels = this.groupsData.flatMap((gd) => {
156
165
  const id = this.xAxisColumn?.id || '';
157
166
  return gd.map((row) => {
158
167
  const field = row[id];
159
168
  return field ? `${field.raw}` : '';
160
169
  });
161
170
  });
171
+ this.labels = Array.from(new Set(allLabels));
162
172
  };
163
173
  }
164
174
 
@@ -1 +1 @@
1
- {"version":3,"file":"BarChart.js","sources":["../../../../../../../../../../../../src/dpr/components/_charts/chart/bar/BarChart.ts"],"sourcesContent":["/* eslint-disable prefer-destructuring */\nimport { DashboardDataResponse } from '../../../../types/Metrics'\nimport {\n DashboardVisualisationType,\n DashboardVisualisationData,\n DashboardVisualisationDataSet,\n VisualisationDefinitionKey,\n} from '../../../_dashboards/dashboard-visualisation/types'\nimport { components } from '../../../../types/api'\nimport DatasetHelper from '../../../../utils/datasetHelper'\nimport Chart from '../Chart'\nimport BarChartSchemas from './validate'\nimport { BarDefinitionMeasure, BarDefinitionOptions, BarDefinitionType } from './types'\nimport { ChartColours } from '../ChartColours'\n\nclass BarChart extends Chart {\n private definition!: BarDefinitionType\n\n private measures!: BarDefinitionMeasure[]\n\n private keys!: VisualisationDefinitionKey[]\n\n private options: BarDefinitionOptions | undefined\n\n override responseData: DashboardDataResponse[] = []\n\n private isList = false\n\n override datasets: DashboardVisualisationDataSet[] = []\n\n private groupsData: DashboardDataResponse[][] = []\n\n private groupKey: BarDefinitionMeasure | undefined\n\n private xAxisColumn: BarDefinitionMeasure | undefined\n\n private yAxisColumn: BarDefinitionMeasure | undefined\n\n private barCount = 0\n\n withDefinition = (definition: components['schemas']['DashboardVisualisationDefinition']) => {\n this.definition = BarChartSchemas.BarSchema.parse(definition)\n this.initFromDefinitionData()\n\n return this\n }\n\n override withData = (responseData: DashboardDataResponse[]) => {\n this.responseData = responseData\n if (this.isList) this.initListData()\n return this\n }\n\n getCanvasHeight = () => {\n this.barCount = this.datasets.length * this.datasets[0].data.length\n return this.options?.horizontal ? this.barCount : 5\n }\n\n build = (): DashboardVisualisationData => {\n if (!this.isList) {\n this.getBarChartData()\n } else {\n this.getListBarChartData()\n }\n const height = this.getCanvasHeight()\n\n return {\n type: DashboardVisualisationType.BAR,\n options: {\n height,\n unit: this.unit,\n timeseries: false,\n },\n data: {\n labels: this.labels,\n datasets: this.datasets,\n config: this.config,\n },\n }\n }\n\n augmentDataset = (datasets: DashboardVisualisationDataSet[]) => {\n return datasets.map((set) => {\n return {\n ...set,\n borderWidth: [0, 0],\n datalabels: {\n align: 'center',\n anchor: 'bottom',\n },\n }\n })\n }\n\n setBespokeOptions = () => {\n let indexAxis = 'x'\n let scales\n\n if (this.options) {\n const { horizontal, xStacked, yStacked } = this.options\n indexAxis = horizontal ? 'y' : indexAxis\n if (xStacked || yStacked) {\n scales = {\n ...(xStacked && { x: { stacked: xStacked } }),\n ...(yStacked && { y: { stacked: yStacked } }),\n }\n }\n }\n\n return {\n ...this.config,\n indexAxis,\n ...(scales && { scales }),\n }\n }\n\n private getBarChartData = () => {\n this.createDatasets(this.measures, this.responseData)\n this.datasets = this.augmentDataset(this.datasets)\n this.config = this.setBespokeOptions()\n this.createLabels(this.measures)\n }\n\n private getListBarChartData = () => {\n this.createListLabels()\n this.createListDatasets()\n this.datasets = this.augmentDataset(this.datasets)\n this.config = this.setBespokeOptions()\n }\n\n private initFromDefinitionData = () => {\n this.measures = this.definition.columns.measures\n this.options = this.definition.options\n this.keys = this.definition.columns.keys || []\n this.isList = !!this.measures.find((col) => col.axis)\n this.initUnit(this.measures)\n\n if (!this.isList) this.getLabelId(this.keys)\n }\n\n private initListData = () => {\n this.xAxisColumn = this.measures.find((col) => col.axis === 'x')\n this.yAxisColumn = this.measures.find((col) => col.axis === 'y')\n this.groupKey = <BarDefinitionMeasure>(\n DatasetHelper.getGroupKey(\n this.responseData,\n <Array<components['schemas']['DashboardVisualisationColumnDefinition']>>this.keys,\n )\n )\n this.groupsData = this.groupKey\n ? DatasetHelper.groupRowsByKey(this.responseData, this.groupKey.id)\n : [this.responseData]\n }\n\n private createListDatasets = () => {\n this.hexColours = new ChartColours().getHexPallette()\n this.datasets = this.groupsData.map((groupData, groupIndex) => {\n const data = Array(this.labels.length)\n groupData.forEach((row) => {\n // Validation will ensure these columns exist\n const yId = this.yAxisColumn?.id || ''\n const xId = this.xAxisColumn?.id || ''\n\n const labelField = row[xId]\n const valueField = row[yId]\n\n const raw = valueField && valueField.raw ? Number(valueField.raw) : 0\n const dataIndex = this.labels.findIndex((l) => l === labelField.raw)\n if (dataIndex !== -1) {\n data[dataIndex] = Number(raw)\n }\n })\n\n let label = ''\n if (this.groupKey) {\n const groupKeyId = this.groupKey.id\n const groupRow = groupData[0]\n label = groupRow && groupRow[groupKeyId] ? `${groupRow[groupKeyId].raw}` : ''\n } else {\n label = this.yAxisColumn?.display || label\n }\n\n return {\n label,\n data,\n total: data.reduce((acc: number, val: number) => acc + val, 0),\n ...this.setStyles(groupIndex),\n }\n })\n }\n\n private createListLabels = () => {\n this.labels = this.groupsData.flatMap((gd) => {\n const id = this.xAxisColumn?.id || ''\n return gd.map((row) => {\n const field = row[id]\n return field ? `${field.raw}` : ''\n })\n })\n }\n}\n\nexport { BarChart }\nexport default BarChart\n"],"names":["Chart","BarChartSchemas","DashboardVisualisationType","DatasetHelper","ChartColours"],"mappings":"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"}
1
+ {"version":3,"file":"BarChart.js","sources":["../../../../../../../../../../../../src/dpr/components/_charts/chart/bar/BarChart.ts"],"sourcesContent":["/* eslint-disable prefer-destructuring */\nimport { DashboardDataResponse } from '../../../../types/Metrics'\nimport {\n DashboardVisualisationType,\n DashboardVisualisationData,\n DashboardVisualisationDataSet,\n VisualisationDefinitionKey,\n} from '../../../_dashboards/dashboard-visualisation/types'\nimport { components } from '../../../../types/api'\nimport DatasetHelper from '../../../../utils/datasetHelper'\nimport Chart from '../Chart'\nimport BarChartSchemas from './validate'\nimport { BarDefinitionMeasure, BarDefinitionOptions, BarDefinitionType } from './types'\nimport { ChartColours } from '../ChartColours'\n\nclass BarChart extends Chart {\n private definition!: BarDefinitionType\n\n private measures!: BarDefinitionMeasure[]\n\n private keys!: VisualisationDefinitionKey[]\n\n private options: BarDefinitionOptions | undefined\n\n override responseData: DashboardDataResponse[] = []\n\n private isList = false\n\n override datasets: DashboardVisualisationDataSet[] = []\n\n private groupsData: DashboardDataResponse[][] = []\n\n private groupKey: string[] | undefined\n\n private xAxisColumn: BarDefinitionMeasure | undefined\n\n private yAxisColumn: BarDefinitionMeasure | undefined\n\n private barCount = 0\n\n withDefinition = (definition: components['schemas']['DashboardVisualisationDefinition']) => {\n this.definition = BarChartSchemas.BarSchema.parse(definition)\n this.initFromDefinitionData()\n\n return this\n }\n\n override withData = (responseData: DashboardDataResponse[]) => {\n this.responseData = responseData\n if (this.isList) this.initListData()\n return this\n }\n\n getCanvasHeight = () => {\n this.barCount = this.datasets.length * this.datasets[0].data.length\n return this.options?.horizontal ? this.barCount : 5\n }\n\n build = (): DashboardVisualisationData => {\n if (!this.isList) {\n this.getBarChartData()\n } else {\n this.getListBarChartData()\n }\n const height = this.getCanvasHeight()\n\n return {\n type: DashboardVisualisationType.BAR,\n options: {\n height,\n unit: this.unit,\n timeseries: false,\n },\n data: {\n labels: this.labels,\n datasets: this.datasets,\n config: this.config,\n },\n }\n }\n\n augmentDataset = (datasets: DashboardVisualisationDataSet[]) => {\n return datasets.map((set) => {\n return {\n ...set,\n borderWidth: [0, 0],\n datalabels: {\n align: 'center',\n anchor: 'bottom',\n },\n }\n })\n }\n\n setBespokeOptions = () => {\n let indexAxis = 'x'\n let scales\n\n if (this.options) {\n const { horizontal, xStacked, yStacked } = this.options\n indexAxis = horizontal ? 'y' : indexAxis\n if (xStacked || yStacked) {\n scales = {\n ...(xStacked && { x: { stacked: xStacked } }),\n ...(yStacked && { y: { stacked: yStacked } }),\n }\n }\n }\n\n return {\n ...this.config,\n indexAxis,\n ...(scales && { scales }),\n }\n }\n\n private getBarChartData = () => {\n this.createDatasets(this.measures, this.responseData)\n this.datasets = this.augmentDataset(this.datasets)\n this.config = this.setBespokeOptions()\n this.createLabels(this.measures)\n }\n\n private getListBarChartData = () => {\n this.createListLabels()\n this.createListDatasets()\n this.datasets = this.augmentDataset(this.datasets)\n this.config = this.setBespokeOptions()\n }\n\n private initFromDefinitionData = () => {\n this.measures = this.definition.columns.measures\n this.options = this.definition.options\n this.keys = this.definition.columns.keys || []\n this.isList = !!this.measures.find((col) => col.axis)\n this.initUnit(this.measures)\n\n if (!this.isList) this.getLabelId(this.keys)\n }\n\n private initListData = () => {\n this.xAxisColumn = this.measures.find((col) => col.axis === 'x')\n this.yAxisColumn = this.measures.find((col) => col.axis === 'y')\n this.groupKey = this.keys.map((key) => key.id)\n this.groupsData =\n this.groupKey && this.groupKey.length\n ? DatasetHelper.groupRowsBy(this.responseData, this.groupKey)\n : [this.responseData]\n }\n\n private createListDatasets = () => {\n this.hexColours = new ChartColours().getHexPallette()\n this.datasets = this.groupsData.map((groupData, groupIndex) => {\n const data = Array(this.labels.length)\n groupData.forEach((row) => {\n // Validation will ensure these columns exist\n const yId = this.yAxisColumn?.id || ''\n const xId = this.xAxisColumn?.id || ''\n\n const labelField = row[xId]\n const valueField = row[yId]\n\n const raw = valueField && valueField.raw ? Number(valueField.raw) : 0\n const dataIndex = this.labels.findIndex((l) => l === labelField.raw)\n if (dataIndex !== -1) {\n data[dataIndex] = Number(raw)\n }\n })\n\n const label = this.createGroupLabel(groupData)\n\n return {\n label,\n data,\n total: data.reduce((acc: number, val: number) => acc + val, 0),\n ...this.setStyles(groupIndex),\n }\n })\n }\n\n private createGroupLabel = (group: DashboardDataResponse[]): string => {\n if (this.groupKey && this.groupKey.length) {\n const firstRow = group[0]\n return this.groupKey\n ? this.groupKey\n .map((id) => {\n const key = this.keys.find((k) => k.id === 'id')\n const label = key && key.display ? `${key.display}:` : ''\n const value = firstRow[id]?.raw ?? ''\n return `${label}${value}`\n })\n .join(' - ')\n : ''\n }\n return this.yAxisColumn?.display || ''\n }\n\n private createListLabels = () => {\n const allLabels = this.groupsData.flatMap((gd) => {\n const id = this.xAxisColumn?.id || ''\n return gd.map((row) => {\n const field = row[id]\n return field ? `${field.raw}` : ''\n })\n })\n\n this.labels = Array.from(new Set(allLabels))\n }\n}\n\nexport { BarChart }\nexport default BarChart\n"],"names":["Chart","BarChartSchemas","DashboardVisualisationType","DatasetHelper","ChartColours"],"mappings":"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"}
@@ -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).length(1, 'Measure must contain a single item'),
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
- ...dashboardBucket.shape,
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