@ministryofjustice/hmpps-digital-prison-reporting-frontend 4.15.0 → 4.15.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.
- package/dpr/components/_charts/chart/heatmap/Heatmap.js +2 -0
- package/dpr/components/_charts/chart/heatmap/Heatmap.js.map +7 -0
- package/dpr/components/_charts/chart/heatmap/Heatmap.ts +278 -0
- package/dpr/components/_charts/utils.js +1 -1
- package/dpr/components/_charts/utils.js.map +3 -3
- package/dpr/components/_charts/utils.ts +2 -2
- package/dpr/components/_dashboards/dashboard/types.js +1 -1
- package/dpr/components/_dashboards/dashboard/types.js.map +2 -2
- package/dpr/components/_dashboards/dashboard/types.ts +8 -0
- package/dpr/components/_dashboards/dashboard-list/utils.js +1 -1
- package/dpr/components/_dashboards/dashboard-list/utils.js.map +3 -3
- package/dpr/components/_dashboards/dashboard-list/utils.ts +3 -2
- package/dpr/components/user-reports/utils.js +1 -1
- package/dpr/components/user-reports/utils.js.map +3 -3
- package/dpr/components/user-reports/utils.ts +13 -3
- package/dpr/routes/journeys/view-report/async/report/tests.cy.js +1 -1
- package/dpr/routes/journeys/view-report/async/report/tests.cy.js.map +2 -2
- package/dpr/routes/journeys/view-report/async/report/tests.cy.ts +44 -8
- package/dpr/routes/journeys/view-report/utils.js +1 -1
- package/dpr/routes/journeys/view-report/utils.js.map +3 -3
- package/dpr/routes/journeys/view-report/utils.ts +6 -1
- package/dpr/utils/DataTableBuilder/DataTableBuilder.js +1 -1
- package/dpr/utils/DataTableBuilder/DataTableBuilder.js.map +2 -2
- package/dpr/utils/DataTableBuilder/DataTableBuilder.ts +37 -19
- package/dpr/utils/ParentChildDataTableBuilder/ParentChildDataTableBuilder.js +1 -1
- package/dpr/utils/ParentChildDataTableBuilder/ParentChildDataTableBuilder.js.map +2 -2
- package/dpr/utils/ParentChildDataTableBuilder/ParentChildDataTableBuilder.ts +6 -3
- package/dpr/utils/SectionedDataTableBuilder/SectionedDataTableBuilder.js.map +2 -2
- package/dpr/utils/SectionedDataTableBuilder/SectionedDataTableBuilder.ts +5 -2
- package/dpr/utils/SummaryDataTableBuilder/SummaryDataTableBuilder.js +1 -1
- package/dpr/utils/SummaryDataTableBuilder/SummaryDataTableBuilder.js.map +2 -2
- package/dpr/utils/SummaryDataTableBuilder/SummaryDataTableBuilder.ts +2 -1
- package/dpr/utils/UserStoreItemBuilder.js.map +1 -1
- package/dpr/utils/UserStoreItemBuilder.ts +1 -1
- package/package.json +1 -1
- package/dpr/components/_charts/chart/heatmap/utils.js +0 -2
- package/dpr/components/_charts/chart/heatmap/utils.js.map +0 -7
- package/dpr/components/_charts/chart/heatmap/utils.ts +0 -182
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ministryofjustice/hmpps-digital-prison-reporting-frontend",
|
|
3
3
|
"description": "The Digital Prison Reporting Frontend contains templates and code to help display data effectively in UI applications.",
|
|
4
|
-
"version": "4.15.
|
|
4
|
+
"version": "4.15.2",
|
|
5
5
|
"main": "dpr/all.mjs",
|
|
6
6
|
"sass": "dpr/all.scss",
|
|
7
7
|
"engines": {
|
|
@@ -1,2 +0,0 @@
|
|
|
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
|
|
@@ -1,7 +0,0 @@
|
|
|
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
|
-
}
|
|
@@ -1,182 +0,0 @@
|
|
|
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
|
-
}
|