@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
JavaScript
;
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,
};