Skip to content

Commit fb47107

Browse files
ChrisS1512KianKwagithub-actions[bot]
authored
PUB-2961 - Magistrates Public Adult Court List Daily (#1526)
* Create style guide for Magistrates Adult Court List * Add routes file changes * Fixed failing unit tests * Fixed failing unit tests * Removed redundant empty line * Removed doh * Update following schema changes * Update code following schema changes * Revert file change * Update Magistrates Adult Court List default sensitivity to classified * PUB-2961 - Mags Public List * PUB-2961 - Fixed linting * PUB-2961 - Fixed a11y test * PUB-2961 - Fixed linting * PUB-2961 - Updated names * PUB-2961 - Fixed formatting * PUB-2961 - Updated language file * PUB-2961 - Formatting * PUB-2961 - Updated name * PUB-2961 - Updated language files --------- Co-authored-by: kian.kwa <[email protected]> Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
1 parent a19ff54 commit fb47107

20 files changed

+622
-152
lines changed

src/main/controllers/style-guide/MagistratesAdultCourtListController.ts

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,8 @@ const courtService = new LocationService();
1414
const helperService = new ListParseHelperService();
1515
const magistratesAdultCourtListService = new MagistratesAdultCourtListService();
1616

17-
const listPath = 'magistrates-adult-court-list';
18-
17+
const standardListPath = 'magistrates-adult-court-list';
18+
const publicListPath = 'magistrates-public-adult-court-list';
1919

2020
export default class MagistratesAdultCourtListController {
2121
public async get(req: PipRequest, res: Response, listType: string): Promise<void> {
@@ -25,12 +25,23 @@ export default class MagistratesAdultCourtListController {
2525
const metadataListType = formatMetaDataListType(metadata);
2626

2727
if (isValidList(payload, metadata) && isValidListType(metadataListType, listType)) {
28-
const listData = magistratesAdultCourtListService.processPayload(payload as JSON, req.lng);
28+
const listPath = listType.startsWith('magistrates-public') ? publicListPath : standardListPath;
29+
30+
const listData = magistratesAdultCourtListService.processPayload(
31+
payload as JSON,
32+
req.lng,
33+
!listType.startsWith('magistrates-public')
34+
);
35+
2936
const returnedLocation = await courtService.getLocationById(metadata['locationId']);
3037
const locationName = courtService.findCourtName(returnedLocation, req.lng, listPath);
3138

3239
const printDate = payload['document'].data.job.printdate;
33-
const publishedDate = formatDate(MagistratesAdultCourtListController.toIsoDate(printDate), 'dd MMMM yyyy', req.lng);
40+
const publishedDate = formatDate(
41+
MagistratesAdultCourtListController.toIsoDate(printDate),
42+
'dd MMMM yyyy',
43+
req.lng
44+
);
3445

3546
const printStartTime = payload['document'].info?.start_time;
3647
const publishedTime = printStartTime ? helperService.publicationTimeInUkTime(printStartTime) : '';

src/main/resources/listLookup.json

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -910,6 +910,16 @@
910910
"defaultSensitivity": "",
911911
"isNonStrategic": true
912912
},
913+
"MAGISTRATES_PUBLIC_ADULT_COURT_LIST_DAILY": {
914+
"friendlyName": "Magistrates Public Adult Court List - Daily",
915+
"welshFriendlyName": "Rhestr Achosion Cyhoeddus Llys Ynadon (Oedolion) - Dyddiol",
916+
"shortenedFriendlyName": "Magistrates Public Adult Court List - Daily",
917+
"url": "magistrates-public-adult-court-list-daily",
918+
"jurisdictionTypes": ["Magistrates Court"],
919+
"restrictedProvenances": [],
920+
"defaultSensitivity": "",
921+
"isNonStrategic": false
922+
},
913923
"MAGISTRATES_ADULT_COURT_LIST_DAILY": {
914924
"friendlyName": "Magistrates Adult Court List - Daily",
915925
"welshFriendlyName": "Rhestr Llys Ynadon Oedolion - Dyddiol",

src/main/resources/locales/cy/magistrates-adult-court-list.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,5 +27,5 @@
2727
"Teitl y Drosedd",
2828
"Crynodeb o’r Drosedd"
2929
],
30-
"dataSource": "Data Source: "
30+
"dataSource": "Ffynhonnell y Data"
3131
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
{
2+
"title": "Rhestr Gyhoeddus y Llys Ynadon",
3+
"heading": "Rhestr Gyhoeddus y Llys Ynadon ar gyfer ",
4+
"listDate": "Rhestr ar gyfer",
5+
"listUpdated": "Diweddarwyd diwethaf",
6+
"at": "am",
7+
"restrictionInformationHeading": "Cyfyngiadau ar gyhoeddi neu ysgrifennu am yr achosion hyn.",
8+
"restrictionInformationP1": "Rhaid i chi wirio a oes unrhyw gyfyngiadau riportio yn berthnasol cyn cyhoeddi manylion am unrhyw un o'r achosion a restrir yma, naill ai'n ysgrifenedig, mewn darllediad neu ar y rhyngrwyd, gan gynnwys y cyfryngau cymdeithasol.",
9+
"restrictionInformationBoldText": "Byddwch yn euog o ddirmyg llys os byddwch yn cyhoeddi unrhyw wybodaeth sydd wedi'i diogelu gan gyfyngiad riportio. Gallwch gael dirwy, eich dedfrydu i garchar, neu'r ddau.",
10+
"restrictionInformationP2": "Bydd cyfyngiadau penodol a orchmynnir gan y llys yn cael eu crybwyll ar yr achosion a restrir yma.",
11+
"restrictionInformationP3": "Fodd bynnag, nid yw'r cyfyngiadau bob amser yn cael eu rhestru. Mae rhai yn berthnasol yn awtomatig. Er enghraifft, anhysbysrwydd a roddir i ddioddefwyr rhai troseddau rhywiol.",
12+
"restrictionInformationP4": "I ganfod pa gyfyngiadau riportio sy'n berthnasol ar achos penodol, cysylltwch â'r:",
13+
"restrictionBulletPoint1": "llys yn uniongyrchol",
14+
"restrictionBulletPoint2": "Gwasanaeth Llysoedd a Thribiwnlysoedd EM ar 0330 808 4407",
15+
"sittingAt": "Yn eistedd yn",
16+
"lja": "LJA:",
17+
"sessionStart": "Yn eistedd yn",
18+
"tableHeaders": [
19+
"Amser rhestru",
20+
"Enw'r Diffynnydd",
21+
"Cyfeirnod yr Achos"
22+
],
23+
"dataSource": "Ffynhonnell y Data"
24+
}

src/main/resources/locales/en/magistrates-adult-court-list.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,5 +27,5 @@
2727
"Offence Title",
2828
"Offence Summary"
2929
],
30-
"dataSource": "Data Source: "
30+
"dataSource": "Data Source"
3131
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
{
2+
"title": "Magistrates Public List",
3+
"heading": "Magistrates Public List for",
4+
"listDate": "List for",
5+
"listUpdated": "Last updated",
6+
"at": "at",
7+
"restrictionInformationHeading": "Restrictions on publishing or writing about these cases",
8+
"restrictionInformationP1": "You must check if any reporting restrictions apply before publishing details on any of the cases listed here either in writing, in a broadcast or by internet, including social media.",
9+
"restrictionInformationBoldText": "You'll be in contempt of court if you publish any information which is protected by a reporting restriction. You could get a fine, prison sentence or both.",
10+
"restrictionInformationP2": "Specific restrictions ordered by the court will be mentioned on the cases listed here.",
11+
"restrictionInformationP3": "However, restrictions are not always listed. Some apply automatically. For example, anonymity given to the victims of certain sexual offences.",
12+
"restrictionInformationP4": "To find out which reporting restrictions apply on a specific case, contact:",
13+
"restrictionBulletPoint1": "the court directly",
14+
"restrictionBulletPoint2": "HM Courts and Tribunals Service on 0330 808 4407",
15+
"sittingAt": "Sitting at",
16+
"lja": "LJA:",
17+
"sessionStart": "Session start",
18+
"tableHeaders": [
19+
"Listing Time",
20+
"Defendant Name",
21+
"Case Number"
22+
],
23+
"dataSource": "Data Source"
24+
}

src/main/routes/routes.ts

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -190,10 +190,27 @@ export default function (app: Application): void {
190190
app.get('/iac-daily-list-additional-cases', app.locals.container.cradle.iacDailyListController.get);
191191
app.get('/magistrates-public-list', app.locals.container.cradle.magistratesPublicListController.get);
192192
app.get('/magistrates-standard-list', app.locals.container.cradle.magistratesStandardListController.get);
193+
app.get('/magistrates-public-adult-court-list-daily', (req, res) =>
194+
app.locals.container.cradle.magistratesAdultCourtListController.get(
195+
req,
196+
res,
197+
'magistrates-public-adult-court-list-daily'
198+
)
199+
);
193200
app.get('/magistrates-adult-court-list-daily', (req, res) =>
194-
app.locals.container.cradle.magistratesAdultCourtListController.get(req, res, 'magistrates-adult-court-list-daily'));
201+
app.locals.container.cradle.magistratesAdultCourtListController.get(
202+
req,
203+
res,
204+
'magistrates-adult-court-list-daily'
205+
)
206+
);
195207
app.get('/magistrates-adult-court-list-future', (req, res) =>
196-
app.locals.container.cradle.magistratesAdultCourtListController.get(req, res, 'magistrates-adult-court-list-future'));
208+
app.locals.container.cradle.magistratesAdultCourtListController.get(
209+
req,
210+
res,
211+
'magistrates-adult-court-list-future'
212+
)
213+
);
197214

198215
//Non-Strategic Paths
199216
app.get('/cst-weekly-hearing-list', (req, res) =>

src/main/service/listManipulation/MagistratesAdultCourtListService.ts

Lines changed: 19 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,10 @@ import { ListParseHelperService } from '../ListParseHelperService';
33
const helperService = new ListParseHelperService();
44

55
export class MagistratesAdultCourtListService {
6-
public processPayload(payload: JSON, language: string): any[] {
6+
public processPayload(payload: JSON, language: string, isStandard: boolean): any[] {
77
const results = [];
88
payload['document'].data.job.sessions.forEach(sessionNode => {
9-
const cases = this.buildCases(sessionNode, language);
9+
const cases = this.buildCases(sessionNode, language, isStandard);
1010
results.push({
1111
lja: sessionNode.lja,
1212
courtName: sessionNode.court,
@@ -18,20 +18,27 @@ export class MagistratesAdultCourtListService {
1818
return results;
1919
}
2020

21-
private buildCases(sessionNode: any, language: string): any[] {
21+
private buildCases(sessionNode: any, language: string, isStandard: boolean): any[] {
2222
const cases = [];
2323
sessionNode.blocks.forEach(blockNode => {
2424
blockNode.cases.forEach(caseNode => {
25-
const caseInfo = {
25+
let caseInfo = {
2626
blockStartTime: helperService.publicationTimeInUkTime(blockNode.bstart),
2727
caseNumber: caseNode.caseno,
2828
defendantName: caseNode.def_name,
29-
defendantDob: caseNode.def_dob ? caseNode.def_dob : '',
30-
defendantAge: caseNode.def_age ? caseNode.def_age : '',
31-
defendantAddress: this.formatDefendantAddress(caseNode.def_addr),
32-
informant: caseNode.inf,
33-
offence: this.processOffences(caseNode.offences, language)
29+
} as object;
30+
31+
if (isStandard) {
32+
caseInfo = {
33+
...caseInfo,
34+
defendantDob: caseNode.def_dob ? caseNode.def_dob : '',
35+
defendantAge: caseNode.def_age ? caseNode.def_age : '',
36+
defendantAddress: this.formatDefendantAddress(caseNode.def_addr),
37+
informant: caseNode.inf,
38+
offence: this.processOffences(caseNode.offences, language),
39+
};
3440
}
41+
3542
cases.push(caseInfo);
3643
});
3744
});
@@ -59,12 +66,12 @@ export class MagistratesAdultCourtListService {
5966
offencesNode.forEach(offenceNode => {
6067
offenceCodes.push(offenceNode.code);
6168
offenceTitles.push(language === 'cy' && offenceNode.cy_title ? offenceNode.cy_title : offenceNode.title);
62-
offenceSummaries.push(language === 'cy' && offenceNode.cy_sum ? offenceNode.cy_sum :offenceNode.sum);
69+
offenceSummaries.push(language === 'cy' && offenceNode.cy_sum ? offenceNode.cy_sum : offenceNode.sum);
6370
});
6471
return {
6572
offenceCode: offenceCodes.filter(line => line.trim().length > 0).join(', '),
6673
offenceTitle: offenceTitles.filter(line => line.trim().length > 0).join(', '),
67-
offenceSummary: offenceSummaries.filter(line => line.trim().length > 0).join(', ')
68-
}
74+
offenceSummary: offenceSummaries.filter(line => line.trim().length > 0).join(', '),
75+
};
6976
}
7077
}
Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
{% from "govuk/components/table/macro.njk" import govukTable as 'govukTable' %}
2+
{% from "../macros/common-components.njk" import goBack, searchInput %}
3+
{% from "govuk/components/warning-text/macro.njk" import govukWarningText %}
4+
5+
{% extends "../list-template.njk" %}
6+
{% block pageTitle %}
7+
{{ title }}
8+
{% endblock %}
9+
10+
{% block beforeContent %}
11+
{{ super() }}
12+
{{ goBack(text = backButton, cspNonce = cspNonce) }}
13+
{% endblock %}
14+
15+
{% block content %}
16+
<div class="parent-box">
17+
<h1 id='page-heading' class="govuk-heading-l">{{ heading }} {{ locationName }}</h1>
18+
<p class="govuk-body govuk-!-font-weight-bold govuk-!-margin-bottom-1">{{ listDate }} {{ contentDate }}</p>
19+
{% if publishedTime | length %}
20+
<p class="govuk-body">{{ listUpdated }} {{ publishedDate }} {{ at }} {{ publishedTime }}</p>
21+
{% else %}
22+
<p class="govuk-body">{{ listUpdated }} {{ publishedDate }}</p>
23+
{% endif %}
24+
25+
<div class="govuk-grid restriction-list-section govuk-!-margin-bottom-5">
26+
<div class="govuk-body">
27+
<h3>{{ restrictionInformationHeading }}</h3>
28+
<p class="govuk-body">{{ restrictionInformationP1 }}</p>
29+
<div class="govuk-warning-text">
30+
<span class="govuk-warning-text__icon align-warning-icon" aria-hidden="true">!</span>
31+
<strong class="govuk-warning-text__text">
32+
<span class="govuk-warning-text__assistive">Warning</span>
33+
{{ restrictionInformationBoldText }}
34+
</strong>
35+
</div>
36+
<p class="govuk-body">{{ restrictionInformationP2 }}</p>
37+
<p class="govuk-body">{{ restrictionInformationP3 }}</p>
38+
<p class="govuk-body">{{ restrictionInformationP4 }}</p>
39+
<ul class="govuk-list govuk-list--bullet">
40+
<li>{{ restrictionBulletPoint1 }}</li>
41+
<li>{{ restrictionBulletPoint2 }}</li>
42+
</ul>
43+
</div>
44+
</div>
45+
46+
{{ searchInput(text = searchCases) }}
47+
<div class="search-area">
48+
{% set listSessionCount = 0 %}
49+
<div class="govuk-accordion" data-module="govuk-accordion" id="accordion-default-1">
50+
{% for listSession in listData %}
51+
{% set listSessionCount = listSessionCount + 1 %}
52+
<div class="govuk-accordion__section govuk-accordion__section--expanded">
53+
<div class="govuk-accordion__section-header">
54+
<h2 class="govuk-accordion__section-heading">
55+
<span class="govuk-accordion__section-button" id="accordion-default-heading-{{ listSessionCount }}">{{ listSession.courtName }}</span>
56+
</h2>
57+
<p class="govuk-body govuk-!-font-weight-bold govuk-!-margin-bottom-1">{{ sittingAt }} {{ listSession.courtRoom }}</p>
58+
<p class="govuk-body govuk-!-margin-bottom-1">{{ lja }} {{ listSession.lja }}</p>
59+
<p class="govuk-body">{{ sessionStart }} {{ listSession.sessionStartTime }}</p>
60+
</div>
61+
<div id="accordion-default-content-{{ listSessionCount }}" class="govuk-accordion__section-content" aria-labelledby="accordion-default-heading-{{ listSessionCount }}">
62+
<div class="parent-box overflow-table">
63+
<table class="govuk-table overflow-table" data-module="moj-sortable-table">
64+
<thead class="govuk-table__head">
65+
<tr class="govuk-table__row">
66+
<th scope="col" class="govuk-table__header" aria-sort="none">{{ tableHeaders[0] }}</th>
67+
<th scope="col" class="govuk-table__header" aria-sort="none">{{ tableHeaders[1] }}</th>
68+
<th scope="col" class="govuk-table__header" aria-sort="none">{{ tableHeaders[2] }}</th>
69+
</tr>
70+
</thead>
71+
<tbody class="govuk-table__body">
72+
{% for row in listSession.cases %}
73+
<tr class="govuk-table__row">
74+
<td class="govuk-table__cell" data-sort-value="{{ row.blockStartTime | timeToSortValue }}">{{ row.blockStartTime }}</td>
75+
<td class="govuk-table__cell">{{ row.defendantName }}</td>
76+
<td class="govuk-table__cell">{{ row.caseNumber }}</td>
77+
</tr>
78+
{% endfor %}
79+
</tbody>
80+
</table>
81+
</div>
82+
</div>
83+
</div>
84+
{% endfor %}
85+
</div>
86+
<p class="govuk-body govuk-!-font-size-14 data-source">{{ dataSource }}: {{ provenance | convertDataSourceName(lng) }}</p>
87+
{{ super() }}
88+
</div>
89+
</div>
90+
{% endblock %}
Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,32 +1,37 @@
11
import sinon from 'sinon';
22
import { PublicationService } from '../../../../main/service/PublicationService';
33
import { testAccessibility } from '../../common/pa11yHelper';
4-
import {
5-
MagistratesAdultCourtListService
6-
} from '../../../../main/service/listManipulation/MagistratesAdultCourtListService';
74
import { LocationService } from '../../../../main/service/LocationService';
85
import { testArtefactJsonData, testArtefactMetadata, testLocationData } from '../../common/testData';
96

10-
const userId = '1'
7+
const userId = '1';
118
const urlDailyList = '/magistrates-adult-court-list-daily';
129
const urlFutureList = '/magistrates-adult-court-list-future';
10+
const urlPublicDailyList = '/magistrates-public-adult-court-list-daily';
1311

14-
const jsonData = testArtefactJsonData('magistratesAdultCourtList.json');
12+
const standardJsonData = testArtefactJsonData('magistratesAdultCourtList.json');
13+
const publicJsonData = testArtefactJsonData('magistratesPublicAdultCourtList.json');
1514
const metadata = testArtefactMetadata()[0];
1615
const locationData = testLocationData();
1716

1817
const metadataDailyList = metadata;
1918
metadataDailyList.listType = 'MAGISTRATES_ADULT_COURT_LIST_DAILY';
2019
const metadataFutureList = metadata;
2120
metadataFutureList.listType = 'MAGISTRATES_ADULT_COURT_LIST_FUTURE';
21+
const metadataPublicDailyList = metadata;
22+
metadataPublicDailyList.listType = 'MAGISTRATES_PUBLIC_ADULT_COURT_LIST_DAILY';
2223

23-
sinon.stub(MagistratesAdultCourtListService.prototype, 'processPayload').resolves(jsonData);
2424
sinon.stub(LocationService.prototype, 'getLocationById').resolves(locationData);
25-
sinon.stub(PublicationService.prototype, 'getIndividualPublicationJson').resolves(jsonData);
25+
26+
const magsAdultCourtListJsonStub = sinon.stub(PublicationService.prototype, 'getIndividualPublicationJson');
27+
magsAdultCourtListJsonStub.withArgs('abc').resolves(standardJsonData);
28+
magsAdultCourtListJsonStub.withArgs('def').resolves(standardJsonData);
29+
magsAdultCourtListJsonStub.withArgs('ace').resolves(publicJsonData);
2630

2731
const metadataStub = sinon.stub(PublicationService.prototype, 'getIndividualPublicationMetadata');
2832
metadataStub.withArgs('abc', userId).returns(metadataDailyList);
2933
metadataStub.withArgs('def', userId).returns(metadataFutureList);
34+
metadataStub.withArgs('ace', userId).returns(metadataPublicDailyList);
3035

3136
describe('Accessibility - Magistrates Adult Court List Daily Page', () => {
3237
testAccessibility(`${urlDailyList}?artefactId=abc`);
@@ -35,3 +40,7 @@ describe('Accessibility - Magistrates Adult Court List Daily Page', () => {
3540
describe('Accessibility - Magistrates Adult Court List Future Page', () => {
3641
testAccessibility(`${urlFutureList}?artefactId=def`);
3742
});
43+
44+
describe('Accessibility - Magistrates Public Adult Court List Page', () => {
45+
testAccessibility(`${urlPublicDailyList}?artefactId=ace`);
46+
});

0 commit comments

Comments
 (0)