From 2a8c48a18445588dcfbbdaa02ab2b52cebc2a658 Mon Sep 17 00:00:00 2001 From: Caitlin Roach Date: Tue, 16 Jun 2026 16:14:41 +0100 Subject: [PATCH 01/15] Add empty state for no pharmacies --- app/routes/prototype-admin.js | 14 +++ .../includes/_preset-scenarios-table.html | 8 ++ app/views/pharmacies/index.html | 116 +++++++++--------- 3 files changed, 81 insertions(+), 57 deletions(-) diff --git a/app/routes/prototype-admin.js b/app/routes/prototype-admin.js index b2401748..2bd6777f 100644 --- a/app/routes/prototype-admin.js +++ b/app/routes/prototype-admin.js @@ -564,6 +564,20 @@ module.exports = (router) => { res.redirect('/home') }) + // ---------------------------------------------------------------- + // Preset: Pharmacy HQ, no data (Amanda White, P15951) + // ---------------------------------------------------------------- + + router.get('/prototype-setup/preset/pharmacy-hq-no-data', (req, res) => { + resetSession(req) + const data = req.session.data + data.currentUserId = '6424325235325' + data.currentOrganisationId = 'P15951' + // Remove all pharmacies belonging to P15951 to start with a clean slate + data.organisations = data.organisations.filter(org => org.companyId !== 'P15951' || org.type === 'Pharmacy HQ') + res.redirect('/home') + }) + // ---------------------------------------------------------------- // Preset: Recorder, single organisation (Ocean Merritt, FR4V56) // ---------------------------------------------------------------- diff --git a/app/views/includes/_preset-scenarios-table.html b/app/views/includes/_preset-scenarios-table.html index 3d9bd63b..05a98cf7 100644 --- a/app/views/includes/_preset-scenarios-table.html +++ b/app/views/includes/_preset-scenarios-table.html @@ -71,6 +71,14 @@ role: "Group administrator", scenarioDetails: "Group admin for a large pharmacy chain (same-name pharmacies)." }, + { + presetLabel: "Group admin, pharmacy HQ (no data)", + presetPath: "/prototype-setup/preset/pharmacy-hq-no-data", + userName: "Amanda White", + userEmail: "amanda.white@nhs.net", + role: "Group administrator", + scenarioDetails: "Group admin for a pharmacy HQ with no pre-loaded data, pharmacies or users." + }, { presetLabel: "Regional lead", presetPath: "/prototype-setup/preset/regions", diff --git a/app/views/pharmacies/index.html b/app/views/pharmacies/index.html index b033a9bf..ac9ab6ff 100644 --- a/app/views/pharmacies/index.html +++ b/app/views/pharmacies/index.html @@ -43,65 +43,67 @@

Pharmacies

href: "/pharmacies/select" }) }} - - -
Pharmacies added ({{ organisations | length }})
- {% if (organisations | length) > 10 %} -
- - -
- {% endif %} - - - - - - - - - - - - {% for organisation in organisations %} - - - - - - + {% if (organisations | length) > 0 %} +
- Name - - Vaccines - - Users - - Status - - Actions -
- {{ organisation.name }} ({{ organisation.id}}) - - {% set vaccinesEnabled = [] %} - {% for vaccine in organisation.vaccines %} - {% if vaccine.status == "enabled" %} - {% set vaccinesEnabled = (vaccinesEnabled.push(vaccine.name), vaccinesEnabled) %} - {% endif %} - {% endfor %} - - {{ (vaccinesEnabled | sort | join(", ")) | capitaliseFirstLetter }} - - {{ organisationUserCounts[organisation.id] }} - - {{ organisation.status }} - - Manage -
+ +
Pharmacies added ({{ organisations | length }})
+ {% if (organisations | length) > 10 %} +
+ + +
+ {% endif %} + + + + + + + + - {% endfor %} + + + {% for organisation in organisations %} + + + + + + + + {% endfor %} - -
+ Name + + Vaccines + + Users + + Status + + Actions +
+ {{ organisation.name }} ({{ organisation.id}}) + + {% set vaccinesEnabled = [] %} + {% for vaccine in organisation.vaccines %} + {% if vaccine.status == "enabled" %} + {% set vaccinesEnabled = (vaccinesEnabled.push(vaccine.name), vaccinesEnabled) %} + {% endif %} + {% endfor %} + + {{ (vaccinesEnabled | sort | join(", ")) | capitaliseFirstLetter }} + + {{ organisationUserCounts[organisation.id] }} + + {{ organisation.status }} + + Manage +
+ + + {% endif %} {% if closedOrganisations.length > 0 %}
From a64a808af916468ac4d24a2358b3854862115109 Mon Sep 17 00:00:00 2001 From: Caitlin Roach Date: Thu, 20 Aug 2026 14:49:32 +0100 Subject: [PATCH 02/15] Removed survey folder and page --- app/views/survey/index.html | 46 ------------------------------------- 1 file changed, 46 deletions(-) delete mode 100644 app/views/survey/index.html diff --git a/app/views/survey/index.html b/app/views/survey/index.html deleted file mode 100644 index 1cb3fd68..00000000 --- a/app/views/survey/index.html +++ /dev/null @@ -1,46 +0,0 @@ -{% extends "layout.html" %} - -{% set currentSection = "none" %} - -{% block content %} -
-
- -
Give us your feedback
- {{ radios({ - idPrefix: "survey", - name: "survey", - fieldset: { - legend: { - text: "How satisfied are you with this service? (optional)", - size: "l", - isPageHeading: true - } - }, - items: [ - { - text: "Very satisfied" - }, - { - text: "Satisfied" - }, - { - text: "Neither satisfied nor dissatisfied" - }, - { - text: "Dissatisfied" - }, - { - text: "Very dissatisfied" - } - ] - }) }} - - {{ button({ - text: "Continue", - href: "/home" - }) }} - -
-
-{% endblock %} From e082ac4d4c9b733113ef5c6cf25d9ffe73824d10 Mon Sep 17 00:00:00 2001 From: Caitlin Roach Date: Thu, 20 Aug 2026 14:50:56 +0100 Subject: [PATCH 03/15] removed explorations --- app/routes.js | 1 - app/routes/explorations.js | 17 ----------- app/views/explorations/index.html | 30 ------------------- .../explorations/record-vaccinations-v2.html | 24 --------------- app/views/index.html | 8 ----- 5 files changed, 80 deletions(-) delete mode 100644 app/routes/explorations.js delete mode 100644 app/views/explorations/index.html delete mode 100644 app/views/explorations/record-vaccinations-v2.html diff --git a/app/routes.js b/app/routes.js index 3b51666c..73349898 100644 --- a/app/routes.js +++ b/app/routes.js @@ -59,7 +59,6 @@ require('./routes/support')(router) require('./routes/auth')(router) require('./routes/home')(router) require('./routes/helpers')(router) -require('./routes/explorations')(router) router.get('/product-page', (req, res) => { // Sign out the user - this is just to make it easier diff --git a/app/routes/explorations.js b/app/routes/explorations.js deleted file mode 100644 index f362b24b..00000000 --- a/app/routes/explorations.js +++ /dev/null @@ -1,17 +0,0 @@ -module.exports = (router) => { - router.get('/explorations', (req, res) => { - const explorationLinks = [ - { - href: '/explorations/record-vaccinations-v2', - title: 'Record vaccinations v2', - description: 'Pilot area for trying alternative record vaccination journey ideas without affecting the current flow.' - } - ] - - res.render('explorations/index', { explorationLinks }) - }) - - router.get('/explorations/record-vaccinations-v2', (req, res) => { - res.render('explorations/record-vaccinations-v2') - }) -} diff --git a/app/views/explorations/index.html b/app/views/explorations/index.html deleted file mode 100644 index f55b6ac5..00000000 --- a/app/views/explorations/index.html +++ /dev/null @@ -1,30 +0,0 @@ -{% extends 'layout.html' %} - -{% set pageName = 'Feature explorations' %} - -{% block beforeContent %} - {{ backLink({ - text: 'Back', - href: '/' - }) }} -{% endblock %} - -{% block content %} -
-
-

Feature explorations

- -

Use this area to house experimental journeys and alternative versions without changing the current prototype flows.

- -
    - {% for explorationLink in explorationLinks %} -
  • - {{ explorationLink.title }} -
    - {{ explorationLink.description }} -
  • - {% endfor %} -
-
-
-{% endblock %} diff --git a/app/views/explorations/record-vaccinations-v2.html b/app/views/explorations/record-vaccinations-v2.html deleted file mode 100644 index d196917d..00000000 --- a/app/views/explorations/record-vaccinations-v2.html +++ /dev/null @@ -1,24 +0,0 @@ -{% extends 'layout.html' %} - -{% set pageName = 'Record vaccinations v2' %} - -{% block beforeContent %} - {{ backLink({ - text: 'Back', - href: '/explorations' - }) }} -{% endblock %} - -{% block content %} -
-
-

Record vaccinations v2

- -

This is a safe exploration area for trying new journey ideas. It has its own route namespace and does not change the live prototype flow.

- - {{ insetText({ - text: 'Use this page as the starting point for alternative layouts, content, or step structures before deciding whether to merge anything into the main prototype.' - }) }} -
-
-{% endblock %} diff --git a/app/views/index.html b/app/views/index.html index c7646d8c..d47b1867 100755 --- a/app/views/index.html +++ b/app/views/index.html @@ -75,14 +75,6 @@

Prototype setup

] }) }} -

Feature explorations

- -

Use this area for alternative journeys and early explorations without changing the current prototype flows.

- - -

Signed-out interface

From 1c6b993a5c76d6552bd690383a9d768cf0b468af Mon Sep 17 00:00:00 2001 From: Caitlin Roach Date: Thu, 20 Aug 2026 14:53:03 +0100 Subject: [PATCH 04/15] Update terms of use page names and links --- app/views/layout.html | 2 +- app/views/{terms-of-use1.html => terms-of-use-full.html} | 0 app/views/{terms-of-use.html => terms-of-use-short.html} | 2 +- 3 files changed, 2 insertions(+), 2 deletions(-) rename app/views/{terms-of-use1.html => terms-of-use-full.html} (100%) rename app/views/{terms-of-use.html => terms-of-use-short.html} (86%) diff --git a/app/views/layout.html b/app/views/layout.html index 0913025c..0788257b 100755 --- a/app/views/layout.html +++ b/app/views/layout.html @@ -62,7 +62,7 @@ text: "Accessibility statement" }, { - href: "/terms-of-use1", + href: "/terms-of-use-full", text: "Terms of use" }, { diff --git a/app/views/terms-of-use1.html b/app/views/terms-of-use-full.html similarity index 100% rename from app/views/terms-of-use1.html rename to app/views/terms-of-use-full.html diff --git a/app/views/terms-of-use.html b/app/views/terms-of-use-short.html similarity index 86% rename from app/views/terms-of-use.html rename to app/views/terms-of-use-short.html index 4d93db65..c244fc95 100644 --- a/app/views/terms-of-use.html +++ b/app/views/terms-of-use-short.html @@ -15,7 +15,7 @@

{{ pageName }}

  • Never allow anyone else to use your details to log in.
  • -

    Read the full terms of use (opens in new tab)

    +

    Read the full terms of use (opens in new tab)

    By continuing, you agree to the full terms of use.

    From f493470a60c5c6eeffa7df98978dcd01e51fd7c3 Mon Sep 17 00:00:00 2001 From: Caitlin Roach Date: Thu, 20 Aug 2026 14:53:52 +0100 Subject: [PATCH 05/15] remove lists --- app/views/lists/add-more-nhs-numbers.html | 49 ------- app/views/lists/add-nhs-numbers.html | 53 -------- app/views/lists/date.html | 94 -------------- app/views/lists/delete.html | 37 ------ app/views/lists/edit-name.html | 43 ------ app/views/lists/index.html | 37 ------ app/views/lists/list.html | 151 ---------------------- app/views/lists/loading.html | 59 --------- app/views/lists/name.html | 54 -------- app/views/lists/no-lists-created.html | 52 -------- app/views/lists/no-vaccines-added.html | 23 ---- app/views/lists/record/done.html | 62 --------- app/views/lists/remove.html | 33 ----- app/views/lists/team-lists.html | 98 -------------- app/views/lists/team.html | 47 ------- 15 files changed, 892 deletions(-) delete mode 100644 app/views/lists/add-more-nhs-numbers.html delete mode 100644 app/views/lists/add-nhs-numbers.html delete mode 100644 app/views/lists/date.html delete mode 100644 app/views/lists/delete.html delete mode 100644 app/views/lists/edit-name.html delete mode 100644 app/views/lists/index.html delete mode 100644 app/views/lists/list.html delete mode 100644 app/views/lists/loading.html delete mode 100644 app/views/lists/name.html delete mode 100644 app/views/lists/no-lists-created.html delete mode 100644 app/views/lists/no-vaccines-added.html delete mode 100644 app/views/lists/record/done.html delete mode 100644 app/views/lists/remove.html delete mode 100644 app/views/lists/team-lists.html delete mode 100644 app/views/lists/team.html diff --git a/app/views/lists/add-more-nhs-numbers.html b/app/views/lists/add-more-nhs-numbers.html deleted file mode 100644 index 9c47723f..00000000 --- a/app/views/lists/add-more-nhs-numbers.html +++ /dev/null @@ -1,49 +0,0 @@ -{% extends 'layout.html' %} - -{% set pageName = "Add a list of NHS numbers" %} - -{% set currentSection = "lists" %} - -{% block beforeContent %} - {{ backLink({ href: "/lists/list/" + patientList.id }) }} -{% endblock %} - -{% block content %} -
    -
    - - {{ patientList.name }} -

    Add more NHS numbers to your list

    - -

    Copy and paste NHS numbers from a spreadsheet or another source.

    -

    Each number must be 10 digits and can include spaces. Include 1 NHS number per line with no punctuation.

    -

    For example, -
    485 777 3456 -
    9012345678 -
    1234567890 -

    - -
    - -
    - - - -
    - - - - {{ button({ - text: "Confirm" - }) }} -
    - -
    -
    - - - -{% endblock %} - diff --git a/app/views/lists/add-nhs-numbers.html b/app/views/lists/add-nhs-numbers.html deleted file mode 100644 index c374feec..00000000 --- a/app/views/lists/add-nhs-numbers.html +++ /dev/null @@ -1,53 +0,0 @@ -{% extends 'layout.html' %} - -{% set pageName = "Add a list of NHS numbers" %} - -{% set currentSection = "lists" %} - -{% block beforeContent %} - {{ backLink({ href: "/lists/date" }) }} -{% endblock %} - -{% block content %} -
    -
    - - {% if (errors | length) > 0 %} - {{ errorSummary({ - titleText: "There is a problem", - errorList: errors - }) }} - {% endif %} - -
    - -

    Add a list of NHS numbers

    - -

    Copy and paste NHS numbers from a spreadsheet or another source.

    -

    Each number must be 10 digits and can include spaces. Include 1 NHS number per line with no punctuation.

    -

    For example, -
    485 777 3456 -
    9012345678 -
    1234567890 -

    - -
    - - - -
    - - -
    -
    - - - {{ button({ - text: "Confirm" - }) }} - - -{% endblock %} - diff --git a/app/views/lists/date.html b/app/views/lists/date.html deleted file mode 100644 index 2ebfe23f..00000000 --- a/app/views/lists/date.html +++ /dev/null @@ -1,94 +0,0 @@ - -{% extends 'layout.html' %} - -{% set pageName = "Choose a date" %} - -{% set currentSection = "lists" %} - -{% block beforeContent %} - {{ backLink({ - href: "/lists/team", - text: "Back" - }) }} -{% endblock %} - -{% block content %} -
    -
    - -
    - - {% set dateinputHtml %} - {{ dateInput({ - id: "other-date", - namePrefix: "otherDate", - values: data.otherDate, - fieldset: { - legend: { - text: "Date", - size: "s", - isPageHeading: false - } - }, - hint: { - text: "For example, 15 3 2026" - } - }) }} - {% endset %} - - {% set items = [] %} - {% for date in (dates) %} - {% set text %} - {% if loop.index == 1 %} - Today ({{ (date | govukDate(showWeekday=true)) }}) - {% else %} - {{ (date | govukDate(showWeekday=true)) }} - {% endif %} - {% endset %} - - {% set items = (items.push({ - text: text, - value: date - }), items) %} - {% endfor %} - - {% set items = (items.push({ - divider: 'or' - }), items) %} - - {% set items = (items.push({ - value: "other-date", - text: "Select a different date", - conditional: { - html: dateinputHtml - } - }), items) %} - - {% set items = (items.push({ - value: "no-date", - text: "No date" - }), items) %} - - {{ radios({ - idPrefix: "date", - name: "date", - value: data.date, - fieldset: { - legend: { - text: "Choose a date", - size: "l", - isPageHeading: true - } - }, - items: items - }) }} - - {{ button({ - text: "Continue" - }) }} -
    - -
    -
    -{% endblock %} - diff --git a/app/views/lists/delete.html b/app/views/lists/delete.html deleted file mode 100644 index c2c6dafb..00000000 --- a/app/views/lists/delete.html +++ /dev/null @@ -1,37 +0,0 @@ -{% extends 'layout.html' %} - -{% set pageName = "Delete list" %} -{% set site = currentOrganisation.sites | findById(patientList.siteId) %} - -{% set currentSection = "lists" %} - -{% block beforeContent %} - {{ backLink({ href: "/lists/list/" + patientList.id }) }} -{% endblock %} - -{% block content %} -
    -
    - - {{ site.name }} -

    - {% if patientList.date %} - Delete list for {{ patientList.date | govukDate }}? - {% else %} - Delete {{ patientList.name }} list? - {% endif %} -

    - -

    The list will be deleted but not any vaccination records.

    - -
    -
    - {{ button({ - text: "Yes, delete list" - }) }} -
    - -
    -
    - - {% endblock %} diff --git a/app/views/lists/edit-name.html b/app/views/lists/edit-name.html deleted file mode 100644 index 2455fd3d..00000000 --- a/app/views/lists/edit-name.html +++ /dev/null @@ -1,43 +0,0 @@ -{% extends 'layout.html' %} - -{% set currentSection = "lists" %} -{% set site = currentOrganisation.sites | findById(patientList.siteId) %} -{% set pageName = "Name your list" %} - -{% block beforeContent %} - {{ backLink({ href: "/lists/list/" + patientList.id }) }} -{% endblock %} - -{% block content %} -
    -
    - - {{ site.name }} - -
    - - {{ input({ - label: { - text: "Edit list name", - isPageHeading: true, - classes: "nhsuk-label--l" - }, - hint: { - text: "For example, Maternity list" - }, - id: "name", - name: "name", - value: patientList.name - }) }} - - {{ button({ - text: "Continue" - }) }} - -
    - -
    -
    - -{% endblock %} - diff --git a/app/views/lists/index.html b/app/views/lists/index.html deleted file mode 100644 index c65dfaa7..00000000 --- a/app/views/lists/index.html +++ /dev/null @@ -1,37 +0,0 @@ -{% extends 'layout.html' %} - -{% set pageName = "Lists" %} - -{% set currentSection = "lists" %} - -{% block content %} -
    -
    - - {{ tag({ - text: "New", - classes: "nhsuk-tag--blue" - })}} -

    - - -

    Lists

    - -

    To save time when you record vaccinations, you can add a list of NHS numbers.

    - - - - - {{ button({ - text: "Add a list", - href: "/lists/team" - }) }} - -
    -
    - -{% endblock %} diff --git a/app/views/lists/list.html b/app/views/lists/list.html deleted file mode 100644 index 04b89c1a..00000000 --- a/app/views/lists/list.html +++ /dev/null @@ -1,151 +0,0 @@ -{% extends 'layout.html' %} - -{% set pageName = (patientList.date | govukDate) if patientList.date else patientList.name %} -{% set site = currentOrganisation.sites | findById(patientList.siteId) %} - -{% set currentSection = "lists" %} - -{% block beforeContent %} - {{ backLink({ - href: "/lists/site/" + patientList.siteId - }) }} - {% endblock %} -{% block content %} - -
    -
    - -
    {{ site.name }}
    - -

    {{ pageName }}

    - -

    To record a vaccination, search for the person in the list and select the Record link next to their details.

    - - -

    - Add more NHS numbers       - {% if patientList.name %} - Edit list name       - {% endif %} - Delete list -

    - -
    -
    -
    - - - - {{ button({ - text: "Search", - classes: "nhsuk-button--secondary nhsuk-u-margin-left-2 nhsuk-button--small" - })}} -
    -
    -
    - -
    - -
    -
    -
    -
    - - - - - - - - - - - - - - - - - - - - - - {% for patient in patients %} - - - - - - - - {% endfor %} - - - - - - - - - -
    Showing {{ patients | length }} of {{ totalPatients }} patients
    - Name - - NHS number - - Date of birth - - - - -
    - {{ patient.firstName }} - {{ patient.lastName }} - - {{ patient.nhsNumber }} - - {{ patient.dateOfBirth | govukDate }} - - Record - - Remove -
    - NHS number not found - - 9523654781 - - Remove -
    - - - {{ pagination({ - next: { - href: "#" - }, - items: [ - { - number: 1, - href: "#", - current: true - }, - { - number: 2, - href: "#" - }, - { - number: 3, - href: "#" - } - ] - }) }} - -
    -
    - -{% endblock %} - - - diff --git a/app/views/lists/loading.html b/app/views/lists/loading.html deleted file mode 100644 index 6b106ce3..00000000 --- a/app/views/lists/loading.html +++ /dev/null @@ -1,59 +0,0 @@ -{% extends 'layout.html' %} - -{% set pageName = "Add a list of NHS numbers" %} - -{% set currentSection = "lists" %} - - -{% block content %} -
    -
    - - {% if (errors | length) > 0 %} - {{ errorSummary({ - titleText: "There is a problem", - errorList: errors - }) }} - {% endif %} - -
    - -

    Loading

    - - -
    - - -
    - - -

    Looking up NHS numbers
    Found 16 out of 104

    - - - - - -{% endblock %} - diff --git a/app/views/lists/name.html b/app/views/lists/name.html deleted file mode 100644 index 6a8d2f8a..00000000 --- a/app/views/lists/name.html +++ /dev/null @@ -1,54 +0,0 @@ -{% extends 'layout.html' %} - -{% set currentSection = "lists" %} - -{% set pageName = "List name" %} - -{% block beforeContent %} - {{ backLink({ href: "/lists/date" }) }} -{% endblock %} - - - - -{% from 'back-link/macro.njk' import backLink %} -{% from 'button/macro.njk' import button %} -{% from 'input/macro.njk' import input %} - -{% set mainClasses = "nhsuk-main-wrapper--s" %} - - -{% block content %} -
    -
    - - - - - - - {{ input({ - label: { - text: "Enter a name for your list", - isPageHeading: true, - size: "l" - }, - hint: { - text: "For example, Maternity patients" - }, - id: "name", - name: "name" - }) }} - - - {{ button({ - text: "Continue" - }) }} - - -
    -
    - - -{% endblock %} - diff --git a/app/views/lists/no-lists-created.html b/app/views/lists/no-lists-created.html deleted file mode 100644 index 8bed9b14..00000000 --- a/app/views/lists/no-lists-created.html +++ /dev/null @@ -1,52 +0,0 @@ -{% extends 'layout.html' %} - -{% set pageName = "no-lists-created" %} - -{% set currentSection = "lists" %} - -{% block content %} -
    -
    - - {{ tag({ - text: "New", - classes: "nhsuk-tag--blue" - })}} -

    -

    Lists

    - -

    To save time when you record vaccinations, you can add a list of NHS numbers.

    - - {% set howItWorksHtml %} -

    Add a list of NHS numbers and we will match them to patient details.

    -

    This means you will not have to input each patient's NHS number when you record vaccinations.

    - {% endset %} - - {% if (lists | length) > 0 %} - {{ details({ - text: "How it works", - html: howItWorksHtml - }) }} - - - - {% else %} -

    How it works

    - - {{ howItWorksHtml | safe }} - - {% endif %} - - - {{ button({ - text: "Add a list", - href: "/lists/team" - }) }} - -
    -
    - -{% endblock %} diff --git a/app/views/lists/no-vaccines-added.html b/app/views/lists/no-vaccines-added.html deleted file mode 100644 index e1f3f305..00000000 --- a/app/views/lists/no-vaccines-added.html +++ /dev/null @@ -1,23 +0,0 @@ -{% extends 'layout.html' %} - -{% set pageName = "Lists" %} -{% set currentSection = "lists" %} -{% set organisationSetting = currentUser.organisations | findById(data.currentOrganisationId) %} - - -{% block content %} -
    -
    - -

    {{ pageName }}

    - - {% if organisationSetting.permissionLevel == "Recorder" %} -

    An admin user needs to add a vaccine before you can create a list.

    - {% else %} -

    You need to add a vaccine before you can create a list.

    - {% endif %} - -
    -
    - -{% endblock %} diff --git a/app/views/lists/record/done.html b/app/views/lists/record/done.html deleted file mode 100644 index e9c0ae2d..00000000 --- a/app/views/lists/record/done.html +++ /dev/null @@ -1,62 +0,0 @@ -{% extends 'layout.html' %} - -{% set pageName = "Vaccination saved" %} - -{% set currentSection = "vaccinate" %} - -{% block content %} -
    -
    - - {% if (errors | length) > 0 %} - {{ errorSummary({ - titleText: "There is a problem", - errorList: errors - }) }} - {% endif %} - - {% set panelHtml %} - Michael James's COVID-19 record will be sent to their GP. - {% endset %} - - {{ panel({ - titleText: "Vaccination saved", - html: panelHtml - }) }} - - - {{ radios({ - idPrefix: "next-step", - name: "nextStep", - fieldset: { - legend: { - text: "What would you like to do next?", - classes: "nhsuk-fieldset__legend--m" - } - }, - errorMessage: { - text: error.text - } if error, - items: [ - { - value: "same-patient-another-vaccination", - text: "Record a second vaccination for Michael James" - }, - { - value: "same-vaccination-another-patient", - text: "Return to list" - } - ] - }) }} - - {{ button({ - text: "Continue", - href: "/lists/list" - }) }} - - -
    -
    - -{% endblock %} - diff --git a/app/views/lists/remove.html b/app/views/lists/remove.html deleted file mode 100644 index 4297b5cb..00000000 --- a/app/views/lists/remove.html +++ /dev/null @@ -1,33 +0,0 @@ -{% extends 'layout.html' %} - -{% set pageName = "Remove Tom Smith from the list?" %} - -{% set currentSection = "lists" %} - -{% block beforeContent %} - {{ backLink({ - href: "/lists/list", - text: "Back" - }) }} -{% endblock %} - - -{% block content %} -
    -
    - - -

    {{ pageName }}

    - - -
    -
    - -
    - -
    -
    - - {% endblock %} diff --git a/app/views/lists/team-lists.html b/app/views/lists/team-lists.html deleted file mode 100644 index 7fcb6381..00000000 --- a/app/views/lists/team-lists.html +++ /dev/null @@ -1,98 +0,0 @@ -{% extends 'layout.html' %} - -{% set pageName = site.name %} - -{% set currentSection = "lists" %} - -{% block beforeContent %} - {{ backLink({ - href: "/lists", - text: "Back" - }) }} -{% endblock %} - -{% block content %} -
    -
    - - {% if justAddedList %} - - {% set html %} -

    - {{ (justAddedList.date | govukDate) if justAddedList.date else justAddedList.name }} list added -

    -

    It can take several minutes to check NHS numbers.

    - {% endset %} - - {{ notificationBanner({ - html: html, - type: "success" - }) }} - {% endif %} - -

    {{ pageName }}

    - - {% if (lists | length) > 0 %} - - - - - - - - - - {% for list in lists %} - - - - - - {% endfor %} - -
    ListNHS numbers
    - - {% if list.date %} - {{ list.date | govukDate }} - {% else %} - {{ list.name }} - {% endif %} - - - {% if list.id == justAddedList.id %} - 1 checked out of {{ list.patients | length }} - {% else %} - {{ list.patients | length }} - {% endif %} -
    - {% else %} -

    No lists added.

    - {% endif %} - - {{ button({ - text: "Add a list", - href: "/lists/date?siteId=" + site.id - }) }} - -
    -
    - - {% if justAddedList %} - - {% endif %} - -{% endblock %} diff --git a/app/views/lists/team.html b/app/views/lists/team.html deleted file mode 100644 index 8ca4e8e1..00000000 --- a/app/views/lists/team.html +++ /dev/null @@ -1,47 +0,0 @@ -{% extends 'layout.html' %} - -{% set currentSection = "lists" %} - -{% set pageName = "Choose a site" %} - -{% block beforeContent %} - {{ backLink({ href: "/lists" }) }} -{% endblock %} - -{% block content %} -
    -
    - -
    - {% set items = [] %} - {% for site in (sites | sort(false, false, "name")) %} - {% set items = (items.push({ - text: site.name, - value: site.id - }), items) %} - {% endfor %} - - {{ radios({ - idPrefix: "siteId", - name: "siteId", - fieldset: { - legend: { - text: "Choose a site", - size: "l", - isPageHeading: true - } - }, - items: items, - value: data.siteId - }) }} - - {{ button({ - text: "Continue" - }) }} -
    - -
    -
    - -{% endblock %} - From 31eb62a1566aebab624d6e1fe754a19459a2b057 Mon Sep 17 00:00:00 2001 From: Caitlin Roach Date: Thu, 20 Aug 2026 14:54:22 +0100 Subject: [PATCH 06/15] remove find a patient --- app/views/find-a-patient.html | 29 ----------------------------- 1 file changed, 29 deletions(-) delete mode 100644 app/views/find-a-patient.html diff --git a/app/views/find-a-patient.html b/app/views/find-a-patient.html deleted file mode 100644 index 7844812e..00000000 --- a/app/views/find-a-patient.html +++ /dev/null @@ -1,29 +0,0 @@ -{% extends 'layout.html' %} - -{% set pageName = "Find a patient" %} -{% set currentSection = "find-a-patient" %} - - -{% block content %} -
    -
    - -

    {{ pageName }}

    - - {% set insetTextHtml %} -

    This section will soon be replaced by Record vaccinations. From 1 December 2025, you must record all vaccinations in the new section. -

    Find out more (opens in new tab)

    - {% endset %} - - {{ insetText({ - html: insetTextHtml, - classes: "nhsuk-u-margin-top-0 nhsuk-u-padding-top-3 nhsuk-u-padding-bottom-3 app-inset-text--white" - })}} - - -

    [Existing interface here]

    -
    -
    - - -{% endblock %} From c512fc12e8a9b1fc3056e365cacad86fb83a143b Mon Sep 17 00:00:00 2001 From: Caitlin Roach Date: Thu, 20 Aug 2026 16:36:25 +0100 Subject: [PATCH 07/15] Update subhead text size on reports page to match others --- app/views/reports/index.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/views/reports/index.html b/app/views/reports/index.html index 13356a41..b8878862 100644 --- a/app/views/reports/index.html +++ b/app/views/reports/index.html @@ -18,7 +18,7 @@

    Reports

    -

    Create and download reports.

    +

    Create and download reports.

    {% if vaccinationsRecordedCount > 0 %} From 2ebfa2bca1c3bc4f50436836f3c6da0f99025b65 Mon Sep 17 00:00:00 2001 From: Caitlin Roach Date: Mon, 24 Aug 2026 10:05:52 +0100 Subject: [PATCH 08/15] Update add-user-permission-level.html --- .../pharmacies/add-user-permission-level.html | 96 ++++--------------- 1 file changed, 16 insertions(+), 80 deletions(-) diff --git a/app/views/pharmacies/add-user-permission-level.html b/app/views/pharmacies/add-user-permission-level.html index 6fd96d6a..0c991cd0 100644 --- a/app/views/pharmacies/add-user-permission-level.html +++ b/app/views/pharmacies/add-user-permission-level.html @@ -2,13 +2,12 @@ {% set currentSection = "pharmacies" %} {% if existingUser %} - {% set roleHeading = existingUser.firstName + " " + existingUser.lastName + "'s role" %} + {% set pageName = existingUser.firstName + " " + existingUser.lastName + "'s role at " + organisation.name + " (" + organisation.id + ")" %} {% elseif data.firstName or data.lastName %} - {% set roleHeading = (data.firstName + " " + data.lastName) + "'s role" %} + {% set pageName = (data.firstName + " " + data.lastName) + "'s role at " + organisation.name + " (" + organisation.id + ")" %} {% else %} - {% set roleHeading = "New user's role" %} + {% set pageName = "New user's role at " + organisation.name + " (" + organisation.id + ")" %} {% endif %} -{% set pageName = roleHeading %} {% block beforeContent %} {{ backLink({ @@ -19,103 +18,46 @@ {% block content %}
    - - {% if firstNameError == "required" %} - {% set firstNameErrorMessage = "Enter a first name" %} - {% endif %} - {% if lastNameError == "required" %} - {% set lastNameErrorMessage = "Enter a last name" %} - {% endif %} - {% if emailError == "required" %} - {% set emailErrorMessage = "Enter an email address" %} - {% elseif emailError == "invalid-domain" %} - {% set emailErrorMessage = "Enter an allowed email address" %} - {% elseif emailError == "group-admin-not-allowed" %} - {% set emailErrorMessage = "You cannot add a group administrator to an individual pharmacy" %} - {% endif %} - {% if vaccinatorError == "required" %} - {% set vaccinatorErrorMessage = "Select if they’re a vaccinator" %} - {% endif %} - {% if permissionLevelError == "required" %} - {% set permissionLevelErrorMessage = "Select a permission level" %} - {% endif %} - - {% if firstNameErrorMessage or lastNameErrorMessage or emailErrorMessage or permissionLevelErrorMessage or vaccinatorErrorMessage %} - {{ errorSummary({ - titleText: "There is a problem", - errorList: [ - { - text: firstNameErrorMessage, - href: "#first-name" - } if firstNameErrorMessage, - { - text: lastNameErrorMessage, - href: "#last-name" - } if lastNameErrorMessage, - { - text: emailErrorMessage, - href: "#email" - } if emailErrorMessage, - { - text: vaccinatorErrorMessage, - href: "#vaccinator" - } if vaccinatorErrorMessage, - { - text: permissionLevelErrorMessage, - href: "#permission-level-1" - } if permissionLevelErrorMessage - ] - }) }} - {% endif %} - -
    {{ organisation.name }} ({{ organisation.id }})
    - -

    {{ roleHeading }}

    +

    + {% if existingUser %} + {{ existingUser.firstName }} {{ existingUser.lastName }}'s role at {{ organisation.name }} ({{ organisation.id }}) + {% elseif data.firstName or data.lastName %} + {{ data.firstName }} {{ data.lastName }}'s role at {{ organisation.name }} ({{ organisation.id }}) + {% else %} + Add a new user to {{ organisation.name }} ({{ organisation.id }}) + {% endif %} +

    {% if not existingUser %} -

    Users must have an nhs.net email or another allowed email address. See examples of allowed email addresses (opens in new tab).

    - -      

    If the email address is not allowed, use a different email or contact us.

    +

    Users must have an NHS-approved email address. See the list of approved email domains (opens in new tab).

    {{ input({ label: { text: "First name" }, - id: "first-name", name: "firstName", classes: "nhsuk-input--width-20", - value: data.firstName, - errorMessage: { - text: firstNameErrorMessage - } if firstNameErrorMessage + value: data.firstName }) }} {{ input({ label: { text: "Last name" }, - id: "last-name", name: "lastName", classes: "nhsuk-input--width-20", - value: data.lastName, - errorMessage: { - text: lastNameErrorMessage - } if lastNameErrorMessage + value: data.lastName }) }} {{ input({ label: { text: "Email address" }, - id: "email", name: "email", type: "email", - value: data.email, - errorMessage: { - text: emailErrorMessage - } if emailErrorMessage + value: data.email }) }} {% endif %} @@ -131,9 +73,6 @@

    {{ roleHeading }}

    text: "Vaccination records include the name of the person who gave the vaccination" }, value: data.vaccinator, - errorMessage: { - text: vaccinatorErrorMessage - } if vaccinatorErrorMessage, "items": [ { "value": "yes", @@ -157,9 +96,6 @@

    {{ roleHeading }}

    } }, value: data.permissionLevel, - errorMessage: { - text: permissionLevelErrorMessage - } if permissionLevelErrorMessage, items: [ { value: "Recorder", From 5302f408cb34525c6fa820b5f22ffd2a262887d6 Mon Sep 17 00:00:00 2001 From: Caitlin Roach Date: Mon, 24 Aug 2026 13:05:10 +0100 Subject: [PATCH 09/15] remove support interface --- app/routes/prototype-admin.js | 12 - .../includes/_preset-scenarios-table.html | 8 - app/views/index.html | 6 - app/views/support/index.html | 92 -------- app/views/support/organisations.html | 57 ----- app/views/support/organisations/add-user.html | 122 ---------- .../support/organisations/add-vaccines.html | 51 ----- .../support/organisations/change-region.html | 56 ----- .../support/organisations/feature-flag.html | 55 ----- app/views/support/organisations/show.html | 212 ------------------ .../support/organisations/update-details.html | 37 --- app/views/support/region.html | 113 ---------- app/views/support/regions.html | 24 -- app/views/support/regions/add-user.html | 68 ------ app/views/support/users.html | 103 --------- .../support/users/edit-organisation.html | 123 ---------- app/views/support/users/edit-region.html | 55 ----- app/views/support/users/show.html | 165 -------------- 18 files changed, 1359 deletions(-) delete mode 100644 app/views/support/index.html delete mode 100644 app/views/support/organisations.html delete mode 100644 app/views/support/organisations/add-user.html delete mode 100644 app/views/support/organisations/add-vaccines.html delete mode 100644 app/views/support/organisations/change-region.html delete mode 100644 app/views/support/organisations/feature-flag.html delete mode 100644 app/views/support/organisations/show.html delete mode 100644 app/views/support/organisations/update-details.html delete mode 100644 app/views/support/region.html delete mode 100644 app/views/support/regions.html delete mode 100644 app/views/support/regions/add-user.html delete mode 100644 app/views/support/users.html delete mode 100644 app/views/support/users/edit-organisation.html delete mode 100644 app/views/support/users/edit-region.html delete mode 100644 app/views/support/users/show.html diff --git a/app/routes/prototype-admin.js b/app/routes/prototype-admin.js index e074e81f..2207be17 100644 --- a/app/routes/prototype-admin.js +++ b/app/routes/prototype-admin.js @@ -657,18 +657,6 @@ module.exports = (router) => { res.redirect('/regions') }) - // ---------------------------------------------------------------- - // Preset: Support admin (Sally Green) - // ---------------------------------------------------------------- - - router.get('/prototype-setup/preset/support-admin', (req, res) => { - resetSession(req) - const data = req.session.data - data.currentUserId = '66435353634' - data.currentOrganisationId = null - res.redirect('/support/regions') - }) - // ---------------------------------------------------------------- // Preset: Limited-vaccine pharmacy (Jeremy Blue Holborn, FT81513) // ---------------------------------------------------------------- diff --git a/app/views/includes/_preset-scenarios-table.html b/app/views/includes/_preset-scenarios-table.html index 50290130..ed052f90 100644 --- a/app/views/includes/_preset-scenarios-table.html +++ b/app/views/includes/_preset-scenarios-table.html @@ -87,14 +87,6 @@ role: "Regional lead", scenarioDetails: "Redirects to the regions interface." }, - { - presetLabel: "Support user", - presetPath: "/prototype-setup/preset/support-admin", - userName: "Sally Green", - userEmail: "sally.green@nhs.net", - role: "Support admin", - scenarioDetails: "System-wide support user with no default organisation. Redirects to support interface." - }, { presetLabel: "Lead admin, trust with all vaccines enabled", presetPath: "/prototype-setup/preset/all-vaccines-trust", diff --git a/app/views/index.html b/app/views/index.html index d47b1867..67c4b3a9 100755 --- a/app/views/index.html +++ b/app/views/index.html @@ -120,12 +120,6 @@

    Regions interface

  • Regions interface
  • -

    Support interface

    - - -

    Error pages

      diff --git a/app/views/support/index.html b/app/views/support/index.html deleted file mode 100644 index 66a77ae0..00000000 --- a/app/views/support/index.html +++ /dev/null @@ -1,92 +0,0 @@ -{% extends 'layout.html' %} - -{% set pageName = "Dashboard" %} - -{% set currentSection = "dashboard" %} -postcode: - -{% block content %} -
      -
      - -

      Dashboard

      - - - - - - - - - - - - - - - - - - - - - - - {% for region in (regions | sort(false, true, "name")) %} - - - - - - - - - - - - {% endfor %} - - - - - - - - - - - - - - -
      By region
      - Region - - Organisations - - Users - - Vaccinations -
      - Lead - - Admin - - Recorder - - COVID - - flu - - RSV - - Pertussis -
      {{ region.name }}1501031505011,01430473416
      Total1,0507211,0503,5077,0982,1285,138112
      - - - -
      -
      - -{% endblock %} - diff --git a/app/views/support/organisations.html b/app/views/support/organisations.html deleted file mode 100644 index bbdbfe3b..00000000 --- a/app/views/support/organisations.html +++ /dev/null @@ -1,57 +0,0 @@ -{% extends 'layout.html' %} - -{% set pageName = "Organisations" %} - -{% set currentSection = "organisations" %} -postcode: - -{% block content %} -
      -
      - -

      {{ pageName }}

      - - - - - - - - - - - - - - {% for organisation in (organisations | sort(false, false, "name") ) %} - - - - - - - {% endfor %} - -
      - Name - - ODS code - - Type - - Status -
      - {{ organisation.name }} - - {{ organisation.id }} - - {{ organisation.type }} - - {{ organisation.status }} -
      - -
      -
      - -{% endblock %} - diff --git a/app/views/support/organisations/add-user.html b/app/views/support/organisations/add-user.html deleted file mode 100644 index ed2323d7..00000000 --- a/app/views/support/organisations/add-user.html +++ /dev/null @@ -1,122 +0,0 @@ -{% extends 'layout.html' %} - -{% set pageName = organisation.name %} - -{% block beforeContent %} - {{ backLink({ - href: "/support/organisations/" + organisation.id, - text: "Back" - }) }} -{% endblock %} - -{% set currentSection = "organisations" %} -postcode: - -{% block content %} -
      -
      - -
      {{ organisation.name }}
      -

      Add user

      - - {{ insetText({ - text: "Lead administrators in organisations can self-manage their users." - }) }} - - - - {{ input({ - label: { - text: "First name" - }, - id: "first-name", - name: "firstName", - classes: "nhsuk-input--width-20" - }) }} - - {{ input({ - label: { - text: "Last name" - }, - id: "last-name", - name: "lastName", - classes: "nhsuk-input--width-20" - }) }} - - {{ input({ - label: { - text: "NHS email address" - }, - id: "email", - name: "email", - type: "email" - }) }} - - {{ radios({ - name: "vaccinator", - fieldset: { - legend: { - text: "Are they a vaccinator?" - } - }, - hint: { - text: "Vaccination records include the name of the person who gave the vaccination" - }, - "items": [ - { - value: "yes", - text: "Yes", - id: "vaccinator" - }, - { - value: "no", - text: "No" - } - ] - }) }} - - - {{ radios({ - name: "permissionLevel", - fieldset: { - legend: { - text: "Permission level" - } - }, - value: data.permissionLevel, - items: [ - { - value: "Recorder", - text: "Recorder", - hint: { - text: "Record vaccinations only" - } - }, - { - value: "Administrator", - text: "Administrator", - hint: { - text: "Record vaccinations, create reports and manage vaccines" - } - }, - { - value: "Lead administrator", - text: "Lead administrator", - hint: { - text: "Record vaccinations, create reports, manage vaccines and users" - } - } - ] - }) }} - - - {{ button({ - text: "Save" - }) }} - - -
      -
      - -{% endblock %} - diff --git a/app/views/support/organisations/add-vaccines.html b/app/views/support/organisations/add-vaccines.html deleted file mode 100644 index dd4eef23..00000000 --- a/app/views/support/organisations/add-vaccines.html +++ /dev/null @@ -1,51 +0,0 @@ -{% extends 'layout.html' %} - -{% set pageName = "Add vaccines for " + organisation.name %} -{% set currentSection = "organisations" %} -postcode: - -{% block beforeContent %} - {{ backLink({ - href: "/support/organisations/" + organisation.id, - text: "Back" - }) }} -{% endblock %} - -{% block content %} -
      -
      - -
      - -
      {{ organisation.name }}
      - - {% set items = [] %} - - {% for vaccine in (vaccinesNotYetAdded | sort(false, false, "name")) %} - {% set items = (items.push({ - value: vaccine.name, - text: (vaccine.name ) - }), items) %} - {% endfor %} - - {{ checkboxes({ - name: "vaccinesToAdd", - classes: "nhsuk-radios--inline", - fieldset: { - legend: { - text: "Which vaccines do you want to add?", - size: "l", - isPageHeading: true - } - }, - items: items - }) }} - - {{ button({ - text: "Confirm" - }) }} -
      - -
      -
      -{% endblock %} diff --git a/app/views/support/organisations/change-region.html b/app/views/support/organisations/change-region.html deleted file mode 100644 index b51a393a..00000000 --- a/app/views/support/organisations/change-region.html +++ /dev/null @@ -1,56 +0,0 @@ -{% extends 'layout.html' %} - -{% set pageName = "Change region" %} - -{% block beforeContent %} - {{ backLink({ - href: "/support/organisations/" + organisation.id, - text: "Back" - }) }} -{% endblock %} - -{% set currentSection = "organisations" %} -postcode: - -{% block content %} -
      -
      - -
      {{ organisation.name }}
      - -
      - - {% set items = [] %} - - {% for region in data.regions %} - {% set items = (items.push({ - text: region.name, - value: region.id - }), items) %} - {% endfor %} - - {{ radios({ - idPrefix: "region", - name: "region", - fieldset: { - legend: { - text: pageName, - size: "l", - isPageHeading: true - } - }, - value: organisation.region, - items: items - }) }} - - - {{ button({ - text: "Save" - }) }} -
      - -
      -
      - -{% endblock %} - diff --git a/app/views/support/organisations/feature-flag.html b/app/views/support/organisations/feature-flag.html deleted file mode 100644 index fb829a1e..00000000 --- a/app/views/support/organisations/feature-flag.html +++ /dev/null @@ -1,55 +0,0 @@ -{% extends 'layout.html' %} - -{% set pageName = organisation.name %} - -{% block beforeContent %} - {{ backLink({ - href: "/support/organisations/" + organisation.id, - text: "Back" - }) }} -{% endblock %} - -{% set currentSection = "organisations" %} -postcode: - -{% block content %} -
      -
      - -
      {{ organisation.name }}
      - -
      - - {{ radios({ - idPrefix: "feature-flag", - name: "featureFlagStatus", - fieldset: { - legend: { - text: featureFlag.name, - size: "l", - isPageHeading: true - } - }, - value: (organisation.featureFlags[featureFlag.id] if organisation.featureFlags[featureFlag.id] else "off"), - items: [ - { - value: "on", - text: "On" - }, - { - value: "off", - text: "Off" - } - ] - }) }} - - {{ button({ - text: "Save" - }) }} -
      - -
      -
      - -{% endblock %} - diff --git a/app/views/support/organisations/show.html b/app/views/support/organisations/show.html deleted file mode 100644 index 505fbb89..00000000 --- a/app/views/support/organisations/show.html +++ /dev/null @@ -1,212 +0,0 @@ -{% extends 'layout.html' %} - -{% set pageName = organisation.name %} - -{% block beforeContent %} - {{ backLink({ - href: "/support/organisations", - text: "Back" - }) }} -{% endblock %} - -{% set currentSection = "organisations" %} -postcode: - -{% set region = data.regions | findById(organisation.region) %} - -{% block content %} -
      -
      - -

      {{ pageName }}

      - - {{ summaryList({ - rows: [ - { - key: { - text: "ODS code", - classes: "nhsuk-u-font-weight-normal" - }, - value: { - html: organisation.id - }, - actions: { - items: [] - } - }, - { - key: { - text: "Name", - classes: "nhsuk-u-font-weight-normal" - }, - value: { - text: organisation.name - }, - actions: { - items: [ - { - href: "/support/organisations/" + organisation.id + "/update-details", - text: "Update", - visuallyHiddenText: "name" - } - ] - } - }, - { - key: { - text: "Region", - classes: "nhsuk-u-font-weight-normal" - }, - value: { - html: "" + region.name + "" - } if region, - actions: { - items: [ - { - href: "/support/organisations/" + organisation.id + "/change-region", - text: "Change", - visuallyHiddenText: "region" - } - ] - } - },{ - key: { - text: "Vaccines enabled", - classes: "nhsuk-u-font-weight-normal" - }, - value: { - html: (vaccinesEnabled | sort(false, false, "name") | pluck("name") | formatList) - }, - actions: { - items: [ - { - href: "/support/organisations/" + organisation.id + "/add-vaccines", - text: "Add", - visuallyHiddenText: "vaccines" - } - ] - } if ((vaccinesEnabled | length) != (data.vaccines | length)) - } - ] - }) }} - -

      Beta features enabled

      - - {% set recordInterface %} - {{ tag({ - text: ("On" if organisation.featureFlags.newRecordInterface == "on" else "Off"), - classes: ("nhsuk-tag--green" if organisation.featureFlags.newRecordInterface == "on" else "nhsuk-tag--red") - }) }} - {% endset %} - - {% set paymentIntegration %} - {{ tag({ - text: ("On" if organisation.featureFlags.paymentIntegration == "on" else "Off"), - classes: ("nhsuk-tag--green" if organisation.featureFlags.paymentIntegration == "on" else "nhsuk-tag--red") - }) }} - {% endset %} - - {{ summaryList({ - rows: [ - { - key: { - text: "New streamlined Record interface", - classes: "nhsuk-u-font-weight-normal" - }, - value: { - html: recordInterface - }, - actions: { - items: [ - { - href: "/support/organisations/" + organisation.id + "/feature-flag?featureFlag=newRecordInterface", - text: "Change", - visuallyHiddenText: "name" - } - ] - } - }, - { - key: { - text: "BSA Payment API integration", - classes: "nhsuk-u-font-weight-normal" - }, - value: { - html: paymentIntegration - }, - actions: { - items: [ - { - href: "/support/organisations/" + organisation.id + "/feature-flag?flag=paymentIntegration", - text: "Change", - visuallyHiddenText: "date of birth" - } - ] - } - } - ] - }) }} - -

      Users

      - - {{ button({ - text: "Add user", - href: "/support/organisations/" + organisation.id + "/add-user" - }) }} - -
      -
      -
      -
      - - - {% if (users | length) > 0 %} - - - - - - - - - - - - - {% for user in (users | sort(false, false, "name") ) %} - - {% set userOrganisationSettings = (user.organisations | findById(organisation.id)) %} - - - - - - - - {% endfor %} - -
      - Name - - Permission level - - Vaccinator - - Status -
      - {{ user.firstName }} {{ user.lastName }} - - {{ userOrganisationSettings.permissionLevel }} - - {{ "Yes" if userOrganisationSettings.vaccinator else "No" }} - - {{ userOrganisationSettings.status }} - -
      - {% endif %} - -
      -
      - -{% endblock %} - diff --git a/app/views/support/organisations/update-details.html b/app/views/support/organisations/update-details.html deleted file mode 100644 index ffda4d36..00000000 --- a/app/views/support/organisations/update-details.html +++ /dev/null @@ -1,37 +0,0 @@ -{% extends 'layout.html' %} - -{% set pageName = "Update details from ODS" %} - -{% block beforeContent %} - {{ backLink({ - href: "/support/organisations/" + organisation.id, - text: "Back" - }) }} -{% endblock %} - -{% set currentSection = "organisations" %} -postcode: - -{% block content %} -
      -
      - -
      {{ organisation.name }}
      -

      {{ pageName }}

      - -
      - -

      Organisations can update their details in the NHS Organisation Data Service (ODS).

      - -

      If these details have recently been updated, you can sync them back to our service.

      - - {{ button({ - text: "Sync organisation details from ODS" - }) }} -
      - -
      -
      - -{% endblock %} - diff --git a/app/views/support/region.html b/app/views/support/region.html deleted file mode 100644 index 80667f1f..00000000 --- a/app/views/support/region.html +++ /dev/null @@ -1,113 +0,0 @@ -{% extends 'layout.html' %} - -{% set pageName = region.name %} - -{% block beforeContent %} - {{ breadcrumb({ - items: [ - { - href: "/support/regions", - text: "Regions" - } - ] - }) }} -{% endblock %} - -{% set currentSection = "regions" %} -postcode: - -{% block content %} -
      -
      - -

      {{ pageName }}

      - - -

      Users

      - - {% if (users | length) > 0 %} - - - - - - - - - - - {% for user in (users | sort(false, false, "name") ) %} - - {% set userRegionSettings = (user.regions | findById(region.id)) %} - - - - - - - {% endfor %} - -
      - Name - - Email - - Status -
      - {{ user.firstName }} {{ user.lastName }} - - {{ user.email }} - - {{ userRegionSettings.status }} - -
      - {% endif %} - - {{ button({ - text: "Add user", - href: "/support/regions/" + region.id + "/add-user" - }) }} - -
      -
      -
      -
      - -

      Organisations

      - - - - - - - - - - - {% for organisation in (organisations | sort(false, true)) %} - - - - - - {% endfor %} - -
      - Name - - Users - - Vaccinations -
      - - {{ organisation.name }} - - 1033,304
      - - - -
      -
      - -{% endblock %} - diff --git a/app/views/support/regions.html b/app/views/support/regions.html deleted file mode 100644 index 31664b6e..00000000 --- a/app/views/support/regions.html +++ /dev/null @@ -1,24 +0,0 @@ -{% extends 'layout.html' %} - -{% set pageName = "Regions" %} - -{% set currentSection = "regions" %} -postcode: - -{% block content %} -
      -
      - -

      {{ pageName }}

      - -
        - {% for region in (regions | sort(false, true, "name")) %} -
      • {{ region.name }}
      • - {% endfor %} -
      - -
      -
      - -{% endblock %} - diff --git a/app/views/support/regions/add-user.html b/app/views/support/regions/add-user.html deleted file mode 100644 index ff0d84d7..00000000 --- a/app/views/support/regions/add-user.html +++ /dev/null @@ -1,68 +0,0 @@ -{% extends 'layout.html' %} - -{% set pageName = region.name %} - -{% block beforeContent %} -{{ breadcrumb({ - items: [ - { - href: "/support/regions", - text: "Regions" - }, - { - href: "/support/regions/" + region.id, - text: region.name - } - ] -}) }} -{% endblock %} - -{% set currentSection = "regions" %} -postcode: - -{% block content %} -
      -
      - -
      {{ region.name }}
      -

      Add user

      - -
      - - {{ input({ - label: { - text: "First name" - }, - id: "first-name", - name: "firstName", - classes: "nhsuk-input--width-20" - }) }} - - {{ input({ - label: { - text: "Last name" - }, - id: "last-name", - name: "lastName", - classes: "nhsuk-input--width-20" - }) }} - - {{ input({ - label: { - text: "NHS email address" - }, - id: "email", - name: "email", - type: "email" - }) }} - - {{ button({ - text: "Save" - }) }} -
      - -
      -
      - -{% endblock %} - diff --git a/app/views/support/users.html b/app/views/support/users.html deleted file mode 100644 index 61a7a16d..00000000 --- a/app/views/support/users.html +++ /dev/null @@ -1,103 +0,0 @@ -{% extends 'layout.html' %} - -{% set pageName = "Users" %} - -{% set currentSection = "users" %} -postcode: - -{% block content %} -
      -
      - -

      {{ pageName }}

      - -
      -
      -
      - - - - {{ button({ - text: "Search", - classes: "nhsuk-button--secondary nhsuk-u-margin-left-2 nhsuk-button--small" - })}} -
      -
      -
      - - - - - - - - - - - - {% for user in users %} - - - - - - - {% endfor %} - -
      - Name - - Email - - Organisation -
      - {{ user.firstName }} {{ user.lastName }} - - {{ user.email }} - - {% for organisation in user.organisations %} - {{ (data.organisations | findById(organisation.id)).name }}
      - {% endfor %} -
      - -
      - - {% set items = [] %} - - {% set ellipsisAdded = false %} - {% for i in range(1, totalPages + 1) -%} - {% if i == 1 or i == (page -1) or (i == page) or (i == page + 1) or (i == totalPages) %} - {% set items = (items.push({ - number: i, - href: "/support/users?page=" + i + "&q=" + (q if q else ""), - current: (i === page) - }), items) %} - {% set ellipsisAdded = false %} - {% elif ellipsisAdded == false %} - {% set items = (items.push({ - ellipsis: true - }), items) %} - {% set ellipsisAdded = true %} - {% endif %} - {%- endfor %} - - - {% if totalPages > 1 %} - {{ pagination({ - previous: { - href: "/support/users?page=" + (page - 1) + "&q=" + (q if q else "") - } if page != 1, - next: { - href: "/support/users?page=" + (page + 1) + "&q=" + (q if q else "") - } if page != totalPages, - items: items - }) }} - {% endif %} - -
      -
      - -{% endblock %} - diff --git a/app/views/support/users/edit-organisation.html b/app/views/support/users/edit-organisation.html deleted file mode 100644 index c963e0c7..00000000 --- a/app/views/support/users/edit-organisation.html +++ /dev/null @@ -1,123 +0,0 @@ -{% extends 'layout.html' %} - -{% set pageName = "Edit user permissions" %} - -{% block beforeContent %} - {{ breadcrumb({ - items: [ - { - href: "/support/users", - text: "Users" - }, - { - href: "/support/users/" + user.id, - text: user.firstName + " " + user.lastName - } - ] - }) }} -{% endblock %} - -{% set currentSection = "users" %} -postcode: - -{% block content %} -
      -
      - -
      {{ user.firstName }} {{ user.lastName }}
      -

      {{ organisation.name }}

      - -
      - - {% set vaccinatorStatus = ("yes" if userOrganisationSettings.vaccinator else "no") %} - - {{ radios({ - "name": "vaccinator", - "fieldset": { - "legend": { - "text": "Are they a vaccinator?" - } - }, - hint: { - text: "Vaccination records include the name of the person who gave the vaccination" - }, - value: vaccinatorStatus, - "items": [ - { - "value": "yes", - "text": "Yes" - }, - { - "value": "no", - "text": "No" - } - ] - }) }} - - - {{ radios({ - "name": "permissionLevel", - "fieldset": { - "legend": { - "text": "Permission level", - classes: "nhsuk-fieldset__legend--m" - } - }, - value: userOrganisationSettings.permissionLevel, - "items": [ - { - "value": "Recorder", - "text": "Recorder", - "hint": { - "text": "Record vaccinations only" - } - }, - { - "value": "Administrator", - "text": "Administrator", - "hint": { - "text": "Record vaccinations, create reports and manage vaccines" - } - }, - { - "value": "Lead administrator", - "text": "Lead administrator", - "hint": { - "text": "Record vaccinations, create reports, manage vaccines and users" - } - } - ] - }) }} - - {{ radios({ - name: "status", - fieldset: { - legend: { - text: "Status", - classes: "nhsuk-fieldset__legend--m" - } - }, - value: userOrganisationSettings.status, - items: [ - { - value: "Active", - text: "Active" - }, - { - "value": "Deactivated", - "text": "Deactivated" - } - ] - }) }} - - - {{ button({ - "text": "Save" - }) }} -
      - -
      -
      - - -{% endblock %} diff --git a/app/views/support/users/edit-region.html b/app/views/support/users/edit-region.html deleted file mode 100644 index bfbf8fef..00000000 --- a/app/views/support/users/edit-region.html +++ /dev/null @@ -1,55 +0,0 @@ -{% extends 'layout.html' %} - -{% set pageName = "User" %} - -{% block beforeContent %} - {{ backLink({ - href: "/support/users/" + user.id, - text: "Back" - }) }} -{% endblock %} - -{% set currentSection = "regions" %} -postcode: - -{% block content %} -
      -
      - -
      {{ user.firstName }} {{ user.lastName }}
      -

      {{ region.name }}

      - -
      - - {{ radios({ - name: "status", - fieldset: { - legend: { - text: "Status", - classes: "nhsuk-fieldset__legend--s" - } - }, - value: userRegionSettings.status, - items: [ - { - value: "Active", - text: "Active" - }, - { - "value": "Deactivated", - "text": "Deactivated" - } - ] - }) }} - - - {{ button({ - "text": "Save" - }) }} -
      - -
      -
      - - -{% endblock %} diff --git a/app/views/support/users/show.html b/app/views/support/users/show.html deleted file mode 100644 index 24edd6a8..00000000 --- a/app/views/support/users/show.html +++ /dev/null @@ -1,165 +0,0 @@ -{% extends 'layout.html' %} - -{% set pageName = user.firstName + " " + user.lastName %} - -{% block beforeContent %} - {{ breadcrumb({ - items: [ - { - href: "/support/users", - text: "Users" - } - ] - }) }} -{% endblock %} - -{% set currentSection = "users" %} -postcode: - -{% block content %} -
      -
      - -

      {{ pageName }}

      - - {{ summaryList({ - rows: [ - { - key: { - text: "Name", - classes: "nhsuk-u-font-weight-normal" - }, - value: { - html: user.firstName + " " + user.lastName - } - }, - { - key: { - text: "Email", - classes: "nhsuk-u-font-weight-normal" - }, - value: { - html: user.email - } - }, - { - key: { - text: "Account created", - classes: "nhsuk-u-font-weight-normal" - }, - value: { - html: "2024-09-13T13:45" | govukDateTime - } - }, - { - key: { - text: "Last signed in", - classes: "nhsuk-u-font-weight-normal" - }, - value: { - html: "2025-02-18T15:17" | govukDateTime - } - } - ] - }) }} - - {% if (user.regions | length) > 0 %} - -

      {{ (user.regions | length) | plural("Region", showNumber = false) }}

      - - - - - - - - - - - - - {% for region in (user.regions | sort(false, false, "name") ) %} - - - - - - {% endfor %} - -
      - Name - - Status -
      - {{ (data.regions | findById(region.id)).name }} - - {{ region.status }} - - Change - status for {{ region.name }} - -
      - - {% endif %} - - - {% if (user.organisations | length) > 0 %} - -

      Organisations

      - -
      -
      -
      -
      - - - - - - - - - - - - - - {% for organisation in (user.organisations | sort(false, false, "name") ) %} - - - - - - - - {% endfor %} - -
      - Name - - Permission level - - Vaccinator - - Status -
      - {{ (data.organisations | findById(organisation.id)).name }} - - {{ organisation.permissionLevel }} - - {{ "Yes" if organisation.vaccinator else "No" }} - - {{ organisation.status }} - - Change - settings for {{ organisation.name }} - -
      - - {% endif %} - -
      -
      - -{% endblock %} - From 884344f14ac6c5c1d5c3f850e9bbc6f62f1f0427 Mon Sep 17 00:00:00 2001 From: Caitlin Roach Date: Mon, 24 Aug 2026 13:32:47 +0100 Subject: [PATCH 10/15] First round of cards added to index --- app/views/index.html | 496 +++++++++++++++++++++++++++++-------------- package-lock.json | 278 ++++++++++++------------ package.json | 6 +- 3 files changed, 483 insertions(+), 297 deletions(-) diff --git a/app/views/index.html b/app/views/index.html index 67c4b3a9..4f3ed0e7 100755 --- a/app/views/index.html +++ b/app/views/index.html @@ -23,182 +23,368 @@ {% block content %} -
      -
      - -

      - Prototype -

      - -

      Prototype setup

      - -

      Use a preset to quickly start with a specific scenario, or set up a custom configuration. Presets reset all session data before applying.

      - - {% set presetsTableHtml %} - {% set enableEmailPrefill = false %} - {% include "includes/_preset-scenarios-table.html" %} - {% endset %} - - {% set customConfigHtml %} - - {% endset %} - - {% set presetsTabHtml %} -

      Start with one of the predefined test setups.

      - {{ presetsTableHtml | safe }} - {% endset %} - - {% set customTabHtml %} -

      Build your own scenario with specific settings.

      - {{ customConfigHtml | safe }} - {% endset %} - - {{ tabs({ - items: [ - { - label: "Preset scenarios", - id: "preset-scenarios", - panel: { - html: presetsTabHtml - } - }, - { - label: "Custom configuration", - id: "custom-configuration", - panel: { - html: customTabHtml - } - } - ] - }) }} - -
      - -

      Signed-out interface

      - -

      Product page

      - -

      Email invite

      - -

      Main interface

      - -

      Quick access links below apply the Pharmacy lead admin preset first, so you can open these pages without manually signing in.

      +
      +
      + +

      + Prototype +

      + +

      Prototype setup

      + +

      Use a preset to quickly start with a specific scenario, or set up a custom configuration. Presets reset all + session data before applying.

      + + {% set presetsTableHtml %} + {% set enableEmailPrefill = false %} + {% include "includes/_preset-scenarios-table.html" %} + {% endset %} + + {% set customConfigHtml %} + + {% endset %} + + {% set presetsTabHtml %} +

      Start with one of the predefined test setups.

      + {{ presetsTableHtml | safe }} + {% endset %} + + {% set customTabHtml %} +

      Build your own scenario with specific settings.

      + {{ customConfigHtml | safe }} + {% endset %} + + {{ tabs({ + items: [ + { + label: "Preset scenarios", + id: "preset-scenarios", + panel: { + html: presetsTabHtml + } + }, + { + label: "Custom configuration", + id: "custom-configuration", + panel: { + html: customTabHtml + } + } + ] + }) }} + +
      + +

      Signed-out interface

      + +
        +
      • + {{ card({ + heading: { + text: "Product page", + size: "m" + }, + description: "This is the page that users land on when navigate to RAVS while not signed in.", + href: "/product-page", + clickable: true, + variant: "primary" + }) }} +
      • +
      • + {{ card({ + heading: { + text: "Email invite", + size: "m" + }, + description: "This is an example email template.", + href: "/email-invite", + clickable: true, + variant: "primary" + }) }} +
      • +
      + +
      + +

      Main interface

      + +

      Quick access links below apply the Pharmacy lead admin preset first, so you can open these pages without manually + signing in.

      + +
        +
      • + {{ card({ + heading: { + text: "Record vaccinations", + size: "m" + }, + description: "This is the page that users land on when they navigate to RAVS to record vaccinations. When a user logs in, this is the page they are taken to.", + href: "/prototype-setup/quick-access/pharmacy?next=/record-vaccinations", + clickable: true, + variant: "primary" + }) }} +
      • +
      • + {{ card({ + heading: { + text: "Dashboard", + size: "m" + }, + description: "This the dashboard page. It shows information about the vaccinations a site has given.", + href: "/prototype-setup/quick-access/pharmacy?next=/home", + clickable: true, + variant: "primary" + }) }} +
      • +
      • + {{ card({ + heading: { + text: "Records", + size: "m" + }, + description: "This is the records page. It allows users to find individual records of past vaccinations.", + href: "/prototype-setup/quick-access/pharmacy?next=/records", + clickable: true, + variant: "primary" + }) }} +
      • +
      • + {{ card({ + heading: { + text: "Reports", + size: "m" + }, + description: "This is the reports page. It allows users to generate and view reports of past vaccinations.", + href: "/prototype-setup/quick-access/pharmacy?next=/reports", + clickable: true, + variant: "primary" + }) }} +
      • +
      • + {{ card({ + heading: { + text: "Vaccines", + size: "m" + }, + description: "This is the vaccines page. It allows users to view and manage vaccines.", + href: "/prototype-setup/quick-access/pharmacy?next=/vaccines", + clickable: true, + variant: "primary" + }) }} +
      • +
      • + {{ card({ + heading: { + text: "Manage users", + size: "m" + }, + description: "This is the manage users page. It allows users to manage user accounts.", + href: "/prototype-setup/quick-access/pharmacy?next=/user-admin", + clickable: true, + variant: "primary" + }) }} +
      • +
      • + {{ card({ + heading: { + text: "Profile page", + size: "m" + }, + description: "This is the profile page. It allows users to view and manage their profile.", + href: "/prototype-setup/quick-access/pharmacy?next=/user-profile", + clickable: true, + variant: "primary" + }) }} +
      • +
      + +
      + +

      Special circumstances

      + +
        +
      • + {{ card({ + heading: { + text: "Deceased patient history", + size: "m" + }, + description: "This shows what users will see if they access a patient history for a patient who is recorded as deceased", + href: "/prototype-setup/quick-access/pharmacy?next=/record-vaccinations/patient-history-deceased", + clickable: true, + variant: "primary" + }) }} +
      • +
      + +
      + +

      GP scenarios

      + +
        +
      • + {{ card({ + heading: { + text: "Record vaccinations (in PCN)", + size: "m" + }, + description: "Add a description", + href: "/prototype-setup/quick-access/gp?next=/record-vaccinations?gpit=inPCN", + clickable: true, + variant: "primary" + }) }} +
      • +
      • + {{ card({ + heading: { + text: "Record vaccinations (not in PCN)", + size: "m" + }, + description: "Add a description", + href: "/prototype-setup/quick-access/gp?next=/record-vaccinations?gpit=notInPCN", + clickable: true, + variant: "primary" + }) }} +
      • +
      • + {{ card({ + heading: { + text: "Record vaccinations (no GP surgery)", + size: "m" + }, + description: "Add a description", + href: "/prototype-setup/quick-access/gp?next=/record-vaccinations?gpit=noGP", + clickable: true, + variant: "primary" + }) }} +
      • +
      • + {{ card({ + heading: { + text: "Patient details - no NHS number and no GP surgery", + size: "m" + }, + description: "Add a description", + href: "/record-vaccinations/patient-history-none?gpit=noGP", + clickable: true, + variant: "primary" + }) }} +
      • +
      + +
      + +

      Regions interface

      + +
        +
      • + {{ card({ + heading: { + text: "Regions interface", + size: "m" + }, + description: "This interface is used by regional administrators to manage vaccines, users and organisations.", + href: "/prototype-setup/quick-access/regions?next=/regions", + clickable: true, + variant: "primary" + }) }} +
      • +
      + +
      + +

      Error pages

      - - -

      Special circumstances

      - - - -

      GP scenarios

      - - -

      Regions interface

      - - - -

      Error pages

      - - - -

      Messaging

      + + +

      Messaging

      +
    • Notification (Reports)
    • +
    • Notification (Vaccines)
    • +
    • Feedback
    • +
    -

    Warning messages

    +

    Warning messages

    -

    COVID-19

    +

    COVID-19

    - + -

    flu

    +

    Flu

    - + -

    RSV

    +

    RSV

    - + -

    Pertussis

    +

    Pertussis

    - + -

    Pneumococcal London service

    + -

    MMR London service

    +

    MMR London service

    - + -

    MenB

    +

    MenB

    - + -
    -{% endblock %} +
    +{% endblock %} \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 3e30fc60..ce6c4f81 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,8 +10,8 @@ "@x-govuk/govuk-prototype-components": "^6.0.0", "@x-govuk/govuk-prototype-filters": "^2.1.0", "accessible-autocomplete": "^3.0.1", - "nhsuk-frontend": "10.5.2", - "nhsuk-prototype-kit": "^8.3.0" + "nhsuk-frontend": "^10.6.0", + "nhsuk-prototype-kit": "^8.4.0" }, "devDependencies": { "@typescript-eslint/eslint-plugin": "^8.67.0", @@ -63,9 +63,9 @@ } }, "node_modules/@esbuild/aix-ppc64": { - "version": "0.28.0", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.28.0.tgz", - "integrity": "sha512-lhRUCeuOyJQURhTxl4WkpFTjIsbDayJHih5kZC1giwE+MhIzAb7mEsQMqMf18rHLsrb5qI1tafG20mLxEWcWlA==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.28.2.tgz", + "integrity": "sha512-XExcO+dvLKvVtNTibSTBej1NCAbaGhWn9Ww1ZPx80qsahhPFe/8jgWP0IchNe0F3HwkU7n8ejhH8bjonqht8mQ==", "cpu": [ "ppc64" ], @@ -79,9 +79,9 @@ } }, "node_modules/@esbuild/android-arm": { - "version": "0.28.0", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.28.0.tgz", - "integrity": "sha512-wqh0ByljabXLKHeWXYLqoJ5jKC4XBaw6Hk08OfMrCRd2nP2ZQ5eleDZC41XHyCNgktBGYMbqnrJKq/K/lzPMSQ==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.28.2.tgz", + "integrity": "sha512-kXXoiPVVGQcnIYGOeaovwOURpniDBpSq4A03qkQ+BMQqtGG6HYap3xne9C1O1yo4TR3qxlCX5IqqmX6fFo2Lqg==", "cpu": [ "arm" ], @@ -95,9 +95,9 @@ } }, "node_modules/@esbuild/android-arm64": { - "version": "0.28.0", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.28.0.tgz", - "integrity": "sha512-+WzIXQOSaGs33tLEgYPYe/yQHf0WTU0X42Jca3y8NWMbUVhp7rUnw+vAsRC/QiDrdD31IszMrZy+qwPOPjd+rw==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.28.2.tgz", + "integrity": "sha512-5YfKeeI8qWfBZIX+u2xZC3Zlb3Os/gLS2sbEKM+I4ZOcsWmHS2WLysCcQZDAFRslDUU5Oiq44gf6PYN1vGwG5A==", "cpu": [ "arm64" ], @@ -111,9 +111,9 @@ } }, "node_modules/@esbuild/android-x64": { - "version": "0.28.0", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.28.0.tgz", - "integrity": "sha512-+VJggoaKhk2VNNqVL7f6S189UzShHC/mR9EE8rDdSkdpN0KflSwWY/gWjDrNxxisg8Fp1ZCD9jLMo4m0OUfeUA==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.28.2.tgz", + "integrity": "sha512-O387ite7SzUyCcy3JQX4P4bLtEA7bLLkx+esve5JHnyYfNTxcVpXZo9jhdB0lTKN44gztELTdU7nS8Nr16Fs1Q==", "cpu": [ "x64" ], @@ -127,9 +127,9 @@ } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.28.0", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.28.0.tgz", - "integrity": "sha512-0T+A9WZm+bZ84nZBtk1ckYsOvyA3x7e2Acj1KdVfV4/2tdG4fzUp91YHx+GArWLtwqp77pBXVCPn2We7Letr0Q==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.28.2.tgz", + "integrity": "sha512-n4KqkOQrraxHJcgjM1RvwbigfQKIKJVpM7xp+KsxiyUSrRdIXnt73VhrPAx0fV44hgfmIVKjxMN9J1t5jySVkw==", "cpu": [ "arm64" ], @@ -143,9 +143,9 @@ } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.28.0", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.28.0.tgz", - "integrity": "sha512-fyzLm/DLDl/84OCfp2f/XQ4flmORsjU7VKt8HLjvIXChJoFFOIL6pLJPH4Yhd1n1gGFF9mPwtlN5Wf82DZs+LQ==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.28.2.tgz", + "integrity": "sha512-uq6suIWYP37qzGddBKPw5QEQPi6HiLGsO7UmkpfyaYNQ3D+rN6w6WfwH+nuqcGXWvawGwxOEroO4YGnFh95azw==", "cpu": [ "x64" ], @@ -159,9 +159,9 @@ } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.28.0", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.28.0.tgz", - "integrity": "sha512-l9GeW5UZBT9k9brBYI+0WDffcRxgHQD8ShN2Ur4xWq/NFzUKm3k5lsH4PdaRgb2w7mI9u61nr2gI2mLI27Nh3Q==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.28.2.tgz", + "integrity": "sha512-n+I0BTSRIoy+d6RPKnEVwql5UwBJolytvY4mAOIEJorKlqgPII8ix6slVVrfZ5Tnj7glIZvloylbB/EJPMWEXw==", "cpu": [ "arm64" ], @@ -175,9 +175,9 @@ } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.28.0", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.28.0.tgz", - "integrity": "sha512-BXoQai/A0wPO6Es3yFJ7APCiKGc1tdAEOgeTNy3SsB491S3aHn4S4r3e976eUnPdU+NbdtmBuLncYir2tMU9Nw==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.28.2.tgz", + "integrity": "sha512-78XJTJkvPs0kz2w61301PJjXl4g7q3JqiYMZ/M/yVI73EHBrCRTgkhu9oqG7vPqq+a/yadEW8aD+agKlk5xrmg==", "cpu": [ "x64" ], @@ -191,9 +191,9 @@ } }, "node_modules/@esbuild/linux-arm": { - "version": "0.28.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.28.0.tgz", - "integrity": "sha512-CjaaREJagqJp7iTaNQjjidaNbCKYcd4IDkzbwwxtSvjI7NZm79qiHc8HqciMddQ6CKvJT6aBd8lO9kN/ZudLlw==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.28.2.tgz", + "integrity": "sha512-XlDnu2q5yoqems+xay6wSAcg9DDD7K9RLKZEBOMZm3ckNpJBvOX20tSfby8KfrrhINDyv9V2YVZKY/SpoGJI8w==", "cpu": [ "arm" ], @@ -207,9 +207,9 @@ } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.28.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.28.0.tgz", - "integrity": "sha512-RVyzfb3FWsGA55n6WY0MEIEPURL1FcbhFE6BffZEMEekfCzCIMtB5yyDcFnVbTnwk+CLAgTujmV/Lgvih56W+A==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.28.2.tgz", + "integrity": "sha512-pW4AC0P3it8c7do9MVM4p51FzHzdM/TZrerurgRcHJ2WTa1VQ1CIq18xncfpBJw4ojkiZZrKW2yIBWBP92j6Ug==", "cpu": [ "arm64" ], @@ -223,9 +223,9 @@ } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.28.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.28.0.tgz", - "integrity": "sha512-KBnSTt1kxl9x70q+ydterVdl+Cn0H18ngRMRCEQfrbqdUuntQQ0LoMZv47uB97NljZFzY6HcfqEZ2SAyIUTQBQ==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.28.2.tgz", + "integrity": "sha512-CYbnj78HsIeA+DhgUKgFCfvNsTHFhMMrinUrMZpDXJXKN8T3XViTZ/+wtHeVxEWY8ewSzTFN+nRmSwO2tZaLUQ==", "cpu": [ "ia32" ], @@ -239,9 +239,9 @@ } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.28.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.28.0.tgz", - "integrity": "sha512-zpSlUce1mnxzgBADvxKXX5sl8aYQHo2ezvMNI8I0lbblJtp8V4odlm3Yzlj7gPyt3T8ReksE6bK+pT3WD+aJRg==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.28.2.tgz", + "integrity": "sha512-buwkd8nsph4R+ajRvw0qM5Hja/TXQow3ptzWO2EbG/cqcIkHloRrdlBtQlshyYGTNFvfkfJ5tpPLVkY4DtsPfQ==", "cpu": [ "loong64" ], @@ -255,9 +255,9 @@ } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.28.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.28.0.tgz", - "integrity": "sha512-2jIfP6mmjkdmeTlsX/9vmdmhBmKADrWqN7zcdtHIeNSCH1SqIoNI63cYsjQR8J+wGa4Y5izRcSHSm8K3QWmk3w==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.28.2.tgz", + "integrity": "sha512-ZVykbDyk7519VwiNb9Lcj9m8XM6v5V9uKPvrEMkkEedVewf+0itkhahp4HDpgERXhwLRpWFypsGbG/J8s0QjJA==", "cpu": [ "mips64el" ], @@ -271,9 +271,9 @@ } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.28.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.28.0.tgz", - "integrity": "sha512-bc0FE9wWeC0WBm49IQMPSPILRocGTQt3j5KPCA8os6VprfuJ7KD+5PzESSrJ6GmPIPJK965ZJHTUlSA6GNYEhg==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.28.2.tgz", + "integrity": "sha512-CAXl+Dtd9UUuJd8pKKdwh6MLm3MUMiqMPmhZ3tTSXPqfyQ3vDl6R5hZdZ/kYojK4ofXtdfSv1tFq8XzWx3heNQ==", "cpu": [ "ppc64" ], @@ -287,9 +287,9 @@ } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.28.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.28.0.tgz", - "integrity": "sha512-SQPZOwoTTT/HXFXQJG/vBX8sOFagGqvZyXcgLA3NhIqcBv1BJU1d46c0rGcrij2B56Z2rNiSLaZOYW5cUk7yLQ==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.28.2.tgz", + "integrity": "sha512-GeXCej4IQtU1B+QlDV8W/RRvbzI3O/Stss+/bCXv4lZls5WGRtu2a+3JkA3i4qIUlMXpcHebWpF8AkJhATowuA==", "cpu": [ "riscv64" ], @@ -303,9 +303,9 @@ } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.28.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.28.0.tgz", - "integrity": "sha512-SCfR0HN8CEEjnYnySJTd2cw0k9OHB/YFzt5zgJEwa+wL/T/raGWYMBqwDNAC6dqFKmJYZoQBRfHjgwLHGSrn3Q==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.28.2.tgz", + "integrity": "sha512-3H1weTYZPxt/WOhByszQZybS9w5lKzUn1FDMsgEChbHWQwHYQQRfBxgCcZvPhjHfKyJjIievvMmEUawJrdY9Dg==", "cpu": [ "s390x" ], @@ -319,9 +319,9 @@ } }, "node_modules/@esbuild/linux-x64": { - "version": "0.28.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.28.0.tgz", - "integrity": "sha512-us0dSb9iFxIi8srnpl931Nvs65it/Jd2a2K3qs7fz2WfGPHqzfzZTfec7oxZJRNPXPnNYZtanmRc4AL/JwVzHQ==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.28.2.tgz", + "integrity": "sha512-4xTZr1FUmSoQW4XIWmit3tzQrUTZM+N3P0XV8xROKYF50XfI7xeO90+1bZvNwxIufQ9hDQVRJH5YhgPVF8A/HQ==", "cpu": [ "x64" ], @@ -335,9 +335,9 @@ } }, "node_modules/@esbuild/netbsd-arm64": { - "version": "0.28.0", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.28.0.tgz", - "integrity": "sha512-CR/RYotgtCKwtftMwJlUU7xCVNg3lMYZ0RzTmAHSfLCXw3NtZtNpswLEj/Kkf6kEL3Gw+BpOekRX0BYCtklhUw==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.28.2.tgz", + "integrity": "sha512-sSATRjPeDBg3pdgHoQfoYBob11Kk1FGa9lui5RIHZCoCkJa9QKlvl3/vKz2usCmYYjs7ymJR/2Nnsqe+Hjt5nw==", "cpu": [ "arm64" ], @@ -351,9 +351,9 @@ } }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.28.0", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.28.0.tgz", - "integrity": "sha512-nU1yhmYutL+fQ71Kxnhg8uEOdC0pwEW9entHykTgEbna2pw2dkbFSMeqjjyHZoCmt8SBkOSvV+yNmm94aUrrqw==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.28.2.tgz", + "integrity": "sha512-lqnzCV+mM0gIADaKihiCg6ifgfU2L3h5E33rNQBN1Y4MaVGnzryzmvvf7UHxprpQdE8hpqLolJ9Rl+SkIRDpyw==", "cpu": [ "x64" ], @@ -367,9 +367,9 @@ } }, "node_modules/@esbuild/openbsd-arm64": { - "version": "0.28.0", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.28.0.tgz", - "integrity": "sha512-cXb5vApOsRsxsEl4mcZ1XY3D4DzcoMxR/nnc4IyqYs0rTI8ZKmW6kyyg+11Z8yvgMfAEldKzP7AdP64HnSC/6g==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.28.2.tgz", + "integrity": "sha512-AL2qJILH7lNjrDmCQDvdxMfAUIv8KMNZOvrwAQ8i8//ntL9FflhOyMJ8OZSMBb8/AWXe3/5v5S20y3zCoZWKoQ==", "cpu": [ "arm64" ], @@ -383,9 +383,9 @@ } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.28.0", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.28.0.tgz", - "integrity": "sha512-8wZM2qqtv9UP3mzy7HiGYNH/zjTA355mpeuA+859TyR+e+Tc08IHYpLJuMsfpDJwoLo1ikIJI8jC3GFjnRClzA==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.28.2.tgz", + "integrity": "sha512-QtiuPytchRyC4rwUKhexJdQKvDuZ6hWloi3igqPQNUJCS1/v9EiO3UTOXR6A3FoMo4fnAKbWJdqaIwhOzh8qEw==", "cpu": [ "x64" ], @@ -399,9 +399,9 @@ } }, "node_modules/@esbuild/openharmony-arm64": { - "version": "0.28.0", - "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.28.0.tgz", - "integrity": "sha512-FLGfyizszcef5C3YtoyQDACyg95+dndv79i2EekILBofh5wpCa1KuBqOWKrEHZg3zrL3t5ouE5jgr94vA+Wb2w==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.28.2.tgz", + "integrity": "sha512-WkhYDmpTjLvGlScA1rwjRUmhl4k8oXR3cIbtqWmELgU/dFeHHlEllxDvdWcNJV9rbzCexB5vz8gtNewWLgCT7Q==", "cpu": [ "arm64" ], @@ -415,9 +415,9 @@ } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.28.0", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.28.0.tgz", - "integrity": "sha512-1ZgjUoEdHZZl/YlV76TSCz9Hqj9h9YmMGAgAPYd+q4SicWNX3G5GCyx9uhQWSLcbvPW8Ni7lj4gDa1T40akdlw==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.28.2.tgz", + "integrity": "sha512-GPMSkTOtMnv2U2F8gxe4Io6qmVs+YKyp832Etqqxr0hFngmXQ3rzwytelm3GIn7T4VviRUlf3sOgBOiTdvaf7g==", "cpu": [ "x64" ], @@ -431,9 +431,9 @@ } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.28.0", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.28.0.tgz", - "integrity": "sha512-Q9StnDmQ/enxnpxCCLSg0oo4+34B9TdXpuyPeTedN/6+iXBJ4J+zwfQI28u/Jl40nOYAxGoNi7mFP40RUtkmUA==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.28.2.tgz", + "integrity": "sha512-PIhhEkE9uPBleRBrQEJpUn7MBnibZzbGzYWPmY3x+YoVg/95zbjB4CxPPOQ8l5tYYM4mMaCthF8/1DIfBQQyWQ==", "cpu": [ "arm64" ], @@ -447,9 +447,9 @@ } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.28.0", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.28.0.tgz", - "integrity": "sha512-zF3ag/gfiCe6U2iczcRzSYJKH1DCI+ByzSENHlM2FcDbEeo5Zd2C86Aq0tKUYAJJ1obRP84ymxIAksZUcdztHA==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.28.2.tgz", + "integrity": "sha512-YmJbfTlvU7Sdn9BB+4PRES4oB6pxgS37MAONj+hBr/cpXS1aBPKXxNnDbu+QCWPj0o9dgyxeq79g6c5P8KeuYA==", "cpu": [ "ia32" ], @@ -463,9 +463,9 @@ } }, "node_modules/@esbuild/win32-x64": { - "version": "0.28.0", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.28.0.tgz", - "integrity": "sha512-pEl1bO9mfAmIC+tW5btTmrKaujg3zGtUmWNdCw/xs70FBjwAL3o9OEKNHvNmnyylD6ubxUERiEhdsL0xBQ9efw==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.28.2.tgz", + "integrity": "sha512-5ebpxr3nWMzrL/rnUI755Jkuee0bHL/Gq0WTF9lvcpv73wAp5eu8MfBUgWK9bhWvZjj7yX8etf/8tI8Ney695g==", "cpu": [ "x64" ], @@ -2164,13 +2164,13 @@ } }, "node_modules/axios": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.18.0.tgz", - "integrity": "sha512-E32NzpYKp++W7XRe52rHiXV2ehxmh3wbdgO7MHeFM+vqxLBYHzt0ElkiImtOBxtOmyp0yoC8C6uESVV84Y2/hw==", + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.19.0.tgz", + "integrity": "sha512-ht/iuYZXEjFxLH/Hkezgd7m6JKlHHXEUSneaDz8uZe1Gj5QZtCnpyDsckvAiEnT89OEbCLmnte4R4sn7P0EKFw==", "license": "MIT", "dependencies": { "follow-redirects": "^1.16.0", - "form-data": "^4.0.5", + "form-data": "^4.0.6", "https-proxy-agent": "^5.0.1", "proxy-from-env": "^2.1.0" } @@ -3239,9 +3239,9 @@ } }, "node_modules/esbuild": { - "version": "0.28.0", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.28.0.tgz", - "integrity": "sha512-sNR9MHpXSUV/XB4zmsFKN+QgVG82Cc7+/aaxJ8Adi8hyOac+EXptIp45QBPaVyX3N70664wRbTcLTOemCAnyqw==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.28.2.tgz", + "integrity": "sha512-HKVLS8dvII+xoKW9kmqxbRKrnWEXfJJr/FZhhJmiqIB0e053QNYFqOBouTMO/k5sID4MvCiUCvv8b9M4h32wIA==", "hasInstallScript": true, "license": "MIT", "bin": { @@ -3251,38 +3251,38 @@ "node": ">=18" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.28.0", - "@esbuild/android-arm": "0.28.0", - "@esbuild/android-arm64": "0.28.0", - "@esbuild/android-x64": "0.28.0", - "@esbuild/darwin-arm64": "0.28.0", - "@esbuild/darwin-x64": "0.28.0", - "@esbuild/freebsd-arm64": "0.28.0", - "@esbuild/freebsd-x64": "0.28.0", - "@esbuild/linux-arm": "0.28.0", - "@esbuild/linux-arm64": "0.28.0", - "@esbuild/linux-ia32": "0.28.0", - "@esbuild/linux-loong64": "0.28.0", - "@esbuild/linux-mips64el": "0.28.0", - "@esbuild/linux-ppc64": "0.28.0", - "@esbuild/linux-riscv64": "0.28.0", - "@esbuild/linux-s390x": "0.28.0", - "@esbuild/linux-x64": "0.28.0", - "@esbuild/netbsd-arm64": "0.28.0", - "@esbuild/netbsd-x64": "0.28.0", - "@esbuild/openbsd-arm64": "0.28.0", - "@esbuild/openbsd-x64": "0.28.0", - "@esbuild/openharmony-arm64": "0.28.0", - "@esbuild/sunos-x64": "0.28.0", - "@esbuild/win32-arm64": "0.28.0", - "@esbuild/win32-ia32": "0.28.0", - "@esbuild/win32-x64": "0.28.0" + "@esbuild/aix-ppc64": "0.28.2", + "@esbuild/android-arm": "0.28.2", + "@esbuild/android-arm64": "0.28.2", + "@esbuild/android-x64": "0.28.2", + "@esbuild/darwin-arm64": "0.28.2", + "@esbuild/darwin-x64": "0.28.2", + "@esbuild/freebsd-arm64": "0.28.2", + "@esbuild/freebsd-x64": "0.28.2", + "@esbuild/linux-arm": "0.28.2", + "@esbuild/linux-arm64": "0.28.2", + "@esbuild/linux-ia32": "0.28.2", + "@esbuild/linux-loong64": "0.28.2", + "@esbuild/linux-mips64el": "0.28.2", + "@esbuild/linux-ppc64": "0.28.2", + "@esbuild/linux-riscv64": "0.28.2", + "@esbuild/linux-s390x": "0.28.2", + "@esbuild/linux-x64": "0.28.2", + "@esbuild/netbsd-arm64": "0.28.2", + "@esbuild/netbsd-x64": "0.28.2", + "@esbuild/openbsd-arm64": "0.28.2", + "@esbuild/openbsd-x64": "0.28.2", + "@esbuild/openharmony-arm64": "0.28.2", + "@esbuild/sunos-x64": "0.28.2", + "@esbuild/win32-arm64": "0.28.2", + "@esbuild/win32-ia32": "0.28.2", + "@esbuild/win32-x64": "0.28.2" } }, "node_modules/esbuild-clean-plugin": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/esbuild-clean-plugin/-/esbuild-clean-plugin-2.0.0.tgz", - "integrity": "sha512-3q6Q2P+BAs583djXRlWj+clTvJiEcDr1OkSUdcwJou9Z/X/JjVtlQtr60eb7RNFORtjyVohidyH2B94mohwsMg==", + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/esbuild-clean-plugin/-/esbuild-clean-plugin-2.1.4.tgz", + "integrity": "sha512-6cg09bH4TKt+7PVYRrkVaIEh5NkxsE5xwZNFCgIoRPh+vAtaBKTCiHFsfv6eItbFS6s3ZjBxNBZhCuU+YZX5Jw==", "license": "MIT", "dependencies": { "del": "^8.0.0" @@ -9426,9 +9426,9 @@ "license": "ISC" }, "node_modules/joi": { - "version": "18.2.3", - "resolved": "https://registry.npmjs.org/joi/-/joi-18.2.3.tgz", - "integrity": "sha512-N5A3KTWQpPWT4ExxxPlUx7WmykGXRzhNidWhV41d6Abu9YfI2NyWCJuxdPnslJCPWtbRpSVOWSnSS6GakLM/Rg==", + "version": "18.2.5", + "resolved": "https://registry.npmjs.org/joi/-/joi-18.2.5.tgz", + "integrity": "sha512-+gEA7rLfaNWx9JzawWPrPetSZwT16NUqHtECDgjyAJreXcs4TM7tx2Pa+VVJJK0YHM83ybrVdaT6UekHH50FJQ==", "license": "BSD-3-Clause", "dependencies": { "@hapi/address": "^5.1.1", @@ -9752,9 +9752,9 @@ } }, "node_modules/nhsuk-frontend": { - "version": "10.5.2", - "resolved": "https://registry.npmjs.org/nhsuk-frontend/-/nhsuk-frontend-10.5.2.tgz", - "integrity": "sha512-lTOmzSDJkEn8uhuEuj3NKAW5MYuG/5tqMRsp15An2oLKlpGEoEAoREp+tHYJ7DLOPDRp9Z/zmp6/pLea75ae1g==", + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/nhsuk-frontend/-/nhsuk-frontend-10.6.0.tgz", + "integrity": "sha512-ZhnQiK6q6C8d0nwwzYSI+dSPuvJMqVPPtCHCoQif75L2Y8QW4Im0Q76UvqrNWkPAkX/lV2W1QNbot27ej61+3g==", "license": "MIT", "engines": { "node": "^20.9.0 || ^22.11.0 || >= 24.11.0" @@ -9785,21 +9785,21 @@ } }, "node_modules/nhsuk-prototype-kit": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/nhsuk-prototype-kit/-/nhsuk-prototype-kit-8.3.0.tgz", - "integrity": "sha512-0FJV8dfpqBNBliRb8V1/98DnxG/6HecxWYtiL8Qmvfi8aRJdRSZf+36iRtoNXIMJz6NUmoGmA/t0XKArPLg6gQ==", + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/nhsuk-prototype-kit/-/nhsuk-prototype-kit-8.4.0.tgz", + "integrity": "sha512-3zE6QMfO8NRP5HSR91iHv3CbGksBfe0Aw2D6WlMJ2pcngXN8zBnhFBiFtohEOCadouLyDg8q6FoOpMPjiHSkOg==", "license": "MIT", "workspaces": [ ".", "testapp" ], "dependencies": { - "@inquirer/prompts": "^8.5.1", - "body-parser": "^2.2.1", + "@inquirer/prompts": "^8.5.2", + "body-parser": "^2.3.0", "browser-sync": "^3.0.4", "cookie-parser": "^1.4.7", - "esbuild": "^0.28.0", - "esbuild-clean-plugin": "^2.0.0", + "esbuild": "^0.28.2", + "esbuild-clean-plugin": "^2.1.4", "esbuild-sass-plugin": "^3.7.0", "express-flash": "^0.0.2", "express-session": "^1.19.0", @@ -9807,7 +9807,7 @@ "nodemon": "^3.1.14", "portscanner": "^2.2.0", "sass-embedded": "^1.100.0", - "wait-on": "^9.0.10" + "wait-on": "^9.1.0" }, "engines": { "node": "^22.16.0 || ^24.11.0", @@ -9815,7 +9815,7 @@ }, "peerDependencies": { "express": "^5.2.0", - "nhsuk-frontend": "^10.5.1 || >=11.0.0-preview || >=11.0.0-internal || >=11.0.0-beta", + "nhsuk-frontend": "^10.6.0 || >=11.0.0-preview || >=11.0.0-internal || >=11.0.0-beta", "nunjucks": "^3.2.4" } }, @@ -10161,9 +10161,9 @@ } }, "node_modules/p-map": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-7.0.4.tgz", - "integrity": "sha512-tkAQEw8ysMzmkhgw8k+1U/iPhWNhykKnSk4Rd5zLoPJCuJaGRPo6YposrZgaxHKzDHdDWWZvE/Sk7hsL2X/CpQ==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-7.0.6.tgz", + "integrity": "sha512-I4Prw6ivkd6p8PiYR1tXASOAOBzIJwu0TB7fqaX0c/8c3QAehNYmX57EijyGGGBt3c/BIowGwV03RVBtXvHEVg==", "license": "MIT", "engines": { "node": ">=18" @@ -12387,13 +12387,13 @@ } }, "node_modules/wait-on": { - "version": "9.0.10", - "resolved": "https://registry.npmjs.org/wait-on/-/wait-on-9.0.10.tgz", - "integrity": "sha512-rCoJEhvMr0X6alHmwc9abbrA5ZrLZFKpFQVKPNFwl2h7DapXOGdmimIHDtLOWhT4PjhZhxFEtZoQgEXbkDWdZw==", + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/wait-on/-/wait-on-9.1.0.tgz", + "integrity": "sha512-PymrLXHLBM1Ju/Xspb2ADUhbPSMvbnuNvy/mN2hWtpbJ3da0h3Ky1LqwKPG5QSVR57liyO0iUpfipYl/s5qNvA==", "license": "MIT", "dependencies": { - "axios": "^1.16.0", - "joi": "^18.2.1", + "axios": "^1.18.1", + "joi": "^18.2.3", "lodash": "^4.18.1", "minimist": "^1.2.8", "rxjs": "^7.8.2" diff --git a/package.json b/package.json index 7d7bdd1e..049e988e 100644 --- a/package.json +++ b/package.json @@ -17,8 +17,8 @@ "@x-govuk/govuk-prototype-components": "^6.0.0", "@x-govuk/govuk-prototype-filters": "^2.1.0", "accessible-autocomplete": "^3.0.1", - "nhsuk-frontend": "10.5.2", - "nhsuk-prototype-kit": "^8.3.0" + "nhsuk-frontend": "^10.6.0", + "nhsuk-prototype-kit": "^8.4.0" }, "devDependencies": { "@typescript-eslint/eslint-plugin": "^8.67.0", @@ -33,6 +33,6 @@ }, "engines": { "node": "^24", - "npm": "^11.6.1 <11.6.3 || ^11.6.4 <11.12.0" + "npm": "^11.6.1 <12" } } From b818929f588fe15426c91f1c86b7205c6e8faa51 Mon Sep 17 00:00:00 2001 From: Caitlin Roach Date: Mon, 24 Aug 2026 13:50:33 +0100 Subject: [PATCH 11/15] Index page updates --- app/views/index.html | 528 +++++++++++++++++++++++++++++++++++++------ 1 file changed, 461 insertions(+), 67 deletions(-) diff --git a/app/views/index.html b/app/views/index.html index 4f3ed0e7..b8de3f7e 100755 --- a/app/views/index.html +++ b/app/views/index.html @@ -83,7 +83,7 @@

    Prototype setup

    Signed-out interface

      -
    • +
    • {{ card({ heading: { text: "Product page", @@ -95,7 +95,7 @@

      Signed-out interface

      variant: "primary" }) }}
    • -
    • +
    • {{ card({ heading: { text: "Email invite", @@ -117,7 +117,7 @@

      Main interface

      signing in.

        -
      • +
      • {{ card({ heading: { text: "Record vaccinations", @@ -129,7 +129,7 @@

        Main interface

        variant: "primary" }) }}
      • -
      • +
      • {{ card({ heading: { text: "Dashboard", @@ -298,92 +298,486 @@

        Regions interface


        -

        Error pages

        - - -

        Messaging

        -
          -
        • Notification (Reports)
        • -
        • Notification (Vaccines)
        • -
        • Feedback
        • +
            +
          • + {{ card({ + heading: { + text: "Notification (Reports)", + size: "m" + }, + description: "Description", + href: "/reports/notification", + clickable: true, + variant: "primary" + }) }} +
          • +
          • + {{ card({ + heading: { + text: "Notification (Vaccines)", + size: "m" + }, + description: "Description", + href: "/alerts/notification", + clickable: true, + variant: "primary" + }) }} +
          • +
          • + {{ card({ + heading: { + text: "Feedback", + size: "m" + }, + description: "Description", + href: "/record-vaccinations/done", + clickable: true, + variant: "primary" + }) }} +
          +
          -

          Warning messages

          - -

          COVID-19

          +

          Error pages

          -
            -
          • Had a COVID-19 vaccine less than 3 months ago + {% set generalErrorsTabHtml %} +
              +
            • + {{ card({ + heading: { + text: "Sorry, there is a problem with the service (500 error)", + size: "s" + }, + description: "Use this page for unexpected internal server errors.", + href: "/errors/500", + clickable: true, + variant: "secondary" + }) }} +
            • +
            • + {{ card({ + heading: { + text: "Sorry, the service is unavailable (503 error)", + size: "s" + }, + description: "Use this page when the service is temporarily unavailable.", + href: "/errors/503", + clickable: true, + variant: "secondary" + }) }} +
            • +
            • + {{ card({ + heading: { + text: "Rate limited (429 error)", + size: "s" + }, + description: "Use this page when too many requests are made in a short time.", + href: "/errors/rate-limit", + clickable: true, + variant: "secondary" + }) }} +
            • +
            • + {{ card({ + heading: { + text: "Problem saving the vaccination (Regional admin has removed vaccines mid-recording)", + size: "s" + }, + description: "Use this page when a vaccine becomes unavailable during the recording flow.", + href: "/errors/vaccine-disabled", + clickable: true, + variant: "secondary" + }) }}
            • -
            • Too young for product
            • -
            • Too old for product
            • -
            • No GP surgery and not outreach
            • -
            • Not in PCN and not outreach
            + {% endset %} -

            Flu

            + {% set authErrorsTabHtml %} +
              +
            • + {{ card({ + heading: { + text: "You previously logged in a different way (Keycloak error)", + size: "s" + }, + description: "Use this page when a user signs in with a different identity provider than before.", + href: "/auth/keycloak-existing-account-new-login", + clickable: true, + variant: "secondary" + }) }} +
            • +
            • + {{ card({ + heading: { + text: "Sorry there is a problem with your account (user deactivated)", + size: "s" + }, + description: "Use this page when a signed-in user account has been deactivated.", + href: "/errors/deactivated-user", + clickable: true, + variant: "secondary" + }) }} +
            • +
            • + {{ card({ + heading: { + text: "We cannot find a user with this email (after a successful 3rd party login)", + size: "s" + }, + description: "Use this page when authentication succeeds but no matching prototype user is found.", + href: "/auth/user-not-recognised", + clickable: true, + variant: "secondary" + }) }} +
            • +
            • + {{ card({ + heading: { + text: "Sorry, there is a problem (Keycloak generic error)", + size: "s" + }, + description: "Use this page for generic identity provider or sign-in timeout errors.", + href: "/errors/keycloak-timeout", + clickable: true, + variant: "secondary" + }) }} +
            • +
            + {% endset %} -
              -
            • Too young for product
            • -
            • Too old for product
            • + {% set apiErrorsTabHtml %} +
                +
              • + {{ card({ + heading: { + text: "There is a temporary problem getting [patient name]'s vaccination history (history API issue)", + size: "s" + }, + description: "Use this page when vaccination history cannot be retrieved from the history API.", + href: "/errors/no-vaccination-history", + clickable: true, + variant: "secondary" + }) }} +
              • +
              • + {{ card({ + heading: { + text: "There is a temporary problem accessing appointments (MYA is down/API issue)", + size: "s" + }, + description: "Use this page when the appointments dependency is unavailable.", + href: "/errors/mya-downtime", + clickable: true, + variant: "secondary" + }) }} +
              • +
              • + {{ card({ + heading: { + text: "There is a temporary problem getting the patient's details (PDS API issue)", + size: "s" + }, + description: "Use this page when patient details cannot be fetched from PDS.", + href: "/errors/no-patient-details", + clickable: true, + variant: "secondary" + }) }} +
              • +
              • + {{ card({ + heading: { + text: "There is still a problem getting the patient's details (ongoing PDS API issue)", + size: "s" + }, + description: "Use this page for ongoing patient detail lookup failures after retry.", + href: "/errors/still-no-patient-details", + clickable: true, + variant: "secondary" + }) }} +
              + {% endset %} + + {{ tabs({ + items: [ + { + label: "General errors", + id: "general-errors", + panel: { + html: generalErrorsTabHtml + } + }, + { + label: "Login and access", + id: "login-access-errors", + panel: { + html: authErrorsTabHtml + } + }, + { + label: "API and service dependencies", + id: "api-service-errors", + panel: { + html: apiErrorsTabHtml + } + } + ] + }) }} -

              RSV

              + +
              - -

              Pertussis

              +

              Warning messages

              -
                -
              • Not yet 16 weeks pregnant
              • + {% set covid19WarningsTabHtml %} +
                  +
                • + {{ card({ + heading: { + text: "Had a COVID-19 vaccine less than 3 months ago", + size: "s" + }, + description: "Use this warning when a recent COVID-19 vaccination falls within the interval rule.", + href: "/record-vaccinations/covid-19/interval-warning", + clickable: true, + variant: "secondary" + }) }} +
                • +
                • + {{ card({ + heading: { + text: "Too young for product", + size: "s" + }, + description: "Use this warning when the patient is below the age range for the selected COVID-19 product.", + href: "/record-vaccinations/covid-19/too-young-warning", + clickable: true, + variant: "secondary" + }) }} +
                • +
                • + {{ card({ + heading: { + text: "Too old for product", + size: "s" + }, + description: "Use this warning when the patient is above the supported age range for the selected COVID-19 product.", + href: "/record-vaccinations/covid-19/too-old-warning", + clickable: true, + variant: "secondary" + }) }} +
                • +
                • + {{ card({ + heading: { + text: "No GP surgery and not outreach", + size: "s" + }, + description: "Use this warning when there is no GP surgery on record and the vaccination is not marked as outreach.", + href: "/record-vaccinations/covid-19/no-gp-surgery-warning", + clickable: true, + variant: "secondary" + }) }} +
                • +
                • + {{ card({ + heading: { + text: "Not in PCN and not outreach", + size: "s" + }, + description: "Use this warning when the patient is outside the PCN and the vaccination is not outreach.", + href: "/record-vaccinations/covid-19/not-in-pcn-warning", + clickable: true, + variant: "secondary" + }) }} +
                + {% endset %} - + {% set fluWarningsTabHtml %} +
                  +
                • + {{ card({ + heading: { + text: "Too young for product", + size: "s" + }, + description: "Use this warning when the patient is below the age range for the selected flu product.", + href: "/record-vaccinations/flu/too-young-warning", + clickable: true, + variant: "secondary" + }) }} +
                • +
                • + {{ card({ + heading: { + text: "Too old for product", + size: "s" + }, + description: "Use this warning when the patient is above the age range for the selected flu product.", + href: "/record-vaccinations/flu/too-old-warning", + clickable: true, + variant: "secondary" + }) }} +
                • +
                + {% endset %} -

                MMR London service

                + {% set rsvWarningsTabHtml %} +
                  +
                • + {{ card({ + heading: { + text: "Not yet 28 weeks pregnant", + size: "s" + }, + description: "Use this warning when RSV vaccination is attempted before 28 weeks of pregnancy.", + href: "/record-vaccinations/rsv/not-yet-28-weeks-pregnant-warning", + clickable: true, + variant: "secondary" + }) }} +
                • +
                + {% endset %} -
                  -
                • Had an MMR vaccine less than 4 weeks ago
                • -
                • Already had 2 doses
                • -
                • Too young for the London MMR service
                • -
                • Too old for the London MMR service
                • + {% set pertussisWarningsTabHtml %} +
                    +
                  • + {{ card({ + heading: { + text: "Not yet 16 weeks pregnant", + size: "s" + }, + description: "Use this warning when pertussis vaccination is attempted before 16 weeks of pregnancy.", + href: "/record-vaccinations/pertussis/not-yet-16-weeks-pregnant-warning", + clickable: true, + variant: "secondary" + }) }} +
                  + {% endset %} -

                  MenB

                  + {% set mmrWarningsTabHtml %} +
                    +
                  • + {{ card({ + heading: { + text: "Had an MMR vaccine less than 4 weeks ago", + size: "s" + }, + description: "Use this warning when another MMR dose was recorded too recently.", + href: "/record-vaccinations/mmr/interval-warning", + clickable: true, + variant: "secondary" + }) }} +
                  • +
                  • + {{ card({ + heading: { + text: "Already had 2 doses", + size: "s" + }, + description: "Use this warning when the patient already has two recorded MMR doses.", + href: "/record-vaccinations/mmr/already-had-2-doses-warning", + clickable: true, + variant: "secondary" + }) }} +
                  • +
                  • + {{ card({ + heading: { + text: "Too young for the London MMR service", + size: "s" + }, + description: "Use this warning when the patient is below the eligible age for the London MMR service.", + href: "/record-vaccinations/mmr/too-young-warning", + clickable: true, + variant: "secondary" + }) }} +
                  • +
                  • + {{ card({ + heading: { + text: "Too old for the London MMR service", + size: "s" + }, + description: "Use this warning when the patient is above the eligible age for the London MMR service.", + href: "/record-vaccinations/mmr/too-old-warning", + clickable: true, + variant: "secondary" + }) }} +
                  • +
                  + {% endset %} -
                    -
                  • Had a MenB vaccine less than 4 weeks ago
                  • + {% set menbWarningsTabHtml %} +
                      +
                    • + {{ card({ + heading: { + text: "Had a MenB vaccine less than 4 weeks ago", + size: "s" + }, + description: "Use this warning when a prior MenB dose was given within the restricted interval.", + href: "/record-vaccinations/menb/interval-warning", + clickable: true, + variant: "secondary" + }) }} +
                    + {% endset %} + + {{ tabs({ + items: [ + { + label: "COVID-19", + id: "warning-covid-19", + panel: { + html: covid19WarningsTabHtml + } + }, + { + label: "Flu", + id: "warning-flu", + panel: { + html: fluWarningsTabHtml + } + }, + { + label: "RSV", + id: "warning-rsv", + panel: { + html: rsvWarningsTabHtml + } + }, + { + label: "Pertussis", + id: "warning-pertussis", + panel: { + html: pertussisWarningsTabHtml + } + }, + { + label: "MMR London service", + id: "warning-mmr-london-service", + panel: { + html: mmrWarningsTabHtml + } + }, + { + label: "MenB", + id: "warning-menb", + panel: { + html: menbWarningsTabHtml + } + } + ] + }) }}
    From ff5260ca6a370f0e5eabdefef7d2798b1f6e9f94 Mon Sep 17 00:00:00 2001 From: Caitlin Roach Date: Mon, 24 Aug 2026 14:33:14 +0100 Subject: [PATCH 12/15] index updates --- app/views/index.html | 711 +++++++++++++++++++++++-------------------- 1 file changed, 373 insertions(+), 338 deletions(-) diff --git a/app/views/index.html b/app/views/index.html index b8de3f7e..306e9c94 100755 --- a/app/views/index.html +++ b/app/views/index.html @@ -42,9 +42,9 @@

    Prototype setup

    {% set customConfigHtml %} {% endset %} @@ -83,7 +83,7 @@

    Prototype setup

    Signed-out interface

      -
    • +
    • {{ card({ heading: { text: "Product page", @@ -95,7 +95,7 @@

      Signed-out interface

      variant: "primary" }) }}
    • -
    • +
    • {{ card({ heading: { text: "Email invite", @@ -113,11 +113,15 @@

      Signed-out interface

      Main interface

      -

      Quick access links below apply the Pharmacy lead admin preset first, so you can open these pages without manually - signing in.

      +
      +
      +

      Quick access links below apply the Pharmacy lead admin preset first, so you can open these pages without manually + signing in.

      +
      +
        -
      • +
      • {{ card({ heading: { text: "Record vaccinations", @@ -129,7 +133,7 @@

        Main interface

        variant: "primary" }) }}
      • -
      • +
      • {{ card({ heading: { text: "Dashboard", @@ -344,162 +348,159 @@

        Messaging

        Error pages

        {% set generalErrorsTabHtml %} -
          -
        • - {{ card({ - heading: { - text: "Sorry, there is a problem with the service (500 error)", - size: "s" - }, - description: "Use this page for unexpected internal server errors.", - href: "/errors/500", - clickable: true, - variant: "secondary" - }) }} -
        • -
        • - {{ card({ - heading: { - text: "Sorry, the service is unavailable (503 error)", - size: "s" - }, - description: "Use this page when the service is temporarily unavailable.", - href: "/errors/503", - clickable: true, - variant: "secondary" - }) }} -
        • -
        • - {{ card({ - heading: { - text: "Rate limited (429 error)", - size: "s" - }, - description: "Use this page when too many requests are made in a short time.", - href: "/errors/rate-limit", - clickable: true, - variant: "secondary" - }) }} -
        • -
        • - {{ card({ - heading: { - text: "Problem saving the vaccination (Regional admin has removed vaccines mid-recording)", - size: "s" - }, - description: "Use this page when a vaccine becomes unavailable during the recording flow.", - href: "/errors/vaccine-disabled", - clickable: true, - variant: "secondary" - }) }} -
        • -
        + {{ table({ + responsive: true, + panel: false, + firstCellIsHeader: false, + head: [ + { + text: "Error message", + classes: "nhsuk-u-width-one-half" + }, + { + text: "When to use", + classes: "nhsuk-u-width-one-half" + } + ], + rows: [ + [ + { + html: "Sorry, there is a problem with the service (500 error)" + }, + { + text: "Use this page for unexpected internal server errors." + } + ], + [ + { + html: "Sorry, the service is unavailable (503 error)" + }, + { + text: "Use this page when the service is temporarily unavailable." + } + ], + [ + { + html: "Rate limited (429 error)" + }, + { + text: "Use this page when too many requests are made in a short time." + } + ], + [ + { + html: "Problem saving the vaccination (Regional admin has removed vaccines mid-recording)" + }, + { + text: "Use this page when a vaccine becomes unavailable during the recording flow." + } + ] + ] + }) }} {% endset %} {% set authErrorsTabHtml %} -
          -
        • - {{ card({ - heading: { - text: "You previously logged in a different way (Keycloak error)", - size: "s" - }, - description: "Use this page when a user signs in with a different identity provider than before.", - href: "/auth/keycloak-existing-account-new-login", - clickable: true, - variant: "secondary" - }) }} -
        • -
        • - {{ card({ - heading: { - text: "Sorry there is a problem with your account (user deactivated)", - size: "s" - }, - description: "Use this page when a signed-in user account has been deactivated.", - href: "/errors/deactivated-user", - clickable: true, - variant: "secondary" - }) }} -
        • -
        • - {{ card({ - heading: { - text: "We cannot find a user with this email (after a successful 3rd party login)", - size: "s" - }, - description: "Use this page when authentication succeeds but no matching prototype user is found.", - href: "/auth/user-not-recognised", - clickable: true, - variant: "secondary" - }) }} -
        • -
        • - {{ card({ - heading: { - text: "Sorry, there is a problem (Keycloak generic error)", - size: "s" - }, - description: "Use this page for generic identity provider or sign-in timeout errors.", - href: "/errors/keycloak-timeout", - clickable: true, - variant: "secondary" - }) }} -
        • -
        + {{ table({ + responsive: true, + panel: false, + firstCellIsHeader: false, + head: [ + { + text: "Error message", + classes: "nhsuk-u-width-one-half" + }, + { + text: "When to use", + classes: "nhsuk-u-width-one-half" + } + ], + rows: [ + [ + { + html: "You previously logged in a different way (Keycloak error)" + }, + { + text: "Use this page when a user signs in with a different identity provider than before." + } + ], + [ + { + html: "Sorry there is a problem with your account (user deactivated)" + }, + { + text: "Use this page when a signed-in user account has been deactivated." + } + ], + [ + { + html: "We cannot find a user with this email (after a successful 3rd party login)" + }, + { + text: "Use this page when authentication succeeds but no matching prototype user is found." + } + ], + [ + { + html: "Sorry, there is a problem (Keycloak generic error)" + }, + { + text: "Use this page for generic identity provider or sign-in timeout errors." + } + ] + ] + }) }} {% endset %} {% set apiErrorsTabHtml %} -
          -
        • - {{ card({ - heading: { - text: "There is a temporary problem getting [patient name]'s vaccination history (history API issue)", - size: "s" - }, - description: "Use this page when vaccination history cannot be retrieved from the history API.", - href: "/errors/no-vaccination-history", - clickable: true, - variant: "secondary" - }) }} -
        • -
        • - {{ card({ - heading: { - text: "There is a temporary problem accessing appointments (MYA is down/API issue)", - size: "s" - }, - description: "Use this page when the appointments dependency is unavailable.", - href: "/errors/mya-downtime", - clickable: true, - variant: "secondary" - }) }} -
        • -
        • - {{ card({ - heading: { - text: "There is a temporary problem getting the patient's details (PDS API issue)", - size: "s" - }, - description: "Use this page when patient details cannot be fetched from PDS.", - href: "/errors/no-patient-details", - clickable: true, - variant: "secondary" - }) }} -
        • -
        • - {{ card({ - heading: { - text: "There is still a problem getting the patient's details (ongoing PDS API issue)", - size: "s" - }, - description: "Use this page for ongoing patient detail lookup failures after retry.", - href: "/errors/still-no-patient-details", - clickable: true, - variant: "secondary" - }) }} -
        • -
        + {{ table({ + responsive: true, + panel: false, + firstCellIsHeader: false, + head: [ + { + text: "Error message", + classes: "nhsuk-u-width-one-half" + }, + { + text: "When to use", + classes: "nhsuk-u-width-one-half" + } + ], + rows: [ + [ + { + html: "There is a temporary problem getting [patient name]'s vaccination history (history API issue)" + }, + { + text: "Use this page when vaccination history cannot be retrieved from the history API." + } + ], + [ + { + html: "There is a temporary problem accessing appointments (MYA is down/API issue)" + }, + { + text: "Use this page when the appointments dependency is unavailable." + } + ], + [ + { + html: "There is a temporary problem getting the patient's details (PDS API issue)" + }, + { + text: "Use this page when patient details cannot be fetched from PDS." + } + ], + [ + { + html: "There is still a problem getting the patient's details (ongoing PDS API issue)" + }, + { + text: "Use this page for ongoing patient detail lookup failures after retry." + } + ] + ] + }) }} {% endset %} {{ tabs({ @@ -535,201 +536,235 @@

        Error pages

        Warning messages

        {% set covid19WarningsTabHtml %} -
          -
        • - {{ card({ - heading: { - text: "Had a COVID-19 vaccine less than 3 months ago", - size: "s" - }, - description: "Use this warning when a recent COVID-19 vaccination falls within the interval rule.", - href: "/record-vaccinations/covid-19/interval-warning", - clickable: true, - variant: "secondary" - }) }} -
        • -
        • - {{ card({ - heading: { - text: "Too young for product", - size: "s" - }, - description: "Use this warning when the patient is below the age range for the selected COVID-19 product.", - href: "/record-vaccinations/covid-19/too-young-warning", - clickable: true, - variant: "secondary" - }) }} -
        • -
        • - {{ card({ - heading: { - text: "Too old for product", - size: "s" - }, - description: "Use this warning when the patient is above the supported age range for the selected COVID-19 product.", - href: "/record-vaccinations/covid-19/too-old-warning", - clickable: true, - variant: "secondary" - }) }} -
        • -
        • - {{ card({ - heading: { - text: "No GP surgery and not outreach", - size: "s" - }, - description: "Use this warning when there is no GP surgery on record and the vaccination is not marked as outreach.", - href: "/record-vaccinations/covid-19/no-gp-surgery-warning", - clickable: true, - variant: "secondary" - }) }} -
        • -
        • - {{ card({ - heading: { - text: "Not in PCN and not outreach", - size: "s" - }, - description: "Use this warning when the patient is outside the PCN and the vaccination is not outreach.", - href: "/record-vaccinations/covid-19/not-in-pcn-warning", - clickable: true, - variant: "secondary" - }) }} -
        • -
        + {{ table({ + responsive: true, + panel: false, + firstCellIsHeader: false, + head: [ + { + text: "Warning message", + classes: "nhsuk-u-width-one-half" + }, + { + text: "When to use", + classes: "nhsuk-u-width-one-half" + } + ], + rows: [ + [ + { + html: "Had a COVID-19 vaccine less than 3 months ago" + }, + { + text: "Use this warning when a recent COVID-19 vaccination falls within the interval rule." + } + ], + [ + { + html: "Too young for product" + }, + { + text: "Use this warning when the patient is below the age range for the selected COVID-19 product." + } + ], + [ + { + html: "Too old for product" + }, + { + text: "Use this warning when the patient is above the supported age range for the selected COVID-19 product." + } + ], + [ + { + html: "No GP surgery and not outreach" + }, + { + text: "Use this warning when there is no GP surgery on record and the vaccination is not marked as outreach." + } + ], + [ + { + html: "Not in PCN and not outreach" + }, + { + text: "Use this warning when the patient is outside the PCN and the vaccination is not outreach." + } + ] + ] + }) }} {% endset %} {% set fluWarningsTabHtml %} -
          -
        • - {{ card({ - heading: { - text: "Too young for product", - size: "s" - }, - description: "Use this warning when the patient is below the age range for the selected flu product.", - href: "/record-vaccinations/flu/too-young-warning", - clickable: true, - variant: "secondary" - }) }} -
        • -
        • - {{ card({ - heading: { - text: "Too old for product", - size: "s" - }, - description: "Use this warning when the patient is above the age range for the selected flu product.", - href: "/record-vaccinations/flu/too-old-warning", - clickable: true, - variant: "secondary" - }) }} -
        • -
        + {{ table({ + responsive: true, + panel: false, + firstCellIsHeader: false, + head: [ + { + text: "Warning message", + classes: "nhsuk-u-width-one-half" + }, + { + text: "When to use", + classes: "nhsuk-u-width-one-half" + } + ], + rows: [ + [ + { + html: "Too young for product" + }, + { + text: "Use this warning when the patient is below the age range for the selected flu product." + } + ], + [ + { + html: "Too old for product" + }, + { + text: "Use this warning when the patient is above the age range for the selected flu product." + } + ] + ] + }) }} {% endset %} {% set rsvWarningsTabHtml %} -
          -
        • - {{ card({ - heading: { - text: "Not yet 28 weeks pregnant", - size: "s" - }, - description: "Use this warning when RSV vaccination is attempted before 28 weeks of pregnancy.", - href: "/record-vaccinations/rsv/not-yet-28-weeks-pregnant-warning", - clickable: true, - variant: "secondary" - }) }} -
        • -
        + {{ table({ + responsive: true, + panel: false, + firstCellIsHeader: false, + head: [ + { + text: "Warning message", + classes: "nhsuk-u-width-one-half" + }, + { + text: "When to use", + classes: "nhsuk-u-width-one-half" + } + ], + rows: [ + [ + { + html: "Not yet 28 weeks pregnant" + }, + { + text: "Use this warning when RSV vaccination is attempted before 28 weeks of pregnancy." + } + ] + ] + }) }} {% endset %} {% set pertussisWarningsTabHtml %} -
          -
        • - {{ card({ - heading: { - text: "Not yet 16 weeks pregnant", - size: "s" - }, - description: "Use this warning when pertussis vaccination is attempted before 16 weeks of pregnancy.", - href: "/record-vaccinations/pertussis/not-yet-16-weeks-pregnant-warning", - clickable: true, - variant: "secondary" - }) }} -
        • -
        + {{ table({ + responsive: true, + panel: false, + firstCellIsHeader: false, + head: [ + { + text: "Warning message", + classes: "nhsuk-u-width-one-half" + }, + { + text: "When to use", + classes: "nhsuk-u-width-one-half" + } + ], + rows: [ + [ + { + html: "Not yet 16 weeks pregnant" + }, + { + text: "Use this warning when pertussis vaccination is attempted before 16 weeks of pregnancy." + } + ] + ] + }) }} {% endset %} {% set mmrWarningsTabHtml %} -
          -
        • - {{ card({ - heading: { - text: "Had an MMR vaccine less than 4 weeks ago", - size: "s" - }, - description: "Use this warning when another MMR dose was recorded too recently.", - href: "/record-vaccinations/mmr/interval-warning", - clickable: true, - variant: "secondary" - }) }} -
        • -
        • - {{ card({ - heading: { - text: "Already had 2 doses", - size: "s" - }, - description: "Use this warning when the patient already has two recorded MMR doses.", - href: "/record-vaccinations/mmr/already-had-2-doses-warning", - clickable: true, - variant: "secondary" - }) }} -
        • -
        • - {{ card({ - heading: { - text: "Too young for the London MMR service", - size: "s" - }, - description: "Use this warning when the patient is below the eligible age for the London MMR service.", - href: "/record-vaccinations/mmr/too-young-warning", - clickable: true, - variant: "secondary" - }) }} -
        • -
        • - {{ card({ - heading: { - text: "Too old for the London MMR service", - size: "s" - }, - description: "Use this warning when the patient is above the eligible age for the London MMR service.", - href: "/record-vaccinations/mmr/too-old-warning", - clickable: true, - variant: "secondary" - }) }} -
        • -
        + {{ table({ + responsive: true, + panel: false, + firstCellIsHeader: false, + head: [ + { + text: "Warning message", + classes: "nhsuk-u-width-one-half" + }, + { + text: "When to use", + classes: "nhsuk-u-width-one-half" + } + ], + rows: [ + [ + { + html: "Had an MMR vaccine less than 4 weeks ago" + }, + { + text: "Use this warning when another MMR dose was recorded too recently." + } + ], + [ + { + html: "Already had 2 doses" + }, + { + text: "Use this warning when the patient already has two recorded MMR doses." + } + ], + [ + { + html: "Too young for the London MMR service" + }, + { + text: "Use this warning when the patient is below the eligible age for the London MMR service." + } + ], + [ + { + html: "Too old for the London MMR service" + }, + { + text: "Use this warning when the patient is above the eligible age for the London MMR service." + } + ] + ] + }) }} {% endset %} {% set menbWarningsTabHtml %} -
          -
        • - {{ card({ - heading: { - text: "Had a MenB vaccine less than 4 weeks ago", - size: "s" - }, - description: "Use this warning when a prior MenB dose was given within the restricted interval.", - href: "/record-vaccinations/menb/interval-warning", - clickable: true, - variant: "secondary" - }) }} -
        • -
        + {{ table({ + responsive: true, + panel: false, + firstCellIsHeader: false, + head: [ + { + text: "Warning message", + classes: "nhsuk-u-width-one-half" + }, + { + text: "When to use", + classes: "nhsuk-u-width-one-half" + } + ], + rows: [ + [ + { + html: "Had a MenB vaccine less than 4 weeks ago" + }, + { + text: "Use this warning when a prior MenB dose was given within the restricted interval." + } + ] + ] + }) }} {% endset %} {{ tabs({ From 1cbcdb0114a7fed65ddb2024f9d4eb2b0e055b66 Mon Sep 17 00:00:00 2001 From: Benjy Stanton <2545065+benjystanton@users.noreply.github.com> Date: Wed, 26 Aug 2026 16:18:02 +0100 Subject: [PATCH 13/15] Update package-lock with npm version --- package-lock.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package-lock.json b/package-lock.json index ce6c4f81..d87b305e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -26,7 +26,7 @@ }, "engines": { "node": "^24", - "npm": "^11.6.1 <11.6.3 || ^11.6.4 <11.12.0" + "npm": "^11.6.1 <12" } }, "node_modules/@bufbuild/protobuf": { From 6bf7ede5dffd97be90b1494eb6cf08f099e4e849 Mon Sep 17 00:00:00 2001 From: Caitlin Roach Date: Thu, 27 Aug 2026 16:14:00 +0100 Subject: [PATCH 14/15] Removed messaging section and associated pages --- app/views/alerts/notification.html | 139 ---------------------------- app/views/index.html | 43 --------- app/views/reports/notification.html | 42 --------- 3 files changed, 224 deletions(-) delete mode 100644 app/views/alerts/notification.html delete mode 100644 app/views/reports/notification.html diff --git a/app/views/alerts/notification.html b/app/views/alerts/notification.html deleted file mode 100644 index f950669e..00000000 --- a/app/views/alerts/notification.html +++ /dev/null @@ -1,139 +0,0 @@ -{% extends 'layout.html' %} - -{% set pageName = "Vaccines" %} - -{% set currentSection = "vaccines" %} - -{% set sites = [] %} -{% for vaccine in (data.vaccines) %} - {% if not (sites | arrayOrStringIncludes(vaccine.siteCode)) %} - {% set sites = (sites.push(vaccine.siteCode), sites) %} - {% endif %} -{% endfor %} - -{% block content %} -
        -
        - - {% include "_notification.html" %} - -

        {{ pageName }}

        - -

        Add and edit your vaccines for your organisation.

        - - {{ button({ - "text": "Add vaccine", - "href": "/vaccines/choose-site" - }) }} - -
        -
        - - {% from 'select/macro.njk' import select %} - - - {% if (sites | length) > 4 %} - {% set filterItems = [{ - text: "All sites", - value: "", - selected: true - }] %} - - {% for site in sites %} - {% set filterItems = (filterItems.push({text: data.sites[site].name, value: site}), filterItems) %} - {% endfor %} - - - {{ select({ - label: { - text: "Show" - }, - id: "select-1", - name: "select-1", - items: filterItems, - classes: "nhsuk-u-margin-bottom-3" - }) }} - {% endif %} - - -
        -
        - - {% for site in sites %} - - - - - - - - - - - - - - {% set vaccinesAtSite = [] %} - {% for vaccine in (data.vaccines) %} - {% if vaccine.siteCode == site and not (vaccinesAtSite | arrayOrStringIncludes(vaccine.vaccine)) %} - {% set vaccinesAtSite = (vaccinesAtSite.push(vaccine.vaccine), vaccinesAtSite) %} - {% endif %} - {% endfor %} - - {% for vaccineAtSite in vaccinesAtSite %} - - {% set vaccineProductsAtSite = [] %} - {% for vaccine in (data.vaccines) %} - {% if vaccine.vaccine == vaccineAtSite and vaccine.siteCode == site and not (vaccineProductsAtSite | arrayOrStringIncludes(vaccine.vaccineProduct)) %} - {% set vaccineProductsAtSite = (vaccineProductsAtSite.push(vaccine.vaccineProduct), vaccineProductsAtSite) %} - {% endif %} - {% endfor %} - - - - {% for vaccineProduct in vaccineProductsAtSite %} - - - - - - - - {% endfor %} - {% endfor %} - -
        {{ data.sites[site].name }}
        - Vaccine - - Product - - Active batches - - - -
        - {{ (vaccineAtSite ) | capitaliseFirstLetter }} - - {{ vaccineProduct }} - - {% set count = 0 %} - {% set thisVaccine = {} %} - {% for vaccine in data.vaccines %} - {% if (vaccine.siteCode == site) and (vaccine.vaccine == vaccineAtSite) and (vaccine.vaccineProduct == vaccineProduct) %} - {% set thisVaccine = vaccine %} - {% endif %} - {% endfor %} - {{ thisVaccine.batches | length }} - - - - -
        - {% endfor %} - - -
        -
        - -{% endblock %} - diff --git a/app/views/index.html b/app/views/index.html index 306e9c94..336e2cb9 100755 --- a/app/views/index.html +++ b/app/views/index.html @@ -302,49 +302,6 @@

        Regions interface


        -

        Messaging

        - -
          -
        • - {{ card({ - heading: { - text: "Notification (Reports)", - size: "m" - }, - description: "Description", - href: "/reports/notification", - clickable: true, - variant: "primary" - }) }} -
        • -
        • - {{ card({ - heading: { - text: "Notification (Vaccines)", - size: "m" - }, - description: "Description", - href: "/alerts/notification", - clickable: true, - variant: "primary" - }) }} -
        • -
        • - {{ card({ - heading: { - text: "Feedback", - size: "m" - }, - description: "Description", - href: "/record-vaccinations/done", - clickable: true, - variant: "primary" - }) }} -
        • -
        - -
        -

        Error pages

        {% set generalErrorsTabHtml %} diff --git a/app/views/reports/notification.html b/app/views/reports/notification.html deleted file mode 100644 index e2b2f52c..00000000 --- a/app/views/reports/notification.html +++ /dev/null @@ -1,42 +0,0 @@ -{% extends 'layout.html' %} - -{% block pageTitle %} - Reports -{% endblock %} - -{% set currentSection = "reports" %} - - - - -{% block content %} - - -
        -
        - - {% include "_report-notification.html" %} - - -

        Reports

        -

        Create and download reports

        - - {{ insetText({ - html: "

        Reports may take longer to process if you choose more data or a wider date range.

        " - })}} - - {{ button({ - "text": "Create report", - "href": "/reports/choose-dates" - }) }} - - - -
        -
        - - - - - -{% endblock %} From ef107f1740e2ae6e37e00446b28548ecb98035b0 Mon Sep 17 00:00:00 2001 From: Caitlin Roach Date: Thu, 27 Aug 2026 16:18:04 +0100 Subject: [PATCH 15/15] Updates to index --- app/views/includes/_preset-scenarios-table.html | 4 ++-- app/views/index.html | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/app/views/includes/_preset-scenarios-table.html b/app/views/includes/_preset-scenarios-table.html index ed052f90..ddddd370 100644 --- a/app/views/includes/_preset-scenarios-table.html +++ b/app/views/includes/_preset-scenarios-table.html @@ -72,12 +72,12 @@ scenarioDetails: "Group admin for a large pharmacy chain (same-name pharmacies)." }, { - presetLabel: "Group admin, pharmacy HQ (no data)", + presetLabel: "Group admin, pharmacy chain (no data)", presetPath: "/prototype-setup/preset/pharmacy-hq-no-data", userName: "Amanda White", userEmail: "amanda.white@nhs.net", role: "Group administrator", - scenarioDetails: "Group admin for a pharmacy HQ with no pre-loaded data, pharmacies or users." + scenarioDetails: "Group admin for a pharmacy chain with no pre-loaded data, pharmacies or users." }, { presetLabel: "Regional lead", diff --git a/app/views/index.html b/app/views/index.html index 336e2cb9..8a243c7f 100755 --- a/app/views/index.html +++ b/app/views/index.html @@ -139,7 +139,7 @@

        Main interface

        text: "Dashboard", size: "m" }, - description: "This the dashboard page. It shows information about the vaccinations a site has given.", + description: "This the dashboard page. It shows information about the vaccinations an organisation has given.", href: "/prototype-setup/quick-access/pharmacy?next=/home", clickable: true, variant: "primary"