@defra/forms-engine-plugin 4.0.6 → 4.0.8

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.
Files changed (112) hide show
  1. package/.public/stylesheets/application.min.css +1 -1
  2. package/.public/stylesheets/application.min.css.map +1 -1
  3. package/.server/client/stylesheets/_location-input.scss +60 -0
  4. package/.server/client/stylesheets/application.scss +1 -0
  5. package/.server/client/stylesheets/shared.scss +1 -0
  6. package/.server/server/forms/components.json +7 -0
  7. package/.server/server/forms/register-as-a-unicorn-breeder.yaml +40 -1
  8. package/.server/server/plugins/engine/components/ComponentBase.d.ts +2 -2
  9. package/.server/server/plugins/engine/components/ComponentBase.js.map +1 -1
  10. package/.server/server/plugins/engine/components/ComponentCollection.js.map +1 -1
  11. package/.server/server/plugins/engine/components/DeclarationField.d.ts +81 -0
  12. package/.server/server/plugins/engine/components/DeclarationField.js +123 -0
  13. package/.server/server/plugins/engine/components/DeclarationField.js.map +1 -0
  14. package/.server/server/plugins/engine/components/EastingNorthingField.d.ts +121 -0
  15. package/.server/server/plugins/engine/components/EastingNorthingField.js +166 -0
  16. package/.server/server/plugins/engine/components/EastingNorthingField.js.map +1 -0
  17. package/.server/server/plugins/engine/components/LatLongField.d.ts +121 -0
  18. package/.server/server/plugins/engine/components/LatLongField.js +164 -0
  19. package/.server/server/plugins/engine/components/LatLongField.js.map +1 -0
  20. package/.server/server/plugins/engine/components/LocationFieldBase.d.ts +134 -0
  21. package/.server/server/plugins/engine/components/LocationFieldBase.js +85 -0
  22. package/.server/server/plugins/engine/components/LocationFieldBase.js.map +1 -0
  23. package/.server/server/plugins/engine/components/LocationFieldHelpers.d.ts +108 -0
  24. package/.server/server/plugins/engine/components/LocationFieldHelpers.js +96 -0
  25. package/.server/server/plugins/engine/components/LocationFieldHelpers.js.map +1 -0
  26. package/.server/server/plugins/engine/components/NationalGridFieldNumberField.d.ts +19 -0
  27. package/.server/server/plugins/engine/components/NationalGridFieldNumberField.js +40 -0
  28. package/.server/server/plugins/engine/components/NationalGridFieldNumberField.js.map +1 -0
  29. package/.server/server/plugins/engine/components/OsGridRefField.d.ts +19 -0
  30. package/.server/server/plugins/engine/components/OsGridRefField.js +56 -0
  31. package/.server/server/plugins/engine/components/OsGridRefField.js.map +1 -0
  32. package/.server/server/plugins/engine/components/helpers/components.d.ts +3 -4
  33. package/.server/server/plugins/engine/components/helpers/components.js +24 -29
  34. package/.server/server/plugins/engine/components/helpers/components.js.map +1 -1
  35. package/.server/server/plugins/engine/components/index.d.ts +5 -0
  36. package/.server/server/plugins/engine/components/index.js +5 -0
  37. package/.server/server/plugins/engine/components/index.js.map +1 -1
  38. package/.server/server/plugins/engine/components/markdownParser.d.ts +2 -0
  39. package/.server/server/plugins/engine/components/markdownParser.js +28 -0
  40. package/.server/server/plugins/engine/components/markdownParser.js.map +1 -0
  41. package/.server/server/plugins/engine/components/types.d.ts +10 -0
  42. package/.server/server/plugins/engine/components/types.js.map +1 -1
  43. package/.server/server/plugins/engine/pageControllers/helpers/pages.js +7 -0
  44. package/.server/server/plugins/engine/pageControllers/helpers/pages.js.map +1 -1
  45. package/.server/server/plugins/engine/pageControllers/validationOptions.js +1 -0
  46. package/.server/server/plugins/engine/pageControllers/validationOptions.js.map +1 -1
  47. package/.server/server/plugins/engine/types/index.d.ts +1 -1
  48. package/.server/server/plugins/engine/types/index.js.map +1 -1
  49. package/.server/server/plugins/engine/types.d.ts +2 -2
  50. package/.server/server/plugins/engine/types.js.map +1 -1
  51. package/.server/server/plugins/engine/views/components/_location-field-base.html +53 -0
  52. package/.server/server/plugins/engine/views/components/declarationfield.html +14 -0
  53. package/.server/server/plugins/engine/views/components/eastingnorthingfield.html +5 -0
  54. package/.server/server/plugins/engine/views/components/latlongfield.html +5 -0
  55. package/.server/server/plugins/engine/views/components/nationalgridfieldnumberfield.html +13 -0
  56. package/.server/server/plugins/engine/views/components/osgridreffield.html +13 -0
  57. package/.server/server/plugins/nunjucks/filters/field.d.ts +1 -1
  58. package/.server/server/plugins/nunjucks/filters/index.d.ts +1 -0
  59. package/.server/server/plugins/nunjucks/filters/index.js +1 -0
  60. package/.server/server/plugins/nunjucks/filters/index.js.map +1 -1
  61. package/.server/server/plugins/nunjucks/filters/merge.d.ts +7 -0
  62. package/.server/server/plugins/nunjucks/filters/merge.js +16 -0
  63. package/.server/server/plugins/nunjucks/filters/merge.js.map +1 -0
  64. package/.server/server/plugins/nunjucks/filters/merge.test.js +19 -0
  65. package/.server/server/plugins/nunjucks/filters/merge.test.js.map +1 -0
  66. package/package.json +3 -3
  67. package/src/client/stylesheets/_location-input.scss +60 -0
  68. package/src/client/stylesheets/application.scss +1 -0
  69. package/src/client/stylesheets/shared.scss +1 -0
  70. package/src/server/forms/components.json +7 -0
  71. package/src/server/forms/page-events.yaml +1 -1
  72. package/src/server/forms/register-as-a-unicorn-breeder.yaml +40 -1
  73. package/src/server/index.test.ts +1 -0
  74. package/src/server/plugins/engine/components/ComponentBase.ts +2 -1
  75. package/src/server/plugins/engine/components/ComponentCollection.ts +1 -0
  76. package/src/server/plugins/engine/components/DeclarationField.test.ts +426 -0
  77. package/src/server/plugins/engine/components/DeclarationField.ts +167 -0
  78. package/src/server/plugins/engine/components/EastingNorthingField.test.ts +665 -0
  79. package/src/server/plugins/engine/components/EastingNorthingField.ts +224 -0
  80. package/src/server/plugins/engine/components/LatLongField.test.ts +700 -0
  81. package/src/server/plugins/engine/components/LatLongField.ts +213 -0
  82. package/src/server/plugins/engine/components/LocationFieldBase.test.ts +253 -0
  83. package/src/server/plugins/engine/components/LocationFieldBase.ts +152 -0
  84. package/src/server/plugins/engine/components/LocationFieldHelpers.test.ts +338 -0
  85. package/src/server/plugins/engine/components/LocationFieldHelpers.ts +123 -0
  86. package/src/server/plugins/engine/components/NationalGridFieldNumberField.test.ts +438 -0
  87. package/src/server/plugins/engine/components/NationalGridFieldNumberField.ts +52 -0
  88. package/src/server/plugins/engine/components/OsGridRefField.test.ts +469 -0
  89. package/src/server/plugins/engine/components/OsGridRefField.ts +71 -0
  90. package/src/server/plugins/engine/components/helpers/components.test.ts +270 -0
  91. package/src/server/plugins/engine/components/helpers/components.ts +44 -47
  92. package/src/server/plugins/engine/components/helpers/helpers.test.ts +71 -1
  93. package/src/server/plugins/engine/components/index.ts +5 -0
  94. package/src/server/plugins/engine/components/markdownParser.ts +40 -0
  95. package/src/server/plugins/engine/components/types.ts +14 -0
  96. package/src/server/plugins/engine/models/SummaryViewModel.test.ts +76 -3
  97. package/src/server/plugins/engine/models/SummaryViewModel.ts +5 -1
  98. package/src/server/plugins/engine/outputFormatters/adapter/v1.location.test.ts +356 -0
  99. package/src/server/plugins/engine/pageControllers/helpers/helpers.test.ts +4 -0
  100. package/src/server/plugins/engine/pageControllers/helpers/pages.ts +8 -0
  101. package/src/server/plugins/engine/pageControllers/validationOptions.ts +4 -0
  102. package/src/server/plugins/engine/types/index.ts +2 -0
  103. package/src/server/plugins/engine/types.ts +4 -0
  104. package/src/server/plugins/engine/views/components/_location-field-base.html +53 -0
  105. package/src/server/plugins/engine/views/components/declarationfield.html +14 -0
  106. package/src/server/plugins/engine/views/components/eastingnorthingfield.html +5 -0
  107. package/src/server/plugins/engine/views/components/latlongfield.html +5 -0
  108. package/src/server/plugins/engine/views/components/nationalgridfieldnumberfield.html +13 -0
  109. package/src/server/plugins/engine/views/components/osgridreffield.html +13 -0
  110. package/src/server/plugins/nunjucks/filters/index.js +1 -0
  111. package/src/server/plugins/nunjucks/filters/merge.js +16 -0
  112. package/src/server/plugins/nunjucks/filters/merge.test.js +15 -0
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Nunjucks filter to get the page for a given path
3
+ * @param {Record<string, any>} targetDictionary - Object to extend
4
+ * @param {Record<string, any> | string} sourceDictionary - Object to merge into target
5
+ * @returns {Record<string, any>}
6
+ */
7
+ export function merge(targetDictionary: Record<string, any>, sourceDictionary: Record<string, any> | string): Record<string, any>;
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Nunjucks filter to get the page for a given path
3
+ * @param {Record<string, any>} targetDictionary - Object to extend
4
+ * @param {Record<string, any> | string} sourceDictionary - Object to merge into target
5
+ * @returns {Record<string, any>}
6
+ */
7
+ export function merge(targetDictionary, sourceDictionary) {
8
+ if (typeof sourceDictionary !== 'object') {
9
+ return targetDictionary;
10
+ }
11
+ return {
12
+ ...targetDictionary,
13
+ ...sourceDictionary
14
+ };
15
+ }
16
+ //# sourceMappingURL=merge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"merge.js","names":["merge","targetDictionary","sourceDictionary"],"sources":["../../../../../src/server/plugins/nunjucks/filters/merge.js"],"sourcesContent":["/**\n * Nunjucks filter to get the page for a given path\n * @param {Record<string, any>} targetDictionary - Object to extend\n * @param {Record<string, any> | string} sourceDictionary - Object to merge into target\n * @returns {Record<string, any>}\n */\nexport function merge(targetDictionary, sourceDictionary) {\n if (typeof sourceDictionary !== 'object') {\n return targetDictionary\n }\n\n return {\n ...targetDictionary,\n ...sourceDictionary\n }\n}\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASA,KAAKA,CAACC,gBAAgB,EAAEC,gBAAgB,EAAE;EACxD,IAAI,OAAOA,gBAAgB,KAAK,QAAQ,EAAE;IACxC,OAAOD,gBAAgB;EACzB;EAEA,OAAO;IACL,GAAGA,gBAAgB;IACnB,GAAGC;EACL,CAAC;AACH","ignoreList":[]}
@@ -0,0 +1,19 @@
1
+ import { merge } from "./merge.js";
2
+ describe('merge', () => {
3
+ const propertyToMerge = {
4
+ lorem: 'ipsum'
5
+ };
6
+ it('should return the target if source is not an object', () => {
7
+ expect(merge(propertyToMerge, 'dolar')).toBe(propertyToMerge);
8
+ });
9
+ it('should merge the properties if they are valid', () => {
10
+ expect(merge({
11
+ lorem: 'dolar',
12
+ dolar: 'sit'
13
+ }, propertyToMerge)).toEqual({
14
+ lorem: 'ipsum',
15
+ dolar: 'sit'
16
+ });
17
+ });
18
+ });
19
+ //# sourceMappingURL=merge.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"merge.test.js","names":["merge","describe","propertyToMerge","lorem","it","expect","toBe","dolar","toEqual"],"sources":["../../../../../src/server/plugins/nunjucks/filters/merge.test.js"],"sourcesContent":["import { merge } from '~/src/server/plugins/nunjucks/filters/merge.js'\n\ndescribe('merge', () => {\n const propertyToMerge = { lorem: 'ipsum' }\n it('should return the target if source is not an object', () => {\n expect(merge(propertyToMerge, 'dolar')).toBe(propertyToMerge)\n })\n\n it('should merge the properties if they are valid', () => {\n expect(merge({ lorem: 'dolar', dolar: 'sit' }, propertyToMerge)).toEqual({\n lorem: 'ipsum',\n dolar: 'sit'\n })\n })\n})\n"],"mappings":"AAAA,SAASA,KAAK;AAEdC,QAAQ,CAAC,OAAO,EAAE,MAAM;EACtB,MAAMC,eAAe,GAAG;IAAEC,KAAK,EAAE;EAAQ,CAAC;EAC1CC,EAAE,CAAC,qDAAqD,EAAE,MAAM;IAC9DC,MAAM,CAACL,KAAK,CAACE,eAAe,EAAE,OAAO,CAAC,CAAC,CAACI,IAAI,CAACJ,eAAe,CAAC;EAC/D,CAAC,CAAC;EAEFE,EAAE,CAAC,+CAA+C,EAAE,MAAM;IACxDC,MAAM,CAACL,KAAK,CAAC;MAAEG,KAAK,EAAE,OAAO;MAAEI,KAAK,EAAE;IAAM,CAAC,EAAEL,eAAe,CAAC,CAAC,CAACM,OAAO,CAAC;MACvEL,KAAK,EAAE,OAAO;MACdI,KAAK,EAAE;IACT,CAAC,CAAC;EACJ,CAAC,CAAC;AACJ,CAAC,CAAC","ignoreList":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@defra/forms-engine-plugin",
3
- "version": "4.0.6",
3
+ "version": "4.0.8",
4
4
  "description": "Defra forms engine",
5
5
  "type": "module",
6
6
  "files": [
@@ -27,7 +27,7 @@
27
27
  "./components": "./.server/server/plugins/engine/components/index.js",
28
28
  "./services/*": "./.server/server/plugins/engine/services/*",
29
29
  "./engine/*": "./.server/server/plugins/engine/*",
30
- "./helpers.js": "./.server/server/plugins/engine/components/helpers.js",
30
+ "./helpers.js": "./.server/server/plugins/engine/components/helpers/index.js",
31
31
  "./schema.js": "./.server/server/schemas/index.js",
32
32
  "./templates/*": "./.server/server/plugins/engine/views/*",
33
33
  "./cache-service.js": "./.server/server/services/cacheService.js",
@@ -70,7 +70,7 @@
70
70
  },
71
71
  "license": "SEE LICENSE IN LICENSE",
72
72
  "dependencies": {
73
- "@defra/forms-model": "^3.0.560",
73
+ "@defra/forms-model": "^3.0.574",
74
74
  "@defra/hapi-tracing": "^1.26.0",
75
75
  "@elastic/ecs-pino-format": "^1.5.0",
76
76
  "@hapi/boom": "^10.0.1",
@@ -0,0 +1,60 @@
1
+ @use "govuk-frontend" as *;
2
+
3
+ .app-location-input {
4
+ @include govuk-clearfix;
5
+ font-size: 0; // removes whitespace caused by inline-block
6
+ margin-bottom: govuk-spacing(6);
7
+
8
+ &:has(.govuk-input--error) {
9
+ border-left: $govuk-border-width-form-group-error solid $govuk-error-colour;
10
+ padding-left: govuk-spacing(3);
11
+ margin-top: 0;
12
+ }
13
+ }
14
+
15
+ .govuk-hint:has(+ .app-location-input .govuk-input--error) {
16
+ border-left: $govuk-border-width-form-group-error solid $govuk-error-colour;
17
+ padding-left: govuk-spacing(3);
18
+ margin-bottom: 0;
19
+ }
20
+
21
+ .govuk-fieldset:has(.app-location-input .govuk-input--error) {
22
+ .govuk-fieldset__legend {
23
+ border-left: $govuk-border-width-form-group-error solid $govuk-error-colour;
24
+ padding-left: govuk-spacing(3);
25
+ margin-bottom: 0;
26
+ }
27
+
28
+ .govuk-fieldset__legend + .govuk-hint {
29
+ margin-top: 0;
30
+ }
31
+ }
32
+
33
+ .app-location-input__item {
34
+ display: inline-block;
35
+ margin-right: govuk-spacing(4);
36
+ margin-bottom: govuk-spacing(4);
37
+
38
+ &:last-child {
39
+ margin-right: 0;
40
+ }
41
+
42
+ @include govuk-media-query($from: tablet) {
43
+ margin-bottom: 0;
44
+ }
45
+
46
+ .govuk-form-group {
47
+ margin-bottom: 0;
48
+ display: inline-block;
49
+ width: auto;
50
+ }
51
+
52
+ .govuk-label {
53
+ display: block;
54
+ }
55
+
56
+ .govuk-input {
57
+ margin-bottom: 0;
58
+ width: auto;
59
+ }
60
+ }
@@ -2,6 +2,7 @@
2
2
  @use "shared";
3
3
  @use "code";
4
4
  @use "tag-env";
5
+ @use "location-input";
5
6
 
6
7
  // An example of some user-supplied styling
7
8
  // Not great practice but it illustrates the point
@@ -2,6 +2,7 @@
2
2
  @use "pkg:accessible-autocomplete";
3
3
  @use "prose";
4
4
  @use "summary-list";
5
+ @use "location-input";
5
6
 
6
7
  // Use default GDS Transport font for autocomplete
7
8
  .autocomplete__hint,
@@ -120,6 +120,13 @@
120
120
  "content": "### This is a H3 in markdown\n\n[An internal link](http://localhost:3009/fictional-page)\n\n[An external link](https://defra.gov.uk/fictional-page)",
121
121
  "options": {},
122
122
  "schema": {}
123
+ },
124
+ {
125
+ "type": "DeclarationField",
126
+ "name": "declaration",
127
+ "title": "Declaration",
128
+ "content": "By submitting this form, I agree to:\n\n- Provide accurate and complete information\n- Comply with all applicable regulations\n- Accept responsibility for any false statements",
129
+ "hint": "Please read and confirm the following terms"
123
130
  }
124
131
  ]
125
132
  },
@@ -59,7 +59,7 @@ pages:
59
59
  next: []
60
60
  id: da0fbdb4-a2de-4650-be16-9ba552af135f
61
61
  - id: 449a45f6-4541-4a46-91bd-8b8931b07b50
62
- title: Summary
62
+ title: ''
63
63
  path: '/summary'
64
64
  controller: SummaryPageController
65
65
  events:
@@ -163,6 +163,34 @@ pages:
163
163
  next:
164
164
  - path: '/how-many-members-of-staff-will-look-after-the-unicorns'
165
165
  components:
166
+ - name: dfGYuk
167
+ options: {}
168
+ schema: {}
169
+ type: EastingNorthingField
170
+ title: Easting and northing
171
+ hint:
172
+ This is an Easting and Northing component
173
+ - name: seTThb
174
+ options: {}
175
+ schema: {}
176
+ type: LatLongField
177
+ title: Latitute and longitude
178
+ hint:
179
+ This is an Latitute and Longitude component
180
+ - name: bhjloS
181
+ options: {}
182
+ schema: {}
183
+ type: NationalGridFieldNumberField
184
+ title: National grid field number
185
+ hint:
186
+ This is an National Grid Field Number component
187
+ - name: dfQQws
188
+ options: {}
189
+ schema: {}
190
+ type: OsGridRefField
191
+ title: Ordnance survey grid reference
192
+ hint:
193
+ This is an Ordnance survey Grid Reference component
166
194
  - name: bClCvo
167
195
  options: {}
168
196
  schema: {}
@@ -191,7 +219,7 @@ pages:
191
219
  controller: FileUploadPageController
192
220
  section: Regnsa
193
221
  next:
194
- - path: '/how-many-unicorns-do-you-expect-to-breed-each-year'
222
+ - path: '/declaration'
195
223
  components:
196
224
  - name: dLzALM
197
225
  title: Documents
@@ -202,6 +230,17 @@ pages:
202
230
  schema:
203
231
  min: 1
204
232
  max: 3
233
+ - title: Declaration
234
+ path: '/declaration'
235
+ section: section
236
+ components:
237
+ - name: diLmal
238
+ title: Declaration
239
+ type: DeclarationField
240
+ content: 'Fill in this field'
241
+ options: {}
242
+ next:
243
+ - path: '/summary'
205
244
  conditions:
206
245
  - displayName: Address is different
207
246
  name: IrVmYz
@@ -585,6 +585,7 @@ describe('prepareEnvironment', () => {
585
585
  'href',
586
586
  'field',
587
587
  'page',
588
+ 'merge',
588
589
  'markdown'
589
590
  ]
590
591
 
@@ -22,7 +22,7 @@ export class ComponentBase {
22
22
  type: ComponentDef['type']
23
23
  name: ComponentDef['name']
24
24
  title: ComponentDef['title']
25
- schema?: Extract<ComponentDef, { schema: object }>['schema']
25
+ schema?: Extract<ComponentDef, { schema?: object }>['schema']
26
26
  options?: Extract<ComponentDef, { options: object }>['options']
27
27
 
28
28
  isFormComponent = false
@@ -90,6 +90,7 @@ export type ComponentSchema =
90
90
  | ArraySchema<boolean>
91
91
  | ArraySchema<object>
92
92
  | BooleanSchema<string>
93
+ | BooleanSchema
93
94
  | DateSchema
94
95
  | NumberSchema<string>
95
96
  | NumberSchema
@@ -256,6 +256,7 @@ export class ComponentCollection {
256
256
  */
257
257
  validate(value: FormPayload = {}): FormValidationResult<FormPayload> {
258
258
  const result = this.formSchema.validate(value, opts)
259
+
259
260
  const details = result.error?.details
260
261
 
261
262
  return {