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