Change the order in which votes are displayed to be in the order they were selected by the voter

Note that the `budget` parameter was added to the `delete_path` method
so it works in the tests; on production, it worked because this
component is only rendered on pages which already have the `budget`
parameter.

Co-authored-by: Javi Martín <javim@elretirao.net>
This commit is contained in:
CoslaJohn
2024-03-28 09:51:33 +00:00
committed by Javi Martín
parent 05a6021938
commit c4d8c92ae2
7 changed files with 87 additions and 5 deletions

View File

@@ -28,6 +28,6 @@ class Budgets::Ballot::BallotComponent < ApplicationComponent
end
def group_investments(group)
ballot.investments.by_group(group.id)
ballot.investments.by_group(group.id).sort_by_ballot_lines
end
end

View File

@@ -18,6 +18,6 @@ class Budgets::Ballot::InvestmentForSidebarComponent < Budgets::Ballot::Investme
end
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

View File

@@ -20,6 +20,6 @@ class Budgets::Investments::MyBallotComponent < ApplicationComponent
end
def investments
ballot.investments.by_heading(heading.id)
ballot.investments.by_heading(heading.id).sort_by_ballot_lines
end
end

View File

@@ -99,6 +99,7 @@ class Budget
scope :last_week, -> { where("created_at >= ?", 7.days.ago) }
scope :sort_by_flags, -> { order(flags_count: :desc, updated_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_group, ->(group_id) { where(group_id: group_id) }

View File

@@ -3,11 +3,11 @@ require "rails_helper"
describe Budgets::Ballot::BallotComponent do
include Rails.application.routes.url_helpers
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
let(:budget) { create(:budget, :balloting) }
let(:group) { create(:budget_group, budget: budget) }
let(:ballot) { create(:budget_ballot, user: create(:user), budget: budget) }
context "group with a single heading" do
let!(:heading) { create(:budget_heading, group: group, price: 1000) }
@@ -50,4 +50,15 @@ describe Budgets::Ballot::BallotComponent do
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

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
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
it "does not return investments by description" do
create(:budget_investment, title: "Something", description: "Awesome")