diff --git a/app/controllers/posts_controller.rb b/app/controllers/posts_controller.rb index 897e4c716..94360d57b 100644 --- a/app/controllers/posts_controller.rb +++ b/app/controllers/posts_controller.rb @@ -30,24 +30,6 @@ class PostsController < ApplicationController end private - def extend_post_set(post_set) - @post_set.extend(PostSets::Post) - - if use_sequential_paginator? - @post_set.extend(PostSets::Sequential) - else - @post_set.extend(PostSets::Numbered) - end - end - - def use_sequential_paginator? - if params[:page].to_i > 1000 - true - else - false - end - end - def save_recent_tags if params[:tags] || (params[:post] && params[:post][:tags]) tags = Tag.scan_tags(params[:tags] || params[:post][:tags]) diff --git a/app/controllers/uploads_controller.rb b/app/controllers/uploads_controller.rb index be15dc4b3..59aded66b 100644 --- a/app/controllers/uploads_controller.rb +++ b/app/controllers/uploads_controller.rb @@ -12,7 +12,7 @@ class UploadsController < ApplicationController def index @search = Upload.search(params[:search]) - @uploads = @search.paginate(:page => params[:page]) + @uploads = @search.order("id desc").paginate(params[:page]) respond_with(@uploads) end diff --git a/app/helpers/pagination_helper.rb b/app/helpers/pagination_helper.rb index c0e5174d9..758dd20b4 100644 --- a/app/helpers/pagination_helper.rb +++ b/app/helpers/pagination_helper.rb @@ -1,28 +1,28 @@ module PaginationHelper - def smart_paginator(records, &block) - if records.is_sequential_paginator? || params[:page].to_i > 200 - sequential_paginator(records) - else - numbered_paginator(records, &block) - end - end - def sequential_paginator(records) html = "" - unless records.is_first_page? - html << '
  • ' + link_to("« Previous", params.merge(:page => "b#{records.before_id}")) + '
  • ' - end + if records.any? + if params[:page] =~ /[ab]/ + html << '
  • ' + link_to("< Previous", params.merge(:page => "a#{records[0].id}")) + '
  • ' + end - unless records.is_last_page? - html << '
  • ' + link_to("Next »", params.merge(:page => "a#{records.after_id}")) + '
  • ' + html << '
  • ' + link_to("Next >", params.merge(:page => "b#{records[-1].id}")) + '
  • ' end html << "
    " html.html_safe end + def use_sequential_paginator?(records) + params[:page] =~ /[ab]/ || records.current_page > Danbooru.config.max_numbered_pages + end + def numbered_paginator(records, &block) + if use_sequential_paginator?(records) + return sequential_paginator(records) + end + html = "" window = 3 if records.total_pages <= (window * 2) + 5 @@ -55,7 +55,7 @@ module PaginationHelper end def numbered_paginator_final_item(total_pages, current_page, &block) - if total_pages <= 200 + if total_pages <= Danbooru.config.max_numbered_pages numbered_paginator_item(total_pages, current_page, &block) else "" @@ -67,7 +67,7 @@ module PaginationHelper if page == "..." html << "..." elsif page == current_page - html << page.to_s + html << '' + page.to_s + '' else html << capture(page, &block) end diff --git a/app/logical/post_sets/post.rb b/app/logical/post_sets/post.rb index 021e699e5..5fbabb23e 100644 --- a/app/logical/post_sets/post.rb +++ b/app/logical/post_sets/post.rb @@ -4,7 +4,7 @@ module PostSets def initialize(params) @tag_array = Tag.scan_query(params[:tags]) - @page = [params[:page].to_i, 1].max + @page = params[:page] @posts = ::Post.tag_match(tag_string).paginate(page) end @@ -13,7 +13,7 @@ module PostSets end def has_wiki? - if tags.any? + if tag_array.any? ::WikiPage.titled(tag_string).exists? else false @@ -21,7 +21,7 @@ module PostSets end def wiki_page - if tags.any? + if tag_array.any? ::WikiPage.titled(tag_string).first else nil diff --git a/app/presenters/post_set_presenter.rb b/app/presenters/post_set_presenter.rb index 4255e904a..c3bf97814 100644 --- a/app/presenters/post_set_presenter.rb +++ b/app/presenters/post_set_presenter.rb @@ -14,9 +14,13 @@ class PostSetPresenter < Presenter tag_set_presenter.tag_list_html(template) end - def post_previews_html + def post_previews_html(template) html = "" + if posts.empty? + return template.render(:partial => "post_sets/blank") + end + posts.each do |post| html << PostPresenter.preview(post) end diff --git a/app/views/layouts/default.html.erb b/app/views/layouts/default.html.erb index 5d818cea8..0f12b7ec4 100644 --- a/app/views/layouts/default.html.erb +++ b/app/views/layouts/default.html.erb @@ -48,13 +48,13 @@ - <%- if flash[:notice] -%> -
    <%= flash[:notice] %>
    - <%- else -%> - - <%- end -%> -
    + <%- if flash[:notice] -%> +
    <%= flash[:notice] %>
    + <%- else -%> + + <%- end -%> + <%= yield :layout %>
    diff --git a/app/views/post_sets/_blank.html.erb b/app/views/post_sets/_blank.html.erb new file mode 100644 index 000000000..460517bfc --- /dev/null +++ b/app/views/post_sets/_blank.html.erb @@ -0,0 +1,3 @@ +

    Nobody here but us chickens!

    + +

    <%= link_to "Go back", :back %>.

    \ No newline at end of file diff --git a/app/views/posts/index.html.erb b/app/views/posts/index.html.erb index 883999f9c..9ddec2df7 100644 --- a/app/views/posts/index.html.erb +++ b/app/views/posts/index.html.erb @@ -34,7 +34,7 @@ <% content_for(:page_title) do %> - /<%= @post_set.tags.join(" ") %> + /<%= @post_set.tag_string %> <% end %> <%= render :partial => "posts/partials/common/secondary_links" %> diff --git a/app/views/posts/partials/index/_posts.html.erb b/app/views/posts/partials/index/_posts.html.erb index 0adae71ec..8a9d83b90 100644 --- a/app/views/posts/partials/index/_posts.html.erb +++ b/app/views/posts/partials/index/_posts.html.erb @@ -1,11 +1,11 @@

    Posts

    -<%= post_set.presenter.post_previews_html %> +<%= post_set.presenter.post_previews_html(self) %>
    - <%= smart_paginator(post_set.posts) do |page| %> - <%= link_to(page, posts_path(:page => page, :tags => post_set.tags)) %> + <%= numbered_paginator(post_set.posts) do |page| %> + <%= link_to(page, posts_path(:page => page, :tags => post_set.tag_string)) %> <% end %>
    diff --git a/app/views/uploads/index.html.erb b/app/views/uploads/index.html.erb index 7ac40ddb5..014fdff23 100644 --- a/app/views/uploads/index.html.erb +++ b/app/views/uploads/index.html.erb @@ -1,24 +1,32 @@ - - - - - - - - - - - - <% @uploads.each do |upload| %> - - - - - - - - <% end %> - -
    UploaderStatusDateTags
    <%= link_to upload.id, upload_path(upload) %><%= link_to upload.uploader.name, user_path(upload.uploader) %><%= upload.presenter.status(self) %><%= upload.created_at %><%= upload.tag_string %>
    +
    +
    + + + + + + + + + + + + <% @uploads.each do |upload| %> + + + + + + + + <% end %> + +
    UploaderStatusDateTags
    <%= link_to upload.id, upload_path(upload) %><%= link_to upload.uploader.name, user_path(upload.uploader) %><%= upload.presenter.status(self) %><%= upload.created_at %><%= upload.tag_string %>
    + +
    + <%= sequential_paginator(@uploads) %> +
    +
    +
    <%= render :partial => "posts/partials/common/secondary_links" %> \ No newline at end of file diff --git a/app/views/uploads/show.html.erb b/app/views/uploads/show.html.erb index c22cf498c..97a0ee0ea 100644 --- a/app/views/uploads/show.html.erb +++ b/app/views/uploads/show.html.erb @@ -16,7 +16,7 @@

    You can <%= link_to "upload another file", new_upload_path %> or <%= link_to "view your current uploads", uploads_path %>. - <% if CurrentUser.user.is_moderator? %> + <% if CurrentUser.user.is_moderator? && @upload.is_pending? %> <%= link_to "Force update", upload_path(@upload, :format => "js"), :remote => true, :method => :put %>. <% end %>

    diff --git a/config/danbooru_default_config.rb b/config/danbooru_default_config.rb index 4b93052e3..6e98c33b0 100644 --- a/config/danbooru_default_config.rb +++ b/config/danbooru_default_config.rb @@ -111,6 +111,11 @@ module Danbooru def tag_subscription_post_limit 200 end + + # After this many pages, the paginator will switch to sequential mode. + def max_numbered_pages + 2 + end # Max number of tag subscriptions per user def max_tag_subscriptions diff --git a/lib/danbooru/paginator.rb b/lib/danbooru/paginator.rb index bed83b368..ca9cfdc53 100644 --- a/lib/danbooru/paginator.rb +++ b/lib/danbooru/paginator.rb @@ -1,5 +1,4 @@ require "danbooru/paginator/active_record_extension" -require "danbooru/paginator/collection_extension" require "danbooru/paginator/numbered_collection_extension" require "danbooru/paginator/sequential_collection_extension" diff --git a/lib/danbooru/paginator/active_record_extension.rb b/lib/danbooru/paginator/active_record_extension.rb index bd946f292..e0954b313 100644 --- a/lib/danbooru/paginator/active_record_extension.rb +++ b/lib/danbooru/paginator/active_record_extension.rb @@ -6,29 +6,29 @@ module Danbooru extend ActiveSupport::Concern module ClassMethods - def page(p) - if use_sequential_paginator?(p) - paginate_sequential(p) + def paginate(page) + if use_sequential_paginator?(page) + paginate_sequential(page) else - paginate_numbered(p) + paginate_numbered(page) end end - def use_sequential_paginator?(p) - p =~ /[ab]\d+/i + def use_sequential_paginator?(page) + page =~ /[ab]\d+/i end - def paginate_sequential(p) - if p =~ /b(\d+)/ + def paginate_sequential(page) + if page =~ /b(\d+)/ paginate_sequential_before($1) - elsif p =~ /a(\d+)/ + elsif page =~ /a(\d+)/ paginate_sequential_after($1) else - paginate_numbered(p) + paginate_sequential_before end end - def paginate_sequential_before(before_id) + def paginate_sequential_before(before_id = nil) c = limit(records_per_page) if before_id.to_i > 0 @@ -48,17 +48,17 @@ module Danbooru end end - def paginate_numbered(p) - p = [p.to_i, 1].max - limit(records_per_page).offset((p - 1) * records_per_page).tap do |obj| + def paginate_numbered(page) + page = [page.to_i, 1].max + limit(records_per_page).offset((page - 1) * records_per_page).tap do |obj| obj.extend(NumberedCollectionExtension) - obj.total_pages = (obj.total_count / records_per_page.to_f).ceil - obj.current_page = p + obj.total_pages = (obj.total_count.to_f / records_per_page).ceil + obj.current_page = page end end def records_per_page - Danbooru.config.posts_per_p + Danbooru.config.posts_per_page end # taken from kaminari (https://github.com/amatsuda/kaminari) diff --git a/lib/danbooru/paginator/collection_extension.rb b/lib/danbooru/paginator/collection_extension.rb deleted file mode 100644 index d15a53c10..000000000 --- a/lib/danbooru/paginator/collection_extension.rb +++ /dev/null @@ -1,6 +0,0 @@ -module Danbooru - module Paginator - module CollectionExtension - end - end -end diff --git a/lib/danbooru/paginator/numbered_collection_extension.rb b/lib/danbooru/paginator/numbered_collection_extension.rb index 644807625..b3dc48ace 100644 --- a/lib/danbooru/paginator/numbered_collection_extension.rb +++ b/lib/danbooru/paginator/numbered_collection_extension.rb @@ -3,24 +3,12 @@ module Danbooru module NumberedCollectionExtension attr_accessor :current_page, :total_pages - def self.extended(obj) - obj.extend(Danbooru::Paginator::CollectionExtension) - end - def is_first_page? current_page == 1 end def is_last_page? - current_page == total_pages - end - - def is_sequential_paginator? - false - end - - def is_numbered_paginator? - true + current_page >= total_pages end end end diff --git a/lib/danbooru/paginator/sequential_collection_extension.rb b/lib/danbooru/paginator/sequential_collection_extension.rb index ba45be58f..85a240168 100644 --- a/lib/danbooru/paginator/sequential_collection_extension.rb +++ b/lib/danbooru/paginator/sequential_collection_extension.rb @@ -3,10 +3,6 @@ module Danbooru module SequentialCollectionExtension attr_accessor :sequential_paginator_mode - def self.extended(obj) - obj.extend(Danbooru::Paginator::CollectionExtension) - end - def is_first_page? size == 0 end @@ -15,14 +11,6 @@ module Danbooru size == 0 end - def is_sequential_paginator? - true - end - - def is_numbered_paginator? - false - end - def to_a if sequential_paginator_mode == :before super @@ -30,22 +18,6 @@ module Danbooru super.reverse end end - - def before_id - if size > 0 - self[-1].id - else - nil - end - end - - def after_id - if size > 0 - self[0].id - else - nil - end - end end end end