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
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down Expand Up @@ -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)
}
Expand Down Expand Up @@ -433,7 +439,8 @@ export class RepeatPageController extends QuestionPageController {
showTitle: true,
context,
errors,
checkAnswers: [{ summaryList }]
checkAnswers: [{ summaryList }],
allowSaveAndExit: this.shouldShowSaveAndExit(request.server)
}
}

Expand Down
1 change: 1 addition & 0 deletions src/server/plugins/engine/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -329,6 +329,7 @@ export interface RepeaterSummaryPageViewModel extends PageViewModelBase {
errors?: FormSubmissionError[]
checkAnswers: CheckAnswers[]
repeatTitle: string
allowSaveAndExit: boolean
}

export interface FeaturedFormPageViewModel extends FormPageViewModel {
Expand Down
20 changes: 15 additions & 5 deletions src/server/plugins/engine/views/repeat-list-summary.html
Original file line number Diff line number Diff line change
Expand Up @@ -24,10 +24,10 @@
{{ govukSummaryList(section.summaryList) }}
{% endfor %}

<div class="govuk-button-group">
<form method="post" novalidate>
<input type="hidden" name="crumb" value="{{ crumb }}">
<form method="post" novalidate>
<input type="hidden" name="crumb" value="{{ crumb }}">

<div class="govuk-button-group">
{{ govukButton({
text: "Continue",
name: "action",
Expand All @@ -42,8 +42,18 @@
classes: "govuk-button--secondary",
preventDoubleClick: true
}) }}
</form>
</div>

{% if allowSaveAndExit %}
{{ govukButton({
text: "Save and exit",
classes: "govuk-button--secondary",
name: "action",
value: "save-and-exit",
preventDoubleClick: true
}) }}
{% endif %}
</div>
</form>
</div>
</div>

Expand Down
21 changes: 20 additions & 1 deletion test/form/repeat.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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')
})
})

/**
Expand Down
Loading