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.

182 lines (181 loc) 7.11 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const getDatasetRows = (listDefinition, dashboardData) => { const { keys, measures, filters, expectNulls } = listDefinition.columns; const displayColumnsIds = measures.map((col) => col.id); const keyColumnsIds = (keys === null || keys === void 0 ? void 0 : keys.map((col) => col.id)) || []; const filterColIds = (filters === null || filters === void 0 ? void 0 : filters.map((col) => col.id)) || []; const hasOptionalKeys = keys === null || keys === void 0 ? void 0 : keys.some((key) => key.optional); if (dashboardData.length && dashboardData[0].ts) keyColumnsIds.unshift('ts'); const filtered = dashboardData.filter((datasetRow) => { const validRow = []; Object.keys(datasetRow).forEach((datasetField) => { const value = datasetRow[datasetField].raw; // All rows are valid until proven otherwise let valid = true; // 1. check if the column value is equal to a defined column value if (filterColIds.includes(datasetField)) { const filterColumn = filters.find((col) => col.id === datasetField); valid = value === filterColumn.equals; // 3. check keys exist in the defined columns } else if (keyColumnsIds.includes(datasetField) && hasOptionalKeys) { valid = true; // 3. check keys exist in the defined columns } else if (keyColumnsIds.includes(datasetField) && !hasOptionalKeys) { valid = value !== '' && value !== undefined && value !== null; // 2. check values exist in the defined columns } else if (displayColumnsIds.includes(datasetField)) { valid = value !== '' && value !== undefined && value !== null; // 3. check that all remaining columns are null. } else if (expectNulls) { valid = value === '' || value === undefined || value === null; } validRow.push(valid); }); return validRow.every((val) => val); }); if (hasOptionalKeys) { return filterKeys(filtered, keys); } return filtered; }; const getKeyVariations = (dashboardData, keys) => { const colIdVariations = []; const keyColumnsIds = keys.map((col) => col.id); const allOptional = keys.every((key) => key.optional); const colIdCopy = [...keyColumnsIds]; keyColumnsIds.reverse().forEach((id) => { const key = keys.find((k) => k.id === id); colIdVariations.push([...colIdCopy]); if (key && key.optional) { colIdCopy.pop(); } }); if (allOptional) colIdVariations.push([]); return colIdVariations; }; const getKeyIds = (dashboardData, colIdVariations) => { let validHeadIds = []; colIdVariations.every((ids) => { const validRows = []; dashboardData.forEach((datasetRow) => { const validRow = []; Object.keys(datasetRow).forEach((datasetField) => { const value = datasetRow[datasetField].raw; let valid = true; if (ids.includes(datasetField)) { valid = value !== '' && value !== undefined && value !== null; } validRow.push(valid); }); if (validRow.every((val) => val)) { validRows.push(datasetRow); } }); if (validRows.length > 0) { validHeadIds = ids; return false; } validHeadIds = ids; return true; }); return validHeadIds; }; const filterKeys = (dashboardData, keys) => { const colIdVariations = getKeyVariations(dashboardData, keys); const validHeadIds = getKeyIds(dashboardData, colIdVariations); return dashboardData.filter((datasetRow) => { const validRow = []; Object.keys(datasetRow).forEach((datasetField) => { const value = datasetRow[datasetField].raw; let valid = true; if (validHeadIds.includes(datasetField)) { valid = value !== '' && value !== undefined && value !== null; } validRow.push(valid); }); return validRow.every((val) => val); }); }; const getLastestDataset = (dashboardData) => { var _a, _b; const latestTimestamp = (_b = (_a = dashboardData[dashboardData.length - 1]) === null || _a === void 0 ? void 0 : _a.ts) === null || _b === void 0 ? void 0 : _b.raw; if (latestTimestamp) { return dashboardData.filter((data) => data.ts.raw === latestTimestamp); } return dashboardData; }; const getEarliestDataset = (dashboardData) => { var _a, _b; const latestTimestamp = (_b = (_a = dashboardData[0]) === null || _a === void 0 ? void 0 : _a.ts) === null || _b === void 0 ? void 0 : _b.raw; if (latestTimestamp) { return dashboardData.filter((data) => data.ts.raw === latestTimestamp); } return dashboardData; }; const groupRowsByTimestamp = (dashboardData) => { const uniqueTimestamps = [...new Set(dashboardData.map((item) => item.ts.raw))]; return uniqueTimestamps.map((ts) => { return dashboardData.filter((d) => d.ts.raw === ts); }); }; const groupRowsByKey = (dashboardData, key) => { const uniqueKeyValues = [...new Set(dashboardData.map((item) => item[key].raw))]; return uniqueKeyValues.map((keyValue) => { return dashboardData.filter((d) => d[key].raw === keyValue); }); }; const getGroupKey = (keys, rawData) => { var _a; if (!keys || !keys.length) { return undefined; } const data = rawData[0]; let index = keys.length - 1; let keyFound = false; while (!keyFound) { const k = `${(_a = keys[index]) === null || _a === void 0 ? void 0 : _a.id}`; if (k && index !== -1 && (!data[k] || !data[k].raw || data[k].raw === '' || data[k].raw === null)) { index -= 1; } else { keyFound = true; } } return index !== -1 ? keys[index] : undefined; }; const filterRowsByDisplayColumns = (listDefinition, dashboardData, includeKeys = false) => { const { keys: keyCols, measures } = listDefinition.columns; const keys = keyCols || []; let displayColumns = [...measures]; if (includeKeys) { displayColumns = [...keys, ...measures]; } const displayColumnsIds = displayColumns.map((col) => col.id); return dashboardData.map((datasetRow) => { return Object.keys(datasetRow) .filter((key) => displayColumnsIds.includes(key)) .reduce((acc, key) => { acc[key] = datasetRow[key]; return acc; }, {}); }); }; exports.default = { getDatasetRows, getLastestDataset, getEarliestDataset, filterRowsByDisplayColumns, groupRowsByTimestamp, groupRowsByKey, getGroupKey, getKeyVariations, getKeyIds, filterKeys, };