* Use new async FilterableTreeView for global project selector
* Remove replaced angular component
* Fine tune sorting and expansion state of the new project selector
* Update primer to 0.86.1
* Add workspace information and filter results hierarchy information to project selector
* Include review feedback: Harmonize I18n keys, fix visible scope, use guarded local storage
* Add a turboFrame in the project select overlay to only load the projects when it is actually opened
* Restore BIM tab styles which were broken for a while already but the new project selector changes made it so bad that the test broke because the plus icon was overlapping the checkbox
* Clarify spec expectation
https://community.openproject.org/wp/STC-462
Two readability passes over the work package activity tab, no behaviour change. The paginator's private methods are reordered to follow their call order so the file reads top-down from `#call`, and the three activity filter modes (`:all`, `:only_comments`, `:only_changes`) — until now bare symbols duplicated across the controller, paginator, journal components and the hidden form — move into a single `WorkPackages::ActivitiesTab::Filters` module so the modes have one source of truth and can't drift apart. The diff reaches beyond the paginator into the controller, several components and a form, since that's where the symbols were scattered.
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.
Use OpPrimer::AttributesHelper so a caller-supplied data-controller is
concatenated with the required filter--filters-form controller instead of
being overwritten. The wrapper spec now asserts both controllers survive.
Stimulus supports multiple controllers on one element, but Primer's
`merge_data` is not controller-aware and silently drops a caller's
`data-controller` when a component merges in its own. Treat `controller`
as a plural data attribute so the values concatenate instead.
Uses `ConditionalWrapper` to eliminate template duplication in the
`wrap_with_controller` branch, and `merge_data` from
`Primer::AttributesHelper` for Stimulus data attributes.
https://community.openproject.org/wp/OP-19415
Replaces `Filters::FilterForm` (an `ApplicationForm` subclass) with
`Filters::FilterFormComponent` (an `ApplicationComponent`). The old form
overrode `:nodoc:` Primer hooks (`before_render`, `perform_render`) and
read semi-public ivars (`@builder`, `@view_context`). The new component
receives the builder as an explicit keyword arg and uses a standard ERB
template, reducing Primer internal coupling from five semi-public APIs
to one (`FormList`).
https://community.openproject.org/wp/OP-19415
The Convert identifiers button sat flush against the preview table.
The table now carries its own bottom margin (mb: 3, via Primer::Box),
matching the spacing the previous hand-rolled box had.
Long identifiers overflowed into the neighbouring column. Replace the
hand-rolled flex table with the design-system BorderBoxTableComponent,
which handles column spacing, wrapping, and responsive stacking; the
project and previous-identifier columns wrap as main columns.
capybara_accessible_selectors 0.16 resolves role selectors such as
`:columnheader` by the computed accessible name. In a browser that name
folds in the CSS `text-transform: uppercase` styling and the column
action-menu trigger text, so `have_columnheader("Subject")` no longer
matches a header whose accessible name resolves to "SUBJECT Open menu".
Sets an explicit `aria-label` equal to the plain caption on each header
cell, in both the server-rendered tables and the work package table, so
the accessible name is the column title alone. This also improves screen
reader output, which previously announced the uppercased text and the
menu label.