@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.
@@ -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 decodeScope = (query) => {
707
- const scope = qs.parse(query, {
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
- return Scope.safeParse(unflattenedScope)?.data;
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 = TextValue.min(1);
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("Reference to a field by its ID");
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: FieldValue.optional(),
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. Shared with the notify action (ActionType.NOTIFY)."
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: nameConfiguration?.firstname?.required ? NonEmptyTextValue : TextValue,
3531
- surname: nameConfiguration?.surname?.required ? NonEmptyTextValue : TextValue,
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.HTTP || field3.type === FieldType.LINK_BUTTON || field3.type === FieldType.QUERY_PARAM_READER || field3.type === FieldType.LOADER;
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(schema, data, _2, dataContext) {
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, eventIndex) {
4027
- return validate(conditional, {
4028
- $form: mergeWithBaseFormState(values, context),
4029
- $now: (0, import_date_fns.formatISO)(/* @__PURE__ */ new Date(), { representation: "date" }),
4030
- $online: isOnline(),
4031
- $user: context.user,
4032
- $leafAdminStructureLocationIds: context.leafAdminStructureLocationIds ?? [],
4033
- $flags: eventIndex?.flags ?? [],
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, event2) {
4140
+ function areConditionsMet(conditions, values, context, _event) {
4045
4141
  return conditions.every(
4046
- (condition) => isConditionMet(condition.conditional, values, context, event2)
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(field3, {
4057
- $form: mergeWithBaseFormState(form, context),
4058
- $now: (0, import_date_fns.formatISO)(/* @__PURE__ */ new Date(), { representation: "date" }),
4059
- $online: isOnline(),
4060
- $user: context.user,
4061
- $leafAdminStructureLocationIds: context.leafAdminStructureLocationIds ?? [],
4062
- $event: context.event
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 isConditionMet(rule.conditional, event2.declaration, context, event2);
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
- $form: mergeWithBaseFormState(form, context),
4250
- $now: (0, import_date_fns.formatISO)(/* @__PURE__ */ new Date(), { representation: "date" }),
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(annotation, event2, action) {
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 deepMerge(annotation, action.annotation ?? {});
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({}, event2, action)
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).filter(({ status: status2 }) => status2 === ActionStatus.Accepted).reduce(
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
- const inherentFlags = [];
6531
- if (isCorrectionRequested(acceptedActions)) {
6532
- inherentFlags.push(InherentFlags.CORRECTION_REQUESTED);
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({}, event2, action)
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 === null || locationIds.some((id) => id === 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 === null;
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
  }