@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
JavaScript
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