# 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.

---