@ministryofjustice/hmpps-digital-prison-reporting-frontend
Version:
The Digital Prison Reporting Frontend contains templates and code to help display data effectively in UI applications.
96 lines (95 loc) • 3.96 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const json_2_csv_1 = require("json-2-csv");
const UserReports_1 = require("../types/UserReports");
const syncReportUtils_1 = __importDefault(require("./report/syncReportUtils"));
const localsHelper_1 = __importDefault(require("./localsHelper"));
const convertToCsv = (reportData, options) => {
const csvData = (0, json_2_csv_1.json2csv)(reportData, options);
return csvData;
};
const getKeys = (reportData, reportDefinition) => {
const { fields } = reportDefinition.variant.specification;
const keys = [];
Object.keys(reportData[0]).forEach((key) => {
const field = fields.find((f) => f.name === key);
keys.push({
field: key,
title: field.display,
});
});
return keys;
};
const applyColumnsAndSort = (data, columns) => {
return data.map((row) => {
return Object.keys(row)
.filter((key) => columns.includes(key))
.reduce((obj, key) => {
// eslint-disable-next-line no-param-reassign
obj[key] = row[key];
return obj;
}, {});
});
};
const removeHtmlTags = (reportData, reportDefinition) => {
// Find HMTL field + name
const { fields } = reportDefinition.variant.specification;
const htmlField = fields.find((field) => {
return field.type === 'HTML';
});
if (htmlField) {
// remove wrapping HTML tags from value
const { name } = htmlField;
reportData.map((d) => {
const innerText = /target="_blank">(.*?)<\/a>/g.exec(d[name]);
// eslint-disable-next-line prefer-destructuring, no-param-reassign
d[name] = innerText[1];
return d;
});
}
return reportData;
};
exports.default = {
async downloadReport({ req, services, res, redirect, loadType, }) {
const { userId, token } = localsHelper_1.default.getValues(res);
const { reportId, id, tableId, dataProductDefinitionsPath, reportName, name, cols: columns } = req.body;
req.query = localsHelper_1.default.setDdpPathToReqQuery(req, dataProductDefinitionsPath);
const canDownload = await services.downloadPermissionService.downloadEnabled(userId, reportId, id);
if (!canDownload) {
res.redirect(redirect);
}
else {
const reportDefinition = await services.reportingService.getDefinition(token, reportId, id, dataProductDefinitionsPath);
let reportData;
if (loadType === UserReports_1.LoadType.SYNC) {
const { reportData: listWithWarnings } = await syncReportUtils_1.default.getReportData({
services,
req,
token,
reportId,
id,
});
reportData = listWithWarnings.data;
}
else {
const pageSize = await services.reportingService.getAsyncCount(token, tableId);
reportData = await services.reportingService.getAsyncReport(token, reportId, id, tableId, {
dataProductDefinitionsPath,
pageSize,
});
}
if (columns) {
reportData = applyColumnsAndSort(reportData, JSON.parse(columns));
}
reportData = removeHtmlTags(reportData, reportDefinition);
const keys = getKeys(reportData, reportDefinition);
const csvData = convertToCsv(reportData, { keys });
res.setHeader('Content-Type', 'application/json');
res.setHeader('Content-disposition', `attachment; filename=${reportName}-${name}-${new Date().toISOString()}.csv`);
res.end(csvData);
}
},
};