From 06347062ddb9a24479129cb634bf2aa45b05728b Mon Sep 17 00:00:00 2001 From: Marko Lovic Date: Fri, 3 Aug 2018 14:20:12 +0200 Subject: [PATCH] Make Legislation Questions translatable --- app/assets/javascripts/globalize.js.coffee | 4 ++ .../javascripts/legislation_admin.js.coffee | 2 + .../admin/legislation/questions_controller.rb | 10 ++- app/models/legislation/question.rb | 5 +- app/models/legislation/question_option.rb | 3 + .../legislation/questions/_form.html.erb | 20 +++--- .../_question_option_fields.html.erb | 4 +- .../admin/legislation/questions_spec.rb | 65 ++++++++++++++++++- 8 files changed, 100 insertions(+), 13 deletions(-) diff --git a/app/assets/javascripts/globalize.js.coffee b/app/assets/javascripts/globalize.js.coffee index 027ac498e..068ca88c8 100644 --- a/app/assets/javascripts/globalize.js.coffee +++ b/app/assets/javascripts/globalize.js.coffee @@ -36,6 +36,10 @@ App.Globalize = disable_locale: (locale) -> $("#enabled_translations_" + locale).val(0) + refresh_visible_translations: -> + locale = $('.js-globalize-locale-link.is-active').data("locale") + App.Globalize.display_translations(locale) + initialize: -> $('.js-globalize-locale').on 'change', -> App.Globalize.display_translations($(this).val()) diff --git a/app/assets/javascripts/legislation_admin.js.coffee b/app/assets/javascripts/legislation_admin.js.coffee index fc1d7cab4..f7f9ea17a 100644 --- a/app/assets/javascripts/legislation_admin.js.coffee +++ b/app/assets/javascripts/legislation_admin.js.coffee @@ -12,3 +12,5 @@ App.LegislationAdmin = else $(this).val("") + $("#nested-question-options").on "cocoon:after-insert", -> + App.Globalize.refresh_visible_translations() diff --git a/app/controllers/admin/legislation/questions_controller.rb b/app/controllers/admin/legislation/questions_controller.rb index bac16295e..da73e905c 100644 --- a/app/controllers/admin/legislation/questions_controller.rb +++ b/app/controllers/admin/legislation/questions_controller.rb @@ -1,4 +1,6 @@ class Admin::Legislation::QuestionsController < Admin::Legislation::BaseController + include Translatable + load_and_authorize_resource :process, class: "Legislation::Process" load_and_authorize_resource :question, class: "Legislation::Question", through: :process @@ -46,7 +48,13 @@ class Admin::Legislation::QuestionsController < Admin::Legislation::BaseControll def question_params params.require(:legislation_question).permit( :title, - question_options_attributes: [:id, :value, :_destroy] + *translation_params(::Legislation::Question), + question_options_attributes: [:id, :value, + *translation_params(::Legislation::QuestionOption)] ) end + + def resource + @question || ::Legislation::Question.find(params[:id]) + end end diff --git a/app/models/legislation/question.rb b/app/models/legislation/question.rb index 2ca5fb39a..859990928 100644 --- a/app/models/legislation/question.rb +++ b/app/models/legislation/question.rb @@ -3,6 +3,9 @@ class Legislation::Question < ActiveRecord::Base include ActsAsParanoidAliases include Notifiable + translates :title, touch: :true + globalize_accessors + belongs_to :author, -> { with_hidden }, class_name: 'User', foreign_key: 'author_id' belongs_to :process, class_name: 'Legislation::Process', foreign_key: 'legislation_process_id' @@ -11,7 +14,7 @@ class Legislation::Question < ActiveRecord::Base has_many :answers, class_name: 'Legislation::Answer', foreign_key: 'legislation_question_id', dependent: :destroy, inverse_of: :question has_many :comments, as: :commentable, dependent: :destroy - accepts_nested_attributes_for :question_options, reject_if: proc { |attributes| attributes[:value].blank? }, allow_destroy: true + accepts_nested_attributes_for :question_options, reject_if: proc { |attributes| attributes.all? { |k, v| v.blank? } }, allow_destroy: true validates :process, presence: true validates :title, presence: true diff --git a/app/models/legislation/question_option.rb b/app/models/legislation/question_option.rb index f7927dd1a..2282c31d3 100644 --- a/app/models/legislation/question_option.rb +++ b/app/models/legislation/question_option.rb @@ -2,6 +2,9 @@ class Legislation::QuestionOption < ActiveRecord::Base acts_as_paranoid column: :hidden_at include ActsAsParanoidAliases + translates :value, touch: :true + globalize_accessors + belongs_to :question, class_name: 'Legislation::Question', foreign_key: 'legislation_question_id', inverse_of: :question_options has_many :answers, class_name: 'Legislation::Answer', foreign_key: 'legislation_question_id', dependent: :destroy, inverse_of: :question diff --git a/app/views/admin/legislation/questions/_form.html.erb b/app/views/admin/legislation/questions/_form.html.erb index f31e5a61d..10902b78d 100644 --- a/app/views/admin/legislation/questions/_form.html.erb +++ b/app/views/admin/legislation/questions/_form.html.erb @@ -1,4 +1,6 @@ -<%= form_for [:admin, @process, @question], url: url, html: {data: {watch_changes: true}} do |f| %> +<%= render "admin/shared/globalize_locales", resource: @question %> + +<%= translatable_form_for [:admin, @process, @question], url: url, html: {data: {watch_changes: true}} do |f| %> <% if @question.errors.any? %>
@@ -16,23 +18,25 @@ <% end %>
- <%= f.label :title, t("admin.legislation.questions.form.title") %> - <%= f.text_area :title, rows: 5, label: false, placeholder: t("admin.legislation.questions.form.title_placeholder") %> + <%= f.translatable_text_area :title, + rows: 5, + placeholder: t("admin.legislation.questions.form.title_placeholder"), + label: t("admin.legislation.questions.form.title") %>
<%= f.label :question_options, t("admin.legislation.questions.form.question_options") %>
-
+
<%= f.fields_for :question_options do |ff| %> <%= render 'question_option_fields', f: ff %> <% end %> -
-
- <%= link_to_add_association t("admin.legislation.questions.form.add_option"), - f, :question_options, class: "button hollow" %> +
+ <%= link_to_add_association t("admin.legislation.questions.form.add_option"), + f, :question_options, class: "button hollow" %> +
diff --git a/app/views/admin/legislation/questions/_question_option_fields.html.erb b/app/views/admin/legislation/questions/_question_option_fields.html.erb index 6da8dbd4c..204e7b27a 100644 --- a/app/views/admin/legislation/questions/_question_option_fields.html.erb +++ b/app/views/admin/legislation/questions/_question_option_fields.html.erb @@ -1,7 +1,9 @@
- <%= f.text_field :value, label: false, placeholder: t("admin.legislation.questions.form.value_placeholder") %> + <%= f.translatable_text_field :value, + placeholder: t("admin.legislation.questions.form.value_placeholder"), + label: false %>
<%= link_to_remove_association t("admin.legislation.questions.question_option_fields.remove_option"), f, class: "delete"%> diff --git a/spec/features/admin/legislation/questions_spec.rb b/spec/features/admin/legislation/questions_spec.rb index d79429e30..b176ecaac 100644 --- a/spec/features/admin/legislation/questions_spec.rb +++ b/spec/features/admin/legislation/questions_spec.rb @@ -7,6 +7,11 @@ feature 'Admin legislation questions' do login_as(admin.user) end + it_behaves_like "translatable", + "legislation_question", + "edit_admin_legislation_process_question_path", + %w[title] + context "Feature flag" do background do @@ -60,7 +65,7 @@ feature 'Admin legislation questions' do click_link 'Create question' - fill_in 'legislation_question_title', with: 'Question 3' + fill_in 'legislation_question_title_en', with: 'Question 3' click_button 'Create question' expect(page).to have_content 'Question 3' @@ -87,7 +92,7 @@ feature 'Admin legislation questions' do click_link 'Question 2' - fill_in 'legislation_question_title', with: 'Question 2b' + fill_in 'legislation_question_title_en', with: 'Question 2b' click_button 'Save changes' expect(page).to have_content 'Question 2b' @@ -111,4 +116,60 @@ feature 'Admin legislation questions' do expect(page).not_to have_content 'Question 2' end end + + context "Special translation behaviour" do + + let!(:question) { create(:legislation_question, + title_en: "Title in English", + title_es: "Título en Español") } + + before do + @edit_question_url = edit_admin_legislation_process_question_path(question.process, question) + end + + scenario 'Add translation for question option', :js do + visit @edit_question_url + + click_on 'Add option' + + find('#nested-question-options input').set('Option 1') + + click_link "Español" + + find('#nested-question-options input').set('Opción 1') + + click_button "Save changes" + visit @edit_question_url + + expect(page).to have_field('legislation_question_question_options_attributes_0_value_en', with: 'Option 1') + + click_link "Español" + + expect(page).to have_field('legislation_question_question_options_attributes_0_value_es', with: 'Opción 1') + end + + scenario 'Add new question option after changing active locale', :js do + visit @edit_question_url + + click_link "Español" + + click_on 'Add option' + + find('#nested-question-options input').set('Opción 1') + + click_link "English" + + find('#nested-question-options input').set('Option 1') + + click_button "Save changes" + + visit @edit_question_url + + expect(page).to have_field('legislation_question_question_options_attributes_0_value_en', with: 'Option 1') + + click_link "Español" + + expect(page).to have_field('legislation_question_question_options_attributes_0_value_es', with: 'Opción 1') + end + end end