mirror of
https://0xacab.org/sutty/sutty
synced 2024-11-17 04:46:22 +00:00
Merge branch 'issue-10491' into 'rails'
Some checks failed
ci/woodpecker/push/woodpecker Pipeline failed
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:
commit
d69720096f
6 changed files with 75 additions and 55 deletions
|
@ -158,6 +158,12 @@ ol.breadcrumb {
|
|||
transition: all 3s;
|
||||
}
|
||||
|
||||
fieldset {
|
||||
legend {
|
||||
font-size: 1rem;
|
||||
}
|
||||
}
|
||||
|
||||
.mapable,
|
||||
.taggable {
|
||||
.input-map,
|
||||
|
|
|
@ -1,22 +1,49 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
# Los valores de este metadato son artículos en otros idiomas
|
||||
class MetadataLocales < MetadataTemplate
|
||||
def default_value
|
||||
super || []
|
||||
end
|
||||
|
||||
class MetadataLocales < MetadataHasAndBelongsToMany
|
||||
# Todos los valores posibles para cada idioma disponible
|
||||
#
|
||||
# TODO: Optimizar?
|
||||
# TODO: Mantener sincronizados
|
||||
#
|
||||
# @return { lang: { title: uuid } }
|
||||
def values
|
||||
@values ||= site.locales.map do |locale|
|
||||
[locale, site.posts(lang: locale).map do |post|
|
||||
[post.title.value, post.uuid.value]
|
||||
[locale, posts.where(lang: locale).map do |post|
|
||||
[title(post), post.uuid.value]
|
||||
end.to_h]
|
||||
end.to_h
|
||||
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
|
||||
|
|
|
@ -1,9 +1,10 @@
|
|||
%tr{ id: attribute }
|
||||
%th= post_label_t(attribute, post: post)
|
||||
%td
|
||||
%ul
|
||||
- metadata.value.each do |uuid|
|
||||
- p = site.docs.find(uuid, uuid: true)
|
||||
%li{ dir: t("locales.#{p.lang.value}.dir"), lang: p.lang.value }
|
||||
= link_to p.title.value,
|
||||
site_post_path(site, p.id, locale: p.lang.value)
|
||||
- if site.locales.count > 1
|
||||
%tr{ id: attribute }
|
||||
%th= post_label_t(attribute, post: post)
|
||||
%td
|
||||
%ul
|
||||
- metadata.value.each do |uuid|
|
||||
- p = site.docs.find(uuid, uuid: true)
|
||||
%li{ dir: t("locales.#{p.lang.value}.dir"), lang: p.lang.value }
|
||||
= link_to p.title.value,
|
||||
site_post_path(site, p.id, locale: p.lang.value)
|
||||
|
|
|
@ -1,39 +1,19 @@
|
|||
-#
|
||||
|
||||
Crea un input-map para cada idioma por separado. Podríamos hacer uno
|
||||
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))
|
||||
- if site.locales.count > 1
|
||||
%fieldset
|
||||
%legend= post_label_t(attribute, post: post)
|
||||
|
||||
= render 'posts/attribute_feedback',
|
||||
post: post,
|
||||
attribute: [attribute, 'mapable'].flatten,
|
||||
metadata: metadata
|
||||
post: post, attribute: attribute, metadata: metadata
|
||||
|
||||
%datalist{ id: id_for_datalist(attribute, locale) }
|
||||
- metadata.values[locale].keys.each do |value|
|
||||
%option{ value: value }
|
||||
- site.locales.each do |locale|
|
||||
- next if post.lang.value == locale
|
||||
- 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'))
|
||||
|
|
|
@ -13,6 +13,9 @@ en:
|
|||
ar:
|
||||
name: Arabic
|
||||
dir: rtl
|
||||
ur:
|
||||
name: Urdu
|
||||
dir: rtl
|
||||
zh:
|
||||
name: Chinese
|
||||
dir: ltr
|
||||
|
|
|
@ -13,6 +13,9 @@ es:
|
|||
ar:
|
||||
name: Árabe
|
||||
dir: rtl
|
||||
ur:
|
||||
name: Urdu
|
||||
dir: rtl
|
||||
zh:
|
||||
name: Chino
|
||||
dir: ltr
|
||||
|
|
Loading…
Reference in a new issue