Merge pull request #5454 from coslajohn/order_ballot_votes

Change the order in which PB Ballot votes are displayed
This commit is contained in:
Javi Martín
2024-04-09 14:37:44 +02:00
committed by GitHub
9 changed files with 96 additions and 8 deletions

View File

@@ -36,9 +36,7 @@
<% end %> <% end %>
<ul class="ballot-list"> <ul class="ballot-list">
<%= render Budgets::Ballot::InvestmentComponent.with_collection( <%= render Budgets::Ballot::InvestmentComponent.with_collection(group_investments(group)) %>
ballot.investments.by_group(group.id)
) %>
</ul> </ul>
</div> </div>
</div> </div>

View File

@@ -26,4 +26,8 @@ class Budgets::Ballot::BallotComponent < ApplicationComponent
budget_investments_path(budget, heading_id: group.headings.first) budget_investments_path(budget, heading_id: group.headings.first)
end end
end end
def group_investments(group)
ballot.investments.by_group(group.id).sort_by_ballot_lines
end
end end

View File

@@ -18,6 +18,6 @@ class Budgets::Ballot::InvestmentForSidebarComponent < Budgets::Ballot::Investme
end end
def delete_path def delete_path
budget_ballot_line_path(id: investment.id, investments_ids: investment_ids) budget_ballot_line_path(budget, id: investment.id, investments_ids: investment_ids)
end end
end end

View File

@@ -3,7 +3,7 @@
<%= t("budgets.investments.index.sidebar.my_ballot") %> <%= t("budgets.investments.index.sidebar.my_ballot") %>
</h2> </h2>
<% if ballot.investments.by_heading(heading.id).count > 0 %> <% if investments.count > 0 %>
<p> <p>
<em><%= sanitize(ballot.voted_info(heading)) %></em> <em><%= sanitize(ballot.voted_info(heading)) %></em>
</p> </p>
@@ -32,7 +32,7 @@
<ul class="ballot-list"> <ul class="ballot-list">
<% if heading %> <% if heading %>
<%= render Budgets::Ballot::InvestmentForSidebarComponent.with_collection( <%= render Budgets::Ballot::InvestmentForSidebarComponent.with_collection(
ballot.investments.by_heading(heading.id), investments,
investment_ids: investment_ids investment_ids: investment_ids
) %> ) %>
<% end %> <% end %>

View File

@@ -18,4 +18,8 @@ class Budgets::Investments::MyBallotComponent < ApplicationComponent
def budget def budget
ballot.budget ballot.budget
end end
def investments
ballot.investments.by_heading(heading.id).sort_by_ballot_lines
end
end end

View File

@@ -99,6 +99,7 @@ class Budget
scope :last_week, -> { where("created_at >= ?", 7.days.ago) } scope :last_week, -> { where("created_at >= ?", 7.days.ago) }
scope :sort_by_flags, -> { order(flags_count: :desc, updated_at: :desc) } scope :sort_by_flags, -> { order(flags_count: :desc, updated_at: :desc) }
scope :sort_by_created_at, -> { reorder(created_at: :desc) } scope :sort_by_created_at, -> { reorder(created_at: :desc) }
scope :sort_by_ballot_lines, -> { order(:"budget_ballot_lines.created_at") }
scope :by_budget, ->(budget) { where(budget: budget) } scope :by_budget, ->(budget) { where(budget: budget) }
scope :by_group, ->(group_id) { where(group_id: group_id) } scope :by_group, ->(group_id) { where(group_id: group_id) }

View File

@@ -3,11 +3,11 @@ require "rails_helper"
describe Budgets::Ballot::BallotComponent do describe Budgets::Ballot::BallotComponent do
include Rails.application.routes.url_helpers include Rails.application.routes.url_helpers
before { vc_test_request.session[:ballot_referer] = "/" } before { vc_test_request.session[:ballot_referer] = "/" }
let(:budget) { create(:budget, :balloting) }
let(:ballot) { create(:budget_ballot, user: create(:user), budget: budget) }
describe "link to group" do describe "link to group" do
let(:budget) { create(:budget, :balloting) }
let(:group) { create(:budget_group, budget: budget) } let(:group) { create(:budget_group, budget: budget) }
let(:ballot) { create(:budget_ballot, user: create(:user), budget: budget) }
context "group with a single heading" do context "group with a single heading" do
let!(:heading) { create(:budget_heading, group: group, price: 1000) } let!(:heading) { create(:budget_heading, group: group, price: 1000) }
@@ -50,4 +50,15 @@ describe Budgets::Ballot::BallotComponent do
end end
end end
end end
it "sorts investments by ballot lines" do
["B letter", "A letter", "C letter"].each do |title|
ballot.add_investment(create(:budget_investment, :selected, budget: budget, title: title))
end
render_inline Budgets::Ballot::BallotComponent.new(ballot)
expect("B letter").to appear_before "A letter"
expect("A letter").to appear_before "C letter"
end
end end

View File

@@ -0,0 +1,28 @@
require "rails_helper"
describe Budgets::Investments::MyBallotComponent do
let(:user) { create(:user, :level_two) }
let(:budget) { create(:budget, :balloting) }
let(:ballot) { create(:budget_ballot, user: user, budget: budget) }
let(:heading) { create(:budget_heading, budget: budget) }
before do
vc_test_request.session[:ballot_referer] = "/"
sign_in(user)
end
it "sorts investments by ballot lines" do
["B letter", "A letter", "C letter"].each do |title|
ballot.add_investment(create(:budget_investment, :selected, heading: heading, title: title))
end
render_inline Budgets::Investments::MyBallotComponent.new(
ballot: ballot,
heading: heading,
investment_ids: []
)
expect("B letter").to appear_before "A letter"
expect("A letter").to appear_before "C letter"
end
end

View File

@@ -758,6 +758,48 @@ describe Budget::Investment do
end end
end end
describe ".sort_by_ballot_lines" do
let(:budget) { create(:budget, :balloting) }
let(:ballot) { create(:budget_ballot, user: create(:user), budget: budget) }
it "adjusts results when investments are added and removed" do
letter_a = create(:budget_investment, :selected, budget: budget, title: "A letter")
letter_b = create(:budget_investment, :selected, budget: budget, title: "B letter")
letter_c = create(:budget_investment, :selected, budget: budget, title: "C letter")
ballot.add_investment(letter_b)
ballot.add_investment(letter_a)
ballot.add_investment(letter_c)
ballot.investments.delete(letter_a)
ballot.add_investment(letter_a)
ordered_investments = ballot.investments.sort_by_ballot_lines
expect(ordered_investments.map(&:title)).to eq ["B letter", "C letter", "A letter"]
end
it "does not sort alphabetically" do
["B letter", "A letter", "C letter"].each do |title|
ballot.add_investment(create(:budget_investment, :selected, budget: budget, title: title))
end
ordered_investments = ballot.investments.sort_by_ballot_lines
expect(ordered_investments.map(&:title)).to eq ["B letter", "A letter", "C letter"]
end
it "does not sort by price" do
[2, 1, 3].each do |price|
ballot.add_investment(create(:budget_investment, :selected, budget: budget, price: price))
end
ordered_investments = ballot.investments.sort_by_ballot_lines
expect(ordered_investments.map(&:price)).to eq [2, 1, 3]
end
end
describe "search_by_title_or_id" do describe "search_by_title_or_id" do
it "does not return investments by description" do it "does not return investments by description" do
create(:budget_investment, title: "Something", description: "Awesome") create(:budget_investment, title: "Something", description: "Awesome")