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.

79 lines (76 loc) 2.92 kB
import { CollatedSummaryBuilder } from '../SummaryDataHelper/SummaryDataHelper.js'; import { DataTableBuilder } from '../../DataTableBuilder/DataTableBuilder.js'; import { SectionedDataHelper } from '../SectionedDataHelper/SectionedDataHelper.js'; import { TemplateBuilder } from '../TemplateBuilder.js'; class ReportBuilder extends TemplateBuilder { dataTableBuilder; sectionBuilder; constructor(variant, defId) { super(variant, defId); } buildMainTable(section) { const collatedSummaryBuilder = new CollatedSummaryBuilder(this.specification, section.summaries); const tableSummaries = collatedSummaryBuilder.collateDataTableSummaries(); this.dataTableBuilder = new DataTableBuilder(this.fields); return this.dataTableBuilder .withSummaries(tableSummaries) .withHeaderOptions({ columns: this.columns, reportQuery: this.reportQuery, interactive: true, // Always allow sorting regardless of interactive filters }) .buildTable(section.data); } buildSummaryTables(summaries) { const summaryTables = summaries.map(summaryData => { const fields = summaryData.fields; const { data, template } = summaryData; const summaryTableData = new DataTableBuilder(fields) .withNoHeaderOptions(fields.map(f => f.name)) .buildTable(data); return { template, data: summaryTableData, }; }); return this.groupSummaryTables(summaryTables); } groupSummaryTables(summaryTables) { return summaryTables.reduce((acc, item) => { if (!acc[item.template]) { acc[item.template] = []; } acc[item.template].push(item.data); return acc; }, {}); } buildSectionedData() { const sectionData = new SectionedDataHelper() .withData(this.data) .withSections(this.sections) .withSummaries(this.summaries) .withFields(this.fields) .withReportQuery(this.reportQuery) .build(); return sectionData.sections.map((section) => { const tableData = this.buildMainTable(section); const sectionSummaryTables = this.buildSummaryTables(section.summaries); return { ...section, summaries: sectionSummaryTables, data: tableData, }; }); } build() { const pageSummaryTables = this.buildSummaryTables(this.pageSummaries); const sections = this.buildSectionedData(); return { rowCount: this.data.length, summaries: pageSummaryTables, sections, }; } } export { ReportBuilder }; //# sourceMappingURL=ReportBuilder.js.map