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
|