Add Globalize to Milestones
This commit is contained in:
2
Gemfile
2
Gemfile
@@ -51,6 +51,8 @@ gem 'turnout', '~> 2.4.0'
|
|||||||
gem 'uglifier', '~> 4.1.2'
|
gem 'uglifier', '~> 4.1.2'
|
||||||
gem 'unicorn', '~> 5.4.0'
|
gem 'unicorn', '~> 5.4.0'
|
||||||
gem 'whenever', '~> 0.10.0', require: false
|
gem 'whenever', '~> 0.10.0', require: false
|
||||||
|
gem 'globalize', '~> 5.0.0'
|
||||||
|
gem 'globalize-accessors', '~> 0.2.1'
|
||||||
|
|
||||||
source 'https://rails-assets.org' do
|
source 'https://rails-assets.org' do
|
||||||
gem 'rails-assets-leaflet'
|
gem 'rails-assets-leaflet'
|
||||||
|
|||||||
@@ -176,6 +176,11 @@ GEM
|
|||||||
geocoder (1.4.4)
|
geocoder (1.4.4)
|
||||||
globalid (0.4.1)
|
globalid (0.4.1)
|
||||||
activesupport (>= 4.2.0)
|
activesupport (>= 4.2.0)
|
||||||
|
globalize (5.0.1)
|
||||||
|
activemodel (>= 4.2.0, < 4.3)
|
||||||
|
activerecord (>= 4.2.0, < 4.3)
|
||||||
|
globalize-accessors (0.2.1)
|
||||||
|
globalize (~> 5.0, >= 5.0.0)
|
||||||
graphiql-rails (1.4.8)
|
graphiql-rails (1.4.8)
|
||||||
rails
|
rails
|
||||||
graphql (1.7.8)
|
graphql (1.7.8)
|
||||||
@@ -518,6 +523,8 @@ DEPENDENCIES
|
|||||||
faker (~> 1.8.7)
|
faker (~> 1.8.7)
|
||||||
foundation-rails (~> 6.2.4.0)
|
foundation-rails (~> 6.2.4.0)
|
||||||
foundation_rails_helper (~> 2.0.0)
|
foundation_rails_helper (~> 2.0.0)
|
||||||
|
globalize (~> 5.0.0)
|
||||||
|
globalize-accessors (~> 0.2.1)
|
||||||
graphiql-rails (~> 1.4.1)
|
graphiql-rails (~> 1.4.1)
|
||||||
graphql (~> 1.7.8)
|
graphql (~> 1.7.8)
|
||||||
groupdate (~> 3.2.0)
|
groupdate (~> 3.2.0)
|
||||||
|
|||||||
@@ -77,6 +77,7 @@
|
|||||||
//= require investment_report_alert
|
//= require investment_report_alert
|
||||||
//= require send_newsletter_alert
|
//= require send_newsletter_alert
|
||||||
//= require managers
|
//= require managers
|
||||||
|
//= require globalize
|
||||||
|
|
||||||
var initialize_modules = function() {
|
var initialize_modules = function() {
|
||||||
App.Comments.initialize();
|
App.Comments.initialize();
|
||||||
@@ -121,6 +122,7 @@ var initialize_modules = function() {
|
|||||||
App.InvestmentReportAlert.initialize();
|
App.InvestmentReportAlert.initialize();
|
||||||
App.SendNewsletterAlert.initialize();
|
App.SendNewsletterAlert.initialize();
|
||||||
App.Managers.initialize();
|
App.Managers.initialize();
|
||||||
|
App.Globalize.initialize();
|
||||||
};
|
};
|
||||||
|
|
||||||
$(function(){
|
$(function(){
|
||||||
|
|||||||
31
app/assets/javascripts/globalize.js.coffee
Normal file
31
app/assets/javascripts/globalize.js.coffee
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
App.Globalize =
|
||||||
|
|
||||||
|
display_locale: (locale) ->
|
||||||
|
$(".js-globalize-locale-link").each ->
|
||||||
|
if $(this).data("locale") == locale
|
||||||
|
$(this).show()
|
||||||
|
$(".js-globalize-locale option:selected").removeAttr("selected");
|
||||||
|
return
|
||||||
|
|
||||||
|
display_translations: (locale) ->
|
||||||
|
$(".js-globalize-attribute").each ->
|
||||||
|
console.log("In standard")
|
||||||
|
console.log($(this))
|
||||||
|
if $(this).data("locale") == locale
|
||||||
|
$(this).show()
|
||||||
|
else
|
||||||
|
$(this).hide()
|
||||||
|
|
||||||
|
highlight_locale: (element) ->
|
||||||
|
$('.js-globalize-locale-link').removeClass('highlight');
|
||||||
|
element.addClass('highlight');
|
||||||
|
|
||||||
|
initialize: ->
|
||||||
|
$('.js-globalize-locale').on 'change', ->
|
||||||
|
App.Globalize.display_translations($(this).val())
|
||||||
|
App.Globalize.display_locale($(this).val())
|
||||||
|
|
||||||
|
$('.js-globalize-locale-link').on 'click', ->
|
||||||
|
locale = $(this).data("locale")
|
||||||
|
App.Globalize.display_translations(locale)
|
||||||
|
App.Globalize.highlight_locale($(this))
|
||||||
@@ -1,4 +1,5 @@
|
|||||||
class Admin::BudgetInvestmentMilestonesController < Admin::BaseController
|
class Admin::BudgetInvestmentMilestonesController < Admin::BaseController
|
||||||
|
include Translatable
|
||||||
|
|
||||||
before_action :load_budget_investment, only: [:index, :new, :create, :edit, :update, :destroy]
|
before_action :load_budget_investment, only: [:index, :new, :create, :edit, :update, :destroy]
|
||||||
before_action :load_budget_investment_milestone, only: [:edit, :update, :destroy]
|
before_action :load_budget_investment_milestone, only: [:edit, :update, :destroy]
|
||||||
@@ -46,7 +47,8 @@ class Admin::BudgetInvestmentMilestonesController < Admin::BaseController
|
|||||||
documents_attributes = [:id, :title, :attachment, :cached_attachment, :user_id, :_destroy]
|
documents_attributes = [:id, :title, :attachment, :cached_attachment, :user_id, :_destroy]
|
||||||
attributes = [:title, :description, :publication_date, :budget_investment_id,
|
attributes = [:title, :description, :publication_date, :budget_investment_id,
|
||||||
image_attributes: image_attributes, documents_attributes: documents_attributes]
|
image_attributes: image_attributes, documents_attributes: documents_attributes]
|
||||||
params.require(:budget_investment_milestone).permit(*attributes)
|
|
||||||
|
params.require(:budget_investment_milestone).permit(*attributes, translation_params)
|
||||||
end
|
end
|
||||||
|
|
||||||
def load_budget_investment
|
def load_budget_investment
|
||||||
|
|||||||
19
app/controllers/concerns/translatable.rb
Normal file
19
app/controllers/concerns/translatable.rb
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
module Translatable
|
||||||
|
extend ActiveSupport::Concern
|
||||||
|
|
||||||
|
included do
|
||||||
|
before_action :set_translation_locale
|
||||||
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def translation_params
|
||||||
|
Budget::Investment::Milestone.globalize_attribute_names.
|
||||||
|
select { |k, v| params[:budget_investment_milestone].include?(k.to_sym) && params[:budget_investment_milestone][k].present? }
|
||||||
|
end
|
||||||
|
|
||||||
|
def set_translation_locale
|
||||||
|
Globalize.locale = I18n.locale
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
33
app/helpers/globalize_helper.rb
Normal file
33
app/helpers/globalize_helper.rb
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
module GlobalizeHelper
|
||||||
|
|
||||||
|
def globalize_locale
|
||||||
|
params[:globalize_locale] || I18n.locale
|
||||||
|
end
|
||||||
|
|
||||||
|
def options_for_locale_select
|
||||||
|
options_for_select(locale_options, nil)
|
||||||
|
end
|
||||||
|
|
||||||
|
def locale_options
|
||||||
|
I18n.available_locales.map do |locale|
|
||||||
|
[name_for_locale(locale), locale]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def display_translation?(locale)
|
||||||
|
I18n.locale == locale ? "" : "display: none"
|
||||||
|
end
|
||||||
|
|
||||||
|
def css_to_display_translation?(resource, locale)
|
||||||
|
resource.translated_locales.include?(locale) || locale == I18n.locale ? "" : "display: none"
|
||||||
|
end
|
||||||
|
|
||||||
|
def disable_translation?(locale)
|
||||||
|
locale == "en" ? "" : "disabled"
|
||||||
|
end
|
||||||
|
|
||||||
|
def css_for_globalize_locale(locale)
|
||||||
|
globalize_locale == locale ? "highlight" : ""
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
@@ -7,6 +7,9 @@ class Budget
|
|||||||
max_file_size: 3.megabytes,
|
max_file_size: 3.megabytes,
|
||||||
accepted_content_types: [ "application/pdf" ]
|
accepted_content_types: [ "application/pdf" ]
|
||||||
|
|
||||||
|
translates :description, touch: true
|
||||||
|
globalize_accessors locales: [:en, :es, :fr, :nl, :val]
|
||||||
|
|
||||||
belongs_to :investment
|
belongs_to :investment
|
||||||
|
|
||||||
validates :title, presence: true
|
validates :title, presence: true
|
||||||
|
|||||||
@@ -1,7 +1,23 @@
|
|||||||
|
<div>
|
||||||
|
<%= render "budgets/investments/milestones/globalize_locales" %>
|
||||||
|
</div>
|
||||||
|
|
||||||
<%= form_for [:admin, @investment.budget, @investment, @milestone] do |f| %>
|
<%= form_for [:admin, @investment.budget, @investment, @milestone] do |f| %>
|
||||||
|
|
||||||
<%= f.hidden_field :title, value: l(Time.current, format: :datetime), maxlength: Budget::Investment::Milestone.title_max_length %>
|
<%= f.hidden_field :title, value: l(Time.current, format: :datetime),
|
||||||
<%= f.text_area :description, rows: 5 %>
|
maxlength: Budget::Investment::Milestone.title_max_length %>
|
||||||
|
|
||||||
|
<%= f.label :description, t("admin.milestones.new.description") %>
|
||||||
|
<% @milestone.globalize_locales.each do |locale| %>
|
||||||
|
<% Globalize.with_locale(locale) do %>
|
||||||
|
<%= f.text_area "description_#{locale}", rows: 5,
|
||||||
|
class: "js-globalize-attribute",
|
||||||
|
data: { locale: locale },
|
||||||
|
style: display_translation?(locale),
|
||||||
|
label: false %>
|
||||||
|
<% end %>
|
||||||
|
<% end %>
|
||||||
|
|
||||||
<%= f.label :publication_date, t("admin.milestones.new.date") %>
|
<%= f.label :publication_date, t("admin.milestones.new.date") %>
|
||||||
<%= f.text_field :publication_date,
|
<%= f.text_field :publication_date,
|
||||||
value: @milestone.publication_date.present? ? l(@milestone.publication_date.to_date) : nil,
|
value: @milestone.publication_date.present? ? l(@milestone.publication_date.to_date) : nil,
|
||||||
|
|||||||
@@ -23,7 +23,11 @@
|
|||||||
{ alt: milestone.image.title.unicode_normalize,
|
{ alt: milestone.image.title.unicode_normalize,
|
||||||
class: "margin",
|
class: "margin",
|
||||||
id: "image_#{milestone.id}" }) if milestone.image.present? %>
|
id: "image_#{milestone.id}" }) if milestone.image.present? %>
|
||||||
<p><%= text_with_links milestone.description %></p>
|
<p>
|
||||||
|
<% Globalize.with_locale(locale) do %>
|
||||||
|
<%= text_with_links milestone.description %>
|
||||||
|
<% end %>
|
||||||
|
</p>
|
||||||
<% if milestone.documents.present? %>
|
<% if milestone.documents.present? %>
|
||||||
<div class="document-link text-center">
|
<div class="document-link text-center">
|
||||||
<p>
|
<p>
|
||||||
@@ -45,4 +49,4 @@
|
|||||||
</section>
|
</section>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -0,0 +1,14 @@
|
|||||||
|
<% I18n.available_locales.each do |locale| %>
|
||||||
|
<span>
|
||||||
|
<%= link_to name_for_locale(locale), "#",
|
||||||
|
style: css_to_display_translation?(@milestone, locale),
|
||||||
|
class: "js-globalize-locale-link",
|
||||||
|
data: { locale: locale },
|
||||||
|
remote: true %>
|
||||||
|
</span>
|
||||||
|
<% end %>
|
||||||
|
|
||||||
|
<%= select_tag :translation_locale,
|
||||||
|
options_for_locale_select,
|
||||||
|
prompt: "Añadir idioma",
|
||||||
|
class: "js-globalize-locale" %>
|
||||||
42
app/views/budgets/investments/milestones/_milestone.html.erb
Normal file
42
app/views/budgets/investments/milestones/_milestone.html.erb
Normal file
@@ -0,0 +1,42 @@
|
|||||||
|
<li>
|
||||||
|
<div class="milestone-content">
|
||||||
|
|
||||||
|
<% if milestone.publication_date.present? %>
|
||||||
|
<span class="milestone-date">
|
||||||
|
<strong>
|
||||||
|
<%= t("budgets.investments.show.milestone_publication_date",
|
||||||
|
publication_date: l(milestone.publication_date.to_date)) %>
|
||||||
|
</strong>
|
||||||
|
</span>
|
||||||
|
<% end %>
|
||||||
|
|
||||||
|
<% if milestone.image.present? %>
|
||||||
|
<%= image_tag(milestone.image_url(:large),
|
||||||
|
{ id: "image_#{milestone.id}",
|
||||||
|
alt: milestone.image.title,
|
||||||
|
class: "margin" }) %>
|
||||||
|
<% end %>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
<% Globalize.with_locale(locale) do %>
|
||||||
|
<%= text_with_links milestone.description %>
|
||||||
|
<% end %>
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<% if milestone.documents.present? %>
|
||||||
|
<div class="document-link text-center">
|
||||||
|
<p>
|
||||||
|
<span class="icon-document"></span>
|
||||||
|
<strong><%= t("shared.documentation") %></strong>
|
||||||
|
</p>
|
||||||
|
<% milestone.documents.each do |document| %>
|
||||||
|
<%= link_to document.title,
|
||||||
|
document.attachment.url,
|
||||||
|
target: "_blank",
|
||||||
|
rel: "nofollow" %><br>
|
||||||
|
<% end %>
|
||||||
|
</div>
|
||||||
|
<% end %>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</li>
|
||||||
12
db/migrate/20180323190027_add_translate_milestones.rb
Normal file
12
db/migrate/20180323190027_add_translate_milestones.rb
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
class AddTranslateMilestones < ActiveRecord::Migration
|
||||||
|
def self.up
|
||||||
|
Budget::Investment::Milestone.create_translation_table!({
|
||||||
|
title: :string,
|
||||||
|
description: :text
|
||||||
|
})
|
||||||
|
end
|
||||||
|
|
||||||
|
def self.down
|
||||||
|
Budget::Investment::Milestone.drop_translation_table!
|
||||||
|
end
|
||||||
|
end
|
||||||
12
db/schema.rb
12
db/schema.rb
@@ -118,6 +118,18 @@ ActiveRecord::Schema.define(version: 20180320104823) do
|
|||||||
|
|
||||||
add_index "budget_headings", ["group_id"], name: "index_budget_headings_on_group_id", using: :btree
|
add_index "budget_headings", ["group_id"], name: "index_budget_headings_on_group_id", using: :btree
|
||||||
|
|
||||||
|
create_table "budget_investment_milestone_translations", force: :cascade do |t|
|
||||||
|
t.integer "budget_investment_milestone_id", null: false
|
||||||
|
t.string "locale", null: false
|
||||||
|
t.datetime "created_at", null: false
|
||||||
|
t.datetime "updated_at", null: false
|
||||||
|
t.string "title"
|
||||||
|
t.text "description"
|
||||||
|
end
|
||||||
|
|
||||||
|
add_index "budget_investment_milestone_translations", ["budget_investment_milestone_id"], name: "index_6770e7675fe296cf87aa0fd90492c141b5269e0b", using: :btree
|
||||||
|
add_index "budget_investment_milestone_translations", ["locale"], name: "index_budget_investment_milestone_translations_on_locale", using: :btree
|
||||||
|
|
||||||
create_table "budget_investment_milestones", force: :cascade do |t|
|
create_table "budget_investment_milestones", force: :cascade do |t|
|
||||||
t.integer "investment_id"
|
t.integer "investment_id"
|
||||||
t.string "title", limit: 80
|
t.string "title", limit: 80
|
||||||
|
|||||||
61
spec/features/translations_spec.rb
Normal file
61
spec/features/translations_spec.rb
Normal file
@@ -0,0 +1,61 @@
|
|||||||
|
require 'rails_helper'
|
||||||
|
|
||||||
|
feature "Translations" do
|
||||||
|
|
||||||
|
context "Milestones" do
|
||||||
|
|
||||||
|
let(:investment) { create(:budget_investment) }
|
||||||
|
|
||||||
|
background do
|
||||||
|
admin = create(:administrator)
|
||||||
|
login_as(admin.user)
|
||||||
|
end
|
||||||
|
|
||||||
|
scenario "Add a translation", :js, :focus do
|
||||||
|
milestone = create(:budget_investment_milestone, description: "Description in English")
|
||||||
|
|
||||||
|
edit_milestone_url = edit_admin_budget_budget_investment_budget_investment_milestone_path(investment.budget, investment, milestone)
|
||||||
|
visit edit_milestone_url
|
||||||
|
|
||||||
|
select "Español", from: "translation_locale"
|
||||||
|
fill_in 'budget_investment_milestone_description_es', with: 'Descripción en Español'
|
||||||
|
|
||||||
|
click_button 'Update milestone'
|
||||||
|
expect(page).to have_content "Milestone updated successfully"
|
||||||
|
|
||||||
|
visit edit_milestone_url
|
||||||
|
expect(page).to have_field('budget_investment_milestone_description_en', with: 'Description in English')
|
||||||
|
|
||||||
|
click_link "Español"
|
||||||
|
expect(page).to have_field('budget_investment_milestone_description_es', with: 'Descripción en Español')
|
||||||
|
end
|
||||||
|
|
||||||
|
scenario "Update a translation", :js, :focus do
|
||||||
|
milestone = create(:budget_investment_milestone,
|
||||||
|
investment: investment,
|
||||||
|
description_en: "Description in English",
|
||||||
|
description_es: "Descripción en Español")
|
||||||
|
|
||||||
|
edit_milestone_url = edit_admin_budget_budget_investment_budget_investment_milestone_path(investment.budget, investment, milestone)
|
||||||
|
visit edit_milestone_url
|
||||||
|
|
||||||
|
select "Español", from: "translation_locale"
|
||||||
|
fill_in 'budget_investment_milestone_description_es', with: 'Descripción correcta en Español'
|
||||||
|
|
||||||
|
click_button 'Update milestone'
|
||||||
|
expect(page).to have_content "Milestone updated successfully"
|
||||||
|
|
||||||
|
visit budget_investment_path(investment.budget, investment)
|
||||||
|
|
||||||
|
click_link("Milestones (1)")
|
||||||
|
expect(page).to have_content("Description in English")
|
||||||
|
|
||||||
|
select('Español', from: 'locale-switcher')
|
||||||
|
click_link("Seguimiento (1)")
|
||||||
|
|
||||||
|
expect(page).to have_content("Descripción correcta en Español")
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
Reference in New Issue
Block a user