Any `services` or `pluginContext` promise requested between a disconnect
and a reconnect of the same controller instance still resolved after the
context arrived, because the epoch only ever advanced on disconnect. The
epoch now also advances on reconnect.
Unravels the per-controller RxJS context chains and the injector promise
chains. The modal closing and the match preview now resolve the declared
services lazily, the storage form loses both its colliding pluginContext
getter and its deprecated `runInZone` wrapper while the menu controllers
reach the Angular injector by way of the pluginContext escape hatch. The
toggle keeps swallowing injector failures as before.
Retrieves the autoscroll class through the pluginContext escape hatch of
the mixin, the first such consumer needing classes rather than services.
The manual `isConnected` guard drops away because pending plugin context
promises never settle on disconnected controllers.
The polling setup shifts into the servicesConnected hook because polling
and conflict handling invoke the bound service properties synchronously,
while the lazy page resolves the turbo requests service on demand when a
page scrolls into view, closing the race with the load delay.
Shifts both flatpickr dates-changed listeners into the servicesConnected
hook: their handlers invoke the bound timezone service synchronously, so
listening must only start once the service is bound. It also renames the
property to the context service name the mixin binds it under.
Unloads the registered test identifiers before stopping the application,
since `stop()` disables the DOM observer and controllers would otherwise
never disconnect, leaking document-level listeners into later tests.
Declares the turbo request and path helper services through the mixin.
The time tracking calendar setup and its dialog close listener move into
the servicesConnected hook because the FullCalendar callbacks invoke the
bound service properties synchronously; the user-triggered handlers then
resolve the services lazily.
Removes each controller's hand-rolled async `connect()` service binding,
plus one bespoke memoization, in favour of services declared through the
useServices mixin and destructured lazily in the action handlers.
The password confirmation form now intercepts submissions immediately on
connect rather than after plugin context resolution, so any early submit
can no longer bypass the confirmation dialog.
Replaces the hand-rolled `getPluginContext()` error notification lookups
with services declared and resolved through the useServices mixin.
The job dialog controller now attaches its click listener on connect, so
clicks arriving before the Angular plugin context has resolved no longer
fall through to the raw link.
Moves the controller declarations from the inner div onto the frame tags
themselves, so the list refresh controller reloads `this.element` instead
of breaking out via `closest`.
The turbo frame tags carry identical attributes, so that morph refreshes
cannot strip the controllers off the live element.
Resolves a list move when either `list_type` or `list_id` is given, so a
`list_id` passed without its type now fails as an invalid target instead
of being silently ignored by the direction handling.
A menu item that opens a modal closes its popover asynchronously, so the
overlay can disappear between the visibility check in `dismiss_menu` and
the click, raising `Capybara::ElementNotFound`.
Rescues it like the existing interactability case, re-raising unless the
menu is gone or a modal owns focus.
Stimulus controllers each hand-rolled the `getPluginContext()` await and
its disconnect race guard differently. Adds one stimulus-use style mixin
that binds the declared services and owns the race handling.
Migrates the Backlogs list-refresh controller as the first consumer.
Upstream rounds the outermost row corners assuming the rows form the box
edge. With a header or footer in between, the focus and selection styles
showed rounded corners in the middle of the box.
https://community.openproject.org/wp/AGILE-272
The transparent scheme removed the first row's top border completely, so
the selected and the current states had no top edge there. A transparent
border color keeps the row height stable and gets recolored per state.
Moves the cursor modifiers from rows onto the card itself, drops the old
row tab stop, and applies the box-list-item state colors. Clicking marks
a card selected instantly; aria-current still tracks the open item.
Relocates the `.Box-*` overrides out of the global Primer overrides file
into the component stylesheet and removes the redundant padding rule for
draggable rows. It replaces the previously hardcoded `.Box-card` padding
with variant-aware rules which mirror the upstream `.Box-row` padding of
the default, condensed, and spacious Box densities. The detached preview
is mounted outside the originating Box, and the density variant class is
copied onto the preview container so the card keeps matching padding.
Preserving `data-dragging` globally can leave stale drag state on legacy
generic-drag-and-drop (Dragula) screens after a morph, because that same
controller sets this attribute as well. Preservation now only applies to
elements inside a sortable-lists root.
No template ever sets the per-item `moveUrl` Stimulus value, so the root
controller's URL template is the only move URL source. Drops the defunct
payload field, the resolver precedence branch, and the spec fixtures and
absence assertions that referenced the removed attribute.
Swaps out the urijs `URI.expand` expansion with `parseTemplate` from the
url-template package. The urijs path relied on a side-effect import that
patched the global `URI` object and also an optional chain that silently
returned null when that import was missing; a direct import fails loudly
at build time instead.
Skip action-menu overlay dismissal once a modal is visible. Menu actions
can open the move dialog before the overlay is removed, and Selenium
cannot click that stale overlay while the modal owns focus.
Wait for the async Turbo Stream failure path before asserting the
optimistic rollback. Firefox completes the render-stream and rollback
chain one turn later than Chromium in the browser runner.