@ministryofjustice/hmpps-digital-prison-reporting-frontend
Version:
The Digital Prison Reporting Frontend contains templates and code to help display data effectively in UI applications.
120 lines (116 loc) • 5.57 kB
JavaScript
;
var utils$1 = require('../../_charts/utils.js');
var utils$2 = require('../dashboard-list/utils.js');
var types = require('../dashboard-visualisation/types.js');
var utils = require('../dashboard-visualisation/utils.js');
var ScorecardGroup = require('../scorecard-group/ScorecardGroup.js');
var Scorecard = require('../scorecard/Scorecard.js');
var utils$3 = require('../scorecard/utils.js');
const createDashboardSections = (dashboardDefinition, dashboardData, parentChildData, query, dashboardFeatureFlags, partialDate) => {
return dashboardDefinition.sections.map((section) => {
const { id, display: title, description } = section;
const featureFlagVisTypeMap = utils.getFeatureFlagVisTypeMap(dashboardFeatureFlags);
let hasScorecard = false;
const visualisations = section.visualisations.map((visDefinition) => {
const { type, variantId, display, description: visDescription, id: visId } = visDefinition;
const isEnabled = featureFlagVisTypeMap[type];
const dashboardDataForVis = parentChildData.find(data => data.id === variantId)?.data || dashboardData;
let chartData;
switch (type) {
case types.DashboardVisualisationType.LIST:
chartData = utils$2.default.createList(visDefinition, dashboardDataForVis);
break;
case types.DashboardVisualisationType.SCORECARD:
hasScorecard = true;
chartData = new Scorecard.ScorecardVisualisation().withDefinition(visDefinition).withData(dashboardDataForVis).build();
break;
case types.DashboardVisualisationType.SCORECARD_GROUP:
chartData = new ScorecardGroup.ScorecardGroupVisualisation()
.withDefinition(visDefinition)
.withData(dashboardDataForVis)
.build();
break;
case types.DashboardVisualisationType.BAR:
case types.DashboardVisualisationType.LINE:
case types.DashboardVisualisationType.DONUT: {
chartData = utils$1.default.createChart(visDefinition, dashboardDataForVis, type);
break;
}
case types.DashboardVisualisationType.MATRIX_TIMESERIES:
case types.DashboardVisualisationType.BAR_TIMESERIES:
case types.DashboardVisualisationType.LINE_TIMESERIES: {
chartData = utils$1.default.createTimeseriesCharts(visDefinition, dashboardDataForVis, type, query, partialDate);
break;
}
}
return {
id: visId,
title: display || '',
description: visDescription || '',
type,
data: chartData,
isEnabled: isEnabled ?? true,
};
});
if (hasScorecard)
utils$3.default.mergeScorecardsIntoGroup(visualisations, featureFlagVisTypeMap[types.DashboardVisualisationType.SCORECARD_GROUP]);
return { id, title: title || '', description: description || '', visualisations };
});
};
/**
* Add variant ID to section
*
* @param {components['schemas']['DashboardSectionDefinition']} section
* @param {string} variantId
* @return {*} {components['schemas']['DashboardSectionDefinition']}
*/
const addVariantIdToSection = (section, variantId) => ({
...section,
visualisations: section.visualisations.map(visualisation => ({
...visualisation,
variantId,
})),
});
/**
* Builds a master section collection from a parent dashboard and its child variants.
*
* @param {DashboardDefinition} definition
* @return {*} {components['schemas']['DashboardSectionDefinition'][]}
*/
const buildMasterSections = (definition) => {
const parentSections = definition.sections.map(section => addVariantIdToSection(section, definition.id));
return definition.childVariants.reduce((sections, childVariant) => childVariant.sections
.map(section => addVariantIdToSection(section, childVariant.id))
.reduce(mergeSection, sections), parentSections);
};
/**
* Merges the sections
*
* Rules:
* - Parent sections are added first and retain their original order.
* - Child variants are processed in array order.
* - Child sections are processed in section order within each variant.
* - If a child section ID matches an existing section ID, its visualisations are appended to that section.
* - If a child section ID does not exist, the section is appended to the end of the collection.
* - Visualisation order is preserved as defined in the source section
*
* @param {components['schemas']['DashboardSectionDefinition'][]} sections
* @param {components['schemas']['DashboardSectionDefinition']} section
* @return {*}
*/
const mergeSection = (sections, section) => {
const existingIndex = sections.findIndex(existing => existing.id === section.id);
if (existingIndex === -1) {
return [...sections, section];
}
return sections.map((existing, index) => index === existingIndex
? {
...existing,
visualisations: [...existing.visualisations, ...section.visualisations],
}
: existing);
};
exports.addVariantIdToSection = addVariantIdToSection;
exports.buildMasterSections = buildMasterSections;
exports.createDashboardSections = createDashboardSections;
//# sourceMappingURL=utils.js.map