5
0
Fork 0
mirror of https://0xacab.org/sutty/sutty synced 2024-11-17 07:36:22 +00:00

Merge branch 'issue-10491' into 'rails'
Some checks failed
ci/woodpecker/push/woodpecker Pipeline failed

fix: hacer que los locales sean bidireccionales #10491 #12064

See merge request sutty/sutty!125
This commit is contained in:
fauno 2023-04-10 15:16:08 +00:00
commit d69720096f
6 changed files with 75 additions and 55 deletions

View file

@ -158,6 +158,12 @@ ol.breadcrumb {
transition: all 3s; transition: all 3s;
} }
fieldset {
legend {
font-size: 1rem;
}
}
.mapable, .mapable,
.taggable { .taggable {
.input-map, .input-map,

View file

@ -1,22 +1,49 @@
# frozen_string_literal: true # frozen_string_literal: true
# Los valores de este metadato son artículos en otros idiomas # Los valores de este metadato son artículos en otros idiomas
class MetadataLocales < MetadataTemplate class MetadataLocales < MetadataHasAndBelongsToMany
def default_value
super || []
end
# Todos los valores posibles para cada idioma disponible # Todos los valores posibles para cada idioma disponible
# #
# TODO: Optimizar?
# TODO: Mantener sincronizados
#
# @return { lang: { title: uuid } } # @return { lang: { title: uuid } }
def values def values
@values ||= site.locales.map do |locale| @values ||= site.locales.map do |locale|
[locale, site.posts(lang: locale).map do |post| [locale, posts.where(lang: locale).map do |post|
[post.title.value, post.uuid.value] [title(post), post.uuid.value]
end.to_h] end.to_h]
end.to_h end.to_h
end end
# Siempre hay una relación inversa
#
# @return [True]
def inverse?
true
end
# El campo inverso se llama igual en el otro post
#
# @return [Symbol]
def inverse
:locales
end
private
# Obtiene todos los locales distintos a este post
#
# @return [Array]
def other_locales
site.locales.reject do |locale|
locale == post.lang.value.to_sym
end
end
# Obtiene todos los posts de los otros locales con el mismo layout
#
# @return [PostRelation]
def posts
other_locales.map do |locale|
site.posts(lang: locale).where(layout: post.layout.value)
end.reduce(&:concat) || PostRelation.new(site: site, lang: 'any')
end
end end

View file

@ -1,9 +1,10 @@
%tr{ id: attribute } - if site.locales.count > 1
%th= post_label_t(attribute, post: post) %tr{ id: attribute }
%td %th= post_label_t(attribute, post: post)
%ul %td
- metadata.value.each do |uuid| %ul
- p = site.docs.find(uuid, uuid: true) - metadata.value.each do |uuid|
%li{ dir: t("locales.#{p.lang.value}.dir"), lang: p.lang.value } - p = site.docs.find(uuid, uuid: true)
= link_to p.title.value, %li{ dir: t("locales.#{p.lang.value}.dir"), lang: p.lang.value }
site_post_path(site, p.id, locale: p.lang.value) = link_to p.title.value,
site_post_path(site, p.id, locale: p.lang.value)

View file

@ -1,39 +1,19 @@
-# - if site.locales.count > 1
%fieldset
Crea un input-map para cada idioma por separado. Podríamos hacer uno %legend= post_label_t(attribute, post: post)
solo que tenga todos los idiomas pero puede ser una interfaz confusa.
TODO: Esto permite seleccionar más de una traducción por idioma...
- site.locales.each do |locale|
-# Ignorar el idioma actual
- next if post.lang.value == locale
- locale_t = t("locales.#{locale}.name")
- values = metadata.value.select do |x|
- metadata.values[locale].values.include? x
.form-group
= label_tag "#{base}_#{attribute}_#{locale}", locale_t
.mapable{ dir: t("locales.#{locale}.dir"), lang: locale,
data: { values: values.to_json,
'default-values': metadata.values[locale].to_json,
name: "#{base}[#{attribute}][]",
list: id_for_datalist(attribute, locale),
button: t('posts.attributes.add'),
remove: 'false', legend: locale_t,
described: id_for_help(attribute, locale) } }
= text_field(*field_name_for(base, attribute, '[]'),
value: values.join(', '),
dir: t("locales.#{locale}.dir"), lang: locale,
**field_options(attribute, metadata))
= render 'posts/attribute_feedback', = render 'posts/attribute_feedback',
post: post, post: post, attribute: attribute, metadata: metadata
attribute: [attribute, 'mapable'].flatten,
metadata: metadata
%datalist{ id: id_for_datalist(attribute, locale) } - site.locales.each do |locale|
- metadata.values[locale].keys.each do |value| - next if post.lang.value == locale
%option{ value: value } - locale_t = t("locales.#{locale}.name", default: locale.to_s.humanize)
- value = metadata.value.find do |v|
- metadata.values[locale].values.include? v
.form-group
= label_tag "#{base}_#{attribute}_#{locale}", locale_t
= select_tag("#{plain_field_name_for(base, attribute)}[]",
options_for_select(metadata.values[locale], value),
**field_options(attribute, metadata), include_blank: t('.empty'))

View file

@ -13,6 +13,9 @@ en:
ar: ar:
name: Arabic name: Arabic
dir: rtl dir: rtl
ur:
name: Urdu
dir: rtl
zh: zh:
name: Chinese name: Chinese
dir: ltr dir: ltr

View file

@ -13,6 +13,9 @@ es:
ar: ar:
name: Árabe name: Árabe
dir: rtl dir: rtl
ur:
name: Urdu
dir: rtl
zh: zh:
name: Chino name: Chino
dir: ltr dir: ltr