@defra/forms-engine-plugin 5.0.0-alpha.3 → 5.0.0-alpha.6

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 (100) hide show
  1. package/.public/javascripts/application.min.js +1 -1
  2. package/.public/javascripts/application.min.js.map +1 -1
  3. package/.public/javascripts/shared.min.js +1 -1
  4. package/.public/javascripts/shared.min.js.map +1 -1
  5. package/.server/client/javascripts/file-upload.js +5 -3
  6. package/.server/client/javascripts/file-upload.js.map +1 -1
  7. package/.server/client/javascripts/geospatial-map.js +31 -26
  8. package/.server/client/javascripts/geospatial-map.js.map +1 -1
  9. package/.server/client/javascripts/location-map.js +9 -1
  10. package/.server/client/javascripts/location-map.js.map +1 -1
  11. package/.server/client/javascripts/sssi-dataset.d.ts +18 -20
  12. package/.server/client/javascripts/sssi-dataset.js +37 -40
  13. package/.server/client/javascripts/sssi-dataset.js.map +1 -1
  14. package/.server/server/constants.d.ts +1 -0
  15. package/.server/server/constants.js +1 -0
  16. package/.server/server/constants.js.map +1 -1
  17. package/.server/server/plugins/engine/components/AutocompleteField.d.ts +1 -0
  18. package/.server/server/plugins/engine/components/ComponentBase.d.ts +1 -0
  19. package/.server/server/plugins/engine/components/ComponentBase.js +2 -0
  20. package/.server/server/plugins/engine/components/ComponentBase.js.map +1 -1
  21. package/.server/server/plugins/engine/components/ComponentCollection.js +2 -1
  22. package/.server/server/plugins/engine/components/ComponentCollection.js.map +1 -1
  23. package/.server/server/plugins/engine/components/DatePartsField.d.ts +1 -0
  24. package/.server/server/plugins/engine/components/DeclarationField.d.ts +1 -0
  25. package/.server/server/plugins/engine/components/DeclarationField.js +1 -1
  26. package/.server/server/plugins/engine/components/DeclarationField.js.map +1 -1
  27. package/.server/server/plugins/engine/components/Details.d.ts +1 -0
  28. package/.server/server/plugins/engine/components/EastingNorthingField.d.ts +2 -0
  29. package/.server/server/plugins/engine/components/EmailAddressField.d.ts +1 -0
  30. package/.server/server/plugins/engine/components/FileUploadField.js +2 -2
  31. package/.server/server/plugins/engine/components/FileUploadField.js.map +1 -1
  32. package/.server/server/plugins/engine/components/FormComponent.d.ts +1 -0
  33. package/.server/server/plugins/engine/components/FormComponent.js +2 -2
  34. package/.server/server/plugins/engine/components/FormComponent.js.map +1 -1
  35. package/.server/server/plugins/engine/components/GeospatialField.d.ts +1 -0
  36. package/.server/server/plugins/engine/components/Html.d.ts +1 -0
  37. package/.server/server/plugins/engine/components/InsetText.d.ts +1 -0
  38. package/.server/server/plugins/engine/components/LatLongField.d.ts +2 -0
  39. package/.server/server/plugins/engine/components/List.d.ts +1 -0
  40. package/.server/server/plugins/engine/components/ListFormComponent.d.ts +1 -0
  41. package/.server/server/plugins/engine/components/LocationFieldBase.d.ts +2 -0
  42. package/.server/server/plugins/engine/components/LocationFieldHelpers.d.ts +2 -0
  43. package/.server/server/plugins/engine/components/Markdown.d.ts +1 -0
  44. package/.server/server/plugins/engine/components/Markdown.js +1 -1
  45. package/.server/server/plugins/engine/components/Markdown.js.map +1 -1
  46. package/.server/server/plugins/engine/components/MonthYearField.d.ts +1 -0
  47. package/.server/server/plugins/engine/components/MultilineTextField.d.ts +1 -0
  48. package/.server/server/plugins/engine/components/NotificationBanner.d.ts +1 -0
  49. package/.server/server/plugins/engine/components/NumberField.d.ts +1 -0
  50. package/.server/server/plugins/engine/components/PaymentField.d.ts +1 -0
  51. package/.server/server/plugins/engine/components/SelectField.d.ts +1 -0
  52. package/.server/server/plugins/engine/components/SelectionControlField.d.ts +1 -0
  53. package/.server/server/plugins/engine/components/TelephoneNumberField.d.ts +1 -0
  54. package/.server/server/plugins/engine/components/UkAddressField.d.ts +1 -0
  55. package/.server/server/plugins/engine/components/types.d.ts +1 -0
  56. package/.server/server/plugins/engine/components/types.js.map +1 -1
  57. package/.server/server/plugins/engine/i18n/translations/cy.json +37 -1
  58. package/.server/server/plugins/engine/i18n/translations/en-GB.json +9 -1
  59. package/.server/server/plugins/engine/i18n/types.d.ts +1 -0
  60. package/.server/server/plugins/engine/i18n/types.js.map +1 -1
  61. package/.server/server/plugins/engine/models/SummaryViewModel.js +7 -3
  62. package/.server/server/plugins/engine/models/SummaryViewModel.js.map +1 -1
  63. package/.server/server/plugins/engine/outputFormatters/adapter/v1.js +3 -5
  64. package/.server/server/plugins/engine/outputFormatters/adapter/v1.js.map +1 -1
  65. package/.server/server/plugins/engine/pageControllers/FileUploadPageController.js +20 -7
  66. package/.server/server/plugins/engine/pageControllers/FileUploadPageController.js.map +1 -1
  67. package/.server/server/plugins/engine/pageControllers/RepeatPageController.js +3 -4
  68. package/.server/server/plugins/engine/pageControllers/RepeatPageController.js.map +1 -1
  69. package/.server/server/plugins/engine/pageControllers/SummaryPageController.js +5 -2
  70. package/.server/server/plugins/engine/pageControllers/SummaryPageController.js.map +1 -1
  71. package/.server/server/plugins/engine/services/notifyService.d.ts +1 -1
  72. package/.server/server/plugins/engine/services/notifyService.js +1 -1
  73. package/.server/server/plugins/engine/services/notifyService.js.map +1 -1
  74. package/.server/server/plugins/engine/views/components/fileuploadfield.html +1 -1
  75. package/.server/server/types.d.ts +1 -1
  76. package/.server/server/types.js.map +1 -1
  77. package/package.json +2 -2
  78. package/src/client/javascripts/file-upload.js +10 -3
  79. package/src/client/javascripts/geospatial-map.js +32 -30
  80. package/src/client/javascripts/location-map.js +7 -1
  81. package/src/client/javascripts/sssi-dataset.js +39 -42
  82. package/src/server/constants.js +1 -0
  83. package/src/server/plugins/engine/components/ComponentBase.ts +2 -0
  84. package/src/server/plugins/engine/components/ComponentCollection.ts +4 -5
  85. package/src/server/plugins/engine/components/DeclarationField.ts +1 -2
  86. package/src/server/plugins/engine/components/FileUploadField.ts +2 -2
  87. package/src/server/plugins/engine/components/FormComponent.ts +2 -4
  88. package/src/server/plugins/engine/components/Markdown.ts +2 -3
  89. package/src/server/plugins/engine/components/types.ts +1 -0
  90. package/src/server/plugins/engine/i18n/translations/cy.json +37 -1
  91. package/src/server/plugins/engine/i18n/translations/en-GB.json +9 -1
  92. package/src/server/plugins/engine/i18n/types.ts +1 -0
  93. package/src/server/plugins/engine/models/SummaryViewModel.ts +4 -4
  94. package/src/server/plugins/engine/outputFormatters/adapter/v1.ts +3 -6
  95. package/src/server/plugins/engine/pageControllers/FileUploadPageController.ts +16 -6
  96. package/src/server/plugins/engine/pageControllers/RepeatPageController.ts +2 -2
  97. package/src/server/plugins/engine/pageControllers/SummaryPageController.ts +7 -1
  98. package/src/server/plugins/engine/services/notifyService.ts +1 -0
  99. package/src/server/plugins/engine/views/components/fileuploadfield.html +1 -1
  100. package/src/server/types.ts +1 -0
@@ -1,4 +1,4 @@
1
- import { type ComponentDef, type MarkdownComponent } from '@defra/forms-model'
1
+ import { type MarkdownComponent } from '@defra/forms-model'
2
2
 
3
3
  import { ComponentBase } from './ComponentBase.js'
4
4
  import { type RenderContext } from './types.js'
@@ -28,8 +28,7 @@ export class Markdown extends ComponentBase {
28
28
 
29
29
  return {
30
30
  ...viewModel,
31
- content:
32
- tComponent(this as unknown as ComponentDef, 'content') || content,
31
+ content: tComponent(this.def, 'content') || content,
33
32
  headerStartLevel: this.headerStartLevel
34
33
  }
35
34
  }
@@ -124,6 +124,7 @@ export interface ViewModel extends Record<string, unknown> {
124
124
  upload?: {
125
125
  count: number
126
126
  summaryList: SummaryList
127
+ uploadingLabel?: string
127
128
  }
128
129
  }
129
130
 
@@ -60,6 +60,12 @@
60
60
  "totalAmount": "Cyfanswm",
61
61
  "reference": "Cyfeirnod",
62
62
  "dateOfPayment": "Dyddiad talu",
63
+ "fileUpload_zero": "Ni uwchlwythwyd unrhyw ffeiliau",
64
+ "fileUpload_one": "Uwchlwythwyd [[count]] ffeil",
65
+ "fileUpload_two": "Uwchlwythwyd dwy feil",
66
+ "fileUpload_few": "Uwchlwythwyd [[count]] ffeil",
67
+ "fileUpload_many": "Uwchlwythwyd [[count]] o ffeiliau",
68
+ "fileUpload_other": "Uwchlwythwyd [[count]] ffeil",
63
69
  "submissionFailed": "Roedd problem ac ni chyflwynwyd eich ffurflen. Ceisiwch gyflwyno'r ffurflen eto",
64
70
  "submissionFailedContactSuffix": " neu gallwch [[contactUsLink]] a dyfynnu'ch cyfeirnod i drefnu ad-daliad",
65
71
  "contactUsLinkText": "cysylltu â ni (yn agor mewn tab newydd)",
@@ -79,17 +85,34 @@
79
85
  "change": "Newid",
80
86
  "notProvided": "Heb ei ddarparu",
81
87
  "visuallyHiddenItem": "eitem [[index]]",
88
+ "pageTitle_zero": "Nid ydych wedi ychwanegu unrhyw atebion",
82
89
  "pageTitle_one": "Rydych wedi ychwanegu [[count]] ateb",
90
+ "pageTitle_two": "Rydych wedi ychwanegu dau ateb",
91
+ "pageTitle_few": "Rydych wedi ychwanegu [[count]] ateb",
92
+ "pageTitle_many": "Rydych wedi ychwanegu [[count]] o atebion",
83
93
  "pageTitle_other": "Rydych wedi ychwanegu [[count]] ateb",
94
+ "tooMany_zero": "Ni allwch ychwanegu unrhyw atebion",
84
95
  "tooMany_one": "Dim ond hyd at [[count]] ateb y gallwch ei ychwanegu",
96
+ "tooMany_two": "Dim ond hyd at ddau gateb y gallwch eu hychwanegu",
97
+ "tooMany_few": "Dim ond hyd at [[count]] ateb y gallwch eu hychwanegu",
98
+ "tooMany_many": "Dim ond hyd at [[count]] o atebion y gallwch eu hychwanegu",
85
99
  "tooMany_other": "Dim ond hyd at [[count]] ateb y gallwch eu hychwanegu",
100
+ "tooFew_zero": "Rhaid i chi ychwanegu atebion",
86
101
  "tooFew_one": "Rhaid i chi ychwanegu o leiaf [[count]] ateb",
102
+ "tooFew_two": "Rhaid i chi ychwanegu o leiaf ddau gateb",
103
+ "tooFew_few": "Rhaid i chi ychwanegu o leiaf [[count]] ateb",
104
+ "tooFew_many": "Rhaid i chi ychwanegu o leiaf [[count]] o atebion",
87
105
  "tooFew_other": "Rhaid i chi ychwanegu o leiaf [[count]] ateb"
88
106
  },
89
107
 
90
108
  "fileUpload": {
91
109
  "upload": "Uwchlwytho ffeil",
92
- "maxFilesReached": "Rydych wedi cyrraedd nifer uchaf y ffeiliau. Tynnwch ffeil i uwchlwytho rhagor."
110
+ "maxFilesReached": "Rydych wedi cyrraedd nifer uchaf y ffeiliau. Tynnwch ffeil i uwchlwytho rhagor.",
111
+ "remove": "Tynnu",
112
+ "removeFileTitle": "Ydych chi'n siŵr eich bod chi eisiau dileu'r ffeil hon?",
113
+ "removeFileBody": "Ni allwch adfer ffeiliau a dynnwyd.",
114
+ "removeFileButton": "Dileu ffeil",
115
+ "cancel": "Canslo"
93
116
  },
94
117
 
95
118
  "exit": {
@@ -135,7 +158,11 @@
135
158
  "findAnAddressInstead": "dod o hyd i gyfeiriad yn lle hynny",
136
159
  "noAddressFoundTitle": "Ni chanfuwyd cyfeiriad",
137
160
  "noAddressFoundBody": "Ni allem ddod o hyd i gyfeiriad cyfatebol",
161
+ "addressFound_zero": "Ni chanfuwyd unrhyw gyfeiriadau ar gyfer",
138
162
  "addressFound_one": "Canfuwyd [[count]] cyfeiriad ar gyfer",
163
+ "addressFound_two": "Canfuwyd dau gyfeiriad ar gyfer",
164
+ "addressFound_few": "Canfuwyd [[count]] chyfeiriad ar gyfer",
165
+ "addressFound_many": "Canfuwyd [[count]] o gyfeiriadau ar gyfer",
139
166
  "addressFound_other": "Canfuwyd [[count]] cyfeiriad ar gyfer",
140
167
  "validation": {
141
168
  "invalidPostcode": "Nodwch god post dilys neu nodwch gyfeiriad â llaw",
@@ -237,7 +264,11 @@
237
264
  },
238
265
 
239
266
  "geospatialField": {
267
+ "added_zero": "Ni ychwanegwyd unrhyw leoliadau",
240
268
  "added_one": "Ychwanegwyd [[count]] lleoliad",
269
+ "added_two": "Ychwanegwyd dau leoliad",
270
+ "added_few": "Ychwanegwyd [[count]] lleoliad",
271
+ "added_many": "Ychwanegwyd [[count]] o leoliadau",
241
272
  "added_other": "Ychwanegwyd [[count]] lleoliad",
242
273
  "validation": {
243
274
  "descriptionRequired": "Rhowch ddisgrifiad ar gyfer lleoliad [[count]]",
@@ -262,10 +293,15 @@
262
293
  },
263
294
 
264
295
  "fileUploadField": {
296
+ "uploading": "Yn uwchlwytho…",
265
297
  "uploaded": "Wedi'i uwchlwytho",
266
298
  "uploadFailed": "Roedd problem gyda'ch ffeiliau a uwchlwythwyd. Uwchlwythwch nhw eto cyn cyflwyno'r ffurflen.",
267
299
  "uploadedFilesHeading": "Ffeiliau a uwchlwythwyd",
300
+ "filesCount_zero": "Uwchlwythwyd [[count]] o ffeiliau",
268
301
  "filesCount_one": "Uwchlwythwyd [[count]] ffeil",
302
+ "filesCount_two": "Uwchlwythwyd [[count]] ffeil",
303
+ "filesCount_few": "Uwchlwythwyd [[count]] ffeil",
304
+ "filesCount_many": "Uwchlwythwyd [[count]] o ffeiliau",
269
305
  "filesCount_other": "Uwchlwythwyd [[count]] ffeil"
270
306
  },
271
307
 
@@ -60,6 +60,8 @@
60
60
  "totalAmount": "Total amount",
61
61
  "reference": "Reference",
62
62
  "dateOfPayment": "Date of payment",
63
+ "fileUpload_one": "Uploaded [[count]] file",
64
+ "fileUpload_other": "Uploaded [[count]] files",
63
65
  "submissionFailed": "There was a problem and your form was not submitted. Try submitting the form again",
64
66
  "submissionFailedContactSuffix": " or you can [[contactUsLink]] and quote your reference number to arrange a refund",
65
67
  "contactUsLinkText": "contact us (opens in new tab)",
@@ -89,7 +91,12 @@
89
91
 
90
92
  "fileUpload": {
91
93
  "upload": "Upload file",
92
- "maxFilesReached": "You have reached the maximum number of files. Please remove a file to upload more."
94
+ "maxFilesReached": "You have reached the maximum number of files. Please remove a file to upload more.",
95
+ "remove": "Remove",
96
+ "removeFileTitle": "Are you sure you want to remove this file?",
97
+ "removeFileBody": "You cannot recover removed files.",
98
+ "removeFileButton": "Remove file",
99
+ "cancel": "Cancel"
93
100
  },
94
101
 
95
102
  "exit": {
@@ -262,6 +269,7 @@
262
269
  },
263
270
 
264
271
  "fileUploadField": {
272
+ "uploading": "Uploading…",
265
273
  "uploaded": "Uploaded",
266
274
  "uploadFailed": "There was a problem with your uploaded files. Re-upload them before submitting the form again.",
267
275
  "uploadedFilesHeading": "Uploaded files",
@@ -22,6 +22,7 @@ export type FormDefinitionTranslations = Record<
22
22
  hint: string
23
23
  content: string
24
24
  shortDescription: string
25
+ errorDescription: string
25
26
  paymentDescription: string
26
27
  }>
27
28
  >
@@ -212,12 +212,12 @@ function ItemRepeat(
212
212
  translator: Translator
213
213
  ): DetailItemRepeat {
214
214
  const { collection, repeat } = page
215
- const { name, title } = repeat.options
216
-
215
+ const { name } = repeat.options
216
+ const { t, tPage } = translator
217
+ const title = tPage(page.pageDef, 'repeatTitle') || repeat.options.title
217
218
  const values = page.getListFromState(state)
218
219
  const count = values.length
219
- const value =
220
- count === 0 ? '' : translator.t('pages.repeater.pageTitle', { count })
220
+ const value = count === 0 ? '' : t('pages.repeater.pageTitle', { count })
221
221
 
222
222
  return {
223
223
  name,
@@ -3,6 +3,7 @@ import {
3
3
  type SubmitResponsePayload
4
4
  } from '@defra/forms-model'
5
5
 
6
+ import { EN_GB } from '../../../../constants.js'
6
7
  import {
7
8
  getFormVersion,
8
9
  type checkFormStatus
@@ -42,18 +43,14 @@ export function format(
42
43
  formSlug: formMetadata?.slug ?? '',
43
44
  status: formStatus.state,
44
45
  isPreview: formStatus.isPreview,
45
- notificationEmail: formMetadata?.notificationEmail ?? ''
46
+ notificationEmail: formMetadata?.notificationEmail ?? '',
47
+ language: context.translator?.language ?? EN_GB
46
48
  }
47
49
 
48
50
  if (versionMetadata) {
49
51
  meta.versionMetadata = versionMetadata
50
52
  }
51
53
 
52
- const definitionLanguage = model.def.metadata?.language
53
- if (typeof definitionLanguage === 'string') {
54
- meta.language = definitionLanguage
55
- }
56
-
57
54
  const main = Object.fromEntries(
58
55
  Object.entries(v2Main).map(([key, value]) => {
59
56
  if (value === undefined) {
@@ -188,17 +188,19 @@ export class FileUploadPageController extends QuestionPageController {
188
188
 
189
189
  const { filename } = fileToRemove.status.form.file
190
190
 
191
- const { t } = this.getTranslator(request)
191
+ const translator = this.getTranslator(request)
192
+ const { t } = translator
192
193
 
193
194
  return h.view(this.fileDeleteViewName, {
194
195
  ...viewModel,
195
196
  context,
196
197
  backLink: this.getBackLink(request, context, t),
197
- pageTitle: `Are you sure you want to remove this file?`,
198
+ pageTitle: t('pages.fileUpload.removeFileTitle'),
198
199
  itemTitle: filename,
199
- confirmation: { text: 'You cannot recover removed files.' },
200
- buttonConfirm: { text: 'Remove file' },
201
- buttonCancel: { text: 'Cancel' }
200
+ confirmation: { text: t('pages.fileUpload.removeFileBody') },
201
+ buttonConfirm: { text: t('pages.fileUpload.removeFileButton') },
202
+ buttonCancel: { text: t('pages.fileUpload.cancel') },
203
+ t
202
204
  } satisfies ItemDeletePageViewModel)
203
205
  }
204
206
  }
@@ -266,6 +268,7 @@ export class FileUploadPageController extends QuestionPageController {
266
268
  ): FeaturedFormPageViewModel {
267
269
  const { fileUpload } = this
268
270
  const { state } = context
271
+ const { t } = translator
269
272
 
270
273
  const upload = this.getUploadFromState(state)
271
274
 
@@ -277,6 +280,12 @@ export class FileUploadPageController extends QuestionPageController {
277
280
  ({ model }) => model.id === fileUpload.name
278
281
  )
279
282
 
283
+ formComponent.model.upload = {
284
+ count: formComponent.model.upload?.count ?? 0,
285
+ summaryList: formComponent.model.upload?.summaryList ?? { rows: [] },
286
+ uploadingLabel: t('components.fileUploadField.uploading')
287
+ }
288
+
280
289
  const index = components.indexOf(formComponent)
281
290
 
282
291
  const proxyUrl = getProxyUrlForLocalDevelopment(upload?.uploadUrl)
@@ -290,7 +299,8 @@ export class FileUploadPageController extends QuestionPageController {
290
299
  // Split out components before/after
291
300
  componentsBefore: components.slice(0, index),
292
301
  components: components.slice(index),
293
- proxyUrl
302
+ proxyUrl,
303
+ t
294
304
  }
295
305
  }
296
306
 
@@ -406,9 +406,9 @@ export class RepeatPageController extends QuestionPageController {
406
406
  const { query } = request
407
407
  const { isForceAccess, errors } = context
408
408
 
409
- const { t } = translator
409
+ const { t, tPage } = translator
410
410
 
411
- const { title } = repeat.options
411
+ const title = tPage(this.pageDef, 'repeatTitle') || repeat.options.title
412
412
 
413
413
  const summaryList: SummaryList = {
414
414
  classes: 'govuk-summary-list--long-actions',
@@ -481,6 +481,7 @@ export async function submitForm(
481
481
  emailAddress,
482
482
  items,
483
483
  submitResponse,
484
+ translator.language,
484
485
  formMetadata
485
486
  )
486
487
  } catch (err) {
@@ -557,7 +558,12 @@ function submitData(
557
558
  retrievalKey,
558
559
  referenceNumber,
559
560
  main: buildMainRecords(items, translator),
560
- repeaters: buildRepeaterRecords(items, translator)
561
+ repeaters: buildRepeaterRecords(items, translator),
562
+ // Only populate the language property if the form is multi-language enabled
563
+ // @ts-expect-error - dynamic language property
564
+ language: model.def.metadata?.translations?.cy
565
+ ? translator.language
566
+ : undefined
561
567
  }
562
568
  return submit(payload)
563
569
  }
@@ -28,6 +28,7 @@ export async function submit(
28
28
  emailAddress: string,
29
29
  items: DetailItem[],
30
30
  submitResponse: SubmitResponsePayload,
31
+ _language: string,
31
32
  formMetadata?: FormMetadata
32
33
  ) {
33
34
  if (!templateId) {
@@ -3,7 +3,7 @@
3
3
  {% macro FileUploadField(component) %}
4
4
  {% set upload = component.model.upload %}
5
5
 
6
- <div id="uploadedFilesContainer">
6
+ <div id="uploadedFilesContainer" data-uploadinglabel="{{ upload.uploadingLabel }}">
7
7
  <h2 class="govuk-heading-m">{{ t('components.fileUploadField.uploadedFilesHeading') }}</h2>
8
8
  {% if upload.count %}
9
9
  <p class="govuk-body" role="alert">{{ t('components.fileUploadField.filesCount', { count: upload.count }) }}</p>
@@ -71,6 +71,7 @@ export interface OutputService {
71
71
  emailAddress: string,
72
72
  items: DetailItem[],
73
73
  submitResponse: SubmitResponsePayload,
74
+ language: string,
74
75
  formMetadata?: FormMetadata
75
76
  ) => Promise<void>
76
77
  }