Skip to content

Commit 208097b

Browse files
Merge branch 'master' into PAF-129-Bug-fix
2 parents c52738a + ce4244b commit 208097b

35 files changed

+585
-79
lines changed

.drone.yml

+1
Original file line numberDiff line numberDiff line change
@@ -275,6 +275,7 @@ steps:
275275
branch: master
276276
event: push
277277

278+
278279
# Tear down pull request UAT environment.
279280
- name: tear_down_branch
280281
pull: if-not-exists

apps/paf/behaviours/save-file.js

+37-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
'use strict';
22

33
const _ = require('lodash');
4+
const config = require('../../../config');
45
const Model = require('../models/file-upload');
6+
const fileSizeNum = size => size.match(/\d+/g)[0];
57

68
module.exports = name => superclass => class extends superclass {
79
process(req) {
@@ -20,7 +22,41 @@ module.exports = name => superclass => class extends superclass {
2022
if (!Object.keys(req.form.errors).length) {
2123
req.form.values['other-info-file-upload'] = null;
2224
}
23-
return super.locals(req, res, next);
25+
const maxNum = fileSizeNum(config.upload.maxFileSize);
26+
const maxSize = config.upload.maxFileSize.match(/[a-zA-Z]+/g)[0].toUpperCase();
27+
return Object.assign({}, super.locals(req, res, next), {
28+
maxFileSize: `${maxNum} ${maxSize}`
29+
});
30+
}
31+
32+
validateField(key, req) {
33+
if (req.form.values['other-info-file-upload']) {
34+
const fileUpload = _.get(req.files, `${name}`);
35+
if (fileUpload) {
36+
const uploadSize = fileUpload.size;
37+
const mimetype = fileUpload.mimetype;
38+
const uploadSizeTooBig = uploadSize > (fileSizeNum(config.upload.maxFileSize) * 1000000);
39+
const uploadSizeBeyondServerLimits = uploadSize === null;
40+
const invalidMimetype = !config.upload.allowedMimeTypes.includes(mimetype);
41+
const invalidSize = uploadSizeTooBig || uploadSizeBeyondServerLimits;
42+
43+
if (invalidSize || invalidMimetype) {
44+
return new this.ValidationError(key, {
45+
key,
46+
type: invalidSize ? 'maxFileSize' : 'fileType',
47+
redirect: undefined
48+
});
49+
}
50+
} else {
51+
return new this.ValidationError(key, {
52+
key,
53+
type: 'required',
54+
redirect: undefined
55+
});
56+
}
57+
}
58+
59+
return super.validateField(key, req);
2460
}
2561

2662
saveValues(req, res, next) {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
module.exports = superclass => class extends superclass {
2+
locals(req, res) {
3+
const locals = super.locals(req, res);
4+
5+
// set crime-transport-vehicle toggles
6+
if (req.form.values['crime-car-group'] === 'car') {
7+
locals.carChecked = true;
8+
} else if (req.form.values['crime-car-group'] === 'car-transporter') {
9+
locals.carTransporterChecked = true;
10+
} else if (req.form.values['crime-hgv-group'] === 'hgv-canvas-sided') {
11+
locals.hgvCSChecked = true;
12+
} else if (req.form.values['crime-hgv-group'] === 'hgv-flatbed') {
13+
locals.hgvFChecked = true;
14+
} else if (req.form.values['crime-hgv-group'] === 'hgv-hard-sided') {
15+
locals.hgvHSChecked = true;
16+
} else if (req.form.values['crime-hgv-group'] === 'hgv-refrigerated') {
17+
locals.hgvRChecked = true;
18+
} else if (req.form.values['crime-hgv-group'] === 'hgv-tanker') {
19+
locals.hgvTChecked = true;
20+
} else if (req.form.values['crime-lorry-group'] === 'lorry') {
21+
locals.lorryChecked = true;
22+
} else if (req.form.values['crime-lorry-group'] === 'lorry-and-drag') {
23+
locals.lorryDragChecked = true;
24+
} else if (req.form.values['crime-van-group'] === 'van') {
25+
locals.vanChecked = true;
26+
} else if (req.form.values['crime-van-group'] === 'van-and-trailer') {
27+
locals.vanTrailerChecked = true;
28+
} else if (req.form.values['crime-van-group'] === 'van-other') {
29+
locals.vanOtherChecked = true;
30+
} else if (req.form.values['crime-van-group'] === 'seven-point-five-tonne-van') {
31+
locals.sevenVanChecked = true;
32+
}
33+
34+
// set crime-transport-boat toggles
35+
if (req.form.values['crime-carrier-group'] === 'bulk-carrier') {
36+
locals.bulkChecked = true;
37+
} else if (req.form.values['crime-carrier-group'] === 'vehicle-carrier') {
38+
locals.vehicleChecked = true;
39+
} else if (req.form.values['crime-carrier-group'] === 'vessel-carrier') {
40+
locals.vesselChecked = true;
41+
} else if (req.form.values['crime-general-cargo-group'] === 'general-cargo') {
42+
locals.generalChecked = true;
43+
} else if (req.form.values['crime-general-cargo-group'] === 'general-cargo-with-container-capacity') {
44+
locals.generalContainerChecked = true;
45+
} else if (req.form.values['crime-vessel-group'] === 'research-vessel') {
46+
locals.researchChecked = true;
47+
} else if (req.form.values['crime-vessel-group'] === 'supply-vessel') {
48+
locals.supplyChecked = true;
49+
} else if (req.form.values['crime-vessel-group'] === 'support-vessel') {
50+
locals.supportChecked = true;
51+
}
52+
53+
// set report-person-transport toggles
54+
if (req.form.values['report-person-transport-car-group'] === 'car') {
55+
locals.personCarChecked = true;
56+
} else if (req.form.values['report-person-transport-car-group'] === 'car-transporter') {
57+
locals.personCarTransporterChecked = true;
58+
} else if (req.form.values['report-person-transport-hgv-group'] === 'hgv-canvas-sided') {
59+
locals.personHgvCSChecked = true;
60+
} else if (req.form.values['report-person-transport-hgv-group'] === 'hgv-flatbed') {
61+
locals.personHgvFChecked = true;
62+
} else if (req.form.values['report-person-transport-hgv-group'] === 'hgv-hard-sided') {
63+
locals.personHgvHSChecked = true;
64+
} else if (req.form.values['report-person-transport-hgv-group'] === 'hgv-refrigerated') {
65+
locals.personHgvRChecked = true;
66+
} else if (req.form.values['report-person-transport-hgv-group'] === 'hgv-tanker') {
67+
locals.personHgvTChecked = true;
68+
} else if (req.form.values['report-person-transport-lorry-group'] === 'lorry') {
69+
locals.personLorryChecked = true;
70+
} else if (req.form.values['report-person-transport-lorry-group'] === 'lorry-and-drag') {
71+
locals.personLorryDragChecked = true;
72+
} else if (req.form.values['report-person-transport-van-group'] === 'van') {
73+
locals.personVanChecked = true;
74+
} else if (req.form.values['report-person-transport-van-group'] === 'van-and-trailer') {
75+
locals.personVanTrailerChecked = true;
76+
} else if (req.form.values['report-person-transport-van-group'] === 'van-other') {
77+
locals.personVanOtherChecked = true;
78+
} else if (req.form.values['report-person-transport-van-group'] === 'seven-point-five-tonne-van') {
79+
locals.personSevenVanChecked = true;
80+
}
81+
82+
return locals;
83+
}
84+
};

apps/paf/behaviours/time-formatter.js

+56
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
/* eslint-disable max-len */
2+
const _ = require('lodash');
3+
4+
module.exports = superclass => class extends superclass {
5+
configure(req, res, next) {
6+
// preprend '0' if number is only a single digit
7+
const pad = num => num !== '' && num.length < 2 ? `0${num}` : num;
8+
9+
if (req.sessionModel.get('time-crime-will-happen-hour')) {
10+
req.sessionModel.set('time-crime-will-happen-hour', pad(req.sessionModel.get('time-crime-will-happen-hour')));
11+
}
12+
if (req.sessionModel.get('time-crime-will-happen-minute')) {
13+
req.sessionModel.set('time-crime-will-happen-minute', pad(req.sessionModel.get('time-crime-will-happen-minute')));
14+
}
15+
// sets minutes to 00 if the hour field has been completed but the minute field left blank
16+
if (req.sessionModel.get('time-crime-will-happen-hour') && req.sessionModel.get('time-crime-will-happen-minute') === '') {
17+
req.sessionModel.set('time-crime-will-happen-minute', '00');
18+
}
19+
20+
if (req.sessionModel.get('time-crime-will-happen-hour') && req.sessionModel.get('time-crime-will-happen-minute')) {
21+
const time = req.sessionModel.get('time-crime-will-happen-hour').concat(' : ', req.sessionModel.get('time-crime-will-happen-minute'));
22+
if (req.sessionModel.get('time-crime-will-happen-hour') < 12) {
23+
req.sessionModel.set('time-crime-will-happen', time + ' am');
24+
} else {
25+
req.sessionModel.set('time-crime-will-happen', time + ' pm');
26+
}
27+
} else {
28+
req.sessionModel.unset('time-crime-will-happen');
29+
}
30+
31+
return super.configure(req, res, next);
32+
}
33+
34+
locals(req, res) {
35+
const locals = super.locals(req, res);
36+
// set change link for for time-crime-will-happen field
37+
if (locals.route === 'confirm') {
38+
_.forEach(locals.rows, fields => {
39+
locals.rows = locals.rows.map(row => {
40+
if (row.section === 'The Crime - Duration') {
41+
_.forEach(fields, sectionFields => {
42+
_.forEach(sectionFields, field => {
43+
if (field.field === 'time-crime-will-happen') {
44+
field.changeLink = '/paf/date-time-crime-will-happen/edit#time-crime-will-happen-hour';
45+
}
46+
});
47+
});
48+
return row;
49+
}
50+
return row;
51+
});
52+
});
53+
}
54+
return locals;
55+
}
56+
};

apps/paf/fields/index.js

+21-5
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ function lettersAndSpacesOnly(value) {
1616
return /^[A-Za-z\s]*$/.test(value);
1717
}
1818
const moment = require('moment');
19+
const after1900Validator = { type: 'after', arguments: ['1900'] };
1920
const PRETTY_DATE_FORMAT = 'Do MMMM YYYY';
2021

2122
module.exports = {
@@ -125,12 +126,24 @@ module.exports = {
125126
options: [
126127
'next-twenty-four-hours',
127128
'more-than-twenty-four-hours',
128-
'unknown'
129+
'when-will-crime-happen-unknown'
129130
]
130131
},
131132
'date-crime-will-happen': dateComponent('date-crime-will-happen', {
132133
mixin: 'input-date'
133134
}),
135+
'time-crime-will-happen-hour': {
136+
mixin: 'input-text',
137+
className: ['govuk-input', 'govuk-date-input__input', 'govuk-input--width-2'],
138+
attributes: [{ attribute: 'maxlength', value: '2' }],
139+
validate: ['numeric', { type: 'min', arguments: 0}, { type: 'max', arguments: 23 }]
140+
},
141+
'time-crime-will-happen-minute': {
142+
mixin: 'input-text',
143+
className: ['govuk-input', 'govuk-date-input__input', 'govuk-input--width-2'],
144+
attributes: [{ attribute: 'maxlength', value: '2' }],
145+
validate: ['numeric', { type: 'min', arguments: 0}, { type: 'max', arguments: 59 }]
146+
},
134147
'time-crime-will-happen': {
135148
mixin: 'input-text'
136149
},
@@ -242,7 +255,7 @@ module.exports = {
242255
'hgv-canvas-sided',
243256
'hgv-flatbed',
244257
'hgv-hard-sided',
245-
'hgv-refridgerated',
258+
'hgv-refrigerated',
246259
'hgv-tanker'
247260
],
248261
dependent: {
@@ -678,7 +691,8 @@ module.exports = {
678691
},
679692
'report-person-dob': dateComponent('report-person-dob', {
680693
isPageHeading: true,
681-
mixin: 'input-date'
694+
mixin: 'input-date',
695+
validate: ['before', after1900Validator]
682696
}),
683697
'report-person-age-range': {
684698
mixin: 'radio-group',
@@ -1039,7 +1053,7 @@ module.exports = {
10391053
'hgv-canvas-sided',
10401054
'hgv-flatbed',
10411055
'hgv-hard-sided',
1042-
'hgv-refridgerated',
1056+
'hgv-refrigerated',
10431057
'hgv-tanker'
10441058
],
10451059
dependent: {
@@ -1130,6 +1144,7 @@ module.exports = {
11301144
personAddDob: dateComponent('personAddDob', {
11311145
isPageHeading: true,
11321146
mixin: 'input-date',
1147+
validate: ['before', after1900Validator],
11331148
parse: d => d && moment(d).format(PRETTY_DATE_FORMAT)
11341149
}),
11351150
personAddAgeRange: {
@@ -1342,7 +1357,8 @@ module.exports = {
13421357
},
13431358
'about-you-dob': dateComponent('about-you-dob', {
13441359
isPageHeading: true,
1345-
mixin: 'input-date'
1360+
mixin: 'input-date',
1361+
validate: ['before', after1900Validator]
13461362
}),
13471363
'about-you-nationality': {
13481364
isPageHeading: true,

apps/paf/index.js

+7-2
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,15 @@ const limitDocs = require('./behaviours/limit-documents');
77
const disableUpload = require('./behaviours/disable-file-upload');
88
const SummaryPageBehaviour = require('hof').components.summary;
99
const transportBehaviour = require('./behaviours/transport-behaviour');
10+
const transportToggle = require('./behaviours/set-transport-toggle');
1011
const Aggregate = require('./behaviours/aggregator');
1112
const limitPerson = require('./behaviours/limit-person');
1213
const personNumber = require('./behaviours/person-number');
1314
const addressFormatter = require('./behaviours/address-formatter');
1415
const additionalPersonFormatter = require('./behaviours/additional-person-formatter');
1516
const vehicleToggleFormatter = require('./behaviours/vehicle-toggle-formatter');
1617
const SendToSQS = require('./behaviours/send-to-sqs');
18+
const timeFormatter = require('./behaviours/time-formatter');
1719

1820
module.exports = {
1921
name: 'paf',
@@ -59,7 +61,7 @@ module.exports = {
5961
}]
6062
},
6163
'/date-time-crime-will-happen': {
62-
fields: ['date-crime-will-happen', 'time-crime-will-happen'],
64+
fields: ['date-crime-will-happen', 'time-crime-will-happen-hour', 'time-crime-will-happen-minute'],
6365
next: '/when-will-crime-happen-more-info'
6466
},
6567
'/when-will-crime-happen-more-info': {
@@ -115,6 +117,7 @@ module.exports = {
115117
continueOnEdit: true
116118
},
117119
'/crime-transport-vehicle-type': {
120+
behaviours: [transportToggle],
118121
fields: ['vehicle-type',
119122
'crime-car-group',
120123
'crime-hgv-group',
@@ -164,6 +167,7 @@ module.exports = {
164167
continueOnEdit: true
165168
},
166169
'/crime-transport-boat-type': {
170+
behaviours: [transportToggle],
167171
fields: ['boat-type',
168172
'crime-carrier-group',
169173
'crime-general-cargo-group',
@@ -545,6 +549,7 @@ module.exports = {
545549
]
546550
},
547551
'/report-person-transport-type': {
552+
behaviours: [transportToggle],
548553
fields: ['report-person-transport-type',
549554
'report-person-transport-car-group',
550555
'report-person-transport-hgv-group',
@@ -770,7 +775,7 @@ module.exports = {
770775
fields: ['are-you-eighteen', 'contact-number', 'when-to-contact']
771776
},
772777
'/confirm': {
773-
behaviours: [SummaryPageBehaviour, personNumber],
778+
behaviours: [SummaryPageBehaviour, personNumber, timeFormatter],
774779
sections: require('./sections/summary-data-sections'),
775780
next: '/declaration'
776781
},

apps/paf/models/file-upload.js

+3-2
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,11 @@ module.exports = class UploadModel extends Model {
1414

1515
async save() {
1616
const result = await new Promise((resolve, reject) => {
17+
console.log("url: " + config.upload.hostname);
1718
const attributes = {
1819
url: config.upload.hostname
1920
};
20-
const reqConf = new url.URL(this.url(attributes));
21+
const reqConf = url.parse(this.url(attributes));
2122
reqConf.formData = {
2223
document: {
2324
value: this.get('data'),
@@ -59,7 +60,7 @@ module.exports = class UploadModel extends Model {
5960
};
6061

6162
return new Promise((resolve, reject) => {
62-
this._request(tokenReq, (err, response) => {
63+
return this._request(tokenReq, (err, response) => {
6364
const body = JSON.parse(response.body);
6465

6566
if (err || body.error) {

apps/paf/translations/src/en/fields.json

+9-6
Original file line numberDiff line numberDiff line change
@@ -128,8 +128,11 @@
128128
"date-crime-will-happen": {
129129
"label": "Date"
130130
},
131-
"time-crime-will-happen": {
132-
"label": "Time"
131+
"time-crime-will-happen-hour": {
132+
"label": "Hour"
133+
},
134+
"time-crime-will-happen-minute": {
135+
"label": "Minute"
133136
},
134137
"crime-transport": {
135138
"legend": "Does the crime involve any vehicles, transport or travel?",
@@ -233,8 +236,8 @@
233236
"hgv-hard-sided": {
234237
"label": "HGV hard sided"
235238
},
236-
"hgv-refridgerated": {
237-
"label": "HGV refridgerated"
239+
"hgv-refrigerated": {
240+
"label": "HGV refrigerated"
238241
},
239242
"hgv-tanker": {
240243
"label": "HGV tanker"
@@ -1022,8 +1025,8 @@
10221025
"hgv-hard-sided": {
10231026
"label": "HGV hard sided"
10241027
},
1025-
"hgv-refridgerated": {
1026-
"label": "HGV refridgerated"
1028+
"hgv-refrigerated": {
1029+
"label": "HGV refrigerated"
10271030
},
10281031
"hgv-tanker": {
10291032
"label": "HGV tanker"

0 commit comments

Comments
 (0)