hof 20.0.0-beta.1 → 20.0.0-beta.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -40,6 +40,7 @@ const conditionalTranslate = (key, translate) => {
40
40
  };
41
41
 
42
42
  const getLegendClassName = field => field && field.legend && field.legend.className || '';
43
+ const getNoHeading = field => field && field.noHeading || '';
43
44
 
44
45
  module.exports = (key, opts) => {
45
46
  if (!key) {
@@ -113,8 +114,9 @@ module.exports = (key, opts) => {
113
114
  const legend = conditionalTranslate(`fields.${key}.legend`, req.translate);
114
115
  const hint = conditionalTranslate(`fields.${key}.hint`, req.translate);
115
116
  const legendClassName = getLegendClassName(options);
117
+ const noHeading = getNoHeading(options);
116
118
  const error = req.form.errors && req.form.errors[key];
117
- res.render(template, { key, legend, legendClassName, hint, error }, (err, html) => {
119
+ res.render(template, { key, legend, legendClassName, noHeading, hint, error }, (err, html) => {
118
120
  if (err) {
119
121
  next(err);
120
122
  } else {
@@ -1,9 +1,9 @@
1
1
  <div class="govuk-form-group {{#error}}govuk-form-group--error{{/error}}">
2
2
  <fieldset id="{{key}}-group" class="govuk-fieldset{{#className}} {{className}}{{/className}}" role="group">
3
- <legend class="govuk-fieldset__legend govuk-fieldset__legend--l{{#legendClassName}} {{legendClassName}}{{/legendClassName}}">
4
- <h1 class="govuk-fieldset__heading">
3
+ <legend class="govuk-fieldset__legend {{^noHeading}}govuk-fieldset__legend--l{{/noHeading}}{{#legendClassName}} {{legendClassName}}{{/legendClassName}}">
4
+ {{^noHeading}}<h1 class="govuk-fieldset__heading">{{/noHeading}}
5
5
  {{legend}}
6
- </h1>
6
+ {{^noHeading}}</h1>{{/noHeading}}
7
7
  </legend>
8
8
  {{#hint}}
9
9
  <span id="{{key}}-hint" class="govuk-hint">{{hint}}</span>
@@ -240,7 +240,6 @@ module.exports = function (options) {
240
240
  legend: t(legendValue),
241
241
  legendClassName: legendClassName,
242
242
  role: opts.type === 'radio' ? 'radiogroup' : 'group',
243
- ariaRequired: opts.type === 'radio',
244
243
  noHeading: field.noHeading,
245
244
  detail: detail ? detail : '',
246
245
  hint: conditionalTranslate(getTranslationKey(field, key, 'hint')),
@@ -276,6 +275,7 @@ module.exports = function (options) {
276
275
  value: value,
277
276
  type: opts.type,
278
277
  selected: selected,
278
+ radioOption: opts.type === 'radio',
279
279
  toggle: toggle,
280
280
  child: child,
281
281
  optionHint: conditionalTranslate(optionHint) || ''
@@ -1,6 +1,6 @@
1
1
  <div id="{{key}}-group" class="govuk-form-group{{#className}} {{className}} {{/className}}{{#formGroupClassName}} {{formGroupClassName}}{{/formGroupClassName}}{{#error}} govuk-form-group--error{{/error}}">
2
2
  <fieldset class="govuk-fieldset" {{#hint}} aria-describedby="{{key}}-hint"{{/hint}}>
3
- <legend class="govuk-fieldset__legend govuk-fieldset__legend--l{{#legendClassName}} {{legendClassName}}{{/legendClassName}}">
3
+ <legend class="govuk-fieldset__legend {{^noHeading}}govuk-fieldset__legend--l{{/noHeading}}{{#legendClassName}} {{legendClassName}}{{/legendClassName}}">
4
4
  {{^noHeading}}<h1 class="govuk-fieldset__heading">{{/noHeading}}
5
5
  {{legend}}
6
6
  {{^noHeading}}</h1>{{/noHeading}}
@@ -19,7 +19,7 @@
19
19
  type="{{type}}"
20
20
  name="{{id}}"
21
21
  id="{{id}}"
22
- class="govuk-input{{#className}} {{className}}{{/className}}{{#error}} invalid-input{{/error}}"
22
+ class="{{^className}}govuk-input{{/className}}{{#className}}{{className}}{{/className}}{{#error}} invalid-input{{/error}}"
23
23
  aria-required="{{required}}"
24
24
  {{#value}} value="{{value}}"{{/value}}
25
25
  {{#min}} min="{{min}}"{{/min}}
@@ -1,6 +1,6 @@
1
1
  <div id="{{key}}-group" class="govuk-form-group{{#className}} {{className}} {{/className}}{{#formGroupClassName}} {{formGroupClassName}}{{/formGroupClassName}}{{#error}} govuk-form-group--error{{/error}}">
2
2
  <fieldset class="govuk-fieldset" {{#hint}} aria-describedby="{{key}}-hint"{{/hint}}>
3
- <legend class="govuk-fieldset__legend govuk-fieldset__legend--l{{#legendClassName}} {{legendClassName}}{{/legendClassName}}">
3
+ <legend class="govuk-fieldset__legend {{^noHeading}}govuk-fieldset__legend--l{{/noHeading}}{{#legendClassName}} {{legendClassName}}{{/legendClassName}}">
4
4
  {{^noHeading}}<h1 class="govuk-fieldset__heading">{{/noHeading}}
5
5
  {{legend}}
6
6
  {{^noHeading}}</h1>{{/noHeading}}
@@ -1,5 +1,5 @@
1
- <div id="{{toggle}}-panel" class="reveal js-hidden">
2
- <div class="govuk-inset-text">
3
- {{#renderMixin}}{{/renderMixin}}
4
- </div>
1
+ <div id="{{toggle}}-panel"
2
+ class="{{#radioOption}}govuk-radios__conditional govuk-radios__conditional--hidden{{/radioOption}}
3
+ {{^radioOption}}govuk-checkboxes__conditional govuk-checkboxes__conditional--hidden{{/radioOption}}">
4
+ {{#renderMixin}}{{/renderMixin}}
5
5
  </div>
@@ -10,7 +10,6 @@
10
10
  }
11
11
 
12
12
  #cookie-banner {
13
- max-width: 960px;
14
13
  margin: 0 15px;
15
14
  p {
16
15
  margin: 0;
@@ -62,3 +61,54 @@
62
61
  height: fit-content;
63
62
  }
64
63
  }
64
+
65
+ // the following are additional hof specific govuk cookie banner styling
66
+ .govuk-banner--success {
67
+ border-color: #00703c;
68
+ color: #00703c;
69
+ }
70
+
71
+ .govuk-banner {
72
+ border: 5px solid #1d70b8;
73
+ font-size: 0;
74
+ margin-bottom: 30px;
75
+ padding: 10px;
76
+ }
77
+
78
+ .govuk-banner__icon{
79
+ display: inline-block;
80
+ }
81
+
82
+ .govuk-banner__message {
83
+ font-family: "GDS Transport", Arial, sans-serif;
84
+ -webkit-font-smoothing: antialiased;
85
+ font-weight: 400;
86
+ font-size: 1rem;
87
+ line-height: 1.25;
88
+ color: #0b0c0c;
89
+ display: block;
90
+ overflow: hidden;
91
+ display: inline-block;
92
+ margin-left: 10px;
93
+ }
94
+
95
+ .govuk-banner__assistive {
96
+ position: absolute !important;
97
+ width: 1px !important;
98
+ height: 1px !important;
99
+ margin: 0 !important;
100
+ padding: 0 !important;
101
+ overflow: hidden !important;
102
+ clip: rect(0 0 0 0) !important;
103
+ clip-path: inset(50%) !important;
104
+ border: 0 !important;
105
+ white-space: nowrap !important;
106
+ }
107
+
108
+ .cookie-table-holder > table > tbody > tr > td:first-child{
109
+ font-weight:bold;
110
+ }
111
+
112
+ .js-enabled #global-cookie-message {
113
+ display: none;
114
+ }
package/lib/settings.js CHANGED
@@ -7,7 +7,21 @@ const hoganExpressStrict = require('hogan-express-strict');
7
7
  const expressPartialTemplates = require('express-partial-templates');
8
8
  const bodyParser = require('body-parser');
9
9
 
10
- module.exports = (app, config) => {
10
+ const filterEmptyViews = (views) => {
11
+ return views.filter(view => dirExists(view))
12
+ }
13
+
14
+ const dirExists = (dir) => {
15
+ try {
16
+ if (fs.existsSync(dir)) {
17
+ return true;
18
+ }
19
+ } catch(err) {
20
+ throw new Error(`${err}: Cannot check if the directory path exists`)
21
+ }
22
+ }
23
+
24
+ module.exports = async (app, config) => {
11
25
  const viewEngine = config.viewEngine || 'html';
12
26
 
13
27
  app.use((req, res, next) => {
@@ -17,7 +31,8 @@ module.exports = (app, config) => {
17
31
 
18
32
  app.use(config.theme());
19
33
 
20
- const viewPaths = [].concat(config.theme.views);
34
+ const filteredViews = filterEmptyViews(config.theme.views)
35
+ const viewPaths = [].concat(filteredViews);
21
36
  app.set('view engine', viewEngine);
22
37
  app.enable('view cache');
23
38
 
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "hof",
3
3
  "description": "A bootstrap for HOF projects",
4
- "version": "20.0.0-beta.1",
4
+ "version": "20.0.0-beta.4",
5
5
  "license": "MIT",
6
6
  "main": "index.js",
7
7
  "author": "HomeOffice",
@@ -57,7 +57,7 @@
57
57
  "findup": "^0.1.5",
58
58
  "glob": "^7.2.0",
59
59
  "govuk-elements-sass": "^3.1.3",
60
- "govuk-frontend": "3.14",
60
+ "govuk-frontend": "^4.1.0",
61
61
  "govuk_template_mustache": "^0.26.0",
62
62
  "helmet": "^3.22.0",
63
63
  "hogan-express-strict": "^0.5.4",
package/sandbox/.env CHANGED
@@ -1 +1 @@
1
- GA_TAG=UA-215558609-1
1
+ // GA_TAG=UA-215558609-1
@@ -8,9 +8,9 @@ module.exports = {
8
8
  'landing-page-radio': {
9
9
  mixin: 'radio-group',
10
10
  validate: ['required'],
11
- legend: {
12
- className: 'visuallyhidden'
13
- },
11
+ noHeading: true,
12
+ // Design system says to avoid in-line unless it's two options,
13
+ // so just added as an example below but by default it isn't
14
14
  className: ['govuk-radios--inline'],
15
15
  options: ['basic-form', 'complex-form', 'build-your-own-form']
16
16
  },
@@ -20,6 +20,7 @@ module.exports = {
20
20
  // noHeading: 'true'
21
21
  },
22
22
  'dateOfBirth': dateComponent('dateOfBirth', {
23
+ // noHeading: 'true',
23
24
  controlType: 'date-input',
24
25
  validate: [
25
26
  'required',
@@ -28,23 +29,28 @@ module.exports = {
28
29
  ]
29
30
  }),
30
31
  building: {
32
+ noHeading: 'true',
31
33
  validate: ['required', 'notUrl', { type: 'maxlength', arguments: 100 }]
32
34
  },
33
35
  street: {
36
+ noHeading: 'true',
34
37
  validate: ['notUrl', { type: 'maxlength', arguments: 50 }],
35
38
  labelClassName: 'visuallyhidden'
36
39
  },
37
40
  townOrCity: {
41
+ noHeading: 'true',
38
42
  validate: ['required', 'notUrl',
39
43
  { type: 'regex', arguments: /^([^0-9]*)$/ },
40
44
  { type: 'maxlength', arguments: 100 }
41
45
  ]
42
46
  },
43
47
  postcode: {
48
+ noHeading: 'true',
44
49
  validate: ['required', 'postcode'],
45
50
  formatter: ['removespaces', 'uppercase']
46
51
  },
47
52
  incomeTypes: {
53
+ // noHeading: 'true',
48
54
  mixin: 'checkbox-group',
49
55
  labelClassName: 'visuallyhidden',
50
56
  validate: ['required'],
@@ -57,11 +63,9 @@ module.exports = {
57
63
  ]
58
64
  },
59
65
  countryOfHearing: {
66
+ // noHeading: 'true',
60
67
  mixin: 'radio-group',
61
68
  validate: ['required'],
62
- legend: {
63
- className: 'visuallyhidden'
64
- },
65
69
  options: [
66
70
  'englandAndWales',
67
71
  'scotland',
@@ -69,6 +73,8 @@ module.exports = {
69
73
  ]
70
74
  },
71
75
  email: {
76
+ // noHeading: 'true',
77
+ labelClassName: ['govuk-label--l'],
72
78
  validate: ['required', 'email']
73
79
  },
74
80
  phone: {
@@ -2,6 +2,7 @@
2
2
  "fields": {
3
3
  "landing-page-radio": {
4
4
  "legend": "Which form would you like to explore?",
5
+ "hint": "Choose one of the options below and press continue.",
5
6
  "options": {
6
7
  "basic-form": {
7
8
  "label": "Basic form"
@@ -56,7 +57,7 @@
56
57
  }
57
58
  },
58
59
  "countryOfHearing": {
59
- "label": "Country of hearing",
60
+ "legend": "What country was the appeal lodged?",
60
61
  "options": {
61
62
  "englandAndWales": {
62
63
  "label": "England and Wales"
@@ -70,7 +71,7 @@
70
71
  }
71
72
  },
72
73
  "email": {
73
- "label": "Email address"
74
+ "label": "Enter your email address"
74
75
  },
75
76
  "phone": {
76
77
  "label": "Phone number",
@@ -103,8 +104,7 @@
103
104
  },
104
105
  "pages": {
105
106
  "landing-page": {
106
- "header": "Landing page",
107
- "intro": "Choose one of the options below and press continue."
107
+ "header": "Landing page"
108
108
  },
109
109
  "build-your-own-form": {
110
110
  "title": "Build your own form",
@@ -114,15 +114,6 @@
114
114
  "header": "What is your address in the UK?",
115
115
  "intro": "If you have no fixed address, enter an address where we can contact you."
116
116
  },
117
- "checkboxes": {
118
- "header": "Where does your money come from each month?"
119
- },
120
- "radio": {
121
- "header": "What country was the appeal lodged?"
122
- },
123
- "email": {
124
- "header": "Enter your email address"
125
- },
126
117
  "phone-number": {
127
118
  "header": "Enter your phone number"
128
119
  },
@@ -1,6 +1,7 @@
1
1
  {
2
2
  "landing-page-radio": {
3
3
  "legend": "Which form would you like to explore?",
4
+ "hint": "Choose one of the options below and press continue.",
4
5
  "options": {
5
6
  "basic-form": {
6
7
  "label": "Basic form"
@@ -55,7 +56,7 @@
55
56
  }
56
57
  },
57
58
  "countryOfHearing": {
58
- "label": "Country of hearing",
59
+ "legend": "What country was the appeal lodged?",
59
60
  "options": {
60
61
  "englandAndWales": {
61
62
  "label": "England and Wales"
@@ -69,7 +70,7 @@
69
70
  }
70
71
  },
71
72
  "email" : {
72
- "label": "Email address"
73
+ "label": "Enter your email address"
73
74
  },
74
75
  "phone": {
75
76
  "label": "Phone number",
@@ -1,7 +1,6 @@
1
1
  {
2
2
  "landing-page": {
3
- "header": "Landing page",
4
- "intro": "Choose one of the options below and press continue."
3
+ "header": "Landing page"
5
4
  },
6
5
  "build-your-own-form": {
7
6
  "title": "Build your own form",
@@ -11,15 +10,6 @@
11
10
  "header": "What is your address in the UK?",
12
11
  "intro": "If you have no fixed address, enter an address where we can contact you."
13
12
  },
14
- "checkboxes": {
15
- "header": "Where does your money come from each month?"
16
- },
17
- "radio": {
18
- "header": "What country was the appeal lodged?"
19
- },
20
- "email": {
21
- "header": "Enter your email address"
22
- },
23
13
  "phone-number": {
24
14
  "header": "Enter your phone number"
25
15
  },
@@ -55,4 +45,4 @@
55
45
  "subheader": "What happens next",
56
46
  "content": "We’ll contact you with the decision of your application or if we need more information from you."
57
47
  }
58
- }
48
+ }
@@ -77,7 +77,3 @@
77
77
  .js-enabled #global-cookie-message {
78
78
  display: none;
79
79
  }
80
-
81
- #cookie-banner {
82
- max-width: none;
83
- }
@@ -2239,7 +2239,6 @@ strong {
2239
2239
  }
2240
2240
 
2241
2241
  #cookie-banner {
2242
- max-width: 960px;
2243
2242
  margin: 0 15px;
2244
2243
  }
2245
2244
  #cookie-banner p {
@@ -2294,6 +2293,56 @@ strong {
2294
2293
  height: fit-content;
2295
2294
  }
2296
2295
 
2296
+ .govuk-banner--success {
2297
+ border-color: #00703c;
2298
+ color: #00703c;
2299
+ }
2300
+
2301
+ .govuk-banner {
2302
+ border: 5px solid #1d70b8;
2303
+ font-size: 0;
2304
+ margin-bottom: 30px;
2305
+ padding: 10px;
2306
+ }
2307
+
2308
+ .govuk-banner__icon {
2309
+ display: inline-block;
2310
+ }
2311
+
2312
+ .govuk-banner__message {
2313
+ font-family: "GDS Transport", Arial, sans-serif;
2314
+ -webkit-font-smoothing: antialiased;
2315
+ font-weight: 400;
2316
+ font-size: 1rem;
2317
+ line-height: 1.25;
2318
+ color: #0b0c0c;
2319
+ display: block;
2320
+ overflow: hidden;
2321
+ display: inline-block;
2322
+ margin-left: 10px;
2323
+ }
2324
+
2325
+ .govuk-banner__assistive {
2326
+ position: absolute !important;
2327
+ width: 1px !important;
2328
+ height: 1px !important;
2329
+ margin: 0 !important;
2330
+ padding: 0 !important;
2331
+ overflow: hidden !important;
2332
+ clip: rect(0 0 0 0) !important;
2333
+ clip-path: inset(50%) !important;
2334
+ border: 0 !important;
2335
+ white-space: nowrap !important;
2336
+ }
2337
+
2338
+ .cookie-table-holder > table > tbody > tr > td:first-child {
2339
+ font-weight: bold;
2340
+ }
2341
+
2342
+ .js-enabled #global-cookie-message {
2343
+ display: none;
2344
+ }
2345
+
2297
2346
  #cookie-settings .js-enabled {
2298
2347
  display: none;
2299
2348
  }
@@ -9392,8 +9441,4 @@ x:-moz-any-link {
9392
9441
 
9393
9442
  .js-enabled #global-cookie-message {
9394
9443
  display: none;
9395
- }
9396
-
9397
- #cookie-banner {
9398
- max-width: none;
9399
9444
  }