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.

120 lines (116 loc) 5.57 kB
'use strict'; 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