@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.
- package/dist/module/form/form-editor/__stubs__/preview.js +30 -1
- package/dist/module/form/form-editor/__stubs__/preview.js.map +1 -1
- package/dist/module/form/form-editor/index.js +1 -1
- package/dist/module/form/form-editor/index.js.map +1 -1
- package/dist/module/form/form-editor/macros/types.js.map +1 -1
- package/dist/module/form/form-editor/preview/controller/page-controller.js +5 -1
- package/dist/module/form/form-editor/preview/controller/page-controller.js.map +1 -1
- package/dist/module/form/form-editor/preview/controller/summary-page-controller.js +14 -1
- package/dist/module/form/form-editor/preview/controller/summary-page-controller.js.map +1 -1
- package/dist/module/form/form-editor/preview/helpers.js +8 -2
- package/dist/module/form/form-editor/preview/helpers.js.map +1 -1
- package/dist/module/form/form-editor/preview/index.js +1 -0
- package/dist/module/form/form-editor/preview/index.js.map +1 -1
- package/dist/module/form/form-editor/preview/payment.js +132 -0
- package/dist/module/form/form-editor/preview/payment.js.map +1 -0
- package/dist/module/form/form-editor/preview/types.js.map +1 -1
- package/dist/types/form/form-editor/__stubs__/preview.d.ts +20 -0
- package/dist/types/form/form-editor/__stubs__/preview.d.ts.map +1 -1
- package/dist/types/form/form-editor/index.d.ts.map +1 -1
- package/dist/types/form/form-editor/macros/types.d.ts +5 -0
- package/dist/types/form/form-editor/macros/types.d.ts.map +1 -1
- package/dist/types/form/form-editor/preview/controller/page-controller.d.ts.map +1 -1
- package/dist/types/form/form-editor/preview/controller/summary-page-controller.d.ts +10 -0
- package/dist/types/form/form-editor/preview/controller/summary-page-controller.d.ts.map +1 -1
- package/dist/types/form/form-editor/preview/helpers.d.ts.map +1 -1
- package/dist/types/form/form-editor/preview/index.d.ts +1 -0
- package/dist/types/form/form-editor/preview/payment.d.ts +63 -0
- package/dist/types/form/form-editor/preview/payment.d.ts.map +1 -0
- package/dist/types/form/form-editor/preview/types.d.ts +14 -0
- package/dist/types/form/form-editor/preview/types.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/form/form-editor/__stubs__/preview.js +26 -1
- package/src/form/form-editor/index.ts +3 -1
- package/src/form/form-editor/macros/types.ts +6 -0
- package/src/form/form-editor/preview/controller/page-controller.js +7 -1
- package/src/form/form-editor/preview/controller/summary-page-controller.js +14 -1
- package/src/form/form-editor/preview/helpers.js +11 -2
- package/src/form/form-editor/preview/index.js +1 -0
- package/src/form/form-editor/preview/payment.js +142 -0
- 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
|
*/
|
|
@@ -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 =
|