From 762656cfe1aae182eec4998b37bc9845c85fdac1 Mon Sep 17 00:00:00 2001 From: Adam Chrimes Date: Wed, 15 Jan 2025 11:17:30 +0000 Subject: [PATCH 1/2] add the screening UI base template --- web/.dockerignore | 8 + web/.editorconfig | 12 + web/.env.development.sample | 4 + web/.eslintrc.json | 3 + web/.github/PULL_REQUEST_TEMPLATE.md | 36 + web/.github/SECURITY.md | 34 + web/.gitignore | 51 + web/LICENCE.md | 9 + web/Makefile | 27 + web/README.md | 125 + web/app/accessibility-statement/page.tsx | 105 + web/app/components/footer.tsx | 62 + web/app/components/header.tsx | 49 + web/app/cookies-policy/page.tsx | 77 + web/app/favicon.ico | Bin 0 -> 15086 bytes web/app/globals.scss | 13 + web/app/layout.tsx | 26 + web/app/lib/utils.test.ts | 83 + web/app/lib/utils.ts | 43 + web/app/not-found.tsx | 21 + web/app/page.tsx | 13 + web/app/styles/main.scss | 0 web/docker/development/Dockerfile | 52 + web/docker/development/docker-compose.yml | 8 + web/e2e/example.spec.ts | 6 + web/jest.config.ts | 18 + web/next.config.mjs | 6 + web/package.json | 45 + web/playwright.config.ts | 75 + web/pnpm-lock.yaml | 6076 +++++++++++++++++ .../favicons/apple-touch-icon-180x180.png | Bin 0 -> 3095 bytes .../assets/favicons/apple-touch-icon.png | Bin 0 -> 3095 bytes .../assets/favicons/favicon-192x192.png | Bin 0 -> 3236 bytes web/public/assets/favicons/favicon.ico | Bin 0 -> 15086 bytes web/public/assets/favicons/favicon.png | Bin 0 -> 3095 bytes web/public/assets/favicons/favicon.svg | 3 + .../assets/favicons/largetile-310x310.png | Bin 0 -> 5451 bytes .../assets/favicons/mediumtile-144x144.png | Bin 0 -> 2385 bytes .../assets/favicons/mediumtile-150x150.png | Bin 0 -> 2559 bytes .../assets/favicons/smalltile-70x70.png | Bin 0 -> 1323 bytes .../assets/favicons/widetile-310x150.png | Bin 0 -> 4839 bytes web/public/assets/js/nhsuk.min.js | 1 + web/public/assets/logos/logo-nhs.svg | 5 + web/public/assets/logos/nhs-logo.png | Bin 0 -> 2600 bytes web/public/assets/logos/open-graph.png | Bin 0 -> 12632 bytes web/tsconfig.json | 29 + 46 files changed, 7125 insertions(+) create mode 100644 web/.dockerignore create mode 100644 web/.editorconfig create mode 100644 web/.env.development.sample create mode 100644 web/.eslintrc.json create mode 100644 web/.github/PULL_REQUEST_TEMPLATE.md create mode 100644 web/.github/SECURITY.md create mode 100644 web/.gitignore create mode 100644 web/LICENCE.md create mode 100644 web/Makefile create mode 100644 web/README.md create mode 100644 web/app/accessibility-statement/page.tsx create mode 100644 web/app/components/footer.tsx create mode 100644 web/app/components/header.tsx create mode 100644 web/app/cookies-policy/page.tsx create mode 100644 web/app/favicon.ico create mode 100644 web/app/globals.scss create mode 100644 web/app/layout.tsx create mode 100644 web/app/lib/utils.test.ts create mode 100644 web/app/lib/utils.ts create mode 100644 web/app/not-found.tsx create mode 100644 web/app/page.tsx create mode 100644 web/app/styles/main.scss create mode 100644 web/docker/development/Dockerfile create mode 100644 web/docker/development/docker-compose.yml create mode 100644 web/e2e/example.spec.ts create mode 100644 web/jest.config.ts create mode 100644 web/next.config.mjs create mode 100644 web/package.json create mode 100644 web/playwright.config.ts create mode 100644 web/pnpm-lock.yaml create mode 100644 web/public/assets/favicons/apple-touch-icon-180x180.png create mode 100644 web/public/assets/favicons/apple-touch-icon.png create mode 100644 web/public/assets/favicons/favicon-192x192.png create mode 100644 web/public/assets/favicons/favicon.ico create mode 100644 web/public/assets/favicons/favicon.png create mode 100644 web/public/assets/favicons/favicon.svg create mode 100644 web/public/assets/favicons/largetile-310x310.png create mode 100644 web/public/assets/favicons/mediumtile-144x144.png create mode 100644 web/public/assets/favicons/mediumtile-150x150.png create mode 100644 web/public/assets/favicons/smalltile-70x70.png create mode 100644 web/public/assets/favicons/widetile-310x150.png create mode 100644 web/public/assets/js/nhsuk.min.js create mode 100644 web/public/assets/logos/logo-nhs.svg create mode 100644 web/public/assets/logos/nhs-logo.png create mode 100644 web/public/assets/logos/open-graph.png create mode 100644 web/tsconfig.json diff --git a/web/.dockerignore b/web/.dockerignore new file mode 100644 index 0000000..0d82803 --- /dev/null +++ b/web/.dockerignore @@ -0,0 +1,8 @@ +Dockerfile +.dockerignore +node_modules +npm-debug.log +README.md +.next +docker +.git diff --git a/web/.editorconfig b/web/.editorconfig new file mode 100644 index 0000000..24e9790 --- /dev/null +++ b/web/.editorconfig @@ -0,0 +1,12 @@ +root = true + +[*] +charset = utf-8 +end_of_line = lf +indent_size = 2 +indent_style = space +insert_final_newline = true +trim_trailing_whitespace = true + +[{Dockerfile,Dockerfile.}*] +indent_size = 4 diff --git a/web/.env.development.sample b/web/.env.development.sample new file mode 100644 index 0000000..a81eb7d --- /dev/null +++ b/web/.env.development.sample @@ -0,0 +1,4 @@ +# Default +NEXT_PUBLIC_BASE_URL=http://localhost:3000 +NODE_ENV=development +SERVICE_NAME="Participant Manager" diff --git a/web/.eslintrc.json b/web/.eslintrc.json new file mode 100644 index 0000000..3722418 --- /dev/null +++ b/web/.eslintrc.json @@ -0,0 +1,3 @@ +{ + "extends": ["next/core-web-vitals", "next/typescript"] +} diff --git a/web/.github/PULL_REQUEST_TEMPLATE.md b/web/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 0000000..9d7eb83 --- /dev/null +++ b/web/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,36 @@ + + +## Description + + + +## Context + + + +## Type of changes + + + +- [ ] Refactoring (non-breaking change) +- [ ] New feature (non-breaking change which adds functionality) +- [ ] Breaking change (fix or feature that would change existing functionality) +- [ ] Bug fix (non-breaking change which fixes an issue) + +## Checklist + + + +- [ ] I am familiar with the [contributing guidelines](../docs/CONTRIBUTING.md) +- [ ] I have followed the code style of the project +- [ ] I have added tests to cover my changes +- [ ] I have updated the documentation accordingly +- [ ] This PR is a result of pair or mob programming + +--- + +## Sensitive Information Declaration + +To ensure the utmost confidentiality and protect your and others privacy, we kindly ask you to NOT including [PII (Personal Identifiable Information) / PID (Personal Identifiable Data)](https://digital.nhs.uk/data-and-information/keeping-data-safe-and-benefitting-the-public) or any other sensitive data in this PR (Pull Request) and the codebase changes. We will remove any PR that do contain any sensitive information. We really appreciate your cooperation in this matter. + +- [ ] I confirm that neither PII/PID nor sensitive data are included in this PR and the codebase changes. diff --git a/web/.github/SECURITY.md b/web/.github/SECURITY.md new file mode 100644 index 0000000..a265f63 --- /dev/null +++ b/web/.github/SECURITY.md @@ -0,0 +1,34 @@ +# Security + +NHS England takes security and the protection of private data extremely seriously. If you believe you have found a vulnerability or other issue which has compromised or could compromise the security of any of our systems and/or private data managed by our systems, please do not hesitate to contact us using the methods outlined below. + +## Table of Contents + +- [Security](#security) + - [Table of Contents](#table-of-contents) + - [Reporting a vulnerability](#reporting-a-vulnerability) + - [Email](#email) + - [NCSC](#ncsc) + - [General Security Enquiries](#general-security-enquiries) + +## Reporting a vulnerability + +Please note, email is our preferred method of receiving reports. + +### Email + +If you wish to notify us of a vulnerability via email, please include detailed information on the nature of the vulnerability and any steps required to reproduce it. + +You can reach us at: + +- cybersecurity@nhs.net + +### NCSC + +You can send your report to the National Cyber Security Centre, who will assess your report and pass it on to NHS England if necessary. + +You can report vulnerabilities here: [https://www.ncsc.gov.uk/information/vulnerability-reporting](https://www.ncsc.gov.uk/information/vulnerability-reporting) + +## General Security Enquiries + +If you have general enquiries regarding our cyber security, please reach out to us at cybersecurity@nhs.net diff --git a/web/.gitignore b/web/.gitignore new file mode 100644 index 0000000..cc45ea2 --- /dev/null +++ b/web/.gitignore @@ -0,0 +1,51 @@ +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. + +# dependencies +/node_modules +/.pnp +.pnp.js +.yarn/install-state.gz + +# testing +/coverage + +# next.js +/.next/ +/out/ + +# production +/build + +# misc +.DS_Store +*.pem + +# debug +npm-debug.log* +yarn-debug.log* +yarn-error.log* + +# local env files +.env*.local +.env + +# vercel +.vercel + +# typescript +*.tsbuildinfo +next-env.d.ts + +# Playwright +/test-results/ +/tests-examples/ +/playwright-report/ +/blob-report/ +/playwright/.cache/ + +# Env +.env +.env.staging + +# SSL +certificates diff --git a/web/LICENCE.md b/web/LICENCE.md new file mode 100644 index 0000000..a346f33 --- /dev/null +++ b/web/LICENCE.md @@ -0,0 +1,9 @@ +# MIT Licence + +Copyright (c) 2024 Crown Copyright NHS England. + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/web/Makefile b/web/Makefile new file mode 100644 index 0000000..d26ad86 --- /dev/null +++ b/web/Makefile @@ -0,0 +1,27 @@ +.PHONY: build-development +build-development: ## Build the development docker image. + docker compose -f docker/development/docker-compose.yml build +.PHONY: start-development +start-development: ## Start the development docker container. + docker compose -f docker/development/docker-compose.yml up -d +.PHONY: stop-development +stop-development: ## Stop the development docker container. + docker compose -f docker/development/docker-compose.yml down +.PHONY: build-staging +build-staging: ## Build the staging docker image. + docker compose -f docker/staging/docker-compose.yml build +.PHONY: start-staging +start-staging: ## Start the staging docker container. + docker compose -f docker/staging/docker-compose.yml up -d +.PHONY: stop-staging +stop-staging: ## Stop the staging docker container. + docker compose -f docker/staging/docker-compose.yml down +.PHONY: build-production +build-production: ## Build the production docker image. + docker compose -f docker/production/docker-compose.yml build +.PHONY: start-production +start-production: ## Start the production docker container. + docker compose -f docker/production/docker-compose.yml up -d +.PHONY: stop-production +stop-production: ## Stop the production docker container. + docker compose -f docker/production/docker-compose.yml down diff --git a/web/README.md b/web/README.md new file mode 100644 index 0000000..2119799 --- /dev/null +++ b/web/README.md @@ -0,0 +1,125 @@ +# Participant Manager UI + +User interface template for Screening services. + +Built with [Next.js](https://nextjs.org/). + +## Using Docker and Makefile + +Development environment + +``` +make build-development +make start-development +``` + +Open [http://localhost:3001](http://localhost:3001). +Stop the development environment + +``` +make stop-development +``` + +## Running locally + +Install the required dependencies using + +```bash +pnpm install +# or +npm install +``` + +Then, run the development server: + +```bash +pnpm dev +# or +npm dev +``` + +Open [http://localhost:3000](http://localhost:3000). + +### Prerequisites + +- [pnpm](https://pnpm.io/) package manager +- or [npm](https://nodejs.org/en) package manager + +## Environment variables + +Create a `.env` file which should override environment variables required to run locally: + +``` +# Default +NEXT_PUBLIC_BASE_URL=http://localhost:3000 +NODE_ENV=development +SERVICE_NAME="UI template" +``` + +## Testing + +### Unit tests + +Unit tests are written using [Jest](https://jestjs.io/) and [React Testing Library](https://testing-library.com/docs/react-testing-library/intro/). + +#### Running unit tests + +To run unit tests, use the following command: + +``` +pnpm run test:unit +``` + +This will execute all unit tests and provide a summary of the tests results. + +#### Running unit tests in watch mode + +To run the unit tests in watch mode, use the following command: + +``` +pnpm run test:unit:watch +``` + +This will run the tests and re-run them whenever a file changes. + +#### Coverage report + +To generate a code coverage report, use the following command: + +``` +npm run test:unit:coverage +``` + +This will generate a coverage report in the `coverage` directory. + +### End-to-end tests + +End-to-end tests are written using [Playwright](https://playwright.dev/). + +Before running end-to-end tests make sure your development server is running locally on `http://localhost:3000`. Using the command `pnpm run dev`. + +#### Running end-to-end tests + +To run the end-to-end tests, use the following command: + +``` +pnpm run test:e2e:ui +``` + +This will open the Playwright test runner, where you can run the tests interactively. + +### Running end-to-end tests in headless mode + +To run the end-to-end tests in headless mode, use the following command: + +``` +pnpm run test:e2e +``` + +This will run the tests in headless mode and output the results to the terminal. + +## Licence + +Unless stated otherwise, the codebase is released under the MIT License. This covers both the codebase and any sample code in the documentation. + +Any HTML or Markdown documentation is [© Crown Copyright](https://www.nationalarchives.gov.uk/information-management/re-using-public-sector-information/uk-government-licensing-framework/crown-copyright/) and available under the terms of the [Open Government Licence v3.0](https://www.nationalarchives.gov.uk/doc/open-government-licence/version/3/). diff --git a/web/app/accessibility-statement/page.tsx b/web/app/accessibility-statement/page.tsx new file mode 100644 index 0000000..4bc2273 --- /dev/null +++ b/web/app/accessibility-statement/page.tsx @@ -0,0 +1,105 @@ +import type { Metadata } from "next"; + +export const metadata: Metadata = { + title: `Accessibility statement - ${process.env.SERVICE_NAME}`, +}; + +export default async function Page() { + return ( +
+
+
+

Accessibility statement

+

+ This accessibility statement applies to the {""} + {process.env.SERVICE_NAME} service. +

+

+ We want as many people as possible to be able to use this website. + This means you should be able to: +

+
    +
  • + change colours, contrast levels and fonts using browser + functionality +
  • +
  • + zoom in up to 400 per cent without the text spilling off the + screen +
  • +
  • navigate most of the website using just a keyboard
  • +
  • + navigate most of the website using speech recognition software +
  • +
  • + interact with most of the website using a screen reader (including + recent versions of JAWS, NVDA and VoiceOver) +
  • +
+

+ We also try to make the website text as simple as possible to + understand. +

+

+ If you have a disability,{" "} + + search AbilityNet for "how to" guides + {" "} + to make your device easier to use. +

+

Feedback and contact information

+

+ If you have feedback, or need information on this website in a + different format, contact{" "} + + england.digitalscreening@nhs.net + +

+

Reporting accessibility problems with this website

+

+ We're always looking to improve the accessibility of this website. + If you find any problems not listed on this page or think we're not + meeting accessibility requirements, please contact{" "} + + england.digitalscreening@nhs.net + + . This helps us improve. +

+

Enforcement procedure

+

+ If you contact us with a complaint and you are not happy with our + response,{" "} + + contact the Equality Advisory and Support Service (EASS) + + . +

+

+ The Equality and Human Rights Commission (EHRC) is responsible for + enforcing the{" "} + + Public Sector Bodies (Websites and Mobile Applications) (No. 2) + Accessibility Regulations 2018 on legislation.gov.uk + {" "} + (the "accessibility regulations"). +

+

Technical information about this website's accessibility

+

+ This service is compliant with the{" "} + + Web Content Accessibility Guidelines (WCAG) version 2.1 AA + standard + + . +

+

Preparation of this accessibility statement

+

This statement was prepared on 2 December 2024.

+

+ This website's accessibility will be reviewed on a regular and + continuous basis. +

+
+
+
+ ); +} diff --git a/web/app/components/footer.tsx b/web/app/components/footer.tsx new file mode 100644 index 0000000..93c7d55 --- /dev/null +++ b/web/app/components/footer.tsx @@ -0,0 +1,62 @@ +import Link from "next/link"; + +export default function Footer() { + return ( + <> + + + ); +} diff --git a/web/app/components/header.tsx b/web/app/components/header.tsx new file mode 100644 index 0000000..59e3242 --- /dev/null +++ b/web/app/components/header.tsx @@ -0,0 +1,49 @@ +import Link from "next/link"; + +interface HeaderProps { + serviceName?: string; +} + +export default async function Header({ + serviceName = process.env.SERVICE_NAME, +}: HeaderProps) { + return ( + <> +
+
+
+ + + + + + + + + {serviceName} + + + +
+
+
+ + ); +} diff --git a/web/app/cookies-policy/page.tsx b/web/app/cookies-policy/page.tsx new file mode 100644 index 0000000..a279b6b --- /dev/null +++ b/web/app/cookies-policy/page.tsx @@ -0,0 +1,77 @@ +import type { Metadata } from "next"; + +export const metadata: Metadata = { + title: `Accessibility statement - ${process.env.SERVICE_NAME}`, +}; + +export default async function Page() { + return ( +
+
+
+

Cookies on {process.env.SERVICE_NAME}

+

What are cookies?

+

+ Cookies are files saved on your phone, tablet or computer when you + visit a website. +

+

+ They store information about how you use the website, such as the + pages you visit. +

+

+ Cookies are not viruses or computer programs. They are very small so + do not take up much space. +

+

How we use cookies

+

+ We only use cookies that are needed to make our website work, for + example by keeping it secure. +

+

We do not use any other type of cookies.

+ +

Cookies needed for the website to work

+ + + + + + + + + + + + + + + + + + + + + +
+ List of cookies that are needed to make the website work +
+ Name + + Purpose + + Expires +
__Host-authjs.csrf-token + Prevent cross-site request forgery (CSRF) and ensure the + security of the website and users. + Session
+ __Secure-authjs.callback-url + + Callback URL (also know as redirect URL) used for the + authentication to specify where the user should be redirected + to once authenticated. + Session
+
+
+
+ ); +} diff --git a/web/app/favicon.ico b/web/app/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..ee9b7116d7d130e482ee4f0fe665b70edd16399e GIT binary patch literal 15086 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 { + const serviceName = process.env.SERVICE_NAME; + return ( + + +
+
{children}
+