@opencrvs/toolkit 1.8.0-rc.f7e8fb5 → 1.8.0-rc.f872339
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/README.md +1 -1
- package/dist/commons/api/router.d.ts +6700 -9337
- package/dist/commons/conditionals/conditionals.d.ts +26 -3
- package/dist/commons/conditionals/validate-address.test.d.ts +2 -0
- package/dist/commons/conditionals/validate.d.ts +39 -17
- package/dist/commons/conditionals/validate.test.d.ts +2 -0
- package/dist/commons/events/ActionConfig.d.ts +1123 -2056
- package/dist/commons/events/ActionDocument.d.ts +9488 -312
- package/dist/commons/events/ActionInput.d.ts +5329 -472
- package/dist/commons/events/ActionType.d.ts +26 -11
- package/dist/commons/events/CompositeFieldValue.d.ts +155 -2
- package/dist/commons/events/Conditional.d.ts +21 -5
- package/dist/commons/events/Draft.d.ts +351 -48
- package/dist/commons/events/EventConfig.d.ts +709 -1226
- package/dist/commons/events/EventConfigInput.d.ts +6 -3
- package/dist/commons/events/EventDocument.d.ts +3343 -424
- package/dist/commons/events/EventIndex.d.ts +9 -3
- package/dist/commons/events/EventMetadata.d.ts +6 -0
- package/dist/commons/events/FieldConfig.d.ts +567 -74
- package/dist/commons/events/FieldType.d.ts +2 -1
- package/dist/commons/events/FieldTypeMapping.d.ts +154 -3
- package/dist/commons/events/FieldValue.d.ts +76 -2
- package/dist/commons/events/FormConfig.d.ts +633 -48
- package/dist/commons/events/PageConfig.d.ts +335 -0
- package/dist/commons/events/SummaryConfig.d.ts +93 -7
- package/dist/commons/events/TemplateConfig.d.ts +5 -5
- package/dist/commons/events/User.d.ts +5 -0
- package/dist/commons/events/defineConfig.d.ts +104 -218
- package/dist/commons/events/index.d.ts +3 -1
- package/dist/commons/events/scopes.d.ts +25 -0
- package/dist/commons/events/test.utils.d.ts +140 -213
- package/dist/commons/events/utils.d.ts +125 -83
- package/dist/commons/events/utils.test.d.ts +2 -0
- package/dist/conditionals/index.js +166 -81
- package/dist/events/index.js +1644 -832
- package/package.json +1 -1
@@ -1,99 +1,56 @@
|
|
1
|
-
import {
|
2
|
-
import { ActionType } from './ActionType';
|
1
|
+
import { ActionType, DeclarationActionType } from './ActionType';
|
3
2
|
import { EventConfig } from './EventConfig';
|
4
|
-
import { EventConfigInput } from './EventConfigInput';
|
5
|
-
import { EventMetadataKeys } from './EventMetadata';
|
6
3
|
import { FieldConfig } from './FieldConfig';
|
7
4
|
import { WorkqueueConfig } from './WorkqueueConfig';
|
8
|
-
import { EventState } from './ActionDocument';
|
9
|
-
import {
|
5
|
+
import { Action, ActionUpdate, EventState } from './ActionDocument';
|
6
|
+
import { PageConfig, VerificationPageConfig } from './PageConfig';
|
10
7
|
import { Draft } from './Draft';
|
11
8
|
import { EventDocument } from './EventDocument';
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
export declare
|
16
|
-
|
17
|
-
label: TranslationConfig;
|
18
|
-
}[];
|
19
|
-
/**
|
20
|
-
* @returns All the fields in the event configuration.
|
21
|
-
*/
|
22
|
-
export declare const findPageFields: (config: EventConfig) => FieldConfig[];
|
23
|
-
/**
|
24
|
-
*
|
25
|
-
* @param pageFields - All the fields in the event configuration
|
26
|
-
* @param refFields - The fields referencing values within the event configuration (e.g. summary fields) or within system provided metadata fields (e.g. createdAt, updatedBy)
|
27
|
-
* @returns referenced fields with populated labels
|
28
|
-
*/
|
29
|
-
export declare const resolveLabelsFromKnownFields: ({ pageFields, refFields }: {
|
30
|
-
pageFields: {
|
31
|
-
id: string;
|
32
|
-
label: TranslationConfig;
|
33
|
-
}[];
|
34
|
-
refFields: {
|
35
|
-
id: EventMetadataKeys | string;
|
36
|
-
label?: TranslationConfig;
|
37
|
-
}[];
|
38
|
-
}) => {
|
39
|
-
id: EventMetadataKeys | string;
|
40
|
-
label?: TranslationConfig;
|
41
|
-
}[];
|
42
|
-
export declare function getAllFields(configuration: EventConfig): import("./FieldConfig").Inferred[];
|
43
|
-
export declare function getAllPages(configuration: EventConfig): {
|
9
|
+
import { ActionConfig } from './ActionConfig';
|
10
|
+
import { FormConfig } from './FormConfig';
|
11
|
+
export declare function getDeclarationFields(configuration: EventConfig): FieldConfig[];
|
12
|
+
export declare function getDeclarationPages(configuration: EventConfig): {
|
13
|
+
type: "FORM";
|
44
14
|
id: string;
|
45
|
-
title: TranslationConfig;
|
15
|
+
title: import("./TranslationConfig").TranslationConfig;
|
46
16
|
fields: import("./FieldConfig").Inferred[];
|
17
|
+
conditional?: import(".").JSONSchema | undefined;
|
47
18
|
}[];
|
48
|
-
export declare function
|
49
|
-
|
50
|
-
active: boolean;
|
51
|
-
version: {
|
52
|
-
id: string;
|
53
|
-
label: TranslationConfig;
|
54
|
-
};
|
55
|
-
label: TranslationConfig;
|
19
|
+
export declare function getDeclaration(configuration: EventConfig): {
|
20
|
+
label: import("./TranslationConfig").TranslationConfig;
|
56
21
|
pages: {
|
22
|
+
type: "FORM";
|
57
23
|
id: string;
|
58
|
-
title: TranslationConfig;
|
24
|
+
title: import("./TranslationConfig").TranslationConfig;
|
59
25
|
fields: import("./FieldConfig").Inferred[];
|
26
|
+
conditional?: import(".").JSONSchema | undefined;
|
60
27
|
}[];
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
};
|
65
|
-
} | undefined;
|
66
|
-
export declare const findActiveActionFormPages: (configuration: EventConfig, action: ActionType) => {
|
67
|
-
id: string;
|
68
|
-
title: TranslationConfig;
|
69
|
-
fields: import("./FieldConfig").Inferred[];
|
70
|
-
}[] | undefined;
|
71
|
-
export declare const getFormFields: (formConfig: FormConfig) => import("./FieldConfig").Inferred[];
|
28
|
+
};
|
29
|
+
export declare const getActionAnnotationFields: (actionConfig: ActionConfig) => import("./FieldConfig").Inferred[];
|
30
|
+
export declare const getAllAnnotationFields: (config: EventConfig) => FieldConfig[];
|
72
31
|
/**
|
73
|
-
*
|
32
|
+
* @returns All the fields in the event configuration.
|
74
33
|
*/
|
75
|
-
export declare const
|
34
|
+
export declare const findAllFields: (config: EventConfig) => FieldConfig[];
|
76
35
|
/**
|
77
|
-
*
|
36
|
+
* @TODO: Request correction should have same format as print certificate
|
78
37
|
*/
|
79
|
-
export declare const
|
80
|
-
export declare
|
81
|
-
|
82
|
-
title: TranslationConfig;
|
38
|
+
export declare const findRecordActionPages: (config: EventConfig, actionType: ActionType) => PageConfig[];
|
39
|
+
export declare function getActionReview(configuration: EventConfig, actionType: ActionType): {
|
40
|
+
title: import("./TranslationConfig").TranslationConfig;
|
83
41
|
fields: import("./FieldConfig").Inferred[];
|
84
|
-
}
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
export declare function
|
89
|
-
export declare function getEventConfiguration(eventConfigurations: EventConfig[], type: string): EventConfig;
|
90
|
-
export declare function stripHiddenFields(fields: FieldConfig[], data: EventState): import("lodash").Dictionary<string | number | boolean | {
|
42
|
+
};
|
43
|
+
export declare function getActionReviewFields(configuration: EventConfig, actionType: DeclarationActionType): import("./FieldConfig").Inferred[];
|
44
|
+
export declare function validateWorkqueueConfig(workqueueConfigs: WorkqueueConfig[]): void;
|
45
|
+
export declare function isPageVisible(page: PageConfig, formValues: ActionUpdate): boolean;
|
46
|
+
export declare function omitHiddenFields(fields: FieldConfig[], values: EventState): import("lodash").Dictionary<string | number | boolean | {
|
91
47
|
type: string;
|
92
48
|
filename: string;
|
93
49
|
originalFilename: string;
|
94
50
|
} | {
|
95
51
|
country: string;
|
96
52
|
district: string;
|
53
|
+
addressType: "DOMESTIC";
|
97
54
|
province: string;
|
98
55
|
urbanOrRural: "URBAN";
|
99
56
|
number?: string | undefined;
|
@@ -104,29 +61,82 @@ export declare function stripHiddenFields(fields: FieldConfig[], data: EventStat
|
|
104
61
|
} | {
|
105
62
|
country: string;
|
106
63
|
district: string;
|
64
|
+
addressType: "DOMESTIC";
|
107
65
|
province: string;
|
108
66
|
urbanOrRural: "RURAL";
|
109
67
|
village?: string | undefined;
|
68
|
+
} | {
|
69
|
+
country: string;
|
70
|
+
state: string;
|
71
|
+
addressType: "INTERNATIONAL";
|
72
|
+
district2: string;
|
73
|
+
cityOrTown?: string | undefined;
|
74
|
+
addressLine1?: string | undefined;
|
75
|
+
addressLine2?: string | undefined;
|
76
|
+
addressLine3?: string | undefined;
|
77
|
+
postcodeOrZip?: string | undefined;
|
110
78
|
} | {
|
111
79
|
type: string;
|
112
80
|
option: string;
|
113
81
|
filename: string;
|
114
82
|
originalFilename: string;
|
115
|
-
}[]>;
|
83
|
+
}[] | undefined>;
|
84
|
+
export declare function omitHiddenPaginatedFields(formConfig: FormConfig, declaration: EventState): import("lodash").Dictionary<string | number | boolean | {
|
85
|
+
type: string;
|
86
|
+
filename: string;
|
87
|
+
originalFilename: string;
|
88
|
+
} | {
|
89
|
+
country: string;
|
90
|
+
district: string;
|
91
|
+
addressType: "DOMESTIC";
|
92
|
+
province: string;
|
93
|
+
urbanOrRural: "URBAN";
|
94
|
+
number?: string | undefined;
|
95
|
+
town?: string | undefined;
|
96
|
+
residentialArea?: string | undefined;
|
97
|
+
street?: string | undefined;
|
98
|
+
zipCode?: string | undefined;
|
99
|
+
} | {
|
100
|
+
country: string;
|
101
|
+
district: string;
|
102
|
+
addressType: "DOMESTIC";
|
103
|
+
province: string;
|
104
|
+
urbanOrRural: "RURAL";
|
105
|
+
village?: string | undefined;
|
106
|
+
} | {
|
107
|
+
country: string;
|
108
|
+
state: string;
|
109
|
+
addressType: "INTERNATIONAL";
|
110
|
+
district2: string;
|
111
|
+
cityOrTown?: string | undefined;
|
112
|
+
addressLine1?: string | undefined;
|
113
|
+
addressLine2?: string | undefined;
|
114
|
+
addressLine3?: string | undefined;
|
115
|
+
postcodeOrZip?: string | undefined;
|
116
|
+
} | {
|
117
|
+
type: string;
|
118
|
+
option: string;
|
119
|
+
filename: string;
|
120
|
+
originalFilename: string;
|
121
|
+
}[] | undefined>;
|
116
122
|
export declare function findActiveDrafts(event: EventDocument, drafts: Draft[]): {
|
117
123
|
id: string;
|
118
124
|
createdAt: string;
|
119
125
|
eventId: string;
|
120
126
|
transactionId: string;
|
121
127
|
action: {
|
122
|
-
type:
|
123
|
-
|
128
|
+
type: "DECLARE" | "REGISTER" | "VALIDATE" | "DELETE" | "CREATE" | "NOTIFY" | "DETECT_DUPLICATE" | "REJECT" | "MARKED_AS_DUPLICATE" | "ARCHIVE" | "PRINT_CERTIFICATE" | "REQUEST_CORRECTION" | "REJECT_CORRECTION" | "APPROVE_CORRECTION" | "READ" | "ASSIGN" | "UNASSIGN";
|
129
|
+
status: "Rejected" | "Requested" | "Accepted";
|
130
|
+
createdAt: string;
|
131
|
+
createdBy: string;
|
132
|
+
declaration: Record<string, string | number | boolean | {
|
124
133
|
type: string;
|
125
134
|
filename: string;
|
126
135
|
originalFilename: string;
|
127
136
|
} | {
|
128
137
|
country: string;
|
129
138
|
district: string;
|
139
|
+
addressType: "DOMESTIC";
|
130
140
|
province: string;
|
131
141
|
urbanOrRural: "URBAN";
|
132
142
|
number?: string | null | undefined;
|
@@ -137,25 +147,35 @@ export declare function findActiveDrafts(event: EventDocument, drafts: Draft[]):
|
|
137
147
|
} | {
|
138
148
|
country: string;
|
139
149
|
district: string;
|
150
|
+
addressType: "DOMESTIC";
|
140
151
|
province: string;
|
141
152
|
urbanOrRural: "RURAL";
|
142
153
|
village?: string | null | undefined;
|
154
|
+
} | {
|
155
|
+
country: string;
|
156
|
+
state: string;
|
157
|
+
addressType: "INTERNATIONAL";
|
158
|
+
district2: string;
|
159
|
+
cityOrTown?: string | null | undefined;
|
160
|
+
addressLine1?: string | null | undefined;
|
161
|
+
addressLine2?: string | null | undefined;
|
162
|
+
addressLine3?: string | null | undefined;
|
163
|
+
postcodeOrZip?: string | null | undefined;
|
143
164
|
} | {
|
144
165
|
type: string;
|
145
166
|
option: string;
|
146
167
|
filename: string;
|
147
168
|
originalFilename: string;
|
148
|
-
}[]>;
|
149
|
-
createdAt: string;
|
150
|
-
createdBy: string;
|
169
|
+
}[] | undefined>;
|
151
170
|
createdAtLocation: string;
|
152
|
-
|
171
|
+
annotation?: Record<string, string | number | boolean | {
|
153
172
|
type: string;
|
154
173
|
filename: string;
|
155
174
|
originalFilename: string;
|
156
175
|
} | {
|
157
176
|
country: string;
|
158
177
|
district: string;
|
178
|
+
addressType: "DOMESTIC";
|
159
179
|
province: string;
|
160
180
|
urbanOrRural: "URBAN";
|
161
181
|
number?: string | null | undefined;
|
@@ -166,15 +186,27 @@ export declare function findActiveDrafts(event: EventDocument, drafts: Draft[]):
|
|
166
186
|
} | {
|
167
187
|
country: string;
|
168
188
|
district: string;
|
189
|
+
addressType: "DOMESTIC";
|
169
190
|
province: string;
|
170
191
|
urbanOrRural: "RURAL";
|
171
192
|
village?: string | null | undefined;
|
193
|
+
} | {
|
194
|
+
country: string;
|
195
|
+
state: string;
|
196
|
+
addressType: "INTERNATIONAL";
|
197
|
+
district2: string;
|
198
|
+
cityOrTown?: string | null | undefined;
|
199
|
+
addressLine1?: string | null | undefined;
|
200
|
+
addressLine2?: string | null | undefined;
|
201
|
+
addressLine3?: string | null | undefined;
|
202
|
+
postcodeOrZip?: string | null | undefined;
|
172
203
|
} | {
|
173
204
|
type: string;
|
174
205
|
option: string;
|
175
206
|
filename: string;
|
176
207
|
originalFilename: string;
|
177
|
-
}[]> | undefined;
|
208
|
+
}[] | undefined> | undefined;
|
209
|
+
originalActionId?: string | undefined;
|
178
210
|
};
|
179
211
|
}[];
|
180
212
|
export declare function createEmptyDraft(eventId: string, draftId: string, actionType: ActionType): {
|
@@ -184,11 +216,21 @@ export declare function createEmptyDraft(eventId: string, draftId: string, actio
|
|
184
216
|
transactionId: import("../uuid").UUID;
|
185
217
|
action: {
|
186
218
|
type: ActionType;
|
187
|
-
|
188
|
-
|
219
|
+
declaration: {};
|
220
|
+
annotation: {};
|
189
221
|
createdAt: string;
|
190
222
|
createdBy: string;
|
191
223
|
createdAtLocation: string;
|
192
224
|
};
|
193
225
|
};
|
226
|
+
export declare function isVerificationPage(page: PageConfig): page is VerificationPageConfig;
|
227
|
+
export declare function deepMerge<T extends Record<string, unknown>>(currentDocument: T, actionDocument: T): T;
|
228
|
+
export declare function findLastAssignmentAction(actions: Action[]): Action | undefined;
|
229
|
+
/** Tell compiler that accessing record with arbitrary key might result to undefined
|
230
|
+
* Use when you **cannot guarantee** that key exists in the record
|
231
|
+
*/
|
232
|
+
export type IndexMap<T> = {
|
233
|
+
[id: string]: T | undefined;
|
234
|
+
};
|
235
|
+
export declare function isWriteAction(actionType: ActionType): boolean;
|
194
236
|
//# sourceMappingURL=utils.d.ts.map
|
@@ -23,8 +23,10 @@ __export(conditionals_exports, {
|
|
23
23
|
alwaysTrue: () => alwaysTrue,
|
24
24
|
and: () => and,
|
25
25
|
defineConditional: () => defineConditional,
|
26
|
+
defineFormConditional: () => defineFormConditional,
|
26
27
|
event: () => event,
|
27
28
|
field: () => field,
|
29
|
+
never: () => never,
|
28
30
|
not: () => not,
|
29
31
|
or: () => or,
|
30
32
|
user: () => user
|
@@ -35,6 +37,16 @@ module.exports = __toCommonJS(conditionals_exports);
|
|
35
37
|
function defineConditional(schema) {
|
36
38
|
return schema;
|
37
39
|
}
|
40
|
+
function defineFormConditional(schema) {
|
41
|
+
const schemaWithForm = {
|
42
|
+
type: "object",
|
43
|
+
properties: {
|
44
|
+
$form: schema
|
45
|
+
},
|
46
|
+
required: ["$form"]
|
47
|
+
};
|
48
|
+
return defineConditional(schemaWithForm);
|
49
|
+
}
|
38
50
|
function alwaysTrue() {
|
39
51
|
return {};
|
40
52
|
}
|
@@ -59,6 +71,9 @@ function not(condition) {
|
|
59
71
|
required: []
|
60
72
|
});
|
61
73
|
}
|
74
|
+
function never() {
|
75
|
+
return not(alwaysTrue());
|
76
|
+
}
|
62
77
|
var user = {
|
63
78
|
hasScope: (scope) => defineConditional({
|
64
79
|
type: "object",
|
@@ -106,69 +121,120 @@ var event = {
|
|
106
121
|
required: ["$event"]
|
107
122
|
})
|
108
123
|
};
|
124
|
+
function getDateFromNow(days) {
|
125
|
+
return new Date(Date.now() - days * 24 * 60 * 60 * 1e3).toISOString().split("T")[0];
|
126
|
+
}
|
127
|
+
function getDateRangeToFieldReference(fieldId, comparedFieldId, clause) {
|
128
|
+
return {
|
129
|
+
type: "object",
|
130
|
+
properties: {
|
131
|
+
[fieldId]: {
|
132
|
+
type: "string",
|
133
|
+
format: "date",
|
134
|
+
[clause]: { $data: `1/${comparedFieldId}` }
|
135
|
+
},
|
136
|
+
[comparedFieldId]: { type: "string", format: "date" }
|
137
|
+
},
|
138
|
+
required: [fieldId]
|
139
|
+
};
|
140
|
+
}
|
141
|
+
function isFieldReference(value) {
|
142
|
+
return typeof value === "object" && value !== null && "_fieldId" in value;
|
143
|
+
}
|
109
144
|
function field(fieldId) {
|
110
|
-
const getDateFromNow = (days) => new Date(Date.now() - days * 24 * 60 * 60 * 1e3).toISOString().split("T")[0];
|
111
145
|
const getDateRange = (date, clause) => ({
|
112
146
|
type: "object",
|
113
147
|
properties: {
|
114
|
-
|
115
|
-
type: "
|
116
|
-
|
117
|
-
|
118
|
-
type: "string",
|
119
|
-
format: "date",
|
120
|
-
[clause]: date
|
121
|
-
}
|
122
|
-
},
|
123
|
-
required: [fieldId]
|
148
|
+
[fieldId]: {
|
149
|
+
type: "string",
|
150
|
+
format: "date",
|
151
|
+
[clause]: date
|
124
152
|
}
|
125
153
|
},
|
126
|
-
required: [
|
154
|
+
required: [fieldId]
|
127
155
|
});
|
128
156
|
return {
|
157
|
+
/**
|
158
|
+
* @private Internal property used for field reference tracking.
|
159
|
+
*/
|
160
|
+
_fieldId: fieldId,
|
129
161
|
isAfter: () => ({
|
130
162
|
days: (days) => ({
|
131
|
-
inPast: () =>
|
163
|
+
inPast: () => defineFormConditional(
|
132
164
|
getDateRange(getDateFromNow(days), "formatMinimum")
|
133
165
|
),
|
134
|
-
inFuture: () =>
|
166
|
+
inFuture: () => defineFormConditional(
|
135
167
|
getDateRange(getDateFromNow(-days), "formatMinimum")
|
136
168
|
)
|
137
169
|
}),
|
138
|
-
date: (date) =>
|
139
|
-
|
170
|
+
date: (date) => {
|
171
|
+
if (isFieldReference(date)) {
|
172
|
+
const comparedFieldId = date._fieldId;
|
173
|
+
return defineFormConditional(
|
174
|
+
getDateRangeToFieldReference(
|
175
|
+
fieldId,
|
176
|
+
comparedFieldId,
|
177
|
+
"formatMinimum"
|
178
|
+
)
|
179
|
+
);
|
180
|
+
}
|
181
|
+
return defineFormConditional(getDateRange(date, "formatMinimum"));
|
182
|
+
},
|
183
|
+
now: () => defineFormConditional(getDateRange(getDateFromNow(0), "formatMinimum"))
|
140
184
|
}),
|
141
185
|
isBefore: () => ({
|
142
186
|
days: (days) => ({
|
143
|
-
inPast: () =>
|
187
|
+
inPast: () => defineFormConditional(
|
144
188
|
getDateRange(getDateFromNow(days), "formatMaximum")
|
145
189
|
),
|
146
|
-
inFuture: () =>
|
190
|
+
inFuture: () => defineFormConditional(
|
147
191
|
getDateRange(getDateFromNow(-days), "formatMaximum")
|
148
192
|
)
|
149
193
|
}),
|
150
|
-
date: (date) =>
|
151
|
-
|
194
|
+
date: (date) => {
|
195
|
+
if (isFieldReference(date)) {
|
196
|
+
const comparedFieldId = date._fieldId;
|
197
|
+
return defineFormConditional(
|
198
|
+
getDateRangeToFieldReference(
|
199
|
+
fieldId,
|
200
|
+
comparedFieldId,
|
201
|
+
"formatMaximum"
|
202
|
+
)
|
203
|
+
);
|
204
|
+
}
|
205
|
+
return defineFormConditional(getDateRange(date, "formatMaximum"));
|
206
|
+
},
|
207
|
+
now: () => defineFormConditional(getDateRange(getDateFromNow(0), "formatMaximum"))
|
152
208
|
}),
|
153
|
-
isEqualTo: (value) =>
|
154
|
-
|
155
|
-
|
156
|
-
|
209
|
+
isEqualTo: (value) => {
|
210
|
+
if (isFieldReference(value)) {
|
211
|
+
const comparedFieldId = value._fieldId;
|
212
|
+
return defineFormConditional({
|
157
213
|
type: "object",
|
158
214
|
properties: {
|
159
215
|
[fieldId]: {
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
const: value
|
165
|
-
}
|
216
|
+
type: ["string", "boolean"],
|
217
|
+
const: { $data: `1/${comparedFieldId}` }
|
218
|
+
},
|
219
|
+
[comparedFieldId]: { type: ["string", "boolean"] }
|
166
220
|
},
|
167
|
-
required: [fieldId]
|
168
|
-
}
|
169
|
-
}
|
170
|
-
|
171
|
-
|
221
|
+
required: [fieldId, comparedFieldId]
|
222
|
+
});
|
223
|
+
}
|
224
|
+
return defineFormConditional({
|
225
|
+
type: "object",
|
226
|
+
properties: {
|
227
|
+
[fieldId]: {
|
228
|
+
oneOf: [
|
229
|
+
{ type: "string", const: value },
|
230
|
+
{ type: "boolean", const: value }
|
231
|
+
],
|
232
|
+
const: value
|
233
|
+
}
|
234
|
+
},
|
235
|
+
required: [fieldId]
|
236
|
+
});
|
237
|
+
},
|
172
238
|
/**
|
173
239
|
* Use case: Some fields are rendered when selection is not made, or boolean false is explicitly selected.
|
174
240
|
* @example field('recommender.none').isFalsy() vs not(field('recommender.none').isEqualTo(true))
|
@@ -177,68 +243,87 @@ function field(fieldId) {
|
|
177
243
|
* NOTE: For now, this only works with string, boolean, and null types. 0 is still allowed.
|
178
244
|
*
|
179
245
|
*/
|
180
|
-
isFalsy: () =>
|
246
|
+
isFalsy: () => defineFormConditional({
|
181
247
|
type: "object",
|
182
248
|
properties: {
|
183
|
-
|
184
|
-
type: "object",
|
185
|
-
properties: {
|
186
|
-
[fieldId]: {
|
187
|
-
anyOf: [
|
188
|
-
{ const: "undefined" },
|
189
|
-
{ const: false },
|
190
|
-
{ const: null },
|
191
|
-
{ const: "" }
|
192
|
-
]
|
193
|
-
}
|
194
|
-
},
|
249
|
+
[fieldId]: {
|
195
250
|
anyOf: [
|
196
|
-
{
|
197
|
-
|
198
|
-
},
|
199
|
-
{
|
200
|
-
not: {
|
201
|
-
required: [fieldId]
|
202
|
-
}
|
203
|
-
}
|
251
|
+
{ const: "undefined" },
|
252
|
+
{ const: false },
|
253
|
+
{ const: null },
|
254
|
+
{ const: "" }
|
204
255
|
]
|
205
256
|
}
|
206
257
|
},
|
207
|
-
|
208
|
-
|
209
|
-
|
210
|
-
|
211
|
-
|
212
|
-
$form: {
|
213
|
-
type: "object",
|
214
|
-
properties: {
|
215
|
-
[fieldId]: {
|
216
|
-
type: "string",
|
217
|
-
enum: ["undefined"]
|
218
|
-
}
|
219
|
-
},
|
258
|
+
anyOf: [
|
259
|
+
{
|
260
|
+
required: [fieldId]
|
261
|
+
},
|
262
|
+
{
|
220
263
|
not: {
|
221
264
|
required: [fieldId]
|
222
265
|
}
|
223
266
|
}
|
267
|
+
]
|
268
|
+
}),
|
269
|
+
isUndefined: () => defineFormConditional({
|
270
|
+
type: "object",
|
271
|
+
properties: {
|
272
|
+
[fieldId]: {
|
273
|
+
type: "string",
|
274
|
+
enum: ["undefined"]
|
275
|
+
}
|
224
276
|
},
|
225
|
-
|
277
|
+
not: {
|
278
|
+
required: [fieldId]
|
279
|
+
}
|
226
280
|
}),
|
227
|
-
inArray: (values) =>
|
281
|
+
inArray: (values) => defineFormConditional({
|
228
282
|
type: "object",
|
229
283
|
properties: {
|
230
|
-
|
231
|
-
type: "
|
232
|
-
|
233
|
-
|
234
|
-
|
235
|
-
|
236
|
-
|
237
|
-
|
238
|
-
|
284
|
+
[fieldId]: {
|
285
|
+
type: "string",
|
286
|
+
enum: values
|
287
|
+
}
|
288
|
+
},
|
289
|
+
required: [fieldId]
|
290
|
+
}),
|
291
|
+
isValidEnglishName: () => defineFormConditional({
|
292
|
+
type: "object",
|
293
|
+
properties: {
|
294
|
+
[fieldId]: {
|
295
|
+
type: "string",
|
296
|
+
pattern: "^[\\p{Script=Latin}0-9'._-]*(\\([\\p{Script=Latin}0-9'._-]+\\))?[\\p{Script=Latin}0-9'._-]*( [\\p{Script=Latin}0-9'._-]*(\\([\\p{Script=Latin}0-9'._-]+\\))?[\\p{Script=Latin}0-9'._-]*)*$",
|
297
|
+
description: "Name must contain only letters, numbers, and allowed special characters ('._-). No double spaces."
|
298
|
+
}
|
299
|
+
},
|
300
|
+
required: [fieldId]
|
301
|
+
}),
|
302
|
+
/**
|
303
|
+
* Checks if the field value matches a given regular expression pattern.
|
304
|
+
* @param pattern - The regular expression pattern to match the field value against.
|
305
|
+
* @returns A JSONSchema conditional that validates the field value against the pattern.
|
306
|
+
*/
|
307
|
+
matches: (pattern) => defineFormConditional({
|
308
|
+
type: "object",
|
309
|
+
properties: {
|
310
|
+
[fieldId]: {
|
311
|
+
type: "string",
|
312
|
+
pattern
|
313
|
+
}
|
314
|
+
},
|
315
|
+
required: [fieldId]
|
316
|
+
}),
|
317
|
+
isBetween: (min, max) => defineFormConditional({
|
318
|
+
type: "object",
|
319
|
+
properties: {
|
320
|
+
[fieldId]: {
|
321
|
+
type: "number",
|
322
|
+
minimum: min,
|
323
|
+
maximum: max
|
239
324
|
}
|
240
325
|
},
|
241
|
-
required: [
|
326
|
+
required: [fieldId]
|
242
327
|
})
|
243
328
|
};
|
244
329
|
}
|