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:
0
app/form_builders/custom/.keep
Normal file
0
app/form_builders/custom/.keep
Normal file
71
app/form_builders/translatable_form_builder.rb
Normal file
71
app/form_builders/translatable_form_builder.rb
Normal 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
|
||||||
5
app/form_builders/translations_fields_form_builder.rb
Normal file
5
app/form_builders/translations_fields_form_builder.rb
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
class TranslationsFieldsFormBuilder < ConsulFormBuilder
|
||||||
|
def locale
|
||||||
|
@object.locale
|
||||||
|
end
|
||||||
|
end
|
||||||
@@ -14,82 +14,4 @@ module TranslatableFormHelper
|
|||||||
def highlight_translation_html_class
|
def highlight_translation_html_class
|
||||||
"highlight" if translations_interface_enabled?
|
"highlight" if translations_interface_enabled?
|
||||||
end
|
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
|
end
|
||||||
|
|||||||
@@ -136,6 +136,7 @@ module Consul
|
|||||||
[
|
[
|
||||||
"app/components/custom",
|
"app/components/custom",
|
||||||
"app/controllers/custom",
|
"app/controllers/custom",
|
||||||
|
"app/form_builders/custom",
|
||||||
"app/graphql/custom",
|
"app/graphql/custom",
|
||||||
"app/lib/custom",
|
"app/lib/custom",
|
||||||
"app/mailers/custom",
|
"app/mailers/custom",
|
||||||
|
|||||||
Reference in New Issue
Block a user