diff --git a/app/assets/javascripts/globalize.js.coffee b/app/assets/javascripts/globalize.js.coffee index 374d2b299..81e336ad6 100644 --- a/app/assets/javascripts/globalize.js.coffee +++ b/app/assets/javascripts/globalize.js.coffee @@ -34,10 +34,13 @@ App.Globalize = App.Globalize.disable_locale(locale) enable_locale: (locale) -> - $("#enabled_translations_" + locale).val(1) + App.Globalize.destroy_locale_field(locale).val(false) disable_locale: (locale) -> - $("#enabled_translations_" + locale).val(0) + App.Globalize.destroy_locale_field(locale).val(true) + + destroy_locale_field: (locale) -> + $(".destroy_locale[data-locale=" + locale + "]") refresh_visible_translations: -> locale = $('.js-globalize-locale-link.is-active').data("locale") diff --git a/app/controllers/admin/banners_controller.rb b/app/controllers/admin/banners_controller.rb index b17c17d1b..05656b6d7 100644 --- a/app/controllers/admin/banners_controller.rb +++ b/app/controllers/admin/banners_controller.rb @@ -38,10 +38,9 @@ class Admin::BannersController < Admin::BaseController private def banner_params - attributes = [:title, :description, :target_url, - :post_started_at, :post_ended_at, + attributes = [:target_url, :post_started_at, :post_ended_at, :background_color, :font_color, - *translation_params(Banner), + translation_params(Banner), web_section_ids: []] params.require(:banner).permit(*attributes) end diff --git a/app/controllers/concerns/translatable.rb b/app/controllers/concerns/translatable.rb index 0acc874d8..272a97e99 100644 --- a/app/controllers/concerns/translatable.rb +++ b/app/controllers/concerns/translatable.rb @@ -1,29 +1,13 @@ module Translatable extend ActiveSupport::Concern - included do - before_action :delete_translations, only: [:update] - end - private def translation_params(resource_model) - return [] unless params[:enabled_translations] - - resource_model.translated_attribute_names.product(enabled_translations).map do |attr_name, loc| - resource_model.localized_attr_name_for(attr_name, loc) - end - end - - def delete_translations - locales = resource.translated_locales - .select { |l| params.dig(:enabled_translations, l) == "0" } - - locales.each do |l| - Globalize.with_locale(l) do - resource.translation.destroy - end - end + { + translations_attributes: [:id, :_destroy, :locale] + + resource_model.translated_attribute_names + } end def enabled_translations diff --git a/app/helpers/translatable_form_helper.rb b/app/helpers/translatable_form_helper.rb index 1e468c4ce..e96ecfa28 100644 --- a/app/helpers/translatable_form_helper.rb +++ b/app/helpers/translatable_form_helper.rb @@ -1,13 +1,6 @@ module TranslatableFormHelper - def translatable_form_for(record_or_record_path, options = {}) - object = record_or_record_path.is_a?(Array) ? record_or_record_path.last : record_or_record_path - - form_for(record_or_record_path, options.merge(builder: TranslatableFormBuilder)) do |f| - - object.globalize_locales.each do |locale| - concat translation_enabled_tag(locale, enable_locale?(object, locale)) - end - + def translatable_form_for(record, options = {}) + form_for(record, options.merge(builder: TranslatableFormBuilder)) do |f| yield(f) end end @@ -39,29 +32,30 @@ module TranslatableFormHelper translatable_field(:cktext_area, method, options) end + def translatable_fields(&block) + @object.globalize_locales.map do |locale| + Globalize.with_locale(locale) do + fields_for(:translations, @object.translations.where(locale: locale).first_or_initialize) do |translations_form| + @template.concat translations_form.hidden_field( + :_destroy, + value: !@template.enable_locale?(@object, locale), + class: "destroy_locale", + data: { locale: locale }) + + @template.concat translations_form.hidden_field(:locale, value: locale) + + yield translations_form, locale + end + end + end.join.html_safe + end + private def translatable_field(field_type, method, options = {}) - @template.capture do - @object.globalize_locales.each do |locale| - Globalize.with_locale(locale) do - localized_attr_name = @object.localized_attr_name_for(method, locale) - - label_without_locale = @object.class.human_attribute_name(method) - final_options = @template.merge_translatable_field_options(options, locale) - .reverse_merge(label: label_without_locale) - - if field_type == :cktext_area - @template.concat content_tag :div, send(field_type, localized_attr_name, final_options), - class: "js-globalize-attribute", - style: @template.display_translation?(locale), - data: { locale: locale } - else - @template.concat send(field_type, localized_attr_name, final_options) - end - end - end - end + locale = options.delete(:locale) + final_options = @template.merge_translatable_field_options(options, locale) + send(field_type, method, final_options) end end end diff --git a/app/models/banner.rb b/app/models/banner.rb index 37824d01f..10399211b 100644 --- a/app/models/banner.rb +++ b/app/models/banner.rb @@ -6,10 +6,13 @@ class Banner < ActiveRecord::Base translates :title, touch: true translates :description, touch: true globalize_accessors + accepts_nested_attributes_for :translations, allow_destroy: true + + translation_class.instance_eval do + validates :title, presence: true, length: { minimum: 2 } + validates :description, presence: true + end - validates :title, presence: true, - length: { minimum: 2 } - validates :description, presence: true validates :target_url, presence: true validates :post_started_at, presence: true validates :post_ended_at, presence: true diff --git a/app/views/admin/banners/_form.html.erb b/app/views/admin/banners/_form.html.erb index 28e8a7192..9d6d971a7 100644 --- a/app/views/admin/banners/_form.html.erb +++ b/app/views/admin/banners/_form.html.erb @@ -28,13 +28,26 @@