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.

199 lines (177 loc) 5.23 kB
import type { Request } from 'express' import type { components } from '../../../types/api' import type { ListWithWarnings } from '../../../data/types' import type { Columns } from '../../_reports/report-columns-form/types' import { EmbeddedReportFeaturesList, type EmbeddedReportFeatures, type EmbeddedReportUtilsParams, } from '../../../types/EmbeddedReportUtils' import type { Services } from '../../../types/Services' import type { DownloadActionParams } from '../../_reports/report-actions/types' import { LoadType, ReportType } from '../../../types/UserReports' import ReportQuery from '../../../types/ReportQuery' import ReportActionsUtils from '../../_reports/report-actions/utils' import SyncReportUtils from '../../../utils/report/syncReportUtils' import LocalsHelper from '../../../utils/localsHelper' const setActions = ( csrfToken: string, reportDefinition: components['schemas']['SingleVariantReportDefinition'], columns: Columns, url: string, canDownload: boolean, count: number, dataProductDefinitionsPath: string, features: EmbeddedReportFeatures, currentUrl: string, currentQueryParams: string, ) => { const { name: reportName, variant, id: reportId } = reportDefinition const { name, id, printable } = variant const downloadFeature = features?.list?.includes(EmbeddedReportFeaturesList.download) const downloadConfig: DownloadActionParams = { enabled: count > 0 && downloadFeature, name, reportName, csrfToken, reportId, id, columns: columns.value, loadType: LoadType.SYNC, definitionPath: dataProductDefinitionsPath, canDownload, currentUrl, currentQueryParams, } return ReportActionsUtils.getActions({ ...(downloadFeature && { download: downloadConfig, }), print: { enabled: printable, }, share: { reportName, name, url, }, copy: { url, }, }) } const initAdditionalFeatures = async ( features: EmbeddedReportFeatures, services: Services, req: Request, userId: string, ) => { const { reportId, id } = req.params let canDownload let bookmarked let removeBookmark = true const downloadFeatureEnabled = features?.list?.includes(EmbeddedReportFeaturesList.download) if (downloadFeatureEnabled) { canDownload = await services.downloadPermissionService.downloadEnabled(userId, reportId, id) } const bookmarkFeatureEnabled = features?.list?.includes(EmbeddedReportFeaturesList.bookmark) if (bookmarkFeatureEnabled) { removeBookmark = !bookmarkFeatureEnabled bookmarked = await services.bookmarkService.isBookmarked(id, reportId, userId) } return { bookmarked, removeBookmark, canDownload, } } const getReport = async ({ req, res, services, features, options = {} }: EmbeddedReportUtilsParams) => { const { csrfToken, userId, token } = LocalsHelper.getValues(res) const { reportId, id } = req.params req.query = LocalsHelper.setDdpPathToReqQuery(req, options.dpdPath) const { dataProductDefinitionsPath } = req.query const { reportData, reportDefinition, reportQuery } = await SyncReportUtils.getReportData({ services, req, token, reportId, id, }) const count = await services.reportingService.getCount(reportDefinition.variant.resourceName, token, reportQuery) const userFeaturesConfig = await initAdditionalFeatures(features, services, req, userId) const renderData = await getRenderData({ req, reportDefinition, reportQuery, reportData, count, csrfToken, features, canDownload: userFeaturesConfig.canDownload, }) const result = { renderData: { ...renderData, ...userFeaturesConfig, csrfToken, loadType: LoadType.SYNC, reportId, id, dataProductDefinitionsPath, }, } return result } const getRenderData = async ({ req, reportDefinition, reportQuery, reportData, count, csrfToken, features, canDownload, }: { req: Request reportDefinition: components['schemas']['SingleVariantReportDefinition'] reportQuery: ReportQuery reportData: ListWithWarnings csrfToken: string count: number features: EmbeddedReportFeatures canDownload: boolean }) => { const { dataProductDefinitionsPath } = req.query const { name: reportName, description: reportDescription } = reportDefinition const { specification, name, description, classification, printable } = reportDefinition.variant const { data } = reportData const reportRenderData = await SyncReportUtils.getReportRenderData(req, count, specification, reportQuery, data) const actions = setActions( csrfToken, reportDefinition, reportRenderData.columns, `${req.protocol}://${req.get('host')}${req.originalUrl}`, canDownload, count, <string>dataProductDefinitionsPath, features, reportRenderData.reportUrl, reportRenderData.reportSearch, ) return { ...reportRenderData, reportName, name, description: description || reportDescription, count, type: ReportType.REPORT, classification, printable, actions, warnings: reportData.warnings, } } export default { getRenderData, getReport, }