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)