@defra/forms-engine-plugin 4.0.30 → 4.0.31
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.server/server/plugins/engine/models/SummaryViewModel.js +1 -1
- package/.server/server/plugins/engine/models/SummaryViewModel.js.map +1 -1
- package/.server/server/plugins/engine/models/__snapshots__/SummaryViewModel.test.ts.snap +17 -17
- package/.server/server/plugins/engine/views/summary.html +5 -2
- package/package.json +1 -1
- package/src/server/plugins/engine/models/SummaryViewModel.test.ts +45 -37
- package/src/server/plugins/engine/models/SummaryViewModel.ts +1 -1
- package/src/server/plugins/engine/models/__snapshots__/SummaryViewModel.test.ts.snap +17 -17
- package/src/server/plugins/engine/views/summary.html +5 -2
|
@@ -103,7 +103,7 @@ export class SummaryViewModel {
|
|
|
103
103
|
state
|
|
104
104
|
} = context;
|
|
105
105
|
const details = [];
|
|
106
|
-
[
|
|
106
|
+
[...sections, undefined].forEach(section => {
|
|
107
107
|
const items = [];
|
|
108
108
|
const sectionPages = relevantPages.filter(page => page.section === section);
|
|
109
109
|
sectionPages.forEach(page => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SummaryViewModel.js","names":["SchemaVersion","getAnswer","evaluateTemplate","getError","getPageHref","RepeatPageController","validationOptions","opts","SummaryViewModel","page","pageTitle","declaration","details","checkAnswers","context","name","backLink","feedbackLink","phaseTag","errors","serviceUrl","hasMissingNotificationEmail","components","allowSaveAndExit","constructor","request","model","basePath","def","sections","isForceAccess","title","schema","V2","result","makeFilteredSchema","relevantPages","validate","relevantState","stripUnknown","error","map","summaryDetails","detail","rows","items","item","push","href","text","classes","visuallyHiddenText","label","key","value","html","actions","undefined","summaryList","state","forEach","section","sectionPages","filter","collection","path","ItemRepeat","getSummaryPath","field","fields","ItemField","length","options","repeat","values","getListFromState","unit","returnUrl","subItems","repeatState","required","getFirstError"],"sources":["../../../../../src/server/plugins/engine/models/SummaryViewModel.ts"],"sourcesContent":["import { SchemaVersion, type Section } from '@defra/forms-model'\n\nimport {\n getAnswer,\n type Field\n} from '~/src/server/plugins/engine/components/helpers/components.js'\nimport {\n type BackLink,\n type ComponentViewModel\n} from '~/src/server/plugins/engine/components/types.js'\nimport {\n evaluateTemplate,\n getError,\n getPageHref\n} from '~/src/server/plugins/engine/helpers.js'\nimport {\n type Detail,\n type DetailItem,\n type DetailItemField,\n type DetailItemRepeat\n} from '~/src/server/plugins/engine/models/types.js'\nimport { RepeatPageController } from '~/src/server/plugins/engine/pageControllers/RepeatPageController.js'\nimport { type PageControllerClass } from '~/src/server/plugins/engine/pageControllers/helpers/pages.js'\nimport { validationOptions as opts } from '~/src/server/plugins/engine/pageControllers/validationOptions.js'\nimport {\n type CheckAnswers,\n type FormContext,\n type FormContextRequest,\n type FormState,\n type FormSubmissionError,\n type SummaryListAction,\n type SummaryListRow\n} from '~/src/server/plugins/engine/types.js'\n\nexport class SummaryViewModel {\n /**\n * Responsible for parsing state values to the govuk-frontend summary list template\n */\n\n page: PageControllerClass\n pageTitle: string\n declaration?: string\n details: Detail[]\n checkAnswers: CheckAnswers[]\n context: FormContext\n name: string | undefined\n backLink?: BackLink\n feedbackLink?: string\n phaseTag?: string\n errors?: FormSubmissionError[]\n serviceUrl: string\n hasMissingNotificationEmail?: boolean\n components?: ComponentViewModel[]\n allowSaveAndExit = false\n\n constructor(\n request: FormContextRequest,\n page: PageControllerClass,\n context: FormContext\n ) {\n const { model } = page\n const { basePath, def, sections } = model\n const { isForceAccess } = context\n\n this.page = page\n this.pageTitle = page.title\n if (def.schema === SchemaVersion.V2 && !page.title) {\n this.pageTitle = 'Check your answers before sending your form'\n }\n\n this.serviceUrl = `/${basePath}`\n this.name = def.name\n this.declaration = def.declaration\n this.context = context\n\n const result = model\n .makeFilteredSchema(this.context.relevantPages)\n .validate(this.context.relevantState, { ...opts, stripUnknown: true })\n\n // Format errors\n this.errors = result.error?.details.map(getError)\n this.details = this.summaryDetails(request, sections)\n\n // Format check answers\n this.checkAnswers = this.details.map((detail): CheckAnswers => {\n const { title } = detail\n\n const rows = detail.items.map((item): SummaryListRow => {\n const items: SummaryListAction[] = []\n\n // Remove summary list actions from previews\n if (!isForceAccess) {\n items.push({\n href: item.href,\n text: 'Change',\n classes: 'govuk-link--no-visited-state',\n visuallyHiddenText: item.label\n })\n }\n\n return {\n key: {\n text: evaluateTemplate(item.title, context)\n },\n value: {\n classes: 'app-prose-scope',\n html: item.value || 'Not provided'\n },\n actions: {\n items\n }\n }\n })\n\n return {\n title: title ? { text: title } : undefined,\n summaryList: { rows }\n }\n })\n }\n\n private summaryDetails(request: FormContextRequest, sections: Section[]) {\n const { context, errors } = this\n const { relevantPages, state } = context\n\n const details: Detail[] = []\n\n ;[undefined, ...sections].forEach((section) => {\n const items: DetailItem[] = []\n\n const sectionPages = relevantPages.filter(\n (page) => page.section === section\n )\n\n sectionPages.forEach((page) => {\n const { collection, path } = page\n\n if (page instanceof RepeatPageController) {\n items.push(\n ItemRepeat(page, state, {\n path: page.getSummaryPath(request),\n errors\n })\n )\n } else {\n for (const field of collection.fields) {\n items.push(ItemField(page, state, field, { path, errors }))\n }\n }\n })\n\n if (items.length) {\n details.push({\n name: section?.name,\n title: section?.title,\n items\n })\n }\n })\n\n return details\n }\n}\n\n/**\n * Creates a repeater detail item\n * @see {@link DetailItemField}\n */\nfunction ItemRepeat(\n page: RepeatPageController,\n state: FormState,\n options: {\n path: string\n errors?: FormSubmissionError[]\n }\n): DetailItemRepeat {\n const { collection, repeat } = page\n const { name, title } = repeat.options\n\n const values = page.getListFromState(state)\n const unit = values.length === 1 ? title : `${title}s`\n\n return {\n name,\n label: title,\n title: values.length ? `${unit} added` : unit,\n value: values.length ? `You added ${values.length} ${unit}` : '',\n href: getPageHref(page, options.path, {\n returnUrl: getPageHref(page, page.getSummaryPath())\n }),\n state,\n page,\n\n // Repeater field detail items\n subItems: values.map((repeatState) =>\n collection.fields.map((field) =>\n ItemField(page, repeatState, field, options)\n )\n )\n }\n}\n\n/**\n * Creates a form field detail item\n * @see {@link DetailItemField}\n */\nexport function ItemField(\n page: PageControllerClass,\n state: FormState,\n field: Field,\n options: {\n path: string\n errors?: FormSubmissionError[]\n }\n): DetailItemField {\n return {\n name: field.name,\n label: field.title,\n title:\n field.options.required === false\n ? `${field.label} (optional)`\n : field.label,\n error: field.getFirstError(options.errors),\n value: getAnswer(field, state),\n href: getPageHref(page, options.path, {\n returnUrl: getPageHref(page, page.getSummaryPath())\n }),\n state,\n page,\n field\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"SummaryViewModel.js","names":["SchemaVersion","getAnswer","evaluateTemplate","getError","getPageHref","RepeatPageController","validationOptions","opts","SummaryViewModel","page","pageTitle","declaration","details","checkAnswers","context","name","backLink","feedbackLink","phaseTag","errors","serviceUrl","hasMissingNotificationEmail","components","allowSaveAndExit","constructor","request","model","basePath","def","sections","isForceAccess","title","schema","V2","result","makeFilteredSchema","relevantPages","validate","relevantState","stripUnknown","error","map","summaryDetails","detail","rows","items","item","push","href","text","classes","visuallyHiddenText","label","key","value","html","actions","undefined","summaryList","state","forEach","section","sectionPages","filter","collection","path","ItemRepeat","getSummaryPath","field","fields","ItemField","length","options","repeat","values","getListFromState","unit","returnUrl","subItems","repeatState","required","getFirstError"],"sources":["../../../../../src/server/plugins/engine/models/SummaryViewModel.ts"],"sourcesContent":["import { SchemaVersion, type Section } from '@defra/forms-model'\n\nimport {\n getAnswer,\n type Field\n} from '~/src/server/plugins/engine/components/helpers/components.js'\nimport {\n type BackLink,\n type ComponentViewModel\n} from '~/src/server/plugins/engine/components/types.js'\nimport {\n evaluateTemplate,\n getError,\n getPageHref\n} from '~/src/server/plugins/engine/helpers.js'\nimport {\n type Detail,\n type DetailItem,\n type DetailItemField,\n type DetailItemRepeat\n} from '~/src/server/plugins/engine/models/types.js'\nimport { RepeatPageController } from '~/src/server/plugins/engine/pageControllers/RepeatPageController.js'\nimport { type PageControllerClass } from '~/src/server/plugins/engine/pageControllers/helpers/pages.js'\nimport { validationOptions as opts } from '~/src/server/plugins/engine/pageControllers/validationOptions.js'\nimport {\n type CheckAnswers,\n type FormContext,\n type FormContextRequest,\n type FormState,\n type FormSubmissionError,\n type SummaryListAction,\n type SummaryListRow\n} from '~/src/server/plugins/engine/types.js'\n\nexport class SummaryViewModel {\n /**\n * Responsible for parsing state values to the govuk-frontend summary list template\n */\n\n page: PageControllerClass\n pageTitle: string\n declaration?: string\n details: Detail[]\n checkAnswers: CheckAnswers[]\n context: FormContext\n name: string | undefined\n backLink?: BackLink\n feedbackLink?: string\n phaseTag?: string\n errors?: FormSubmissionError[]\n serviceUrl: string\n hasMissingNotificationEmail?: boolean\n components?: ComponentViewModel[]\n allowSaveAndExit = false\n\n constructor(\n request: FormContextRequest,\n page: PageControllerClass,\n context: FormContext\n ) {\n const { model } = page\n const { basePath, def, sections } = model\n const { isForceAccess } = context\n\n this.page = page\n this.pageTitle = page.title\n if (def.schema === SchemaVersion.V2 && !page.title) {\n this.pageTitle = 'Check your answers before sending your form'\n }\n\n this.serviceUrl = `/${basePath}`\n this.name = def.name\n this.declaration = def.declaration\n this.context = context\n\n const result = model\n .makeFilteredSchema(this.context.relevantPages)\n .validate(this.context.relevantState, { ...opts, stripUnknown: true })\n\n // Format errors\n this.errors = result.error?.details.map(getError)\n this.details = this.summaryDetails(request, sections)\n\n // Format check answers\n this.checkAnswers = this.details.map((detail): CheckAnswers => {\n const { title } = detail\n\n const rows = detail.items.map((item): SummaryListRow => {\n const items: SummaryListAction[] = []\n\n // Remove summary list actions from previews\n if (!isForceAccess) {\n items.push({\n href: item.href,\n text: 'Change',\n classes: 'govuk-link--no-visited-state',\n visuallyHiddenText: item.label\n })\n }\n\n return {\n key: {\n text: evaluateTemplate(item.title, context)\n },\n value: {\n classes: 'app-prose-scope',\n html: item.value || 'Not provided'\n },\n actions: {\n items\n }\n }\n })\n\n return {\n title: title ? { text: title } : undefined,\n summaryList: { rows }\n }\n })\n }\n\n private summaryDetails(request: FormContextRequest, sections: Section[]) {\n const { context, errors } = this\n const { relevantPages, state } = context\n\n const details: Detail[] = []\n\n ;[...sections, undefined].forEach((section) => {\n const items: DetailItem[] = []\n\n const sectionPages = relevantPages.filter(\n (page) => page.section === section\n )\n\n sectionPages.forEach((page) => {\n const { collection, path } = page\n\n if (page instanceof RepeatPageController) {\n items.push(\n ItemRepeat(page, state, {\n path: page.getSummaryPath(request),\n errors\n })\n )\n } else {\n for (const field of collection.fields) {\n items.push(ItemField(page, state, field, { path, errors }))\n }\n }\n })\n\n if (items.length) {\n details.push({\n name: section?.name,\n title: section?.title,\n items\n })\n }\n })\n\n return details\n }\n}\n\n/**\n * Creates a repeater detail item\n * @see {@link DetailItemField}\n */\nfunction ItemRepeat(\n page: RepeatPageController,\n state: FormState,\n options: {\n path: string\n errors?: FormSubmissionError[]\n }\n): DetailItemRepeat {\n const { collection, repeat } = page\n const { name, title } = repeat.options\n\n const values = page.getListFromState(state)\n const unit = values.length === 1 ? title : `${title}s`\n\n return {\n name,\n label: title,\n title: values.length ? `${unit} added` : unit,\n value: values.length ? `You added ${values.length} ${unit}` : '',\n href: getPageHref(page, options.path, {\n returnUrl: getPageHref(page, page.getSummaryPath())\n }),\n state,\n page,\n\n // Repeater field detail items\n subItems: values.map((repeatState) =>\n collection.fields.map((field) =>\n ItemField(page, repeatState, field, options)\n )\n )\n }\n}\n\n/**\n * Creates a form field detail item\n * @see {@link DetailItemField}\n */\nexport function ItemField(\n page: PageControllerClass,\n state: FormState,\n field: Field,\n options: {\n path: string\n errors?: FormSubmissionError[]\n }\n): DetailItemField {\n return {\n name: field.name,\n label: field.title,\n title:\n field.options.required === false\n ? `${field.label} (optional)`\n : field.label,\n error: field.getFirstError(options.errors),\n value: getAnswer(field, state),\n href: getPageHref(page, options.path, {\n returnUrl: getPageHref(page, page.getSummaryPath())\n }),\n state,\n page,\n field\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -2,51 +2,51 @@
|
|
|
2
2
|
|
|
3
3
|
exports[`SummaryViewModel Check answers (0 items) should use correct summary labels 1`] = `
|
|
4
4
|
[
|
|
5
|
-
{
|
|
6
|
-
"label": "How would you like to receive your pizza?",
|
|
7
|
-
"name": "orderType",
|
|
8
|
-
"title": "How you would like to receive your pizza",
|
|
9
|
-
"value": "Collection",
|
|
10
|
-
},
|
|
11
5
|
{
|
|
12
6
|
"label": "Pizza",
|
|
13
7
|
"name": "pizza",
|
|
14
8
|
"title": "Pizzas",
|
|
15
9
|
"value": "",
|
|
16
10
|
},
|
|
17
|
-
]
|
|
18
|
-
`;
|
|
19
|
-
|
|
20
|
-
exports[`SummaryViewModel Check answers (1 item) should use correct summary labels 1`] = `
|
|
21
|
-
[
|
|
22
11
|
{
|
|
23
12
|
"label": "How would you like to receive your pizza?",
|
|
24
13
|
"name": "orderType",
|
|
25
14
|
"title": "How you would like to receive your pizza",
|
|
26
|
-
"value": "
|
|
15
|
+
"value": "Collection",
|
|
27
16
|
},
|
|
17
|
+
]
|
|
18
|
+
`;
|
|
19
|
+
|
|
20
|
+
exports[`SummaryViewModel Check answers (1 item) should use correct summary labels 1`] = `
|
|
21
|
+
[
|
|
28
22
|
{
|
|
29
23
|
"label": "Pizza",
|
|
30
24
|
"name": "pizza",
|
|
31
25
|
"title": "Pizza added",
|
|
32
26
|
"value": "You added 1 Pizza",
|
|
33
27
|
},
|
|
34
|
-
]
|
|
35
|
-
`;
|
|
36
|
-
|
|
37
|
-
exports[`SummaryViewModel Check answers (2 items) should use correct summary labels 1`] = `
|
|
38
|
-
[
|
|
39
28
|
{
|
|
40
29
|
"label": "How would you like to receive your pizza?",
|
|
41
30
|
"name": "orderType",
|
|
42
31
|
"title": "How you would like to receive your pizza",
|
|
43
32
|
"value": "Delivery",
|
|
44
33
|
},
|
|
34
|
+
]
|
|
35
|
+
`;
|
|
36
|
+
|
|
37
|
+
exports[`SummaryViewModel Check answers (2 items) should use correct summary labels 1`] = `
|
|
38
|
+
[
|
|
45
39
|
{
|
|
46
40
|
"label": "Pizza",
|
|
47
41
|
"name": "pizza",
|
|
48
42
|
"title": "Pizzas added",
|
|
49
43
|
"value": "You added 2 Pizzas",
|
|
50
44
|
},
|
|
45
|
+
{
|
|
46
|
+
"label": "How would you like to receive your pizza?",
|
|
47
|
+
"name": "orderType",
|
|
48
|
+
"title": "How you would like to receive your pizza",
|
|
49
|
+
"value": "Delivery",
|
|
50
|
+
},
|
|
51
51
|
]
|
|
52
52
|
`;
|
|
@@ -33,9 +33,12 @@
|
|
|
33
33
|
<h2 class="govuk-heading-m">
|
|
34
34
|
{{ section.title.text }}
|
|
35
35
|
</h2>
|
|
36
|
+
{{ govukSummaryList(section.summaryList) }}
|
|
37
|
+
{% else %}
|
|
38
|
+
<div class="{% if not loop.first %}govuk-!-margin-top-9 govuk-!-padding-top-4{% endif %}">
|
|
39
|
+
{{ govukSummaryList(section.summaryList) }}
|
|
40
|
+
</div>
|
|
36
41
|
{% endif %}
|
|
37
|
-
|
|
38
|
-
{{ govukSummaryList(section.summaryList) }}
|
|
39
42
|
{% endfor %}
|
|
40
43
|
|
|
41
44
|
<form method="post" novalidate>
|
package/package.json
CHANGED
|
@@ -140,13 +140,13 @@ describe('SummaryViewModel', () => {
|
|
|
140
140
|
it('should add title for each section', () => {
|
|
141
141
|
const [checkAnswers1, checkAnswers2] = summaryViewModel.checkAnswers
|
|
142
142
|
|
|
143
|
-
// 1st summary list has
|
|
144
|
-
expect(checkAnswers1).toHaveProperty('title',
|
|
145
|
-
|
|
146
|
-
// 2nd summary list has section title
|
|
147
|
-
expect(checkAnswers2).toHaveProperty('title', {
|
|
143
|
+
// 1st summary list has section title
|
|
144
|
+
expect(checkAnswers1).toHaveProperty('title', {
|
|
148
145
|
text: 'Food'
|
|
149
146
|
})
|
|
147
|
+
|
|
148
|
+
// 2nd summary list has no title (unsectioned questions at bottom)
|
|
149
|
+
expect(checkAnswers2).toHaveProperty('title', undefined)
|
|
150
150
|
})
|
|
151
151
|
|
|
152
152
|
it('should add summary list for each section', () => {
|
|
@@ -157,44 +157,46 @@ describe('SummaryViewModel', () => {
|
|
|
157
157
|
const { summaryList: summaryList1 } = checkAnswers1
|
|
158
158
|
const { summaryList: summaryList2 } = checkAnswers2
|
|
159
159
|
|
|
160
|
+
// 1st summary list contains sectioned questions (Food section)
|
|
160
161
|
expect(summaryList1).toHaveProperty('rows', [
|
|
161
162
|
{
|
|
162
163
|
key: {
|
|
163
|
-
text: keys[
|
|
164
|
+
text: keys[1]
|
|
164
165
|
},
|
|
165
166
|
value: {
|
|
166
167
|
classes: 'app-prose-scope',
|
|
167
|
-
html: values[
|
|
168
|
+
html: values[1]
|
|
168
169
|
},
|
|
169
170
|
actions: {
|
|
170
171
|
items: [
|
|
171
172
|
{
|
|
172
173
|
classes: 'govuk-link--no-visited-state',
|
|
173
|
-
href: `${basePath}/
|
|
174
|
+
href: `${basePath}/pizza-order/summary?returnUrl=${encodeURIComponent(`${basePath}/summary`)}`,
|
|
174
175
|
text: 'Change',
|
|
175
|
-
visuallyHiddenText:
|
|
176
|
+
visuallyHiddenText: 'Pizza'
|
|
176
177
|
}
|
|
177
178
|
]
|
|
178
179
|
}
|
|
179
180
|
}
|
|
180
181
|
])
|
|
181
182
|
|
|
183
|
+
// 2nd summary list contains unsectioned questions (at bottom)
|
|
182
184
|
expect(summaryList2).toHaveProperty('rows', [
|
|
183
185
|
{
|
|
184
186
|
key: {
|
|
185
|
-
text: keys[
|
|
187
|
+
text: keys[2]
|
|
186
188
|
},
|
|
187
189
|
value: {
|
|
188
190
|
classes: 'app-prose-scope',
|
|
189
|
-
html: values[
|
|
191
|
+
html: values[0]
|
|
190
192
|
},
|
|
191
193
|
actions: {
|
|
192
194
|
items: [
|
|
193
195
|
{
|
|
194
196
|
classes: 'govuk-link--no-visited-state',
|
|
195
|
-
href: `${basePath}/
|
|
197
|
+
href: `${basePath}/delivery-or-collection?returnUrl=${encodeURIComponent(`${basePath}/summary`)}`,
|
|
196
198
|
text: 'Change',
|
|
197
|
-
visuallyHiddenText:
|
|
199
|
+
visuallyHiddenText: keys[0]
|
|
198
200
|
}
|
|
199
201
|
]
|
|
200
202
|
}
|
|
@@ -214,14 +216,15 @@ describe('SummaryViewModel', () => {
|
|
|
214
216
|
const { summaryList: summaryList1 } = checkAnswers1
|
|
215
217
|
const { summaryList: summaryList2 } = checkAnswers2
|
|
216
218
|
|
|
219
|
+
// 1st summary list contains sectioned questions (Food section)
|
|
217
220
|
expect(summaryList1).toHaveProperty('rows', [
|
|
218
221
|
{
|
|
219
222
|
key: {
|
|
220
|
-
text: keys[
|
|
223
|
+
text: keys[1]
|
|
221
224
|
},
|
|
222
225
|
value: {
|
|
223
226
|
classes: 'app-prose-scope',
|
|
224
|
-
html: values[
|
|
227
|
+
html: values[1]
|
|
225
228
|
},
|
|
226
229
|
actions: {
|
|
227
230
|
items: []
|
|
@@ -229,14 +232,15 @@ describe('SummaryViewModel', () => {
|
|
|
229
232
|
}
|
|
230
233
|
])
|
|
231
234
|
|
|
235
|
+
// 2nd summary list contains unsectioned questions (at bottom)
|
|
232
236
|
expect(summaryList2).toHaveProperty('rows', [
|
|
233
237
|
{
|
|
234
238
|
key: {
|
|
235
|
-
text: keys[
|
|
239
|
+
text: keys[2]
|
|
236
240
|
},
|
|
237
241
|
value: {
|
|
238
242
|
classes: 'app-prose-scope',
|
|
239
|
-
html: values[
|
|
243
|
+
html: values[0]
|
|
240
244
|
},
|
|
241
245
|
actions: {
|
|
242
246
|
items: []
|
|
@@ -254,32 +258,34 @@ describe('SummaryViewModel', () => {
|
|
|
254
258
|
|
|
255
259
|
const [details1, details2] = summaryViewModel.details
|
|
256
260
|
|
|
261
|
+
// 1st details contains sectioned questions (Food section)
|
|
257
262
|
expect(details1.items[0]).toMatchObject({
|
|
258
|
-
name: names[0],
|
|
259
|
-
value: answers[0],
|
|
260
|
-
title: keys[2],
|
|
261
|
-
label: keys[0]
|
|
262
|
-
})
|
|
263
|
-
|
|
264
|
-
expect(details2.items[0]).toMatchObject({
|
|
265
263
|
name: names[1],
|
|
266
264
|
value: answers[1],
|
|
267
265
|
title: keys[1],
|
|
268
266
|
label: keys[4]
|
|
269
267
|
})
|
|
270
268
|
|
|
269
|
+
// 2nd details contains unsectioned questions (at bottom)
|
|
270
|
+
expect(details2.items[0]).toMatchObject({
|
|
271
|
+
name: names[0],
|
|
272
|
+
value: answers[0],
|
|
273
|
+
title: keys[2],
|
|
274
|
+
label: keys[0]
|
|
275
|
+
})
|
|
276
|
+
|
|
271
277
|
const snapshot = [
|
|
272
|
-
{
|
|
273
|
-
name: names[0],
|
|
274
|
-
value: answers[0],
|
|
275
|
-
title: keys[2],
|
|
276
|
-
label: keys[0]
|
|
277
|
-
},
|
|
278
278
|
{
|
|
279
279
|
name: names[1],
|
|
280
280
|
value: answers[1],
|
|
281
281
|
title: keys[1],
|
|
282
282
|
label: keys[4]
|
|
283
|
+
},
|
|
284
|
+
{
|
|
285
|
+
name: names[0],
|
|
286
|
+
value: answers[0],
|
|
287
|
+
title: keys[2],
|
|
288
|
+
label: keys[0]
|
|
283
289
|
}
|
|
284
290
|
]
|
|
285
291
|
|
|
@@ -316,19 +322,21 @@ describe('SummaryViewModel', () => {
|
|
|
316
322
|
|
|
317
323
|
const [details1, details2] = summaryViewModel.details
|
|
318
324
|
|
|
325
|
+
// 1st details contains sectioned questions (Food section)
|
|
319
326
|
expect(details1.items[0]).toMatchObject({
|
|
320
|
-
name: 'orderType',
|
|
321
|
-
value: 'Collection',
|
|
322
|
-
title: 'How you would like to receive your pizza (optional)',
|
|
323
|
-
label: 'How would you like to receive your pizza?'
|
|
324
|
-
})
|
|
325
|
-
|
|
326
|
-
expect(details2.items[0]).toMatchObject({
|
|
327
327
|
name: 'pizza',
|
|
328
328
|
value: '',
|
|
329
329
|
title: 'Pizzas',
|
|
330
330
|
label: 'Pizza'
|
|
331
331
|
})
|
|
332
|
+
|
|
333
|
+
// 2nd details contains unsectioned questions (at bottom)
|
|
334
|
+
expect(details2.items[0]).toMatchObject({
|
|
335
|
+
name: 'orderType',
|
|
336
|
+
value: 'Collection',
|
|
337
|
+
title: 'How you would like to receive your pizza (optional)',
|
|
338
|
+
label: 'How would you like to receive your pizza?'
|
|
339
|
+
})
|
|
332
340
|
})
|
|
333
341
|
})
|
|
334
342
|
|
|
@@ -125,7 +125,7 @@ export class SummaryViewModel {
|
|
|
125
125
|
|
|
126
126
|
const details: Detail[] = []
|
|
127
127
|
|
|
128
|
-
;[
|
|
128
|
+
;[...sections, undefined].forEach((section) => {
|
|
129
129
|
const items: DetailItem[] = []
|
|
130
130
|
|
|
131
131
|
const sectionPages = relevantPages.filter(
|
|
@@ -2,51 +2,51 @@
|
|
|
2
2
|
|
|
3
3
|
exports[`SummaryViewModel Check answers (0 items) should use correct summary labels 1`] = `
|
|
4
4
|
[
|
|
5
|
-
{
|
|
6
|
-
"label": "How would you like to receive your pizza?",
|
|
7
|
-
"name": "orderType",
|
|
8
|
-
"title": "How you would like to receive your pizza",
|
|
9
|
-
"value": "Collection",
|
|
10
|
-
},
|
|
11
5
|
{
|
|
12
6
|
"label": "Pizza",
|
|
13
7
|
"name": "pizza",
|
|
14
8
|
"title": "Pizzas",
|
|
15
9
|
"value": "",
|
|
16
10
|
},
|
|
17
|
-
]
|
|
18
|
-
`;
|
|
19
|
-
|
|
20
|
-
exports[`SummaryViewModel Check answers (1 item) should use correct summary labels 1`] = `
|
|
21
|
-
[
|
|
22
11
|
{
|
|
23
12
|
"label": "How would you like to receive your pizza?",
|
|
24
13
|
"name": "orderType",
|
|
25
14
|
"title": "How you would like to receive your pizza",
|
|
26
|
-
"value": "
|
|
15
|
+
"value": "Collection",
|
|
27
16
|
},
|
|
17
|
+
]
|
|
18
|
+
`;
|
|
19
|
+
|
|
20
|
+
exports[`SummaryViewModel Check answers (1 item) should use correct summary labels 1`] = `
|
|
21
|
+
[
|
|
28
22
|
{
|
|
29
23
|
"label": "Pizza",
|
|
30
24
|
"name": "pizza",
|
|
31
25
|
"title": "Pizza added",
|
|
32
26
|
"value": "You added 1 Pizza",
|
|
33
27
|
},
|
|
34
|
-
]
|
|
35
|
-
`;
|
|
36
|
-
|
|
37
|
-
exports[`SummaryViewModel Check answers (2 items) should use correct summary labels 1`] = `
|
|
38
|
-
[
|
|
39
28
|
{
|
|
40
29
|
"label": "How would you like to receive your pizza?",
|
|
41
30
|
"name": "orderType",
|
|
42
31
|
"title": "How you would like to receive your pizza",
|
|
43
32
|
"value": "Delivery",
|
|
44
33
|
},
|
|
34
|
+
]
|
|
35
|
+
`;
|
|
36
|
+
|
|
37
|
+
exports[`SummaryViewModel Check answers (2 items) should use correct summary labels 1`] = `
|
|
38
|
+
[
|
|
45
39
|
{
|
|
46
40
|
"label": "Pizza",
|
|
47
41
|
"name": "pizza",
|
|
48
42
|
"title": "Pizzas added",
|
|
49
43
|
"value": "You added 2 Pizzas",
|
|
50
44
|
},
|
|
45
|
+
{
|
|
46
|
+
"label": "How would you like to receive your pizza?",
|
|
47
|
+
"name": "orderType",
|
|
48
|
+
"title": "How you would like to receive your pizza",
|
|
49
|
+
"value": "Delivery",
|
|
50
|
+
},
|
|
51
51
|
]
|
|
52
52
|
`;
|
|
@@ -33,9 +33,12 @@
|
|
|
33
33
|
<h2 class="govuk-heading-m">
|
|
34
34
|
{{ section.title.text }}
|
|
35
35
|
</h2>
|
|
36
|
+
{{ govukSummaryList(section.summaryList) }}
|
|
37
|
+
{% else %}
|
|
38
|
+
<div class="{% if not loop.first %}govuk-!-margin-top-9 govuk-!-padding-top-4{% endif %}">
|
|
39
|
+
{{ govukSummaryList(section.summaryList) }}
|
|
40
|
+
</div>
|
|
36
41
|
{% endif %}
|
|
37
|
-
|
|
38
|
-
{{ govukSummaryList(section.summaryList) }}
|
|
39
42
|
{% endfor %}
|
|
40
43
|
|
|
41
44
|
<form method="post" novalidate>
|