consul/consul

View on GitHub
app/helpers/translatable_form_helper.rb

Summary

Maintainability
A
0 mins
Test Coverage
module TranslatableFormHelper
  def translatable_form_for(record, options = {}, &)
    form_for(record, options.merge(builder: TranslatableFormBuilder), &)
  end

  def translations_interface_enabled?
    Setting["feature.translation_interface"].present? || backend_translations_enabled?
  end

  def backend_translations_enabled?
    controller.class.module_parents.intersect?([Admin, Management, Valuation, SDGManagement])
  end

  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