diff --git a/app/models/upload.rb b/app/models/upload.rb index 447326d8d..09f2f7bb3 100644 --- a/app/models/upload.rb +++ b/app/models/upload.rb @@ -87,16 +87,35 @@ class Upload < ApplicationRecord end end + def self.ai_tags_match(tag_string, score_range: (50..)) + upload_media_assets = AITagQuery.search(tag_string, relation: UploadMediaAsset.all, foreign_key: :media_asset_id, score_range: score_range) + where(upload_media_assets.where("upload_media_assets.upload_id = uploads.id").arel.exists) + end + def self.search(params) q = search_attributes(params, :id, :created_at, :updated_at, :source, :referer_url, :status, :media_asset_count, :uploader, :upload_media_assets, :media_assets, :posts) + if params[:ai_tags_match].present? + min_score = params.fetch(:min_score, 50).to_i + q = q.ai_tags_match(params[:ai_tags_match], score_range: (min_score..)) + end + if params[:is_posted].to_s.truthy? q = q.where.not(id: Upload.where.missing(:posts)) elsif params[:is_posted].to_s.falsy? q = q.where(id: Upload.where.missing(:posts)) end - q.apply_default_order(params) + case params[:order] + when "id", "id_desc" + q = q.order(id: :desc) + when "id_asc" + q = q.order(id: :asc) + else + q = q.apply_default_order(params) + end + + q end def async_process_upload! diff --git a/app/views/uploads/index.html.erb b/app/views/uploads/index.html.erb index 1d32549e3..35b3a9a68 100644 --- a/app/views/uploads/index.html.erb +++ b/app/views/uploads/index.html.erb @@ -2,10 +2,20 @@

My Uploads

+ <%= search_form_for(current_page_path) do |f| %> + <%= f.input :ai_tags_match, label: "Tags", input_html: { value: params.dig(:search, :ai_tags_match), data: { autocomplete: "tag-query" } } %> + <%= f.input :status, collection: %w[pending completed error], include_blank: true, selected: params.dig(:search, :status) %> + <%= f.input :is_posted, as: :hidden, input_html: { value: params.dig(:search, :is_posted) } %> + <%= f.input :min_score, as: :hidden, input_html: { value: params.dig(:search, :min_score) } %> + + <%= f.input :order, collection: [%w[Newest id], %w[Oldest id_asc]], include_blank: true, selected: params[:search][:order] %> + <%= f.submit "Search" %> + <% end %> +
<%= link_to "All", current_page_path(search: search_params.to_h.without("is_posted")), class: ["inline-block p-1 pb-2", (search_params[:is_posted].nil? ? "border-current border-b-2 -mb-px" : "inactive-link")] %> - <%= link_to "Posted", current_page_path(search: { is_posted: true }), class: ["inline-block p-1 pb-2", (search_params[:is_posted].to_s.truthy? ? "border-current border-b-2 -mb-px" : "inactive-link")] %> - <%= link_to "Unposted", current_page_path(search: { is_posted: false }), class: ["inline-block p-1 pb-2", (search_params[:is_posted].to_s.falsy? ? "border-current border-b-2 -mb-px" : "inactive-link")] %> + <%= link_to "Posted", current_page_path(search: search_params.merge(is_posted: true)), class: ["inline-block p-1 pb-2", (search_params[:is_posted].to_s.truthy? ? "border-current border-b-2 -mb-px" : "inactive-link")] %> + <%= link_to "Unposted", current_page_path(search: search_params.merge(is_posted: false)), class: ["inline-block p-1 pb-2", (search_params[:is_posted].to_s.falsy? ? "border-current border-b-2 -mb-px" : "inactive-link")] %>