@opencrvs/toolkit 2.0.0-rc.fe94e41 → 2.0.0-rc.fea498b
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/application-config/index.js +51 -33
- package/dist/cli.js +9 -3
- package/dist/commons/api/router.d.ts +26 -17
- package/dist/commons/application-config/index.d.ts +1 -0
- package/dist/commons/conditionals/conditionals.d.ts +348 -4
- package/dist/commons/conditionals/validate.d.ts +51 -2
- package/dist/commons/events/ActionConfig.d.ts +37 -2
- package/dist/commons/events/AdvancedSearchConfig.d.ts +342 -0
- package/dist/commons/events/FieldConfig.d.ts +378 -50
- package/dist/commons/events/FieldType.d.ts +1 -0
- package/dist/commons/events/FieldTypeMapping.d.ts +1 -1
- package/dist/commons/events/FieldValue.d.ts +6 -0
- package/dist/commons/events/field.d.ts +53 -1
- package/dist/commons/events/state/utils.d.ts +12 -290
- package/dist/commons/events/utils.d.ts +1 -1
- package/dist/conditionals/index.js +48 -1
- package/dist/events/index.js +335 -145
- package/dist/migrations/v2.0/index.js +9 -3
- package/dist/notification/index.js +222 -37
- package/dist/scopes/index.d.ts +4 -6
- package/dist/scopes/index.js +9 -3
- package/opencrvs-toolkit-2.0.0-rc.fea498b.tgz +0 -0
- package/package.json +1 -1
- package/opencrvs-toolkit-2.0.0-rc.fe94e41.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,
|
|
@@ -150,6 +151,7 @@ __export(events_exports, {
|
|
|
150
151
|
FormPageConfig: () => FormPageConfig,
|
|
151
152
|
Fuzzy: () => Fuzzy,
|
|
152
153
|
GeographicalArea: () => GeographicalArea,
|
|
154
|
+
HiddenFieldTypes: () => HiddenFieldTypes,
|
|
153
155
|
HiddenFieldValue: () => HiddenFieldValue,
|
|
154
156
|
HttpFieldUpdateValue: () => HttpFieldUpdateValue,
|
|
155
157
|
HttpFieldValue: () => HttpFieldValue,
|
|
@@ -200,6 +202,7 @@ __export(events_exports, {
|
|
|
200
202
|
SelectDateRangeValue: () => SelectDateRangeValue,
|
|
201
203
|
SelectOption: () => SelectOption,
|
|
202
204
|
ShowConditional: () => ShowConditional,
|
|
205
|
+
SignatureFieldValue: () => SignatureFieldValue,
|
|
203
206
|
StaticDataEntry: () => StaticDataEntry,
|
|
204
207
|
StreetLevelDetailsUpdateValue: () => StreetLevelDetailsUpdateValue,
|
|
205
208
|
SummaryConfig: () => SummaryConfig,
|
|
@@ -246,10 +249,12 @@ __export(events_exports, {
|
|
|
246
249
|
applyDraftToEventIndex: () => applyDraftToEventIndex,
|
|
247
250
|
areCertificateConditionsMet: () => areCertificateConditionsMet,
|
|
248
251
|
areConditionsMet: () => areConditionsMet,
|
|
252
|
+
buildClientFunctionContext: () => buildClientFunctionContext,
|
|
249
253
|
buildFormState: () => buildFormState,
|
|
250
254
|
canAccessEventWithScope: () => canAccessEventWithScope,
|
|
251
255
|
canAccessOtherUserWithScopes: () => canAccessOtherUserWithScopes,
|
|
252
256
|
canAccessUserWithScope: () => canAccessUserWithScope,
|
|
257
|
+
compileClientFunction: () => compileClientFunction,
|
|
253
258
|
compositeFieldTypes: () => compositeFieldTypes,
|
|
254
259
|
createEmptyDraft: () => createEmptyDraft,
|
|
255
260
|
createFieldConditionals: () => createFieldConditionals,
|
|
@@ -270,6 +275,7 @@ __export(events_exports, {
|
|
|
270
275
|
defineWorkqueuesColumns: () => defineWorkqueuesColumns,
|
|
271
276
|
deserializeQuery: () => deserializeQuery,
|
|
272
277
|
errorMessages: () => errorMessages,
|
|
278
|
+
evaluate: () => evaluate,
|
|
273
279
|
event: () => event,
|
|
274
280
|
eventMetadataLabelMap: () => eventMetadataLabelMap,
|
|
275
281
|
eventPayloadGenerator: () => eventPayloadGenerator,
|
|
@@ -348,6 +354,7 @@ __export(events_exports, {
|
|
|
348
354
|
isBulletListFieldType: () => isBulletListFieldType,
|
|
349
355
|
isButtonFieldType: () => isButtonFieldType,
|
|
350
356
|
isCheckboxFieldType: () => isCheckboxFieldType,
|
|
357
|
+
isCodeToEvaluate: () => isCodeToEvaluate,
|
|
351
358
|
isConditionMet: () => isConditionMet,
|
|
352
359
|
isCountryFieldType: () => isCountryFieldType,
|
|
353
360
|
isCustomFieldType: () => isCustomFieldType,
|
|
@@ -424,11 +431,13 @@ __export(events_exports, {
|
|
|
424
431
|
resolveDateOfEvent: () => resolveDateOfEvent,
|
|
425
432
|
resolveEventCustomFlags: () => resolveEventCustomFlags,
|
|
426
433
|
resolvePlaceOfEvent: () => resolvePlaceOfEvent,
|
|
434
|
+
runClientFunction: () => runClientFunction,
|
|
427
435
|
runFieldValidations: () => runFieldValidations,
|
|
428
436
|
runStructuralValidations: () => runStructuralValidations,
|
|
429
437
|
safeUnion: () => safeUnion,
|
|
430
438
|
status: () => status,
|
|
431
439
|
timePeriodToDateRange: () => timePeriodToDateRange,
|
|
440
|
+
todayISO: () => todayISO,
|
|
432
441
|
user: () => user,
|
|
433
442
|
userCanAccessEventWithScopes: () => userCanAccessEventWithScopes,
|
|
434
443
|
validate: () => validate,
|
|
@@ -703,14 +712,20 @@ var unflattenScope = (input) => {
|
|
|
703
712
|
return { type, options };
|
|
704
713
|
};
|
|
705
714
|
var EncodedScope = z2.string().brand("EncodedScope");
|
|
706
|
-
var
|
|
707
|
-
|
|
715
|
+
var decodedScopeCache = /* @__PURE__ */ new Map();
|
|
716
|
+
var decodeScope = (encodedScope) => {
|
|
717
|
+
if (decodedScopeCache.has(encodedScope)) {
|
|
718
|
+
return decodedScopeCache.get(encodedScope);
|
|
719
|
+
}
|
|
720
|
+
const scope = qs.parse(encodedScope, {
|
|
708
721
|
ignoreQueryPrefix: true,
|
|
709
722
|
comma: true,
|
|
710
723
|
allowDots: true
|
|
711
724
|
});
|
|
712
725
|
const unflattenedScope = unflattenScope(scope);
|
|
713
|
-
|
|
726
|
+
const result = Scope.safeParse(unflattenedScope)?.data;
|
|
727
|
+
decodedScopeCache.set(encodedScope, result);
|
|
728
|
+
return result;
|
|
714
729
|
};
|
|
715
730
|
var DEFAULT_SCOPE_OPTIONS = {
|
|
716
731
|
placeOfEvent: JurisdictionFilter.enum.all,
|
|
@@ -1205,6 +1220,11 @@ var FieldTypesToHideInReview = [
|
|
|
1205
1220
|
FieldType.ALPHA_PRINT_BUTTON,
|
|
1206
1221
|
FieldType.ALPHA_HIDDEN
|
|
1207
1222
|
];
|
|
1223
|
+
var HiddenFieldTypes = [
|
|
1224
|
+
FieldType.HTTP,
|
|
1225
|
+
FieldType.QUERY_PARAM_READER,
|
|
1226
|
+
FieldType.ALPHA_HIDDEN
|
|
1227
|
+
];
|
|
1208
1228
|
|
|
1209
1229
|
// ../commons/src/events/FieldValue.ts
|
|
1210
1230
|
var z12 = __toESM(require("zod/v4"));
|
|
@@ -1331,7 +1351,7 @@ function plainDateToLocalDate(date) {
|
|
|
1331
1351
|
// ../commons/src/events/FieldValue.ts
|
|
1332
1352
|
var TextValue = z12.string();
|
|
1333
1353
|
var HiddenFieldValue = z12.string();
|
|
1334
|
-
var NonEmptyTextValue =
|
|
1354
|
+
var NonEmptyTextValue = z12.string().trim().min(1);
|
|
1335
1355
|
var DateValue = z12.iso.date().describe("Date in the format YYYY-MM-DD");
|
|
1336
1356
|
var AgeValue = z12.object({
|
|
1337
1357
|
age: z12.number(),
|
|
@@ -1360,6 +1380,7 @@ var DateRangeFieldValue = z12.object({
|
|
|
1360
1380
|
var EmailValue = z12.email();
|
|
1361
1381
|
var CheckboxFieldValue = z12.boolean();
|
|
1362
1382
|
var NumberFieldValue = z12.number();
|
|
1383
|
+
var SignatureFieldValue = FileFieldValue;
|
|
1363
1384
|
var ButtonFieldValue = z12.number();
|
|
1364
1385
|
var VerificationStatusValue = z12.enum([
|
|
1365
1386
|
"verified",
|
|
@@ -2191,8 +2212,21 @@ var FieldReference = import_v43.default.object({
|
|
|
2191
2212
|
$$field: FieldId.describe("Id of the field to reference"),
|
|
2192
2213
|
$$subfield: import_v43.default.array(import_v43.default.string()).optional().default([]).describe(
|
|
2193
2214
|
'If the FieldValue is an object, subfield can be used to refer to e.g. `["foo", "bar"]` in `{ foo: { bar: 3 } }`'
|
|
2215
|
+
),
|
|
2216
|
+
$$code: import_v43.default.string().optional().describe(
|
|
2217
|
+
"Serialised client-side function body. When present the expression is evaluated rather than dereferenced."
|
|
2218
|
+
)
|
|
2219
|
+
}).describe(
|
|
2220
|
+
"Reference to a field value, with an optional client-side computation applied."
|
|
2221
|
+
);
|
|
2222
|
+
function isCodeToEvaluate(v) {
|
|
2223
|
+
return !!v && typeof v === "object" && "$$code" in v;
|
|
2224
|
+
}
|
|
2225
|
+
var ComputedDefaultValue = import_v43.default.object({
|
|
2226
|
+
$$code: import_v43.default.string().describe(
|
|
2227
|
+
"Serialised client-side function body. Receives (undefined, context) where context includes $now, $online, and system variables."
|
|
2194
2228
|
)
|
|
2195
|
-
}).describe("
|
|
2229
|
+
}).describe("A context-only computation used as a field default value.");
|
|
2196
2230
|
var ValidationConfig = import_v43.default.object({
|
|
2197
2231
|
validator: Conditional.describe(
|
|
2198
2232
|
"Conditional expression that must hold for the field value to be considered valid."
|
|
@@ -2233,7 +2267,7 @@ var BaseField = import_v43.default.object({
|
|
|
2233
2267
|
"Indicates whether the field can be modified during record correction."
|
|
2234
2268
|
),
|
|
2235
2269
|
value: FieldReference.or(import_v43.default.array(FieldReference)).optional().describe(
|
|
2236
|
-
"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."
|
|
2270
|
+
"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."
|
|
2237
2271
|
),
|
|
2238
2272
|
analytics: import_v43.default.boolean().default(false).optional().describe(
|
|
2239
2273
|
"Indicates whether the field is included in analytics. When enabled, its value becomes available in the analytics dashboard."
|
|
@@ -2247,7 +2281,7 @@ var Divider = BaseField.extend({
|
|
|
2247
2281
|
});
|
|
2248
2282
|
var TextField = BaseField.extend({
|
|
2249
2283
|
type: import_v43.default.literal(FieldType.TEXT),
|
|
2250
|
-
defaultValue: import_v43.default.union([NonEmptyTextValue, SerializedUserField]).optional(),
|
|
2284
|
+
defaultValue: import_v43.default.union([NonEmptyTextValue, SerializedUserField, ComputedDefaultValue]).optional(),
|
|
2251
2285
|
configuration: import_v43.default.object({
|
|
2252
2286
|
maxLength: import_v43.default.number().optional().describe("Maximum length of the text"),
|
|
2253
2287
|
type: import_v43.default.enum(["text", "password"]).optional(),
|
|
@@ -2260,10 +2294,11 @@ var TextField = BaseField.extend({
|
|
|
2260
2294
|
});
|
|
2261
2295
|
var NumberField = BaseField.extend({
|
|
2262
2296
|
type: import_v43.default.literal(FieldType.NUMBER),
|
|
2263
|
-
defaultValue: NumberFieldValue.optional(),
|
|
2297
|
+
defaultValue: NumberFieldValue.or(ComputedDefaultValue).optional(),
|
|
2264
2298
|
configuration: import_v43.default.object({
|
|
2265
2299
|
min: import_v43.default.number().optional().describe("Minimum value"),
|
|
2266
2300
|
max: import_v43.default.number().optional().describe("Maximum value"),
|
|
2301
|
+
integer: import_v43.default.boolean().optional().describe("When true, only whole numbers are allowed"),
|
|
2267
2302
|
prefix: TranslationConfig.optional(),
|
|
2268
2303
|
postfix: TranslationConfig.optional()
|
|
2269
2304
|
}).optional()
|
|
@@ -2273,7 +2308,7 @@ var NumberField = BaseField.extend({
|
|
|
2273
2308
|
});
|
|
2274
2309
|
var TextAreaField = BaseField.extend({
|
|
2275
2310
|
type: import_v43.default.literal(FieldType.TEXTAREA),
|
|
2276
|
-
defaultValue: NonEmptyTextValue.optional(),
|
|
2311
|
+
defaultValue: NonEmptyTextValue.or(ComputedDefaultValue).optional(),
|
|
2277
2312
|
configuration: import_v43.default.object({
|
|
2278
2313
|
maxLength: import_v43.default.number().optional().describe("Maximum length of the text"),
|
|
2279
2314
|
rows: import_v43.default.number().optional().describe("Number of visible text lines"),
|
|
@@ -2307,7 +2342,7 @@ var SignatureField = BaseField.extend({
|
|
|
2307
2342
|
signaturePromptLabel: TranslationConfig.describe(
|
|
2308
2343
|
"Title of the signature modal"
|
|
2309
2344
|
),
|
|
2310
|
-
defaultValue:
|
|
2345
|
+
defaultValue: SignatureFieldValue.or(ComputedDefaultValue).optional(),
|
|
2311
2346
|
configuration: import_v43.default.object({
|
|
2312
2347
|
maxFileSize: import_v43.default.number().describe("Maximum file size in bytes").default(DEFAULT_MAX_FILE_SIZE_BYTES),
|
|
2313
2348
|
acceptedFileTypes: MimeType.array().optional().describe("List of allowed file formats for the signature")
|
|
@@ -2323,14 +2358,14 @@ var EmailField = BaseField.extend({
|
|
|
2323
2358
|
configuration: import_v43.default.object({
|
|
2324
2359
|
maxLength: import_v43.default.number().optional().describe("Maximum length of the text")
|
|
2325
2360
|
}).default({ maxLength: 255 }).optional(),
|
|
2326
|
-
defaultValue: NonEmptyTextValue.optional()
|
|
2361
|
+
defaultValue: NonEmptyTextValue.or(ComputedDefaultValue).optional()
|
|
2327
2362
|
}).meta({
|
|
2328
2363
|
description: "An email input field",
|
|
2329
2364
|
id: "EmailField"
|
|
2330
2365
|
});
|
|
2331
2366
|
var DateField = BaseField.extend({
|
|
2332
2367
|
type: import_v43.default.literal(FieldType.DATE),
|
|
2333
|
-
defaultValue: SerializedNowDateTime.or(PlainDate).optional().describe("Default date value(yyyy-MM-dd)"),
|
|
2368
|
+
defaultValue: SerializedNowDateTime.or(PlainDate).or(ComputedDefaultValue).optional().describe("Default date value(yyyy-MM-dd)"),
|
|
2334
2369
|
configuration: import_v43.default.object({
|
|
2335
2370
|
notice: TranslationConfig.describe(
|
|
2336
2371
|
"Text to display above the date input"
|
|
@@ -2342,7 +2377,7 @@ var DateField = BaseField.extend({
|
|
|
2342
2377
|
});
|
|
2343
2378
|
var AgeField = BaseField.extend({
|
|
2344
2379
|
type: import_v43.default.literal(FieldType.AGE),
|
|
2345
|
-
defaultValue: NumberFieldValue.optional(),
|
|
2380
|
+
defaultValue: NumberFieldValue.or(ComputedDefaultValue).optional(),
|
|
2346
2381
|
configuration: import_v43.default.object({
|
|
2347
2382
|
asOfDate: FieldReference,
|
|
2348
2383
|
prefix: TranslationConfig.optional(),
|
|
@@ -2354,7 +2389,7 @@ var AgeField = BaseField.extend({
|
|
|
2354
2389
|
});
|
|
2355
2390
|
var TimeField = BaseField.extend({
|
|
2356
2391
|
type: import_v43.default.literal(FieldType.TIME),
|
|
2357
|
-
defaultValue: SerializedNowDateTime.or(TimeValue).optional().describe("Default time value (HH-mm)"),
|
|
2392
|
+
defaultValue: SerializedNowDateTime.or(TimeValue).or(ComputedDefaultValue).optional().describe("Default time value (HH-mm)"),
|
|
2358
2393
|
configuration: import_v43.default.object({
|
|
2359
2394
|
use12HourFormat: import_v43.default.boolean().optional().describe("Whether to use 12-hour format"),
|
|
2360
2395
|
notice: TranslationConfig.describe(
|
|
@@ -2367,7 +2402,7 @@ var TimeField = BaseField.extend({
|
|
|
2367
2402
|
});
|
|
2368
2403
|
var DateRangeField = BaseField.extend({
|
|
2369
2404
|
type: import_v43.default.literal(FieldType.DATE_RANGE),
|
|
2370
|
-
defaultValue: DateRangeFieldValue.optional(),
|
|
2405
|
+
defaultValue: DateRangeFieldValue.or(ComputedDefaultValue).optional(),
|
|
2371
2406
|
configuration: import_v43.default.object({
|
|
2372
2407
|
notice: TranslationConfig.describe(
|
|
2373
2408
|
"Text to display above the date input"
|
|
@@ -2446,7 +2481,7 @@ var PageHeader = BaseField.extend({
|
|
|
2446
2481
|
});
|
|
2447
2482
|
var File = BaseField.extend({
|
|
2448
2483
|
type: import_v43.default.literal(FieldType.FILE),
|
|
2449
|
-
defaultValue: FileFieldValue.optional(),
|
|
2484
|
+
defaultValue: FileFieldValue.or(ComputedDefaultValue).optional(),
|
|
2450
2485
|
configuration: import_v43.default.object({
|
|
2451
2486
|
maxFileSize: import_v43.default.number().describe("Maximum file size in bytes").default(DEFAULT_MAX_FILE_SIZE_BYTES),
|
|
2452
2487
|
acceptedFileTypes: MimeType.array().optional().describe("List of allowed file formats for the signature"),
|
|
@@ -2473,7 +2508,7 @@ var SelectOption = import_v43.default.object({
|
|
|
2473
2508
|
});
|
|
2474
2509
|
var NumberWithUnitField = BaseField.extend({
|
|
2475
2510
|
type: import_v43.default.literal(FieldType.NUMBER_WITH_UNIT),
|
|
2476
|
-
defaultValue: NumberWithUnitFieldValue.optional(),
|
|
2511
|
+
defaultValue: NumberWithUnitFieldValue.or(ComputedDefaultValue).optional(),
|
|
2477
2512
|
options: import_v43.default.array(SelectOption).describe("A list of options for the unit select"),
|
|
2478
2513
|
configuration: import_v43.default.object({
|
|
2479
2514
|
min: import_v43.default.number().optional().describe("Minimum value of the number field"),
|
|
@@ -2488,7 +2523,7 @@ var NumberWithUnitField = BaseField.extend({
|
|
|
2488
2523
|
});
|
|
2489
2524
|
var RadioGroup = BaseField.extend({
|
|
2490
2525
|
type: import_v43.default.literal(FieldType.RADIO_GROUP),
|
|
2491
|
-
defaultValue: TextValue.optional(),
|
|
2526
|
+
defaultValue: TextValue.or(ComputedDefaultValue).optional(),
|
|
2492
2527
|
options: import_v43.default.array(SelectOption).describe("A list of options"),
|
|
2493
2528
|
configuration: import_v43.default.object({
|
|
2494
2529
|
styles: import_v43.default.object({
|
|
@@ -2513,7 +2548,7 @@ var BulletList = BaseField.extend({
|
|
|
2513
2548
|
});
|
|
2514
2549
|
var Select = BaseField.extend({
|
|
2515
2550
|
type: import_v43.default.literal(FieldType.SELECT),
|
|
2516
|
-
defaultValue: TextValue.optional(),
|
|
2551
|
+
defaultValue: TextValue.or(ComputedDefaultValue).optional(),
|
|
2517
2552
|
options: import_v43.default.array(SelectOption).describe("A list of options"),
|
|
2518
2553
|
noOptionsMessage: TranslationConfig.optional().describe(
|
|
2519
2554
|
`
|
|
@@ -2535,7 +2570,7 @@ var SelectDateRangeOption = import_v43.default.object({
|
|
|
2535
2570
|
});
|
|
2536
2571
|
var SelectDateRangeField = BaseField.extend({
|
|
2537
2572
|
type: import_v43.default.literal(FieldType.SELECT_DATE_RANGE),
|
|
2538
|
-
defaultValue: SelectDateRangeValue.optional(),
|
|
2573
|
+
defaultValue: SelectDateRangeValue.or(ComputedDefaultValue).optional(),
|
|
2539
2574
|
options: import_v43.default.array(SelectDateRangeOption).describe("A list of options")
|
|
2540
2575
|
}).meta({
|
|
2541
2576
|
description: "A date range selection field",
|
|
@@ -2552,7 +2587,7 @@ var NameField = BaseField.extend({
|
|
|
2552
2587
|
firstname: SerializedUserField.or(NonEmptyTextValue).optional(),
|
|
2553
2588
|
middlename: SerializedUserField.or(NonEmptyTextValue).optional(),
|
|
2554
2589
|
surname: SerializedUserField.or(NonEmptyTextValue).optional()
|
|
2555
|
-
}).optional(),
|
|
2590
|
+
}).or(ComputedDefaultValue).optional(),
|
|
2556
2591
|
configuration: import_v43.default.object({
|
|
2557
2592
|
name: NameConfig.default({
|
|
2558
2593
|
firstname: { required: true },
|
|
@@ -2576,14 +2611,14 @@ var NameField = BaseField.extend({
|
|
|
2576
2611
|
id: "NameField"
|
|
2577
2612
|
});
|
|
2578
2613
|
var PhoneField = BaseField.extend({
|
|
2579
|
-
defaultValue: NonEmptyTextValue.optional(),
|
|
2614
|
+
defaultValue: NonEmptyTextValue.or(ComputedDefaultValue).optional(),
|
|
2580
2615
|
type: import_v43.default.literal(FieldType.PHONE)
|
|
2581
2616
|
}).meta({
|
|
2582
2617
|
description: "A field for entering a phone number",
|
|
2583
2618
|
id: "PhoneField"
|
|
2584
2619
|
});
|
|
2585
2620
|
var IdField = BaseField.extend({
|
|
2586
|
-
defaultValue: NonEmptyTextValue.optional(),
|
|
2621
|
+
defaultValue: NonEmptyTextValue.or(ComputedDefaultValue).optional(),
|
|
2587
2622
|
type: import_v43.default.literal(FieldType.ID)
|
|
2588
2623
|
}).meta({
|
|
2589
2624
|
description: "A field for entering an ID",
|
|
@@ -2591,14 +2626,14 @@ var IdField = BaseField.extend({
|
|
|
2591
2626
|
});
|
|
2592
2627
|
var Checkbox = BaseField.extend({
|
|
2593
2628
|
type: import_v43.default.literal(FieldType.CHECKBOX),
|
|
2594
|
-
defaultValue: CheckboxFieldValue.default(false)
|
|
2629
|
+
defaultValue: CheckboxFieldValue.or(ComputedDefaultValue).default(false)
|
|
2595
2630
|
}).meta({
|
|
2596
2631
|
description: "A boolean checkbox field",
|
|
2597
2632
|
id: "Checkbox"
|
|
2598
2633
|
});
|
|
2599
2634
|
var Country = BaseField.extend({
|
|
2600
2635
|
type: import_v43.default.literal(FieldType.COUNTRY),
|
|
2601
|
-
defaultValue: NonEmptyTextValue.optional(),
|
|
2636
|
+
defaultValue: NonEmptyTextValue.or(ComputedDefaultValue).optional(),
|
|
2602
2637
|
optionOverrides: import_v43.default.array(SelectOption.omit({ label: true })).optional().describe(
|
|
2603
2638
|
"Conditionals for specific countries. Countries not listed are always shown and enabled."
|
|
2604
2639
|
)
|
|
@@ -2616,7 +2651,7 @@ var AdministrativeAreas = import_v43.default.enum([
|
|
|
2616
2651
|
]);
|
|
2617
2652
|
var AdministrativeAreaField = BaseField.extend({
|
|
2618
2653
|
type: import_v43.default.literal(FieldType.ADMINISTRATIVE_AREA),
|
|
2619
|
-
defaultValue: import_v43.default.union([NonEmptyTextValue, SerializedUserField]).optional(),
|
|
2654
|
+
defaultValue: import_v43.default.union([NonEmptyTextValue, SerializedUserField, ComputedDefaultValue]).optional(),
|
|
2620
2655
|
configuration: import_v43.default.object({
|
|
2621
2656
|
partOf: FieldReference.optional().describe("Parent location"),
|
|
2622
2657
|
type: AdministrativeAreas,
|
|
@@ -2628,7 +2663,7 @@ var AdministrativeAreaField = BaseField.extend({
|
|
|
2628
2663
|
});
|
|
2629
2664
|
var LocationInput = BaseField.extend({
|
|
2630
2665
|
type: import_v43.default.literal(FieldType.LOCATION),
|
|
2631
|
-
defaultValue: import_v43.default.union([NonEmptyTextValue, SerializedUserField]).optional(),
|
|
2666
|
+
defaultValue: import_v43.default.union([NonEmptyTextValue, SerializedUserField, ComputedDefaultValue]).optional(),
|
|
2632
2667
|
configuration: import_v43.default.object({
|
|
2633
2668
|
locationTypes: import_v43.default.array(import_v43.default.string()).optional().describe("Types of the locations that are available for selection."),
|
|
2634
2669
|
allowedLocations: AllowedLocations
|
|
@@ -2640,7 +2675,7 @@ var LocationInput = BaseField.extend({
|
|
|
2640
2675
|
var FileUploadWithOptions = BaseField.extend({
|
|
2641
2676
|
type: import_v43.default.literal(FieldType.FILE_WITH_OPTIONS),
|
|
2642
2677
|
options: import_v43.default.array(SelectOption).describe("A list of options"),
|
|
2643
|
-
defaultValue: FileFieldWithOptionValue.optional(),
|
|
2678
|
+
defaultValue: FileFieldWithOptionValue.or(ComputedDefaultValue).optional(),
|
|
2644
2679
|
configuration: import_v43.default.object({
|
|
2645
2680
|
maxFileSize: import_v43.default.number().describe("Maximum file size in bytes").default(DEFAULT_MAX_FILE_SIZE_BYTES),
|
|
2646
2681
|
maxImageSize: import_v43.default.object({
|
|
@@ -2656,12 +2691,12 @@ var FileUploadWithOptions = BaseField.extend({
|
|
|
2656
2691
|
});
|
|
2657
2692
|
var Facility = BaseField.extend({
|
|
2658
2693
|
type: import_v43.default.literal(FieldType.FACILITY),
|
|
2659
|
-
defaultValue: NonEmptyTextValue.optional(),
|
|
2694
|
+
defaultValue: NonEmptyTextValue.or(ComputedDefaultValue).optional(),
|
|
2660
2695
|
configuration: import_v43.default.object({ allowedLocations: AllowedLocations }).optional()
|
|
2661
2696
|
}).describe("Input field for a facility");
|
|
2662
2697
|
var Office = BaseField.extend({
|
|
2663
2698
|
type: import_v43.default.literal(FieldType.OFFICE),
|
|
2664
|
-
defaultValue: NonEmptyTextValue.optional(),
|
|
2699
|
+
defaultValue: NonEmptyTextValue.or(ComputedDefaultValue).optional(),
|
|
2665
2700
|
configuration: import_v43.default.object({ allowedLocations: AllowedLocations }).optional()
|
|
2666
2701
|
}).describe("Input field for an office");
|
|
2667
2702
|
var DefaultAddressFieldValue = DomesticAddressFieldValue.extend({
|
|
@@ -2697,7 +2732,7 @@ var Address = BaseField.extend({
|
|
|
2697
2732
|
).optional(),
|
|
2698
2733
|
allowedLocations: AllowedLocations
|
|
2699
2734
|
}).optional(),
|
|
2700
|
-
defaultValue: DefaultAddressFieldValue.optional()
|
|
2735
|
+
defaultValue: DefaultAddressFieldValue.or(ComputedDefaultValue).optional()
|
|
2701
2736
|
}).meta({
|
|
2702
2737
|
description: "Address input field \u2013 a combination of location and text fields",
|
|
2703
2738
|
id: "Address"
|
|
@@ -2744,7 +2779,7 @@ var ButtonConfiguration = import_v43.default.object({
|
|
|
2744
2779
|
});
|
|
2745
2780
|
var ButtonField = BaseField.extend({
|
|
2746
2781
|
type: import_v43.default.literal(FieldType.BUTTON),
|
|
2747
|
-
defaultValue: ButtonFieldValue.optional(),
|
|
2782
|
+
defaultValue: ButtonFieldValue.or(ComputedDefaultValue).optional(),
|
|
2748
2783
|
configuration: ButtonConfiguration
|
|
2749
2784
|
}).meta({
|
|
2750
2785
|
description: "A generic button that can be used to trigger an action",
|
|
@@ -2772,7 +2807,7 @@ var AlphaPrintButton = BaseField.extend({
|
|
|
2772
2807
|
});
|
|
2773
2808
|
var HttpField = BaseField.extend({
|
|
2774
2809
|
type: import_v43.default.literal(FieldType.HTTP),
|
|
2775
|
-
defaultValue: HttpFieldValue.optional(),
|
|
2810
|
+
defaultValue: HttpFieldValue.or(ComputedDefaultValue).optional(),
|
|
2776
2811
|
configuration: import_v43.default.object({
|
|
2777
2812
|
trigger: FieldReference.optional().describe(
|
|
2778
2813
|
"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."
|
|
@@ -2858,7 +2893,7 @@ var LinkButtonField = BaseField.extend({
|
|
|
2858
2893
|
});
|
|
2859
2894
|
var VerificationStatus = BaseField.extend({
|
|
2860
2895
|
type: import_v43.default.literal(FieldType.VERIFICATION_STATUS),
|
|
2861
|
-
defaultValue: VerificationStatusValue.optional(),
|
|
2896
|
+
defaultValue: VerificationStatusValue.or(ComputedDefaultValue).optional(),
|
|
2862
2897
|
configuration: import_v43.default.object({
|
|
2863
2898
|
status: TranslationConfig.describe("Text to display on the status pill."),
|
|
2864
2899
|
description: TranslationConfig.describe(
|
|
@@ -2880,7 +2915,7 @@ var QueryParamReaderField = BaseField.extend({
|
|
|
2880
2915
|
});
|
|
2881
2916
|
var QrReaderField = BaseField.extend({
|
|
2882
2917
|
type: import_v43.default.literal(FieldType.QR_READER),
|
|
2883
|
-
defaultValue: QrReaderFieldValue.optional(),
|
|
2918
|
+
defaultValue: QrReaderFieldValue.or(ComputedDefaultValue).optional(),
|
|
2884
2919
|
configuration: import_v43.default.object({
|
|
2885
2920
|
validator: import_v43.default.any().meta({
|
|
2886
2921
|
description: "JSON Schema to validate the scanned QR code data against before populating the form fields.",
|
|
@@ -2893,7 +2928,7 @@ var QrReaderField = BaseField.extend({
|
|
|
2893
2928
|
});
|
|
2894
2929
|
var IdReaderField = BaseField.extend({
|
|
2895
2930
|
type: import_v43.default.literal(FieldType.ID_READER),
|
|
2896
|
-
defaultValue: IdReaderFieldValue.optional(),
|
|
2931
|
+
defaultValue: IdReaderFieldValue.or(ComputedDefaultValue).optional(),
|
|
2897
2932
|
methods: import_v43.default.array(
|
|
2898
2933
|
import_v43.default.union([QrReaderField, LinkButtonField]).describe("Methods for reading an ID")
|
|
2899
2934
|
)
|
|
@@ -3187,6 +3222,14 @@ var ReadActionConfig = ActionConfigBase.extend(
|
|
|
3187
3222
|
conditionals: z24.never().optional().describe("Read-action can not be disabled or hidden with conditionals.")
|
|
3188
3223
|
}).shape
|
|
3189
3224
|
);
|
|
3225
|
+
var NotifyConfig = DeclarationActionBase.extend(
|
|
3226
|
+
z24.object({
|
|
3227
|
+
type: z24.literal(ActionType.NOTIFY),
|
|
3228
|
+
review: DeclarationReviewConfig.describe(
|
|
3229
|
+
"Configuration of the review page fields."
|
|
3230
|
+
).optional()
|
|
3231
|
+
}).shape
|
|
3232
|
+
);
|
|
3190
3233
|
var DeclareConfig = DeclarationActionBase.extend(
|
|
3191
3234
|
z24.object({
|
|
3192
3235
|
type: z24.literal(ActionType.DECLARE),
|
|
@@ -3271,9 +3314,13 @@ var ActionConfig = z24.discriminatedUnion("type", [
|
|
|
3271
3314
|
id: "ReadActionConfig",
|
|
3272
3315
|
description: "Configuration for the read action \u2014 defines the record-tab content displayed on the event overview page."
|
|
3273
3316
|
}),
|
|
3317
|
+
NotifyConfig.meta({
|
|
3318
|
+
id: "NotifyActionConfig",
|
|
3319
|
+
description: "Configuration for the notify action. When present, NOTIFY uses this config independently from DECLARE. When absent, NOTIFY falls back to the DeclareActionConfig."
|
|
3320
|
+
}),
|
|
3274
3321
|
DeclareConfig.meta({
|
|
3275
3322
|
id: "DeclareActionConfig",
|
|
3276
|
-
description: "Configuration for the declare action. Includes review-page fields.
|
|
3323
|
+
description: "Configuration for the declare action. Includes review-page fields. NOTIFY falls back to this config when no dedicated NotifyActionConfig is provided."
|
|
3277
3324
|
}),
|
|
3278
3325
|
RejectConfig.meta({
|
|
3279
3326
|
id: "RejectActionConfig",
|
|
@@ -3452,6 +3499,9 @@ var BaseField3 = z28.object({
|
|
|
3452
3499
|
),
|
|
3453
3500
|
validations: z28.array(ValidationConfig).optional().describe(
|
|
3454
3501
|
`Option for overriding the field validations specifically for advanced search form.`
|
|
3502
|
+
),
|
|
3503
|
+
allowedLocations: JurisdictionReference.optional().describe(
|
|
3504
|
+
`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.`
|
|
3455
3505
|
)
|
|
3456
3506
|
});
|
|
3457
3507
|
var SearchQueryParams = z28.object({
|
|
@@ -3526,9 +3576,11 @@ var z30 = __toESM(require("zod/v4"));
|
|
|
3526
3576
|
var z29 = __toESM(require("zod/v4"));
|
|
3527
3577
|
function getDynamicNameValue(field3) {
|
|
3528
3578
|
const nameConfiguration = field3.configuration?.name;
|
|
3579
|
+
const firstnameRequired = nameConfiguration?.firstname?.required ?? field3.required;
|
|
3580
|
+
const surnameRequired = nameConfiguration?.surname?.required ?? field3.required;
|
|
3529
3581
|
return z29.object({
|
|
3530
|
-
firstname:
|
|
3531
|
-
surname:
|
|
3582
|
+
firstname: firstnameRequired ? NonEmptyTextValue : TextValue,
|
|
3583
|
+
surname: surnameRequired ? NonEmptyTextValue : TextValue,
|
|
3532
3584
|
middlename: nameConfiguration?.middlename?.required ? NonEmptyTextValue : TextValue.optional()
|
|
3533
3585
|
});
|
|
3534
3586
|
}
|
|
@@ -3875,7 +3927,7 @@ var isHiddenFieldType = (field3) => {
|
|
|
3875
3927
|
return field3.config.type === FieldType.ALPHA_HIDDEN;
|
|
3876
3928
|
};
|
|
3877
3929
|
var isNonInteractiveFieldType = (field3) => {
|
|
3878
|
-
return field3.type === FieldType.DIVIDER || field3.type === FieldType.PAGE_HEADER || field3.type === FieldType.PARAGRAPH || field3.type === FieldType.HEADING || field3.type === FieldType.BULLET_LIST || field3.type === FieldType.DATA || field3.type === FieldType.ALPHA_PRINT_BUTTON || field3.type === FieldType.
|
|
3930
|
+
return field3.type === FieldType.DIVIDER || field3.type === FieldType.PAGE_HEADER || field3.type === FieldType.PARAGRAPH || field3.type === FieldType.HEADING || field3.type === FieldType.BULLET_LIST || field3.type === FieldType.DATA || field3.type === FieldType.ALPHA_PRINT_BUTTON || field3.type === FieldType.LINK_BUTTON || field3.type === FieldType.LOADER;
|
|
3879
3931
|
};
|
|
3880
3932
|
|
|
3881
3933
|
// ../commons/src/conditionals/validate.ts
|
|
@@ -3911,7 +3963,37 @@ function resolveDataPath(rootData, dataPath, instancePath) {
|
|
|
3911
3963
|
}
|
|
3912
3964
|
return current;
|
|
3913
3965
|
}
|
|
3966
|
+
function todayISO() {
|
|
3967
|
+
return (0, import_date_fns.formatISO)(/* @__PURE__ */ new Date(), { representation: "date" });
|
|
3968
|
+
}
|
|
3969
|
+
var compiledFunctionCache = /* @__PURE__ */ new Map();
|
|
3970
|
+
function compileClientFunction(code) {
|
|
3971
|
+
let fn = compiledFunctionCache.get(code);
|
|
3972
|
+
if (!fn) {
|
|
3973
|
+
fn = new Function(`return (${code})`)();
|
|
3974
|
+
compiledFunctionCache.set(code, fn);
|
|
3975
|
+
}
|
|
3976
|
+
return fn;
|
|
3977
|
+
}
|
|
3914
3978
|
(0, import_ajv_formats.default)(ajv);
|
|
3979
|
+
function buildClientFunctionContext(input) {
|
|
3980
|
+
return {
|
|
3981
|
+
$form: input.form,
|
|
3982
|
+
$now: todayISO(),
|
|
3983
|
+
// eslint-disable-next-line @typescript-eslint/no-use-before-define
|
|
3984
|
+
$online: isOnline(),
|
|
3985
|
+
$user: input.validatorContext?.user,
|
|
3986
|
+
$event: input.validatorContext?.event,
|
|
3987
|
+
$leafAdminStructureLocationIds: input.validatorContext?.leafAdminStructureLocationIds ?? [],
|
|
3988
|
+
user: input.systemVariables?.user,
|
|
3989
|
+
$window: input.systemVariables?.$window,
|
|
3990
|
+
locations: input.locations,
|
|
3991
|
+
adminLevelIds: input.adminLevelIds
|
|
3992
|
+
};
|
|
3993
|
+
}
|
|
3994
|
+
function runClientFunction(code, data, context) {
|
|
3995
|
+
return compileClientFunction(code)(data, context);
|
|
3996
|
+
}
|
|
3915
3997
|
ajv.addKeyword({
|
|
3916
3998
|
keyword: "daysFromDate",
|
|
3917
3999
|
type: "string",
|
|
@@ -3956,7 +4038,7 @@ ajv.addKeyword({
|
|
|
3956
4038
|
$data: true,
|
|
3957
4039
|
errors: true,
|
|
3958
4040
|
// @ts-ignore -- Force type. We will move this away from AJV next. Parsing the array will take seconds and is only called by core.
|
|
3959
|
-
validate(
|
|
4041
|
+
validate(_schema, data, _2, dataContext) {
|
|
3960
4042
|
const locationIdInput = data;
|
|
3961
4043
|
const locations = dataContext?.rootData.$leafAdminStructureLocationIds ?? [];
|
|
3962
4044
|
return locations.some((location) => location.id === locationIdInput);
|
|
@@ -3987,6 +4069,23 @@ function isAgeValue(value) {
|
|
|
3987
4069
|
function mergeWithBaseFormState(values, context) {
|
|
3988
4070
|
return { ...context.baseFormState, ...values };
|
|
3989
4071
|
}
|
|
4072
|
+
ajv.addKeyword({
|
|
4073
|
+
keyword: "customClientValidator",
|
|
4074
|
+
schemaType: "object",
|
|
4075
|
+
errors: true,
|
|
4076
|
+
// @ts-expect-error -- AJV's public types don't expose `rootData`. All
|
|
4077
|
+
// `validate()` callers build root data via `buildClientFunctionContext`,
|
|
4078
|
+
// so the cast holds.
|
|
4079
|
+
validate(schema, data, _2, dataContext) {
|
|
4080
|
+
return Boolean(
|
|
4081
|
+
runClientFunction(
|
|
4082
|
+
schema.code,
|
|
4083
|
+
data,
|
|
4084
|
+
dataContext?.rootData ?? buildClientFunctionContext({ form: {} })
|
|
4085
|
+
)
|
|
4086
|
+
);
|
|
4087
|
+
}
|
|
4088
|
+
});
|
|
3990
4089
|
function validate(schema, data) {
|
|
3991
4090
|
const validator = ajv.getSchema(schema.$id) || ajv.compile(schema);
|
|
3992
4091
|
if ("$form" in data) {
|
|
@@ -4023,17 +4122,14 @@ function isOnline() {
|
|
|
4023
4122
|
}
|
|
4024
4123
|
return true;
|
|
4025
4124
|
}
|
|
4026
|
-
function isConditionMet(conditional, values, context
|
|
4027
|
-
return validate(
|
|
4028
|
-
|
|
4029
|
-
|
|
4030
|
-
|
|
4031
|
-
|
|
4032
|
-
|
|
4033
|
-
|
|
4034
|
-
$status: eventIndex?.status,
|
|
4035
|
-
$event: context.event
|
|
4036
|
-
});
|
|
4125
|
+
function isConditionMet(conditional, values, context) {
|
|
4126
|
+
return validate(
|
|
4127
|
+
conditional,
|
|
4128
|
+
buildClientFunctionContext({
|
|
4129
|
+
form: mergeWithBaseFormState(values, context),
|
|
4130
|
+
validatorContext: context
|
|
4131
|
+
})
|
|
4132
|
+
);
|
|
4037
4133
|
}
|
|
4038
4134
|
function getConditionalActionsForField(field3, values) {
|
|
4039
4135
|
if (!field3.conditionals) {
|
|
@@ -4041,9 +4137,9 @@ function getConditionalActionsForField(field3, values) {
|
|
|
4041
4137
|
}
|
|
4042
4138
|
return field3.conditionals.filter((conditional) => validate(conditional.conditional, values)).map((conditional) => conditional.type);
|
|
4043
4139
|
}
|
|
4044
|
-
function areConditionsMet(conditions, values, context,
|
|
4140
|
+
function areConditionsMet(conditions, values, context, _event) {
|
|
4045
4141
|
return conditions.every(
|
|
4046
|
-
(condition) => isConditionMet(condition.conditional, values, context
|
|
4142
|
+
(condition) => isConditionMet(condition.conditional, values, context)
|
|
4047
4143
|
);
|
|
4048
4144
|
}
|
|
4049
4145
|
function isFieldConditionMet(field3, form, conditionalType, context) {
|
|
@@ -4053,14 +4149,13 @@ function isFieldConditionMet(field3, form, conditionalType, context) {
|
|
|
4053
4149
|
if (!hasRule) {
|
|
4054
4150
|
return true;
|
|
4055
4151
|
}
|
|
4056
|
-
const validConditionals = getConditionalActionsForField(
|
|
4057
|
-
|
|
4058
|
-
|
|
4059
|
-
|
|
4060
|
-
|
|
4061
|
-
|
|
4062
|
-
|
|
4063
|
-
});
|
|
4152
|
+
const validConditionals = getConditionalActionsForField(
|
|
4153
|
+
field3,
|
|
4154
|
+
buildClientFunctionContext({
|
|
4155
|
+
form: mergeWithBaseFormState(form, context),
|
|
4156
|
+
validatorContext: context
|
|
4157
|
+
})
|
|
4158
|
+
);
|
|
4064
4159
|
return validConditionals.includes(conditionalType);
|
|
4065
4160
|
}
|
|
4066
4161
|
function isFieldVisible(field3, form, context) {
|
|
@@ -4086,7 +4181,14 @@ function isActionConditionMet(actionConfig, event2, context, conditionalType) {
|
|
|
4086
4181
|
if (!rule) {
|
|
4087
4182
|
return true;
|
|
4088
4183
|
}
|
|
4089
|
-
return
|
|
4184
|
+
return validate(rule.conditional, {
|
|
4185
|
+
...buildClientFunctionContext({
|
|
4186
|
+
form: mergeWithBaseFormState(event2.declaration, context),
|
|
4187
|
+
validatorContext: context
|
|
4188
|
+
}),
|
|
4189
|
+
$flags: event2.flags,
|
|
4190
|
+
$status: event2.status
|
|
4191
|
+
});
|
|
4090
4192
|
}
|
|
4091
4193
|
function isActionEnabled(actionConfig, event2, context) {
|
|
4092
4194
|
return isActionConditionMet(
|
|
@@ -4245,19 +4347,10 @@ function runFieldValidations({
|
|
|
4245
4347
|
if (!isFieldVisible(field3.config, form, context)) {
|
|
4246
4348
|
return [];
|
|
4247
4349
|
}
|
|
4248
|
-
const conditionalParameters = {
|
|
4249
|
-
|
|
4250
|
-
|
|
4251
|
-
|
|
4252
|
-
* In real use cases, there can be hundreds of thousands of locations.
|
|
4253
|
-
* Make sure that the context contains only the locations that are needed for validation.
|
|
4254
|
-
* E.g. if the user is a leaf admin, only the leaf locations under their admin structure are needed.
|
|
4255
|
-
* Loading few megabytes of locations to memory just for validation is not efficient and will choke the application.
|
|
4256
|
-
*/
|
|
4257
|
-
$leafAdminStructureLocationIds: context.leafAdminStructureLocationIds ?? [],
|
|
4258
|
-
$online: isOnline(),
|
|
4259
|
-
$user: context.user
|
|
4260
|
-
};
|
|
4350
|
+
const conditionalParameters = buildClientFunctionContext({
|
|
4351
|
+
form: mergeWithBaseFormState(form, context),
|
|
4352
|
+
validatorContext: context
|
|
4353
|
+
});
|
|
4261
4354
|
if (isFieldGroupFieldType(field3)) {
|
|
4262
4355
|
const subfieldErrors = buildFormState(
|
|
4263
4356
|
field3.config.fields,
|
|
@@ -4396,13 +4489,13 @@ function getActionConfig({
|
|
|
4396
4489
|
actionType,
|
|
4397
4490
|
customActionType
|
|
4398
4491
|
}) {
|
|
4492
|
+
if (actionType === ActionType.NOTIFY) {
|
|
4493
|
+
return eventConfiguration.actions.find((a) => a.type === ActionType.NOTIFY) ?? eventConfiguration.actions.find((a) => a.type === ActionType.DECLARE);
|
|
4494
|
+
}
|
|
4399
4495
|
return eventConfiguration.actions.find((a) => {
|
|
4400
4496
|
if (a.type === ActionType.CUSTOM && customActionType) {
|
|
4401
4497
|
return a.customActionType === customActionType;
|
|
4402
4498
|
}
|
|
4403
|
-
if (actionType === ActionType.NOTIFY) {
|
|
4404
|
-
return a.type === ActionType.DECLARE;
|
|
4405
|
-
}
|
|
4406
4499
|
if (actionType === ActionType.APPROVE_CORRECTION || actionType === ActionType.REJECT_CORRECTION) {
|
|
4407
4500
|
return a.type === ActionType.REQUEST_CORRECTION;
|
|
4408
4501
|
}
|
|
@@ -4439,7 +4532,7 @@ var getActionAnnotationFields = (actionConfig) => {
|
|
|
4439
4532
|
if (actionConfig.type === ActionType.CUSTOM) {
|
|
4440
4533
|
return actionConfig.form;
|
|
4441
4534
|
}
|
|
4442
|
-
if ("review" in actionConfig) {
|
|
4535
|
+
if ("review" in actionConfig && actionConfig.review != null) {
|
|
4443
4536
|
return actionConfig.review.fields;
|
|
4444
4537
|
}
|
|
4445
4538
|
return [];
|
|
@@ -4741,19 +4834,16 @@ function getPendingAction(actions) {
|
|
|
4741
4834
|
}
|
|
4742
4835
|
return pendingActions[0];
|
|
4743
4836
|
}
|
|
4744
|
-
function getCompleteActionAnnotation(
|
|
4837
|
+
function getCompleteActionAnnotation(event2, action) {
|
|
4745
4838
|
if (action.originalActionId) {
|
|
4746
4839
|
const originalAction = event2.actions.find(
|
|
4747
4840
|
({ id }) => id === action.originalActionId
|
|
4748
4841
|
);
|
|
4749
4842
|
if (originalAction?.status === ActionStatus.Requested) {
|
|
4750
|
-
return deepMerge(
|
|
4751
|
-
deepMerge(annotation, originalAction.annotation ?? {}),
|
|
4752
|
-
action.annotation ?? {}
|
|
4753
|
-
);
|
|
4843
|
+
return deepMerge(originalAction.annotation ?? {}, action.annotation ?? {});
|
|
4754
4844
|
}
|
|
4755
4845
|
}
|
|
4756
|
-
return
|
|
4846
|
+
return action.annotation ?? {};
|
|
4757
4847
|
}
|
|
4758
4848
|
function getCompleteActionContent(event2, action) {
|
|
4759
4849
|
const currentContent = "content" in action ? action.content : void 0;
|
|
@@ -4789,7 +4879,7 @@ function getAcceptedActions(event2) {
|
|
|
4789
4879
|
return event2.actions.filter(isAcceptedAction).map((action) => ({
|
|
4790
4880
|
...action,
|
|
4791
4881
|
declaration: getCompleteActionDeclaration({}, event2, action),
|
|
4792
|
-
annotation: getCompleteActionAnnotation(
|
|
4882
|
+
annotation: getCompleteActionAnnotation(event2, action)
|
|
4793
4883
|
}));
|
|
4794
4884
|
}
|
|
4795
4885
|
var EXCLUDED_ACTIONS = [
|
|
@@ -5427,7 +5517,54 @@ function createFieldConditionals(fieldId) {
|
|
|
5427
5517
|
}
|
|
5428
5518
|
},
|
|
5429
5519
|
required: [fieldId]
|
|
5430
|
-
})
|
|
5520
|
+
}),
|
|
5521
|
+
/**
|
|
5522
|
+
* Custom client-side validator. The provided function is serialised and executed
|
|
5523
|
+
* just-in-time on the client only. External references (e.g. lodash) are not
|
|
5524
|
+
* available inside the function body — all logic must be self-contained.
|
|
5525
|
+
*
|
|
5526
|
+
* @example
|
|
5527
|
+
* field('nid').customClientValidator((value) => {
|
|
5528
|
+
* // LUHN check — all logic must be inline
|
|
5529
|
+
* const digits = String(value).split('').map(Number)
|
|
5530
|
+
* // ...
|
|
5531
|
+
* return isValid
|
|
5532
|
+
* })
|
|
5533
|
+
*/
|
|
5534
|
+
customClientValidator(validationFn) {
|
|
5535
|
+
const code = validationFn.toString();
|
|
5536
|
+
return defineFormConditional({
|
|
5537
|
+
type: "object",
|
|
5538
|
+
properties: wrapToPath(
|
|
5539
|
+
{ [fieldId]: { customClientValidator: { code } } },
|
|
5540
|
+
this.$$subfield
|
|
5541
|
+
),
|
|
5542
|
+
required: [fieldId]
|
|
5543
|
+
});
|
|
5544
|
+
},
|
|
5545
|
+
/**
|
|
5546
|
+
* Custom client-side evaluation. Returns a {@link FieldReference} descriptor
|
|
5547
|
+
* that can be used as the `value` property or a DATA component entry.
|
|
5548
|
+
* The function receives the referenced field's value as the first argument and
|
|
5549
|
+
* the full form context as the second; its return value replaces the field reference.
|
|
5550
|
+
* The function is serialised and executed just-in-time on the client only.
|
|
5551
|
+
* External references (e.g. lodash) are not available inside the function body.
|
|
5552
|
+
*
|
|
5553
|
+
* For computing a default value without referencing a specific field, use
|
|
5554
|
+
* `evaluate(fn)` in the `defaultValue` property instead.
|
|
5555
|
+
*
|
|
5556
|
+
* @example
|
|
5557
|
+
* field('a').customClientEvaluation((aValue, ctx) =>
|
|
5558
|
+
* Number(aValue) + Number(ctx.$form.b)
|
|
5559
|
+
* )
|
|
5560
|
+
*/
|
|
5561
|
+
customClientEvaluation(computationFn) {
|
|
5562
|
+
return {
|
|
5563
|
+
$$code: computationFn.toString(),
|
|
5564
|
+
$$field: fieldId,
|
|
5565
|
+
$$subfield: this.$$subfield
|
|
5566
|
+
};
|
|
5567
|
+
}
|
|
5431
5568
|
};
|
|
5432
5569
|
}
|
|
5433
5570
|
|
|
@@ -6367,6 +6504,8 @@ var updateActions = ActionTypes.extract([
|
|
|
6367
6504
|
ActionType.ARCHIVE,
|
|
6368
6505
|
ActionType.PRINT_CERTIFICATE,
|
|
6369
6506
|
ActionType.REQUEST_CORRECTION,
|
|
6507
|
+
ActionType.APPROVE_CORRECTION,
|
|
6508
|
+
ActionType.REJECT_CORRECTION,
|
|
6370
6509
|
ActionType.CUSTOM
|
|
6371
6510
|
]);
|
|
6372
6511
|
function getActionUpdateMetadata(actions) {
|
|
@@ -6381,7 +6520,7 @@ function getActionUpdateMetadata(actions) {
|
|
|
6381
6520
|
"createdAtLocation",
|
|
6382
6521
|
"createdByRole"
|
|
6383
6522
|
];
|
|
6384
|
-
return actions.filter(({ type }) => updateActions.safeParse(type).success).
|
|
6523
|
+
return actions.filter(({ type }) => updateActions.safeParse(type).success).reduce(
|
|
6385
6524
|
(_2, action) => {
|
|
6386
6525
|
if (action.originalActionId) {
|
|
6387
6526
|
const originalAction = actions.find(({ id }) => id === action.originalActionId) ?? action;
|
|
@@ -6408,9 +6547,6 @@ function getLegalStatuses(actions) {
|
|
|
6408
6547
|
// ../commons/src/events/state/flags.ts
|
|
6409
6548
|
var import_lodash3 = require("lodash");
|
|
6410
6549
|
var import_date_fns3 = require("date-fns");
|
|
6411
|
-
function isEditInProgress(actions) {
|
|
6412
|
-
return actions.at(-1)?.type === ActionType.EDIT;
|
|
6413
|
-
}
|
|
6414
6550
|
function findPendingCorrectionAction(writeActions2) {
|
|
6415
6551
|
let correctionRequestAction;
|
|
6416
6552
|
for (let i = writeActions2.length - 1; i >= 0; i--) {
|
|
@@ -6425,29 +6561,6 @@ function findPendingCorrectionAction(writeActions2) {
|
|
|
6425
6561
|
}
|
|
6426
6562
|
return correctionRequestAction;
|
|
6427
6563
|
}
|
|
6428
|
-
function isCorrectionRequested(actions) {
|
|
6429
|
-
return findPendingCorrectionAction(actions) !== void 0;
|
|
6430
|
-
}
|
|
6431
|
-
function isDeclarationIncomplete(actions) {
|
|
6432
|
-
return getStatusFromActions(actions) === EventStatus.enum.NOTIFIED;
|
|
6433
|
-
}
|
|
6434
|
-
function isRejected(actions) {
|
|
6435
|
-
const resettingActionTypes = [
|
|
6436
|
-
ActionType.NOTIFY,
|
|
6437
|
-
ActionType.DECLARE,
|
|
6438
|
-
ActionType.EDIT,
|
|
6439
|
-
ActionType.REGISTER
|
|
6440
|
-
];
|
|
6441
|
-
return actions.reduce((prev, { type }) => {
|
|
6442
|
-
if (type === ActionType.REJECT) {
|
|
6443
|
-
return true;
|
|
6444
|
-
}
|
|
6445
|
-
if (resettingActionTypes.includes(type)) {
|
|
6446
|
-
return false;
|
|
6447
|
-
}
|
|
6448
|
-
return prev;
|
|
6449
|
-
}, false);
|
|
6450
|
-
}
|
|
6451
6564
|
function isPotentialDuplicate(actions) {
|
|
6452
6565
|
return actions.reduce((prev, { type }) => {
|
|
6453
6566
|
if (type === ActionType.DUPLICATE_DETECTED) {
|
|
@@ -6475,6 +6588,88 @@ function isFlagConditionMet(conditional, form, action) {
|
|
|
6475
6588
|
}
|
|
6476
6589
|
});
|
|
6477
6590
|
}
|
|
6591
|
+
function actionConfigRemovesFlag(action, flagId, actionsUpToAndIncluding, event2, eventConfiguration) {
|
|
6592
|
+
if (!isActionConfigType(action.type)) {
|
|
6593
|
+
return false;
|
|
6594
|
+
}
|
|
6595
|
+
const actionConfig = getActionConfig({
|
|
6596
|
+
eventConfiguration,
|
|
6597
|
+
actionType: action.type,
|
|
6598
|
+
customActionType: "customActionType" in action ? action.customActionType : void 0
|
|
6599
|
+
});
|
|
6600
|
+
const removeOperations = (actionConfig?.flags ?? []).filter(
|
|
6601
|
+
({ id, operation }) => id === flagId && operation === "remove"
|
|
6602
|
+
);
|
|
6603
|
+
if (removeOperations.length === 0) {
|
|
6604
|
+
return false;
|
|
6605
|
+
}
|
|
6606
|
+
const eventUpToThisAction = { ...event2, actions: actionsUpToAndIncluding };
|
|
6607
|
+
const declaration = aggregateActionDeclarations(eventUpToThisAction);
|
|
6608
|
+
const annotation = aggregateActionAnnotations(eventUpToThisAction);
|
|
6609
|
+
const form = { ...declaration, ...annotation };
|
|
6610
|
+
return removeOperations.some(
|
|
6611
|
+
({ conditional }) => conditional ? isFlagConditionMet(conditional, form, action) : true
|
|
6612
|
+
);
|
|
6613
|
+
}
|
|
6614
|
+
var INHERENT_FLAG_RULES = [
|
|
6615
|
+
{
|
|
6616
|
+
flag: InherentFlags.CORRECTION_REQUESTED,
|
|
6617
|
+
setOn: [ActionType.REQUEST_CORRECTION],
|
|
6618
|
+
resetOn: [ActionType.APPROVE_CORRECTION, ActionType.REJECT_CORRECTION]
|
|
6619
|
+
},
|
|
6620
|
+
{
|
|
6621
|
+
// INCOMPLETE mirrors the NOTIFIED status: set by NOTIFY, cleared by any
|
|
6622
|
+
// other status-changing action (see getStatusFromActions).
|
|
6623
|
+
flag: InherentFlags.INCOMPLETE,
|
|
6624
|
+
setOn: [ActionType.NOTIFY],
|
|
6625
|
+
resetOn: [
|
|
6626
|
+
ActionType.CREATE,
|
|
6627
|
+
ActionType.DECLARE,
|
|
6628
|
+
ActionType.REGISTER,
|
|
6629
|
+
ActionType.ARCHIVE
|
|
6630
|
+
]
|
|
6631
|
+
},
|
|
6632
|
+
{
|
|
6633
|
+
flag: InherentFlags.REJECTED,
|
|
6634
|
+
setOn: [ActionType.REJECT],
|
|
6635
|
+
resetOn: [
|
|
6636
|
+
ActionType.NOTIFY,
|
|
6637
|
+
ActionType.DECLARE,
|
|
6638
|
+
ActionType.EDIT,
|
|
6639
|
+
ActionType.REGISTER
|
|
6640
|
+
]
|
|
6641
|
+
},
|
|
6642
|
+
{
|
|
6643
|
+
flag: InherentFlags.POTENTIAL_DUPLICATE,
|
|
6644
|
+
setOn: [ActionType.DUPLICATE_DETECTED],
|
|
6645
|
+
resetOn: [ActionType.MARK_AS_DUPLICATE, ActionType.MARK_AS_NOT_DUPLICATE]
|
|
6646
|
+
},
|
|
6647
|
+
{
|
|
6648
|
+
flag: InherentFlags.EDIT_IN_PROGRESS,
|
|
6649
|
+
setOn: [ActionType.EDIT],
|
|
6650
|
+
resetOnAnyOtherAction: true
|
|
6651
|
+
}
|
|
6652
|
+
];
|
|
6653
|
+
function resolveInherentFlag(rule, acceptedActions, event2, eventConfiguration) {
|
|
6654
|
+
return acceptedActions.reduce((present, action, idx) => {
|
|
6655
|
+
if (rule.setOn.includes(action.type)) {
|
|
6656
|
+
return true;
|
|
6657
|
+
}
|
|
6658
|
+
if (rule.resetOnAnyOtherAction || (rule.resetOn ?? []).includes(action.type)) {
|
|
6659
|
+
return false;
|
|
6660
|
+
}
|
|
6661
|
+
if (actionConfigRemovesFlag(
|
|
6662
|
+
action,
|
|
6663
|
+
rule.flag,
|
|
6664
|
+
acceptedActions.slice(0, idx + 1),
|
|
6665
|
+
event2,
|
|
6666
|
+
eventConfiguration
|
|
6667
|
+
)) {
|
|
6668
|
+
return false;
|
|
6669
|
+
}
|
|
6670
|
+
return present;
|
|
6671
|
+
}, false);
|
|
6672
|
+
}
|
|
6478
6673
|
function resolveEventCustomFlags(event2, eventConfiguration) {
|
|
6479
6674
|
const actions = getAcceptedActions(event2).filter(({ type }) => !isMetaAction(type)).sort((a, b) => a.createdAt.localeCompare(b.createdAt));
|
|
6480
6675
|
return actions.reduce((acc, action, idx) => {
|
|
@@ -6523,33 +6718,19 @@ function getActionStatusFlags(sortedActions) {
|
|
|
6523
6718
|
return flag2;
|
|
6524
6719
|
});
|
|
6525
6720
|
}
|
|
6526
|
-
function getInherentFlags(sortedActions) {
|
|
6721
|
+
function getInherentFlags(sortedActions, event2, eventConfiguration) {
|
|
6527
6722
|
const acceptedActions = sortedActions.filter(
|
|
6528
6723
|
({ status: status2 }) => status2 === ActionStatus.Accepted
|
|
6529
6724
|
);
|
|
6530
|
-
|
|
6531
|
-
|
|
6532
|
-
|
|
6533
|
-
}
|
|
6534
|
-
if (isDeclarationIncomplete(acceptedActions)) {
|
|
6535
|
-
inherentFlags.push(InherentFlags.INCOMPLETE);
|
|
6536
|
-
}
|
|
6537
|
-
if (isRejected(acceptedActions)) {
|
|
6538
|
-
inherentFlags.push(InherentFlags.REJECTED);
|
|
6539
|
-
}
|
|
6540
|
-
if (isPotentialDuplicate(acceptedActions)) {
|
|
6541
|
-
inherentFlags.push(InherentFlags.POTENTIAL_DUPLICATE);
|
|
6542
|
-
}
|
|
6543
|
-
if (isEditInProgress(acceptedActions)) {
|
|
6544
|
-
inherentFlags.push(InherentFlags.EDIT_IN_PROGRESS);
|
|
6545
|
-
}
|
|
6546
|
-
return inherentFlags;
|
|
6725
|
+
return INHERENT_FLAG_RULES.filter(
|
|
6726
|
+
(rule) => resolveInherentFlag(rule, acceptedActions, event2, eventConfiguration)
|
|
6727
|
+
).map(({ flag: flag2 }) => flag2);
|
|
6547
6728
|
}
|
|
6548
6729
|
function getEventFlags(event2, config) {
|
|
6549
6730
|
const sortedActions = event2.actions.filter(({ type }) => !isMetaAction(type)).sort((a, b) => a.createdAt.localeCompare(b.createdAt));
|
|
6550
6731
|
return [
|
|
6551
6732
|
...getActionStatusFlags(sortedActions),
|
|
6552
|
-
...getInherentFlags(sortedActions),
|
|
6733
|
+
...getInherentFlags(sortedActions, event2, config),
|
|
6553
6734
|
...resolveEventCustomFlags(event2, config)
|
|
6554
6735
|
];
|
|
6555
6736
|
}
|
|
@@ -6786,7 +6967,7 @@ function getActionAnnotation({
|
|
|
6786
6967
|
const action = (0, import_lodash4.findLast)(activeActions, (a) => a.type === actionType);
|
|
6787
6968
|
const actionWithCompleteAnnotation = action && {
|
|
6788
6969
|
...action,
|
|
6789
|
-
annotation: getCompleteActionAnnotation(
|
|
6970
|
+
annotation: getCompleteActionAnnotation(event2, action)
|
|
6790
6971
|
};
|
|
6791
6972
|
const matchingDraft = draft?.action.type === actionType ? draft : void 0;
|
|
6792
6973
|
const sortedActions = (0, import_lodash4.orderBy)(
|
|
@@ -6858,6 +7039,9 @@ function createFieldConfig(fieldId, options) {
|
|
|
6858
7039
|
}
|
|
6859
7040
|
|
|
6860
7041
|
// ../commons/src/events/field.ts
|
|
7042
|
+
function evaluate(computationFn) {
|
|
7043
|
+
return { $$code: computationFn.toString() };
|
|
7044
|
+
}
|
|
6861
7045
|
function field(fieldId, options = {}) {
|
|
6862
7046
|
return {
|
|
6863
7047
|
...createFieldConditionals(fieldId),
|
|
@@ -7551,6 +7735,11 @@ var TENNIS_CLUB_DECLARATION_REVIEW = {
|
|
|
7551
7735
|
id: "signature.upload.modal.title",
|
|
7552
7736
|
defaultMessage: "Draw signature",
|
|
7553
7737
|
description: "Title for the modal to draw signature"
|
|
7738
|
+
},
|
|
7739
|
+
// Zod applies the schema default at parse time, but this fixture bypasses
|
|
7740
|
+
// parsing — GeneratedInputField accesses configuration.maxFileSize directly.
|
|
7741
|
+
configuration: {
|
|
7742
|
+
maxFileSize: 5 * 1024 * 1024
|
|
7554
7743
|
}
|
|
7555
7744
|
}
|
|
7556
7745
|
]
|
|
@@ -10107,7 +10296,7 @@ function matchesJurisdictionFilter(locationIds, filter, user2) {
|
|
|
10107
10296
|
return locationIds.some((id) => id === user2.primaryOfficeId);
|
|
10108
10297
|
}
|
|
10109
10298
|
if (filter === JurisdictionFilter.enum.administrativeArea) {
|
|
10110
|
-
return user2.administrativeAreaId
|
|
10299
|
+
return !user2.administrativeAreaId || locationIds.some((id) => id === user2.administrativeAreaId);
|
|
10111
10300
|
}
|
|
10112
10301
|
return true;
|
|
10113
10302
|
}
|
|
@@ -10196,7 +10385,7 @@ function canAccessUserWithScope({
|
|
|
10196
10385
|
}
|
|
10197
10386
|
const hasAdministrativeAreaInHierarchy = userToAccess.administrativeHierarchy.some(
|
|
10198
10387
|
(id) => user2.administrativeAreaId === id
|
|
10199
|
-
) || user2.administrativeAreaId
|
|
10388
|
+
) || !user2.administrativeAreaId;
|
|
10200
10389
|
if (opts?.accessLevel === JurisdictionFilter.enum.administrativeArea && !hasAdministrativeAreaInHierarchy) {
|
|
10201
10390
|
return false;
|
|
10202
10391
|
}
|
|
@@ -10502,18 +10691,19 @@ var ACTION_FILTERS = {
|
|
|
10502
10691
|
function filterActionsByFlags(actions, flags) {
|
|
10503
10692
|
return actions.filter((action) => ACTION_FILTERS[action]?.(flags) ?? true);
|
|
10504
10693
|
}
|
|
10694
|
+
var REJECTED_ACTIONS = [
|
|
10695
|
+
ActionType.READ,
|
|
10696
|
+
ActionType.NOTIFY,
|
|
10697
|
+
ActionType.CUSTOM,
|
|
10698
|
+
ActionType.EDIT,
|
|
10699
|
+
ActionType.ARCHIVE
|
|
10700
|
+
];
|
|
10505
10701
|
function getAvailableActionsWithoutFlagFilters(status2, flags) {
|
|
10506
10702
|
if (flags.includes(InherentFlags.EDIT_IN_PROGRESS)) {
|
|
10507
10703
|
return [ActionType.NOTIFY, ActionType.DECLARE, ActionType.REGISTER];
|
|
10508
10704
|
}
|
|
10509
|
-
if (flags.includes(InherentFlags.REJECTED)) {
|
|
10510
|
-
return
|
|
10511
|
-
ActionType.READ,
|
|
10512
|
-
ActionType.NOTIFY,
|
|
10513
|
-
ActionType.CUSTOM,
|
|
10514
|
-
ActionType.EDIT,
|
|
10515
|
-
ActionType.ARCHIVE
|
|
10516
|
-
];
|
|
10705
|
+
if (flags.includes(InherentFlags.REJECTED) && status2 !== EventStatus.enum.ARCHIVED) {
|
|
10706
|
+
return REJECTED_ACTIONS;
|
|
10517
10707
|
}
|
|
10518
10708
|
return AVAILABLE_ACTIONS_BY_EVENT_STATUS[status2];
|
|
10519
10709
|
}
|