Version 9.1.225 (4 May 2026)
People Management
Catching and handling error occurring when terminating inactive person (#146377)
Problem
Problem
When attempting to terminate a user without an active appointment, a “We’re Sorry” page is displayed.
Solution
Solution
A message is now shown instead, clearly explaining the issue without redirecting to the “We’re Sorry” page
Implement a unique field configuration on the ESS settings (#144890)
Problem
Cannot define Username, Id Number, Passport Number, Employee Code, and Email as unique for the ruleset using ESS settings
Solution
Introduce enhanced uniqueness validation for user-related operations, ensuring that users cannot be created or updated with duplicate key identifiers (such as username, employee code, ID number, passport number, or email) within the same ruleset, according to the ESS setup's unique field configuration. The changes span updates to the data model, gRPC contracts, and command handlers to support this feature.
Resolved transfer user data validation bug (#147063)
Problem
When the termination date is before the appointment date when transferring a user to another ruleset, the validation happens, but no message is displayed. The validation was appearing, but instantly hiding itself again.
Solution
Just ensured that the validation message is not hidden directly after being displayed.
Data Warehouse
Updated manual step for lmTermResults (#147814)
Problem
Problem
Currently, the DWH will remove any entries within TermResults if the Average is equal to 0
Solution
Solution
Updated manual step for TermResults by removing the delete step where the average is equal to 0
Added step to update existing fields within Data Dictionary (#142732)
Problem
Problem
Fields Selectable and Searchable are not available to select within ReportBuilder for
JobPositionsJob Positions
Solution
Solution
Update fields to be Selectable and Searchable for JobPositions within ReportBuilder
Added step to remove duplicate entries within pdmContractPeriodActionPlans (#142737)
Problem
Problem
The DWH table pdmContractPeriodActionPlans does contain duplicate entries based on how the source query is structured
Solution
Solution
Added a step to remove duplicate entries within pdmContractPeriodActionPlans if the fields ContractPeriodActionPlanID, ContractID and ContractPeriodID are the same
Job Profiler
Future and past subordinates being returned (#146082)
Problem
Problem
Subordinates are being returned for ListManagerSubordinatesAsync who are not active employees.
Solution
Solution
They still had the CurrentPosition = 1 flag. Added the EndDate check for an appointment to filter on present appointments.
Dashboards
Updating Main Dashboard banner search functionality on Banner Modal (#146695)
Problem
Problem
On the banner selection pop-up, having many banners causes the buttons to move off-screen. When scrolling to reach the buttons, the search bar is no longer visible. Large images can also make the page slow and unresponsive.
Solution
Solution
Updated the layout so the banner list is scrollable, keeping the search bar and buttons visible at all times.
Search results are now limited to 21 banners for better performance.
Selected banners will always be included in the results, along with any that match the search term.
Results are ordered with selected banners first, followed by the most recently uploaded banners
Adding a clear button to the search field (#146522)
Problem
Problem
The search field does not have a clear button.
Solution
Solution
Add an eraser icon to clear the search field
Event Scheduler
Changed ScheduleComponent event handlers to useCallback to prevent re-render errors (#146447)
Problem
Problem
A blank calendar page appears after opening the "Multiple Event Booking" modal and then cancelling/closing it again.
Solution
Solution
Improved how the calendar handles updates when opening and closing popups. This ensures the calendar stays visible and continues to display events correctly instead of disappearing or showing a blank screen.
Tenant Management
Adding session storage and restore functionality to global search (#142318)
Problem
On the Tenants page, search filters are not retained after editing a tenant. When returning to the list, all filters and paging are reset.
Solution
Added session storage support to the global search control, allowing filter to be preserved where required. This feature can be enabled per data table and is disabled by default. It has been enabled for the Tenants page, ensuring that filters(search terms) are restored when navigating back to the list.
Content Management
Add functionality to convert HTML to Word and replace placeholders in a PowerPoint presentation (#145071)
Problem
Functionality required to update a PowerPoint presentation.
Solution
Added functionality to replace placeholders on a PowerPoint presentation. Also added a function to convert HTML to a Word document.
Fix typos in document placeholder descriptions (#147637)
Problem
Some of the placeholders had typos in the translation description.
Solution
Fix translation descriptions in placeholders
Imports
Add additional unique field validation to pre-import validation (#144890)
Problem
Correct creation and update of unique user fields in import
Solution
Refine the error messages for user creation and update failures in the `ImportUsersCommandHandler` to provide clearer and more accurate information about conflicts due to existing users. The changes clarify that the conflict is with another user and improve the details shown for matching fields.
Problem
When a new user is created, it is not immediately imported into V8 unless an entire import is kicked off
Solution
Added a change after a new user creation happens, create a user import for that username to V8
Add additional unique field validation to pre-import validation (#144890)
Problem
When importing users with the same fields, that is still unique, it is still allowed
Solution
Introduce a Unique flag on SelfServiceSetting and wire it through the validation pipeline to support uniqueness checks for Email, ID Number, Passport Number and Employee Code. Precompute per-field value counts and a uniqueFields map in UserDetailsValidationService, and add duplicate-value checks that emit validation errors when a field marked unique is duplicated. Update all SelfServiceSetting construction sites to pass the new Unique flag and adjust related method signatures. Add unit tests covering unique-field scenarios and update existing tests accordingly.
Notifications
Adjusted character count for masking rule (#147452)
Problem
Development was done to do character masking with 1 character count, request to do a 2-character count display
Solution
Added new rules to do character counts, should there be enough characters, 2 prefix shown, masked in between, and the last 2 characters are displayed
Change score when review setup and item not in use (#145198)
Problem
When a user has added a rating scale, they can not change the score, as there are business rules defined for this
Solution
Allow a user to only change the score on an item if the review setup has not been used within a contract, and add a safety check within the command to check that the review item has also not been used yet
Resolve sanitisation problem by handling newlines properly for data table and textarea (#147709)
Problem
Break tags shown on the add/edit modal of KPI, KC review section items
Solution
Resolve sanitisation problem by handling newlines properly for the data table and the textarea. Items saved from the modal are saved with new line chars \r\n. The sanitiser converts these to break tags that display correctly on the data table. When opening this in the modal again, the breaks are shown in the text area. Added helper functions to replace breaks with newlines when opening the modal and vice versa when saving from the modal
Workplace Assessment App
Implemented new endpoint for Observation app to upload stream file content (#143882)
Problem
Endpoints created to allow the observation app to stream files, large files to service, due to http2 endpoints not being able to make public, normal http1 api transcoding takes place. But with large files, this causes timeouts and stream errors, for example, 60mb to be converted to a base64 string fails
Solution
Added a new endpoint and proto to accept a streamed body file and use that to then send for the next method. Add a new app setting to allow/regulate the upload max file size
Master Data
Resolved master data items being searched (#147640)
Problem
When searching for a master data item, the global search text is not passed through, resulting in no value sent to the master data service. This results in the top 50 records, where after those server results are returned to the page, it only filters client side from the 50, hence why not all records are returned
Solution
Add a correction to also search for the query string, as those values are not part of form data when posted from the jQuery table
Learning Management
Log mark audit failures and incorrect audit table names (#147362)
Problem
Users could accidentally save duplicate marks on the Marksheet by clicking the Save or Inherit Marks buttons multiple times before the request is completed. This caused errors that were either silently swallowed or shown as a confusing technical message with no guidance on what to do next.
Solution
Duplicate prevention (frontend)
The Save and Inherit Marks buttons are now disabled while a request is in flight, preventing the user from submitting the same marks more than once.
Duplicate prevention (database)
Two partial unique indexes have been added to the `Marks` table to enforce that a learner can only have one mark per assessment per cycle at the database level — a safety net even if multiple requests arrive simultaneously.
Existing duplicate rows are cleaned up as part of the migration (keeping the most recently edited entry). A backup of the `Marks` table is taken before any changes are made.
Meaningful error messages
When a duplicate mark is detected, the user now sees a clear message: _"A mark for this user already exists. Please reload the page to see the latest marks."_
All other save/inherit failures show the server's error details (if available), followed by "Please reload the page and try again."_ so the user always knows the next step.
If there is no specific error detail, only the reload instruction is shown — no empty or generic filler text.
Add idle auto-save and unsaved changes warning to Marksheet (#147137 & #147138)
Problem
When teachers or administrators are entering marks on the Marksheet, their work can be lost if they:
Step away from their computer without saving
Accidentally navigate away from the page or close the browser tab
Get distracted and forget to click Save
There was no safety net to protect unsaved mark entries, which could result in having to re-enter all the data again
Solution
Idle Auto-Save
The system now automatically saves mark changes after a period of inactivity (defaulting to 5 minutes). If a user steps away or gets distracted, their progress is saved in the background without any action required. This behaviour can be configured or disabled via application settings.
Unsaved Changes Warning
If a user tries to navigate away from the Marksheet while there are unsaved changes, a clear warning message is shown asking whether they want to save, discard, or stay on the page - giving them full control and preventing accidental data loss.
Communication Portal
Resolved member count (#147597)
Problem
User count not returned for group discussions
Solution
Re-added count, and show loading indicator for internal use as well.