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.

139 lines (123 loc) 4.48 kB
import { components } from '../../../types/api' import Dict = NodeJS.Dict import ReportQuery from '../../../types/ReportQuery' import { AsyncSummary } from '../../../types/UserReports' import CollatedSummaryBuilder from '../../../utils/CollatedSummaryBuilder/CollatedSummaryBuilder' import DataTableBuilder from '../../../utils/DataTableBuilder/DataTableBuilder' import { Columns } from '../report-columns-form/types' import { ChildData } from '../../../utils/ParentChildDataTableBuilder/types' import ParentChildDataTableBuilder from '../../../utils/ParentChildDataTableBuilder/ParentChildDataTableBuilder' import SectionedDataTableBuilder from '../../../utils/SectionedDataTableBuilder/SectionedDataTableBuilder' import SectionedFieldsDataTableBuilder from '../../../utils/SectionedFieldsTableBuilder/SectionedFieldsTableBuilder' import { DataTable } from '../../../utils/DataTableBuilder/types' import type { Template } from '../../../types/Templates' const buildListTable = ( definition: components['schemas']['SingleVariantReportDefinition'], columns: Columns, reportData: Dict<string>[], summariesData: AsyncSummary[], reportQuery: ReportQuery, ): DataTable => { const { variant } = definition const { interactive, specification } = variant const collatedSummaryBuilder = new CollatedSummaryBuilder(specification, summariesData) return new DataTableBuilder(specification.fields) .withSummaries(collatedSummaryBuilder.collateDataTableSummaries()) .withHeaderOptions({ columns: columns.value, reportQuery, interactive, }) .buildTable(reportData) } const buildParentChildTable = ( definition: components['schemas']['SingleVariantReportDefinition'], columns: Columns, reportData: Dict<string>[], childData: ChildData[], ): DataTable => { return new ParentChildDataTableBuilder(definition.variant) .withNoHeaderOptions(columns.value) .withChildData(childData) .buildTable(reportData) } const buildSummarySectionTable = ( definition: components['schemas']['SingleVariantReportDefinition'], columns: Columns, reportData: Dict<string>[], summariesData: AsyncSummary[], reportQuery: ReportQuery, ): DataTable => { const { variant } = definition const { interactive, specification } = variant const collatedSummaryBuilder = new CollatedSummaryBuilder(specification, summariesData) return new SectionedDataTableBuilder(specification) .withSummaries(collatedSummaryBuilder.collateDataTableSummaries()) .withHeaderOptions({ columns: columns.value, reportQuery, interactive, }) .buildTable(reportData) } const buildRowSectionedTable = ( definition: components['schemas']['SingleVariantReportDefinition'], reportData: Dict<string>[], childData: ChildData[], ): DataTable[] => { const { variant } = definition const { interactive } = variant return reportData.map((rowData) => { return new SectionedFieldsDataTableBuilder(variant) .withHeaderOptions({ columns: new Array(2), interactive, }) .withChildData(childData) .buildTable([rowData]) }) } const createDataTable = ( definition: components['schemas']['SingleVariantReportDefinition'], columns: Columns, reportData: Dict<string>[], childData: ChildData[], summariesData: AsyncSummary[], reportQuery: ReportQuery, ): DataTable[] => { let dataTables: DataTable[] = [] const { template } = definition.variant.specification switch (template as Template) { case 'summary-section': case 'list-section': { const dataTable = buildSummarySectionTable(definition, columns, reportData, summariesData, reportQuery) dataTables.push(dataTable) break } case 'parent-child': case 'parent-child-section': { const dataTable = buildParentChildTable(definition, columns, reportData, childData) dataTables.push(dataTable) break } case 'list': { const dataTable = buildListTable(definition, columns, reportData, summariesData, reportQuery) dataTables.push(dataTable) break } case 'row-section-child': case 'row-section': { dataTables = buildRowSectionedTable(definition, reportData, childData) break } default: { const dataTable = buildListTable(definition, columns, reportData, summariesData, reportQuery) dataTables.push(dataTable) break } } return dataTables } export default { createDataTable, }