diff --git a/app/components/sdg_management/local_targets/form_component.html.erb b/app/components/sdg_management/local_targets/form_component.html.erb
new file mode 100644
index 000000000..df7c8a9ae
--- /dev/null
+++ b/app/components/sdg_management/local_targets/form_component.html.erb
@@ -0,0 +1,41 @@
+<%= back_link_to sdg_management_local_targets_path %>
+
+<%= header %>
+
+<%= render "shared/globalize_locales", resource: local_target %>
+
+<%= translatable_form_for [:sdg_managment, local_target], url: form_url do |f| %>
+ <%= render "shared/errors", resource: local_target %>
+
+
+
+ <%= f.select :target_id, target_options %>
+
+
+
+
+
+ <%= f.text_field :code, hint: t("sdg_management.local_targets.form.code") %>
+
+
+
+
+ <%= f.translatable_fields do |translations_form| %>
+
+ <%= translations_form.text_field :title %>
+
+
+
+ <%= translations_form.text_area :description,
+ rows: 4,
+ hint: t("sdg_management.local_targets.form.description") %>
+
+ <% end %>
+
+
+
+
+ <%= f.submit class: "button" %>
+
+
+<% end %>
diff --git a/app/components/sdg_management/local_targets/form_component.rb b/app/components/sdg_management/local_targets/form_component.rb
new file mode 100644
index 000000000..2d54e1ecd
--- /dev/null
+++ b/app/components/sdg_management/local_targets/form_component.rb
@@ -0,0 +1,40 @@
+class SDGManagement::LocalTargets::FormComponent < ApplicationComponent
+ delegate :back_link_to, to: :helpers
+ include SDGManagement::Header
+ include TranslatableFormHelper
+ include GlobalizeHelper
+
+ attr_reader :local_target
+
+ def initialize(local_target)
+ @local_target = local_target
+ end
+
+ private
+
+ def title
+ t("sdg_management.local_targets.new.title")
+ end
+
+ def form_url
+ if local_target.persisted?
+ sdg_management_local_target_path(local_target)
+ else
+ sdg_management_local_targets_path
+ end
+ end
+
+ def target_options
+ grouped_targets = SDG::Goal.order(:code).map do |goal|
+ [
+ code_and_title(goal),
+ goal.targets.sort.map { |target| [code_and_title(target), target.id] }
+ ]
+ end
+ grouped_options_for_select(grouped_targets, local_target.target_id)
+ end
+
+ def code_and_title(resource)
+ "#{resource.code} #{resource.title}"
+ end
+end
diff --git a/app/components/sdg_management/local_targets/index_component.html.erb b/app/components/sdg_management/local_targets/index_component.html.erb
index c8b14d546..383dbfbfa 100644
--- a/app/components/sdg_management/local_targets/index_component.html.erb
+++ b/app/components/sdg_management/local_targets/index_component.html.erb
@@ -1,4 +1,8 @@
-<%= header %>
+<%= header do %>
+ <%= link_to t("sdg_management.local_targets.index.new"),
+ new_sdg_management_local_target_path,
+ class: "new-link" %>
+<% end %>
<%= render SDGManagement::SubnavigationComponent.new(current: :local_targets) do %>
diff --git a/app/controllers/sdg_management/local_targets_controller.rb b/app/controllers/sdg_management/local_targets_controller.rb
index 2db2b5d68..ba9e4cfe6 100644
--- a/app/controllers/sdg_management/local_targets_controller.rb
+++ b/app/controllers/sdg_management/local_targets_controller.rb
@@ -1,7 +1,30 @@
class SDGManagement::LocalTargetsController < SDGManagement::BaseController
+ include Translatable
+
LocalTarget = ::SDG::LocalTarget
def index
@local_targets = LocalTarget.all.sort
end
+
+ def new
+ @local_target = LocalTarget.new
+ end
+
+ def create
+ @local_target = LocalTarget.new(local_target_params)
+
+ if @local_target.save
+ redirect_to sdg_management_local_targets_path, notice: t("sdg_management.local_targets.create.notice")
+ else
+ render :new
+ end
+ end
+
+ private
+
+ def local_target_params
+ translations_attributes = translation_params(LocalTarget)
+ params.require(:sdg_local_target).permit(:code, :target_id, translations_attributes)
+ end
end
diff --git a/app/views/sdg_management/local_targets/new.html.erb b/app/views/sdg_management/local_targets/new.html.erb
new file mode 100644
index 000000000..07818dd63
--- /dev/null
+++ b/app/views/sdg_management/local_targets/new.html.erb
@@ -0,0 +1 @@
+<%= render SDGManagement::LocalTargets::FormComponent.new(@local_target) %>
diff --git a/config/locales/en/activerecord.yml b/config/locales/en/activerecord.yml
index 0ec2fc59f..73edfc440 100644
--- a/config/locales/en/activerecord.yml
+++ b/config/locales/en/activerecord.yml
@@ -322,9 +322,12 @@ en:
title: "Title"
description: "Description"
sdg/local_target:
+ code: "Code"
+ target_id: "Target"
title: "Title"
sdg/local_target/translation:
title: "Title"
+ description: "Description"
sdg/target:
code: "Code"
title: "Title"
diff --git a/config/locales/en/general.yml b/config/locales/en/general.yml
index 293e3b4e7..5a47cdb64 100644
--- a/config/locales/en/general.yml
+++ b/config/locales/en/general.yml
@@ -190,6 +190,7 @@ en:
local_census_records/import: Local Census Records Import
site_customization/content_block: content block
site_customization/page: page
+ sdg/local_target: local target
geozones:
none: All city
layouts:
diff --git a/config/locales/en/sdg_management.yml b/config/locales/en/sdg_management.yml
index d71b2e7be..8652a0b07 100644
--- a/config/locales/en/sdg_management.yml
+++ b/config/locales/en/sdg_management.yml
@@ -4,3 +4,13 @@ en:
title: "SDG content"
menu:
sdg_content: "Goals and Targets"
+ local_targets:
+ create:
+ notice: "Local target created successfully"
+ form:
+ code: "Code must start with the selected target code followed by a dot"
+ description: "This description will be shown as help to users."
+ index:
+ new: "Create local target"
+ new:
+ title: "New local target"
diff --git a/config/locales/es/activerecord.yml b/config/locales/es/activerecord.yml
index 32319ae1f..070ec9aa4 100644
--- a/config/locales/es/activerecord.yml
+++ b/config/locales/es/activerecord.yml
@@ -319,9 +319,12 @@ es:
title: "Título"
description: "Descripción"
sdg/local_target:
+ code: "Código"
+ target_id: "Meta"
title: "Título"
sdg/local_target/translation:
title: "Título"
+ description: "Descripción"
sdg/target:
code: "Código"
title: "Título"
diff --git a/config/locales/es/general.yml b/config/locales/es/general.yml
index 660cc7835..7f7b2b713 100644
--- a/config/locales/es/general.yml
+++ b/config/locales/es/general.yml
@@ -190,6 +190,7 @@ es:
local_census_records/import: la importación de registros del censo local
site_customization/content_block: el bloque
site_customization/page: la página
+ sdg/local_target: la meta localizada
geozones:
none: Toda la ciudad
layouts:
diff --git a/config/locales/es/sdg_management.yml b/config/locales/es/sdg_management.yml
index 58a378678..a26748835 100644
--- a/config/locales/es/sdg_management.yml
+++ b/config/locales/es/sdg_management.yml
@@ -4,3 +4,13 @@ es:
title: "Contenido ODS"
menu:
sdg_content: "Objetivos y Metas"
+ local_targets:
+ create:
+ notice: "Meta localizada creada correctamente"
+ form:
+ code: "El código debe comenzar por el código de la meta seleccionada seguida de un '.'"
+ description: "Este texto ser mostrará como ayuda para los usuarios."
+ index:
+ new: "Crear meta localizada"
+ new:
+ title: "Nueva meta localizada"
diff --git a/config/routes/sdg_management.rb b/config/routes/sdg_management.rb
index ae1a232e4..5ca450cf3 100644
--- a/config/routes/sdg_management.rb
+++ b/config/routes/sdg_management.rb
@@ -3,5 +3,5 @@ namespace :sdg_management do
resources :goals, only: [:index]
resources :targets, only: [:index]
- resources :local_targets, only: [:index]
+ resources :local_targets, only: [:index, :new, :create]
end
diff --git a/spec/system/sdg_management/local_targets_spec.rb b/spec/system/sdg_management/local_targets_spec.rb
index 89f550b0e..61f042552 100644
--- a/spec/system/sdg_management/local_targets_spec.rb
+++ b/spec/system/sdg_management/local_targets_spec.rb
@@ -15,6 +15,7 @@ describe "Local Targets", :js do
expect(page).to have_title "SDG content - Local Targets"
within("table") { expect(page).to have_content "Affordable food for everyone" }
+ expect(page).to have_link "Create local target", href: new_sdg_management_local_target_path
end
scenario "Show local targets grouped by target" do
@@ -30,4 +31,32 @@ describe "Local Targets", :js do
expect(target_2.title).to appear_before(target_2_local_target.title)
end
end
+
+ describe "Create" do
+ scenario "Shows succesful notice when form is fullfilled correctly" do
+ visit new_sdg_management_local_target_path
+
+ target = SDG::Target["1.1"]
+ select "#{target.code} #{target.title}", from: "Target"
+ fill_in "Code", with: "1.1.1"
+ fill_in "Title", with: "Local target title"
+ fill_in "Description", with: "Local target description"
+ click_button "Create local target"
+
+ expect(page).to have_content("Local target created successfully")
+ expect(page).to have_content("1.1.1")
+ end
+
+ scenario "Shows form errors when not valid" do
+ visit new_sdg_management_local_target_path
+
+ target = SDG::Target["2.3"]
+ code_and_title = "#{target.code} #{target.title}"
+ select code_and_title, from: "Target"
+ click_button "Create local target"
+
+ expect(page).to have_content("errors prevented this local target from being saved.")
+ expect(page).to have_select("Target", selected: code_and_title)
+ end
+ end
end