Version 9.1.264 (20 October 2026) Data Warehouse Added ApproverPeopleGroupName fields within jpHRProcesses (#156250) Problem ApproverPeopleGroupName fields need to be added within the HRProcesses data source   Solution Added Approver1PeopleGroupName - Approver10PeopleGroupName fields within HRProcesses Event Scheduling Fix document upload modal saves without a document being attached (#156959) Problem The document upload modal saves when no files are selected.   Solution Add front-end and back-end validation to prevent this. While testing, I also saw that you can copy invoice info if there is nothing to copy. Disabled the copy button in that instance too Fix copied Events do not have Notification Templates (#156169) Problem Copied Events do not have Notification Templates   Solution When copying events, the event that populates event notification records for that event was never called. Ensure it is called, similar to when a new event is created. Co-authored-by: William Fix the system displays an error when a user accesses the Notification Tab of an Event (#156919) Problem The request returned 404 because the action was missing its route template.   Solution Added [HttpGet("GetNotificationTemplates/{eventScheduleId:int}")] to match the URL and bind the schedule ID.    HR Processes Move Landbot to run in an iframe with its own CSP policy (#156958) Problem Recent CSP changes caused Landbot not to run webhooks because of blocked unsafe-evals.   Solution Moved Landbot to run in an iframe with its own CSP policy Identity and Authorisation Added correction handling in authentication within SPA render (#148859) Problem After a user leaves the React SPA page idle for a long time, their login token expires. When they click something afterwards, the server recognises that the token is no longer valid. However, instead of sending the user back through the login process, the server treats it as a React page failure and displays: Error rendering SPA Refreshing works because the failed request has already cleared the expired login information.   Solution The application now recognises an expired login as an authentication problem rather than a React rendering problem. When the session expires: The expired login information is cleared The user is redirected through the normal login process The page they were using is remembered After signing in, they are returned to that page A manual refresh is no longer required. Revoke login sessions on logout and enforce absolute expiry (#156614) Problem Logging out removed the browser's login, but a copied cookie or token could still work until it expired. An existing live connection could also stay open. Refresh must keep the original login deadline and must never restore a logged-out session. The checks also need to avoid querying the user database on every request.   Solution A session is a shared record that says which login is active and when it ends. Each sign-in now gets its own session ID and a record in Redis. The cookie and user tokens carry that ID. Requests check that the login is still active. A successful refresh keeps the same ID and original deadline. Refresh and browser activity do not extend the login. Once the deadline is reached, users must sign in again, even if an access token has time remaining. Logging out deletes that record and tells the other servers to close matching live connections. Redis performs both actions in one operation, so an application crash cannot leave deletion finished without announcing cancellation. Copied credentials for that session then stop working. Another separate login stays signed in. Account checks run on a schedule. Reissuing a cookie to update account details preserves its expiry and does not reset the account-check schedule. Older user cookies and tokens without a session ID are rejected. Users must sign in again after the update. Imports Add a step to create user dates during the import when they do not yet exist for the user being imported. (#152447) Problem When importing a new user, they do not have user dates yet, and then the company dates received are never imported   Solution Add logic to insert new user company date records only when they do not already exist. Job Profiler Warning messages for Select Another Approver and Escalate (#156435) Problem Select Another Approver and Escalate on the HR Process Requests did not display the warning message when already actioned.   Solution Added checks to display a warning message when a level was already escalated or another approver was selected Org Structure Corrected an out-of-memory exception when loading more than 500 child nodes (#156780) Problem When a parent org node has more than 500 child nodes, an out-of-memory exception occurs   Solution Adds server-side pagination for org node queries with skip/take and hasMore metadata, and updates the admin org structure tree to fetch additional nodes lazily via a Load More item. This keeps large org trees responsive while preserving the existing structure and search behaviour. Limit the load of the org nodes to 200 with a load more option Resolved modal being behind backdrop (#156411) Problem When editing an org node and selecting a reporting-line manager, the manager picker opens on top of the org-node modal. Because both are modals, the dark overlay/backdrop was being layered incorrectly. The overlay could end up sitting above the manager picker, which made the picker look open but prevented the user from clicking or interacting with it.   Solution Adjusted the modal layering so that, when the manager picker opens from inside the org-node modal, the screen layers are ordered correctly: Org-node edit modal stays in the background. A backdrop appears above the org-node modal. The manager picker appears above that backdrop. This keeps the visual separation between the two modals while allowing the manager picker to remain fully clickable and usable. People Management Restrict access to profile summaries (#156426) Problem An authenticated user could read another person's profile summary without permission, including personal and identity information.   Solution Apply the existing profile access check before loading the summary or returning cached data. Preserve access for the person themselves, authorised administrators and permitted people-group managers. Corrected reporting line href ref (#156979) Problem When in the summary and reporting lines are selected, it does not pan to the ref as the ID is missing   Solution Added missing ID Resolve disciplinary actions menu not shown for other users for manager with People group permission and ruleset additional section admin setting (#156778) Problem Manager can't access the disciplinary actions menu even though the manager has People group permission to do so   Solution Resolve the disciplinary actions menu not showing for other users for managers with People group permission and the ruleset additional section admin setting. This is because the Self Service setting is used as well if the manager views other people's profiles Add tooltip to Recycle bin tab (#156741) Problem Add a tooltip on the Recycle Bin Tab hover   Solution The system should display a Tooltip on Delete Business Rules. Example: "All Personal Records will be permanently deleted" Restrict access to employee profiles (#156617) Problem A logged-in user could change the user ID in `/Account/People/GetUser` to view another employee's profile without having permission to view that person. Being logged in was checked, but access to the requested profile was not.   Solution Check access before loading a full profile or returning a cached profile response. A person can view their own profile, or another employee's profile when they have an authorised management group covering that employee or a people/ruleset administrator role. Retrieval remains limited to the logged-in user's ruleset. Optimistically remove deleted/restored users from people management list to cater for replication delay. (#156047) Problem The system does not Remove/Restore the records immediately. The refresh delay gives the Impression that the Action failed.   Solution Optimistically remove deleted/restored users from the people management list to account for replication delay. Performance Management Resolved translation (#156942) Problem Incorrect translation   Solution Corrected Translation Implemented template state to indicate draft and awaiting approval (#156942) Problem Request made to only allow an admin to mark a template as published once the manager who was given access submits it for approval,   Solution To accommodate all other clients as well, a draft and approval state was introduced; only when a manager has been given access will this be set to the draft state, which does not allow the admin to mark the template as published until the manager says send for approval Added change to date time relevant display calculations (#156060) Solution Request was made to change the relevant display dates of months ago and so: Added reusable C# calculation/formatting helper; updated Review Setup “last edited” tooltips; refactored the shared employee/manager dashboard hook Added cache-bustable methods for moderation (#156917) Problem After moderation was done, the same result list was returned from the cache, which was not busted   Solution Added bustable methods to ensure the previous result set gets busted Report Builder Corrected export of datetime not taking culture and During not working (#156791) Problem Exported report dates did not respect the user’s regional settings. For example, a user using UK formatting could receive dates displayed in the US order. Two issues affected date-range filters: Date ranges could not be selected or edited correctly. On the View Report page, one date showed as invalid or the second date picker did not work. On the Add/Edit Report page, selecting a specific date range triggered a save but prevented the dates from being selected. Once date ranges were recognised correctly, the filter table became misaligned. The second-value column changed the available space, causing headings, switches, and delete buttons to move out of position.   Solution The user’s culture is now passed through the complete export process. Excel dates remain genuine date values, so sorting, filtering, and formulas continue to work, while Excel displays them using the user’s preferred date format. The date-range controls were corrected so both start and end dates can be selected and updated. The translated “and” separator is now available, and the existing date format is preserved. The filter table’s original behaviour was retained: the second-value column only appears when required. When it appears, all columns resize evenly so the headings and controls remain aligned. SignalR Add defensive guard inside UserNotificationHub (#150816) Problem When a client connects to the SignalR hub before its JWT is established — or when any unauthenticated WebSocket connection calls SubscribeToUserNotifications — User.FindFirst(UserIdClaim) returns null, and the exception fires unconditionally. Neither the hub class nor the method has an [Authorise] attribute, and there is no _identityService.Authenticated guard before the claim read. UnsubscribeFromUserNotifications() (lines 41–47) has the identical vulnerability.   Solution This pull request refactors the logic for subscribing and unsubscribing users to notification groups in the UserNotificationHub by extracting group resolution into a new helper method. This improves code reuse and error handling for authentication and group assignment.