diff --git a/package-lock.json b/package-lock.json index 9411113..2af8e63 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13,7 +13,7 @@ "@aws-sdk/client-s3": "^3.679.0", "@aws-sdk/client-sqs": "^3.982.0", "@aws-sdk/s3-request-presigner": "^3.679.0", - "@defra/forms-engine-plugin": "^4.5.5", + "@defra/forms-engine-plugin": "^4.7.3", "@defra/forms-model": "^3.0.642", "@defra/hapi-tracing": "^1.12.0", "@elastic/ecs-pino-format": "^1.5.0", @@ -4995,13 +4995,13 @@ } }, "node_modules/@defra/forms-engine-plugin": { - "version": "4.5.5", - "resolved": "https://registry.npmjs.org/@defra/forms-engine-plugin/-/forms-engine-plugin-4.5.5.tgz", - "integrity": "sha512-+FpU2C654NUz1uVgGKB9iLSeOLt3bXsMKM678csQysO2EUB7j655qYh1J5q/bwdhiA4TeEZpxJ3dJ+rDKdk7vg==", + "version": "4.7.3", + "resolved": "https://registry.npmjs.org/@defra/forms-engine-plugin/-/forms-engine-plugin-4.7.3.tgz", + "integrity": "sha512-n77/Y5iLEqUEgGlRgcBitGB4c5cQeiuSG0Q+ulULsLCtYv9QO58eHwVxxM8waiPPkFHa2xffUvWCoxv4cOB/9Q==", "hasInstallScript": true, "license": "SEE LICENSE IN LICENSE", "dependencies": { - "@defra/forms-model": "^3.0.637", + "@defra/forms-model": "^3.0.647", "@defra/hapi-tracing": "^1.29.0", "@defra/interactive-map": "^0.0.17-alpha", "@elastic/ecs-pino-format": "^1.5.0", @@ -5070,9 +5070,9 @@ } }, "node_modules/@defra/forms-model": { - "version": "3.0.642", - "resolved": "https://registry.npmjs.org/@defra/forms-model/-/forms-model-3.0.642.tgz", - "integrity": "sha512-vpFQhwPHv40XjOgyJqMrdGqOQ1xR5JBg/Y6Ks99UwzJxKCF1KmBYFX3KRByO/wU/HIParVpkIqiVSTCABjI6Yw==", + "version": "3.0.648", + "resolved": "https://registry.npmjs.org/@defra/forms-model/-/forms-model-3.0.648.tgz", + "integrity": "sha512-hbQGF09vFI8Izpal2LiWIHNQbUJ4eqkQYcIcnEWDf8UpkB7qxB3LW2BQKGStjIYw4eiUz5Qus3uSG7R2skyZqA==", "license": "OGL-UK-3.0", "dependencies": { "@joi/date": "^2.1.1", diff --git a/package.json b/package.json index c481264..539f755 100644 --- a/package.json +++ b/package.json @@ -43,7 +43,7 @@ "@aws-sdk/client-s3": "^3.679.0", "@aws-sdk/client-sqs": "^3.982.0", "@aws-sdk/s3-request-presigner": "^3.679.0", - "@defra/forms-engine-plugin": "^4.5.5", + "@defra/forms-engine-plugin": "^4.7.3", "@defra/forms-model": "^3.0.642", "@defra/hapi-tracing": "^1.12.0", "@elastic/ecs-pino-format": "^1.5.0", diff --git a/src/services/submission-service.js b/src/services/submission-service.js index 0b9bc61..c2bd9eb 100644 --- a/src/services/submission-service.js +++ b/src/services/submission-service.js @@ -224,7 +224,7 @@ export function addCellToRow(row, columnName, columnValue, options) { * Coerce the value from text if the component is a * DatePartsField, MonthYearField or NumberField * @param {string | undefined} asText - the value as text - * @param {Component} component - the form component + * @param {{ type: ComponentType }} component - the form component * @returns {CellValue} the spreadsheet cell value */ export function coerceDataValue(asText, component) { @@ -247,7 +247,7 @@ export function coerceDataValue(asText, component) { * Extracts the component value from the provided data and coerces to the appropriate type * @param {Record} data - the answers data * @param {string} key - the component key (name) - * @param {Component} component - the form component + * @param {Field} component - the form component * @returns {CellValue} */ export function getValue(data, key, component) { @@ -260,7 +260,7 @@ export function getValue(data, key, component) { /** * Adds component and column header to the maps * @param {SpreadsheetContext} context - the context for spreadsheet generation - * @param {Component} component - the form component + * @param {Field} component - the form component * @param {string} [key] - the header key * @param {string} [value] - the header value */ @@ -377,12 +377,14 @@ export async function addFirstCellsToRow( * @param {SpreadsheetOptions | undefined} [options] - spreadsheet options */ function addFormComponentCellsToRow(formModel, row, context, record, options) { - formModel?.componentMap.forEach((component, key) => { - if (!component.isFormComponent) { + formModel?.componentMap.forEach((comp, key) => { + if (!comp.isFormComponent) { return } - if (hasRepeater(component.page.pageDef)) { + const component = /** @type {Field} */ (comp) + + if (component.page && hasRepeater(component.page.pageDef)) { const repeaterName = component.page.pageDef.repeat.options.name const hasRepeaterData = repeaterName in record.data.repeaters const items = hasRepeaterData ? record.data.repeaters[repeaterName] : [] @@ -503,11 +505,11 @@ export async function generateSubmissionsFile( const { components, headers, rows } = caches const context = { caches, options } - /** @type {string} */ for await (const record of getSubmissionRecords(formId, options?.filter)) { + const recordFormId = record.data.main.formId const formNameFromId = await lookupFormNameById( context, - record.data.main.formId ?? record.meta.formId + typeof recordFormId === 'string' ? recordFormId : record.meta.formId ) if (!formNameFromId) { // Exclude feedback submissions where the form no longer exists @@ -628,7 +630,10 @@ function sortHeaders(components, headers) { const repeaterComponentA = components.get(nameA) const repeaterComponentB = components.get(nameB) - if (repeaterComponentA.page === repeaterComponentB.page) { + if ( + repeaterComponentA?.page && + repeaterComponentA.page === repeaterComponentB?.page + ) { return Number(partsA[1]) - Number(partsB[1]) } } @@ -825,6 +830,6 @@ export function constructEmailContent(emailAddress, fileId, formTitle) { * @import { UserCredentials } from '@hapi/hapi' * @import { FormMetadata, FormStatus } from '@defra/forms-model' * @import { WithId } from 'mongodb' - * @import { Component } from '@defra/forms-engine-plugin/engine/components/helpers/components.js' + * @import { Component, Field } from '@defra/forms-engine-plugin/engine/components/helpers/components.js' * @import { FormSubmissionDocument } from '~/src/api/types.js' */