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