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