diff --git a/app/controllers/schemes_controller.rb b/app/controllers/schemes_controller.rb
index 7edd7ecd8..9c5e4dcc5 100644
--- a/app/controllers/schemes_controller.rb
+++ b/app/controllers/schemes_controller.rb
@@ -79,6 +79,10 @@ class SchemesController < ApplicationController
render "schemes/check_answers"
end
+ def edit_name
+ render "schemes/edit_name"
+ end
+
private
def confirm_secondary_page?(page)
@@ -97,6 +101,8 @@ private
new_location_path
when "details"
scheme_primary_client_group_path(@scheme)
+ when "edit-name"
+ scheme_path(@scheme)
end
end
@@ -132,7 +138,7 @@ private
def authenticate_scope!
head :unauthorized and return unless current_user.data_coordinator? || current_user.support?
- if %w[show locations primary_client_group confirm_secondary_client_group secondary_client_group support details check_answers].include?(action_name) && !((current_user.organisation == @scheme.owning_organisation) || current_user.support?)
+ if %w[show locations primary_client_group confirm_secondary_client_group secondary_client_group support details check_answers edit_name].include?(action_name) && !((current_user.organisation == @scheme.owning_organisation) || current_user.support?)
render_not_found and return
end
end
diff --git a/app/models/scheme.rb b/app/models/scheme.rb
index 9dc9c62a0..13f090797 100644
--- a/app/models/scheme.rb
+++ b/app/models/scheme.rb
@@ -130,9 +130,9 @@ class Scheme < ApplicationRecord
def display_attributes
[
{ name: "Service code", value: id_to_display },
- { name: "Name", value: service_name },
- { name: "Confidential information", value: sensitive },
- { name: "Housing stock owned by", value: owning_organisation.name },
+ { name: "Name", value: service_name, edit: true },
+ { name: "Confidential information", value: sensitive, edit: true },
+ { name: "Housing stock owned by", value: owning_organisation.name, edit: true },
{ name: "Managed by", value: managing_organisation&.name },
{ name: "Type of scheme", value: scheme_type },
{ name: "Registered under Care Standards Act 2000", value: registered_under_care_act },
diff --git a/app/views/schemes/details.html.erb b/app/views/schemes/details.html.erb
index 229165fd4..b59f4ce37 100644
--- a/app/views/schemes/details.html.erb
+++ b/app/views/schemes/details.html.erb
@@ -18,12 +18,15 @@
label: { text: "Scheme name", size: "m" },
hint: { text: "This is how you’ll refer to this supported housing scheme within your organisation. For example, the name could relate to the address or location. You’ll be able to see the client group when selecting it." } %>
- <%= f.govuk_check_box :sensitive,
- 1,
- 0,
- checked: @scheme.sensitive?,
- multiple: false,
- label: { text: "This scheme contains confidential information" } %>
+ <%= f.govuk_check_boxes_fieldset :sensitive,
+ legend: nil do %>
+ <%= f.govuk_check_box :sensitive,
+ 1,
+ 0,
+ multiple: false,
+ checked: @scheme.sensitive == "Yes",
+ label: { text: "This scheme contains confidential information" } %>
+ <% end %>
<% null_option = [OpenStruct.new(id: "", name: "Select an option")] %>
<% organisations = Organisation.all.map { |org| OpenStruct.new(id: org.id, name: org.name) } %>
diff --git a/app/views/schemes/edit_name.html.erb b/app/views/schemes/edit_name.html.erb
new file mode 100644
index 000000000..d967c24a2
--- /dev/null
+++ b/app/views/schemes/edit_name.html.erb
@@ -0,0 +1,47 @@
+<% content_for :title, "Scheme details" %>
+
+ <% content_for :before_content do %>
+ <%= govuk_back_link(
+ text: "Back",
+ href: :back,
+ ) %>
+ <% end %>
+
+ <%= render partial: "organisations/headings", locals: { main: "Scheme details", sub: @scheme.service_name } %>
+
+ <%= form_for(@scheme, method: :patch) do |f| %>
+
+
+ <%= f.govuk_error_summary %>
+
+ <%= f.govuk_text_field :service_name,
+ label: { text: "Scheme name", size: "m" },
+ hint: { text: "This is how you’ll refer to this supported housing scheme within your organisation. For example, the name could relate to the address or location. You’ll be able to see the client group when selecting it." } %>
+
+ <%= f.govuk_check_boxes_fieldset :sensitive,
+ legend: nil do %>
+ <%= f.govuk_check_box :sensitive,
+ 1,
+ 0,
+ multiple: false,
+ checked: @scheme.sensitive == "Yes",
+ label: { text: "This scheme contains confidential information" } %>
+ <% end %>
+
+ <% organisations = Organisation.all.map { |org| OpenStruct.new(id: org.id, name: org.name) } %>
+
+ <% if current_user.support? %>
+ <%= f.govuk_collection_select :owning_organisation_id,
+ organisations,
+ :id,
+ :name,
+ label: { text: "Which organisation owns the housing stock for this scheme?", size: "m" },
+ "data-controller": %w[accessible-autocomplete conditional-filter] %>
+ <% end %>
+
+ <%= f.hidden_field :page, value: "edit-name" %>
+
+ <%= f.govuk_submit "Save changes" %>
+
+
+ <% end %>
diff --git a/app/views/schemes/new.html.erb b/app/views/schemes/new.html.erb
index f4cbc2827..b58e461c0 100644
--- a/app/views/schemes/new.html.erb
+++ b/app/views/schemes/new.html.erb
@@ -20,11 +20,14 @@
label: { text: "Scheme name", size: "m" },
hint: { text: "This is how you refer to this supported housing scheme within your organisation. For example, the name could relate to the address or location. You’ll be able to see the client group when selecting it." } %>
- <%= f.govuk_check_box :sensitive,
- "Yes",
- checked: @scheme.sensitive?,
- multiple: false,
- label: { text: "This scheme contains confidential information" } %>
+ <%= f.govuk_check_boxes_fieldset :sensitive,
+ legend: nil do %>
+ <%= f.govuk_check_box :sensitive,
+ 1,
+ 0,
+ multiple: false,
+ label: { text: "This scheme contains confidential information" } %>
+ <% end %>
<% null_option = [OpenStruct.new(id: "", name: "Select an option")] %>
<% organisations = Organisation.all.map { |org| OpenStruct.new(id: org.id, name: org.name) } %>
diff --git a/app/views/schemes/show.html.erb b/app/views/schemes/show.html.erb
index e9cbc909f..dab90cd8a 100644
--- a/app/views/schemes/show.html.erb
+++ b/app/views/schemes/show.html.erb
@@ -16,9 +16,11 @@
<%= govuk_summary_list do |summary_list| %>
<% @scheme.display_attributes.each do |attr| %>
+ <% next if current_user.data_coordinator? && attr[:name] == ("Housing stock owned by") %>
<%= summary_list.row do |row| %>
<% row.key { attr[:name].eql?("Registered under Care Standards Act 2000") ? "Registered under Care Standards Act 2000" : attr[:name].to_s.humanize } %>
<% row.value { details_html(attr) } %>
+ <% row.action(text: "Change", href: scheme_edit_name_path(scheme_id: @scheme.id)) if attr[:edit] %>
<% end %>
<% end %>
<% end %>
diff --git a/config/routes.rb b/config/routes.rb
index a643f2ab4..7b18a6fce 100644
--- a/config/routes.rb
+++ b/config/routes.rb
@@ -42,6 +42,7 @@ Rails.application.routes.draw do
get "support", to: "schemes#support"
get "details", to: "schemes#details"
get "check-answers", to: "schemes#check_answers"
+ get "edit-name", to: "schemes#edit_name"
member do
resources :locations
diff --git a/spec/features/schemes_spec.rb b/spec/features/schemes_spec.rb
index 6408bbf68..5999d09a0 100644
--- a/spec/features/schemes_spec.rb
+++ b/spec/features/schemes_spec.rb
@@ -665,5 +665,64 @@ RSpec.describe "Schemes scheme Features" do
end
end
end
+
+ context "when editing a scheme" do
+ context "when I visit schemes page" do
+ before do
+ visit("schemes")
+ end
+
+ it "shows list of links to schemes" do
+ schemes.each do |scheme|
+ expect(page).to have_link(scheme.service_name)
+ expect(page).to have_content(scheme.primary_client_group)
+ end
+ end
+
+ context "when I click to see individual scheme" do
+ let(:scheme) { schemes.first }
+
+ before do
+ click_link(scheme.service_name)
+ end
+
+ it "shows me details about the selected scheme" do
+ expect(page).to have_content(schemes.first.id_to_display)
+ expect(page).to have_content(schemes.first.service_name)
+ expect(page).to have_content(schemes.first.sensitive)
+ expect(page).to have_content(schemes.first.scheme_type)
+ expect(page).to have_content(schemes.first.registered_under_care_act)
+ expect(page).to have_content(schemes.first.primary_client_group)
+ expect(page).to have_content(schemes.first.secondary_client_group)
+ expect(page).to have_content(schemes.first.support_type)
+ expect(page).to have_content(schemes.first.intended_stay)
+ end
+
+ context "when I click to change scheme name" do
+ before do
+ click_link("Change", href: "/schemes/#{scheme.id}/edit-name", match: :first)
+ end
+
+ it "shows available fields to edit" do
+ expect(page).to have_current_path("/schemes/#{scheme.id}/edit-name")
+ expect(page).to have_content "Scheme details"
+ end
+
+ context "when I edit details" do
+ before do
+ fill_in "Scheme name", with: "FooBar"
+ check "This scheme contains confidential information"
+ click_button "Save changes"
+ end
+
+ it "lets me see amended details on the show page" do
+ expect(page).to have_content "FooBar"
+ expect(page).to have_current_path("/schemes/#{scheme.id}")
+ end
+ end
+ end
+ end
+ end
+ end
end
end
diff --git a/spec/requests/schemes_controller_spec.rb b/spec/requests/schemes_controller_spec.rb
index 0f7ef59a5..2d92c7385 100644
--- a/spec/requests/schemes_controller_spec.rb
+++ b/spec/requests/schemes_controller_spec.rb
@@ -213,7 +213,6 @@ RSpec.describe SchemesController, type: :request do
get "/schemes/#{specific_scheme.id}"
expect(page).to have_content(specific_scheme.id_to_display)
expect(page).to have_content(specific_scheme.service_name)
- expect(page).to have_content(specific_scheme.owning_organisation.name)
expect(page).to have_content(specific_scheme.sensitive)
expect(page).to have_content(specific_scheme.id_to_display)
expect(page).to have_content(specific_scheme.service_name)
@@ -615,6 +614,22 @@ RSpec.describe SchemesController, type: :request do
end
end
end
+
+ context "when editing scheme name details" do
+ let(:params) { { scheme: { service_name: "testy", sensitive: "1", page: "edit-name" } } }
+
+ it "renders scheme show page after successful update" do
+ follow_redirect!
+ expect(response).to have_http_status(:ok)
+ expect(page).to have_content(scheme_to_update.reload.service_name)
+ end
+
+ it "updates a scheme with valid params" do
+ follow_redirect!
+ expect(scheme_to_update.reload.service_name).to eq("testy")
+ expect(scheme_to_update.reload.sensitive).to eq("Yes")
+ end
+ end
end
context "when signed in as a support" do
@@ -810,6 +825,29 @@ RSpec.describe SchemesController, type: :request do
end
end
end
+
+ context "when editing scheme name details" do
+ let(:another_organisation) { FactoryBot.create(:organisation) }
+ let(:params) do
+ { scheme: { service_name: "testy",
+ sensitive: "1",
+ page: "edit-name",
+ owning_organisation_id: another_organisation.id } }
+ end
+
+ it "renders scheme show page after successful update" do
+ follow_redirect!
+ expect(response).to have_http_status(:ok)
+ expect(page).to have_content(scheme_to_update.reload.service_name)
+ expect(scheme_to_update.reload.owning_organisation_id).to eq(another_organisation.id)
+ end
+
+ it "updates a scheme with valid params" do
+ follow_redirect!
+ expect(scheme_to_update.reload.service_name).to eq("testy")
+ expect(scheme_to_update.reload.sensitive).to eq("Yes")
+ end
+ end
end
end
@@ -1208,4 +1246,74 @@ RSpec.describe SchemesController, type: :request do
end
end
end
+
+ describe "#edit_name" do
+ context "when not signed in" do
+ it "redirects to the sign in page" do
+ get "/schemes/1/edit-name"
+ expect(response).to redirect_to("/account/sign-in")
+ end
+ end
+
+ context "when signed in as a data provider" do
+ let(:user) { FactoryBot.create(:user) }
+
+ before do
+ sign_in user
+ get "/schemes/1/edit-name"
+ end
+
+ it "returns 401 unauthorized" do
+ request
+ expect(response).to have_http_status(:unauthorized)
+ end
+ end
+
+ context "when signed in as a data coordinator" do
+ let(:user) { FactoryBot.create(:user, :data_coordinator) }
+ let!(:scheme) { FactoryBot.create(:scheme, owning_organisation: user.organisation) }
+ let!(:another_scheme) { FactoryBot.create(:scheme) }
+
+ before do
+ sign_in user
+ get "/schemes/#{scheme.id}/edit-name"
+ end
+
+ it "returns a template for a edit-name" do
+ expect(response).to have_http_status(:ok)
+ expect(page).to have_content("Scheme details")
+ expect(page).to have_content("This scheme contains confidential information")
+ expect(page).not_to have_content("Which organisation owns the housing stock for this scheme?")
+ end
+
+ context "when attempting to access secondary-client-group scheme page for another organisation" do
+ before do
+ get "/schemes/#{another_scheme.id}/edit-name"
+ end
+
+ it "returns 404 not_found" do
+ request
+ expect(response).to have_http_status(:not_found)
+ end
+ end
+ end
+
+ context "when signed in as a support user" do
+ let(:user) { FactoryBot.create(:user, :support) }
+ let!(:scheme) { FactoryBot.create(:scheme) }
+
+ before do
+ allow(user).to receive(:need_two_factor_authentication?).and_return(false)
+ sign_in user
+ get "/schemes/#{scheme.id}/edit-name"
+ end
+
+ it "returns a template for a secondary-client-group" do
+ expect(response).to have_http_status(:ok)
+ expect(page).to have_content("Scheme details")
+ expect(page).to have_content("This scheme contains confidential information")
+ expect(page).to have_content("Which organisation owns the housing stock for this scheme?")
+ end
+ end
+ end
end