From 468a75155f494718ae75a83017269923e73cf755 Mon Sep 17 00:00:00 2001 From: stephanie rousset Date: Mon, 12 May 2025 11:59:30 +0200 Subject: [PATCH 1/4] bump: module ptp to fix display of projects in map when using filters --- Gemfile.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile.lock b/Gemfile.lock index d099cb4..0d1cacf 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -46,7 +46,7 @@ GIT GIT remote: https://github.com/OpenSourcePolitics/decidim-module-ptp.git - revision: 9f02c08e6715deb3c32569ecd4ec3a4385fd2b00 + revision: 9ea26682739486ce4ca30a814747e88e57e70524 specs: decidim-budgets_booth (0.27.0) decidim-budgets (~> 0.27.0) From bd84e886c7bf71ddc82fce247069878b78635f13 Mon Sep 17 00:00:00 2001 From: stephanie rousset Date: Tue, 13 May 2025 15:29:43 +0200 Subject: [PATCH 2/4] fix: keep order of projects in porjects method --- app/controllers/decidim/budgets/projects_controller.rb | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/app/controllers/decidim/budgets/projects_controller.rb b/app/controllers/decidim/budgets/projects_controller.rb index 3d4ff29..69e90d1 100644 --- a/app/controllers/decidim/budgets/projects_controller.rb +++ b/app/controllers/decidim/budgets/projects_controller.rb @@ -29,7 +29,14 @@ def projects return @projects if @projects @projects = reorder(search.result) - @projects = @projects.page(params[:page]).per(current_component.settings.projects_per_page) + ids = @projects.pluck(:id) + + # keep the order so that when we use filters and pagination, projects are always + # displayed in the same order on the pages + @projects = Decidim::Budgets::Project.where(id: ids) + .order(Arel.sql("position(id::text in '#{ids.join(',')}')")) + .page(params[:page]) + .per(current_component.settings.projects_per_page) end def all_geocoded_projects From 65c6cc49865bfa7f3c3f71c1687686d5e6ac2b04 Mon Sep 17 00:00:00 2001 From: stephanie rousset Date: Tue, 13 May 2025 15:30:29 +0200 Subject: [PATCH 3/4] test: add test to check order of projects when filtering and then using pagination --- spec/spec_helper.rb | 1 + spec/system/explore_projects_spec.rb | 48 ++++++++++++++++++++++++++++ 2 files changed, 49 insertions(+) diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index b572af1..97ca50c 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -16,6 +16,7 @@ "--window-size=1920,1080" end options.args << "--ignore-certificate-errors" if ENV["TEST_SSL"] + options.add_preference("intl.accept_languages", "en-GB") Capybara::Selenium::Driver.new( app, browser: :chrome, diff --git a/spec/system/explore_projects_spec.rb b/spec/system/explore_projects_spec.rb index 8055bfc..42d805c 100644 --- a/spec/system/explore_projects_spec.rb +++ b/spec/system/explore_projects_spec.rb @@ -76,6 +76,54 @@ end end + context "when filtering by category and changing pages" do + let!(:projects_count) { 10 } + let!(:categories) { create_list(:category, 2, participatory_space: component.participatory_space) } + + it "keeps the order of the projects displayed on the pages" do + component.update!(settings: { projects_per_page: 3 }) + first_cate = categories.first + sec_cate = categories.last + projects.each_with_index do |project, index| + index.even? ? project.category = first_cate : project.category = sec_cate + project.save + end + + visit_budget + + within ".with_any_category_check_boxes_tree_filter" do + uncheck "All" + uncheck translated(first_cate.name) + end + + within "#projects" do + expect(page).to have_css(".budget-list__item", count: 3) + end + + budget_list = all('div.budget-list__item') + first_proj = budget_list[0][:id] + sec_proj = budget_list[1][:id] + third_proj = budget_list[2][:id] + + within "#projects .pagination" do + # navigate page 2 + expect(page).to have_content("2") + page.find("a", text: "2").click + end + + within "#projects .pagination" do + # navigate back page 1 + page.find("a", text: "1").click + end + + # check that the projects are displayed in the same order on page one + new_budget_list = all('div.budget-list__item') + expect(new_budget_list[0][:id]).to eq(first_proj) + expect(new_budget_list[1][:id]).to eq(sec_proj) + expect(new_budget_list[2][:id]).to eq(third_proj) + end + end + context "and votes are finished" do let!(:component) do create(:budgets_component, From 3535007bf839ed87c1377ac1e2781db209d2663a Mon Sep 17 00:00:00 2001 From: stephanie rousset Date: Tue, 13 May 2025 15:58:19 +0200 Subject: [PATCH 4/4] refactor: update with rubocop --- app/controllers/decidim/budgets/projects_controller.rb | 2 +- spec/system/explore_projects_spec.rb | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/app/controllers/decidim/budgets/projects_controller.rb b/app/controllers/decidim/budgets/projects_controller.rb index 69e90d1..8014e07 100644 --- a/app/controllers/decidim/budgets/projects_controller.rb +++ b/app/controllers/decidim/budgets/projects_controller.rb @@ -34,7 +34,7 @@ def projects # keep the order so that when we use filters and pagination, projects are always # displayed in the same order on the pages @projects = Decidim::Budgets::Project.where(id: ids) - .order(Arel.sql("position(id::text in '#{ids.join(',')}')")) + .order(Arel.sql("position(id::text in '#{ids.join(",")}')")) .page(params[:page]) .per(current_component.settings.projects_per_page) end diff --git a/spec/system/explore_projects_spec.rb b/spec/system/explore_projects_spec.rb index 42d805c..fb5c45e 100644 --- a/spec/system/explore_projects_spec.rb +++ b/spec/system/explore_projects_spec.rb @@ -85,7 +85,7 @@ first_cate = categories.first sec_cate = categories.last projects.each_with_index do |project, index| - index.even? ? project.category = first_cate : project.category = sec_cate + project.category = index.even? ? first_cate : sec_cate project.save end @@ -100,7 +100,7 @@ expect(page).to have_css(".budget-list__item", count: 3) end - budget_list = all('div.budget-list__item') + budget_list = all("div.budget-list__item") first_proj = budget_list[0][:id] sec_proj = budget_list[1][:id] third_proj = budget_list[2][:id] @@ -117,7 +117,7 @@ end # check that the projects are displayed in the same order on page one - new_budget_list = all('div.budget-list__item') + new_budget_list = all("div.budget-list__item") expect(new_budget_list[0][:id]).to eq(first_proj) expect(new_budget_list[1][:id]).to eq(sec_proj) expect(new_budget_list[2][:id]).to eq(third_proj)