From e0b9c1bfdd89d35534b019f8bdaafd1e7d0f3b18 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Javi=20Mart=C3=ADn?= Date: Wed, 10 Oct 2018 17:53:13 +0200 Subject: [PATCH] Update poll question answers translatable fields We needed to bring back support for CKEditor in our translatable form, which we had temporarily remove. And now we support CKEditor in our translatable specs, and so we can remove the duplicated specs for poll question answers. --- .../poll/questions/answers_controller.rb | 9 +- app/helpers/translatable_form_helper.rb | 13 +- app/models/poll/question/answer.rb | 6 +- .../poll/questions/answers/_form.html.erb | 10 +- config/locales/en/activerecord.yml | 3 + config/locales/es/activerecord.yml | 3 + .../poll/questions/answers/answers_spec.rb | 16 +- spec/features/polls/answers_spec.rb | 4 +- .../poll_question_answers_spec.rb | 149 ------------------ spec/shared/features/translatable.rb | 12 +- 10 files changed, 56 insertions(+), 169 deletions(-) delete mode 100644 spec/features/translations/poll_question_answers_spec.rb diff --git a/app/controllers/admin/poll/questions/answers_controller.rb b/app/controllers/admin/poll/questions/answers_controller.rb index 225665b94..099fc818b 100644 --- a/app/controllers/admin/poll/questions/answers_controller.rb +++ b/app/controllers/admin/poll/questions/answers_controller.rb @@ -11,9 +11,10 @@ class Admin::Poll::Questions::AnswersController < Admin::Poll::BaseController def create @answer = ::Poll::Question::Answer.new(answer_params) + @question = @answer.question if @answer.save - redirect_to admin_question_path(@answer.question), + redirect_to admin_question_path(@question), notice: t("flash.actions.create.poll_question_answer") else render :new @@ -31,7 +32,7 @@ class Admin::Poll::Questions::AnswersController < Admin::Poll::BaseController redirect_to admin_question_path(@answer.question), notice: t("flash.actions.save_changes.notice") else - redirect_to :back + render :edit end end @@ -50,8 +51,8 @@ class Admin::Poll::Questions::AnswersController < Admin::Poll::BaseController def answer_params documents_attributes = [:id, :title, :attachment, :cached_attachment, :user_id, :_destroy] - attributes = [:title, :description, :question_id, documents_attributes: documents_attributes] - params.require(:poll_question_answer).permit(*attributes, *translation_params(Poll::Question::Answer)) + attributes = [:question_id, documents_attributes: documents_attributes] + params.require(:poll_question_answer).permit(*attributes, translation_params(Poll::Question::Answer)) end def load_answer diff --git a/app/helpers/translatable_form_helper.rb b/app/helpers/translatable_form_helper.rb index 868cb7028..8d14a1d74 100644 --- a/app/helpers/translatable_form_helper.rb +++ b/app/helpers/translatable_form_helper.rb @@ -53,9 +53,20 @@ module TranslatableFormHelper define_method field do |attribute, options = {}| final_options = translations_options(options) - custom_label(attribute, final_options[:label], final_options[:label_options]) + + label_help_text_and_field = + custom_label(attribute, final_options[:label], final_options[:label_options]) + help_text(final_options[:hint]) + super(attribute, final_options.merge(label: false, hint: false)) + + if field == :cktext_area + content_tag :div, + label_help_text_and_field, + class: "js-globalize-attribute", + style: @template.display_translation?(locale), + data: { locale: locale } + else + label_help_text_and_field + end end end diff --git a/app/models/poll/question/answer.rb b/app/models/poll/question/answer.rb index 56655e457..5fd0e19c7 100644 --- a/app/models/poll/question/answer.rb +++ b/app/models/poll/question/answer.rb @@ -5,6 +5,7 @@ class Poll::Question::Answer < ActiveRecord::Base translates :title, touch: true translates :description, touch: true globalize_accessors + accepts_nested_attributes_for :translations, allow_destroy: true documentable max_documents_allowed: 3, max_file_size: 3.megabytes, @@ -14,7 +15,10 @@ class Poll::Question::Answer < ActiveRecord::Base belongs_to :question, class_name: 'Poll::Question', foreign_key: 'question_id' has_many :videos, class_name: 'Poll::Question::Answer::Video' - validates :title, presence: true + translation_class.instance_eval do + validates :title, presence: true + end + validates :given_order, presence: true, uniqueness: { scope: :question_id } before_validation :set_order, on: :create diff --git a/app/views/admin/poll/questions/answers/_form.html.erb b/app/views/admin/poll/questions/answers/_form.html.erb index 1ca05d9ab..9759f6935 100644 --- a/app/views/admin/poll/questions/answers/_form.html.erb +++ b/app/views/admin/poll/questions/answers/_form.html.erb @@ -6,11 +6,13 @@ <%= f.hidden_field :question_id, value: @answer.question_id || @question.id %> - <%= f.translatable_text_field :title %> + <%= f.translatable_fields do |translations_form| %> + <%= translations_form.text_field :title %> -
- <%= f.translatable_cktext_area :description, maxlength: Poll::Question.description_max_length %> -
+
+ <%= translations_form.cktext_area :description, maxlength: Poll::Question.description_max_length %> +
+ <% end %>
<%= f.submit(class: "button success expanded", value: t("shared.save")) %> diff --git a/config/locales/en/activerecord.yml b/config/locales/en/activerecord.yml index 28452f71f..5bb1e9b55 100644 --- a/config/locales/en/activerecord.yml +++ b/config/locales/en/activerecord.yml @@ -262,6 +262,9 @@ en: poll/question/answer: title: Answer description: Description + poll/question/answer/translation: + title: Answer + description: Description poll/question/answer/video: title: Title url: External video diff --git a/config/locales/es/activerecord.yml b/config/locales/es/activerecord.yml index a82ea1d97..f37680c51 100644 --- a/config/locales/es/activerecord.yml +++ b/config/locales/es/activerecord.yml @@ -262,6 +262,9 @@ es: poll/question/answer: title: Respuesta description: Descripción + poll/question/answer/translation: + title: Respuesta + description: Descripción poll/question/answer/video: title: Título url: Vídeo externo diff --git a/spec/features/admin/poll/questions/answers/answers_spec.rb b/spec/features/admin/poll/questions/answers/answers_spec.rb index dbcf8cf5c..4e3965f01 100644 --- a/spec/features/admin/poll/questions/answers/answers_spec.rb +++ b/spec/features/admin/poll/questions/answers/answers_spec.rb @@ -7,6 +7,12 @@ feature 'Answers' do login_as admin.user end + it_behaves_like "translatable", + "poll_question_answer", + "edit_admin_answer_path", + %w[title], + { "description" => :ckeditor } + scenario 'Create' do question = create(:poll_question) title = 'Whatever the question may be, the answer is always 42' @@ -15,8 +21,8 @@ feature 'Answers' do visit admin_question_path(question) click_link 'Add answer' - fill_in 'poll_question_answer_title_en', with: title - fill_in 'poll_question_answer_description_en', with: description + fill_in 'Answer', with: title + fill_in 'Description', with: description click_button 'Save' @@ -33,8 +39,8 @@ feature 'Answers' do visit admin_question_path(question) click_link 'Add answer' - fill_in 'poll_question_answer_title_en', with: title - fill_in 'poll_question_answer_description_en', with: description + fill_in 'Answer', with: title + fill_in 'Description', with: description click_button 'Save' @@ -53,7 +59,7 @@ feature 'Answers' do old_title = answer.title new_title = 'Ex Machina' - fill_in 'poll_question_answer_title_en', with: new_title + fill_in 'Answer', with: new_title click_button 'Save' diff --git a/spec/features/polls/answers_spec.rb b/spec/features/polls/answers_spec.rb index 6daffc0eb..89bdfeb5d 100644 --- a/spec/features/polls/answers_spec.rb +++ b/spec/features/polls/answers_spec.rb @@ -28,8 +28,8 @@ feature 'Answers' do visit admin_question_path(question) click_link "Add answer" - fill_in "poll_question_answer_title_en", with: "¿Would you like to reform Central Park?" - fill_in "poll_question_answer_description_en", with: "Adding more trees, creating a play area..." + fill_in "Answer", with: "¿Would you like to reform Central Park?" + fill_in "Description", with: "Adding more trees, creating a play area..." click_button "Save" expect(page).to have_content "Answer created successfully" diff --git a/spec/features/translations/poll_question_answers_spec.rb b/spec/features/translations/poll_question_answers_spec.rb deleted file mode 100644 index fded75cfd..000000000 --- a/spec/features/translations/poll_question_answers_spec.rb +++ /dev/null @@ -1,149 +0,0 @@ -# coding: utf-8 -require 'rails_helper' - -feature "Translations" do - - context "Polls" do - - let(:poll) { create(:poll, name_en: "Name in English", - name_es: "Nombre en Español", - summary_en: "Summary in English", - summary_es: "Resumen en Español", - description_en: "Description in English", - description_es: "Descripción en Español") } - - background do - admin = create(:administrator) - login_as(admin.user) - end - - context "Questions" do - - let(:question) { create(:poll_question, poll: poll, - title_en: "Question in English", - title_es: "Pregunta en Español") } - - context "Answers" do - - let(:answer) { create(:poll_question_answer, question: question, - title_en: "Answer in English", - title_es: "Respuesta en Español", - description_en: "Description in English", - description_es: "Descripción en Español") } - - before do - @edit_answer_url = edit_admin_answer_path(answer) - end - - scenario "Add a translation", :js do - visit @edit_answer_url - - select "Français", from: "translation_locale" - fill_in 'poll_question_answer_title_fr', with: 'Answer en Français' - fill_in_ckeditor 'poll_question_answer_description_fr', with: 'Description en Français' - - click_button 'Save' - expect(page).to have_content "Changes saved" - - expect(page).to have_content "Answer in English" - expect(page).to have_content "Description in English" - - select('Español', from: 'locale-switcher') - expect(page).to have_content "Respuesta en Español" - expect(page).to have_content "Descripción en Español" - - select('Français', from: 'locale-switcher') - expect(page).to have_content "Answer en Français" - expect(page).to have_content "Description en Français" - end - - scenario "Update a translation with allowed blank translated field", :js do - visit @edit_answer_url - - click_link "Español" - fill_in 'poll_question_answer_title_es', with: 'Pregunta correcta en Español' - fill_in_ckeditor 'poll_question_answer_description_es', with: '' - - click_button 'Save' - expect(page).to have_content "Changes saved" - - expect(page).to have_content("Answer in English") - expect(page).to have_content("Description in English") - - select('Español', from: 'locale-switcher') - expect(page).to have_content("Pregunta correcta en Español") - expect(page).to_not have_content("Descripción en Español") - end - - scenario "Remove a translation", :js do - visit @edit_answer_url - - click_link "Español" - click_link "Remove language" - - expect(page).not_to have_link "Español" - - click_button "Save" - visit @edit_answer_url - expect(page).not_to have_link "Español" - end - - scenario "Add a translation for a locale with non-underscored name", :js do - visit @edit_answer_url - - select('Português brasileiro', from: 'translation_locale') - fill_in_ckeditor 'poll_question_answer_description_pt_br', with: 'resposta em Português' - click_button 'Save' - - select('Português brasileiro', from: 'locale-switcher') - expect(page).to have_content("resposta em Português") - end - - context "Globalize javascript interface" do - - scenario "Highlight current locale", :js do - visit @edit_answer_url - - expect(find("a.js-globalize-locale-link.is-active")).to have_content "English" - - select('Español', from: 'locale-switcher') - - expect(find("a.js-globalize-locale-link.is-active")).to have_content "Español" - end - - scenario "Highlight selected locale", :js do - visit @edit_answer_url - - expect(find("a.js-globalize-locale-link.is-active")).to have_content "English" - - click_link "Español" - - expect(find("a.js-globalize-locale-link.is-active")).to have_content "Español" - end - - scenario "Show selected locale form", :js do - visit @edit_answer_url - - expect(page).to have_field('poll_question_answer_title_en', with: 'Answer in English') - - click_link "Español" - - expect(page).to have_field('poll_question_answer_title_es', with: 'Respuesta en Español') - end - - scenario "Select a locale and add it to the poll form", :js do - visit @edit_answer_url - - select "Français", from: "translation_locale" - - expect(page).to have_link "Français" - - click_link "Français" - - expect(page).to have_field('poll_question_answer_title_fr') - end - end - end - end - end -end diff --git a/spec/shared/features/translatable.rb b/spec/shared/features/translatable.rb index 862417ff3..c34c8ec9c 100644 --- a/spec/shared/features/translatable.rb +++ b/spec/shared/features/translatable.rb @@ -240,11 +240,11 @@ def text_for(field, locale) end end -def field_for(field, locale) +def field_for(field, locale, visible: true) if translatable_class.name == "I18nContent" "contents_content_#{translatable.key}values_#{field}_#{locale}" else - find("[data-locale='#{locale}'][id$='#{field}']")[:id] + find("[data-locale='#{locale}'][id$='#{field}']", visible: visible)[:id] end end @@ -261,6 +261,8 @@ def fill_in_textarea(field, textarea_type, locale, with:) click_link class: "fullscreen-toggle" fill_in field_for(field, locale), with: with click_link class: "fullscreen-toggle" + elsif textarea_type == :ckeditor + fill_in_ckeditor field_for(field, locale, visible: false), with: with end end @@ -274,6 +276,10 @@ def expect_page_to_have_translatable_field(field, locale, with:) click_link class: "fullscreen-toggle" expect(page).to have_field field_for(field, locale), with: with click_link class: "fullscreen-toggle" + elsif textarea_type == :ckeditor + within(".ckeditor div.js-globalize-attribute[data-locale='#{locale}']") do + within_frame(0) { expect(page).to have_content with } + end end end end @@ -288,7 +294,7 @@ def update_button_text "Update notification" when "Poll" "Update poll" - when "Poll::Question" + when "Poll::Question", "Poll::Question::Answer" "Save" when "Widget::Card" "Save card"