@defra/forms-model 3.0.611 → 3.0.613

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 (40) hide show
  1. package/dist/module/form/form-editor/__stubs__/preview.js +30 -1
  2. package/dist/module/form/form-editor/__stubs__/preview.js.map +1 -1
  3. package/dist/module/form/form-editor/index.js +1 -1
  4. package/dist/module/form/form-editor/index.js.map +1 -1
  5. package/dist/module/form/form-editor/macros/types.js.map +1 -1
  6. package/dist/module/form/form-editor/preview/controller/page-controller.js +5 -1
  7. package/dist/module/form/form-editor/preview/controller/page-controller.js.map +1 -1
  8. package/dist/module/form/form-editor/preview/controller/summary-page-controller.js +14 -1
  9. package/dist/module/form/form-editor/preview/controller/summary-page-controller.js.map +1 -1
  10. package/dist/module/form/form-editor/preview/helpers.js +8 -2
  11. package/dist/module/form/form-editor/preview/helpers.js.map +1 -1
  12. package/dist/module/form/form-editor/preview/index.js +1 -0
  13. package/dist/module/form/form-editor/preview/index.js.map +1 -1
  14. package/dist/module/form/form-editor/preview/payment.js +132 -0
  15. package/dist/module/form/form-editor/preview/payment.js.map +1 -0
  16. package/dist/module/form/form-editor/preview/types.js.map +1 -1
  17. package/dist/types/form/form-editor/__stubs__/preview.d.ts +20 -0
  18. package/dist/types/form/form-editor/__stubs__/preview.d.ts.map +1 -1
  19. package/dist/types/form/form-editor/index.d.ts.map +1 -1
  20. package/dist/types/form/form-editor/macros/types.d.ts +5 -0
  21. package/dist/types/form/form-editor/macros/types.d.ts.map +1 -1
  22. package/dist/types/form/form-editor/preview/controller/page-controller.d.ts.map +1 -1
  23. package/dist/types/form/form-editor/preview/controller/summary-page-controller.d.ts +10 -0
  24. package/dist/types/form/form-editor/preview/controller/summary-page-controller.d.ts.map +1 -1
  25. package/dist/types/form/form-editor/preview/helpers.d.ts.map +1 -1
  26. package/dist/types/form/form-editor/preview/index.d.ts +1 -0
  27. package/dist/types/form/form-editor/preview/payment.d.ts +63 -0
  28. package/dist/types/form/form-editor/preview/payment.d.ts.map +1 -0
  29. package/dist/types/form/form-editor/preview/types.d.ts +14 -0
  30. package/dist/types/form/form-editor/preview/types.d.ts.map +1 -1
  31. package/package.json +1 -1
  32. package/src/form/form-editor/__stubs__/preview.js +26 -1
  33. package/src/form/form-editor/index.ts +3 -1
  34. package/src/form/form-editor/macros/types.ts +6 -0
  35. package/src/form/form-editor/preview/controller/page-controller.js +7 -1
  36. package/src/form/form-editor/preview/controller/summary-page-controller.js +14 -1
  37. package/src/form/form-editor/preview/helpers.js +11 -2
  38. package/src/form/form-editor/preview/index.js +1 -0
  39. package/src/form/form-editor/preview/payment.js +142 -0
  40. package/src/form/form-editor/preview/types.ts +17 -0
@@ -236,6 +236,31 @@ export class LocationPreviewElements extends QuestionPreviewElements {
236
236
  }
237
237
  }
238
238
 
239
+ /**
240
+ * @implements {PaymentElements}
241
+ */
242
+ export class PaymentPreviewElements extends QuestionPreviewElements {
243
+ /**
244
+ * @param {BaseSettings & {paymentAmount: number, paymentDescription: string}} elements
245
+ */
246
+ constructor({ paymentAmount, paymentDescription, ...elements }) {
247
+ super(elements)
248
+ this._paymentAmount = paymentAmount
249
+ this._paymentDescription = paymentDescription
250
+ }
251
+
252
+ /**
253
+ * @returns {PaymentSettings}
254
+ */
255
+ get values() {
256
+ return {
257
+ ...super.values,
258
+ paymentAmount: this._paymentAmount,
259
+ paymentDescription: this._paymentDescription
260
+ }
261
+ }
262
+ }
263
+
239
264
  /**
240
265
  * @implements {PageOverviewElements}
241
266
  */
@@ -452,5 +477,5 @@ export class NumberPreviewElements {
452
477
  /**
453
478
  * @import { ListElement } from '~/src/form/form-editor/types.js'
454
479
  * @import { PagePreviewPanelMacro } from '~/src/form/form-editor/macros/types.js'
455
- * @import { BaseSettings, ListElements, NumberSettings, RenderContext, QuestionBaseModel, QuestionRenderer, AutocompleteElements, PageOverviewElements, PageRenderer, UkAddressElements, UkAddressSettings, DeclarationElements, DeclarationSettings, LocationElements, LocationSettings } from '~/src/form/form-editor/preview/types.js'
480
+ * @import { BaseSettings, ListElements, NumberSettings, RenderContext, QuestionBaseModel, QuestionRenderer, AutocompleteElements, PageOverviewElements, PageRenderer, UkAddressElements, UkAddressSettings, DeclarationElements, DeclarationSettings, LocationElements, LocationSettings, PaymentElements, PaymentSettings } from '~/src/form/form-editor/preview/types.js'
456
481
  */
@@ -670,7 +670,9 @@ export function govukFieldValueIsString(
670
670
  'autoCompleteOptions',
671
671
  'classes',
672
672
  'prefix',
673
- 'suffix'
673
+ 'suffix',
674
+ 'paymentAmount',
675
+ 'paymentDescription'
674
676
  ].includes(`${govukField.name}`)
675
677
  }
676
678
 
@@ -121,6 +121,12 @@ export interface LatLongModel extends QuestionBaseModel {
121
121
  }
122
122
  }
123
123
 
124
+ export interface PaymentModel extends QuestionBaseModel {
125
+ amount?: string
126
+ description?: string
127
+ headingClasses?: string
128
+ }
129
+
124
130
  export interface AppPreviewPanelMacro extends AppPreviewPanelTabsMacro {
125
131
  model: QuestionBaseModel
126
132
  }
@@ -129,10 +129,16 @@ export class PreviewPageController extends PreviewPageControllerBase {
129
129
  }
130
130
  : {}
131
131
 
132
+ const headingClasses =
133
+ 'headingClasses' in component.renderInput
134
+ ? { headingClasses: largeTitle ? 'govuk-heading-l' : 'govuk-heading-m' }
135
+ : {}
136
+
132
137
  return {
133
138
  ...component.renderInput,
134
139
  ...fieldset,
135
- ...label
140
+ ...label,
141
+ ...headingClasses
136
142
  }
137
143
  }
138
144
 
@@ -46,6 +46,11 @@ export class SummaryPageController extends PreviewPageControllerBase {
46
46
  * @private
47
47
  */
48
48
  _unassignedPages = []
49
+ /**
50
+ * @type {PaymentPreviewInfo | undefined}
51
+ * @private
52
+ */
53
+ _payment
49
54
 
50
55
  /**
51
56
  * @param {SummaryPageElements} elements
@@ -67,6 +72,7 @@ export class SummaryPageController extends PreviewPageControllerBase {
67
72
  elements.isConfirmationEmailSettingsPanel
68
73
  this._sections = elements.sections ?? []
69
74
  this._unassignedPages = elements.unassignedPages ?? []
75
+ this._payment = elements.payment
70
76
  }
71
77
 
72
78
  /**
@@ -179,6 +185,13 @@ export class SummaryPageController extends PreviewPageControllerBase {
179
185
  return this._unassignedPages
180
186
  }
181
187
 
188
+ /**
189
+ * @returns {PaymentPreviewInfo | undefined}
190
+ */
191
+ get payment() {
192
+ return this._payment
193
+ }
194
+
182
195
  /**
183
196
  * @returns {Markdown[]}
184
197
  * @protected
@@ -208,7 +221,7 @@ export class SummaryPageController extends PreviewPageControllerBase {
208
221
  /**
209
222
  * @import { ComponentDef, ContentComponentsDef, ListComponent, FormComponentsDef } from '~/src/components/types.js'
210
223
  * @import { FormDefinition } from '~/src/form/form-definition/types.js'
211
- * @import { PageRenderer, PagePreviewBaseElements, SummaryPageElements, SectionForPreview } from '~/src/form/form-editor/preview/types.js'
224
+ * @import { PageRenderer, PagePreviewBaseElements, SummaryPageElements, SectionForPreview, PaymentPreviewInfo } from '~/src/form/form-editor/preview/types.js'
212
225
  * @import { SummaryRowActionItem, SummaryRow } from '~/src/form/form-editor/macros/types.js'
213
226
  * @import { Markdown } from '~/src/form/form-editor/preview/markdown.js'
214
227
  */
@@ -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,142 @@
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
+ * Formats a currency amount with thousand separators and two decimal places
10
+ * @param {number} value
11
+ * @param {'en-GB'} [locale] - locale for formatting
12
+ * @param {'GBP'} [currency] - currency code
13
+ * @returns {string} Formatted amount (e.g., "£1,234.56")
14
+ */
15
+ function formatCurrency(value, locale = 'en-GB', currency = 'GBP') {
16
+ const formatter = new Intl.NumberFormat(locale, {
17
+ style: 'currency',
18
+ currency
19
+ })
20
+
21
+ return formatter.format(value)
22
+ }
23
+
24
+ /**
25
+ * @implements {PaymentElements}
26
+ */
27
+ export class PaymentComponentPreviewElements extends QuestionComponentElements {
28
+ /**
29
+ * @type {number}
30
+ * @protected
31
+ */
32
+ _paymentAmount = 0
33
+
34
+ /**
35
+ * @type {string}
36
+ * @protected
37
+ */
38
+ _paymentDescription = ''
39
+
40
+ /**
41
+ * @param {PaymentFieldComponent} component
42
+ */
43
+ constructor(component) {
44
+ super(component)
45
+ this._paymentAmount = component.options.amount
46
+ this._paymentDescription = component.options.description
47
+ }
48
+
49
+ /**
50
+ * @returns {PaymentSettings}
51
+ */
52
+ get values() {
53
+ return {
54
+ ...super.values,
55
+ paymentAmount: this._paymentAmount,
56
+ paymentDescription: this._paymentDescription
57
+ }
58
+ }
59
+ }
60
+
61
+ export class PaymentQuestion extends Question {
62
+ /**
63
+ * @type {ComponentType}
64
+ */
65
+ componentType = ComponentType.PaymentField
66
+ /**
67
+ * @type {string}
68
+ * @protected
69
+ */
70
+ _questionTemplate = PreviewComponent.PATH + 'paymentfield.njk'
71
+ _fieldName = 'PaymentField'
72
+
73
+ /**
74
+ * @type {number}
75
+ * @protected
76
+ */
77
+ _paymentAmount = 0
78
+
79
+ /**
80
+ * @type {string}
81
+ * @protected
82
+ */
83
+ _paymentDescription = ''
84
+
85
+ /**
86
+ * @param {PaymentElements} htmlElements
87
+ * @param {QuestionRenderer} questionRenderer
88
+ */
89
+ constructor(htmlElements, questionRenderer) {
90
+ super(htmlElements, questionRenderer)
91
+ this._paymentAmount = htmlElements.values.paymentAmount
92
+ this._paymentDescription = htmlElements.values.paymentDescription
93
+ }
94
+
95
+ get paymentAmount() {
96
+ return this._paymentAmount
97
+ }
98
+
99
+ /**
100
+ * @param {number} val
101
+ */
102
+ set paymentAmount(val) {
103
+ this._paymentAmount = val
104
+ this.render()
105
+ }
106
+
107
+ get paymentDescription() {
108
+ return this._paymentDescription
109
+ }
110
+
111
+ /**
112
+ * @param {string} val
113
+ */
114
+ set paymentDescription(val) {
115
+ this._paymentDescription = val
116
+ this.render()
117
+ }
118
+
119
+ /**
120
+ * @protected
121
+ * @returns {PaymentModel}
122
+ */
123
+ _renderInput() {
124
+ const amount =
125
+ typeof this._paymentAmount === 'number'
126
+ ? formatCurrency(this._paymentAmount)
127
+ : '£0.00'
128
+
129
+ return {
130
+ ...super._renderInput(),
131
+ amount,
132
+ description: this._paymentDescription || 'Payment description',
133
+ headingClasses: 'govuk-heading-m'
134
+ }
135
+ }
136
+ }
137
+
138
+ /**
139
+ * @import { PaymentSettings, PaymentElements, QuestionRenderer } from '~/src/form/form-editor/preview/types.js'
140
+ * @import { PaymentModel } from '~/src/form/form-editor/macros/types.js'
141
+ * @import { PaymentFieldComponent } from '~/src/components/types.js'
142
+ */
@@ -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 =