diff --git a/Gemfile.lock b/Gemfile.lock index 2f890166..0d1cacff 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -46,7 +46,7 @@ GIT GIT remote: https://github.com/OpenSourcePolitics/decidim-module-ptp.git - revision: e2ec0dd39b5e8b96b88986c494087a9e87e94d2e + revision: 9ea26682739486ce4ca30a814747e88e57e70524 specs: decidim-budgets_booth (0.27.0) decidim-budgets (~> 0.27.0) diff --git a/app/controllers/decidim/budgets/projects_controller.rb b/app/controllers/decidim/budgets/projects_controller.rb index 3d4ff298..8014e071 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 diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index b572af1a..97ca50c9 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 8055bfca..fb5c45e9 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| + project.category = index.even? ? first_cate : 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,