Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 4 additions & 4 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@
"dependencies": {
"@aws-sdk/client-s3": "^3.995.0",
"@aws-sdk/client-sns": "^3.995.0",
"@defra/forms-model": "^3.0.648",
"@defra/forms-model": "^3.0.664",
"@defra/hapi-tracing": "^1.29.0",
"@elastic/ecs-pino-format": "^1.5.0",
"@hapi/hapi": "^21.4.4",
Expand Down
3 changes: 2 additions & 1 deletion src/api/forms/service/__stubs__/metrics.js
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,8 @@ export function getExpectedOverviewMetrics(timestamp) {
...expectedBaseSummaryMetrics,
name: 'Form 3 title',
slug: 'form-3-title',
status: 'draft'
status: 'draft',
sections: 0
},
featureMetrics: {
features: {},
Expand Down
73 changes: 64 additions & 9 deletions src/api/forms/service/report-overview.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,9 @@ import {
getErrorMessage,
hasComponentsEvenIfNoNext,
hasPaymentQuestionInForm,
hasSpecificQuestionTypeInForm
hasPostcodeLookupInForm,
hasSpecificQuestionTypeInForm,
isSummaryPage
} from '@defra/forms-model'
import { StatusCodes } from 'http-status-codes'

Expand Down Expand Up @@ -151,8 +153,8 @@ export function calcSummaryMetrics(metadata, definition, definitionType) {
status: definitionType,
pages: definition.pages.length,
questionTypes: getUniqueComponentTypes(definition).size,
conditions: definition.conditions.length,
sections: definition.sections.length,
conditions: getUniqueAssignedConditions(definition).size,
sections: getUniqueAssignedSections(definition).size,
features: getFeatureList(definition)
})
}
Expand All @@ -166,7 +168,21 @@ export function calcFeatureMetrics(definition) {
if (hasComponentsEvenIfNoNext(page)) {
allComponents.push(...page.components)
}
// Special case - if declaration in CYA page, remove the Markdown component,
// and add 'Declaration in CYA' component to totals
if (isSummaryPage(page) && hasDeclarationInCYA(definition)) {
const markdownPos = allComponents.findIndex(
(comp) => comp.type === ComponentType.Markdown
)
if (markdownPos > -1) {
allComponents.splice(markdownPos, 1)
// @ts-expect-error - 'DeclarationInCYA' is not strictly in the enum of ComponentType
// but we want a separate value for metrics display purposes
allComponents.push({ type: 'DeclarationInCYA' })
}
}
}

const questionTypes = getQuestionTypeCounts(allComponents)
return {
questionTypes: Object.fromEntries(questionTypes),
Expand All @@ -192,10 +208,10 @@ export function getQuestionTypeCounts(components) {
*/
export function getComponentUsageFeatureMetrics(definition) {
const features = getFeatureList(definition)
if (definition.pages.some((p) => p.section)) {
if (getUniqueAssignedSections(definition).size) {
features.push('Sections')
}
if (definition.pages.some((p) => p.condition)) {
if (getUniqueAssignedConditions(definition).size) {
features.push('Conditional logic')
}
const featureResult = /** @type {Record<string, number>} */ ({})
Expand All @@ -218,12 +234,25 @@ export function getFormStructureCounts(definition, questionTypes) {
return {
pages: definition.pages.length,
questions: numOfQuestions,
sections: definition.pages.filter((p) => p.section).length,
conditions: definition.pages.filter((p) => p.condition).length,
sections: getUniqueAssignedSections(definition).size,
conditions: getUniqueAssignedConditions(definition).size,
questionTypes: questionTypes.size
}
}

/**
* @param {FormDefinition} definition
*/
export function hasDeclarationInCYA(definition) {
const summaryPage = definition.pages.find((pg) => isSummaryPage(pg))
const markdown = hasComponentsEvenIfNoNext(summaryPage)
? summaryPage.components.find(
(comp, idx) => comp.type === ComponentType.Markdown && idx === 0
)
: undefined
return markdown !== undefined
}

/**
* @param {FormDefinition} definition
*/
Expand All @@ -247,13 +276,21 @@ export function getFeatureList(definition) {
if (
hasSpecificQuestionTypeInForm(definition, ComponentType.DeclarationField)
) {
features.push('Declarations')
features.push('Declaration field')
}
if (hasDeclarationInCYA(definition)) {
features.push('Declaration in CYA')
}
if (hasPostcodeLookupInForm(definition)) {
features.push('Postcode lookup')
}
if (definition.options?.showReferenceNumber) {
features.push('Reference number')
}
return features
}

/**
*
* @param {FormDefinition} definition
*/
export function getUniqueComponentTypes(definition) {
Expand All @@ -266,6 +303,24 @@ export function getUniqueComponentTypes(definition) {
return componentTypes
}

/**
* @param {FormDefinition} definition
*/
export function getUniqueAssignedConditions(definition) {
return new Set(
definition.pages.filter((p) => p.condition).map((p2) => p2.condition)
)
}

/**
* @param {FormDefinition} definition
*/
export function getUniqueAssignedSections(definition) {
return new Set(
definition.pages.filter((p) => p.section).map((p2) => p2.section)
)
}

/**
* @import { ClientSession } from 'mongodb'
* @import { ComponentDef, FormDefinition, FormMetadata } from '@defra/forms-model'
Expand Down
Loading
Loading