@opencrvs/toolkit 1.8.1-rc.d31fe05 → 1.8.1-rc.d3d858d

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.
Files changed (31) hide show
  1. package/dist/commons/api/router.d.ts +409 -392
  2. package/dist/commons/conditionals/validate.d.ts +11 -2
  3. package/dist/commons/events/ActionConfig.d.ts +2004 -366
  4. package/dist/commons/events/ActionDocument.d.ts +1252 -716
  5. package/dist/commons/events/ActionInput.d.ts +626 -600
  6. package/dist/commons/events/AdvancedSearchConfig.d.ts +49 -31
  7. package/dist/commons/events/CompositeFieldValue.d.ts +6 -6
  8. package/dist/commons/events/CountryConfigQueryInput.d.ts +88 -88
  9. package/dist/commons/events/Draft.d.ts +48 -48
  10. package/dist/commons/events/EventConfig.d.ts +673 -146
  11. package/dist/commons/events/EventDocument.d.ts +451 -432
  12. package/dist/commons/events/EventIndex.d.ts +184 -62
  13. package/dist/commons/events/EventMetadata.d.ts +9 -9
  14. package/dist/commons/events/FieldConfig.d.ts +254 -43
  15. package/dist/commons/events/FieldTypeMapping.d.ts +16 -16
  16. package/dist/commons/events/FieldValue.d.ts +12 -12
  17. package/dist/commons/events/FormConfig.d.ts +1032 -246
  18. package/dist/commons/events/PageConfig.d.ts +264 -46
  19. package/dist/commons/events/WorkqueueConfig.d.ts +288 -164
  20. package/dist/commons/events/defineConfig.d.ts +127 -28
  21. package/dist/commons/events/event.d.ts +61 -7
  22. package/dist/commons/events/test.utils.d.ts +12 -12
  23. package/dist/commons/events/utils.d.ts +234 -58
  24. package/dist/conditionals/index.js +3 -2
  25. package/dist/events/index.js +242 -89
  26. package/package.json +1 -1
  27. package/tsconfig.json +1 -1
  28. package/dist/commons/conditionals/conditionals.test.d.ts +0 -2
  29. package/dist/commons/conditionals/validate-address.test.d.ts +0 -2
  30. package/dist/commons/conditionals/validate.test.d.ts +0 -2
  31. package/dist/commons/events/utils.test.d.ts +0 -2
@@ -40,6 +40,7 @@ __export(events_exports, {
40
40
  ActionConfigBase: () => ActionConfigBase,
41
41
  ActionCreationMetadata: () => ActionCreationMetadata,
42
42
  ActionDocument: () => ActionDocument,
43
+ ActionFlag: () => ActionFlag,
43
44
  ActionFormConfig: () => ActionFormConfig,
44
45
  ActionInput: () => ActionInput,
45
46
  ActionStatus: () => ActionStatus,
@@ -95,6 +96,7 @@ __export(events_exports, {
95
96
  EventDocument: () => EventDocument,
96
97
  EventFieldConfigSchema: () => EventFieldConfigSchema,
97
98
  EventFieldId: () => EventFieldId,
99
+ EventFieldIdInput: () => EventFieldIdInput,
98
100
  EventIndex: () => EventIndex,
99
101
  EventInput: () => EventInput,
100
102
  EventMetadata: () => EventMetadata,
@@ -129,8 +131,10 @@ __export(events_exports, {
129
131
  InherentFlags: () => InherentFlags,
130
132
  LanguageConfig: () => LanguageConfig,
131
133
  LegalStatuses: () => LegalStatuses,
134
+ METADATA_FIELD_PREFIX: () => METADATA_FIELD_PREFIX,
132
135
  MarkedAsDuplicateActionInput: () => MarkedAsDuplicateActionInput,
133
136
  MimeType: () => MimeType,
137
+ NameConfig: () => NameConfig,
134
138
  NameFieldUpdateValue: () => NameFieldUpdateValue,
135
139
  NameFieldValue: () => NameFieldValue,
136
140
  NonEmptyTextValue: () => NonEmptyTextValue,
@@ -139,6 +143,7 @@ __export(events_exports, {
139
143
  PageConfig: () => PageConfig,
140
144
  PageTypes: () => PageTypes,
141
145
  PrintCertificateActionInput: () => PrintCertificateActionInput,
146
+ PrintContent: () => PrintContent,
142
147
  QueryExpression: () => QueryExpression,
143
148
  QueryInput: () => QueryInput,
144
149
  QueryType: () => QueryType,
@@ -167,6 +172,7 @@ __export(events_exports, {
167
172
  TENNIS_CLUB_MEMBERSHIP: () => TENNIS_CLUB_MEMBERSHIP,
168
173
  TEST_SYSTEM_IANA_TIMEZONE: () => TEST_SYSTEM_IANA_TIMEZONE,
169
174
  TestUserRole: () => TestUserRole,
175
+ TextField: () => TextField,
170
176
  TextValue: () => TextValue,
171
177
  TimeValue: () => TimeValue,
172
178
  TranslationConfig: () => TranslationConfig,
@@ -178,7 +184,6 @@ __export(events_exports, {
178
184
  ValidationConfig: () => ValidationConfig,
179
185
  VerificationActionConfig: () => VerificationActionConfig,
180
186
  VerificationPageConfig: () => VerificationPageConfig,
181
- VisibleStatus: () => VisibleStatus,
182
187
  WRITE_ACTION_SCOPES: () => WRITE_ACTION_SCOPES,
183
188
  Within: () => Within,
184
189
  WorkqueueActionsWithDefault: () => WorkqueueActionsWithDefault,
@@ -197,6 +202,7 @@ __export(events_exports, {
197
202
  annotationActions: () => annotationActions,
198
203
  applyDeclarationToEventIndex: () => applyDeclarationToEventIndex,
199
204
  applyDraftsToEventIndex: () => applyDraftsToEventIndex,
205
+ areCertificateConditionsMet: () => areCertificateConditionsMet,
200
206
  areConditionsMet: () => areConditionsMet,
201
207
  compositeFieldTypes: () => compositeFieldTypes,
202
208
  createEmptyDraft: () => createEmptyDraft,
@@ -320,6 +326,7 @@ __export(events_exports, {
320
326
  or: () => or,
321
327
  resolveDateOfEvent: () => resolveDateOfEvent,
322
328
  runFieldValidations: () => runFieldValidations,
329
+ runStructuralValidations: () => runStructuralValidations,
323
330
  timePeriodToDateRange: () => timePeriodToDateRange,
324
331
  user: () => user,
325
332
  validate: () => validate,
@@ -554,7 +561,7 @@ var import_zod6 = require("zod");
554
561
  var import_zod4 = require("zod");
555
562
  var import_zod_openapi3 = require("zod-openapi");
556
563
  (0, import_zod_openapi3.extendZodWithOpenApi)(import_zod4.z);
557
- var FullDocumentURL = import_zod4.z.string().brand("FullDocumentURL").describe(
564
+ var FullDocumentUrl = import_zod4.z.string().brand("FullDocumentUrl").describe(
558
565
  "A full url with protocol, host, bucket name, starting from the root of the S3 server, https://minio/bucket-name/document-id.jpg"
559
566
  );
560
567
  var FullDocumentPath = import_zod4.z.string().transform((val) => val.startsWith("/") ? val : `/${val}`).openapi({ effectType: "input", type: "string" }).describe(
@@ -611,8 +618,8 @@ var NameFieldValue = import_zod5.z.object({
611
618
  middlename: import_zod5.z.string().optional()
612
619
  });
613
620
  var NameFieldUpdateValue = import_zod5.z.object({
614
- firstname: import_zod5.z.string().nullish(),
615
- surname: import_zod5.z.string().nullish(),
621
+ firstname: import_zod5.z.string(),
622
+ surname: import_zod5.z.string(),
616
623
  middlename: import_zod5.z.string().nullish()
617
624
  }).or(import_zod5.z.null()).or(import_zod5.z.undefined());
618
625
  var RuralAddressUpdateValue = AdminStructure.extend({
@@ -909,18 +916,32 @@ var SelectDateRangeField = BaseField.extend({
909
916
  defaultValue: SelectDateRangeValue.optional(),
910
917
  options: import_zod7.z.array(SelectDateRangeOption).describe("A list of options")
911
918
  }).describe("Select input with date range options");
919
+ var NameConfig = import_zod7.z.object({
920
+ firstname: import_zod7.z.object({ required: import_zod7.z.boolean() }).optional(),
921
+ middlename: import_zod7.z.object({ required: import_zod7.z.boolean() }).optional(),
922
+ surname: import_zod7.z.object({ required: import_zod7.z.boolean() }).optional()
923
+ });
912
924
  var NameField = BaseField.extend({
913
925
  type: import_zod7.z.literal(FieldType.NAME),
914
926
  defaultValue: import_zod7.z.object({
915
- firstname: NonEmptyTextValue,
916
- surname: NonEmptyTextValue
927
+ firstname: NonEmptyTextValue.optional(),
928
+ middlename: NonEmptyTextValue.optional(),
929
+ surname: NonEmptyTextValue.optional()
917
930
  }).optional(),
918
931
  configuration: import_zod7.z.object({
932
+ name: NameConfig.default({
933
+ firstname: { required: true },
934
+ surname: { required: true }
935
+ }).optional(),
919
936
  maxLength: import_zod7.z.number().optional().describe("Maximum length of the text"),
920
937
  prefix: TranslationConfig.optional(),
921
938
  postfix: TranslationConfig.optional(),
922
- includeMiddlename: import_zod7.z.boolean().default(false).optional().describe("To make middle name visible in Name form field"),
923
939
  searchMode: import_zod7.z.boolean().optional()
940
+ }).default({
941
+ name: {
942
+ firstname: { required: true },
943
+ surname: { required: true }
944
+ }
924
945
  }).optional()
925
946
  }).describe("Name input field");
926
947
  var PhoneField = BaseField.extend({
@@ -1222,7 +1243,8 @@ var CertificateConfig = import_zod11.z.object({
1222
1243
  delayed: import_zod11.z.number()
1223
1244
  }),
1224
1245
  svgUrl: import_zod11.z.string(),
1225
- fonts: import_zod11.z.record(FontFamily).optional()
1246
+ fonts: import_zod11.z.record(FontFamily).optional(),
1247
+ conditionals: import_zod11.z.array(ShowConditional).optional()
1226
1248
  });
1227
1249
  var CertificateTemplateConfig = CertificateConfig.extend({
1228
1250
  hash: import_zod11.z.string().optional(),
@@ -1394,22 +1416,30 @@ var FieldConfigSchema = BaseField3.extend({
1394
1416
  fieldType: import_zod15.z.literal("field"),
1395
1417
  alternateFieldIds: import_zod15.z.array(import_zod15.z.string()).optional().describe(
1396
1418
  `Sometimes there might be need to search a value against multiple field of same FormField type. For example
1397
- search Country, Province, District against child.address.private and child.address.other. In such case, we
1419
+ search Country, Province, District against child.address.private and child.address.other. In such case, we
1398
1420
  add a one field as fieldId, and accomodate others in alternateFieldIds`
1399
1421
  ),
1400
- excludeInSearchQuery: import_zod15.z.boolean().default(false).optional().describe(`Sometimes there will be search fields which are used to
1401
- conditionally display another search field, but its not needed in search query. For example, child.placeOfBirth
1422
+ excludeInSearchQuery: import_zod15.z.boolean().default(false).optional().describe(`Sometimes there will be search fields which are used to
1423
+ conditionally display another search field, but its not needed in search query. For example, child.placeOfBirth
1402
1424
  is select field, which has 3 options, FACILITY, PRIVATE_HOME, OTHER. Upon selecting any of the option, pops up another field
1403
1425
  related to the selected option, whose value is required in the search query. But child.placeOfBirth itself is not needed in the query.
1404
1426
  In such case, populate this field (excludeInSearchQuery) with boolean true`)
1405
1427
  });
1406
- var EventFieldId = import_zod15.z.enum([
1428
+ var EventFieldIdInput = import_zod15.z.enum([
1407
1429
  "trackingId",
1408
1430
  "status",
1409
1431
  "legalStatuses.REGISTERED.acceptedAt",
1410
1432
  "legalStatuses.REGISTERED.createdAtLocation",
1411
1433
  "updatedAt"
1412
1434
  ]);
1435
+ var METADATA_FIELD_PREFIX = "event.";
1436
+ var EventFieldId = import_zod15.z.enum([
1437
+ `${METADATA_FIELD_PREFIX}trackingId`,
1438
+ `${METADATA_FIELD_PREFIX}status`,
1439
+ `${METADATA_FIELD_PREFIX}legalStatuses.REGISTERED.acceptedAt`,
1440
+ `${METADATA_FIELD_PREFIX}legalStatuses.REGISTERED.createdAtLocation`,
1441
+ `${METADATA_FIELD_PREFIX}updatedAt`
1442
+ ]);
1413
1443
  var EventFieldConfigSchema = BaseField3.extend({
1414
1444
  fieldId: EventFieldId,
1415
1445
  fieldType: import_zod15.z.literal("event")
@@ -1902,11 +1932,15 @@ var ActionBase = import_zod19.z.object({
1902
1932
  originalActionId: UUID.optional().nullable().describe(
1903
1933
  "Reference to the original action that was asynchronously rejected or accepted by 3rd party integration."
1904
1934
  )
1935
+ // 'content' field reserved for additional data
1936
+ // Each action can define its own content specifc to the action
1937
+ // See PrintCertificateAction
1905
1938
  });
1906
1939
  var AssignedAction = ActionBase.merge(
1907
1940
  import_zod19.z.object({
1908
1941
  type: import_zod19.z.literal(ActionType.ASSIGN),
1909
1942
  assignedTo: import_zod19.z.string()
1943
+ // TODO move into 'content' property
1910
1944
  })
1911
1945
  );
1912
1946
  var UnassignedAction = ActionBase.merge(
@@ -1918,6 +1952,7 @@ var RegisterAction = ActionBase.merge(
1918
1952
  import_zod19.z.object({
1919
1953
  type: import_zod19.z.literal(ActionType.REGISTER),
1920
1954
  registrationNumber: import_zod19.z.string().optional()
1955
+ // TODO move into 'content' property
1921
1956
  })
1922
1957
  );
1923
1958
  var DeclareAction = ActionBase.merge(
@@ -1938,6 +1973,7 @@ var RejectAction = ActionBase.merge(
1938
1973
  import_zod19.z.object({
1939
1974
  type: import_zod19.z.literal(ActionType.REJECT),
1940
1975
  reason: RejectionReason
1976
+ // TODO move into 'content' property
1941
1977
  })
1942
1978
  );
1943
1979
  var MarkAsDuplicateAction = ActionBase.merge(
@@ -1949,6 +1985,7 @@ var ArchiveAction = ActionBase.merge(
1949
1985
  import_zod19.z.object({
1950
1986
  type: import_zod19.z.literal(ActionType.ARCHIVE),
1951
1987
  reason: RejectionReason
1988
+ // TODO move into 'content' property
1952
1989
  })
1953
1990
  );
1954
1991
  var CreatedAction = ActionBase.merge(
@@ -1961,9 +1998,13 @@ var NotifiedAction = ActionBase.merge(
1961
1998
  type: import_zod19.z.literal(ActionType.NOTIFY)
1962
1999
  })
1963
2000
  );
2001
+ var PrintContent = import_zod19.z.object({
2002
+ templateId: import_zod19.z.string().optional()
2003
+ });
1964
2004
  var PrintCertificateAction = ActionBase.merge(
1965
2005
  import_zod19.z.object({
1966
- type: import_zod19.z.literal(ActionType.PRINT_CERTIFICATE)
2006
+ type: import_zod19.z.literal(ActionType.PRINT_CERTIFICATE),
2007
+ content: PrintContent.optional().nullable()
1967
2008
  })
1968
2009
  );
1969
2010
  var RequestedCorrectionAction = ActionBase.merge(
@@ -1975,12 +2016,14 @@ var ApprovedCorrectionAction = ActionBase.merge(
1975
2016
  import_zod19.z.object({
1976
2017
  type: import_zod19.z.literal(ActionType.APPROVE_CORRECTION),
1977
2018
  requestId: import_zod19.z.string()
2019
+ // TODO move into 'content' property
1978
2020
  })
1979
2021
  );
1980
2022
  var RejectedCorrectionAction = ActionBase.merge(
1981
2023
  import_zod19.z.object({
1982
2024
  type: import_zod19.z.literal(ActionType.REJECT_CORRECTION),
1983
2025
  requestId: import_zod19.z.string(),
2026
+ // TODO move into 'content' property
1984
2027
  reason: RejectionReason
1985
2028
  })
1986
2029
  );
@@ -2031,7 +2074,7 @@ var ResolvedUser = import_zod19.z.object({
2031
2074
  });
2032
2075
 
2033
2076
  // ../commons/src/conditionals/validate.ts
2034
- var import_ajv = __toESM(require("ajv"));
2077
+ var import__ = __toESM(require("ajv/dist/2019"));
2035
2078
  var import_ajv_formats = __toESM(require("ajv-formats"));
2036
2079
  var import_date_fns = require("date-fns");
2037
2080
 
@@ -2245,9 +2288,11 @@ var isNonInteractiveFieldType = (field2) => {
2245
2288
  };
2246
2289
 
2247
2290
  // ../commons/src/conditionals/validate.ts
2248
- var ajv = new import_ajv.default({
2291
+ var ajv = new import__.default({
2249
2292
  $data: true,
2250
- allowUnionTypes: true
2293
+ allowUnionTypes: true,
2294
+ strict: false
2295
+ // Allow minContains and other newer features
2251
2296
  });
2252
2297
  (0, import_ajv_formats.default)(ajv);
2253
2298
  ajv.addKeyword({
@@ -2420,6 +2465,23 @@ function validateFieldInput({
2420
2465
  const rawError = zodType.safeParse(value, { errorMap: zodToIntlErrorMap });
2421
2466
  return rawError.error?.issues.map((issue) => issue.message) ?? [];
2422
2467
  }
2468
+ function runStructuralValidations({
2469
+ field: field2,
2470
+ values
2471
+ }) {
2472
+ if (!isFieldVisible(field2, values) || isFieldEmptyAndNotRequired(field2, values)) {
2473
+ return {
2474
+ errors: []
2475
+ };
2476
+ }
2477
+ const fieldValidationResult = validateFieldInput({
2478
+ field: field2,
2479
+ value: values[field2.id]
2480
+ });
2481
+ return {
2482
+ errors: fieldValidationResult
2483
+ };
2484
+ }
2423
2485
  function runFieldValidations({
2424
2486
  field: field2,
2425
2487
  values
@@ -2485,6 +2547,11 @@ function getValidatorsForField(fieldId, validations) {
2485
2547
  };
2486
2548
  }).filter((x) => x !== null);
2487
2549
  }
2550
+ function areCertificateConditionsMet(conditions, values) {
2551
+ return conditions.every((condition) => {
2552
+ return ajv.validate(condition.conditional, values);
2553
+ });
2554
+ }
2488
2555
 
2489
2556
  // ../commons/src/utils.ts
2490
2557
  function getOrThrow(x, message) {
@@ -2705,16 +2772,16 @@ function timePeriodToDateRange(value) {
2705
2772
  let startDate;
2706
2773
  switch (value) {
2707
2774
  case "last7Days":
2708
- startDate = (0, import_date_fns2.subDays)(/* @__PURE__ */ new Date(), 6);
2775
+ startDate = (0, import_date_fns2.subDays)(/* @__PURE__ */ new Date(), 7);
2709
2776
  break;
2710
2777
  case "last30Days":
2711
- startDate = (0, import_date_fns2.subDays)(/* @__PURE__ */ new Date(), 29);
2778
+ startDate = (0, import_date_fns2.subDays)(/* @__PURE__ */ new Date(), 30);
2712
2779
  break;
2713
2780
  case "last90Days":
2714
- startDate = (0, import_date_fns2.subDays)(/* @__PURE__ */ new Date(), 89);
2781
+ startDate = (0, import_date_fns2.subDays)(/* @__PURE__ */ new Date(), 90);
2715
2782
  break;
2716
2783
  case "last365Days":
2717
- startDate = (0, import_date_fns2.subDays)(/* @__PURE__ */ new Date(), 364);
2784
+ startDate = (0, import_date_fns2.subDays)(/* @__PURE__ */ new Date(), 365);
2718
2785
  break;
2719
2786
  }
2720
2787
  return {
@@ -3081,8 +3148,9 @@ function createFieldConditionals(fieldId) {
3081
3148
  properties: {
3082
3149
  [fieldId]: {
3083
3150
  type: "string",
3084
- pattern: "^[\\p{Script=Latin}0-9'._-]*(\\([\\p{Script=Latin}0-9'._-]+\\))?[\\p{Script=Latin}0-9'._-]*( [\\p{Script=Latin}0-9'._-]*(\\([\\p{Script=Latin}0-9'._-]+\\))?[\\p{Script=Latin}0-9'._-]*)*$",
3085
- description: "Name must contain only letters, numbers, and allowed special characters ('._-). No double spaces."
3151
+ minLength: 1,
3152
+ pattern: "^[\\p{Script=Latin}0-9'.-]*(\\([\\p{Script=Latin}0-9'.-]+\\))?[\\p{Script=Latin}0-9'.-]*( [\\p{Script=Latin}0-9'.-]*(\\([\\p{Script=Latin}0-9'.-]+\\))?[\\p{Script=Latin}0-9'.-]*)*$",
3153
+ description: "Name must contain only letters, numbers, and allowed special characters ('.-). No double spaces."
3086
3154
  }
3087
3155
  }
3088
3156
  }),
@@ -3195,7 +3263,7 @@ function createSearchConfig(baseField) {
3195
3263
  // ../commons/src/event-config/event-configuration.ts
3196
3264
  function createEventFieldConfig(fieldId) {
3197
3265
  const baseField = {
3198
- fieldId,
3266
+ fieldId: `${METADATA_FIELD_PREFIX}${fieldId}`,
3199
3267
  fieldType: "event"
3200
3268
  };
3201
3269
  return createSearchConfig(baseField);
@@ -3208,32 +3276,107 @@ function eventFn(fieldId) {
3208
3276
  var event = Object.assign(eventFn, {
3209
3277
  /**
3210
3278
  * Checks if the event contains a specific action type.
3279
+ * Can be used directly as a conditional or chained with additional methods.
3211
3280
  * @param action - The action type to check for.
3212
3281
  */
3213
- hasAction: (action) => defineConditional({
3214
- type: "object",
3215
- properties: {
3216
- $event: {
3282
+ hasAction: (action) => {
3283
+ const basicConditional = defineConditional({
3284
+ type: "object",
3285
+ properties: {
3286
+ $event: {
3287
+ type: "object",
3288
+ properties: {
3289
+ actions: {
3290
+ type: "array",
3291
+ contains: {
3292
+ type: "object",
3293
+ properties: {
3294
+ type: {
3295
+ const: action
3296
+ }
3297
+ },
3298
+ required: ["type"]
3299
+ }
3300
+ }
3301
+ },
3302
+ required: ["actions"]
3303
+ }
3304
+ },
3305
+ required: ["$event"]
3306
+ });
3307
+ const buildActionConstraints = (additionalFields) => {
3308
+ const actionProperties = {
3309
+ type: { const: action }
3310
+ };
3311
+ const requiredFields = ["type"];
3312
+ if (additionalFields) {
3313
+ Object.entries(additionalFields).forEach(([key, value]) => {
3314
+ actionProperties[key] = { const: value };
3315
+ requiredFields.push(key);
3316
+ });
3317
+ }
3318
+ return { actionProperties, requiredFields };
3319
+ };
3320
+ const createCountConditional = (countType, count, additionalFields) => {
3321
+ const { actionProperties, requiredFields } = buildActionConstraints(additionalFields);
3322
+ return defineConditional({
3217
3323
  type: "object",
3218
3324
  properties: {
3219
- actions: {
3220
- type: "array",
3221
- contains: {
3222
- type: "object",
3223
- properties: {
3224
- type: {
3225
- const: action
3226
- }
3227
- },
3228
- required: ["type"]
3229
- }
3325
+ $event: {
3326
+ type: "object",
3327
+ properties: {
3328
+ actions: {
3329
+ type: "array",
3330
+ contains: {
3331
+ type: "object",
3332
+ properties: actionProperties,
3333
+ required: requiredFields
3334
+ },
3335
+ [countType]: count
3336
+ }
3337
+ },
3338
+ required: ["actions"]
3230
3339
  }
3231
3340
  },
3232
- required: ["actions"]
3233
- }
3234
- },
3235
- required: ["$event"]
3236
- }),
3341
+ required: ["$event"]
3342
+ });
3343
+ };
3344
+ const withMinMax = (additionalFields) => {
3345
+ return {
3346
+ /**
3347
+ * Creates a conditional that checks if the event contains a specific action type
3348
+ * with a minimum count of occurrences.
3349
+ *
3350
+ * @param minCount - The minimum number of actions required.
3351
+ */
3352
+ minCount: (minCount) => createCountConditional("minContains", minCount, additionalFields),
3353
+ /**
3354
+ * Builds a conditional that sets a maximum count for the number of actions.
3355
+ * This is useful for limiting the number of actions of a specific type in a single event.
3356
+ */
3357
+ maxCount: (maxCount) => createCountConditional("maxContains", maxCount, additionalFields)
3358
+ };
3359
+ };
3360
+ const chainableMethods = {
3361
+ /**
3362
+ * Adds additional field constraints to the action matching.
3363
+ *
3364
+ * @param fields - Object containing additional fields to match on the action.
3365
+ */
3366
+ withFields: (fields) => withMinMax(fields),
3367
+ /**
3368
+ * Adds template ID constraint to the action matching.
3369
+ * This is a convenience method that adds content.templateId to the fields.
3370
+ *
3371
+ * @param id - The template ID to match against.
3372
+ */
3373
+ withTemplate: (id) => withMinMax({
3374
+ content: { templateId: id }
3375
+ }),
3376
+ ...withMinMax()
3377
+ };
3378
+ return { ...basicConditional, ...chainableMethods };
3379
+ },
3237
3380
  field(field2) {
3238
3381
  return {
3239
3382
  $event: field2
@@ -3252,24 +3395,23 @@ var EventStatus = import_zod23.z.enum([
3252
3395
  "DECLARED",
3253
3396
  "VALIDATED",
3254
3397
  "REGISTERED",
3255
- "CERTIFIED",
3256
3398
  "ARCHIVED"
3257
3399
  ]);
3258
- var VisibleStatus = import_zod23.z.enum([...EventStatus.options, "REJECTED"]);
3259
3400
  var InherentFlags = {
3260
- PRINTED: "printed",
3401
+ PENDING_CERTIFICATION: "pending-certification",
3261
3402
  INCOMPLETE: "incomplete",
3262
3403
  REJECTED: "rejected",
3263
3404
  CORRECTION_REQUESTED: "correction-requested"
3264
3405
  };
3265
- var Flag = import_zod23.z.string().regex(
3406
+ var ActionFlag = import_zod23.z.string().regex(
3266
3407
  new RegExp(
3267
3408
  `^(${Object.values(ActionType).join("|").toLowerCase()}):(${Object.values(
3268
3409
  ActionStatus
3269
3410
  ).join("|").toLowerCase()})$`
3270
3411
  ),
3271
3412
  "Flag must be in the format ActionType:ActionStatus (lowerCase)"
3272
- ).or(import_zod23.z.nativeEnum(InherentFlags));
3413
+ );
3414
+ var Flag = ActionFlag.or(import_zod23.z.nativeEnum(InherentFlags));
3273
3415
  var ZodDate = import_zod23.z.string().date();
3274
3416
  var ActionCreationMetadata = import_zod23.z.object({
3275
3417
  createdAt: import_zod23.z.string().datetime().describe("The timestamp when the action request was created."),
@@ -3537,6 +3679,9 @@ var QueryExpression = import_zod25.z.object({
3537
3679
  createdAt: import_zod25.z.optional(DateCondition),
3538
3680
  updatedAt: import_zod25.z.optional(DateCondition),
3539
3681
  "legalStatuses.REGISTERED.acceptedAt": import_zod25.z.optional(DateCondition),
3682
+ "legalStatuses.DECLARED.createdAtLocation": import_zod25.z.optional(
3683
+ import_zod25.z.union([Within, Exact])
3684
+ ),
3540
3685
  "legalStatuses.REGISTERED.createdAtLocation": import_zod25.z.optional(
3541
3686
  import_zod25.z.union([Within, Exact])
3542
3687
  ),
@@ -3782,7 +3927,8 @@ var WorkqueueConfig = import_zod28.z.object({
3782
3927
  })
3783
3928
  ),
3784
3929
  columns: import_zod28.z.array(WorkqueueColumn).default(mandatoryColumns),
3785
- icon: AvailableIcons
3930
+ icon: AvailableIcons,
3931
+ emptyMessage: TranslationConfig.optional()
3786
3932
  }).describe("Configuration for workqueue.");
3787
3933
  var WorkqueueConfigWithoutQuery = WorkqueueConfig.omit({
3788
3934
  query: true,
@@ -3801,7 +3947,8 @@ var WorkqueueConfigInput = import_zod28.z.object({
3801
3947
  })
3802
3948
  ),
3803
3949
  columns: import_zod28.z.array(WorkqueueColumn).default(mandatoryColumns),
3804
- icon: AvailableIcons
3950
+ icon: AvailableIcons,
3951
+ emptyMessage: TranslationConfig.optional()
3805
3952
  });
3806
3953
  function defineWorkqueue(workqueueInput) {
3807
3954
  const queryInput = workqueueInput.query;
@@ -3890,7 +4037,8 @@ var DeclareActionInput = BaseActionInput.merge(
3890
4037
  );
3891
4038
  var PrintCertificateActionInput = BaseActionInput.merge(
3892
4039
  import_zod29.z.object({
3893
- type: import_zod29.z.literal(ActionType.PRINT_CERTIFICATE).default(ActionType.PRINT_CERTIFICATE)
4040
+ type: import_zod29.z.literal(ActionType.PRINT_CERTIFICATE).default(ActionType.PRINT_CERTIFICATE),
4041
+ content: PrintContent.optional()
3894
4042
  })
3895
4043
  );
3896
4044
  var RejectDeclarationActionInput = BaseActionInput.merge(
@@ -4102,16 +4250,19 @@ function getLegalStatuses(actions) {
4102
4250
  }
4103
4251
 
4104
4252
  // ../commons/src/events/state/flags.ts
4105
- function isCertificatePrinted(actions) {
4253
+ function isPendingCertification(actions) {
4254
+ if (getStatusFromActions(actions) !== EventStatus.enum.REGISTERED) {
4255
+ return false;
4256
+ }
4106
4257
  return actions.reduce((prev, { type }) => {
4107
4258
  if (type === ActionType.PRINT_CERTIFICATE) {
4108
- return true;
4259
+ return false;
4109
4260
  }
4110
4261
  if (type === ActionType.APPROVE_CORRECTION) {
4111
- return false;
4262
+ return true;
4112
4263
  }
4113
4264
  return prev;
4114
- }, false);
4265
+ }, true);
4115
4266
  }
4116
4267
  function isCorrectionRequested(actions) {
4117
4268
  return actions.reduce((prev, { type }) => {
@@ -4146,8 +4297,8 @@ function getFlagsFromActions(actions) {
4146
4297
  const flag = joinValues([type, status], ":").toLowerCase();
4147
4298
  return flag;
4148
4299
  });
4149
- if (isCertificatePrinted(sortedActions)) {
4150
- flags.push(InherentFlags.PRINTED);
4300
+ if (isPendingCertification(sortedActions)) {
4301
+ flags.push(InherentFlags.PENDING_CERTIFICATION);
4151
4302
  }
4152
4303
  if (isCorrectionRequested(sortedActions)) {
4153
4304
  flags.push(InherentFlags.CORRECTION_REQUESTED);
@@ -4178,7 +4329,6 @@ function getStatusFromActions(actions) {
4178
4329
  case ActionType.NOTIFY:
4179
4330
  return EventStatus.enum.NOTIFIED;
4180
4331
  case ActionType.PRINT_CERTIFICATE:
4181
- return EventStatus.enum.CERTIFIED;
4182
4332
  case ActionType.ASSIGN:
4183
4333
  case ActionType.UNASSIGN:
4184
4334
  case ActionType.REJECT:
@@ -5143,7 +5293,27 @@ var TENNIS_CLUB_DECLARATION_FORM = defineDeclarationForm({
5143
5293
  defaultMessage: "Applicant's name",
5144
5294
  description: "This is the label for the field",
5145
5295
  id: "v2.event.tennis-club-membership.action.declare.form.section.who.field.firstname.label"
5146
- }
5296
+ },
5297
+ configuration: {
5298
+ name: {
5299
+ firstname: { required: true },
5300
+ middlename: { required: false },
5301
+ surname: { required: true }
5302
+ }
5303
+ },
5304
+ validation: [
5305
+ {
5306
+ validator: field("applicant.name").object({
5307
+ firstname: field("firstname").isValidEnglishName(),
5308
+ surname: field("surname").isValidEnglishName()
5309
+ }),
5310
+ message: {
5311
+ defaultMessage: "Input contains invalid characters. Please use only letters (a-z, A-Z), numbers (0-9), hyphens (-), apostrophes(') and underscores (_)",
5312
+ description: "This is the error message for invalid name",
5313
+ id: "v2.error.invalidName"
5314
+ }
5315
+ }
5316
+ ]
5147
5317
  },
5148
5318
  {
5149
5319
  id: "applicant.email",
@@ -5365,22 +5535,6 @@ var statusOptions = [
5365
5535
  id: "v2.advancedSearch.form.recordStatusRegistered"
5366
5536
  }
5367
5537
  },
5368
- {
5369
- value: EventStatus.enum.CERTIFIED,
5370
- label: {
5371
- defaultMessage: "Certified",
5372
- description: "Option for form field: status of record",
5373
- id: "v2.advancedSearch.form.recordStatusCertified"
5374
- }
5375
- },
5376
- {
5377
- value: VisibleStatus.enum.REJECTED,
5378
- label: {
5379
- defaultMessage: "Rejected",
5380
- description: "Option for form field: status of record",
5381
- id: "v2.advancedSearch.form.recordStatusRejected"
5382
- }
5383
- },
5384
5538
  {
5385
5539
  value: EventStatus.enum.ARCHIVED,
5386
5540
  label: {
@@ -6832,7 +6986,11 @@ function generateActionDocument({
6832
6986
  case ActionType.NOTIFY:
6833
6987
  return { ...actionBase, type: action };
6834
6988
  case ActionType.PRINT_CERTIFICATE:
6835
- return { ...actionBase, type: action };
6989
+ return {
6990
+ ...actionBase,
6991
+ type: action,
6992
+ content: defaults.content
6993
+ };
6836
6994
  case ActionType.REQUEST_CORRECTION:
6837
6995
  return { ...actionBase, type: action };
6838
6996
  case ActionType.APPROVE_CORRECTION:
@@ -7232,14 +7390,6 @@ var AVAILABLE_ACTIONS_BY_EVENT_STATUS = {
7232
7390
  ActionType.REJECT_CORRECTION,
7233
7391
  ExclusiveActions.REVIEW_CORRECTION_REQUEST
7234
7392
  ],
7235
- [EventStatus.enum.CERTIFIED]: [
7236
- ActionType.READ,
7237
- ActionType.PRINT_CERTIFICATE,
7238
- ActionType.REQUEST_CORRECTION,
7239
- ActionType.APPROVE_CORRECTION,
7240
- ActionType.REJECT_CORRECTION,
7241
- ExclusiveActions.REVIEW_CORRECTION_REQUEST
7242
- ],
7243
7393
  [EventStatus.enum.ARCHIVED]: [
7244
7394
  ActionType.READ,
7245
7395
  ActionType.ASSIGN,
@@ -7247,9 +7397,12 @@ var AVAILABLE_ACTIONS_BY_EVENT_STATUS = {
7247
7397
  ]
7248
7398
  };
7249
7399
  var getAvailableActionsForEvent = (event2) => {
7250
- return event2.flags.includes(InherentFlags.REJECTED) ? [
7251
- ActionType.READ,
7252
- event2.status === EventStatus.Enum.VALIDATED ? ActionType.VALIDATE : ActionType.DECLARE,
7253
- ActionType.ARCHIVE
7254
- ] : AVAILABLE_ACTIONS_BY_EVENT_STATUS[event2.status];
7400
+ if (event2.flags.includes(InherentFlags.REJECTED)) {
7401
+ return [
7402
+ ActionType.READ,
7403
+ event2.status === EventStatus.Enum.VALIDATED ? ActionType.VALIDATE : ActionType.DECLARE,
7404
+ ActionType.ARCHIVE
7405
+ ];
7406
+ }
7407
+ return AVAILABLE_ACTIONS_BY_EVENT_STATUS[event2.status];
7255
7408
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@opencrvs/toolkit",
3
- "version": "1.8.1-rc.d31fe05",
3
+ "version": "1.8.1-rc.d3d858d",
4
4
  "description": "OpenCRVS toolkit for building country configurations",
5
5
  "license": "MPL-2.0",
6
6
  "exports": {
package/tsconfig.json CHANGED
@@ -19,7 +19,7 @@
19
19
  "@opencrvs/commons/events": ["../commons/src/events/index.ts"]
20
20
  }
21
21
  },
22
- "references": [{ "path": "../commons" }],
22
+ "references": [{ "path": "../commons/tsconfig-commonjs.json" }],
23
23
  "include": ["src/**/*.ts"],
24
24
  "exclude": ["**/node_modules/**", "dist"]
25
25
  }
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=conditionals.test.d.ts.map