articulos relacionados, sin filtro
This commit is contained in:
parent
2286ddfa5b
commit
c8bdec242e
10 changed files with 113 additions and 586 deletions
|
@ -1,5 +1,6 @@
|
|||
//= require rails-ujs
|
||||
//= require turbolinks
|
||||
//= require input-tag/input-tag.js
|
||||
//= require input-map/input-map.js
|
||||
//= require zepto/dist/zepto.min.js
|
||||
//= require_tree .
|
||||
|
|
|
@ -7,4 +7,13 @@ $(document).on('turbolinks:load', function() {
|
|||
props: { ...this.dataset }
|
||||
});
|
||||
});
|
||||
|
||||
$('.mapable').each(function() {
|
||||
this.innerHTML = '';
|
||||
|
||||
new InputMap({
|
||||
target: this,
|
||||
props: { ...this.dataset }
|
||||
});
|
||||
});
|
||||
});
|
||||
|
|
|
@ -142,7 +142,9 @@ ol.breadcrumb {
|
|||
transition: all 3s;
|
||||
}
|
||||
|
||||
.mapable,
|
||||
.taggable {
|
||||
.input-map,
|
||||
.input-tag {
|
||||
legend {
|
||||
@extend .sr-only
|
||||
|
|
23
app/models/metadata_related_posts.rb
Normal file
23
app/models/metadata_related_posts.rb
Normal file
|
@ -0,0 +1,23 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
# Devuelve una lista de títulos y UUID de todos los posts del mismo
|
||||
# idioma que el actual, para usar con input-map.js
|
||||
class MetadataRelatedPosts < MetadataArray
|
||||
# Genera un Hash de { title | slug => uuid }
|
||||
def values
|
||||
site.posts(lang: lang).map do |p|
|
||||
{ title(p) => p.uuid.value }
|
||||
end.inject(:merge)
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def title(post)
|
||||
post.try(:title).try(:value) || post.try(:slug).try(:value)
|
||||
end
|
||||
|
||||
# TODO: Traer el idioma actual de otra forma
|
||||
def lang
|
||||
post.try(:lang).try(:value) || I18n.locale
|
||||
end
|
||||
end
|
11
app/views/posts/attribute_ro/_related_posts.haml
Normal file
11
app/views/posts/attribute_ro/_related_posts.haml
Normal file
|
@ -0,0 +1,11 @@
|
|||
%tr{ id: attribute }
|
||||
%th= post_label_t(attribute, post: post)
|
||||
%td
|
||||
%ul
|
||||
- metadata.value.each do |v|
|
||||
- p = site.posts(lang: post.lang.value).find(v, uuid: true)
|
||||
-#
|
||||
XXX: Ignorar todos los posts no encontrados (ej: fueron
|
||||
borrados o el uuid cambió)
|
||||
- next unless p
|
||||
%li= link_to p.title.value, site_post_path(site, p.id)
|
19
app/views/posts/attributes/_related_posts.haml
Normal file
19
app/views/posts/attributes/_related_posts.haml
Normal file
|
@ -0,0 +1,19 @@
|
|||
.form-group
|
||||
= label_tag "post_#{attribute}", post_label_t(attribute, post: post)
|
||||
|
||||
.mapable{ data: { values: metadata.value.to_json,
|
||||
'default-values': metadata.values.to_json,
|
||||
name: "post[#{attribute}][]", list: id_for_datalist(attribute),
|
||||
remove: 'false', legend: post_label_t(attribute, post: post),
|
||||
described: id_for_help(attribute) } }
|
||||
|
||||
= text_field(*field_name_for('post', attribute, '[]'),
|
||||
value: metadata.value.join(', '),
|
||||
**field_options(attribute, metadata))
|
||||
|
||||
= render 'posts/attribute_feedback',
|
||||
post: post, attribute: attribute, metadata: metadata
|
||||
|
||||
%datalist{ id: id_for_datalist(attribute) }
|
||||
- metadata.values.keys.each do |value|
|
||||
%option{ value: value }
|
|
@ -26,6 +26,7 @@
|
|||
= render("posts/attribute_ro/#{metadata.type}",
|
||||
post: @post, attribute: attr,
|
||||
metadata: metadata,
|
||||
site: @site,
|
||||
tags: all_html_tags)
|
||||
|
||||
-# Mostrar todo lo que no va en el front_matter (el contenido)
|
||||
|
|
28
doc/uuid.md
Normal file
28
doc/uuid.md
Normal file
|
@ -0,0 +1,28 @@
|
|||
# Identificadores para los artículos
|
||||
|
||||
Para poder vincular artículos entre sí y para otros usos, necesitamos
|
||||
identificarlos únicamente. Un identificador incremental es problemático
|
||||
porque tendríamos que mantener el estado y poder responder preguntas
|
||||
como ¿cuál es el último identificador que asignamos?
|
||||
|
||||
Para poder identificar artículos sin mantener estado, usamos
|
||||
[UUIDs](https://en.wikipedia.org/wiki/Universally_unique_identifier),
|
||||
que son cadenas aleatorias que se pueden asignar adhoc. Así, en lugar
|
||||
de un ID numérico que va incrementando, podemos asociar cadenas al
|
||||
estilo `fb4a5048-5fa1-4b85-b70e-6c502feecdb9` (generada con la
|
||||
herramienta `uuidgen`).
|
||||
|
||||
## MetadataUUID
|
||||
|
||||
Cada artículo se crea con un metadato `uuid` cuyo valor por defecto es
|
||||
un UUID autogenerado utilizando `SecureRandom.uuid`. Este valor no
|
||||
cambia (a menos que se lo vacíe intencionalmente).
|
||||
|
||||
## Migración
|
||||
|
||||
Para todos los artículos que existen, hay que escribir una migración que
|
||||
se los agregue.
|
||||
|
||||
Para esto hay que cargar sitio por sitio, recorrer los artículos
|
||||
asignando un UUID y guardando todos los cambios como un solo commit de
|
||||
git.
|
|
@ -5,13 +5,13 @@
|
|||
"@rails/actiontext": "^6.0.0",
|
||||
"@rails/webpacker": "^4.0.7",
|
||||
"commonmark": "^0.29.0",
|
||||
"input-map": "https://0xacab.org/sutty/input-map.git",
|
||||
"input-tag": "https://0xacab.org/sutty/input-tag.git",
|
||||
"table-dragger": "https://0xacab.org/sutty/table-dragger.git",
|
||||
"trix": "https://0xacab.org/sutty/trix.git",
|
||||
"zepto": "^1.2.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"glyphhanger": "^3.2.0",
|
||||
"webpack-dev-server": "^3.8.0"
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue