@opencrvs/toolkit 2.0.0-rc.ff04b30 → 2.0.0-rc.ff777d6
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/create-countryconfig/index.js +50 -20
- package/create-countryconfig/package.json +12 -2
- package/dist/application-config/index.js +244 -97
- package/dist/cli.js +9 -3
- package/dist/commons/api/router.d.ts +96 -19
- package/dist/commons/application-config/index.d.ts +1 -0
- package/dist/commons/conditionals/conditionals.d.ts +354 -4
- package/dist/commons/conditionals/validate.d.ts +51 -2
- package/dist/commons/events/ActionDocument.d.ts +6 -0
- package/dist/commons/events/ActionInput.d.ts +42 -36
- package/dist/commons/events/AdvancedSearchConfig.d.ts +342 -0
- package/dist/commons/events/Draft.d.ts +2 -3
- package/dist/commons/events/EventDocument.d.ts +3 -0
- package/dist/commons/events/FieldConfig.d.ts +377 -50
- package/dist/commons/events/FieldValue.d.ts +6 -0
- package/dist/commons/events/WorkqueueConfig.d.ts +5 -5
- package/dist/commons/events/field.d.ts +53 -1
- package/dist/commons/events/index.d.ts +2 -0
- package/dist/commons/events/state/flags.d.ts +16 -0
- package/dist/commons/events/state/utils.d.ts +12 -287
- package/dist/commons/events/utils.d.ts +12 -1
- package/dist/conditionals/index.js +52 -1
- package/dist/events/index.js +915 -193
- package/dist/migrations/v2.0/index.js +9 -3
- package/dist/notification/index.js +775 -119
- package/dist/scopes/index.d.ts +4 -6
- package/dist/scopes/index.js +9 -3
- package/opencrvs-toolkit-2.0.0-rc.ff777d6.tgz +0 -0
- package/package.json +6 -2
- package/opencrvs-toolkit-2.0.0-rc.ff04b30.tgz +0 -0
package/dist/events/index.js
CHANGED
|
@@ -75,6 +75,7 @@ __export(events_exports, {
|
|
|
75
75
|
CheckboxFieldValue: () => CheckboxFieldValue,
|
|
76
76
|
Clause: () => Clause,
|
|
77
77
|
ClientSpecificAction: () => ClientSpecificAction,
|
|
78
|
+
ComputedDefaultValue: () => ComputedDefaultValue,
|
|
78
79
|
Conditional: () => Conditional,
|
|
79
80
|
ConditionalType: () => ConditionalType,
|
|
80
81
|
ConfirmableActions: () => ConfirmableActions,
|
|
@@ -200,6 +201,7 @@ __export(events_exports, {
|
|
|
200
201
|
SelectDateRangeValue: () => SelectDateRangeValue,
|
|
201
202
|
SelectOption: () => SelectOption,
|
|
202
203
|
ShowConditional: () => ShowConditional,
|
|
204
|
+
SignatureFieldValue: () => SignatureFieldValue,
|
|
203
205
|
StaticDataEntry: () => StaticDataEntry,
|
|
204
206
|
StreetLevelDetailsUpdateValue: () => StreetLevelDetailsUpdateValue,
|
|
205
207
|
SummaryConfig: () => SummaryConfig,
|
|
@@ -213,6 +215,10 @@ __export(events_exports, {
|
|
|
213
215
|
UUID: () => UUID,
|
|
214
216
|
UnassignActionInput: () => UnassignActionInput,
|
|
215
217
|
UserAuditRecordInput: () => UserAuditRecordInput,
|
|
218
|
+
V2_DEFAULT_MOCK_ADMINISTRATIVE_AREAS: () => V2_DEFAULT_MOCK_ADMINISTRATIVE_AREAS,
|
|
219
|
+
V2_DEFAULT_MOCK_ADMINISTRATIVE_AREAS_MAP: () => V2_DEFAULT_MOCK_ADMINISTRATIVE_AREAS_MAP,
|
|
220
|
+
V2_DEFAULT_MOCK_LOCATIONS: () => V2_DEFAULT_MOCK_LOCATIONS,
|
|
221
|
+
V2_DEFAULT_MOCK_LOCATIONS_MAP: () => V2_DEFAULT_MOCK_LOCATIONS_MAP,
|
|
216
222
|
ValidationConfig: () => ValidationConfig,
|
|
217
223
|
VerificationActionConfig: () => VerificationActionConfig,
|
|
218
224
|
VerificationPageConfig: () => VerificationPageConfig,
|
|
@@ -234,6 +240,7 @@ __export(events_exports, {
|
|
|
234
240
|
ageToDate: () => ageToDate,
|
|
235
241
|
aggregateActionAnnotations: () => aggregateActionAnnotations,
|
|
236
242
|
aggregateActionDeclarations: () => aggregateActionDeclarations,
|
|
243
|
+
always: () => always,
|
|
237
244
|
alwaysTrue: () => alwaysTrue,
|
|
238
245
|
and: () => and,
|
|
239
246
|
annotationActions: () => annotationActions,
|
|
@@ -241,10 +248,12 @@ __export(events_exports, {
|
|
|
241
248
|
applyDraftToEventIndex: () => applyDraftToEventIndex,
|
|
242
249
|
areCertificateConditionsMet: () => areCertificateConditionsMet,
|
|
243
250
|
areConditionsMet: () => areConditionsMet,
|
|
251
|
+
buildClientFunctionContext: () => buildClientFunctionContext,
|
|
244
252
|
buildFormState: () => buildFormState,
|
|
245
253
|
canAccessEventWithScope: () => canAccessEventWithScope,
|
|
246
254
|
canAccessOtherUserWithScopes: () => canAccessOtherUserWithScopes,
|
|
247
255
|
canAccessUserWithScope: () => canAccessUserWithScope,
|
|
256
|
+
compileClientFunction: () => compileClientFunction,
|
|
248
257
|
compositeFieldTypes: () => compositeFieldTypes,
|
|
249
258
|
createEmptyDraft: () => createEmptyDraft,
|
|
250
259
|
createFieldConditionals: () => createFieldConditionals,
|
|
@@ -265,6 +274,7 @@ __export(events_exports, {
|
|
|
265
274
|
defineWorkqueuesColumns: () => defineWorkqueuesColumns,
|
|
266
275
|
deserializeQuery: () => deserializeQuery,
|
|
267
276
|
errorMessages: () => errorMessages,
|
|
277
|
+
evaluate: () => evaluate,
|
|
268
278
|
event: () => event,
|
|
269
279
|
eventMetadataLabelMap: () => eventMetadataLabelMap,
|
|
270
280
|
eventPayloadGenerator: () => eventPayloadGenerator,
|
|
@@ -277,6 +287,7 @@ __export(events_exports, {
|
|
|
277
287
|
findActiveDraftForEvent: () => findActiveDraftForEvent,
|
|
278
288
|
findAllFields: () => findAllFields,
|
|
279
289
|
findLastAssignmentAction: () => findLastAssignmentAction,
|
|
290
|
+
findPendingCorrectionAction: () => findPendingCorrectionAction,
|
|
280
291
|
findRecordActionPages: () => findRecordActionPages,
|
|
281
292
|
flag: () => flag,
|
|
282
293
|
flattenFieldReference: () => flattenFieldReference,
|
|
@@ -310,6 +321,7 @@ __export(events_exports, {
|
|
|
310
321
|
getAvailableActionsForEvent: () => getAvailableActionsForEvent,
|
|
311
322
|
getAvailableRolesForUserUpdatePayload: () => getAvailableRolesForUserUpdatePayload,
|
|
312
323
|
getCompleteActionAnnotation: () => getCompleteActionAnnotation,
|
|
324
|
+
getCompleteActionContent: () => getCompleteActionContent,
|
|
313
325
|
getCompleteActionDeclaration: () => getCompleteActionDeclaration,
|
|
314
326
|
getCurrentEventState: () => getCurrentEventState,
|
|
315
327
|
getCustomActionFields: () => getCustomActionFields,
|
|
@@ -318,6 +330,7 @@ __export(events_exports, {
|
|
|
318
330
|
getDeclarationFields: () => getDeclarationFields,
|
|
319
331
|
getDeclarationPages: () => getDeclarationPages,
|
|
320
332
|
getEventConfigById: () => getEventConfigById,
|
|
333
|
+
getEventFlags: () => getEventFlags,
|
|
321
334
|
getFilePathsFromEvent: () => getFilePathsFromEvent,
|
|
322
335
|
getLocationHierarchy: () => getLocationHierarchy,
|
|
323
336
|
getMixedPath: () => getMixedPath,
|
|
@@ -340,6 +353,7 @@ __export(events_exports, {
|
|
|
340
353
|
isBulletListFieldType: () => isBulletListFieldType,
|
|
341
354
|
isButtonFieldType: () => isButtonFieldType,
|
|
342
355
|
isCheckboxFieldType: () => isCheckboxFieldType,
|
|
356
|
+
isCodeToEvaluate: () => isCodeToEvaluate,
|
|
343
357
|
isConditionMet: () => isConditionMet,
|
|
344
358
|
isCountryFieldType: () => isCountryFieldType,
|
|
345
359
|
isCustomFieldType: () => isCustomFieldType,
|
|
@@ -380,6 +394,7 @@ __export(events_exports, {
|
|
|
380
394
|
isPageVisible: () => isPageVisible,
|
|
381
395
|
isParagraphFieldType: () => isParagraphFieldType,
|
|
382
396
|
isPhoneFieldType: () => isPhoneFieldType,
|
|
397
|
+
isPotentialDuplicate: () => isPotentialDuplicate,
|
|
383
398
|
isPrintButtonFieldType: () => isPrintButtonFieldType,
|
|
384
399
|
isQrReaderFieldType: () => isQrReaderFieldType,
|
|
385
400
|
isQueryParamReaderFieldType: () => isQueryParamReaderFieldType,
|
|
@@ -413,12 +428,15 @@ __export(events_exports, {
|
|
|
413
428
|
plainDateToLocalDate: () => plainDateToLocalDate,
|
|
414
429
|
precompileActionSchemas: () => precompileActionSchemas,
|
|
415
430
|
resolveDateOfEvent: () => resolveDateOfEvent,
|
|
431
|
+
resolveEventCustomFlags: () => resolveEventCustomFlags,
|
|
416
432
|
resolvePlaceOfEvent: () => resolvePlaceOfEvent,
|
|
433
|
+
runClientFunction: () => runClientFunction,
|
|
417
434
|
runFieldValidations: () => runFieldValidations,
|
|
418
435
|
runStructuralValidations: () => runStructuralValidations,
|
|
419
436
|
safeUnion: () => safeUnion,
|
|
420
437
|
status: () => status,
|
|
421
438
|
timePeriodToDateRange: () => timePeriodToDateRange,
|
|
439
|
+
todayISO: () => todayISO,
|
|
422
440
|
user: () => user,
|
|
423
441
|
userCanAccessEventWithScopes: () => userCanAccessEventWithScopes,
|
|
424
442
|
validate: () => validate,
|
|
@@ -693,14 +711,20 @@ var unflattenScope = (input) => {
|
|
|
693
711
|
return { type, options };
|
|
694
712
|
};
|
|
695
713
|
var EncodedScope = z2.string().brand("EncodedScope");
|
|
696
|
-
var
|
|
697
|
-
|
|
714
|
+
var decodedScopeCache = /* @__PURE__ */ new Map();
|
|
715
|
+
var decodeScope = (encodedScope) => {
|
|
716
|
+
if (decodedScopeCache.has(encodedScope)) {
|
|
717
|
+
return decodedScopeCache.get(encodedScope);
|
|
718
|
+
}
|
|
719
|
+
const scope = qs.parse(encodedScope, {
|
|
698
720
|
ignoreQueryPrefix: true,
|
|
699
721
|
comma: true,
|
|
700
722
|
allowDots: true
|
|
701
723
|
});
|
|
702
724
|
const unflattenedScope = unflattenScope(scope);
|
|
703
|
-
|
|
725
|
+
const result = Scope.safeParse(unflattenedScope)?.data;
|
|
726
|
+
decodedScopeCache.set(encodedScope, result);
|
|
727
|
+
return result;
|
|
704
728
|
};
|
|
705
729
|
var DEFAULT_SCOPE_OPTIONS = {
|
|
706
730
|
placeOfEvent: JurisdictionFilter.enum.all,
|
|
@@ -1080,8 +1104,8 @@ var ActionConditional = z7.discriminatedUnion("type", [
|
|
|
1080
1104
|
// Action can be shown to the user in the list but as disabled
|
|
1081
1105
|
EnableConditional
|
|
1082
1106
|
]).meta({
|
|
1083
|
-
|
|
1084
|
-
|
|
1107
|
+
id: "ActionConditional",
|
|
1108
|
+
description: "Conditional gating whether an action is shown (SHOW) or enabled (ENABLE). When omitted from an action, the action is shown and enabled for everyone."
|
|
1085
1109
|
});
|
|
1086
1110
|
var DisplayOnReviewConditional = z7.object({
|
|
1087
1111
|
type: z7.literal(ConditionalType.DISPLAY_ON_REVIEW),
|
|
@@ -1097,8 +1121,8 @@ var FieldConditional = z7.discriminatedUnion("type", [
|
|
|
1097
1121
|
// Field output can be shown / hidden on the review page
|
|
1098
1122
|
DisplayOnReviewConditional
|
|
1099
1123
|
]).meta({
|
|
1100
|
-
|
|
1101
|
-
|
|
1124
|
+
id: "FieldConditional",
|
|
1125
|
+
description: "Conditional gating whether a form field is shown (SHOW), enabled (ENABLE), or displayed on the review page (DISPLAY_ON_REVIEW). When omitted, the field is shown and enabled for everyone, and is displayed on review whenever it has a value."
|
|
1102
1126
|
});
|
|
1103
1127
|
|
|
1104
1128
|
// ../commons/src/events/FieldType.ts
|
|
@@ -1321,7 +1345,7 @@ function plainDateToLocalDate(date) {
|
|
|
1321
1345
|
// ../commons/src/events/FieldValue.ts
|
|
1322
1346
|
var TextValue = z12.string();
|
|
1323
1347
|
var HiddenFieldValue = z12.string();
|
|
1324
|
-
var NonEmptyTextValue =
|
|
1348
|
+
var NonEmptyTextValue = z12.string().trim().min(1);
|
|
1325
1349
|
var DateValue = z12.iso.date().describe("Date in the format YYYY-MM-DD");
|
|
1326
1350
|
var AgeValue = z12.object({
|
|
1327
1351
|
age: z12.number(),
|
|
@@ -1350,6 +1374,7 @@ var DateRangeFieldValue = z12.object({
|
|
|
1350
1374
|
var EmailValue = z12.email();
|
|
1351
1375
|
var CheckboxFieldValue = z12.boolean();
|
|
1352
1376
|
var NumberFieldValue = z12.number();
|
|
1377
|
+
var SignatureFieldValue = FileFieldValue;
|
|
1353
1378
|
var ButtonFieldValue = z12.number();
|
|
1354
1379
|
var VerificationStatusValue = z12.enum([
|
|
1355
1380
|
"verified",
|
|
@@ -1648,8 +1673,9 @@ var RequestedCorrectionAction = ActionBase.extend(
|
|
|
1648
1673
|
var ApprovedCorrectionAction = ActionBase.extend(
|
|
1649
1674
|
z14.object({
|
|
1650
1675
|
type: z14.literal(ActionType.APPROVE_CORRECTION),
|
|
1651
|
-
requestId: z14.string()
|
|
1676
|
+
requestId: z14.string(),
|
|
1652
1677
|
// TODO move into 'content' property
|
|
1678
|
+
content: z14.object({ immediateCorrection: z14.boolean().optional() }).optional()
|
|
1653
1679
|
}).shape
|
|
1654
1680
|
);
|
|
1655
1681
|
var RejectedCorrectionAction = ActionBase.extend(
|
|
@@ -1742,8 +1768,8 @@ var FlagConfig = z15.object({
|
|
|
1742
1768
|
),
|
|
1743
1769
|
label: TranslationConfig.describe("Human readable label of the flag.")
|
|
1744
1770
|
}).meta({
|
|
1745
|
-
|
|
1746
|
-
|
|
1771
|
+
id: "FlagConfig",
|
|
1772
|
+
description: "Configuration for a custom flag that can be added to or removed from records by event actions."
|
|
1747
1773
|
});
|
|
1748
1774
|
var ActionFlagConfig = z15.object({
|
|
1749
1775
|
id: Flag,
|
|
@@ -1752,8 +1778,8 @@ var ActionFlagConfig = z15.object({
|
|
|
1752
1778
|
"When conditional is met, the operation is performed on the flag. If not provided, the operation is performed unconditionally."
|
|
1753
1779
|
)
|
|
1754
1780
|
}).meta({
|
|
1755
|
-
|
|
1756
|
-
|
|
1781
|
+
id: "ActionFlagConfig",
|
|
1782
|
+
description: "Add or remove operation applied to a flag when the parent action is accepted. Optionally gated by a conditional."
|
|
1757
1783
|
});
|
|
1758
1784
|
|
|
1759
1785
|
// ../commons/src/events/EventMetadata.ts
|
|
@@ -2180,11 +2206,31 @@ var FieldReference = import_v43.default.object({
|
|
|
2180
2206
|
$$field: FieldId.describe("Id of the field to reference"),
|
|
2181
2207
|
$$subfield: import_v43.default.array(import_v43.default.string()).optional().default([]).describe(
|
|
2182
2208
|
'If the FieldValue is an object, subfield can be used to refer to e.g. `["foo", "bar"]` in `{ foo: { bar: 3 } }`'
|
|
2209
|
+
),
|
|
2210
|
+
$$code: import_v43.default.string().optional().describe(
|
|
2211
|
+
"Serialised client-side function body. When present the expression is evaluated rather than dereferenced."
|
|
2183
2212
|
)
|
|
2184
|
-
}).describe(
|
|
2213
|
+
}).describe(
|
|
2214
|
+
"Reference to a field value, with an optional client-side computation applied."
|
|
2215
|
+
);
|
|
2216
|
+
function isCodeToEvaluate(v) {
|
|
2217
|
+
return !!v && typeof v === "object" && "$$code" in v;
|
|
2218
|
+
}
|
|
2219
|
+
var ComputedDefaultValue = import_v43.default.object({
|
|
2220
|
+
$$code: import_v43.default.string().describe(
|
|
2221
|
+
"Serialised client-side function body. Receives (undefined, context) where context includes $now, $online, and system variables."
|
|
2222
|
+
)
|
|
2223
|
+
}).describe("A context-only computation used as a field default value.");
|
|
2185
2224
|
var ValidationConfig = import_v43.default.object({
|
|
2186
|
-
validator: Conditional
|
|
2187
|
-
|
|
2225
|
+
validator: Conditional.describe(
|
|
2226
|
+
"Conditional expression that must hold for the field value to be considered valid."
|
|
2227
|
+
),
|
|
2228
|
+
message: TranslationConfig.describe(
|
|
2229
|
+
"Error message displayed when the validator does not hold."
|
|
2230
|
+
)
|
|
2231
|
+
}).meta({
|
|
2232
|
+
id: "ValidationConfig",
|
|
2233
|
+
description: "Validation rule applied to a form field. The validator is a conditional expression that must hold for the field value to be considered valid."
|
|
2188
2234
|
});
|
|
2189
2235
|
var requiredSchema = import_v43.default.union([
|
|
2190
2236
|
import_v43.default.boolean(),
|
|
@@ -2215,7 +2261,7 @@ var BaseField = import_v43.default.object({
|
|
|
2215
2261
|
"Indicates whether the field can be modified during record correction."
|
|
2216
2262
|
),
|
|
2217
2263
|
value: FieldReference.or(import_v43.default.array(FieldReference)).optional().describe(
|
|
2218
|
-
"Reference to the source field or fields. When a value is defined, it is copied from the parent field when changed. If multiple references are provided, the first truthy value is used."
|
|
2264
|
+
"Reference to the source field or fields. When a value is defined, it is copied from the parent field when changed. If multiple references are provided, the first truthy value is used. A FieldReference with $$code computes the value via a custom client-side function."
|
|
2219
2265
|
),
|
|
2220
2266
|
analytics: import_v43.default.boolean().default(false).optional().describe(
|
|
2221
2267
|
"Indicates whether the field is included in analytics. When enabled, its value becomes available in the analytics dashboard."
|
|
@@ -2223,30 +2269,39 @@ var BaseField = import_v43.default.object({
|
|
|
2223
2269
|
}).describe("Common properties shared across all field types.");
|
|
2224
2270
|
var Divider = BaseField.extend({
|
|
2225
2271
|
type: import_v43.default.literal(FieldType.DIVIDER)
|
|
2272
|
+
}).meta({
|
|
2273
|
+
description: "A horizontal line divider",
|
|
2274
|
+
id: "Divider"
|
|
2226
2275
|
});
|
|
2227
2276
|
var TextField = BaseField.extend({
|
|
2228
2277
|
type: import_v43.default.literal(FieldType.TEXT),
|
|
2229
|
-
defaultValue: import_v43.default.union([NonEmptyTextValue, SerializedUserField]).optional(),
|
|
2278
|
+
defaultValue: import_v43.default.union([NonEmptyTextValue, SerializedUserField, ComputedDefaultValue]).optional(),
|
|
2230
2279
|
configuration: import_v43.default.object({
|
|
2231
2280
|
maxLength: import_v43.default.number().optional().describe("Maximum length of the text"),
|
|
2232
2281
|
type: import_v43.default.enum(["text", "password"]).optional(),
|
|
2233
2282
|
prefix: TranslationConfig.optional(),
|
|
2234
2283
|
postfix: TranslationConfig.optional()
|
|
2235
2284
|
}).default({ type: "text" }).optional()
|
|
2236
|
-
}).
|
|
2285
|
+
}).meta({
|
|
2286
|
+
description: "A text input field",
|
|
2287
|
+
id: "TextField"
|
|
2288
|
+
});
|
|
2237
2289
|
var NumberField = BaseField.extend({
|
|
2238
2290
|
type: import_v43.default.literal(FieldType.NUMBER),
|
|
2239
|
-
defaultValue: NumberFieldValue.optional(),
|
|
2291
|
+
defaultValue: NumberFieldValue.or(ComputedDefaultValue).optional(),
|
|
2240
2292
|
configuration: import_v43.default.object({
|
|
2241
2293
|
min: import_v43.default.number().optional().describe("Minimum value"),
|
|
2242
2294
|
max: import_v43.default.number().optional().describe("Maximum value"),
|
|
2243
2295
|
prefix: TranslationConfig.optional(),
|
|
2244
2296
|
postfix: TranslationConfig.optional()
|
|
2245
2297
|
}).optional()
|
|
2246
|
-
}).
|
|
2298
|
+
}).meta({
|
|
2299
|
+
description: "A number input field",
|
|
2300
|
+
id: "NumberField"
|
|
2301
|
+
});
|
|
2247
2302
|
var TextAreaField = BaseField.extend({
|
|
2248
2303
|
type: import_v43.default.literal(FieldType.TEXTAREA),
|
|
2249
|
-
defaultValue: NonEmptyTextValue.optional(),
|
|
2304
|
+
defaultValue: NonEmptyTextValue.or(ComputedDefaultValue).optional(),
|
|
2250
2305
|
configuration: import_v43.default.object({
|
|
2251
2306
|
maxLength: import_v43.default.number().optional().describe("Maximum length of the text"),
|
|
2252
2307
|
rows: import_v43.default.number().optional().describe("Number of visible text lines"),
|
|
@@ -2254,7 +2309,10 @@ var TextAreaField = BaseField.extend({
|
|
|
2254
2309
|
prefix: TranslationConfig.optional(),
|
|
2255
2310
|
postfix: TranslationConfig.optional()
|
|
2256
2311
|
}).default({ rows: 4 }).optional()
|
|
2257
|
-
}).
|
|
2312
|
+
}).meta({
|
|
2313
|
+
description: "A multiline text input",
|
|
2314
|
+
id: "TextAreaField"
|
|
2315
|
+
});
|
|
2258
2316
|
var ImageMimeType = import_v43.default.enum([
|
|
2259
2317
|
"image/png",
|
|
2260
2318
|
"image/jpg",
|
|
@@ -2277,58 +2335,76 @@ var SignatureField = BaseField.extend({
|
|
|
2277
2335
|
signaturePromptLabel: TranslationConfig.describe(
|
|
2278
2336
|
"Title of the signature modal"
|
|
2279
2337
|
),
|
|
2280
|
-
defaultValue:
|
|
2338
|
+
defaultValue: SignatureFieldValue.or(ComputedDefaultValue).optional(),
|
|
2281
2339
|
configuration: import_v43.default.object({
|
|
2282
2340
|
maxFileSize: import_v43.default.number().describe("Maximum file size in bytes").default(DEFAULT_MAX_FILE_SIZE_BYTES),
|
|
2283
2341
|
acceptedFileTypes: MimeType.array().optional().describe("List of allowed file formats for the signature")
|
|
2284
2342
|
}).default({
|
|
2285
2343
|
maxFileSize: DEFAULT_MAX_FILE_SIZE_BYTES
|
|
2286
2344
|
})
|
|
2287
|
-
}).
|
|
2345
|
+
}).meta({
|
|
2346
|
+
description: "A signature input field",
|
|
2347
|
+
id: "SignatureField"
|
|
2348
|
+
});
|
|
2288
2349
|
var EmailField = BaseField.extend({
|
|
2289
2350
|
type: import_v43.default.literal(FieldType.EMAIL),
|
|
2290
2351
|
configuration: import_v43.default.object({
|
|
2291
2352
|
maxLength: import_v43.default.number().optional().describe("Maximum length of the text")
|
|
2292
2353
|
}).default({ maxLength: 255 }).optional(),
|
|
2293
|
-
defaultValue: NonEmptyTextValue.optional()
|
|
2354
|
+
defaultValue: NonEmptyTextValue.or(ComputedDefaultValue).optional()
|
|
2355
|
+
}).meta({
|
|
2356
|
+
description: "An email input field",
|
|
2357
|
+
id: "EmailField"
|
|
2294
2358
|
});
|
|
2295
2359
|
var DateField = BaseField.extend({
|
|
2296
2360
|
type: import_v43.default.literal(FieldType.DATE),
|
|
2297
|
-
defaultValue: SerializedNowDateTime.or(PlainDate).optional().describe("Default date value(yyyy-MM-dd)"),
|
|
2361
|
+
defaultValue: SerializedNowDateTime.or(PlainDate).or(ComputedDefaultValue).optional().describe("Default date value(yyyy-MM-dd)"),
|
|
2298
2362
|
configuration: import_v43.default.object({
|
|
2299
2363
|
notice: TranslationConfig.describe(
|
|
2300
2364
|
"Text to display above the date input"
|
|
2301
2365
|
).optional()
|
|
2302
2366
|
}).optional()
|
|
2303
|
-
}).
|
|
2367
|
+
}).meta({
|
|
2368
|
+
description: "A date input (yyyy-MM-dd)",
|
|
2369
|
+
id: "DateField"
|
|
2370
|
+
});
|
|
2304
2371
|
var AgeField = BaseField.extend({
|
|
2305
2372
|
type: import_v43.default.literal(FieldType.AGE),
|
|
2306
|
-
defaultValue: NumberFieldValue.optional(),
|
|
2373
|
+
defaultValue: NumberFieldValue.or(ComputedDefaultValue).optional(),
|
|
2307
2374
|
configuration: import_v43.default.object({
|
|
2308
2375
|
asOfDate: FieldReference,
|
|
2309
2376
|
prefix: TranslationConfig.optional(),
|
|
2310
2377
|
postfix: TranslationConfig.optional()
|
|
2311
2378
|
})
|
|
2312
|
-
}).
|
|
2379
|
+
}).meta({
|
|
2380
|
+
description: "An age input field which uses the current date as the asOfDate",
|
|
2381
|
+
id: "AgeField"
|
|
2382
|
+
});
|
|
2313
2383
|
var TimeField = BaseField.extend({
|
|
2314
2384
|
type: import_v43.default.literal(FieldType.TIME),
|
|
2315
|
-
defaultValue: SerializedNowDateTime.or(TimeValue).optional().describe("Default time value (HH-mm)"),
|
|
2385
|
+
defaultValue: SerializedNowDateTime.or(TimeValue).or(ComputedDefaultValue).optional().describe("Default time value (HH-mm)"),
|
|
2316
2386
|
configuration: import_v43.default.object({
|
|
2317
2387
|
use12HourFormat: import_v43.default.boolean().optional().describe("Whether to use 12-hour format"),
|
|
2318
2388
|
notice: TranslationConfig.describe(
|
|
2319
2389
|
"Text to display above the time input"
|
|
2320
2390
|
).optional()
|
|
2321
2391
|
}).optional()
|
|
2322
|
-
}).
|
|
2392
|
+
}).meta({
|
|
2393
|
+
description: "A single time input (HH-mm)",
|
|
2394
|
+
id: "TimeField"
|
|
2395
|
+
});
|
|
2323
2396
|
var DateRangeField = BaseField.extend({
|
|
2324
2397
|
type: import_v43.default.literal(FieldType.DATE_RANGE),
|
|
2325
|
-
defaultValue: DateRangeFieldValue.optional(),
|
|
2398
|
+
defaultValue: DateRangeFieldValue.or(ComputedDefaultValue).optional(),
|
|
2326
2399
|
configuration: import_v43.default.object({
|
|
2327
2400
|
notice: TranslationConfig.describe(
|
|
2328
2401
|
"Text to display above the date input"
|
|
2329
2402
|
).optional()
|
|
2330
2403
|
}).optional()
|
|
2331
|
-
}).
|
|
2404
|
+
}).meta({
|
|
2405
|
+
description: "A date range input ({ start: yyyy-MM-dd, end: yyyy-MM-dd })",
|
|
2406
|
+
id: "DateRangeField"
|
|
2407
|
+
});
|
|
2332
2408
|
var HtmlFontVariant = import_v43.default.enum([
|
|
2333
2409
|
"reg12",
|
|
2334
2410
|
"reg14",
|
|
@@ -2372,21 +2448,33 @@ var ImageViewField = BaseField.extend({
|
|
|
2372
2448
|
type: import_v43.default.literal(FieldType.IMAGE_VIEW),
|
|
2373
2449
|
defaultValue: NonEmptyTextValue.optional(),
|
|
2374
2450
|
configuration: ImageConfiguration
|
|
2375
|
-
}).
|
|
2451
|
+
}).meta({
|
|
2452
|
+
description: "A read-only image component for form pages",
|
|
2453
|
+
id: "ImageViewField"
|
|
2454
|
+
});
|
|
2376
2455
|
var Paragraph = BaseField.extend({
|
|
2377
2456
|
type: import_v43.default.literal(FieldType.PARAGRAPH),
|
|
2378
2457
|
configuration: ParagraphConfiguration
|
|
2379
|
-
}).
|
|
2458
|
+
}).meta({
|
|
2459
|
+
description: "A read-only HTML <p> paragraph",
|
|
2460
|
+
id: "Paragraph"
|
|
2461
|
+
});
|
|
2380
2462
|
var Heading = BaseField.extend({
|
|
2381
2463
|
type: import_v43.default.literal(FieldType.HEADING),
|
|
2382
2464
|
configuration: HeadingConfiguration
|
|
2383
|
-
}).
|
|
2465
|
+
}).meta({
|
|
2466
|
+
description: "A read-only heading component for form pages",
|
|
2467
|
+
id: "Heading"
|
|
2468
|
+
});
|
|
2384
2469
|
var PageHeader = BaseField.extend({
|
|
2385
2470
|
type: import_v43.default.literal(FieldType.PAGE_HEADER)
|
|
2386
|
-
}).
|
|
2471
|
+
}).meta({
|
|
2472
|
+
description: "A read-only header component for form pages",
|
|
2473
|
+
id: "PageHeader"
|
|
2474
|
+
});
|
|
2387
2475
|
var File = BaseField.extend({
|
|
2388
2476
|
type: import_v43.default.literal(FieldType.FILE),
|
|
2389
|
-
defaultValue: FileFieldValue.optional(),
|
|
2477
|
+
defaultValue: FileFieldValue.or(ComputedDefaultValue).optional(),
|
|
2390
2478
|
configuration: import_v43.default.object({
|
|
2391
2479
|
maxFileSize: import_v43.default.number().describe("Maximum file size in bytes").default(DEFAULT_MAX_FILE_SIZE_BYTES),
|
|
2392
2480
|
acceptedFileTypes: MimeType.array().optional().describe("List of allowed file formats for the signature"),
|
|
@@ -2402,7 +2490,10 @@ var File = BaseField.extend({
|
|
|
2402
2490
|
}).default({
|
|
2403
2491
|
maxFileSize: DEFAULT_MAX_FILE_SIZE_BYTES
|
|
2404
2492
|
})
|
|
2405
|
-
}).
|
|
2493
|
+
}).meta({
|
|
2494
|
+
description: "A file upload field",
|
|
2495
|
+
id: "File"
|
|
2496
|
+
});
|
|
2406
2497
|
var SelectOption = import_v43.default.object({
|
|
2407
2498
|
value: import_v43.default.string().describe("The value of the option"),
|
|
2408
2499
|
label: import_v43.default.union([import_v43.default.string(), TranslationConfig]).describe("The label of the option"),
|
|
@@ -2410,7 +2501,7 @@ var SelectOption = import_v43.default.object({
|
|
|
2410
2501
|
});
|
|
2411
2502
|
var NumberWithUnitField = BaseField.extend({
|
|
2412
2503
|
type: import_v43.default.literal(FieldType.NUMBER_WITH_UNIT),
|
|
2413
|
-
defaultValue: NumberWithUnitFieldValue.optional(),
|
|
2504
|
+
defaultValue: NumberWithUnitFieldValue.or(ComputedDefaultValue).optional(),
|
|
2414
2505
|
options: import_v43.default.array(SelectOption).describe("A list of options for the unit select"),
|
|
2415
2506
|
configuration: import_v43.default.object({
|
|
2416
2507
|
min: import_v43.default.number().optional().describe("Minimum value of the number field"),
|
|
@@ -2419,17 +2510,23 @@ var NumberWithUnitField = BaseField.extend({
|
|
|
2419
2510
|
"Placeholder for the number field"
|
|
2420
2511
|
)
|
|
2421
2512
|
}).optional()
|
|
2422
|
-
}).
|
|
2513
|
+
}).meta({
|
|
2514
|
+
description: "A number with unit input field",
|
|
2515
|
+
id: "NumberWithUnitField"
|
|
2516
|
+
});
|
|
2423
2517
|
var RadioGroup = BaseField.extend({
|
|
2424
2518
|
type: import_v43.default.literal(FieldType.RADIO_GROUP),
|
|
2425
|
-
defaultValue: TextValue.optional(),
|
|
2519
|
+
defaultValue: TextValue.or(ComputedDefaultValue).optional(),
|
|
2426
2520
|
options: import_v43.default.array(SelectOption).describe("A list of options"),
|
|
2427
2521
|
configuration: import_v43.default.object({
|
|
2428
2522
|
styles: import_v43.default.object({
|
|
2429
2523
|
size: import_v43.default.enum(["NORMAL", "LARGE"]).optional()
|
|
2430
2524
|
}).optional()
|
|
2431
2525
|
}).optional()
|
|
2432
|
-
}).
|
|
2526
|
+
}).meta({
|
|
2527
|
+
description: "A grouped radio button field",
|
|
2528
|
+
id: "RadioGroup"
|
|
2529
|
+
});
|
|
2433
2530
|
var BulletList = BaseField.extend({
|
|
2434
2531
|
type: import_v43.default.literal(FieldType.BULLET_LIST),
|
|
2435
2532
|
items: import_v43.default.array(TranslationConfig).describe("A list of items"),
|
|
@@ -2438,10 +2535,13 @@ var BulletList = BaseField.extend({
|
|
|
2438
2535
|
fontVariant: HtmlFontVariant.optional()
|
|
2439
2536
|
}).optional()
|
|
2440
2537
|
}).default({})
|
|
2441
|
-
}).
|
|
2538
|
+
}).meta({
|
|
2539
|
+
description: "A list of bullet points",
|
|
2540
|
+
id: "BulletList"
|
|
2541
|
+
});
|
|
2442
2542
|
var Select = BaseField.extend({
|
|
2443
2543
|
type: import_v43.default.literal(FieldType.SELECT),
|
|
2444
|
-
defaultValue: TextValue.optional(),
|
|
2544
|
+
defaultValue: TextValue.or(ComputedDefaultValue).optional(),
|
|
2445
2545
|
options: import_v43.default.array(SelectOption).describe("A list of options"),
|
|
2446
2546
|
noOptionsMessage: TranslationConfig.optional().describe(
|
|
2447
2547
|
`
|
|
@@ -2453,16 +2553,22 @@ var Select = BaseField.extend({
|
|
|
2453
2553
|
{ ..., defaultMessage: "'{input}' is not listed among the health facilities." }
|
|
2454
2554
|
`
|
|
2455
2555
|
)
|
|
2456
|
-
}).
|
|
2556
|
+
}).meta({
|
|
2557
|
+
description: "A select input field",
|
|
2558
|
+
id: "Select"
|
|
2559
|
+
});
|
|
2457
2560
|
var SelectDateRangeOption = import_v43.default.object({
|
|
2458
2561
|
value: SelectDateRangeValue.describe("The value of the option"),
|
|
2459
2562
|
label: TranslationConfig.describe("The label of the option")
|
|
2460
2563
|
});
|
|
2461
2564
|
var SelectDateRangeField = BaseField.extend({
|
|
2462
2565
|
type: import_v43.default.literal(FieldType.SELECT_DATE_RANGE),
|
|
2463
|
-
defaultValue: SelectDateRangeValue.optional(),
|
|
2566
|
+
defaultValue: SelectDateRangeValue.or(ComputedDefaultValue).optional(),
|
|
2464
2567
|
options: import_v43.default.array(SelectDateRangeOption).describe("A list of options")
|
|
2465
|
-
}).
|
|
2568
|
+
}).meta({
|
|
2569
|
+
description: "A date range selection field",
|
|
2570
|
+
id: "SelectDateRangeField"
|
|
2571
|
+
});
|
|
2466
2572
|
var NameConfig = import_v43.default.object({
|
|
2467
2573
|
firstname: import_v43.default.object({ required: requiredSchema, label: TranslationConfig.optional() }).optional(),
|
|
2468
2574
|
middlename: import_v43.default.object({ required: requiredSchema, label: TranslationConfig.optional() }).optional(),
|
|
@@ -2474,7 +2580,7 @@ var NameField = BaseField.extend({
|
|
|
2474
2580
|
firstname: SerializedUserField.or(NonEmptyTextValue).optional(),
|
|
2475
2581
|
middlename: SerializedUserField.or(NonEmptyTextValue).optional(),
|
|
2476
2582
|
surname: SerializedUserField.or(NonEmptyTextValue).optional()
|
|
2477
|
-
}).optional(),
|
|
2583
|
+
}).or(ComputedDefaultValue).optional(),
|
|
2478
2584
|
configuration: import_v43.default.object({
|
|
2479
2585
|
name: NameConfig.default({
|
|
2480
2586
|
firstname: { required: true },
|
|
@@ -2493,26 +2599,41 @@ var NameField = BaseField.extend({
|
|
|
2493
2599
|
surname: { required: true }
|
|
2494
2600
|
}
|
|
2495
2601
|
}).optional()
|
|
2496
|
-
}).
|
|
2602
|
+
}).meta({
|
|
2603
|
+
description: "A field for entering a persons name",
|
|
2604
|
+
id: "NameField"
|
|
2605
|
+
});
|
|
2497
2606
|
var PhoneField = BaseField.extend({
|
|
2498
|
-
defaultValue: NonEmptyTextValue.optional(),
|
|
2607
|
+
defaultValue: NonEmptyTextValue.or(ComputedDefaultValue).optional(),
|
|
2499
2608
|
type: import_v43.default.literal(FieldType.PHONE)
|
|
2500
|
-
}).
|
|
2609
|
+
}).meta({
|
|
2610
|
+
description: "A field for entering a phone number",
|
|
2611
|
+
id: "PhoneField"
|
|
2612
|
+
});
|
|
2501
2613
|
var IdField = BaseField.extend({
|
|
2502
|
-
defaultValue: NonEmptyTextValue.optional(),
|
|
2614
|
+
defaultValue: NonEmptyTextValue.or(ComputedDefaultValue).optional(),
|
|
2503
2615
|
type: import_v43.default.literal(FieldType.ID)
|
|
2504
|
-
}).
|
|
2616
|
+
}).meta({
|
|
2617
|
+
description: "A field for entering an ID",
|
|
2618
|
+
id: "IdField"
|
|
2619
|
+
});
|
|
2505
2620
|
var Checkbox = BaseField.extend({
|
|
2506
2621
|
type: import_v43.default.literal(FieldType.CHECKBOX),
|
|
2507
|
-
defaultValue: CheckboxFieldValue.default(false)
|
|
2508
|
-
}).
|
|
2622
|
+
defaultValue: CheckboxFieldValue.or(ComputedDefaultValue).default(false)
|
|
2623
|
+
}).meta({
|
|
2624
|
+
description: "A boolean checkbox field",
|
|
2625
|
+
id: "Checkbox"
|
|
2626
|
+
});
|
|
2509
2627
|
var Country = BaseField.extend({
|
|
2510
2628
|
type: import_v43.default.literal(FieldType.COUNTRY),
|
|
2511
|
-
defaultValue: NonEmptyTextValue.optional(),
|
|
2629
|
+
defaultValue: NonEmptyTextValue.or(ComputedDefaultValue).optional(),
|
|
2512
2630
|
optionOverrides: import_v43.default.array(SelectOption.omit({ label: true })).optional().describe(
|
|
2513
2631
|
"Conditionals for specific countries. Countries not listed are always shown and enabled."
|
|
2514
2632
|
)
|
|
2515
|
-
}).
|
|
2633
|
+
}).meta({
|
|
2634
|
+
description: "A field for selecting a country",
|
|
2635
|
+
id: "Country"
|
|
2636
|
+
});
|
|
2516
2637
|
var AllowedLocations = JurisdictionReference.optional().describe(
|
|
2517
2638
|
"Limits which location options are selectable depending on user jurisdiction and location."
|
|
2518
2639
|
);
|
|
@@ -2521,28 +2642,33 @@ var AdministrativeAreas = import_v43.default.enum([
|
|
|
2521
2642
|
"HEALTH_FACILITY",
|
|
2522
2643
|
"CRVS_OFFICE"
|
|
2523
2644
|
]);
|
|
2524
|
-
var AdministrativeAreaConfiguration = import_v43.default.object({
|
|
2525
|
-
partOf: FieldReference.optional().describe("Parent location"),
|
|
2526
|
-
type: AdministrativeAreas,
|
|
2527
|
-
allowedLocations: AllowedLocations
|
|
2528
|
-
}).describe("Administrative area options");
|
|
2529
2645
|
var AdministrativeAreaField = BaseField.extend({
|
|
2530
2646
|
type: import_v43.default.literal(FieldType.ADMINISTRATIVE_AREA),
|
|
2531
|
-
defaultValue: import_v43.default.union([NonEmptyTextValue, SerializedUserField]).optional(),
|
|
2532
|
-
configuration:
|
|
2533
|
-
|
|
2647
|
+
defaultValue: import_v43.default.union([NonEmptyTextValue, SerializedUserField, ComputedDefaultValue]).optional(),
|
|
2648
|
+
configuration: import_v43.default.object({
|
|
2649
|
+
partOf: FieldReference.optional().describe("Parent location"),
|
|
2650
|
+
type: AdministrativeAreas,
|
|
2651
|
+
allowedLocations: AllowedLocations
|
|
2652
|
+
}).describe("Administrative area options")
|
|
2653
|
+
}).meta({
|
|
2654
|
+
description: "Administrative area input field",
|
|
2655
|
+
id: "AdministrativeAreaField"
|
|
2656
|
+
});
|
|
2534
2657
|
var LocationInput = BaseField.extend({
|
|
2535
2658
|
type: import_v43.default.literal(FieldType.LOCATION),
|
|
2536
|
-
defaultValue: import_v43.default.union([NonEmptyTextValue, SerializedUserField]).optional(),
|
|
2659
|
+
defaultValue: import_v43.default.union([NonEmptyTextValue, SerializedUserField, ComputedDefaultValue]).optional(),
|
|
2537
2660
|
configuration: import_v43.default.object({
|
|
2538
2661
|
locationTypes: import_v43.default.array(import_v43.default.string()).optional().describe("Types of the locations that are available for selection."),
|
|
2539
2662
|
allowedLocations: AllowedLocations
|
|
2540
2663
|
}).optional()
|
|
2541
|
-
}).
|
|
2664
|
+
}).meta({
|
|
2665
|
+
description: "A field for selecting a location",
|
|
2666
|
+
id: "LocationInput"
|
|
2667
|
+
});
|
|
2542
2668
|
var FileUploadWithOptions = BaseField.extend({
|
|
2543
2669
|
type: import_v43.default.literal(FieldType.FILE_WITH_OPTIONS),
|
|
2544
2670
|
options: import_v43.default.array(SelectOption).describe("A list of options"),
|
|
2545
|
-
defaultValue: FileFieldWithOptionValue.optional(),
|
|
2671
|
+
defaultValue: FileFieldWithOptionValue.or(ComputedDefaultValue).optional(),
|
|
2546
2672
|
configuration: import_v43.default.object({
|
|
2547
2673
|
maxFileSize: import_v43.default.number().describe("Maximum file size in bytes").default(DEFAULT_MAX_FILE_SIZE_BYTES),
|
|
2548
2674
|
maxImageSize: import_v43.default.object({
|
|
@@ -2552,15 +2678,18 @@ var FileUploadWithOptions = BaseField.extend({
|
|
|
2552
2678
|
}).default({
|
|
2553
2679
|
maxFileSize: DEFAULT_MAX_FILE_SIZE_BYTES
|
|
2554
2680
|
})
|
|
2681
|
+
}).meta({
|
|
2682
|
+
description: "A field for uploading files with file type options",
|
|
2683
|
+
id: "FileUploadWithOptions"
|
|
2555
2684
|
});
|
|
2556
2685
|
var Facility = BaseField.extend({
|
|
2557
2686
|
type: import_v43.default.literal(FieldType.FACILITY),
|
|
2558
|
-
defaultValue: NonEmptyTextValue.optional(),
|
|
2687
|
+
defaultValue: NonEmptyTextValue.or(ComputedDefaultValue).optional(),
|
|
2559
2688
|
configuration: import_v43.default.object({ allowedLocations: AllowedLocations }).optional()
|
|
2560
2689
|
}).describe("Input field for a facility");
|
|
2561
2690
|
var Office = BaseField.extend({
|
|
2562
2691
|
type: import_v43.default.literal(FieldType.OFFICE),
|
|
2563
|
-
defaultValue: NonEmptyTextValue.optional(),
|
|
2692
|
+
defaultValue: NonEmptyTextValue.or(ComputedDefaultValue).optional(),
|
|
2564
2693
|
configuration: import_v43.default.object({ allowedLocations: AllowedLocations }).optional()
|
|
2565
2694
|
}).describe("Input field for an office");
|
|
2566
2695
|
var DefaultAddressFieldValue = DomesticAddressFieldValue.extend({
|
|
@@ -2596,8 +2725,11 @@ var Address = BaseField.extend({
|
|
|
2596
2725
|
).optional(),
|
|
2597
2726
|
allowedLocations: AllowedLocations
|
|
2598
2727
|
}).optional(),
|
|
2599
|
-
defaultValue: DefaultAddressFieldValue.optional()
|
|
2600
|
-
}).
|
|
2728
|
+
defaultValue: DefaultAddressFieldValue.or(ComputedDefaultValue).optional()
|
|
2729
|
+
}).meta({
|
|
2730
|
+
description: "Address input field \u2013 a combination of location and text fields",
|
|
2731
|
+
id: "Address"
|
|
2732
|
+
});
|
|
2601
2733
|
var StaticDataEntry = import_v43.default.object({
|
|
2602
2734
|
id: import_v43.default.string().describe("ID for the data entry."),
|
|
2603
2735
|
label: TranslationConfig,
|
|
@@ -2612,7 +2744,10 @@ var DataField = BaseField.extend({
|
|
|
2612
2744
|
subtitle: TranslationConfig.optional(),
|
|
2613
2745
|
data: import_v43.default.array(DataEntry)
|
|
2614
2746
|
})
|
|
2615
|
-
}).
|
|
2747
|
+
}).meta({
|
|
2748
|
+
description: "A field for displaying a table of read-only data",
|
|
2749
|
+
id: "DataField"
|
|
2750
|
+
});
|
|
2616
2751
|
var ButtonSize = import_v43.default.enum(["small", "medium", "large"]);
|
|
2617
2752
|
var ButtonType = import_v43.default.enum([
|
|
2618
2753
|
"primary",
|
|
@@ -2637,13 +2772,19 @@ var ButtonConfiguration = import_v43.default.object({
|
|
|
2637
2772
|
});
|
|
2638
2773
|
var ButtonField = BaseField.extend({
|
|
2639
2774
|
type: import_v43.default.literal(FieldType.BUTTON),
|
|
2640
|
-
defaultValue: ButtonFieldValue.optional(),
|
|
2775
|
+
defaultValue: ButtonFieldValue.or(ComputedDefaultValue).optional(),
|
|
2641
2776
|
configuration: ButtonConfiguration
|
|
2642
|
-
}).
|
|
2777
|
+
}).meta({
|
|
2778
|
+
description: "A generic button that can be used to trigger an action",
|
|
2779
|
+
id: "ButtonField"
|
|
2780
|
+
});
|
|
2643
2781
|
var FieldGroup = BaseField.extend({
|
|
2644
2782
|
type: import_v43.default.literal(FieldType.FIELD_GROUP),
|
|
2645
2783
|
// eslint-disable-next-line @typescript-eslint/no-use-before-define
|
|
2646
2784
|
fields: import_v43.default.lazy(() => import_v43.default.array(FieldConfig))
|
|
2785
|
+
}).meta({
|
|
2786
|
+
description: "A group of fields that are displayed together",
|
|
2787
|
+
id: "FieldGroup"
|
|
2647
2788
|
});
|
|
2648
2789
|
var AlphaPrintButton = BaseField.extend({
|
|
2649
2790
|
type: import_v43.default.literal(FieldType.ALPHA_PRINT_BUTTON),
|
|
@@ -2653,10 +2794,13 @@ var AlphaPrintButton = BaseField.extend({
|
|
|
2653
2794
|
"Label for the print button"
|
|
2654
2795
|
)
|
|
2655
2796
|
})
|
|
2656
|
-
}).
|
|
2797
|
+
}).meta({
|
|
2798
|
+
description: "An experimental print button field for printing certificates during the declaration process",
|
|
2799
|
+
id: "AlphaPrintButton"
|
|
2800
|
+
});
|
|
2657
2801
|
var HttpField = BaseField.extend({
|
|
2658
2802
|
type: import_v43.default.literal(FieldType.HTTP),
|
|
2659
|
-
defaultValue: HttpFieldValue.optional(),
|
|
2803
|
+
defaultValue: HttpFieldValue.or(ComputedDefaultValue).optional(),
|
|
2660
2804
|
configuration: import_v43.default.object({
|
|
2661
2805
|
trigger: FieldReference.optional().describe(
|
|
2662
2806
|
"Reference to the field that triggers the HTTP request when its value changes. If not provided, the HTTP request is triggered once on component mount."
|
|
@@ -2669,20 +2813,30 @@ var HttpField = BaseField.extend({
|
|
|
2669
2813
|
params: import_v43.default.record(import_v43.default.string(), import_v43.default.union([import_v43.default.string(), FieldReference])).optional(),
|
|
2670
2814
|
timeout: import_v43.default.number().default(15e3).describe("Request timeout in milliseconds")
|
|
2671
2815
|
})
|
|
2672
|
-
}).
|
|
2816
|
+
}).meta({
|
|
2817
|
+
description: "Makes a background HTTP request to an external service and stores the response so other fields can use it. Has no visible UI \u2014 pair with LOADER to show request status.",
|
|
2818
|
+
id: "HttpField"
|
|
2819
|
+
});
|
|
2673
2820
|
var AutocompleteField = BaseField.extend({
|
|
2674
2821
|
type: import_v43.default.literal(FieldType.AUTOCOMPLETE),
|
|
2675
2822
|
configuration: import_v43.default.object({
|
|
2676
|
-
url: import_v43.default.string().describe(
|
|
2823
|
+
url: import_v43.default.string().describe(
|
|
2824
|
+
"URL to fetch autocomplete suggestions from. This should be a country config server endpoint."
|
|
2825
|
+
).optional(),
|
|
2677
2826
|
method: import_v43.default.enum(["GET", "POST"]).default("GET").optional(),
|
|
2678
2827
|
defaultOptions: import_v43.default.array(
|
|
2679
2828
|
import_v43.default.object({
|
|
2680
2829
|
label: import_v43.default.string(),
|
|
2681
2830
|
value: import_v43.default.string()
|
|
2682
2831
|
})
|
|
2683
|
-
).optional()
|
|
2832
|
+
).optional().describe(
|
|
2833
|
+
"Manual entry is supported through configuration, allowing users to provide values not currently represented in the dataset."
|
|
2834
|
+
)
|
|
2684
2835
|
})
|
|
2685
|
-
}).
|
|
2836
|
+
}).meta({
|
|
2837
|
+
description: "Generic autocomplete component designed for use with large dictionary-based datasets. The component supports dynamic retrieval of options from configurable data sources and is intended for datasets that may contain tens or hundreds of thousands of records.",
|
|
2838
|
+
id: "AutocompleteField"
|
|
2839
|
+
});
|
|
2686
2840
|
var SearchField = HttpField.extend({
|
|
2687
2841
|
type: import_v43.default.literal(FieldType.SEARCH),
|
|
2688
2842
|
configuration: SearchQuery.pick({
|
|
@@ -2715,6 +2869,9 @@ var SearchField = HttpField.extend({
|
|
|
2715
2869
|
ok: TranslationConfig.optional()
|
|
2716
2870
|
}).optional()
|
|
2717
2871
|
})
|
|
2872
|
+
}).meta({
|
|
2873
|
+
description: "A search input field",
|
|
2874
|
+
id: "SearchField"
|
|
2718
2875
|
});
|
|
2719
2876
|
var LinkButtonField = BaseField.extend({
|
|
2720
2877
|
type: import_v43.default.literal(FieldType.LINK_BUTTON),
|
|
@@ -2723,28 +2880,35 @@ var LinkButtonField = BaseField.extend({
|
|
|
2723
2880
|
text: TranslationConfig.describe("Text to display on the button"),
|
|
2724
2881
|
icon: import_v43.default.string().optional().describe("Icon for the button. You can find icons from OpenCRVS UI-Kit.")
|
|
2725
2882
|
})
|
|
2726
|
-
}).
|
|
2883
|
+
}).meta({
|
|
2884
|
+
description: "A button that opens a URL link",
|
|
2885
|
+
id: "LinkButtonField"
|
|
2886
|
+
});
|
|
2727
2887
|
var VerificationStatus = BaseField.extend({
|
|
2728
2888
|
type: import_v43.default.literal(FieldType.VERIFICATION_STATUS),
|
|
2729
|
-
defaultValue: VerificationStatusValue.optional(),
|
|
2889
|
+
defaultValue: VerificationStatusValue.or(ComputedDefaultValue).optional(),
|
|
2730
2890
|
configuration: import_v43.default.object({
|
|
2731
2891
|
status: TranslationConfig.describe("Text to display on the status pill."),
|
|
2732
2892
|
description: TranslationConfig.describe(
|
|
2733
2893
|
"Explaining text on the banner in form."
|
|
2734
2894
|
)
|
|
2735
2895
|
})
|
|
2896
|
+
}).meta({
|
|
2897
|
+
description: "Displays a verification state (e.g. ID verified / pending). Often paired with ID_READER \u2014 it can read its value off an ID_READER rather than holding its own.",
|
|
2898
|
+
id: "VerificationStatus"
|
|
2736
2899
|
});
|
|
2737
2900
|
var QueryParamReaderField = BaseField.extend({
|
|
2738
2901
|
type: import_v43.default.literal(FieldType.QUERY_PARAM_READER),
|
|
2739
2902
|
configuration: import_v43.default.object({
|
|
2740
2903
|
pickParams: import_v43.default.array(import_v43.default.string()).describe("List of query parameters to read from the URL")
|
|
2741
2904
|
})
|
|
2742
|
-
}).
|
|
2743
|
-
"A field that maps URL query params into form values and clears them afterward"
|
|
2744
|
-
|
|
2905
|
+
}).meta({
|
|
2906
|
+
description: "A field that maps URL query params into form values and clears them afterward",
|
|
2907
|
+
id: "QueryParamReaderField"
|
|
2908
|
+
});
|
|
2745
2909
|
var QrReaderField = BaseField.extend({
|
|
2746
2910
|
type: import_v43.default.literal(FieldType.QR_READER),
|
|
2747
|
-
defaultValue: QrReaderFieldValue.optional(),
|
|
2911
|
+
defaultValue: QrReaderFieldValue.or(ComputedDefaultValue).optional(),
|
|
2748
2912
|
configuration: import_v43.default.object({
|
|
2749
2913
|
validator: import_v43.default.any().meta({
|
|
2750
2914
|
description: "JSON Schema to validate the scanned QR code data against before populating the form fields.",
|
|
@@ -2752,21 +2916,27 @@ var QrReaderField = BaseField.extend({
|
|
|
2752
2916
|
})
|
|
2753
2917
|
}).optional()
|
|
2754
2918
|
}).meta({
|
|
2755
|
-
description: "
|
|
2919
|
+
description: "QR code reader field, including optional JSON Schema validator.",
|
|
2756
2920
|
id: "QrReaderField"
|
|
2757
2921
|
});
|
|
2758
2922
|
var IdReaderField = BaseField.extend({
|
|
2759
2923
|
type: import_v43.default.literal(FieldType.ID_READER),
|
|
2760
|
-
defaultValue: IdReaderFieldValue.optional(),
|
|
2924
|
+
defaultValue: IdReaderFieldValue.or(ComputedDefaultValue).optional(),
|
|
2761
2925
|
methods: import_v43.default.array(
|
|
2762
2926
|
import_v43.default.union([QrReaderField, LinkButtonField]).describe("Methods for reading an ID")
|
|
2763
2927
|
)
|
|
2928
|
+
}).meta({
|
|
2929
|
+
description: "A wrapper around nested form fields, specifically QR_READER and LINK_BUTTON. It can hold the QR_READERs value.",
|
|
2930
|
+
id: "IdReaderField"
|
|
2764
2931
|
});
|
|
2765
2932
|
var CustomField = BaseField.extend({
|
|
2766
2933
|
type: import_v43.default.literal(FieldType._EXPERIMENTAL_CUSTOM),
|
|
2767
2934
|
defaultValue: CustomFieldValue.optional(),
|
|
2768
2935
|
src: import_v43.default.string().describe("Module source path for the custom field component"),
|
|
2769
2936
|
configuration: import_v43.default.unknown().optional()
|
|
2937
|
+
}).meta({
|
|
2938
|
+
description: "An expiremental custom field that is defined by a module source path",
|
|
2939
|
+
id: "CustomField"
|
|
2770
2940
|
});
|
|
2771
2941
|
var FieldStyleVariant = import_v43.default.enum(["default", "highlighted"]);
|
|
2772
2942
|
var LoaderField = BaseField.extend({
|
|
@@ -2776,22 +2946,25 @@ var LoaderField = BaseField.extend({
|
|
|
2776
2946
|
configuration: import_v43.default.object({
|
|
2777
2947
|
text: TranslationConfig.describe("Display text above the loading spinner")
|
|
2778
2948
|
})
|
|
2779
|
-
}).
|
|
2780
|
-
"A non-interactive field that indicates an in progress operation in form"
|
|
2781
|
-
|
|
2949
|
+
}).meta({
|
|
2950
|
+
description: "A non-interactive field that indicates an in progress operation in form",
|
|
2951
|
+
id: "LoaderField"
|
|
2952
|
+
});
|
|
2782
2953
|
var HiddenField = BaseField.extend({
|
|
2783
2954
|
type: import_v43.default.literal(FieldType.ALPHA_HIDDEN),
|
|
2784
2955
|
required: import_v43.default.boolean().default(false).optional(),
|
|
2785
2956
|
defaultValue: TextValue.optional()
|
|
2786
|
-
}).
|
|
2787
|
-
"A non-interactive, hidden field that only hold a value in the form"
|
|
2788
|
-
|
|
2957
|
+
}).meta({
|
|
2958
|
+
description: "A non-interactive, hidden field that only hold a value in the form",
|
|
2959
|
+
id: "HiddenField"
|
|
2960
|
+
});
|
|
2789
2961
|
var UserRoleField = BaseField.extend({
|
|
2790
2962
|
type: import_v43.default.literal(FieldType.USER_ROLE),
|
|
2791
2963
|
defaultValue: TextValue.optional()
|
|
2792
|
-
}).
|
|
2793
|
-
"A select dropdown that is automatically populated with available user roles"
|
|
2794
|
-
|
|
2964
|
+
}).meta({
|
|
2965
|
+
description: "A select dropdown that is automatically populated with available user roles",
|
|
2966
|
+
id: "UserRoleField"
|
|
2967
|
+
});
|
|
2795
2968
|
var FieldConfig = import_v43.default.discriminatedUnion("type", [
|
|
2796
2969
|
FieldGroup,
|
|
2797
2970
|
Address,
|
|
@@ -2891,15 +3064,18 @@ var VerificationPageConfig = FormPageConfig.extend({
|
|
|
2891
3064
|
actions: VerificationActionConfig
|
|
2892
3065
|
});
|
|
2893
3066
|
var PageConfig = z21.discriminatedUnion("type", [FormPageConfig, VerificationPageConfig]).meta({
|
|
2894
|
-
|
|
2895
|
-
|
|
3067
|
+
id: "PageConfig",
|
|
3068
|
+
description: "Configuration for a single page in a form. Either a form page with fields and a continue button, or a verification page with verify/cancel options."
|
|
2896
3069
|
});
|
|
2897
3070
|
|
|
2898
3071
|
// ../commons/src/events/FormConfig.ts
|
|
2899
3072
|
var DeclarationFormConfig = z22.object({
|
|
2900
3073
|
label: TranslationConfig.describe("Human readable description of the form"),
|
|
2901
3074
|
pages: z22.array(FormPageConfig)
|
|
2902
|
-
}).
|
|
3075
|
+
}).meta({
|
|
3076
|
+
id: "DeclarationFormConfig",
|
|
3077
|
+
description: "Configuration of the declaration form."
|
|
3078
|
+
});
|
|
2903
3079
|
var ActionFormConfig = z22.object({
|
|
2904
3080
|
label: TranslationConfig.describe("Human readable description of the form"),
|
|
2905
3081
|
pages: z22.array(PageConfig)
|
|
@@ -2999,6 +3175,9 @@ var DeduplicationConfig = z23.object({
|
|
|
2999
3175
|
id: z23.string(),
|
|
3000
3176
|
label: TranslationConfig,
|
|
3001
3177
|
query: Clause
|
|
3178
|
+
}).meta({
|
|
3179
|
+
id: "DeduplicationConfig",
|
|
3180
|
+
description: "Configuration for duplicate detection on a declare or register action. The query is built from fuzzy / strict / date-range matchers combined with and/or/not."
|
|
3002
3181
|
});
|
|
3003
3182
|
|
|
3004
3183
|
// ../commons/src/events/ActionConfig.ts
|
|
@@ -3116,17 +3295,42 @@ var ActionConfig = z24.discriminatedUnion("type", [
|
|
|
3116
3295
|
* OpenAPI references are defined here so our generated OpenAPI spec knows to reuse the models
|
|
3117
3296
|
* and treat them as "models" instead of duplicating the data structure in each endpoint.
|
|
3118
3297
|
*/
|
|
3119
|
-
ReadActionConfig.meta({
|
|
3120
|
-
|
|
3121
|
-
|
|
3122
|
-
|
|
3298
|
+
ReadActionConfig.meta({
|
|
3299
|
+
id: "ReadActionConfig",
|
|
3300
|
+
description: "Configuration for the read action \u2014 defines the record-tab content displayed on the event overview page."
|
|
3301
|
+
}),
|
|
3302
|
+
DeclareConfig.meta({
|
|
3303
|
+
id: "DeclareActionConfig",
|
|
3304
|
+
description: "Configuration for the declare action. Includes review-page fields. Shared with the notify action (ActionType.NOTIFY)."
|
|
3305
|
+
}),
|
|
3306
|
+
RejectConfig.meta({
|
|
3307
|
+
id: "RejectActionConfig",
|
|
3308
|
+
description: "Configuration for rejecting a record before registration."
|
|
3309
|
+
}),
|
|
3310
|
+
RegisterConfig.meta({
|
|
3311
|
+
id: "RegisterActionConfig",
|
|
3312
|
+
description: "Configuration for registering a record."
|
|
3313
|
+
}),
|
|
3123
3314
|
PrintCertificateActionConfig.meta({
|
|
3124
|
-
id: "PrintCertificateActionConfig"
|
|
3315
|
+
id: "PrintCertificateActionConfig",
|
|
3316
|
+
description: "Configuration for printing a certificate of a registered record."
|
|
3317
|
+
}),
|
|
3318
|
+
RequestCorrectionConfig.meta({
|
|
3319
|
+
id: "RequestCorrectionActionConfig",
|
|
3320
|
+
description: "Configuration for requesting a correction on a registered record."
|
|
3321
|
+
}),
|
|
3322
|
+
EditActionConfig.meta({
|
|
3323
|
+
id: "EditActionConfig",
|
|
3324
|
+
description: "Configuration for editing a record before registration."
|
|
3325
|
+
}),
|
|
3326
|
+
ArchiveConfig.meta({
|
|
3327
|
+
id: "ArchiveActionConfig",
|
|
3328
|
+
description: "Configuration for archiving a record."
|
|
3125
3329
|
}),
|
|
3126
|
-
|
|
3127
|
-
|
|
3128
|
-
|
|
3129
|
-
|
|
3330
|
+
CustomActionConfig.meta({
|
|
3331
|
+
id: "CustomActionConfig",
|
|
3332
|
+
description: "Configuration for a country-defined custom action. An event may include any number of these."
|
|
3333
|
+
})
|
|
3130
3334
|
]).describe(
|
|
3131
3335
|
"Configuration of an action available for an event. Data collected depends on the action type and is accessible through the annotation property in ActionDocument."
|
|
3132
3336
|
).meta({ id: "ActionConfig" });
|
|
@@ -3202,7 +3406,10 @@ var Field = BaseField2.extend({
|
|
|
3202
3406
|
}).describe("Custom field defined for the summary view.");
|
|
3203
3407
|
var SummaryConfig = z27.object({
|
|
3204
3408
|
fields: z27.array(z27.union([Field, ReferenceField])).describe("Fields displayed in the event summary view.")
|
|
3205
|
-
}).
|
|
3409
|
+
}).meta({
|
|
3410
|
+
id: "SummaryConfig",
|
|
3411
|
+
description: "Configuration of the event overview page. Defines which declaration fields appear in the record summary, optionally with custom labels, empty-value messages, and templated values."
|
|
3412
|
+
});
|
|
3206
3413
|
|
|
3207
3414
|
// ../commons/src/events/AdvancedSearchConfig.ts
|
|
3208
3415
|
var z28 = __toESM(require("zod/v4"));
|
|
@@ -3273,6 +3480,9 @@ var BaseField3 = z28.object({
|
|
|
3273
3480
|
),
|
|
3274
3481
|
validations: z28.array(ValidationConfig).optional().describe(
|
|
3275
3482
|
`Option for overriding the field validations specifically for advanced search form.`
|
|
3483
|
+
),
|
|
3484
|
+
allowedLocations: JurisdictionReference.optional().describe(
|
|
3485
|
+
`Override the allowedLocations for a location field in advanced search. Use this when the declaration form's allowedLocations references a scope (e.g. record.create) that search-only users don't have \u2014 specify record.search scope instead.`
|
|
3276
3486
|
)
|
|
3277
3487
|
});
|
|
3278
3488
|
var SearchQueryParams = z28.object({
|
|
@@ -3326,6 +3536,9 @@ var AdvancedSearchField = z28.discriminatedUnion("fieldType", [FieldConfigSchema
|
|
|
3326
3536
|
var AdvancedSearchConfig = z28.object({
|
|
3327
3537
|
title: TranslationConfig.describe("Advanced search tab title"),
|
|
3328
3538
|
fields: z28.array(AdvancedSearchField).describe("Advanced search fields within the tab.")
|
|
3539
|
+
}).meta({
|
|
3540
|
+
id: "AdvancedSearchConfig",
|
|
3541
|
+
description: "Configuration of one advanced search tab. Each tab has a title and a list of searchable fields \u2014 either declaration fields (via `field()`) or event metadata (via `event()`)."
|
|
3329
3542
|
});
|
|
3330
3543
|
|
|
3331
3544
|
// ../commons/src/events/utils.ts
|
|
@@ -3344,9 +3557,11 @@ var z30 = __toESM(require("zod/v4"));
|
|
|
3344
3557
|
var z29 = __toESM(require("zod/v4"));
|
|
3345
3558
|
function getDynamicNameValue(field3) {
|
|
3346
3559
|
const nameConfiguration = field3.configuration?.name;
|
|
3560
|
+
const firstnameRequired = nameConfiguration?.firstname?.required ?? field3.required;
|
|
3561
|
+
const surnameRequired = nameConfiguration?.surname?.required ?? field3.required;
|
|
3347
3562
|
return z29.object({
|
|
3348
|
-
firstname:
|
|
3349
|
-
surname:
|
|
3563
|
+
firstname: firstnameRequired ? NonEmptyTextValue : TextValue,
|
|
3564
|
+
surname: surnameRequired ? NonEmptyTextValue : TextValue,
|
|
3350
3565
|
middlename: nameConfiguration?.middlename?.required ? NonEmptyTextValue : TextValue.optional()
|
|
3351
3566
|
});
|
|
3352
3567
|
}
|
|
@@ -3729,7 +3944,37 @@ function resolveDataPath(rootData, dataPath, instancePath) {
|
|
|
3729
3944
|
}
|
|
3730
3945
|
return current;
|
|
3731
3946
|
}
|
|
3947
|
+
function todayISO() {
|
|
3948
|
+
return (0, import_date_fns.formatISO)(/* @__PURE__ */ new Date(), { representation: "date" });
|
|
3949
|
+
}
|
|
3950
|
+
var compiledFunctionCache = /* @__PURE__ */ new Map();
|
|
3951
|
+
function compileClientFunction(code) {
|
|
3952
|
+
let fn = compiledFunctionCache.get(code);
|
|
3953
|
+
if (!fn) {
|
|
3954
|
+
fn = new Function(`return (${code})`)();
|
|
3955
|
+
compiledFunctionCache.set(code, fn);
|
|
3956
|
+
}
|
|
3957
|
+
return fn;
|
|
3958
|
+
}
|
|
3732
3959
|
(0, import_ajv_formats.default)(ajv);
|
|
3960
|
+
function buildClientFunctionContext(input) {
|
|
3961
|
+
return {
|
|
3962
|
+
$form: input.form,
|
|
3963
|
+
$now: todayISO(),
|
|
3964
|
+
// eslint-disable-next-line @typescript-eslint/no-use-before-define
|
|
3965
|
+
$online: isOnline(),
|
|
3966
|
+
$user: input.validatorContext?.user,
|
|
3967
|
+
$event: input.validatorContext?.event,
|
|
3968
|
+
$leafAdminStructureLocationIds: input.validatorContext?.leafAdminStructureLocationIds ?? [],
|
|
3969
|
+
user: input.systemVariables?.user,
|
|
3970
|
+
$window: input.systemVariables?.$window,
|
|
3971
|
+
locations: input.locations,
|
|
3972
|
+
adminLevelIds: input.adminLevelIds
|
|
3973
|
+
};
|
|
3974
|
+
}
|
|
3975
|
+
function runClientFunction(code, data, context) {
|
|
3976
|
+
return compileClientFunction(code)(data, context);
|
|
3977
|
+
}
|
|
3733
3978
|
ajv.addKeyword({
|
|
3734
3979
|
keyword: "daysFromDate",
|
|
3735
3980
|
type: "string",
|
|
@@ -3774,7 +4019,7 @@ ajv.addKeyword({
|
|
|
3774
4019
|
$data: true,
|
|
3775
4020
|
errors: true,
|
|
3776
4021
|
// @ts-ignore -- Force type. We will move this away from AJV next. Parsing the array will take seconds and is only called by core.
|
|
3777
|
-
validate(
|
|
4022
|
+
validate(_schema, data, _2, dataContext) {
|
|
3778
4023
|
const locationIdInput = data;
|
|
3779
4024
|
const locations = dataContext?.rootData.$leafAdminStructureLocationIds ?? [];
|
|
3780
4025
|
return locations.some((location) => location.id === locationIdInput);
|
|
@@ -3805,6 +4050,23 @@ function isAgeValue(value) {
|
|
|
3805
4050
|
function mergeWithBaseFormState(values, context) {
|
|
3806
4051
|
return { ...context.baseFormState, ...values };
|
|
3807
4052
|
}
|
|
4053
|
+
ajv.addKeyword({
|
|
4054
|
+
keyword: "customClientValidator",
|
|
4055
|
+
schemaType: "object",
|
|
4056
|
+
errors: true,
|
|
4057
|
+
// @ts-expect-error -- AJV's public types don't expose `rootData`. All
|
|
4058
|
+
// `validate()` callers build root data via `buildClientFunctionContext`,
|
|
4059
|
+
// so the cast holds.
|
|
4060
|
+
validate(schema, data, _2, dataContext) {
|
|
4061
|
+
return Boolean(
|
|
4062
|
+
runClientFunction(
|
|
4063
|
+
schema.code,
|
|
4064
|
+
data,
|
|
4065
|
+
dataContext?.rootData ?? buildClientFunctionContext({ form: {} })
|
|
4066
|
+
)
|
|
4067
|
+
);
|
|
4068
|
+
}
|
|
4069
|
+
});
|
|
3808
4070
|
function validate(schema, data) {
|
|
3809
4071
|
const validator = ajv.getSchema(schema.$id) || ajv.compile(schema);
|
|
3810
4072
|
if ("$form" in data) {
|
|
@@ -3841,17 +4103,14 @@ function isOnline() {
|
|
|
3841
4103
|
}
|
|
3842
4104
|
return true;
|
|
3843
4105
|
}
|
|
3844
|
-
function isConditionMet(conditional, values, context
|
|
3845
|
-
return validate(
|
|
3846
|
-
|
|
3847
|
-
|
|
3848
|
-
|
|
3849
|
-
|
|
3850
|
-
|
|
3851
|
-
|
|
3852
|
-
$status: eventIndex?.status,
|
|
3853
|
-
$event: context.event
|
|
3854
|
-
});
|
|
4106
|
+
function isConditionMet(conditional, values, context) {
|
|
4107
|
+
return validate(
|
|
4108
|
+
conditional,
|
|
4109
|
+
buildClientFunctionContext({
|
|
4110
|
+
form: mergeWithBaseFormState(values, context),
|
|
4111
|
+
validatorContext: context
|
|
4112
|
+
})
|
|
4113
|
+
);
|
|
3855
4114
|
}
|
|
3856
4115
|
function getConditionalActionsForField(field3, values) {
|
|
3857
4116
|
if (!field3.conditionals) {
|
|
@@ -3859,9 +4118,9 @@ function getConditionalActionsForField(field3, values) {
|
|
|
3859
4118
|
}
|
|
3860
4119
|
return field3.conditionals.filter((conditional) => validate(conditional.conditional, values)).map((conditional) => conditional.type);
|
|
3861
4120
|
}
|
|
3862
|
-
function areConditionsMet(conditions, values, context,
|
|
4121
|
+
function areConditionsMet(conditions, values, context, _event) {
|
|
3863
4122
|
return conditions.every(
|
|
3864
|
-
(condition) => isConditionMet(condition.conditional, values, context
|
|
4123
|
+
(condition) => isConditionMet(condition.conditional, values, context)
|
|
3865
4124
|
);
|
|
3866
4125
|
}
|
|
3867
4126
|
function isFieldConditionMet(field3, form, conditionalType, context) {
|
|
@@ -3871,14 +4130,13 @@ function isFieldConditionMet(field3, form, conditionalType, context) {
|
|
|
3871
4130
|
if (!hasRule) {
|
|
3872
4131
|
return true;
|
|
3873
4132
|
}
|
|
3874
|
-
const validConditionals = getConditionalActionsForField(
|
|
3875
|
-
|
|
3876
|
-
|
|
3877
|
-
|
|
3878
|
-
|
|
3879
|
-
|
|
3880
|
-
|
|
3881
|
-
});
|
|
4133
|
+
const validConditionals = getConditionalActionsForField(
|
|
4134
|
+
field3,
|
|
4135
|
+
buildClientFunctionContext({
|
|
4136
|
+
form: mergeWithBaseFormState(form, context),
|
|
4137
|
+
validatorContext: context
|
|
4138
|
+
})
|
|
4139
|
+
);
|
|
3882
4140
|
return validConditionals.includes(conditionalType);
|
|
3883
4141
|
}
|
|
3884
4142
|
function isFieldVisible(field3, form, context) {
|
|
@@ -3904,7 +4162,14 @@ function isActionConditionMet(actionConfig, event2, context, conditionalType) {
|
|
|
3904
4162
|
if (!rule) {
|
|
3905
4163
|
return true;
|
|
3906
4164
|
}
|
|
3907
|
-
return
|
|
4165
|
+
return validate(rule.conditional, {
|
|
4166
|
+
...buildClientFunctionContext({
|
|
4167
|
+
form: mergeWithBaseFormState(event2.declaration, context),
|
|
4168
|
+
validatorContext: context
|
|
4169
|
+
}),
|
|
4170
|
+
$flags: event2.flags,
|
|
4171
|
+
$status: event2.status
|
|
4172
|
+
});
|
|
3908
4173
|
}
|
|
3909
4174
|
function isActionEnabled(actionConfig, event2, context) {
|
|
3910
4175
|
return isActionConditionMet(
|
|
@@ -4063,19 +4328,10 @@ function runFieldValidations({
|
|
|
4063
4328
|
if (!isFieldVisible(field3.config, form, context)) {
|
|
4064
4329
|
return [];
|
|
4065
4330
|
}
|
|
4066
|
-
const conditionalParameters = {
|
|
4067
|
-
|
|
4068
|
-
|
|
4069
|
-
|
|
4070
|
-
* In real use cases, there can be hundreds of thousands of locations.
|
|
4071
|
-
* Make sure that the context contains only the locations that are needed for validation.
|
|
4072
|
-
* E.g. if the user is a leaf admin, only the leaf locations under their admin structure are needed.
|
|
4073
|
-
* Loading few megabytes of locations to memory just for validation is not efficient and will choke the application.
|
|
4074
|
-
*/
|
|
4075
|
-
$leafAdminStructureLocationIds: context.leafAdminStructureLocationIds ?? [],
|
|
4076
|
-
$online: isOnline(),
|
|
4077
|
-
$user: context.user
|
|
4078
|
-
};
|
|
4331
|
+
const conditionalParameters = buildClientFunctionContext({
|
|
4332
|
+
form: mergeWithBaseFormState(form, context),
|
|
4333
|
+
validatorContext: context
|
|
4334
|
+
});
|
|
4079
4335
|
if (isFieldGroupFieldType(field3)) {
|
|
4080
4336
|
const subfieldErrors = buildFormState(
|
|
4081
4337
|
field3.config.fields,
|
|
@@ -4559,19 +4815,32 @@ function getPendingAction(actions) {
|
|
|
4559
4815
|
}
|
|
4560
4816
|
return pendingActions[0];
|
|
4561
4817
|
}
|
|
4562
|
-
function getCompleteActionAnnotation(
|
|
4818
|
+
function getCompleteActionAnnotation(event2, action) {
|
|
4563
4819
|
if (action.originalActionId) {
|
|
4564
4820
|
const originalAction = event2.actions.find(
|
|
4565
4821
|
({ id }) => id === action.originalActionId
|
|
4566
4822
|
);
|
|
4567
4823
|
if (originalAction?.status === ActionStatus.Requested) {
|
|
4568
|
-
return deepMerge(
|
|
4569
|
-
deepMerge(annotation, originalAction.annotation ?? {}),
|
|
4570
|
-
action.annotation ?? {}
|
|
4571
|
-
);
|
|
4824
|
+
return deepMerge(originalAction.annotation ?? {}, action.annotation ?? {});
|
|
4572
4825
|
}
|
|
4573
4826
|
}
|
|
4574
|
-
return
|
|
4827
|
+
return action.annotation ?? {};
|
|
4828
|
+
}
|
|
4829
|
+
function getCompleteActionContent(event2, action) {
|
|
4830
|
+
const currentContent = "content" in action ? action.content : void 0;
|
|
4831
|
+
if (!action.originalActionId) {
|
|
4832
|
+
return currentContent;
|
|
4833
|
+
}
|
|
4834
|
+
const originalAction = event2.actions.find(
|
|
4835
|
+
({ id }) => id === action.originalActionId
|
|
4836
|
+
);
|
|
4837
|
+
if (originalAction && "content" in originalAction && originalAction.content) {
|
|
4838
|
+
return {
|
|
4839
|
+
...originalAction.content,
|
|
4840
|
+
...currentContent ?? {}
|
|
4841
|
+
};
|
|
4842
|
+
}
|
|
4843
|
+
return currentContent;
|
|
4575
4844
|
}
|
|
4576
4845
|
function getCompleteActionDeclaration(declaration, event2, action) {
|
|
4577
4846
|
if (action.originalActionId) {
|
|
@@ -4591,7 +4860,7 @@ function getAcceptedActions(event2) {
|
|
|
4591
4860
|
return event2.actions.filter(isAcceptedAction).map((action) => ({
|
|
4592
4861
|
...action,
|
|
4593
4862
|
declaration: getCompleteActionDeclaration({}, event2, action),
|
|
4594
|
-
annotation: getCompleteActionAnnotation(
|
|
4863
|
+
annotation: getCompleteActionAnnotation(event2, action)
|
|
4595
4864
|
}));
|
|
4596
4865
|
}
|
|
4597
4866
|
var EXCLUDED_ACTIONS = [
|
|
@@ -4679,6 +4948,9 @@ function not(condition) {
|
|
|
4679
4948
|
function never2() {
|
|
4680
4949
|
return not(alwaysTrue());
|
|
4681
4950
|
}
|
|
4951
|
+
function always() {
|
|
4952
|
+
return defineConditional(alwaysTrue());
|
|
4953
|
+
}
|
|
4682
4954
|
function jsonFieldPath(field3) {
|
|
4683
4955
|
return [field3.$$field, ...field3.$$subfield].join("/");
|
|
4684
4956
|
}
|
|
@@ -5226,7 +5498,54 @@ function createFieldConditionals(fieldId) {
|
|
|
5226
5498
|
}
|
|
5227
5499
|
},
|
|
5228
5500
|
required: [fieldId]
|
|
5229
|
-
})
|
|
5501
|
+
}),
|
|
5502
|
+
/**
|
|
5503
|
+
* Custom client-side validator. The provided function is serialised and executed
|
|
5504
|
+
* just-in-time on the client only. External references (e.g. lodash) are not
|
|
5505
|
+
* available inside the function body — all logic must be self-contained.
|
|
5506
|
+
*
|
|
5507
|
+
* @example
|
|
5508
|
+
* field('nid').customClientValidator((value) => {
|
|
5509
|
+
* // LUHN check — all logic must be inline
|
|
5510
|
+
* const digits = String(value).split('').map(Number)
|
|
5511
|
+
* // ...
|
|
5512
|
+
* return isValid
|
|
5513
|
+
* })
|
|
5514
|
+
*/
|
|
5515
|
+
customClientValidator(validationFn) {
|
|
5516
|
+
const code = validationFn.toString();
|
|
5517
|
+
return defineFormConditional({
|
|
5518
|
+
type: "object",
|
|
5519
|
+
properties: wrapToPath(
|
|
5520
|
+
{ [fieldId]: { customClientValidator: { code } } },
|
|
5521
|
+
this.$$subfield
|
|
5522
|
+
),
|
|
5523
|
+
required: [fieldId]
|
|
5524
|
+
});
|
|
5525
|
+
},
|
|
5526
|
+
/**
|
|
5527
|
+
* Custom client-side evaluation. Returns a {@link FieldReference} descriptor
|
|
5528
|
+
* that can be used as the `value` property or a DATA component entry.
|
|
5529
|
+
* The function receives the referenced field's value as the first argument and
|
|
5530
|
+
* the full form context as the second; its return value replaces the field reference.
|
|
5531
|
+
* The function is serialised and executed just-in-time on the client only.
|
|
5532
|
+
* External references (e.g. lodash) are not available inside the function body.
|
|
5533
|
+
*
|
|
5534
|
+
* For computing a default value without referencing a specific field, use
|
|
5535
|
+
* `evaluate(fn)` in the `defaultValue` property instead.
|
|
5536
|
+
*
|
|
5537
|
+
* @example
|
|
5538
|
+
* field('a').customClientEvaluation((aValue, ctx) =>
|
|
5539
|
+
* Number(aValue) + Number(ctx.$form.b)
|
|
5540
|
+
* )
|
|
5541
|
+
*/
|
|
5542
|
+
customClientEvaluation(computationFn) {
|
|
5543
|
+
return {
|
|
5544
|
+
$$code: computationFn.toString(),
|
|
5545
|
+
$$field: fieldId,
|
|
5546
|
+
$$subfield: this.$$subfield
|
|
5547
|
+
};
|
|
5548
|
+
}
|
|
5230
5549
|
};
|
|
5231
5550
|
}
|
|
5232
5551
|
|
|
@@ -5399,8 +5718,9 @@ var EventConfig = _EventConfigBase.superRefine((event2, ctx) => {
|
|
|
5399
5718
|
validateActionFlags(event2, ctx);
|
|
5400
5719
|
validateActionOrder(event2, ctx);
|
|
5401
5720
|
}).meta({
|
|
5402
|
-
id: "EventConfig"
|
|
5403
|
-
|
|
5721
|
+
id: "EventConfig",
|
|
5722
|
+
description: "Configuration defining an event type registered in OpenCRVS (for example birth or death)."
|
|
5723
|
+
});
|
|
5404
5724
|
|
|
5405
5725
|
// ../commons/src/events/EventConfigInput.ts
|
|
5406
5726
|
var defineDeclarationForm = (form) => DeclarationFormConfig.parse(form);
|
|
@@ -5623,6 +5943,9 @@ var WorkqueueColumnValue = z34.object({
|
|
|
5623
5943
|
var WorkqueueColumn = z34.object({
|
|
5624
5944
|
label: TranslationConfig,
|
|
5625
5945
|
value: WorkqueueColumnValue
|
|
5946
|
+
}).meta({
|
|
5947
|
+
id: "WorkqueueColumn",
|
|
5948
|
+
description: "Configuration for a single workqueue column. The value references an event metadata key (e.g. `dateOfEvent`, `status`, `trackingId`)."
|
|
5626
5949
|
});
|
|
5627
5950
|
function defineWorkqueuesColumns(workqueueColumns) {
|
|
5628
5951
|
return workqueueColumns.map(
|
|
@@ -5828,8 +6151,8 @@ var WorkqueueConfigWithoutQuery = WorkqueueConfig.omit({
|
|
|
5828
6151
|
var WorkqueueConfigInput = WorkqueueConfig.extend({
|
|
5829
6152
|
query: CountryConfigQueryInputType
|
|
5830
6153
|
}).meta({
|
|
5831
|
-
|
|
5832
|
-
|
|
6154
|
+
id: "WorkqueueConfig",
|
|
6155
|
+
description: "Configuration for a single workqueue. Defines the filter applied to the event index, the quick-action button, the columns shown on each row, and the message rendered when the queue is empty."
|
|
5833
6156
|
});
|
|
5834
6157
|
function defineWorkqueue(workqueueInput) {
|
|
5835
6158
|
const queryInput = workqueueInput.query;
|
|
@@ -5892,7 +6215,9 @@ var BaseActionInput = z38.object({
|
|
|
5892
6215
|
keepAssignment: z38.boolean().optional(),
|
|
5893
6216
|
keepAssignmentIfAccepted: z38.boolean().optional(),
|
|
5894
6217
|
keepAssignmentIfRejected: z38.boolean().optional(),
|
|
5895
|
-
waitFor: z38.boolean().
|
|
6218
|
+
waitFor: z38.boolean().default(true).describe(
|
|
6219
|
+
"Whether action waits for the indexing before returning. Defaults to true. Setting this to to false completes faster but might lead to stale data in the client if the client tries to read the event immediately after performing the action. Use with care."
|
|
6220
|
+
),
|
|
5896
6221
|
// For normal users, the createdAtLocation is resolved on the backend from the user's primaryOfficeId.
|
|
5897
6222
|
// @TODO: createdAtLocation should be limited to actions that system users can perform. For normal users, it should not be part of the base action.
|
|
5898
6223
|
createdAtLocation: UUID.nullish().describe(
|
|
@@ -6010,7 +6335,8 @@ var RejectCorrectionActionInput = BaseActionInput.extend(
|
|
|
6010
6335
|
var ApproveCorrectionActionInput = BaseActionInput.extend(
|
|
6011
6336
|
z38.object({
|
|
6012
6337
|
requestId: z38.string(),
|
|
6013
|
-
type: z38.literal(ActionType.APPROVE_CORRECTION).default(ActionType.APPROVE_CORRECTION)
|
|
6338
|
+
type: z38.literal(ActionType.APPROVE_CORRECTION).default(ActionType.APPROVE_CORRECTION),
|
|
6339
|
+
content: z38.object({ immediateCorrection: z38.boolean().optional() }).optional()
|
|
6014
6340
|
}).shape
|
|
6015
6341
|
);
|
|
6016
6342
|
var ReadActionInput = BaseActionInput.extend(
|
|
@@ -6072,7 +6398,7 @@ var Draft = z39.object({
|
|
|
6072
6398
|
}).describe(
|
|
6073
6399
|
"A temporary storage for an action. Stored with details of the event, creator and creation time."
|
|
6074
6400
|
);
|
|
6075
|
-
var DraftInput = BaseActionInput.extend({
|
|
6401
|
+
var DraftInput = BaseActionInput.omit({ waitFor: true }).extend({
|
|
6076
6402
|
type: ActionTypes.exclude([ActionTypes.enum.DELETE]),
|
|
6077
6403
|
status: z39.enum([
|
|
6078
6404
|
ActionStatus.Requested,
|
|
@@ -6173,7 +6499,7 @@ function getActionUpdateMetadata(actions) {
|
|
|
6173
6499
|
"createdAtLocation",
|
|
6174
6500
|
"createdByRole"
|
|
6175
6501
|
];
|
|
6176
|
-
return actions.filter(({ type }) => updateActions.safeParse(type).success).
|
|
6502
|
+
return actions.filter(({ type }) => updateActions.safeParse(type).success).reduce(
|
|
6177
6503
|
(_2, action) => {
|
|
6178
6504
|
if (action.originalActionId) {
|
|
6179
6505
|
const originalAction = actions.find(({ id }) => id === action.originalActionId) ?? action;
|
|
@@ -6203,26 +6529,43 @@ var import_date_fns3 = require("date-fns");
|
|
|
6203
6529
|
function isEditInProgress(actions) {
|
|
6204
6530
|
return actions.at(-1)?.type === ActionType.EDIT;
|
|
6205
6531
|
}
|
|
6532
|
+
function findPendingCorrectionAction(writeActions2) {
|
|
6533
|
+
let correctionRequestAction;
|
|
6534
|
+
for (let i = writeActions2.length - 1; i >= 0; i--) {
|
|
6535
|
+
const action = writeActions2[i];
|
|
6536
|
+
if (action.type === ActionType.APPROVE_CORRECTION || action.type === ActionType.REJECT_CORRECTION) {
|
|
6537
|
+
break;
|
|
6538
|
+
}
|
|
6539
|
+
if (action.type === ActionType.REQUEST_CORRECTION) {
|
|
6540
|
+
correctionRequestAction = action;
|
|
6541
|
+
break;
|
|
6542
|
+
}
|
|
6543
|
+
}
|
|
6544
|
+
return correctionRequestAction;
|
|
6545
|
+
}
|
|
6206
6546
|
function isCorrectionRequested(actions) {
|
|
6547
|
+
return findPendingCorrectionAction(actions) !== void 0;
|
|
6548
|
+
}
|
|
6549
|
+
function isDeclarationIncomplete(actions) {
|
|
6550
|
+
return getStatusFromActions(actions) === EventStatus.enum.NOTIFIED;
|
|
6551
|
+
}
|
|
6552
|
+
function isRejected(actions) {
|
|
6553
|
+
const resettingActionTypes = [
|
|
6554
|
+
ActionType.NOTIFY,
|
|
6555
|
+
ActionType.DECLARE,
|
|
6556
|
+
ActionType.EDIT,
|
|
6557
|
+
ActionType.REGISTER
|
|
6558
|
+
];
|
|
6207
6559
|
return actions.reduce((prev, { type }) => {
|
|
6208
|
-
if (type === ActionType.
|
|
6560
|
+
if (type === ActionType.REJECT) {
|
|
6209
6561
|
return true;
|
|
6210
6562
|
}
|
|
6211
|
-
if (type
|
|
6212
|
-
return false;
|
|
6213
|
-
}
|
|
6214
|
-
if (type === ActionType.REJECT_CORRECTION) {
|
|
6563
|
+
if (resettingActionTypes.includes(type)) {
|
|
6215
6564
|
return false;
|
|
6216
6565
|
}
|
|
6217
6566
|
return prev;
|
|
6218
6567
|
}, false);
|
|
6219
6568
|
}
|
|
6220
|
-
function isDeclarationIncomplete(actions) {
|
|
6221
|
-
return getStatusFromActions(actions) === EventStatus.enum.NOTIFIED;
|
|
6222
|
-
}
|
|
6223
|
-
function isRejected(actions) {
|
|
6224
|
-
return actions.at(-1)?.type === ActionType.REJECT;
|
|
6225
|
-
}
|
|
6226
6569
|
function isPotentialDuplicate(actions) {
|
|
6227
6570
|
return actions.reduce((prev, { type }) => {
|
|
6228
6571
|
if (type === ActionType.DUPLICATE_DETECTED) {
|
|
@@ -6285,8 +6628,7 @@ function resolveEventCustomFlags(event2, eventConfiguration) {
|
|
|
6285
6628
|
return (0, import_lodash3.uniq)(flags);
|
|
6286
6629
|
}, []);
|
|
6287
6630
|
}
|
|
6288
|
-
function
|
|
6289
|
-
const sortedActions = event2.actions.filter(({ type }) => !isMetaAction(type)).sort((a, b) => a.createdAt.localeCompare(b.createdAt));
|
|
6631
|
+
function getActionStatusFlags(sortedActions) {
|
|
6290
6632
|
const actionStatus = sortedActions.reduce(
|
|
6291
6633
|
(actionStatuses, { type, status: status2 }) => ({
|
|
6292
6634
|
...actionStatuses,
|
|
@@ -6294,26 +6636,40 @@ function getEventFlags(event2, config) {
|
|
|
6294
6636
|
}),
|
|
6295
6637
|
{}
|
|
6296
6638
|
);
|
|
6297
|
-
|
|
6639
|
+
return Object.entries(actionStatus).filter(([, status2]) => status2 !== ActionStatus.Accepted).map(([type, status2]) => {
|
|
6298
6640
|
const flag2 = joinValues([type, status2], ":").toLowerCase();
|
|
6299
6641
|
return flag2;
|
|
6300
6642
|
});
|
|
6301
|
-
|
|
6302
|
-
|
|
6643
|
+
}
|
|
6644
|
+
function getInherentFlags(sortedActions) {
|
|
6645
|
+
const acceptedActions = sortedActions.filter(
|
|
6646
|
+
({ status: status2 }) => status2 === ActionStatus.Accepted
|
|
6647
|
+
);
|
|
6648
|
+
const inherentFlags = [];
|
|
6649
|
+
if (isCorrectionRequested(acceptedActions)) {
|
|
6650
|
+
inherentFlags.push(InherentFlags.CORRECTION_REQUESTED);
|
|
6303
6651
|
}
|
|
6304
|
-
if (isDeclarationIncomplete(
|
|
6305
|
-
|
|
6652
|
+
if (isDeclarationIncomplete(acceptedActions)) {
|
|
6653
|
+
inherentFlags.push(InherentFlags.INCOMPLETE);
|
|
6306
6654
|
}
|
|
6307
|
-
if (isRejected(
|
|
6308
|
-
|
|
6655
|
+
if (isRejected(acceptedActions)) {
|
|
6656
|
+
inherentFlags.push(InherentFlags.REJECTED);
|
|
6309
6657
|
}
|
|
6310
|
-
if (isPotentialDuplicate(
|
|
6311
|
-
|
|
6658
|
+
if (isPotentialDuplicate(acceptedActions)) {
|
|
6659
|
+
inherentFlags.push(InherentFlags.POTENTIAL_DUPLICATE);
|
|
6312
6660
|
}
|
|
6313
|
-
if (isEditInProgress(
|
|
6314
|
-
|
|
6661
|
+
if (isEditInProgress(acceptedActions)) {
|
|
6662
|
+
inherentFlags.push(InherentFlags.EDIT_IN_PROGRESS);
|
|
6315
6663
|
}
|
|
6316
|
-
return
|
|
6664
|
+
return inherentFlags;
|
|
6665
|
+
}
|
|
6666
|
+
function getEventFlags(event2, config) {
|
|
6667
|
+
const sortedActions = event2.actions.filter(({ type }) => !isMetaAction(type)).sort((a, b) => a.createdAt.localeCompare(b.createdAt));
|
|
6668
|
+
return [
|
|
6669
|
+
...getActionStatusFlags(sortedActions),
|
|
6670
|
+
...getInherentFlags(sortedActions),
|
|
6671
|
+
...resolveEventCustomFlags(event2, config)
|
|
6672
|
+
];
|
|
6317
6673
|
}
|
|
6318
6674
|
|
|
6319
6675
|
// ../commons/src/events/state/index.ts
|
|
@@ -6548,7 +6904,7 @@ function getActionAnnotation({
|
|
|
6548
6904
|
const action = (0, import_lodash4.findLast)(activeActions, (a) => a.type === actionType);
|
|
6549
6905
|
const actionWithCompleteAnnotation = action && {
|
|
6550
6906
|
...action,
|
|
6551
|
-
annotation: getCompleteActionAnnotation(
|
|
6907
|
+
annotation: getCompleteActionAnnotation(event2, action)
|
|
6552
6908
|
};
|
|
6553
6909
|
const matchingDraft = draft?.action.type === actionType ? draft : void 0;
|
|
6554
6910
|
const sortedActions = (0, import_lodash4.orderBy)(
|
|
@@ -6620,6 +6976,9 @@ function createFieldConfig(fieldId, options) {
|
|
|
6620
6976
|
}
|
|
6621
6977
|
|
|
6622
6978
|
// ../commons/src/events/field.ts
|
|
6979
|
+
function evaluate(computationFn) {
|
|
6980
|
+
return { $$code: computationFn.toString() };
|
|
6981
|
+
}
|
|
6623
6982
|
function field(fieldId, options = {}) {
|
|
6624
6983
|
return {
|
|
6625
6984
|
...createFieldConditionals(fieldId),
|
|
@@ -10312,3 +10671,366 @@ function getFilePathsFromEvent(event2) {
|
|
|
10312
10671
|
});
|
|
10313
10672
|
return (0, import_lodash7.uniq)(filepaths);
|
|
10314
10673
|
}
|
|
10674
|
+
|
|
10675
|
+
// ../commons/src/events/mocks.test.utils.ts
|
|
10676
|
+
var V2_DEFAULT_MOCK_ADMINISTRATIVE_AREAS = [
|
|
10677
|
+
{
|
|
10678
|
+
id: "a45b982a-5c7b-4bd9-8fd8-a42d0994054c",
|
|
10679
|
+
name: "Central",
|
|
10680
|
+
parentId: null,
|
|
10681
|
+
validUntil: null,
|
|
10682
|
+
externalId: "ydyJb1RAy4U1"
|
|
10683
|
+
},
|
|
10684
|
+
{
|
|
10685
|
+
id: "c599b691-fd2d-45e1-abf4-d185de727fb5",
|
|
10686
|
+
name: "Sulaka",
|
|
10687
|
+
parentId: null,
|
|
10688
|
+
validUntil: null,
|
|
10689
|
+
externalId: "pQ8nGxWmZ2Q3"
|
|
10690
|
+
},
|
|
10691
|
+
{
|
|
10692
|
+
id: "7ef2b9c7-5e6d-49f6-ae05-656207d0fc64",
|
|
10693
|
+
name: "Pualula",
|
|
10694
|
+
parentId: null,
|
|
10695
|
+
validUntil: null,
|
|
10696
|
+
externalId: "Aq91DweLmT8k"
|
|
10697
|
+
},
|
|
10698
|
+
{
|
|
10699
|
+
id: "6d1a59df-988c-4021-a846-ccbc021931a7",
|
|
10700
|
+
name: "Chuminga",
|
|
10701
|
+
parentId: null,
|
|
10702
|
+
validUntil: null,
|
|
10703
|
+
externalId: "Rw0fYNh2Xk9a"
|
|
10704
|
+
},
|
|
10705
|
+
{
|
|
10706
|
+
id: "62a0ccb4-880d-4f30-8882-f256007dfff9",
|
|
10707
|
+
name: "Ibombo",
|
|
10708
|
+
parentId: "a45b982a-5c7b-4bd9-8fd8-a42d0994054c",
|
|
10709
|
+
validUntil: null,
|
|
10710
|
+
externalId: "k7DsP4vbN1Qe"
|
|
10711
|
+
},
|
|
10712
|
+
{
|
|
10713
|
+
id: "27160bbd-32d1-4625-812f-860226bfb92a",
|
|
10714
|
+
name: "Isango",
|
|
10715
|
+
parentId: "a45b982a-5c7b-4bd9-8fd8-a42d0994054c",
|
|
10716
|
+
validUntil: null,
|
|
10717
|
+
externalId: "Gm3Z9eQpHw4L"
|
|
10718
|
+
},
|
|
10719
|
+
{
|
|
10720
|
+
id: "967032fd-3f81-478a-826c-30cb8fe121bd",
|
|
10721
|
+
name: "Isamba",
|
|
10722
|
+
parentId: "a45b982a-5c7b-4bd9-8fd8-a42d0994054c",
|
|
10723
|
+
validUntil: null,
|
|
10724
|
+
externalId: "sT0xVu1KqJ7r"
|
|
10725
|
+
},
|
|
10726
|
+
{
|
|
10727
|
+
id: "89a33893-b17d-481d-a26d-6461e7ac1651",
|
|
10728
|
+
name: "Itambo",
|
|
10729
|
+
parentId: "a45b982a-5c7b-4bd9-8fd8-a42d0994054c",
|
|
10730
|
+
validUntil: null,
|
|
10731
|
+
externalId: "Nq6Bv2HpL9Te"
|
|
10732
|
+
},
|
|
10733
|
+
{
|
|
10734
|
+
id: "d42ab2fe-e7ed-470e-8b31-4fb27f9b8250",
|
|
10735
|
+
name: "Ezhi",
|
|
10736
|
+
parentId: "a45b982a-5c7b-4bd9-8fd8-a42d0994054c",
|
|
10737
|
+
validUntil: null,
|
|
10738
|
+
externalId: "xK8cQ0ZRy5Wd"
|
|
10739
|
+
},
|
|
10740
|
+
{
|
|
10741
|
+
id: "8fbd09d2-212b-47f4-beb3-5e1694931d9f",
|
|
10742
|
+
name: "Ilanga",
|
|
10743
|
+
parentId: "c599b691-fd2d-45e1-abf4-d185de727fb5",
|
|
10744
|
+
validUntil: null,
|
|
10745
|
+
externalId: "Cq4Jm1XvN8Ls"
|
|
10746
|
+
},
|
|
10747
|
+
// Villages under Ibombo (62a0ccb4-880d-4f30-8882-f256007dfff9)
|
|
10748
|
+
{
|
|
10749
|
+
id: "1d4e5f6a-7b8c-4912-8efa-345678901234",
|
|
10750
|
+
name: "Klow",
|
|
10751
|
+
parentId: "62a0ccb4-880d-4f30-8882-f256007dfff9",
|
|
10752
|
+
validUntil: null,
|
|
10753
|
+
externalId: "IkYcYBUcyY2"
|
|
10754
|
+
},
|
|
10755
|
+
{
|
|
10756
|
+
id: "2e5f6a7b-8c9d-4a23-8fab-456789012345",
|
|
10757
|
+
name: "Mbondo",
|
|
10758
|
+
parentId: "62a0ccb4-880d-4f30-8882-f256007dfff9",
|
|
10759
|
+
validUntil: null,
|
|
10760
|
+
externalId: "Qhvv5hvo3mY"
|
|
10761
|
+
},
|
|
10762
|
+
{
|
|
10763
|
+
id: "3f6a7b8c-9d0e-4b34-8abc-567890123456",
|
|
10764
|
+
name: "Ndara",
|
|
10765
|
+
parentId: "62a0ccb4-880d-4f30-8882-f256007dfff9",
|
|
10766
|
+
validUntil: null,
|
|
10767
|
+
externalId: "crXh068O9TR"
|
|
10768
|
+
},
|
|
10769
|
+
{
|
|
10770
|
+
id: "4a7b8c9d-0e1f-4c45-abcd-678901234567",
|
|
10771
|
+
name: "Olani",
|
|
10772
|
+
parentId: "62a0ccb4-880d-4f30-8882-f256007dfff9",
|
|
10773
|
+
validUntil: null,
|
|
10774
|
+
externalId: "r00It8Tvvp7"
|
|
10775
|
+
},
|
|
10776
|
+
{
|
|
10777
|
+
id: "5b8c9d0e-1f2a-4d56-bcde-789012345678",
|
|
10778
|
+
name: "Pemba",
|
|
10779
|
+
parentId: "62a0ccb4-880d-4f30-8882-f256007dfff9",
|
|
10780
|
+
validUntil: null,
|
|
10781
|
+
externalId: "ZnUWsbONIaH"
|
|
10782
|
+
},
|
|
10783
|
+
{
|
|
10784
|
+
id: "6c9d0e1f-2a3b-4e67-8def-890123456789",
|
|
10785
|
+
name: "Quanza",
|
|
10786
|
+
parentId: "62a0ccb4-880d-4f30-8882-f256007dfff9",
|
|
10787
|
+
validUntil: null,
|
|
10788
|
+
externalId: "fDZycvQTa7l"
|
|
10789
|
+
},
|
|
10790
|
+
{
|
|
10791
|
+
id: "7d0e1f2a-3b4c-4f78-8efa-901234567890",
|
|
10792
|
+
name: "Rivka",
|
|
10793
|
+
parentId: "62a0ccb4-880d-4f30-8882-f256007dfff9",
|
|
10794
|
+
validUntil: null,
|
|
10795
|
+
externalId: "KqswxCGTELa"
|
|
10796
|
+
},
|
|
10797
|
+
// Villages under Isamba (967032fd-3f81-478a-826c-30cb8fe121bd)
|
|
10798
|
+
{
|
|
10799
|
+
id: "8e1f2a3b-4c5d-4089-8fab-012345678901",
|
|
10800
|
+
name: "Mbula",
|
|
10801
|
+
parentId: "967032fd-3f81-478a-826c-30cb8fe121bd",
|
|
10802
|
+
validUntil: null,
|
|
10803
|
+
externalId: "osEbKjRc9Kg"
|
|
10804
|
+
},
|
|
10805
|
+
{
|
|
10806
|
+
id: "9f2a3b4c-5d6e-4190-8abf-123456789012",
|
|
10807
|
+
name: "Ndoki",
|
|
10808
|
+
parentId: "967032fd-3f81-478a-826c-30cb8fe121bd",
|
|
10809
|
+
validUntil: null,
|
|
10810
|
+
externalId: "aq4daBUAGr3"
|
|
10811
|
+
},
|
|
10812
|
+
{
|
|
10813
|
+
id: "0a3b4c5d-6e7f-4201-abcd-234567890123",
|
|
10814
|
+
name: "Tsanga",
|
|
10815
|
+
parentId: "967032fd-3f81-478a-826c-30cb8fe121bd",
|
|
10816
|
+
validUntil: null,
|
|
10817
|
+
externalId: "cqis6Y8trbJ"
|
|
10818
|
+
},
|
|
10819
|
+
{
|
|
10820
|
+
id: "1b4c5d6e-7f8a-4312-bcde-345678901234",
|
|
10821
|
+
name: "Waziri",
|
|
10822
|
+
parentId: "967032fd-3f81-478a-826c-30cb8fe121bd",
|
|
10823
|
+
validUntil: null,
|
|
10824
|
+
externalId: "LMijHPyyx6d"
|
|
10825
|
+
},
|
|
10826
|
+
{
|
|
10827
|
+
id: "2c5d6e7f-8a9b-4423-8def-456789012345",
|
|
10828
|
+
name: "Zimbi",
|
|
10829
|
+
parentId: "967032fd-3f81-478a-826c-30cb8fe121bd",
|
|
10830
|
+
validUntil: null,
|
|
10831
|
+
externalId: "pcQYbPuKGZ7"
|
|
10832
|
+
},
|
|
10833
|
+
// Villages under Itambo (89a33893-b17d-481d-a26d-6461e7ac1651)
|
|
10834
|
+
{
|
|
10835
|
+
id: "3d6e7f8a-9b0c-4534-8efa-567890123456",
|
|
10836
|
+
name: "Felani",
|
|
10837
|
+
parentId: "89a33893-b17d-481d-a26d-6461e7ac1651",
|
|
10838
|
+
validUntil: null,
|
|
10839
|
+
externalId: "gSqpoCGdMXp"
|
|
10840
|
+
},
|
|
10841
|
+
{
|
|
10842
|
+
id: "4e7f8a9b-0c1d-4645-8fab-678901234567",
|
|
10843
|
+
name: "Goroma",
|
|
10844
|
+
parentId: "89a33893-b17d-481d-a26d-6461e7ac1651",
|
|
10845
|
+
validUntil: null,
|
|
10846
|
+
externalId: "KvAAIaNqVrp"
|
|
10847
|
+
},
|
|
10848
|
+
{
|
|
10849
|
+
id: "5f8a9b0c-1d2e-4756-8abc-789012345678",
|
|
10850
|
+
name: "Halifu",
|
|
10851
|
+
parentId: "89a33893-b17d-481d-a26d-6461e7ac1651",
|
|
10852
|
+
validUntil: null,
|
|
10853
|
+
externalId: "qe4UnEVt1hv"
|
|
10854
|
+
},
|
|
10855
|
+
{
|
|
10856
|
+
id: "6a9b0c1d-2e3f-4867-abcd-890123456789",
|
|
10857
|
+
name: "Jabari",
|
|
10858
|
+
parentId: "89a33893-b17d-481d-a26d-6461e7ac1651",
|
|
10859
|
+
validUntil: null,
|
|
10860
|
+
externalId: "yHH9Nz4rLOt"
|
|
10861
|
+
},
|
|
10862
|
+
{
|
|
10863
|
+
id: "7b0c1d2e-3f4a-4978-bcde-901234567890",
|
|
10864
|
+
name: "Kifani",
|
|
10865
|
+
parentId: "89a33893-b17d-481d-a26d-6461e7ac1651",
|
|
10866
|
+
validUntil: null,
|
|
10867
|
+
externalId: "eSWmXIGeu1I"
|
|
10868
|
+
},
|
|
10869
|
+
{
|
|
10870
|
+
id: "8c1d2e3f-4a5b-4089-8def-012345678901",
|
|
10871
|
+
name: "Lumela",
|
|
10872
|
+
parentId: "89a33893-b17d-481d-a26d-6461e7ac1651",
|
|
10873
|
+
validUntil: null,
|
|
10874
|
+
externalId: "bh0b3aI1uP3"
|
|
10875
|
+
}
|
|
10876
|
+
];
|
|
10877
|
+
var V2_DEFAULT_MOCK_LOCATIONS = [
|
|
10878
|
+
{
|
|
10879
|
+
id: "6f6186ce-cd5f-4a5f-810a-2d99e7c4ba12",
|
|
10880
|
+
name: "Central Provincial Office",
|
|
10881
|
+
locationType: "CRVS_OFFICE",
|
|
10882
|
+
administrativeAreaId: "a45b982a-5c7b-4bd9-8fd8-a42d0994054c",
|
|
10883
|
+
validUntil: null,
|
|
10884
|
+
externalId: "Xr3Df8WpK6Ys"
|
|
10885
|
+
},
|
|
10886
|
+
{
|
|
10887
|
+
id: "b1c2d3e4-f5a6-7890-bcde-f12345678901",
|
|
10888
|
+
name: "Central Health Post",
|
|
10889
|
+
locationType: "HEALTH_FACILITY",
|
|
10890
|
+
administrativeAreaId: "a45b982a-5c7b-4bd9-8fd8-a42d0994054c",
|
|
10891
|
+
validUntil: null
|
|
10892
|
+
},
|
|
10893
|
+
{
|
|
10894
|
+
id: "028d2c85-ca31-426d-b5d1-2cef545a4902",
|
|
10895
|
+
name: "Ibombo District Office",
|
|
10896
|
+
locationType: "CRVS_OFFICE",
|
|
10897
|
+
administrativeAreaId: "62a0ccb4-880d-4f30-8882-f256007dfff9",
|
|
10898
|
+
validUntil: null,
|
|
10899
|
+
externalId: "Sm4Nw7GrD2Vy"
|
|
10900
|
+
},
|
|
10901
|
+
{
|
|
10902
|
+
id: "62a0ccb4-4f30-4f30-8882-f256007dff9f",
|
|
10903
|
+
name: "Isamba District Office",
|
|
10904
|
+
locationType: "CRVS_OFFICE",
|
|
10905
|
+
administrativeAreaId: "967032fd-3f81-478a-826c-30cb8fe121bd",
|
|
10906
|
+
validUntil: null,
|
|
10907
|
+
externalId: "Vg1Bq5XeH9Lt"
|
|
10908
|
+
},
|
|
10909
|
+
{
|
|
10910
|
+
id: "954c93e1-13f7-4435-bb82-35e0e215e07d",
|
|
10911
|
+
name: "Isango District Office",
|
|
10912
|
+
locationType: "CRVS_OFFICE",
|
|
10913
|
+
administrativeAreaId: "27160bbd-32d1-4625-812f-860226bfb92a",
|
|
10914
|
+
validUntil: null,
|
|
10915
|
+
externalId: "Je7Lm2XqN9Vz"
|
|
10916
|
+
},
|
|
10917
|
+
{
|
|
10918
|
+
id: "2884f5b9-17b4-49ce-bf4d-f538228935df",
|
|
10919
|
+
name: "Sulaka Provincial Office",
|
|
10920
|
+
locationType: "CRVS_OFFICE",
|
|
10921
|
+
administrativeAreaId: "c599b691-fd2d-45e1-abf4-d185de727fb5",
|
|
10922
|
+
validUntil: null,
|
|
10923
|
+
externalId: "Ht2Wp9KcX5Qv"
|
|
10924
|
+
},
|
|
10925
|
+
{
|
|
10926
|
+
id: "030358c6-54af-44be-821b-8e4af963a49c",
|
|
10927
|
+
name: "Ilanga District Office",
|
|
10928
|
+
locationType: "CRVS_OFFICE",
|
|
10929
|
+
administrativeAreaId: "8fbd09d2-212b-47f4-beb3-5e1694931d9f",
|
|
10930
|
+
validUntil: null,
|
|
10931
|
+
externalId: "Yp6Ds1WqN3Xz"
|
|
10932
|
+
},
|
|
10933
|
+
{
|
|
10934
|
+
id: "423d000f-101b-47c0-8b86-21a908067cee",
|
|
10935
|
+
name: "Chamakubi Health Post",
|
|
10936
|
+
locationType: "HEALTH_FACILITY",
|
|
10937
|
+
administrativeAreaId: "62a0ccb4-880d-4f30-8882-f256007dfff9",
|
|
10938
|
+
validUntil: null,
|
|
10939
|
+
externalId: "M1nFr8LbC2Qy"
|
|
10940
|
+
},
|
|
10941
|
+
{
|
|
10942
|
+
id: "4d3279be-d026-420c-88f7-f0a4ae986973",
|
|
10943
|
+
name: "Ibombo Rural Health Centre",
|
|
10944
|
+
locationType: "HEALTH_FACILITY",
|
|
10945
|
+
administrativeAreaId: "62a0ccb4-880d-4f30-8882-f256007dfff9",
|
|
10946
|
+
validUntil: null,
|
|
10947
|
+
externalId: "bT7pV6YrW0Xc"
|
|
10948
|
+
},
|
|
10949
|
+
{
|
|
10950
|
+
id: "190902f4-1d77-476a-8947-41145af1db7d",
|
|
10951
|
+
name: "Chikobo Rural Health Centre",
|
|
10952
|
+
locationType: "HEALTH_FACILITY",
|
|
10953
|
+
administrativeAreaId: "62a0ccb4-880d-4f30-8882-f256007dfff9",
|
|
10954
|
+
validUntil: null,
|
|
10955
|
+
externalId: "zE4qPn2SgJ5d"
|
|
10956
|
+
},
|
|
10957
|
+
{
|
|
10958
|
+
id: "f5ecbd9b-a01e-4a65-910e-70e86ab41b71",
|
|
10959
|
+
name: "Chilochabalenje Health Post",
|
|
10960
|
+
locationType: "HEALTH_FACILITY",
|
|
10961
|
+
administrativeAreaId: "62a0ccb4-880d-4f30-8882-f256007dfff9",
|
|
10962
|
+
validUntil: null,
|
|
10963
|
+
externalId: "H8vDs1MqR4Uf"
|
|
10964
|
+
},
|
|
10965
|
+
{
|
|
10966
|
+
id: "dbfc178f-7295-4b90-b28d-111c95b03127",
|
|
10967
|
+
name: "Chipeso Rural Health Centre",
|
|
10968
|
+
locationType: "HEALTH_FACILITY",
|
|
10969
|
+
administrativeAreaId: "62a0ccb4-880d-4f30-8882-f256007dfff9",
|
|
10970
|
+
validUntil: null,
|
|
10971
|
+
externalId: "Qw3uZ9KfX6Lm"
|
|
10972
|
+
},
|
|
10973
|
+
{
|
|
10974
|
+
id: "09862bfe-c7ac-46cd-987b-668681533c80",
|
|
10975
|
+
name: "Chisamba Rural Health Centre",
|
|
10976
|
+
locationType: "HEALTH_FACILITY",
|
|
10977
|
+
administrativeAreaId: "62a0ccb4-880d-4f30-8882-f256007dfff9",
|
|
10978
|
+
validUntil: null,
|
|
10979
|
+
externalId: "Yr0pCg8LdM2s"
|
|
10980
|
+
},
|
|
10981
|
+
{
|
|
10982
|
+
id: "834ce389-e95b-4fb0-96a0-33e9ab323059",
|
|
10983
|
+
name: "Chitanda Rural Health Centre",
|
|
10984
|
+
locationType: "HEALTH_FACILITY",
|
|
10985
|
+
administrativeAreaId: "62a0ccb4-880d-4f30-8882-f256007dfff9",
|
|
10986
|
+
validUntil: null,
|
|
10987
|
+
externalId: "tS9gJ4PwB1Qx"
|
|
10988
|
+
},
|
|
10989
|
+
{
|
|
10990
|
+
id: "0431c433-6062-4a4c-aee9-25271aec61ee",
|
|
10991
|
+
name: "Golden Valley Rural Health Centre",
|
|
10992
|
+
locationType: "HEALTH_FACILITY",
|
|
10993
|
+
administrativeAreaId: "62a0ccb4-880d-4f30-8882-f256007dfff9",
|
|
10994
|
+
validUntil: null,
|
|
10995
|
+
externalId: "Ld7Qm3XsA8Vr"
|
|
10996
|
+
},
|
|
10997
|
+
{
|
|
10998
|
+
id: "bc84d0b6-7ba7-480d-a339-5d9920d90eb2",
|
|
10999
|
+
name: "Ipongo Rural Health Centre",
|
|
11000
|
+
locationType: "HEALTH_FACILITY",
|
|
11001
|
+
administrativeAreaId: "62a0ccb4-880d-4f30-8882-f256007dfff9",
|
|
11002
|
+
validUntil: null,
|
|
11003
|
+
externalId: "kF2sW9DmH0Bt"
|
|
11004
|
+
},
|
|
11005
|
+
{
|
|
11006
|
+
id: "4cf1f53b-b730-41d2-8649-dff7eeed970d",
|
|
11007
|
+
name: "Itumbwe Health Post",
|
|
11008
|
+
locationType: "HEALTH_FACILITY",
|
|
11009
|
+
administrativeAreaId: "62a0ccb4-880d-4f30-8882-f256007dfff9",
|
|
11010
|
+
validUntil: null,
|
|
11011
|
+
externalId: "Ue5Xb3VaC7Pq"
|
|
11012
|
+
},
|
|
11013
|
+
{
|
|
11014
|
+
id: "4b3676cb-9355-4942-9eb9-2ce46acaf0e0",
|
|
11015
|
+
name: "Kabangalala Rural Health Centre",
|
|
11016
|
+
locationType: "HEALTH_FACILITY",
|
|
11017
|
+
administrativeAreaId: "62a0ccb4-880d-4f30-8882-f256007dfff9",
|
|
11018
|
+
validUntil: null,
|
|
11019
|
+
externalId: "Pz8Kc1TqH6Jn"
|
|
11020
|
+
},
|
|
11021
|
+
// Village offices
|
|
11022
|
+
{
|
|
11023
|
+
id: "1f4a5b6c-7d8e-4312-8abc-345678901234",
|
|
11024
|
+
name: "Klow Village Office",
|
|
11025
|
+
locationType: "CRVS_OFFICE",
|
|
11026
|
+
administrativeAreaId: "1d4e5f6a-7b8c-4912-8efa-345678901234",
|
|
11027
|
+
validUntil: null,
|
|
11028
|
+
externalId: "PmAyxAJkxiJ"
|
|
11029
|
+
}
|
|
11030
|
+
];
|
|
11031
|
+
var V2_DEFAULT_MOCK_LOCATIONS_MAP = new Map(
|
|
11032
|
+
V2_DEFAULT_MOCK_LOCATIONS.map((l) => [l.id, l])
|
|
11033
|
+
);
|
|
11034
|
+
var V2_DEFAULT_MOCK_ADMINISTRATIVE_AREAS_MAP = new Map(
|
|
11035
|
+
V2_DEFAULT_MOCK_ADMINISTRATIVE_AREAS.map((a) => [a.id, a])
|
|
11036
|
+
);
|