From 914bfa645e12be4ad25fe5f12fcd059505ace34e Mon Sep 17 00:00:00 2001 From: Papaya Labs Date: Thu, 27 Sep 2018 13:46:17 +0200 Subject: [PATCH] Updates translatable custom pages --- .../site_customization/pages_controller.rb | 13 +- app/models/site_customization/page.rb | 8 +- .../site_customization/pages/_form.html.erb | 36 ++-- .../site_customization/pages/index.html.erb | 5 +- config/locales/en/admin.yml | 4 +- .../20180924071722_add_translate_pages.rb | 15 ++ db/schema.rb | 17 +- spec/factories/administration.rb | 1 - .../admin/site_customization/pages_spec.rb | 15 +- .../site_customization/custom_pages_spec.rb | 187 +++++++++++++----- 10 files changed, 210 insertions(+), 91 deletions(-) create mode 100644 db/migrate/20180924071722_add_translate_pages.rb diff --git a/app/controllers/admin/site_customization/pages_controller.rb b/app/controllers/admin/site_customization/pages_controller.rb index 68ede1da2..e4c6a8ed7 100644 --- a/app/controllers/admin/site_customization/pages_controller.rb +++ b/app/controllers/admin/site_customization/pages_controller.rb @@ -1,4 +1,5 @@ class Admin::SiteCustomization::PagesController < Admin::SiteCustomization::BaseController + include Translatable load_and_authorize_resource :page, class: "SiteCustomization::Page" def index @@ -34,15 +35,21 @@ class Admin::SiteCustomization::PagesController < Admin::SiteCustomization::Base private def page_params - params.require(:site_customization_page).permit( - :slug, + attributes = [:slug, :title, :subtitle, :content, :more_info_flag, :print_content_flag, :status, - :locale + :locale] + + params.require(:site_customization_page).permit(*attributes, + *translation_params(SiteCustomization::Page) ) end + + def resource + SiteCustomization::Page.find(params[:id]) + end end diff --git a/app/models/site_customization/page.rb b/app/models/site_customization/page.rb index 2b60dea81..34e470759 100644 --- a/app/models/site_customization/page.rb +++ b/app/models/site_customization/page.rb @@ -6,11 +6,15 @@ class SiteCustomization::Page < ActiveRecord::Base format: { with: /\A[0-9a-zA-Z\-_]*\Z/, message: :slug_format } validates :title, presence: true validates :status, presence: true, inclusion: { in: VALID_STATUSES } - validates :locale, presence: true + + translates :title, touch: true + translates :subtitle, touch: true + translates :content, touch: true + globalize_accessors scope :published, -> { where(status: 'published').order('id DESC') } scope :with_more_info_flag, -> { where(status: 'published', more_info_flag: true).order('id ASC') } - scope :with_same_locale, -> { where(locale: I18n.locale).order('id ASC') } + scope :with_same_locale, -> { joins(:translations).where("site_customization_page_translations.locale": I18n.locale) } def url "/#{slug}" diff --git a/app/views/admin/site_customization/pages/_form.html.erb b/app/views/admin/site_customization/pages/_form.html.erb index 6d0416b6e..bf743056e 100644 --- a/app/views/admin/site_customization/pages/_form.html.erb +++ b/app/views/admin/site_customization/pages/_form.html.erb @@ -1,5 +1,6 @@ -<%= form_for [:admin, @page], html: {class: "edit_page", data: {watch_changes: true}} do |f| %> +<%= render "admin/shared/globalize_locales", resource: @page %> +<%= translatable_form_for [:admin, @page], html: {class: "edit_page", data: {watch_changes: true}} do |f| %> <% if @page.errors.any? %>
-
- <%= f.label :locale %> - <%= f.select :locale, I18n.available_locales.map { |l| [name_for_locale(l), l.to_s] }, { include_blank: true, label: false } %> -
+
<%= f.label :slug %> <%= f.text_field :slug, label: false, size: 80, maxlength: 80 %>
- -
-
- - <%= f.label :title %> - <%= f.text_field :title, label: false %> - - <%= f.label :subtitle %> - <%= f.text_field :subtitle, label: false, size: 80, maxlength: 80 %> - -
- <%= f.label :content %> - <%= f.cktext_area :content, label: false, cols: 80, rows: 10, - ckeditor: { language: I18n.locale, toolbar: "admin" } %> -
- -
- <%= f.submit class: "button success expanded" %> -
+
+
+ <%= f.translatable_text_field :title %> + <%= f.translatable_text_field :subtitle %> +
+ <%= f.translatable_cktext_area :content %> +
+
+ <%= f.submit class: "button success expanded" %>
<% end %> diff --git a/app/views/admin/site_customization/pages/index.html.erb b/app/views/admin/site_customization/pages/index.html.erb index ab442d351..5ff7cb5b7 100644 --- a/app/views/admin/site_customization/pages/index.html.erb +++ b/app/views/admin/site_customization/pages/index.html.erb @@ -12,10 +12,10 @@ <%= t("admin.site_customization.pages.page.title") %> + <%= t("admin.site_customization.pages.page.slug") %> <%= t("admin.site_customization.pages.page.created_at") %> <%= t("admin.site_customization.pages.page.updated_at") %> <%= t("admin.site_customization.pages.page.status") %> - <%= t("admin.site_customization.pages.page.locale") %> <%= t("admin.actions.actions") %> @@ -25,10 +25,10 @@ <%= link_to page.title, edit_admin_site_customization_page_path(page) %> + <%= page.slug %> <%= I18n.l page.created_at, format: :short %> <%= I18n.l page.created_at, format: :short %> <%= t("admin.site_customization.pages.page.status_#{page.status}") %> - <%= name_for_locale(page.locale) %>
<% if page.status == "published" %> @@ -56,3 +56,4 @@ <%= page_entries_info @pages %>
<% end %> + diff --git a/config/locales/en/admin.yml b/config/locales/en/admin.yml index 2c5b2d821..261aca613 100644 --- a/config/locales/en/admin.yml +++ b/config/locales/en/admin.yml @@ -1349,11 +1349,11 @@ en: page: created_at: Created at status: Status - title: Title updated_at: Updated at status_draft: Draft status_published: Published - locale: Language + title: Title + slug: Slug homepage: title: Homepage description: The active modules appear in the homepage in the same order as here. diff --git a/db/migrate/20180924071722_add_translate_pages.rb b/db/migrate/20180924071722_add_translate_pages.rb new file mode 100644 index 000000000..6dc939dec --- /dev/null +++ b/db/migrate/20180924071722_add_translate_pages.rb @@ -0,0 +1,15 @@ +class AddTranslatePages < ActiveRecord::Migration + def self.up + SiteCustomization::Page.create_translation_table!({ + title: :string, + subtitle: :string, + content: :text + }) + change_column :site_customization_pages, :title, :string, :null => true + end + + def self.down + SiteCustomization::Page.drop_translation_table! + change_column :site_customization_pages, :title, :string, :null => false + end +end diff --git a/db/schema.rb b/db/schema.rb index 37bfe9912..e0a3793c2 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -11,7 +11,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 20180813141443) do +ActiveRecord::Schema.define(version: 20180924071722) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -1161,9 +1161,22 @@ ActiveRecord::Schema.define(version: 20180813141443) do add_index "site_customization_images", ["name"], name: "index_site_customization_images_on_name", unique: true, using: :btree + create_table "site_customization_page_translations", force: :cascade do |t| + t.integer "site_customization_page_id", null: false + t.string "locale", null: false + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + t.string "title" + t.string "subtitle" + t.text "content" + end + + add_index "site_customization_page_translations", ["locale"], name: "index_site_customization_page_translations_on_locale", using: :btree + add_index "site_customization_page_translations", ["site_customization_page_id"], name: "index_7fa0f9505738cb31a31f11fb2f4c4531fed7178b", using: :btree + create_table "site_customization_pages", force: :cascade do |t| t.string "slug", null: false - t.string "title", null: false + t.string "title" t.string "subtitle" t.text "content" t.boolean "more_info_flag" diff --git a/spec/factories/administration.rb b/spec/factories/administration.rb index 5954251a3..17c9660aa 100644 --- a/spec/factories/administration.rb +++ b/spec/factories/administration.rb @@ -41,7 +41,6 @@ FactoryBot.define do more_info_flag false print_content_flag false status 'draft' - locale 'en' trait :published do status "published" diff --git a/spec/features/admin/site_customization/pages_spec.rb b/spec/features/admin/site_customization/pages_spec.rb index 552d4985d..30e64afc0 100644 --- a/spec/features/admin/site_customization/pages_spec.rb +++ b/spec/features/admin/site_customization/pages_spec.rb @@ -11,7 +11,7 @@ feature "Admin custom pages" do custom_page = create(:site_customization_page) visit admin_site_customization_pages_path - expect(page).to have_content(custom_page.title) + expect(page).to have_content(custom_page.slug) end context "Create" do @@ -22,19 +22,18 @@ feature "Admin custom pages" do click_link "Custom pages" end - expect(page).not_to have_content "An example custom page" + expect(page).not_to have_content "example-page" click_link "Create new page" - fill_in "site_customization_page_title", with: "An example custom page" - fill_in "site_customization_page_subtitle", with: "Page subtitle" + fill_in "site_customization_page_title_en", with: "An example custom page" + fill_in "site_customization_page_subtitle_en", with: "Page subtitle" fill_in "site_customization_page_slug", with: "example-page" - fill_in "site_customization_page_content", with: "This page is about..." - select 'English', from:"site_customization_page_locale" + fill_in "site_customization_page_content_en", with: "This page is about..." click_button "Create Custom page" - expect(page).to have_content "An example custom page" + expect(page).to have_content "example-page" end end @@ -51,7 +50,7 @@ feature "Admin custom pages" do expect(page).to have_selector("h2", text: "An example custom page") - fill_in "site_customization_page_title", with: "Another example custom page" + fill_in "site_customization_page_title_en", with: "Another example custom page" click_button "Update Custom page" expect(page).to have_content "Page updated successfully" diff --git a/spec/features/site_customization/custom_pages_spec.rb b/spec/features/site_customization/custom_pages_spec.rb index 4fb486d37..74148b577 100644 --- a/spec/features/site_customization/custom_pages_spec.rb +++ b/spec/features/site_customization/custom_pages_spec.rb @@ -5,10 +5,9 @@ feature "Custom Pages" do scenario "See default content when custom page is not published" do custom_page = create(:site_customization_page, slug: "conditions", - title: "Custom conditions", - content: "New text for conditions page", - print_content_flag: true, - locale: "en" + title_en: "Custom conditions", + content_en: "New text for conditions page", + print_content_flag: true ) visit custom_page.url @@ -22,10 +21,9 @@ feature "Custom Pages" do scenario "See custom content when custom page is published" do custom_page = create(:site_customization_page, :published, slug: "conditions", - title: "Custom conditions", - content: "New text for conditions page", - print_content_flag: true, - locale: "en" + title_en: "Custom conditions", + content_en: "New text for conditions page", + print_content_flag: true ) visit custom_page.url @@ -42,10 +40,9 @@ feature "Custom Pages" do scenario "See page" do custom_page = create(:site_customization_page, slug: "other-slug", - title: "Custom page", - content: "Text for new custom page", - print_content_flag: false, - locale: "en" + title_en: "Custom page", + content_en: "Text for new custom page", + print_content_flag: false ) visit custom_page.url @@ -58,10 +55,9 @@ feature "Custom Pages" do scenario "See page" do custom_page = create(:site_customization_page, :published, slug: "other-slug", - title: "Custom page", - content: "Text for new custom page", - print_content_flag: false, - locale: "en" + title_en: "Custom page", + content_en: "Text for new custom page", + print_content_flag: false ) visit custom_page.url @@ -75,11 +71,10 @@ feature "Custom Pages" do scenario "Show all fields and text with links" do custom_page = create(:site_customization_page, :published, slug: "slug-with-all-fields-filled", - title: "Custom page", - subtitle: "This is my new custom page", - content: "Text for new custom page with a link to https://consul.dev", - print_content_flag: true, - locale: "en" + title_en: "Custom page", + subtitle_en: "This is my new custom page", + content_en: "Text for new custom page with a link to https://consul.dev", + print_content_flag: true ) visit custom_page.url @@ -95,11 +90,10 @@ feature "Custom Pages" do scenario "Don't show subtitle if its blank" do custom_page = create(:site_customization_page, :published, slug: "slug-without-subtitle", - title: "Custom page", - subtitle: "", - content: "Text for new custom page", - print_content_flag: false, - locale: "en" + title_en: "Custom page", + subtitle_en: "", + content_en: "Text for new custom page", + print_content_flag: false ) visit custom_page.url @@ -113,10 +107,10 @@ feature "Custom Pages" do scenario "Listed in more information page" do custom_page = create(:site_customization_page, :published, - slug: "another-slug", title: "Another custom page", - subtitle: "Subtitle for custom page", - more_info_flag: true, - locale: "en" + slug: "another-slug", + title_en: "Another custom page", + subtitle_en: "Subtitle for custom page", + more_info_flag: true ) visit help_path @@ -126,10 +120,9 @@ feature "Custom Pages" do scenario "Not listed in more information page" do custom_page = create(:site_customization_page, :published, - slug: "another-slug", title: "Another custom page", - subtitle: "Subtitle for custom page", - more_info_flag: false, - locale: "en" + slug: "another-slug", title_en: "Another custom page", + subtitle_en: "Subtitle for custom page", + more_info_flag: false ) visit help_path @@ -142,24 +135,124 @@ feature "Custom Pages" do expect(page).to have_selector("h1", text: "Another custom page") expect(page).to have_content("Subtitle for custom page") end + end + end + + context "Translation" do + + let(:custom_page) { create(:site_customization_page, :published, + slug: "example-page", + title_en: "Title in English", + title_es: "Titulo en Español", + subtitle_en: "Subtitle in English", + subtitle_es: "Subtitulo en Español", + content_en: "Content in English", + content_es: "Contenido en Español" + ) } - scenario "Not listed in more information page due to different locale" do - custom_page = create(:site_customization_page, :published, - slug: "another-slug", title: "Ce texte est en français", - subtitle: "Subtitle for custom page", - more_info_flag: false, - locale: "fr" - ) + background do + admin = create(:administrator) + login_as(admin.user) + end - visit help_path + before do + @edit_page_url = edit_admin_site_customization_page_path(custom_page) + end - expect(page).not_to have_content("Ce texte est en français") + scenario "Add a translation in Português", :js do + visit @edit_page_url - visit custom_page.url + select "Português", from: "translation_locale" + fill_in 'site_customization_page_title_pt_br', with: 'Titulo em Português' - expect(page).to have_title("Ce texte est en français") - expect(page).to have_selector("h1", text: "Ce texte est en français") - expect(page).to have_content("Subtitle for custom page") + click_button 'Update Custom page' + expect(page).to have_content "Page updated successfully" + + visit @edit_page_url + expect(page).to have_field('site_customization_page_title_en', with: 'Title in English') + + click_link "Español" + expect(page).to have_field('site_customization_page_title_es', with: 'Titulo en Español') + + click_link "Português" + expect(page).to have_field('site_customization_page_title_pt_br', with: 'Titulo em Português') + end + + scenario "Update a translation", :js do + visit @edit_page_url + + click_link "Español" + fill_in 'site_customization_page_title_es', with: 'Titulo correcta en Español' + + click_button 'Update Custom page' + expect(page).to have_content "Page updated successfully" + + visit custom_page.url + + select('English', from: 'locale-switcher') + + expect(page).to have_content("Title in English") + + select('Español', from: 'locale-switcher') + + expect(page).to have_content("Titulo correcta en Español") + end + + scenario "Remove a translation", :js do + visit @edit_page_url + + click_link "Español" + click_link "Remove language" + + expect(page).not_to have_link "Español" + + click_button "Update Custom page" + visit @edit_page_url + expect(page).not_to have_link "Español" + end + + context "Globalize javascript interface" do + + scenario "Highlight current locale", :js do + visit @edit_page_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_page_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_page_url + + expect(page).to have_field('site_customization_page_title_en', with: 'Title in English') + + click_link "Español" + + expect(page).to have_field('site_customization_page_title_es', with: 'Titulo en Español') + end + + scenario "Select a locale and add it to the milestone form", :js do + visit @edit_page_url + + select "Français", from: "translation_locale" + + expect(page).to have_link "Français" + + click_link "Français" + + expect(page).to have_field('site_customization_page_title_fr') end end end