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
98 changes: 82 additions & 16 deletions app/routes/sessions.js
Original file line number Diff line number Diff line change
Expand Up @@ -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`
Expand Down Expand Up @@ -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) => {
Expand Down Expand Up @@ -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,
Expand Down Expand Up @@ -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,
Expand Down Expand Up @@ -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,
Expand Down Expand Up @@ -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) => {
Expand Down Expand Up @@ -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)
})
})

Expand All @@ -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) => {
Expand Down
1 change: 1 addition & 0 deletions app/routes/shared/session-edit.js
Original file line number Diff line number Diff line change
Expand Up @@ -123,6 +123,7 @@ function buildSessionEditDraft (avail, date) {
originalBreakTimes: avail.breakTimes || [],
affectedBookingIds: [],
unaffectedBookingIds: [],
editPath: null,
changeDescription: 'session times',
bookingsChoice: 'keep'
}
Expand Down
112 changes: 112 additions & 0 deletions app/views/sites/session-edit-check.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,112 @@
{% extends 'layout.html' %}

{% set pageName = "Check your answers — " + site.name %}

{% block beforeContent %}
{{ backLink({ href: backHref }) }}
{% endblock %}

{% block content %}
<div class="nhsuk-grid-row">
<div class="nhsuk-grid-column-two-thirds">

<h1 class="nhsuk-heading-xl">Check your answers</h1>

<p class="nhsuk-body">Review the changes to {{ editLabel }} before saving.</p>

{% 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 %}
<ul class="nhsuk-list nhsuk-u-margin-bottom-0">
{% for blk in draft.timeBlocks %}
<li>{{ blk.start | formatTime }} to {{ blk.end | formatTime }}</li>
{% endfor %}
</ul>
{% 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") }) %}
<p>This cannot be undone.</p>
{% endcall %}

<form method="post" action="{{ formAction }}">
{{ button({
text: "Change session and remove " + affectedCount + " " + ("booking" if affectedCount === 1 else "bookings"),
classes: "nhsuk-button--warning"
}) }}
</form>
{% else %}
<form method="post" action="{{ formAction }}">
{{ button({ text: "Change session" }) }}
</form>
{% endif %}

</div>
</div>
{% endblock %}
5 changes: 0 additions & 5 deletions app/views/sites/session-options.html
Original file line number Diff line number Diff line change
Expand Up @@ -93,11 +93,6 @@ <h2 class="app-summary-card__title">Services</h2>
] }) }}
</div>
</div>

<form method="post" action="{{ formAction }}">
{{ button({ text: "Save changes" }) }}
</form>

</div>
</div>
{% endblock %}