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.

159 lines (158 loc) 6.78 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); const parseurl_1 = __importDefault(require("parseurl")); const types_1 = require("./types"); const UserReports_1 = require("../../../types/UserReports"); const utils_1 = __importDefault(require("../../_charts/utils")); const definitionUtils_1 = __importDefault(require("../../../utils/definitionUtils")); const utils_2 = __importDefault(require("../../user-reports/utils")); const utils_3 = __importDefault(require("../dashboard-list/utils")); const utils_4 = __importDefault(require("../../_filters/utils")); const utils_5 = __importDefault(require("../scorecard/utils")); const utils_6 = __importDefault(require("../../_reports/report-actions/utils")); const ReportQuery_1 = __importDefault(require("../../../types/ReportQuery")); const localsHelper_1 = __importDefault(require("../../../utils/localsHelper")); const setDashboardActions = (dashboardDefinition, reportDefinition, requestData) => { const reportName = reportDefinition.name; const { name } = dashboardDefinition; const actionsUrl = requestData.url.request.fullUrl; const { executionId } = requestData; return utils_6.default.getActions({ share: { reportName, name, url: actionsUrl, }, refresh: { url: actionsUrl, executionId, }, copy: { url: actionsUrl, }, }); }; const getDefinitionData = async ({ req, res, services, next }) => { const { token } = localsHelper_1.default.getValues(res); const { reportId, id } = req.params; const { dataProductDefinitionsPath } = req.query; // Dashboard Definition, const dashboardDefinition = await services.dashboardService.getDefinition(token, id, reportId, dataProductDefinitionsPath); // Report summary data const reportDefinition = await definitionUtils_1.default.getReportSummary(reportId, services.reportingService, token, dataProductDefinitionsPath); // Get the filters const filters = await utils_4.default.getFilters({ fields: dashboardDefinition.filterFields || [], req, interactive: true, }); // Create the query const query = new ReportQuery_1.default({ fields: dashboardDefinition.filterFields || [], queryParams: req.query, definitionsPath: dataProductDefinitionsPath, }).toRecordWithFilterPrefix(true); return { query, filters, dashboardDefinition, reportDefinition, }; }; const getSections = (dashboardDefinition, dashboardData) => { return dashboardDefinition.sections.map((section) => { const { id, display: title, description } = section; let hasScorecard = false; const visualisations = section.visualisations.map((visDefinition) => { const { type, display, description: visDescription, id: visId } = visDefinition; let data; switch (type) { case types_1.DashboardVisualisationType.LIST: data = utils_3.default.createList(visDefinition, dashboardData); break; case types_1.DashboardVisualisationType.SCORECARD: hasScorecard = true; data = utils_5.default.createScorecard(visDefinition, dashboardData); break; case types_1.DashboardVisualisationType.SCORECARD_GROUP: data = utils_5.default.createScorecards(visDefinition, dashboardData); break; case types_1.DashboardVisualisationType.BAR: case types_1.DashboardVisualisationType.LINE: case types_1.DashboardVisualisationType.BAR_TIMESERIES: case types_1.DashboardVisualisationType.LINE_TIMESERIES: case types_1.DashboardVisualisationType.DONUT: { data = utils_1.default.createChart(visDefinition, dashboardData); break; } default: break; } return { id: visId, title: display, description: visDescription, type, data, }; }); if (hasScorecard) utils_5.default.mergeScorecardsIntoGroup(visualisations); return { id, title, description, visualisations }; }); }; const updateStore = async (services, tableId, userId, sections, url, req, filters) => { const dashboardRequestData = await services.requestedReportService.getReportByTableId(tableId, userId); // Add to recently viewed if (sections && sections.length && dashboardRequestData) { utils_2.default.updateLastViewed({ services, reportStateData: dashboardRequestData, userId, search: url.search, href: url.href, req, filters, }); } return dashboardRequestData; }; exports.default = { renderAsyncDashboard: async ({ req, res, services, next }) => { const { token, csrfToken, userId } = localsHelper_1.default.getValues(res); const { reportId, id, tableId } = req.params; const url = (0, parseurl_1.default)(req); // Get the definition Data const { query, filters, reportDefinition, dashboardDefinition } = await getDefinitionData({ req, res, services, }); // Get the results data const dashboardData = await services.dashboardService.getAsyncDashboard(token, id, reportId, tableId, query); const flattenedData = dashboardData.flat(); // Get the dashboard parts const sections = getSections(dashboardDefinition, flattenedData); // Update the store const dashboardRequestData = await updateStore(services, tableId, userId, sections, url, req, filters.filters); return { dashboardData: { token, id, reportId, name: dashboardDefinition.name, description: dashboardDefinition.description, reportName: reportDefinition.name, bookmarked: await services.bookmarkService.isBookmarked(id, reportId, userId), csrfToken, sections, filters, type: UserReports_1.ReportType.DASHBOARD, actions: setDashboardActions(dashboardDefinition, reportDefinition, dashboardRequestData), }, }; }, };