@defra/forms-engine-plugin 5.0.0-alpha.11 → 5.0.0-alpha.12

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 (62) hide show
  1. package/.server/server/plugins/engine/components/CheckboxesField.d.ts +20 -2
  2. package/.server/server/plugins/engine/components/CheckboxesField.js +24 -12
  3. package/.server/server/plugins/engine/components/CheckboxesField.js.map +1 -1
  4. package/.server/server/plugins/engine/components/EastingNorthingField.d.ts +2 -0
  5. package/.server/server/plugins/engine/components/EastingNorthingField.js +1 -1
  6. package/.server/server/plugins/engine/components/EastingNorthingField.js.map +1 -1
  7. package/.server/server/plugins/engine/components/FileUploadField.d.ts +10 -1
  8. package/.server/server/plugins/engine/components/FileUploadField.js +18 -6
  9. package/.server/server/plugins/engine/components/FileUploadField.js.map +1 -1
  10. package/.server/server/plugins/engine/components/GeospatialField.d.ts +21 -0
  11. package/.server/server/plugins/engine/components/GeospatialField.js +32 -9
  12. package/.server/server/plugins/engine/components/GeospatialField.js.map +1 -1
  13. package/.server/server/plugins/engine/components/LatLongField.d.ts +2 -0
  14. package/.server/server/plugins/engine/components/LocationFieldBase.js +4 -1
  15. package/.server/server/plugins/engine/components/LocationFieldBase.js.map +1 -1
  16. package/.server/server/plugins/engine/components/LocationFieldHelpers.d.ts +2 -0
  17. package/.server/server/plugins/engine/components/LocationFieldHelpers.js +7 -1
  18. package/.server/server/plugins/engine/components/LocationFieldHelpers.js.map +1 -1
  19. package/.server/server/plugins/engine/components/helpers/geospatial.d.ts +5 -0
  20. package/.server/server/plugins/engine/components/helpers/geospatial.js +25 -16
  21. package/.server/server/plugins/engine/components/helpers/geospatial.js.map +1 -1
  22. package/.server/server/plugins/engine/form-availability.d.ts +3 -2
  23. package/.server/server/plugins/engine/form-availability.js +3 -2
  24. package/.server/server/plugins/engine/form-availability.js.map +1 -1
  25. package/.server/server/plugins/engine/form-context.js +2 -2
  26. package/.server/server/plugins/engine/form-context.js.map +1 -1
  27. package/.server/server/plugins/engine/i18n/buildValidationMessages.d.ts +1 -1
  28. package/.server/server/plugins/engine/i18n/buildValidationMessages.js +30 -9
  29. package/.server/server/plugins/engine/i18n/buildValidationMessages.js.map +1 -1
  30. package/.server/server/plugins/engine/i18n/translations/cy.json +66 -10
  31. package/.server/server/plugins/engine/i18n/translations/en-GB.json +29 -10
  32. package/.server/server/plugins/engine/i18n/types.d.ts +1 -0
  33. package/.server/server/plugins/engine/i18n/types.js.map +1 -1
  34. package/.server/server/plugins/engine/models/unavailable-view-model.d.ts +11 -2
  35. package/.server/server/plugins/engine/models/unavailable-view-model.js +23 -4
  36. package/.server/server/plugins/engine/models/unavailable-view-model.js.map +1 -1
  37. package/.server/server/plugins/engine/pageControllers/validationOptions.d.ts +1 -1
  38. package/.server/server/plugins/engine/pageControllers/validationOptions.js +1 -1
  39. package/.server/server/plugins/engine/pageControllers/validationOptions.js.map +1 -1
  40. package/.server/server/plugins/engine/unavailable-response.js +5 -2
  41. package/.server/server/plugins/engine/unavailable-response.js.map +1 -1
  42. package/.server/server/plugins/engine/views/components/_location-field-base.html +1 -1
  43. package/.server/server/plugins/engine/views/unavailable.html +14 -11
  44. package/package.json +1 -1
  45. package/src/server/plugins/engine/components/CheckboxesField.ts +34 -13
  46. package/src/server/plugins/engine/components/EastingNorthingField.ts +1 -1
  47. package/src/server/plugins/engine/components/FileUploadField.ts +26 -6
  48. package/src/server/plugins/engine/components/GeospatialField.ts +43 -11
  49. package/src/server/plugins/engine/components/LocationFieldBase.ts +3 -1
  50. package/src/server/plugins/engine/components/LocationFieldHelpers.ts +7 -1
  51. package/src/server/plugins/engine/components/helpers/geospatial.ts +32 -22
  52. package/src/server/plugins/engine/form-availability.ts +8 -2
  53. package/src/server/plugins/engine/form-context.ts +4 -2
  54. package/src/server/plugins/engine/i18n/buildValidationMessages.ts +15 -10
  55. package/src/server/plugins/engine/i18n/translations/cy.json +66 -10
  56. package/src/server/plugins/engine/i18n/translations/en-GB.json +29 -10
  57. package/src/server/plugins/engine/i18n/types.ts +1 -0
  58. package/src/server/plugins/engine/models/unavailable-view-model.ts +26 -5
  59. package/src/server/plugins/engine/pageControllers/validationOptions.ts +2 -2
  60. package/src/server/plugins/engine/unavailable-response.ts +6 -2
  61. package/src/server/plugins/engine/views/components/_location-field-base.html +1 -1
  62. package/src/server/plugins/engine/views/unavailable.html +14 -11
@@ -16,15 +16,24 @@
16
16
  "numberMax": "{{#label}} must be {{#limit}} or lower",
17
17
  "maxWords": "{{#label}} must be {{#limit}} words or fewer",
18
18
  "unicode": "{{#label}} includes invalid characters, for example, long dashes",
19
- "arrayMin": "Select at least {{#limit}} options from the list",
20
- "arrayMax": "Only {{#limit}} can be selected from the list",
21
- "arrayLength": "Select only {{#limit}} options from the list",
22
- "featuresMin": "Define at least {{#limit}} features",
23
- "featuresMax": "Only {{#limit}} features can be defined",
24
- "featuresLength": "Define exactly {{#limit}} features",
25
- "filesMin": "You must upload {{#limit}} files or more",
26
- "filesMax": "You can only upload {{#limit}} files or less",
27
- "filesLength": "You must upload exactly {{#limit}} files"
19
+ "arrayMin_one": "Select at least {{#limit}} option from the list",
20
+ "arrayMin_other": "Select at least {{#limit}} options from the list",
21
+ "arrayMax_one": "Only {{#limit}} option can be selected from the list",
22
+ "arrayMax_other": "Only {{#limit}} options can be selected from the list",
23
+ "arrayLength_one": "Select only {{#limit}} option from the list",
24
+ "arrayLength_other": "Select only {{#limit}} options from the list",
25
+ "featuresMin_one": "Define at least {{#limit}} feature",
26
+ "featuresMin_other": "Define at least {{#limit}} features",
27
+ "featuresMax_one": "Only {{#limit}} feature can be defined",
28
+ "featuresMax_other": "Only {{#limit}} features can be defined",
29
+ "featuresLength_one": "Define exactly {{#limit}} feature",
30
+ "featuresLength_other": "Define exactly {{#limit}} features",
31
+ "filesMin_one": "You must upload {{#limit}} file or more",
32
+ "filesMin_other": "You must upload {{#limit}} files or more",
33
+ "filesMax_one": "You can only upload {{#limit}} file or less",
34
+ "filesMax_other": "You can only upload {{#limit}} files or less",
35
+ "filesLength_one": "You must upload exactly {{#limit}} file",
36
+ "filesLength_other": "You must upload exactly {{#limit}} files"
28
37
  },
29
38
 
30
39
  "errors": {
@@ -44,7 +53,7 @@
44
53
  "and": "and",
45
54
  "england": "England",
46
55
  "wales": "Wales",
47
- "northernIreland": "Northern Ireland",
56
+ "northern-ireland": "Northern Ireland",
48
57
  "scotland": "Scotland",
49
58
  "sendFeedback": "Send feedback"
50
59
  },
@@ -145,6 +154,16 @@
145
154
  "bannerForce": "This is a preview of a [[previewMode]] form. Do not enter personal information.",
146
155
  "bannerText": "This is a preview of a [[previewMode]] form page you are editing.",
147
156
  "previousPages": "It depends on answers from earlier pages in the form. In the live version, users will need to complete those questions first."
157
+ },
158
+
159
+ "formUnavailable": {
160
+ "title": "Sorry, this form is unavailable",
161
+ "subHeading": "'[[formTitle]]' is no longer available.",
162
+ "contactDetailsHeading": "Contact details for [[organisationName]]",
163
+ "telephone": "Telephone",
164
+ "callCharges": "Find out about call charges",
165
+ "email": "Email",
166
+ "onlineContactForm": "Online contact form"
148
167
  }
149
168
  },
150
169
 
@@ -24,6 +24,7 @@ export type FormDefinitionTranslations = Record<
24
24
  shortDescription: string
25
25
  errorDescription: string
26
26
  paymentDescription: string
27
+ instructionText: string
27
28
  }>
28
29
  >
29
30
  sections: Record<string, Partial<Pick<Section, 'title'>>>
@@ -1,19 +1,40 @@
1
- import { type FormMetadata, type FormMetadataContact } from '@defra/forms-model'
1
+ import {
2
+ type FormDefinition,
3
+ type FormMetadata,
4
+ type FormMetadataContact
5
+ } from '@defra/forms-model'
6
+
7
+ import { createFormTranslator } from '../i18n/createFormTranslator.js'
8
+ import { getAvailableLanguages } from '../i18n/languages.js'
9
+ import { type Translator } from '../types/index.js'
2
10
 
3
11
  export interface UnavailableViewModel {
4
12
  pageTitle: string
5
13
  formTitle: string
6
14
  organisationName: string
7
15
  contact?: FormMetadataContact
16
+ context: { translator: Translator }
17
+ language: string
18
+ languages: { code: string; name: string }[]
8
19
  }
9
20
 
10
21
  export function unavailableViewModel(
11
- metadata: FormMetadata
22
+ metadata: FormMetadata,
23
+ definition: FormDefinition | undefined,
24
+ language: string
12
25
  ): UnavailableViewModel {
26
+ const translator = createFormTranslator(metadata, definition, language)
27
+ const { t, tForm } = translator
13
28
  return {
14
- pageTitle: 'Sorry, this form is unavailable',
15
- formTitle: metadata.title,
29
+ pageTitle: t('pages.formUnavailable.title'),
30
+ formTitle: tForm('title') || metadata.title,
16
31
  organisationName: metadata.organisation,
17
- contact: metadata.contact
32
+ contact: metadata.contact,
33
+ context: { translator },
34
+ language,
35
+ // Always get Welsh and English
36
+ languages: getAvailableLanguages({
37
+ metadata: { translations: { cy: {} } }
38
+ } as unknown as FormDefinition)
18
39
  }
19
40
  }
@@ -26,7 +26,7 @@ export const opts = {
26
26
  * import messageTemplate directly and get the English version.
27
27
  */
28
28
  export const messageTemplate: ValidationMessages = buildValidationMessages(
29
- (key) => t(key, 'en-GB')
29
+ (key, options) => t(key, 'en-GB', options)
30
30
  )
31
31
 
32
32
  export const messages: LanguageMessagesExt = {
@@ -79,7 +79,7 @@ export const messagesPre: LanguageMessages =
79
79
  messages as unknown as LanguageMessages
80
80
 
81
81
  export function buildLanguageMessages(
82
- t: (key: string) => string
82
+ t: (key: string, options?: Record<string, unknown>) => string
83
83
  ): LanguageMessages {
84
84
  const vm = buildValidationMessages(t)
85
85
  return {
@@ -2,6 +2,8 @@ import { type Request, type ResponseToolkit, type Server } from '@hapi/hapi'
2
2
 
3
3
  import { isOfflineBoom } from './form-availability.js'
4
4
  import { unavailableViewModel } from './models/unavailable-view-model.js'
5
+ import { type AnyFormRequest } from './types.js'
6
+ import { resolveLanguage } from '../../utils/utils.js'
5
7
 
6
8
  /**
7
9
  * Registers a server-wide onPreResponse extension that intercepts the offline
@@ -17,10 +19,12 @@ export function registerUnavailableResponse(server: Server) {
17
19
  return h.continue
18
20
  }
19
21
 
20
- const { metadata } = response.data
22
+ const { metadata, definition } = response.data
23
+
24
+ const language = resolveLanguage(request as unknown as AnyFormRequest)
21
25
 
22
26
  return h
23
- .view('unavailable', unavailableViewModel(metadata))
27
+ .view('unavailable', unavailableViewModel(metadata, definition, language))
24
28
  .header('Cache-Control', 'no-store, no-cache, must-revalidate')
25
29
  .header('X-Robots-Tag', 'noindex, nofollow')
26
30
  .code(200)
@@ -61,7 +61,7 @@
61
61
  {% set detailsHtml %}
62
62
  {% if component.model.instructionText %}
63
63
  {{ govukDetails({
64
- summaryText: t('components.locationFieldBase.howToFind'),
64
+ summaryText: component.model.instructionSummary,
65
65
  html: component.model.instructionText | markdown | safe,
66
66
  classes: "govuk-!-margin-top-3"
67
67
  }) }}
@@ -1,32 +1,35 @@
1
1
  {% extends baseLayoutPath %}
2
2
 
3
+ {% set t = context.translator.t %}
4
+ {% set tForm = context.translator.tForm %}
5
+
3
6
  {% block content %}
4
7
  <div class="govuk-grid-row">
5
8
  <div class="govuk-grid-column-two-thirds">
6
- <h1 class="govuk-heading-l">Sorry, this form is unavailable</h1>
7
- <p class="govuk-body">'{{ formTitle }}' is no longer available.</p>
8
- <h2 class="govuk-heading-m">Contact details for {{ organisationName }}</h2>
9
+ <h1 class="govuk-heading-l">{{ t('pages.formUnavailable.title') }}</h1>
10
+ <p class="govuk-body">{{ t('pages.formUnavailable.subHeading', { formTitle: formTitle }) }}</p>
11
+ <h2 class="govuk-heading-m">{{ t('pages.formUnavailable.contactDetailsHeading', { organisationName: organisationName }) }}</h2>
9
12
 
10
13
  {% if contact.phone %}
11
- <h3 class="govuk-heading-s">Telephone</h3>
14
+ <h3 class="govuk-heading-s">{{ t('pages.formUnavailable.telephone') }}</h3>
12
15
  <div class="app-prose-scope">
13
- {{ contact.phone | markdown(3) | safe }}
16
+ {{ tForm('contact.phone') | markdown(3) | safe }}
14
17
  </div>
15
- <p class="govuk-body"><a href="https://www.gov.uk/call-charges" class="govuk-link govuk-link--no-visited-state">Find out about call charges</a></p>
18
+ <p class="govuk-body"><a href="https://www.gov.uk/call-charges" class="govuk-link govuk-link--no-visited-state">{{ t('pages.formUnavailable.callCharges') }}</a></p>
16
19
  {% endif %}
17
20
 
18
21
  {% if contact.email %}
19
- <h3 class="govuk-heading-s">Email</h3>
22
+ <h3 class="govuk-heading-s">{{ t('pages.formUnavailable.email') }}</h3>
20
23
  <ul class="govuk-list">
21
- <li><a class="govuk-link govuk-link--no-visited-state" href="mailto:{{ contact.email.address }}">{{ contact.email.address }}</a></li>
22
- <li>{{ contact.email.responseTime }}</li>
24
+ <li><a class="govuk-link govuk-link--no-visited-state" href="mailto:{{ tForm('contact.email.address') }}">{{ tForm('contact.email.address') }}</a></li>
25
+ <li>{{ tForm('contact.email.responseTime') }}</li>
23
26
  </ul>
24
27
  {% endif %}
25
28
 
26
29
  {% if contact.online %}
27
- <h3 class="govuk-heading-s">Online contact form</h3>
30
+ <h3 class="govuk-heading-s">{{ t('pages.formUnavailable.onlineContactForm') }}</h3>
28
31
  <ul class="govuk-list">
29
- <li><a class="govuk-link govuk-link--no-visited-state" href="{{ contact.online.url }}">{{ contact.online.text }}</a></li>
32
+ <li><a class="govuk-link govuk-link--no-visited-state" href="{{ tForm('contact.online.url') }}">{{ tForm('contact.online.text') }}</a></li>
30
33
  </ul>
31
34
  {% endif %}
32
35
  </div>