@defra/forms-model 3.0.479 → 3.0.481

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.
@@ -4,17 +4,14 @@ import {
4
4
  } from '~/src/components/types.js'
5
5
  import { ConditionType, type Coordinator } from '~/src/conditions/enums.js'
6
6
  import {
7
- type ConditionBooleanValueDataV2,
8
7
  type ConditionData,
9
8
  type ConditionDataV2,
10
- type ConditionDateValueDataV2,
11
9
  type ConditionListItemRefValueDataV2,
12
- type ConditionNumberValueDataV2,
13
10
  type ConditionRefData,
14
11
  type ConditionRefDataV2,
15
- type ConditionStringValueDataV2,
16
12
  type ConditionValueData,
17
- type ConditionValueDataV2
13
+ type RelativeDateValueData,
14
+ type RelativeDateValueDataV2
18
15
  } from '~/src/conditions/types.js'
19
16
  import {
20
17
  type ConditionWrapper,
@@ -22,34 +19,28 @@ import {
22
19
  type List
23
20
  } from '~/src/form/form-definition/types.js'
24
21
 
25
- export function isConditionListItemRefValueDataV2(
26
- value: ConditionValueDataV2
27
- ): value is ConditionListItemRefValueDataV2 {
28
- return value.type === ConditionType.ListItemRef
22
+ export function isConditionListItemRefValueDataV2(condition: ConditionDataV2) {
23
+ return condition.type === ConditionType.ListItemRef
29
24
  }
30
25
 
31
- export function isConditionStringValueDataV2(
32
- value: ConditionValueDataV2
33
- ): value is ConditionStringValueDataV2 {
34
- return value.type === ConditionType.StringValue
26
+ export function isConditionStringValueDataV2(condition: ConditionDataV2) {
27
+ return condition.type === ConditionType.StringValue
35
28
  }
36
29
 
37
- export function isConditionBooleanValueDataV2(
38
- value: ConditionValueDataV2
39
- ): value is ConditionBooleanValueDataV2 {
40
- return value.type === ConditionType.BooleanValue
30
+ export function isConditionBooleanValueDataV2(condition: ConditionDataV2) {
31
+ return condition.type === ConditionType.BooleanValue
41
32
  }
42
33
 
43
- export function isConditionNumberValueDataV2(
44
- value: ConditionValueDataV2
45
- ): value is ConditionNumberValueDataV2 {
46
- return value.type === ConditionType.NumberValue
34
+ export function isConditionNumberValueDataV2(condition: ConditionDataV2) {
35
+ return condition.type === ConditionType.NumberValue
47
36
  }
48
37
 
49
- export function isConditionDateValueDataV2(
50
- value: ConditionValueDataV2
51
- ): value is ConditionDateValueDataV2 {
52
- return value.type === ConditionType.DateValue
38
+ export function isConditionDateValueDataV2(condition: ConditionDataV2) {
39
+ return condition.type === ConditionType.DateValue
40
+ }
41
+
42
+ export function isConditionRelativeDateValueDataV2(condition: ConditionDataV2) {
43
+ return condition.type === ConditionType.RelativeDate
53
44
  }
54
45
 
55
46
  function getListItem(model: RuntimeFormModel, listId: string, itemId: string) {
@@ -69,9 +60,10 @@ function getListItem(model: RuntimeFormModel, listId: string, itemId: string) {
69
60
  }
70
61
 
71
62
  function createConditionValueDataFromListItemRefV2(
72
- value: ConditionListItemRefValueDataV2,
63
+ condition: ConditionDataV2,
73
64
  model: RuntimeFormModel
74
65
  ): ConditionValueData {
66
+ const value = condition.value as ConditionListItemRefValueDataV2
75
67
  const refValue = getListItem(model, value.listId, value.itemId)
76
68
 
77
69
  return {
@@ -82,44 +74,56 @@ function createConditionValueDataFromListItemRefV2(
82
74
  }
83
75
 
84
76
  function createConditionValueDataFromStringOrDateValueDataV2(
85
- value: ConditionStringValueDataV2 | ConditionDateValueDataV2
77
+ condition: ConditionDataV2
86
78
  ): ConditionValueData {
87
79
  return {
88
80
  type: ConditionType.Value,
89
- value: value.value,
90
- display: value.value
81
+ value: condition.value as string,
82
+ display: condition.value as string
91
83
  }
92
84
  }
93
85
 
94
86
  function createConditionValueDataFromStringValueDataV2(
95
- value: ConditionStringValueDataV2
87
+ condition: ConditionDataV2
96
88
  ): ConditionValueData {
97
- return createConditionValueDataFromStringOrDateValueDataV2(value)
89
+ return createConditionValueDataFromStringOrDateValueDataV2(condition)
98
90
  }
99
91
 
100
92
  function createConditionValueDataFromDateValueDataV2(
101
- value: ConditionDateValueDataV2
93
+ condition: ConditionDataV2
102
94
  ): ConditionValueData {
103
- return createConditionValueDataFromStringOrDateValueDataV2(value)
95
+ return createConditionValueDataFromStringOrDateValueDataV2(condition)
96
+ }
97
+
98
+ function createConditionValueDataFromRelativeDateValueDataV2(
99
+ condition: ConditionDataV2
100
+ ): RelativeDateValueData {
101
+ const value = condition.value as RelativeDateValueDataV2
102
+ return {
103
+ type: ConditionType.RelativeDate,
104
+ period: value.period.toString(),
105
+ unit: value.unit,
106
+ direction: value.direction
107
+ }
104
108
  }
105
109
 
106
110
  function createConditionValueDataFromNumberValueDataV2(
107
- value: ConditionNumberValueDataV2
111
+ condition: ConditionDataV2
108
112
  ): ConditionValueData {
109
113
  return {
110
114
  type: ConditionType.Value,
111
- value: value.value.toString(),
112
- display: value.value.toString()
115
+ value: (condition.value as number).toString(),
116
+ display: (condition.value as number).toString()
113
117
  }
114
118
  }
115
119
 
116
120
  function createConditionValueDataFromBooleanValueDataV2(
117
- value: ConditionBooleanValueDataV2
121
+ condition: ConditionDataV2
118
122
  ): ConditionValueData {
119
123
  return {
120
124
  type: ConditionType.Value,
121
- value: value.value.toString(),
122
- display: value.value ? 'Yes' : 'No'
125
+ value: (condition.value as boolean).toString(),
126
+ display: (condition.value as boolean) ? 'Yes' : 'No'
123
127
  }
124
128
  }
125
129
 
@@ -141,18 +145,20 @@ function convertConditionDataV2(
141
145
  }
142
146
 
143
147
  let newValue
144
- if (isConditionListItemRefValueDataV2(condition.value)) {
145
- newValue = createConditionValueDataFromListItemRefV2(condition.value, model)
146
- } else if (isConditionStringValueDataV2(condition.value)) {
147
- newValue = createConditionValueDataFromStringValueDataV2(condition.value)
148
- } else if (isConditionBooleanValueDataV2(condition.value)) {
149
- newValue = createConditionValueDataFromBooleanValueDataV2(condition.value)
150
- } else if (isConditionNumberValueDataV2(condition.value)) {
151
- newValue = createConditionValueDataFromNumberValueDataV2(condition.value)
152
- } else if (isConditionDateValueDataV2(condition.value)) {
153
- newValue = createConditionValueDataFromDateValueDataV2(condition.value)
148
+ if (isConditionListItemRefValueDataV2(condition)) {
149
+ newValue = createConditionValueDataFromListItemRefV2(condition, model)
150
+ } else if (isConditionStringValueDataV2(condition)) {
151
+ newValue = createConditionValueDataFromStringValueDataV2(condition)
152
+ } else if (isConditionBooleanValueDataV2(condition)) {
153
+ newValue = createConditionValueDataFromBooleanValueDataV2(condition)
154
+ } else if (isConditionNumberValueDataV2(condition)) {
155
+ newValue = createConditionValueDataFromNumberValueDataV2(condition)
156
+ } else if (isConditionDateValueDataV2(condition)) {
157
+ newValue = createConditionValueDataFromDateValueDataV2(condition)
158
+ } else if (isConditionRelativeDateValueDataV2(condition)) {
159
+ newValue = createConditionValueDataFromRelativeDateValueDataV2(condition)
154
160
  } else {
155
- newValue = condition.value
161
+ throw Error('Unsupported condition type')
156
162
  }
157
163
 
158
164
  return {
@@ -17,35 +17,20 @@ export interface ConditionValueData {
17
17
  display: string
18
18
  }
19
19
 
20
- export interface ConditionStringValueDataV2 {
21
- type: ConditionType.StringValue
22
- value: string
23
- }
24
-
25
- export interface ConditionBooleanValueDataV2 {
26
- type: ConditionType.BooleanValue
27
- value: boolean
28
- }
29
-
30
- export interface ConditionNumberValueDataV2 {
31
- type: ConditionType.NumberValue
32
- value: number
33
- }
34
-
35
- export interface ConditionDateValueDataV2 {
36
- type: ConditionType.DateValue
37
- value: string
20
+ export interface RelativeDateValueData {
21
+ type: ConditionType.RelativeDate
22
+ period: string
23
+ unit: DateUnits
24
+ direction: DateDirections
38
25
  }
39
26
 
40
27
  export interface ConditionListItemRefValueDataV2 {
41
- type: ConditionType.ListItemRef
42
28
  listId: string
43
29
  itemId: string
44
30
  }
45
31
 
46
- export interface RelativeDateValueData {
47
- type: ConditionType.RelativeDate
48
- period: string
32
+ export interface RelativeDateValueDataV2 {
33
+ period: number
49
34
  unit: DateUnits
50
35
  direction: DateDirections
51
36
  }
@@ -65,16 +50,16 @@ export interface ConditionData {
65
50
 
66
51
  export type ConditionValueDataV2 =
67
52
  | ConditionListItemRefValueDataV2
68
- | ConditionStringValueDataV2
69
- | ConditionBooleanValueDataV2
70
- | ConditionNumberValueDataV2
71
- | ConditionDateValueDataV2
72
- | RelativeDateValueData
53
+ | RelativeDateValueDataV2
54
+ | string
55
+ | boolean
56
+ | number
73
57
 
74
58
  export interface ConditionDataV2 {
75
59
  id: string
76
60
  componentId: string
77
61
  operator: OperatorName
62
+ type: ConditionType
78
63
  value: ConditionValueDataV2
79
64
  }
80
65
 
@@ -8,22 +8,20 @@ import {
8
8
  type ContentComponentsDef,
9
9
  type FileUploadFieldComponent
10
10
  } from '~/src/components/types.js'
11
+ import { ConditionType, OperatorName } from '~/src/conditions/enums.js'
11
12
  import {
12
- type ConditionBooleanValueDataV2,
13
13
  type ConditionData,
14
14
  type ConditionDataV2,
15
- type ConditionDateValueDataV2,
16
15
  type ConditionFieldData,
17
16
  type ConditionGroupData,
18
17
  type ConditionGroupDataV2,
19
18
  type ConditionListItemRefValueDataV2,
20
- type ConditionNumberValueDataV2,
21
19
  type ConditionRefData,
22
20
  type ConditionRefDataV2,
23
- type ConditionStringValueDataV2,
24
21
  type ConditionValueData,
25
22
  type ConditionsModelData,
26
- type RelativeDateValueData
23
+ type RelativeDateValueData,
24
+ type RelativeDateValueDataV2
27
25
  } from '~/src/conditions/types.js'
28
26
  import {
29
27
  SchemaVersion,
@@ -139,73 +137,10 @@ const conditionValueSchema = Joi.object<ConditionValueData>()
139
137
  .description('Human-readable version of the value for display purposes')
140
138
  })
141
139
 
142
- const conditionStringValueDataSchemaV2 =
143
- Joi.object<ConditionStringValueDataV2>()
144
- .description('String value specification for a condition')
145
- .keys({
146
- type: Joi.string()
147
- .trim()
148
- .valid('StringValue')
149
- .required()
150
- .description('Type of the condition value, should be "StringValue"'),
151
- value: Joi.string()
152
- .trim()
153
- .required()
154
- .description('The actual value to compare against')
155
- })
156
-
157
- const conditionBooleanValueDataSchemaV2 =
158
- Joi.object<ConditionBooleanValueDataV2>()
159
- .description('Boolean value specification for a condition')
160
- .keys({
161
- type: Joi.string()
162
- .trim()
163
- .valid('BooleanValue')
164
- .required()
165
- .description('Type of the condition value, should be "BooleanValue"'),
166
- value: Joi.boolean()
167
- .required()
168
- .description('The actual value to compare against')
169
- })
170
-
171
- const conditionNumberValueDataSchemaV2 =
172
- Joi.object<ConditionNumberValueDataV2>()
173
- .description('Number value specification for a condition')
174
- .keys({
175
- type: Joi.string()
176
- .trim()
177
- .valid('NumberValue')
178
- .required()
179
- .description('Type of the condition value, should be "NumberValue"'),
180
- value: Joi.number()
181
- .required()
182
- .description('The actual value to compare against')
183
- })
184
-
185
- const conditionDateValueDataSchemaV2 = Joi.object<ConditionDateValueDataV2>()
186
- .description('Date value specification for a condition')
187
- .keys({
188
- type: Joi.string()
189
- .trim()
190
- .valid('DateValue')
191
- .required()
192
- .description('Type of the condition value, should be "DateValue"'),
193
- value: Joi.date()
194
- .format('YYYY-MM-DD')
195
- .raw()
196
- .required()
197
- .description('The actual value to compare against')
198
- })
199
-
200
140
  const conditionListItemRefDataSchemaV2 =
201
141
  Joi.object<ConditionListItemRefValueDataV2>()
202
142
  .description('List item ref specification for a condition')
203
143
  .keys({
204
- type: Joi.string()
205
- .trim()
206
- .valid('ListItemRef')
207
- .required()
208
- .description('Type of the condition value, should be "ListItemRef"'),
209
144
  listId: Joi.string()
210
145
  .trim()
211
146
  .required()
@@ -224,6 +159,24 @@ const conditionListItemRefDataSchemaV2 =
224
159
  .description('The id of the list item')
225
160
  })
226
161
 
162
+ const relativeDateValueDataSchemaV2 = Joi.object<RelativeDateValueDataV2>()
163
+ .description('Relative date specification for date-based conditions')
164
+ .keys({
165
+ period: Joi.number()
166
+ .integer()
167
+ .positive()
168
+ .required()
169
+ .description('Numeric amount of the time period, as a string'),
170
+ unit: Joi.string()
171
+ .trim()
172
+ .required()
173
+ .description('Time unit (e.g. days, weeks, months, years)'),
174
+ direction: Joi.string()
175
+ .trim()
176
+ .required()
177
+ .description('Temporal direction, either "past" or "future"')
178
+ })
179
+
227
180
  const relativeDateValueDataSchema = Joi.object<RelativeDateValueData>()
228
181
  .description('Relative date specification for date-based conditions')
229
182
  .keys({
@@ -320,18 +273,36 @@ export const conditionDataSchemaV2 = Joi.object<ConditionDataV2>()
320
273
  ),
321
274
  operator: Joi.string()
322
275
  .trim()
276
+ .valid(...Object.values(OperatorName))
323
277
  .required()
324
278
  .description('Comparison operator (equals, greaterThan, contains, etc.)'),
325
- value: Joi.alternatives()
326
- .try(
327
- conditionStringValueDataSchemaV2,
328
- conditionBooleanValueDataSchemaV2,
329
- conditionNumberValueDataSchemaV2,
330
- conditionDateValueDataSchemaV2,
331
- conditionListItemRefDataSchemaV2,
332
- relativeDateValueDataSchema
333
- )
279
+ type: Joi.string()
280
+ .trim()
281
+ .valid(...Object.values(ConditionType))
334
282
  .required()
283
+ .description('Type of the condition value'),
284
+ value: Joi.any()
285
+ .required()
286
+ .description('The actual value to compare against')
287
+ .when('type', {
288
+ switch: [
289
+ { is: ConditionType.BooleanValue, then: Joi.boolean() },
290
+ { is: ConditionType.StringValue, then: Joi.string() },
291
+ { is: ConditionType.NumberValue, then: Joi.number() },
292
+ {
293
+ is: ConditionType.DateValue,
294
+ then: Joi.date().format('YYYY-MM-DD').raw()
295
+ },
296
+ {
297
+ is: ConditionType.ListItemRef,
298
+ then: conditionListItemRefDataSchemaV2
299
+ },
300
+ {
301
+ is: ConditionType.RelativeDate,
302
+ then: relativeDateValueDataSchemaV2
303
+ }
304
+ ]
305
+ })
335
306
  .description(
336
307
  'Value to compare the field against, either fixed or relative date'
337
308
  )