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