Skip to content

Feature/cdd-2405: Date prefix #570

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
wants to merge 4 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion jest.config.js
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ const customJestConfig = {

// Will update back up as part of CDD-2370
statements: 91,
branches: 80,
branches: 79,
lines: 92,
functions: 87,
},
Expand Down
8 changes: 3 additions & 5 deletions public/locales/en/common.json
Original file line number Diff line number Diff line change
Expand Up @@ -26,8 +26,7 @@
"blocks": {
"headline": {
"heading": "{{heading}}",
"value": "{{value, number}}",
"date": "Up to {{value, dateShortest}}"
"value": "{{value, number}}"
},
"percentage": {
"heading": "{{heading}}",
Expand Down Expand Up @@ -58,7 +57,7 @@
}
},
"timestamp": {
"value": "Up to and including {{value, dateShort}}"
"value": "{{prefix}} {{value, dateShortest}}"
},
"table": {
"toggle": "View data in a tabular format",
Expand All @@ -76,8 +75,7 @@
"row_geography": "{{value}}",
"row_sex": "{{value}}",
"row_stratum": "{{value}}",
"caption": "{{title}} data for {{body, lowerCaseFirstLetter}}",
"timestamp": "Up to and including {{timestamp, dateShort}}"
"caption": "{{title}} data for {{body, lowerCaseFirstLetter}}"
},
"download": {
"heading": "Download data",
Expand Down
3 changes: 3 additions & 0 deletions src/api/models/cms/Page/Blocks.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ export const HeadlineNumber = z.object({
body: z.string(),
}),
id: z.string(),
date_prefix: z.string(),
})

export const TrendNumber = z.object({
Expand All @@ -21,6 +22,7 @@ export const TrendNumber = z.object({
body: z.string(),
}),
id: z.string(),
date_prefix: z.string(),
})

export const PercentageNumber = z.object({
Expand All @@ -29,6 +31,7 @@ export const PercentageNumber = z.object({
body: z.string(),
}),
id: z.string(),
date_prefix: z.string(),
})

export const Blocks = z.array(z.discriminatedUnion('type', [HeadlineNumber, TrendNumber, PercentageNumber]))
3 changes: 3 additions & 0 deletions src/api/models/cms/Page/Body.ts
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ export const WithHeadlineNumbersRowCard = z.object({
type: z.literal('column'),
value: z.object({
title: z.string(),
date_prefix: z.string(),
rows: Blocks,
}),
})
Expand All @@ -40,6 +41,7 @@ export const WithChartHeadlineAndTrendCard = z.object({
body: z.string(),
chart: Chart,
tag_manager_event_id: z.string().nullable(),
date_prefix: z.string(),
x_axis: z.string().nullable(),
y_axis: z.string().nullable(),
headline_number_columns: Blocks,
Expand All @@ -54,6 +56,7 @@ export const WithChartCard = z.object({
body: z.string(),
chart: Chart,
tag_manager_event_id: z.string().nullable(),
date_prefix: z.string(),
x_axis: z.string().nullable(),
y_axis: z.string().nullable(),
x_axis_title: z.string().optional(),
Expand Down
45 changes: 0 additions & 45 deletions src/api/requests/cms/getPage.spec.ts

This file was deleted.

44 changes: 44 additions & 0 deletions src/api/requests/cms/getPage.tempremovespec.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
// import z from 'zod'

// import { client } from '@/api/utils/api.utils'
// import { logger } from '@/lib/logger'

// import { getPage, responseSchema } from './getPage'

// type SuccessResponse = z.SafeParseSuccess<z.infer<typeof responseSchema>>
// type ErrorResponse = z.SafeParseError<z.infer<typeof responseSchema>>

// test('Returns a full page from thge cms by id', async () => {
// jest.mocked(client).mockResolvedValueOnce({ data: dashboardMock, status: 200 })

// const result = await getPage(dashboardMock.id)

// expect(result).toEqual<SuccessResponse>({
// success: true,
// data: dashboardMock,
// })
// })

// test('Handles invalid json received from the api', async () => {
// jest.mocked(client).mockResolvedValueOnce({ data: { ...dashboardMock, last_published_at: null }, status: 200 })

// const result = await getPage(dashboardMock.id)

// expect(result).toEqual<ErrorResponse>({
// success: false,
// error: expect.any(Object),
// })
// })

// test('Handles generic http errors', async () => {
// jest.mocked(client).mockRejectedValueOnce({ status: 400 })

// const result = await getPage(dashboardMock.id)

// expect(logger.error).toHaveBeenCalledTimes(1)

// expect(result).toEqual<ErrorResponse>({
// success: false,
// error: expect.any(Object),
// })
// })
5 changes: 5 additions & 0 deletions src/app/components/cms/Chart/Chart.spec.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,7 @@ test('renders the chart correctly when successful', async () => {
tag_manager_event_id: '',
title: '',
headline_number_columns: [],
date_prefix: '',
}

const { getByAltText } = render((await Chart({ data, size: 'narrow' })) as ReactElement)
Expand Down Expand Up @@ -135,6 +136,7 @@ test('renders the chart by geography and geography type when both are present in
tag_manager_event_id: '',
title: '',
headline_number_columns: [],
date_prefix: '',
}

const { getByAltText } = render((await Chart({ data, size: 'narrow' })) as ReactElement)
Expand Down Expand Up @@ -193,6 +195,7 @@ test('full width charts should also have an acompanying narrow version for mobil
tag_manager_event_id: '',
title: '',
headline_number_columns: [],
date_prefix: '',
}

const { getByAltText, getByTestId } = render((await Chart({ data, size: 'wide' })) as ReactElement)
Expand Down Expand Up @@ -231,6 +234,7 @@ test('renders a fallback message when the chart requests fail', async () => {
title: 'Cases by specimen date',
headline_number_columns: [],
tag_manager_event_id: '',
date_prefix: '',
}

const { getByText, getByRole } = render((await Chart({ data, size: 'narrow' })) as ReactElement)
Expand Down Expand Up @@ -269,6 +273,7 @@ test('Fallback message with escaped characters', async () => {
tag_manager_event_id: '',
title: 'Cases by specimen date',
headline_number_columns: [],
date_prefix: '',
}

const { getByText } = render((await Chart({ data, size: 'narrow' })) as ReactElement)
Expand Down
1 change: 1 addition & 0 deletions src/app/components/cms/Download/Download.spec.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,7 @@ const props: ComponentProps<typeof Download> = {
headline_number_columns: [],
title: 'Table Title',
body: 'Table Body',
date_prefix: '',
},
}

Expand Down
6 changes: 3 additions & 3 deletions src/app/components/cms/Headline/Headline.spec.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ describe('Data request is successful', () => {
}

test('renders a heading, date and number', async () => {
const { getByText } = render((await Headline({ data })) as ReactElement)
const { getByText } = render((await Headline({ data, datePrefix: 'Up to' })) as ReactElement)
const headingElement = getByText('Test Heading')
const dateElement = getByText('Up to 3 Nov 2023')
const valueElement = getByText('24,000')
Expand All @@ -30,7 +30,7 @@ describe('Data request is successful', () => {
})

test('hides the date within chart cards', async () => {
const { getByText } = render((await Headline({ data })) as ReactElement)
const { getByText } = render((await Headline({ data, datePrefix: 'Up to' })) as ReactElement)
const dateElement = getByText('Up to 3 Nov 2023')
expect(dateElement).toHaveClass('[.ukhsa-chart-card_&]:hidden')
})
Expand All @@ -57,7 +57,7 @@ describe('Data request is unsuccessful', () => {
body: 'Test Heading',
}

const { container } = render((await Headline({ data })) as ReactElement)
const { container } = render((await Headline({ data, datePrefix: '' })) as ReactElement)

expect(container.firstChild).toBeNull()
})
Expand Down
5 changes: 3 additions & 2 deletions src/app/components/cms/Headline/Headline.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,10 @@ import { getServerTranslation } from '@/app/i18n'
interface HeadlineProps {
/* Request metadata from the CMS required to fetch from the headlines api */
data: z.infer<typeof HeadlineNumber>['value']
datePrefix: string
}

export async function Headline({ data: { body: heading, ...requestParams } }: HeadlineProps) {
export async function Headline({ data: { body: heading, ...requestParams }, datePrefix }: HeadlineProps) {
const { t } = await getServerTranslation('common')

const headline = await getHeadlines(requestParams)
Expand All @@ -23,7 +24,7 @@ export async function Headline({ data: { body: heading, ...requestParams } }: He
<div>
<div>{t('cms.blocks.headline.heading', { heading })}</div>
<div className="govuk-body-xs govuk-!-margin-bottom-1 text-dark-grey [.ukhsa-chart-card_&]:hidden">
{t('cms.blocks.headline.date', { value: date })}
{t('cms.blocks.timestamp.value', { prefix: datePrefix, value: date })}
</div>
<div className="govuk-body-l govuk-!-margin-bottom-0">{t('cms.blocks.headline.value', { value })}</div>
</div>
Expand Down
8 changes: 4 additions & 4 deletions src/app/components/cms/Percentage/Percentage.spec.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ describe('Data request is successful', () => {
test('renders a heading, date and percentage', async () => {
getHeadlinesMock.mockResolvedValueOnce({ success: true, data: { value: 50.5, period_end: '2023-11-03' } })

const { getByText } = render((await Percentage({ data })) as ReactElement)
const { getByText } = render((await Percentage({ data, datePrefix: 'Up to' })) as ReactElement)
const headingElement = getByText('Test Heading')
const dateElement = getByText('Up to 3 Nov 2023')
const valueElement = getByText('50.5%')
Expand All @@ -33,7 +33,7 @@ describe('Data request is successful', () => {
test('formats the percentage to two decimal places', async () => {
getHeadlinesMock.mockResolvedValueOnce({ success: true, data: { value: 55.3846, period_end: '2023-11-03' } })

const { getByText } = render((await Percentage({ data })) as ReactElement)
const { getByText } = render((await Percentage({ data, datePrefix: '' })) as ReactElement)
const headingElement = getByText('Test Heading')
const valueElement = getByText('55.38%')

Expand All @@ -44,7 +44,7 @@ describe('Data request is successful', () => {
test('hides the date within chart cards', async () => {
getHeadlinesMock.mockResolvedValueOnce({ success: true, data: { value: 50.5, period_end: '2023-11-03' } })

const { getByText } = render((await Percentage({ data })) as ReactElement)
const { getByText } = render((await Percentage({ data, datePrefix: 'Up to' })) as ReactElement)
const dateElement = getByText('Up to 3 Nov 2023')
expect(dateElement).toHaveClass('[.ukhsa-chart-card_&]:hidden')
})
Expand All @@ -71,7 +71,7 @@ describe('Data request is unsuccessful', () => {
body: 'Test Heading',
}

const { container } = render((await Percentage({ data })) as ReactElement)
const { container } = render((await Percentage({ data, datePrefix: '' })) as ReactElement)

expect(container.firstChild).toBeNull()
})
Expand Down
5 changes: 3 additions & 2 deletions src/app/components/cms/Percentage/Percentage.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,10 @@ import { getServerTranslation } from '@/app/i18n'
interface PercentageProps {
/* Request metadata from the CMS required to fetch from the headlines api */
data: z.infer<typeof HeadlineNumber>['value']
datePrefix: string
}

export async function Percentage({ data: { body: heading, ...requestParams } }: PercentageProps) {
export async function Percentage({ data: { body: heading, ...requestParams }, datePrefix }: PercentageProps) {
const { t } = await getServerTranslation('common')

const headline = await getHeadlines(requestParams)
Expand All @@ -23,7 +24,7 @@ export async function Percentage({ data: { body: heading, ...requestParams } }:
<div>
<div>{t('cms.blocks.percentage.heading', { heading })}</div>
<div className="govuk-body-xs govuk-!-margin-bottom-1 text-dark-grey [.ukhsa-chart-card_&]:hidden">
{t('cms.blocks.headline.date', { value: date })}
{t('cms.blocks.timestamp.value', { prefix: datePrefix, value: date })}
</div>
<div className="govuk-body-l govuk-!-margin-bottom-0">{t('cms.blocks.percentage.value', { value })}</div>
</div>
Expand Down
1 change: 1 addition & 0 deletions src/app/components/cms/Table/Table.spec.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -120,6 +120,7 @@ const mockData: ComponentProps<typeof Table>['data'] = {
headline_number_columns: [],
title: 'Table Title ABC/XYZ',
body: 'Table Body',
date_prefix: 'Up to and including',
}

const mockSize = 'narrow'
Expand Down
6 changes: 4 additions & 2 deletions src/app/components/cms/Table/Table.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ interface TableProps {
size: 'narrow' | 'wide'
}

export async function Table({ data: { chart, y_axis, x_axis, title, body }, size }: TableProps) {
export async function Table({ data: { chart, y_axis, x_axis, title, body, date_prefix }, size }: TableProps) {
const { t } = await getServerTranslation('common')

const pathname = getPathname()
Expand Down Expand Up @@ -66,7 +66,9 @@ export async function Table({ data: { chart, y_axis, x_axis, title, body }, size
<table className="govuk-table govuk-!-margin-bottom-0 table-fixed border-separate border-spacing-0">
<caption className="govuk-table__caption govuk-table__caption--s govuk-!-margin-bottom-2 font-normal">
<RichText className="govuk-!-margin-bottom-2">{t('cms.blocks.table.caption', { title, body })}</RichText>
<p className="govuk-!-margin-0">{t('cms.blocks.table.timestamp', { timestamp })}</p>
<p className="govuk-!-margin-0">
{t('cms.blocks.timestamp.value', { prefix: date_prefix, value: timestamp })}
</p>
{hasReportingDelayPeriod && (
<>
<p className="govuk-body-s govuk-!-padding-top-4 govuk-!-padding-right-2 inline-block">
Expand Down
2 changes: 2 additions & 0 deletions src/app/components/cms/Timestamp/Timestamp.spec.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ test('renders the timestamp correctly when successful', async () => {
y_axis: null,
chart: [],
tag_manager_event_id: '',
date_prefix: 'Up to and including',
body: '',
title: '',
headline_number_columns: [],
Expand Down Expand Up @@ -53,6 +54,7 @@ test('renders null when the timestamp request fails', async () => {
y_axis: null,
chart: [],
tag_manager_event_id: '',
date_prefix: '',
body: '',
title: '',
headline_number_columns: [],
Expand Down
4 changes: 2 additions & 2 deletions src/app/components/cms/Timestamp/Timestamp.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ interface TimestampProps {
export async function Timestamp({ data, size }: TimestampProps) {
const { t } = await getServerTranslation('common')

const { chart, x_axis, y_axis } = data
const { chart, x_axis, y_axis, date_prefix } = data

const plots = chart.map((plot) => plot.value)

Expand All @@ -40,7 +40,7 @@ export async function Timestamp({ data, size }: TimestampProps) {

return (
<h4 className="govuk-body-s govuk-!-margin-bottom-0 text-dark-grey">
{t('cms.blocks.timestamp.value', { value: lastUpdated })}
{t('cms.blocks.timestamp.value', { prefix: date_prefix, value: lastUpdated })}
</h4>
)
}
Expand Down
Loading
Loading