mirror of
https://0xacab.org/sutty/sutty
synced 2024-11-24 05:46:22 +00:00
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 rails-ujs
|
||||||
//= require turbolinks
|
//= require turbolinks
|
||||||
//= require input-tag/input-tag.js
|
//= require input-tag/input-tag.js
|
||||||
|
//= require input-map/input-map.js
|
||||||
//= require zepto/dist/zepto.min.js
|
//= require zepto/dist/zepto.min.js
|
||||||
//= require_tree .
|
//= require_tree .
|
||||||
|
|
|
@ -7,4 +7,13 @@ $(document).on('turbolinks:load', function() {
|
||||||
props: { ...this.dataset }
|
props: { ...this.dataset }
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
$('.mapable').each(function() {
|
||||||
|
this.innerHTML = '';
|
||||||
|
|
||||||
|
new InputMap({
|
||||||
|
target: this,
|
||||||
|
props: { ...this.dataset }
|
||||||
|
});
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
|
@ -142,7 +142,9 @@ ol.breadcrumb {
|
||||||
transition: all 3s;
|
transition: all 3s;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.mapable,
|
||||||
.taggable {
|
.taggable {
|
||||||
|
.input-map,
|
||||||
.input-tag {
|
.input-tag {
|
||||||
legend {
|
legend {
|
||||||
@extend .sr-only
|
@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}",
|
= render("posts/attribute_ro/#{metadata.type}",
|
||||||
post: @post, attribute: attr,
|
post: @post, attribute: attr,
|
||||||
metadata: metadata,
|
metadata: metadata,
|
||||||
|
site: @site,
|
||||||
tags: all_html_tags)
|
tags: all_html_tags)
|
||||||
|
|
||||||
-# Mostrar todo lo que no va en el front_matter (el contenido)
|
-# 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/actiontext": "^6.0.0",
|
||||||
"@rails/webpacker": "^4.0.7",
|
"@rails/webpacker": "^4.0.7",
|
||||||
"commonmark": "^0.29.0",
|
"commonmark": "^0.29.0",
|
||||||
|
"input-map": "https://0xacab.org/sutty/input-map.git",
|
||||||
"input-tag": "https://0xacab.org/sutty/input-tag.git",
|
"input-tag": "https://0xacab.org/sutty/input-tag.git",
|
||||||
"table-dragger": "https://0xacab.org/sutty/table-dragger.git",
|
"table-dragger": "https://0xacab.org/sutty/table-dragger.git",
|
||||||
"trix": "https://0xacab.org/sutty/trix.git",
|
"trix": "https://0xacab.org/sutty/trix.git",
|
||||||
"zepto": "^1.2.0"
|
"zepto": "^1.2.0"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"glyphhanger": "^3.2.0",
|
|
||||||
"webpack-dev-server": "^3.8.0"
|
"webpack-dev-server": "^3.8.0"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue