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