diff --git a/app/lib/consul_form_builder.rb b/app/form_builders/consul_form_builder.rb similarity index 100% rename from app/lib/consul_form_builder.rb rename to app/form_builders/consul_form_builder.rb diff --git a/app/form_builders/custom/.keep b/app/form_builders/custom/.keep new file mode 100644 index 000000000..e69de29bb diff --git a/app/form_builders/translatable_form_builder.rb b/app/form_builders/translatable_form_builder.rb new file mode 100644 index 000000000..e185542ff --- /dev/null +++ b/app/form_builders/translatable_form_builder.rb @@ -0,0 +1,71 @@ +class TranslatableFormBuilder < ConsulFormBuilder + attr_accessor :translations + + def translatable_fields(&) + @translations = {} + visible_locales.map do |locale| + @translations[locale] = translation_for(locale) + end + safe_join(visible_locales.map do |locale| + Globalize.with_locale(locale) { fields_for_locale(locale, &) } + end) + end + + private + + def fields_for_locale(locale) + fields_for_translation(@translations[locale]) do |translations_form| + @template.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, &) + fields_for(:translations, translation, builder: TranslationsFieldsFormBuilder, &) + end + + def translation_for(locale) + existing_translation_for(locale) || new_translation_for(locale) + end + + def existing_translation_for(locale) + @object.translations.find { |translation| translation.locale == locale } + end + + def new_translation_for(locale) + @object.translations.new(locale: locale).tap(&:mark_for_destruction) + 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 diff --git a/app/form_builders/translations_fields_form_builder.rb b/app/form_builders/translations_fields_form_builder.rb new file mode 100644 index 000000000..e33d8f15f --- /dev/null +++ b/app/form_builders/translations_fields_form_builder.rb @@ -0,0 +1,5 @@ +class TranslationsFieldsFormBuilder < ConsulFormBuilder + def locale + @object.locale + end +end diff --git a/app/helpers/translatable_form_helper.rb b/app/helpers/translatable_form_helper.rb index f77ca0b00..d67b5fe95 100644 --- a/app/helpers/translatable_form_helper.rb +++ b/app/helpers/translatable_form_helper.rb @@ -14,82 +14,4 @@ module TranslatableFormHelper def highlight_translation_html_class "highlight" if translations_interface_enabled? end - - class TranslatableFormBuilder < ConsulFormBuilder - attr_accessor :translations - - def translatable_fields(&) - @translations = {} - visible_locales.map do |locale| - @translations[locale] = translation_for(locale) - end - safe_join(visible_locales.map do |locale| - Globalize.with_locale(locale) { fields_for_locale(locale, &) } - end) - end - - private - - def fields_for_locale(locale) - fields_for_translation(@translations[locale]) do |translations_form| - @template.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, &) - fields_for(:translations, translation, builder: TranslationsFieldsBuilder, &) - end - - def translation_for(locale) - existing_translation_for(locale) || new_translation_for(locale) - end - - def existing_translation_for(locale) - @object.translations.find { |translation| translation.locale == locale } - end - - def new_translation_for(locale) - @object.translations.new(locale: locale).tap(&:mark_for_destruction) - 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 < ConsulFormBuilder - def locale - @object.locale - end - end end diff --git a/config/application.rb b/config/application.rb index deaf238f6..ca6317e38 100644 --- a/config/application.rb +++ b/config/application.rb @@ -136,6 +136,7 @@ module Consul [ "app/components/custom", "app/controllers/custom", + "app/form_builders/custom", "app/graphql/custom", "app/lib/custom", "app/mailers/custom", diff --git a/spec/lib/consul_form_builder_spec.rb b/spec/form_builders/consul_form_builder_spec.rb similarity index 100% rename from spec/lib/consul_form_builder_spec.rb rename to spec/form_builders/consul_form_builder_spec.rb