ordenar más exactamente

This commit is contained in:
f 2019-11-06 19:35:48 -03:00
parent 3c8babb7d4
commit 5c48a2da5e
No known key found for this signature in database
GPG key ID: 2AE5A13E321F953D
8 changed files with 30 additions and 28 deletions

View file

@ -8,9 +8,7 @@ $(document).on('turbolinks:load', function() {
onlyBody: true,
dragHandler: '.handle'
}).on('drop', function(from, to, el, mode) {
// TODO: Detenerse al llegar al elemento que se movió
$('.reorder').val(function(i,v) { return i; });
$('.submit-reorder').removeClass('d-none');
});
});

View file

@ -11,15 +11,6 @@ class PostsController < ApplicationController
@category = session[:category] = params.dig(:category)
# TODO: Aplicar policy_scope
@posts = @site.posts(lang: I18n.locale)
if params[:sort_by].present?
begin
@posts.sort_by! do |p|
p.send(params[:sort_by].to_s)
end
rescue ArgumentError
end
end
end
def show

View file

@ -60,6 +60,10 @@ class Post < OpenStruct
path.basename
end
def sha1
Digest::SHA1.hexdigest id
end
# Levanta un error si al construir el artículo no pasamos un atributo.
def default_attributes_missing(**args)
DEFAULT_ATTRIBUTES.each do |attr|

View file

@ -33,9 +33,10 @@ class PostRelation < Array
alias find_generic find
def find(id)
# Encontra un post por su id convertido a SHA1
def find(id, sha1: false)
find_generic do |p|
p.id == id
p.sha1 == (sha1 ? id : Digest::SHA1.hexdigest(id))
end
end

View file

@ -39,26 +39,21 @@ PostService = Struct.new(:site, :usuarie, :post, :params, keyword_init: true) do
post
end
# Reordena todos los posts que soporten orden de acuerdo a un array
# con las nuevas posiciones. La posición actual la da la posición en
# Reordena todos los posts que soporten orden de acuerdo a un hash de
# ids y nuevas posiciones. La posición actual la da la posición en
# el array.
#
# [ 1, 0, 2 ] => mover el elemento 2 a la posición 1, mantener 3
# { sha1 => 2, sha1 => 1, sha1 => 0 }
def reorder
posts = site.posts(lang: lang)
reorder = params.require(:post).permit(reorder: [])
.try(:[], :reorder)
.try(:map, &:to_i) || []
reorder = params.require(:post).permit(reorder: {}).try(:[], :reorder)
# Tenemos que pasar un array con la misma cantidad de elementos
return false if reorder.size != posts.size
files = reorder.map.with_index do |new, cur|
post = posts[cur]
files = reorder.keys.map do |id|
post = posts.find(id, sha1: true)
next unless post.attributes.include? :order
post.usuaries << usuarie
post.order.value = new
post.order.value = reorder[id].to_i
post.path.absolute
end.compact

View file

@ -42,7 +42,8 @@
%td
.handle
= image_tag 'arrows-alt-v.svg'
= hidden_field 'post[reorder]', '', value: i, class: 'reorder'
= hidden_field 'post[reorder]', post.sha1,
value: i, class: 'reorder'
%td
= link_to post.title.value,
site_post_path(@site, post.id)

View file

@ -13,3 +13,13 @@ Como el orden es un metadato, tenemos que ignorar los tipos de posts que
no lo tienen
El orden por defecto es orden natural, más bajo es más alto.
El problema que tiene esta implementación es que al reordenar los posts
necesitamos mantener el orden original sobre el que estabamos ordenando,
sino terminamos aplicando un orden incorrecto. Esto requiere que
implementemos una forma de mantener el orden entre sesiones e incluso
general. Nos vendría bien para no tener que recargar el sitio una y
otra vez.
Lo más controlado sería enviar exactamente el id del post con su nueva
ubicación en el orden. Esta es la implementación anterior.

View file

@ -145,7 +145,7 @@ class PostsControllerTest < ActionDispatch::IntegrationTest
test 'se pueden reordenar' do
lang = I18n.available_locales.sample
posts = @site.posts(lang: lang)
reorder = posts.each_index.to_a.shuffle
reorder = Hash[posts.map(&:sha1).shuffle.each_with_index.to_a]
post site_posts_reorder_url(@site),
headers: @authorization,
@ -156,6 +156,8 @@ class PostsControllerTest < ActionDispatch::IntegrationTest
assert_equal I18n.t('post_service.reorder'),
@site.repository.rugged.head.target.message
assert_equal reorder,
@site.posts(lang: lang).map(&:order).map(&:value)
Hash[@site.posts(lang: lang).map do |p|
[p.sha1, p.order.value]
end]
end
end