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:
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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) }
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
@@ -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")
|
||||
|
||||
Reference in New Issue
Block a user