diff --git a/src/server/plugins/engine/pageControllers/RepeatPageController.ts b/src/server/plugins/engine/pageControllers/RepeatPageController.ts index 3252b8fa2..4368e24a8 100644 --- a/src/server/plugins/engine/pageControllers/RepeatPageController.ts +++ b/src/server/plugins/engine/pageControllers/RepeatPageController.ts @@ -34,6 +34,7 @@ export class RepeatPageController extends QuestionPageController { listSummaryViewName = 'repeat-list-summary' listDeleteViewName = 'item-delete' repeat: Repeat + allowSaveAndExit = true constructor(model: FormModel, pageDef: PageRepeat) { super(model, pageDef) @@ -257,6 +258,11 @@ export class RepeatPageController extends QuestionPageController { return super.proceed(request, h, nextPath) } + // Check if this is a save-and-exit action + if (action === FormAction.SaveAndExit) { + return this.handleSaveAndExit(request, context, h) + } + const nextPath = this.getNextPath(context) return super.proceed(request, h, nextPath) } @@ -433,7 +439,8 @@ export class RepeatPageController extends QuestionPageController { showTitle: true, context, errors, - checkAnswers: [{ summaryList }] + checkAnswers: [{ summaryList }], + allowSaveAndExit: this.shouldShowSaveAndExit(request.server) } } diff --git a/src/server/plugins/engine/types.ts b/src/server/plugins/engine/types.ts index a505252f6..2b0bc0214 100644 --- a/src/server/plugins/engine/types.ts +++ b/src/server/plugins/engine/types.ts @@ -329,6 +329,7 @@ export interface RepeaterSummaryPageViewModel extends PageViewModelBase { errors?: FormSubmissionError[] checkAnswers: CheckAnswers[] repeatTitle: string + allowSaveAndExit: boolean } export interface FeaturedFormPageViewModel extends FormPageViewModel { diff --git a/src/server/plugins/engine/views/repeat-list-summary.html b/src/server/plugins/engine/views/repeat-list-summary.html index 53eacbdbf..b9edf5dce 100644 --- a/src/server/plugins/engine/views/repeat-list-summary.html +++ b/src/server/plugins/engine/views/repeat-list-summary.html @@ -24,10 +24,10 @@ {{ govukSummaryList(section.summaryList) }} {% endfor %} -
+ diff --git a/test/form/repeat.test.js b/test/form/repeat.test.js index 045ecfe4b..48f4b85b4 100644 --- a/test/form/repeat.test.js +++ b/test/form/repeat.test.js @@ -362,7 +362,8 @@ describe('Repeat POST tests', () => { beforeAll(async () => { server = await createServer({ formFileName: 'repeat.js', - formFilePath: resolve(import.meta.dirname, '../form/definitions') + formFilePath: resolve(import.meta.dirname, '../form/definitions'), + saveAndExit: (request, h, _context) => h.redirect('/my-save-and-exit') }) const model = server.app.model @@ -630,6 +631,24 @@ describe('Repeat POST tests', () => { sessionId: expect.any(String) }) }) + + test('POST /pizza-order/summary with 2 items SAVE_AND_EXIT returns 303 to /summary', async () => { + const { headers } = await createRepeatItem(server, repeatPage) + + await createRepeatItem(server, repeatPage, 2, headers) + + const res1 = await server.inject({ + url: `${basePath}/pizza-order/summary`, + method: 'POST', + headers, + payload: { + action: FormAction.SaveAndExit + } + }) + + expect(res1.statusCode).toBe(StatusCodes.MOVED_TEMPORARILY) + expect(res1.headers.location).toBe('/my-save-and-exit') + }) }) /**