Move form builders to their own folder

We were defining one builder in the `app/lib/` folder and another one
inside a helper module.

So now we're grouping them together. This way we're following the "one
class per file" convention that we follow most of the time. And, by
extracting the `TranslatableFormBuilder` class to its own file, it'll be
easier to add tests for it.

Note that, for consistency, we're renaming the
`TranslationsFieldsBuilder` class so it ends in `FormBuilder`.
This commit is contained in:
Javi Martín
2024-05-23 21:14:10 +02:00
parent 26b48e527a
commit c11780880c
7 changed files with 77 additions and 78 deletions

View File

View File

@@ -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

View File

@@ -0,0 +1,5 @@
class TranslationsFieldsFormBuilder < ConsulFormBuilder
def locale
@object.locale
end
end

View File

@@ -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

View File

@@ -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",