Version 9.1.246 (27 July 2026)
Image Resources
Fix image upload not working when using copy-paste or drag-and-drop on Syncfusion editors (#152211)
Problem
- Image source saved incorrectly when copy/pasting or dragging and dropping an image, leading to an image not found after initial upload.
Solution
- Add a handler in the shared Syncfusion editor script to handle image drops and copy/paste the same as when images are uploaded normally
Translations
Reset password feedback translation improvements (#152474)
Problem
- Password and confirm password comparisons were not being properly translated. Also missing a check for leading or trailing spaces
Solution
- Reset password feedback translation improvements
Job Management
Remove validation for inherent requirement add (#151675)
Problem
- Odd behaviour on Inherent Requirements. Unable to add a requirement with the same importance twice + Cannot add a requirement again if it has been deleted.
Solution
- Removed all validation on creating new inherent requirements - should always be able to add a new one, and be left up to user discretion
Communication Portal
Resolved console error for integration ErrorHandler (#146859)
Problem
- The new error logging exposed that the _Integration tab was not actually throwing an application exception. The console message was a browser-level ResizeObserver loop completed with undelivered notifications warning, which was being surfaced through the global window.onerror hook looked like a real app failure.
Solution
- Updated the global error handling so it still logs real uncaught errors with message/source/stack details, but ignores the known harmless ResizeObserver loop warnings. That removes the false console noise without hiding actual application errors.
Resolved datepicker opening up within the card (#152956, #152926)
Problem
- DateTimePicker component opening within the Card and has no overflow visible
Solution
- Add a change to allow the datepicker to overflow and be visible
Resolved validation on shared editors and Form submission (#152935, #152685)
Problem
- When the toggle is inactive and the form is submitted, validation triggers for the empty fields, which it only must for when the toggle of the editor is active
Solution
- Add a change to only validate the fields when the toggle is active
Problem
- When submitting a full form, the post is done and not an AJAX form submission
Solution
- Implemented a change to do an AJAX form submission
Resolved chat messages not being able to send (#149151)
Problem
- Package upgrade which causes certain $.func() errors; a new shim file was added to accommodate these package differences, but the Communication portal is not using it to initialise the emojione area, which causes errors. Also issues with SignalR differences
Solution
- Implemented the new change within the shim file and the change to be used
Resolved Translation Core that does not allow section within section value (#152418)
Problem
- For translations, it is only one section up, and if there is no key-value pair, the section is not shown; likewise for custom translations that are section within a section
Solution
- Implemented a change to read the treeview style downwards to identify sections to be able to translate, excluding static sections, and then also for the translator so that it can be identified
Resolved GanttControl divider and the paging of target audience (#152475, #151524)
Problem
- For paging count, not all the page values were rendered because the total count was not returned only has more rows, which show another page as you click through
Solution
- Added a change to return the total count and show the total page counts
Problem
- The divider on the Gantt control keeps jumping to the middle and is not allowed to scroll/move freely
Solution
- Implemented a fix on styling and jQuery to correct the behaviour
Resolved Nav header active state and tag background (#152441, #151610)
Problem
Solution
- Implemented a change so that the sub-nav tabs are only selected within the nav tab content itself
Problem
- When no background colour is selected for the tag or timer, it defaults to incorrect white
Solution
- Add a change to keep empty and update the model to pass an empty string if it is NULL
Resolved V8 Email Not triggering system message when active (#152896)
Problem
- Email from V8 can trigger a system message when configured, but the implementation of system alerts requires a userId to indicate to whom to display, as V8 only sends through a recipient list of emails
Solution
- Implemented a change that only applies in cases where the category ID is passed through to retrieve the userId for that email user within the ruleset.
Resolved Upload button difference styling (#149850)
Problem
- Difference in styling, no corner radius or non-uppercase text
Solution
- Added rounded corners and text decoration to none to remove casing
Resolved Loading containers for communication portal (#152682)
Problem
Solution
- Add new abstract methods to ensure new rules to allow render modes, split discussion list to render fragment and just render in correct place
Allow Discussion to load inside V8 (#152682)
Problem
- When a learner opens the new Discussion feature from within the older (V8) part of the system, the Discussion area fails to load: the request reaches WebMVC's `DiscussionController`, but the downstream gRPC call to CommunicationPortal.API short-circuits with `User access token unavailable`, and the user is signed out.
Solution
- Set `AuthenticationType = Bearer` in WebMVC's JWT `TokenValidationParameters`. On `Cookies,Bearer` endpoints the merged principal now carries a Bearer-typed identity, so the existing fast path forwards the inbound token and the local and downstream identities agree. - **Opt-in fallback** (`Authentication:ForwardExternalBearerToken`, default `false`): for requests whose principal lacks a Bearer identity, WebMVC explicitly authenticates the Bearer scheme and forwards the header only when validation succeeds **and** the token does not change the acting user (its `user_id` claim must match any other authenticated principal; missing claims fail closed).
- Only well-formed `Bearer ` headers are ever forwarded.
Resolved banner metadata not showing on the list (#152734)
Problem
- The data can be passed in a different format than what is expected can have a wrapper as well
Solution
- Add fallback to correct the path and the value to show the background colour, date and expires date
People Management
Correct permission checks on user profile pages - reverse condition on summary page (#152580)
Problem
- Bug on previous fix, conditional check on summary page was reversed.
Solution
- Correct conditional check for section access
Resolved registration email not being triggered (#148426)
Problem
- After a user has confirmed their email for registration, another email should trigger to confirm that the request has been submitted, but when a JobProfile has not been selected, it is null and throws an error when trying to be retrieved.
- Also, some translations are not being retrieved.
- The disclaimer is not correct in showing a message when there is none
Solution
- Implemented fix for null check; corrected translations
- Added a check to set when there was a disclaimer shown
Resolved Custom People group role creating new links each change/save (#152827)
Problem
- When a Custom Org unit role is edited and saved, it keeps adding a new role
Solution
- Removed the check to set the value to null to update the current custom role
Display masked email address on password reset (#152465)
Problem
- The Password reset toast notification does not include a masked email address.
Solution
- Display masked email address on password reset
Fixed race where filters loaded after the initial user fetch by restoring them synchronously via lazy useState init (#152201)
Problem
- When on Terminated filter/tab, and the user opens a person and uses the browser back button/system back button, the Terminated filter/tab shows people that should not be there and a count of 207 instead of 4. The browser back button consistently causes this behaviour while the system back button only causes it occasionally.
Solution
- Moved the saved filterCriteria/searchFilterCriteria restoration from an async useEffect into lazy useState initialisers so they're correct on the very first render, eliminating the race where the user-fetch effect could run with default (unfiltered) criteria before localStorage was read.
Resolved count mismatch or hard reload of people management (#149700)
Problem
- The People Management page could fire multiple startup requests with different people-group/filter values during a hard refresh, and on slower datasets an older response could finish last and overwrite the correct count.
Solution
- The page now waits for filter and people-group restoration before the first load, uses the saved people-group filter as the initial source of truth, and ignores stale responses so only the latest request can update the displayed count.
Resolved Required-validation for manage own data fields (#152580)
Problem
- Server-side required-field validation always treated edits to another user as Administrator, so People Group edits could fail on required fields that were not editable in ESS setup.
Solution
- Pass the intended SelfServiceSettingType from WebMVC to the Account API update commands, and use that type during required-field validation so only required editable fields for the correct setup context are enforced.
Ensure non visible/editable fields are correctly bound (#152580)
Problem
- When the profile fields are disabled due to the ESS settings, the values are not bound and get lost when submitted.
Solution
- Ensure that the profile values are still bound correctly when they are disabled / not visible due to ESS settings.
Remove forced role check on identity user create (#149668)
Problem
- When a user only has PG permissions, the new user appointment fails. When an identity user is created requires that the user has People Admin or Tenant Admin roles.
Solution
- Remove explicit role authorisation on Identity user creation. Added a comment to add permission-based auth.
Ensure non visible/editable fields are correctly bound (152580)
Problem
- When the profile fields are disabled due to the ESS settings, the values are not bound and get lost when submitted.
Solution
- Ensure that the profile values are still bound correctly when they are disabled / not visible due to ESS settings.
Ruleset Management
Update translation for previously used password (#152464)
Problem
- The "Number of previous password.." helper text does not describe the function correctly
Solution
- Update translation for previously used password
Learning Management
Fix the subject form layout and wording (#152406)
Problem
- When adding a subject, field spacing was inconsistent, the timetable colour label used the wrong spelling, and the colour controls could overlap or extend outside the dialogue.
Solution
- The subject form now spaces its fields consistently, uses the correct “Colour” wording for South African and UK English, and keeps the timetable colour selector and value aligned within the dialogue.
Prevent incorrectly calculated marks from being saved (#152742)
Problem
- A learner's term result could sometimes be saved as zero, or as one of the individual assessment marks, even though the marksheet showed captured assessment results. This could cause incorrect or blank results on report cards and require manual data correction.
Solution
- The marksheet now works out the term result again from the learner's captured assessment marks at the moment it is saved. It no longer depends on the displayed calculated cell being ready, while still allowing a genuine zero result and the existing excluded-mark behaviour.
Virtual Tours
Problem
- User is taken to the top of the Virtual Tours modal when clicking on Editing tools on the second slide when the modal scrolls.
Solution
- Ensure you are not taken to the top of the modal.
Problem
- Error on saving after slides have been deleted
Solution
- Ensure virtual tour slides can be saved after removing a slide
Problem
- Edit Help Page Information not translated when logging in with Afrikaans
Solution
- Add missing translation
Performance Management
Fix "Load More" not working correctly when selecting KPI's from the library (#152620)
Problem
- "Load More" not working correctly when selecting KPI's from the library
Solution
- Ensure that when clicking "Load More", it appends the response, replacing the result set
Master Data
"Duplicate data errors" not displaying for certain service master data (#152439)
Problem
- "Duplicate data error" message did not display for certain services when adding master data where a unique constraint was violated.
Solution
- This happened due to the master data interceptor not being registered for all services in masterdata. Created a shared method to ensure each registered GRPC client adds the interceptor.
Data Warehouse
Added Joins within Data Dictionaries (#152962)
Problem
- New joins need to be added for ReportBuilder
Solution
- Added a join between jpAppointments and jpJobCompetencies
- Added a join between jpAppointments and jpPositionCompetencies
Added a step to resolve ReportBuilder errors due to redundant fields being used (#152556)
Problem
- Currently, there are published reports that fail due to using redundant fields
Solution
- Added a step to resolve ReportBuilder errors due to redundant fields being used within the UpdateDataDictionary SSIS Package
Improved the integrity check for published reports on Report Builder (#152556)
Problem
- The current ReportBuilder integrity check did not pick up all the errors for published reports
Solution
- Updated the script by improving the check for published reports
Added new fields within comuSystemAlerts (#152599)
Problem
- Fields TotalUnread, TotalArchived, TotalUnarchived need to be added within comuSystemAlerts
Solution
- Added fields TotalUnread, TotalArchived, TotalUnarchived within comuSystemAlerts
System Access
Correct duplicate submission of OTP token (#152558)
Problem
- The OTP request is submitted multiple times
Solution
- Make a targeted improvement to the JavaScript event handling for the network speed form on the two-factor authentication login page.
- The change ensures more robust and predictable form submission behaviour. JavaScript Event Handling Improvements: Changed the event listener from using delegated event handling with $(document).on('submit', ...) to directly binding the submit event on the form.capture-network-speed element.
- This prevents potential issues with multiple bindings or unintended event bubbling.
- Added event.stopImmediatePropagation(); after preventing the default submission to ensure that no other event handlers for the submit event are triggered, further reducing the risk of duplicate submissions or side effects.
Identity & Authorisation
Correct Translation for the Password reset toast messages (#152474)
Problem
- The system displays Incorrect none translated values for the Password reset toast messages ("passwordDoesNotMatch")
Solution
- Correct Translation for the Password reset toast messages
System Access
Resolve problem on virtual tours with activeTab= query param (#152722)
Problem
- Landing page when logging in as well as FitAndProper sharelink breaks when accessing
Solution
- Since "activeTab" contains "tab", the first condition matches. But when splitting by "tab=", there's no "tab=" in the string (only "activeTab="), so Split returns a single-element array. Accessing index [1] throws the exception.
- Check for "tab=" instead of "tab" (includes the equals sign)
- Check for "activeTab=" instead of "activeTab" (includes the equals sign)
- Add bounds checking before accessing array indices
- Limit split to 2 parts for better performance
- Use case-insensitive comparison for robustness
Translations
Translations for external logins (#152530)
Problem
- Issue with error message translations when using Microsoft login; the message shows the translation path
Solution
- Update external login translations to use TranslateAsync