Merge branch 'paginacion' into rails
This commit is contained in:
commit
ba7d0c2e00
8 changed files with 72 additions and 40 deletions
1
Gemfile
1
Gemfile
|
@ -67,6 +67,7 @@ gem 'terminal-table'
|
||||||
gem 'validates_hostname'
|
gem 'validates_hostname'
|
||||||
gem 'webpacker'
|
gem 'webpacker'
|
||||||
gem 'yaml_db', git: 'https://0xacab.org/sutty/yaml_db.git'
|
gem 'yaml_db', git: 'https://0xacab.org/sutty/yaml_db.git'
|
||||||
|
gem 'kaminari'
|
||||||
|
|
||||||
# database
|
# database
|
||||||
gem 'hairtrigger'
|
gem 'hairtrigger'
|
||||||
|
|
17
Gemfile.lock
17
Gemfile.lock
|
@ -309,6 +309,18 @@ GEM
|
||||||
jekyll-write-and-commit-changes (0.1.2)
|
jekyll-write-and-commit-changes (0.1.2)
|
||||||
jekyll (~> 4)
|
jekyll (~> 4)
|
||||||
rugged (~> 1)
|
rugged (~> 1)
|
||||||
|
kaminari (1.2.1)
|
||||||
|
activesupport (>= 4.1.0)
|
||||||
|
kaminari-actionview (= 1.2.1)
|
||||||
|
kaminari-activerecord (= 1.2.1)
|
||||||
|
kaminari-core (= 1.2.1)
|
||||||
|
kaminari-actionview (1.2.1)
|
||||||
|
actionview
|
||||||
|
kaminari-core (= 1.2.1)
|
||||||
|
kaminari-activerecord (1.2.1)
|
||||||
|
activerecord
|
||||||
|
kaminari-core (= 1.2.1)
|
||||||
|
kaminari-core (1.2.1)
|
||||||
kramdown (2.3.1)
|
kramdown (2.3.1)
|
||||||
rexml
|
rexml
|
||||||
kramdown-parser-gfm (1.1.0)
|
kramdown-parser-gfm (1.1.0)
|
||||||
|
@ -345,6 +357,7 @@ GEM
|
||||||
mini_histogram (0.3.1)
|
mini_histogram (0.3.1)
|
||||||
mini_magick (4.11.0)
|
mini_magick (4.11.0)
|
||||||
mini_mime (1.1.0)
|
mini_mime (1.1.0)
|
||||||
|
mini_portile2 (2.5.3)
|
||||||
minima (2.5.1)
|
minima (2.5.1)
|
||||||
jekyll (>= 3.5, < 5.0)
|
jekyll (>= 3.5, < 5.0)
|
||||||
jekyll-feed (~> 0.9)
|
jekyll-feed (~> 0.9)
|
||||||
|
@ -357,7 +370,8 @@ GEM
|
||||||
net-ssh (6.1.0)
|
net-ssh (6.1.0)
|
||||||
netaddr (2.0.4)
|
netaddr (2.0.4)
|
||||||
nio4r (2.5.7-x86_64-linux-musl)
|
nio4r (2.5.7-x86_64-linux-musl)
|
||||||
nokogiri (1.11.7-x86_64-linux)
|
nokogiri (1.11.7-x86_64-linux-musl)
|
||||||
|
mini_portile2 (~> 2.5.0)
|
||||||
racc (~> 1.4)
|
racc (~> 1.4)
|
||||||
orm_adapter (0.5.0)
|
orm_adapter (0.5.0)
|
||||||
parallel (1.20.1)
|
parallel (1.20.1)
|
||||||
|
@ -667,6 +681,7 @@ DEPENDENCIES
|
||||||
jekyll-data!
|
jekyll-data!
|
||||||
jekyll-images
|
jekyll-images
|
||||||
jekyll-include-cache
|
jekyll-include-cache
|
||||||
|
kaminari
|
||||||
letter_opener
|
letter_opener
|
||||||
listen (>= 3.0.5, < 3.2)
|
listen (>= 3.0.5, < 3.2)
|
||||||
loaf
|
loaf
|
||||||
|
|
|
@ -24,7 +24,7 @@ class PostsController < ApplicationController
|
||||||
# más simple saber si hubo cambios.
|
# más simple saber si hubo cambios.
|
||||||
if stale?([current_usuarie, site, filter_params])
|
if stale?([current_usuarie, site, filter_params])
|
||||||
# Todos los artículos de este sitio para el idioma actual
|
# Todos los artículos de este sitio para el idioma actual
|
||||||
@posts = site.indexed_posts.where(locale: locale)
|
@posts = site.indexed_posts.where(locale: locale).page(filter_params.delete(:page))
|
||||||
# De este tipo
|
# De este tipo
|
||||||
@posts = @posts.where(layout: filter_params[:layout]) if filter_params[:layout]
|
@posts = @posts.where(layout: filter_params[:layout]) if filter_params[:layout]
|
||||||
# Que estén dentro de la categoría
|
# Que estén dentro de la categoría
|
||||||
|
@ -154,7 +154,7 @@ class PostsController < ApplicationController
|
||||||
#
|
#
|
||||||
# @return [Hash]
|
# @return [Hash]
|
||||||
def filter_params
|
def filter_params
|
||||||
@filter_params ||= params.permit(:q, :category, :layout).to_h.select { |_, v| v.present? }
|
@filter_params ||= params.permit(:q, :category, :layout, :page).to_h.select { |_, v| v.present? }
|
||||||
end
|
end
|
||||||
|
|
||||||
def site
|
def site
|
||||||
|
|
|
@ -65,9 +65,6 @@ class Site < ApplicationRecord
|
||||||
|
|
||||||
accepts_nested_attributes_for :deploys, allow_destroy: true
|
accepts_nested_attributes_for :deploys, allow_destroy: true
|
||||||
|
|
||||||
# El sitio en Jekyll
|
|
||||||
attr_reader :jekyll
|
|
||||||
|
|
||||||
# XXX: Es importante incluir luego de los callbacks de :load_jekyll
|
# XXX: Es importante incluir luego de los callbacks de :load_jekyll
|
||||||
include Site::Index
|
include Site::Index
|
||||||
|
|
||||||
|
@ -180,29 +177,28 @@ class Site < ApplicationRecord
|
||||||
|
|
||||||
# Trae los datos del directorio _data dentro del sitio
|
# Trae los datos del directorio _data dentro del sitio
|
||||||
def data
|
def data
|
||||||
unless @jekyll.data.present?
|
unless jekyll.data.present?
|
||||||
@jekyll.reader.read_data
|
run_in_path do
|
||||||
|
jekyll.reader.read_data
|
||||||
# Define los valores por defecto según la llave buscada
|
jekyll.data['layouts'] ||= {}
|
||||||
@jekyll.data.default_proc = proc do |data, key|
|
|
||||||
data[key] = case key
|
|
||||||
when 'layout' then {}
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@jekyll.data
|
jekyll.data
|
||||||
end
|
end
|
||||||
|
|
||||||
# Traer las colecciones. Todos los artículos van a estar dentro de
|
# Traer las colecciones. Todos los artículos van a estar dentro de
|
||||||
# colecciones.
|
# colecciones.
|
||||||
def collections
|
def collections
|
||||||
unless @read
|
unless @read
|
||||||
@jekyll.reader.read_collections
|
run_in_path do
|
||||||
|
jekyll.reader.read_collections
|
||||||
|
end
|
||||||
|
|
||||||
@read = true
|
@read = true
|
||||||
end
|
end
|
||||||
|
|
||||||
@jekyll.collections
|
jekyll.collections
|
||||||
end
|
end
|
||||||
|
|
||||||
# Traer la configuración de forma modificable
|
# Traer la configuración de forma modificable
|
||||||
|
@ -290,7 +286,9 @@ class Site < ApplicationRecord
|
||||||
#
|
#
|
||||||
# @return [Hash]
|
# @return [Hash]
|
||||||
def theme_layouts
|
def theme_layouts
|
||||||
@jekyll.reader.read_layouts
|
run_in_path do
|
||||||
|
jekyll.reader.read_layouts
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
# Trae todos los valores disponibles para un campo
|
# Trae todos los valores disponibles para un campo
|
||||||
|
@ -332,6 +330,12 @@ class Site < ApplicationRecord
|
||||||
status == 'building'
|
status == 'building'
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def jekyll
|
||||||
|
run_in_path do
|
||||||
|
@jekyll ||= Jekyll::Site.new(configuration)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
# Cargar el sitio Jekyll
|
# Cargar el sitio Jekyll
|
||||||
#
|
#
|
||||||
# TODO: En lugar de leer todo junto de una vez, extraer la carga de
|
# TODO: En lugar de leer todo junto de una vez, extraer la carga de
|
||||||
|
@ -345,10 +349,7 @@ class Site < ApplicationRecord
|
||||||
|
|
||||||
def reload_jekyll!
|
def reload_jekyll!
|
||||||
reset
|
reset
|
||||||
|
jekyll
|
||||||
Dir.chdir(path) do
|
|
||||||
@jekyll = Jekyll::Site.new(configuration)
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def reload
|
def reload
|
||||||
|
@ -526,4 +527,8 @@ class Site < ApplicationRecord
|
||||||
errors.add(:design_id,
|
errors.add(:design_id,
|
||||||
I18n.t('activerecord.errors.models.site.attributes.design_id.layout_incompatible.error'))
|
I18n.t('activerecord.errors.models.site.attributes.design_id.layout_incompatible.error'))
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def run_in_path(&block)
|
||||||
|
Dir.chdir path, &block
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -40,7 +40,7 @@
|
||||||
%section.col
|
%section.col
|
||||||
= render 'layouts/flash'
|
= render 'layouts/flash'
|
||||||
.d-flex.justify-content-between.align-items-center.pl-2-plus.pr-2-plus.mb-2
|
.d-flex.justify-content-between.align-items-center.pl-2-plus.pr-2-plus.mb-2
|
||||||
%form
|
%form{ action: site_posts_path }
|
||||||
- @filter_params.each do |param, value|
|
- @filter_params.each do |param, value|
|
||||||
- next if param == 'q'
|
- next if param == 'q'
|
||||||
%input{ type: 'hidden', name: param, value: value }
|
%input{ type: 'hidden', name: param, value: value }
|
||||||
|
@ -72,14 +72,20 @@
|
||||||
%thead
|
%thead
|
||||||
%tr
|
%tr
|
||||||
%th.border-0.background-white.position-sticky{ style: 'top: 0; z-index: 2', colspan: '4' }
|
%th.border-0.background-white.position-sticky{ style: 'top: 0; z-index: 2', colspan: '4' }
|
||||||
= submit_tag t('posts.reorder.submit'), class: 'btn'
|
.d-flex.flex-row.justify-content-between
|
||||||
%button.btn{ data: { action: 'reorder#unselect' } }
|
%div
|
||||||
= t('posts.reorder.unselect')
|
= submit_tag t('posts.reorder.submit'), class: 'btn'
|
||||||
%span.badge{ data: { target: 'reorder.counter' } } 0
|
%button.btn{ data: { action: 'reorder#unselect' } }
|
||||||
%button.btn{ data: { action: 'reorder#up' } }= t('posts.reorder.up')
|
= t('posts.reorder.unselect')
|
||||||
%button.btn{ data: { action: 'reorder#down' } }= t('posts.reorder.down')
|
%span.badge{ data: { target: 'reorder.counter' } } 0
|
||||||
%button.btn{ data: { action: 'reorder#top' } }= t('posts.reorder.top')
|
%button.btn{ data: { action: 'reorder#up' } }= t('posts.reorder.up')
|
||||||
%button.btn{ data: { action: 'reorder#bottom' } }= t('posts.reorder.bottom')
|
%button.btn{ data: { action: 'reorder#down' } }= t('posts.reorder.down')
|
||||||
|
%button.btn{ data: { action: 'reorder#top' } }= t('posts.reorder.top')
|
||||||
|
%button.btn{ data: { action: 'reorder#bottom' } }= t('posts.reorder.bottom')
|
||||||
|
|
||||||
|
%div
|
||||||
|
= link_to_prev_page @posts, t('posts.prev'), class: 'btn'
|
||||||
|
= link_to_next_page @posts, t('posts.next'), class: 'btn'
|
||||||
%tbody
|
%tbody
|
||||||
- dir = t("locales.#{@locale}.dir")
|
- dir = t("locales.#{@locale}.dir")
|
||||||
- size = @posts.size
|
- size = @posts.size
|
||||||
|
@ -104,19 +110,19 @@
|
||||||
%span{ lang: post.locale, dir: dir }= post.title
|
%span{ lang: post.locale, dir: dir }= post.title
|
||||||
- if post.front_matter['draft'].present?
|
- if post.front_matter['draft'].present?
|
||||||
%span.badge.badge-primary= I18n.t('posts.attributes.draft.label')
|
%span.badge.badge-primary= I18n.t('posts.attributes.draft.label')
|
||||||
- if post.front_matter['categories'].present?
|
%br
|
||||||
%br
|
%small
|
||||||
%small
|
= link_to @site.layouts[post.layout].humanized_name, site_posts_path(@site, **@filter_params.merge(layout: post.layout))
|
||||||
- post.front_matter['categories'].each do |category|
|
- post.front_matter['categories']&.each do |category|
|
||||||
= link_to site_posts_path(@site, **@filter_params.merge(category: category)) do
|
= link_to site_posts_path(@site, **@filter_params.merge(category: category)) do
|
||||||
%span{ lang: post.locale, dir: dir }= category
|
%span{ lang: post.locale, dir: dir }= category
|
||||||
= '/' unless post.front_matter['categories'].last == category
|
= '/' unless post.front_matter['categories'].last == category
|
||||||
|
|
||||||
%td
|
%td.text-nowrap
|
||||||
= post.created_at.strftime('%F')
|
= post.created_at.strftime('%F')
|
||||||
%br/
|
%br/
|
||||||
= post.order
|
= post.order
|
||||||
%td
|
%td.text-nowrap
|
||||||
- if @usuarie || policy(post).edit?
|
- if @usuarie || policy(post).edit?
|
||||||
= link_to t('posts.edit'), edit_site_post_path(@site, post.path), class: 'btn btn-block'
|
= link_to t('posts.edit'), edit_site_post_path(@site, post.path), class: 'btn btn-block'
|
||||||
- if @usuarie || policy(post).destroy?
|
- if @usuarie || policy(post).destroy?
|
||||||
|
|
|
@ -376,6 +376,8 @@ en:
|
||||||
en: 'English'
|
en: 'English'
|
||||||
ar: 'Arabic'
|
ar: 'Arabic'
|
||||||
posts:
|
posts:
|
||||||
|
prev: Previous page
|
||||||
|
next: Next page
|
||||||
empty: "There are no results for those search parameters."
|
empty: "There are no results for those search parameters."
|
||||||
caption: Post list
|
caption: Post list
|
||||||
attribute_ro:
|
attribute_ro:
|
||||||
|
|
|
@ -384,6 +384,8 @@ es:
|
||||||
en: 'inglés'
|
en: 'inglés'
|
||||||
ar: 'árabe'
|
ar: 'árabe'
|
||||||
posts:
|
posts:
|
||||||
|
prev: Página anterior
|
||||||
|
next: Página siguiente
|
||||||
empty: No hay artículos con estos parámetros de búsqueda.
|
empty: No hay artículos con estos parámetros de búsqueda.
|
||||||
caption: Lista de artículos
|
caption: Lista de artículos
|
||||||
attribute_ro:
|
attribute_ro:
|
||||||
|
|
|
@ -60,6 +60,7 @@ Rails.application.routes.draw do
|
||||||
scope '(:locale)' do
|
scope '(:locale)' do
|
||||||
post :'posts/reorder', to: 'posts#reorder'
|
post :'posts/reorder', to: 'posts#reorder'
|
||||||
resources :posts do
|
resources :posts do
|
||||||
|
get 'p/:page', action: :index, on: :collection
|
||||||
get :preview, to: 'posts#preview'
|
get :preview, to: 'posts#preview'
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
Loading…
Reference in a new issue