diff --git a/app/components/budgets/executions/filters_component.html.erb b/app/components/budgets/executions/filters_component.html.erb
new file mode 100644
index 000000000..9bd358b62
--- /dev/null
+++ b/app/components/budgets/executions/filters_component.html.erb
@@ -0,0 +1,23 @@
+<%= form_tag(budget_executions_path(budget), method: :get) do %>
+
+ <%= 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) %>
+
+
+ <%= 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) %>
+
+<% end %>
diff --git a/app/components/budgets/executions/filters_component.rb b/app/components/budgets/executions/filters_component.rb
new file mode 100644
index 000000000..d324d78ef
--- /dev/null
+++ b/app/components/budgets/executions/filters_component.rb
@@ -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
diff --git a/app/helpers/budget_executions_helper.rb b/app/helpers/budget_executions_helper.rb
index 3cfab0557..ff94140c5 100644
--- a/app/helpers/budget_executions_helper.rb
+++ b/app/helpers/budget_executions_helper.rb
@@ -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
diff --git a/app/views/budgets/executions/show.html.erb b/app/views/budgets/executions/show.html.erb
index f9410fdc8..acb4f3822 100644
--- a/app/views/budgets/executions/show.html.erb
+++ b/app/views/budgets/executions/show.html.erb
@@ -42,29 +42,7 @@
- <%= form_tag(budget_executions_path(@budget), method: :get) do %>
-
- <%= 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) %>
-
-
- <%= 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) %>
-
- <% end %>
+ <%= render Budgets::Executions::FiltersComponent.new(@budget, @statuses) %>
<% if @investments_by_heading.any? %>
<%= render "budgets/executions/investments" %>
diff --git a/spec/helpers/budget_executions_helper_spec.rb b/spec/components/budgets/executions/filters_component_spec.rb
similarity index 62%
rename from spec/helpers/budget_executions_helper_spec.rb
rename to spec/components/budgets/executions/filters_component_spec.rb
index 80a01a423..459fc5a88 100644
--- a/spec/helpers/budget_executions_helper_spec.rb
+++ b/spec/components/budgets/executions/filters_component_spec.rb
@@ -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