From 9c39e7eba3c19a6867baa958e87bdb95c0df7998 Mon Sep 17 00:00:00 2001 From: Mat Johnson Date: Fri, 31 Jul 2026 11:40:42 +0100 Subject: [PATCH 1/6] swift listing page sketch --- app/views/index.html | 6 ++ app/views/sessions/templating-01-listing.html | 89 +++++++++++++++++++ 2 files changed, 95 insertions(+) create mode 100644 app/views/sessions/templating-01-listing.html diff --git a/app/views/index.html b/app/views/index.html index 77ea7fb..646bd36 100755 --- a/app/views/index.html +++ b/app/views/index.html @@ -46,6 +46,12 @@

July 2026

Set up session +

Session templates: iteration 1

+
    +
  1. + Template listing +
  2. +

May–June 2026

Clinics: first run

diff --git a/app/views/sessions/templating-01-listing.html b/app/views/sessions/templating-01-listing.html new file mode 100644 index 0000000..852b1b2 --- /dev/null +++ b/app/views/sessions/templating-01-listing.html @@ -0,0 +1,89 @@ +{% extends 'layout.html' %} + +{% set errorState = "true" if errors else "false" %} + +{% set pageName = "Session templates" %} + +{% from "_includes/primary-navigation.html" import primaryNavigation %} +{% block header %} + {{ primaryNavigation("Clinics", serviceName) }} +{% endblock %} + +{% block beforeContent %}{% endblock %} + +{% block content %} +
+

Session templates

+ + {{ button({ + text: "Create a new session template", + href: "#", + classes: "nhsuk-button--secondary" + }) }} +
+ +
+
+ + {{ table({ + firstCellIsHeader: false, + head: [ + { + text: 'Template' + }, + { + text: 'Start time' + }, + { + text: 'End time' + }, + { + text: 'Slot length' + } + ], + rows: [ + [ + { + html: ' + Standard day session for static site
+ Standard day template for our static site at Worthing Hospital. 2 double-slot special appointments at the beginning of the day, and 4 held slots at the end. 1 hour break from 12:00 to 13:00. + ' + }, + { + text: '10:00' + }, + { + text: '17:00' + }, + { + text: '10 minutes' + } + ], + [ + { + html: ' + Special appointments day session for static site
+ Whole day of double-slot special appointments with a 1 hour break from 12:00 to 13:00. + ' + }, + { + text: '10:00' + }, + { + text: '17:00' + }, + { + text: '20 minutes' + } + ] + ] + }) }} + +
+
+ + + +{% endblock %} + +{% block pageScripts %}{% endblock %} \ No newline at end of file From adcae1df395c392c4318ef8bcb97ed56fd69efb6 Mon Sep 17 00:00:00 2001 From: Mat Johnson Date: Fri, 31 Jul 2026 13:26:20 +0100 Subject: [PATCH 2/6] Tweak routing in order to double up slot creation for both unique instance and template creation --- app/routes.js | 58 ++--- app/views/sessions/01-set-timings.html | 19 +- app/views/sessions/02-organise-slots.html | 18 +- app/views/sessions/templating-01-listing.html | 200 +++++++++++++----- 4 files changed, 209 insertions(+), 86 deletions(-) diff --git a/app/routes.js b/app/routes.js index 6e79bbf..3168bf3 100644 --- a/app/routes.js +++ b/app/routes.js @@ -3,7 +3,7 @@ const express = require('express') const router = express.Router() -const isWholeNumber = str => /^\d+$/.test(str) +//======= September test specific for now router.get('/september-iteration-2/clickthru/04a-example-search-result', function (req, res) { const query = (req.query['search-params'] || '').trim() @@ -33,7 +33,35 @@ router.get('/september-iteration-2/clickthru/04a-example-search-result', functio }) }) -router.post('/sessions/02-organise-slots', function (req, res) { +router.get('/action/stage/:participantId', function (req, res) { + const participants = (req.session.data.participants && req.session.data.participants.default) || [] + const participantIndex = participants.findIndex((participant) => participant.participantId === req.params.participantId) + + if (participantIndex !== -1) { + participants[participantIndex].status = 'staged' + req.session.data.stagedCount++ + } + + res.redirect(req.get('referer') || '/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) || [] + const participantIndex = participants.findIndex((participant) => participant.participantId === req.params.participantId) + + if (participantIndex !== -1) { + participants[participantIndex].status = 'unstaged' + req.session.data.stagedCount-- + } + + res.redirect(req.get('referer') || '/september-iteration-2/clickthru/04-choose-participants') +}); + +// ====== session setup handlers + +const isWholeNumber = str => /^\d+$/.test(str) + +router.post('/sessions/01-set-timings', function (req, res) { const session = (req.body && req.body.newSession) || {} const startTime = session.startTime || {} const endTime = session.endTime || {} @@ -91,28 +119,8 @@ router.post('/sessions/02-organise-slots', function (req, res) { res.redirect('/sessions/02-organise-slots') }) -router.get('/action/stage/:participantId', function (req, res) { - const participants = (req.session.data.participants && req.session.data.participants.default) || [] - const participantIndex = participants.findIndex((participant) => participant.participantId === req.params.participantId) - - if (participantIndex !== -1) { - participants[participantIndex].status = 'staged' - req.session.data.stagedCount++ - } - - res.redirect(req.get('referer') || '/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) || [] - const participantIndex = participants.findIndex((participant) => participant.participantId === req.params.participantId) - - if (participantIndex !== -1) { - participants[participantIndex].status = 'unstaged' - req.session.data.stagedCount-- - } - - res.redirect(req.get('referer') || '/september-iteration-2/clickthru/04-choose-participants') -}); +router.post('/sessions/02-organise-slots', function (req, res) { + res.redirect('/sessions/03-prototype-end') +}) module.exports = router diff --git a/app/views/sessions/01-set-timings.html b/app/views/sessions/01-set-timings.html index 04324e9..458b468 100644 --- a/app/views/sessions/01-set-timings.html +++ b/app/views/sessions/01-set-timings.html @@ -1,5 +1,6 @@ {% extends 'layout.html' %} +{% set workflow = "template" if data.sessionCreationType === "new session template" else "standard" %} {% set errorState = "true" if errors else "false" %} {% set pageName = "Create session: set timings" %} @@ -23,12 +24,17 @@
+ +
@@ -76,7 +89,7 @@

Set timings

-
+
diff --git a/app/views/sessions/02-organise-slots.html b/app/views/sessions/02-organise-slots.html index a783505..d4eff36 100644 --- a/app/views/sessions/02-organise-slots.html +++ b/app/views/sessions/02-organise-slots.html @@ -1,5 +1,7 @@ {% extends 'layout.html' %} +{% set workflow = "template" if data.sessionCreationType === "new session template" else "standard" %} + {% set pageName = "Create session: organise slots" %} {% from "_includes/primary-navigation.html" import primaryNavigation %} @@ -79,7 +81,11 @@

Workflow steps - Create session + {% if workflow === "template" %} + New session template + {% else %} + Create session + {% endif %}

  1. @@ -97,7 +103,13 @@

  2. 3 - Publish + + {% if workflow === "template" %} + Save template + {% else %} + Publish + {% endif %} +
@@ -115,7 +127,7 @@

- + diff --git a/app/views/sessions/templating-01-listing.html b/app/views/sessions/templating-01-listing.html index 852b1b2..305d8e0 100644 --- a/app/views/sessions/templating-01-listing.html +++ b/app/views/sessions/templating-01-listing.html @@ -1,7 +1,5 @@ {% extends 'layout.html' %} -{% set errorState = "true" if errors else "false" %} - {% set pageName = "Session templates" %} {% from "_includes/primary-navigation.html" import primaryNavigation %} @@ -12,72 +10,164 @@ {% block beforeContent %}{% endblock %} {% block content %} -
-

Session templates

- {{ button({ - text: "Create a new session template", - href: "#", - classes: "nhsuk-button--secondary" - }) }} -
+{{ data.sessionCreationType }} + + +

Session templates

-
-
+ + {{ button({ + text: "Create a new session template", + classes: "nhsuk-button--secondary" + }) }} + - {{ table({ - firstCellIsHeader: false, - head: [ +
+
+ + {{ table({ + firstCellIsHeader: false, + head: [ + { + text: 'Template' + }, + { + text: 'Start time' + }, + { + text: 'End time' + }, + { + text: 'Slot length' + } + ], + rows: [ + [ { - text: 'Template' + html: ' + Standard day session for static site
+ Standard day template for our static site at Worthing Hospital. 2 double-slot special appointments at the beginning of the day, and 4 held slots at the end. 1 hour break from 12:00 to 13:00. + ' }, { - text: 'Start time' + text: '10:00' }, { - text: 'End time' + text: '17:00' }, { - text: 'Slot length' + text: '10 minutes' } ], - rows: [ - [ - { - html: ' - Standard day session for static site
- Standard day template for our static site at Worthing Hospital. 2 double-slot special appointments at the beginning of the day, and 4 held slots at the end. 1 hour break from 12:00 to 13:00. - ' - }, - { - text: '10:00' - }, - { - text: '17:00' - }, - { - text: '10 minutes' - } - ], - [ - { - html: ' - Special appointments day session for static site
- Whole day of double-slot special appointments with a 1 hour break from 12:00 to 13:00. - ' - }, - { - text: '10:00' - }, - { - text: '17:00' - }, - { - text: '20 minutes' - } - ] + [ + { + html: ' + Special appointments day session for static site
+ Whole day of double-slot special appointments with a 1 hour break from 12:00 to 13:00. + ' + }, + { + text: '10:00' + }, + { + text: '17:00' + }, + { + text: '20 minutes' + } ] - }) }} + ] + }) }} + +
+
+ +
+
+

Archived session templates

+

+ View archived templates +

+
+
+ +{% set tickSvg %} + +{% endset %} + +
+
+ +
+ +
+ +
+
+
+ +

Save session template

+ +
+ +
+ +
+ A memorable name for this template. This is the name you’ll see everywhere for it, as titles and links. +
+ {% if errorState === "true" %} + + Error: Template must be given a name + + {% endif %} + +
+ +
+ +
+ Put in a description so you can remember stuff +
+ +
+ + + +
From 44082e89655c905743ebc7428b4cd66dcc8bb155 Mon Sep 17 00:00:00 2001 From: Mat Johnson Date: Fri, 31 Jul 2026 14:05:42 +0100 Subject: [PATCH 3/6] Add a big session reset button to index, plus use get not post to first session setup --- app/views/index.html | 6 +++++- app/views/sessions/templating-01-listing.html | 2 +- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/app/views/index.html b/app/views/index.html index 646bd36..7a93f1e 100755 --- a/app/views/index.html +++ b/app/views/index.html @@ -37,7 +37,11 @@

{{ serviceName }}

-
+ {{ button({ + text: "Reset all session data", + classes: "nhsuk-button--secondary", + href: "/prototype-admin/reset?returnPage=" + (currentPage | urlencode) + }) }}

July 2026

Sessions: first run

diff --git a/app/views/sessions/templating-01-listing.html b/app/views/sessions/templating-01-listing.html index 305d8e0..76a23a6 100644 --- a/app/views/sessions/templating-01-listing.html +++ b/app/views/sessions/templating-01-listing.html @@ -13,7 +13,7 @@ {{ data.sessionCreationType }} -
+

Session templates

From 92b571910ea47758757c95ff3789b290af463bd0 Mon Sep 17 00:00:00 2001 From: Mat Johnson Date: Fri, 31 Jul 2026 15:20:18 +0100 Subject: [PATCH 4/6] Making the smallest possible transaction --- app/routes.js | 6 +- app/views/sessions/templating-01-listing.html | 83 ---------------- app/views/sessions/templating-03-save-as.html | 96 +++++++++++++++++++ 3 files changed, 101 insertions(+), 84 deletions(-) create mode 100644 app/views/sessions/templating-03-save-as.html diff --git a/app/routes.js b/app/routes.js index 3168bf3..7388a5f 100644 --- a/app/routes.js +++ b/app/routes.js @@ -120,7 +120,11 @@ router.post('/sessions/01-set-timings', function (req, res) { }) router.post('/sessions/02-organise-slots', function (req, res) { - res.redirect('/sessions/03-prototype-end') + if (req.session.data.sessionCreationType === 'new session template') { + res.redirect('/sessions/templating-03-save-as') + } else { + res.redirect('/sessions/03-prototype-end') + } }) module.exports = router diff --git a/app/views/sessions/templating-01-listing.html b/app/views/sessions/templating-01-listing.html index 76a23a6..14dcee5 100644 --- a/app/views/sessions/templating-01-listing.html +++ b/app/views/sessions/templating-01-listing.html @@ -91,89 +91,6 @@

Archived session templates

- -{% set tickSvg %} - -{% endset %} - -
-
- -
- -
- -
-
-
- -

Save session template

- - - -
- -
- A memorable name for this template. This is the name you’ll see everywhere for it, as titles and links. -
- {% if errorState === "true" %} - - Error: Template must be given a name - - {% endif %} - -
- -
- -
- Put in a description so you can remember stuff -
- -
- - - - - -
-
- - - {% endblock %} {% block pageScripts %}{% endblock %} \ No newline at end of file diff --git a/app/views/sessions/templating-03-save-as.html b/app/views/sessions/templating-03-save-as.html new file mode 100644 index 0000000..36d08a5 --- /dev/null +++ b/app/views/sessions/templating-03-save-as.html @@ -0,0 +1,96 @@ +{% extends 'layout.html' %} + +{% set pageName = "Session templates" %} + +{% from "_includes/primary-navigation.html" import primaryNavigation %} +{% block header %} + {{ primaryNavigation("Clinics", serviceName) }} +{% endblock %} + +{% block beforeContent %}{% endblock %} + +{% block content %} + +{% set tickSvg %} + +{% endset %} + +
+
+ +
+ +
+ +
+
+
+ +

Save session template

+ +
+ +
+ +
+ A memorable name for this template. This is the name you’ll see everywhere for it, as titles and links. +
+ {% if errorState === "true" %} + + Error: Template must be given a name + + {% endif %} + +
+ +
+ +
+ Put in a description so you can remember stuff +
+ +
+ + + +
+ +
+
+
+{% endblock %} + +{% block pageScripts %}{% endblock %} \ No newline at end of file From b6377f4fe21b6c1a1097fe8e32e2703d15106c94 Mon Sep 17 00:00:00 2001 From: Mat Johnson Date: Thu, 6 Aug 2026 11:53:51 +0100 Subject: [PATCH 5/6] Built out clinic session templates journey iteration 1 --- app/routes.js | 2 +- .../clinics/clinic-listing-table.html | 11 +- app/views/clinics/index.html | 58 ++++---- app/views/sessions/01-set-timings.html | 37 ++++- app/views/sessions/02-organise-slots.html | 37 ++++- app/views/sessions/templating-01-listing.html | 30 +++- ...> templating-03-name-and-description.html} | 24 ++-- .../sessions/templating-04-check-answers.html | 128 ++++++++++++++++++ 8 files changed, 268 insertions(+), 59 deletions(-) rename app/views/sessions/{templating-03-save-as.html => templating-03-name-and-description.html} (80%) create mode 100644 app/views/sessions/templating-04-check-answers.html diff --git a/app/routes.js b/app/routes.js index 7388a5f..814225d 100644 --- a/app/routes.js +++ b/app/routes.js @@ -121,7 +121,7 @@ router.post('/sessions/01-set-timings', function (req, res) { router.post('/sessions/02-organise-slots', function (req, res) { if (req.session.data.sessionCreationType === 'new session template') { - res.redirect('/sessions/templating-03-save-as') + res.redirect('/sessions/templating-03-name-and-description') } else { res.redirect('/sessions/03-prototype-end') } diff --git a/app/views/_includes/clinics/clinic-listing-table.html b/app/views/_includes/clinics/clinic-listing-table.html index 74fb7a2..d2346b7 100644 --- a/app/views/_includes/clinics/clinic-listing-table.html +++ b/app/views/_includes/clinics/clinic-listing-table.html @@ -11,10 +11,7 @@ text: 'Unit' }, { - text: 'Timeframe' - }, - { - text: 'Capacity' + text: 'Current capacity' } ], rows: [ @@ -28,9 +25,6 @@ { html: 'Alpha van
HWO-mobile-1 ' }, - { - html: '1 May 2026 to 31 May 2026
21 days' - }, { html: '
10 slots available of 1360
' } @@ -45,9 +39,6 @@ { html: 'Home base
HWO-static-1 ' }, - { - html: '7, 21 May 2026
2 days' - }, { html: '
40 slots available of 100
' } diff --git a/app/views/clinics/index.html b/app/views/clinics/index.html index d82e1dc..a670700 100644 --- a/app/views/clinics/index.html +++ b/app/views/clinics/index.html @@ -7,44 +7,46 @@ {{ primaryNavigation("Clinics", serviceName) }} {% endblock %} -{% block beforeContent %} - -{{ breadcrumb({ - items: [ - { - href: "#", - text: "Home" - } - ] -}) }} - -{% endblock %} +{% block beforeContent %}{% endblock %} {% block content %} -
-

Clinics

- - {{ button({ - text: "Create a new clinic", - href: "00-create-day-clinic", - classes: "nhsuk-button--secondary" - }) }} -
+ + {% set secondaryNavItems = [] %} + + {% for item in [ + { href: '/clinics/', label: 'Active clinics', selected: 'true' }, + { href: '#', label: 'Archived clinics' }, + { href: '/sessions/templating-01-listing', label: 'Session templates' } + ] %} + {% set secondaryNavItems = secondaryNavItems | push({ + text: item.label | safe, + href: item.href | trim, + current: true if item.selected == 'true' + }) %} + {% endfor %} + + {{ appSecondaryNavigation({ + visuallyHiddenTitle: "Secondary menu", + items: secondaryNavItems + }) }}
- - {% include "_includes/clinics/clinic-listing-table.html"%} - +
+

Active clinics

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

Completed batches

-

- View completed clinics -

+ {% include "_includes/clinics/clinic-listing-table.html"%}
+ {% endblock %} diff --git a/app/views/sessions/01-set-timings.html b/app/views/sessions/01-set-timings.html index 458b468..a4bcebc 100644 --- a/app/views/sessions/01-set-timings.html +++ b/app/views/sessions/01-set-timings.html @@ -36,6 +36,36 @@

Create session {% endif %}

+ {% if workflow === "template" %} +
    +
  1. + + 1 + Set timings + +
  2. +
  3. + + 2 + Organise slots + +
  4. +
  5. + + 3 + Name and description + +
  6. +
  7. + + 4 + + Save session template + + +
  8. +
+ {% else %}
  1. @@ -53,15 +83,12 @@

    3 - {% if workflow === "template" %} - Save template - {% else %} - Publish - {% endif %} + Publish

+ {% endif %} diff --git a/app/views/sessions/02-organise-slots.html b/app/views/sessions/02-organise-slots.html index d4eff36..b90868a 100644 --- a/app/views/sessions/02-organise-slots.html +++ b/app/views/sessions/02-organise-slots.html @@ -87,6 +87,36 @@

Create session {% endif %}

+ {% if workflow === "template" %} +
    +
  1. + + {{ tickSvg | safe }} + Set timings + +
  2. +
  3. + + 2 + Organise slots + +
  4. +
  5. + + 3 + Name and description + +
  6. +
  7. + + 4 + + Save session template + + +
  8. +
+ {% else %}
  1. @@ -104,15 +134,12 @@

    3 - {% if workflow === "template" %} - Save template - {% else %} - Publish - {% endif %} + Publish

+ {% endif %} diff --git a/app/views/sessions/templating-01-listing.html b/app/views/sessions/templating-01-listing.html index 14dcee5..f9d6ae8 100644 --- a/app/views/sessions/templating-01-listing.html +++ b/app/views/sessions/templating-01-listing.html @@ -11,7 +11,24 @@ {% block content %} -{{ data.sessionCreationType }} +{% set secondaryNavItems = [] %} + +{% for item in [ + { href: '/clinics/', label: 'Active clinics' }, + { href: '#', label: 'Archived clinics' }, + { href: '/sessions/templating-01-listing', label: 'Session templates', selected: 'true' } +] %} + {% set secondaryNavItems = secondaryNavItems | push({ + text: item.label | safe, + href: item.href | trim, + current: true if item.selected == 'true' + }) %} +{% endfor %} + +{{ appSecondaryNavigation({ + visuallyHiddenTitle: "Secondary menu", + items: secondaryNavItems +}) }}

Session templates

@@ -40,6 +57,9 @@

Session templates

}, { text: 'Slot length' + }, + { + text: 'Capacity' } ], rows: [ @@ -54,10 +74,13 @@

Session templates

text: '10:00' }, { - text: '17:00' + text: '16:00' }, { text: '10 minutes' + }, + { + text: '30 slots' } ], [ @@ -75,6 +98,9 @@

Session templates

}, { text: '20 minutes' + }, + { + text: '30 slots' } ] ] diff --git a/app/views/sessions/templating-03-save-as.html b/app/views/sessions/templating-03-name-and-description.html similarity index 80% rename from app/views/sessions/templating-03-save-as.html rename to app/views/sessions/templating-03-name-and-description.html index 36d08a5..0eba11b 100644 --- a/app/views/sessions/templating-03-save-as.html +++ b/app/views/sessions/templating-03-name-and-description.html @@ -30,13 +30,13 @@

  1. - + {{ tickSvg | safe }} Set timings
  2. - + {{ tickSvg | safe }} Organise slots @@ -44,7 +44,15 @@

  3. 3 - Save template + Name and description + +
  4. +
  5. + + 4 + + Save session template +
@@ -55,13 +63,13 @@

-

Save session template

+

Template name and description

- +
A memorable name for this template. This is the name you’ll see everywhere for it, as titles and links. @@ -76,7 +84,7 @@

Save session template

Put in a description so you can remember stuff @@ -84,7 +92,7 @@

Save session template

- + diff --git a/app/views/sessions/templating-04-check-answers.html b/app/views/sessions/templating-04-check-answers.html new file mode 100644 index 0000000..f705931 --- /dev/null +++ b/app/views/sessions/templating-04-check-answers.html @@ -0,0 +1,128 @@ +{% extends 'layout.html' %} + +{% set pageName = "Publish clinic" %} + +{% from "_includes/primary-navigation.html" import primaryNavigation %} +{% block header %} + {{ primaryNavigation("Clinics", serviceName) }} +{% endblock %} + +{% block beforeContent %}{% endblock %} + +{% block content %} + +{% set tickSvg %} + +{% endset %} + +
+
+ +
+ +
+ +
+
+
+ +

Save session template

+ + + +
+
+
+ Template name +
+
+ {{ data.sessionTemplateName }} +
+
+ Change template name +
+
+
+
+ Description +
+
+ {{ data.sessionTemplateDescription }} +
+
+ Change description +
+
+
+
+ Session timings +
+
+ {{ data.newSession.startTime.hour }}:{{ data.newSession.startTime.minute }} to {{ data.newSession.endTime.hour }}:{{ data.newSession.endTime.minute }}
+ {{ data.newSession.duration }} minute slots +
+
+ Change timings +
+
+
+
+ Slot organisation +
+
+ Total capacity ie all slot count that's not cancelled or breaks
+ {{ data.slotsSpecialAvailableCount }} special apppointment{% if data.slotsSpecialAvailableCount > 1 %}s{% endif %}
+ {{ data.slotsHeldCount }} held (this could break into multiple "helds" for reasons we're getting in UR) +
+
+ Change slot organisation +
+
+
+ +

+ Save template +

+ +
+
+
+ +{% endblock %} \ No newline at end of file From 7913816f4a716cc477d2b36c679defa5b1d5d006 Mon Sep 17 00:00:00 2001 From: Mat Johnson Date: Thu, 6 Aug 2026 12:06:51 +0100 Subject: [PATCH 6/6] bring in session vars to check answers page --- app/views/sessions/templating-04-check-answers.html | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/views/sessions/templating-04-check-answers.html b/app/views/sessions/templating-04-check-answers.html index f705931..ae91bca 100644 --- a/app/views/sessions/templating-04-check-answers.html +++ b/app/views/sessions/templating-04-check-answers.html @@ -107,8 +107,8 @@

Save session template

Slot organisation
- Total capacity ie all slot count that's not cancelled or breaks
- {{ data.slotsSpecialAvailableCount }} special apppointment{% if data.slotsSpecialAvailableCount > 1 %}s{% endif %}
+ {{ data.slotsAvailableCount }} total session capacity (all slot count that's not cancelled or breaks?)
+ {{ data.slotsSpecialAvailableCount }} special apppointment{% if (data.slotsSpecialAvailableCount == 0) or (data.slotsSpecialAvailableCount > 1) %}s{% endif %}
{{ data.slotsHeldCount }} held (this could break into multiple "helds" for reasons we're getting in UR)
@@ -116,7 +116,7 @@

Save session template

- +

Save template