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.

96 lines (95 loc) 3.96 kB
"use strict"; 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); } }, };