Pagination improvements (#1445)
* Replace will_paginate with kaminari * Use #page instead of #paginate in controllers * Replace will_paginate.page_gap with pagination.truncate in i18n * Customize kaminari views to match prior styles * Set kaminari options to match prior behavior * Replace will_paginate with paginate in views
This commit is contained in:
parent
a283786463
commit
4ada50985a
2
Gemfile
2
Gemfile
|
@ -32,6 +32,7 @@ gem 'htmlentities'
|
||||||
gem 'http'
|
gem 'http'
|
||||||
gem 'http_accept_language'
|
gem 'http_accept_language'
|
||||||
gem 'httplog'
|
gem 'httplog'
|
||||||
|
gem 'kaminari'
|
||||||
gem 'link_header'
|
gem 'link_header'
|
||||||
gem 'nokogiri'
|
gem 'nokogiri'
|
||||||
gem 'oj'
|
gem 'oj'
|
||||||
|
@ -52,7 +53,6 @@ gem 'simple_form'
|
||||||
gem 'statsd-instrument'
|
gem 'statsd-instrument'
|
||||||
gem 'twitter-text'
|
gem 'twitter-text'
|
||||||
gem 'tzinfo-data'
|
gem 'tzinfo-data'
|
||||||
gem 'will_paginate'
|
|
||||||
|
|
||||||
gem 'react-rails'
|
gem 'react-rails'
|
||||||
gem 'browserify-rails'
|
gem 'browserify-rails'
|
||||||
|
|
15
Gemfile.lock
15
Gemfile.lock
|
@ -203,6 +203,18 @@ GEM
|
||||||
railties (>= 4.2.0)
|
railties (>= 4.2.0)
|
||||||
thor (>= 0.14, < 2.0)
|
thor (>= 0.14, < 2.0)
|
||||||
json (2.0.3)
|
json (2.0.3)
|
||||||
|
kaminari (1.0.1)
|
||||||
|
activesupport (>= 4.1.0)
|
||||||
|
kaminari-actionview (= 1.0.1)
|
||||||
|
kaminari-activerecord (= 1.0.1)
|
||||||
|
kaminari-core (= 1.0.1)
|
||||||
|
kaminari-actionview (1.0.1)
|
||||||
|
actionview
|
||||||
|
kaminari-core (= 1.0.1)
|
||||||
|
kaminari-activerecord (1.0.1)
|
||||||
|
activerecord
|
||||||
|
kaminari-core (= 1.0.1)
|
||||||
|
kaminari-core (1.0.1)
|
||||||
launchy (2.4.3)
|
launchy (2.4.3)
|
||||||
addressable (~> 2.3)
|
addressable (~> 2.3)
|
||||||
letter_opener (1.4.1)
|
letter_opener (1.4.1)
|
||||||
|
@ -433,7 +445,6 @@ GEM
|
||||||
websocket-driver (0.6.5)
|
websocket-driver (0.6.5)
|
||||||
websocket-extensions (>= 0.1.0)
|
websocket-extensions (>= 0.1.0)
|
||||||
websocket-extensions (0.1.2)
|
websocket-extensions (0.1.2)
|
||||||
will_paginate (3.1.5)
|
|
||||||
|
|
||||||
PLATFORMS
|
PLATFORMS
|
||||||
ruby
|
ruby
|
||||||
|
@ -472,6 +483,7 @@ DEPENDENCIES
|
||||||
httplog
|
httplog
|
||||||
i18n-tasks (~> 0.9.6)
|
i18n-tasks (~> 0.9.6)
|
||||||
jquery-rails
|
jquery-rails
|
||||||
|
kaminari
|
||||||
letter_opener
|
letter_opener
|
||||||
letter_opener_web
|
letter_opener_web
|
||||||
link_header
|
link_header
|
||||||
|
@ -513,7 +525,6 @@ DEPENDENCIES
|
||||||
tzinfo-data
|
tzinfo-data
|
||||||
uglifier (>= 1.3.0)
|
uglifier (>= 1.3.0)
|
||||||
webmock
|
webmock
|
||||||
will_paginate
|
|
||||||
|
|
||||||
RUBY VERSION
|
RUBY VERSION
|
||||||
ruby 2.4.1p111
|
ruby 2.4.1p111
|
||||||
|
|
|
@ -173,7 +173,7 @@
|
||||||
text-align: center;
|
text-align: center;
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
|
|
||||||
a, .current, .next_page, .previous_page, .gap {
|
a, .current, .page, .gap {
|
||||||
font-size: 14px;
|
font-size: 14px;
|
||||||
color: $color5;
|
color: $color5;
|
||||||
font-weight: 500;
|
font-weight: 500;
|
||||||
|
@ -193,12 +193,12 @@
|
||||||
cursor: default;
|
cursor: default;
|
||||||
}
|
}
|
||||||
|
|
||||||
.previous_page, .next_page {
|
.prev, .next {
|
||||||
text-transform: uppercase;
|
text-transform: uppercase;
|
||||||
color: $color2;
|
color: $color2;
|
||||||
}
|
}
|
||||||
|
|
||||||
.previous_page {
|
.prev {
|
||||||
float: left;
|
float: left;
|
||||||
padding-left: 0;
|
padding-left: 0;
|
||||||
|
|
||||||
|
@ -208,7 +208,7 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.next_page {
|
.next {
|
||||||
float: right;
|
float: right;
|
||||||
padding-right: 0;
|
padding-right: 0;
|
||||||
|
|
||||||
|
@ -226,11 +226,11 @@
|
||||||
@media screen and (max-width: 360px) {
|
@media screen and (max-width: 360px) {
|
||||||
padding: 30px 20px;
|
padding: 30px 20px;
|
||||||
|
|
||||||
a, .current, .next_page, .previous_page, .gap {
|
a, .current, .next, .prev, .gap {
|
||||||
display: none;
|
display: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
.next_page, .previous_page {
|
.next, .prev {
|
||||||
display: inline-block;
|
display: inline-block;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -35,11 +35,11 @@ class AccountsController < ApplicationController
|
||||||
end
|
end
|
||||||
|
|
||||||
def followers
|
def followers
|
||||||
@followers = @account.followers.order('follows.created_at desc').paginate(page: params[:page], per_page: 12)
|
@followers = @account.followers.order('follows.created_at desc').page(params[:page]).per(12)
|
||||||
end
|
end
|
||||||
|
|
||||||
def following
|
def following
|
||||||
@following = @account.following.order('follows.created_at desc').paginate(page: params[:page], per_page: 12)
|
@following = @account.following.order('follows.created_at desc').page(params[:page]).per(12)
|
||||||
end
|
end
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
|
@ -5,7 +5,7 @@ module Admin
|
||||||
before_action :set_account, except: :index
|
before_action :set_account, except: :index
|
||||||
|
|
||||||
def index
|
def index
|
||||||
@accounts = Account.alphabetic.paginate(page: params[:page], per_page: 40)
|
@accounts = Account.alphabetic.page(params[:page])
|
||||||
|
|
||||||
@accounts = @accounts.local if params[:local].present?
|
@accounts = @accounts.local if params[:local].present?
|
||||||
@accounts = @accounts.remote if params[:remote].present?
|
@accounts = @accounts.remote if params[:remote].present?
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
module Admin
|
module Admin
|
||||||
class DomainBlocksController < BaseController
|
class DomainBlocksController < BaseController
|
||||||
def index
|
def index
|
||||||
@blocks = DomainBlock.paginate(page: params[:page], per_page: 40)
|
@blocks = DomainBlock.page(params[:page])
|
||||||
end
|
end
|
||||||
|
|
||||||
def new
|
def new
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
module Admin
|
module Admin
|
||||||
class PubsubhubbubController < BaseController
|
class PubsubhubbubController < BaseController
|
||||||
def index
|
def index
|
||||||
@subscriptions = Subscription.order('id desc').includes(:account).paginate(page: params[:page], per_page: 40)
|
@subscriptions = Subscription.order('id desc').includes(:account).page(params[:page])
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -5,7 +5,7 @@ module Admin
|
||||||
before_action :set_report, except: [:index]
|
before_action :set_report, except: [:index]
|
||||||
|
|
||||||
def index
|
def index
|
||||||
@reports = Report.includes(:account, :target_account).order('id desc').paginate(page: params[:page], per_page: 40)
|
@reports = Report.includes(:account, :target_account).order('id desc').page(params[:page])
|
||||||
@reports = params[:action_taken].present? ? @reports.resolved : @reports.unresolved
|
@reports = params[:action_taken].present? ? @reports.resolved : @reports.unresolved
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -1,12 +0,0 @@
|
||||||
# frozen_string_literal: true
|
|
||||||
|
|
||||||
module AccountsHelper
|
|
||||||
def pagination_options
|
|
||||||
{
|
|
||||||
previous_label: safe_join([fa_icon('chevron-left'), t('pagination.prev')], ' '),
|
|
||||||
next_label: safe_join([t('pagination.next'), fa_icon('chevron-right')], ' '),
|
|
||||||
inner_window: 1,
|
|
||||||
outer_window: 0,
|
|
||||||
}
|
|
||||||
end
|
|
||||||
end
|
|
|
@ -9,4 +9,4 @@
|
||||||
- else
|
- else
|
||||||
= render partial: 'grid_card', collection: @followers, as: :account, cached: true
|
= render partial: 'grid_card', collection: @followers, as: :account, cached: true
|
||||||
|
|
||||||
= will_paginate @followers, pagination_options
|
= paginate @followers
|
||||||
|
|
|
@ -9,4 +9,4 @@
|
||||||
- else
|
- else
|
||||||
= render partial: 'grid_card', collection: @following, as: :account, cached: true
|
= render partial: 'grid_card', collection: @following, as: :account, cached: true
|
||||||
|
|
||||||
= will_paginate @following, pagination_options
|
= paginate @following
|
||||||
|
|
|
@ -31,4 +31,4 @@
|
||||||
|
|
||||||
.pagination
|
.pagination
|
||||||
- if @statuses.size == 20
|
- if @statuses.size == 20
|
||||||
= link_to safe_join([t('pagination.next'), fa_icon('chevron-right')], ' '), short_account_url(@account, max_id: @statuses.last.id), class: 'next_page', rel: 'next'
|
= link_to safe_join([t('pagination.next'), fa_icon('chevron-right')], ' '), short_account_url(@account, max_id: @statuses.last.id), class: 'next', rel: 'next'
|
||||||
|
|
|
@ -46,4 +46,4 @@
|
||||||
= table_link_to 'globe', 'Public', TagManager.instance.url_for(account)
|
= table_link_to 'globe', 'Public', TagManager.instance.url_for(account)
|
||||||
= table_link_to 'pencil', 'Edit', admin_account_path(account.id)
|
= table_link_to 'pencil', 'Edit', admin_account_path(account.id)
|
||||||
|
|
||||||
= will_paginate @accounts, pagination_options
|
= paginate @accounts
|
||||||
|
|
|
@ -13,5 +13,5 @@
|
||||||
%samp= block.domain
|
%samp= block.domain
|
||||||
%td= block.severity
|
%td= block.severity
|
||||||
|
|
||||||
= will_paginate @blocks, pagination_options
|
= paginate @blocks
|
||||||
= link_to 'Add new', new_admin_domain_block_path, class: 'button'
|
= link_to 'Add new', new_admin_domain_block_path, class: 'button'
|
||||||
|
|
|
@ -26,4 +26,4 @@
|
||||||
- else
|
- else
|
||||||
= l subscription.last_successful_delivery_at
|
= l subscription.last_successful_delivery_at
|
||||||
|
|
||||||
= will_paginate @subscriptions, pagination_options
|
= paginate @subscriptions
|
||||||
|
|
|
@ -29,4 +29,4 @@
|
||||||
%td= truncate(report.comment, length: 30, separator: ' ')
|
%td= truncate(report.comment, length: 30, separator: ' ')
|
||||||
%td= table_link_to 'circle', 'View', admin_report_path(report)
|
%td= table_link_to 'circle', 'View', admin_report_path(report)
|
||||||
|
|
||||||
= will_paginate @reports, pagination_options
|
= paginate @reports
|
||||||
|
|
9
app/views/kaminari/_next_page.html.haml
Normal file
9
app/views/kaminari/_next_page.html.haml
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
-# Link to the "Next" page
|
||||||
|
-# available local variables
|
||||||
|
-# url: url to the next page
|
||||||
|
-# current_page: a page object for the currently displayed page
|
||||||
|
-# total_pages: total number of pages
|
||||||
|
-# per_page: number of items to fetch per page
|
||||||
|
-# remote: data-remote
|
||||||
|
%span.next
|
||||||
|
= link_to_unless current_page.last?, safe_join([t('pagination.next'), fa_icon('chevron-right')], ' '), url, rel: 'next', remote: remote
|
16
app/views/kaminari/_paginator.html.haml
Normal file
16
app/views/kaminari/_paginator.html.haml
Normal file
|
@ -0,0 +1,16 @@
|
||||||
|
-# The container tag
|
||||||
|
-# available local variables
|
||||||
|
-# current_page: a page object for the currently displayed page
|
||||||
|
-# total_pages: total number of pages
|
||||||
|
-# per_page: number of items to fetch per page
|
||||||
|
-# remote: data-remote
|
||||||
|
-# paginator: the paginator that renders the pagination tags inside
|
||||||
|
= paginator.render do
|
||||||
|
%nav.pagination
|
||||||
|
= prev_page_tag unless current_page.first?
|
||||||
|
- each_page do |page|
|
||||||
|
- if page.display_tag?
|
||||||
|
= page_tag page
|
||||||
|
- elsif !page.was_truncated?
|
||||||
|
= gap_tag
|
||||||
|
= next_page_tag unless current_page.last?
|
9
app/views/kaminari/_prev_page.html.haml
Normal file
9
app/views/kaminari/_prev_page.html.haml
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
-# Link to the "Previous" page
|
||||||
|
-# available local variables
|
||||||
|
-# url: url to the previous page
|
||||||
|
-# current_page: a page object for the currently displayed page
|
||||||
|
-# total_pages: total number of pages
|
||||||
|
-# per_page: number of items to fetch per page
|
||||||
|
-# remote: data-remote
|
||||||
|
%span.prev
|
||||||
|
= link_to_unless current_page.first?, safe_join([fa_icon('chevron-left'), t('pagination.prev')], ' '), url, rel: 'prev', remote: remote
|
|
@ -15,4 +15,4 @@
|
||||||
|
|
||||||
- if @statuses.size == 20
|
- if @statuses.size == 20
|
||||||
.pagination
|
.pagination
|
||||||
= link_to safe_join([t('pagination.next'), fa_icon('chevron-right')], ' '), tag_url(@tag, max_id: @statuses.last.id), class: 'next_page', rel: 'next'
|
= link_to safe_join([t('pagination.next'), fa_icon('chevron-right')], ' '), tag_url(@tag, max_id: @statuses.last.id), class: 'next', rel: 'next'
|
||||||
|
|
|
@ -33,7 +33,7 @@ search:
|
||||||
|
|
||||||
ignore_unused:
|
ignore_unused:
|
||||||
- 'activerecord.attributes.*'
|
- 'activerecord.attributes.*'
|
||||||
- '{devise,will_paginate,doorkeeper}.*'
|
- '{devise,pagination,doorkeeper}.*'
|
||||||
- '{datetime,time}.*'
|
- '{datetime,time}.*'
|
||||||
- 'simple_form.{yes,no}'
|
- 'simple_form.{yes,no}'
|
||||||
- 'simple_form.{placeholders,hints,labels}.*'
|
- 'simple_form.{placeholders,hints,labels}.*'
|
||||||
|
|
7
config/initializers/kaminari_config.rb
Normal file
7
config/initializers/kaminari_config.rb
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
# frozen_string_literal: true
|
||||||
|
Kaminari.configure do |config|
|
||||||
|
config.default_per_page = 40
|
||||||
|
config.window = 1
|
||||||
|
config.left = 3
|
||||||
|
config.right = 1
|
||||||
|
end
|
0
config/initializers/pagination.rb
Normal file
0
config/initializers/pagination.rb
Normal file
|
@ -88,5 +88,3 @@ de:
|
||||||
default: "%d.%m.%Y %H:%M"
|
default: "%d.%m.%Y %H:%M"
|
||||||
users:
|
users:
|
||||||
invalid_email: Inkorrekte E-mail-Addresse
|
invalid_email: Inkorrekte E-mail-Addresse
|
||||||
will_paginate:
|
|
||||||
page_gap: "…"
|
|
||||||
|
|
|
@ -126,6 +126,7 @@ en:
|
||||||
pagination:
|
pagination:
|
||||||
next: Next
|
next: Next
|
||||||
prev: Prev
|
prev: Prev
|
||||||
|
truncate: "…"
|
||||||
remote_follow:
|
remote_follow:
|
||||||
acct: Enter your username@domain you want to follow from
|
acct: Enter your username@domain you want to follow from
|
||||||
missing_resource: Could not find the required redirect URL for your account
|
missing_resource: Could not find the required redirect URL for your account
|
||||||
|
@ -169,5 +170,3 @@ en:
|
||||||
users:
|
users:
|
||||||
invalid_email: The e-mail address is invalid
|
invalid_email: The e-mail address is invalid
|
||||||
invalid_otp_token: Invalid two-factor code
|
invalid_otp_token: Invalid two-factor code
|
||||||
will_paginate:
|
|
||||||
page_gap: "…"
|
|
||||||
|
|
|
@ -160,5 +160,3 @@ eo:
|
||||||
users:
|
users:
|
||||||
invalid_email: La retpoŝt-adreso ne estas valida
|
invalid_email: La retpoŝt-adreso ne estas valida
|
||||||
invalid_otp_token: La dufaktora aŭtentigila kodo ne estas valida
|
invalid_otp_token: La dufaktora aŭtentigila kodo ne estas valida
|
||||||
will_paginate:
|
|
||||||
page_gap: "…"
|
|
||||||
|
|
|
@ -51,5 +51,3 @@ es:
|
||||||
settings:
|
settings:
|
||||||
edit_profile: Editar perfil
|
edit_profile: Editar perfil
|
||||||
preferences: Preferencias
|
preferences: Preferencias
|
||||||
will_paginate:
|
|
||||||
page_gap: "…"
|
|
||||||
|
|
|
@ -160,5 +160,3 @@ fi:
|
||||||
users:
|
users:
|
||||||
invalid_email: Virheellinen sähköposti
|
invalid_email: Virheellinen sähköposti
|
||||||
invalid_otp_token: Virheellinen kaksivaihe tunnistus koodi
|
invalid_otp_token: Virheellinen kaksivaihe tunnistus koodi
|
||||||
will_paginate:
|
|
||||||
page_gap: "…"
|
|
||||||
|
|
|
@ -167,5 +167,3 @@ fr:
|
||||||
users:
|
users:
|
||||||
invalid_email: L'adresse courriel est invalide
|
invalid_email: L'adresse courriel est invalide
|
||||||
invalid_otp_token: Le code d'authentification à deux facteurs est invalide
|
invalid_otp_token: Le code d'authentification à deux facteurs est invalide
|
||||||
will_paginate:
|
|
||||||
page_gap: "…"
|
|
||||||
|
|
|
@ -51,5 +51,3 @@ hu:
|
||||||
settings:
|
settings:
|
||||||
edit_profile: Profil szerkesztése
|
edit_profile: Profil szerkesztése
|
||||||
preferences: Beállítások
|
preferences: Beállítások
|
||||||
will_paginate:
|
|
||||||
page_gap: "…"
|
|
||||||
|
|
|
@ -160,5 +160,3 @@
|
||||||
users:
|
users:
|
||||||
invalid_email: E-post addressen er ugyldig
|
invalid_email: E-post addressen er ugyldig
|
||||||
invalid_otp_token: Ugyldig two-faktor kode
|
invalid_otp_token: Ugyldig two-faktor kode
|
||||||
will_paginate:
|
|
||||||
page_gap: "…"
|
|
||||||
|
|
|
@ -51,5 +51,3 @@ pt:
|
||||||
settings:
|
settings:
|
||||||
edit_profile: Editar perfil
|
edit_profile: Editar perfil
|
||||||
preferences: Preferências
|
preferences: Preferências
|
||||||
will_paginate:
|
|
||||||
page_gap: "…"
|
|
||||||
|
|
|
@ -161,5 +161,3 @@ ru:
|
||||||
users:
|
users:
|
||||||
invalid_email: Введенный e-mail неверен
|
invalid_email: Введенный e-mail неверен
|
||||||
invalid_otp_token: Введен неверный код
|
invalid_otp_token: Введен неверный код
|
||||||
will_paginate:
|
|
||||||
page_gap: "…"
|
|
||||||
|
|
|
@ -51,5 +51,3 @@ uk:
|
||||||
settings:
|
settings:
|
||||||
edit_profile: Редагувати профіль
|
edit_profile: Редагувати профіль
|
||||||
preferences: Налаштування
|
preferences: Налаштування
|
||||||
will_paginate:
|
|
||||||
page_gap: "…"
|
|
||||||
|
|
|
@ -150,5 +150,3 @@ zh-CN:
|
||||||
users:
|
users:
|
||||||
invalid_email: 无效的邮箱
|
invalid_email: 无效的邮箱
|
||||||
invalid_otp_token: 无效的两步验证码
|
invalid_otp_token: 无效的两步验证码
|
||||||
will_paginate:
|
|
||||||
page_gap: "…"
|
|
||||||
|
|
|
@ -1,5 +0,0 @@
|
||||||
require 'rails_helper'
|
|
||||||
|
|
||||||
RSpec.describe AccountsHelper, type: :helper do
|
|
||||||
|
|
||||||
end
|
|
Reference in a new issue