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.

138 lines (137 loc) 4.89 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); const datasetHelper_1 = __importDefault(require("../../../utils/datasetHelper")); const createList = (listDefinition, dashboardData) => { const { columns, showLatest = true, columnsAsList } = listDefinition; const { measures, keys } = columns; const showAllData = !measures && !keys; let datasetData = [...dashboardData]; if (showLatest) { datasetData = datasetHelper_1.default.getLastestDataset(datasetData); } let head; let rows; let ts; if (showAllData) { ; ({ head, rows, ts } = createFullList(datasetData)); } else if (columnsAsList) { ; ({ head, rows, ts } = createListFromColumns(listDefinition, datasetData)); } else { ; ({ head, rows, ts } = creatListFromRows(listDefinition, datasetData)); } if (rows.length && measures) rows = sumColumns(rows, measures); return { table: { head, rows, }, ts, }; }; const createListFromColumns = (listDefinition, dashboardData) => { var _a, _b; const { columns } = listDefinition; const { keys, measures } = columns; const groupKey = datasetHelper_1.default.getGroupKey(keys, dashboardData); const timestampData = (_b = (_a = dashboardData[0]) === null || _a === void 0 ? void 0 : _a.ts) === null || _b === void 0 ? void 0 : _b.raw; const ts = timestampData ? `${timestampData}` : ''; const head = []; head.push({ text: '' }); dashboardData.forEach((row) => { head.push({ text: groupKey ? row[groupKey.id].raw : '', }); }); const rows = []; measures.forEach((measure) => { rows.push([{ text: measure.display }]); }); measures.forEach((measure, index) => { dashboardData.forEach((row) => { rows[index].push({ text: `${row[measure.id].raw}` }); }); }); return { rows, head, ts, }; }; const createTableRows = (data, measures) => { return data.map((dataRow) => { const row = (measures === null || measures === void 0 ? void 0 : measures.length) ? Array(measures.length) : Array(Object.keys(data[0]).length); Object.keys(dataRow).forEach((key, index) => { const headIndex = (measures === null || measures === void 0 ? void 0 : measures.length) ? measures.findIndex((m) => m.id === key) : index; const text = dataRow[key].raw; row.splice(headIndex, 1, { text }); }); return row; }); }; const creatListFromRows = (listDefinition, dashboardData) => { var _a, _b; const { measures } = listDefinition.columns; const head = measures.map((column) => { return { text: column.display }; }); const dataSetRows = datasetHelper_1.default.getDatasetRows(listDefinition, dashboardData); const displayRows = datasetHelper_1.default.filterRowsByDisplayColumns(listDefinition, dataSetRows); const rows = createTableRows(displayRows, measures); const timestampData = (_b = (_a = dataSetRows[0]) === null || _a === void 0 ? void 0 : _a.ts) === null || _b === void 0 ? void 0 : _b.raw; const ts = timestampData ? `${timestampData}` : ''; return { head, rows, ts, }; }; const createFullList = (dashboardData) => { var _a, _b; const head = Object.keys(dashboardData[0]).map((key) => { return { text: key }; }); const rows = createTableRows(dashboardData); const latestData = datasetHelper_1.default.getLastestDataset(dashboardData); const timestampData = (_b = (_a = latestData[0]) === null || _a === void 0 ? void 0 : _a.ts) === null || _b === void 0 ? void 0 : _b.raw; const ts = timestampData ? `${timestampData}` : ''; return { head, rows, ts, }; }; const sumColumns = (rowsData, measures) => { const sumColumnIndexes = measures .map((col, index) => (col.aggregate ? index : undefined)) .filter((index) => index); if (sumColumnIndexes.length) { const sumRow = [{ html: `<strong>Total<strong>` }]; for (let index = 1; index < measures.length; index += 1) { sumRow[index] = { text: '' }; } rowsData.push(sumRow); sumColumnIndexes.forEach((index) => { const total = rowsData.reduce((acc, row) => { acc += +row[index].text; return acc; }, 0); rowsData[rowsData.length - 1][index] = { html: `<strong>${total}<strong>`, }; }); } return rowsData; }; exports.default = { createList, createTableRows, };