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