@ministryofjustice/hmpps-digital-prison-reporting-frontend
Version:
The Digital Prison Reporting Frontend contains templates and code to help display data effectively in UI applications.
108 lines (107 loc) • 4.38 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 ParentChildDataTableBuilder_1 = __importDefault(require("../ParentChildDataTableBuilder/ParentChildDataTableBuilder"));
class SectionedFieldsDataTableBuilder extends ParentChildDataTableBuilder_1.default {
constructor(variant) {
const { sectionedFields, template } = variant.specification;
super(variant);
this.sectionedFields = sectionedFields;
this.sections = this.sectionedFields.map((f) => f.name);
this.template = template;
}
getChildFields(childId) {
const childVariant = this.variant.childVariants.find((child) => child.id === childId);
return childVariant ? childVariant.specification.fields : [];
}
getJoinKey() {
return this.variant.childVariants[0].joinFields[0];
}
initSectionedData(data) {
return data.flatMap((row) => {
const initialisedSectionsWithFields = this.sectionedFields.map((section) => {
const sectionHeader = this.mapNamesToFields([section.name])[0];
let fields = [];
const { child } = section;
if (section.fields) {
fields = this.mapNamesToFields(section.fields);
}
else if (section.child) {
fields = this.getChildFields(section.child);
}
return {
header: sectionHeader,
fields,
child,
};
});
return initialisedSectionsWithFields.map((section) => {
if (section.child) {
const childData = this.getChildData(section.child);
const displayFields = section.fields.filter((f) => f.visible);
const joinKey = this.getJoinKey();
return {
header: section.header.display,
fields: childData.data
.filter((cd) => cd[joinKey] === row[joinKey])
.map((cd) => {
var _a, _b;
return {
heading: cd[(_a = displayFields[0]) === null || _a === void 0 ? void 0 : _a.name] || 'Not found',
data: cd[(_b = displayFields[1]) === null || _b === void 0 ? void 0 : _b.name] || 'Not found',
};
}),
};
}
return {
header: section.header.display,
fields: section.fields
.filter((f) => f.visible)
.map((f) => {
return {
heading: f.display,
data: row[f.name],
};
}),
};
});
});
}
getChildData(childId) {
return this.childData.find((d) => d.id === childId);
}
createRows(data) {
const sectionedData = this.initSectionedData(data);
const rows = sectionedData.flatMap((section, index) => {
const sectionHeaderRow = this.createSectionHeader(section.header, index);
const sectionRows = section.fields.map((field) => {
return [
{
text: field.heading,
classes: 'dpr-row-heading',
},
{
text: field.data,
classes: 'dpr-row-heading-data',
},
];
});
return [...sectionHeaderRow, ...sectionRows];
});
return rows;
}
buildTable(data) {
return {
head: [
{ text: '', classes: 'dpr-row-section-header' },
{ text: '', classes: 'pr-row-section-header-value' },
],
rows: this.createRows(data),
rowCount: data.length,
colCount: this.columns.length,
};
}
}
exports.default = SectionedFieldsDataTableBuilder;