diff --git a/app/components/sdg_management/relations/index_component.html.erb b/app/components/sdg_management/relations/index_component.html.erb
index 2cf9ca2be4f..75e6b41705c 100644
--- a/app/components/sdg_management/relations/index_component.html.erb
+++ b/app/components/sdg_management/relations/index_component.html.erb
@@ -4,6 +4,9 @@
<%= component.select_tag :goal_code, goal_options,
include_blank: goal_blank_option,
"aria-label": goal_label %>
+ <%= component.select_tag :target_code, target_options,
+ include_blank: target_blank_option,
+ "aria-label": target_label %>
<% end %>
diff --git a/app/components/sdg_management/relations/index_component.rb b/app/components/sdg_management/relations/index_component.rb
index 97d3cb49d25..170fa7573ca 100644
--- a/app/components/sdg_management/relations/index_component.rb
+++ b/app/components/sdg_management/relations/index_component.rb
@@ -38,7 +38,19 @@ def goal_blank_option
t("admin.shared.search.advanced_filters.sdg_goals.all")
end
+ def target_label
+ t("admin.shared.search.advanced_filters.sdg_targets.label")
+ end
+
+ def target_blank_option
+ t("admin.shared.search.advanced_filters.sdg_targets.all")
+ end
+
def goal_options
options_from_collection_for_select(SDG::Goal.all, :code, :code_and_title, params[:goal_code])
end
+
+ def target_options
+ options_from_collection_for_select(SDG::Target.all.sort, :code, :code, params[:target_code])
+ end
end
diff --git a/app/controllers/sdg_management/relations_controller.rb b/app/controllers/sdg_management/relations_controller.rb
index aa03f5d26d0..e16c1f63be9 100644
--- a/app/controllers/sdg_management/relations_controller.rb
+++ b/app/controllers/sdg_management/relations_controller.rb
@@ -6,6 +6,7 @@ def index
@records = relatable_class
.accessible_by(current_ability)
.by_goal(params[:goal_code])
+ .by_target(params[:target_code])
.order(:id)
.page(params[:page])
diff --git a/app/models/concerns/sdg/relatable.rb b/app/models/concerns/sdg/relatable.rb
index 034e9e13151..c6851d0b06a 100644
--- a/app/models/concerns/sdg/relatable.rb
+++ b/app/models/concerns/sdg/relatable.rb
@@ -14,9 +14,17 @@ module SDG::Relatable
class_methods do
def by_goal(code)
+ by_sdg_related(SDG::Goal, code)
+ end
+
+ def by_target(code)
+ by_sdg_related(SDG::Target, code)
+ end
+
+ def by_sdg_related(sdg_class, code)
return all if code.blank?
- joins(:sdg_goals).merge(SDG::Goal.where(code: code))
+ joins(sdg_class.table_name.to_sym).merge(sdg_class.where(code: code))
end
end
diff --git a/config/locales/en/admin.yml b/config/locales/en/admin.yml
index 65163157e7f..18d9ceb534a 100644
--- a/config/locales/en/admin.yml
+++ b/config/locales/en/admin.yml
@@ -1258,6 +1258,9 @@ en:
sdg_goals:
all: "All goals"
label: "By goal"
+ sdg_targets:
+ all: "All targets"
+ label: "By target"
label:
booths: "Search booth by name or location"
budget_investments: "Search investments by title, description or heading"
diff --git a/config/locales/es/admin.yml b/config/locales/es/admin.yml
index 57fddcc21fb..c03515bf223 100644
--- a/config/locales/es/admin.yml
+++ b/config/locales/es/admin.yml
@@ -1257,6 +1257,9 @@ es:
sdg_goals:
all: "Todos los objetivos"
label: "Por objetivo"
+ sdg_targets:
+ all: "Todas las metas"
+ label: "Por meta"
label:
booths: "Buscar urna por nombre"
budget_investments: "Buscar proyectos por título, descripción o partida"
diff --git a/spec/models/sdg/relatable_spec.rb b/spec/models/sdg/relatable_spec.rb
index faf53073cba..2d6b05479b4 100644
--- a/spec/models/sdg/relatable_spec.rb
+++ b/spec/models/sdg/relatable_spec.rb
@@ -121,4 +121,25 @@
expect(relatable.class.by_goal(goal.code)).to be_empty
end
end
+
+ describe ".by_target" do
+ it "returns everything if no code is provided" do
+ expect(relatable.class.by_target("")).to eq [relatable]
+ expect(relatable.class.by_target(nil)).to eq [relatable]
+ end
+
+ it "returns records associated with that target" do
+ same_association = create(:proposal, sdg_targets: [target])
+ both_associations = create(:proposal, sdg_targets: [target, another_target])
+
+ expect(relatable.class.by_target(target.code)).to match_array [same_association, both_associations]
+ end
+
+ it "does not return records not associated with that target" do
+ create(:proposal)
+ create(:proposal, sdg_targets: [another_target])
+
+ expect(relatable.class.by_target(target.code)).to be_empty
+ end
+ end
end
diff --git a/spec/system/sdg_management/relations_spec.rb b/spec/system/sdg_management/relations_spec.rb
index 3518617cd38..05b0a9965ce 100644
--- a/spec/system/sdg_management/relations_spec.rb
+++ b/spec/system/sdg_management/relations_spec.rb
@@ -114,6 +114,18 @@
expect(page).not_to have_content "Hospital"
end
end
+
+ scenario "target filter" do
+ create(:budget_investment, title: "School", sdg_targets: [SDG::Target[4.1]])
+ create(:budget_investment, title: "Preschool", sdg_targets: [SDG::Target[4.2]])
+
+ visit sdg_management_budget_investments_path
+ select "4.1", from: "target_code"
+ click_button "Search"
+
+ expect(page).to have_content "School"
+ expect(page).not_to have_content "Preschool"
+ end
end
describe "Edit" do