From 4ada50985a73ed5c859cdf5160500b04116ad0e4 Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Mon, 10 Apr 2017 19:11:41 -0400 Subject: [PATCH] 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 --- Gemfile | 2 +- Gemfile.lock | 15 +++++++++++++-- app/assets/stylesheets/accounts.scss | 12 ++++++------ app/controllers/accounts_controller.rb | 4 ++-- app/controllers/admin/accounts_controller.rb | 2 +- .../admin/domain_blocks_controller.rb | 2 +- app/controllers/admin/pubsubhubbub_controller.rb | 2 +- app/controllers/admin/reports_controller.rb | 2 +- app/helpers/accounts_helper.rb | 12 ------------ app/views/accounts/followers.html.haml | 2 +- app/views/accounts/following.html.haml | 2 +- app/views/accounts/show.html.haml | 2 +- app/views/admin/accounts/index.html.haml | 2 +- app/views/admin/domain_blocks/index.html.haml | 2 +- app/views/admin/pubsubhubbub/index.html.haml | 2 +- app/views/admin/reports/index.html.haml | 2 +- app/views/kaminari/_next_page.html.haml | 9 +++++++++ app/views/kaminari/_paginator.html.haml | 16 ++++++++++++++++ app/views/kaminari/_prev_page.html.haml | 9 +++++++++ app/views/tags/show.html.haml | 2 +- config/i18n-tasks.yml | 2 +- config/initializers/kaminari_config.rb | 7 +++++++ config/initializers/pagination.rb | 0 config/locales/de.yml | 2 -- config/locales/en.yml | 3 +-- config/locales/eo.yml | 2 -- config/locales/es.yml | 2 -- config/locales/fi.yml | 2 -- config/locales/fr.yml | 2 -- config/locales/hu.yml | 2 -- config/locales/no.yml | 2 -- config/locales/pt.yml | 2 -- config/locales/ru.yml | 2 -- config/locales/uk.yml | 2 -- config/locales/zh-CN.yml | 2 -- spec/helpers/accounts_helper_spec.rb | 5 ----- 36 files changed, 77 insertions(+), 65 deletions(-) delete mode 100644 app/helpers/accounts_helper.rb create mode 100644 app/views/kaminari/_next_page.html.haml create mode 100644 app/views/kaminari/_paginator.html.haml create mode 100644 app/views/kaminari/_prev_page.html.haml create mode 100644 config/initializers/kaminari_config.rb create mode 100644 config/initializers/pagination.rb delete mode 100644 spec/helpers/accounts_helper_spec.rb diff --git a/Gemfile b/Gemfile index 078ac5806..9a1792623 100644 --- a/Gemfile +++ b/Gemfile @@ -32,6 +32,7 @@ gem 'htmlentities' gem 'http' gem 'http_accept_language' gem 'httplog' +gem 'kaminari' gem 'link_header' gem 'nokogiri' gem 'oj' @@ -52,7 +53,6 @@ gem 'simple_form' gem 'statsd-instrument' gem 'twitter-text' gem 'tzinfo-data' -gem 'will_paginate' gem 'react-rails' gem 'browserify-rails' diff --git a/Gemfile.lock b/Gemfile.lock index 4fe8aa076..f1bc9880e 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -203,6 +203,18 @@ GEM railties (>= 4.2.0) thor (>= 0.14, < 2.0) 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) addressable (~> 2.3) letter_opener (1.4.1) @@ -433,7 +445,6 @@ GEM websocket-driver (0.6.5) websocket-extensions (>= 0.1.0) websocket-extensions (0.1.2) - will_paginate (3.1.5) PLATFORMS ruby @@ -472,6 +483,7 @@ DEPENDENCIES httplog i18n-tasks (~> 0.9.6) jquery-rails + kaminari letter_opener letter_opener_web link_header @@ -513,7 +525,6 @@ DEPENDENCIES tzinfo-data uglifier (>= 1.3.0) webmock - will_paginate RUBY VERSION ruby 2.4.1p111 diff --git a/app/assets/stylesheets/accounts.scss b/app/assets/stylesheets/accounts.scss index b3ae33500..2a05c2bb4 100644 --- a/app/assets/stylesheets/accounts.scss +++ b/app/assets/stylesheets/accounts.scss @@ -173,7 +173,7 @@ text-align: center; overflow: hidden; - a, .current, .next_page, .previous_page, .gap { + a, .current, .page, .gap { font-size: 14px; color: $color5; font-weight: 500; @@ -193,12 +193,12 @@ cursor: default; } - .previous_page, .next_page { + .prev, .next { text-transform: uppercase; color: $color2; } - .previous_page { + .prev { float: left; padding-left: 0; @@ -208,7 +208,7 @@ } } - .next_page { + .next { float: right; padding-right: 0; @@ -226,11 +226,11 @@ @media screen and (max-width: 360px) { padding: 30px 20px; - a, .current, .next_page, .previous_page, .gap { + a, .current, .next, .prev, .gap { display: none; } - .next_page, .previous_page { + .next, .prev { display: inline-block; } } diff --git a/app/controllers/accounts_controller.rb b/app/controllers/accounts_controller.rb index 34103de0e..d4f157614 100644 --- a/app/controllers/accounts_controller.rb +++ b/app/controllers/accounts_controller.rb @@ -35,11 +35,11 @@ class AccountsController < ApplicationController end 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 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 private diff --git a/app/controllers/admin/accounts_controller.rb b/app/controllers/admin/accounts_controller.rb index 60b631ece..71cb8edd8 100644 --- a/app/controllers/admin/accounts_controller.rb +++ b/app/controllers/admin/accounts_controller.rb @@ -5,7 +5,7 @@ module Admin before_action :set_account, except: :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.remote if params[:remote].present? diff --git a/app/controllers/admin/domain_blocks_controller.rb b/app/controllers/admin/domain_blocks_controller.rb index 58f1efa5b..a8b56c085 100644 --- a/app/controllers/admin/domain_blocks_controller.rb +++ b/app/controllers/admin/domain_blocks_controller.rb @@ -3,7 +3,7 @@ module Admin class DomainBlocksController < BaseController def index - @blocks = DomainBlock.paginate(page: params[:page], per_page: 40) + @blocks = DomainBlock.page(params[:page]) end def new diff --git a/app/controllers/admin/pubsubhubbub_controller.rb b/app/controllers/admin/pubsubhubbub_controller.rb index 95f79c520..31c80a174 100644 --- a/app/controllers/admin/pubsubhubbub_controller.rb +++ b/app/controllers/admin/pubsubhubbub_controller.rb @@ -3,7 +3,7 @@ module Admin class PubsubhubbubController < BaseController 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 diff --git a/app/controllers/admin/reports_controller.rb b/app/controllers/admin/reports_controller.rb index 5a37d8e6e..3c3082318 100644 --- a/app/controllers/admin/reports_controller.rb +++ b/app/controllers/admin/reports_controller.rb @@ -5,7 +5,7 @@ module Admin before_action :set_report, except: [: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 end diff --git a/app/helpers/accounts_helper.rb b/app/helpers/accounts_helper.rb deleted file mode 100644 index af23a78d1..000000000 --- a/app/helpers/accounts_helper.rb +++ /dev/null @@ -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 diff --git a/app/views/accounts/followers.html.haml b/app/views/accounts/followers.html.haml index 493491020..fa5071f38 100644 --- a/app/views/accounts/followers.html.haml +++ b/app/views/accounts/followers.html.haml @@ -9,4 +9,4 @@ - else = render partial: 'grid_card', collection: @followers, as: :account, cached: true -= will_paginate @followers, pagination_options += paginate @followers diff --git a/app/views/accounts/following.html.haml b/app/views/accounts/following.html.haml index 370cd6c48..987dcba1f 100644 --- a/app/views/accounts/following.html.haml +++ b/app/views/accounts/following.html.haml @@ -9,4 +9,4 @@ - else = render partial: 'grid_card', collection: @following, as: :account, cached: true -= will_paginate @following, pagination_options += paginate @following diff --git a/app/views/accounts/show.html.haml b/app/views/accounts/show.html.haml index e90897729..3b0d69dcd 100644 --- a/app/views/accounts/show.html.haml +++ b/app/views/accounts/show.html.haml @@ -31,4 +31,4 @@ .pagination - 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' diff --git a/app/views/admin/accounts/index.html.haml b/app/views/admin/accounts/index.html.haml index f8ed4ef97..4d636601e 100644 --- a/app/views/admin/accounts/index.html.haml +++ b/app/views/admin/accounts/index.html.haml @@ -46,4 +46,4 @@ = table_link_to 'globe', 'Public', TagManager.instance.url_for(account) = table_link_to 'pencil', 'Edit', admin_account_path(account.id) -= will_paginate @accounts, pagination_options += paginate @accounts diff --git a/app/views/admin/domain_blocks/index.html.haml b/app/views/admin/domain_blocks/index.html.haml index eb7894b86..fe6ff683f 100644 --- a/app/views/admin/domain_blocks/index.html.haml +++ b/app/views/admin/domain_blocks/index.html.haml @@ -13,5 +13,5 @@ %samp= block.domain %td= block.severity -= will_paginate @blocks, pagination_options += paginate @blocks = link_to 'Add new', new_admin_domain_block_path, class: 'button' diff --git a/app/views/admin/pubsubhubbub/index.html.haml b/app/views/admin/pubsubhubbub/index.html.haml index cb11a502c..2b8e36e6a 100644 --- a/app/views/admin/pubsubhubbub/index.html.haml +++ b/app/views/admin/pubsubhubbub/index.html.haml @@ -26,4 +26,4 @@ - else = l subscription.last_successful_delivery_at -= will_paginate @subscriptions, pagination_options += paginate @subscriptions diff --git a/app/views/admin/reports/index.html.haml b/app/views/admin/reports/index.html.haml index 839259dc2..9c5c78935 100644 --- a/app/views/admin/reports/index.html.haml +++ b/app/views/admin/reports/index.html.haml @@ -29,4 +29,4 @@ %td= truncate(report.comment, length: 30, separator: ' ') %td= table_link_to 'circle', 'View', admin_report_path(report) -= will_paginate @reports, pagination_options += paginate @reports diff --git a/app/views/kaminari/_next_page.html.haml b/app/views/kaminari/_next_page.html.haml new file mode 100644 index 000000000..30a3643d6 --- /dev/null +++ b/app/views/kaminari/_next_page.html.haml @@ -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 diff --git a/app/views/kaminari/_paginator.html.haml b/app/views/kaminari/_paginator.html.haml new file mode 100644 index 000000000..b1da236d5 --- /dev/null +++ b/app/views/kaminari/_paginator.html.haml @@ -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? diff --git a/app/views/kaminari/_prev_page.html.haml b/app/views/kaminari/_prev_page.html.haml new file mode 100644 index 000000000..1089e3566 --- /dev/null +++ b/app/views/kaminari/_prev_page.html.haml @@ -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 diff --git a/app/views/tags/show.html.haml b/app/views/tags/show.html.haml index 32a50e158..c894cdb2e 100644 --- a/app/views/tags/show.html.haml +++ b/app/views/tags/show.html.haml @@ -15,4 +15,4 @@ - if @statuses.size == 20 .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' diff --git a/config/i18n-tasks.yml b/config/i18n-tasks.yml index 4304bbd18..7ae143f93 100644 --- a/config/i18n-tasks.yml +++ b/config/i18n-tasks.yml @@ -33,7 +33,7 @@ search: ignore_unused: - 'activerecord.attributes.*' - - '{devise,will_paginate,doorkeeper}.*' + - '{devise,pagination,doorkeeper}.*' - '{datetime,time}.*' - 'simple_form.{yes,no}' - 'simple_form.{placeholders,hints,labels}.*' diff --git a/config/initializers/kaminari_config.rb b/config/initializers/kaminari_config.rb new file mode 100644 index 000000000..bd455f382 --- /dev/null +++ b/config/initializers/kaminari_config.rb @@ -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 diff --git a/config/initializers/pagination.rb b/config/initializers/pagination.rb new file mode 100644 index 000000000..e69de29bb diff --git a/config/locales/de.yml b/config/locales/de.yml index ed54bb699..75ac4e1bb 100644 --- a/config/locales/de.yml +++ b/config/locales/de.yml @@ -88,5 +88,3 @@ de: default: "%d.%m.%Y %H:%M" users: invalid_email: Inkorrekte E-mail-Addresse - will_paginate: - page_gap: "…" diff --git a/config/locales/en.yml b/config/locales/en.yml index 118798ba1..6c4738991 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -126,6 +126,7 @@ en: pagination: next: Next prev: Prev + truncate: "…" remote_follow: acct: Enter your username@domain you want to follow from missing_resource: Could not find the required redirect URL for your account @@ -169,5 +170,3 @@ en: users: invalid_email: The e-mail address is invalid invalid_otp_token: Invalid two-factor code - will_paginate: - page_gap: "…" diff --git a/config/locales/eo.yml b/config/locales/eo.yml index 3644b37bb..e82e42495 100644 --- a/config/locales/eo.yml +++ b/config/locales/eo.yml @@ -160,5 +160,3 @@ eo: users: invalid_email: La retpoŝt-adreso ne estas valida invalid_otp_token: La dufaktora aŭtentigila kodo ne estas valida - will_paginate: - page_gap: "…" diff --git a/config/locales/es.yml b/config/locales/es.yml index 19f2c71b8..42245d675 100644 --- a/config/locales/es.yml +++ b/config/locales/es.yml @@ -51,5 +51,3 @@ es: settings: edit_profile: Editar perfil preferences: Preferencias - will_paginate: - page_gap: "…" diff --git a/config/locales/fi.yml b/config/locales/fi.yml index 56aa9df49..c11237226 100644 --- a/config/locales/fi.yml +++ b/config/locales/fi.yml @@ -160,5 +160,3 @@ fi: users: invalid_email: Virheellinen sähköposti invalid_otp_token: Virheellinen kaksivaihe tunnistus koodi - will_paginate: - page_gap: "…" diff --git a/config/locales/fr.yml b/config/locales/fr.yml index 9a9c1b6de..92cf43944 100644 --- a/config/locales/fr.yml +++ b/config/locales/fr.yml @@ -167,5 +167,3 @@ fr: users: invalid_email: L'adresse courriel est invalide invalid_otp_token: Le code d'authentification à deux facteurs est invalide - will_paginate: - page_gap: "…" diff --git a/config/locales/hu.yml b/config/locales/hu.yml index 915d02c19..96b73d43c 100644 --- a/config/locales/hu.yml +++ b/config/locales/hu.yml @@ -51,5 +51,3 @@ hu: settings: edit_profile: Profil szerkesztése preferences: Beállítások - will_paginate: - page_gap: "…" diff --git a/config/locales/no.yml b/config/locales/no.yml index b9a752d5a..9aa966d2a 100644 --- a/config/locales/no.yml +++ b/config/locales/no.yml @@ -160,5 +160,3 @@ users: invalid_email: E-post addressen er ugyldig invalid_otp_token: Ugyldig two-faktor kode - will_paginate: - page_gap: "…" diff --git a/config/locales/pt.yml b/config/locales/pt.yml index ad7d05e3b..f2c7458f7 100644 --- a/config/locales/pt.yml +++ b/config/locales/pt.yml @@ -51,5 +51,3 @@ pt: settings: edit_profile: Editar perfil preferences: Preferências - will_paginate: - page_gap: "…" diff --git a/config/locales/ru.yml b/config/locales/ru.yml index e5a9c0958..fab178629 100644 --- a/config/locales/ru.yml +++ b/config/locales/ru.yml @@ -161,5 +161,3 @@ ru: users: invalid_email: Введенный e-mail неверен invalid_otp_token: Введен неверный код - will_paginate: - page_gap: "…" diff --git a/config/locales/uk.yml b/config/locales/uk.yml index 27e8135df..f7176e86d 100644 --- a/config/locales/uk.yml +++ b/config/locales/uk.yml @@ -51,5 +51,3 @@ uk: settings: edit_profile: Редагувати профіль preferences: Налаштування - will_paginate: - page_gap: "…" diff --git a/config/locales/zh-CN.yml b/config/locales/zh-CN.yml index 78c4d46e2..48028d00c 100644 --- a/config/locales/zh-CN.yml +++ b/config/locales/zh-CN.yml @@ -150,5 +150,3 @@ zh-CN: users: invalid_email: 无效的邮箱 invalid_otp_token: 无效的两步验证码 - will_paginate: - page_gap: "…" diff --git a/spec/helpers/accounts_helper_spec.rb b/spec/helpers/accounts_helper_spec.rb deleted file mode 100644 index 3aea1f909..000000000 --- a/spec/helpers/accounts_helper_spec.rb +++ /dev/null @@ -1,5 +0,0 @@ -require 'rails_helper' - -RSpec.describe AccountsHelper, type: :helper do - -end