From d8d5b7f60ac444d0508236b3178b8830975f4bcd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Javi=20Mart=C3=ADn?= Date: Mon, 28 Jun 2021 00:51:24 +0200 Subject: [PATCH] Extract budget executions filters to a component --- .../executions/filters_component.html.erb | 23 ++++++++++++++++++ .../budgets/executions/filters_component.rb | 20 ++++++++++++++++ app/helpers/budget_executions_helper.rb | 10 -------- app/views/budgets/executions/show.html.erb | 24 +------------------ .../executions/filters_component_spec.rb} | 11 ++++----- 5 files changed, 49 insertions(+), 39 deletions(-) create mode 100644 app/components/budgets/executions/filters_component.html.erb create mode 100644 app/components/budgets/executions/filters_component.rb rename spec/{helpers/budget_executions_helper_spec.rb => components/budgets/executions/filters_component_spec.rb} (62%) 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