@ministryofjustice/hmpps-digital-prison-reporting-frontend 4.14.1 → 4.15.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (62) hide show
  1. package/dpr/all.mjs +2 -0
  2. package/dpr/all.scss +4 -0
  3. package/dpr/components/_catalogue/catalogue-list/utils.test.ts +1 -1
  4. package/dpr/components/_charts/chart/clientClass.mjs +4 -3
  5. package/dpr/components/_charts/chart/heatmap/clientClass.mjs +175 -0
  6. package/dpr/components/_charts/chart/heatmap/utils.js +2 -0
  7. package/dpr/components/_charts/chart/heatmap/utils.js.map +7 -0
  8. package/dpr/components/_charts/chart/heatmap/utils.ts +182 -0
  9. package/dpr/components/_charts/chart/styles.scss +4 -0
  10. package/dpr/components/_charts/utils.js +1 -1
  11. package/dpr/components/_charts/utils.js.map +3 -3
  12. package/dpr/components/_charts/utils.test.ts +4 -1
  13. package/dpr/components/_charts/utils.ts +73 -27
  14. package/dpr/components/_dashboards/dashboard/types.js +1 -1
  15. package/dpr/components/_dashboards/dashboard/types.js.map +2 -2
  16. package/dpr/components/_dashboards/dashboard/types.ts +13 -1
  17. package/dpr/components/_dashboards/dashboard-list/utils.js +1 -1
  18. package/dpr/components/_dashboards/dashboard-list/utils.js.map +3 -3
  19. package/dpr/components/_dashboards/dashboard-list/utils.test.ts +1 -0
  20. package/dpr/components/_dashboards/dashboard-list/utils.ts +4 -1
  21. package/dpr/components/_filters/types.d.js.map +1 -1
  22. package/dpr/components/_filters/types.d.ts +12 -8
  23. package/dpr/components/_filters/utils.js +1 -1
  24. package/dpr/components/_filters/utils.js.map +3 -3
  25. package/dpr/components/_filters/utils.ts +24 -2
  26. package/dpr/data/dashboardClient.js +1 -1
  27. package/dpr/data/dashboardClient.js.map +2 -2
  28. package/dpr/data/dashboardClient.ts +1 -1
  29. package/dpr/routes/journeys/request-report/filters/controller.js +1 -1
  30. package/dpr/routes/journeys/request-report/filters/controller.js.map +3 -3
  31. package/dpr/routes/journeys/request-report/filters/controller.ts +6 -2
  32. package/dpr/routes/journeys/request-report/filters/utils.js +1 -1
  33. package/dpr/routes/journeys/request-report/filters/utils.js.map +2 -2
  34. package/dpr/routes/journeys/request-report/filters/utils.ts +9 -3
  35. package/dpr/routes/journeys/view-report/async/dashboard/utils.js +1 -1
  36. package/dpr/routes/journeys/view-report/async/dashboard/utils.js.map +3 -3
  37. package/dpr/routes/journeys/view-report/async/dashboard/utils.ts +12 -3
  38. package/dpr/services/dashboardService.js +1 -1
  39. package/dpr/services/dashboardService.js.map +2 -2
  40. package/dpr/services/dashboardService.ts +1 -1
  41. package/dpr/types/Charts.js +1 -1
  42. package/dpr/types/Charts.js.map +1 -1
  43. package/dpr/types/Charts.ts +10 -3
  44. package/dpr/types/ExecutionData.d.js +1 -1
  45. package/dpr/types/ExecutionData.d.js.map +1 -1
  46. package/dpr/types/ExecutionData.d.ts +1 -0
  47. package/dpr/types/ReportQuery.js +1 -1
  48. package/dpr/types/ReportQuery.js.map +2 -2
  49. package/dpr/types/ReportQuery.ts +1 -0
  50. package/dpr/utils/DateMapper/DateMapper.js +1 -1
  51. package/dpr/utils/DateMapper/DateMapper.js.map +2 -2
  52. package/dpr/utils/DateMapper/DateMapper.ts +4 -0
  53. package/dpr/utils/ParentChildDataTableBuilder/ParentChildDataTableBuilder.js +1 -1
  54. package/dpr/utils/ParentChildDataTableBuilder/ParentChildDataTableBuilder.js.map +3 -3
  55. package/dpr/utils/ParentChildDataTableBuilder/ParentChildDataTableBuilder.ts +1 -41
  56. package/dpr/utils/UserStoreItemBuilder.js +1 -1
  57. package/dpr/utils/UserStoreItemBuilder.js.map +3 -3
  58. package/dpr/utils/UserStoreItemBuilder.ts +5 -3
  59. package/dpr/utils/requestStatusHelper.js +1 -1
  60. package/dpr/utils/requestStatusHelper.js.map +2 -2
  61. package/dpr/utils/requestStatusHelper.ts +1 -1
  62. package/package.json +5 -2
package/dpr/all.mjs CHANGED
@@ -48,6 +48,7 @@ import RecentlyViewedList from './components/user-reports/viewed/clientClass.mjs
48
48
  import BarChartVisualisation from './components/_charts/chart/bar/clientClass.mjs'
49
49
  import DoughnutChartVisualisation from './components/_charts/chart/doughnut/clientClass.mjs'
50
50
  import LineChartVisualisation from './components/_charts/chart/line/clientClass.mjs'
51
+ import MatrixChartVisualisation from './components/_charts/chart/heatmap/clientClass.mjs'
51
52
 
52
53
  // Dashboards
53
54
  import ScoreCard from './components/_dashboards/scorecard/clientClass.mjs'
@@ -86,6 +87,7 @@ function initAll() {
86
87
  BarChartVisualisation,
87
88
  DoughnutChartVisualisation,
88
89
  LineChartVisualisation,
90
+ MatrixChartVisualisation,
89
91
  ScoreCard,
90
92
  ReportActions,
91
93
  DownloadMessage,
package/dpr/all.scss CHANGED
@@ -1883,6 +1883,10 @@ ul.dpr-card-group__item__filters-list {
1883
1883
  height: 400px;
1884
1884
  }
1885
1885
 
1886
+ .dpr-matrix-chart {
1887
+ height: 700px;
1888
+ }
1889
+
1886
1890
  .dpr-canvas-wrapper {
1887
1891
  height: 100%;
1888
1892
  }
@@ -29,7 +29,7 @@ describe('CatalogueUtils', () => {
29
29
  const reportsTableData = await CatalogueUtils.getReportsList(res, services)
30
30
 
31
31
  expect(reportsTableData.head.length).toEqual(4)
32
- expect(reportsTableData.rows.length).toEqual(69)
32
+ expect(reportsTableData.rows.length).toEqual(70)
33
33
  })
34
34
  })
35
35
  })
@@ -1,6 +1,7 @@
1
1
  /* eslint-disable class-methods-use-this */
2
2
  import Chart from 'chart.js/auto'
3
3
  import ChartDataLabels from 'chartjs-plugin-datalabels'
4
+ import { MatrixController, MatrixElement } from 'chartjs-chart-matrix'
4
5
 
5
6
  import { DprClientClass } from '../../../DprClientClass.mjs'
6
7
 
@@ -18,7 +19,6 @@ class ChartVisualisation extends DprClientClass {
18
19
  this.legend = this.getElement().querySelector(`#js-legend-${this.id}`)
19
20
 
20
21
  // ChartCard elements
21
-
22
22
  this.tooltipDetailsEl = document.getElementById(`dpr-${this.id}-tooltip-details`)
23
23
  this.headlineValuesEl = document.getElementById(`dpr-${this.id}-headline-values`)
24
24
  this.labelElement = document.getElementById(`dpr-${this.id}-label`)
@@ -47,10 +47,11 @@ class ChartVisualisation extends DprClientClass {
47
47
 
48
48
  initChart() {
49
49
  Chart.defaults.font.family = 'GDS Transport'
50
- Chart.register(ChartDataLabels)
51
50
  Chart.defaults.font.size = 12
52
-
51
+ Chart.register(ChartDataLabels)
52
+ Chart.register(MatrixController, MatrixElement)
53
53
  this.chart = new Chart(this.chartContext, this.chartData)
54
+
54
55
  this.initChartEvents()
55
56
  }
56
57
 
@@ -0,0 +1,175 @@
1
+ /* eslint-disable prefer-destructuring */
2
+ /* eslint-disable class-methods-use-this */
3
+ import ChartVisualisation from '../clientClass.mjs'
4
+
5
+ export default class MatrixChartVisualisation extends ChartVisualisation {
6
+ static getModuleName() {
7
+ return 'matrix-chart'
8
+ }
9
+
10
+ initialise() {
11
+ this.setupCanvas()
12
+ this.settings = this.initSettings()
13
+ this.chartData = this.generateChartData(this.settings)
14
+ this.initChart(this.chartData)
15
+ }
16
+
17
+ initSettings() {
18
+ return {
19
+ options: this.setOptions({ scaleType: 'category' }),
20
+ toolTipOptions: this.setToolTipOptions(),
21
+ }
22
+ }
23
+
24
+ setToolTipOptions() {
25
+ const ctx = this
26
+ return {
27
+ callbacks: {
28
+ title(context) {
29
+ const { raw } = context[0]
30
+ const title = `${raw.y} ${raw.x}`
31
+ return title
32
+ },
33
+ label(context) {
34
+ const { data, label: legend } = context.dataset
35
+ const dataValue = data[context.dataIndex]
36
+ const label = `${dataValue.y} ${dataValue.x}`
37
+ const value = `${dataValue.v}${ctx.suffix}`
38
+ ctx.setHoverValue({ label, value, legend, ctx })
39
+ return `${legend}: ${value}`
40
+ },
41
+ },
42
+ }
43
+ }
44
+
45
+ setOptions({ scaleType }) {
46
+ return {
47
+ scales: this.setScales({ scaleType }),
48
+ }
49
+ }
50
+
51
+ generateChartData(settings) {
52
+ const { options, plugins, pluginsOptions, toolTipOptions, hoverEvent } = settings
53
+ return {
54
+ type: this.type,
55
+ data: {
56
+ datasets: this.createDatasets(),
57
+ },
58
+ options: {
59
+ responsive: true,
60
+ maintainAspectRatio: false,
61
+ animation: {
62
+ duration: 0,
63
+ },
64
+ hover: {
65
+ animationDuration: 0,
66
+ },
67
+ ...(options && options),
68
+ ...(hoverEvent && hoverEvent),
69
+ plugins: {
70
+ legend: {
71
+ position: 'bottom',
72
+ display: false,
73
+ },
74
+ ...(pluginsOptions && pluginsOptions),
75
+ datalabels: {
76
+ display: false,
77
+ },
78
+ tooltip: {
79
+ ...this.setToolTip(),
80
+ ...(toolTipOptions && toolTipOptions),
81
+ },
82
+ },
83
+ },
84
+ plugins: plugins && plugins.length ? [...plugins] : [],
85
+ }
86
+ }
87
+
88
+ createDatasets() {
89
+ const { datasets } = this.chartParams
90
+ return datasets.map((d) => {
91
+ const { label, data } = d
92
+ return {
93
+ label,
94
+ data,
95
+ backgroundColor(c) {
96
+ return c.raw.c
97
+ },
98
+ width: ({ chart }) => (chart.chartArea || {}).width / chart.scales.x.ticks.length - 1,
99
+ height: ({ chart }) => (chart.chartArea || {}).height / chart.scales.y.ticks.length - 1,
100
+ }
101
+ })
102
+ }
103
+
104
+ setScales({ scaleType }) {
105
+ let xTime
106
+ let yTime
107
+ let xLabels
108
+ let yLabels
109
+
110
+ switch (scaleType) {
111
+ case 'time':
112
+ yTime = {
113
+ unit: 'week',
114
+ }
115
+ xTime = {
116
+ unit: 'day',
117
+ }
118
+ break
119
+ case 'category':
120
+ {
121
+ const { datasets } = this.chartParams
122
+ xLabels = [
123
+ ...new Set(
124
+ datasets[0].data.map((d) => {
125
+ return d.x
126
+ }),
127
+ ),
128
+ ]
129
+ yLabels = [
130
+ ...new Set(
131
+ datasets[0].data.map((d) => {
132
+ return d.y
133
+ }),
134
+ ),
135
+ ]
136
+ }
137
+ break
138
+ default:
139
+ break
140
+ }
141
+
142
+ const grid = {
143
+ display: false,
144
+ drawBorder: false,
145
+ }
146
+ const ticks = {
147
+ padding: 1,
148
+ maxRotation: 0,
149
+ stepSize: 1,
150
+ }
151
+ const offset = true
152
+ const common = {
153
+ offset,
154
+ ticks,
155
+ grid,
156
+ }
157
+
158
+ return {
159
+ y: {
160
+ left: 'left',
161
+ ...(scaleType && { type: scaleType }),
162
+ ...(yLabels && { labels: yLabels }),
163
+ ...(yTime && { time: yTime }),
164
+ ...common,
165
+ },
166
+ x: {
167
+ position: 'top',
168
+ ...(scaleType && { type: scaleType }),
169
+ ...(xLabels && { labels: xLabels }),
170
+ ...(xTime && { time: xTime }),
171
+ ...common,
172
+ },
173
+ }
174
+ }
175
+ }
@@ -0,0 +1,2 @@
1
+ var y=Object.create;var m=Object.defineProperty;var Y=Object.getOwnPropertyDescriptor;var C=Object.getOwnPropertyNames;var g=Object.getPrototypeOf,x=Object.prototype.hasOwnProperty;var w=(a,r)=>{for(var s in r)m(a,s,{get:r[s],enumerable:!0})},p=(a,r,s,e)=>{if(r&&typeof r=="object"||typeof r=="function")for(let t of C(r))!x.call(a,t)&&t!==s&&m(a,t,{get:()=>r[t],enumerable:!(e=Y(r,t))||e.enumerable});return a};var D=(a,r,s)=>(s=a!=null?y(g(a)):{},p(r||!a||!a.__esModule?m(s,"default",{value:a,enumerable:!0}):s,a)),k=a=>p(m({},"__esModule",{value:!0}),a);var S={};w(S,{createTimeseriesMatrixChart:()=>z});module.exports=k(S);var c=D(require("dayjs")),M=require("with-alpha-hex"),b=require("../../../_dashboards/dashboard/types"),f=D(require("../../../../utils/datasetHelper"));const V=(a,r,s)=>{const{measures:e}=s;return a.map(t=>{const{raw:o,rag:n}=t[0][e[1].id],u=Number(o),d=n!==void 0?Number(t[0][e[1].id].rag):void 0;let i,l;switch(r){case"hourly":break;case"weekly":i=(0,c.default)(t[0].ts.raw,"DD/MM/YYYY").format("ddd"),l=(0,c.default)(t[0].ts.raw,"DD/MM/YYYY").week();break;case"daily":i=(0,c.default)(t[0].ts.raw,"DD/MM/YYYY").format("MMM YY"),l=(0,c.default)(t[0].ts.raw,"DD/MM/YYYY").format("D");break;case"monthly":{const h=t[0].ts.raw.split(" ");i=h[1],l=h[0]}break;case"annually":i="year",l=t[0].ts.raw;break;default:i=(0,c.default)(t[0].ts.raw,"DD/MM/YYYY").format("MMM YY"),l=(0,c.default)(t[0].ts.raw,"DD/MM/YYYY").format("D");break}return{y:l,x:i,v:u,r:d}})},R=(a,r,s,e)=>{const{columns:t}=s;v(s);const o=T(t);let n=V(a,r,t);return n=A(n,e),[{label:o,data:n}]},v=a=>{const{id:r,columns:s,type:e}=a,t=[];if(s.measures.length!==2?t.push(`Measures should only have 2 columns defined. Only found ${s.measures.length}`):e===b.DashboardVisualisationType.MATRIX_TIMESERIES&&s.measures[0].id!=="ts"&&t.push(`measure at index 0 has incorrect ID. Expected ID to be "ts". Found "${s.measures[0].id}"`),t.length){const o=`Validation: Visualisaton definition: ID: ${r}, type: ${e}, errors: ${t.join(",")}`;throw new Error(o)}},T=a=>a.measures[1].display,A=(a,r)=>{const{useRagColours:s}=r,e=G(a),t=e?$(a):3,o=I(t,s);return e?E(a,o):B(a,o)},B=(a,r)=>{const s=N(a,r.length),e=r.slice().reverse();return a.map(t=>{let o=0;return s.forEach((n,u)=>{t.v<=n&&(o=u)}),{...t,r:o,c:e[o]}})},E=(a,r)=>a.map(s=>({...s,c:r[s.r]})),I=(a,r)=>r?["#00703c","#ffdd00"," #d4351c"]:O(a),O=a=>{const r="#1d70b8",s=1/a;return Array.from(Array(a)).map((e,t)=>{const o=s*(t+1);return(0,M.withAlphaHex)(r,o)})},$=a=>Math.max(...a.map(r=>r.r))+1,G=a=>a[0].r!==void 0,N=(a,r)=>{const s=a.map(n=>n.v),e=Math.min(...s),t=Math.max(...s),o=Math.ceil((t-e)/r);return Array.from(Array(r)).map((n,u)=>o*(u+1)).reverse()},z=(a,r,s)=>{const{columns:e,options:t}=a,{measures:o}=e,n=o[0].unit?o[0].unit:void 0,u=a.type.split("-")[0],d=f.default.groupRowsByTimestamp(r),i=R(d,s,a,t);return{type:u,unit:n,timeseries:!0,data:{datasets:i}}};0&&(module.exports={createTimeseriesMatrixChart});
2
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../../src/dpr/components/_charts/chart/heatmap/utils.ts"],
4
+ "sourcesContent": ["/* eslint-disable prefer-destructuring */\nimport dayjs from 'dayjs'\nimport { withAlphaHex } from 'with-alpha-hex'\nimport {\n DashboardVisualisation,\n DashboardVisualisationColumns,\n DashboardVisualisationType,\n MatrixDashboardVisualisationOptions,\n} from '../../../_dashboards/dashboard/types'\nimport { Granularity } from '../../../_inputs/granular-date-range/types'\nimport { ChartData, ChartDataset, ChartType, MatrixChartData } from '../../../../types/Charts'\nimport { DashboardDataResponse } from '../../../../types/Metrics'\nimport DatasetHelper from '../../../../utils/datasetHelper'\n\nconst initTimeseriesMatrixAxis = (\n timeBlockData: DashboardDataResponse[][],\n granularity: Granularity,\n columns: DashboardVisualisationColumns,\n): MatrixChartData[] => {\n const { measures } = columns\n return timeBlockData.map((tsData) => {\n const { raw, rag } = tsData[0][measures[1].id]\n const v = Number(raw)\n const r = rag !== undefined ? Number(tsData[0][measures[1].id].rag) : undefined\n let x\n let y\n switch (granularity) {\n case 'hourly':\n break\n case 'weekly':\n x = dayjs(tsData[0].ts.raw, 'DD/MM/YYYY').format('ddd')\n y = dayjs(tsData[0].ts.raw, 'DD/MM/YYYY').week()\n break\n case 'daily':\n x = dayjs(tsData[0].ts.raw, 'DD/MM/YYYY').format('MMM YY')\n y = dayjs(tsData[0].ts.raw, 'DD/MM/YYYY').format('D')\n break\n case 'monthly':\n {\n const ts = (<string>tsData[0].ts.raw).split(' ')\n x = ts[1]\n y = ts[0]\n }\n break\n case 'annually':\n x = 'year'\n y = <string>tsData[0].ts.raw\n break\n default:\n x = dayjs(tsData[0].ts.raw, 'DD/MM/YYYY').format('MMM YY')\n y = dayjs(tsData[0].ts.raw, 'DD/MM/YYYY').format('D')\n break\n }\n\n return { y, x, v, r }\n })\n}\n\nconst createMatrixDataSet = (\n timeBlockData: DashboardDataResponse[][],\n granularity: Granularity,\n chartDefinition: DashboardVisualisation,\n options: MatrixDashboardVisualisationOptions,\n) => {\n const { columns } = chartDefinition\n validateDefinition(chartDefinition)\n const label = getLabel(columns)\n let data: MatrixChartData[] = initTimeseriesMatrixAxis(timeBlockData, granularity, columns)\n data = addBucketData(data, options)\n\n return [{ label, data }]\n}\n\nconst validateDefinition = (chartDefinition: DashboardVisualisation) => {\n const { id, columns, type } = chartDefinition\n\n const errors = []\n if (columns.measures.length !== 2) {\n errors.push(`Measures should only have 2 columns defined. Only found ${columns.measures.length}`)\n } else if (type === DashboardVisualisationType.MATRIX_TIMESERIES) {\n if (columns.measures[0].id !== 'ts') {\n errors.push(`measure at index 0 has incorrect ID. Expected ID to be \"ts\". Found \"${columns.measures[0].id}\"`)\n }\n }\n if (errors.length) {\n const message = `Validation: Visualisaton definition: ID: ${id}, type: ${type}, errors: ${errors.join(',')}`\n throw new Error(message)\n }\n}\n\nconst getLabel = (columns: DashboardVisualisationColumns) => {\n return columns.measures[1].display\n}\n\nconst addBucketData = (matrixDataSets: MatrixChartData[], options: MatrixDashboardVisualisationOptions) => {\n const { useRagColours } = options\n const hasRag = hasRagNumber(matrixDataSets)\n const bucketCount = hasRag ? getBucketCount(matrixDataSets) : 3\n const bucketColours = createRagColours(bucketCount, useRagColours)\n return hasRag ? setColoursForRag(matrixDataSets, bucketColours) : setColoursWithoutRag(matrixDataSets, bucketColours)\n}\n\nconst setColoursWithoutRag = (matrixDataSets: MatrixChartData[], bucketColours: string[]) => {\n const bucketSizes = getBucketSizes(matrixDataSets, bucketColours.length)\n const colours = bucketColours.slice().reverse()\n\n return matrixDataSets.map((dataPoint) => {\n let bucketNumber = 0\n bucketSizes.forEach((bucket, i) => {\n if (dataPoint.v <= bucket) bucketNumber = i\n })\n return { ...dataPoint, r: bucketNumber, c: colours[bucketNumber] }\n })\n}\n\nconst setColoursForRag = (matrixDataSets: MatrixChartData[], bucketColours: string[]) => {\n return matrixDataSets.map((dataPoint) => {\n return { ...dataPoint, c: bucketColours[dataPoint.r] }\n })\n}\n\nconst createRagColours = (bucketCount: number, useRagColours: boolean) => {\n const ragColours = ['#00703c', '#ffdd00', '\t#d4351c']\n return useRagColours ? ragColours : generateBucketColours(bucketCount)\n}\n\nconst generateBucketColours = (bucketCount: number) => {\n const baseColour = '#1d70b8'\n const alphaDivision = 1 / bucketCount\n return Array.from(Array(bucketCount)).map((d, i) => {\n const division = alphaDivision * (i + 1)\n return withAlphaHex(baseColour, division)\n })\n}\n\nconst getBucketCount = (matrixDataSets: MatrixChartData[]) => {\n return Math.max(...matrixDataSets.map((o) => o.r)) + 1\n}\n\nconst hasRagNumber = (matrixDataSets: MatrixChartData[]) => {\n return matrixDataSets[0].r !== undefined\n}\n\nconst getBucketSizes = (matrixDataSets: MatrixChartData[], bucketCount: number) => {\n const values = matrixDataSets.map((dataPoint) => dataPoint.v)\n const min = Math.min(...values)\n const max = Math.max(...values)\n const threshholdSize = Math.ceil((max - min) / bucketCount)\n return Array.from(Array(bucketCount))\n .map((d, i) => {\n return threshholdSize * (i + 1)\n })\n .reverse()\n}\n\nexport const createTimeseriesMatrixChart = (\n chartDefinition: DashboardVisualisation,\n timeseriesData: DashboardDataResponse[],\n granularity: Granularity,\n): ChartData => {\n const { columns, options } = chartDefinition\n const { measures } = columns\n\n const unit = measures[0].unit ? measures[0].unit : undefined\n const type = chartDefinition.type.split('-')[0]\n const timeBlockData = DatasetHelper.groupRowsByTimestamp(timeseriesData)\n const matrixDataSets: ChartDataset[] = createMatrixDataSet(\n timeBlockData,\n granularity,\n chartDefinition,\n <MatrixDashboardVisualisationOptions>options,\n )\n\n return {\n type: type as unknown as ChartType,\n unit,\n timeseries: true,\n data: {\n datasets: matrixDataSets,\n },\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["utils_exports", "__export", "createTimeseriesMatrixChart", "__toCommonJS", "import_dayjs", "import_with_alpha_hex", "import_types", "import_datasetHelper", "initTimeseriesMatrixAxis", "timeBlockData", "granularity", "columns", "measures", "tsData", "raw", "rag", "v", "r", "x", "y", "dayjs", "ts", "createMatrixDataSet", "chartDefinition", "options", "validateDefinition", "label", "getLabel", "data", "addBucketData", "id", "type", "errors", "message", "matrixDataSets", "useRagColours", "hasRag", "hasRagNumber", "bucketCount", "getBucketCount", "bucketColours", "createRagColours", "setColoursForRag", "setColoursWithoutRag", "bucketSizes", "getBucketSizes", "colours", "dataPoint", "bucketNumber", "bucket", "i", "generateBucketColours", "baseColour", "alphaDivision", "d", "division", "o", "values", "min", "max", "threshholdSize", "timeseriesData", "unit", "DatasetHelper"]
7
+ }
@@ -0,0 +1,182 @@
1
+ /* eslint-disable prefer-destructuring */
2
+ import dayjs from 'dayjs'
3
+ import { withAlphaHex } from 'with-alpha-hex'
4
+ import {
5
+ DashboardVisualisation,
6
+ DashboardVisualisationColumns,
7
+ DashboardVisualisationType,
8
+ MatrixDashboardVisualisationOptions,
9
+ } from '../../../_dashboards/dashboard/types'
10
+ import { Granularity } from '../../../_inputs/granular-date-range/types'
11
+ import { ChartData, ChartDataset, ChartType, MatrixChartData } from '../../../../types/Charts'
12
+ import { DashboardDataResponse } from '../../../../types/Metrics'
13
+ import DatasetHelper from '../../../../utils/datasetHelper'
14
+
15
+ const initTimeseriesMatrixAxis = (
16
+ timeBlockData: DashboardDataResponse[][],
17
+ granularity: Granularity,
18
+ columns: DashboardVisualisationColumns,
19
+ ): MatrixChartData[] => {
20
+ const { measures } = columns
21
+ return timeBlockData.map((tsData) => {
22
+ const { raw, rag } = tsData[0][measures[1].id]
23
+ const v = Number(raw)
24
+ const r = rag !== undefined ? Number(tsData[0][measures[1].id].rag) : undefined
25
+ let x
26
+ let y
27
+ switch (granularity) {
28
+ case 'hourly':
29
+ break
30
+ case 'weekly':
31
+ x = dayjs(tsData[0].ts.raw, 'DD/MM/YYYY').format('ddd')
32
+ y = dayjs(tsData[0].ts.raw, 'DD/MM/YYYY').week()
33
+ break
34
+ case 'daily':
35
+ x = dayjs(tsData[0].ts.raw, 'DD/MM/YYYY').format('MMM YY')
36
+ y = dayjs(tsData[0].ts.raw, 'DD/MM/YYYY').format('D')
37
+ break
38
+ case 'monthly':
39
+ {
40
+ const ts = (<string>tsData[0].ts.raw).split(' ')
41
+ x = ts[1]
42
+ y = ts[0]
43
+ }
44
+ break
45
+ case 'annually':
46
+ x = 'year'
47
+ y = <string>tsData[0].ts.raw
48
+ break
49
+ default:
50
+ x = dayjs(tsData[0].ts.raw, 'DD/MM/YYYY').format('MMM YY')
51
+ y = dayjs(tsData[0].ts.raw, 'DD/MM/YYYY').format('D')
52
+ break
53
+ }
54
+
55
+ return { y, x, v, r }
56
+ })
57
+ }
58
+
59
+ const createMatrixDataSet = (
60
+ timeBlockData: DashboardDataResponse[][],
61
+ granularity: Granularity,
62
+ chartDefinition: DashboardVisualisation,
63
+ options: MatrixDashboardVisualisationOptions,
64
+ ) => {
65
+ const { columns } = chartDefinition
66
+ validateDefinition(chartDefinition)
67
+ const label = getLabel(columns)
68
+ let data: MatrixChartData[] = initTimeseriesMatrixAxis(timeBlockData, granularity, columns)
69
+ data = addBucketData(data, options)
70
+
71
+ return [{ label, data }]
72
+ }
73
+
74
+ const validateDefinition = (chartDefinition: DashboardVisualisation) => {
75
+ const { id, columns, type } = chartDefinition
76
+
77
+ const errors = []
78
+ if (columns.measures.length !== 2) {
79
+ errors.push(`Measures should only have 2 columns defined. Only found ${columns.measures.length}`)
80
+ } else if (type === DashboardVisualisationType.MATRIX_TIMESERIES) {
81
+ if (columns.measures[0].id !== 'ts') {
82
+ errors.push(`measure at index 0 has incorrect ID. Expected ID to be "ts". Found "${columns.measures[0].id}"`)
83
+ }
84
+ }
85
+ if (errors.length) {
86
+ const message = `Validation: Visualisaton definition: ID: ${id}, type: ${type}, errors: ${errors.join(',')}`
87
+ throw new Error(message)
88
+ }
89
+ }
90
+
91
+ const getLabel = (columns: DashboardVisualisationColumns) => {
92
+ return columns.measures[1].display
93
+ }
94
+
95
+ const addBucketData = (matrixDataSets: MatrixChartData[], options: MatrixDashboardVisualisationOptions) => {
96
+ const { useRagColours } = options
97
+ const hasRag = hasRagNumber(matrixDataSets)
98
+ const bucketCount = hasRag ? getBucketCount(matrixDataSets) : 3
99
+ const bucketColours = createRagColours(bucketCount, useRagColours)
100
+ return hasRag ? setColoursForRag(matrixDataSets, bucketColours) : setColoursWithoutRag(matrixDataSets, bucketColours)
101
+ }
102
+
103
+ const setColoursWithoutRag = (matrixDataSets: MatrixChartData[], bucketColours: string[]) => {
104
+ const bucketSizes = getBucketSizes(matrixDataSets, bucketColours.length)
105
+ const colours = bucketColours.slice().reverse()
106
+
107
+ return matrixDataSets.map((dataPoint) => {
108
+ let bucketNumber = 0
109
+ bucketSizes.forEach((bucket, i) => {
110
+ if (dataPoint.v <= bucket) bucketNumber = i
111
+ })
112
+ return { ...dataPoint, r: bucketNumber, c: colours[bucketNumber] }
113
+ })
114
+ }
115
+
116
+ const setColoursForRag = (matrixDataSets: MatrixChartData[], bucketColours: string[]) => {
117
+ return matrixDataSets.map((dataPoint) => {
118
+ return { ...dataPoint, c: bucketColours[dataPoint.r] }
119
+ })
120
+ }
121
+
122
+ const createRagColours = (bucketCount: number, useRagColours: boolean) => {
123
+ const ragColours = ['#00703c', '#ffdd00', ' #d4351c']
124
+ return useRagColours ? ragColours : generateBucketColours(bucketCount)
125
+ }
126
+
127
+ const generateBucketColours = (bucketCount: number) => {
128
+ const baseColour = '#1d70b8'
129
+ const alphaDivision = 1 / bucketCount
130
+ return Array.from(Array(bucketCount)).map((d, i) => {
131
+ const division = alphaDivision * (i + 1)
132
+ return withAlphaHex(baseColour, division)
133
+ })
134
+ }
135
+
136
+ const getBucketCount = (matrixDataSets: MatrixChartData[]) => {
137
+ return Math.max(...matrixDataSets.map((o) => o.r)) + 1
138
+ }
139
+
140
+ const hasRagNumber = (matrixDataSets: MatrixChartData[]) => {
141
+ return matrixDataSets[0].r !== undefined
142
+ }
143
+
144
+ const getBucketSizes = (matrixDataSets: MatrixChartData[], bucketCount: number) => {
145
+ const values = matrixDataSets.map((dataPoint) => dataPoint.v)
146
+ const min = Math.min(...values)
147
+ const max = Math.max(...values)
148
+ const threshholdSize = Math.ceil((max - min) / bucketCount)
149
+ return Array.from(Array(bucketCount))
150
+ .map((d, i) => {
151
+ return threshholdSize * (i + 1)
152
+ })
153
+ .reverse()
154
+ }
155
+
156
+ export const createTimeseriesMatrixChart = (
157
+ chartDefinition: DashboardVisualisation,
158
+ timeseriesData: DashboardDataResponse[],
159
+ granularity: Granularity,
160
+ ): ChartData => {
161
+ const { columns, options } = chartDefinition
162
+ const { measures } = columns
163
+
164
+ const unit = measures[0].unit ? measures[0].unit : undefined
165
+ const type = chartDefinition.type.split('-')[0]
166
+ const timeBlockData = DatasetHelper.groupRowsByTimestamp(timeseriesData)
167
+ const matrixDataSets: ChartDataset[] = createMatrixDataSet(
168
+ timeBlockData,
169
+ granularity,
170
+ chartDefinition,
171
+ <MatrixDashboardVisualisationOptions>options,
172
+ )
173
+
174
+ return {
175
+ type: type as unknown as ChartType,
176
+ unit,
177
+ timeseries: true,
178
+ data: {
179
+ datasets: matrixDataSets,
180
+ },
181
+ }
182
+ }
@@ -26,6 +26,10 @@
26
26
  height: 400px;
27
27
  }
28
28
 
29
+ .dpr-matrix-chart {
30
+ height: 700px;
31
+ }
32
+
29
33
  .dpr-canvas-wrapper {
30
34
  height: 100%;
31
35
  }
@@ -1,2 +1,2 @@
1
- var M=Object.create;var C=Object.defineProperty;var S=Object.getOwnPropertyDescriptor;var k=Object.getOwnPropertyNames;var I=Object.getPrototypeOf,E=Object.prototype.hasOwnProperty;var L=(a,s)=>{for(var e in s)C(a,e,{get:s[e],enumerable:!0})},w=(a,s,e,t)=>{if(s&&typeof s=="object"||typeof s=="function")for(let o of k(s))!E.call(a,o)&&o!==e&&C(a,o,{get:()=>s[o],enumerable:!(t=S(s,o))||t.enumerable});return a};var f=(a,s,e)=>(e=a!=null?M(I(a)):{},w(s||!a||!a.__esModule?C(e,"default",{value:a,enumerable:!0}):e,a)),K=a=>w(C({},"__esModule",{value:!0}),a);var U={};L(U,{createChart:()=>V,default:()=>A});module.exports=K(U);var b=require("../_dashboards/dashboard/types"),p=f(require("../../utils/datasetHelper")),R=f(require("../_dashboards/dashboard-list/utils"));const V=(a,s)=>{const e=[b.DashboardVisualisationType.BAR_TIMESERIES,b.DashboardVisualisationType.LINE_TIMESERIES],{type:t}=a;let o,l,d;if(e.includes(t)){const{latestData:n,dataSetRows:r,timeseriesData:u}=$(a,s);r.length&&(l=P(a,u),o=N(a,u),d=T(a,n,!0))}else{const{dataSetRows:n,snapshotData:r}=J(a,s);n.length&&(l=_(a,r),o=H(a,n),d=T(a,n))}return{details:d,table:o,chart:l}};var A={createChart:V};const J=(a,s)=>{const e=p.default.getLastestDataset(s),t=p.default.getDatasetRows(a,e),o=p.default.filterRowsByDisplayColumns(a,t,!0);return{dataSetRows:t,snapshotData:o}},$=(a,s)=>{const e=p.default.getLastestDataset(s),t=p.default.getDatasetRows(a,s),o=p.default.filterRowsByDisplayColumns(a,t,!0);return{latestData:e,dataSetRows:t,timeseriesData:o}},T=(a,s,e=!1)=>{const t=[],o=F(a,s,e);return s[0]?.ts&&t.push({label:"Values for:",value:s[0]?.ts.raw}),{meta:t,headlines:o}},F=(a,s,e=!1)=>{const t=[],{columns:o}=a,{measures:l}=o,d=!!l.find(i=>i.axis);let n,r,u,h;return e?(r=l.find(i=>i.id!=="ts"),r&&(h=`${s[0].ts.raw}`,u=+s[0][r.id].raw,n={label:h,value:u})):(r=d?l.find(i=>i.axis&&i.axis==="y"):l[0],r&&(h=`Total ${r.display.toLowerCase()}`,u=s.reduce((i,m)=>i+ +m[r.id].raw,0),n={label:h,value:u})),t.push(n),t},_=(a,s)=>{const{type:e,columns:t}=a,{measures:o}=t,l=!!o.find(u=>u.axis);let d,n,r;return l?{labels:d,unit:n,datasets:r}=G(t,s):{labels:d,unit:n,datasets:r}=v(t,s),{type:e,unit:n,data:{labels:d,datasets:r}}},v=(a,s)=>{const{keys:e,measures:t}=a,o=t.map(r=>r.display),l=e[e.length-1]?.id,d=t[0].unit?t[0].unit:void 0,n=s.map(r=>{const u=r[l]?`${r[l].raw}`:"All",h=t.map(m=>{const c=m.id;return r[c]?+r[c].raw:0}),i=h.reduce((m,c)=>m+c,0);return{label:u,data:h,total:i}});return{labels:o,unit:d,datasets:n}},G=(a,s)=>{const{measures:e,keys:t}=a,o=e.find(i=>i.axis==="x"),l=e.find(i=>i.axis==="y"),d=l?.unit||void 0,n=p.default.getGroupKey(t,s),r=n?p.default.groupRowsByKey(s,n.id):[s],u=r[0]?.map(i=>`${i[o.id].raw}`),h=r.map(i=>{const m=i.map(c=>+c[l.id].raw);return{label:n?`${i[0][n.id].raw}`:l.display,data:m,total:m.reduce((c,D)=>c+D,0)}});return{labels:u,unit:d,datasets:h}},H=(a,s)=>{const{columns:e}=a,{keys:t,measures:o}=e,d=[...t,...o].map(u=>({text:u.display})),n=p.default.filterRowsByDisplayColumns(a,s,!0),r=R.default.createTableRows(n);return{head:d,rows:r}},P=(a,s)=>{const{columns:e}=a,{keys:t,measures:o}=e,l=o[0].unit?o[0].unit:void 0,d=a.type===b.DashboardVisualisationType.BAR_TIMESERIES?"bar":"line",r=p.default.getGroupKey(t,s).id,u=p.default.groupRowsByTimestamp(s),h=u.map(c=>c[0].ts.raw),i=u[0].length,m=[];for(let c=0;c<i;c+=1){const D=u.map(y=>+y[c][o[1].id].raw),g=D.reduce((y,x)=>y+x,0),B=u[0][c][r].raw;m.push({data:D,label:B,total:g})}return{type:d,unit:l,timeseries:!0,data:{labels:h,datasets:m}}},N=(a,s)=>{const{columns:e}=a,{keys:t,measures:o}=e;let l=s.flat();const d=s.length>1;let n=[...o];if(d){const h=n.findIndex(m=>m.id==="ts"),i=n[h];n.splice(h,1),n=[...t,...n],n.unshift(i)}else l=p.default.filterRowsByDisplayColumns(a,l);const r=n.map(h=>({text:h.display})),u=R.default.createTableRows(l);return{head:r,rows:u}};0&&(module.exports={createChart});
1
+ var G=Object.create;var C=Object.defineProperty;var $=Object.getOwnPropertyDescriptor;var A=Object.getOwnPropertyNames;var F=Object.getPrototypeOf,j=Object.prototype.hasOwnProperty;var v=(a,t)=>{for(var e in t)C(a,e,{get:t[e],enumerable:!0})},w=(a,t,e,s)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of A(t))!j.call(a,o)&&o!==e&&C(a,o,{get:()=>t[o],enumerable:!(s=$(t,o))||s.enumerable});return a};var b=(a,t,e)=>(e=a!=null?G(F(a)):{},w(t||!a||!a.__esModule?C(e,"default",{value:a,enumerable:!0}):e,a)),H=a=>w(C({},"__esModule",{value:!0}),a);var Q={};v(Q,{createChart:()=>M,createMatrixChart:()=>S,createTimeseriesCharts:()=>L,default:()=>P});module.exports=H(Q);var T=b(require("dayjs")),x=b(require("dayjs/plugin/weekOfYear")),B=require("./chart/heatmap/utils"),D=b(require("../../utils/datasetHelper")),f=b(require("../_dashboards/dashboard-list/utils")),k=require("../_inputs/granular-date-range/types");T.default.extend(x.default);const M=(a,t)=>{let e,s,o;const{dataSetRows:r,snapshotData:l}=O(a,t);return r.length&&(s=Y(a,l),e=z(a,r),o=R(a,r)),{details:o,table:e,chart:s}},L=(a,t)=>{let e,s,o;const{latestData:r,dataSetRows:l,timeseriesData:u}=g(a,t);return l.length&&(s=N(a,u),e=V(a,u),o=R(a,r,!0)),{details:o,table:e,chart:s}},S=(a,t,e)=>{let s,o,r,l=k.Granularity.DAILY;Object.keys(e).forEach(h=>{h.includes("granularity")&&(l=e[h])});const{latestData:u,dataSetRows:n,timeseriesData:i}=g(a,t);return n.length&&(o=(0,B.createTimeseriesMatrixChart)(a,i,l),s=V(a,i),r=R(a,u,!0)),{details:r,table:s,chart:o}},O=(a,t)=>{const e=D.default.getLastestDataset(t),s=D.default.getDatasetRows(a,e),o=D.default.filterRowsByDisplayColumns(a,s,!0);return{dataSetRows:s,snapshotData:o}},g=(a,t)=>{const e=D.default.getLastestDataset(t),s=D.default.getDatasetRows(a,t),o=D.default.filterRowsByDisplayColumns(a,s,!0);return{latestData:e,dataSetRows:s,timeseriesData:o}},R=(a,t,e=!1)=>{const s=[],o=W(a,t,e);return t[0]?.ts&&s.push({label:"Values for:",value:t[0]?.ts.raw}),{meta:s,headlines:o}},W=(a,t,e=!1)=>{const s=[],{columns:o}=a,{measures:r}=o,l=!!r.find(d=>d.axis);let u,n,i,h;return e?(n=r.find(d=>d.id!=="ts"),n&&(h=`${t[0].ts.raw}`,i=+t[0][n.id].raw,u={label:h,value:i})):(n=l?r.find(d=>d.axis&&d.axis==="y"):r[0],n&&(h=`Total ${n.display.toLowerCase()}`,i=t.reduce((d,c)=>d+ +c[n.id].raw,0),u={label:h,value:i})),s.push(u),s},Y=(a,t)=>{const{type:e,columns:s}=a,{measures:o}=s,r=!!o.find(i=>i.axis);let l,u,n;return r?{labels:l,unit:u,datasets:n}=U(s,t):{labels:l,unit:u,datasets:n}=E(s,t),{type:e,unit:u,data:{labels:l,datasets:n}}},E=(a,t)=>{const{keys:e,measures:s}=a,o=s.map(n=>n.display),r=e[e.length-1]?.id,l=s[0].unit?s[0].unit:void 0,u=t.map(n=>{const i=n[r]?`${n[r].raw}`:"All",h=s.map(c=>{const m=c.id;return n[m]?+n[m].raw:0}),d=h.reduce((c,m)=>c+m,0);return{label:i,data:h,total:d}});return{labels:o,unit:l,datasets:u}},U=(a,t)=>{const{measures:e,keys:s}=a,o=e.find(d=>d.axis==="x"),r=e.find(d=>d.axis==="y"),l=r?.unit||void 0,u=D.default.getGroupKey(s,t),n=u?D.default.groupRowsByKey(t,u.id):[t],i=n[0]?.map(d=>`${d[o.id].raw}`),h=n.map(d=>{const c=d.map(m=>+m[r.id].raw);return{label:u?`${d[0][u.id].raw}`:r.display,data:c,total:c.reduce((m,p)=>m+p,0)}});return{labels:i,unit:l,datasets:h}},z=(a,t)=>{const{columns:e}=a,{keys:s,measures:o}=e,l=[...s,...o].map(i=>({text:i.display})),u=D.default.filterRowsByDisplayColumns(a,t,!0),n=f.default.createTableRows(u);return{head:l,rows:n}},N=(a,t)=>{const{columns:e}=a,{keys:s,measures:o}=e,r=o[0].unit?o[0].unit:void 0,l=a.type.split("-")[0],n=D.default.getGroupKey(s,t).id,i=D.default.groupRowsByTimestamp(t),h=i.map(m=>m[0].ts.raw),d=i[0].length,c=[];for(let m=0;m<d;m+=1){const p=i.map(y=>+y[m][o[1].id].raw),J=p.reduce((y,K)=>y+K,0),I=i[0][m][n].raw;c.push({data:p,label:I,total:J})}return{type:l,unit:r,timeseries:!0,data:{labels:h,datasets:c}}},V=(a,t)=>{const{columns:e}=a,{keys:s,measures:o}=e;let r=t.flat(),l=[...o];if(t.length>1){const i=l.findIndex(c=>c.id==="ts"),h=l[i];l.splice(i,1),l=[...s.filter(c=>c.id!=="ts"),...l],l.unshift(h)}else r=D.default.filterRowsByDisplayColumns(a,r);const u=l.map(i=>({text:i.display})),n=f.default.createTableRows(r);return{head:u,rows:n}};var P={createChart:M,createTimeseriesCharts:L,createMatrixChart:S};0&&(module.exports={createChart,createMatrixChart,createTimeseriesCharts});
2
2
  //# sourceMappingURL=utils.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/dpr/components/_charts/utils.ts"],
4
- "sourcesContent": ["import {\n ChartData,\n MoJTable,\n ChartCardData,\n ChartDataset,\n ChartType,\n ChartDetails,\n ChartMetaData,\n} from '../../types/Charts'\nimport { DashboardDataResponse } from '../../types/Metrics'\nimport {\n BarChartVisualisationColumn,\n DashboardVisualisation,\n DashboardVisualisationColumns,\n DashboardVisualisationType,\n} from '../_dashboards/dashboard/types'\nimport DatasetHelper from '../../utils/datasetHelper'\nimport DashboardListUtils from '../_dashboards/dashboard-list/utils'\n\nexport const createChart = (\n chartDefinition: DashboardVisualisation,\n rawData: DashboardDataResponse[],\n): ChartCardData => {\n const timeseriesChartTypes = [DashboardVisualisationType.BAR_TIMESERIES, DashboardVisualisationType.LINE_TIMESERIES]\n const { type } = chartDefinition\n\n let table: MoJTable\n let chart: ChartData\n let details: ChartDetails\n\n if (timeseriesChartTypes.includes(type)) {\n const { latestData, dataSetRows, timeseriesData } = getDataForTimeseriesCharts(chartDefinition, rawData)\n if (dataSetRows.length) {\n chart = createTimeseriesChart(chartDefinition, timeseriesData)\n table = createTimeseriesTable(chartDefinition, timeseriesData)\n details = getChartDetails(chartDefinition, latestData, true)\n }\n } else {\n const { dataSetRows, snapshotData } = getDataForSnapshotCharts(chartDefinition, rawData)\n if (dataSetRows.length) {\n chart = createSnapshotChart(chartDefinition, snapshotData)\n table = createSnapshotTable(chartDefinition, dataSetRows)\n details = getChartDetails(chartDefinition, dataSetRows)\n }\n }\n\n return {\n details,\n table,\n chart,\n }\n}\n\nexport default {\n createChart,\n}\n\nconst getDataForSnapshotCharts = (chartDefinition: DashboardVisualisation, rawData: DashboardDataResponse[]) => {\n const data = DatasetHelper.getLastestDataset(rawData)\n const dataSetRows = DatasetHelper.getDatasetRows(chartDefinition, data)\n const snapshotData = DatasetHelper.filterRowsByDisplayColumns(chartDefinition, dataSetRows, true)\n\n return {\n dataSetRows,\n snapshotData,\n }\n}\n\nconst getDataForTimeseriesCharts = (chartDefinition: DashboardVisualisation, rawData: DashboardDataResponse[]) => {\n const latestData = DatasetHelper.getLastestDataset(rawData)\n const dataSetRows = DatasetHelper.getDatasetRows(chartDefinition, rawData)\n const timeseriesData = DatasetHelper.filterRowsByDisplayColumns(chartDefinition, dataSetRows, true)\n\n return {\n latestData,\n dataSetRows,\n timeseriesData,\n }\n}\n\nconst getChartDetails = (\n chartDefinition: DashboardVisualisation,\n data: DashboardDataResponse[],\n timeseries = false,\n): ChartDetails => {\n const meta: ChartMetaData[] = []\n const headlines: ChartMetaData[] = createHeadlines(chartDefinition, data, timeseries)\n\n if (data[0]?.ts) {\n meta.push({\n label: 'Values for:',\n value: data[0]?.ts.raw,\n })\n }\n\n return {\n meta,\n headlines,\n }\n}\n\nconst createHeadlines = (\n chartDefinition: DashboardVisualisation,\n data: DashboardDataResponse[],\n timeseries = false,\n) => {\n const headlines: ChartMetaData[] = []\n const { columns } = chartDefinition\n const { measures } = columns\n const isListChart = !!(<BarChartVisualisationColumn[]>measures).find((col) => col.axis)\n let headline: ChartMetaData\n\n let headlineColumn: BarChartVisualisationColumn\n let value: number\n let label: string\n\n if (timeseries) {\n headlineColumn = <BarChartVisualisationColumn>measures.find((col) => col.id !== 'ts')\n if (headlineColumn) {\n label = `${data[0].ts.raw}`\n value = +data[0][headlineColumn.id].raw\n\n headline = {\n label,\n value,\n }\n }\n } else {\n headlineColumn = !isListChart\n ? <BarChartVisualisationColumn>measures[0]\n : measures.find((col: BarChartVisualisationColumn) => col.axis && col.axis === 'y')\n\n if (headlineColumn) {\n label = `Total ${headlineColumn.display.toLowerCase()}`\n value = data.reduce((acc: number, d: DashboardDataResponse) => acc + +d[headlineColumn.id].raw, 0)\n\n headline = {\n label,\n value,\n }\n }\n }\n\n headlines.push(headline)\n\n return headlines\n}\n\nconst createSnapshotChart = (\n chartDefinition: DashboardVisualisation,\n snapshotData: DashboardDataResponse[],\n): ChartData => {\n const { type, columns } = chartDefinition\n const { measures } = columns\n const isListChart = !!(<BarChartVisualisationColumn[]>measures).find((col) => col.axis)\n\n let labels: string[]\n let unit\n let datasets: ChartDataset[]\n\n if (!isListChart) {\n ;({ labels, unit, datasets } = buildChart(columns, snapshotData))\n } else {\n ;({ labels, unit, datasets } = buildChartFromListData(columns, snapshotData))\n }\n\n return {\n type: type as unknown as ChartType,\n unit,\n data: {\n labels,\n datasets,\n },\n }\n}\n\nconst buildChart = (columns: DashboardVisualisationColumns, rawData: DashboardDataResponse[]) => {\n const { keys, measures } = columns\n const labels = measures.map((col) => col.display)\n const labelId = keys[keys.length - 1]?.id as keyof DashboardDataResponse\n const unit = measures[0].unit ? measures[0].unit : undefined\n\n const datasets = rawData.map((row) => {\n const label = row[labelId] ? `${row[labelId].raw}` : 'All'\n const data = measures.map((c) => {\n const rowId = c.id as keyof DashboardDataResponse\n return row[rowId] ? +row[rowId].raw : 0\n })\n const total = data.reduce((acc: number, val: number) => acc + val, 0)\n return { label, data, total } as ChartDataset\n })\n\n return {\n labels,\n unit,\n datasets,\n }\n}\n\nconst buildChartFromListData = (columns: DashboardVisualisationColumns, rawData: DashboardDataResponse[]) => {\n const { measures, keys } = columns\n\n const xAxisColumn = (<BarChartVisualisationColumn[]>measures).find((col) => col.axis === 'x')\n const yAxisColumn = (<BarChartVisualisationColumn[]>measures).find((col) => col.axis === 'y')\n\n const unit = yAxisColumn?.unit || undefined\n const groupKey = DatasetHelper.getGroupKey(keys, rawData)\n const groupsData = groupKey ? DatasetHelper.groupRowsByKey(rawData, groupKey.id) : [rawData]\n\n const labels = groupsData[0]?.map((row) => {\n return `${row[xAxisColumn.id].raw}`\n })\n\n const datasets: ChartDataset[] = groupsData.map((groupData) => {\n const data = groupData.map((row) => +row[yAxisColumn.id].raw)\n return {\n label: groupKey ? `${groupData[0][groupKey.id].raw}` : yAxisColumn.display,\n data,\n total: data.reduce((acc: number, val: number) => acc + val, 0),\n }\n })\n\n return {\n labels,\n unit,\n datasets,\n }\n}\n\nconst createSnapshotTable = (chartDefinition: DashboardVisualisation, data: DashboardDataResponse[]): MoJTable => {\n const { columns } = chartDefinition\n const { keys, measures } = columns\n\n const headerColumns = [...keys, ...measures]\n const head = headerColumns.map((column) => {\n return { text: column.display }\n })\n\n const filteredRowData = DatasetHelper.filterRowsByDisplayColumns(chartDefinition, data, true)\n const rows = DashboardListUtils.createTableRows(filteredRowData)\n\n return {\n head,\n rows,\n }\n}\n\nconst createTimeseriesChart = (\n chartDefinition: DashboardVisualisation,\n timeseriesData: DashboardDataResponse[],\n): ChartData => {\n const { columns } = chartDefinition\n const { keys, measures } = columns\n\n const unit = measures[0].unit ? measures[0].unit : undefined\n\n const type = chartDefinition.type === DashboardVisualisationType.BAR_TIMESERIES ? 'bar' : 'line'\n\n const groupKey = DatasetHelper.getGroupKey(keys, timeseriesData)\n const labelId = groupKey.id as keyof DashboardDataResponse\n\n const timeBlockData = DatasetHelper.groupRowsByTimestamp(timeseriesData)\n const labels = timeBlockData.map((d: DashboardDataResponse[]) => d[0].ts.raw as unknown as string)\n const datasetCount = timeBlockData[0].length\n\n const datasets: ChartDataset[] = []\n for (let index = 0; index < datasetCount; index += 1) {\n const data = timeBlockData.map((timeperiod) => {\n return +timeperiod[index][measures[1].id].raw\n })\n const total = data.reduce((a, c) => a + c, 0)\n const label = timeBlockData[0][index][labelId].raw as string\n\n datasets.push({\n data,\n label,\n total,\n })\n }\n\n return {\n type: type as unknown as ChartType,\n unit,\n timeseries: true,\n data: {\n labels,\n datasets,\n },\n }\n}\n\nconst createTimeseriesTable = (\n chartDefinition: DashboardVisualisation,\n timeseriesData: DashboardDataResponse[],\n): MoJTable => {\n const { columns } = chartDefinition\n const { keys, measures } = columns\n\n let flatTimeseriesData = timeseriesData.flat()\n const hasMultipleRowsPerTimePeriod = timeseriesData.length > 1\n let headerColumns = [...measures]\n\n if (hasMultipleRowsPerTimePeriod) {\n const timestampIndex = headerColumns.findIndex((m) => m.id === 'ts')\n const timestampCol = headerColumns[timestampIndex]\n\n headerColumns.splice(timestampIndex, 1)\n headerColumns = [...keys, ...headerColumns]\n headerColumns.unshift(timestampCol)\n } else {\n flatTimeseriesData = DatasetHelper.filterRowsByDisplayColumns(chartDefinition, flatTimeseriesData)\n }\n\n const head = headerColumns.map((column) => {\n return { text: column.display }\n })\n\n const rows = DashboardListUtils.createTableRows(flatTimeseriesData)\n\n return {\n head,\n rows,\n } as MoJTable\n}\n"],
5
- "mappings": "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",
6
- "names": ["utils_exports", "__export", "createChart", "utils_default", "__toCommonJS", "import_types", "import_datasetHelper", "import_utils", "chartDefinition", "rawData", "timeseriesChartTypes", "type", "table", "chart", "details", "latestData", "dataSetRows", "timeseriesData", "getDataForTimeseriesCharts", "createTimeseriesChart", "createTimeseriesTable", "getChartDetails", "snapshotData", "getDataForSnapshotCharts", "createSnapshotChart", "createSnapshotTable", "data", "DatasetHelper", "timeseries", "meta", "headlines", "createHeadlines", "columns", "measures", "isListChart", "col", "headline", "headlineColumn", "value", "label", "acc", "d", "labels", "unit", "datasets", "buildChartFromListData", "buildChart", "keys", "labelId", "row", "c", "rowId", "total", "val", "xAxisColumn", "yAxisColumn", "groupKey", "groupsData", "groupData", "head", "column", "filteredRowData", "rows", "DashboardListUtils", "timeBlockData", "datasetCount", "index", "timeperiod", "a", "flatTimeseriesData", "hasMultipleRowsPerTimePeriod", "headerColumns", "timestampIndex", "timestampCol"]
4
+ "sourcesContent": ["import dayjs from 'dayjs'\nimport weekOfYear from 'dayjs/plugin/weekOfYear'\nimport {\n ChartData,\n MoJTable,\n ChartCardData,\n ChartDataset,\n ChartType,\n ChartDetails,\n ChartMetaData,\n} from '../../types/Charts'\nimport { createTimeseriesMatrixChart } from './chart/heatmap/utils'\nimport { DashboardDataResponse } from '../../types/Metrics'\nimport {\n BarChartVisualisationColumn,\n DashboardVisualisation,\n DashboardVisualisationColumns,\n} from '../_dashboards/dashboard/types'\nimport DatasetHelper from '../../utils/datasetHelper'\nimport DashboardListUtils from '../_dashboards/dashboard-list/utils'\nimport { Granularity } from '../_inputs/granular-date-range/types'\n\ndayjs.extend(weekOfYear)\n\nexport const createChart = (\n chartDefinition: DashboardVisualisation,\n rawData: DashboardDataResponse[],\n): ChartCardData => {\n let table: MoJTable\n let chart: ChartData\n let details: ChartDetails\n\n const { dataSetRows, snapshotData } = getDataForSnapshotCharts(chartDefinition, rawData)\n if (dataSetRows.length) {\n chart = createSnapshotChart(chartDefinition, snapshotData)\n table = createSnapshotTable(chartDefinition, dataSetRows)\n details = getChartDetails(chartDefinition, dataSetRows)\n }\n\n return {\n details,\n table,\n chart,\n }\n}\n\nexport const createTimeseriesCharts = (\n chartDefinition: DashboardVisualisation,\n rawData: DashboardDataResponse[],\n): ChartCardData => {\n let table: MoJTable\n let chart: ChartData\n let details: ChartDetails\n\n const { latestData, dataSetRows, timeseriesData } = getDataForTimeseriesCharts(chartDefinition, rawData)\n if (dataSetRows.length) {\n chart = createTimeseriesChart(chartDefinition, timeseriesData)\n table = createTimeseriesTable(chartDefinition, timeseriesData)\n details = getChartDetails(chartDefinition, latestData, true)\n }\n return {\n details,\n table,\n chart,\n }\n}\n\nexport const createMatrixChart = (\n chartDefinition: DashboardVisualisation,\n rawData: DashboardDataResponse[],\n query: Record<string, string | string[]>,\n) => {\n let table: MoJTable\n let chart: ChartData\n let details: ChartDetails\n let granularity: Granularity = Granularity.DAILY\n\n Object.keys(query).forEach((key) => {\n if (key.includes('granularity')) {\n granularity = <Granularity>query[key]\n }\n })\n\n const { latestData, dataSetRows, timeseriesData } = getDataForTimeseriesCharts(chartDefinition, rawData)\n if (dataSetRows.length) {\n chart = createTimeseriesMatrixChart(chartDefinition, timeseriesData, granularity)\n table = createTimeseriesTable(chartDefinition, timeseriesData)\n details = getChartDetails(chartDefinition, latestData, true)\n }\n return {\n details,\n table,\n chart,\n }\n}\n\nconst getDataForSnapshotCharts = (chartDefinition: DashboardVisualisation, rawData: DashboardDataResponse[]) => {\n const data = DatasetHelper.getLastestDataset(rawData)\n const dataSetRows = DatasetHelper.getDatasetRows(chartDefinition, data)\n const snapshotData = DatasetHelper.filterRowsByDisplayColumns(chartDefinition, dataSetRows, true)\n\n return {\n dataSetRows,\n snapshotData,\n }\n}\n\nconst getDataForTimeseriesCharts = (chartDefinition: DashboardVisualisation, rawData: DashboardDataResponse[]) => {\n const latestData = DatasetHelper.getLastestDataset(rawData)\n const dataSetRows = DatasetHelper.getDatasetRows(chartDefinition, rawData)\n const timeseriesData = DatasetHelper.filterRowsByDisplayColumns(chartDefinition, dataSetRows, true)\n\n return {\n latestData,\n dataSetRows,\n timeseriesData,\n }\n}\n\nconst getChartDetails = (\n chartDefinition: DashboardVisualisation,\n data: DashboardDataResponse[],\n timeseries = false,\n): ChartDetails => {\n const meta: ChartMetaData[] = []\n const headlines: ChartMetaData[] = createHeadlines(chartDefinition, data, timeseries)\n\n if (data[0]?.ts) {\n meta.push({\n label: 'Values for:',\n value: data[0]?.ts.raw,\n })\n }\n\n return {\n meta,\n headlines,\n }\n}\n\nconst createHeadlines = (\n chartDefinition: DashboardVisualisation,\n data: DashboardDataResponse[],\n timeseries = false,\n) => {\n const headlines: ChartMetaData[] = []\n const { columns } = chartDefinition\n const { measures } = columns\n const isListChart = !!(<BarChartVisualisationColumn[]>measures).find((col) => col.axis)\n let headline: ChartMetaData\n\n let headlineColumn: BarChartVisualisationColumn\n let value: number\n let label: string\n\n if (timeseries) {\n headlineColumn = <BarChartVisualisationColumn>measures.find((col) => col.id !== 'ts')\n if (headlineColumn) {\n label = `${data[0].ts.raw}`\n value = +data[0][headlineColumn.id].raw\n\n headline = {\n label,\n value,\n }\n }\n } else {\n headlineColumn = !isListChart\n ? <BarChartVisualisationColumn>measures[0]\n : measures.find((col: BarChartVisualisationColumn) => col.axis && col.axis === 'y')\n\n if (headlineColumn) {\n label = `Total ${headlineColumn.display.toLowerCase()}`\n value = data.reduce((acc: number, d: DashboardDataResponse) => acc + +d[headlineColumn.id].raw, 0)\n\n headline = {\n label,\n value,\n }\n }\n }\n\n headlines.push(headline)\n\n return headlines\n}\n\nconst createSnapshotChart = (\n chartDefinition: DashboardVisualisation,\n snapshotData: DashboardDataResponse[],\n): ChartData => {\n const { type, columns } = chartDefinition\n const { measures } = columns\n const isListChart = !!(<BarChartVisualisationColumn[]>measures).find((col) => col.axis)\n\n let labels: string[]\n let unit\n let datasets: ChartDataset[]\n\n if (!isListChart) {\n ;({ labels, unit, datasets } = buildChart(columns, snapshotData))\n } else {\n ;({ labels, unit, datasets } = buildChartFromListData(columns, snapshotData))\n }\n\n return {\n type: type as unknown as ChartType,\n unit,\n data: {\n labels,\n datasets,\n },\n }\n}\n\nconst buildChart = (columns: DashboardVisualisationColumns, rawData: DashboardDataResponse[]) => {\n const { keys, measures } = columns\n const labels = measures.map((col) => col.display)\n const labelId = keys[keys.length - 1]?.id as keyof DashboardDataResponse\n const unit = measures[0].unit ? measures[0].unit : undefined\n\n const datasets = rawData.map((row) => {\n const label = row[labelId] ? `${row[labelId].raw}` : 'All'\n const data = measures.map((c) => {\n const rowId = c.id as keyof DashboardDataResponse\n return row[rowId] ? +row[rowId].raw : 0\n })\n const total = data.reduce((acc: number, val: number) => acc + val, 0)\n return { label, data, total } as ChartDataset\n })\n\n return {\n labels,\n unit,\n datasets,\n }\n}\n\nconst buildChartFromListData = (columns: DashboardVisualisationColumns, rawData: DashboardDataResponse[]) => {\n const { measures, keys } = columns\n\n const xAxisColumn = (<BarChartVisualisationColumn[]>measures).find((col) => col.axis === 'x')\n const yAxisColumn = (<BarChartVisualisationColumn[]>measures).find((col) => col.axis === 'y')\n\n const unit = yAxisColumn?.unit || undefined\n const groupKey = DatasetHelper.getGroupKey(keys, rawData)\n const groupsData = groupKey ? DatasetHelper.groupRowsByKey(rawData, groupKey.id) : [rawData]\n\n const labels = groupsData[0]?.map((row) => {\n return `${row[xAxisColumn.id].raw}`\n })\n\n const datasets: ChartDataset[] = groupsData.map((groupData) => {\n const data = groupData.map((row) => +row[yAxisColumn.id].raw)\n return {\n label: groupKey ? `${groupData[0][groupKey.id].raw}` : yAxisColumn.display,\n data,\n total: data.reduce((acc: number, val: number) => acc + val, 0),\n }\n })\n\n return {\n labels,\n unit,\n datasets,\n }\n}\n\nconst createSnapshotTable = (chartDefinition: DashboardVisualisation, data: DashboardDataResponse[]): MoJTable => {\n const { columns } = chartDefinition\n const { keys, measures } = columns\n\n const headerColumns = [...keys, ...measures]\n const head = headerColumns.map((column) => {\n return { text: column.display }\n })\n\n const filteredRowData = DatasetHelper.filterRowsByDisplayColumns(chartDefinition, data, true)\n const rows = DashboardListUtils.createTableRows(filteredRowData)\n\n return {\n head,\n rows,\n }\n}\n\nconst createTimeseriesChart = (\n chartDefinition: DashboardVisualisation,\n timeseriesData: DashboardDataResponse[],\n): ChartData => {\n const { columns } = chartDefinition\n const { keys, measures } = columns\n\n const unit = measures[0].unit ? measures[0].unit : undefined\n const type = chartDefinition.type.split('-')[0]\n const groupKey = DatasetHelper.getGroupKey(keys, timeseriesData)\n const labelId = groupKey.id as keyof DashboardDataResponse\n\n const timeBlockData = DatasetHelper.groupRowsByTimestamp(timeseriesData)\n const labels = timeBlockData.map((d: DashboardDataResponse[]) => d[0].ts.raw as unknown as string)\n const datasetCount = timeBlockData[0].length\n\n const datasets: ChartDataset[] = []\n for (let index = 0; index < datasetCount; index += 1) {\n const data = timeBlockData.map((timeperiod) => {\n return +timeperiod[index][measures[1].id].raw\n })\n const total = data.reduce((a, c) => a + c, 0)\n const label = timeBlockData[0][index][labelId].raw as string\n\n datasets.push({\n data,\n label,\n total,\n })\n }\n\n return {\n type: type as unknown as ChartType,\n unit,\n timeseries: true,\n data: {\n labels,\n datasets,\n },\n }\n}\n\nconst createTimeseriesTable = (\n chartDefinition: DashboardVisualisation,\n timeseriesData: DashboardDataResponse[],\n): MoJTable => {\n const { columns } = chartDefinition\n const { keys, measures } = columns\n\n let flatTimeseriesData = timeseriesData.flat()\n let headerColumns = [...measures]\n\n if (timeseriesData.length > 1) {\n // Add keys as columns as well as measures, and put TS first:\n // Get TS column an remove it from headings\n const timestampIndex = headerColumns.findIndex((m) => m.id === 'ts')\n const timestampCol = headerColumns[timestampIndex]\n headerColumns.splice(timestampIndex, 1)\n // Remove duplicate TS from keys if present and add keys to headings\n const keysWithoutTs = keys.filter((k) => k.id !== 'ts')\n headerColumns = [...keysWithoutTs, ...headerColumns]\n // Add TS column to the start\n headerColumns.unshift(timestampCol)\n } else {\n flatTimeseriesData = DatasetHelper.filterRowsByDisplayColumns(chartDefinition, flatTimeseriesData)\n }\n\n const head = headerColumns.map((column) => {\n return { text: column.display }\n })\n\n const rows = DashboardListUtils.createTableRows(flatTimeseriesData)\n\n return {\n head,\n rows,\n } as MoJTable\n}\n\nexport default {\n createChart,\n createTimeseriesCharts,\n createMatrixChart,\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["utils_exports", "__export", "createChart", "createMatrixChart", "createTimeseriesCharts", "utils_default", "__toCommonJS", "import_dayjs", "import_weekOfYear", "import_utils", "import_datasetHelper", "import_types", "dayjs", "weekOfYear", "chartDefinition", "rawData", "table", "chart", "details", "dataSetRows", "snapshotData", "getDataForSnapshotCharts", "createSnapshotChart", "createSnapshotTable", "getChartDetails", "latestData", "timeseriesData", "getDataForTimeseriesCharts", "createTimeseriesChart", "createTimeseriesTable", "query", "granularity", "key", "data", "DatasetHelper", "timeseries", "meta", "headlines", "createHeadlines", "columns", "measures", "isListChart", "col", "headline", "headlineColumn", "value", "label", "acc", "d", "type", "labels", "unit", "datasets", "buildChartFromListData", "buildChart", "keys", "labelId", "row", "rowId", "total", "val", "xAxisColumn", "yAxisColumn", "groupKey", "groupsData", "groupData", "head", "column", "filteredRowData", "rows", "DashboardListUtils", "timeBlockData", "datasetCount", "index", "timeperiod", "a", "c", "flatTimeseriesData", "headerColumns", "timestampIndex", "m", "timestampCol", "k"]
7
7
  }
@@ -52,7 +52,10 @@ describe('ChartCard Utils', () => {
52
52
 
53
53
  it('should get the timeseries chart data', async () => {
54
54
  const expectedResult = dataQualityTimeseriesLine
55
- const result = ChartCardUtils.createChart(timeseriesVisualisationDefinition, dashboardMetricsData.flat())
55
+ const result = ChartCardUtils.createTimeseriesCharts(
56
+ timeseriesVisualisationDefinition,
57
+ dashboardMetricsData.flat(),
58
+ )
56
59
  expect(result).toEqual(expectedResult)
57
60
  })
58
61
  })