diff --git a/lib/extends/controllers/decidim/proposals/proposals_controller_dataspace_extends.rb b/lib/extends/controllers/decidim/proposals/proposals_controller_dataspace_extends.rb index 1fa2ce9..a294afc 100644 --- a/lib/extends/controllers/decidim/proposals/proposals_controller_dataspace_extends.rb +++ b/lib/extends/controllers/decidim/proposals/proposals_controller_dataspace_extends.rb @@ -18,28 +18,28 @@ def index .includes(:category, :scope, :attachments, :coauthorships) .order(position: :asc) render "decidim/proposals/proposals/participatory_texts/participatory_text" + elsif verify_dataspace? && data.present? + external_proposals = data["contributions"] + @authors = data["authors"] + proposals = search.result + proposals = reorder(proposals) + proposals = ordered_proposals(proposals).includes(:component, :coauthorships, :attachments) + @total_count = proposals.size + external_proposals.size + @current_page = params[:page].to_i + @current_page = 1 if @current_page < 1 + @total_pages = (@total_count.to_f / per_page).ceil + @proposals, @external_proposals = define_proposals_and_external_proposals(proposals, external_proposals, @current_page, per_page) + # Create a pagination object for view + @pagination = create_pagination_object(@total_count, @current_page, per_page) else - if verify_dataspace? && data.present? - external_proposals = data["contributions"] - @authors = data["authors"] - proposals = search.result - proposals = reorder(proposals.includes(:component, :coauthorships, :attachments)) - @total_count = proposals.size + external_proposals.size - @current_page = params[:page].to_i - @current_page = 1 if @current_page < 1 - @total_pages = (@total_count.to_f / per_page).ceil - @proposals, @external_proposals = define_proposals_and_external_proposals(proposals, external_proposals, @current_page, per_page) - # Create a pagination object for view - @pagination = create_pagination_object(@total_count, @current_page, per_page) - else - @proposals = search.result - @proposals = reorder(@proposals) - @proposals = paginate(@proposals) - @proposals = @proposals.includes(:component, :coauthorships, :attachments) - end - - @voted_proposals = voted_proposals + @proposals = search.result + @proposals = reorder(@proposals) + @proposals = ordered_proposals(@proposals).page(params[:page]) + .per(per_page) + .includes(:component, :coauthorships, :attachments) + @proposals = paginate(@proposals) end + @voted_proposals = voted_proposals end def external_proposal @@ -67,6 +67,12 @@ def dataspace_enabled redirect_to(root_url) && return unless verify_dataspace? end + def ordered_proposals(proposals) + # integrate the modifications from decidim-app lib/extends/controllers/decidim/proposals/proposals_controller_extends.rb + ids = proposals.ids + Decidim::Proposals::Proposal.where(id: ids).order(Arel.sql("position(decidim_proposals_proposals.id::text in '#{ids.join(",")}')")) + end + def voted_proposals if current_user Decidim::Proposals::ProposalVote.where( diff --git a/spec/controllers/decidim/proposals/proposals_controller_spec.rb b/spec/controllers/decidim/proposals/proposals_controller_spec.rb index 608b4f3..36cd3a2 100644 --- a/spec/controllers/decidim/proposals/proposals_controller_spec.rb +++ b/spec/controllers/decidim/proposals/proposals_controller_spec.rb @@ -61,8 +61,7 @@ module Proposals expect(response).to have_http_status(:ok) expect(subject).to render_template(:index) expect(assigns(:proposals).size).to eq(12) - expect(assigns(:proposals).order_values).to eq [Decidim::Proposals::Proposal.arel_table[Decidim::Proposals::Proposal.primary_key] * Arel.sql("RANDOM()")] - expect(assigns(:proposals).order_values.map(&:to_sql)).to eq ["\"decidim_proposals_proposals\".\"id\" * RANDOM()"] + expect(assigns(:proposals).order_values).to eq(["position(decidim_proposals_proposals.id::text in '#{assigns(:proposals).ids.join(",")}')"]) end it "sets two different collections" do @@ -84,8 +83,7 @@ module Proposals expect(response).to have_http_status(:ok) expect(subject).to render_template(:index) expect(assigns(:proposals).size).to eq(2) - expect(assigns(:proposals).order_values).to eq [Decidim::Proposals::Proposal.arel_table[Decidim::Proposals::Proposal.primary_key] * Arel.sql("RANDOM()")] - expect(assigns(:proposals).order_values.map(&:to_sql)).to eq ["\"decidim_proposals_proposals\".\"id\" * RANDOM()"] + expect(assigns(:proposals).order_values).to eq(["position(decidim_proposals_proposals.id::text in '#{assigns(:proposals).ids.join(",")}')"]) end end @@ -173,8 +171,7 @@ module Proposals get :index expect(response).to have_http_status(:ok) expect(subject).to render_template(:index) - expect(assigns(:proposals).order_values).to eq [Decidim::Proposals::Proposal.arel_table[Decidim::Proposals::Proposal.primary_key] * Arel.sql("RANDOM()")] - expect(assigns(:proposals).order_values.map(&:to_sql)).to eq ["\"decidim_proposals_proposals\".\"id\" * RANDOM()"] + expect(assigns(:proposals).order_values).to eq ["position(decidim_proposals_proposals.id::text in '#{assigns(:proposals).ids.join(",")}')"] expect(assigns(:authors).count).to eq 2 expect(assigns(:authors).first[:reference]).to eq "JD-MEET-2025-09-6" expect(assigns(:authors).last[:reference]).to eq "JD-MEET-2025-09-23" diff --git a/spec/system/proposals_index_spec.rb b/spec/system/proposals_index_spec.rb index 458057a..324e583 100644 --- a/spec/system/proposals_index_spec.rb +++ b/spec/system/proposals_index_spec.rb @@ -169,7 +169,7 @@ before do # Decidim::Paginable::OPTIONS.first is 25 create_list(:proposal, Decidim::Paginable::OPTIONS.first, component:) - # we have already create 3 proposals, so we will have a total of 28 proposals + # we have already created 3 proposals, so we will have a total of 28 proposals end it "paginates them with proposals first and external proposals at the end" do