The work package activity tab computed a per-journal sequence_version on
every render — a ROW_NUMBER() window function over a LATERAL join — only to
stamp the legacy data-anchor-activity-id that #activity-N deep links rely on.
Nothing mints those links anymore; copy and share links use
#comment-<journal id>, which needs no extra query.
The activity number is now resolved on demand. Only a request carrying
?anchor=activity-N runs the window function, mapping the number to a journal
id the paginator exposes as resolved_anchor. The view hands that to the
client, which rewrites #activity-N to the canonical #comment-<id> and scrolls
using the comment anchor already present in the DOM. Default renders no longer
touch the window function.
References WP #68063.
In zoneless mode, the Stimulus `EditorController` connects before
CKEditor finishes its async initialization. The original
`openEditorWithInitialData()` checked `isEditorEmpty()` which returned
`false` when `ckEditorInstance` was `undefined` (since `undefined !==
''`), silently skipping `setData()` and leaving the editor empty.
Introduces `setEditorDataWhenReady()` which uses a `MutationObserver`
to detect when CKEditor's editable element appears in the DOM, then
defers `setData()` via `setTimeout()` to ensure Angular's CKEditor
initialization Promise chain has fully completed.
Also adds a `$transitions.onSuccess` hook that calls
`ApplicationRef.tick()` after UIRouter transitions, ensuring CD runs
in zoneless mode so that split-view tab switches properly
destroy/recreate components.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Adds `GET /api/v3/projects/:id/configuration` endpoint that returns
all global configuration properties plus project-specific settings.
This allows client apps to check both enterprise token features
(availableFeatures) and project settings (enabledInternalComments)
in a single API call.
* Create a FullView::CopyComponent for WorkPackages which is routed from rails
* Remove angular splitCopy route and component as it was overwritten by the angular fullCopy route for quite some time already and nobody complained. So we decided to remove the splitCopy completely
* Create FullView::CreateComponent for WorkPackages which is now routed from rails instead of Angular
* First draft of implementing the FullView route for WorkPackages from rails
* Pass correct tab from the URL to the FullView::ShowComponent
* Do a hard reload to "create" route when we are not routed from Angular
* Adapt routing spec to new WorkPackage routes and to some fine-tuning with the WP routes
* Show correct tab in WP Full view and change URL when clicking a tab entry
* Adapt to new rails based routing
* Fix some routes and redirects
* Make sure, the split screen stil renders correctly
* Remove back button from WP full view
* Fix routing issues
* Start fixing specs
* Attempt to override the browser history to be able to use browser back
* Use helper function to build new WP url string
* Adapt spec that now partially renders backend toasts
* Remove ability to move to fullscreen
Theoretically, we can re-add it by posting to some form endpoint, but
not worth it for the first iteration
* Disable cache-control on angular routed pages, so back links work
* Fix double click to fullscreen
* Adapt navigation and title setting
* Let WP breadcrumb to a hard reload instead of Angular transition
* Redirect when the WP route is incomplete (this is the attempt to re-implement an angular functionality)
* Navigate with Turbo when double clicking a card
* Adapt onboarding tour to new hard reload when switching to WP full view
* Fix some specs
* Fix more tests
* Hide Overview tab on FullView
* Correct check for incomplete routes
* Do a hard refresh when coming from slpit screen to full view
* Fix notification navigation
* Adapt attachment spec as the tab switch cannot be done anymore while dragging
* Fix more tests
* Please rubocop and fix more tests
* Attempt to fix navigation_spec
* Add debian_base for pullpreview
---------
Co-authored-by: Oliver Günther <mail@oliverguenther.de>
Added localStorage persistence to maintain internal comment checkbox state when users switch between work package tabs.
The state is isolated per work package to prevent interference between different work packages.
https://community.openproject.org/wp/67608
During the controller decomposition, the scroll position check was
moved to after DOM updates instead of before, breaking auto-scroll
behavior when new comments were added.
Captures scroll position before streams update in PollingController
and passes it to AutoScrollingController to restore proper behavior.
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
The activities tab polling mechanism updates newly updated journals, based on the last update timestamp. In case an attachment is added, or the journal is updated in any other places- the UI item would be updated\ on the next poll, overriding the edit form.
This commit adds an exclusion for any forms that are in "edit" state- it does not yet take into account conflict resolution.
https://community.openproject.org/wp/63545https://community.openproject.org/wp/65680
https://community.openproject.org/work_packages/63898
Amend the text area label requirement introduced in 6bf31400ed to allow for an alternate
ARIA-label as not all use cases fit this requirement- but there should always be a reference for screenreaders.
`aria-labelled-by` OR `aria-label`
As CKEditor re-renders the text area aria-label in every focus/blur event, we rely on the focusTracker to keep the aria-label
updated
* Rename InternalMentionsSanitizer "notes" to "comment" Better represent that the class recieves a "work package comment" and not a "note"
* Fully qualify `InternalCommentMentionsSanitizer` class name
Failing spec ./spec/features/activities/work_package/activities_spec.rb:539
on job run https://github.com/opf/openproject/actions/runs/14531919190/job/40773106633
The test did not correctly wait for the second journals changes to be
displayed. It was waiting with
`activity_tab.expect_journal_changed_attribute(text: "Subject")` but as
the subject was already changed in the first journal entry, it was
returning immediately and did not wait for the second journal entry to
be updated.
Waiting for `activity_tab.expect_journal_changed_attribute(text: "A new
subject")` instead forces the test to wait for the second journal entry
to be displayed and fixed the flakyness.
Attachment scenarios are covered in `spec/features/activities/work_package/activity_tab_comment_editor_spec.rb`
Notably: there is no longer a special permission for adding attachments to wp comments, rather they are treated
as inline- if a user can comment, then they can add attachments.
The lifecycle of the attachment is tied to it's containing comment.