diff --git a/app/controllers/admin/budget_investments_controller.rb b/app/controllers/admin/budget_investments_controller.rb index c81ccfcc3..062dc6b2d 100644 --- a/app/controllers/admin/budget_investments_controller.rb +++ b/app/controllers/admin/budget_investments_controller.rb @@ -15,7 +15,7 @@ class Admin::BudgetInvestmentsController < Admin::BaseController def index respond_to do |format| format.html - format.js { render layout: false } + format.js format.csv do send_data Budget::Investment.to_csv(@investments, headers: true), filename: 'budget_investments.csv' @@ -48,6 +48,7 @@ class Admin::BudgetInvestmentsController < Admin::BaseController def toggle_selection @investment.toggle :selected @investment.save + load_investments end private diff --git a/app/helpers/budget_investments_helper.rb b/app/helpers/budget_investments_helper.rb index 40db91c1f..72263b83e 100644 --- a/app/helpers/budget_investments_helper.rb +++ b/app/helpers/budget_investments_helper.rb @@ -2,4 +2,8 @@ module BudgetInvestmentsHelper def budget_investments_sorting_options Budget::Investment::SORTING_OPTIONS.map { |so| [t("admin.budget_investments.index.sort_by.#{so}"), so] } end + + def budget_investments_advanced_filters(params) + params.map { |af| t("admin.budget_investments.index.filters.#{af}") }.join(', ') + end end diff --git a/app/models/budget/investment.rb b/app/models/budget/investment.rb index f909a9746..4820b7b38 100644 --- a/app/models/budget/investment.rb +++ b/app/models/budget/investment.rb @@ -111,17 +111,21 @@ class Budget results = results.by_heading(params[:heading_id]) if params[:heading_id].present? results = results.by_valuator(params[:valuator_id]) if params[:valuator_id].present? results = results.by_admin(params[:administrator_id]) if params[:administrator_id].present? - - # Advanced filters - results = results.valuation_finished_feasible if params[:second_filter] == 'feasible' - results = results.where(selected: true) if params[:second_filter] == 'selected' - results = results.undecided if params[:second_filter] == 'undecided' - results = results.unfeasible if params[:second_filter] == 'unfeasible' + results = advanced_filters(params, results) if params[:advanced_filters].present? results = results.send(current_filter) if current_filter.present? results.includes(:heading, :group, :budget, administrator: :user, valuators: :user) end + def self.advanced_filters(params, results) + ids = [] + ids += results.valuation_finished_feasible.pluck(:id) if params[:advanced_filters].include?('feasible') + ids += results.where(selected: true).pluck(:id) if params[:advanced_filters].include?('selected') + ids += results.undecided.pluck(:id) if params[:advanced_filters].include?('undecided') + ids += results.unfeasible.pluck(:id) if params[:advanced_filters].include?('unfeasible') + results.where("budget_investments.id IN (?)", ids) + end + def self.limit_results(budget, params, results) max_per_heading = params[:max_per_heading].to_i return results if max_per_heading <= 0 diff --git a/app/views/admin/budget_investments/_advanced_filters.html.erb b/app/views/admin/budget_investments/_advanced_filters.html.erb index 5042bbfc8..b9f5a9e6d 100644 --- a/app/views/admin/budget_investments/_advanced_filters.html.erb +++ b/app/views/admin/budget_investments/_advanced_filters.html.erb @@ -8,27 +8,27 @@ <%= form_tag(admin_budget_budget_investments_path(budget: @budget, filter: params[:filter], sort_by: params[:sort_by], - second_filter: params[:second_filter], max_per_heading: params[:max_per_heading], + advanced_filters: params[:advanced_filters], page: 1), method: :get, remote: true, enforce_utf8: false) do %>
<%= t("#{i18n_namespace}.filters.two_filters_html", filter: t("#{i18n_namespace}.filters.#{params[:filter]}"), - second_filter: t("#{i18n_namespace}.filters.#{params[:second_filter]}")) %>
+ advanced_filters: budget_investments_advanced_filters(params[:advanced_filters])) %> <% elsif params[:filter].present? %> +<%= t("#{i18n_namespace}.filters.one_filter_html", filter: t("#{i18n_namespace}.filters.#{params[:filter]}")) %>
-<% elsif params[:second_filter].present? %> +<% elsif params[:advanced_filters].present? %> +<%= t("#{i18n_namespace}.filters.one_filter_html", - filter: t("#{i18n_namespace}.filters.#{params[:second_filter]}")) %>
+ filter: budget_investments_advanced_filters(params[:advanced_filters])) %> + <% end %> diff --git a/app/views/admin/budget_investments/_investments.html.erb b/app/views/admin/budget_investments/_investments.html.erb index 51c1c07d6..72578c33b 100644 --- a/app/views/admin/budget_investments/_investments.html.erb +++ b/app/views/admin/budget_investments/_investments.html.erb @@ -84,8 +84,8 @@ investment, filter: params[:filter], sort_by: params[:sort_by], - second_filter: params[:second_filter], max_per_heading: params[:max_per_heading], + advanced_filters: params[:advanced_filters], page: params[:page]), method: :patch, remote: true, @@ -97,8 +97,8 @@ investment, filter: params[:filter], sort_by: params[:sort_by], - second_filter: params[:second_filter], max_per_heading: params[:max_per_heading], + advanced_filters: params[:advanced_filters], page: params[:page]), method: :patch, remote: true, diff --git a/config/locales/en/admin.yml b/config/locales/en/admin.yml index 237c0f91a..2e0f6ff22 100644 --- a/config/locales/en/admin.yml +++ b/config/locales/en/admin.yml @@ -156,8 +156,8 @@ en: unfeasible: Unfeasible max_per_heading: Max. supports per heading winners: Winners - one_filter_html: "Current applied filter: %{filter}" - two_filters_html: "Current applied filters: %{filter}, %{second_filter}" + one_filter_html: "Current applied filters: %{filter}" + two_filters_html: "Current applied filters: %{filter}, %{advanced_filters}" buttons: search: Search filter: Filter diff --git a/config/locales/es/admin.yml b/config/locales/es/admin.yml index 44f89facd..463dedd99 100644 --- a/config/locales/es/admin.yml +++ b/config/locales/es/admin.yml @@ -156,8 +156,8 @@ es: unfeasible: Inviables max_per_heading: Corte por partida winners: Ganadores - one_filter_html: "Filtro en uso: %{filter}" - two_filters_html: "Filtros en uso: %{filter}, %{second_filter}" + one_filter_html: "Filtros en uso: %{filter}" + two_filters_html: "Filtros en uso: %{filter}, %{advanced_filters}" buttons: search: Buscar filter: Filtrar diff --git a/spec/features/admin/budget_investments_spec.rb b/spec/features/admin/budget_investments_spec.rb index c899748dc..5bfa0c897 100644 --- a/spec/features/admin/budget_investments_spec.rb +++ b/spec/features/admin/budget_investments_spec.rb @@ -686,6 +686,7 @@ feature 'Admin budget investments' do let!(:feasible_vf_bi) { create(:budget_investment, :feasible, :finished, budget: @budget, title: "Feasible, VF project") } let!(:selected_bi) { create(:budget_investment, :selected, budget: @budget, title: "Selected project") } let!(:winner_bi) { create(:budget_investment, :winner, budget: @budget, title: "Winner project") } + let!(:undecided_bi) { create(:budget_investment, :undecided, budget: @budget, title: "Undecided project") } scenario "Filtering by valuation and selection", :js do visit admin_budget_budget_investments_path(@budget) @@ -698,7 +699,7 @@ feature 'Admin budget investments' do expect(page).to have_content(winner_bi.title) click_link 'Advanced filters' - within('#advanced_filters') { find(:css, "#second_filter[value='feasible']").set(true) } + within('#advanced_filters') { find(:css, "#advanced_filters_[value='feasible']").set(true) } click_button 'Filter' expect(page).not_to have_content(unfeasible_bi.title) @@ -707,7 +708,8 @@ feature 'Admin budget investments' do expect(page).to have_content(selected_bi.title) expect(page).to have_content(winner_bi.title) - within('#advanced_filters') { find(:css, "#second_filter[value='selected']").set(true) } + within('#advanced_filters') { find(:css, "#advanced_filters_[value='selected']").set(true) } + within('#advanced_filters') { find(:css, "#advanced_filters_[value='feasible']").set(false) } click_button 'Filter' expect(page).not_to have_content(unfeasible_bi.title) @@ -724,6 +726,31 @@ feature 'Admin budget investments' do expect(page).to have_content(winner_bi.title) end + scenario "Aggregating results", :js do + visit admin_budget_budget_investments_path(@budget) + + click_link 'Advanced filters' + within('#advanced_filters') { find(:css, "#advanced_filters_[value='undecided']").set(true) } + click_button 'Filter' + + expect(page).to have_content(undecided_bi.title) + expect(page).not_to have_content(winner_bi.title) + expect(page).not_to have_content(selected_bi.title) + expect(page).not_to have_content(feasible_bi.title) + expect(page).not_to have_content(unfeasible_bi.title) + expect(page).not_to have_content(feasible_vf_bi.title) + + within('#advanced_filters') { find(:css, "#advanced_filters_[value='unfeasible']").set(true) } + click_button 'Filter' + + expect(page).to have_content(undecided_bi.title) + expect(page).to have_content(unfeasible_bi.title) + expect(page).not_to have_content(winner_bi.title) + expect(page).not_to have_content(selected_bi.title) + expect(page).not_to have_content(feasible_bi.title) + expect(page).not_to have_content(feasible_vf_bi.title) + end + scenario "Showing the selection buttons", :js do visit admin_budget_budget_investments_path(@budget) @@ -757,7 +784,7 @@ feature 'Admin budget investments' do end click_link 'Advanced filters' - within('#advanced_filters') { find(:css, "#second_filter[value='selected']").set(true) } + within('#advanced_filters') { find(:css, "#advanced_filters_[value='selected']").set(true) } click_button 'Filter' within("#budget_investment_#{feasible_vf_bi.id}") do @@ -769,7 +796,7 @@ feature 'Admin budget investments' do scenario "Unselecting an investment", :js do visit admin_budget_budget_investments_path(@budget) click_link 'Advanced filters' - within('#advanced_filters') { find(:css, "#second_filter[value='selected']").set(true) } + within('#advanced_filters') { find(:css, "#advanced_filters_[value='selected']").set(true) } click_button 'Filter' expect(page).to have_content('There are 2 investments')