diff --git a/app/controllers/admin/budget_investments_controller.rb b/app/controllers/admin/budget_investments_controller.rb
index 8f0fa3dca..a55c04a01 100644
--- a/app/controllers/admin/budget_investments_controller.rb
+++ b/app/controllers/admin/budget_investments_controller.rb
@@ -39,16 +39,25 @@ class Admin::BudgetInvestmentsController < Admin::BaseController
def update
authorize! :admin_update, @investment
- if @investment.update(budget_investment_params)
- redirect_to admin_budget_budget_investment_path(@budget,
- @investment,
- Budget::Investment.filter_params(params).to_h),
- notice: t("flash.actions.update.budget_investment")
- else
- load_staff
- load_valuator_groups
- load_tags
- render :edit
+
+ respond_to do |format|
+ format.html do
+ if @investment.update(budget_investment_params)
+ redirect_to admin_budget_budget_investment_path(@budget,
+ @investment,
+ Budget::Investment.filter_params(params).to_h),
+ notice: t("flash.actions.update.budget_investment")
+ else
+ load_staff
+ load_valuator_groups
+ load_tags
+ render :edit
+ end
+ end
+
+ format.json do
+ @investment.update!(budget_investment_params)
+ end
end
end
diff --git a/app/views/admin/budget_investments/_select_investment.html.erb b/app/views/admin/budget_investments/_select_investment.html.erb
index 698aab1dc..320abc579 100644
--- a/app/views/admin/budget_investments/_select_investment.html.erb
+++ b/app/views/admin/budget_investments/_select_investment.html.erb
@@ -51,11 +51,15 @@
- <%= form_for [:admin, investment.budget, investment], remote: true do |f| %>
- <%= f.check_box :visible_to_valuators,
- label: false,
- class: "js-submit-on-change",
- id: "budget_investment_visible_to_valuators" %>
+ <% if can?(:admin_update, investment) %>
+ <%= form_for [:admin, investment.budget, investment], remote: true, format: :json do |f| %>
+ <%= f.check_box :visible_to_valuators,
+ label: false,
+ class: "js-submit-on-change",
+ id: "budget_investment_visible_to_valuators" %>
+ <% end %>
+ <% else %>
+ <%= investment.visible_to_valuators? ? t("shared.yes") : t("shared.no") %>
<% end %>
|
diff --git a/spec/controllers/admin/budget_investments_controller_spec.rb b/spec/controllers/admin/budget_investments_controller_spec.rb
new file mode 100644
index 000000000..3d0c1fddc
--- /dev/null
+++ b/spec/controllers/admin/budget_investments_controller_spec.rb
@@ -0,0 +1,19 @@
+require "rails_helper"
+
+describe Admin::BudgetInvestmentsController do
+ describe "PATCH update" do
+ it "does not redirect on AJAX requests" do
+ investment = create(:budget_investment)
+ sign_in(create(:administrator).user)
+
+ patch :update, params: {
+ id: investment,
+ budget_id: investment.budget,
+ format: :json,
+ budget_investment: { visible_to_valuators: true }
+ }
+
+ expect(response).not_to be_redirect
+ end
+ end
+end
diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb
index 5a775065f..1996c2bb1 100644
--- a/spec/spec_helper.rb
+++ b/spec/spec_helper.rb
@@ -14,6 +14,7 @@ RSpec.configure do |config|
config.run_all_when_everything_filtered = true
config.include RequestSpecHelper, type: :request
config.include Devise::Test::ControllerHelpers, type: :controller
+ config.include Devise::Test::ControllerHelpers, type: :view
config.include FactoryBot::Syntax::Methods
config.include(EmailSpec::Helpers)
config.include(EmailSpec::Matchers)
diff --git a/spec/system/admin/budget_investments_spec.rb b/spec/system/admin/budget_investments_spec.rb
index ec8d4c9ec..165b15aea 100644
--- a/spec/system/admin/budget_investments_spec.rb
+++ b/spec/system/admin/budget_investments_spec.rb
@@ -1651,6 +1651,28 @@ describe "Admin budget investments" do
end
end
+ scenario "Cannot mark/unmark visible to valuators on finished budgets" do
+ budget.update!(phase: "finished")
+ create(:budget_investment, budget: budget, title: "Visible", visible_to_valuators: true)
+ create(:budget_investment, budget: budget, title: "Invisible", visible_to_valuators: false)
+
+ visit admin_budget_budget_investments_path(budget)
+
+ within "tr", text: "Visible" do
+ within "td[data-field=visible_to_valuators]" do
+ expect(page).to have_text "Yes"
+ expect(page).not_to have_field "budget_investment_visible_to_valuators"
+ end
+ end
+
+ within "tr", text: "Invisible" do
+ within "td[data-field=visible_to_valuators]" do
+ expect(page).to have_text "No"
+ expect(page).not_to have_field "budget_investment_visible_to_valuators"
+ end
+ end
+ end
+
scenario "Showing the valuating checkbox" do
investment1 = create(:budget_investment, :with_administrator, :with_valuator, :visible_to_valuators,
budget: budget)
diff --git a/spec/views/admin/budget_investments/select_investment_spec.rb b/spec/views/admin/budget_investments/select_investment_spec.rb
new file mode 100644
index 000000000..e04c6dd8f
--- /dev/null
+++ b/spec/views/admin/budget_investments/select_investment_spec.rb
@@ -0,0 +1,13 @@
+require "rails_helper"
+
+describe "investment row" do
+ it "uses a JSON request to update visible to valuators" do
+ investment = create(:budget_investment)
+ @budget = investment.budget
+ sign_in(create(:administrator).user)
+
+ render "admin/budget_investments/select_investment", investment: investment
+
+ expect(rendered).to have_css "form[action$='json'] input[name$='[visible_to_valuators]']"
+ end
+end