diff --git a/app/components/admin/budget_investments/row_component.html.erb b/app/components/admin/budget_investments/row_component.html.erb
index cc37536f9..49129a7c7 100644
--- a/app/components/admin/budget_investments/row_component.html.erb
+++ b/app/components/admin/budget_investments/row_component.html.erb
@@ -55,40 +55,7 @@
- <% if investment.selected? %>
- <%= link_to_if can?(:toggle_selection, investment),
- t("admin.budget_investments.index.selected"),
- toggle_selection_admin_budget_budget_investment_path(
- budget,
- investment,
- filter: params[:filter],
- sort_by: params[:sort_by],
- min_total_supports: params[:min_total_supports],
- max_total_supports: params[:max_total_supports],
- advanced_filters: params[:advanced_filters],
- page: params[:page]
- ),
- method: :patch,
- remote: true,
- class: "button small expanded" %>
- <% elsif investment.feasible? && investment.valuation_finished? %>
- <% if can?(:toggle_selection, investment) %>
- <%= link_to t("admin.budget_investments.index.select"),
- toggle_selection_admin_budget_budget_investment_path(
- budget,
- investment,
- filter: params[:filter],
- sort_by: params[:sort_by],
- min_total_supports: params[:min_total_supports],
- max_total_supports: params[:max_total_supports],
- advanced_filters: params[:advanced_filters],
- page: params[:page]
- ),
- method: :patch,
- remote: true,
- class: "button small hollow expanded" %>
- <% end %>
- <% end %>
+ <%= render Admin::BudgetInvestments::ToggleSelectionComponent.new(investment) %>
|
<% if params[:advanced_filters]&.include?("selected") %>
diff --git a/app/components/admin/budget_investments/toggle_selection_component.html.erb b/app/components/admin/budget_investments/toggle_selection_component.html.erb
new file mode 100644
index 000000000..82b4a9165
--- /dev/null
+++ b/app/components/admin/budget_investments/toggle_selection_component.html.erb
@@ -0,0 +1,34 @@
+<% if investment.selected? %>
+ <%= link_to_if can?(:toggle_selection, investment),
+ t("admin.budget_investments.index.selected"),
+ toggle_selection_admin_budget_budget_investment_path(
+ budget,
+ investment,
+ filter: params[:filter],
+ sort_by: params[:sort_by],
+ min_total_supports: params[:min_total_supports],
+ max_total_supports: params[:max_total_supports],
+ advanced_filters: params[:advanced_filters],
+ page: params[:page]
+ ),
+ method: :patch,
+ remote: true,
+ class: "button small expanded" %>
+<% elsif investment.feasible? && investment.valuation_finished? %>
+ <% if can?(:toggle_selection, investment) %>
+ <%= link_to t("admin.budget_investments.index.select"),
+ toggle_selection_admin_budget_budget_investment_path(
+ budget,
+ investment,
+ filter: params[:filter],
+ sort_by: params[:sort_by],
+ min_total_supports: params[:min_total_supports],
+ max_total_supports: params[:max_total_supports],
+ advanced_filters: params[:advanced_filters],
+ page: params[:page]
+ ),
+ method: :patch,
+ remote: true,
+ class: "button small hollow expanded" %>
+ <% end %>
+<% end %>
diff --git a/app/components/admin/budget_investments/toggle_selection_component.rb b/app/components/admin/budget_investments/toggle_selection_component.rb
new file mode 100644
index 000000000..312be4ba9
--- /dev/null
+++ b/app/components/admin/budget_investments/toggle_selection_component.rb
@@ -0,0 +1,14 @@
+class Admin::BudgetInvestments::ToggleSelectionComponent < ApplicationComponent
+ attr_reader :investment
+ use_helpers :can?
+
+ def initialize(investment)
+ @investment = investment
+ end
+
+ private
+
+ def budget
+ investment.budget
+ end
+end
diff --git a/spec/components/admin/budget_investments/toggle_selection_component_spec.rb b/spec/components/admin/budget_investments/toggle_selection_component_spec.rb
new file mode 100644
index 000000000..dd5157242
--- /dev/null
+++ b/spec/components/admin/budget_investments/toggle_selection_component_spec.rb
@@ -0,0 +1,64 @@
+require "rails_helper"
+
+describe Admin::BudgetInvestments::ToggleSelectionComponent, :admin do
+ context "open budget" do
+ let(:budget) { create(:budget) }
+
+ it "is not rendered for not-yet-evaluated investments" do
+ unfeasible_investment = create(:budget_investment, :unfeasible, budget: budget)
+ feasible_investment = create(:budget_investment, :feasible, budget: budget)
+
+ render_inline Admin::BudgetInvestments::ToggleSelectionComponent.new(unfeasible_investment)
+ expect(page).not_to be_rendered
+
+ render_inline Admin::BudgetInvestments::ToggleSelectionComponent.new(feasible_investment)
+ expect(page).not_to be_rendered
+ end
+
+ it "renders a link to select unselected evaluated investments" do
+ valuation_finished_investment = create(:budget_investment, :feasible, :finished, budget: budget)
+
+ render_inline Admin::BudgetInvestments::ToggleSelectionComponent.new(valuation_finished_investment)
+
+ expect(page).to have_link "Select"
+ expect(page).not_to have_link "Selected"
+ end
+
+ it "renders a link to deselect selected investments" do
+ selected_investment = create(:budget_investment, :selected, budget: budget)
+
+ render_inline Admin::BudgetInvestments::ToggleSelectionComponent.new(selected_investment)
+
+ expect(page).to have_link "Selected"
+ expect(page).not_to have_link "Select"
+ end
+ end
+
+ context "finished budget" do
+ let(:budget) { create(:budget, :finished) }
+
+ it "is not rendered for unselected investments" do
+ unfeasible_investment = create(:budget_investment, :unfeasible, budget: budget)
+ feasible_investment = create(:budget_investment, :feasible, budget: budget)
+ valuation_finished_investment = create(:budget_investment, :feasible, :finished, budget: budget)
+
+ render_inline Admin::BudgetInvestments::ToggleSelectionComponent.new(unfeasible_investment)
+ expect(page).not_to be_rendered
+
+ render_inline Admin::BudgetInvestments::ToggleSelectionComponent.new(feasible_investment)
+ expect(page).not_to be_rendered
+
+ render_inline Admin::BudgetInvestments::ToggleSelectionComponent.new(valuation_finished_investment)
+ expect(page).not_to be_rendered
+ end
+
+ it "renders plain text for selected investments" do
+ selected_investment = create(:budget_investment, :selected, budget: budget)
+
+ render_inline Admin::BudgetInvestments::ToggleSelectionComponent.new(selected_investment)
+
+ expect(page).to have_content "Selected"
+ expect(page).not_to have_link "Selected"
+ end
+ end
+end
diff --git a/spec/system/admin/budget_investments_spec.rb b/spec/system/admin/budget_investments_spec.rb
index 1a5a16a89..69f0023bf 100644
--- a/spec/system/admin/budget_investments_spec.rb
+++ b/spec/system/admin/budget_investments_spec.rb
@@ -43,21 +43,6 @@ describe "Admin budget investments", :admin do
expect(page).not_to have_content("€")
end
- scenario "If budget is finished do not show 'Selected' button" do
- finished_budget = create(:budget, :finished)
- budget_investment = create(:budget_investment, budget: finished_budget, cached_votes_up: 77)
-
- visit admin_budget_budget_investments_path(budget_id: finished_budget.id)
-
- within("#budget_investment_#{budget_investment.id}") do
- expect(page).to have_content(budget_investment.title)
- expect(page).to have_content(budget_investment.heading.name)
- expect(page).to have_content(budget_investment.id)
- expect(page).to have_content(budget_investment.total_votes)
- expect(page).not_to have_link("Selected")
- end
- end
-
scenario "Display admin and valuator assignments" do
olga = create(:user, username: "Olga")
miriam = create(:user, username: "Miriam")
@@ -1422,56 +1407,6 @@ describe "Admin budget investments", :admin do
expect(page).not_to have_content(feasible_vf_bi.title)
end
- scenario "Showing the selection buttons" do
- visit admin_budget_budget_investments_path(budget)
-
- within("#budget_investment_#{unfeasible_bi.id}") do
- expect(page).not_to have_link("Select")
- expect(page).not_to have_link("Selected")
- end
-
- within("#budget_investment_#{feasible_bi.id}") do
- expect(page).not_to have_link("Select")
- expect(page).not_to have_link("Selected")
- end
-
- within("#budget_investment_#{feasible_vf_bi.id}") do
- expect(page).to have_link("Select")
- expect(page).not_to have_link("Selected")
- end
-
- within("#budget_investment_#{selected_bi.id}") do
- expect(page).not_to have_link("Select")
- expect(page).to have_link("Selected")
- end
- end
-
- scenario "Show only selected text when budget is finished" do
- budget.update!(phase: "finished")
-
- visit admin_budget_budget_investments_path(budget)
-
- within("#budget_investment_#{unfeasible_bi.id} [data-field=selected]") do
- expect(page).not_to have_content("Select")
- expect(page).not_to have_content("Selected")
- end
-
- within("#budget_investment_#{feasible_bi.id} [data-field=selected]") do
- expect(page).not_to have_content("Select")
- expect(page).not_to have_content("Selected")
- end
-
- within("#budget_investment_#{feasible_vf_bi.id} [data-field=selected]") do
- expect(page).not_to have_content("Select")
- expect(page).not_to have_content("Selected")
- end
-
- within("#budget_investment_#{selected_bi.id} [data-field=selected]") do
- expect(page).not_to contain_exactly("Select")
- expect(page).to have_content("Selected")
- end
- end
-
scenario "Selecting an investment" do
visit admin_budget_budget_investments_path(budget)