Fix max_per_heading filter in Admin budget investments list
Also changed the name of the param to `min_total_supports`, which is more descriptive on what it actually does. Backport of 75f20d5 and 07f0806 from AyuntamientoMadrid/consul fork
This commit is contained in:
@@ -1,7 +1,7 @@
|
|||||||
module AdminBudgetInvestmentsHelper
|
module AdminBudgetInvestmentsHelper
|
||||||
|
|
||||||
def advanced_menu_visibility
|
def advanced_menu_visibility
|
||||||
(params[:advanced_filters].empty? && params["max_per_heading"].blank?) ? 'hide' : ''
|
(params[:advanced_filters].empty? && params["min_total_supports"].blank?) ? 'hide' : ''
|
||||||
end
|
end
|
||||||
|
|
||||||
def init_advanced_menu
|
def init_advanced_menu
|
||||||
|
|||||||
@@ -109,7 +109,8 @@ class Budget
|
|||||||
budget = Budget.find_by(slug: params[:budget_id]) || Budget.find_by(id: params[:budget_id])
|
budget = Budget.find_by(slug: params[:budget_id]) || Budget.find_by(id: params[:budget_id])
|
||||||
results = Investment.by_budget(budget)
|
results = Investment.by_budget(budget)
|
||||||
|
|
||||||
results = limit_results(budget, params, results) if params[:max_per_heading].present?
|
results = results.where("cached_votes_up + physical_votes >= ?",
|
||||||
|
params[:min_total_supports]) if params[:min_total_supports].present?
|
||||||
results = results.where(group_id: params[:group_id]) if params[:group_id].present?
|
results = results.where(group_id: params[:group_id]) if params[:group_id].present?
|
||||||
results = results.by_tag(params[:tag_name]) if params[:tag_name].present?
|
results = results.by_tag(params[:tag_name]) if params[:tag_name].present?
|
||||||
results = results.by_heading(params[:heading_id]) if params[:heading_id].present?
|
results = results.by_heading(params[:heading_id]) if params[:heading_id].present?
|
||||||
@@ -132,18 +133,6 @@ class Budget
|
|||||||
results.where("budget_investments.id IN (?)", ids)
|
results.where("budget_investments.id IN (?)", ids)
|
||||||
end
|
end
|
||||||
|
|
||||||
def self.limit_results(budget, params, results)
|
|
||||||
max_per_heading = params[:max_per_heading].to_i
|
|
||||||
return results if max_per_heading <= 0
|
|
||||||
|
|
||||||
ids = []
|
|
||||||
budget.headings.pluck(:id).each do |hid|
|
|
||||||
ids += Investment.where(heading_id: hid).order(confidence_score: :desc).limit(max_per_heading).pluck(:id)
|
|
||||||
end
|
|
||||||
|
|
||||||
results.where("budget_investments.id IN (?)", ids)
|
|
||||||
end
|
|
||||||
|
|
||||||
def self.search_by_title_or_id(title_or_id, results)
|
def self.search_by_title_or_id(title_or_id, results)
|
||||||
if title_or_id =~ /^[0-9]+$/
|
if title_or_id =~ /^[0-9]+$/
|
||||||
results.where(id: title_or_id)
|
results.where(id: title_or_id)
|
||||||
|
|||||||
@@ -112,7 +112,7 @@
|
|||||||
investment,
|
investment,
|
||||||
filter: params[:filter],
|
filter: params[:filter],
|
||||||
sort_by: params[:sort_by],
|
sort_by: params[:sort_by],
|
||||||
max_per_heading: params[:max_per_heading],
|
min_total_supports: params[:min_total_supports],
|
||||||
advanced_filters: params[:advanced_filters],
|
advanced_filters: params[:advanced_filters],
|
||||||
page: params[:page]),
|
page: params[:page]),
|
||||||
method: :patch,
|
method: :patch,
|
||||||
@@ -125,7 +125,7 @@
|
|||||||
investment,
|
investment,
|
||||||
filter: params[:filter],
|
filter: params[:filter],
|
||||||
sort_by: params[:sort_by],
|
sort_by: params[:sort_by],
|
||||||
max_per_heading: params[:max_per_heading],
|
min_total_supports: params[:min_total_supports],
|
||||||
advanced_filters: params[:advanced_filters],
|
advanced_filters: params[:advanced_filters],
|
||||||
page: params[:page]),
|
page: params[:page]),
|
||||||
method: :patch,
|
method: :patch,
|
||||||
|
|||||||
@@ -18,7 +18,7 @@
|
|||||||
</div>
|
</div>
|
||||||
<% end %>
|
<% end %>
|
||||||
<div class="filter">
|
<div class="filter">
|
||||||
<%= text_field_tag :max_per_heading, params["max_per_heading"], placeholder: t("admin.budget_investments.index.filters.max_per_heading") %>
|
<%= text_field_tag :min_total_supports, params["min_total_supports"], placeholder: t("admin.budget_investments.index.filters.min_total_supports") %>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -167,7 +167,7 @@ en:
|
|||||||
selected: Selected
|
selected: Selected
|
||||||
undecided: Undecided
|
undecided: Undecided
|
||||||
unfeasible: Unfeasible
|
unfeasible: Unfeasible
|
||||||
max_per_heading: Max. supports per heading
|
min_total_supports: Minimum supports
|
||||||
winners: Winners
|
winners: Winners
|
||||||
one_filter_html: "Current applied filters: <b><em>%{filter}</em></b>"
|
one_filter_html: "Current applied filters: <b><em>%{filter}</em></b>"
|
||||||
two_filters_html: "Current applied filters: <b><em>%{filter}, %{advanced_filters}</em></b>"
|
two_filters_html: "Current applied filters: <b><em>%{filter}, %{advanced_filters}</em></b>"
|
||||||
|
|||||||
@@ -167,7 +167,7 @@ es:
|
|||||||
selected: Seleccionados
|
selected: Seleccionados
|
||||||
undecided: Sin decidir
|
undecided: Sin decidir
|
||||||
unfeasible: Inviables
|
unfeasible: Inviables
|
||||||
max_per_heading: Corte por partida
|
min_total_supports: Apoyos mínimos
|
||||||
winners: Ganadores
|
winners: Ganadores
|
||||||
one_filter_html: "Filtros en uso: <b><em>%{filter}</em></b>"
|
one_filter_html: "Filtros en uso: <b><em>%{filter}</em></b>"
|
||||||
two_filters_html: "Filtros en uso: <b><em>%{filter}, %{advanced_filters}</em></b>"
|
two_filters_html: "Filtros en uso: <b><em>%{filter}, %{advanced_filters}</em></b>"
|
||||||
|
|||||||
@@ -371,59 +371,40 @@ feature 'Admin budget investments' do
|
|||||||
expect(page).to have_content 'The budget has to stay on phase "Balloting projects", "Reviewing Ballots" or "Finished budget" in order to calculate winners projects'
|
expect(page).to have_content 'The budget has to stay on phase "Balloting projects", "Reviewing Ballots" or "Finished budget" in order to calculate winners projects'
|
||||||
end
|
end
|
||||||
|
|
||||||
scenario "Limiting by max number of investments per heading", :js do
|
scenario "Filtering by minimum number of votes", :js do
|
||||||
group_1 = create(:budget_group, budget: budget)
|
group_1 = create(:budget_group, budget: budget)
|
||||||
group_2 = create(:budget_group, budget: budget)
|
group_2 = create(:budget_group, budget: budget)
|
||||||
parks = create(:budget_heading, group: group_1)
|
parks = create(:budget_heading, group: group_1)
|
||||||
roads = create(:budget_heading, group: group_2)
|
roads = create(:budget_heading, group: group_2)
|
||||||
streets = create(:budget_heading, group: group_2)
|
streets = create(:budget_heading, group: group_2)
|
||||||
|
|
||||||
[2, 4, 90, 100, 200, 300].each do |n|
|
create(:budget_investment, heading: parks, cached_votes_up: 40, title: "Park with 40 supports")
|
||||||
create(:budget_investment, heading: parks, cached_votes_up: n, title: "Park with #{n} supports")
|
create(:budget_investment, heading: parks, cached_votes_up: 99, title: "Park with 99 supports")
|
||||||
end
|
create(:budget_investment, heading: roads, cached_votes_up: 100, title: "Road with 100 supports")
|
||||||
|
create(:budget_investment, heading: roads, cached_votes_up: 199, title: "Road with 199 supports")
|
||||||
[21, 31, 51, 81, 91, 101].each do |n|
|
create(:budget_investment, heading: streets, cached_votes_up: 200, title: "Street with 200 supports")
|
||||||
create(:budget_investment, heading: roads, cached_votes_up: n, title: "Road with #{n} supports")
|
create(:budget_investment, heading: streets, cached_votes_up: 300, title: "Street with 300 supports")
|
||||||
end
|
|
||||||
|
|
||||||
[3, 10, 30, 33, 44, 55].each do |n|
|
|
||||||
create(:budget_investment, heading: streets, cached_votes_up: n, title: "Street with #{n} supports")
|
|
||||||
end
|
|
||||||
|
|
||||||
visit admin_budget_budget_investments_path(budget)
|
visit admin_budget_budget_investments_path(budget)
|
||||||
|
|
||||||
[2, 4, 90, 100, 200, 300].each do |n|
|
expect(page).to have_link("Park with 40 supports")
|
||||||
expect(page).to have_link("Park with #{n} supports")
|
expect(page).to have_link("Park with 99 supports")
|
||||||
end
|
expect(page).to have_link("Road with 100 supports")
|
||||||
|
expect(page).to have_link("Road with 199 supports")
|
||||||
[21, 31, 51, 81, 91, 101].each do |n|
|
expect(page).to have_link("Street with 200 supports")
|
||||||
expect(page).to have_link("Road with #{n} supports")
|
expect(page).to have_link("Street with 300 supports")
|
||||||
end
|
|
||||||
|
|
||||||
[3, 10, 30, 33, 44, 55].each do |n|
|
|
||||||
expect(page).to have_link("Street with #{n} supports")
|
|
||||||
end
|
|
||||||
|
|
||||||
click_link 'Advanced filters'
|
click_link 'Advanced filters'
|
||||||
fill_in "max_per_heading", with: 5
|
fill_in "min_total_supports", with: 180
|
||||||
click_button 'Filter'
|
click_button 'Filter'
|
||||||
|
|
||||||
expect(page).to have_content('There are 15 investments')
|
expect(page).to have_content('There are 3 investments')
|
||||||
expect(page).not_to have_link("Park with 2 supports")
|
expect(page).to have_link("Road with 199 supports")
|
||||||
expect(page).not_to have_link("Road with 21 supports")
|
expect(page).to have_link("Street with 200 supports")
|
||||||
expect(page).not_to have_link("Street with 3 supports")
|
expect(page).to have_link("Street with 300 supports")
|
||||||
|
expect(page).not_to have_link("Park with 40 supports")
|
||||||
[4, 90, 100, 200, 300].each do |n|
|
expect(page).not_to have_link("Park with 99 supports")
|
||||||
expect(page).to have_link("Park with #{n} supports")
|
expect(page).not_to have_link("Road with 100 supports")
|
||||||
end
|
|
||||||
|
|
||||||
[31, 51, 81, 91, 101].each do |n|
|
|
||||||
expect(page).to have_link("Road with #{n} supports")
|
|
||||||
end
|
|
||||||
|
|
||||||
[10, 30, 33, 44, 55].each do |n|
|
|
||||||
expect(page).to have_link("Street with #{n} supports")
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
||||||
scenario "Combination of checkbox with text search", :js do
|
scenario "Combination of checkbox with text search", :js do
|
||||||
|
|||||||
Reference in New Issue
Block a user