UNPKG

@ministryofjustice/hmpps-digital-prison-reporting-frontend

Version:

The Digital Prison Reporting Frontend contains templates and code to help display data effectively in UI applications.

236 lines (235 loc) 9.86 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); const types_1 = require("../dashboard/types"); const datasetHelper_1 = __importDefault(require("../../../utils/datasetHelper")); const createScorecards = (scorecardDefinition, rawData) => { const { columns } = scorecardDefinition; const { measures, keys } = columns; const dataset = getDataset(scorecardDefinition, rawData); const { earliest, latest, earliestTs, latestTs } = dataset; const scorecardFromListValueColumn = measures.find((col) => col.displayValue); const groupKey = datasetHelper_1.default.getGroupKey(keys, latest); let scorecardGroup; if (!scorecardFromListValueColumn) { scorecardGroup = createScorecardGroupFromColumns(columns, earliest, earliestTs, latest, latestTs, groupKey); } else if (groupKey) { scorecardGroup = createScorecardGroupFromListWithGroups(columns, earliest, earliestTs, latest, latestTs, groupKey); } else { scorecardGroup = createScorecardGroupFromList(columns, earliest, earliestTs, latest, latestTs); } return scorecardGroup; }; const getDataset = (scorecardDefinition, rawData) => { var _a, _b, _c, _d; const latestData = datasetHelper_1.default.getLastestDataset(rawData); const latestDataSetRows = datasetHelper_1.default.getDatasetRows(scorecardDefinition, latestData); const latestTs = (_b = (_a = latestDataSetRows[0]) === null || _a === void 0 ? void 0 : _a.ts) === null || _b === void 0 ? void 0 : _b.raw; const latestFiltered = datasetHelper_1.default.filterRowsByDisplayColumns(scorecardDefinition, latestDataSetRows, true); const earliestData = datasetHelper_1.default.getEarliestDataset(rawData); const earliestDataSetRows = datasetHelper_1.default.getDatasetRows(scorecardDefinition, earliestData); const earliestTs = (_d = (_c = earliestDataSetRows[0]) === null || _c === void 0 ? void 0 : _c.ts) === null || _d === void 0 ? void 0 : _d.raw; const earliestfiltered = datasetHelper_1.default.filterRowsByDisplayColumns(scorecardDefinition, earliestDataSetRows, true); return { earliest: earliestfiltered, earliestTs, latest: latestFiltered, latestTs, }; }; const createScorecardData = ({ title, value, rag, valueFor, valueFrom, prevVal, groupTitle, }) => { return { title, value, ...(rag && { rag: getRag(rag) }), valueFor, trend: createTrend(valueFor, valueFrom, value, prevVal), ...(groupTitle && { group: groupTitle, }), }; }; const createScorecard = (scorecardDefinition, rawData) => { const { columns } = scorecardDefinition; const { measures } = columns; const displayColumn = measures[0]; const { id: valueColumnId, display } = displayColumn; const dataset = getDataset(scorecardDefinition, rawData); const { earliest, latest, earliestTs, latestTs } = dataset; const scorecordArr = latest.map((datasetRow, index) => { const title = display; const { rag, raw: value } = datasetRow[valueColumnId]; const prevVal = earliest[index][valueColumnId].raw; const valueFor = `${latestTs}`; const valueFrom = `${earliestTs}`; return createScorecardData({ title, value, rag, prevVal, valueFor, valueFrom, }); }); return scorecordArr[0]; }; const createScorecardGroupFromList = (columns, earliest, earliestTs, latest, latestTs) => { const { measures } = columns; const valueColumn = measures.find((col) => col.displayValue); const displayColumn = measures.find((col) => { return col.display || col.display === ''; }); return [ { title: '', scorecards: latest.map((datasetRow, index) => { const title = displayColumn ? `${displayColumn.display} ${datasetRow[displayColumn.id].raw}` : displayColumn.display; const { rag, raw: value } = datasetRow[valueColumn.id]; const prevVal = earliest[index][valueColumn.id].raw; const valueFor = `${latestTs}`; const valueFrom = `${earliestTs}`; return createScorecardData({ title, value, rag, prevVal, valueFor, valueFrom, }); }), }, ]; }; const createScorecardGroupFromColumns = (columns, earliest, earliestTs, latest, latestTs, groupKey) => { const { measures } = columns; return latest.map((row, rowIndex) => { var _a; const groupTitle = `${(_a = row[groupKey === null || groupKey === void 0 ? void 0 : groupKey.id]) === null || _a === void 0 ? void 0 : _a.raw}` || ''; return { title: groupKey.display ? `${groupKey.display}: ${groupTitle}` : groupTitle, scorecards: Object.keys(row) .filter((colId) => colId !== (groupKey === null || groupKey === void 0 ? void 0 : groupKey.id)) .map((colId) => { var _a; const comparisonRow = earliest[rowIndex]; const measure = measures.find((m) => m.id === colId); const title = (measure === null || measure === void 0 ? void 0 : measure.display) || colId; const value = +row[colId].raw; const rag = +row[colId].rag; const prevVal = (_a = comparisonRow[colId]) === null || _a === void 0 ? void 0 : _a.raw; const valueFor = `${latestTs}`; const valueFrom = `${earliestTs}`; return createScorecardData({ title, value, rag, prevVal, valueFor, valueFrom, }); }), }; }); }; const createScorecardGroupFromListWithGroups = (columns, earliest, earliestTs, latest, latestTs, groupKey) => { const { measures } = columns; const latestGroupedByKey = datasetHelper_1.default.groupRowsByKey(latest, groupKey.id); const earliestGroupedByKey = datasetHelper_1.default.groupRowsByKey(earliest, groupKey.id); const valueColumn = measures.find((col) => col.displayValue); const displayColumn = measures.find((col) => { return col.display || col.display === ''; }); const scorecardGroup = latestGroupedByKey.map((group, groupIndex) => { var _a; const groupTitle = `${(_a = group[0][groupKey === null || groupKey === void 0 ? void 0 : groupKey.id]) === null || _a === void 0 ? void 0 : _a.raw}` || ''; return { title: groupKey.display ? `${groupKey.display}: ${groupTitle}` : groupTitle, scorecards: group.map((row, rowIndex) => { var _a; const title = displayColumn ? `${displayColumn.display} ${row[displayColumn.id].raw}` : displayColumn.display; const value = +row[valueColumn.id].raw; const rag = +row[valueColumn.id].rag; const valueFor = `${latestTs}`; const valueFrom = `${earliestTs}`; const comparisonRow = earliestGroupedByKey[groupIndex][rowIndex]; const prevVal = (_a = comparisonRow[valueColumn.id]) === null || _a === void 0 ? void 0 : _a.raw; return createScorecardData({ title, value, rag, prevVal, valueFor, valueFrom, }); }), }; }); return scorecardGroup; }; const getRag = (ragScore) => { const ragColors = ['green', 'yellow', 'red']; return { score: ragScore, color: ragColors[ragScore], }; }; const createTrend = (valueFor, valueFrom, latestValue, earliestValue) => { let trendData; if (valueFrom !== valueFor) { const value = +latestValue - +earliestValue; const direction = Math.sign(value); trendData = { direction, value: Math.abs(value), from: valueFrom, }; } return trendData; }; const mergeScorecardsIntoGroup = (visualisations) => { const groupedScorecardIndexes = visualisations // get scorecard indexes .reduce((acc, vis, i) => { if (vis.type === types_1.DashboardVisualisationType.SCORECARD) acc.push(i); return acc; }, []) // group adjacent indexes .reduce((r, n) => { const lastSubArray = r[r.length - 1]; if (!lastSubArray || lastSubArray[lastSubArray.length - 1] !== n - 1) r.push([]); r[r.length - 1].push(n); return r; }, []); groupedScorecardIndexes.reverse().forEach((group) => { const spliceAtIndex = group[0]; const scorecardGroup = group .map((scIndex) => { return visualisations[scIndex].data; }) .filter((scorecard) => !!scorecard); while (group.length) { visualisations.splice(group.pop(), 1); } if (scorecardGroup.length) { visualisations.splice(spliceAtIndex, 0, { id: `${spliceAtIndex}`, type: types_1.DashboardVisualisationType.SCORECARD_GROUP, data: [{ scorecards: scorecardGroup }], }); } }); return visualisations; }; exports.default = { createScorecard, createScorecards, mergeScorecardsIntoGroup, };