From f76279a4dd448675c5782fdf6999ca38d8f3c44c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Javi=20Mart=C3=ADn?= Date: Wed, 25 Nov 2020 12:02:03 +0100 Subject: [PATCH] Add form to assign targets to a record --- .../relations/edit_component.html.erb | 7 +++++ .../relations/edit_component.rb | 24 +++++++++++++++++ .../sdg_management/relations_controller.rb | 13 +++++++++- app/models/concerns/sdg/relatable.rb | 9 +++++++ .../sdg_management/relations/edit.html.erb | 2 +- config/locales/en/activerecord.yml | 1 + config/locales/es/activerecord.yml | 1 + config/routes/sdg_management.rb | 1 + spec/models/sdg/relatable_spec.rb | 26 +++++++++++++++++++ spec/system/sdg_management/relations_spec.rb | 15 +++++++++++ 10 files changed, 97 insertions(+), 2 deletions(-) create mode 100644 app/components/sdg_management/relations/edit_component.html.erb create mode 100644 app/components/sdg_management/relations/edit_component.rb diff --git a/app/components/sdg_management/relations/edit_component.html.erb b/app/components/sdg_management/relations/edit_component.html.erb new file mode 100644 index 000000000..807a4a2dc --- /dev/null +++ b/app/components/sdg_management/relations/edit_component.html.erb @@ -0,0 +1,7 @@ +<%= header %> + +<%= form_for record, url: update_path do |f| %> + <%= f.text_field :sdg_target_list %> + + <%= f.submit %> +<% end %> diff --git a/app/components/sdg_management/relations/edit_component.rb b/app/components/sdg_management/relations/edit_component.rb new file mode 100644 index 000000000..b0dc3b7df --- /dev/null +++ b/app/components/sdg_management/relations/edit_component.rb @@ -0,0 +1,24 @@ +class SDGManagement::Relations::EditComponent < ApplicationComponent + include Header + + attr_reader :record + + def initialize(record) + @record = record + end + + private + + def title + @record.title + end + + def update_path + { + controller: "sdg_management/relations", + action: :update, + relatable_type: record.class.name.tableize, + id: record + } + end +end diff --git a/app/controllers/sdg_management/relations_controller.rb b/app/controllers/sdg_management/relations_controller.rb index a0edec379..4f6ab77e6 100644 --- a/app/controllers/sdg_management/relations_controller.rb +++ b/app/controllers/sdg_management/relations_controller.rb @@ -1,14 +1,25 @@ class SDGManagement::RelationsController < SDGManagement::BaseController + before_action :load_record, only: [:edit, :update] + def index @records = relatable_class.accessible_by(current_ability).order(:id).page(params[:page]) end def edit - @record = relatable_class.find(params[:id]) + end + + def update + @record.sdg_target_list = params[@record.class.table_name.singularize][:sdg_target_list] + + redirect_to action: :index end private + def load_record + @record = relatable_class.find(params[:id]) + end + def relatable_class params[:relatable_type].classify.constantize end diff --git a/app/models/concerns/sdg/relatable.rb b/app/models/concerns/sdg/relatable.rb index 64b75f672..50f9b0183 100644 --- a/app/models/concerns/sdg/relatable.rb +++ b/app/models/concerns/sdg/relatable.rb @@ -23,4 +23,13 @@ module SDG::Relatable def sdg_target_list sdg_targets.sort.map(&:code).join(", ") end + + def sdg_target_list=(codes) + targets = codes.tr(" ", "").split(",").map { |code| SDG::Target[code] } + + transaction do + self.sdg_targets = targets + self.sdg_goals = targets.map(&:goal).uniq + end + end end diff --git a/app/views/sdg_management/relations/edit.html.erb b/app/views/sdg_management/relations/edit.html.erb index d916f0721..4092359d7 100644 --- a/app/views/sdg_management/relations/edit.html.erb +++ b/app/views/sdg_management/relations/edit.html.erb @@ -1 +1 @@ -

<%= @record.title %>

+<%= render SDGManagement::Relations::EditComponent.new(@record) %> diff --git a/config/locales/en/activerecord.yml b/config/locales/en/activerecord.yml index 01c79fc57..84264fbce 100644 --- a/config/locales/en/activerecord.yml +++ b/config/locales/en/activerecord.yml @@ -2,6 +2,7 @@ en: attributes: geozone_id: "Scope of operation" results_enabled: "Show results" + sdg_target_list: "Targets" stats_enabled: "Show stats" advanced_stats_enabled: "Show advanced stats" name: Name diff --git a/config/locales/es/activerecord.yml b/config/locales/es/activerecord.yml index 0c736934a..d59c643c4 100644 --- a/config/locales/es/activerecord.yml +++ b/config/locales/es/activerecord.yml @@ -2,6 +2,7 @@ es: attributes: geozone_id: "Ámbito de actuación" results_enabled: "Mostrar resultados" + sdg_target_list: "Metas" stats_enabled: "Mostrar estadísticas" advanced_stats_enabled: "Mostrar estadísticas avanzadas" name: Nombre diff --git a/config/routes/sdg_management.rb b/config/routes/sdg_management.rb index 5e8561784..6f303b45c 100644 --- a/config/routes/sdg_management.rb +++ b/config/routes/sdg_management.rb @@ -10,6 +10,7 @@ namespace :sdg_management do get "*relatable_type", to: "relations#index", as: "relations", relatable_type: types_constraint get "*relatable_type/:id/edit", to: "relations#edit", as: "edit_relation", relatable_type: types_constraint + patch "*relatable_type/:id", to: "relations#update", as: "relation", relatable_type: types_constraint types.each do |type| get type, to: "relations#index", as: type diff --git a/spec/models/sdg/relatable_spec.rb b/spec/models/sdg/relatable_spec.rb index 595ecad61..d161d4ddb 100644 --- a/spec/models/sdg/relatable_spec.rb +++ b/spec/models/sdg/relatable_spec.rb @@ -90,4 +90,30 @@ describe SDG::Relatable do expect(relatable.reload.related_sdgs).to match_array related_sdgs end end + + describe "#sdg_target_list=" do + it "assigns a single target" do + relatable.sdg_target_list = "1.1" + + expect(relatable.reload.sdg_targets).to match_array [SDG::Target["1.1"]] + end + + it "assigns multiple targets" do + relatable.sdg_target_list = "1.1,2.3" + + expect(relatable.reload.sdg_targets).to match_array [SDG::Target["1.1"], SDG::Target["2.3"]] + end + + it "ignores trailing spaces and spaces between commas" do + relatable.sdg_target_list = " 1.1, 2.3 " + + expect(relatable.reload.sdg_targets).to match_array [SDG::Target["1.1"], SDG::Target["2.3"]] + end + + it "assigns goals" do + relatable.sdg_target_list = "1.1,1.2,2.3" + + expect(relatable.reload.sdg_goals).to match_array [SDG::Goal[1], SDG::Goal[2]] + end + end end diff --git a/spec/system/sdg_management/relations_spec.rb b/spec/system/sdg_management/relations_spec.rb index f4a405f9f..af598c6c0 100644 --- a/spec/system/sdg_management/relations_spec.rb +++ b/spec/system/sdg_management/relations_spec.rb @@ -83,4 +83,19 @@ describe "SDG Relations", :js do expect(page).to have_css "h2", exact_text: "Build a hospital" end end + + describe "Edit" do + scenario "allows changing the targets" do + process = create(:legislation_process, title: "SDG process") + process.sdg_targets = [SDG::Target["3.3"]] + + visit sdg_management_edit_legislation_process_path(process) + fill_in "Targets", with: "1.2, 2.1" + click_button "Update Process" + + within("tr", text: "SDG process") do + expect(page).to have_css "td", exact_text: "1.2, 2.1" + end + end + end end