@defra/forms-model 3.0.608 → 3.0.612

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 (71) hide show
  1. package/dist/module/__stubs__/components.js +17 -0
  2. package/dist/module/__stubs__/components.js.map +1 -1
  3. package/dist/module/components/component-types.js +4 -1
  4. package/dist/module/components/component-types.js.map +1 -1
  5. package/dist/module/components/types.js.map +1 -1
  6. package/dist/module/form/form-editor/__stubs__/preview.js +30 -1
  7. package/dist/module/form/form-editor/__stubs__/preview.js.map +1 -1
  8. package/dist/module/form/form-editor/index.js +7 -3
  9. package/dist/module/form/form-editor/index.js.map +1 -1
  10. package/dist/module/form/form-editor/macros/types.js.map +1 -1
  11. package/dist/module/form/form-editor/preview/controller/page-controller.js +5 -1
  12. package/dist/module/form/form-editor/preview/controller/page-controller.js.map +1 -1
  13. package/dist/module/form/form-editor/preview/controller/summary-page-controller.js +14 -1
  14. package/dist/module/form/form-editor/preview/controller/summary-page-controller.js.map +1 -1
  15. package/dist/module/form/form-editor/preview/helpers.js +8 -2
  16. package/dist/module/form/form-editor/preview/helpers.js.map +1 -1
  17. package/dist/module/form/form-editor/preview/index.js +1 -0
  18. package/dist/module/form/form-editor/preview/index.js.map +1 -1
  19. package/dist/module/form/form-editor/preview/payment.js +117 -0
  20. package/dist/module/form/form-editor/preview/payment.js.map +1 -0
  21. package/dist/module/form/form-editor/preview/types.js.map +1 -1
  22. package/dist/module/form/form-editor/types.js.map +1 -1
  23. package/dist/module/pages/helpers.js +27 -0
  24. package/dist/module/pages/helpers.js.map +1 -1
  25. package/dist/module/pages/index.js +1 -1
  26. package/dist/module/pages/index.js.map +1 -1
  27. package/dist/types/__stubs__/components.d.ts +6 -1
  28. package/dist/types/__stubs__/components.d.ts.map +1 -1
  29. package/dist/types/components/component-types.d.ts.map +1 -1
  30. package/dist/types/components/types.d.ts +2 -2
  31. package/dist/types/components/types.d.ts.map +1 -1
  32. package/dist/types/form/form-editor/__stubs__/preview.d.ts +20 -0
  33. package/dist/types/form/form-editor/__stubs__/preview.d.ts.map +1 -1
  34. package/dist/types/form/form-editor/index.d.ts +4 -0
  35. package/dist/types/form/form-editor/index.d.ts.map +1 -1
  36. package/dist/types/form/form-editor/macros/types.d.ts +5 -0
  37. package/dist/types/form/form-editor/macros/types.d.ts.map +1 -1
  38. package/dist/types/form/form-editor/preview/controller/page-controller.d.ts.map +1 -1
  39. package/dist/types/form/form-editor/preview/controller/summary-page-controller.d.ts +10 -0
  40. package/dist/types/form/form-editor/preview/controller/summary-page-controller.d.ts.map +1 -1
  41. package/dist/types/form/form-editor/preview/helpers.d.ts.map +1 -1
  42. package/dist/types/form/form-editor/preview/index.d.ts +1 -0
  43. package/dist/types/form/form-editor/preview/payment.d.ts +63 -0
  44. package/dist/types/form/form-editor/preview/payment.d.ts.map +1 -0
  45. package/dist/types/form/form-editor/preview/types.d.ts +14 -0
  46. package/dist/types/form/form-editor/preview/types.d.ts.map +1 -1
  47. package/dist/types/form/form-editor/types.d.ts +14 -1
  48. package/dist/types/form/form-editor/types.d.ts.map +1 -1
  49. package/dist/types/pages/helpers.d.ts +13 -0
  50. package/dist/types/pages/helpers.d.ts.map +1 -1
  51. package/dist/types/pages/index.d.ts +1 -1
  52. package/dist/types/pages/index.d.ts.map +1 -1
  53. package/package.json +1 -1
  54. package/schemas/form-editor-input-page-schema.json +2 -1
  55. package/schemas/question-type-full-schema.json +2 -1
  56. package/schemas/question-type-schema.json +2 -1
  57. package/src/__stubs__/components.ts +20 -0
  58. package/src/components/component-types.ts +9 -3
  59. package/src/components/types.ts +2 -2
  60. package/src/form/form-editor/__stubs__/preview.js +26 -1
  61. package/src/form/form-editor/index.ts +21 -3
  62. package/src/form/form-editor/macros/types.ts +6 -0
  63. package/src/form/form-editor/preview/controller/page-controller.js +7 -1
  64. package/src/form/form-editor/preview/controller/summary-page-controller.js +14 -1
  65. package/src/form/form-editor/preview/helpers.js +11 -2
  66. package/src/form/form-editor/preview/index.js +1 -0
  67. package/src/form/form-editor/preview/payment.js +126 -0
  68. package/src/form/form-editor/preview/types.ts +17 -0
  69. package/src/form/form-editor/types.ts +17 -0
  70. package/src/pages/helpers.ts +32 -0
  71. package/src/pages/index.ts +3 -0
@@ -47,6 +47,10 @@ import {
47
47
  OsGridRefComponentPreviewElements,
48
48
  OsGridRefQuestion
49
49
  } from '~/src/form/form-editor/preview/os-grid-ref.js'
50
+ import {
51
+ PaymentComponentPreviewElements,
52
+ PaymentQuestion
53
+ } from '~/src/form/form-editor/preview/payment.js'
50
54
  import { PhoneNumberQuestion } from '~/src/form/form-editor/preview/phone-number.js'
51
55
  import { QuestionComponentElements } from '~/src/form/form-editor/preview/question.js'
52
56
  import { RadioQuestion } from '~/src/form/form-editor/preview/radio.js'
@@ -93,7 +97,8 @@ const InputFieldComponentDictionary = {
93
97
  [ComponentType.OsGridRefField]: OsGridRefQuestion,
94
98
  [ComponentType.NationalGridFieldNumberField]: NationalGridQuestion,
95
99
  [ComponentType.LatLongField]: LatLongQuestion,
96
- [ComponentType.HiddenField]: HiddenQuestion
100
+ [ComponentType.HiddenField]: HiddenQuestion,
101
+ [ComponentType.PaymentField]: PaymentQuestion
97
102
  }
98
103
 
99
104
  /**
@@ -154,6 +159,10 @@ const ComponentToPreviewQuestion = {
154
159
  [ComponentType.LatLongField]: (component, _definition) => {
155
160
  const componentCoerced = /** @type {LatLongFieldComponent} */ (component)
156
161
  return new LatLongComponentPreviewElements(componentCoerced)
162
+ },
163
+ [ComponentType.PaymentField]: (component, _definition) => {
164
+ const componentCoerced = /** @type {PaymentFieldComponent} */ (component)
165
+ return new PaymentComponentPreviewElements(componentCoerced)
157
166
  }
158
167
  }
159
168
 
@@ -202,5 +211,5 @@ export function mapComponentToPreviewQuestion(questionRenderer, definition) {
202
211
  * @import { Question } from '~/src/form/form-editor/preview/question.js'
203
212
  * @import { PreviewComponent } from '~/src/form/form-editor/preview/preview.js'
204
213
  * @import { FormDefinition } from '~/src/form/form-definition/types.js'
205
- * @import { AutocompleteFieldComponent, ComponentDef, DeclarationFieldComponent, EastingNorthingFieldComponent, LatLongFieldComponent, MultilineTextFieldComponent, NationalGridFieldNumberFieldComponent, NumberFieldComponent, OsGridRefFieldComponent, SelectFieldComponent, UkAddressFieldComponent, YesNoFieldComponent } from '~/src/components/types.js'
214
+ * @import { AutocompleteFieldComponent, ComponentDef, DeclarationFieldComponent, EastingNorthingFieldComponent, LatLongFieldComponent, MultilineTextFieldComponent, NationalGridFieldNumberFieldComponent, NumberFieldComponent, OsGridRefFieldComponent, PaymentFieldComponent, SelectFieldComponent, UkAddressFieldComponent, YesNoFieldComponent } from '~/src/components/types.js'
206
215
  */
@@ -27,6 +27,7 @@ export * from '~/src/form/form-editor/preview/uk-address.js'
27
27
  export * from '~/src/form/form-editor/preview/unsupported-question.js'
28
28
  export * from '~/src/form/form-editor/preview/yes-no.js'
29
29
  export * from '~/src/form/form-editor/preview/hidden.js'
30
+ export * from '~/src/form/form-editor/preview/payment.js'
30
31
  export * from '~/src/form/form-editor/preview/controller/page-controller-base.js'
31
32
  export * from '~/src/form/form-editor/preview/controller/page-controller.js'
32
33
  export * from '~/src/form/form-editor/preview/controller/guidance-page-controller.js'
@@ -0,0 +1,126 @@
1
+ import { ComponentType } from '~/src/components/enums.js'
2
+ import { PreviewComponent } from '~/src/form/form-editor/preview/preview.js'
3
+ import {
4
+ Question,
5
+ QuestionComponentElements
6
+ } from '~/src/form/form-editor/preview/question.js'
7
+
8
+ /**
9
+ * @implements {PaymentElements}
10
+ */
11
+ export class PaymentComponentPreviewElements extends QuestionComponentElements {
12
+ /**
13
+ * @type {number}
14
+ * @protected
15
+ */
16
+ _paymentAmount = 0
17
+
18
+ /**
19
+ * @type {string}
20
+ * @protected
21
+ */
22
+ _paymentDescription = ''
23
+
24
+ /**
25
+ * @param {PaymentFieldComponent} component
26
+ */
27
+ constructor(component) {
28
+ super(component)
29
+ this._paymentAmount = component.options.amount
30
+ this._paymentDescription = component.options.description
31
+ }
32
+
33
+ /**
34
+ * @returns {PaymentSettings}
35
+ */
36
+ get values() {
37
+ return {
38
+ ...super.values,
39
+ paymentAmount: this._paymentAmount,
40
+ paymentDescription: this._paymentDescription
41
+ }
42
+ }
43
+ }
44
+
45
+ export class PaymentQuestion extends Question {
46
+ /**
47
+ * @type {ComponentType}
48
+ */
49
+ componentType = ComponentType.PaymentField
50
+ /**
51
+ * @type {string}
52
+ * @protected
53
+ */
54
+ _questionTemplate = PreviewComponent.PATH + 'paymentfield.njk'
55
+ _fieldName = 'PaymentField'
56
+
57
+ /**
58
+ * @type {number}
59
+ * @protected
60
+ */
61
+ _paymentAmount = 0
62
+
63
+ /**
64
+ * @type {string}
65
+ * @protected
66
+ */
67
+ _paymentDescription = ''
68
+
69
+ /**
70
+ * @param {PaymentElements} htmlElements
71
+ * @param {QuestionRenderer} questionRenderer
72
+ */
73
+ constructor(htmlElements, questionRenderer) {
74
+ super(htmlElements, questionRenderer)
75
+ this._paymentAmount = htmlElements.values.paymentAmount
76
+ this._paymentDescription = htmlElements.values.paymentDescription
77
+ }
78
+
79
+ get paymentAmount() {
80
+ return this._paymentAmount
81
+ }
82
+
83
+ /**
84
+ * @param {number} val
85
+ */
86
+ set paymentAmount(val) {
87
+ this._paymentAmount = val
88
+ this.render()
89
+ }
90
+
91
+ get paymentDescription() {
92
+ return this._paymentDescription
93
+ }
94
+
95
+ /**
96
+ * @param {string} val
97
+ */
98
+ set paymentDescription(val) {
99
+ this._paymentDescription = val
100
+ this.render()
101
+ }
102
+
103
+ /**
104
+ * @protected
105
+ * @returns {PaymentModel}
106
+ */
107
+ _renderInput() {
108
+ const amount =
109
+ typeof this._paymentAmount === 'number'
110
+ ? this._paymentAmount.toFixed(2)
111
+ : '0.00'
112
+
113
+ return {
114
+ ...super._renderInput(),
115
+ amount,
116
+ description: this._paymentDescription || 'Payment description',
117
+ headingClasses: 'govuk-heading-m'
118
+ }
119
+ }
120
+ }
121
+
122
+ /**
123
+ * @import { PaymentSettings, PaymentElements, QuestionRenderer } from '~/src/form/form-editor/preview/types.js'
124
+ * @import { PaymentModel } from '~/src/form/form-editor/macros/types.js'
125
+ * @import { PaymentFieldComponent } from '~/src/components/types.js'
126
+ */
@@ -100,6 +100,15 @@ export interface LocationElements extends DomElementsBase {
100
100
  readonly values: LocationSettings
101
101
  }
102
102
 
103
+ export interface PaymentSettings extends BaseSettings {
104
+ paymentAmount: number
105
+ paymentDescription: string
106
+ }
107
+
108
+ export interface PaymentElements extends DomElementsBase {
109
+ readonly values: PaymentSettings
110
+ }
111
+
103
112
  export interface LocationFieldModel extends QuestionBaseModel {
104
113
  userClasses: string
105
114
  fieldset: {
@@ -169,12 +178,19 @@ export interface SectionForPreview {
169
178
  pages: { title: string }[]
170
179
  }
171
180
 
181
+ export interface PaymentPreviewInfo {
182
+ hasPayment: boolean
183
+ description: string
184
+ amount: string
185
+ }
186
+
172
187
  export interface SummaryPageElements extends PagePreviewBaseElements {
173
188
  declaration: boolean
174
189
  showConfirmationEmail: boolean
175
190
  isConfirmationEmailSettingsPanel: boolean
176
191
  sections?: SectionForPreview[]
177
192
  unassignedPages?: { title: string }[]
193
+ payment?: PaymentPreviewInfo
178
194
  }
179
195
 
180
196
  export interface SummaryPageInitialState {
@@ -184,6 +200,7 @@ export interface SummaryPageInitialState {
184
200
  isConfirmationEmailSettingsPanel: boolean
185
201
  sections?: SectionForPreview[]
186
202
  unassignedPages?: { title: string }[]
203
+ payment?: PaymentPreviewInfo
187
204
  }
188
205
 
189
206
  export type PreviewQuestion =
@@ -304,6 +304,16 @@ export interface FormEditor {
304
304
  * Denotes if the UK address question supports postcode lookup
305
305
  */
306
306
  usePostcodeLookup: string
307
+
308
+ /**
309
+ * Amount of payment in pounds
310
+ */
311
+ paymentAmount: string
312
+
313
+ /**
314
+ * Description of the payment (will appear in the payment provider's pages)
315
+ */
316
+ paymentDescription: string
307
317
  }
308
318
 
309
319
  export type FormEditorInputPage = Pick<
@@ -371,6 +381,8 @@ export type FormEditorInputQuestion = Pick<
371
381
  | 'usePostcodeLookup'
372
382
  | 'giveInstructions'
373
383
  | 'instructionText'
384
+ | 'paymentAmount'
385
+ | 'paymentDescription'
374
386
  >
375
387
 
376
388
  export type FormEditorInputPageSettings = Pick<
@@ -539,6 +551,9 @@ export interface GovukField {
539
551
  formGroup?: {
540
552
  classes?: string
541
553
  }
554
+ prefix?: {
555
+ text?: string
556
+ }
542
557
  preContent?: {
543
558
  path?: string
544
559
  }
@@ -585,6 +600,8 @@ export interface FormEditorGovukField {
585
600
  autoCompleteOptions?: GovukField
586
601
  usePostcodeLookup?: GovukField
587
602
  declarationText?: GovukField
603
+ paymentAmount?: GovukField
604
+ paymentDescription?: GovukField
588
605
  errorMessage?: { text: string }
589
606
  }
590
607
 
@@ -129,6 +129,12 @@ export function onlyDeclarationComponents(components: ComponentDef[]): boolean {
129
129
  .every((component) => component.type === ComponentType.DeclarationField)
130
130
  }
131
131
 
132
+ export function includesPaymentField(components: ComponentDef[]): boolean {
133
+ return components.some(
134
+ (component) => component.type === ComponentType.PaymentField
135
+ )
136
+ }
137
+
132
138
  const SHOW_REPEATER_CONTROLLERS = [ControllerType.Page, ControllerType.Repeat]
133
139
 
134
140
  export function showRepeaterSettings(page: Page): boolean {
@@ -142,6 +148,9 @@ export function showRepeaterSettings(page: Page): boolean {
142
148
  if (onlyDeclarationComponents(page.components)) {
143
149
  return false
144
150
  }
151
+ if (includesPaymentField(page.components)) {
152
+ return false
153
+ }
145
154
  }
146
155
  return true
147
156
  }
@@ -218,3 +227,26 @@ export function replaceCustomControllers(definition: FormDefinition) {
218
227
  })
219
228
  } as FormDefinition
220
229
  }
230
+
231
+ /**
232
+ * Helper function to determine if the current page contains a payment question
233
+ * @param page - the page of the form
234
+ * @returns {boolean}
235
+ */
236
+ export function isPaymentPage(page: Page | undefined) {
237
+ if (hasComponentsEvenIfNoNext(page)) {
238
+ return page.components.some(
239
+ (comp) => comp.type === ComponentType.PaymentField
240
+ )
241
+ }
242
+ return false
243
+ }
244
+
245
+ /**
246
+ * Helper function to determine if the current page is an end page i.e. summary page or payment page
247
+ * @param page - the page of the form
248
+ * @returns {boolean}
249
+ */
250
+ export function isEndPage(page: Page | undefined) {
251
+ return isSummaryPage(page) || isPaymentPage(page)
252
+ }
@@ -16,7 +16,10 @@ export {
16
16
  hasNext,
17
17
  hasRepeater,
18
18
  includesFileUploadField,
19
+ includesPaymentField,
19
20
  isControllerName,
21
+ isEndPage,
22
+ isPaymentPage,
20
23
  isSummaryPage,
21
24
  replaceCustomControllers,
22
25
  showRepeaterSettings,