From b14f1a4e00c9b55a0c95c813d6ce1156168a56c2 Mon Sep 17 00:00:00 2001 From: Mat Johnson Date: Fri, 2 Oct 2026 13:05:20 +0100 Subject: [PATCH 01/13] Create shell of iterated 1 day clinic --- .../create-clinic-rev-1-publish-check.html | 35 ++++++--- .../create-clinic-rev-1-set-timings.html | 60 +++------------ .../create-clinic-rev-1-slot-structure.html | 76 +++++++++++++++++++ .../create-clinic-rev-1.html | 68 +++++++++++++++-- 4 files changed, 173 insertions(+), 66 deletions(-) create mode 100644 app/views/september-iteration-2/create-clinic-rev-1-slot-structure.html diff --git a/app/views/september-iteration-2/create-clinic-rev-1-publish-check.html b/app/views/september-iteration-2/create-clinic-rev-1-publish-check.html index fb7bed5c..d56635dd 100644 --- a/app/views/september-iteration-2/create-clinic-rev-1-publish-check.html +++ b/app/views/september-iteration-2/create-clinic-rev-1-publish-check.html @@ -24,22 +24,26 @@

  1. - - {{ tickSvg | safe }} - + 1 Clinic details
  2. 2 - Set date and time + Clinic session times + +
  3. +
  4. + + 3 + Slot structure
  5. - 3 - Save clinic + 4 + Check and confirm
@@ -58,7 +62,8 @@

Save clinic

Clinic details
- {{ data.clinicName }} + {{ data.clinicName }}
+ {{ data.clinicDate | formatDate }}
Change clinic details @@ -66,15 +71,25 @@

Save clinic

- Date and time + Clinic session times
- {{ data.clinicDate | formatDate }}
{{ data.newSession.startTime.hour | zeroPad }}:{{ data.newSession.startTime.minute | zeroPad }} to {{ data.newSession.endTime.hour | zeroPad }}:{{ data.newSession.endTime.minute | zeroPad }}
{{ data.newSession.duration }} minute slot length
- Change date and time + Change session times +
+ +
+
+ Slot structure +
+
+ stuff +
+
+ Change slot structure
diff --git a/app/views/september-iteration-2/create-clinic-rev-1-set-timings.html b/app/views/september-iteration-2/create-clinic-rev-1-set-timings.html index 7949e0d4..2be0299d 100644 --- a/app/views/september-iteration-2/create-clinic-rev-1-set-timings.html +++ b/app/views/september-iteration-2/create-clinic-rev-1-set-timings.html @@ -26,22 +26,26 @@

  1. - - 1 - + 1 Clinic details
  2. 2 - Set date and time + Clinic session times
  3. 3 - Save clinic + Slot structure + +
  4. +
  5. + + 4 + Check and confirm
@@ -88,51 +92,9 @@

}) }} {% endif %} -

Set date and time

- -
+

Clinic session times

-
-
- - Date of clinic - -
- For example, 18 6 2026 -
- {% if errorState === "true" %} - - Error: Date of clinic must be given a day, month, and year - - {% endif %} -
-
-
- - -
-
-
-
- - -
-
-
-
- - -
-
-
-
-
+
diff --git a/app/views/september-iteration-2/create-clinic-rev-1-slot-structure.html b/app/views/september-iteration-2/create-clinic-rev-1-slot-structure.html new file mode 100644 index 00000000..fc6e9d8f --- /dev/null +++ b/app/views/september-iteration-2/create-clinic-rev-1-slot-structure.html @@ -0,0 +1,76 @@ +{% extends 'layout.html' %} + +{% set errorState = "false" %} + +{% set pageName = "Set date and time" %} + +{% block content %} + +{% set tickSvg %} + +{% endset %} + +
+
+ +
+ +
+ +
+
+
+ + {% if errorState === "true" %} + {{ errorSummary({ + titleText: "There is a problem", + errorList: [ + { + text: "Date of clinic must be given a day, month, and year", + href: "#" + } + ] + }) }} + {% endif %} + +

Slot structure

+
+
+
+ +{% endblock %} \ No newline at end of file diff --git a/app/views/september-iteration-2/create-clinic-rev-1.html b/app/views/september-iteration-2/create-clinic-rev-1.html index b246513c..22e713fc 100644 --- a/app/views/september-iteration-2/create-clinic-rev-1.html +++ b/app/views/september-iteration-2/create-clinic-rev-1.html @@ -24,24 +24,28 @@

Create day clinic

    -
  1. +
  2. - - 1 - + 1 Clinic details
  3. 2 - Set date and time + Clinic session times
  4. 3 - Save clinic + Slot structure + +
  5. +
  6. + + 4 + Check and confirm
@@ -59,6 +63,14 @@

{ text: "Clinic must be given a name", href: "#" + }, + { + text: "Date of clinic must be given a day, month, and year", + href: "#" + }, + { + text: "Date of clinic must be in the future", + href: "#" } ] }) }} @@ -70,7 +82,7 @@

Clinic details

{% if errorState === "true" %} @@ -80,6 +92,48 @@

Clinic details

+
+
+ + Clinic session date + +
+ For example, 18 6 2026 +
+ {% if errorState === "true" %} + + Error: Date of clinic must be given a day, month, and year + + {% endif %} +
+
+
+ + +
+
+
+
+ + +
+
+
+
+ + +
+
+
+
+
+ From a4040f24e85b4562a08b81789f5c209a92ca3bff Mon Sep 17 00:00:00 2001 From: Mat Johnson Date: Fri, 2 Oct 2026 14:46:55 +0100 Subject: [PATCH 02/13] Shell completed for first round --- .../sass/components/_session-slots.scss | 53 +++++++++ app/assets/sass/main.scss | 3 +- .../create-clinic-rev-1-publish-check.html | 25 ++-- .../create-clinic-rev-1-set-timings.html | 4 +- .../create-clinic-rev-1-slot-structure.html | 111 +++++++++++++++--- .../create-clinic-rev-1.html | 2 +- 6 files changed, 159 insertions(+), 39 deletions(-) create mode 100644 app/assets/sass/components/_session-slots.scss diff --git a/app/assets/sass/components/_session-slots.scss b/app/assets/sass/components/_session-slots.scss new file mode 100644 index 00000000..7e7c0383 --- /dev/null +++ b/app/assets/sass/components/_session-slots.scss @@ -0,0 +1,53 @@ +@use "nhsuk-frontend/dist/nhsuk/core" as *; + +.slot { + background-color: nhsuk-colour("white"); + border: 1px solid $nhsuk-input-border-colour; + padding-left: nhsuk-spacing(2); + user-select: none; + @include nhsuk-responsive-margin(2, "bottom"); + min-height: nhsuk-px-to-rem(46px); +} + +.slot-end { font-size: 16px; margin-right: 1rem; } +.slot-tag { margin-left: 1rem; } + +.slot.is-hold {} +.slot.is-staff-break { + background: transparent; + border-style: dashed; +} +.slot.is-special-appointment {} + +.slot.is-merged { + border-bottom: none; + margin-bottom: 0; +} +.slot.is-merged-child { + border-top: 1px dashed #212b32; + height: 42px; +} +.slot.is-merged-child > .nhsuk-checkboxes__item, +.slot.is-merged-child > div { + display: none; +} +.slot.is-merged-last-child { + border-bottom: 1px solid #212b32; + margin-bottom: 12px; +} + +.slot.is-staff-break.is-merged-last-child { + border-bottom-style: dashed; +} + +.slot.is-merged-child > .slot-time, +.slot.is-merged-child > .slot-end { + display: none; +} + +.slot .nhsuk-checkboxes__label { + width: 100%; +} + +.panel-item { display: block; cursor: pointer; } +.panel-item.disabled { opacity: 0.38; cursor: default; pointer-events: none; } diff --git a/app/assets/sass/main.scss b/app/assets/sass/main.scss index cdf5f741..0360003d 100755 --- a/app/assets/sass/main.scss +++ b/app/assets/sass/main.scss @@ -20,8 +20,6 @@ $nhsuk-gutter: 24px, // Reduce layout spacing points (5–9). Points 0–4 stay at NHS defaults. - // Checkbox and radio geometry is fixed in px rather than driven by the spacing scale, - // and _compact.scss applies the --small variant to all checkboxes/radios. $nhsuk-spacing-points: ( 0: 0, 1: 4px, @@ -94,6 +92,7 @@ @forward "components/participant-table"; //@forward "components/participant-search"; @forward "components/progress-bar"; +@forward "components/session-slots"; @forward "components/template-card"; @forward "components/template-preview-dialog"; @forward "components/workflow"; diff --git a/app/views/september-iteration-2/create-clinic-rev-1-publish-check.html b/app/views/september-iteration-2/create-clinic-rev-1-publish-check.html index d56635dd..c5d66763 100644 --- a/app/views/september-iteration-2/create-clinic-rev-1-publish-check.html +++ b/app/views/september-iteration-2/create-clinic-rev-1-publish-check.html @@ -23,22 +23,22 @@

  1. - + 1 Clinic details - +
  2. - + 2 Clinic session times - +
  3. - + 3 Slot structure - +
  4. @@ -54,7 +54,7 @@

    -

    Save clinic

    +

    Check and confirm clinic

    @@ -86,20 +86,13 @@

    Save clinic

    Slot structure
    - stuff + {{ data.newSession.totalSlots }} bookable slots
    + 00 slots set as staff break
    Change slot structure
    -
    -
    - Total capacity -
    -
    - {{ data.newSession.totalSlots }} slots -
    -

    diff --git a/app/views/september-iteration-2/create-clinic-rev-1-set-timings.html b/app/views/september-iteration-2/create-clinic-rev-1-set-timings.html index 2be0299d..a9ebca21 100644 --- a/app/views/september-iteration-2/create-clinic-rev-1-set-timings.html +++ b/app/views/september-iteration-2/create-clinic-rev-1-set-timings.html @@ -25,10 +25,10 @@

    1. - + 1 Clinic details - +
    2. diff --git a/app/views/september-iteration-2/create-clinic-rev-1-slot-structure.html b/app/views/september-iteration-2/create-clinic-rev-1-slot-structure.html index fc6e9d8f..802928b6 100644 --- a/app/views/september-iteration-2/create-clinic-rev-1-slot-structure.html +++ b/app/views/september-iteration-2/create-clinic-rev-1-slot-structure.html @@ -25,16 +25,16 @@

      1. - + 1 Clinic details - +
      2. - + 2 Clinic session times - +
      3. @@ -53,23 +53,98 @@

    +
    -
    +
    + +
    +

    Slot structure

    +

    + Session time + 10:00 to 17:00 +

    +
    - {% if errorState === "true" %} - {{ errorSummary({ - titleText: "There is a problem", - errorList: [ - { - text: "Date of clinic must be given a day, month, and year", - href: "#" - } - ] - }) }} - {% endif %} +
    +
    +
    -

    Slot structure

    -
    +
    +
    + + +
    +
    + +
    +
    + + +
    +
    + +
    +
    + + +
    +
    + +
    +
    + + +
    +
    + +
    +
    + + +
    +
    + +
    +
    +
    +
    +

    With selected slots:

    + +
    + +
    +
    +

    + 50 bookable slots +

    +

    + +

    +
    +
    + +

diff --git a/app/views/september-iteration-2/create-clinic-rev-1.html b/app/views/september-iteration-2/create-clinic-rev-1.html index 22e713fc..4c6f5b1e 100644 --- a/app/views/september-iteration-2/create-clinic-rev-1.html +++ b/app/views/september-iteration-2/create-clinic-rev-1.html @@ -89,7 +89,7 @@

Clinic details

Error: Clinic must be given a name {% endif %} - +
From 6bf9dadbf96b9d0f78343562d2c06cace1a9d3f9 Mon Sep 17 00:00:00 2001 From: Mat Johnson Date: Fri, 2 Oct 2026 17:48:28 +0100 Subject: [PATCH 03/13] Wiring up a basic demo --- .../sass/components/_session-slots.scss | 5 +- app/data/session-data-defaults.js | 1 + app/routes/mission-1.js | 224 ++++++++++++++++++ .../create-clinic-rev-1-publish-check.html | 4 +- .../create-clinic-rev-1-set-timings.html | 83 +++---- .../create-clinic-rev-1-slot-structure.html | 83 +++---- .../create-clinic-rev-1.html | 46 ++-- 7 files changed, 310 insertions(+), 136 deletions(-) diff --git a/app/assets/sass/components/_session-slots.scss b/app/assets/sass/components/_session-slots.scss index 7e7c0383..487bcef4 100644 --- a/app/assets/sass/components/_session-slots.scss +++ b/app/assets/sass/components/_session-slots.scss @@ -9,7 +9,10 @@ min-height: nhsuk-px-to-rem(46px); } -.slot-end { font-size: 16px; margin-right: 1rem; } +.slot-end { + @include nhsuk-font-size(16); + margin-right: 1rem; +} .slot-tag { margin-left: 1rem; } .slot.is-hold {} diff --git a/app/data/session-data-defaults.js b/app/data/session-data-defaults.js index 8003d2d0..45ef5a4b 100644 --- a/app/data/session-data-defaults.js +++ b/app/data/session-data-defaults.js @@ -14,6 +14,7 @@ module.exports = { clinicCapacityPercentBooked: "0", clinicCapacityAvailable: "10", clinicCapacityTotal: "10", + missionOne: {}, createCapacityFromZero: { schedules: [], selectedDays: [], diff --git a/app/routes/mission-1.js b/app/routes/mission-1.js index c0ea97cd..cefbaefb 100644 --- a/app/routes/mission-1.js +++ b/app/routes/mission-1.js @@ -8,6 +8,31 @@ const router = express.Router() */ +const isWholeNumber = str => /^\d+$/.test(str) + +// Checks a { day, month, year } object has numeric values for each field, regardless of whether they form a real date +const hasDateFields = (dateObj) => + Boolean(dateObj) && isWholeNumber(dateObj.day) && isWholeNumber(dateObj.month) && isWholeNumber(dateObj.year) + +// Parses a { day, month, year } object into a Date, or null if invalid +const parseDateFields = (dateObj) => { + if (!hasDateFields(dateObj)) { + return null + } + + const day = parseInt(dateObj.day, 10) + const month = parseInt(dateObj.month, 10) + // Treat 2-digit years as shorthand for the 2000s, eg "26" becomes 2026 + const year = dateObj.year.length === 2 ? parseInt(`20${dateObj.year}`, 10) : parseInt(dateObj.year, 10) + const date = new Date(year, month - 1, day) + + if (date.getFullYear() !== year || date.getMonth() !== month - 1 || date.getDate() !== day) { + return null + } + + return date +} + // simple search router.get('/september-iteration-2/clickthru/04a-example-search-result', function (req, res) { const query = (req.query['search-params'] || '').trim() @@ -61,6 +86,205 @@ router.get('/action/unstage/:participantId', function (req, res) { res.redirect(req.get('referer') || '/september-iteration-2/clickthru/04-choose-participants') }); +// validating clinic name and session date for 1 day clinic creation +router.post('/september-iteration-2/create-clinic-rev-1', function (req, res) { + const clinicName = (req.body.clinicName || '').trim() + const clinicDate = req.body.clinicDate || {} + + if (typeof req.session.data.missionOne !== 'object') { + req.session.data.missionOne = {} + } + req.session.data.missionOne.clinicName = clinicName + req.session.data.missionOne.clinicDate = clinicDate + + const errors = {} + + if (!clinicName) { + errors.clinicName = 'Clinic must be given a name' + } + + if (!hasDateFields(clinicDate)) { + errors.clinicDate = 'Date of clinic must be given a day, month, and year' + } else { + const parsedDate = parseDateFields(clinicDate) + const today = new Date() + today.setHours(0, 0, 0, 0) + + if (!parsedDate || parsedDate <= today) { + errors.clinicDate = 'Date of clinic must be in the future' + } + } + + if (Object.keys(errors).length > 0) { + return res.render('september-iteration-2/create-clinic-rev-1', { + errors + }) + } + + res.redirect('/september-iteration-2/create-clinic-rev-1-set-timings') +}) + +// validating clinic session times for 1 day clinic creation +router.post('/september-iteration-2/create-clinic-rev-1-set-timings', function (req, res) { + const newSession = req.body.newSession || {} + const startTime = newSession.startTime || {} + const endTime = newSession.endTime || {} + + const startHourStr = (startTime.hour || '').trim() + const startMinuteStr = (startTime.minute || '').trim() + const endHourStr = (endTime.hour || '').trim() + const endMinuteStr = (endTime.minute || '').trim() + const durationStr = (newSession.duration || '').trim() + + const startHour = parseInt(startHourStr, 10) + const startMinute = parseInt(startMinuteStr, 10) + const endHour = parseInt(endHourStr, 10) + const endMinute = parseInt(endMinuteStr, 10) + const duration = parseInt(durationStr, 10) + + const validStartHour = isWholeNumber(startHourStr) && startHour >= 0 && startHour <= 23 + const validStartMinute = isWholeNumber(startMinuteStr) && startMinute >= 0 && startMinute <= 59 + const validEndHour = isWholeNumber(endHourStr) && endHour >= 0 && endHour <= 23 + const validEndMinute = isWholeNumber(endMinuteStr) && endMinute >= 0 && endMinute <= 59 + + const errors = {} + + if (!validStartHour || !validStartMinute) { + errors.startTime = 'Start time must be entered, in 24 hour format' + } + + if (!validEndHour || !validEndMinute) { + errors.endTime = 'End time must be entered, in 24 hour format' + } + + if (!isWholeNumber(durationStr) || duration <= 0) { + errors.duration = 'Slot length must be entered, in minutes' + } + + if (!errors.startTime && !errors.endTime) { + const startTotalMinutes = startHour * 60 + startMinute + const endTotalMinutes = endHour * 60 + endMinute + if (endTotalMinutes <= startTotalMinutes) { + errors.startTime = 'Start time must be earlier than end time' + errors.endTime = 'End time must be later than start time' + } + } + + if (typeof req.session.data.missionOne !== 'object') { + req.session.data.missionOne = {} + } + req.session.data.missionOne.startTime = startTime + req.session.data.missionOne.endTime = endTime + req.session.data.missionOne.duration = durationStr + + if (Object.keys(errors).length > 0) { + return res.render('september-iteration-2/create-clinic-rev-1-set-timings', { + errors + }) + } + + res.redirect('/september-iteration-2/create-clinic-rev-1-slot-structure') +}) + +// Formats a total minutes-from-midnight value as e.g. "10:08" +const formatClock = (totalMinutes) => { + const hour = Math.floor(totalMinutes / 60) % 24 + const minute = totalMinutes % 60 + return `${String(hour).padStart(2, '0')}:${String(minute).padStart(2, '0')}` +} + +// Builds the slot checkbox data for a clinic session, flagging any slots marked as staff breaks +const buildSessionSlots = (missionOne) => { + const startTime = missionOne.startTime || {} + const endTime = missionOne.endTime || {} + + const startMinutes = (parseInt(startTime.hour, 10) || 0) * 60 + (parseInt(startTime.minute, 10) || 0) + const endMinutes = (parseInt(endTime.hour, 10) || 0) * 60 + (parseInt(endTime.minute, 10) || 0) + const duration = parseInt(missionOne.duration, 10) || 0 + const staffBreakSlots = (missionOne.staffBreakSlots || []).map(Number).filter(Number.isInteger) + + const slots = [] + + if (duration > 0 && endMinutes > startMinutes) { + const slotCount = Math.floor((endMinutes - startMinutes) / duration) + + for (let i = 0; i < slotCount; i++) { + const slotStartMinutes = startMinutes + (i * duration) + slots.push({ + index: i, + startLabel: formatClock(slotStartMinutes), + endLabel: formatClock(slotStartMinutes + duration), + isStaffBreak: staffBreakSlots.includes(i) + }) + } + } + + const bookableSlotCount = slots.filter((slot) => !slot.isStaffBreak).length + const staffBreakSlotCount = slots.filter((slot) => slot.isStaffBreak).length + missionOne.bookableSlotCount = bookableSlotCount + missionOne.staffBreakSlotCount = staffBreakSlotCount + + return { + slots, + bookableSlotCount, + staffBreakSlotCount, + sessionStartLabel: formatClock(startMinutes), + sessionEndLabel: formatClock(endMinutes) + } +} + +// computing the real slot structure from the submitted session times for 1 day clinic creation +router.get('/september-iteration-2/create-clinic-rev-1-slot-structure', function (req, res) { + const missionOne = req.session.data.missionOne || {} + + res.render('september-iteration-2/create-clinic-rev-1-slot-structure', buildSessionSlots(missionOne)) +}) + +// marking the selected slots as staff breaks for 1 day clinic creation +router.post('/september-iteration-2/create-clinic-rev-1-slot-structure/mark-staff-break', function (req, res) { + const missionOne = req.session.data.missionOne || {} + // nhsuk-frontend's checkboxes component submits an "_unchecked" sentinel for every untoggled box, so filter down to real indices + const selectedSlots = [].concat(req.body.computedSlots || []).map(Number).filter(Number.isInteger) + + const errors = {} + if (selectedSlots.length === 0) { + errors.slots = 'you need to select some slots' + } + + if (Object.keys(errors).length > 0) { + return res.render('september-iteration-2/create-clinic-rev-1-slot-structure', Object.assign({ errors }, buildSessionSlots(missionOne))) + } + + const staffBreakSlots = new Set((missionOne.staffBreakSlots || []).map(Number).filter(Number.isInteger)) + selectedSlots.forEach((index) => staffBreakSlots.add(index)) + missionOne.staffBreakSlots = Array.from(staffBreakSlots) + req.session.data.missionOne = missionOne + + res.redirect('/september-iteration-2/create-clinic-rev-1-slot-structure') +}) + +// clearing staff break status from the selected slots for 1 day clinic creation +router.post('/september-iteration-2/create-clinic-rev-1-slot-structure/clear-slot-type', function (req, res) { + const missionOne = req.session.data.missionOne || {} + // nhsuk-frontend's checkboxes component submits an "_unchecked" sentinel for every untoggled box, so filter down to real indices + const selectedSlots = [].concat(req.body.computedSlots || []).map(Number).filter(Number.isInteger) + + const errors = {} + if (selectedSlots.length === 0) { + errors.slots = 'you need to select some slots' + } + + if (Object.keys(errors).length > 0) { + return res.render('september-iteration-2/create-clinic-rev-1-slot-structure', Object.assign({ errors }, buildSessionSlots(missionOne))) + } + + const selectedSet = new Set(selectedSlots) + missionOne.staffBreakSlots = (missionOne.staffBreakSlots || []).map(Number).filter(Number.isInteger).filter((index) => !selectedSet.has(index)) + req.session.data.missionOne = missionOne + + res.redirect('/september-iteration-2/create-clinic-rev-1-slot-structure') +}) + // creating and passing Total Slots through for 1 day clinic creation router.post('/september-iteration-2/create-clinic-rev-1-publish-check', function (req, res) { const newSession = req.session.data.newSession || {} diff --git a/app/views/september-iteration-2/create-clinic-rev-1-publish-check.html b/app/views/september-iteration-2/create-clinic-rev-1-publish-check.html index c5d66763..a26be8ff 100644 --- a/app/views/september-iteration-2/create-clinic-rev-1-publish-check.html +++ b/app/views/september-iteration-2/create-clinic-rev-1-publish-check.html @@ -86,8 +86,8 @@

Check and confirm clinic

Slot structure
- {{ data.newSession.totalSlots }} bookable slots
- 00 slots set as staff break + {{ data.missionOne.bookableSlotCount }} bookable slots
+ {{ data.missionOne.staffBreakSlotCount }} slots set as staff break
Change slot structure diff --git a/app/views/september-iteration-2/create-clinic-rev-1-set-timings.html b/app/views/september-iteration-2/create-clinic-rev-1-set-timings.html index a9ebca21..c221d5ae 100644 --- a/app/views/september-iteration-2/create-clinic-rev-1-set-timings.html +++ b/app/views/september-iteration-2/create-clinic-rev-1-set-timings.html @@ -1,6 +1,6 @@ {% extends 'layout.html' %} -{% set errorState = "false" %} +{% set errorState = "true" if errors else "false" %} {% set pageName = "Set date and time" %} @@ -57,46 +57,27 @@

{% if errorState === "true" %} + {% set errorList = [] %} + {% if errors.startTime %} + {% set errorList = errorList.concat([{ text: errors.startTime, href: "#start-time-hour" }]) %} + {% endif %} + {% if errors.endTime %} + {% set errorList = errorList.concat([{ text: errors.endTime, href: "#end-time-hour" }]) %} + {% endif %} + {% if errors.duration %} + {% set errorList = errorList.concat([{ text: errors.duration, href: "#duration" }]) %} + {% endif %} {{ errorSummary({ titleText: "There is a problem", - errorList: [ - { - text: "Date of clinic must be given a day, month, and year", - href: "#" - }, - { - text: "Date of clinic must be in the future", - href: "#" - }, - { - text: "Start time must be entered, in 24 hour format", - href: "#" - }, - { - text: "End time must be entered, in 24 hour format", - href: "#" - }, - { - text: "End time must be later than start time", - href: "#" - }, - { - text: "Start time must be earlier than end time", - href: "#" - }, - { - text: "Slot length must be entered, in minutes", - href: "#" - } - ] + errorList: errorList }) }} {% endif %}

Clinic session times

-
+ -
+
Session start time @@ -104,9 +85,9 @@

Clinic session times

Use 24 hour format, for example, 10:00
- {% if errorState === "true" %} + {% if errors and errors.startTime %} - Error: Start time must be entered, in 24 hour format + Error: {{ errors.startTime }} {% endif %} @@ -116,8 +97,8 @@

Clinic session times

- +
@@ -126,15 +107,15 @@

Clinic session times

- +

-
+
Session end time @@ -142,9 +123,9 @@

Clinic session times

Use 24 hour format, for example, 17:00
- {% if errorState === "true" %} + {% if errors and errors.endTime %} - Error: End time must be entered, in 24 hour format + Error: {{ errors.endTime }} {% endif %} @@ -154,8 +135,8 @@

Clinic session times

- +
@@ -163,26 +144,26 @@

Clinic session times

- +
-
+
- {% if errorState === "true" %} + {% if errors and errors.duration %} - Error: Slot length must be entered, in minutes + Error: {{ errors.duration }} {% endif %}
- +
diff --git a/app/views/september-iteration-2/create-clinic-rev-1-slot-structure.html b/app/views/september-iteration-2/create-clinic-rev-1-slot-structure.html index 802928b6..f9cde456 100644 --- a/app/views/september-iteration-2/create-clinic-rev-1-slot-structure.html +++ b/app/views/september-iteration-2/create-clinic-rev-1-slot-structure.html @@ -1,6 +1,6 @@ {% extends 'layout.html' %} -{% set errorState = "false" %} +{% set errorState = "true" if errors else "false" %} {% set pageName = "Set date and time" %} @@ -55,13 +55,23 @@

- +
+ {% if errorState === "true" %} + {% set errorList = [] %} + {% if errors.slots %} + {% set errorList = errorList.concat([{ text: errors.slots, href: "#computed-slot-0" }]) %} + {% endif %} + {{ errorSummary({ + titleText: "There is a problem", + errorList: errorList + }) }} + {% endif %}

Slot structure

Session time - 10:00 to 17:00 + {{ sessionStartLabel }} to {{ sessionEndLabel }}

@@ -69,77 +79,38 @@

-
+ {% for slot in slots %} +
- -
- -
-
- - -
-
- -
-
- - -
-
- -
-
- - -
-
- -
-
- - -
-
+ {% endfor %}
-

With selected slots:

- +

Set selected slots as:

+
- +

- 50 bookable slots + {{ bookableSlotCount }} bookable slots

- +

diff --git a/app/views/september-iteration-2/create-clinic-rev-1.html b/app/views/september-iteration-2/create-clinic-rev-1.html index 4c6f5b1e..55a7ad4e 100644 --- a/app/views/september-iteration-2/create-clinic-rev-1.html +++ b/app/views/september-iteration-2/create-clinic-rev-1.html @@ -1,6 +1,6 @@ {% extends 'layout.html' %} -{% set errorState = "false" %} +{% set errorState = "true" if errors else "false" %} {% set pageName = "Create day clinic" %} @@ -57,42 +57,36 @@

{% if errorState === "true" %} + {% set errorList = [] %} + {% if errors.clinicName %} + {% set errorList = errorList.concat([{ text: errors.clinicName, href: "#clinic-name" }]) %} + {% endif %} + {% if errors.clinicDate %} + {% set errorList = errorList.concat([{ text: errors.clinicDate, href: "#clinic-date-day" }]) %} + {% endif %} {{ errorSummary({ titleText: "There is a problem", - errorList: [ - { - text: "Clinic must be given a name", - href: "#" - }, - { - text: "Date of clinic must be given a day, month, and year", - href: "#" - }, - { - text: "Date of clinic must be in the future", - href: "#" - } - ] + errorList: errorList }) }} {% endif %}

Clinic details

- + -
+
- {% if errorState === "true" %} + {% if errors and errors.clinicName %} - Error: Clinic must be given a name + Error: {{ errors.clinicName }} {% endif %} - +
-
+
Clinic session date @@ -100,9 +94,9 @@

Clinic details

For example, 18 6 2026
- {% if errorState === "true" %} + {% if errors and errors.clinicDate %} - Error: Date of clinic must be given a day, month, and year + Error: {{ errors.clinicDate }} {% endif %}
@@ -111,7 +105,7 @@

Clinic details

- +
@@ -119,7 +113,7 @@

Clinic details

- +
@@ -127,7 +121,7 @@

Clinic details

- +
From f5dd9f49d3df4c04a27269ab1a9fd576b2d00f24 Mon Sep 17 00:00:00 2001 From: Mat Johnson Date: Fri, 2 Oct 2026 17:55:40 +0100 Subject: [PATCH 04/13] Drop back staff break style visually --- app/assets/sass/components/_session-slots.scss | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/app/assets/sass/components/_session-slots.scss b/app/assets/sass/components/_session-slots.scss index 487bcef4..175fe706 100644 --- a/app/assets/sass/components/_session-slots.scss +++ b/app/assets/sass/components/_session-slots.scss @@ -16,10 +16,12 @@ .slot-tag { margin-left: 1rem; } .slot.is-hold {} + .slot.is-staff-break { - background: transparent; - border-style: dashed; + background: repeating-linear-gradient(130deg, nhsuk-colour("grey-4"), nhsuk-colour("grey-4") 1px, transparent 1px, transparent 12px); + border-color: $nhsuk-border-colour; } + .slot.is-special-appointment {} .slot.is-merged { From d147a03c18a1d62ae4ad6c7da79163d0c1dbe9f0 Mon Sep 17 00:00:00 2001 From: Mat Johnson Date: Mon, 5 Oct 2026 15:38:31 +0100 Subject: [PATCH 05/13] Rewire and reword --- app/routes/mission-1.js | 28 +++- .../create-clinic-rev-1-publish-check.html | 34 +++-- .../create-clinic-rev-1-schedule.html | 130 ++++++++++++++++++ .../create-clinic-rev-1-set-timings.html | 12 +- .../create-clinic-rev-1-slot-structure.html | 12 +- .../create-clinic-rev-1.html | 66 ++------- 6 files changed, 211 insertions(+), 71 deletions(-) create mode 100644 app/views/september-iteration-2/create-clinic-rev-1-schedule.html diff --git a/app/routes/mission-1.js b/app/routes/mission-1.js index cefbaefb..b13c5d4e 100644 --- a/app/routes/mission-1.js +++ b/app/routes/mission-1.js @@ -86,16 +86,14 @@ router.get('/action/unstage/:participantId', function (req, res) { res.redirect(req.get('referer') || '/september-iteration-2/clickthru/04-choose-participants') }); -// validating clinic name and session date for 1 day clinic creation +// validating clinic name for 1 day clinic creation router.post('/september-iteration-2/create-clinic-rev-1', function (req, res) { const clinicName = (req.body.clinicName || '').trim() - const clinicDate = req.body.clinicDate || {} - if (typeof req.session.data.missionOne !== 'object') { + if (!req.session.data.missionOne || typeof req.session.data.missionOne !== 'object') { req.session.data.missionOne = {} } req.session.data.missionOne.clinicName = clinicName - req.session.data.missionOne.clinicDate = clinicDate const errors = {} @@ -103,6 +101,26 @@ router.post('/september-iteration-2/create-clinic-rev-1', function (req, res) { errors.clinicName = 'Clinic must be given a name' } + if (Object.keys(errors).length > 0) { + return res.render('september-iteration-2/create-clinic-rev-1', { + errors + }) + } + + res.redirect('/september-iteration-2/create-clinic-rev-1-schedule') +}) + +// validating the scheduled date for 1 day clinic creation +router.post('/september-iteration-2/create-clinic-rev-1-schedule', function (req, res) { + const clinicDate = req.body.clinicDate || {} + + if (!req.session.data.missionOne || typeof req.session.data.missionOne !== 'object') { + req.session.data.missionOne = {} + } + req.session.data.missionOne.clinicDate = clinicDate + + const errors = {} + if (!hasDateFields(clinicDate)) { errors.clinicDate = 'Date of clinic must be given a day, month, and year' } else { @@ -116,7 +134,7 @@ router.post('/september-iteration-2/create-clinic-rev-1', function (req, res) { } if (Object.keys(errors).length > 0) { - return res.render('september-iteration-2/create-clinic-rev-1', { + return res.render('september-iteration-2/create-clinic-rev-1-schedule', { errors }) } diff --git a/app/views/september-iteration-2/create-clinic-rev-1-publish-check.html b/app/views/september-iteration-2/create-clinic-rev-1-publish-check.html index a26be8ff..0e75ca7a 100644 --- a/app/views/september-iteration-2/create-clinic-rev-1-publish-check.html +++ b/app/views/september-iteration-2/create-clinic-rev-1-publish-check.html @@ -19,19 +19,25 @@

Workflow steps - Create day clinic + Create clinic session

  1. 1 - Clinic details + Clinic name + +
  2. +
  3. + + 2 + Scheduled date
  4. 2 - Clinic session times + Session times
  5. @@ -54,24 +60,34 @@

    -

    Check and confirm clinic

    +

    Check and confirm

    - Clinic details + Clinic name +
    +
    + {{ data.clinicName }} +
    +
    + Change clinic name +
    +
    +
    +
    + Scheduled date
    - {{ data.clinicName }}
    {{ data.clinicDate | formatDate }}
    - Change clinic details + Change scheduled date
    - Clinic session times + Session times
    {{ data.newSession.startTime.hour | zeroPad }}:{{ data.newSession.startTime.minute | zeroPad }} to {{ data.newSession.endTime.hour | zeroPad }}:{{ data.newSession.endTime.minute | zeroPad }}
    @@ -96,7 +112,7 @@

    Check and confirm clinic

    - Save clinic + Save clinic session

    diff --git a/app/views/september-iteration-2/create-clinic-rev-1-schedule.html b/app/views/september-iteration-2/create-clinic-rev-1-schedule.html new file mode 100644 index 00000000..4c53ac0f --- /dev/null +++ b/app/views/september-iteration-2/create-clinic-rev-1-schedule.html @@ -0,0 +1,130 @@ +{% extends 'layout.html' %} + +{% set errorState = "true" if errors else "false" %} + +{% set pageName = "Create day clinic" %} + +{% block content %} + +{% set tickSvg %} + +{% endset %} + +
    +
    + +
    + +
    + +
    +
    +
    + + {% if errorState === "true" %} + {% set errorList = [] %} + {% if errors.clinicDate %} + {% set errorList = errorList.concat([{ text: errors.clinicDate, href: "#clinic-date-day" }]) %} + {% endif %} + {{ errorSummary({ + titleText: "There is a problem", + errorList: errorList + }) }} + {% endif %} + + + +
    +
    + +

    + Scheduled date +

    +
    +
    + For example, 18 6 2026 +
    + {% if errors and errors.clinicDate %} + + Error: {{ errors.clinicDate }} + + {% endif %} +
    +
    +
    + + +
    +
    +
    +
    + + +
    +
    +
    +
    + + +
    +
    +
    +
    +
    + + + + +
    +
    + + + +{% endblock %} \ No newline at end of file diff --git a/app/views/september-iteration-2/create-clinic-rev-1-set-timings.html b/app/views/september-iteration-2/create-clinic-rev-1-set-timings.html index c221d5ae..7388f72c 100644 --- a/app/views/september-iteration-2/create-clinic-rev-1-set-timings.html +++ b/app/views/september-iteration-2/create-clinic-rev-1-set-timings.html @@ -21,19 +21,25 @@

    Workflow steps - Create day clinic + Create clinic session

    1. 1 - Clinic details + Clinic name + +
    2. +
    3. + + 2 + Scheduled date
    4. 2 - Clinic session times + Session times
    5. diff --git a/app/views/september-iteration-2/create-clinic-rev-1-slot-structure.html b/app/views/september-iteration-2/create-clinic-rev-1-slot-structure.html index f9cde456..adaf2a51 100644 --- a/app/views/september-iteration-2/create-clinic-rev-1-slot-structure.html +++ b/app/views/september-iteration-2/create-clinic-rev-1-slot-structure.html @@ -21,19 +21,25 @@

      Workflow steps - Create day clinic + Create clinic session

      1. 1 - Clinic details + Clinic name + +
      2. +
      3. + + 2 + Scheduled date
      4. 2 - Clinic session times + Session times
      5. diff --git a/app/views/september-iteration-2/create-clinic-rev-1.html b/app/views/september-iteration-2/create-clinic-rev-1.html index 55a7ad4e..77b89b54 100644 --- a/app/views/september-iteration-2/create-clinic-rev-1.html +++ b/app/views/september-iteration-2/create-clinic-rev-1.html @@ -21,30 +21,36 @@

        Workflow steps - Create day clinic + Create clinic session

        1. 1 - Clinic details + Clinic name
        2. 2 - Clinic session times + Scheduled date
        3. 3 - Slot structure + Session times
        4. 4 + Slot structure + +
        5. +
        6. + + 5 Check and confirm
        7. @@ -70,14 +76,14 @@

          }) }} {% endif %} -

          Clinic details

          -
          - +

          + +

          {% if errors and errors.clinicName %} Error: {{ errors.clinicName }} @@ -86,48 +92,6 @@

          Clinic details

          -
          -
          - - Clinic session date - -
          - For example, 18 6 2026 -
          - {% if errors and errors.clinicDate %} - - Error: {{ errors.clinicDate }} - - {% endif %} -
          -
          -
          - - -
          -
          -
          -
          - - -
          -
          -
          -
          - - -
          -
          -
          -
          -
          -
          From f6edd45b4d54836b548d63b6538237f769d3157b Mon Sep 17 00:00:00 2001 From: Mat Johnson Date: Mon, 5 Oct 2026 16:59:33 +0100 Subject: [PATCH 06/13] Check and change wiring, plus rendering the new clinic (only once, they won't stack up in the prototype) --- app/routes/mission-1.js | 8 +++- ...v-1.html => create-clinic-rev-1-name.html} | 0 .../create-clinic-rev-1-publish-check.html | 20 +++++----- .../create-clinic-rev-1-schedule.html | 2 +- .../create-clinic-rev-1-set-timings.html | 2 +- .../create-clinic-rev-1-slot-structure.html | 2 +- .../september-iteration-2/create-clinic.html | 37 ++++++++++++++++++- 7 files changed, 55 insertions(+), 16 deletions(-) rename app/views/september-iteration-2/{create-clinic-rev-1.html => create-clinic-rev-1-name.html} (100%) diff --git a/app/routes/mission-1.js b/app/routes/mission-1.js index b13c5d4e..8ab3387a 100644 --- a/app/routes/mission-1.js +++ b/app/routes/mission-1.js @@ -87,7 +87,7 @@ router.get('/action/unstage/:participantId', function (req, res) { }); // validating clinic name for 1 day clinic creation -router.post('/september-iteration-2/create-clinic-rev-1', function (req, res) { +router.post('/september-iteration-2/create-clinic-rev-1-name', function (req, res) { const clinicName = (req.body.clinicName || '').trim() if (!req.session.data.missionOne || typeof req.session.data.missionOne !== 'object') { @@ -102,7 +102,7 @@ router.post('/september-iteration-2/create-clinic-rev-1', function (req, res) { } if (Object.keys(errors).length > 0) { - return res.render('september-iteration-2/create-clinic-rev-1', { + return res.render('september-iteration-2/create-clinic-rev-1-name', { errors }) } @@ -114,6 +114,10 @@ router.post('/september-iteration-2/create-clinic-rev-1', function (req, res) { router.post('/september-iteration-2/create-clinic-rev-1-schedule', function (req, res) { const clinicDate = req.body.clinicDate || {} + if (typeof clinicDate.year === 'string' && /^\d{2}$/.test(clinicDate.year)) { + clinicDate.year = `20${clinicDate.year}` + } + if (!req.session.data.missionOne || typeof req.session.data.missionOne !== 'object') { req.session.data.missionOne = {} } diff --git a/app/views/september-iteration-2/create-clinic-rev-1.html b/app/views/september-iteration-2/create-clinic-rev-1-name.html similarity index 100% rename from app/views/september-iteration-2/create-clinic-rev-1.html rename to app/views/september-iteration-2/create-clinic-rev-1-name.html diff --git a/app/views/september-iteration-2/create-clinic-rev-1-publish-check.html b/app/views/september-iteration-2/create-clinic-rev-1-publish-check.html index 0e75ca7a..f9662c54 100644 --- a/app/views/september-iteration-2/create-clinic-rev-1-publish-check.html +++ b/app/views/september-iteration-2/create-clinic-rev-1-publish-check.html @@ -23,7 +23,7 @@

          1. - + 1 Clinic name @@ -68,10 +68,10 @@

            Check and confirm

            Clinic name
            - {{ data.clinicName }} + {{ data.missionOne.clinicName }}
            - Change clinic name + Change clinic name
    @@ -79,10 +79,10 @@

    Check and confirm

    Scheduled date
    - {{ data.clinicDate | formatDate }} + {{ data.missionOne.clinicDate | formatDate }}
    - Change scheduled date + Change scheduled date
    @@ -90,11 +90,11 @@

    Check and confirm

    Session times
    - {{ data.newSession.startTime.hour | zeroPad }}:{{ data.newSession.startTime.minute | zeroPad }} to {{ data.newSession.endTime.hour | zeroPad }}:{{ data.newSession.endTime.minute | zeroPad }}
    - {{ data.newSession.duration }} minute slot length + {{ data.missionOne.startTime.hour | zeroPad }}:{{ data.newSession.startTime.minute | zeroPad }} to {{ data.newSession.endTime.hour | zeroPad }}:{{ data.newSession.endTime.minute | zeroPad }}
    + {{ data.missionOne.duration }} minute slot length
    - Change session times + Change session times
    @@ -106,13 +106,13 @@

    Check and confirm

    {{ data.missionOne.staffBreakSlotCount }} slots set as staff break
    - Change slot structure + Change slot structure

    - Save clinic session + Save clinic session

    diff --git a/app/views/september-iteration-2/create-clinic-rev-1-schedule.html b/app/views/september-iteration-2/create-clinic-rev-1-schedule.html index 4c53ac0f..7b0381a5 100644 --- a/app/views/september-iteration-2/create-clinic-rev-1-schedule.html +++ b/app/views/september-iteration-2/create-clinic-rev-1-schedule.html @@ -25,7 +25,7 @@

    1. - + 1 Clinic details diff --git a/app/views/september-iteration-2/create-clinic-rev-1-set-timings.html b/app/views/september-iteration-2/create-clinic-rev-1-set-timings.html index 7388f72c..7d6b6421 100644 --- a/app/views/september-iteration-2/create-clinic-rev-1-set-timings.html +++ b/app/views/september-iteration-2/create-clinic-rev-1-set-timings.html @@ -25,7 +25,7 @@

      1. - + 1 Clinic name diff --git a/app/views/september-iteration-2/create-clinic-rev-1-slot-structure.html b/app/views/september-iteration-2/create-clinic-rev-1-slot-structure.html index adaf2a51..7752e2d6 100644 --- a/app/views/september-iteration-2/create-clinic-rev-1-slot-structure.html +++ b/app/views/september-iteration-2/create-clinic-rev-1-slot-structure.html @@ -25,7 +25,7 @@

        1. - + 1 Clinic name diff --git a/app/views/september-iteration-2/create-clinic.html b/app/views/september-iteration-2/create-clinic.html index b96f9c29..e5e3af82 100644 --- a/app/views/september-iteration-2/create-clinic.html +++ b/app/views/september-iteration-2/create-clinic.html @@ -11,7 +11,7 @@

          Clinics

          {{ button({ text: "Create a new clinic", - href: "create-clinic-rev-1", + href: "create-clinic-rev-1-name", classes: "nhsuk-button--secondary" }) }}

@@ -47,6 +47,41 @@

Clinics

+ {% if data.missionOne and data.missionOne.clinicName %} + + + {{ data.missionOne.clinicName }} + + + no data + + + no data + + + {% if data.missionOne.clinicDate %} + {{ data.missionOne.clinicDate | formatDate }}
+ 1 day + {% else %} + no data + {% endif %} + + + {% if data.missionOne.bookableSlotCount is not undefined %} +
+ {{ data.missionOne.bookableSlotCount }} slots available of {{ data.missionOne.bookableSlotCount }} + {% else %} + no data + {% endif %} + + + + Select this clinic + + + + {% endif %} + From 2b6b1291a6314ca424591a1ab75ad56c878b33ee Mon Sep 17 00:00:00 2001 From: Mat Johnson Date: Tue, 6 Oct 2026 12:57:44 +0100 Subject: [PATCH 07/13] Move some files (part 1) and finalise round trip to clinic listing --- app/assets/sass/main.scss | 3 ++ app/views/index.html | 18 +++++----- .../_includes/min-primary-navigation.html | 0 .../_includes/participant-search.html | 0 .../appointing-complete.html | 2 +- .../batch-detail-trimmed-csv.html | 2 +- .../batch-detail.html | 2 +- .../group.html | 2 +- .../pre-appoint-confirm.html | 2 +- .../search-and-results.html | 4 +-- .../search.html | 4 +-- .../spinner.html | 2 +- .../upload-a-batch.html | 2 +- .../search/batch-participant-search.html | 2 +- app/views/search/participant-search-prev.html | 2 +- .../clickthru/01-upload.html | 2 +- .../clickthru/02-batch-detail.html | 2 +- .../clickthru/03-select-clinic.html | 2 +- .../clickthru/04-choose-participants.html | 2 +- .../clickthru/04a-example-search-result.html | 2 +- .../clickthru/05-review.html | 2 +- .../clickthru/05a-review-interrupt.html | 2 +- .../clickthru/06-booked.html | 2 +- .../september-iteration-2/create-clinic.html | 33 ++++++++++++++----- .../participant-search-alternatives.html | 2 +- 25 files changed, 58 insertions(+), 40 deletions(-) rename app/views/{ => mission-1}/z-september-transactional-journey/_includes/min-primary-navigation.html (100%) rename app/views/{ => mission-1}/z-september-transactional-journey/_includes/participant-search.html (100%) rename app/views/{ => mission-1}/z-september-transactional-journey/appointing-complete.html (99%) rename app/views/{ => mission-1}/z-september-transactional-journey/batch-detail-trimmed-csv.html (99%) rename app/views/{ => mission-1}/z-september-transactional-journey/batch-detail.html (92%) rename app/views/{ => mission-1}/z-september-transactional-journey/group.html (98%) rename app/views/{ => mission-1}/z-september-transactional-journey/pre-appoint-confirm.html (94%) rename app/views/{ => mission-1}/z-september-transactional-journey/search-and-results.html (95%) rename app/views/{ => mission-1}/z-september-transactional-journey/search.html (57%) rename app/views/{ => mission-1}/z-september-transactional-journey/spinner.html (95%) rename app/views/{ => mission-1}/z-september-transactional-journey/upload-a-batch.html (87%) diff --git a/app/assets/sass/main.scss b/app/assets/sass/main.scss index 0360003d..2534b84e 100755 --- a/app/assets/sass/main.scss +++ b/app/assets/sass/main.scss @@ -229,4 +229,7 @@ a { } .app-tag--attached { margin-right: -1px; +} +.app-nowrap { + white-space: nowrap; } \ No newline at end of file diff --git a/app/views/index.html b/app/views/index.html index 091f5dee..a157b6d4 100755 --- a/app/views/index.html +++ b/app/views/index.html @@ -192,34 +192,34 @@

Iteration 1

Users upload a csv containing the participants they wish to book into a prearranged single day clinic.

  1. - Upload a batch + Upload a batch
  2. - Batch detail for trimmed csv + Batch detail for trimmed csv
  3. - Pre-appointment confirmation + Pre-appointment confirmation
  4. - Single day of appointments + Single day of appointments

Defunct work on finding and grouping participants. Components to be reused elsewhere.

  1. - Batch detail + Batch detail
  2. - Search participants + Search participants
  3. - Search results + Search results
  4. - Group + Group
  5. - [Utility] "appointing" spinner + [Utility] "appointing" spinner
diff --git a/app/views/z-september-transactional-journey/_includes/min-primary-navigation.html b/app/views/mission-1/z-september-transactional-journey/_includes/min-primary-navigation.html similarity index 100% rename from app/views/z-september-transactional-journey/_includes/min-primary-navigation.html rename to app/views/mission-1/z-september-transactional-journey/_includes/min-primary-navigation.html diff --git a/app/views/z-september-transactional-journey/_includes/participant-search.html b/app/views/mission-1/z-september-transactional-journey/_includes/participant-search.html similarity index 100% rename from app/views/z-september-transactional-journey/_includes/participant-search.html rename to app/views/mission-1/z-september-transactional-journey/_includes/participant-search.html diff --git a/app/views/z-september-transactional-journey/appointing-complete.html b/app/views/mission-1/z-september-transactional-journey/appointing-complete.html similarity index 99% rename from app/views/z-september-transactional-journey/appointing-complete.html rename to app/views/mission-1/z-september-transactional-journey/appointing-complete.html index 28e7ef37..84108aa8 100644 --- a/app/views/z-september-transactional-journey/appointing-complete.html +++ b/app/views/mission-1/z-september-transactional-journey/appointing-complete.html @@ -2,7 +2,7 @@ {% set pageName = "" %} -{% from "z-september-transactional-journey/_includes/min-primary-navigation.html" import primaryNavigation %} +{% from "mission-1/z-september-transactional-journey/_includes/min-primary-navigation.html" import primaryNavigation %} {% block header %} {{ primaryNavigation() }} {% endblock %} diff --git a/app/views/z-september-transactional-journey/batch-detail-trimmed-csv.html b/app/views/mission-1/z-september-transactional-journey/batch-detail-trimmed-csv.html similarity index 99% rename from app/views/z-september-transactional-journey/batch-detail-trimmed-csv.html rename to app/views/mission-1/z-september-transactional-journey/batch-detail-trimmed-csv.html index 4274089e..0cb64702 100644 --- a/app/views/z-september-transactional-journey/batch-detail-trimmed-csv.html +++ b/app/views/mission-1/z-september-transactional-journey/batch-detail-trimmed-csv.html @@ -2,7 +2,7 @@ {% set pageName = "Batch detail" %} -{% from "z-september-transactional-journey/_includes/min-primary-navigation.html" import primaryNavigation %} +{% from "mission-1/z-september-transactional-journey/_includes/min-primary-navigation.html" import primaryNavigation %} {% block header %} {{ primaryNavigation() }} {% endblock %} diff --git a/app/views/z-september-transactional-journey/batch-detail.html b/app/views/mission-1/z-september-transactional-journey/batch-detail.html similarity index 92% rename from app/views/z-september-transactional-journey/batch-detail.html rename to app/views/mission-1/z-september-transactional-journey/batch-detail.html index b0225296..9cd4869f 100644 --- a/app/views/z-september-transactional-journey/batch-detail.html +++ b/app/views/mission-1/z-september-transactional-journey/batch-detail.html @@ -2,7 +2,7 @@ {% set pageName = "Batch detail" %} -{% from "z-september-transactional-journey/_includes/min-primary-navigation.html" import primaryNavigation %} +{% from "mission-1/z-september-transactional-journey/_includes/min-primary-navigation.html" import primaryNavigation %} {% block header %} {{ primaryNavigation() }} {% endblock %} diff --git a/app/views/z-september-transactional-journey/group.html b/app/views/mission-1/z-september-transactional-journey/group.html similarity index 98% rename from app/views/z-september-transactional-journey/group.html rename to app/views/mission-1/z-september-transactional-journey/group.html index fa248292..35fc7d63 100644 --- a/app/views/z-september-transactional-journey/group.html +++ b/app/views/mission-1/z-september-transactional-journey/group.html @@ -2,7 +2,7 @@ {% set pageName = "" %} -{% from "z-september-transactional-journey/_includes/min-primary-navigation.html" import primaryNavigation %} +{% from "mission-1/z-september-transactional-journey/_includes/min-primary-navigation.html" import primaryNavigation %} {% block header %} {{ primaryNavigation() }} {% endblock %} diff --git a/app/views/z-september-transactional-journey/pre-appoint-confirm.html b/app/views/mission-1/z-september-transactional-journey/pre-appoint-confirm.html similarity index 94% rename from app/views/z-september-transactional-journey/pre-appoint-confirm.html rename to app/views/mission-1/z-september-transactional-journey/pre-appoint-confirm.html index 24d0513a..875f0faa 100644 --- a/app/views/z-september-transactional-journey/pre-appoint-confirm.html +++ b/app/views/mission-1/z-september-transactional-journey/pre-appoint-confirm.html @@ -2,7 +2,7 @@ {% set pageName = "Assign slots to participants" %} -{% from "z-september-transactional-journey/_includes/min-primary-navigation.html" import primaryNavigation %} +{% from "mission-1/z-september-transactional-journey/_includes/min-primary-navigation.html" import primaryNavigation %} {% block header %} {{ primaryNavigation() }} {% endblock %} diff --git a/app/views/z-september-transactional-journey/search-and-results.html b/app/views/mission-1/z-september-transactional-journey/search-and-results.html similarity index 95% rename from app/views/z-september-transactional-journey/search-and-results.html rename to app/views/mission-1/z-september-transactional-journey/search-and-results.html index 8b146730..5ddd1bb0 100644 --- a/app/views/z-september-transactional-journey/search-and-results.html +++ b/app/views/mission-1/z-september-transactional-journey/search-and-results.html @@ -2,7 +2,7 @@ {% set pageName = "" %} -{% from "z-september-transactional-journey/_includes/min-primary-navigation.html" import primaryNavigation %} +{% from "mission-1/z-september-transactional-journey/_includes/min-primary-navigation.html" import primaryNavigation %} {% block header %} {{ primaryNavigation() }} {% endblock %} @@ -11,7 +11,7 @@ {% block content %} - {% include "z-september-transactional-journey/_includes/participant-search.html"%} + {% include "mission-1/z-september-transactional-journey/_includes/participant-search.html"%}
diff --git a/app/views/z-september-transactional-journey/search.html b/app/views/mission-1/z-september-transactional-journey/search.html similarity index 57% rename from app/views/z-september-transactional-journey/search.html rename to app/views/mission-1/z-september-transactional-journey/search.html index 4a502c9b..25847b9a 100644 --- a/app/views/z-september-transactional-journey/search.html +++ b/app/views/mission-1/z-september-transactional-journey/search.html @@ -2,7 +2,7 @@ {% set pageName = "" %} -{% from "z-september-transactional-journey/_includes/min-primary-navigation.html" import primaryNavigation %} +{% from "mission-1/z-september-transactional-journey/_includes/min-primary-navigation.html" import primaryNavigation %} {% block header %} {{ primaryNavigation() }} {% endblock %} @@ -11,7 +11,7 @@ {% block content %}
- {% include "z-september-transactional-journey/_includes/participant-search.html"%} + {% include "mission-1/z-september-transactional-journey/_includes/participant-search.html"%}
{% endblock %} diff --git a/app/views/z-september-transactional-journey/spinner.html b/app/views/mission-1/z-september-transactional-journey/spinner.html similarity index 95% rename from app/views/z-september-transactional-journey/spinner.html rename to app/views/mission-1/z-september-transactional-journey/spinner.html index d2f42d86..41449338 100644 --- a/app/views/z-september-transactional-journey/spinner.html +++ b/app/views/mission-1/z-september-transactional-journey/spinner.html @@ -2,7 +2,7 @@ {% set pageName = "" %} -{% from "z-september-transactional-journey/_includes/min-primary-navigation.html" import primaryNavigation %} +{% from "mission-1/z-september-transactional-journey/_includes/min-primary-navigation.html" import primaryNavigation %} {% block header %} {{ primaryNavigation() }} {% endblock %} diff --git a/app/views/z-september-transactional-journey/upload-a-batch.html b/app/views/mission-1/z-september-transactional-journey/upload-a-batch.html similarity index 87% rename from app/views/z-september-transactional-journey/upload-a-batch.html rename to app/views/mission-1/z-september-transactional-journey/upload-a-batch.html index a0f79b36..b2d0f028 100644 --- a/app/views/z-september-transactional-journey/upload-a-batch.html +++ b/app/views/mission-1/z-september-transactional-journey/upload-a-batch.html @@ -2,7 +2,7 @@ {% set pageName = "Upload a batch" %} -{% from "z-september-transactional-journey/_includes/min-primary-navigation.html" import primaryNavigation %} +{% from "mission-1/z-september-transactional-journey/_includes/min-primary-navigation.html" import primaryNavigation %} {% block header %} {{ primaryNavigation() }} {% endblock %} diff --git a/app/views/search/batch-participant-search.html b/app/views/search/batch-participant-search.html index 2fccdf01..96e65fb4 100644 --- a/app/views/search/batch-participant-search.html +++ b/app/views/search/batch-participant-search.html @@ -2,7 +2,7 @@ {% set pageName = "" %} -{% from "z-september-transactional-journey/_includes/min-primary-navigation.html" import primaryNavigation %} +{% from "mission-1/z-september-transactional-journey/_includes/min-primary-navigation.html" import primaryNavigation %} {% block header %} {{ primaryNavigation() }} {% endblock %} diff --git a/app/views/search/participant-search-prev.html b/app/views/search/participant-search-prev.html index e69194b1..ce7b45f3 100644 --- a/app/views/search/participant-search-prev.html +++ b/app/views/search/participant-search-prev.html @@ -2,7 +2,7 @@ {% set pageName = "" %} -{% from "z-september-transactional-journey/_includes/min-primary-navigation.html" import primaryNavigation %} +{% from "mission-1/z-september-transactional-journey/_includes/min-primary-navigation.html" import primaryNavigation %} {% block header %} {{ primaryNavigation() }} {% endblock %} diff --git a/app/views/september-iteration-2/clickthru/01-upload.html b/app/views/september-iteration-2/clickthru/01-upload.html index 9f81fbba..bce1bcdd 100644 --- a/app/views/september-iteration-2/clickthru/01-upload.html +++ b/app/views/september-iteration-2/clickthru/01-upload.html @@ -2,7 +2,7 @@ {% set pageName = "" %} -{% from "z-september-transactional-journey/_includes/min-primary-navigation.html" import primaryNavigation %} +{% from "mission-1/z-september-transactional-journey/_includes/min-primary-navigation.html" import primaryNavigation %} {% block header %} {{ primaryNavigation() }} {% endblock %} diff --git a/app/views/september-iteration-2/clickthru/02-batch-detail.html b/app/views/september-iteration-2/clickthru/02-batch-detail.html index 374933e2..9cb269bf 100644 --- a/app/views/september-iteration-2/clickthru/02-batch-detail.html +++ b/app/views/september-iteration-2/clickthru/02-batch-detail.html @@ -2,7 +2,7 @@ {% set pageName = "" %} -{% from "z-september-transactional-journey/_includes/min-primary-navigation.html" import primaryNavigation %} +{% from "mission-1/z-september-transactional-journey/_includes/min-primary-navigation.html" import primaryNavigation %} {% block header %} {{ primaryNavigation() }} {% endblock %} diff --git a/app/views/september-iteration-2/clickthru/03-select-clinic.html b/app/views/september-iteration-2/clickthru/03-select-clinic.html index 257a5821..14cc36ef 100644 --- a/app/views/september-iteration-2/clickthru/03-select-clinic.html +++ b/app/views/september-iteration-2/clickthru/03-select-clinic.html @@ -2,7 +2,7 @@ {% set pageName = "" %} -{% from "z-september-transactional-journey/_includes/min-primary-navigation.html" import primaryNavigation %} +{% from "mission-1/z-september-transactional-journey/_includes/min-primary-navigation.html" import primaryNavigation %} {% block header %} {{ primaryNavigation() }} {% endblock %} diff --git a/app/views/september-iteration-2/clickthru/04-choose-participants.html b/app/views/september-iteration-2/clickthru/04-choose-participants.html index 6c89f9d8..bb487c69 100644 --- a/app/views/september-iteration-2/clickthru/04-choose-participants.html +++ b/app/views/september-iteration-2/clickthru/04-choose-participants.html @@ -2,7 +2,7 @@ {% set pageName = "" %} -{% from "z-september-transactional-journey/_includes/min-primary-navigation.html" import primaryNavigation %} +{% from "mission-1/z-september-transactional-journey/_includes/min-primary-navigation.html" import primaryNavigation %} {% block header %} {{ primaryNavigation() }} {% endblock %} diff --git a/app/views/september-iteration-2/clickthru/04a-example-search-result.html b/app/views/september-iteration-2/clickthru/04a-example-search-result.html index 90ee65dd..62be1c68 100644 --- a/app/views/september-iteration-2/clickthru/04a-example-search-result.html +++ b/app/views/september-iteration-2/clickthru/04a-example-search-result.html @@ -2,7 +2,7 @@ {% set pageName = "" %} -{% from "z-september-transactional-journey/_includes/min-primary-navigation.html" import primaryNavigation %} +{% from "mission-1/z-september-transactional-journey/_includes/min-primary-navigation.html" import primaryNavigation %} {% block header %} {{ primaryNavigation() }} {% endblock %} diff --git a/app/views/september-iteration-2/clickthru/05-review.html b/app/views/september-iteration-2/clickthru/05-review.html index f54b1e1c..c626e876 100644 --- a/app/views/september-iteration-2/clickthru/05-review.html +++ b/app/views/september-iteration-2/clickthru/05-review.html @@ -2,7 +2,7 @@ {% set pageName = "Assign slots to participants" %} -{% from "z-september-transactional-journey/_includes/min-primary-navigation.html" import primaryNavigation %} +{% from "mission-1/z-september-transactional-journey/_includes/min-primary-navigation.html" import primaryNavigation %} {% block header %} {{ primaryNavigation() }} {% endblock %} diff --git a/app/views/september-iteration-2/clickthru/05a-review-interrupt.html b/app/views/september-iteration-2/clickthru/05a-review-interrupt.html index ac909aac..e15a6939 100644 --- a/app/views/september-iteration-2/clickthru/05a-review-interrupt.html +++ b/app/views/september-iteration-2/clickthru/05a-review-interrupt.html @@ -2,7 +2,7 @@ {% set pageName = "Assign slots to participants" %} -{% from "z-september-transactional-journey/_includes/min-primary-navigation.html" import primaryNavigation %} +{% from "mission-1/z-september-transactional-journey/_includes/min-primary-navigation.html" import primaryNavigation %} {% block header %} {{ primaryNavigation() }} {% endblock %} diff --git a/app/views/september-iteration-2/clickthru/06-booked.html b/app/views/september-iteration-2/clickthru/06-booked.html index 69ba95e5..f7047f22 100644 --- a/app/views/september-iteration-2/clickthru/06-booked.html +++ b/app/views/september-iteration-2/clickthru/06-booked.html @@ -2,7 +2,7 @@ {% set pageName = "" %} -{% from "z-september-transactional-journey/_includes/min-primary-navigation.html" import primaryNavigation %} +{% from "mission-1/z-september-transactional-journey/_includes/min-primary-navigation.html" import primaryNavigation %} {% block header %} {{ primaryNavigation() }} {% endblock %} diff --git a/app/views/september-iteration-2/create-clinic.html b/app/views/september-iteration-2/create-clinic.html index e5e3af82..df03f37f 100644 --- a/app/views/september-iteration-2/create-clinic.html +++ b/app/views/september-iteration-2/create-clinic.html @@ -5,6 +5,20 @@ {% block content %} +{% if data.missionOne and data.missionOne.clinicName %} +
+
+ {% set html %} +

Clinic created

+ {% endset %} + {{ notificationBanner({ + html: html, + type: "success" + }) }} +
+
+{% endif %} +
@@ -18,11 +32,9 @@

Clinics

- -
- +
@@ -104,7 +119,7 @@

Clinics

48 slots available of 48 @@ -132,7 +147,7 @@

Clinics

48 slots available of 48 @@ -159,7 +174,7 @@

Clinics

40 slots available of 100 diff --git a/app/views/z-sketching/participant-search-alternatives.html b/app/views/z-sketching/participant-search-alternatives.html index 0b00d1f5..b8784e38 100644 --- a/app/views/z-sketching/participant-search-alternatives.html +++ b/app/views/z-sketching/participant-search-alternatives.html @@ -2,7 +2,7 @@ {% set pageName = "" %} -{% from "z-september-transactional-journey/_includes/min-primary-navigation.html" import primaryNavigation %} +{% from "mission-1/z-september-transactional-journey/_includes/min-primary-navigation.html" import primaryNavigation %} {% block header %} {{ primaryNavigation() }} {% endblock %} From 663ad9b5e48d23cc5854921a7d71f9597cf58b01 Mon Sep 17 00:00:00 2001 From: Mat Johnson Date: Tue, 6 Oct 2026 13:07:27 +0100 Subject: [PATCH 08/13] Move mission 1 test 2 items into folder --- app/routes/mission-1.js | 48 +++++++++---------- app/views/index.html | 4 +- .../clickthru/01-upload.html | 0 .../clickthru/02-batch-detail.html | 0 .../clickthru/03-select-clinic.html | 0 .../clickthru/04-choose-participants.html | 0 .../clickthru/04a-example-search-result.html | 0 .../clickthru/05-review.html | 0 .../clickthru/05a-review-interrupt.html | 0 .../clickthru/06-booked.html | 0 .../create-clinic-rev-1-name.html | 0 .../create-clinic-rev-1-publish-check.html | 0 .../create-clinic-rev-1-schedule.html | 0 .../create-clinic-rev-1-set-timings.html | 0 .../create-clinic-rev-1-slot-structure.html | 4 +- .../september-iteration-2/create-clinic.html | 0 .../includes/day-list-hard-coded.html | 0 .../includes/participant-staging-control.html | 0 .../macros/batch-detail.html | 0 .../macros/batch-upload.html | 0 .../macros/participant-listing.html | 0 .../macros/search-component.html | 0 22 files changed, 28 insertions(+), 28 deletions(-) rename app/views/{ => mission-1}/september-iteration-2/clickthru/01-upload.html (100%) rename app/views/{ => mission-1}/september-iteration-2/clickthru/02-batch-detail.html (100%) rename app/views/{ => mission-1}/september-iteration-2/clickthru/03-select-clinic.html (100%) rename app/views/{ => mission-1}/september-iteration-2/clickthru/04-choose-participants.html (100%) rename app/views/{ => mission-1}/september-iteration-2/clickthru/04a-example-search-result.html (100%) rename app/views/{ => mission-1}/september-iteration-2/clickthru/05-review.html (100%) rename app/views/{ => mission-1}/september-iteration-2/clickthru/05a-review-interrupt.html (100%) rename app/views/{ => mission-1}/september-iteration-2/clickthru/06-booked.html (100%) rename app/views/{ => mission-1}/september-iteration-2/create-clinic-rev-1-name.html (100%) rename app/views/{ => mission-1}/september-iteration-2/create-clinic-rev-1-publish-check.html (100%) rename app/views/{ => mission-1}/september-iteration-2/create-clinic-rev-1-schedule.html (100%) rename app/views/{ => mission-1}/september-iteration-2/create-clinic-rev-1-set-timings.html (100%) rename app/views/{ => mission-1}/september-iteration-2/create-clinic-rev-1-slot-structure.html (95%) rename app/views/{ => mission-1}/september-iteration-2/create-clinic.html (100%) rename app/views/{ => mission-1}/september-iteration-2/includes/day-list-hard-coded.html (100%) rename app/views/{ => mission-1}/september-iteration-2/includes/participant-staging-control.html (100%) rename app/views/{ => mission-1}/september-iteration-2/macros/batch-detail.html (100%) rename app/views/{ => mission-1}/september-iteration-2/macros/batch-upload.html (100%) rename app/views/{ => mission-1}/september-iteration-2/macros/participant-listing.html (100%) rename app/views/{ => mission-1}/september-iteration-2/macros/search-component.html (100%) diff --git a/app/routes/mission-1.js b/app/routes/mission-1.js index 8ab3387a..ad62bfd4 100644 --- a/app/routes/mission-1.js +++ b/app/routes/mission-1.js @@ -4,7 +4,7 @@ const router = express.Router() // Routes and functions specific to Mission 1 prototypes /* -/appviews/september-iteration-2/ +/app/views/mission-1/september-iteration-2/ */ @@ -34,7 +34,7 @@ const parseDateFields = (dateObj) => { } // simple search -router.get('/september-iteration-2/clickthru/04a-example-search-result', function (req, res) { +router.get('/mission-1/september-iteration-2/clickthru/04a-example-search-result', function (req, res) { const query = (req.query['search-params'] || '').trim() const allParticipants = (req.session.data.participants && req.session.data.participants.default) || [] const normalizedQuery = query.toLowerCase().replace(/\s+/g, ' ') @@ -56,7 +56,7 @@ router.get('/september-iteration-2/clickthru/04a-example-search-result', functio return null }).filter(Boolean) : allParticipants.map((participant, index) => Object.assign({}, participant, { participantIndex: index }))) - res.render('september-iteration-2/clickthru/04a-example-search-result', { + res.render('mission-1/september-iteration-2/clickthru/04a-example-search-result', { participants: searchResults, searchQuery: query }) @@ -72,7 +72,7 @@ router.get('/action/stage/:participantId', function (req, res) { req.session.data.stagedCount++ } - res.redirect(req.get('referer') || '/september-iteration-2/clickthru/04-choose-participants') + res.redirect(req.get('referer') || '/mission-1/september-iteration-2/clickthru/04-choose-participants') }); router.get('/action/unstage/:participantId', function (req, res) { const participants = (req.session.data.participants && req.session.data.participants.default) || [] @@ -83,11 +83,11 @@ router.get('/action/unstage/:participantId', function (req, res) { req.session.data.stagedCount-- } - res.redirect(req.get('referer') || '/september-iteration-2/clickthru/04-choose-participants') + res.redirect(req.get('referer') || '/mission-1/september-iteration-2/clickthru/04-choose-participants') }); // validating clinic name for 1 day clinic creation -router.post('/september-iteration-2/create-clinic-rev-1-name', function (req, res) { +router.post('/mission-1/september-iteration-2/create-clinic-rev-1-name', function (req, res) { const clinicName = (req.body.clinicName || '').trim() if (!req.session.data.missionOne || typeof req.session.data.missionOne !== 'object') { @@ -102,16 +102,16 @@ router.post('/september-iteration-2/create-clinic-rev-1-name', function (req, re } if (Object.keys(errors).length > 0) { - return res.render('september-iteration-2/create-clinic-rev-1-name', { + return res.render('mission-1/september-iteration-2/create-clinic-rev-1-name', { errors }) } - res.redirect('/september-iteration-2/create-clinic-rev-1-schedule') + res.redirect('/mission-1/september-iteration-2/create-clinic-rev-1-schedule') }) // validating the scheduled date for 1 day clinic creation -router.post('/september-iteration-2/create-clinic-rev-1-schedule', function (req, res) { +router.post('/mission-1/september-iteration-2/create-clinic-rev-1-schedule', function (req, res) { const clinicDate = req.body.clinicDate || {} if (typeof clinicDate.year === 'string' && /^\d{2}$/.test(clinicDate.year)) { @@ -138,16 +138,16 @@ router.post('/september-iteration-2/create-clinic-rev-1-schedule', function (req } if (Object.keys(errors).length > 0) { - return res.render('september-iteration-2/create-clinic-rev-1-schedule', { + return res.render('mission-1/september-iteration-2/create-clinic-rev-1-schedule', { errors }) } - res.redirect('/september-iteration-2/create-clinic-rev-1-set-timings') + res.redirect('/mission-1/september-iteration-2/create-clinic-rev-1-set-timings') }) // validating clinic session times for 1 day clinic creation -router.post('/september-iteration-2/create-clinic-rev-1-set-timings', function (req, res) { +router.post('/mission-1/september-iteration-2/create-clinic-rev-1-set-timings', function (req, res) { const newSession = req.body.newSession || {} const startTime = newSession.startTime || {} const endTime = newSession.endTime || {} @@ -200,12 +200,12 @@ router.post('/september-iteration-2/create-clinic-rev-1-set-timings', function ( req.session.data.missionOne.duration = durationStr if (Object.keys(errors).length > 0) { - return res.render('september-iteration-2/create-clinic-rev-1-set-timings', { + return res.render('mission-1/september-iteration-2/create-clinic-rev-1-set-timings', { errors }) } - res.redirect('/september-iteration-2/create-clinic-rev-1-slot-structure') + res.redirect('/mission-1/september-iteration-2/create-clinic-rev-1-slot-structure') }) // Formats a total minutes-from-midnight value as e.g. "10:08" @@ -256,14 +256,14 @@ const buildSessionSlots = (missionOne) => { } // computing the real slot structure from the submitted session times for 1 day clinic creation -router.get('/september-iteration-2/create-clinic-rev-1-slot-structure', function (req, res) { +router.get('/mission-1/september-iteration-2/create-clinic-rev-1-slot-structure', function (req, res) { const missionOne = req.session.data.missionOne || {} - res.render('september-iteration-2/create-clinic-rev-1-slot-structure', buildSessionSlots(missionOne)) + res.render('mission-1/september-iteration-2/create-clinic-rev-1-slot-structure', buildSessionSlots(missionOne)) }) // marking the selected slots as staff breaks for 1 day clinic creation -router.post('/september-iteration-2/create-clinic-rev-1-slot-structure/mark-staff-break', function (req, res) { +router.post('/mission-1/september-iteration-2/mark-staff-break', function (req, res) { const missionOne = req.session.data.missionOne || {} // nhsuk-frontend's checkboxes component submits an "_unchecked" sentinel for every untoggled box, so filter down to real indices const selectedSlots = [].concat(req.body.computedSlots || []).map(Number).filter(Number.isInteger) @@ -274,7 +274,7 @@ router.post('/september-iteration-2/create-clinic-rev-1-slot-structure/mark-staf } if (Object.keys(errors).length > 0) { - return res.render('september-iteration-2/create-clinic-rev-1-slot-structure', Object.assign({ errors }, buildSessionSlots(missionOne))) + return res.render('mission-1/september-iteration-2/create-clinic-rev-1-slot-structure', Object.assign({ errors }, buildSessionSlots(missionOne))) } const staffBreakSlots = new Set((missionOne.staffBreakSlots || []).map(Number).filter(Number.isInteger)) @@ -282,11 +282,11 @@ router.post('/september-iteration-2/create-clinic-rev-1-slot-structure/mark-staf missionOne.staffBreakSlots = Array.from(staffBreakSlots) req.session.data.missionOne = missionOne - res.redirect('/september-iteration-2/create-clinic-rev-1-slot-structure') + res.redirect('/mission-1/september-iteration-2/create-clinic-rev-1-slot-structure') }) // clearing staff break status from the selected slots for 1 day clinic creation -router.post('/september-iteration-2/create-clinic-rev-1-slot-structure/clear-slot-type', function (req, res) { +router.post('/mission-1/september-iteration-2/clear-slot-type', function (req, res) { const missionOne = req.session.data.missionOne || {} // nhsuk-frontend's checkboxes component submits an "_unchecked" sentinel for every untoggled box, so filter down to real indices const selectedSlots = [].concat(req.body.computedSlots || []).map(Number).filter(Number.isInteger) @@ -297,18 +297,18 @@ router.post('/september-iteration-2/create-clinic-rev-1-slot-structure/clear-slo } if (Object.keys(errors).length > 0) { - return res.render('september-iteration-2/create-clinic-rev-1-slot-structure', Object.assign({ errors }, buildSessionSlots(missionOne))) + return res.render('mission-1/september-iteration-2/create-clinic-rev-1-slot-structure', Object.assign({ errors }, buildSessionSlots(missionOne))) } const selectedSet = new Set(selectedSlots) missionOne.staffBreakSlots = (missionOne.staffBreakSlots || []).map(Number).filter(Number.isInteger).filter((index) => !selectedSet.has(index)) req.session.data.missionOne = missionOne - res.redirect('/september-iteration-2/create-clinic-rev-1-slot-structure') + res.redirect('/mission-1/september-iteration-2/create-clinic-rev-1-slot-structure') }) // creating and passing Total Slots through for 1 day clinic creation -router.post('/september-iteration-2/create-clinic-rev-1-publish-check', function (req, res) { +router.post('/mission-1/september-iteration-2/create-clinic-rev-1-publish-check', function (req, res) { const newSession = req.session.data.newSession || {} const startTime = newSession.startTime || {} const endTime = newSession.endTime || {} @@ -319,7 +319,7 @@ router.post('/september-iteration-2/create-clinic-rev-1-publish-check', function newSession.totalSlots = duration > 0 ? Math.floor((endMinutes - startMinutes) / duration) : 0 - res.render('september-iteration-2/create-clinic-rev-1-publish-check') + res.render('mission-1/september-iteration-2/create-clinic-rev-1-publish-check') }) module.exports = router \ No newline at end of file diff --git a/app/views/index.html b/app/views/index.html index a157b6d4..89616723 100755 --- a/app/views/index.html +++ b/app/views/index.html @@ -172,13 +172,13 @@

Create clinic module: live test #2

Enable test BSO to creat a clinic lasting one day

  1. - Create a new clinic from listing page + Create a new clinic from listing page

Live test #1

Users upload a csv containing the participants they wish to book into a prearranged single day clinic.

- Click-thru journey + Click-thru journey

diff --git a/app/views/september-iteration-2/clickthru/01-upload.html b/app/views/mission-1/september-iteration-2/clickthru/01-upload.html similarity index 100% rename from app/views/september-iteration-2/clickthru/01-upload.html rename to app/views/mission-1/september-iteration-2/clickthru/01-upload.html diff --git a/app/views/september-iteration-2/clickthru/02-batch-detail.html b/app/views/mission-1/september-iteration-2/clickthru/02-batch-detail.html similarity index 100% rename from app/views/september-iteration-2/clickthru/02-batch-detail.html rename to app/views/mission-1/september-iteration-2/clickthru/02-batch-detail.html diff --git a/app/views/september-iteration-2/clickthru/03-select-clinic.html b/app/views/mission-1/september-iteration-2/clickthru/03-select-clinic.html similarity index 100% rename from app/views/september-iteration-2/clickthru/03-select-clinic.html rename to app/views/mission-1/september-iteration-2/clickthru/03-select-clinic.html diff --git a/app/views/september-iteration-2/clickthru/04-choose-participants.html b/app/views/mission-1/september-iteration-2/clickthru/04-choose-participants.html similarity index 100% rename from app/views/september-iteration-2/clickthru/04-choose-participants.html rename to app/views/mission-1/september-iteration-2/clickthru/04-choose-participants.html diff --git a/app/views/september-iteration-2/clickthru/04a-example-search-result.html b/app/views/mission-1/september-iteration-2/clickthru/04a-example-search-result.html similarity index 100% rename from app/views/september-iteration-2/clickthru/04a-example-search-result.html rename to app/views/mission-1/september-iteration-2/clickthru/04a-example-search-result.html diff --git a/app/views/september-iteration-2/clickthru/05-review.html b/app/views/mission-1/september-iteration-2/clickthru/05-review.html similarity index 100% rename from app/views/september-iteration-2/clickthru/05-review.html rename to app/views/mission-1/september-iteration-2/clickthru/05-review.html diff --git a/app/views/september-iteration-2/clickthru/05a-review-interrupt.html b/app/views/mission-1/september-iteration-2/clickthru/05a-review-interrupt.html similarity index 100% rename from app/views/september-iteration-2/clickthru/05a-review-interrupt.html rename to app/views/mission-1/september-iteration-2/clickthru/05a-review-interrupt.html diff --git a/app/views/september-iteration-2/clickthru/06-booked.html b/app/views/mission-1/september-iteration-2/clickthru/06-booked.html similarity index 100% rename from app/views/september-iteration-2/clickthru/06-booked.html rename to app/views/mission-1/september-iteration-2/clickthru/06-booked.html diff --git a/app/views/september-iteration-2/create-clinic-rev-1-name.html b/app/views/mission-1/september-iteration-2/create-clinic-rev-1-name.html similarity index 100% rename from app/views/september-iteration-2/create-clinic-rev-1-name.html rename to app/views/mission-1/september-iteration-2/create-clinic-rev-1-name.html diff --git a/app/views/september-iteration-2/create-clinic-rev-1-publish-check.html b/app/views/mission-1/september-iteration-2/create-clinic-rev-1-publish-check.html similarity index 100% rename from app/views/september-iteration-2/create-clinic-rev-1-publish-check.html rename to app/views/mission-1/september-iteration-2/create-clinic-rev-1-publish-check.html diff --git a/app/views/september-iteration-2/create-clinic-rev-1-schedule.html b/app/views/mission-1/september-iteration-2/create-clinic-rev-1-schedule.html similarity index 100% rename from app/views/september-iteration-2/create-clinic-rev-1-schedule.html rename to app/views/mission-1/september-iteration-2/create-clinic-rev-1-schedule.html diff --git a/app/views/september-iteration-2/create-clinic-rev-1-set-timings.html b/app/views/mission-1/september-iteration-2/create-clinic-rev-1-set-timings.html similarity index 100% rename from app/views/september-iteration-2/create-clinic-rev-1-set-timings.html rename to app/views/mission-1/september-iteration-2/create-clinic-rev-1-set-timings.html diff --git a/app/views/september-iteration-2/create-clinic-rev-1-slot-structure.html b/app/views/mission-1/september-iteration-2/create-clinic-rev-1-slot-structure.html similarity index 95% rename from app/views/september-iteration-2/create-clinic-rev-1-slot-structure.html rename to app/views/mission-1/september-iteration-2/create-clinic-rev-1-slot-structure.html index 7752e2d6..e8074322 100644 --- a/app/views/september-iteration-2/create-clinic-rev-1-slot-structure.html +++ b/app/views/mission-1/september-iteration-2/create-clinic-rev-1-slot-structure.html @@ -107,9 +107,9 @@

Set selected slots as:

- +
- +

diff --git a/app/views/september-iteration-2/create-clinic.html b/app/views/mission-1/september-iteration-2/create-clinic.html similarity index 100% rename from app/views/september-iteration-2/create-clinic.html rename to app/views/mission-1/september-iteration-2/create-clinic.html diff --git a/app/views/september-iteration-2/includes/day-list-hard-coded.html b/app/views/mission-1/september-iteration-2/includes/day-list-hard-coded.html similarity index 100% rename from app/views/september-iteration-2/includes/day-list-hard-coded.html rename to app/views/mission-1/september-iteration-2/includes/day-list-hard-coded.html diff --git a/app/views/september-iteration-2/includes/participant-staging-control.html b/app/views/mission-1/september-iteration-2/includes/participant-staging-control.html similarity index 100% rename from app/views/september-iteration-2/includes/participant-staging-control.html rename to app/views/mission-1/september-iteration-2/includes/participant-staging-control.html diff --git a/app/views/september-iteration-2/macros/batch-detail.html b/app/views/mission-1/september-iteration-2/macros/batch-detail.html similarity index 100% rename from app/views/september-iteration-2/macros/batch-detail.html rename to app/views/mission-1/september-iteration-2/macros/batch-detail.html diff --git a/app/views/september-iteration-2/macros/batch-upload.html b/app/views/mission-1/september-iteration-2/macros/batch-upload.html similarity index 100% rename from app/views/september-iteration-2/macros/batch-upload.html rename to app/views/mission-1/september-iteration-2/macros/batch-upload.html diff --git a/app/views/september-iteration-2/macros/participant-listing.html b/app/views/mission-1/september-iteration-2/macros/participant-listing.html similarity index 100% rename from app/views/september-iteration-2/macros/participant-listing.html rename to app/views/mission-1/september-iteration-2/macros/participant-listing.html diff --git a/app/views/september-iteration-2/macros/search-component.html b/app/views/mission-1/september-iteration-2/macros/search-component.html similarity index 100% rename from app/views/september-iteration-2/macros/search-component.html rename to app/views/mission-1/september-iteration-2/macros/search-component.html From 9643634b2bf45a193a1f3163bf8779c55c6c8399 Mon Sep 17 00:00:00 2001 From: Mat Johnson Date: Tue, 6 Oct 2026 14:36:29 +0100 Subject: [PATCH 09/13] Lots of rewiring --- app/views/_macros/clinic-listing.html | 4 ++-- .../september-iteration-2/clickthru/01-upload.html | 2 +- .../september-iteration-2/clickthru/02-batch-detail.html | 2 +- .../clickthru/04-choose-participants.html | 6 +++--- .../clickthru/04a-example-search-result.html | 6 +++--- .../september-iteration-2/clickthru/06-booked.html | 2 +- .../september-iteration-2/macros/participant-listing.html | 2 +- 7 files changed, 12 insertions(+), 12 deletions(-) diff --git a/app/views/_macros/clinic-listing.html b/app/views/_macros/clinic-listing.html index a867528f..181a5498 100644 --- a/app/views/_macros/clinic-listing.html +++ b/app/views/_macros/clinic-listing.html @@ -1,5 +1,5 @@ {% macro clinic_listing(options) %} -

@@ -51,12 +63,15 @@

Clinics

{{ data.missionOne.clinicName }} + New - no data + Hard coded
+ as per mission #1
- no data + Hard coded
+ as per mission #1
{% if data.missionOne.clinicDate %} @@ -75,7 +90,7 @@

Clinics

{% endif %}
- + Select this clinic - + Select this clinic - + Select this clinic - + Select this clinic
+
diff --git a/app/views/mission-1/september-iteration-2/clickthru/01-upload.html b/app/views/mission-1/september-iteration-2/clickthru/01-upload.html index bce1bcdd..d91085d1 100644 --- a/app/views/mission-1/september-iteration-2/clickthru/01-upload.html +++ b/app/views/mission-1/september-iteration-2/clickthru/01-upload.html @@ -10,7 +10,7 @@ {% block beforeContent %}{% endblock %} {% block content %} - {% from "september-iteration-2/macros/batch-upload.html" import upload %} + {% from "mission-1/september-iteration-2/macros/batch-upload.html" import upload %} {{ upload({ button_url:"02-batch-detail" }) }} diff --git a/app/views/mission-1/september-iteration-2/clickthru/02-batch-detail.html b/app/views/mission-1/september-iteration-2/clickthru/02-batch-detail.html index 9cb269bf..8d7926ef 100644 --- a/app/views/mission-1/september-iteration-2/clickthru/02-batch-detail.html +++ b/app/views/mission-1/september-iteration-2/clickthru/02-batch-detail.html @@ -23,7 +23,7 @@ - {% from "september-iteration-2/macros/batch-detail.html" import batch_detail %} + {% from "mission-1/september-iteration-2/macros/batch-detail.html" import batch_detail %} {{ batch_detail({ participant_count: data.participants.default.length, button_url:"03-select-clinic" diff --git a/app/views/mission-1/september-iteration-2/clickthru/04-choose-participants.html b/app/views/mission-1/september-iteration-2/clickthru/04-choose-participants.html index bb487c69..eab2e0f4 100644 --- a/app/views/mission-1/september-iteration-2/clickthru/04-choose-participants.html +++ b/app/views/mission-1/september-iteration-2/clickthru/04-choose-participants.html @@ -17,7 +17,7 @@

-{% from "september-iteration-2/macros/search-component.html" import participant_search %} +{% from "mission-1/september-iteration-2/macros/search-component.html" import participant_search %} {{ participant_search({ form_action: "04a-example-search-result", search_query: searchQuery @@ -25,7 +25,7 @@

- {% from "september-iteration-2/macros/participant-listing.html" import participant_listing %} + {% from "mission-1/september-iteration-2/macros/participant-listing.html" import participant_listing %} {{ participant_listing({ mode: "browse", participants: data.participants.default @@ -53,7 +53,7 @@

-{% include "september-iteration-2/includes/participant-staging-control.html" %} +{% include "mission-1/september-iteration-2/includes/participant-staging-control.html" %} {% endblock %} {% block pageScripts %} diff --git a/app/views/mission-1/september-iteration-2/clickthru/04a-example-search-result.html b/app/views/mission-1/september-iteration-2/clickthru/04a-example-search-result.html index 62be1c68..74e7b605 100644 --- a/app/views/mission-1/september-iteration-2/clickthru/04a-example-search-result.html +++ b/app/views/mission-1/september-iteration-2/clickthru/04a-example-search-result.html @@ -17,7 +17,7 @@

-{% from "september-iteration-2/macros/search-component.html" import participant_search %} +{% from "mission-1/september-iteration-2/macros/search-component.html" import participant_search %} {{ participant_search({ form_action: "04a-example-search-result", search_query: searchQuery @@ -25,7 +25,7 @@

- {% from "september-iteration-2/macros/participant-listing.html" import participant_listing %} + {% from "mission-1/september-iteration-2/macros/participant-listing.html" import participant_listing %} {{ participant_listing({ mode: "search", participants: participants @@ -36,7 +36,7 @@

-{% include "september-iteration-2/includes/participant-staging-control.html" %} +{% include "mission-1/september-iteration-2/includes/participant-staging-control.html" %} {% endblock %} diff --git a/app/views/mission-1/september-iteration-2/clickthru/06-booked.html b/app/views/mission-1/september-iteration-2/clickthru/06-booked.html index f7047f22..61f1a533 100644 --- a/app/views/mission-1/september-iteration-2/clickthru/06-booked.html +++ b/app/views/mission-1/september-iteration-2/clickthru/06-booked.html @@ -49,7 +49,7 @@

- {% include "september-iteration-2/includes/day-list-hard-coded.html" %} + {% include "mission-1/september-iteration-2/includes/day-list-hard-coded.html" %} {% endblock %} diff --git a/app/views/mission-1/september-iteration-2/macros/participant-listing.html b/app/views/mission-1/september-iteration-2/macros/participant-listing.html index 822265a6..36c8addd 100644 --- a/app/views/mission-1/september-iteration-2/macros/participant-listing.html +++ b/app/views/mission-1/september-iteration-2/macros/participant-listing.html @@ -1,5 +1,5 @@ {% macro participant_listing(options) %} -

@@ -49,7 +49,7 @@ {% if options.controls != false %} - + Select this clinic
+
{% endif %} - - - - - - - - - - @@ -174,7 +146,7 @@

Clinics

40 slots available of 100 From e03fb259c626dd94fdf122aa405b2fb94164bcc6 Mon Sep 17 00:00:00 2001 From: Mat Johnson Date: Tue, 6 Oct 2026 15:42:41 +0100 Subject: [PATCH 12/13] Update example --- .../mission-1/current-iteration/clickthru/05-review.html | 6 +++++- .../current-iteration/clickthru/05a-review-interrupt.html | 6 +++--- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/app/views/mission-1/current-iteration/clickthru/05-review.html b/app/views/mission-1/current-iteration/clickthru/05-review.html index c626e876..eacd6b0d 100644 --- a/app/views/mission-1/current-iteration/clickthru/05-review.html +++ b/app/views/mission-1/current-iteration/clickthru/05-review.html @@ -94,7 +94,11 @@

into {{ data.clinicName }}

-

Participants will be booked in random order.

+
+ Information: +

Booking {{ data.stagedCount }} people into this clinic will leave {{ data.clinicCapacityAvailable - data.stagedCount }} slots available

+

Participants will be booked in random order

+
diff --git a/app/views/mission-1/current-iteration/clickthru/05a-review-interrupt.html b/app/views/mission-1/current-iteration/clickthru/05a-review-interrupt.html index e15a6939..d7ebb1d1 100644 --- a/app/views/mission-1/current-iteration/clickthru/05a-review-interrupt.html +++ b/app/views/mission-1/current-iteration/clickthru/05a-review-interrupt.html @@ -19,13 +19,13 @@

- 2 slots remaining + 2 slots still available

{% set totalCount = options.totalCount or options.participants.length %} {% if options.mode == "search" %} From 739b5439c1cc4aa9c269f613811dc920054e1edd Mon Sep 17 00:00:00 2001 From: Mat Johnson Date: Tue, 6 Oct 2026 14:40:52 +0100 Subject: [PATCH 10/13] Folder rename and rewireing --- app/routes/mission-1.js | 48 +++++++++---------- app/views/index.html | 4 +- .../clickthru/01-upload.html | 2 +- .../clickthru/02-batch-detail.html | 2 +- .../clickthru/03-select-clinic.html | 0 .../clickthru/04-choose-participants.html | 6 +-- .../clickthru/04a-example-search-result.html | 6 +-- .../clickthru/05-review.html | 0 .../clickthru/05a-review-interrupt.html | 0 .../clickthru/06-booked.html | 2 +- .../create-clinic-rev-1-name.html | 0 .../create-clinic-rev-1-publish-check.html | 0 .../create-clinic-rev-1-schedule.html | 0 .../create-clinic-rev-1-set-timings.html | 0 .../create-clinic-rev-1-slot-structure.html | 0 .../create-clinic.html | 0 .../includes/day-list-hard-coded.html | 0 .../includes/participant-staging-control.html | 0 .../macros/batch-detail.html | 0 .../macros/batch-upload.html | 0 .../macros/participant-listing.html | 0 .../macros/search-component.html | 0 22 files changed, 35 insertions(+), 35 deletions(-) rename app/views/mission-1/{september-iteration-2 => current-iteration}/clickthru/01-upload.html (82%) rename app/views/mission-1/{september-iteration-2 => current-iteration}/clickthru/02-batch-detail.html (89%) rename app/views/mission-1/{september-iteration-2 => current-iteration}/clickthru/03-select-clinic.html (100%) rename app/views/mission-1/{september-iteration-2 => current-iteration}/clickthru/04-choose-participants.html (94%) rename app/views/mission-1/{september-iteration-2 => current-iteration}/clickthru/04a-example-search-result.html (75%) rename app/views/mission-1/{september-iteration-2 => current-iteration}/clickthru/05-review.html (100%) rename app/views/mission-1/{september-iteration-2 => current-iteration}/clickthru/05a-review-interrupt.html (100%) rename app/views/mission-1/{september-iteration-2 => current-iteration}/clickthru/06-booked.html (94%) rename app/views/mission-1/{september-iteration-2 => current-iteration}/create-clinic-rev-1-name.html (100%) rename app/views/mission-1/{september-iteration-2 => current-iteration}/create-clinic-rev-1-publish-check.html (100%) rename app/views/mission-1/{september-iteration-2 => current-iteration}/create-clinic-rev-1-schedule.html (100%) rename app/views/mission-1/{september-iteration-2 => current-iteration}/create-clinic-rev-1-set-timings.html (100%) rename app/views/mission-1/{september-iteration-2 => current-iteration}/create-clinic-rev-1-slot-structure.html (100%) rename app/views/mission-1/{september-iteration-2 => current-iteration}/create-clinic.html (100%) rename app/views/mission-1/{september-iteration-2 => current-iteration}/includes/day-list-hard-coded.html (100%) rename app/views/mission-1/{september-iteration-2 => current-iteration}/includes/participant-staging-control.html (100%) rename app/views/mission-1/{september-iteration-2 => current-iteration}/macros/batch-detail.html (100%) rename app/views/mission-1/{september-iteration-2 => current-iteration}/macros/batch-upload.html (100%) rename app/views/mission-1/{september-iteration-2 => current-iteration}/macros/participant-listing.html (100%) rename app/views/mission-1/{september-iteration-2 => current-iteration}/macros/search-component.html (100%) diff --git a/app/routes/mission-1.js b/app/routes/mission-1.js index ad62bfd4..937287a0 100644 --- a/app/routes/mission-1.js +++ b/app/routes/mission-1.js @@ -4,7 +4,7 @@ const router = express.Router() // Routes and functions specific to Mission 1 prototypes /* -/app/views/mission-1/september-iteration-2/ +/app/views/mission-1/current-iteration/ */ @@ -34,7 +34,7 @@ const parseDateFields = (dateObj) => { } // simple search -router.get('/mission-1/september-iteration-2/clickthru/04a-example-search-result', function (req, res) { +router.get('/mission-1/current-iteration/clickthru/04a-example-search-result', function (req, res) { const query = (req.query['search-params'] || '').trim() const allParticipants = (req.session.data.participants && req.session.data.participants.default) || [] const normalizedQuery = query.toLowerCase().replace(/\s+/g, ' ') @@ -56,7 +56,7 @@ router.get('/mission-1/september-iteration-2/clickthru/04a-example-search-result return null }).filter(Boolean) : allParticipants.map((participant, index) => Object.assign({}, participant, { participantIndex: index }))) - res.render('mission-1/september-iteration-2/clickthru/04a-example-search-result', { + res.render('mission-1/current-iteration/clickthru/04a-example-search-result', { participants: searchResults, searchQuery: query }) @@ -72,7 +72,7 @@ router.get('/action/stage/:participantId', function (req, res) { req.session.data.stagedCount++ } - res.redirect(req.get('referer') || '/mission-1/september-iteration-2/clickthru/04-choose-participants') + res.redirect(req.get('referer') || '/mission-1/current-iteration/clickthru/04-choose-participants') }); router.get('/action/unstage/:participantId', function (req, res) { const participants = (req.session.data.participants && req.session.data.participants.default) || [] @@ -83,11 +83,11 @@ router.get('/action/unstage/:participantId', function (req, res) { req.session.data.stagedCount-- } - res.redirect(req.get('referer') || '/mission-1/september-iteration-2/clickthru/04-choose-participants') + res.redirect(req.get('referer') || '/mission-1/current-iteration/clickthru/04-choose-participants') }); // validating clinic name for 1 day clinic creation -router.post('/mission-1/september-iteration-2/create-clinic-rev-1-name', function (req, res) { +router.post('/mission-1/current-iteration/create-clinic-rev-1-name', function (req, res) { const clinicName = (req.body.clinicName || '').trim() if (!req.session.data.missionOne || typeof req.session.data.missionOne !== 'object') { @@ -102,16 +102,16 @@ router.post('/mission-1/september-iteration-2/create-clinic-rev-1-name', functio } if (Object.keys(errors).length > 0) { - return res.render('mission-1/september-iteration-2/create-clinic-rev-1-name', { + return res.render('mission-1/current-iteration/create-clinic-rev-1-name', { errors }) } - res.redirect('/mission-1/september-iteration-2/create-clinic-rev-1-schedule') + res.redirect('/mission-1/current-iteration/create-clinic-rev-1-schedule') }) // validating the scheduled date for 1 day clinic creation -router.post('/mission-1/september-iteration-2/create-clinic-rev-1-schedule', function (req, res) { +router.post('/mission-1/current-iteration/create-clinic-rev-1-schedule', function (req, res) { const clinicDate = req.body.clinicDate || {} if (typeof clinicDate.year === 'string' && /^\d{2}$/.test(clinicDate.year)) { @@ -138,16 +138,16 @@ router.post('/mission-1/september-iteration-2/create-clinic-rev-1-schedule', fun } if (Object.keys(errors).length > 0) { - return res.render('mission-1/september-iteration-2/create-clinic-rev-1-schedule', { + return res.render('mission-1/current-iteration/create-clinic-rev-1-schedule', { errors }) } - res.redirect('/mission-1/september-iteration-2/create-clinic-rev-1-set-timings') + res.redirect('/mission-1/current-iteration/create-clinic-rev-1-set-timings') }) // validating clinic session times for 1 day clinic creation -router.post('/mission-1/september-iteration-2/create-clinic-rev-1-set-timings', function (req, res) { +router.post('/mission-1/current-iteration/create-clinic-rev-1-set-timings', function (req, res) { const newSession = req.body.newSession || {} const startTime = newSession.startTime || {} const endTime = newSession.endTime || {} @@ -200,12 +200,12 @@ router.post('/mission-1/september-iteration-2/create-clinic-rev-1-set-timings', req.session.data.missionOne.duration = durationStr if (Object.keys(errors).length > 0) { - return res.render('mission-1/september-iteration-2/create-clinic-rev-1-set-timings', { + return res.render('mission-1/current-iteration/create-clinic-rev-1-set-timings', { errors }) } - res.redirect('/mission-1/september-iteration-2/create-clinic-rev-1-slot-structure') + res.redirect('/mission-1/current-iteration/create-clinic-rev-1-slot-structure') }) // Formats a total minutes-from-midnight value as e.g. "10:08" @@ -256,14 +256,14 @@ const buildSessionSlots = (missionOne) => { } // computing the real slot structure from the submitted session times for 1 day clinic creation -router.get('/mission-1/september-iteration-2/create-clinic-rev-1-slot-structure', function (req, res) { +router.get('/mission-1/current-iteration/create-clinic-rev-1-slot-structure', function (req, res) { const missionOne = req.session.data.missionOne || {} - res.render('mission-1/september-iteration-2/create-clinic-rev-1-slot-structure', buildSessionSlots(missionOne)) + res.render('mission-1/current-iteration/create-clinic-rev-1-slot-structure', buildSessionSlots(missionOne)) }) // marking the selected slots as staff breaks for 1 day clinic creation -router.post('/mission-1/september-iteration-2/mark-staff-break', function (req, res) { +router.post('/mission-1/current-iteration/mark-staff-break', function (req, res) { const missionOne = req.session.data.missionOne || {} // nhsuk-frontend's checkboxes component submits an "_unchecked" sentinel for every untoggled box, so filter down to real indices const selectedSlots = [].concat(req.body.computedSlots || []).map(Number).filter(Number.isInteger) @@ -274,7 +274,7 @@ router.post('/mission-1/september-iteration-2/mark-staff-break', function (req, } if (Object.keys(errors).length > 0) { - return res.render('mission-1/september-iteration-2/create-clinic-rev-1-slot-structure', Object.assign({ errors }, buildSessionSlots(missionOne))) + return res.render('mission-1/current-iteration/create-clinic-rev-1-slot-structure', Object.assign({ errors }, buildSessionSlots(missionOne))) } const staffBreakSlots = new Set((missionOne.staffBreakSlots || []).map(Number).filter(Number.isInteger)) @@ -282,11 +282,11 @@ router.post('/mission-1/september-iteration-2/mark-staff-break', function (req, missionOne.staffBreakSlots = Array.from(staffBreakSlots) req.session.data.missionOne = missionOne - res.redirect('/mission-1/september-iteration-2/create-clinic-rev-1-slot-structure') + res.redirect('/mission-1/current-iteration/create-clinic-rev-1-slot-structure') }) // clearing staff break status from the selected slots for 1 day clinic creation -router.post('/mission-1/september-iteration-2/clear-slot-type', function (req, res) { +router.post('/mission-1/current-iteration/clear-slot-type', function (req, res) { const missionOne = req.session.data.missionOne || {} // nhsuk-frontend's checkboxes component submits an "_unchecked" sentinel for every untoggled box, so filter down to real indices const selectedSlots = [].concat(req.body.computedSlots || []).map(Number).filter(Number.isInteger) @@ -297,18 +297,18 @@ router.post('/mission-1/september-iteration-2/clear-slot-type', function (req, r } if (Object.keys(errors).length > 0) { - return res.render('mission-1/september-iteration-2/create-clinic-rev-1-slot-structure', Object.assign({ errors }, buildSessionSlots(missionOne))) + return res.render('mission-1/current-iteration/create-clinic-rev-1-slot-structure', Object.assign({ errors }, buildSessionSlots(missionOne))) } const selectedSet = new Set(selectedSlots) missionOne.staffBreakSlots = (missionOne.staffBreakSlots || []).map(Number).filter(Number.isInteger).filter((index) => !selectedSet.has(index)) req.session.data.missionOne = missionOne - res.redirect('/mission-1/september-iteration-2/create-clinic-rev-1-slot-structure') + res.redirect('/mission-1/current-iteration/create-clinic-rev-1-slot-structure') }) // creating and passing Total Slots through for 1 day clinic creation -router.post('/mission-1/september-iteration-2/create-clinic-rev-1-publish-check', function (req, res) { +router.post('/mission-1/current-iteration/create-clinic-rev-1-publish-check', function (req, res) { const newSession = req.session.data.newSession || {} const startTime = newSession.startTime || {} const endTime = newSession.endTime || {} @@ -319,7 +319,7 @@ router.post('/mission-1/september-iteration-2/create-clinic-rev-1-publish-check' newSession.totalSlots = duration > 0 ? Math.floor((endMinutes - startMinutes) / duration) : 0 - res.render('mission-1/september-iteration-2/create-clinic-rev-1-publish-check') + res.render('mission-1/current-iteration/create-clinic-rev-1-publish-check') }) module.exports = router \ No newline at end of file diff --git a/app/views/index.html b/app/views/index.html index 89616723..7749a9dd 100755 --- a/app/views/index.html +++ b/app/views/index.html @@ -172,13 +172,13 @@

Create clinic module: live test #2

Enable test BSO to creat a clinic lasting one day

  1. - Create a new clinic from listing page + Create a new clinic from listing page

Live test #1

Users upload a csv containing the participants they wish to book into a prearranged single day clinic.

- Click-thru journey + Click-thru journey

diff --git a/app/views/mission-1/september-iteration-2/clickthru/01-upload.html b/app/views/mission-1/current-iteration/clickthru/01-upload.html similarity index 82% rename from app/views/mission-1/september-iteration-2/clickthru/01-upload.html rename to app/views/mission-1/current-iteration/clickthru/01-upload.html index d91085d1..10a0345b 100644 --- a/app/views/mission-1/september-iteration-2/clickthru/01-upload.html +++ b/app/views/mission-1/current-iteration/clickthru/01-upload.html @@ -10,7 +10,7 @@ {% block beforeContent %}{% endblock %} {% block content %} - {% from "mission-1/september-iteration-2/macros/batch-upload.html" import upload %} + {% from "mission-1/current-iteration/macros/batch-upload.html" import upload %} {{ upload({ button_url:"02-batch-detail" }) }} diff --git a/app/views/mission-1/september-iteration-2/clickthru/02-batch-detail.html b/app/views/mission-1/current-iteration/clickthru/02-batch-detail.html similarity index 89% rename from app/views/mission-1/september-iteration-2/clickthru/02-batch-detail.html rename to app/views/mission-1/current-iteration/clickthru/02-batch-detail.html index 8d7926ef..e5e2ae7b 100644 --- a/app/views/mission-1/september-iteration-2/clickthru/02-batch-detail.html +++ b/app/views/mission-1/current-iteration/clickthru/02-batch-detail.html @@ -23,7 +23,7 @@ - {% from "mission-1/september-iteration-2/macros/batch-detail.html" import batch_detail %} + {% from "mission-1/current-iteration/macros/batch-detail.html" import batch_detail %} {{ batch_detail({ participant_count: data.participants.default.length, button_url:"03-select-clinic" diff --git a/app/views/mission-1/september-iteration-2/clickthru/03-select-clinic.html b/app/views/mission-1/current-iteration/clickthru/03-select-clinic.html similarity index 100% rename from app/views/mission-1/september-iteration-2/clickthru/03-select-clinic.html rename to app/views/mission-1/current-iteration/clickthru/03-select-clinic.html diff --git a/app/views/mission-1/september-iteration-2/clickthru/04-choose-participants.html b/app/views/mission-1/current-iteration/clickthru/04-choose-participants.html similarity index 94% rename from app/views/mission-1/september-iteration-2/clickthru/04-choose-participants.html rename to app/views/mission-1/current-iteration/clickthru/04-choose-participants.html index eab2e0f4..7dfb4d1e 100644 --- a/app/views/mission-1/september-iteration-2/clickthru/04-choose-participants.html +++ b/app/views/mission-1/current-iteration/clickthru/04-choose-participants.html @@ -17,7 +17,7 @@

-{% from "mission-1/september-iteration-2/macros/search-component.html" import participant_search %} +{% from "mission-1/current-iteration/macros/search-component.html" import participant_search %} {{ participant_search({ form_action: "04a-example-search-result", search_query: searchQuery @@ -25,7 +25,7 @@

- {% from "mission-1/september-iteration-2/macros/participant-listing.html" import participant_listing %} + {% from "mission-1/current-iteration/macros/participant-listing.html" import participant_listing %} {{ participant_listing({ mode: "browse", participants: data.participants.default @@ -53,7 +53,7 @@

-{% include "mission-1/september-iteration-2/includes/participant-staging-control.html" %} +{% include "mission-1/current-iteration/includes/participant-staging-control.html" %} {% endblock %} {% block pageScripts %} diff --git a/app/views/mission-1/september-iteration-2/clickthru/04a-example-search-result.html b/app/views/mission-1/current-iteration/clickthru/04a-example-search-result.html similarity index 75% rename from app/views/mission-1/september-iteration-2/clickthru/04a-example-search-result.html rename to app/views/mission-1/current-iteration/clickthru/04a-example-search-result.html index 74e7b605..2feb9e45 100644 --- a/app/views/mission-1/september-iteration-2/clickthru/04a-example-search-result.html +++ b/app/views/mission-1/current-iteration/clickthru/04a-example-search-result.html @@ -17,7 +17,7 @@

-{% from "mission-1/september-iteration-2/macros/search-component.html" import participant_search %} +{% from "mission-1/current-iteration/macros/search-component.html" import participant_search %} {{ participant_search({ form_action: "04a-example-search-result", search_query: searchQuery @@ -25,7 +25,7 @@

- {% from "mission-1/september-iteration-2/macros/participant-listing.html" import participant_listing %} + {% from "mission-1/current-iteration/macros/participant-listing.html" import participant_listing %} {{ participant_listing({ mode: "search", participants: participants @@ -36,7 +36,7 @@

-{% include "mission-1/september-iteration-2/includes/participant-staging-control.html" %} +{% include "mission-1/current-iteration/includes/participant-staging-control.html" %} {% endblock %} diff --git a/app/views/mission-1/september-iteration-2/clickthru/05-review.html b/app/views/mission-1/current-iteration/clickthru/05-review.html similarity index 100% rename from app/views/mission-1/september-iteration-2/clickthru/05-review.html rename to app/views/mission-1/current-iteration/clickthru/05-review.html diff --git a/app/views/mission-1/september-iteration-2/clickthru/05a-review-interrupt.html b/app/views/mission-1/current-iteration/clickthru/05a-review-interrupt.html similarity index 100% rename from app/views/mission-1/september-iteration-2/clickthru/05a-review-interrupt.html rename to app/views/mission-1/current-iteration/clickthru/05a-review-interrupt.html diff --git a/app/views/mission-1/september-iteration-2/clickthru/06-booked.html b/app/views/mission-1/current-iteration/clickthru/06-booked.html similarity index 94% rename from app/views/mission-1/september-iteration-2/clickthru/06-booked.html rename to app/views/mission-1/current-iteration/clickthru/06-booked.html index 61f1a533..f4d34351 100644 --- a/app/views/mission-1/september-iteration-2/clickthru/06-booked.html +++ b/app/views/mission-1/current-iteration/clickthru/06-booked.html @@ -49,7 +49,7 @@

- {% include "mission-1/september-iteration-2/includes/day-list-hard-coded.html" %} + {% include "mission-1/current-iteration/includes/day-list-hard-coded.html" %} {% endblock %} diff --git a/app/views/mission-1/september-iteration-2/create-clinic-rev-1-name.html b/app/views/mission-1/current-iteration/create-clinic-rev-1-name.html similarity index 100% rename from app/views/mission-1/september-iteration-2/create-clinic-rev-1-name.html rename to app/views/mission-1/current-iteration/create-clinic-rev-1-name.html diff --git a/app/views/mission-1/september-iteration-2/create-clinic-rev-1-publish-check.html b/app/views/mission-1/current-iteration/create-clinic-rev-1-publish-check.html similarity index 100% rename from app/views/mission-1/september-iteration-2/create-clinic-rev-1-publish-check.html rename to app/views/mission-1/current-iteration/create-clinic-rev-1-publish-check.html diff --git a/app/views/mission-1/september-iteration-2/create-clinic-rev-1-schedule.html b/app/views/mission-1/current-iteration/create-clinic-rev-1-schedule.html similarity index 100% rename from app/views/mission-1/september-iteration-2/create-clinic-rev-1-schedule.html rename to app/views/mission-1/current-iteration/create-clinic-rev-1-schedule.html diff --git a/app/views/mission-1/september-iteration-2/create-clinic-rev-1-set-timings.html b/app/views/mission-1/current-iteration/create-clinic-rev-1-set-timings.html similarity index 100% rename from app/views/mission-1/september-iteration-2/create-clinic-rev-1-set-timings.html rename to app/views/mission-1/current-iteration/create-clinic-rev-1-set-timings.html diff --git a/app/views/mission-1/september-iteration-2/create-clinic-rev-1-slot-structure.html b/app/views/mission-1/current-iteration/create-clinic-rev-1-slot-structure.html similarity index 100% rename from app/views/mission-1/september-iteration-2/create-clinic-rev-1-slot-structure.html rename to app/views/mission-1/current-iteration/create-clinic-rev-1-slot-structure.html diff --git a/app/views/mission-1/september-iteration-2/create-clinic.html b/app/views/mission-1/current-iteration/create-clinic.html similarity index 100% rename from app/views/mission-1/september-iteration-2/create-clinic.html rename to app/views/mission-1/current-iteration/create-clinic.html diff --git a/app/views/mission-1/september-iteration-2/includes/day-list-hard-coded.html b/app/views/mission-1/current-iteration/includes/day-list-hard-coded.html similarity index 100% rename from app/views/mission-1/september-iteration-2/includes/day-list-hard-coded.html rename to app/views/mission-1/current-iteration/includes/day-list-hard-coded.html diff --git a/app/views/mission-1/september-iteration-2/includes/participant-staging-control.html b/app/views/mission-1/current-iteration/includes/participant-staging-control.html similarity index 100% rename from app/views/mission-1/september-iteration-2/includes/participant-staging-control.html rename to app/views/mission-1/current-iteration/includes/participant-staging-control.html diff --git a/app/views/mission-1/september-iteration-2/macros/batch-detail.html b/app/views/mission-1/current-iteration/macros/batch-detail.html similarity index 100% rename from app/views/mission-1/september-iteration-2/macros/batch-detail.html rename to app/views/mission-1/current-iteration/macros/batch-detail.html diff --git a/app/views/mission-1/september-iteration-2/macros/batch-upload.html b/app/views/mission-1/current-iteration/macros/batch-upload.html similarity index 100% rename from app/views/mission-1/september-iteration-2/macros/batch-upload.html rename to app/views/mission-1/current-iteration/macros/batch-upload.html diff --git a/app/views/mission-1/september-iteration-2/macros/participant-listing.html b/app/views/mission-1/current-iteration/macros/participant-listing.html similarity index 100% rename from app/views/mission-1/september-iteration-2/macros/participant-listing.html rename to app/views/mission-1/current-iteration/macros/participant-listing.html diff --git a/app/views/mission-1/september-iteration-2/macros/search-component.html b/app/views/mission-1/current-iteration/macros/search-component.html similarity index 100% rename from app/views/mission-1/september-iteration-2/macros/search-component.html rename to app/views/mission-1/current-iteration/macros/search-component.html From 189c0c83fce89fa1db2c802d26adaf8e2ce8267b Mon Sep 17 00:00:00 2001 From: Mat Johnson Date: Tue, 6 Oct 2026 15:12:26 +0100 Subject: [PATCH 11/13] Tidying up --- app/routes/mission-1.js | 4 +-- .../current-iteration/create-clinic.html | 34 ++----------------- 2 files changed, 5 insertions(+), 33 deletions(-) diff --git a/app/routes/mission-1.js b/app/routes/mission-1.js index 937287a0..94be000d 100644 --- a/app/routes/mission-1.js +++ b/app/routes/mission-1.js @@ -270,7 +270,7 @@ router.post('/mission-1/current-iteration/mark-staff-break', function (req, res) const errors = {} if (selectedSlots.length === 0) { - errors.slots = 'you need to select some slots' + errors.slots = 'Select at least one slot' } if (Object.keys(errors).length > 0) { @@ -293,7 +293,7 @@ router.post('/mission-1/current-iteration/clear-slot-type', function (req, res) const errors = {} if (selectedSlots.length === 0) { - errors.slots = 'you need to select some slots' + errors.slots = 'Select at least one slot' } if (Object.keys(errors).length > 0) { diff --git a/app/views/mission-1/current-iteration/create-clinic.html b/app/views/mission-1/current-iteration/create-clinic.html index df03f37f..b4db5adb 100644 --- a/app/views/mission-1/current-iteration/create-clinic.html +++ b/app/views/mission-1/current-iteration/create-clinic.html @@ -90,41 +90,13 @@

Clinics

{% endif %}

- + Select this clinic
- Rubie test clinic - - Hard coded
- as per live test #1 -
- Alpha van
- HWO-mobile-1 -
- 1 October 2026
- 1 day -
-
- 48 slots available of 48 -
- - Select this clinic - -
Chichester - standard slots May 2026
@@ -147,7 +119,7 @@

Clinics

48 slots available of 48
- + Select this clinic - + Select this clinic