ordenar más exactamente
This commit is contained in:
parent
3c8babb7d4
commit
5c48a2da5e
8 changed files with 30 additions and 28 deletions
|
@ -8,9 +8,7 @@ $(document).on('turbolinks:load', function() {
|
||||||
onlyBody: true,
|
onlyBody: true,
|
||||||
dragHandler: '.handle'
|
dragHandler: '.handle'
|
||||||
}).on('drop', function(from, to, el, mode) {
|
}).on('drop', function(from, to, el, mode) {
|
||||||
// TODO: Detenerse al llegar al elemento que se movió
|
|
||||||
$('.reorder').val(function(i,v) { return i; });
|
$('.reorder').val(function(i,v) { return i; });
|
||||||
|
|
||||||
$('.submit-reorder').removeClass('d-none');
|
$('.submit-reorder').removeClass('d-none');
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
|
@ -11,15 +11,6 @@ class PostsController < ApplicationController
|
||||||
@category = session[:category] = params.dig(:category)
|
@category = session[:category] = params.dig(:category)
|
||||||
# TODO: Aplicar policy_scope
|
# TODO: Aplicar policy_scope
|
||||||
@posts = @site.posts(lang: I18n.locale)
|
@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
|
end
|
||||||
|
|
||||||
def show
|
def show
|
||||||
|
|
|
@ -60,6 +60,10 @@ class Post < OpenStruct
|
||||||
path.basename
|
path.basename
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def sha1
|
||||||
|
Digest::SHA1.hexdigest id
|
||||||
|
end
|
||||||
|
|
||||||
# Levanta un error si al construir el artículo no pasamos un atributo.
|
# Levanta un error si al construir el artículo no pasamos un atributo.
|
||||||
def default_attributes_missing(**args)
|
def default_attributes_missing(**args)
|
||||||
DEFAULT_ATTRIBUTES.each do |attr|
|
DEFAULT_ATTRIBUTES.each do |attr|
|
||||||
|
|
|
@ -33,9 +33,10 @@ class PostRelation < Array
|
||||||
|
|
||||||
alias find_generic find
|
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|
|
find_generic do |p|
|
||||||
p.id == id
|
p.sha1 == (sha1 ? id : Digest::SHA1.hexdigest(id))
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -39,26 +39,21 @@ PostService = Struct.new(:site, :usuarie, :post, :params, keyword_init: true) do
|
||||||
post
|
post
|
||||||
end
|
end
|
||||||
|
|
||||||
# Reordena todos los posts que soporten orden de acuerdo a un array
|
# Reordena todos los posts que soporten orden de acuerdo a un hash de
|
||||||
# con las nuevas posiciones. La posición actual la da la posición en
|
# ids y nuevas posiciones. La posición actual la da la posición en
|
||||||
# el array.
|
# el array.
|
||||||
#
|
#
|
||||||
# [ 1, 0, 2 ] => mover el elemento 2 a la posición 1, mantener 3
|
# { sha1 => 2, sha1 => 1, sha1 => 0 }
|
||||||
def reorder
|
def reorder
|
||||||
posts = site.posts(lang: lang)
|
posts = site.posts(lang: lang)
|
||||||
reorder = params.require(:post).permit(reorder: [])
|
reorder = params.require(:post).permit(reorder: {}).try(:[], :reorder)
|
||||||
.try(:[], :reorder)
|
|
||||||
.try(:map, &:to_i) || []
|
|
||||||
|
|
||||||
# Tenemos que pasar un array con la misma cantidad de elementos
|
files = reorder.keys.map do |id|
|
||||||
return false if reorder.size != posts.size
|
post = posts.find(id, sha1: true)
|
||||||
|
|
||||||
files = reorder.map.with_index do |new, cur|
|
|
||||||
post = posts[cur]
|
|
||||||
next unless post.attributes.include? :order
|
next unless post.attributes.include? :order
|
||||||
|
|
||||||
post.usuaries << usuarie
|
post.usuaries << usuarie
|
||||||
post.order.value = new
|
post.order.value = reorder[id].to_i
|
||||||
post.path.absolute
|
post.path.absolute
|
||||||
end.compact
|
end.compact
|
||||||
|
|
||||||
|
|
|
@ -42,7 +42,8 @@
|
||||||
%td
|
%td
|
||||||
.handle
|
.handle
|
||||||
= image_tag 'arrows-alt-v.svg'
|
= 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
|
%td
|
||||||
= link_to post.title.value,
|
= link_to post.title.value,
|
||||||
site_post_path(@site, post.id)
|
site_post_path(@site, post.id)
|
||||||
|
|
|
@ -13,3 +13,13 @@ Como el orden es un metadato, tenemos que ignorar los tipos de posts que
|
||||||
no lo tienen
|
no lo tienen
|
||||||
|
|
||||||
El orden por defecto es orden natural, más bajo es más alto.
|
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.
|
||||||
|
|
|
@ -145,7 +145,7 @@ class PostsControllerTest < ActionDispatch::IntegrationTest
|
||||||
test 'se pueden reordenar' do
|
test 'se pueden reordenar' do
|
||||||
lang = I18n.available_locales.sample
|
lang = I18n.available_locales.sample
|
||||||
posts = @site.posts(lang: lang)
|
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),
|
post site_posts_reorder_url(@site),
|
||||||
headers: @authorization,
|
headers: @authorization,
|
||||||
|
@ -156,6 +156,8 @@ class PostsControllerTest < ActionDispatch::IntegrationTest
|
||||||
assert_equal I18n.t('post_service.reorder'),
|
assert_equal I18n.t('post_service.reorder'),
|
||||||
@site.repository.rugged.head.target.message
|
@site.repository.rugged.head.target.message
|
||||||
assert_equal reorder,
|
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
|
||||||
end
|
end
|
||||||
|
|
Loading…
Reference in a new issue