924 Commits

Author SHA1 Message Date
Eric Schubert a1f622b271 [#75749] fix test selector again 2026-06-12 11:21:33 +02:00
Eric Schubert e37d910c98 [#75749] fixed ckeditor page object 2026-06-09 15:36:07 +02:00
Henriette Darge 396de9362f [74625] Make project hierarchy collapsable in the global project selector (#23137)
* 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
2026-06-08 08:14:47 +02:00
ulferts 6ab4d02059 attempt to fix flickering activity spec
rspec ./spec/features/activities/work_package/activities_spec.rb:678

The attempt is to have the frontend wait for the turbo stream response rather than a fixed timeout.
The removed wait_for seems to be non-functional.
2026-06-04 16:43:50 +02:00
Oliver Günther 11dc79a74d Merge remote-tracking branch 'origin/release/17.5' into dev 2026-06-02 16:22:39 +02:00
Behrokh Satarnejad 74183943d5 Use test selectors instead of text selector 2026-06-01 18:58:47 +02:00
OpenProject Actions CI 3e02e2863f Merge branch 'release/17.5' into dev 2026-05-28 12:18:34 +00:00
Henriette Darge c74076a173 Merge pull request #23373 from opf/bug/64359-work-package-configuration-dialog-s-highlighting-tab-has-no-space-between-radio-buttons-and-labels
[64359] Work package configuration dialog's highlighting tab has no space between radio buttons and labels
2026-05-28 14:13:29 +02:00
OpenProject Actions CI 49b802ca02 Merge branch 'release/17.5' into dev 2026-05-28 08:51:09 +00:00
Oliver Günther b0905e35b7 Merge pull request #23392 from opf/fix/ldap-seeder-aliases
Fix LDAP seeder not using env aliases and underscores
2026-05-28 08:56:14 +02:00
Oliver Günther a058f227f3 Add retry block on button save click 2026-05-28 08:32:49 +02:00
Oliver Günther a1505dc0f5 Merge remote-tracking branch 'origin/release/17.5' into dev 2026-05-27 09:58:01 +02:00
Oliver Günther 46a4dbd1e6 Fix highlighting spec flakyness
The failing spec in this run
https://github.com/opf/openproject/actions/runs/26492229079/job/78012301717?pr=23371
was caused by the dialog not being open in the right tab.

Adding an expectation to it hopefully fixes it
2026-05-27 08:53:53 +02:00
Alexander Brandon Coles c776be17cc Make WP query history filter checks idempotent
Turbo can restore the query filter pane as either open or closed during
browser history traversal. Use an idempotent helper before asserting
restored filters so the spec checks the query state instead of depending
on the current pane visibility.
2026-05-26 23:17:42 +02:00
David F 88a29a0aff Turn checkbox filters into toggle switch. wp/74380 2026-05-26 08:14:56 +02:00
David F 683bda80b4 Clean up some CSS and JS. wp/74380 2026-05-26 08:14:56 +02:00
David F 8403bb74f2 Generalize datetime helper for advanced filters. wp/74380 2026-05-26 08:14:56 +02:00
David F 0f1daad3ee Fix advanced filters specs with date range picker. wp/74380 2026-05-26 08:14:56 +02:00
David F 527379c9a2 Fix most tests for advanced filters. wp/74380 2026-05-26 08:14:56 +02:00
David F fe39ccec97 Improve input group markup for advanced filters. wp/74380 2026-05-26 08:14:56 +02:00
David F 1ce489a2e0 Turn partials into form components. wp/74380 2026-05-26 08:14:56 +02:00
Behrokh Satarnejad d924c255cf [69524] Primerize Types form configuration page (#22854)
* Create the section component

* Create the form configuration component

* Create a controller

* change form template

* Use primer dialog for reset to defaults button

* show WP configuration modal while creating a related WPs table

* Fix the drag and drop functionality without save button

* Fix renaming functionality

* Use generic drag and drop in form configuration and move all client side action handling to server side

* Fix embedded query form configuration regressions

* Add data test selectors to all elements that we used for test

* update the current tests with the new implementations and design

* Add new tests for new controller of sections and rows

* WP quesry row should only have edit quesry action

* Update transformer spec regarding the new changes

* Fix the failing test in reset form configuration and some tests for actions

* Fix rubocop errors

* Fix eslint errors

* Add spec for removing a section

* Use condensed border boxes

* fix failing specs

* fix failing specs

* Switch the buttons in form configuration component

* Create the section at the top of the list

* Instead of using UUID, use the name of the group as the key

* Add missing check for EE for section actions

* Remove angular components

* Use action list instead of a border box for left side panel

* Reduce the margin between the right side panel and sub header, add some space to the query table left side, span to the whole available space

* Show validation errors while updating and creating a section

* Use a danger dialog for reset to default

* Add a confirmation for removing the section

* Align items in the row

* Use test_selector instead of data-test-selector

* Create move_action in rb file

* Create move_action in rb file

* Simplify section component

* Simplify form configuration component

* Remove dialog for rename and delete section on missing EE

* Create a component for inactive attribute list

* Create a separate component for reset dialog

* Remove EE feedback dialog

* Remove form partial which is not needed anymore

* Remove unused js strings

* Update using update_via_turbo

* Remove form configuration rows controller

* Create a blanksalte component

* Fix failing specs

* Fix failing specs

* Fix failing specs

* Remove unused translation strings

* Align form configuration section routes with actual create flow

* Change section to group

* Change section to group in services and controllers

* Change section to group in en.yml

* Fix rubocop errors

* Move the query group persistence assertion from the JS feature spec
to the synchronous form configuration groups controller spec.

* Reuse query service result in embedded query build

* Keep inactive attribute filter after turbo list refresh

* Extract form configuration group edit state into form model

* Fix the failing test

* Potential fix for pull request finding 'CodeQL / Potentially uninitialized local variable'

Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com>

* Rename inactive attribute component inputs

* Refine reset dialog wording for form configuration

* Use direct Turbo action for adding attribute groups

* Reuse generic filter-list controller for inactive attributes

* Remove focus impelementation in ts

* Group form configuration Stimulus controllers under one namespace

* Use turbo request service in form configuration controller

* Clarify legacy group key normalization in form config contract

* Replace inactive attribute list wrapper via turbo stream

* Extract duplicate untitled group key generation into Type::FormGroup.next_untitled_key

* Auto-generate untitled group name on create instead of returning an error

* Avoid mixed return types in form config group create service

* Extract shared form configuration group service behavior into concern

* Fix spacing for the last group and italic font for the placeholder rows

* Replace Angular no-results component with Primer Banner on form configuration page

* Hide dropped element immediately to prevent flickering before Turbo Stream response

* Reload type before rendering create error to prevent duplicate groups

* Await service initialization before use to prevent potential race condition

* Replace sleep calls with deterministic waits in form configuration spec

* Handle malformed JSON and invalid query errors gracefully in form configuration update

* Make query group label a clickable button and empty group hint italic

---------

Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com>
2026-05-13 12:56:18 +02:00
ulferts eaf26e4918 attempt to fix flickering activities spec
rspec ./spec/features/activities/work_package/activities_spec.rb:678
2026-05-08 11:14:03 +02:00
Oliver Günther 5bf27bb868 Merge remote-tracking branch 'origin/release/17.4' into dev 2026-05-05 12:29:43 +02:00
Oliver Günther e9702547af Retry CKEditor setData event in case it's not initialized yet (#23059)
* Retry CKEditor setData event in case it's not initialized yet

set_markdown dispatches a op:ckeditor:setData custom event immediately after .ck-content appeared in the DOM.
But the eventlistener for this event is registered inside an async .then() callback in ckeditor-setup.service.ts.

The event listener may not yet be registered at that point, causing inserted text to "vanish" and not be saved at all

* Use updated dataset attribute to know it was updated without checking text
2026-05-05 12:28:35 +02:00
Tomas Hykel db6f4734ad fix: Remove flakiness from a WP activities spec 2026-04-27 21:40:04 +02:00
Oliver Günther d29f0bb7b3 Adapt styles and class expectations 2026-04-27 13:53:03 +02:00
Alexander Brandon Coles 4e99a964d6 Merge branch 'dev' into code-maintenance/73798-remove-scrum_projects-feature-flag 2026-04-20 08:40:52 +01:00
Oliver Günther 99e515c034 Try to fix ./modules/my_page/spec/features/my/my_page_spec.rb:103 2026-04-20 07:34:47 +02:00
Oliver Günther 2898a1d0ff Delete dialog primer 2026-04-19 21:10:41 +02:00
Alexander Brandon Coles 712fdbceba Harden feature test support helpers
Stabilize shared ng-select interactions for Cuprite and reuse open
dropdowns safely in modal-based flows. Also keep filter clearing
safe when no value is selected and refresh the My Page drop target
after drag-induced DOM updates.
2026-04-17 10:15:39 +01:00
Alexander Brandon Coles 8d72592230 Improve sprint filter support in WP filter helper
Add `clear_filter_value` to clear an ng-select filter's current
selection without removing the filter row, allowing a new value
to be set in place.

Refactor `insert_autocomplete_item` to accept a filter `id` string
rather than a pre-captured element, so the ng-select node is
re-queried on each call. This avoids stale element references
after `clear_filter_value` causes the DOM to re-render.
2026-04-17 09:39:52 +01:00
Alexander Brandon Coles ccccead89f Merge branch 'dev' into merge-release/17.3-20260411112919
# Conflicts:
#	config/locales/crowdin/af.yml
#	config/locales/crowdin/ar.yml
#	config/locales/crowdin/az.yml
#	config/locales/crowdin/be.yml
#	config/locales/crowdin/bg.yml
#	config/locales/crowdin/ca.yml
#	config/locales/crowdin/ckb-IR.yml
#	config/locales/crowdin/cs.yml
#	config/locales/crowdin/da.yml
#	config/locales/crowdin/de.yml
#	config/locales/crowdin/el.yml
#	config/locales/crowdin/eo.yml
#	config/locales/crowdin/es.yml
#	config/locales/crowdin/et.yml
#	config/locales/crowdin/eu.yml
#	config/locales/crowdin/fa.yml
#	config/locales/crowdin/fi.yml
#	config/locales/crowdin/fil.yml
#	config/locales/crowdin/fr.yml
#	config/locales/crowdin/he.yml
#	config/locales/crowdin/hi.yml
#	config/locales/crowdin/hr.yml
#	config/locales/crowdin/hu.yml
#	config/locales/crowdin/id.yml
#	config/locales/crowdin/it.yml
#	config/locales/crowdin/ja.yml
#	config/locales/crowdin/js-af.yml
#	config/locales/crowdin/js-ar.yml
#	config/locales/crowdin/js-az.yml
#	config/locales/crowdin/js-be.yml
#	config/locales/crowdin/js-bg.yml
#	config/locales/crowdin/js-ca.yml
#	config/locales/crowdin/js-ckb-IR.yml
#	config/locales/crowdin/js-cs.yml
#	config/locales/crowdin/js-da.yml
#	config/locales/crowdin/js-de.yml
#	config/locales/crowdin/js-el.yml
#	config/locales/crowdin/js-eo.yml
#	config/locales/crowdin/js-es.yml
#	config/locales/crowdin/js-et.yml
#	config/locales/crowdin/js-eu.yml
#	config/locales/crowdin/js-fa.yml
#	config/locales/crowdin/js-fi.yml
#	config/locales/crowdin/js-fil.yml
#	config/locales/crowdin/js-fr.yml
#	config/locales/crowdin/js-he.yml
#	config/locales/crowdin/js-hi.yml
#	config/locales/crowdin/js-hr.yml
#	config/locales/crowdin/js-hu.yml
#	config/locales/crowdin/js-id.yml
#	config/locales/crowdin/js-it.yml
#	config/locales/crowdin/js-ja.yml
#	config/locales/crowdin/js-ka.yml
#	config/locales/crowdin/js-kk.yml
#	config/locales/crowdin/js-ko.yml
#	config/locales/crowdin/js-lt.yml
#	config/locales/crowdin/js-lv.yml
#	config/locales/crowdin/js-mn.yml
#	config/locales/crowdin/js-ms.yml
#	config/locales/crowdin/js-ne.yml
#	config/locales/crowdin/js-nl.yml
#	config/locales/crowdin/js-no.yml
#	config/locales/crowdin/js-pl.yml
#	config/locales/crowdin/js-pt-BR.yml
#	config/locales/crowdin/js-pt-PT.yml
#	config/locales/crowdin/js-ro.yml
#	config/locales/crowdin/js-ru.yml
#	config/locales/crowdin/js-rw.yml
#	config/locales/crowdin/js-si.yml
#	config/locales/crowdin/js-sk.yml
#	config/locales/crowdin/js-sl.yml
#	config/locales/crowdin/js-sr.yml
#	config/locales/crowdin/js-sv.yml
#	config/locales/crowdin/js-th.yml
#	config/locales/crowdin/js-tr.yml
#	config/locales/crowdin/js-uk.yml
#	config/locales/crowdin/js-uz.yml
#	config/locales/crowdin/js-vi.yml
#	config/locales/crowdin/js-zh-CN.yml
#	config/locales/crowdin/js-zh-TW.yml
#	config/locales/crowdin/ka.yml
#	config/locales/crowdin/kk.yml
#	config/locales/crowdin/ko.yml
#	config/locales/crowdin/lt.yml
#	config/locales/crowdin/lv.yml
#	config/locales/crowdin/mn.yml
#	config/locales/crowdin/ms.yml
#	config/locales/crowdin/ne.yml
#	config/locales/crowdin/nl.yml
#	config/locales/crowdin/no.yml
#	config/locales/crowdin/pl.yml
#	config/locales/crowdin/pt-BR.yml
#	config/locales/crowdin/pt-PT.yml
#	config/locales/crowdin/ro.yml
#	config/locales/crowdin/ru.yml
#	config/locales/crowdin/rw.yml
#	config/locales/crowdin/si.yml
#	config/locales/crowdin/sk.yml
#	config/locales/crowdin/sl.yml
#	config/locales/crowdin/sr.yml
#	config/locales/crowdin/sv.yml
#	config/locales/crowdin/th.yml
#	config/locales/crowdin/tr.yml
#	config/locales/crowdin/uk.yml
#	config/locales/crowdin/uz.yml
#	config/locales/crowdin/vi.yml
#	config/locales/crowdin/zh-CN.yml
#	config/locales/crowdin/zh-TW.yml
#	modules/backlogs/config/locales/crowdin/af.yml
#	modules/backlogs/config/locales/crowdin/ar.yml
#	modules/backlogs/config/locales/crowdin/az.yml
#	modules/backlogs/config/locales/crowdin/be.yml
#	modules/backlogs/config/locales/crowdin/bg.yml
#	modules/backlogs/config/locales/crowdin/ca.yml
#	modules/backlogs/config/locales/crowdin/ckb-IR.yml
#	modules/backlogs/config/locales/crowdin/cs.yml
#	modules/backlogs/config/locales/crowdin/da.yml
#	modules/backlogs/config/locales/crowdin/de.yml
#	modules/backlogs/config/locales/crowdin/el.yml
#	modules/backlogs/config/locales/crowdin/eo.yml
#	modules/backlogs/config/locales/crowdin/es.yml
#	modules/backlogs/config/locales/crowdin/et.yml
#	modules/backlogs/config/locales/crowdin/eu.yml
#	modules/backlogs/config/locales/crowdin/fa.yml
#	modules/backlogs/config/locales/crowdin/fi.yml
#	modules/backlogs/config/locales/crowdin/fil.yml
#	modules/backlogs/config/locales/crowdin/fr.yml
#	modules/backlogs/config/locales/crowdin/he.yml
#	modules/backlogs/config/locales/crowdin/hi.yml
#	modules/backlogs/config/locales/crowdin/hr.yml
#	modules/backlogs/config/locales/crowdin/hu.yml
#	modules/backlogs/config/locales/crowdin/id.yml
#	modules/backlogs/config/locales/crowdin/it.yml
#	modules/backlogs/config/locales/crowdin/ja.yml
#	modules/backlogs/config/locales/crowdin/ka.yml
#	modules/backlogs/config/locales/crowdin/kk.yml
#	modules/backlogs/config/locales/crowdin/ko.yml
#	modules/backlogs/config/locales/crowdin/lt.yml
#	modules/backlogs/config/locales/crowdin/lv.yml
#	modules/backlogs/config/locales/crowdin/mn.yml
#	modules/backlogs/config/locales/crowdin/ms.yml
#	modules/backlogs/config/locales/crowdin/ne.yml
#	modules/backlogs/config/locales/crowdin/nl.yml
#	modules/backlogs/config/locales/crowdin/no.yml
#	modules/backlogs/config/locales/crowdin/pl.yml
#	modules/backlogs/config/locales/crowdin/pt-BR.yml
#	modules/backlogs/config/locales/crowdin/pt-PT.yml
#	modules/backlogs/config/locales/crowdin/ro.yml
#	modules/backlogs/config/locales/crowdin/ru.yml
#	modules/backlogs/config/locales/crowdin/rw.yml
#	modules/backlogs/config/locales/crowdin/si.yml
#	modules/backlogs/config/locales/crowdin/sk.yml
#	modules/backlogs/config/locales/crowdin/sl.yml
#	modules/backlogs/config/locales/crowdin/sr.yml
#	modules/backlogs/config/locales/crowdin/sv.yml
#	modules/backlogs/config/locales/crowdin/th.yml
#	modules/backlogs/config/locales/crowdin/tr.yml
#	modules/backlogs/config/locales/crowdin/uk.yml
#	modules/backlogs/config/locales/crowdin/uz.yml
#	modules/backlogs/config/locales/crowdin/vi.yml
#	modules/backlogs/config/locales/crowdin/zh-CN.yml
#	modules/backlogs/config/locales/crowdin/zh-TW.yml
#	modules/bim/config/locales/crowdin/fr.yml
#	modules/budgets/config/locales/crowdin/cs.yml
#	modules/costs/config/locales/crowdin/ja.yml
#	modules/documents/config/locales/crowdin/af.yml
#	modules/documents/config/locales/crowdin/ar.yml
#	modules/documents/config/locales/crowdin/az.yml
#	modules/documents/config/locales/crowdin/be.yml
#	modules/documents/config/locales/crowdin/bg.yml
#	modules/documents/config/locales/crowdin/ca.yml
#	modules/documents/config/locales/crowdin/ckb-IR.yml
#	modules/documents/config/locales/crowdin/cs.yml
#	modules/documents/config/locales/crowdin/da.yml
#	modules/documents/config/locales/crowdin/de.yml
#	modules/documents/config/locales/crowdin/el.yml
#	modules/documents/config/locales/crowdin/eo.yml
#	modules/documents/config/locales/crowdin/es.yml
#	modules/documents/config/locales/crowdin/et.yml
#	modules/documents/config/locales/crowdin/eu.yml
#	modules/documents/config/locales/crowdin/fa.yml
#	modules/documents/config/locales/crowdin/fi.yml
#	modules/documents/config/locales/crowdin/fil.yml
#	modules/documents/config/locales/crowdin/fr.yml
#	modules/documents/config/locales/crowdin/he.yml
#	modules/documents/config/locales/crowdin/hi.yml
#	modules/documents/config/locales/crowdin/hr.yml
#	modules/documents/config/locales/crowdin/hu.yml
#	modules/documents/config/locales/crowdin/id.yml
#	modules/documents/config/locales/crowdin/it.yml
#	modules/documents/config/locales/crowdin/ja.yml
#	modules/documents/config/locales/crowdin/ka.yml
#	modules/documents/config/locales/crowdin/kk.yml
#	modules/documents/config/locales/crowdin/ko.yml
#	modules/documents/config/locales/crowdin/lt.yml
#	modules/documents/config/locales/crowdin/lv.yml
#	modules/documents/config/locales/crowdin/mn.yml
#	modules/documents/config/locales/crowdin/ms.yml
#	modules/documents/config/locales/crowdin/ne.yml
#	modules/documents/config/locales/crowdin/nl.yml
#	modules/documents/config/locales/crowdin/no.yml
#	modules/documents/config/locales/crowdin/pl.yml
#	modules/documents/config/locales/crowdin/pt-BR.yml
#	modules/documents/config/locales/crowdin/pt-PT.yml
#	modules/documents/config/locales/crowdin/ro.yml
#	modules/documents/config/locales/crowdin/ru.yml
#	modules/documents/config/locales/crowdin/rw.yml
#	modules/documents/config/locales/crowdin/si.yml
#	modules/documents/config/locales/crowdin/sk.yml
#	modules/documents/config/locales/crowdin/sl.yml
#	modules/documents/config/locales/crowdin/sr.yml
#	modules/documents/config/locales/crowdin/sv.yml
#	modules/documents/config/locales/crowdin/th.yml
#	modules/documents/config/locales/crowdin/tr.yml
#	modules/documents/config/locales/crowdin/uk.yml
#	modules/documents/config/locales/crowdin/uz.yml
#	modules/documents/config/locales/crowdin/vi.yml
#	modules/documents/config/locales/crowdin/zh-CN.yml
#	modules/documents/config/locales/crowdin/zh-TW.yml
#	modules/gitlab_integration/config/locales/crowdin/af.yml
#	modules/gitlab_integration/config/locales/crowdin/ar.yml
#	modules/gitlab_integration/config/locales/crowdin/az.yml
#	modules/gitlab_integration/config/locales/crowdin/be.yml
#	modules/gitlab_integration/config/locales/crowdin/bg.yml
#	modules/gitlab_integration/config/locales/crowdin/ca.yml
#	modules/gitlab_integration/config/locales/crowdin/ckb-IR.yml
#	modules/gitlab_integration/config/locales/crowdin/cs.yml
#	modules/gitlab_integration/config/locales/crowdin/da.yml
#	modules/gitlab_integration/config/locales/crowdin/de.yml
#	modules/gitlab_integration/config/locales/crowdin/el.yml
#	modules/gitlab_integration/config/locales/crowdin/eo.yml
#	modules/gitlab_integration/config/locales/crowdin/es.yml
#	modules/gitlab_integration/config/locales/crowdin/et.yml
#	modules/gitlab_integration/config/locales/crowdin/eu.yml
#	modules/gitlab_integration/config/locales/crowdin/fa.yml
#	modules/gitlab_integration/config/locales/crowdin/fi.yml
#	modules/gitlab_integration/config/locales/crowdin/fil.yml
#	modules/gitlab_integration/config/locales/crowdin/fr.yml
#	modules/gitlab_integration/config/locales/crowdin/he.yml
#	modules/gitlab_integration/config/locales/crowdin/hi.yml
#	modules/gitlab_integration/config/locales/crowdin/hr.yml
#	modules/gitlab_integration/config/locales/crowdin/hu.yml
#	modules/gitlab_integration/config/locales/crowdin/id.yml
#	modules/gitlab_integration/config/locales/crowdin/it.yml
#	modules/gitlab_integration/config/locales/crowdin/ja.yml
#	modules/gitlab_integration/config/locales/crowdin/ka.yml
#	modules/gitlab_integration/config/locales/crowdin/kk.yml
#	modules/gitlab_integration/config/locales/crowdin/ko.yml
#	modules/gitlab_integration/config/locales/crowdin/lt.yml
#	modules/gitlab_integration/config/locales/crowdin/lv.yml
#	modules/gitlab_integration/config/locales/crowdin/mn.yml
#	modules/gitlab_integration/config/locales/crowdin/ms.yml
#	modules/gitlab_integration/config/locales/crowdin/ne.yml
#	modules/gitlab_integration/config/locales/crowdin/nl.yml
#	modules/gitlab_integration/config/locales/crowdin/no.yml
#	modules/gitlab_integration/config/locales/crowdin/pl.yml
#	modules/gitlab_integration/config/locales/crowdin/pt-BR.yml
#	modules/gitlab_integration/config/locales/crowdin/pt-PT.yml
#	modules/gitlab_integration/config/locales/crowdin/ro.yml
#	modules/gitlab_integration/config/locales/crowdin/ru.yml
#	modules/gitlab_integration/config/locales/crowdin/rw.yml
#	modules/gitlab_integration/config/locales/crowdin/si.yml
#	modules/gitlab_integration/config/locales/crowdin/sk.yml
#	modules/gitlab_integration/config/locales/crowdin/sl.yml
#	modules/gitlab_integration/config/locales/crowdin/sr.yml
#	modules/gitlab_integration/config/locales/crowdin/sv.yml
#	modules/gitlab_integration/config/locales/crowdin/th.yml
#	modules/gitlab_integration/config/locales/crowdin/tr.yml
#	modules/gitlab_integration/config/locales/crowdin/uk.yml
#	modules/gitlab_integration/config/locales/crowdin/uz.yml
#	modules/gitlab_integration/config/locales/crowdin/vi.yml
#	modules/gitlab_integration/config/locales/crowdin/zh-CN.yml
#	modules/gitlab_integration/config/locales/crowdin/zh-TW.yml
#	modules/ldap_groups/config/locales/crowdin/af.yml
#	modules/ldap_groups/config/locales/crowdin/ar.yml
#	modules/ldap_groups/config/locales/crowdin/az.yml
#	modules/ldap_groups/config/locales/crowdin/be.yml
#	modules/ldap_groups/config/locales/crowdin/bg.yml
#	modules/ldap_groups/config/locales/crowdin/ca.yml
#	modules/ldap_groups/config/locales/crowdin/ckb-IR.yml
#	modules/ldap_groups/config/locales/crowdin/cs.yml
#	modules/ldap_groups/config/locales/crowdin/da.yml
#	modules/ldap_groups/config/locales/crowdin/de.yml
#	modules/ldap_groups/config/locales/crowdin/el.yml
#	modules/ldap_groups/config/locales/crowdin/eo.yml
#	modules/ldap_groups/config/locales/crowdin/es.yml
#	modules/ldap_groups/config/locales/crowdin/et.yml
#	modules/ldap_groups/config/locales/crowdin/eu.yml
#	modules/ldap_groups/config/locales/crowdin/fa.yml
#	modules/ldap_groups/config/locales/crowdin/fi.yml
#	modules/ldap_groups/config/locales/crowdin/fil.yml
#	modules/ldap_groups/config/locales/crowdin/fr.yml
#	modules/ldap_groups/config/locales/crowdin/he.yml
#	modules/ldap_groups/config/locales/crowdin/hi.yml
#	modules/ldap_groups/config/locales/crowdin/hr.yml
#	modules/ldap_groups/config/locales/crowdin/hu.yml
#	modules/ldap_groups/config/locales/crowdin/id.yml
#	modules/ldap_groups/config/locales/crowdin/it.yml
#	modules/ldap_groups/config/locales/crowdin/ja.yml
#	modules/ldap_groups/config/locales/crowdin/ka.yml
#	modules/ldap_groups/config/locales/crowdin/kk.yml
#	modules/ldap_groups/config/locales/crowdin/ko.yml
#	modules/ldap_groups/config/locales/crowdin/lt.yml
#	modules/ldap_groups/config/locales/crowdin/lv.yml
#	modules/ldap_groups/config/locales/crowdin/mn.yml
#	modules/ldap_groups/config/locales/crowdin/ms.yml
#	modules/ldap_groups/config/locales/crowdin/ne.yml
#	modules/ldap_groups/config/locales/crowdin/nl.yml
#	modules/ldap_groups/config/locales/crowdin/no.yml
#	modules/ldap_groups/config/locales/crowdin/pl.yml
#	modules/ldap_groups/config/locales/crowdin/pt-BR.yml
#	modules/ldap_groups/config/locales/crowdin/pt-PT.yml
#	modules/ldap_groups/config/locales/crowdin/ro.yml
#	modules/ldap_groups/config/locales/crowdin/ru.yml
#	modules/ldap_groups/config/locales/crowdin/rw.yml
#	modules/ldap_groups/config/locales/crowdin/si.yml
#	modules/ldap_groups/config/locales/crowdin/sk.yml
#	modules/ldap_groups/config/locales/crowdin/sl.yml
#	modules/ldap_groups/config/locales/crowdin/sr.yml
#	modules/ldap_groups/config/locales/crowdin/sv.yml
#	modules/ldap_groups/config/locales/crowdin/th.yml
#	modules/ldap_groups/config/locales/crowdin/tr.yml
#	modules/ldap_groups/config/locales/crowdin/uk.yml
#	modules/ldap_groups/config/locales/crowdin/uz.yml
#	modules/ldap_groups/config/locales/crowdin/vi.yml
#	modules/ldap_groups/config/locales/crowdin/zh-CN.yml
#	modules/ldap_groups/config/locales/crowdin/zh-TW.yml
#	modules/meeting/config/locales/crowdin/af.yml
#	modules/meeting/config/locales/crowdin/ar.yml
#	modules/meeting/config/locales/crowdin/az.yml
#	modules/meeting/config/locales/crowdin/be.yml
#	modules/meeting/config/locales/crowdin/bg.yml
#	modules/meeting/config/locales/crowdin/ca.yml
#	modules/meeting/config/locales/crowdin/ckb-IR.yml
#	modules/meeting/config/locales/crowdin/cs.yml
#	modules/meeting/config/locales/crowdin/da.yml
#	modules/meeting/config/locales/crowdin/de.yml
#	modules/meeting/config/locales/crowdin/el.yml
#	modules/meeting/config/locales/crowdin/eo.yml
#	modules/meeting/config/locales/crowdin/es.yml
#	modules/meeting/config/locales/crowdin/et.yml
#	modules/meeting/config/locales/crowdin/eu.yml
#	modules/meeting/config/locales/crowdin/fa.yml
#	modules/meeting/config/locales/crowdin/fi.yml
#	modules/meeting/config/locales/crowdin/fil.yml
#	modules/meeting/config/locales/crowdin/fr.yml
#	modules/meeting/config/locales/crowdin/he.yml
#	modules/meeting/config/locales/crowdin/hi.yml
#	modules/meeting/config/locales/crowdin/hr.yml
#	modules/meeting/config/locales/crowdin/hu.yml
#	modules/meeting/config/locales/crowdin/id.yml
#	modules/meeting/config/locales/crowdin/it.yml
#	modules/meeting/config/locales/crowdin/ja.yml
#	modules/meeting/config/locales/crowdin/ka.yml
#	modules/meeting/config/locales/crowdin/kk.yml
#	modules/meeting/config/locales/crowdin/ko.yml
#	modules/meeting/config/locales/crowdin/lt.yml
#	modules/meeting/config/locales/crowdin/lv.yml
#	modules/meeting/config/locales/crowdin/mn.yml
#	modules/meeting/config/locales/crowdin/ms.yml
#	modules/meeting/config/locales/crowdin/ne.yml
#	modules/meeting/config/locales/crowdin/nl.yml
#	modules/meeting/config/locales/crowdin/no.yml
#	modules/meeting/config/locales/crowdin/pl.yml
#	modules/meeting/config/locales/crowdin/pt-BR.yml
#	modules/meeting/config/locales/crowdin/pt-PT.yml
#	modules/meeting/config/locales/crowdin/ro.yml
#	modules/meeting/config/locales/crowdin/ru.yml
#	modules/meeting/config/locales/crowdin/rw.yml
#	modules/meeting/config/locales/crowdin/si.yml
#	modules/meeting/config/locales/crowdin/sk.yml
#	modules/meeting/config/locales/crowdin/sl.yml
#	modules/meeting/config/locales/crowdin/sr.yml
#	modules/meeting/config/locales/crowdin/sv.yml
#	modules/meeting/config/locales/crowdin/th.yml
#	modules/meeting/config/locales/crowdin/tr.yml
#	modules/meeting/config/locales/crowdin/uk.yml
#	modules/meeting/config/locales/crowdin/uz.yml
#	modules/meeting/config/locales/crowdin/vi.yml
#	modules/meeting/config/locales/crowdin/zh-CN.yml
#	modules/meeting/config/locales/crowdin/zh-TW.yml
#	modules/openid_connect/config/locales/crowdin/af.yml
#	modules/openid_connect/config/locales/crowdin/ar.yml
#	modules/openid_connect/config/locales/crowdin/az.yml
#	modules/openid_connect/config/locales/crowdin/be.yml
#	modules/openid_connect/config/locales/crowdin/bg.yml
#	modules/openid_connect/config/locales/crowdin/ca.yml
#	modules/openid_connect/config/locales/crowdin/ckb-IR.yml
#	modules/openid_connect/config/locales/crowdin/cs.yml
#	modules/openid_connect/config/locales/crowdin/da.yml
#	modules/openid_connect/config/locales/crowdin/de.yml
#	modules/openid_connect/config/locales/crowdin/el.yml
#	modules/openid_connect/config/locales/crowdin/eo.yml
#	modules/openid_connect/config/locales/crowdin/es.yml
#	modules/openid_connect/config/locales/crowdin/et.yml
#	modules/openid_connect/config/locales/crowdin/eu.yml
#	modules/openid_connect/config/locales/crowdin/fa.yml
#	modules/openid_connect/config/locales/crowdin/fi.yml
#	modules/openid_connect/config/locales/crowdin/fil.yml
#	modules/openid_connect/config/locales/crowdin/fr.yml
#	modules/openid_connect/config/locales/crowdin/he.yml
#	modules/openid_connect/config/locales/crowdin/hi.yml
#	modules/openid_connect/config/locales/crowdin/hr.yml
#	modules/openid_connect/config/locales/crowdin/hu.yml
#	modules/openid_connect/config/locales/crowdin/id.yml
#	modules/openid_connect/config/locales/crowdin/it.yml
#	modules/openid_connect/config/locales/crowdin/ja.yml
#	modules/openid_connect/config/locales/crowdin/ka.yml
#	modules/openid_connect/config/locales/crowdin/kk.yml
#	modules/openid_connect/config/locales/crowdin/ko.yml
#	modules/openid_connect/config/locales/crowdin/lt.yml
#	modules/openid_connect/config/locales/crowdin/lv.yml
#	modules/openid_connect/config/locales/crowdin/mn.yml
#	modules/openid_connect/config/locales/crowdin/ms.yml
#	modules/openid_connect/config/locales/crowdin/ne.yml
#	modules/openid_connect/config/locales/crowdin/nl.yml
#	modules/openid_connect/config/locales/crowdin/no.yml
#	modules/openid_connect/config/locales/crowdin/pl.yml
#	modules/openid_connect/config/locales/crowdin/pt-BR.yml
#	modules/openid_connect/config/locales/crowdin/pt-PT.yml
#	modules/openid_connect/config/locales/crowdin/ro.yml
#	modules/openid_connect/config/locales/crowdin/ru.yml
#	modules/openid_connect/config/locales/crowdin/rw.yml
#	modules/openid_connect/config/locales/crowdin/si.yml
#	modules/openid_connect/config/locales/crowdin/sk.yml
#	modules/openid_connect/config/locales/crowdin/sl.yml
#	modules/openid_connect/config/locales/crowdin/sr.yml
#	modules/openid_connect/config/locales/crowdin/sv.yml
#	modules/openid_connect/config/locales/crowdin/th.yml
#	modules/openid_connect/config/locales/crowdin/tr.yml
#	modules/openid_connect/config/locales/crowdin/uk.yml
#	modules/openid_connect/config/locales/crowdin/uz.yml
#	modules/openid_connect/config/locales/crowdin/vi.yml
#	modules/openid_connect/config/locales/crowdin/zh-CN.yml
#	modules/openid_connect/config/locales/crowdin/zh-TW.yml
#	modules/reporting/config/locales/crowdin/ro.yml
#	modules/reporting/config/locales/crowdin/vi.yml
#	modules/reporting/config/locales/crowdin/zh-TW.yml
#	modules/storages/config/locales/crowdin/ja.yml
#	modules/storages/config/locales/crowdin/js-ja.yml
#	modules/team_planner/config/locales/crowdin/js-fr.yml
#	modules/two_factor_authentication/config/locales/crowdin/af.yml
#	modules/two_factor_authentication/config/locales/crowdin/ar.yml
#	modules/two_factor_authentication/config/locales/crowdin/az.yml
#	modules/two_factor_authentication/config/locales/crowdin/be.yml
#	modules/two_factor_authentication/config/locales/crowdin/bg.yml
#	modules/two_factor_authentication/config/locales/crowdin/ca.yml
#	modules/two_factor_authentication/config/locales/crowdin/ckb-IR.yml
#	modules/two_factor_authentication/config/locales/crowdin/cs.yml
#	modules/two_factor_authentication/config/locales/crowdin/da.yml
#	modules/two_factor_authentication/config/locales/crowdin/de.yml
#	modules/two_factor_authentication/config/locales/crowdin/el.yml
#	modules/two_factor_authentication/config/locales/crowdin/eo.yml
#	modules/two_factor_authentication/config/locales/crowdin/es.yml
#	modules/two_factor_authentication/config/locales/crowdin/et.yml
#	modules/two_factor_authentication/config/locales/crowdin/eu.yml
#	modules/two_factor_authentication/config/locales/crowdin/fa.yml
#	modules/two_factor_authentication/config/locales/crowdin/fi.yml
#	modules/two_factor_authentication/config/locales/crowdin/fil.yml
#	modules/two_factor_authentication/config/locales/crowdin/fr.yml
#	modules/two_factor_authentication/config/locales/crowdin/he.yml
#	modules/two_factor_authentication/config/locales/crowdin/hi.yml
#	modules/two_factor_authentication/config/locales/crowdin/hr.yml
#	modules/two_factor_authentication/config/locales/crowdin/hu.yml
#	modules/two_factor_authentication/config/locales/crowdin/id.yml
#	modules/two_factor_authentication/config/locales/crowdin/it.yml
#	modules/two_factor_authentication/config/locales/crowdin/ja.yml
#	modules/two_factor_authentication/config/locales/crowdin/ka.yml
#	modules/two_factor_authentication/config/locales/crowdin/kk.yml
#	modules/two_factor_authentication/config/locales/crowdin/ko.yml
#	modules/two_factor_authentication/config/locales/crowdin/lt.yml
#	modules/two_factor_authentication/config/locales/crowdin/lv.yml
#	modules/two_factor_authentication/config/locales/crowdin/mn.yml
#	modules/two_factor_authentication/config/locales/crowdin/ms.yml
#	modules/two_factor_authentication/config/locales/crowdin/ne.yml
#	modules/two_factor_authentication/config/locales/crowdin/nl.yml
#	modules/two_factor_authentication/config/locales/crowdin/no.yml
#	modules/two_factor_authentication/config/locales/crowdin/pl.yml
#	modules/two_factor_authentication/config/locales/crowdin/pt-BR.yml
#	modules/two_factor_authentication/config/locales/crowdin/pt-PT.yml
#	modules/two_factor_authentication/config/locales/crowdin/ro.yml
#	modules/two_factor_authentication/config/locales/crowdin/ru.yml
#	modules/two_factor_authentication/config/locales/crowdin/rw.yml
#	modules/two_factor_authentication/config/locales/crowdin/si.yml
#	modules/two_factor_authentication/config/locales/crowdin/sk.yml
#	modules/two_factor_authentication/config/locales/crowdin/sl.yml
#	modules/two_factor_authentication/config/locales/crowdin/sr.yml
#	modules/two_factor_authentication/config/locales/crowdin/sv.yml
#	modules/two_factor_authentication/config/locales/crowdin/th.yml
#	modules/two_factor_authentication/config/locales/crowdin/tr.yml
#	modules/two_factor_authentication/config/locales/crowdin/uk.yml
#	modules/two_factor_authentication/config/locales/crowdin/uz.yml
#	modules/two_factor_authentication/config/locales/crowdin/vi.yml
#	modules/two_factor_authentication/config/locales/crowdin/zh-CN.yml
#	modules/two_factor_authentication/config/locales/crowdin/zh-TW.yml
#	modules/wikis/config/locales/crowdin/af.yml
#	modules/wikis/config/locales/crowdin/ar.yml
#	modules/wikis/config/locales/crowdin/az.yml
#	modules/wikis/config/locales/crowdin/be.yml
#	modules/wikis/config/locales/crowdin/bg.yml
#	modules/wikis/config/locales/crowdin/ca.yml
#	modules/wikis/config/locales/crowdin/ckb-IR.yml
#	modules/wikis/config/locales/crowdin/cs.yml
#	modules/wikis/config/locales/crowdin/da.yml
#	modules/wikis/config/locales/crowdin/de.yml
#	modules/wikis/config/locales/crowdin/el.yml
#	modules/wikis/config/locales/crowdin/eo.yml
#	modules/wikis/config/locales/crowdin/es.yml
#	modules/wikis/config/locales/crowdin/et.yml
#	modules/wikis/config/locales/crowdin/eu.yml
#	modules/wikis/config/locales/crowdin/fa.yml
#	modules/wikis/config/locales/crowdin/fi.yml
#	modules/wikis/config/locales/crowdin/fil.yml
#	modules/wikis/config/locales/crowdin/fr.yml
#	modules/wikis/config/locales/crowdin/he.yml
#	modules/wikis/config/locales/crowdin/hi.yml
#	modules/wikis/config/locales/crowdin/hr.yml
#	modules/wikis/config/locales/crowdin/hu.yml
#	modules/wikis/config/locales/crowdin/id.yml
#	modules/wikis/config/locales/crowdin/it.yml
#	modules/wikis/config/locales/crowdin/ja.yml
#	modules/wikis/config/locales/crowdin/ka.yml
#	modules/wikis/config/locales/crowdin/kk.yml
#	modules/wikis/config/locales/crowdin/ko.yml
#	modules/wikis/config/locales/crowdin/lt.yml
#	modules/wikis/config/locales/crowdin/lv.yml
#	modules/wikis/config/locales/crowdin/mn.yml
#	modules/wikis/config/locales/crowdin/ms.yml
#	modules/wikis/config/locales/crowdin/ne.yml
#	modules/wikis/config/locales/crowdin/nl.yml
#	modules/wikis/config/locales/crowdin/no.yml
#	modules/wikis/config/locales/crowdin/pl.yml
#	modules/wikis/config/locales/crowdin/pt-BR.yml
#	modules/wikis/config/locales/crowdin/pt-PT.yml
#	modules/wikis/config/locales/crowdin/ro.yml
#	modules/wikis/config/locales/crowdin/ru.yml
#	modules/wikis/config/locales/crowdin/rw.yml
#	modules/wikis/config/locales/crowdin/si.yml
#	modules/wikis/config/locales/crowdin/sk.yml
#	modules/wikis/config/locales/crowdin/sl.yml
#	modules/wikis/config/locales/crowdin/sr.yml
#	modules/wikis/config/locales/crowdin/sv.yml
#	modules/wikis/config/locales/crowdin/th.yml
#	modules/wikis/config/locales/crowdin/tr.yml
#	modules/wikis/config/locales/crowdin/uk.yml
#	modules/wikis/config/locales/crowdin/uz.yml
#	modules/wikis/config/locales/crowdin/vi.yml
#	modules/wikis/config/locales/crowdin/zh-CN.yml
#	modules/wikis/config/locales/crowdin/zh-TW.yml
2026-04-11 13:33:28 +02:00
Oliver Günther 5041176e9e Fix stale element in my_page_spec
Stale element reference during drag-and-drop. CDK drag restructures
the DOM between the click_and_hold and release phases,
invalidating the drop_area.native Selenium reference held from before the drag started.
2026-04-08 09:51:41 +02:00
Ivan Kuchin 8deb557630 wait after selecting work package type 2026-04-07 20:23:43 +02:00
Ivan Kuchin 6f512af3bb wait more time for relations tab to load 2026-04-07 20:23:39 +02:00
Alexander Brandon Coles ac3c717307 Fix zoneless CI failures 2026-04-06 14:21:44 +01:00
Henriette Darge d8a5399ea8 Attempt to stabilise test by assuring that the turbo frame finished loading before clicking the field 2026-03-25 13:59:32 +01:00
Henriette Darge adb88c979b Some more test fixing.. There is light and the end of the tunnel :fingers_crossed: 2026-03-19 15:10:27 +01:00
Henriette Darge ee83264379 Continue the endless journey of adapting the tests to the new inplaceEditFields. 2026-03-18 14:03:52 +01:00
Henriette Darge a445cc196c * Take care that newly created CF are also correctly registered
* Introduce spec helper for inplace edit fields
* Preserve system_arguments for calculated fields when they are updated
2026-03-17 15:13:21 +01:00
Christophe Bliard b8b84bdd94 Make some meetings features specs faster
The "Filters" toggle is clicked regardless of whether the filters are
already open or not.

When already open, the toggle is clicked and the filters are closed.
This causes the method to wait 3 secs for the filters to be opened,
fail, and be retried and work, leading to 3 secs of extra wait time.

Now it exits early if the filters are already open => faster specs.
2026-03-11 12:14:34 +01:00
Ivan Kuchin e13e4cd006 test readonly custom field modal from project overview 2026-03-05 17:39:00 +01:00
Ivan Kuchin 5a89078072 extract DialogComponent for shared behaviour between Edit and Show dialogs 2026-02-25 16:00:30 +01:00
Henriette Darge cbeaa51970 Add comments and replace sleep timeouts 2026-02-24 10:20:08 +01:00
Behrokh Satarnejad 04aa644370 fix failures in tests 2026-02-17 08:42:47 +01:00
Klaus Zanders af691683fa Merge branch 'dev' into merge-release/17.0-20260127110839 2026-01-27 13:18:18 +01:00
Christophe Bliard b1d3c14fb0 Fix flaky spec in progress_modal_spec
failing spec: spec/features/work_packages/progress_modal_spec.rb:195
failing run: https://github.com/opf/openproject/actions/runs/21204407008/job/60997306384

In the spec, another page is visited during the test, meaning the
internal ids of the capybara elements may not be the same as the ones
before the page is reloaded. This is a problem because the
`progress_popover` caches the container element, and it's not valid
anymore (it's stale).

One fix could be to create a new `progress_popover` instance after the other page is visited.

I found it better to be able to pass a lambda for the container element
to the `progress_popover` constructor, so that it always gets it afresh
and will never be stale.
2026-01-27 10:04:57 +01:00
Christophe Bliard 41d34f2563 Simpler fix than 84bbf8d
84bbf8d fixed the flaky spec
`spec/features/projects/life_cycle/overview_page/dialog/update_spec.rb:266`.
It was flaky because it was testing if a date in the date picker is
disabled, but this date could be in the previous month and thus not
visible.

The implemented fix in 84bbf8d was to show the date before testing it
right in the `expect_xxx` methods.

The problem is that it breaks the query/command segregation principle.

Better move the calendar to the correct date before doing assertions on
the dates being visible, so the `expect_xxx` methods actually do also
check that the date is visible, which is desired in some test scenarios.
2026-01-26 18:31:59 +01:00
Christophe Bliard 7c72f0c3a5 Fix slow tests when checking date visible in date picker
941096114c introduced `Components::Datepicker#displays_date?(date)` to
check if a date is visible in the date picker before doing some
assertions on it. Then 84bbf8d549 doubled down on it by calling it
inside each `#expect_non_working(date)`, `#expect_working(date)`,
`#expect_disabled(date)`, `#expect_not_disabled(date)` methods.

The problem is that `#displays_date?(date)` uses `has_css?` so it
returns immediately if the check is positive, but waits for 3 seconds
for the date to become visible if it's not yet. It's missing a `wait:
0`. And the css selector is wrong to: it searches for
`.flatpickr-day.flatpickr-disabled` instead of `.flatpickr-day`, so it
was returning false when the date was visible and enabled.

This commit fixes the problem by:
- Adding `wait: 0` to `has_css?`
- Changing the css selector to `.flatpickr-day`
- Add some `#expect_visible` calls to be sure the date picker is visible
  before doing assertions with `wait: 0`

And same for `#has_previous_month_toggle?`: it missed a `wait: 0` for
the same reasons.

This makes for instance the 2 specs in
`spec/features/work_packages/datepicker/datepicker_follows_relation_spec.rb:84`
run in 11 seconds instead of 1 minute 27 seconds.
2026-01-26 18:29:32 +01:00