From 1478c21dac406750875cec9814dac621e92d78c6 Mon Sep 17 00:00:00 2001 From: Neil Mills <35219002+neil-mills@users.noreply.github.com> Date: Thu, 30 Jan 2025 09:34:43 +0000 Subject: [PATCH] Man 274 improve page titles (#292) * MAN-274 improve page titles wip * MAN-274 add unit test for make page title utility function * MAN-274 iterate page title for appointments page * MAN-274 fix failing int test --- server/baseController.ts | 2 ++ server/middleware/validation/activityLog.ts | 4 ++-- server/utils/utils.test.ts | 18 ++++++++++++++++++ server/utils/utils.ts | 6 ++++-- server/views/pages/activity-log.njk | 2 +- server/views/pages/appointments.njk | 2 +- .../views/pages/appointments/appointment.njk | 2 +- .../pages/appointments/record-an-outcome.njk | 1 + server/views/pages/caseload/minimal-cases.njk | 2 +- server/views/pages/compliance.njk | 4 +--- server/views/pages/error.njk | 2 +- server/views/pages/handoff/delius.njk | 2 +- server/views/pages/index.njk | 2 +- server/views/pages/interventions.njk | 2 +- server/views/pages/licence-condition-note.njk | 2 +- server/views/pages/overview.njk | 2 +- server/views/pages/personal-details.njk | 2 +- .../pages/personal-details/circumstances.njk | 2 +- server/views/pages/probation-history.njk | 2 +- server/views/pages/requirement-note.njk | 2 +- server/views/pages/risk.njk | 2 +- server/views/pages/search.njk | 2 +- server/views/pages/sentence.njk | 2 +- server/views/pages/sentence/offences.njk | 2 +- .../views/pages/sentence/previous-orders.njk | 1 + 25 files changed, 47 insertions(+), 25 deletions(-) diff --git a/server/baseController.ts b/server/baseController.ts index 876a9468..b87537a5 100644 --- a/server/baseController.ts +++ b/server/baseController.ts @@ -1,6 +1,7 @@ import { Request, Response, NextFunction } from 'express' import config from './config' import { defaultName } from './utils/azureAppInsights' +import { makePageTitle } from './utils/utils' const baseController = () => { return (req: Request, res: Response, next: NextFunction): void => { @@ -10,6 +11,7 @@ const baseController = () => { res.locals.home = url.length === 0 res.locals.cases = url[0] === 'case' res.locals.search = url[0] === 'search' + res.locals.makePageTitle = makePageTitle return next() } } diff --git a/server/middleware/validation/activityLog.ts b/server/middleware/validation/activityLog.ts index d96f9868..d97b2e08 100644 --- a/server/middleware/validation/activityLog.ts +++ b/server/middleware/validation/activityLog.ts @@ -5,7 +5,7 @@ import properties from '../../properties' import utils from '../../utils' import { toCamelCase } from '../../utils/utils' -const activityLog: Route = (req, res, next) => { +const activityLog: Route = (req, res, next): void => { const { dateFrom: dateFromQuery, dateTo: dateToQuery } = req.query const dateFrom = dateFromQuery as string const dateTo = dateToQuery as string @@ -57,7 +57,7 @@ const activityLog: Route = (req, res, next) => { } } - const dateIsValid = (dateName: string) => req?.query?.[dateName] && isValid[dateName] + const dateIsValid = (dateName: string): boolean => req?.query?.[dateName] && isValid[dateName] const validateDateRanges = (): void => { isValidDateFormat('date-from', dateFrom) diff --git a/server/utils/utils.test.ts b/server/utils/utils.test.ts index ab0717bb..a9134383 100644 --- a/server/utils/utils.test.ts +++ b/server/utils/utils.test.ts @@ -34,11 +34,13 @@ import { timeFromTo, toYesNo, yearsSince, + makePageTitle, } from './utils' import { RiskResponse, RiskScore, RiskToSelf } from '../data/arnsApiClient' import { Name } from '../data/model/common' import { Activity } from '../data/model/schedule' import { RecentlyViewedCase, UserAccess } from '../data/model/caseAccess' +import config from '../config' const appointments = [ { @@ -487,3 +489,19 @@ describe('update lao access in local storage', () => { expect(result[0].limitedAccess).toEqual(expected) }) }) + +describe('makePageTitle()', () => { + it('should format the title correctly if heading is a single string value', () => { + expect(makePageTitle({ pageHeading: 'Home' })).toEqual(`Home - ${config.applicationName}`) + }) + it('should format the title correctly if heading is an array containing two values', () => { + expect(makePageTitle({ pageHeading: ['Contact', 'Personal details'] })).toEqual( + `Contact - Personal details - ${config.applicationName}`, + ) + }) + it('should format the title correctly if heading is an array containing three values', () => { + expect(makePageTitle({ pageHeading: ['Contact', 'Sentence', 'Licence condition'] })).toEqual( + `Contact - Sentence - Licence condition - ${config.applicationName}`, + ) + }) +}) diff --git a/server/utils/utils.ts b/server/utils/utils.ts index 4fbced8c..51bdabc2 100644 --- a/server/utils/utils.ts +++ b/server/utils/utils.ts @@ -511,8 +511,10 @@ export const hasValue = (val: unknown) => { return isNotNull(val) && isDefined(val) } -export const makePageTitle = ({ pageHeading, hasErrors }: { pageHeading: string; hasErrors: boolean }) => - `${hasErrors ? 'Error: ' : ''}${pageHeading} - ${config.applicationName}` +export const makePageTitle = ({ pageHeading }: { pageHeading: string | string[] }): string => { + const titles = !Array.isArray(pageHeading) ? [pageHeading] : pageHeading + return `${titles.join(' - ')} - ${config.applicationName}` +} export const getDataValue = (data: any, sections: any) => { const path = Array.isArray(sections) ? sections : [sections] diff --git a/server/views/pages/activity-log.njk b/server/views/pages/activity-log.njk index d77c20e7..174182df 100644 --- a/server/views/pages/activity-log.njk +++ b/server/views/pages/activity-log.njk @@ -1,7 +1,7 @@ {% extends "../partials/case.njk" %} {% from "govuk/components/notification-banner/macro.njk" import govukNotificationBanner %} {% from "govuk/components/pagination/macro.njk" import govukPagination %} -{% set pageTitle = applicationName + " - Activity log" %} +{% set pageTitle = makePageTitle({ pageHeading: ["Contact", "Activity log"] }) %} {% set currentNavSection = 'timeline' %} {% set currentSectionName = 'Activity log' %} {% set headerPersonName = personActivity.personSummary.name.forename + ' ' + personActivity.personSummary.name.surname %} diff --git a/server/views/pages/appointments.njk b/server/views/pages/appointments.njk index a7ab5e43..51e4c12f 100644 --- a/server/views/pages/appointments.njk +++ b/server/views/pages/appointments.njk @@ -1,7 +1,7 @@ {% extends "../partials/case.njk" %} {% from "govuk/components/notification-banner/macro.njk" import govukNotificationBanner %} {% from "moj/components/button-menu/macro.njk" import mojButtonMenu %} -{% set pageTitle = applicationName + " - Appointments" %} +{% set pageTitle = makePageTitle({ pageHeading: ["Contact", "Appointments"] }) %} {% set currentNavSection = 'appointments' %} {% set headerPersonName = upcomingAppointments.personSummary.name.forename + ' ' + upcomingAppointments.personSummary.name.surname %} {% set headerCRN = upcomingAppointments.personSummary.crn %} diff --git a/server/views/pages/appointments/appointment.njk b/server/views/pages/appointments/appointment.njk index 9a63b953..2e21b144 100644 --- a/server/views/pages/appointments/appointment.njk +++ b/server/views/pages/appointments/appointment.njk @@ -1,6 +1,6 @@ {% extends "../../partials/layout.njk" %} {% set appointment = personAppointment.appointment %} - +{% set pageTitle = makePageTitle({ pageHeading: ["Contact", "Appointments" if not isActivityLog else "Activity log", appointment.type] }) %} {% set extraBreadcrumb = '?' + queryParams.join('&') if queryParams.length > 0 else '' %} {% set category = '/' + category + '/' + extraBreadcrumb if category else extraBreadcrumb %} diff --git a/server/views/pages/appointments/record-an-outcome.njk b/server/views/pages/appointments/record-an-outcome.njk index 0f784a24..1f412248 100644 --- a/server/views/pages/appointments/record-an-outcome.njk +++ b/server/views/pages/appointments/record-an-outcome.njk @@ -1,6 +1,7 @@ {% extends "../_form.njk" %} {% set headerPersonName = schedule.personSummary.name.forename + ' ' + schedule.personSummary.name.surname %} {% set title = "Which appointment are you recording an outcome for?" if actionType == "outcome" else "Which appointment?" %} +{% set pageTitle = makePageTitle({ pageHeading: ["Contact", "Record an outcome", "Outcome"] }) %} {% set action = '/case/' + crn + '/record-an-outcome/' + actionType %} {% set backLink = '/case/' + crn %} {% block form %} diff --git a/server/views/pages/caseload/minimal-cases.njk b/server/views/pages/caseload/minimal-cases.njk index 9317c92c..e2688606 100644 --- a/server/views/pages/caseload/minimal-cases.njk +++ b/server/views/pages/caseload/minimal-cases.njk @@ -2,7 +2,7 @@ {% set hasCases = caseload.caseload | length > 0 %} {% set hasStaff = caseload !== null %} {% set title = 'My cases' %} -{% block pageTitle %}{{ title }}{% endblock %} +{% set pageTitle = makePageTitle({ pageHeading: "My cases" }) %} {% block pageContent %} {% if currentNavSection == 'teamCases' and caseload.team %} diff --git a/server/views/pages/compliance.njk b/server/views/pages/compliance.njk index 13dd60d3..fef1c893 100644 --- a/server/views/pages/compliance.njk +++ b/server/views/pages/compliance.njk @@ -1,14 +1,12 @@ {% extends "../partials/case.njk" %} {% from "govuk/components/notification-banner/macro.njk" import govukNotificationBanner %} -{% set pageTitle = applicationName + " - Compliance" %} +{% set pageTitle = makePageTitle({ pageHeading: ["Contact", "Compliance"] }) %} {% set currentSectionName = 'Compliance' %} -{% set title = 'Compliance' %} {% set currentNavSection = 'compliance' %} {% set headerPersonName = personCompliance.personSummary.name | fullName %} {% set headerCRN = personCompliance.personSummary.crn %} {% set headerDob = personCompliance.personSummary.dateOfBirth %} {% set headerGender = personCompliance.personSummary.gender %} -{% block pageTitle %}{{ title }}{% endblock %} {% block beforeContent %} {{ govukBreadcrumbs({ diff --git a/server/views/pages/error.njk b/server/views/pages/error.njk index db29f7e9..7121fb64 100755 --- a/server/views/pages/error.njk +++ b/server/views/pages/error.njk @@ -1,6 +1,6 @@ {% extends "../partials/layout.njk" %} -{% set pageTitle = applicationName + " - Error" %} +{% set pageTitle = "Error" + applicationName %} {% set mainClasses = "app-container govuk-body" %} {% block content %} diff --git a/server/views/pages/handoff/delius.njk b/server/views/pages/handoff/delius.njk index 9f13b9e5..f5169bfe 100644 --- a/server/views/pages/handoff/delius.njk +++ b/server/views/pages/handoff/delius.njk @@ -1,6 +1,6 @@ {% extends "../../partials/layout.njk" %} {% set title = 'Continue on National Delius' %} -{% block pageTitle %}{{ title }}{% endblock %} +{% set pageTitle = makePageTitle({ pageHeading: "Continue on National Delius" }) %} {% block beforeContent %} {{ govukBreadcrumbs({ diff --git a/server/views/pages/index.njk b/server/views/pages/index.njk index 0d1b604f..115eb09e 100644 --- a/server/views/pages/index.njk +++ b/server/views/pages/index.njk @@ -1,6 +1,6 @@ {% extends "../partials/layout.njk" %} -{% set pageTitle = applicationName + " - Home" %} +{% set pageTitle = makePageTitle({ pageHeading: "Home" }) %} {% set mainClasses = "app-container govuk-body" %} {% block content %} diff --git a/server/views/pages/interventions.njk b/server/views/pages/interventions.njk index 266cb8a6..ecd99779 100644 --- a/server/views/pages/interventions.njk +++ b/server/views/pages/interventions.njk @@ -1,5 +1,5 @@ {% extends "../partials/case.njk" %} -{% set pageTitle = applicationName + " - Interventions" %} +{% set pageTitle = makePageTitle({ pageHeading: ["Contact", "Interventions"] }) %} {% set currentNavSection = 'interventions' %} {% set currentSectionName = 'Interventions' %} {% set headerPersonName = personSummary.name.forename + ' ' + personSummary.name.surname %} diff --git a/server/views/pages/licence-condition-note.njk b/server/views/pages/licence-condition-note.njk index 9229ada0..ff80c16b 100644 --- a/server/views/pages/licence-condition-note.njk +++ b/server/views/pages/licence-condition-note.njk @@ -1,5 +1,5 @@ {% extends "../partials/case.njk" %} -{% set pageTitle = applicationName + " - Sentence Details" %} +{% set pageTitle = makePageTitle({ pageHeading: ["Contact", "Sentence", "Licence condition"] }) %} {% set currentNavSection = 'sentence' %} {% set currentSectionName = 'Sentence' %} {% set headerPersonName = licenceNoteDetails.personSummary.name.forename + ' ' + licenceNoteDetails.personSummary.name.surname %} diff --git a/server/views/pages/overview.njk b/server/views/pages/overview.njk index 96ed8197..695b38fb 100644 --- a/server/views/pages/overview.njk +++ b/server/views/pages/overview.njk @@ -1,6 +1,6 @@ {% extends "../partials/case.njk" %} {% from "govuk/components/notification-banner/macro.njk" import govukNotificationBanner %} -{% set pageTitle = applicationName + " - Overview" %} +{% set pageTitle = makePageTitle({ pageHeading: ["Contact", "Overview"] }) %} {% set currentNavSection = 'overview' %} {% set currentSectionName = 'Overview' %} {% set appointmentsWithoutAnOutcomeCount = overview.appointmentsWithoutOutcome %} diff --git a/server/views/pages/personal-details.njk b/server/views/pages/personal-details.njk index 9b21fb5a..f57bbeb8 100644 --- a/server/views/pages/personal-details.njk +++ b/server/views/pages/personal-details.njk @@ -1,5 +1,5 @@ {% extends "../partials/case.njk" %} -{% set pageTitle = applicationName + " - Personal Details" %} +{% set pageTitle = makePageTitle({ pageHeading: ["Contact", "Personal details"] }) %} {% set currentNavSection = 'personal-details' %} {% set currentSectionName = 'Personal Details' %} {% set headerPersonName = personalDetails.name.forename + ' ' + personalDetails.name.surname %} diff --git a/server/views/pages/personal-details/circumstances.njk b/server/views/pages/personal-details/circumstances.njk index 87412ab5..fdadc73f 100644 --- a/server/views/pages/personal-details/circumstances.njk +++ b/server/views/pages/personal-details/circumstances.njk @@ -1,6 +1,6 @@ {% extends "../../partials/layout.njk" %} {% set title = 'Personal circumstances' %} -{% block pageTitle %}{{ title }}{% endblock %} +{% set pageTitle = makePageTitle({ pageHeading: ["Contact", "Personal details", "Personal circumstances"] }) %} {% block beforeContent %} {{ govukBreadcrumbs({ diff --git a/server/views/pages/probation-history.njk b/server/views/pages/probation-history.njk index 01d85558..4f1e0fff 100644 --- a/server/views/pages/probation-history.njk +++ b/server/views/pages/probation-history.njk @@ -1,5 +1,5 @@ {% extends "../partials/case.njk" %} -{% set pageTitle = applicationName + " - Sentence Details" %} +{% set pageTitle = makePageTitle({ pageHeading: ["Contact", "Sentence", "Probation history"] }) %} {% set currentNavSection = 'sentence' %} {% set currentSectionName = 'Sentence' %} {% set headerPersonName = sentenceDetails.personSummary.name.forename + ' ' + sentenceDetails.personSummary.name.surname %} diff --git a/server/views/pages/requirement-note.njk b/server/views/pages/requirement-note.njk index 27ea4b06..64a28463 100644 --- a/server/views/pages/requirement-note.njk +++ b/server/views/pages/requirement-note.njk @@ -1,5 +1,5 @@ {% extends "../partials/case.njk" %} -{% set pageTitle = applicationName + " - Sentence Details" %} +{% set pageTitle = makePageTitle({ pageHeading: "Sentence details" }) %} {% set currentNavSection = 'sentence' %} {% set currentSectionName = 'Sentence' %} {% set headerPersonName = requirementNoteDetails.personSummary.name.forename + ' ' + requirementNoteDetails.personSummary.name.surname %} diff --git a/server/views/pages/risk.njk b/server/views/pages/risk.njk index 544632b2..bd1bfc5e 100644 --- a/server/views/pages/risk.njk +++ b/server/views/pages/risk.njk @@ -6,7 +6,7 @@ {% from "../_components/predictor-score/macro.njk" import predictorScore %} {% from "../_components/predictor-timeline-item/macro.njk" import predictorTimelineItem %} -{% set pageTitle = applicationName + " - Risk" %} +{% set pageTitle = makePageTitle({ pageHeading: ["Contact" ,"Risk"] }) %} {% set currentNavSection = 'risk' %} {% set currentSectionName = 'Risk' %} {% set headerPersonName = personRisk.personSummary.name | fullName %} diff --git a/server/views/pages/search.njk b/server/views/pages/search.njk index ce831236..0b445a60 100644 --- a/server/views/pages/search.njk +++ b/server/views/pages/search.njk @@ -2,7 +2,7 @@ {% from "govuk/components/back-link/macro.njk" import govukBackLink %} {% from "probation/case-search/macro.njk" import caseSearch %} -{% set pageTitle = applicationName + " - Search" %} +{% set pageTitle = makePageTitle({ pageHeading: "Search" }) %} {% set mainClasses = "app-container govuk-body" %} {% block content %} diff --git a/server/views/pages/sentence.njk b/server/views/pages/sentence.njk index e47d577f..e365db46 100644 --- a/server/views/pages/sentence.njk +++ b/server/views/pages/sentence.njk @@ -1,5 +1,5 @@ {% extends "../partials/case.njk" %} -{% set pageTitle = applicationName + " - Sentence" %} +{% set pageTitle = makePageTitle({ pageHeading: ["Contact", "Sentence"] }) %} {% set currentNavSection = 'sentence' %} {% set currentSectionName = 'Sentence' %} {% set headerPersonName = sentenceDetails.personSummary.name.forename + ' ' + sentenceDetails.personSummary.name.surname %} diff --git a/server/views/pages/sentence/offences.njk b/server/views/pages/sentence/offences.njk index 80dae4e6..d42c1b1f 100644 --- a/server/views/pages/sentence/offences.njk +++ b/server/views/pages/sentence/offences.njk @@ -1,7 +1,7 @@ {% extends "../../partials/layout.njk" %} {% set title = 'Offences' %} {% set headerPersonName = offences.name.forename + ' ' + offences.name.surname %} - +{% set pageTitle = makePageTitle({ pageHeading: ["Contact", "Sentence", "Offences"] }) %} {% block beforeContent %} {{ govukBreadcrumbs({ items: [ diff --git a/server/views/pages/sentence/previous-orders.njk b/server/views/pages/sentence/previous-orders.njk index 48a20b20..40283f2d 100644 --- a/server/views/pages/sentence/previous-orders.njk +++ b/server/views/pages/sentence/previous-orders.njk @@ -1,5 +1,6 @@ {% extends "../../partials/layout.njk" %} {% set headerPersonName = previousOrderHistory.name.forename + ' ' + previousOrderHistory.name.surname %} +{% set pageTitle = makePageTitle({ pageHeading: ["Contact", "Sentence", "Previous orders"] }) %} {% block beforeContent %} {{ govukBreadcrumbs({