@ministryofjustice/hmpps-digital-prison-reporting-frontend 4.17.0 → 4.17.2

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 (169) hide show
  1. package/dpr/components/_catalogue/catalogue-list/utils.js +1 -1
  2. package/dpr/components/_catalogue/catalogue-list/utils.js.map +3 -3
  3. package/dpr/components/_catalogue/catalogue-list/utils.ts +4 -5
  4. package/dpr/components/_catalogue/catalogue-search/view.njk +1 -0
  5. package/dpr/components/_charts/chart/Buckets.js +1 -1
  6. package/dpr/components/_charts/chart/Buckets.js.map +3 -3
  7. package/dpr/components/_charts/chart/Buckets.ts +44 -36
  8. package/dpr/components/_charts/chart/heatmap/HeatmapChart.js +1 -1
  9. package/dpr/components/_charts/chart/heatmap/HeatmapChart.js.map +2 -2
  10. package/dpr/components/_charts/chart/heatmap/HeatmapChart.ts +22 -14
  11. package/dpr/components/_charts/chart/heatmap/types.js +2 -0
  12. package/dpr/components/_charts/chart/heatmap/types.js.map +7 -0
  13. package/dpr/components/_charts/chart/heatmap/types.ts +6 -0
  14. package/dpr/components/_charts/utils.js +1 -1
  15. package/dpr/components/_charts/utils.js.map +3 -3
  16. package/dpr/components/_charts/utils.test.ts +10 -7
  17. package/dpr/components/_charts/utils.ts +57 -50
  18. package/dpr/components/_dashboards/dashboard/view.njk +1 -1
  19. package/dpr/components/_dashboards/dashboard-list/utils.js +1 -1
  20. package/dpr/components/_dashboards/dashboard-list/utils.js.map +2 -2
  21. package/dpr/components/_dashboards/dashboard-list/utils.test.ts +3 -3
  22. package/dpr/components/_dashboards/dashboard-list/utils.ts +16 -12
  23. package/dpr/components/_dashboards/dashboard-section/view.njk +1 -1
  24. package/dpr/components/_dashboards/dashboard-visualisation/DashboardVisualisation.js +2 -0
  25. package/dpr/components/_dashboards/dashboard-visualisation/DashboardVisualisation.js.map +7 -0
  26. package/dpr/components/_dashboards/dashboard-visualisation/DashboardVisualisation.ts +40 -0
  27. package/dpr/components/_dashboards/dashboard-visualisation/types.js +2 -0
  28. package/dpr/components/_dashboards/dashboard-visualisation/types.js.map +7 -0
  29. package/dpr/components/_dashboards/dashboard-visualisation/types.ts +102 -0
  30. package/dpr/components/_dashboards/dashboard-visualisation/view.njk +1 -1
  31. package/dpr/components/_dashboards/scorecard/Scorecard.js +1 -1
  32. package/dpr/components/_dashboards/scorecard/Scorecard.js.map +2 -2
  33. package/dpr/components/_dashboards/scorecard/Scorecard.ts +37 -29
  34. package/dpr/components/_dashboards/scorecard/types.js.map +1 -1
  35. package/dpr/components/_dashboards/scorecard/types.ts +1 -0
  36. package/dpr/components/_dashboards/scorecard/utils.js +1 -1
  37. package/dpr/components/_dashboards/scorecard/utils.js.map +2 -2
  38. package/dpr/components/_dashboards/scorecard/utils.test.ts +13 -4
  39. package/dpr/components/_dashboards/scorecard/utils.ts +6 -5
  40. package/dpr/components/_dashboards/scorecard/view.njk +6 -5
  41. package/dpr/components/_dashboards/scorecard-group/view.njk +4 -4
  42. package/dpr/components/_reports/report-actions/types.d.js.map +1 -1
  43. package/dpr/components/_reports/report-actions/types.d.ts +1 -1
  44. package/dpr/components/_reports/report-heading/view.njk +1 -1
  45. package/dpr/data/dashboardClient.js +1 -1
  46. package/dpr/data/dashboardClient.js.map +2 -2
  47. package/dpr/data/dashboardClient.ts +8 -7
  48. package/dpr/data/reportingClient.js +1 -1
  49. package/dpr/data/reportingClient.js.map +1 -1
  50. package/dpr/data/reportingClient.ts +1 -1
  51. package/dpr/middleware/reportAuthoriser.js +1 -1
  52. package/dpr/middleware/reportAuthoriser.js.map +3 -3
  53. package/dpr/middleware/reportAuthoriser.ts +9 -20
  54. package/dpr/routes/journeys/download-report/controller.js +1 -1
  55. package/dpr/routes/journeys/download-report/controller.js.map +3 -3
  56. package/dpr/routes/journeys/download-report/controller.ts +4 -1
  57. package/dpr/routes/journeys/download-report/request-download/form/submitted/tests.cy.js +1 -1
  58. package/dpr/routes/journeys/download-report/request-download/form/submitted/tests.cy.js.map +2 -2
  59. package/dpr/routes/journeys/download-report/request-download/form/submitted/tests.cy.ts +1 -0
  60. package/dpr/routes/journeys/download-report/request-download/form/tests.cy.js +1 -1
  61. package/dpr/routes/journeys/download-report/request-download/form/tests.cy.js.map +2 -2
  62. package/dpr/routes/journeys/download-report/request-download/form/tests.cy.ts +1 -0
  63. package/dpr/routes/journeys/download-report/tests.cy.js +1 -1
  64. package/dpr/routes/journeys/download-report/tests.cy.js.map +2 -2
  65. package/dpr/routes/journeys/download-report/tests.cy.ts +2 -8
  66. package/dpr/routes/journeys/download-report/utils.js +1 -1
  67. package/dpr/routes/journeys/download-report/utils.js.map +3 -3
  68. package/dpr/routes/journeys/download-report/utils.ts +10 -7
  69. package/dpr/routes/journeys/my-reports/bookmarks/list/tests.cy.js +1 -1
  70. package/dpr/routes/journeys/my-reports/bookmarks/list/tests.cy.js.map +2 -2
  71. package/dpr/routes/journeys/my-reports/bookmarks/list/tests.cy.ts +1 -0
  72. package/dpr/routes/journeys/my-reports/bookmarks/tests.cy.js +1 -1
  73. package/dpr/routes/journeys/my-reports/bookmarks/tests.cy.js.map +3 -3
  74. package/dpr/routes/journeys/my-reports/bookmarks/tests.cy.ts +5 -14
  75. package/dpr/routes/journeys/my-reports/bookmarks/utils.js +1 -1
  76. package/dpr/routes/journeys/my-reports/bookmarks/utils.js.map +3 -3
  77. package/dpr/routes/journeys/my-reports/bookmarks/utils.ts +11 -5
  78. package/dpr/routes/journeys/my-reports/recently-viewed/list/tests.cy.js +1 -1
  79. package/dpr/routes/journeys/my-reports/recently-viewed/list/tests.cy.js.map +3 -3
  80. package/dpr/routes/journeys/my-reports/recently-viewed/list/tests.cy.ts +4 -7
  81. package/dpr/routes/journeys/my-reports/requested-reports/list/tests.cy.js +1 -1
  82. package/dpr/routes/journeys/my-reports/requested-reports/list/tests.cy.js.map +2 -2
  83. package/dpr/routes/journeys/my-reports/requested-reports/list/tests.cy.ts +1 -0
  84. package/dpr/routes/journeys/request-missing-report/form/tests.cy.js +1 -1
  85. package/dpr/routes/journeys/request-missing-report/form/tests.cy.js.map +2 -2
  86. package/dpr/routes/journeys/request-missing-report/form/tests.cy.ts +1 -0
  87. package/dpr/routes/journeys/request-missing-report/tests.cy.js +1 -1
  88. package/dpr/routes/journeys/request-missing-report/tests.cy.js.map +2 -2
  89. package/dpr/routes/journeys/request-missing-report/tests.cy.ts +3 -5
  90. package/dpr/routes/journeys/request-report/filters/tests.cy.js +1 -1
  91. package/dpr/routes/journeys/request-report/filters/tests.cy.js.map +3 -3
  92. package/dpr/routes/journeys/request-report/filters/tests.cy.ts +3 -6
  93. package/dpr/routes/journeys/request-report/filters/utils.js +1 -1
  94. package/dpr/routes/journeys/request-report/filters/utils.js.map +2 -2
  95. package/dpr/routes/journeys/request-report/filters/utils.ts +2 -3
  96. package/dpr/routes/journeys/request-report/status/tests.cy.js +1 -1
  97. package/dpr/routes/journeys/request-report/status/tests.cy.js.map +2 -2
  98. package/dpr/routes/journeys/request-report/status/tests.cy.ts +2 -7
  99. package/dpr/routes/journeys/request-report/tests.cy.js +1 -1
  100. package/dpr/routes/journeys/request-report/tests.cy.js.map +3 -3
  101. package/dpr/routes/journeys/request-report/tests.cy.ts +5 -21
  102. package/dpr/routes/journeys/view-report/async/controller.js.map +2 -2
  103. package/dpr/routes/journeys/view-report/async/controller.ts +2 -2
  104. package/dpr/routes/journeys/view-report/async/dashboard/tests.cy.js +1 -1
  105. package/dpr/routes/journeys/view-report/async/dashboard/tests.cy.js.map +2 -2
  106. package/dpr/routes/journeys/view-report/async/dashboard/tests.cy.ts +2 -10
  107. package/dpr/routes/journeys/view-report/async/dashboard/utils.js +1 -1
  108. package/dpr/routes/journeys/view-report/async/dashboard/utils.js.map +3 -3
  109. package/dpr/routes/journeys/view-report/async/dashboard/utils.ts +100 -95
  110. package/dpr/routes/journeys/view-report/async/report/controller.js +1 -1
  111. package/dpr/routes/journeys/view-report/async/report/controller.js.map +3 -3
  112. package/dpr/routes/journeys/view-report/async/report/controller.ts +4 -6
  113. package/dpr/routes/journeys/view-report/async/report/tests.cy.js +1 -1
  114. package/dpr/routes/journeys/view-report/async/report/tests.cy.js.map +2 -2
  115. package/dpr/routes/journeys/view-report/async/report/tests.cy.ts +8 -19
  116. package/dpr/routes/journeys/view-report/async/report/types.js +2 -0
  117. package/dpr/routes/journeys/view-report/async/report/types.js.map +7 -0
  118. package/dpr/routes/journeys/view-report/async/report/types.ts +31 -0
  119. package/dpr/routes/journeys/view-report/async/report/utils.js +1 -1
  120. package/dpr/routes/journeys/view-report/async/report/utils.js.map +3 -3
  121. package/dpr/routes/journeys/view-report/async/report/utils.ts +173 -136
  122. package/dpr/routes/journeys/view-report/sync/tests.cy.js +1 -1
  123. package/dpr/routes/journeys/view-report/sync/tests.cy.js.map +3 -3
  124. package/dpr/routes/journeys/view-report/sync/tests.cy.ts +3 -5
  125. package/dpr/services/dashboardService.js +1 -1
  126. package/dpr/services/dashboardService.js.map +2 -2
  127. package/dpr/services/dashboardService.ts +7 -5
  128. package/dpr/services/productCollection/productCollectionService.js +1 -1
  129. package/dpr/services/productCollection/productCollectionService.js.map +2 -2
  130. package/dpr/services/productCollection/productCollectionService.ts +3 -3
  131. package/dpr/services/reportingService.js +1 -1
  132. package/dpr/services/reportingService.js.map +1 -1
  133. package/dpr/services/reportingService.ts +1 -1
  134. package/dpr/types/AsyncReportUtils.js.map +1 -1
  135. package/dpr/types/AsyncReportUtils.ts +3 -4
  136. package/dpr/types/Charts.js +1 -1
  137. package/dpr/types/Charts.js.map +3 -3
  138. package/dpr/types/Charts.ts +0 -82
  139. package/dpr/types/Metrics.js +1 -1
  140. package/dpr/types/Metrics.js.map +1 -1
  141. package/dpr/types/Metrics.ts +7 -0
  142. package/dpr/types/ReportQuery.js +1 -1
  143. package/dpr/types/ReportQuery.js.map +3 -3
  144. package/dpr/types/ReportQuery.ts +24 -15
  145. package/dpr/types/Services.d.js +1 -1
  146. package/dpr/types/Services.d.js.map +1 -1
  147. package/dpr/types/Services.d.ts +2 -0
  148. package/dpr/types/api.d.js.map +1 -1
  149. package/dpr/types/api.d.ts +14 -16
  150. package/dpr/utils/Personalisation/personalisationUtils.js +1 -1
  151. package/dpr/utils/Personalisation/personalisationUtils.js.map +3 -3
  152. package/dpr/utils/Personalisation/personalisationUtils.ts +15 -6
  153. package/dpr/utils/UserStoreItemBuilder.js +1 -1
  154. package/dpr/utils/UserStoreItemBuilder.js.map +1 -1
  155. package/dpr/utils/UserStoreItemBuilder.ts +2 -2
  156. package/dpr/utils/datasetHelper.js +1 -1
  157. package/dpr/utils/datasetHelper.js.map +3 -3
  158. package/dpr/utils/datasetHelper.test.ts +11 -11
  159. package/dpr/utils/datasetHelper.ts +23 -8
  160. package/dpr/utils/logger.js +1 -1
  161. package/dpr/utils/logger.js.map +3 -3
  162. package/dpr/utils/logger.ts +6 -1
  163. package/package.json +2 -1
  164. package/dpr/components/_charts/chart/DashboardVisualisation.js +0 -2
  165. package/dpr/components/_charts/chart/DashboardVisualisation.js.map +0 -7
  166. package/dpr/components/_charts/chart/DashboardVisualisation.ts +0 -43
  167. package/dpr/components/_dashboards/dashboard/types.js +0 -2
  168. package/dpr/components/_dashboards/dashboard/types.js.map +0 -7
  169. package/dpr/components/_dashboards/dashboard/types.ts +0 -120
@@ -0,0 +1,40 @@
1
+ /* eslint-disable prefer-destructuring */
2
+ import { components } from '../../../types/api'
3
+ import { DashboardDataResponse } from '../../../types/Metrics'
4
+
5
+ class DashboardVisualisationClass {
6
+ responseData: DashboardDataResponse[]
7
+
8
+ definition: components['schemas']['DashboardVisualisationDefinition']
9
+
10
+ columns: components['schemas']['DashboardVisualisationColumnsDefinition']
11
+
12
+ measures: components['schemas']['DashboardVisualisationColumnDefinition'][]
13
+
14
+ keys: components['schemas']['DashboardVisualisationColumnDefinition'][]
15
+
16
+ unit: components['schemas']['DashboardVisualisationColumnDefinition']['unit']
17
+
18
+ type: components['schemas']['DashboardVisualisationDefinition']['type']
19
+
20
+ constructor(
21
+ responseData: DashboardDataResponse[],
22
+ definition: components['schemas']['DashboardVisualisationDefinition'],
23
+ ) {
24
+ this.definition = definition
25
+ this.columns = definition.columns
26
+ this.measures = this.columns.measures
27
+ this.keys = this.columns.keys
28
+ this.type = this.definition.type.split('-')[0] as components['schemas']['DashboardVisualisationDefinition']['type']
29
+ this.initUnit()
30
+ this.responseData = responseData
31
+ }
32
+
33
+ initUnit = () => {
34
+ // todo
35
+ this.unit = this.columns.measures[0].unit ? this.columns.measures[0].unit : undefined
36
+ }
37
+ }
38
+
39
+ export { DashboardVisualisationClass }
40
+ export default DashboardVisualisationClass
@@ -0,0 +1,2 @@
1
+ var o=Object.defineProperty;var l=Object.getOwnPropertyDescriptor;var c=Object.getOwnPropertyNames;var u=Object.prototype.hasOwnProperty;var b=(e,t)=>{for(var r in t)o(e,r,{get:t[r],enumerable:!0})},d=(e,t,r,s)=>{if(t&&typeof t=="object"||typeof t=="function")for(let i of c(t))!u.call(e,i)&&i!==r&&o(e,i,{get:()=>t[i],enumerable:!(s=l(t,i))||s.enumerable});return e};var m=e=>d(o({},"__esModule",{value:!0}),e);var D={};b(D,{DashboardVisualisationType:()=>n});module.exports=m(D);var n=(a=>(a.LIST="list",a.DONUT="doughnut",a.BAR="bar",a.LINE="line",a.MATRIX="matrix",a.MATRIX_TIMESERIES="matrix-timeseries",a.BAR_TIMESERIES="bar-timeseries",a.LINE_TIMESERIES="line-timeseries",a.SCORECARD="scorecard",a.SCORECARD_GROUP="scorecard-group",a))(n||{});0&&(module.exports={DashboardVisualisationType});
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../src/dpr/components/_dashboards/dashboard-visualisation/types.ts"],
4
+ "sourcesContent": ["import { components } from '../../../types/api'\nimport { Scorecard, ScorecardGroup } from '../scorecard/types'\nimport { MatrixChartData } from '../../_charts/chart/heatmap/types'\nimport { ChartDetails } from '../../../types/Charts'\n\nexport interface DashboardSection {\n id: string\n title?: string\n description?: string\n visualisations?: DashboardVisualisation[]\n}\n\nexport interface DashboardVisualisation {\n id: string\n type: components['schemas']['DashboardVisualisationDefinition']['type']\n title?: string\n description?: string\n data:\n | Scorecard\n | Scorecard[]\n | ScorecardGroup[]\n | DashboardVisualisatonCardData\n | DashboardVisualisationTable\n | undefined\n}\n\nexport interface DashboardVisualisatonCardData {\n chart: DashboardVisualisationData\n table?: MoJTable\n details?: ChartDetails\n}\n\nexport interface DashboardVisualisationData {\n type: components['schemas']['DashboardVisualisationDefinition']['type']\n unit?: components['schemas']['DashboardVisualisationColumnDefinition']['unit']\n data: DashboardVisualisationDataValues\n timeseries?: boolean\n}\n\nexport interface DashboardVisualisationDataValues {\n labels?: string[]\n datasets: DashboardVisualisationDataSet[]\n axis?: 'x' | 'y'\n}\n\nexport interface DashboardVisualisationDataSet {\n label: string\n data: number[] | MatrixChartData[]\n total?: number\n}\n\nexport interface DashboardVisualisationTable {\n table: MoJTable\n ts?: string\n}\n\nexport interface MoJTable {\n head: MoJTableHead[]\n rows: MoJTableRow[][]\n}\n\nexport interface MoJTableRow {\n text?: string\n html?: string\n}\n\nexport interface MoJTableHead {\n text?: string\n html?: string\n}\n\nexport enum DashboardVisualisationType {\n LIST = 'list',\n DONUT = 'doughnut',\n BAR = 'bar',\n LINE = 'line',\n MATRIX = 'matrix',\n MATRIX_TIMESERIES = 'matrix-timeseries',\n BAR_TIMESERIES = 'bar-timeseries',\n LINE_TIMESERIES = 'line-timeseries',\n SCORECARD = 'scorecard',\n SCORECARD_GROUP = 'scorecard-group',\n}\n\nexport type DashboardVisualisationOptions = ListDashboardVisualisationOptions | BucketDashboardVisualisationOptions\n\nexport interface ListDashboardVisualisationOptions {\n showLatest?: boolean\n columnsAsList?: boolean\n}\n\nexport interface BucketDashboardVisualisationOptions {\n useRagColour?: boolean\n buckets?: DashboardVisualisationBucket[]\n baseColour?: string\n}\n\nexport interface DashboardVisualisationBucket {\n min?: number\n max?: number\n hexColour?: string\n}\n"],
5
+ "mappings": "4ZAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,gCAAAE,IAAA,eAAAC,EAAAH,GAuEO,IAAKE,OACVA,EAAA,KAAO,OACPA,EAAA,MAAQ,WACRA,EAAA,IAAM,MACNA,EAAA,KAAO,OACPA,EAAA,OAAS,SACTA,EAAA,kBAAoB,oBACpBA,EAAA,eAAiB,iBACjBA,EAAA,gBAAkB,kBAClBA,EAAA,UAAY,YACZA,EAAA,gBAAkB,kBAVRA,OAAA",
6
+ "names": ["types_exports", "__export", "DashboardVisualisationType", "__toCommonJS"]
7
+ }
@@ -0,0 +1,102 @@
1
+ import { components } from '../../../types/api'
2
+ import { Scorecard, ScorecardGroup } from '../scorecard/types'
3
+ import { MatrixChartData } from '../../_charts/chart/heatmap/types'
4
+ import { ChartDetails } from '../../../types/Charts'
5
+
6
+ export interface DashboardSection {
7
+ id: string
8
+ title?: string
9
+ description?: string
10
+ visualisations?: DashboardVisualisation[]
11
+ }
12
+
13
+ export interface DashboardVisualisation {
14
+ id: string
15
+ type: components['schemas']['DashboardVisualisationDefinition']['type']
16
+ title?: string
17
+ description?: string
18
+ data:
19
+ | Scorecard
20
+ | Scorecard[]
21
+ | ScorecardGroup[]
22
+ | DashboardVisualisatonCardData
23
+ | DashboardVisualisationTable
24
+ | undefined
25
+ }
26
+
27
+ export interface DashboardVisualisatonCardData {
28
+ chart: DashboardVisualisationData
29
+ table?: MoJTable
30
+ details?: ChartDetails
31
+ }
32
+
33
+ export interface DashboardVisualisationData {
34
+ type: components['schemas']['DashboardVisualisationDefinition']['type']
35
+ unit?: components['schemas']['DashboardVisualisationColumnDefinition']['unit']
36
+ data: DashboardVisualisationDataValues
37
+ timeseries?: boolean
38
+ }
39
+
40
+ export interface DashboardVisualisationDataValues {
41
+ labels?: string[]
42
+ datasets: DashboardVisualisationDataSet[]
43
+ axis?: 'x' | 'y'
44
+ }
45
+
46
+ export interface DashboardVisualisationDataSet {
47
+ label: string
48
+ data: number[] | MatrixChartData[]
49
+ total?: number
50
+ }
51
+
52
+ export interface DashboardVisualisationTable {
53
+ table: MoJTable
54
+ ts?: string
55
+ }
56
+
57
+ export interface MoJTable {
58
+ head: MoJTableHead[]
59
+ rows: MoJTableRow[][]
60
+ }
61
+
62
+ export interface MoJTableRow {
63
+ text?: string
64
+ html?: string
65
+ }
66
+
67
+ export interface MoJTableHead {
68
+ text?: string
69
+ html?: string
70
+ }
71
+
72
+ export enum DashboardVisualisationType {
73
+ LIST = 'list',
74
+ DONUT = 'doughnut',
75
+ BAR = 'bar',
76
+ LINE = 'line',
77
+ MATRIX = 'matrix',
78
+ MATRIX_TIMESERIES = 'matrix-timeseries',
79
+ BAR_TIMESERIES = 'bar-timeseries',
80
+ LINE_TIMESERIES = 'line-timeseries',
81
+ SCORECARD = 'scorecard',
82
+ SCORECARD_GROUP = 'scorecard-group',
83
+ }
84
+
85
+ export type DashboardVisualisationOptions = ListDashboardVisualisationOptions | BucketDashboardVisualisationOptions
86
+
87
+ export interface ListDashboardVisualisationOptions {
88
+ showLatest?: boolean
89
+ columnsAsList?: boolean
90
+ }
91
+
92
+ export interface BucketDashboardVisualisationOptions {
93
+ useRagColour?: boolean
94
+ buckets?: DashboardVisualisationBucket[]
95
+ baseColour?: string
96
+ }
97
+
98
+ export interface DashboardVisualisationBucket {
99
+ min?: number
100
+ max?: number
101
+ hexColour?: string
102
+ }
@@ -11,7 +11,7 @@
11
11
 
12
12
  <div class="dashboard-visualisation-container" id="{{ id }}-dash-section-visualisation" tabindex="0">
13
13
  {% if title %}
14
- <h3 class="govuk-heading-s">{{ title }}</h3>
14
+ <h3 class="govuk-heading-m">{{ title }}</h3>
15
15
  {% endif %}
16
16
 
17
17
  {% if description %}
@@ -1,2 +1,2 @@
1
- var R=Object.create;var g=Object.defineProperty;var k=Object.getOwnPropertyDescriptor;var B=Object.getOwnPropertyNames;var $=Object.getPrototypeOf,T=Object.prototype.hasOwnProperty;var F=(u,l)=>{for(var e in l)g(u,e,{get:l[e],enumerable:!0})},b=(u,l,e,t)=>{if(l&&typeof l=="object"||typeof l=="function")for(let s of B(l))!T.call(u,s)&&s!==e&&g(u,s,{get:()=>l[s],enumerable:!(t=k(l,s))||t.enumerable});return u};var v=(u,l,e)=>(e=u!=null?R($(u)):{},b(l||!u||!u.__esModule?g(e,"default",{value:u,enumerable:!0}):e,u)),N=u=>b(g({},"__esModule",{value:!0}),u);var I={};F(I,{ScorecardVisualisation:()=>f,default:()=>M});module.exports=N(I);var K=v(require("../../_charts/chart/DashboardVisualisation")),n=v(require("../../../utils/datasetHelper")),D=v(require("../../_charts/chart/Buckets"));class f extends K.default{constructor(e,t,s=!1){super(e,t);this.buckets=[];this.ragColours=["#cce2d8","#fff7bf","#f4cdc6"];this.initBuckets=(e,t)=>{this.bucketsHelper=new D.default(e,this.definition,t,!1,this.ragColours),this.buckets=new D.default(e,this.definition,t,!1,this.ragColours).getBuckets()};this.initGroupVars=()=>{this.groupKey=n.default.getGroupKey(this.keys,this.dataset.latest),this.groupKeyId=this.groupKey?.id,this.groupKeyDisplay=this.groupKey?.display,this.valueColumn=this.measures.find(e=>e.displayValue),this.valueColumn&&(this.valueKey=this.valueColumn?.id,this.titleColumn=this.measures.find(e=>e.display||e.display===""),this.titleKey=this.titleColumn?.id)};this.getDataset=(e,t)=>{const s=n.default.getLastestDataset(t),r=n.default.getDatasetRows(e,s),i=r[0]?.ts?.raw,o=n.default.filterRowsByDisplayColumns(e,r,!0),a=n.default.getEarliestDataset(t),c=n.default.getDatasetRows(e,a),d=c[0]?.ts?.raw;return{earliest:n.default.filterRowsByDisplayColumns(e,c,!0),earliestTs:d,latest:o,latestTs:i}};this.setRagScore=(e,t)=>this.bucketsHelper.getBucketForValue(e,t);this.createScorecardData=({title:e,value:t,rag:s,valueFor:r,valueFrom:i,prevVal:o,groupTitle:a})=>({title:e,value:t,...!Number.isNaN(t)&&this.buckets.length&&{rag:this.setRagScore(t,s)},valueFor:r,trend:this.createTrend(r,i,t,o),...a&&{group:a}});this.createTrend=(e,t,s,r)=>{let i;if(t!==e){const o=+s-+r;i={direction:Math.sign(o),value:Math.abs(o),from:t}}return i};this.validateDefinition=()=>{const{id:e,type:t}=this.definition,s=[];if(this.group||(this.measures.length!==1?s.push(`Measures should only have 1 column defined. Found ${this.measures.length}`):this.titleColumn?this.valueKey||s.push('Missing ID in title measure. Expected measure to include "id: string" field'):s.push('No title column defined. Expected measure to include "display: string" field')),s.length){const r=`Validation: Visualisaton definition: ID: ${e}, type: ${t}, errors: ${s.join(",")}`;throw new Error(r)}};this.createScorecardGroupFromColumns=()=>{const{latest:e,earliest:t,latestTs:s,earliestTs:r}=this.dataset;return e.map((i,o)=>({title:this.createGroupTitle(i),scorecards:Object.keys(i).filter(a=>a!==this.groupKeyId).map(a=>{const d=this.measures.find(w=>w.id===a)?.display||a,p=i[a],{raw:h,rag:m}=p,y=Number(h),S=m!==void 0?Number(m):void 0;this.initBuckets([i],a);const C=`${s}`,V=`${r}`,G=t[o][a]?.raw;return this.createScorecardData({title:d,value:y,rag:S,prevVal:G,valueFor:C,valueFrom:V})})}))};this.createScorecardGroupFromList=()=>{const{latest:e,earliest:t}=this.dataset;return[{title:"",scorecards:e.map((s,r)=>{const i=this.getScorecardValues(s),o=t[r][this.valueKey].raw;return this.createScorecardData({...i,prevVal:o})})}]};this.createScorecardGroupFromListWithGroups=()=>{const{latest:e,earliest:t}=this.dataset;let s=n.default.groupRowsByKey(t,this.groupKeyId),r=n.default.groupRowsByKey(e,this.groupKeyId);return this.groupKeyId===this.titleKey&&(r=[r.flat()],s=[s.flat()]),r.map((o,a)=>({title:this.createGroupTitle(o[0]),scorecards:o.map((c,d)=>{const p=this.getScorecardValues(c),m=s[a][d][this.valueKey]?.raw;return this.createScorecardData({...p,prevVal:m})})}))};this.getScorecardValues=e=>{const{latestTs:t,earliestTs:s}=this.dataset,r=`${this.titleColumn.display} ${e[this.titleKey].raw}`,i=e[this.valueKey],{raw:o,rag:a}=i,c=Number(o),d=a!==void 0?Number(a):void 0;this.initBuckets([e],this.valueKey);const p=`${t}`,h=`${s}`;return{title:r,value:c,rag:d,valueFor:p,valueFrom:h}};this.buildScorecard=()=>{const{latest:e,earliest:t,latestTs:s,earliestTs:r}=this.dataset;return e.map((o,a)=>{const{raw:c,rag:d}=o[this.valueKey],p=t[a][this.valueKey].raw,h=`${s}`,m=`${r}`,y=this.titleColumn.display;return this.createScorecardData({title:y,value:c,rag:d,prevVal:p,valueFor:h,valueFrom:m})})[0]};this.createGroupTitle=e=>{const t=this.groupKeyId?`${e[this.groupKeyId]?.raw}`:"";return this.groupKeyDisplay&&this.groupKeyDisplay.length?`${this.groupKeyDisplay}: ${t}`:t};this.buildGroup=()=>{let e;return this.valueColumn?this.groupKey?e=this.createScorecardGroupFromListWithGroups():e=this.createScorecardGroupFromList():e=this.createScorecardGroupFromColumns(),e};this.build=()=>(this.validateDefinition(),this.group?this.buildGroup():this.buildScorecard());this.group=s,this.dataset=this.getDataset(t,e),s?this.initGroupVars():(this.valueKey=this.measures[0].id,this.titleColumn={display:t.display,id:this.valueKey},this.initBuckets(e,this.valueKey))}}var M=f;0&&(module.exports={ScorecardVisualisation});
1
+ var V=Object.create;var g=Object.defineProperty;var k=Object.getOwnPropertyDescriptor;var B=Object.getOwnPropertyNames;var $=Object.getPrototypeOf,F=Object.prototype.hasOwnProperty;var T=(n,u)=>{for(var e in u)g(n,e,{get:u[e],enumerable:!0})},b=(n,u,e,t)=>{if(u&&typeof u=="object"||typeof u=="function")for(let s of B(u))!F.call(n,s)&&s!==e&&g(n,s,{get:()=>u[s],enumerable:!(t=k(u,s))||t.enumerable});return n};var f=(n,u,e)=>(e=n!=null?V($(n)):{},b(u||!n||!n.__esModule?g(e,"default",{value:n,enumerable:!0}):e,n)),N=n=>b(g({},"__esModule",{value:!0}),n);var x={};T(x,{ScorecardVisualisation:()=>D,default:()=>I});module.exports=N(x);var K=f(require("../dashboard-visualisation/DashboardVisualisation")),l=f(require("../../../utils/datasetHelper")),v=f(require("../../_charts/chart/Buckets"));class D extends K.default{constructor(e,t,s=!1){super(e,t);this.buckets=[];this.valueKey="";this.titleKey="";this.ragColours=["#cce2d8","#fff7bf","#f4cdc6"];this.initBuckets=(e,t)=>{(this.definition.options?.buckets||this.definition.options?.useRagColour)&&(this.bucketsHelper=new v.default(e,this.definition,t,!1,this.ragColours),this.buckets=new v.default(e,this.definition,t,!1,this.ragColours).getBuckets())};this.initGroupVars=()=>{this.groupKey=l.default.getGroupKey(this.keys,this.dataset.latest),this.groupKeyId=this.groupKey?.id,this.groupKeyDisplay=this.groupKey?.display,this.valueColumn=this.measures.find(e=>e.displayValue),this.valueColumn&&(this.valueKey=this.valueColumn?.id,this.titleColumn=this.measures.find(e=>e.display||e.display===""),this.titleKey=this.titleColumn?.id||"")};this.getDataset=(e,t)=>{const s=l.default.getLastestDataset(t),r=l.default.getDatasetRows(e,s),i=r[0]?.ts?.raw,o=l.default.filterRowsByDisplayColumns(e,r,!0),a=l.default.getEarliestDataset(t),c=l.default.getDatasetRows(e,a),d=c[0]?.ts?.raw;return{earliest:l.default.filterRowsByDisplayColumns(e,c,!0),earliestTs:d,latest:o,latestTs:i}};this.setRagScore=(e,t)=>this.bucketsHelper?.getBucketForValue(e,t);this.createScorecardData=({title:e,value:t,rag:s,valueFor:r,valueFrom:i,prevVal:o,groupTitle:a})=>({id:this.definition.id,title:e,value:t,...!Number.isNaN(t)&&this.buckets.length&&this.bucketsHelper&&{rag:this.setRagScore(t,s)},valueFor:r,trend:this.createTrend(r,i,t,o),...a&&{group:a}});this.createTrend=(e,t,s,r)=>{let i;if(t!==e){const o=+s-+r;i={direction:Math.sign(o),value:Math.abs(o),from:t}}return i};this.validateDefinition=()=>{const{id:e,type:t}=this.definition,s=[];if(this.group||(this.measures.length!==1?s.push(`Measures should only have 1 column defined. Found ${this.measures.length}`):this.titleColumn?this.valueKey||s.push('Missing ID in title measure. Expected measure to include "id: string" field'):s.push('No title column defined. Expected measure to include "display: string" field')),s.length){const r=`Validation: Visualisaton definition: ID: ${e}, type: ${t}, errors: ${s.join(",")}`;throw new Error(r)}};this.createScorecardGroupFromColumns=()=>{const{latest:e,earliest:t,latestTs:s,earliestTs:r}=this.dataset;return e.map((i,o)=>({title:this.createGroupTitle(i),scorecards:Object.keys(i).filter(a=>a!==this.groupKeyId).map(a=>{const d=this.measures.find(R=>R.id===a)?.display||a,p=i[a],{raw:h,rag:m}=p,y=Number(h),S=m!==void 0?Number(m):void 0;this.initBuckets([i],a);const C=`${s}`,w=`${r}`,G=t[o][a]?.raw;return this.createScorecardData({title:d,value:y,rag:S,prevVal:G,valueFor:C,valueFrom:w})})}))};this.createScorecardGroupFromList=()=>{const{latest:e,earliest:t}=this.dataset;return[{title:"",scorecards:e.map((s,r)=>{const i=this.getScorecardValues(s),o=t[r][this.valueKey].raw;return this.createScorecardData({...i,prevVal:o})})}]};this.createScorecardGroupFromListWithGroups=()=>{const{latest:e,earliest:t}=this.dataset;let s=l.default.groupRowsByKey(t,this.groupKeyId),r=l.default.groupRowsByKey(e,this.groupKeyId);return this.groupKeyId===this.titleKey&&(r=[r.flat()],s=[s.flat()]),r.map((o,a)=>({title:this.groupKeyDisplay?`By ${this.groupKeyDisplay}`:"",scorecards:o.map((c,d)=>{const p=this.getScorecardValues(c),m=s[a][d][this.valueKey]?.raw;return this.createScorecardData({...p,prevVal:m})})}))};this.getScorecardValues=e=>{const{latestTs:t,earliestTs:s}=this.dataset,r=`${this.titleColumn?.display} ${e[this.titleKey].raw}`,i=e[this.valueKey],{raw:o,rag:a}=i,c=Number(o),d=a!==void 0?Number(a):void 0;this.initBuckets([e],this.valueKey);const p=`${t}`,h=`${s}`;return{title:r,value:c,rag:d,valueFor:p,valueFrom:h}};this.buildScorecard=()=>{const{latest:e,earliest:t,latestTs:s,earliestTs:r}=this.dataset;return e.map((o,a)=>{const{raw:c,rag:d}=o[this.valueKey],p=t[a][this.valueKey].raw,h=`${s}`,m=`${r}`,y=this.titleColumn?.display;return this.createScorecardData({title:y||"",value:c,rag:d,prevVal:p,valueFor:h,valueFrom:m})})[0]};this.createGroupTitle=e=>{const t=this.groupKeyId?`${e[this.groupKeyId]?.raw}`:"";return this.groupKeyDisplay&&this.groupKeyDisplay.length?`${this.groupKeyDisplay}: ${t}`:t};this.buildGroup=()=>{let e;return this.valueColumn?this.groupKey?e=this.createScorecardGroupFromListWithGroups():e=this.createScorecardGroupFromList():e=this.createScorecardGroupFromColumns(),e};this.build=()=>(this.validateDefinition(),this.group?this.buildGroup():this.buildScorecard());this.group=s,this.dataset=this.getDataset(t,e),s?this.initGroupVars():(this.valueKey=this.measures[0].id,this.titleColumn={display:t.display,id:this.valueKey},this.initBuckets(e,this.valueKey))}}var I=D;0&&(module.exports={ScorecardVisualisation});
2
2
  //# sourceMappingURL=Scorecard.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../src/dpr/components/_dashboards/scorecard/Scorecard.ts"],
4
- "sourcesContent": ["/* eslint-disable prefer-destructuring */\nimport { DashboardDataResponse } from '../../../types/Metrics'\nimport DashboardVisualisationClass from '../../_charts/chart/DashboardVisualisation'\nimport {\n DashboardVisualisation,\n DashboardVisualisationBucket,\n DashboardVisualisationColumnKey,\n DashboardVisualisationColumnMeasure,\n} from '../dashboard/types'\nimport DatasetHelper from '../../../utils/datasetHelper'\nimport { CreateScorecardDataArgs, Scorecard, ScorecardDataset, ScorecardGroup, ScorecardTrend } from './types'\nimport Buckets from '../../_charts/chart/Buckets'\n\nclass ScorecardVisualisation extends DashboardVisualisationClass {\n private dataset: ScorecardDataset\n\n private groupKey: DashboardVisualisationColumnKey\n\n private groupKeyId: string\n\n private groupKeyDisplay: string\n\n private bucketsHelper: Buckets\n\n private buckets: DashboardVisualisationBucket[] = []\n\n private valueColumn: DashboardVisualisationColumnMeasure\n\n private valueKey: string\n\n private titleColumn: DashboardVisualisationColumnMeasure\n\n private titleKey: string\n\n private group: boolean\n\n private ragColours: string[] = ['#cce2d8', '#fff7bf', '#f4cdc6']\n\n constructor(responseData: DashboardDataResponse[], definition: DashboardVisualisation, group = false) {\n super(responseData, definition)\n this.group = group\n this.dataset = this.getDataset(definition, responseData)\n\n if (group) {\n this.initGroupVars()\n } else {\n this.valueKey = this.measures[0].id\n this.titleColumn = { display: definition.display, id: this.valueKey }\n this.initBuckets(responseData, this.valueKey)\n }\n }\n\n private initBuckets = (responseData: DashboardDataResponse[], valueKey: string) => {\n this.bucketsHelper = new Buckets(responseData, this.definition, valueKey, false, this.ragColours)\n this.buckets = new Buckets(responseData, this.definition, valueKey, false, this.ragColours).getBuckets()\n }\n\n private initGroupVars = () => {\n this.groupKey = DatasetHelper.getGroupKey(this.keys, this.dataset.latest)\n this.groupKeyId = this.groupKey?.id\n this.groupKeyDisplay = this.groupKey?.display\n\n this.valueColumn = this.measures.find((col) => col.displayValue)\n if (this.valueColumn) {\n this.valueKey = this.valueColumn?.id\n this.titleColumn = this.measures.find((col) => {\n return col.display || col.display === ''\n })\n this.titleKey = this.titleColumn?.id\n }\n }\n\n private getDataset = (scorecardDefinition: DashboardVisualisation, rawData: DashboardDataResponse[]) => {\n const latestData = DatasetHelper.getLastestDataset(rawData)\n const latestDataSetRows = DatasetHelper.getDatasetRows(scorecardDefinition, latestData)\n const latestTs = latestDataSetRows[0]?.ts?.raw\n const latestFiltered = DatasetHelper.filterRowsByDisplayColumns(scorecardDefinition, latestDataSetRows, true)\n\n const earliestData = DatasetHelper.getEarliestDataset(rawData)\n const earliestDataSetRows = DatasetHelper.getDatasetRows(scorecardDefinition, earliestData)\n const earliestTs = earliestDataSetRows[0]?.ts?.raw\n const earliestfiltered = DatasetHelper.filterRowsByDisplayColumns(scorecardDefinition, earliestDataSetRows, true)\n\n return {\n earliest: earliestfiltered,\n earliestTs,\n latest: latestFiltered,\n latestTs,\n }\n }\n\n private setRagScore = (value: number, rag?: number) => {\n return this.bucketsHelper.getBucketForValue(value, rag)\n }\n\n private createScorecardData = ({\n title,\n value,\n rag,\n valueFor,\n valueFrom,\n prevVal,\n groupTitle,\n }: CreateScorecardDataArgs) => {\n return {\n title,\n value,\n ...(!Number.isNaN(value) && this.buckets.length && { rag: this.setRagScore(<number>value, rag) }),\n valueFor,\n trend: this.createTrend(valueFor, valueFrom, value, prevVal),\n ...(groupTitle && {\n group: groupTitle,\n }),\n }\n }\n\n private createTrend = (\n valueFor: string,\n valueFrom: string,\n latestValue: string | number,\n earliestValue: string | number,\n ): ScorecardTrend | undefined => {\n let trendData\n\n if (valueFrom !== valueFor) {\n const value = +latestValue - +earliestValue\n const direction = Math.sign(value)\n trendData = {\n direction,\n value: Math.abs(value),\n from: valueFrom,\n }\n }\n\n return trendData\n }\n\n private validateDefinition = () => {\n const { id, type } = this.definition\n const errors = []\n if (!this.group) {\n if (this.measures.length !== 1) {\n errors.push(`Measures should only have 1 column defined. Found ${this.measures.length}`)\n } else if (!this.titleColumn) {\n errors.push(`No title column defined. Expected measure to include \"display: string\" field`)\n } else if (!this.valueKey) {\n errors.push(`Missing ID in title measure. Expected measure to include \"id: string\" field`)\n }\n }\n\n if (errors.length) {\n // Throw the error\n const message = `Validation: Visualisaton definition: ID: ${id}, type: ${type}, errors: ${errors.join(',')}`\n throw new Error(message)\n }\n }\n\n private createScorecardGroupFromColumns = () => {\n const { latest, earliest, latestTs, earliestTs } = this.dataset\n\n return latest.map((row, rowIndex) => {\n return {\n title: this.createGroupTitle(row),\n scorecards: Object.keys(row)\n .filter((colId) => colId !== this.groupKeyId)\n .map((colId) => {\n const measure = this.measures.find((m) => m.id === colId)\n const title = measure?.display || colId\n const rowCol = row[colId]\n const { raw, rag: ragScore } = rowCol\n const value = Number(raw)\n\n const rag = ragScore !== undefined ? Number(ragScore) : undefined\n this.initBuckets([row], colId)\n\n const valueFor = `${latestTs}`\n const valueFrom = `${earliestTs}`\n\n const comparisonRow = earliest[rowIndex]\n const prevVal = comparisonRow[colId]?.raw\n\n return this.createScorecardData({\n title,\n value,\n rag,\n prevVal,\n valueFor,\n valueFrom,\n })\n }),\n }\n })\n }\n\n private createScorecardGroupFromList = (): ScorecardGroup[] => {\n const { latest, earliest } = this.dataset\n return [\n {\n title: '',\n scorecards: latest.map((row: DashboardDataResponse, index: number) => {\n const values = this.getScorecardValues(row)\n const prevVal = earliest[index][this.valueKey].raw\n return this.createScorecardData({\n ...values,\n prevVal,\n })\n }),\n },\n ]\n }\n\n private createScorecardGroupFromListWithGroups = () => {\n const { latest, earliest } = this.dataset\n\n let earliestGroupedByKey = DatasetHelper.groupRowsByKey(earliest, this.groupKeyId)\n let latestGroupedByKey = DatasetHelper.groupRowsByKey(latest, this.groupKeyId)\n if (this.groupKeyId === this.titleKey) {\n latestGroupedByKey = [latestGroupedByKey.flat()]\n earliestGroupedByKey = [earliestGroupedByKey.flat()]\n }\n\n const scorecardGroup = latestGroupedByKey.map((group, groupIndex) => {\n return {\n title: this.createGroupTitle(group[0]),\n scorecards: group.map((row, rowIndex) => {\n const values = this.getScorecardValues(row)\n const comparisonRow = earliestGroupedByKey[groupIndex][rowIndex]\n const prevVal = comparisonRow[this.valueKey]?.raw\n\n return this.createScorecardData({\n ...values,\n prevVal,\n })\n }),\n }\n })\n\n return scorecardGroup\n }\n\n private getScorecardValues = (row: DashboardDataResponse) => {\n const { latestTs, earliestTs } = this.dataset\n const title = `${this.titleColumn.display} ${row[this.titleKey].raw}`\n const rowCol = row[this.valueKey]\n const { raw, rag: ragScore } = rowCol\n const value = Number(raw)\n const rag = ragScore !== undefined ? Number(ragScore) : undefined\n this.initBuckets([row], this.valueKey)\n const valueFor = `${latestTs}`\n const valueFrom = `${earliestTs}`\n\n return {\n title,\n value,\n rag,\n valueFor,\n valueFrom,\n }\n }\n\n /**\n * Builds a single scorecard\n *\n * @return {Scorecard}\n */\n private buildScorecard = () => {\n const { latest, earliest, latestTs, earliestTs } = this.dataset\n const scorecordArr: Scorecard[] = latest.map((datasetRow: DashboardDataResponse, index: number) => {\n const { raw: value, rag } = datasetRow[this.valueKey]\n const prevVal = earliest[index][this.valueKey].raw\n const valueFor = `${latestTs}`\n const valueFrom = `${earliestTs}`\n const title = this.titleColumn.display\n\n return this.createScorecardData({\n title,\n value,\n rag,\n prevVal,\n valueFor,\n valueFrom,\n })\n })\n\n return scorecordArr[0]\n }\n\n private createGroupTitle = (row: DashboardDataResponse) => {\n const title = this.groupKeyId ? `${row[this.groupKeyId]?.raw}` : ''\n return this.groupKeyDisplay && this.groupKeyDisplay.length ? `${this.groupKeyDisplay}: ${title}` : title\n }\n\n private buildGroup = () => {\n let scorecardGroup: ScorecardGroup[]\n if (!this.valueColumn) {\n scorecardGroup = this.createScorecardGroupFromColumns()\n } else if (this.groupKey) {\n scorecardGroup = this.createScorecardGroupFromListWithGroups()\n } else {\n scorecardGroup = this.createScorecardGroupFromList()\n }\n return scorecardGroup\n }\n\n build = () => {\n this.validateDefinition()\n if (this.group) {\n return this.buildGroup()\n }\n return this.buildScorecard()\n }\n}\n\nexport { ScorecardVisualisation }\nexport default ScorecardVisualisation\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["/* eslint-disable prefer-destructuring */\nimport { DashboardDataResponse } from '../../../types/Metrics'\nimport DashboardVisualisationClass from '../dashboard-visualisation/DashboardVisualisation'\nimport { DashboardVisualisationBucket } from '../dashboard-visualisation/types'\nimport DatasetHelper from '../../../utils/datasetHelper'\nimport { CreateScorecardDataArgs, Scorecard, ScorecardDataset, ScorecardGroup, ScorecardTrend } from './types'\nimport Buckets from '../../_charts/chart/Buckets'\nimport { components } from '../../../types/api'\n\nclass ScorecardVisualisation extends DashboardVisualisationClass {\n private dataset: ScorecardDataset\n\n private groupKey: components['schemas']['DashboardVisualisationColumnDefinition'] | undefined\n\n private groupKeyId: string | undefined\n\n private groupKeyDisplay: string | undefined\n\n private bucketsHelper: Buckets | undefined\n\n private buckets: DashboardVisualisationBucket[] = []\n\n private valueColumn: components['schemas']['DashboardVisualisationColumnDefinition'] | undefined\n\n private valueKey = ''\n\n private titleColumn: components['schemas']['DashboardVisualisationColumnDefinition'] | undefined\n\n private titleKey = ''\n\n private group: boolean\n\n private ragColours: string[] = ['#cce2d8', '#fff7bf', '#f4cdc6']\n\n constructor(\n responseData: DashboardDataResponse[],\n definition: components['schemas']['DashboardVisualisationDefinition'],\n group = false,\n ) {\n super(responseData, definition)\n this.group = group\n this.dataset = this.getDataset(definition, responseData)\n\n if (group) {\n this.initGroupVars()\n } else {\n this.valueKey = this.measures[0].id\n this.titleColumn = { display: definition.display, id: this.valueKey }\n this.initBuckets(responseData, this.valueKey)\n }\n }\n\n private initBuckets = (responseData: DashboardDataResponse[], valueKey: string) => {\n if (this.definition.options?.buckets || this.definition.options?.useRagColour) {\n this.bucketsHelper = new Buckets(responseData, this.definition, valueKey, false, this.ragColours)\n this.buckets = new Buckets(responseData, this.definition, valueKey, false, this.ragColours).getBuckets()\n }\n }\n\n private initGroupVars = () => {\n this.groupKey = DatasetHelper.getGroupKey(this.keys, this.dataset.latest)\n this.groupKeyId = this.groupKey?.id\n this.groupKeyDisplay = this.groupKey?.display\n\n this.valueColumn = this.measures.find((col) => col.displayValue)\n if (this.valueColumn) {\n this.valueKey = this.valueColumn?.id\n this.titleColumn = this.measures.find((col) => {\n return col.display || col.display === ''\n })\n this.titleKey = this.titleColumn?.id || ''\n }\n }\n\n private getDataset = (\n scorecardDefinition: components['schemas']['DashboardVisualisationDefinition'],\n rawData: DashboardDataResponse[],\n ) => {\n const latestData = DatasetHelper.getLastestDataset(rawData)\n const latestDataSetRows = DatasetHelper.getDatasetRows(scorecardDefinition, latestData)\n const latestTs = latestDataSetRows[0]?.ts?.raw\n const latestFiltered = DatasetHelper.filterRowsByDisplayColumns(scorecardDefinition, latestDataSetRows, true)\n\n const earliestData = DatasetHelper.getEarliestDataset(rawData)\n const earliestDataSetRows = DatasetHelper.getDatasetRows(scorecardDefinition, earliestData)\n const earliestTs = earliestDataSetRows[0]?.ts?.raw\n const earliestfiltered = DatasetHelper.filterRowsByDisplayColumns(scorecardDefinition, earliestDataSetRows, true)\n\n return {\n earliest: earliestfiltered,\n earliestTs,\n latest: latestFiltered,\n latestTs,\n }\n }\n\n private setRagScore = (value: number, rag?: number) => {\n return this.bucketsHelper?.getBucketForValue(value, rag)\n }\n\n private createScorecardData = ({\n title,\n value,\n rag,\n valueFor,\n valueFrom,\n prevVal,\n groupTitle,\n }: CreateScorecardDataArgs): Scorecard => {\n return {\n id: this.definition.id,\n title,\n value,\n ...(!Number.isNaN(value) &&\n this.buckets.length &&\n this.bucketsHelper && { rag: this.setRagScore(<number>value, rag) }),\n valueFor,\n trend: this.createTrend(valueFor, valueFrom, value, prevVal),\n ...(groupTitle && {\n group: groupTitle,\n }),\n }\n }\n\n private createTrend = (\n valueFor: string,\n valueFrom: string,\n latestValue: string | number,\n earliestValue: string | number,\n ): ScorecardTrend | undefined => {\n let trendData\n\n if (valueFrom !== valueFor) {\n const value = +latestValue - +earliestValue\n const direction = Math.sign(value)\n trendData = {\n direction,\n value: Math.abs(value),\n from: valueFrom,\n }\n }\n\n return trendData\n }\n\n private validateDefinition = () => {\n const { id, type } = this.definition\n const errors = []\n if (!this.group) {\n if (this.measures.length !== 1) {\n errors.push(`Measures should only have 1 column defined. Found ${this.measures.length}`)\n } else if (!this.titleColumn) {\n errors.push(`No title column defined. Expected measure to include \"display: string\" field`)\n } else if (!this.valueKey) {\n errors.push(`Missing ID in title measure. Expected measure to include \"id: string\" field`)\n }\n }\n\n if (errors.length) {\n // Throw the error\n const message = `Validation: Visualisaton definition: ID: ${id}, type: ${type}, errors: ${errors.join(',')}`\n throw new Error(message)\n }\n }\n\n private createScorecardGroupFromColumns = () => {\n const { latest, earliest, latestTs, earliestTs } = this.dataset\n\n return latest.map((row, rowIndex) => {\n return {\n title: this.createGroupTitle(row),\n scorecards: Object.keys(row)\n .filter((colId) => colId !== this.groupKeyId)\n .map((colId) => {\n const measure = this.measures.find((m) => m.id === colId)\n const title = measure?.display || colId\n const rowCol = row[colId]\n const { raw, rag: ragScore } = rowCol\n const value = Number(raw)\n\n const rag = ragScore !== undefined ? Number(ragScore) : undefined\n this.initBuckets([row], colId)\n\n const valueFor = `${latestTs}`\n const valueFrom = `${earliestTs}`\n\n const comparisonRow = earliest[rowIndex]\n const prevVal = comparisonRow[colId]?.raw\n\n return this.createScorecardData({\n title,\n value,\n rag,\n prevVal,\n valueFor,\n valueFrom,\n })\n }),\n }\n })\n }\n\n private createScorecardGroupFromList = (): ScorecardGroup[] => {\n const { latest, earliest } = this.dataset\n return [\n {\n title: '',\n scorecards: latest.map((row: DashboardDataResponse, index: number) => {\n const values = this.getScorecardValues(row)\n const prevVal = earliest[index][this.valueKey].raw\n return this.createScorecardData({\n ...values,\n prevVal,\n })\n }),\n },\n ]\n }\n\n private createScorecardGroupFromListWithGroups = () => {\n const { latest, earliest } = this.dataset\n\n let earliestGroupedByKey = DatasetHelper.groupRowsByKey(earliest, <string>this.groupKeyId)\n let latestGroupedByKey = DatasetHelper.groupRowsByKey(latest, <string>this.groupKeyId)\n if (this.groupKeyId === this.titleKey) {\n latestGroupedByKey = [latestGroupedByKey.flat()]\n earliestGroupedByKey = [earliestGroupedByKey.flat()]\n }\n\n const scorecardGroup = latestGroupedByKey.map((group, groupIndex) => {\n return {\n title: this.groupKeyDisplay ? `By ${this.groupKeyDisplay}` : '',\n scorecards: group.map((row, rowIndex) => {\n const values = this.getScorecardValues(row)\n const comparisonRow = earliestGroupedByKey[groupIndex][rowIndex]\n const prevVal = comparisonRow[this.valueKey]?.raw\n\n return this.createScorecardData({\n ...values,\n prevVal,\n })\n }),\n }\n })\n\n return scorecardGroup\n }\n\n private getScorecardValues = (row: DashboardDataResponse) => {\n const { latestTs, earliestTs } = this.dataset\n const title = `${this.titleColumn?.display} ${row[this.titleKey].raw}`\n const rowCol = row[this.valueKey]\n const { raw, rag: ragScore } = rowCol\n const value = Number(raw)\n const rag = ragScore !== undefined ? Number(ragScore) : undefined\n this.initBuckets([row], this.valueKey)\n const valueFor = `${latestTs}`\n const valueFrom = `${earliestTs}`\n\n return {\n title,\n value,\n rag,\n valueFor,\n valueFrom,\n }\n }\n\n /**\n * Builds a single scorecard\n *\n * @return {Scorecard}\n */\n private buildScorecard = () => {\n const { latest, earliest, latestTs, earliestTs } = this.dataset\n const scorecordArr: Scorecard[] = latest.map((datasetRow: DashboardDataResponse, index: number) => {\n const { raw: value, rag } = datasetRow[this.valueKey]\n const prevVal = earliest[index][this.valueKey].raw\n const valueFor = `${latestTs}`\n const valueFrom = `${earliestTs}`\n const title = this.titleColumn?.display\n\n return this.createScorecardData({\n title: title || '',\n value,\n rag,\n prevVal,\n valueFor,\n valueFrom,\n })\n })\n\n return scorecordArr[0]\n }\n\n private createGroupTitle = (row: DashboardDataResponse) => {\n const title = this.groupKeyId ? `${row[this.groupKeyId]?.raw}` : ''\n return this.groupKeyDisplay && this.groupKeyDisplay.length ? `${this.groupKeyDisplay}: ${title}` : title\n }\n\n private buildGroup = () => {\n let scorecardGroup: ScorecardGroup[]\n if (!this.valueColumn) {\n scorecardGroup = this.createScorecardGroupFromColumns()\n } else if (this.groupKey) {\n scorecardGroup = this.createScorecardGroupFromListWithGroups()\n } else {\n scorecardGroup = this.createScorecardGroupFromList()\n }\n return scorecardGroup\n }\n\n build = () => {\n this.validateDefinition()\n if (this.group) {\n return this.buildGroup()\n }\n return this.buildScorecard()\n }\n}\n\nexport { ScorecardVisualisation }\nexport default ScorecardVisualisation\n"],
5
+ "mappings": "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",
6
6
  "names": ["Scorecard_exports", "__export", "ScorecardVisualisation", "Scorecard_default", "__toCommonJS", "import_DashboardVisualisation", "import_datasetHelper", "import_Buckets", "DashboardVisualisationClass", "responseData", "definition", "group", "valueKey", "Buckets", "DatasetHelper", "col", "scorecardDefinition", "rawData", "latestData", "latestDataSetRows", "latestTs", "latestFiltered", "earliestData", "earliestDataSetRows", "earliestTs", "value", "rag", "title", "valueFor", "valueFrom", "prevVal", "groupTitle", "latestValue", "earliestValue", "trendData", "id", "type", "errors", "message", "latest", "earliest", "row", "rowIndex", "colId", "m", "rowCol", "raw", "ragScore", "index", "values", "earliestGroupedByKey", "latestGroupedByKey", "groupIndex", "datasetRow", "scorecardGroup"]
7
7
  }
@@ -1,42 +1,42 @@
1
1
  /* eslint-disable prefer-destructuring */
2
2
  import { DashboardDataResponse } from '../../../types/Metrics'
3
- import DashboardVisualisationClass from '../../_charts/chart/DashboardVisualisation'
4
- import {
5
- DashboardVisualisation,
6
- DashboardVisualisationBucket,
7
- DashboardVisualisationColumnKey,
8
- DashboardVisualisationColumnMeasure,
9
- } from '../dashboard/types'
3
+ import DashboardVisualisationClass from '../dashboard-visualisation/DashboardVisualisation'
4
+ import { DashboardVisualisationBucket } from '../dashboard-visualisation/types'
10
5
  import DatasetHelper from '../../../utils/datasetHelper'
11
6
  import { CreateScorecardDataArgs, Scorecard, ScorecardDataset, ScorecardGroup, ScorecardTrend } from './types'
12
7
  import Buckets from '../../_charts/chart/Buckets'
8
+ import { components } from '../../../types/api'
13
9
 
14
10
  class ScorecardVisualisation extends DashboardVisualisationClass {
15
11
  private dataset: ScorecardDataset
16
12
 
17
- private groupKey: DashboardVisualisationColumnKey
13
+ private groupKey: components['schemas']['DashboardVisualisationColumnDefinition'] | undefined
18
14
 
19
- private groupKeyId: string
15
+ private groupKeyId: string | undefined
20
16
 
21
- private groupKeyDisplay: string
17
+ private groupKeyDisplay: string | undefined
22
18
 
23
- private bucketsHelper: Buckets
19
+ private bucketsHelper: Buckets | undefined
24
20
 
25
21
  private buckets: DashboardVisualisationBucket[] = []
26
22
 
27
- private valueColumn: DashboardVisualisationColumnMeasure
23
+ private valueColumn: components['schemas']['DashboardVisualisationColumnDefinition'] | undefined
28
24
 
29
- private valueKey: string
25
+ private valueKey = ''
30
26
 
31
- private titleColumn: DashboardVisualisationColumnMeasure
27
+ private titleColumn: components['schemas']['DashboardVisualisationColumnDefinition'] | undefined
32
28
 
33
- private titleKey: string
29
+ private titleKey = ''
34
30
 
35
31
  private group: boolean
36
32
 
37
33
  private ragColours: string[] = ['#cce2d8', '#fff7bf', '#f4cdc6']
38
34
 
39
- constructor(responseData: DashboardDataResponse[], definition: DashboardVisualisation, group = false) {
35
+ constructor(
36
+ responseData: DashboardDataResponse[],
37
+ definition: components['schemas']['DashboardVisualisationDefinition'],
38
+ group = false,
39
+ ) {
40
40
  super(responseData, definition)
41
41
  this.group = group
42
42
  this.dataset = this.getDataset(definition, responseData)
@@ -51,8 +51,10 @@ class ScorecardVisualisation extends DashboardVisualisationClass {
51
51
  }
52
52
 
53
53
  private initBuckets = (responseData: DashboardDataResponse[], valueKey: string) => {
54
- this.bucketsHelper = new Buckets(responseData, this.definition, valueKey, false, this.ragColours)
55
- this.buckets = new Buckets(responseData, this.definition, valueKey, false, this.ragColours).getBuckets()
54
+ if (this.definition.options?.buckets || this.definition.options?.useRagColour) {
55
+ this.bucketsHelper = new Buckets(responseData, this.definition, valueKey, false, this.ragColours)
56
+ this.buckets = new Buckets(responseData, this.definition, valueKey, false, this.ragColours).getBuckets()
57
+ }
56
58
  }
57
59
 
58
60
  private initGroupVars = () => {
@@ -66,11 +68,14 @@ class ScorecardVisualisation extends DashboardVisualisationClass {
66
68
  this.titleColumn = this.measures.find((col) => {
67
69
  return col.display || col.display === ''
68
70
  })
69
- this.titleKey = this.titleColumn?.id
71
+ this.titleKey = this.titleColumn?.id || ''
70
72
  }
71
73
  }
72
74
 
73
- private getDataset = (scorecardDefinition: DashboardVisualisation, rawData: DashboardDataResponse[]) => {
75
+ private getDataset = (
76
+ scorecardDefinition: components['schemas']['DashboardVisualisationDefinition'],
77
+ rawData: DashboardDataResponse[],
78
+ ) => {
74
79
  const latestData = DatasetHelper.getLastestDataset(rawData)
75
80
  const latestDataSetRows = DatasetHelper.getDatasetRows(scorecardDefinition, latestData)
76
81
  const latestTs = latestDataSetRows[0]?.ts?.raw
@@ -90,7 +95,7 @@ class ScorecardVisualisation extends DashboardVisualisationClass {
90
95
  }
91
96
 
92
97
  private setRagScore = (value: number, rag?: number) => {
93
- return this.bucketsHelper.getBucketForValue(value, rag)
98
+ return this.bucketsHelper?.getBucketForValue(value, rag)
94
99
  }
95
100
 
96
101
  private createScorecardData = ({
@@ -101,11 +106,14 @@ class ScorecardVisualisation extends DashboardVisualisationClass {
101
106
  valueFrom,
102
107
  prevVal,
103
108
  groupTitle,
104
- }: CreateScorecardDataArgs) => {
109
+ }: CreateScorecardDataArgs): Scorecard => {
105
110
  return {
111
+ id: this.definition.id,
106
112
  title,
107
113
  value,
108
- ...(!Number.isNaN(value) && this.buckets.length && { rag: this.setRagScore(<number>value, rag) }),
114
+ ...(!Number.isNaN(value) &&
115
+ this.buckets.length &&
116
+ this.bucketsHelper && { rag: this.setRagScore(<number>value, rag) }),
109
117
  valueFor,
110
118
  trend: this.createTrend(valueFor, valueFrom, value, prevVal),
111
119
  ...(groupTitle && {
@@ -212,8 +220,8 @@ class ScorecardVisualisation extends DashboardVisualisationClass {
212
220
  private createScorecardGroupFromListWithGroups = () => {
213
221
  const { latest, earliest } = this.dataset
214
222
 
215
- let earliestGroupedByKey = DatasetHelper.groupRowsByKey(earliest, this.groupKeyId)
216
- let latestGroupedByKey = DatasetHelper.groupRowsByKey(latest, this.groupKeyId)
223
+ let earliestGroupedByKey = DatasetHelper.groupRowsByKey(earliest, <string>this.groupKeyId)
224
+ let latestGroupedByKey = DatasetHelper.groupRowsByKey(latest, <string>this.groupKeyId)
217
225
  if (this.groupKeyId === this.titleKey) {
218
226
  latestGroupedByKey = [latestGroupedByKey.flat()]
219
227
  earliestGroupedByKey = [earliestGroupedByKey.flat()]
@@ -221,7 +229,7 @@ class ScorecardVisualisation extends DashboardVisualisationClass {
221
229
 
222
230
  const scorecardGroup = latestGroupedByKey.map((group, groupIndex) => {
223
231
  return {
224
- title: this.createGroupTitle(group[0]),
232
+ title: this.groupKeyDisplay ? `By ${this.groupKeyDisplay}` : '',
225
233
  scorecards: group.map((row, rowIndex) => {
226
234
  const values = this.getScorecardValues(row)
227
235
  const comparisonRow = earliestGroupedByKey[groupIndex][rowIndex]
@@ -240,7 +248,7 @@ class ScorecardVisualisation extends DashboardVisualisationClass {
240
248
 
241
249
  private getScorecardValues = (row: DashboardDataResponse) => {
242
250
  const { latestTs, earliestTs } = this.dataset
243
- const title = `${this.titleColumn.display} ${row[this.titleKey].raw}`
251
+ const title = `${this.titleColumn?.display} ${row[this.titleKey].raw}`
244
252
  const rowCol = row[this.valueKey]
245
253
  const { raw, rag: ragScore } = rowCol
246
254
  const value = Number(raw)
@@ -270,10 +278,10 @@ class ScorecardVisualisation extends DashboardVisualisationClass {
270
278
  const prevVal = earliest[index][this.valueKey].raw
271
279
  const valueFor = `${latestTs}`
272
280
  const valueFrom = `${earliestTs}`
273
- const title = this.titleColumn.display
281
+ const title = this.titleColumn?.display
274
282
 
275
283
  return this.createScorecardData({
276
- title,
284
+ title: title || '',
277
285
  value,
278
286
  rag,
279
287
  prevVal,
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../src/dpr/components/_dashboards/scorecard/types.ts"],
4
- "sourcesContent": ["import { DashboardDataResponse } from '../../../types/Metrics'\n\nexport interface Scorecard {\n title: string\n group?: string\n value: number | string\n trend?: ScorecardTrend\n link?: {\n href: '#'\n displayName: 'View breakdown'\n }\n valueFor?: string\n rag?: ScorecardRag\n}\n\nexport interface ScorecardSubGroup {\n name: string\n scorecards: Scorecard[]\n}\n\nexport interface ScorecardGroup {\n title?: string\n description?: string\n scorecards: Scorecard[]\n}\n\nexport interface ScorecardTrend {\n direction: number\n value: number\n from: string\n}\n\nexport interface ScorecardRag {\n score: number\n colour: string\n}\n\nexport interface ScorecardDataset {\n earliest: DashboardDataResponse[]\n earliestTs: string | number\n latest: DashboardDataResponse[]\n latestTs: string | number\n}\n\nexport interface CreateScorecardDataArgs {\n title: string\n value: string | number\n rag?: number\n valueFor: string\n valueFrom: string\n prevVal: string | number\n groupTitle?: string\n}\n"],
4
+ "sourcesContent": ["import { DashboardDataResponse } from '../../../types/Metrics'\n\nexport interface Scorecard {\n id: string\n title: string\n group?: string\n value: number | string\n trend?: ScorecardTrend\n link?: {\n href: '#'\n displayName: 'View breakdown'\n }\n valueFor?: string\n rag?: ScorecardRag\n}\n\nexport interface ScorecardSubGroup {\n name: string\n scorecards: Scorecard[]\n}\n\nexport interface ScorecardGroup {\n title?: string\n description?: string\n scorecards: Scorecard[]\n}\n\nexport interface ScorecardTrend {\n direction: number\n value: number\n from: string\n}\n\nexport interface ScorecardRag {\n score: number\n colour: string\n}\n\nexport interface ScorecardDataset {\n earliest: DashboardDataResponse[]\n earliestTs: string | number\n latest: DashboardDataResponse[]\n latestTs: string | number\n}\n\nexport interface CreateScorecardDataArgs {\n title: string\n value: string | number\n rag?: number\n valueFor: string\n valueFrom: string\n prevVal: string | number\n groupTitle?: string\n}\n"],
5
5
  "mappings": "kWAAA,IAAAA,EAAA,kBAAAC,EAAAD",
6
6
  "names": ["types_exports", "__toCommonJS"]
7
7
  }
@@ -1,6 +1,7 @@
1
1
  import { DashboardDataResponse } from '../../../types/Metrics'
2
2
 
3
3
  export interface Scorecard {
4
+ id: string
4
5
  title: string
5
6
  group?: string
6
7
  value: number | string
@@ -1,2 +1,2 @@
1
- var d=Object.defineProperty;var p=Object.getOwnPropertyDescriptor;var u=Object.getOwnPropertyNames;var h=Object.prototype.hasOwnProperty;var l=(o,c)=>{for(var e in c)d(o,e,{get:c[e],enumerable:!0})},i=(o,c,e,t)=>{if(c&&typeof c=="object"||typeof c=="function")for(let r of u(c))!h.call(o,r)&&r!==e&&d(o,r,{get:()=>c[r],enumerable:!(t=p(c,r))||t.enumerable});return o};var m=o=>i(d({},"__esModule",{value:!0}),o);var S={};l(S,{default:()=>b,mergeScorecardsIntoGroup:()=>s});module.exports=m(S);var n=require("../dashboard/types");const s=o=>(o.reduce((e,t,r)=>(t.type===n.DashboardVisualisationType.SCORECARD&&e.push(r),e),[]).reduce((e,t)=>{const r=e[e.length-1];return(!r||r[r.length-1]!==t-1)&&e.push([]),e[e.length-1].push(t),e},[]).reverse().forEach(e=>{const t=e[0],r=e.map(a=>o[a].data).filter(a=>!!a);for(;e.length;)o.splice(e.pop(),1);r.length&&o.splice(t,0,{id:`${t}`,type:n.DashboardVisualisationType.SCORECARD_GROUP,data:[{scorecards:r}]})}),o);var b={mergeScorecardsIntoGroup:s};0&&(module.exports={mergeScorecardsIntoGroup});
1
+ var d=Object.defineProperty;var u=Object.getOwnPropertyDescriptor;var p=Object.getOwnPropertyNames;var h=Object.prototype.hasOwnProperty;var i=(o,c)=>{for(var e in c)d(o,e,{get:c[e],enumerable:!0})},l=(o,c,e,t)=>{if(c&&typeof c=="object"||typeof c=="function")for(let r of p(c))!h.call(o,r)&&r!==e&&d(o,r,{get:()=>c[r],enumerable:!(t=u(c,r))||t.enumerable});return o};var m=o=>l(d({},"__esModule",{value:!0}),o);var f={};i(f,{default:()=>b,mergeScorecardsIntoGroup:()=>s});module.exports=m(f);var n=require("../dashboard-visualisation/types");const s=o=>(o.reduce((e,t,r)=>(t.type===n.DashboardVisualisationType.SCORECARD&&e.push(r),e),[]).reduce((e,t)=>{const r=e[e.length-1];return(!r||r[r.length-1]!==t-1)&&e.push([]),e[e.length-1].push(t),e},[]).reverse().forEach(e=>{const t=e[0],r=e.map(a=>o[a].data).filter(a=>!!a);for(;e.length;){const a=e.pop();a!==void 0&&o.splice(a,1)}r.length&&o.splice(t,0,{id:`${t}`,type:n.DashboardVisualisationType.SCORECARD_GROUP,data:[{scorecards:r}]})}),o);var b={mergeScorecardsIntoGroup:s};0&&(module.exports={mergeScorecardsIntoGroup});
2
2
  //# sourceMappingURL=utils.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../src/dpr/components/_dashboards/scorecard/utils.ts"],
4
- "sourcesContent": ["import { DashboardUIVisualisation, DashboardVisualisationType } from '../dashboard/types'\nimport { Scorecard } from './types'\n\nexport const mergeScorecardsIntoGroup = (visualisations: DashboardUIVisualisation[]) => {\n const groupedScorecardIndexes: number[][] = visualisations\n // get scorecard indexes\n .reduce((acc: number[], vis: DashboardUIVisualisation, i: number) => {\n if (vis.type === DashboardVisualisationType.SCORECARD) acc.push(i)\n return acc\n }, [])\n // group adjacent indexes\n .reduce((r, n) => {\n const lastSubArray = r[r.length - 1]\n if (!lastSubArray || lastSubArray[lastSubArray.length - 1] !== n - 1) r.push([])\n r[r.length - 1].push(n)\n return r\n }, [])\n\n groupedScorecardIndexes.reverse().forEach((group: number[]) => {\n const spliceAtIndex = group[0]\n const scorecardGroup: Scorecard[] = group\n .map((scIndex: number) => {\n return visualisations[scIndex].data as Scorecard\n })\n .filter((scorecard: Scorecard) => !!scorecard)\n\n while (group.length) {\n visualisations.splice(group.pop(), 1)\n }\n\n if (scorecardGroup.length) {\n visualisations.splice(spliceAtIndex, 0, {\n id: `${spliceAtIndex}`,\n type: DashboardVisualisationType.SCORECARD_GROUP,\n data: [{ scorecards: scorecardGroup }],\n })\n }\n })\n\n return visualisations\n}\n\nexport default {\n mergeScorecardsIntoGroup,\n}\n"],
5
- "mappings": "4ZAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,aAAAE,EAAA,6BAAAC,IAAA,eAAAC,EAAAJ,GAAA,IAAAK,EAAqE,8BAG9D,MAAMF,EAA4BG,IACKA,EAEzC,OAAO,CAACC,EAAeC,EAA+BC,KACjDD,EAAI,OAAS,6BAA2B,WAAWD,EAAI,KAAKE,CAAC,EAC1DF,GACN,CAAC,CAAC,EAEJ,OAAO,CAACG,EAAGC,IAAM,CAChB,MAAMC,EAAeF,EAAEA,EAAE,OAAS,CAAC,EACnC,OAAI,CAACE,GAAgBA,EAAaA,EAAa,OAAS,CAAC,IAAMD,EAAI,IAAGD,EAAE,KAAK,CAAC,CAAC,EAC/EA,EAAEA,EAAE,OAAS,CAAC,EAAE,KAAKC,CAAC,EACfD,CACT,EAAG,CAAC,CAAC,EAEiB,QAAQ,EAAE,QAASG,GAAoB,CAC7D,MAAMC,EAAgBD,EAAM,CAAC,EACvBE,EAA8BF,EACjC,IAAKG,GACGV,EAAeU,CAAO,EAAE,IAChC,EACA,OAAQC,GAAyB,CAAC,CAACA,CAAS,EAE/C,KAAOJ,EAAM,QACXP,EAAe,OAAOO,EAAM,IAAI,EAAG,CAAC,EAGlCE,EAAe,QACjBT,EAAe,OAAOQ,EAAe,EAAG,CACtC,GAAI,GAAGA,CAAa,GACpB,KAAM,6BAA2B,gBACjC,KAAM,CAAC,CAAE,WAAYC,CAAe,CAAC,CACvC,CAAC,CAEL,CAAC,EAEMT,GAGT,IAAOJ,EAAQ,CACb,yBAAAC,CACF",
4
+ "sourcesContent": ["import { DashboardVisualisation, DashboardVisualisationType } from '../dashboard-visualisation/types'\nimport { Scorecard } from './types'\n\nexport const mergeScorecardsIntoGroup = (visualisations: DashboardVisualisation[]) => {\n const groupedScorecardIndexes: number[][] = visualisations\n // get scorecard indexes\n .reduce((acc: number[], vis: DashboardVisualisation, i: number) => {\n if (vis.type === DashboardVisualisationType.SCORECARD) acc.push(i)\n return acc\n }, [])\n // group adjacent indexes\n .reduce((r: number[][], n) => {\n const lastSubArray = r[r.length - 1]\n if (!lastSubArray || lastSubArray[lastSubArray.length - 1] !== n - 1) r.push([])\n r[r.length - 1].push(n)\n return r\n }, [])\n\n groupedScorecardIndexes.reverse().forEach((group: number[]) => {\n const spliceAtIndex = group[0]\n const scorecardGroup: Scorecard[] = group\n .map((scIndex: number) => {\n return visualisations[scIndex].data as Scorecard\n })\n .filter((scorecard: Scorecard) => !!scorecard)\n\n while (group.length) {\n const i = group.pop()\n if (i !== undefined) visualisations.splice(i, 1)\n }\n\n if (scorecardGroup.length) {\n visualisations.splice(spliceAtIndex, 0, {\n id: `${spliceAtIndex}`,\n type: DashboardVisualisationType.SCORECARD_GROUP,\n data: [{ scorecards: scorecardGroup }],\n })\n }\n })\n\n return visualisations\n}\n\nexport default {\n mergeScorecardsIntoGroup,\n}\n"],
5
+ "mappings": "4ZAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,aAAAE,EAAA,6BAAAC,IAAA,eAAAC,EAAAJ,GAAA,IAAAK,EAAmE,4CAG5D,MAAMF,EAA4BG,IACKA,EAEzC,OAAO,CAACC,EAAeC,EAA6BC,KAC/CD,EAAI,OAAS,6BAA2B,WAAWD,EAAI,KAAKE,CAAC,EAC1DF,GACN,CAAC,CAAC,EAEJ,OAAO,CAACG,EAAeC,IAAM,CAC5B,MAAMC,EAAeF,EAAEA,EAAE,OAAS,CAAC,EACnC,OAAI,CAACE,GAAgBA,EAAaA,EAAa,OAAS,CAAC,IAAMD,EAAI,IAAGD,EAAE,KAAK,CAAC,CAAC,EAC/EA,EAAEA,EAAE,OAAS,CAAC,EAAE,KAAKC,CAAC,EACfD,CACT,EAAG,CAAC,CAAC,EAEiB,QAAQ,EAAE,QAASG,GAAoB,CAC7D,MAAMC,EAAgBD,EAAM,CAAC,EACvBE,EAA8BF,EACjC,IAAKG,GACGV,EAAeU,CAAO,EAAE,IAChC,EACA,OAAQC,GAAyB,CAAC,CAACA,CAAS,EAE/C,KAAOJ,EAAM,QAAQ,CACnB,MAAMJ,EAAII,EAAM,IAAI,EAChBJ,IAAM,QAAWH,EAAe,OAAOG,EAAG,CAAC,CACjD,CAEIM,EAAe,QACjBT,EAAe,OAAOQ,EAAe,EAAG,CACtC,GAAI,GAAGA,CAAa,GACpB,KAAM,6BAA2B,gBACjC,KAAM,CAAC,CAAE,WAAYC,CAAe,CAAC,CACvC,CAAC,CAEL,CAAC,EAEMT,GAGT,IAAOJ,EAAQ,CACb,yBAAAC,CACF",
6
6
  "names": ["utils_exports", "__export", "utils_default", "mergeScorecardsIntoGroup", "__toCommonJS", "import_types", "visualisations", "acc", "vis", "i", "r", "n", "lastSubArray", "group", "spliceAtIndex", "scorecardGroup", "scIndex", "scorecard"]
7
7
  }
@@ -1,8 +1,11 @@
1
1
  import ScorecardUtils from './utils'
2
2
  import { Scorecard } from './types'
3
3
 
4
- import { DashboardUIVisualisation, DashboardVisualisationType } from '../dashboard/types'
5
- import { ChartCardData } from '../../../types/Charts'
4
+ import {
5
+ DashboardVisualisation,
6
+ DashboardVisualisationType,
7
+ DashboardVisualisatonCardData,
8
+ } from '../dashboard-visualisation/types'
6
9
 
7
10
  describe('ScorecardUtils', () => {
8
11
  let scorecardData1: Scorecard
@@ -10,6 +13,7 @@ describe('ScorecardUtils', () => {
10
13
 
11
14
  beforeEach(() => {
12
15
  scorecardData1 = {
16
+ id: '1',
13
17
  rag: {
14
18
  colour: 'red',
15
19
  score: 2,
@@ -25,6 +29,7 @@ describe('ScorecardUtils', () => {
25
29
  }
26
30
 
27
31
  scorecardData2 = {
32
+ id: '2',
28
33
  rag: {
29
34
  colour: 'red',
30
35
  score: 2,
@@ -42,7 +47,7 @@ describe('ScorecardUtils', () => {
42
47
 
43
48
  describe('mergeScorecards', () => {
44
49
  it('should merge individual scorecards into a scorecard group', () => {
45
- const visualistationData: DashboardUIVisualisation[] = [
50
+ const visualistationData: DashboardVisualisation[] = [
46
51
  {
47
52
  id: '1',
48
53
  type: DashboardVisualisationType.SCORECARD,
@@ -56,7 +61,7 @@ describe('ScorecardUtils', () => {
56
61
  {
57
62
  id: '3',
58
63
  type: DashboardVisualisationType.BAR,
59
- data: {} as unknown as ChartCardData,
64
+ data: {} as unknown as DashboardVisualisatonCardData,
60
65
  },
61
66
  {
62
67
  id: '4',
@@ -79,6 +84,7 @@ describe('ScorecardUtils', () => {
79
84
  {
80
85
  scorecards: [
81
86
  {
87
+ id: '1',
82
88
  rag: {
83
89
  colour: 'red',
84
90
  score: 2,
@@ -93,6 +99,7 @@ describe('ScorecardUtils', () => {
93
99
  valueFor: 'Jan 25',
94
100
  },
95
101
  {
102
+ id: '2',
96
103
  rag: {
97
104
  colour: 'red',
98
105
  score: 2,
@@ -122,6 +129,7 @@ describe('ScorecardUtils', () => {
122
129
  {
123
130
  scorecards: [
124
131
  {
132
+ id: '1',
125
133
  rag: {
126
134
  colour: 'red',
127
135
  score: 2,
@@ -136,6 +144,7 @@ describe('ScorecardUtils', () => {
136
144
  valueFor: 'Jan 25',
137
145
  },
138
146
  {
147
+ id: '2',
139
148
  rag: {
140
149
  colour: 'red',
141
150
  score: 2,
@@ -1,15 +1,15 @@
1
- import { DashboardUIVisualisation, DashboardVisualisationType } from '../dashboard/types'
1
+ import { DashboardVisualisation, DashboardVisualisationType } from '../dashboard-visualisation/types'
2
2
  import { Scorecard } from './types'
3
3
 
4
- export const mergeScorecardsIntoGroup = (visualisations: DashboardUIVisualisation[]) => {
4
+ export const mergeScorecardsIntoGroup = (visualisations: DashboardVisualisation[]) => {
5
5
  const groupedScorecardIndexes: number[][] = visualisations
6
6
  // get scorecard indexes
7
- .reduce((acc: number[], vis: DashboardUIVisualisation, i: number) => {
7
+ .reduce((acc: number[], vis: DashboardVisualisation, i: number) => {
8
8
  if (vis.type === DashboardVisualisationType.SCORECARD) acc.push(i)
9
9
  return acc
10
10
  }, [])
11
11
  // group adjacent indexes
12
- .reduce((r, n) => {
12
+ .reduce((r: number[][], n) => {
13
13
  const lastSubArray = r[r.length - 1]
14
14
  if (!lastSubArray || lastSubArray[lastSubArray.length - 1] !== n - 1) r.push([])
15
15
  r[r.length - 1].push(n)
@@ -25,7 +25,8 @@ export const mergeScorecardsIntoGroup = (visualisations: DashboardUIVisualisatio
25
25
  .filter((scorecard: Scorecard) => !!scorecard)
26
26
 
27
27
  while (group.length) {
28
- visualisations.splice(group.pop(), 1)
28
+ const i = group.pop()
29
+ if (i !== undefined) visualisations.splice(i, 1)
29
30
  }
30
31
 
31
32
  if (scorecardGroup.length) {
@@ -1,6 +1,7 @@
1
- {% macro dprScoreCard(scorecard) %}
1
+ {% macro dprScoreCard(scorecard, index) %}
2
2
  {% set classes = scorecard.classes %}
3
3
 
4
+ {% set id = scorecard.id %}
4
5
  {% set title = scorecard.title %}
5
6
  {% set value = scorecard.value %}
6
7
  {% set rag = scorecard.rag %}
@@ -20,13 +21,13 @@
20
21
  {% set directionIcon = '◼' %}
21
22
  {% set directionDisplay = '' %}
22
23
  {% endif %}
23
- <div class="dpr-scorecard" data-dpr-module="scorecard">
24
- <p class="govuk-heading-s govuk-!-margin-bottom-1">
24
+ <div class="dpr-scorecard" data-dpr-module="scorecard" aria-labelledby="{{ id }}_title_{{index }}">
25
+ <p id="{{ id }}_title_{{index}}" class="govuk-heading-s govuk-!-margin-bottom-1">
25
26
  {{ title }}
26
27
  </p>
27
28
 
28
- <p style="background-color: {{ rag.colour }}" class="govuk-body dpr-scorecard__value {% if rag %}govuk-tag--{{ rag.colour }}{% endif %}">{{ value }}</p>
29
- {% if rag.score %}
29
+ <p {% if rag %}style="background-color: {{ rag.colour }}"{% endif %} class="govuk-body dpr-scorecard__value {% if rag %}govuk-tag--{{ rag.colour }}{% endif %}">{{ value }}</p>
30
+ {% if rag.score !== 'undefined' %}
30
31
  <p class="govuk-body dpr-scorecard__value-description">Status: {{ rag.score }}</p>
31
32
  {% endif %}
32
33