Extract budget executions filters to a component

This commit is contained in:
Javi Martín
2021-06-28 00:51:24 +02:00
parent 28ae1a369a
commit d8d5b7f60a
5 changed files with 49 additions and 39 deletions

View File

@@ -0,0 +1,23 @@
<%= form_tag(budget_executions_path(budget), method: :get) do %>
<div class="small-12 medium-3 column">
<%= label_tag :milestone_tag, t("budgets.executions.filters.milestone_tag.label") %>
<%= select_tag :milestone_tag,
options_for_select(
options_for_milestone_tags,
params[:milestone_tag]
),
class: "js-submit-on-change",
prompt: t("budgets.executions.filters.milestone_tag.all",
count: budget.investments.winners.with_milestones.count) %>
</div>
<div class="small-12 medium-3 column">
<%= label_tag :status, t("budgets.executions.filters.status.label") %>
<%= select_tag :status,
options_from_collection_for_select(statuses,
:id, lambda { |s| "#{s.name} (#{filters_select_counts(s.id)})" },
params[:status]),
class: "js-submit-on-change",
prompt: t("budgets.executions.filters.status.all",
count: budget.investments.winners.with_milestones.count) %>
</div>
<% end %>

View File

@@ -0,0 +1,20 @@
class Budgets::Executions::FiltersComponent < ApplicationComponent
attr_reader :budget, :statuses
def initialize(budget, statuses)
@budget = budget
@statuses = statuses
end
def options_for_milestone_tags
budget.investments_milestone_tags.map do |tag|
["#{tag} (#{budget.investments.winners.by_tag(tag).count})", tag]
end
end
private
def filters_select_counts(status)
budget.investments.winners.with_milestone_status_id(status).count
end
end

View File

@@ -1,14 +1,4 @@
module BudgetExecutionsHelper
def filters_select_counts(status)
@budget.investments.winners.with_milestone_status_id(status).count
end
def options_for_milestone_tags
@budget.investments_milestone_tags.map do |tag|
["#{tag} (#{@budget.investments.winners.by_tag(tag).count})", tag]
end
end
def first_milestone_with_image(investment)
investment.milestones.order_by_publication_date
.select { |milestone| milestone.image.present? }.last

View File

@@ -42,29 +42,7 @@
</div>
<div class="small-12 medium-9 large-10 column">
<%= form_tag(budget_executions_path(@budget), method: :get) do %>
<div class="small-12 medium-3 column">
<%= label_tag :milestone_tag, t("budgets.executions.filters.milestone_tag.label") %>
<%= select_tag :milestone_tag,
options_for_select(
options_for_milestone_tags,
params[:milestone_tag]
),
class: "js-submit-on-change",
prompt: t("budgets.executions.filters.milestone_tag.all",
count: @budget.investments.winners.with_milestones.count) %>
</div>
<div class="small-12 medium-3 column">
<%= label_tag :status, t("budgets.executions.filters.status.label") %>
<%= select_tag :status,
options_from_collection_for_select(@statuses,
:id, lambda { |s| "#{s.name} (#{filters_select_counts(s.id)})" },
params[:status]),
class: "js-submit-on-change",
prompt: t("budgets.executions.filters.status.all",
count: @budget.investments.winners.with_milestones.count) %>
</div>
<% end %>
<%= render Budgets::Executions::FiltersComponent.new(@budget, @statuses) %>
<% if @investments_by_heading.any? %>
<%= render "budgets/executions/investments" %>

View File

@@ -1,17 +1,16 @@
require "rails_helper"
describe BudgetExecutionsHelper do
describe "#options_for_milestone_tags" do
let(:budget) { create(:budget) }
describe Budgets::Executions::FiltersComponent do
let(:budget) { create(:budget) }
let(:component) { Budgets::Executions::FiltersComponent.new(budget, []) }
describe "#options_for_milestone_tags" do
it "does not return duplicate records for tags in different contexts" do
create(:budget_investment, :winner, budget: budget, milestone_tag_list: ["Multiple"])
create(:budget_investment, :winner, budget: budget, milestone_tag_list: ["Multiple"])
create(:budget_investment, :winner, budget: budget, milestone_tag_list: ["Dup"], tag_list: ["Dup"])
@budget = budget
expect(options_for_milestone_tags).to eq [["Dup (1)", "Dup"], ["Multiple (2)", "Multiple"]]
expect(component.options_for_milestone_tags).to eq [["Dup (1)", "Dup"], ["Multiple (2)", "Multiple"]]
end
end
end