diff --git a/app/assets/stylesheets/common/simple_form.scss b/app/assets/stylesheets/common/simple_form.scss index ca697547d..4350da3c3 100644 --- a/app/assets/stylesheets/common/simple_form.scss +++ b/app/assets/stylesheets/common/simple_form.scss @@ -71,6 +71,17 @@ form.inline-form { } } +form.one-line-form { + > input, > div.input { + display: inline; + + label { + display: inline; + margin-right: 1em; + } + } +} + div.ui-dialog { div.input { input[type="text"] { diff --git a/app/assets/stylesheets/common/tables.scss b/app/assets/stylesheets/common/tables.scss index 551e9f650..33f6ef694 100644 --- a/app/assets/stylesheets/common/tables.scss +++ b/app/assets/stylesheets/common/tables.scss @@ -54,6 +54,10 @@ table.autofit { white-space: normal; width: 100%; } + + .col-normal { + white-space: normal; + } } table.search { diff --git a/app/assets/stylesheets/specific/uploads.scss b/app/assets/stylesheets/specific/uploads.scss index e419015ab..49b71d0b1 100644 --- a/app/assets/stylesheets/specific/uploads.scss +++ b/app/assets/stylesheets/specific/uploads.scss @@ -36,6 +36,12 @@ div#c-uploads { } } + div#a-index { + .info { + margin-right: 1.5em; + } + } + div.upload-preview { display: inline-block; diff --git a/app/controllers/uploads_controller.rb b/app/controllers/uploads_controller.rb index 9821ab9f1..654d5ca42 100644 --- a/app/controllers/uploads_controller.rb +++ b/app/controllers/uploads_controller.rb @@ -20,9 +20,15 @@ class UploadsController < ApplicationController end def batch - @source = Sources::Site.new(params[:url], :referer_url => params[:ref]) - @source.get - @urls = @source.image_urls + @url = params.dig(:batch, :url) || params[:url] + @source = nil + + if @url + @source = Sources::Site.new(@url, :referer_url => params[:ref]) + @source.get + end + + respond_with(@source) end def image_proxy @@ -31,8 +37,7 @@ class UploadsController < ApplicationController end def index - @search = Upload.search(search_params) - @uploads = @search.paginate(params[:page], :limit => params[:limit]) + @uploads = Upload.search(search_params).includes(:post, :uploader).paginate(params[:page], :limit => params[:limit]) respond_with(@uploads) do |format| format.xml do render :xml => @uploads.to_xml(:root => "uploads") diff --git a/app/models/upload.rb b/app/models/upload.rb index 756554415..6a4a9a18b 100644 --- a/app/models/upload.rb +++ b/app/models/upload.rb @@ -391,19 +391,65 @@ class Upload < ApplicationRecord where(:status => "pending") end + def post_tags_match(query) + PostQueryBuilder.new(query).build(self.joins(:post)).reorder("") + end + def search(params) q = super if params[:uploader_id].present? - q = q.uploaded_by(params[:uploader_id].to_i) + q = q.attribute_matches(:uploader_id, params[:uploader_id]) end if params[:uploader_name].present? - q = q.where("uploader_id = (select _.id from users _ where lower(_.name) = ?)", params[:uploader_name].mb_chars.downcase) + q = q.where(uploader_id: User.name_to_id(params[:uploader_name])) end if params[:source].present? - q = q.where("source = ?", params[:source]) + q = q.where(source: params[:source]) + end + + if params[:source_matches].present? + q = q.where("uploads.source LIKE ? ESCAPE E'\\\\'", params[:source_matches].to_escaped_for_sql_like) + end + + if params[:rating].present? + q = q.where(rating: params[:rating]) + end + + if params[:parent_id].present? + q = q.attribute_matches(:rating, params[:parent_id]) + end + + if params[:post_id].present? + q = q.attribute_matches(:post_id, params[:post_id]) + end + + if params[:has_post] == "yes" + q = q.where.not(post_id: nil) + elsif params[:has_post] == "no" + q = q.where(post_id: nil) + end + + if params[:post_tags_match].present? + q = q.post_tags_match(params[:post_tags_match]) + end + + if params[:status].present? + q = q.where("uploads.status LIKE ? ESCAPE E'\\\\'", params[:status].to_escaped_for_sql_like) + end + + if params[:backtrace].present? + q = q.where("uploads.backtrace LIKE ? ESCAPE E'\\\\'", params[:backtrace].to_escaped_for_sql_like) + end + + if params[:tag_string].present? + q = q.where("uploads.tag_string LIKE ? ESCAPE E'\\\\'", params[:tag_string].to_escaped_for_sql_like) + end + + if params[:server].present? + q = q.where(server: params[:server]) end q.apply_default_order(params) diff --git a/app/presenters/post_presenter.rb b/app/presenters/post_presenter.rb index c77fdcd47..865d12eef 100644 --- a/app/presenters/post_presenter.rb +++ b/app/presenters/post_presenter.rb @@ -3,7 +3,7 @@ class PostPresenter < Presenter def self.preview(post, options = {}) if post.nil? - return "Expunged" + return "none".html_safe end if !options[:show_deleted] && post.is_deleted? && options[:tags] !~ /status:(?:all|any|deleted|banned)/ && !options[:raw] diff --git a/app/views/uploads/_search.html.erb b/app/views/uploads/_search.html.erb new file mode 100644 index 000000000..8e1a1cda6 --- /dev/null +++ b/app/views/uploads/_search.html.erb @@ -0,0 +1,8 @@ +<%= simple_form_for(:search, url: uploads_path, method: :get, defaults: { required: false }, html: { class: "inline-form" }) do |f| %> + <%= f.input :uploader_name, label: "Uploader", input_html: { value: params[:search][:uploader_name] } %> + <%= f.input :post_tags_match, label: "Post Tags", input_html: { value: params[:search][:post_tags_match] } %> + <%= f.input :source_matches, label: "Source", input_html: { value: params[:search][:source_matches] } %> + <%= f.input :status, collection: [%w[Completed completed], %w[Processing processing], %w[Pending pending], %w[Duplicate *duplicate*], %w[Error error*]], include_blank: true, selected: params[:search][:status] %> + + <%= f.submit "Search" %> +<% end %> diff --git a/app/views/uploads/_secondary_links.html.erb b/app/views/uploads/_secondary_links.html.erb new file mode 100644 index 000000000..2bf7f9cda --- /dev/null +++ b/app/views/uploads/_secondary_links.html.erb @@ -0,0 +1,9 @@ +<% content_for(:secondary_links) do %> + +
  • <%= link_to "Listing", uploads_path %>
  • +
  • <%= link_to "New", new_upload_path %>
  • +
  • <%= link_to "Batch Upload", batch_uploads_path %>
  • +
  • <%= link_to "IQDB", check_iqdb_queries_path %>
  • +
  • <%= link_to "Help", wiki_pages_path(search: { title: "help:upload" }) %>
  • +
    +<% end %> diff --git a/app/views/uploads/batch.html.erb b/app/views/uploads/batch.html.erb index 1cd12a528..476a3e0d9 100644 --- a/app/views/uploads/batch.html.erb +++ b/app/views/uploads/batch.html.erb @@ -2,27 +2,34 @@

    Batch Upload

    -
    - <% @urls.each.with_index do |url, i| %> -
    -

    - <%= link_to "Image ##{i}", new_upload_path(url: url, ref: params[:url]), target: "_blank" %> -

    + <%= simple_form_for(:batch, url: batch_uploads_path, method: :get, defaults: { required: false }, html: { class: "one-line-form" }) do |f| %> + <%= f.input :url, label: "URL", input_html: { size: 70, value: @url, placeholder: "https://www.pixiv.net/member_illust.php?mode=medium&illust_id=65981746" } %> + <%= f.submit "Fetch" %> + <% end %> - <%= link_to new_upload_path(url: url, ref: params[:url]), target: "_blank" do %> - <% if ImageProxy.needs_proxy?(url) %> - <%= image_tag(image_proxy_uploads_path(url: url)) %> - <% elsif url.is_a?(String) %> - <%= image_tag url %> - <% else %> - Direct Link + <% if @source.present? %> +
    + <% @source.image_urls.each.with_index do |url, i| %> +
    +

    + <%= link_to "Image ##{i}", new_upload_path(url: url, ref: @url), target: "_blank" %> +

    + + <%= link_to new_upload_path(url: url, ref: @url), target: "_blank" do %> + <% if ImageProxy.needs_proxy?(url) %> + <%= image_tag(image_proxy_uploads_path(url: url)) %> + <% elsif url.is_a?(String) %> + <%= image_tag url %> + <% else %> + Direct Link + <% end %> <% end %> - <% end %> -
    - <% end %> -
    +
    + <% end %> -

    <%= link_to "Open all links in new windows", "#", :id => "link" %>

    +

    <%= link_to "Open all links in new windows", "#", :id => "link" %>

    +
    + <% end %>
    @@ -42,4 +49,4 @@ <% end %> -<%= render "posts/partials/common/secondary_links" %> +<%= render "uploads/secondary_links" %> diff --git a/app/views/uploads/index.html.erb b/app/views/uploads/index.html.erb index 6f1e2ac55..f68c2be31 100644 --- a/app/views/uploads/index.html.erb +++ b/app/views/uploads/index.html.erb @@ -1,23 +1,65 @@
    - + <%= render "uploads/search" %> + <%= render "posts/partials/common/inline_blacklist" %> + +
    - + + - - <% @uploads.each do |upload| %> - - - - - + + + + <% end %> @@ -27,7 +69,7 @@ -<%= render "posts/partials/common/secondary_links" %> +<%= render "uploads/secondary_links" %> <% content_for(:page_title) do %> Uploads - <%= Danbooru.config.app_name %> diff --git a/app/views/uploads/new.html.erb b/app/views/uploads/new.html.erb index ce4eda756..d392321e8 100644 --- a/app/views/uploads/new.html.erb +++ b/app/views/uploads/new.html.erb @@ -143,4 +143,4 @@ Upload - <%= Danbooru.config.app_name %> <% end %> -<%= render "posts/partials/common/secondary_links" %> +<%= render "uploads/secondary_links" %> diff --git a/app/views/uploads/show.html.erb b/app/views/uploads/show.html.erb index ff94591db..b173ac7b7 100644 --- a/app/views/uploads/show.html.erb +++ b/app/views/uploads/show.html.erb @@ -36,7 +36,7 @@ -<%= render "posts/partials/common/secondary_links" %> +<%= render "uploads/secondary_links" %> <% content_for(:page_title) do %> Upload - <%= Danbooru.config.app_name %> diff --git a/test/functional/uploads_controller_test.rb b/test/functional/uploads_controller_test.rb index df1ec5bbc..93502a8d2 100644 --- a/test/functional/uploads_controller_test.rb +++ b/test/functional/uploads_controller_test.rb @@ -23,6 +23,13 @@ class UploadsControllerTest < ActionDispatch::IntegrationTest assert_no_match(/59523577_ugoira0\.jpg/, response.body) end end + + context "for a blank source" do + should "render" do + get_auth batch_uploads_path, @user + assert_response :success + end + end end context "new action" do @@ -56,18 +63,28 @@ class UploadsControllerTest < ActionDispatch::IntegrationTest context "index action" do setup do as_user do - @upload = create(:source_upload) + @upload = create(:source_upload, tag_string: "foo bar") end end should "render" do - get_auth uploads_path, @user + get uploads_path assert_response :success end context "with search parameters" do should "render" do - get_auth uploads_path, @user, params: {:search => {:source => @upload.source}} + search_params = { + uploader_name: @upload.uploader_name, + source_matches: @upload.source, + rating: @upload.rating, + has_post: "yes", + post_tags_match: @upload.tag_string, + status: @upload.status, + server: @upload.server, + } + + get uploads_path, params: { search: search_params } assert_response :success end end
    UploadInfo Uploader StatusDateTags
    <%= link_to upload.id, upload_path(upload) %><%= link_to_user upload.uploader %><%= upload.presenter.status(self) %><%= compact_time upload.created_at %><%= upload.tag_string %> + <%= PostPresenter.preview(upload.post, tags: "user:#{upload.uploader_name}", show_deleted: true) %> + + + Upload + <%= link_to "##{upload.id}", upload %> + + + + Rating + <%= upload.rating %> + + + <% if upload.post.present? %> + + Size + <%= link_to "#{upload.post.file_size.to_s(:human_size, precision: 4)} #{upload.post.file_ext}", upload.post.file_url %> + <% if upload.post.has_dimensions? %> + (<%= upload.post.image_width %>x<%= upload.post.image_height %>) + <% end %> + + <% end %> +
    + + + Source + <%= link_to_if (upload.source =~ %r!\Ahttps?://!i), (upload.source.presence || content_tag(:em, "none")), upload.source %> + <%= link_to "»", uploads_path(search: params[:search].merge(source_matches: upload.source)) %> + +
    + + + Tags + <%= TagSetPresenter.new(upload.tag_string.split).inline_tag_list(self) %> + +
    + <%= link_to_user upload.uploader %> + <%= link_to "»", uploads_path(search: params[:search].merge(uploader_name: upload.uploader_name)) %> +
    <%= time_ago_in_words_tagged upload.created_at %> +
    + <%= link_to upload.presenter.status(self), uploads_path(search: params[:search].merge(status: upload.status)) %> +