From 7b1821fc9bdc2077ffee73b7cc13caab684b631f Mon Sep 17 00:00:00 2001 From: taitus Date: Mon, 18 Jan 2021 11:44:16 +0100 Subject: [PATCH] Prepare relatable concern and relations controller Allow send Goals and Targets from edit component input field --- .../relations/edit_component.html.erb | 2 +- .../sdg_management/relations_controller.rb | 2 +- app/models/concerns/sdg/relatable.rb | 14 +++-- config/locales/en/activerecord.yml | 2 +- config/locales/es/activerecord.yml | 2 +- spec/models/sdg/relatable_spec.rb | 51 ++++++++++++++----- 6 files changed, 53 insertions(+), 20 deletions(-) diff --git a/app/components/sdg_management/relations/edit_component.html.erb b/app/components/sdg_management/relations/edit_component.html.erb index 807a4a2dc..c13a15f86 100644 --- a/app/components/sdg_management/relations/edit_component.html.erb +++ b/app/components/sdg_management/relations/edit_component.html.erb @@ -1,7 +1,7 @@ <%= header %> <%= form_for record, url: update_path do |f| %> - <%= f.text_field :sdg_target_list %> + <%= f.text_field :sdg_related_list %> <%= f.submit %> <% end %> diff --git a/app/controllers/sdg_management/relations_controller.rb b/app/controllers/sdg_management/relations_controller.rb index fb4b8a899..b9aab6c23 100644 --- a/app/controllers/sdg_management/relations_controller.rb +++ b/app/controllers/sdg_management/relations_controller.rb @@ -21,7 +21,7 @@ class SDGManagement::RelationsController < SDGManagement::BaseController end def update - @record.sdg_target_list = params[@record.class.table_name.singularize][:sdg_target_list] + @record.sdg_related_list = params[@record.class.table_name.singularize][:sdg_related_list] redirect_to({ action: :index }, notice: update_notice) end diff --git a/app/models/concerns/sdg/relatable.rb b/app/models/concerns/sdg/relatable.rb index 5844a8708..06a29c437 100644 --- a/app/models/concerns/sdg/relatable.rb +++ b/app/models/concerns/sdg/relatable.rb @@ -50,12 +50,20 @@ module SDG::Relatable sdg_targets.sort.map(&:code).join(", ") end - def sdg_target_list=(codes) - targets = codes.tr(" ", "").split(",").map { |code| SDG::Target[code] } + def sdg_related_list + sdg_goals.order(:code).map do |goal| + [goal, sdg_targets.where(goal: goal).sort] + end.flatten.map(&:code).join(", ") + end + + def sdg_related_list=(codes) + target_codes, goal_codes = codes.tr(" ", "").split(",").partition { |code| code.include?(".") } + targets = target_codes.map { |code| SDG::Target[code] } + goals = goal_codes.map { |code| SDG::Goal[code] } transaction do self.sdg_targets = targets - self.sdg_goals = targets.map(&:goal).uniq + self.sdg_goals = (targets.map(&:goal) + goals).uniq end end end diff --git a/config/locales/en/activerecord.yml b/config/locales/en/activerecord.yml index eae5e99a0..912b42972 100644 --- a/config/locales/en/activerecord.yml +++ b/config/locales/en/activerecord.yml @@ -2,7 +2,7 @@ en: attributes: geozone_id: "Scope of operation" results_enabled: "Show results" - sdg_target_list: "Targets" + sdg_related_list: "Sustainable Development Goals and 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 788576928..1a4785fc0 100644 --- a/config/locales/es/activerecord.yml +++ b/config/locales/es/activerecord.yml @@ -2,7 +2,7 @@ es: attributes: geozone_id: "Ámbito de actuación" results_enabled: "Mostrar resultados" - sdg_target_list: "Metas" + sdg_related_list: "Objetivos de Desarrollo Sostenible y Metas" stats_enabled: "Mostrar estadísticas" advanced_stats_enabled: "Mostrar estadísticas avanzadas" name: Nombre diff --git a/spec/models/sdg/relatable_spec.rb b/spec/models/sdg/relatable_spec.rb index 269fb6efe..965d1a394 100644 --- a/spec/models/sdg/relatable_spec.rb +++ b/spec/models/sdg/relatable_spec.rb @@ -80,6 +80,15 @@ describe SDG::Relatable do end end + describe "#sdg_related_list" do + it "orders related list by code" do + relatable.sdg_goals = [SDG::Goal[1], SDG::Goal[3], SDG::Goal[2]] + relatable.sdg_targets = [SDG::Target[2.2], SDG::Target[1.2], SDG::Target[2.1]] + + expect(relatable.sdg_related_list).to eq "1, 1.2, 2, 2.1, 2.2, 3" + end + end + describe "#related_sdgs" do it "returns all related goals and targets" do relatable.sdg_goals = [goal, another_goal] @@ -91,29 +100,45 @@ describe SDG::Relatable do end end - describe "#sdg_target_list=" do - it "assigns a single target" do - relatable.sdg_target_list = "1.1" + describe "#sdg_related_list=" do + it "assigns a single goal" do + relatable.sdg_related_list = "1" - expect(relatable.reload.sdg_targets).to match_array [SDG::Target["1.1"]] + expect(relatable.reload.sdg_goals).to match_array [SDG::Goal[1]] + end + + it "assigns a single target" do + relatable.sdg_related_list = "1.1" + + expect(relatable.reload.sdg_goals).to match_array [SDG::Goal[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" + relatable.sdg_related_list = "1.1,2.3" - expect(relatable.reload.sdg_targets).to match_array [SDG::Target["1.1"], SDG::Target["2.3"]] + expect(relatable.reload.sdg_goals).to match_array [SDG::Goal[1], SDG::Goal[2]] + expect(relatable.reload.sdg_targets).to match_array [SDG::Target[1.1], SDG::Target[2.3]] + end + + it "assigns multiple goals" do + relatable.sdg_related_list = "3,2,1" + + expect(relatable.reload.sdg_goals).to match_array [SDG::Goal[1], SDG::Goal[2], SDG::Goal[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" + relatable.sdg_related_list = " 1.1, 2.3 " expect(relatable.reload.sdg_goals).to match_array [SDG::Goal[1], SDG::Goal[2]] + expect(relatable.reload.sdg_targets).to match_array [SDG::Target[1.1], SDG::Target[2.3]] + end + + it "assigns goals and targets" do + relatable.sdg_related_list = "1.1,3,4,4.1" + + expect(relatable.reload.sdg_goals).to match_array [SDG::Goal[1], SDG::Goal[3], SDG::Goal[4]] + expect(relatable.reload.sdg_targets).to match_array [SDG::Target[1.1], SDG::Target[4.1]] end end