@defra/forms-model 3.0.178 → 3.0.180
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/components/component-types.js +4 -42
- package/dist/module/components/component-types.js.map +1 -1
- package/dist/module/components/enums.js +0 -5
- package/dist/module/components/enums.js.map +1 -1
- package/dist/module/components/helpers.js +57 -0
- package/dist/module/components/helpers.js.map +1 -0
- package/dist/module/components/index.js +2 -1
- package/dist/module/components/index.js.map +1 -1
- package/dist/module/components/types.js.map +1 -1
- package/dist/module/conditions/condition-field.js +5 -5
- package/dist/module/conditions/condition-field.js.map +1 -1
- package/dist/module/conditions/condition-operators.js +64 -48
- package/dist/module/conditions/condition-operators.js.map +1 -1
- package/dist/module/conditions/condition-ref.js.map +1 -1
- package/dist/module/conditions/condition-values.js +9 -10
- package/dist/module/conditions/condition-values.js.map +1 -1
- package/dist/module/conditions/condition.js.map +1 -1
- package/dist/module/conditions/enums.js +31 -0
- package/dist/module/conditions/enums.js.map +1 -1
- package/dist/module/conditions/index.js +2 -2
- package/dist/module/conditions/index.js.map +1 -1
- package/dist/module/conditions/types.js.map +1 -1
- package/dist/types/components/component-types.d.ts +1 -0
- package/dist/types/components/component-types.d.ts.map +1 -1
- package/dist/types/components/enums.d.ts +1 -6
- package/dist/types/components/enums.d.ts.map +1 -1
- package/dist/types/components/helpers.d.ts +30 -0
- package/dist/types/components/helpers.d.ts.map +1 -0
- package/dist/types/components/index.d.ts +2 -1
- package/dist/types/components/index.d.ts.map +1 -1
- package/dist/types/components/types.d.ts +8 -40
- package/dist/types/components/types.d.ts.map +1 -1
- package/dist/types/conditions/condition-field.d.ts +6 -6
- package/dist/types/conditions/condition-field.d.ts.map +1 -1
- package/dist/types/conditions/condition-operators.d.ts +56 -232
- package/dist/types/conditions/condition-operators.d.ts.map +1 -1
- package/dist/types/conditions/condition-ref.d.ts +3 -3
- package/dist/types/conditions/condition-ref.d.ts.map +1 -1
- package/dist/types/conditions/condition-values.d.ts +5 -8
- package/dist/types/conditions/condition-values.d.ts.map +1 -1
- package/dist/types/conditions/condition.d.ts +6 -6
- package/dist/types/conditions/condition.d.ts.map +1 -1
- package/dist/types/conditions/enums.d.ts +28 -0
- package/dist/types/conditions/enums.d.ts.map +1 -1
- package/dist/types/conditions/index.d.ts +2 -2
- package/dist/types/conditions/index.d.ts.map +1 -1
- package/dist/types/conditions/types.d.ts +8 -0
- package/dist/types/conditions/types.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/components/component-types.ts +6 -47
- package/src/components/enums.ts +1 -6
- package/src/components/helpers.ts +138 -0
- package/src/components/index.ts +14 -1
- package/src/components/types.ts +49 -58
- package/src/conditions/condition-field.ts +25 -11
- package/src/conditions/condition-operators.ts +129 -96
- package/src/conditions/condition-ref.ts +2 -2
- package/src/conditions/condition-values.ts +15 -20
- package/src/conditions/condition.ts +5 -5
- package/src/conditions/enums.ts +31 -0
- package/src/conditions/index.ts +7 -2
- package/src/conditions/types.ts +16 -0
@@ -0,0 +1,138 @@
|
|
1
|
+
import { ComponentType } from '~/src/components/enums.js'
|
2
|
+
import {
|
3
|
+
type InputFieldsComponentsDef,
|
4
|
+
type ComponentDef,
|
5
|
+
type ConditionalComponentsDef,
|
6
|
+
type ContentComponentsDef,
|
7
|
+
type HtmlComponent,
|
8
|
+
type InsetTextComponent,
|
9
|
+
type ListComponentsDef,
|
10
|
+
type SelectionComponentsDef,
|
11
|
+
type EditorComponentsDef
|
12
|
+
} from '~/src/components/types.js'
|
13
|
+
|
14
|
+
/**
|
15
|
+
* Filter known components with support for conditions
|
16
|
+
*/
|
17
|
+
export function hasConditionSupport(
|
18
|
+
component?: Partial<ComponentDef>
|
19
|
+
): component is ConditionalComponentsDef {
|
20
|
+
const allowedTypes = [
|
21
|
+
ComponentType.CheckboxesField,
|
22
|
+
ComponentType.DatePartsField,
|
23
|
+
ComponentType.EmailAddressField,
|
24
|
+
ComponentType.MultilineTextField,
|
25
|
+
ComponentType.NumberField,
|
26
|
+
ComponentType.TextField,
|
27
|
+
ComponentType.TimeField,
|
28
|
+
ComponentType.YesNoField
|
29
|
+
]
|
30
|
+
|
31
|
+
return !!component?.type && allowedTypes.includes(component.type)
|
32
|
+
}
|
33
|
+
|
34
|
+
/**
|
35
|
+
* Filter known components with content fields
|
36
|
+
*/
|
37
|
+
export function hasContentField(
|
38
|
+
component?: Partial<ComponentDef>
|
39
|
+
): component is ContentComponentsDef {
|
40
|
+
const allowedTypes = [
|
41
|
+
ComponentType.Details,
|
42
|
+
ComponentType.Html,
|
43
|
+
ComponentType.InsetText,
|
44
|
+
ComponentType.List
|
45
|
+
]
|
46
|
+
|
47
|
+
return !!component?.type && allowedTypes.includes(component.type)
|
48
|
+
}
|
49
|
+
|
50
|
+
/**
|
51
|
+
* Filter known components with text editor
|
52
|
+
*/
|
53
|
+
export function hasEditor(
|
54
|
+
component?: Partial<ComponentDef>
|
55
|
+
): component is EditorComponentsDef {
|
56
|
+
const allowedTypes = [
|
57
|
+
ComponentType.TextField,
|
58
|
+
ComponentType.EmailAddressField,
|
59
|
+
ComponentType.TelephoneNumberField,
|
60
|
+
ComponentType.MultilineTextField,
|
61
|
+
ComponentType.NumberField,
|
62
|
+
ComponentType.AutocompleteField,
|
63
|
+
ComponentType.SelectField,
|
64
|
+
ComponentType.RadiosField,
|
65
|
+
ComponentType.CheckboxesField,
|
66
|
+
ComponentType.List,
|
67
|
+
ComponentType.Details,
|
68
|
+
ComponentType.Html,
|
69
|
+
ComponentType.InsetText,
|
70
|
+
ComponentType.DatePartsField
|
71
|
+
]
|
72
|
+
|
73
|
+
return !!component?.type && allowedTypes.includes(component.type)
|
74
|
+
}
|
75
|
+
|
76
|
+
/**
|
77
|
+
* Filter known components with input fields
|
78
|
+
*/
|
79
|
+
export function hasInputField(
|
80
|
+
component?: Partial<ComponentDef>
|
81
|
+
): component is InputFieldsComponentsDef {
|
82
|
+
const allowedTypes = [
|
83
|
+
ComponentType.TextField,
|
84
|
+
ComponentType.EmailAddressField,
|
85
|
+
ComponentType.NumberField,
|
86
|
+
ComponentType.MultilineTextField,
|
87
|
+
ComponentType.TelephoneNumberField,
|
88
|
+
ComponentType.YesNoField,
|
89
|
+
ComponentType.MonthYearField,
|
90
|
+
ComponentType.TimeField,
|
91
|
+
ComponentType.UkAddressField
|
92
|
+
]
|
93
|
+
|
94
|
+
return !!component?.type && allowedTypes.includes(component.type)
|
95
|
+
}
|
96
|
+
|
97
|
+
/**
|
98
|
+
* Filter known components with lists
|
99
|
+
*/
|
100
|
+
export function hasListField(
|
101
|
+
component?: Partial<ComponentDef>
|
102
|
+
): component is ListComponentsDef {
|
103
|
+
const allowedTypes = [
|
104
|
+
ComponentType.AutocompleteField,
|
105
|
+
ComponentType.List,
|
106
|
+
ComponentType.RadiosField,
|
107
|
+
ComponentType.SelectField,
|
108
|
+
ComponentType.CheckboxesField
|
109
|
+
]
|
110
|
+
|
111
|
+
return !!component?.type && allowedTypes.includes(component.type)
|
112
|
+
}
|
113
|
+
|
114
|
+
/**
|
115
|
+
* Filter known components with selection fields
|
116
|
+
*/
|
117
|
+
export function hasSelectionFields(
|
118
|
+
component?: Partial<ComponentDef>
|
119
|
+
): component is SelectionComponentsDef {
|
120
|
+
const allowedTypes = [
|
121
|
+
ComponentType.CheckboxesField,
|
122
|
+
ComponentType.RadiosField,
|
123
|
+
ComponentType.SelectField,
|
124
|
+
ComponentType.YesNoField
|
125
|
+
]
|
126
|
+
|
127
|
+
return !!component?.type && allowedTypes.includes(component.type)
|
128
|
+
}
|
129
|
+
|
130
|
+
/**
|
131
|
+
* Filter known components with titles
|
132
|
+
*/
|
133
|
+
export function hasTitle(
|
134
|
+
component?: Partial<ComponentDef>
|
135
|
+
): component is Exclude<ComponentDef, InsetTextComponent | HtmlComponent> {
|
136
|
+
const deniedTypes = [ComponentType.InsetText, ComponentType.Html]
|
137
|
+
return !!component?.type && !deniedTypes.includes(component.type)
|
138
|
+
}
|
package/src/components/index.ts
CHANGED
@@ -1,2 +1,15 @@
|
|
1
|
-
export {
|
1
|
+
export {
|
2
|
+
ComponentTypes,
|
3
|
+
ConditionalComponentTypes
|
4
|
+
} from '~/src/components/component-types.js'
|
5
|
+
export {
|
6
|
+
hasConditionSupport,
|
7
|
+
hasContentField,
|
8
|
+
hasEditor,
|
9
|
+
hasInputField,
|
10
|
+
hasListField,
|
11
|
+
hasSelectionFields,
|
12
|
+
hasTitle
|
13
|
+
} from '~/src/components/helpers.js'
|
14
|
+
|
2
15
|
export { ComponentType, ComponentSubType } from '~/src/components/enums.js'
|
package/src/components/types.ts
CHANGED
@@ -3,11 +3,17 @@ import {
|
|
3
3
|
type ComponentType
|
4
4
|
} from '~/src/components/enums.js'
|
5
5
|
|
6
|
-
export
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
6
|
+
export type ConditionalComponentType = Extract<
|
7
|
+
ComponentType,
|
8
|
+
| typeof ComponentType.CheckboxesField
|
9
|
+
| typeof ComponentType.DatePartsField
|
10
|
+
| typeof ComponentType.EmailAddressField
|
11
|
+
| typeof ComponentType.MultilineTextField
|
12
|
+
| typeof ComponentType.NumberField
|
13
|
+
| typeof ComponentType.TextField
|
14
|
+
| typeof ComponentType.TimeField
|
15
|
+
| typeof ComponentType.YesNoField
|
16
|
+
>
|
11
17
|
|
12
18
|
export interface ContentOptions {
|
13
19
|
condition?: string
|
@@ -24,7 +30,6 @@ interface TextFieldBase {
|
|
24
30
|
| ComponentType.TelephoneNumberField
|
25
31
|
| ComponentType.TextField
|
26
32
|
| ComponentType.UkAddressField
|
27
|
-
| ComponentType.WebsiteField
|
28
33
|
| ComponentType.YesNoField
|
29
34
|
subType?: ComponentSubType.Field
|
30
35
|
name: string
|
@@ -102,10 +107,7 @@ interface ContentFieldBase {
|
|
102
107
|
|
103
108
|
interface DateFieldBase {
|
104
109
|
type:
|
105
|
-
| ComponentType.DateField
|
106
110
|
| ComponentType.DatePartsField
|
107
|
-
| ComponentType.DateTimeField
|
108
|
-
| ComponentType.DateTimePartsField
|
109
111
|
| ComponentType.MonthYearField
|
110
112
|
| ComponentType.TimeField
|
111
113
|
subType?: ComponentSubType.Field
|
@@ -139,13 +141,6 @@ export interface NumberFieldComponent extends NumberFieldBase {
|
|
139
141
|
type: ComponentType.NumberField
|
140
142
|
}
|
141
143
|
|
142
|
-
export interface WebsiteFieldComponent extends TextFieldBase {
|
143
|
-
type: ComponentType.WebsiteField
|
144
|
-
options: TextFieldBase['options'] & {
|
145
|
-
customValidationMessage?: string
|
146
|
-
}
|
147
|
-
}
|
148
|
-
|
149
144
|
export interface TelephoneNumberFieldComponent extends TextFieldBase {
|
150
145
|
type: ComponentType.TelephoneNumberField
|
151
146
|
options: TextFieldBase['options'] & {
|
@@ -170,36 +165,11 @@ export interface MultilineTextFieldComponent extends TextFieldBase {
|
|
170
165
|
}
|
171
166
|
}
|
172
167
|
|
173
|
-
export interface FileUploadFieldComponent {
|
174
|
-
type: ComponentType.FileUploadField
|
175
|
-
subType?: ComponentSubType.Field
|
176
|
-
name: string
|
177
|
-
title: string
|
178
|
-
hint: string
|
179
|
-
options: {
|
180
|
-
required?: boolean
|
181
|
-
hideTitle?: boolean
|
182
|
-
multiple?: boolean
|
183
|
-
classes?: string
|
184
|
-
exposeToContext?: boolean
|
185
|
-
imageQualityPlayback?: boolean
|
186
|
-
}
|
187
|
-
schema: object
|
188
|
-
}
|
189
|
-
|
190
168
|
export interface UkAddressFieldComponent extends TextFieldBase {
|
191
169
|
type: ComponentType.UkAddressField
|
192
170
|
}
|
193
171
|
|
194
172
|
// Date Fields
|
195
|
-
export interface DateFieldComponent extends DateFieldBase {
|
196
|
-
type: ComponentType.DateField
|
197
|
-
}
|
198
|
-
|
199
|
-
export interface DateTimeFieldComponent extends DateFieldBase {
|
200
|
-
type: ComponentType.DateTimeField
|
201
|
-
}
|
202
|
-
|
203
173
|
export interface DatePartsFieldFieldComponent extends DateFieldBase {
|
204
174
|
type: ComponentType.DatePartsField
|
205
175
|
}
|
@@ -208,10 +178,6 @@ export interface MonthYearFieldComponent extends DateFieldBase {
|
|
208
178
|
type: ComponentType.MonthYearField
|
209
179
|
}
|
210
180
|
|
211
|
-
export interface DateTimePartsFieldComponent extends DateFieldBase {
|
212
|
-
type: ComponentType.DateTimePartsField
|
213
|
-
}
|
214
|
-
|
215
181
|
export interface TimeFieldComponent extends DateFieldBase {
|
216
182
|
type: ComponentType.TimeField
|
217
183
|
}
|
@@ -259,14 +225,10 @@ export type ComponentDef =
|
|
259
225
|
| InsetTextComponent
|
260
226
|
| AutocompleteFieldComponent
|
261
227
|
| CheckboxesFieldComponent
|
262
|
-
| DateFieldComponent
|
263
228
|
| DatePartsFieldFieldComponent
|
264
229
|
| MonthYearFieldComponent
|
265
|
-
| DateTimeFieldComponent
|
266
|
-
| DateTimePartsFieldComponent
|
267
230
|
| DetailsComponent
|
268
231
|
| EmailAddressFieldComponent
|
269
|
-
| FileUploadFieldComponent
|
270
232
|
| HtmlComponent
|
271
233
|
| ListComponent
|
272
234
|
| MultilineTextFieldComponent
|
@@ -278,9 +240,8 @@ export type ComponentDef =
|
|
278
240
|
| TimeFieldComponent
|
279
241
|
| UkAddressFieldComponent
|
280
242
|
| YesNoFieldComponent
|
281
|
-
| WebsiteFieldComponent
|
282
243
|
|
283
|
-
// Components that render inputs
|
244
|
+
// Components that render inputs
|
284
245
|
export type InputFieldsComponentsDef =
|
285
246
|
| TextFieldComponent
|
286
247
|
| EmailAddressFieldComponent
|
@@ -288,26 +249,56 @@ export type InputFieldsComponentsDef =
|
|
288
249
|
| MultilineTextFieldComponent
|
289
250
|
| TelephoneNumberFieldComponent
|
290
251
|
| YesNoFieldComponent
|
291
|
-
| FileUploadFieldComponent
|
292
|
-
| DateFieldComponent
|
293
|
-
| DateTimeFieldComponent
|
294
|
-
| DateTimePartsFieldComponent
|
295
252
|
| MonthYearFieldComponent
|
296
253
|
| TimeFieldComponent
|
297
254
|
| UkAddressFieldComponent
|
298
|
-
| WebsiteFieldComponent
|
299
255
|
|
300
|
-
// Components that render content
|
256
|
+
// Components that render content
|
301
257
|
export type ContentComponentsDef =
|
302
258
|
| DetailsComponent
|
303
259
|
| HtmlComponent
|
304
260
|
| InsetTextComponent
|
305
261
|
| ListComponent
|
306
262
|
|
307
|
-
// Components
|
263
|
+
// Components with editors
|
264
|
+
export type EditorComponentsDef =
|
265
|
+
| TextFieldComponent
|
266
|
+
| EmailAddressFieldComponent
|
267
|
+
| TelephoneNumberFieldComponent
|
268
|
+
| MultilineTextFieldComponent
|
269
|
+
| NumberFieldComponent
|
270
|
+
| AutocompleteFieldComponent
|
271
|
+
| SelectFieldComponent
|
272
|
+
| RadiosFieldComponent
|
273
|
+
| CheckboxesFieldComponent
|
274
|
+
| ListComponent
|
275
|
+
| DetailsComponent
|
276
|
+
| HtmlComponent
|
277
|
+
| InsetTextComponent
|
278
|
+
| DatePartsFieldFieldComponent
|
279
|
+
|
280
|
+
// Components that render lists
|
308
281
|
export type ListComponentsDef =
|
309
282
|
| ListComponent
|
310
283
|
| AutocompleteFieldComponent
|
311
284
|
| CheckboxesFieldComponent
|
312
285
|
| RadiosFieldComponent
|
313
286
|
| SelectFieldComponent
|
287
|
+
|
288
|
+
// Components that have selection fields
|
289
|
+
export type SelectionComponentsDef =
|
290
|
+
| CheckboxesFieldComponent
|
291
|
+
| RadiosFieldComponent
|
292
|
+
| SelectFieldComponent
|
293
|
+
| YesNoFieldComponent
|
294
|
+
|
295
|
+
// Components that have custom condition operators
|
296
|
+
export type ConditionalComponentsDef =
|
297
|
+
| CheckboxesFieldComponent
|
298
|
+
| DatePartsFieldFieldComponent
|
299
|
+
| EmailAddressFieldComponent
|
300
|
+
| MultilineTextFieldComponent
|
301
|
+
| NumberFieldComponent
|
302
|
+
| TextFieldComponent
|
303
|
+
| TimeFieldComponent
|
304
|
+
| YesNoFieldComponent
|
@@ -1,22 +1,32 @@
|
|
1
|
-
import {
|
2
|
-
import { type
|
1
|
+
import { ConditionalComponentTypes } from '~/src/components/component-types.js'
|
2
|
+
import { type ConditionalComponentType } from '~/src/components/types.js'
|
3
3
|
|
4
4
|
export class ConditionField {
|
5
|
-
name
|
6
|
-
type
|
7
|
-
display
|
5
|
+
name
|
6
|
+
type
|
7
|
+
display
|
8
8
|
|
9
|
-
constructor(
|
9
|
+
constructor(
|
10
|
+
name?: string,
|
11
|
+
type?: ConditionalComponentType,
|
12
|
+
display?: string
|
13
|
+
) {
|
10
14
|
if (!name || typeof name !== 'string') {
|
11
|
-
throw Error(
|
15
|
+
throw new Error("ConditionField param 'name' must be a string")
|
12
16
|
}
|
13
17
|
|
14
|
-
if (
|
15
|
-
|
18
|
+
if (
|
19
|
+
!ConditionalComponentTypes.find(
|
20
|
+
(componentType) => componentType.type === type
|
21
|
+
)
|
22
|
+
) {
|
23
|
+
throw new Error(
|
24
|
+
"ConditionField param 'type' must be from enum ConditionalComponentTypes"
|
25
|
+
)
|
16
26
|
}
|
17
27
|
|
18
28
|
if (!display || typeof display !== 'string') {
|
19
|
-
throw Error(
|
29
|
+
throw new Error("ConditionField param 'display' must be a string")
|
20
30
|
}
|
21
31
|
|
22
32
|
this.name = name
|
@@ -24,7 +34,11 @@ export class ConditionField {
|
|
24
34
|
this.display = display
|
25
35
|
}
|
26
36
|
|
27
|
-
static from(obj: {
|
37
|
+
static from(obj: {
|
38
|
+
name: string
|
39
|
+
type: ConditionalComponentType
|
40
|
+
display: string
|
41
|
+
}) {
|
28
42
|
return new ConditionField(obj.name, obj.type, obj.display)
|
29
43
|
}
|
30
44
|
}
|