|
1 | 1 | # Changelog |
2 | 2 |
|
3 | | -## 1.9.0 Release candidate |
| 3 | +## 1.9.1 Release Candidate |
| 4 | + |
| 5 | +### Breaking changes |
| 6 | + |
| 7 | +- `QUERY_PARAM_READER` now returns picked params under a `data` object. |
| 8 | + For example, `code` and `state` are now accessed via `data.code` and `data.state`. |
| 9 | + |
| 10 | + Previously: |
| 11 | + field(<page>.query-params).get('code') |
| 12 | + Now: |
| 13 | + field(<page>.query-params).get('data.code') |
| 14 | + |
| 15 | +- **Removed support for following scopes** |
| 16 | + - `NATLSYSADMIN` |
| 17 | + - `DECLARE` |
| 18 | + - `VALIDATE` |
| 19 | + - `CERTIFY` |
| 20 | + - `PERFORMANCE` |
| 21 | + - `SYSADMIN` |
| 22 | + - `TEAMS` |
| 23 | + - `CONFIG` |
| 24 | + - `RECORD_EXPORT_RECORDS` |
| 25 | + - `RECORD_DECLARATION_PRINT` |
| 26 | + - `RECORD_PRINT_RECORDS_SUPPORTING_DOCUMENTS` |
| 27 | + - `RECORD_REGISTRATION_PRINT` |
| 28 | + - `RECORD_PRINT_CERTIFIED_COPIES` |
| 29 | + - `RECORD_REGISTRATION_VERIFY_CERTIFIED_COPIES` |
| 30 | + - `PROFILE_UPDATE` |
| 31 | + |
| 32 | +## [1.9.0](https://github.com/opencrvs/opencrvs-core/compare/v1.8.1...v1.9.0) |
| 33 | + |
| 34 | +### Breaking changes |
| 35 | + |
| 36 | +* Dashboard configuration through **Metabase** has been fully migrated to **countryconfig**, and the standalone dashboard package has been removed. |
| 37 | + For details on configuring dashboards and information about the latest updates, refer to the [ANALYTICS.md](https://github.com/opencrvs/opencrvs-countryconfig/blob/v1.9.0/ANALYTICS.md) documentation. |
4 | 38 |
|
5 | 39 | ### New features |
6 | 40 |
|
| 41 | +#### Events V2 |
| 42 | + |
| 43 | +We are excited to announce a major overhaul of our events system: **Events V2**. |
| 44 | +This is a complete rewrite that introduces a new level of flexibility and configurability to how life events are defined and managed across the system. |
| 45 | + |
| 46 | +The new Events V2 architecture is built around a set of core concepts designed to make event management more powerful and customizable. |
| 47 | + |
| 48 | +##### Events |
| 49 | + |
| 50 | +An **Event** represents a life event (or any kind of event), such as a birth or a marriage. |
| 51 | +Each event is defined by a configuration that specifies the sequence of **Actions** required to register it. |
| 52 | + |
| 53 | +##### Actions |
| 54 | + |
| 55 | +###### Declaration Actions |
| 56 | + |
| 57 | +Declaration actions are used to modify an event’s declaration. |
| 58 | +These actions must be executed in a defined order and cannot be skipped. |
| 59 | + |
| 60 | +1. **DECLARE** |
| 61 | +2. **VALIDATE** |
| 62 | +3. **REGISTER** |
| 63 | + |
| 64 | +Each action must be accepted by **countryconfig** before the next one can be performed. |
| 65 | + |
| 66 | + |
| 67 | +###### Rejecting and Archiving |
| 68 | + |
| 69 | +After declaration, instead of proceeding with registration, an event may be either **rejected** or **archived**. |
| 70 | + |
| 71 | +If **deduplication** is enabled for an action, performing that action may trigger a **DUPLICATE_DETECTED** action if duplicates are found. |
| 72 | +When this occurs, two additional actions become available: |
| 73 | + |
| 74 | +* **MARK_AS_DUPLICATE** – archives the event. |
| 75 | +* **MARK_AS_NOT_DUPLICATE** – resumes the normal action flow. |
| 76 | + |
| 77 | +If an event is rejected by a user, the preceding action must be repeated before continuing. |
| 78 | + |
| 79 | + |
| 80 | +###### Actions Before Declaration |
| 81 | + |
| 82 | +1. **NOTIFY** – a partial version of the `DECLARE` action. |
| 83 | +2. **DELETE** – an event can be deleted only if no declaration action has yet been performed. |
| 84 | + |
| 85 | + |
| 86 | +###### Actions After Registration |
| 87 | + |
| 88 | +Once an event has been registered, a certificate may be printed. |
| 89 | +If a correction is required due to an error in the registered declaration, a correction workflow must be initiated. |
| 90 | + |
| 91 | +1. **PRINT_CERTIFICATE** |
| 92 | +2. **REQUEST_CORRECTION** |
| 93 | +3. **REJECT_CORRECTION** |
| 94 | +4. **APPROVE_CORRECTION** |
| 95 | + |
| 96 | + |
| 97 | +###### General / Meta Actions |
| 98 | + |
| 99 | +1. **READ** – appended to the action trail whenever a complete event record is retrieved. |
| 100 | +2. **ASSIGN** – required before any action can be performed. By default, the user is automatically unassigned after completing an action. |
| 101 | +3. **UNASSIGN** – triggered either automatically by the system or manually by a user (if the record is assigned to themselves or if the user has the appropriate permission). |
| 102 | + |
| 103 | +##### Forms, Pages, and Fields |
| 104 | + |
| 105 | +Event data is collected through **Forms**, which come in two types: |
| 106 | + |
| 107 | +* **Declaration Form** – collects data about the event itself |
| 108 | +* **Action Form** – collects data specific to a particular action, also known as annotation data in the system |
| 109 | + |
| 110 | +Forms are composed of **Pages**, and pages are composed of **Fields**. |
| 111 | +Fields can be shown, hidden, or enabled dynamically based on the values of other fields, allowing for a responsive and intuitive user experience. |
| 112 | + |
| 113 | +To simplify configuration, we’ve introduced a set of helper functions: |
| 114 | + |
| 115 | +```ts |
| 116 | +defineDeclarationForm() |
| 117 | +defineActionForm() |
| 118 | +definePage() |
| 119 | +defineFormPage() |
| 120 | +``` |
| 121 | + |
| 122 | +All of these are available in a **type-safe** manner via the new `@opencrvs/toolkit` npm package. |
| 123 | + |
| 124 | +##### Conditionals & Validation |
| 125 | + |
| 126 | +Validation has been significantly improved through the adoption of **AJV** and **JSON Schema**, providing standardized, robust, and extensible validation. |
| 127 | + |
| 128 | +The `field` function (exported from `@opencrvs/toolkit`) includes a set of helpers for defining complex validation rules and conditional logic. |
| 129 | + |
| 130 | +##### Available helpers include: |
| 131 | + |
| 132 | +* **Boolean connectors**: `and`, `or`, `not` |
| 133 | +* **Basic conditions**: `alwaysTrue`, `never` |
| 134 | +* **Comparisons**: `isAfter`, `isBefore`, `isGreaterThan`, `isLessThan`, `isBetween`, `isEqualTo` |
| 135 | +* **Field state checks**: `isFalsy`, `isUndefined`, `inArray`, `matches` (regex patterns) |
| 136 | +* **Age-specific helpers**: `asAge`, `asDob` (to compare age or date of birth) |
| 137 | +* **Nested fields**: |
| 138 | + |
| 139 | + ```ts |
| 140 | + field('parent.field.name').get('nested.field').isTruthy() |
| 141 | + ``` |
| 142 | + |
| 143 | +The `user` object, also exported from `@opencrvs/toolkit`, includes helpers for user-based conditions such as: |
| 144 | + |
| 145 | +```ts |
| 146 | +user.hasScope() |
| 147 | +user.hasRole() |
| 148 | +user.isOnline() |
| 149 | +``` |
| 150 | + |
| 151 | +These conditions can control: |
| 152 | + |
| 153 | +* `SHOW` – whether a component is visible |
| 154 | +* `ENABLE` – whether a component is interactive |
| 155 | +* `DISPLAY_ON_REVIEW` – whether a field appears on review pages |
| 156 | + |
| 157 | +They can also be used to validate form data dynamically based on the current form state or user context. |
| 158 | + |
| 159 | +#### Drafts |
| 160 | + |
| 161 | +The new **Drafts** feature allows users to save progress on an event that has not yet been registered. |
| 162 | +Drafts act as temporary storage for an action and are visible only to the user who created them. |
| 163 | + |
| 164 | +#### Advanced Search |
| 165 | + |
| 166 | +Advanced search is now configurable through the `EventConfig.advancedSearch` property, allowing different sections of an advanced search form to be defined. |
| 167 | + |
| 168 | +You can search across: |
| 169 | + |
| 170 | +* **Declaration Fields** – using the same `field` function from declaration forms with helpers such as `range`, `exact`, `fuzzy`, and `within` |
| 171 | +* **Event Metadata** – using the `event` function to search against metadata such as: |
| 172 | + |
| 173 | + * `trackingId` |
| 174 | + * `status` |
| 175 | + * `legalStatuses.REGISTERED.acceptedAt` |
| 176 | + * `legalStatuses.REGISTERED.createdAtLocation` |
| 177 | + * `updatedAt` |
| 178 | + |
| 179 | +More details about the metadata fields are available in `packages/commons/src/events/EventMetadata.ts`. |
| 180 | + |
| 181 | +#### Deduplication |
| 182 | + |
| 183 | +Event deduplication is now configurable **per action** via the `EventConfig.actions[].deduplication` property. |
| 184 | +Helpers for defining deduplication logic—such as `and`, `or`, `not`, and `field`—are available from `@opencrvs/toolkit/events/deduplication`. |
| 185 | + |
| 186 | +The `field` helper can reference declaration form fields and be combined with: |
| 187 | + |
| 188 | +```ts |
| 189 | +strictMatches() |
| 190 | +fuzzyMatches() |
| 191 | +dateRangeMatches() |
| 192 | +``` |
| 193 | + |
| 194 | +to define precise deduplication rules. |
| 195 | + |
| 196 | +#### Greater Control over Actions |
| 197 | + |
| 198 | +Each action now progresses through three possible states: **`requested`**, **`accepted`**, and **`rejected`**. |
| 199 | +When a user performs an action, it is first marked as **`requested`** and forwarded to **countryconfig** via the `/trigger/events/{event}/actions/{action}` route, with the complete event details included in the payload. |
| 200 | + |
| 201 | +Countryconfig has full control over how the action is processed and may choose to **accept** or **reject** the action either **synchronously** or **asynchronously**. |
| 202 | + |
| 203 | +By hooking into these action trigger routes, countryconfig can also: |
| 204 | + |
| 205 | +* Send customized **Notifications** |
| 206 | +* Access the full event data at the time an action is performed |
| 207 | + |
| 208 | +#### Configurable Workqueues |
| 209 | + |
| 210 | +Workqueues can now be configured from countryconfig using the `defineWorkqueues` function from `@opencrvs/toolkit/events`. |
| 211 | +This enables the creation of role- or workflow-specific queues without requiring code changes in core. |
| 212 | + |
| 213 | +* The **`actions`** property is used to define the default actions displayed for records within a workqueue. |
| 214 | +* The **`query`** property is used to determine which events are included in the workqueue. |
| 215 | +* The **`workqueue[id=workqueue-one|workqueue-two]`** scope is used to control the visibility of workqueues for particular roles. |
| 216 | + |
| 217 | +Details on the available configuration options can be found in the `WorkqueueConfig.ts` file. |
| 218 | + |
| 219 | + |
| 220 | +#### Event Overview |
| 221 | + |
| 222 | +The configuration of the event overview page (formerly known as *Record Audit*) has been made customizable through the `EventConfig.summary` property. |
| 223 | +The record details displayed on this page can be referenced directly from the declaration form or defined as custom fields that combine multiple form values. If some value contains PII data, they can optionally be hidden via the `secured` flag so that the data will only be visible once the record is assigned to the user. |
| 224 | + |
| 225 | + |
| 226 | +#### Quick Search |
| 227 | + |
| 228 | +The dropdown previously available in the search bar has been removed. |
| 229 | +Any search performed through the **Quick Search** bar is now executed against common record properties such as names, tracking ID, and registration number by default, providing a more streamlined and consistent search experience. |
| 230 | + |
| 231 | +#### Certificate Template Variables |
| 232 | + |
| 233 | +The following variables are available for use within certificate templates: |
| 234 | + |
| 235 | +* **`$declaration`** – Contains the latest raw declaration form data. Typically used with the `$lookup` Handlebars helper to resolve values into human-readable text. |
| 236 | +* **`$metadata`** – Contains the `EventMetadata` object. Commonly used with the `$lookup` helper for resolving metadata fields into readable values. |
| 237 | +* **`$review`** – A boolean flag indicating whether the certificate is being rendered in review mode. |
| 238 | +* **`$references`** – Contains reference data for locations and users, accessible via `{{ $references.locations }}` and `{{ $references.users }}`. |
| 239 | + This is useful when manually resolving values from `$declaration`, `$metadata` or `action`. |
| 240 | + |
| 241 | +##### Handlebars Helpers |
| 242 | + |
| 243 | +The following helpers are supported within certificate templates: |
| 244 | + |
| 245 | +* **`$lookup`** – Resolves values from `$declaration`, `$metadata`, or `action` data into a human-readable format. |
| 246 | +* **`$intl`** – Dynamically constructs a translation key by joining multiple string parts. |
| 247 | + Example: |
| 248 | + |
| 249 | + ```hbs |
| 250 | + {{ $intl 'constants.greeting' (lookup $declaration "child.name") }} |
| 251 | + ``` |
| 252 | +* **`$intlWithParams`** – Enables dynamic translations with parameters. |
| 253 | + Takes a translation ID as the first argument, followed by parameter name–value pairs. |
| 254 | + Example: |
| 255 | + |
| 256 | + ```hbs |
| 257 | + {{ $intlWithParams 'constants.greeting' 'name' (lookup $declaration "child.name") }} |
| 258 | + ``` |
| 259 | +* **`$actions`** – Resolves all actions for a specified action type. |
| 260 | + Example: |
| 261 | + |
| 262 | + ```hbs |
| 263 | + {{ $actions "PRINT_CERTIFICATE" }} |
| 264 | + ``` |
| 265 | +* **`$action`** – Retrieves the latest action data for a specific action type. |
| 266 | + Example: |
| 267 | + |
| 268 | + ```hbs |
| 269 | + {{ $action "PRINT_CERTIFICATE" }} |
| 270 | + ``` |
| 271 | +* **`ifCond`** – Compares two values (`v1` and `v2`) using the specified operator and conditionally renders a block based on the result. |
| 272 | + **Supported operators:** |
| 273 | + |
| 274 | + * `'==='` – strict equality |
| 275 | + * `'!=='` – strict inequality |
| 276 | + * `'<'`, `'<='`, `'>'`, `'>='` – numeric or string comparisons |
| 277 | + * `'&&'` – both values must be truthy |
| 278 | + * `'||'` – at least one value must be truthy |
| 279 | + |
| 280 | + **Usage example:** |
| 281 | + |
| 282 | + ```hbs |
| 283 | + {{#ifCond value1 '===' value2}} |
| 284 | + ... |
| 285 | + {{/ifCond}} |
| 286 | + ``` |
| 287 | +* **`$or`** – Returns the first truthy value among the provided arguments. |
| 288 | +* **`$json`** – Converts any value to its JSON string representation (useful for debugging). |
| 289 | + |
| 290 | +Besides the ones introduced above, all built-in [Handlebars helpers](https://handlebarsjs.com/guide/builtin-helpers.html) are available. |
| 291 | + |
| 292 | +Custom helpers can also be added by exposing functions from this [file](https://github.com/opencrvs/opencrvs-countryconfig/blob/develop/src/form/common/certificate/handlebars/helpers.ts#L0-L1). |
| 293 | + |
| 294 | +--- |
| 295 | + |
| 296 | +To see Events V2 in action, check out the example configurations in the **countryconfig** repository. |
| 297 | + |
| 298 | +--- |
| 299 | + |
| 300 | + |
| 301 | + |
7 | 302 | - **Redis password support with authorization and authentication** [#9338](https://github.com/opencrvs/opencrvs-core/pull/9338). By default password is disabled for local development environment and enabled on server environments. |
8 | 303 | - **Switch back to default redis image** [#10173](https://github.com/opencrvs/opencrvs-core/issues/10173) |
9 | 304 | - **Certificate Template Conditionals**: Certificate template conditionals allow dynamic template selection based on print history using the template conditional helpers.. [#7585](https://github.com/opencrvs/opencrvs-core/issues/7585) |
|
0 commit comments