Content
View differences
Updated by Alexander Coles about 2 hours ago
### Steps teps to reproduce
1. Open a project with Backlogs enabled and several sprints with stories
2. Drag a story from one sprint to another
3. Observe how the backlog components update after the drop
### What is the buggy behavior?
After a drag-and-drop operation (moving a story between sprints, reordering, or editing a sprint), the affected backlog components are fully replaced in the DOM via Turbo Stream `replace` actions. This causes:
* A visible "flash" as entire backlog sections are torn out and re-inserted
* Any transient UI state is lost (open action menus close, focus is lost, scroll position may shift)
* The update feels jarring rather than smooth
Additionally, Primer `ActionMenu` components generate random IDs on each render, which prevents Turbo from efficiently matching elements between the old and new DOM.
### What is the expected behavior?
Backlog components should update via Turbo morphing (`method: :morph`), which diffs the existing DOM against the server response and only updates what changed. This produces a smoother visual update and preserves transient UI state where possible.
To support this, all interactive elements (action menu items, border box headers) need stable, deterministic `id` attributes so that Turbo's morph algorithm can correctly match them between renders.
### Screenshots and other files
<br>
### Environment information
**OpenProject installation type**
* Hosted cloud edition
**OpenProject version**
release/17.2
**Browser**
* [x] Chrome
* [ ] Firefox
* [ ] Safari
* [ ] Mobile Safari
* [ ] Other (please specify)
**Operating System**
* [ ] Windows
* [x] Mac OS X
* [ ] Mobile iOS
* [ ] Mobile Android
* [ ] Linux (please specify distro)
* [ ] Chrome OS
* [ ] Other (please specify)
**Language**
_en\_GB_
1. Open a project with Backlogs enabled and several sprints with stories
2. Drag a story from one sprint to another
3. Observe how the backlog components update after the drop
### What is the buggy behavior?
After a drag-and-drop operation (moving a story between sprints, reordering, or editing a sprint), the affected backlog components are fully replaced in the DOM via Turbo Stream `replace` actions. This causes:
* A visible "flash" as entire backlog sections are torn out and re-inserted
* Any transient UI state is lost (open action menus close, focus is lost, scroll position may shift)
* The update feels jarring rather than smooth
Additionally, Primer `ActionMenu` components generate random IDs on each render, which prevents Turbo from efficiently matching elements between the old and new DOM.
### What is the expected behavior?
Backlog components should update via Turbo morphing (`method: :morph`), which diffs the existing DOM against the server response and only updates what changed. This produces a smoother visual update and preserves transient UI state where possible.
To support this, all interactive elements (action menu items, border box headers) need stable, deterministic `id` attributes so that Turbo's morph algorithm can correctly match them between renders.
### Screenshots and other files
<br>
### Environment information
**OpenProject installation type**
* Hosted cloud edition
**OpenProject version**
release/17.2
**Browser**
* [x] Chrome
* [ ] Firefox
* [ ] Safari
* [ ] Mobile Safari
* [ ] Other (please specify)
**Operating System**
* [ ] Windows
* [x] Mac OS X
* [ ] Mobile iOS
* [ ] Mobile Android
* [ ] Linux (please specify distro)
* [ ] Chrome OS
* [ ] Other (please specify)
**Language**
_en\_GB_