Version 9.1.247 (27 July 2026) Identity & Authorisation Error when clicking on the Not yet registered? link (#153319) Problem Error when clicking on the Not yet registered? link    Solution This happened due to a SQL query which was not properly formed, leading to an extra double quote " in the query    Added functionality for v9 pages to open on the mobile app using a token (#138802) Problem When a v9 page is opened from within the Mobile Learning App, the user is directed to the login page instead of automatically logging the user in like with v8 pages.   Solution Added support for an authorisation header.   Content Management Prevent SVG uploads in all image resource areas (#143842) Problem SVG files could still be selected in some image upload areas after the earlier update, especially when older saved settings were still in use. This left a way to upload a file type that should be blocked for security.   Solution SVG has been removed wherever image upload options are available, and uploads are rejected if an SVG is submitted directly. Existing saved settings can no longer make SVG selectable. Image types are also kept consistent for badges, banners, and avatars.   Block SVG uploads for badges, avatars and rich text images (#143842) Problem Across the product, SVG image files are meant to be disallowed because they can carry hidden active content. However, the image settings for badges, avatars and rich-text-editor images still listed SVG as an accepted file type. This meant SVG files could be uploaded in those areas, leaving a gap that the rest of the system does not have.   Solution SVG has been removed from the list of accepted file types for badge, avatar and rich-text images. These areas now only accept standard, safe image formats (PNG, JPG/JPEG, GIF, and TIFF for rich text), bringing them in line with the rest of the application and closing the upload gap.   Imports Add ID column to notifications import table (#153003) Problem Request to display the Import ID on the imports details screen, making debugging and support easier   Solution Add an ID column to the notifications import table   Ensure results on ListUserPeopleGroups APIs are not filtered based on empty usernames (#153216) Problem When V8 bulk processing requests all user people groups, it requests the username as an empty string in the array. This then causes the import to not receive any data   Solution Add a measure in V9 to remove all empty usernames and return all data when only an empty string is received   Ruleset Management Ensure the pill is not fixed to its position to fix overflow issues (#152442) Problem Display issue when on the Integrations tab and the system menu is pinned. The integrations menu (General, Content Server and Payroll) overlaps with the content to the right of it.    Solution Make the pill position absolute and not fixed to fix the overflow issue    Corrected ruleset deletion on master data items (#143128) Problem The generic ruleset delete script was also identifying parent tables without a RulesetId column for deletion. In the MasterData database, this caused shared metadata tables such as [MasterData].[Tables] to be included because ruleset-specific child records reference them by keys like TableId.   Solution Exclude the MasterData schema from the parent-table delete discovery where the parent table has no RulesetId. Also ensure backups only filter by RulesetId when the target table actually contains that column; otherwise, back up the full table using @RulesetId = 0.   Extend error logging and add ruleset creation master data for the communication portal (#152171) Problem When errors occur during ruleset creation, critical details are not logged for support. Master data is not copied for the communication portal to the new ruleset   Solution Introduce integration of the Communication Portal service into the ruleset creation workflow, ensuring that ruleset setup is coordinated across all relevant services. It adds a new gRPC endpoint for anonymous ruleset creation in the Communication Portal, updates the Account API to call this endpoint, and improves error logging throughout the ruleset creation process. Additionally, it includes internal refactoring and new command handlers for copying master data. These changes ensure that the Communication Portal is now a first-class participant in ruleset provisioning and that error information is more complete across the distributed setup process.   Notifications Ensure EditedBy reflects logged-in username by passing in session username as parameter (#152025) Problem We currently don't store the details of the user that triggered a notification. This is important to know for notifications like the passwords reset and welcome notifications.   Solution Ensure EditedBy reflects the logged-in username by passing in the session username as parameter   Communication Portal Implemented archiving for elapsed system alerts (#151781) Problem When system alerts have elapsed, the recipient alerts must be archived    Solution Add a Quartz job that runs every 1hour that updates all the recipient alerts if the system alert has elapsed   Implemented persistence state for slitter and returned unread discussions first (#153049, #153091) 153049 Problem Splitter position is not remembered   Solution Request to implement a change to remember the position of the splitter as the user drags    153091 Problem Unread discussions are not brought back first, which means on many discussions if over page size it does only come up when searching for   Solution Created a change to return unread discussions first   Resolved New container overlay (#153090) Problem Difficult to hover on the plus to get access to the new    Solution Change the styling and event listeners to ensure that it is easy to open the overlay and select an item   Data Warehouse Added field BookingStatus within lmEventScheduleAttendees (#151434) Problem Field BookingStatus needs to be added for lmEventScheduleAttendees   Solution Added field BookingStatus within lmEventScheduleAttendees   Created cleanup Data Dictionary script (#151627) Problem Data Dictionary entries need to be deleted that are not linked to Tenant 1   Solution Created Data Dictionary cleanup script to remove entries that are not linked to Tenant 1   Added check for accUserLoginStats within DWHDataIntegrityReport (#142732) Problem accUserLoginStats needs to be added for DWH weekly integrity report check   Solution Added a check for accUserLoginStats within monGenerateDWHDataIntegrityReport   Problem New field LastRefreshedDate needs to be added - Integrity check needs to be added for accUserLoginStats   Solution Added new field LastRefreshedDate - Added Integrity check for accUserLoginStats to ensure the entries are being added as expected for the first of each month - Corrected Live DB Server name for V8 accUserLoginStats calculation   Added step for cmScormFolder_Staging to update CompanyCode (#151058) Problem The insert for cmScormFolderUploads did not work as expected due to the join for CompanyCode not matching for cmScormFolder_Staging   Solution Added a step for cmScormFolder_Staging to update CompanyCode for the join for cmScormFolderUploads to work as expected   Added new SSIS Packages to the monitoring report (#142737) Problem New SSIS Packages need to be added to the DatawarehouseJobResultsReport   Solution Added new SSIS Packages CommunicationPortal_ETL.dtsx and ContentManagement_ETL.dtsx within DatawarehouseJobResultsReport   Added step to remove archived entries within lmStudentSubjects (#152973) Problem With each DWH run, previous entries for lmStudentSubjects are not removed due to records not having YearID   Solution Added step to remove archived entries within lmStudentSubjects   Job Management Ensure description displays on modal (#151675) Problem Description displays 'true' on modal, instead of the saved description   Solution Change JavaScript so the description displays on the modal   Resolved People Group Role Permission overrides (#152827) Problem Editing a user’s existing people-group link to enable permission override created a new custom role link but left the original non-overridden link in place. An earlier attempt to fix this in the API link handler was too broad and caused normal linking of additional roles to be replaced unintentionally.   Solution The fix was narrowed to the actual edit flow. Normal LinkUserPeopleGroupRole behaviour remains additive, with only exact duplicate links prevented. When editing an existing user people-group link and switching it to override permissions, the UI now carries the original UserPeopleGroupRoleId; the system creates or updates the custom override role, links it, and then unlinks only that original row. This preserves standard linking behaviour while ensuring an overridden link does not leave the old base link behind.   Resolved Reporting Lines not pulling through on Edit Appointment (#152476) Problem The Editor View is being generated with a Blank Liens ViewModel even if there is data   Solution Add a check: if there is a userId given, pull the reporting lines to be displayed   People Management Resolved: User not being materialised after frontend addition (#152930) Problem When a user has been added from the frontend, the user is then replicated to the read-only database, but during this, a call has been made to materialise the new user based on appointment. If the user has not replicated yet and materialisation triggers first, no user is materialised to all people    Solution Add a wait operation method to ensure all the requested users are replicated to materialised read-only users before executing the people group materialisation   Learning Management Prevent duplicate subject cycles (#152166) Problem When setting up a subject, the same cycle could be added more than once. This could leave a subject with duplicate terms.   Solution The cycle list now excludes cycles already assigned to the subject. Saving also prevents duplicate cycles from being created if an outdated page or another request tries to submit them.   Report Builder Corrected default font on report export (#152899) Problem The default font on report builder export is incorrect.   Solution Corrected the default font.   Performance Management Reset the modal each time it opens and load KPI pages in a consistent order so “Load More” adds only the next set of items (#152620) Problem The KPI library “Load More” list reused old modal data and loaded later pages in an order that caused repeated items.   Solution Reset the modal each time it opens and load KPI pages in a consistent order so “Load More” adds only the next set of items.