tener una ruta de migración hacia poder ordenar posts

ademas, no depender de la posición en el orden por fechas, salvo al
principio que es lo unico que tenemos
This commit is contained in:
f 2018-05-02 14:23:45 -03:00
parent 443807b772
commit 4379e49629
No known key found for this signature in database
GPG key ID: F3FDAB97B5F9F7E7
7 changed files with 78 additions and 24 deletions

View file

@ -1,13 +1,15 @@
$(document).on('turbolinks:load', function() { $(document).on('turbolinks:load', function() {
var were = $('.order.was').map(function() { return $(this).data('order') });
tableDragger(document.querySelector('.table-draggable'), { tableDragger(document.querySelector('.table-draggable'), {
mode: 'row', mode: 'row',
onlyBody: true, onlyBody: true,
dragHandler: '.handle' dragHandler: '.handle'
}).on('drop', function(from, to, el, mode) { }).on('drop', function(from, to, el, mode) {
// Al soltar, reordenamos toda la tabla // Al soltar, reordenamos toda la tabla
$('.post_order').val(function(i,v) { return i; }); $('.post_order').val(function(i,v) { return were[i]; });
// Mostramos el nuevo orden también // Mostramos el nuevo orden también
$('.order.is').text(function(i,v) { return i; }); $('.order.is').text(function(i,v) { console.log(i, were[i]); return were[i]; });
// Solo mostramos el valor anterior si no coincide con el valor // Solo mostramos el valor anterior si no coincide con el valor
// actual. Como lo mostramos entre comillas, usamos el atributo // actual. Como lo mostramos entre comillas, usamos el atributo
// data-order del <span> // data-order del <span>

View file

@ -35,7 +35,13 @@ class SitesController < ApplicationController
@site = find_site @site = find_site
lang = params.require(:posts).require(:lang) lang = params.require(:posts).require(:lang)
if @site.reorder_collection(lang, params.require(:posts).require(:order)) if params[:posts][:force].present?
result = @site.reorder_collection! lang
else
result = @site.reorder_collection(lang, params.require(:posts).require(:order))
end
if result
flash[:info] = I18n.t('info.posts.reorder') flash[:info] = I18n.t('info.posts.reorder')
else else
flash[:danger] = I18n.t('errors.posts.reorder') flash[:danger] = I18n.t('errors.posts.reorder')

View file

@ -201,19 +201,26 @@ class Site
# new_order es un hash cuya key es la posición actual del post y el # new_order es un hash cuya key es la posición actual del post y el
# valor la posición nueva # valor la posición nueva
def reorder_collection(collection = 'posts', new_order) def reorder_collection(collection = 'posts', new_order)
posts_to_order = posts_for collection # Tenemos que pasar el mismo orden
# No pasa nada si no estamos pasando la misma cantidad de artículos
return if new_order.keys.count != posts_to_order.count
# Y si no estamos pasando el mismo orden
return if new_order.values.map(&:to_i).sort != new_order.keys.map(&:to_i).sort return if new_order.values.map(&:to_i).sort != new_order.keys.map(&:to_i).sort
# Solo traer los posts que vamos a modificar
posts_to_order = posts_for(collection).values_at(*new_order.keys.map(&:to_i))
# Recorre todos los posts y asigna el nuevo orden # Recorre todos los posts y asigna el nuevo orden
posts_to_order.each_with_index do |p, i| posts_to_order.each_with_index do |p, i|
p.update_attributes order: new_order[i.to_s].to_i # Usar el index si el artículo no estaba ordenado, para tener una
# ruta de adopción
oo = (p.order || i).to_s
no = new_order[oo].to_i
# No modificar nada si no hace falta
next if p.order == no
p.update_attributes order: no
p.save p.save
end end
posts_for(collection).map(&:ordered?).all? posts_to_order.map(&:ordered?).all?
end end
# Reordena la colección usando la posición actual de los artículos # Reordena la colección usando la posición actual de los artículos

View file

@ -32,6 +32,7 @@
sort_by: s) sort_by: s)
= form_tag site_reorder_posts_path, method: :post do = form_tag site_reorder_posts_path, method: :post do
= hidden_field 'posts', 'lang', value: @lang = hidden_field 'posts', 'lang', value: @lang
- if @site.ordered? @lang
.reorder-posts-panel.alert.alert-info.alert-dismissible.fade.show{role: 'alert'} .reorder-posts-panel.alert.alert-info.alert-dismissible.fade.show{role: 'alert'}
= raw t('help.posts.reorder') = raw t('help.posts.reorder')
%br %br
@ -39,6 +40,16 @@
%button.close{type: 'button', %button.close{type: 'button',
'aria-label': t('help.close') } 'aria-label': t('help.close') }
%span{'aria-hidden': true} &times; %span{'aria-hidden': true} &times;
- else
.alert.alert-danger.alert-dismissible.fade.show{role: 'alert'}
= raw t('errors.posts.disordered')
%br
= hidden_field 'posts', 'force', value: true
= submit_tag t('errors.posts.disordered_button'), class: 'btn btn-danger'
%button.close{type: 'button',
data: { dismiss: 'alert' },
'aria-label': t('help.close') }
%span{'aria-hidden': true} &times;
%table.table.table-condensed.table-striped.table-draggable %table.table.table-condensed.table-striped.table-draggable
%tbody %tbody
- @posts.each_with_index do |post, i| - @posts.each_with_index do |post, i|
@ -48,15 +59,15 @@
- next unless post.categories.include?(@category) - next unless post.categories.include?(@category)
-# establecer la direccion del texto -# establecer la direccion del texto
- direction = post.get_front_matter(:dir) - direction = post.get_front_matter(:dir)
- order = post.order || i
%tr %tr
- if @site.ordered? @lang
%td %td
= fa_icon 'arrows-v', class: 'handle' = fa_icon 'arrows-v', class: 'handle'
= hidden_field 'posts[order]', i, value: order, class: 'post_order' = hidden_field 'posts[order]', i, value: post.order, class: 'post_order'
%small %small
%br %br
%span.order.is= order %span.order.is= post.order
%span.order.was.d-none{data: { order: order }}= "(#{order})" %span.order.was.d-none{data: { order: post.order }}= "(#{post.order})"
%td{class: direction} %td{class: direction}
= link_to post.title, site_post_path(@site, post, lang: @lang) = link_to post.title, site_post_path(@site, post, lang: @lang)

View file

@ -4,6 +4,8 @@ en:
unknown_locale: 'Unknown %{locale} locale' unknown_locale: 'Unknown %{locale} locale'
posts: posts:
reorder: "We're sorry, we couldn't reorder the articles" reorder: "We're sorry, we couldn't reorder the articles"
disordered: "The posts are disordered, this will prevent you from reordering them!"
disordered_button: 'Reorder!'
info: info:
posts: posts:
reorder: "The articles have been reordered!" reorder: "The articles have been reordered!"

View file

@ -4,6 +4,8 @@ es:
unknown_locale: 'El idioma %{locale} es desconocido' unknown_locale: 'El idioma %{locale} es desconocido'
posts: posts:
reorder: "Lo sentimos, no pudimos reordenar los artículos." reorder: "Lo sentimos, no pudimos reordenar los artículos."
disordered: 'Los artículos no tienen número de orden, esto impedirá que los puedas reordenar'
disordered_button: '¡Reordenar!'
info: info:
posts: posts:
reorder: "¡Los artículos fueron reordenados!" reorder: "¡Los artículos fueron reordenados!"

View file

@ -38,5 +38,29 @@ class SiteTest < ActiveSupport::TestCase
new_order = Hash[order.zip(order.shuffle)] new_order = Hash[order.zip(order.shuffle)]
assert @site.reorder_collection('posts', new_order) assert @site.reorder_collection('posts', new_order)
# podemos hacer este test porque reordenar los posts no ordena el
# array
new_order.each do |k,v|
v = v.to_i
k = k.to_i
assert_equal v, @site.posts[k].order
end
end
test 'Podemos reordenar solo una parte de los artículos' do
total = @site.posts.count
order = (total - rand(total - 1)).times.map { |i| i.to_s }
new_order = Hash[order.zip(order.shuffle)]
assert @site.reorder_collection('posts', new_order)
# podemos hacer este test porque reordenar los posts no ordena el
# array
new_order.each do |k,v|
v = v.to_i
k = k.to_i
assert_equal v, @site.posts[k].order
end
end end
end end