diff --git a/app/controllers/modqueue_controller.rb b/app/controllers/modqueue_controller.rb index 787429b35..b239c9629 100644 --- a/app/controllers/modqueue_controller.rb +++ b/app/controllers/modqueue_controller.rb @@ -4,19 +4,20 @@ class ModqueueController < ApplicationController layout "sidebar" def index - @posts = Post.includes(:appeals, :disapprovals, :uploader, flags: [:creator]).pending_or_flagged.available_for_moderation(search_params[:hidden]).tag_match(search_params[:tags]) + @posts = Post.includes(:appeals, :disapprovals, :uploader, flags: [:creator]).pending_or_flagged.available_for_moderation(search_params[:hidden]) + @posts = @posts.paginated_search(params, order: "modqueue", count_pages: true) - @pending_post_count = @posts.pending.count - @flagged_post_count = @posts.flagged.count - @disapproval_reasons = PostDisapproval.where(post: @posts).where.not(reason: "disinterest").group(:reason).order(count: :desc).distinct.count(:post_id) - @uploaders = @posts.reorder(nil).group(:uploader).order(count: :desc).limit(20).count + @modqueue_posts = @posts.except(:offset, :limit, :order) + @pending_post_count = @modqueue_posts.pending.count + @flagged_post_count = @modqueue_posts.flagged.count + @disapproval_reasons = PostDisapproval.where(post: @modqueue_posts).where.not(reason: "disinterest").group(:reason).order(count: :desc).distinct.count(:post_id) + @uploaders = @modqueue_posts.group(:uploader).order(count: :desc).limit(20).count - @tags = RelatedTagCalculator.frequent_tags_for_post_relation(@posts) + @tags = RelatedTagCalculator.frequent_tags_for_post_relation(@modqueue_posts) @artist_tags = @tags.select { |tag| tag.category == Tag.categories.artist }.sort_by(&:overlap_count).reverse.take(10) @copyright_tags = @tags.select { |tag| tag.category == Tag.categories.copyright }.sort_by(&:overlap_count).reverse.take(10) @character_tags = @tags.select { |tag| tag.category == Tag.categories.character }.sort_by(&:overlap_count).reverse.take(10) - @posts = @posts.reorder(id: :asc).paginated_search(params, count_pages: true) respond_with(@posts) end end diff --git a/app/logical/post_query_builder.rb b/app/logical/post_query_builder.rb index fc9f8592f..be3a5f839 100644 --- a/app/logical/post_query_builder.rb +++ b/app/logical/post_query_builder.rb @@ -493,7 +493,17 @@ class PostQueryBuilder relation = relation.where("posts.image_width IS NOT NULL and posts.image_height IS NOT NULL") end - case q[:order] + if q[:order] == "custom" && q[:post_id].present? && q[:post_id][0] == :in + relation = relation.find_ordered(q[:post_id][1]) + else + relation = PostQueryBuilder.search_order(relation, q[:order]) + end + + relation + end + + def self.search_order(relation, order) + case order.to_s when "id", "id_asc" relation = relation.order("posts.id ASC") @@ -602,10 +612,11 @@ class PostQueryBuilder .select("posts.*, COUNT(*) AS contributor_fav_count") .order("contributor_fav_count DESC, posts.fav_count DESC, posts.id DESC") - when "custom" - if q[:post_id].present? && q[:post_id][0] == :in - relation = relation.find_ordered(q[:post_id][1]) - end + when "modqueue", "modqueue_desc" + relation = relation.left_outer_joins(:flags).order("GREATEST(posts.created_at, post_flags.created_at) DESC, posts.id DESC") + + when "modqueue_asc" + relation = relation.left_outer_joins(:flags).order("GREATEST(posts.created_at, post_flags.created_at) ASC, posts.id ASC") else relation = relation.order("posts.id DESC") diff --git a/app/models/application_record.rb b/app/models/application_record.rb index 8f9f94579..91ef12562 100644 --- a/app/models/application_record.rb +++ b/app/models/application_record.rb @@ -11,7 +11,7 @@ class ApplicationRecord < ActiveRecord::Base extending(PaginationExtension).paginate(*args, **options) end - def paginated_search(params, defaults: {}, count_pages: params[:search].present?) + def paginated_search(params, count_pages: params[:search].present?, **defaults) search_params = params.fetch(:search, {}).permit! search_params = defaults.merge(search_params).with_indifferent_access diff --git a/app/models/post.rb b/app/models/post.rb index dbb1e828e..4136ba746 100644 --- a/app/models/post.rb +++ b/app/models/post.rb @@ -1546,6 +1546,30 @@ class Post < ApplicationRecord def tag_match(query) PostQueryBuilder.new(query).build end + + def search(params) + q = super + + q = q.search_attributes(params, + :approver, :uploader, :rating, :source, :pixiv_id, :fav_count, :score, :up_score, + :down_score, :md5, :file_ext, :file_size, :image_width, :image_height, :tag_count, + :parent, :has_children, :has_active_children, :is_note_locked, :is_rating_locked, + :is_status_locked, :is_pending, :is_flagged, :is_deleted, :is_banned, + :last_comment_bumped_at, :last_commented_at, :last_noted_at + ) + + if params[:tags].present? + q = q.tag_match(params[:tags]) + end + + if params[:order].present? + q = PostQueryBuilder.search_order(q, params[:order]) + else + q = q.apply_default_order(params) + end + + q + end end module PixivMethods diff --git a/app/models/tag.rb b/app/models/tag.rb index 81a682988..4d2435c89 100644 --- a/app/models/tag.rb +++ b/app/models/tag.rb @@ -38,6 +38,7 @@ class Tag < ApplicationRecord tagcount tagcount_asc rank curated + modqueue random custom ] + diff --git a/app/views/modqueue/_sidebar.html.erb b/app/views/modqueue/_sidebar.html.erb index eafe9534d..0ee352052 100644 --- a/app/views/modqueue/_sidebar.html.erb +++ b/app/views/modqueue/_sidebar.html.erb @@ -3,6 +3,7 @@ <%= search_form_for(modqueue_index_path, classes: "one-line-form") do |f| %> <%= f.input :tags, label: false, input_html: { placeholder: "Tags", value: params.dig(:search, :tags), "data-autocomplete": "tag-query" } %> + <%= f.input :order, label: false, collection: [["Newest", "modqueue"], ["Oldest", "modqueue_asc"], ["Score (Highest)", "score"], ["Score (Lowest)", "score_asc"]], selected: params[:search][:order] %> <%= f.button :button, name: nil, id: "search-box-submit" do %> <% end %>