Files
grecia/app/helpers/translatable_form_helper.rb
Senén Rodero Rodríguez 907fc18ff7 Override translations _destroy value depending of our translations managment logic
During any translatable resource edit, if you remove all translations
you will be redirected to same form with errors showing you one of
persisted but marked to destroy translations, without this patch
_destroy field value wil be true and you will no able to persist without
re-addding the same language through translation interface.
2019-07-02 17:15:39 +02:00

125 lines
3.6 KiB
Ruby

module TranslatableFormHelper
def translatable_form_for(record, options = {})
options_full = options.merge(builder: TranslatableFormBuilder)
form_for(record, options_full) do |f|
yield(f)
end
end
def translations_interface_enabled?
Setting["feature.translation_interface"].present? || backend_translations_enabled?
end
def backend_translations_enabled?
(controller.class.parents & [Admin, Management, Valuation, Tracking]).any?
end
def highlight_translation_html_class
"highlight" if translations_interface_enabled?
end
class TranslatableFormBuilder < FoundationRailsHelper::FormBuilder
attr_accessor :translations
def translatable_fields(&block)
@translations = {}
visible_locales.map do |locale|
@translations[locale] = translation_for(locale)
end
visible_locales.map do |locale|
Globalize.with_locale(locale) { fields_for_locale(locale, &block) }
end.join.html_safe
end
private
def fields_for_locale(locale, &block)
fields_for_translation(@translations[locale]) do |translations_form|
@template.content_tag :div, translations_options(translations_form.object, locale) do
@template.concat translations_form.hidden_field(
:_destroy,
value: !@template.enabled_locale?(translations_form.object.globalized_model, locale),
data: { locale: locale }
)
@template.concat translations_form.hidden_field(:locale, value: locale)
yield translations_form
end
end
end
def fields_for_translation(translation, &block)
fields_for(:translations, translation, builder: TranslationsFieldsBuilder) do |f|
yield f
end
end
def translation_for(locale)
existing_translation_for(locale) || new_translation_for(locale)
end
def existing_translation_for(locale)
@object.translations.detect { |translation| translation.locale == locale }
end
def new_translation_for(locale)
@object.translations.new(locale: locale).tap do |translation|
translation.mark_for_destruction
end
end
def highlight_translation_html_class
@template.highlight_translation_html_class
end
def translations_options(resource, locale)
{
class: "translatable-fields js-globalize-attribute #{highlight_translation_html_class}",
style: @template.display_translation_style(resource.globalized_model, locale),
data: { locale: locale }
}
end
def no_other_translations?(translation)
(@object.translations - [translation]).reject(&:_destroy).empty?
end
def visible_locales
if @template.translations_interface_enabled?
@object.globalize_locales
else
[I18n.locale]
end
end
end
class TranslationsFieldsBuilder < FoundationRailsHelper::FormBuilder
%i[text_field text_area cktext_area].each do |field|
define_method field do |attribute, options = {}|
custom_label(attribute, options[:label], options[:label_options]) +
help_text(options[:hint]) +
super(attribute, options.merge(label: false, hint: false))
end
end
def locale
@object.locale
end
def label(attribute, text = nil, options = {})
label_options = options.dup
hint = label_options.delete(:hint)
super(attribute, text, label_options) + help_text(hint)
end
private
def help_text(text)
if text
content_tag :span, text, class: "help-text"
end
end
end
end