diff --git a/app/routes/sessions.js b/app/routes/sessions.js index 8024020..c872c7f 100644 --- a/app/routes/sessions.js +++ b/app/routes/sessions.js @@ -26,6 +26,43 @@ function sessions (router, shared) { return `/sites/${siteId}/session/${availId}/${date}/breaks` } + function getSessionEditBaseHref (siteId, availId, date) { + return `/sites/${siteId}/session/${availId}/${date}/edit` + } + + function getSessionEditCheckHref (siteId, availId, date) { + return `${getSessionEditBaseHref(siteId, availId, date)}/check` + } + + function getSessionEditPathHref (siteId, availId, date, editPath) { + const base = getSessionEditBaseHref(siteId, availId, date) + if (editPath === 'booking-length') return `${base}/booking-length` + if (editPath === 'services') return `${base}/services` + return `${base}/times` + } + + function renderSessionEditCheckPage (req, res, avail, draft) { + const serviceNames = (draft.services || []) + .map(id => (req.data.services[id] ? req.data.services[id].name : id)) + const editLabel = draft.editPath === 'booking-length' + ? 'booking length' + : (draft.editPath === 'services' ? 'services' : 'session times') + + res.render('sites/session-edit-check', { + site: req.site, + sessionLabel: avail.label, + date: req.params.date, + editLabel, + draft, + serviceNames, + formAction: getSessionEditCheckHref(req.site.id, avail.id, req.params.date), + backHref: getSessionEditPathHref(req.site.id, avail.id, req.params.date, draft.editPath), + changeHref: getSessionEditPathHref(req.site.id, avail.id, req.params.date, draft.editPath), + affectedCount: (draft.affectedBookingIds || []).length, + bookingsHref: `${getSessionEditInfoHref(req.site.id, avail.id, req.params.date)}/warning` + }) + } + function getSessionBreakBackHref (siteId, availId, date, draft) { const base = getSessionBreaksBaseHref(siteId, availId, date) if (draft.breakAction === 'change' && Number.isInteger(draft.breakIndex)) return `${base}/${draft.breakIndex}/change` @@ -110,16 +147,7 @@ function sessions (router, shared) { }) router.post('/sites/:siteId/session/:availId/:date', (req, res) => { - const avail = req.site.availability.find(a => a.id === req.params.availId) - if (!avail) return res.status(404).send('Availability not found') - const draft = ensureSessionEditDraft(req, avail, req.params.date) - - if ((draft.affectedBookingIds || []).length > 0) { - return res.redirect(`${getSessionEditInfoHref(req.site.id, avail.id, req.params.date)}/warning`) - } - - applySessionEditDraft(req, avail, draft) - res.redirect(`${getSessionEditInfoHref(req.site.id, avail.id, req.params.date)}/success`) + res.redirect(getSessionEditSummaryHref(req.site.id, req.params.availId, req.params.date)) }) router.get('/sites/:siteId/session/:availId/:date/remove', (req, res) => { @@ -469,6 +497,7 @@ function sessions (router, shared) { const draft = req.session.data.sessionEditDraft if (!draft) return res.redirect(getSessionEditSummaryHref(req.site.id, req.params.availId, req.params.date)) const base = `/sites/${req.site.id}/session/${req.params.availId}/${req.params.date}/edit` + draft.editPath = 'times' res.render('sites/availability-shared-times', { site: req.site, @@ -501,14 +530,20 @@ function sessions (router, shared) { } draft.timeBlocks = parsedBlocks + draft.editPath = 'times' updateSessionEditDraftImpacts(req.site, req.params.availId, req.params.date, draft) - res.redirect(getSessionEditSummaryHref(req.site.id, req.params.availId, req.params.date)) + if ((draft.affectedBookingIds || []).length > 0) { + return res.redirect(`${getSessionEditInfoHref(req.site.id, req.params.availId, req.params.date)}/warning`) + } + + res.redirect(getSessionEditCheckHref(req.site.id, req.params.availId, req.params.date)) }) router.get('/sites/:siteId/session/:availId/:date/edit/booking-length', (req, res) => { const draft = req.session.data.sessionEditDraft if (!draft) return res.redirect(getSessionEditSummaryHref(req.site.id, req.params.availId, req.params.date)) const base = `/sites/${req.site.id}/session/${req.params.availId}/${req.params.date}/edit` + draft.editPath = 'booking-length' res.render('sites/availability-shared-booking-length', { site: req.site, @@ -538,14 +573,20 @@ function sessions (router, shared) { } draft.slotLength = value + draft.editPath = 'booking-length' updateSessionEditDraftImpacts(req.site, req.params.availId, req.params.date, draft) - res.redirect(getSessionEditSummaryHref(req.site.id, req.params.availId, req.params.date)) + if ((draft.affectedBookingIds || []).length > 0) { + return res.redirect(`${getSessionEditInfoHref(req.site.id, req.params.availId, req.params.date)}/warning`) + } + + res.redirect(getSessionEditCheckHref(req.site.id, req.params.availId, req.params.date)) }) router.get('/sites/:siteId/session/:availId/:date/edit/services', (req, res) => { const draft = req.session.data.sessionEditDraft if (!draft) return res.redirect(getSessionEditSummaryHref(req.site.id, req.params.availId, req.params.date)) const base = `/sites/${req.site.id}/session/${req.params.availId}/${req.params.date}/edit` + draft.editPath = 'services' res.render('sites/availability-shared-services', { site: req.site, @@ -579,8 +620,32 @@ function sessions (router, shared) { } draft.services = services + draft.editPath = 'services' updateSessionEditDraftImpacts(req.site, req.params.availId, req.params.date, draft) - res.redirect(getSessionEditSummaryHref(req.site.id, req.params.availId, req.params.date)) + if ((draft.affectedBookingIds || []).length > 0) { + return res.redirect(`${getSessionEditInfoHref(req.site.id, req.params.availId, req.params.date)}/warning`) + } + + res.redirect(getSessionEditCheckHref(req.site.id, req.params.availId, req.params.date)) + }) + + router.get('/sites/:siteId/session/:availId/:date/edit/check', (req, res) => { + const avail = req.site.availability.find(a => a.id === req.params.availId) + const draft = req.session.data.sessionEditDraft + if (!avail) return res.status(404).send('Availability not found') + if (!draft || !draft.editPath) return res.redirect(getSessionEditSummaryHref(req.site.id, req.params.availId, req.params.date)) + + renderSessionEditCheckPage(req, res, avail, draft) + }) + + router.post('/sites/:siteId/session/:availId/:date/edit/check', (req, res) => { + const avail = req.site.availability.find(a => a.id === req.params.availId) + const draft = req.session.data.sessionEditDraft + if (!avail) return res.status(404).send('Availability not found') + if (!draft || !draft.editPath) return res.redirect(getSessionEditSummaryHref(req.site.id, req.params.availId, req.params.date)) + + applySessionEditDraft(req, avail, draft) + res.redirect(`${getSessionEditInfoHref(req.site.id, avail.id, req.params.date)}/success`) }) router.get('/sites/:siteId/session/:availId/:date/edit/warning', (req, res) => { @@ -608,7 +673,9 @@ function sessions (router, shared) { affectedCount: affected.length, affectedBookingRows, formAction: `${base}/warning`, - backHref: getSessionEditSummaryHref(site.id, req.params.availId, date) + backHref: draft.editPath + ? getSessionEditPathHref(site.id, req.params.availId, date, draft.editPath) + : getSessionEditSummaryHref(site.id, req.params.availId, date) }) }) @@ -619,8 +686,7 @@ function sessions (router, shared) { if (!draft) return res.redirect(getSessionEditSummaryHref(req.site.id, req.params.availId, req.params.date)) draft.bookingsChoice = req.body.bookingsChoice || 'keep' - applySessionEditDraft(req, avail, draft) - res.redirect(`${getSessionEditInfoHref(req.site.id, avail.id, req.params.date)}/success`) + res.redirect(getSessionEditCheckHref(req.site.id, avail.id, req.params.date)) }) router.get('/sites/:siteId/session/:availId/:date/edit/success', (req, res) => { diff --git a/app/routes/shared/session-edit.js b/app/routes/shared/session-edit.js index 5d16398..b929a91 100644 --- a/app/routes/shared/session-edit.js +++ b/app/routes/shared/session-edit.js @@ -123,6 +123,7 @@ function buildSessionEditDraft (avail, date) { originalBreakTimes: avail.breakTimes || [], affectedBookingIds: [], unaffectedBookingIds: [], + editPath: null, changeDescription: 'session times', bookingsChoice: 'keep' } diff --git a/app/views/sites/session-edit-check.html b/app/views/sites/session-edit-check.html new file mode 100644 index 0000000..4244303 --- /dev/null +++ b/app/views/sites/session-edit-check.html @@ -0,0 +1,112 @@ +{% extends 'layout.html' %} + +{% set pageName = "Check your answers — " + site.name %} + +{% block beforeContent %} + {{ backLink({ href: backHref }) }} +{% endblock %} + +{% block content %} +
+
+ +

Check your answers

+ +

Review the changes to {{ editLabel }} before saving.

+ + {% set summaryRows = [ + { + key: { text: "Session" }, + value: { text: sessionLabel } + }, + { + key: { text: "Date" }, + value: { text: date | formatDateLong } + } + ] %} + + {% if draft.editPath === 'booking-length' %} + {% set summaryRows = (summaryRows.push({ + key: { text: "Booking length" }, + value: { text: draft.slotLength + " minutes" }, + actions: { + items: [{ + href: changeHref, + text: "Change", + visuallyHiddenText: "booking length" + }] + } + }), summaryRows) %} + {% elif draft.editPath === 'services' %} + {% set summaryRows = (summaryRows.push({ + key: { text: "Services" }, + value: { text: serviceNames | join(", ") }, + actions: { + items: [{ + href: changeHref, + text: "Change", + visuallyHiddenText: "services" + }] + } + }), summaryRows) %} + {% else %} + {% set blocksList %} + + {% endset %} + {% set summaryRows = (summaryRows.push({ + key: { text: "Time periods" }, + value: { html: blocksList }, + actions: { + items: [{ + href: changeHref, + text: "Change", + visuallyHiddenText: "session times" + }] + } + }), summaryRows) %} + {% endif %} + + {% if affectedCount > 0 %} + {% set summaryRows = (summaryRows.push({ + key: { text: "Bookings affected" }, + value: { text: affectedCount } + }), summaryRows) %} + {% set summaryRows = (summaryRows.push({ + key: { text: "What do you want to do with bookings" }, + value: { text: "Keep bookings" if draft.bookingsChoice === "keep" else ("Cancel " + affectedCount + " " + ("booking" if affectedCount === 1 else "bookings")) }, + actions: { + items: [{ + href: bookingsHref, + text: "Change", + visuallyHiddenText: "what to do with bookings" + }] + } + }), summaryRows) %} + {% endif %} + + {{ summaryList({ rows: summaryRows }) }} + + {% if affectedCount > 0 and draft.bookingsChoice === "cancel" %} + {% call warningCallout({ heading: "You are about to remove " + affectedCount + " " + ("booking" if affectedCount === 1 else "bookings") }) %} +

This cannot be undone.

+ {% endcall %} + +
+ {{ button({ + text: "Change session and remove " + affectedCount + " " + ("booking" if affectedCount === 1 else "bookings"), + classes: "nhsuk-button--warning" + }) }} +
+ {% else %} +
+ {{ button({ text: "Change session" }) }} +
+ {% endif %} + +
+
+{% endblock %} diff --git a/app/views/sites/session-options.html b/app/views/sites/session-options.html index ebbad91..3d50489 100644 --- a/app/views/sites/session-options.html +++ b/app/views/sites/session-options.html @@ -93,11 +93,6 @@

Services

] }) }} - -
- {{ button({ text: "Save changes" }) }} -
- {% endblock %}