diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index 3e1b78d31..495a25314 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -114,4 +114,10 @@ class ApplicationController < ActionController::Base store_location_for(:user, request.path) end end + + def set_default_budget_filter + if @budget.try(:balloting?) + params[:filter] ||= "selected" + end + end end diff --git a/app/controllers/budgets/groups_controller.rb b/app/controllers/budgets/groups_controller.rb index e55974a6a..d84eb2fdd 100644 --- a/app/controllers/budgets/groups_controller.rb +++ b/app/controllers/budgets/groups_controller.rb @@ -3,6 +3,9 @@ module Budgets load_and_authorize_resource :budget load_and_authorize_resource :group, class: "Budget::Group" + before_action :set_default_budget_filter, only: :show + has_filters %w{not_unfeasible feasible unfeasible unselected selected}, only: [:show] + def show end diff --git a/app/controllers/budgets/investments_controller.rb b/app/controllers/budgets/investments_controller.rb index 7f9c6e7ee..7eb1b1291 100644 --- a/app/controllers/budgets/investments_controller.rb +++ b/app/controllers/budgets/investments_controller.rb @@ -14,18 +14,20 @@ module Budgets before_action :load_heading, only: [:index, :show] before_action :set_random_seed, only: :index before_action :load_categories, only: [:index, :new, :create] + before_action :set_default_budget_filter, only: :index feature_flag :budgets has_orders %w{most_voted newest oldest}, only: :show has_orders ->(c) { c.instance_variable_get(:@budget).investments_orders }, only: :index + has_filters %w{not_unfeasible feasible unfeasible unselected selected}, only: [:index, :show] invisible_captcha only: [:create, :update], honeypot: :subtitle, scope: :budget_investment respond_to :html, :js def index - @investments = @investments.apply_filters_and_search(@budget, params).send("sort_by_#{@current_order}").page(params[:page]).per(10).for_render + @investments = @investments.apply_filters_and_search(@budget, params, @current_filter).send("sort_by_#{@current_order}").page(params[:page]).per(10).for_render @investment_ids = @investments.pluck(:id) load_investment_votes(@investments) @tag_cloud = tag_cloud @@ -107,6 +109,7 @@ module Budgets def tag_cloud TagCloud.new(Budget::Investment, params[:search]) end + end end diff --git a/app/controllers/budgets_controller.rb b/app/controllers/budgets_controller.rb index ee26f3223..2a53c410b 100644 --- a/app/controllers/budgets_controller.rb +++ b/app/controllers/budgets_controller.rb @@ -3,6 +3,9 @@ class BudgetsController < ApplicationController feature_flag :budgets load_and_authorize_resource + before_action :set_default_budget_filter, only: :show + has_filters %w{not_unfeasible feasible unfeasible unselected selected}, only: :show + respond_to :html, :js def show diff --git a/app/models/budget/investment.rb b/app/models/budget/investment.rb index 0b4470383..64adbaddf 100644 --- a/app/models/budget/investment.rb +++ b/app/models/budget/investment.rb @@ -46,8 +46,8 @@ class Budget scope :not_unfeasible, -> { where.not(feasibility: "unfeasible") } scope :undecided, -> { where(feasibility: "undecided") } scope :with_supports, -> { where('cached_votes_up > 0') } - scope :selected, -> { where(selected: true) } - scope :unselected, -> { where(selected: false) } + scope :selected, -> { feasible.where(selected: true) } + scope :unselected, -> { feasible.where(selected: false) } scope :last_week, -> { where("created_at >= ?", 7.days.ago)} scope :by_group, -> (group_id) { where(group_id: group_id) } @@ -234,17 +234,9 @@ class Budget budget.formatted_amount(price) end - def self.apply_filters_and_search(budget, params) + def self.apply_filters_and_search(budget, params, current_filter=nil) investments = all - - if budget.balloting? && params[:unfeasible].blank? && params[:unselected].blank? - investments = investments.selected - elsif budget.balloting? && params[:unfeasible].blank? && params[:unselected].present? - investments = investments.feasible.unselected - else - investments = params[:unfeasible].present? ? investments.unfeasible : investments.not_unfeasible - end - + investments = investments.send(current_filter) if current_filter.present? investments = investments.by_heading(params[:heading_id]) if params[:heading_id].present? investments = investments.search(params[:search]) if params[:search].present? investments @@ -256,5 +248,6 @@ class Budget self.group_id = self.heading.try(:group_id) if self.heading_id_changed? self.budget_id ||= self.heading.try(:group).try(:budget_id) end + end end diff --git a/app/views/budgets/groups/show.html.erb b/app/views/budgets/groups/show.html.erb index 8fbe028b3..d2e1c01fc 100644 --- a/app/views/budgets/groups/show.html.erb +++ b/app/views/budgets/groups/show.html.erb @@ -7,13 +7,13 @@ -<% if params[:unfeasible] %> +<% if @current_filter == "unfeasible" %>

<%= t("budgets.groups.show.unfeasible_title") %>

-<% elsif params[:unselected] %> +<% elsif @current_filter == "unselected" %>

<%= t("budgets.groups.show.unselected_title") %>

@@ -31,8 +31,7 @@ class="<%= css_for_ballot_heading(heading) %>"> <%= link_to heading.name, budget_investments_path(heading_id: heading.id, - unfeasible: params[:unfeasible], - unselected: params[:unselected]), + filter: @current_filter), data: { no_turbolink: true } %>
<% end %> @@ -46,20 +45,24 @@
-<% if params[:unfeasible].blank? %> +<% unless @current_filter == "unfeasible" %>
- <%= link_to t("budgets.groups.show.unfeasible"), - budget_path(@budget, unfeasible: 1) %> + + <%= link_to t("budgets.groups.show.unfeasible"), + budget_path(@budget, filter: "unfeasible") %> +
<% end %> -<% if params[:unselected].blank? %> +<% unless @current_filter == "unselected" %>
- <%= link_to t("budgets.groups.show.unselected"), - budget_path(@budget, unselected: 1) %> + + <%= link_to t("budgets.groups.show.unselected"), + budget_path(@budget, filter: "unselected") %> +
<% end %> diff --git a/app/views/budgets/investments/index.html.erb b/app/views/budgets/investments/index.html.erb index 50a2866f9..95b60f55b 100644 --- a/app/views/budgets/investments/index.html.erb +++ b/app/views/budgets/investments/index.html.erb @@ -16,7 +16,7 @@
- <% if params[:unfeasible].present? %> + <% if @current_filter == "unfeasible" %>

<%= t("budgets.investments.index.unfeasible") %>: <%= @heading.name %>

<%= t("budgets.investments.index.unfeasible_text", @@ -34,7 +34,7 @@ <% end %>
- <%= render('shared/order_links', i18n_namespace: "budgets.investments.index") unless params[:unfeasible].present? %> + <%= render('shared/order_links', i18n_namespace: "budgets.investments.index") unless @current_filter == "unfeasible" %> <% @investments.each do |investment| %> <%= render partial: '/budgets/investments/investment', locals: { diff --git a/app/views/budgets/show.html.erb b/app/views/budgets/show.html.erb index d6a571b46..f67b3ca9d 100644 --- a/app/views/budgets/show.html.erb +++ b/app/views/budgets/show.html.erb @@ -37,9 +37,9 @@
- <% if params[:unfeasible] %> + <% if @current_filter == "unfeasible" %>

<%= t("budgets.show.unfeasible_title") %>

- <% elsif params[:unselected] %> + <% elsif @current_filter == "unselected" %>

<%= t("budgets.show.unselected_title") %>

<% end %> @@ -54,14 +54,12 @@ <%= link_to group.name, budget_investments_path(@budget, heading_id: group.headings.first.id, - unfeasible: params[:unfeasible], - unselected: params[:unselected]), + filter: @current_filter), data: { no_turbolink: true } %> <% else %> <%= link_to group.name, budget_group_path(@budget, group, - unfeasible: params[:unfeasible], - unselected: params[:unselected]) %> + filter: @current_filter) %> <% end %>
@@ -72,20 +70,24 @@ -<% unless params[:unfeasible] %> +<% unless @current_filter == "unfeasible" %>
- <%= link_to t("budgets.show.unfeasible"), - budget_path(@budget, unfeasible: 1) %> + + <%= link_to t("budgets.show.unfeasible"), + budget_path(@budget, filter: "unfeasible") %> +
<% end %> -<% unless params[:unselected] %> +<% unless @current_filter == "unselected" %>
- <%= link_to t("budgets.show.unselected"), - budget_path(@budget, unselected: 1) %> + + <%= link_to t("budgets.show.unselected"), + budget_path(@budget, filter: "unselected") %> +
<% end %> diff --git a/spec/factories.rb b/spec/factories.rb index b295fd60c..f0a4fc5a2 100644 --- a/spec/factories.rb +++ b/spec/factories.rb @@ -284,6 +284,12 @@ FactoryGirl.define do feasibility "feasible" valuation_finished true end + + trait :unselected do + selected false + feasibility "feasible" + valuation_finished true + end end factory :budget_ballot, class: 'Budget::Ballot' do diff --git a/spec/features/budgets/ballots_spec.rb b/spec/features/budgets/ballots_spec.rb index 50670079c..7b3f3d1af 100644 --- a/spec/features/budgets/ballots_spec.rb +++ b/spec/features/budgets/ballots_spec.rb @@ -447,10 +447,12 @@ feature 'Ballots' do end scenario 'Unselected investments' do - investment = create(:budget_investment, heading: new_york) + investment = create(:budget_investment, heading: new_york, title: "WTF asdfasfd") login_as(user) - visit budget_investments_path(budget, heading_id: new_york.id, unfeasible: 1) + visit budget_path(budget) + click_link states.name + click_link new_york.name expect(page).to_not have_css("#budget_investment_#{investment.id}") end @@ -459,7 +461,9 @@ feature 'Ballots' do investment = create(:budget_investment, feasibility: "undecided", heading: new_york) login_as(user) - visit budget_investments_path(budget, heading_id: new_york.id) + visit budget_path(budget) + click_link states.name + click_link new_york.name within("#budget-investments") do expect(page).to_not have_css("div.ballot") diff --git a/spec/features/budgets/investments_spec.rb b/spec/features/budgets/investments_spec.rb index 69d995311..0df280fd3 100644 --- a/spec/features/budgets/investments_spec.rb +++ b/spec/features/budgets/investments_spec.rb @@ -8,10 +8,14 @@ feature 'Budget Investments' do let!(:heading) { create(:budget_heading, name: "More hospitals", group: group) } scenario 'Index' do - investments = [create(:budget_investment, heading: heading), create(:budget_investment, heading: heading), create(:budget_investment, :feasible, heading: heading)] + investments = [create(:budget_investment, heading: heading), + create(:budget_investment, heading: heading), + create(:budget_investment, :feasible, heading: heading)] + unfeasible_investment = create(:budget_investment, :unfeasible, heading: heading) - visit budget_investments_path(budget, heading_id: heading.id) + visit budget_path(budget) + click_link "Health" expect(page).to have_selector('#budget-investments .budget-investment', count: 3) investments.each do |investment| @@ -56,7 +60,7 @@ feature 'Budget Investments' do investment3 = create(:budget_investment, heading: heading) investment4 = create(:budget_investment, :feasible, heading: heading) - visit budget_investments_path(budget_id: budget.id, heading_id: heading.id, unfeasible: 1) + visit budget_investments_path(budget_id: budget.id, heading_id: heading.id, filter: "unfeasible") within("#budget-investments") do expect(page).to have_css('.budget-investment', count: 1) @@ -77,7 +81,7 @@ feature 'Budget Investments' do click_link "All City" - expected_path = budget_investments_path(budget, heading_id: heading.id, unfeasible: 1) + expected_path = budget_investments_path(budget, heading_id: heading.id, filter: "unfeasible") expect(page).to have_current_path(expected_path) end @@ -93,7 +97,7 @@ feature 'Budget Investments' do click_link 'Districts' click_link 'Carabanchel' - expected_path = budget_investments_path(budget, heading_id: heading1.id, unfeasible: 1) + expected_path = budget_investments_path(budget, heading_id: heading1.id, filter: "unfeasible") expect(page).to have_current_path(expected_path) end end @@ -516,8 +520,6 @@ feature 'Budget Investments' do expect(page).to have_content "€10,000" end - - scenario "Sidebar in show should display vote text" do investment = create(:budget_investment, :selected, budget: budget) visit budget_investment_path(budget, investment) @@ -537,7 +539,6 @@ feature 'Budget Investments' do carabanchel_heading = create(:budget_heading, group: group, name: "Carabanchel") new_york_heading = create(:budget_heading, group: group, name: "New York") - sp1 = create(:budget_investment, :selected, price: 1, heading: global_heading) sp2 = create(:budget_investment, :selected, price: 10, heading: global_heading) sp3 = create(:budget_investment, :selected, price: 100, heading: global_heading) @@ -603,12 +604,12 @@ feature 'Budget Investments' do end scenario 'Show unselected budget investments' do - investment1 = create(:budget_investment, :feasible, heading: heading, valuation_finished: true) - investment2 = create(:budget_investment, :selected, :feasible, heading: heading, valuation_finished: true) - investment3 = create(:budget_investment, :selected, :feasible, heading: heading, valuation_finished: true) - investment4 = create(:budget_investment, :selected, :feasible, heading: heading, valuation_finished: true) + investment1 = create(:budget_investment, :unselected, :feasible, heading: heading, valuation_finished: true) + investment2 = create(:budget_investment, :selected, :feasible, heading: heading, valuation_finished: true) + investment3 = create(:budget_investment, :selected, :feasible, heading: heading, valuation_finished: true) + investment4 = create(:budget_investment, :selected, :feasible, heading: heading, valuation_finished: true) - visit budget_investments_path(budget_id: budget.id, heading_id: heading.id, unselected: 1) + visit budget_investments_path(budget_id: budget.id, heading_id: heading.id, filter: "unselected") within("#budget-investments") do expect(page).to have_css('.budget-investment', count: 1) @@ -629,7 +630,7 @@ feature 'Budget Investments' do click_link "All City" - expected_path = budget_investments_path(budget, heading_id: heading.id, unselected: 1) + expected_path = budget_investments_path(budget, heading_id: heading.id, filter: "unselected") expect(page).to have_current_path(expected_path) end @@ -645,7 +646,7 @@ feature 'Budget Investments' do click_link 'Districts' click_link 'Carabanchel' - expected_path = budget_investments_path(budget, heading_id: heading1.id, unselected: 1) + expected_path = budget_investments_path(budget, heading_id: heading1.id, filter: "unselected") expect(page).to have_current_path(expected_path) end diff --git a/spec/features/tags/budget_investments_spec.rb b/spec/features/tags/budget_investments_spec.rb index 28d19333f..4c978c740 100644 --- a/spec/features/tags/budget_investments_spec.rb +++ b/spec/features/tags/budget_investments_spec.rb @@ -199,11 +199,12 @@ feature 'Tags' do if budget.balloting? [investment1, investment2, investment3].each do |investment| - investment.update(selected: true) + investment.update(selected: true, feasibility: "feasible") end end - visit budget_investments_path(budget, heading_id: heading.id) + visit budget_path(budget) + click_link group.name within "#tag-cloud" do click_link "Medio Ambiente" @@ -246,11 +247,12 @@ feature 'Tags' do if budget.balloting? [investment1, investment2, investment3].each do |investment| - investment.update(selected: true) + investment.update(selected: true, feasibility: "feasible") end end - visit budget_investments_path(budget, heading_id: heading.id, search: 'Economía') + visit budget_path(budget) + click_link group.name within "#categories" do click_link "Medio Ambiente"