From 7c72f0c3a5189a10fb444e22da9e9b2700ed2b85 Mon Sep 17 00:00:00 2001 From: Christophe Bliard Date: Mon, 26 Jan 2026 18:16:12 +0100 Subject: [PATCH 01/14] Fix slow tests when checking date visible in date picker 941096114cb introduced `Components::Datepicker#displays_date?(date)` to check if a date is visible in the date picker before doing some assertions on it. Then 84bbf8d5495 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. --- spec/support/components/datepicker/datepicker.rb | 7 +++++-- spec/support/shared/ferrum_patches.rb | 2 +- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/spec/support/components/datepicker/datepicker.rb b/spec/support/components/datepicker/datepicker.rb index 960f6e7ee3f..b1acf1fc54f 100644 --- a/spec/support/components/datepicker/datepicker.rb +++ b/spec/support/components/datepicker/datepicker.rb @@ -5,6 +5,7 @@ module Components include Capybara::DSL include Capybara::RSpecMatchers include RSpec::Matchers + attr_reader :context_selector ## @@ -211,12 +212,14 @@ module Components end def displays_date?(date) + expect_visible label = date.strftime("%B %-d, %Y") - page.has_css?(".flatpickr-day.flatpickr-disabled[aria-label='#{label}']") + page.has_css?(".flatpickr-day[aria-label='#{label}']", wait: 0) end def has_previous_month_toggle? - page.has_css?(".flatpickr-prev-month") + expect_visible + page.has_css?(".flatpickr-prev-month", wait: 0) end def ensure_date_is_displayed(date) diff --git a/spec/support/shared/ferrum_patches.rb b/spec/support/shared/ferrum_patches.rb index a654785ab3b..b0a81063ecc 100644 --- a/spec/support/shared/ferrum_patches.rb +++ b/spec/support/shared/ferrum_patches.rb @@ -52,7 +52,7 @@ module Ferrum main_frame_id = @traffic.first&.request&.frame_id current_navigation = @traffic.reverse.find { |conn| conn.navigation_request?(main_frame_id) } current_traffic = @traffic.filter do |exchange| - next unless exchange.request + next unless exchange.request && current_navigation exchange.request.loader_id == current_navigation.request.loader_id end From 41d34f25635c60a1e5f116a1edb75db1113cfb61 Mon Sep 17 00:00:00 2001 From: Christophe Bliard Date: Mon, 26 Jan 2026 18:31:59 +0100 Subject: [PATCH 02/14] 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. --- .../life_cycle/overview_page/dialog/update_spec.rb | 2 ++ spec/support/components/datepicker/datepicker.rb | 9 --------- 2 files changed, 2 insertions(+), 9 deletions(-) diff --git a/spec/features/projects/life_cycle/overview_page/dialog/update_spec.rb b/spec/features/projects/life_cycle/overview_page/dialog/update_spec.rb index d48db9e06c5..8024adb7584 100644 --- a/spec/features/projects/life_cycle/overview_page/dialog/update_spec.rb +++ b/spec/features/projects/life_cycle/overview_page/dialog/update_spec.rb @@ -281,6 +281,7 @@ RSpec.describe "Edit project phases on project overview page", :js do # The earliest enabled date should be after initiating date's finish date initiating_finish_date_succesor = initiating_finish_date + 1.day + datepicker.show_date(initiating_finish_date) datepicker.expect_not_disabled(initiating_finish_date) datepicker.expect_not_disabled(initiating_finish_date_succesor) @@ -300,6 +301,7 @@ RSpec.describe "Edit project phases on project overview page", :js do dialog.expect_input("Finish date", value: "") dialog.expect_input("Duration", value: "", disabled: true) + datepicker.show_date(initiating_finish_date) datepicker.expect_disabled(initiating_finish_date) datepicker.expect_not_disabled(initiating_finish_date_succesor) diff --git a/spec/support/components/datepicker/datepicker.rb b/spec/support/components/datepicker/datepicker.rb index b1acf1fc54f..bf28493b7c3 100644 --- a/spec/support/components/datepicker/datepicker.rb +++ b/spec/support/components/datepicker/datepicker.rb @@ -181,7 +181,6 @@ module Components ## # Expect the given date to be visible and a non-working day def expect_non_working(date) - ensure_date_is_displayed(date) unless displays_date?(date) label = date.strftime("%B %-d, %Y") expect(page).to have_css(".flatpickr-day.flatpickr-non-working-day[aria-label='#{label}']") end @@ -189,7 +188,6 @@ module Components ## # Expect the given date to be visible and a working day def expect_working(date) - ensure_date_is_displayed(date) unless displays_date?(date) label = date.strftime("%B %-d, %Y") expect(page).to have_css(".flatpickr-day:not(.flatpickr-non-working-day)[aria-label='#{label}']") end @@ -197,7 +195,6 @@ module Components ## # Expect the given date to be visible and disabled def expect_disabled(date) - ensure_date_is_displayed(date) unless displays_date?(date) label = date.strftime("%B %-d, %Y") expect(page).to have_css(".flatpickr-day.flatpickr-disabled[aria-label='#{label}']," \ ".flatpickr-day.flatpickr-non-working-day[aria-label='#{label}']") @@ -206,7 +203,6 @@ module Components ## # Expect the given date to be visible and enabled def expect_not_disabled(date) - ensure_date_is_displayed(date) unless displays_date?(date) label = date.strftime("%B %-d, %Y") expect(page).to have_css(".flatpickr-day:not(.flatpickr-disabled):not(.flatpickr-non-working-day)[aria-label='#{label}']") end @@ -222,11 +218,6 @@ module Components page.has_css?(".flatpickr-prev-month", wait: 0) end - def ensure_date_is_displayed(date) - select_year(date.year) - select_month(date.month) - end - protected def save_button_label From 3082b6f5578de3c8343ce6fc690305893fc3a312 Mon Sep 17 00:00:00 2001 From: Maya Berdygylyjova Date: Tue, 27 Jan 2026 09:59:54 +0100 Subject: [PATCH 03/14] add-note-to-templates-docs (#21782) * add-note-to-templates-docs * Update README.md --- docs/user-guide/projects/project-templates/README.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/docs/user-guide/projects/project-templates/README.md b/docs/user-guide/projects/project-templates/README.md index f86c2def228..57f7346cc26 100644 --- a/docs/user-guide/projects/project-templates/README.md +++ b/docs/user-guide/projects/project-templates/README.md @@ -15,14 +15,16 @@ You can create a project template in OpenProject by [creating a new project](../ Configure everything you want included in future projects: - Add project members -- Select the necessary modules +- Select and populate the necessary modules +> [!IMPORTANT] +> Settings and data from the *Budgets* and *Time and costs* modules is not included when copying a template. For this reason, these modules should not be configured in templates, as any projects created from them will not contain the corresponding data. + - Set up the default project structure in the Gantt chart - Create work package templates Navigate to the [project settings](../project-settings), click the **More (three dots)** icon in the upper right corner and select **Set as template** from the dropdown menu. You can later remove the project from the template list at the same location. > [!NOTE] -> > Only administrators can set or remove projects as templates ![Icon to set a project as a template under project settings in OpenProject](openproject_userguide_projects_project_template.png) From b1d3c14fb0230e3870164c1c4caa4b29ea4b1b2d Mon Sep 17 00:00:00 2001 From: Christophe Bliard Date: Thu, 22 Jan 2026 15:30:43 +0100 Subject: [PATCH 04/14] 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. --- .../components/work_packages/progress_popover.rb | 13 +++++++++++-- .../pages/work_packages/work_packages_table.rb | 2 +- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/spec/support/components/work_packages/progress_popover.rb b/spec/support/components/work_packages/progress_popover.rb index c1cbe42cfc7..dea19ab376a 100644 --- a/spec/support/components/work_packages/progress_popover.rb +++ b/spec/support/components/work_packages/progress_popover.rb @@ -36,6 +36,7 @@ module Components include Capybara::DSL include Capybara::RSpecMatchers include RSpec::Matchers + # include Toasts::Expectations JS_FIELD_NAME_MAP = { @@ -58,13 +59,21 @@ module Components work: :estimated_hours }.freeze - attr_reader :container, :create_form + attr_reader :create_form def initialize(container: page, create_form: false) - @container = container + @container_or_lambda_to_get_container = container @create_form = create_form end + def container + if @container_or_lambda_to_get_container.respond_to?(:call) + @container_or_lambda_to_get_container.call + else + @container_or_lambda_to_get_container + end + end + def open open_by_clicking_on_field(:work) end diff --git a/spec/support/pages/work_packages/work_packages_table.rb b/spec/support/pages/work_packages/work_packages_table.rb index dce769771b8..6bb651a68d1 100644 --- a/spec/support/pages/work_packages/work_packages_table.rb +++ b/spec/support/pages/work_packages/work_packages_table.rb @@ -369,7 +369,7 @@ module Pages end def progress_popover(work_package) - Components::WorkPackages::ProgressPopover.new(container: work_package_container(work_package)) + Components::WorkPackages::ProgressPopover.new(container: -> { work_package_container(work_package) }) end def expect_no_column_add_option(column_name) From 80eb67fbc120ced88d53187eb7ad650dd36ec59a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oliver=20G=C3=BCnther?= Date: Tue, 27 Jan 2026 10:45:03 +0100 Subject: [PATCH 05/14] Add release notes 16.6.6 --- docs/release-notes/16-6-6/README.md | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 docs/release-notes/16-6-6/README.md diff --git a/docs/release-notes/16-6-6/README.md b/docs/release-notes/16-6-6/README.md new file mode 100644 index 00000000000..c1bca83d933 --- /dev/null +++ b/docs/release-notes/16-6-6/README.md @@ -0,0 +1,27 @@ +--- +title: OpenProject 16.6.6 +sidebar_navigation: + title: 16.6.6 +release_version: 16.6.6 +release_date: 2026-01-27 +--- + +# OpenProject 16.6.6 + +Release date: 2026-01-27 + +We released OpenProject [OpenProject 16.6.6](https://community.openproject.org/versions/2261). +The release contains security related bug fixes and we strongly urge you to update to the newest version. +Below you will find a complete list of all changes and bug fixes. + + + +## Bug fixes and changes + + + + +- Bugfix: Fix revision parsing in git diff output \[[#71019](https://community.openproject.org/wp/71019)\] + + + From 7e72b62d9c3621be58b4c1520fe767db9e82aeac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oliver=20G=C3=BCnther?= Date: Tue, 27 Jan 2026 10:46:19 +0100 Subject: [PATCH 06/14] Add release notes for 17.0.2 --- docs/release-notes/17-0-2/README.md | 36 +++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 docs/release-notes/17-0-2/README.md diff --git a/docs/release-notes/17-0-2/README.md b/docs/release-notes/17-0-2/README.md new file mode 100644 index 00000000000..3e7769105cb --- /dev/null +++ b/docs/release-notes/17-0-2/README.md @@ -0,0 +1,36 @@ +--- +title: OpenProject 17.0.2 +sidebar_navigation: + title: 17.0.2 +release_version: 17.0.2 +release_date: 2026-01-27 +--- + +# OpenProject 17.0.2 + +Release date: 2026-01-27 + +We released OpenProject [OpenProject 17.0.2](https://community.openproject.org/versions/2260). +The release contains sa security fix and several bug fixes and we strongly recommend updating to the newest version. +Below you will find a complete list of all changes and bug fixes. + + + +## Bug fixes and changes + + + + +- Bugfix: Unable to change to earlier finish date for automatically scheduled successor \[[#65130](https://community.openproject.org/wp/65130)\] +- Bugfix: Meeting outcomes cannot be saved with ctrl/cmd+enter \[[#69974](https://community.openproject.org/wp/69974)\] +- Bugfix: AXe Accessibility error: invalid list structure \[[#70573](https://community.openproject.org/wp/70573)\] +- Bugfix: Fix AXe Accessibility error: Navigation toggler must have discernible text \[[#70574](https://community.openproject.org/wp/70574)\] +- Bugfix: Documents module is missing meaningfull html title \[[#70614](https://community.openproject.org/wp/70614)\] +- Bugfix: Users with the "Manage Users" permission did not see links to Lock/Unlock users \[[#70796](https://community.openproject.org/wp/70796)\] +- Bugfix: Cannot authorise OpenProject app with OpenProject when user has 2FA enabled \[[#70966](https://community.openproject.org/wp/70966)\] +- Bugfix: Running docker slim image, runs slim-bim one \[[#70980](https://community.openproject.org/wp/70980)\] +- Bugfix: 'For all projects' project attributes are not displayed during new project creation \[[#70982](https://community.openproject.org/wp/70982)\] +- Bugfix: Fix revision parsing in git diff output \[[#71020](https://community.openproject.org/wp/71020)\] + + + From 23b7462231fb98730b7752a26f347bbf5d7f0982 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oliver=20G=C3=BCnther?= Date: Tue, 27 Jan 2026 10:47:17 +0100 Subject: [PATCH 07/14] Add release-notes file --- docs/release-notes/README.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/docs/release-notes/README.md b/docs/release-notes/README.md index d41d47fdb3f..29e5fc094b8 100644 --- a/docs/release-notes/README.md +++ b/docs/release-notes/README.md @@ -13,6 +13,13 @@ Stay up to date and get an overview of the new features included in the releases +## 16.6.6 + +Release date: 2026-01-27 + +[Release Notes](16-6-6/) + + ## 16.6.5 Release date: 2026-01-16 From d7ccf697e0947eac2f74e7d1fa4c90e54f8900bf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oliver=20G=C3=BCnther?= Date: Tue, 27 Jan 2026 10:47:17 +0100 Subject: [PATCH 08/14] Update publiccode.yml --- publiccode.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/publiccode.yml b/publiccode.yml index af2a7a05aeb..341e6a91807 100644 --- a/publiccode.yml +++ b/publiccode.yml @@ -7,8 +7,8 @@ name: OpenProject applicationSuite: openDesk url: 'https://github.com/opf/openproject' roadmap: 'https://www.openproject.org/roadmap' -releaseDate: '2026-01-16' -softwareVersion: '16.6.5' +releaseDate: '2026-01-27' +softwareVersion: '16.6.6' developmentStatus: stable softwareType: standalone/web logo: 'publiccode_logo.svg' From 74ad9d5b771922324a0851a3e544536ee2c0da38 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oliver=20G=C3=BCnther?= Date: Tue, 27 Jan 2026 10:47:19 +0100 Subject: [PATCH 09/14] Bumped version to 16.6.7 [ci skip] --- lib/open_project/version.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/open_project/version.rb b/lib/open_project/version.rb index 5984c773a46..9f871306b2f 100644 --- a/lib/open_project/version.rb +++ b/lib/open_project/version.rb @@ -33,7 +33,7 @@ module OpenProject module VERSION # :nodoc: MAJOR = 16 MINOR = 6 - PATCH = 6 + PATCH = 7 class << self # Used by semver to define the special version (if any). From ef54b13a9c3d7503021a05169dafdd2594266ced Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oliver=20G=C3=BCnther?= Date: Tue, 27 Jan 2026 10:58:15 +0100 Subject: [PATCH 10/14] Add release-notes file --- docs/release-notes/README.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/docs/release-notes/README.md b/docs/release-notes/README.md index 7aaf31e0282..6b3b511f83f 100644 --- a/docs/release-notes/README.md +++ b/docs/release-notes/README.md @@ -13,6 +13,13 @@ Stay up to date and get an overview of the new features included in the releases +## 17.0.2 + +Release date: 2026-01-27 + +[Release Notes](17-0-2/) + + ## 17.0.1 Release date: 2026-01-16 From 72e93b19215663b6f591da3c6f3ce9b2c240fca7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oliver=20G=C3=BCnther?= Date: Tue, 27 Jan 2026 10:58:15 +0100 Subject: [PATCH 11/14] Update publiccode.yml --- publiccode.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/publiccode.yml b/publiccode.yml index 80feec477e3..5ebff5e7710 100644 --- a/publiccode.yml +++ b/publiccode.yml @@ -7,8 +7,8 @@ name: OpenProject applicationSuite: openDesk url: 'https://github.com/opf/openproject' roadmap: 'https://www.openproject.org/roadmap' -releaseDate: '2026-01-16' -softwareVersion: '17.0.1' +releaseDate: '2026-01-27' +softwareVersion: '17.0.2' developmentStatus: stable softwareType: standalone/web logo: 'publiccode_logo.svg' From 53b01dcd7adbfc5be3325d157336e3452449df83 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oliver=20G=C3=BCnther?= Date: Tue, 27 Jan 2026 10:58:16 +0100 Subject: [PATCH 12/14] Bumped version to 17.0.3 [ci skip] --- lib/open_project/version.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/open_project/version.rb b/lib/open_project/version.rb index 5f1c18b6152..d70b4526321 100644 --- a/lib/open_project/version.rb +++ b/lib/open_project/version.rb @@ -33,7 +33,7 @@ module OpenProject module VERSION # :nodoc: MAJOR = 17 MINOR = 0 - PATCH = 2 + PATCH = 3 class << self def revision From 5ac9b499654464fe0920a347b9bb6488359efd5c Mon Sep 17 00:00:00 2001 From: as-op Date: Tue, 27 Jan 2026 12:02:34 +0100 Subject: [PATCH 13/14] fix link --- docs/user-guide/meetings/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/user-guide/meetings/README.md b/docs/user-guide/meetings/README.md index 3736dc1e950..da0618e885e 100644 --- a/docs/user-guide/meetings/README.md +++ b/docs/user-guide/meetings/README.md @@ -109,7 +109,7 @@ You will be guided through creating an iCal subscription token: 3. Add this URL to your external calendar to subscribe to your OpenProject meetings. If you are only interested in a specific meeting, you can [download that specific meeting as an iCal event] -(/one-time-meetings/#download-a-meeting-as-an-icalendar-event/) instead. +(/one-time-meetings/#download-a-meeting-as-an-icalendar-event) instead. > [!TIP] > If you are interested in how the Meetings module is used by the OpenProject team, please take a look at [this blog article](https://www.openproject.org/blog/meeting-management-example/). From b40da8074cbd63ab06e27bec259a675b8e514c62 Mon Sep 17 00:00:00 2001 From: as-op Date: Tue, 27 Jan 2026 12:03:03 +0100 Subject: [PATCH 14/14] changes by Markus in the website repository --- .../enterprise-cloud-guide/enterprise-cloud-faq/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/enterprise-guide/enterprise-cloud-guide/enterprise-cloud-faq/README.md b/docs/enterprise-guide/enterprise-cloud-guide/enterprise-cloud-faq/README.md index 054b3d0a6ac..47b3f9b80ca 100644 --- a/docs/enterprise-guide/enterprise-cloud-guide/enterprise-cloud-faq/README.md +++ b/docs/enterprise-guide/enterprise-cloud-guide/enterprise-cloud-faq/README.md @@ -133,7 +133,7 @@ Please note: For the OpenProject Enterprise cloud we currently have two SaaS inf **OpenProject.com** -This infrastructure is hosted at AWS in Dublin. For sending transactional emails we use the service Postmark which is based in the US. +This infrastructure is hosted at AWS in Frankfurt, Germany. For sending transactional emails we use the service Postmark which is based in the US. **OpenProject.eu**