5
0
Fork 0
mirror of https://0xacab.org/sutty/sutty synced 2024-11-24 05:56:22 +00:00

articulos relacionados, sin filtro

This commit is contained in:
f 2020-01-28 18:05:59 -03:00
parent 2286ddfa5b
commit c8bdec242e
No known key found for this signature in database
GPG key ID: 2AE5A13E321F953D
10 changed files with 113 additions and 586 deletions

View file

@ -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 .

View file

@ -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 }
});
});
}); });

View file

@ -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

View 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

View 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)

View 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 }

View file

@ -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
View 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.

View file

@ -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"
} }
} }

603
yarn.lock

File diff suppressed because it is too large Load diff