From 27cac985161718a7ce2ede9570ad4fe5b30f05a6 Mon Sep 17 00:00:00 2001 From: evazion Date: Fri, 29 Jan 2021 21:41:09 -0600 Subject: [PATCH] posts: eliminate pool_id, favgroup_id url params. Replace the `pool_id` and `favgroup_id` url params: https://danbooru.donmai.us/posts/123?pool_id=456 https://danbooru.donmai.us/posts/123?favgroup_id=456 with the `q` param: https://danbooru.donmai.us/posts/123?q=pool:456 https://danbooru.donmai.us/posts/123?q=favgroup:456 --- app/components/post_navbar_component.rb | 26 ++++++++++--------- .../post_navbar_component.html.erb | 16 ++++++------ app/components/post_preview_component.rb | 18 +++---------- .../post_preview_component.html.erb | 2 +- app/logical/post_query_builder.rb | 4 +-- app/views/favorite_groups/show.html.erb | 2 +- app/views/pools/show.html.erb | 2 +- app/views/posts/show.html.erb | 4 +-- test/components/post_navbar_component_test.rb | 26 ++++++++++++++++--- 9 files changed, 54 insertions(+), 46 deletions(-) diff --git a/app/components/post_navbar_component.rb b/app/components/post_navbar_component.rb index 9f02dfee0..2719254f5 100644 --- a/app/components/post_navbar_component.rb +++ b/app/components/post_navbar_component.rb @@ -1,14 +1,10 @@ class PostNavbarComponent < ApplicationComponent - extend Memoist + attr_reader :post, :current_user, :search - attr_reader :post, :current_user, :search, :pool_id, :favgroup_id - - def initialize(post:, current_user:, search: nil, pool_id: nil, favgroup_id: nil) + def initialize(post:, current_user:, search: nil) @post = post @current_user = current_user @search = search.presence || "status:any" - @pool_id = pool_id&.to_i - @favgroup_id = favgroup_id&.to_i end def render? @@ -16,24 +12,30 @@ class PostNavbarComponent < ApplicationComponent end def pools - post.pools.undeleted.sort_by do |pool| + @pools ||= post.pools.undeleted.sort_by do |pool| [pool.id == pool_id ? 0 : 1, pool.is_series? ? 0 : 1, pool.name] end end def favgroups - current_user.favorite_groups.for_post(post.id).sort_by do |favgroup| + @favgroups ||= current_user.favorite_groups.for_post(post.id).sort_by do |favgroup| [favgroup.id == favgroup_id ? 0 : 1, favgroup.name] end end def has_search_navbar? - !has_order_metatag? && pool_id.blank? && favgroup_id.blank? + !query.has_metatag?(:order, :ordfav, :ordpool) && pool_id.blank? && favgroup_id.blank? end - def has_order_metatag? - PostQueryBuilder.new(search).has_metatag?(:order, :ordfav, :ordpool) + def pool_id + @pool_id ||= query.find_metatag(:pool, :ordpool)&.to_i end - memoize :pools, :favgroups + def favgroup_id + @favgroup_id ||= query.find_metatag(:favgroup, :ordfavgroup)&.to_i + end + + def query + @query ||= PostQueryBuilder.new(search) + end end diff --git a/app/components/post_navbar_component/post_navbar_component.html.erb b/app/components/post_navbar_component/post_navbar_component.html.erb index 0d290dc24..43fb04c3b 100644 --- a/app/components/post_navbar_component/post_navbar_component.html.erb +++ b/app/components/post_navbar_component/post_navbar_component.html.erb @@ -16,11 +16,11 @@ <%= tag.li class: "pool-navbar pool-category-#{pool.category}", "data-selected": selected do %> - <%= link_to_unless first_post_id == post.id, "«", post_path(first_post_id, pool_id: pool.id), rel: "nofollow", title: "to page 1" %> + <%= link_to_unless first_post_id == post.id, "«", post_path(first_post_id, q: "pool:#{pool.id}"), rel: "nofollow", title: "to page 1" %> - <%= link_to_if previous_post_id, "‹ prev", post_path(previous_post_id.to_i, pool_id: pool.id), rel: ["nofollow", ("prev" if selected)], title: "to page #{pool.page_number(previous_post_id)}" %> + <%= link_to_if previous_post_id, "‹ prev", post_path(previous_post_id.to_i, q: "pool:#{pool.id}"), rel: ["nofollow", ("prev" if selected)], title: "to page #{pool.page_number(previous_post_id)}" %> @@ -28,11 +28,11 @@ - <%= link_to_if next_post_id, "next ›", post_path(next_post_id.to_i, pool_id: pool.id), rel: ["nofollow", ("next" if selected)], title: "to page #{pool.page_number(next_post_id)}" %> + <%= link_to_if next_post_id, "next ›", post_path(next_post_id.to_i, q: "pool:#{pool.id}"), rel: ["nofollow", ("next" if selected)], title: "to page #{pool.page_number(next_post_id)}" %> - <%= link_to_unless last_post_id == post.id, "»", post_path(last_post_id, pool_id: pool.id), rel: "nofollow", title: "to page #{pool.post_count}" %> + <%= link_to_unless last_post_id == post.id, "»", post_path(last_post_id, q: "pool:#{pool.id}"), rel: "nofollow", title: "to page #{pool.post_count}" %> <% end %> <% end %> @@ -46,11 +46,11 @@ <%= tag.li class: "favgroup-navbar", "data-selected": selected do %> - <%= link_to_unless first_post_id == post.id, "«", post_path(first_post_id, favgroup_id: favgroup.id), rel: "nofollow" %> + <%= link_to_unless first_post_id == post.id, "«", post_path(first_post_id, q: "favgroup:#{favgroup.id}"), rel: "nofollow" %> - <%= link_to_if previous_post_id, "‹ prev", post_path(previous_post_id.to_i, favgroup_id: favgroup.id), rel: ["nofollow", ("prev" if selected)] %> + <%= link_to_if previous_post_id, "‹ prev", post_path(previous_post_id.to_i, q: "favgroup:#{favgroup.id}"), rel: ["nofollow", ("prev" if selected)] %> @@ -58,11 +58,11 @@ - <%= link_to_if next_post_id, "next ›", post_path(next_post_id.to_i, favgroup_id: favgroup.id), rel: ["nofollow", ("next" if selected)] %> + <%= link_to_if next_post_id, "next ›", post_path(next_post_id.to_i, q: "favgroup:#{favgroup.id}"), rel: ["nofollow", ("next" if selected)] %> - <%= link_to_unless last_post_id == post.id, "»", post_path(last_post_id, favgroup_id: favgroup.id), rel: "nofollow" %> + <%= link_to_unless last_post_id == post.id, "»", post_path(last_post_id, q: "favgroup:#{favgroup.id}"), rel: "nofollow" %> <% end %> <% end %> diff --git a/app/components/post_preview_component.rb b/app/components/post_preview_component.rb index dbd9f51e9..e5cb617f7 100644 --- a/app/components/post_preview_component.rb +++ b/app/components/post_preview_component.rb @@ -3,18 +3,16 @@ class PostPreviewComponent < ApplicationComponent with_collection_parameter :post - attr_reader :post, :tags, :show_deleted, :show_cropped, :link_target, :pool, :pool_id, :favgroup_id, :similarity, :recommended, :compact, :size, :current_user, :options + attr_reader :post, :tags, :show_deleted, :show_cropped, :link_target, :pool, :similarity, :recommended, :compact, :size, :current_user, :options delegate :external_link_to, :time_ago_in_words_tagged, :empty_heart_icon, to: :helpers - def initialize(post:, tags: "", show_deleted: false, show_cropped: true, link_target: post, pool: nil, pool_id: nil, favgroup_id: nil, similarity: nil, recommended: nil, compact: nil, size: nil, current_user: CurrentUser.user, **options) + def initialize(post:, tags: "", show_deleted: false, show_cropped: true, link_target: post, pool: nil, similarity: nil, recommended: nil, compact: nil, size: nil, current_user: CurrentUser.user, **options) @post = post - @tags = tags + @tags = tags.presence @show_deleted = show_deleted @show_cropped = show_cropped @link_target = link_target @pool = pool - @pool_id = pool_id - @favgroup_id = favgroup_id @similarity = similarity.round(1) if similarity.present? @recommended = recommended.round(1) if recommended.present? @compact = compact @@ -31,16 +29,6 @@ class PostPreviewComponent < ApplicationComponent { class: [classes, *preview_class].compact.join(" "), **data_attributes } end - def link_params - link_params = {} - - link_params["q"] = tags if tags.present? - link_params["pool_id"] = pool_id if pool_id - link_params["favgroup_id"] = favgroup_id if favgroup_id - - link_params - end - def cropped_url if show_cropped && post.has_cropped? && !current_user.disable_cropped_thumbnails? post.crop_file_url diff --git a/app/components/post_preview_component/post_preview_component.html.erb b/app/components/post_preview_component/post_preview_component.html.erb index 136c6ad03..613292715 100644 --- a/app/components/post_preview_component/post_preview_component.html.erb +++ b/app/components/post_preview_component/post_preview_component.html.erb @@ -1,5 +1,5 @@ <%= tag.article id: "post_#{post.id}", **article_attrs do -%> - <%= link_to polymorphic_path(link_target, link_params) do -%> + <%= link_to polymorphic_path(link_target, q: tags) do -%> <%= tag.source media: "(max-width: 660px)", srcset: cropped_url -%> <%= tag.source media: "(min-width: 660px)", srcset: post.preview_file_url -%> diff --git a/app/logical/post_query_builder.rb b/app/logical/post_query_builder.rb index 7c87a0e37..f2ab80f87 100644 --- a/app/logical/post_query_builder.rb +++ b/app/logical/post_query_builder.rb @@ -949,8 +949,8 @@ class PostQueryBuilder metatags.select { |term| term.name.in?(names.map(&:to_s)) } end - def find_metatag(metatag) - select_metatags(metatag).first.try(:value) + def find_metatag(*metatags) + select_metatags(*metatags).first.try(:value) end def has_metatag?(*metatag_names) diff --git a/app/views/favorite_groups/show.html.erb b/app/views/favorite_groups/show.html.erb index ee2277728..8499e1cbb 100644 --- a/app/views/favorite_groups/show.html.erb +++ b/app/views/favorite_groups/show.html.erb @@ -19,7 +19,7 @@ <% if @favorite_group.post_count == 0 %> <%= render "post_sets/blank" %> <% else %> - <%= post_previews_html(@posts, favgroup_id: @favorite_group.id, show_deleted: true) %> + <%= post_previews_html(@posts, tags: "favgroup:#{@favorite_group.id}", show_deleted: true) %> <%= numbered_paginator(@posts) %> <% end %> diff --git a/app/views/pools/show.html.erb b/app/views/pools/show.html.erb index 29dbb1191..d498e9b0b 100644 --- a/app/views/pools/show.html.erb +++ b/app/views/pools/show.html.erb @@ -24,7 +24,7 @@ <% if @pool.post_count == 0 %> <%= render "post_sets/blank" %> <% else %> - <%= post_previews_html(@posts, pool_id: @pool.id, show_deleted: @pool.is_series?) %> + <%= post_previews_html(@posts, tags: "pool:#{@pool.id}", show_deleted: @pool.is_series?) %> <%= numbered_paginator(@posts) %> <% end %> diff --git a/app/views/posts/show.html.erb b/app/views/posts/show.html.erb index 974c3ccac..fb56206fb 100644 --- a/app/views/posts/show.html.erb +++ b/app/views/posts/show.html.erb @@ -39,7 +39,7 @@ <% content_for(:content) do %> <% if !CurrentUser.user.new_post_navigation_layout %> - <%= render_post_navbar(@post, current_user: CurrentUser.user, search: params[:q], pool_id: params[:pool_id], favgroup_id: params[:favgroup_id]) %> + <%= render_post_navbar(@post, current_user: CurrentUser.user, search: params[:q]) %> <% end %> <%= render "posts/partials/show/notices", :post => @post %> @@ -83,7 +83,7 @@ <% end %> <% if CurrentUser.user.new_post_navigation_layout %> - <%= render_post_navbar(@post, current_user: CurrentUser.user, search: params[:q], pool_id: params[:pool_id], favgroup_id: params[:favgroup_id]) %> + <%= render_post_navbar(@post, current_user: CurrentUser.user, search: params[:q]) %> <% end %> diff --git a/test/components/post_navbar_component_test.rb b/test/components/post_navbar_component_test.rb index 5bd58e410..4d3459018 100644 --- a/test/components/post_navbar_component_test.rb +++ b/test/components/post_navbar_component_test.rb @@ -20,33 +20,51 @@ class PostNavbarComponentTest < ViewComponent::TestCase end context "for a post with pools" do - should "render" do + setup do as(@user) do @pool1 = create(:pool, category: "series") @pool2 = create(:pool, category: "collection") @post.update(tag_string: "pool:#{@pool1.id} pool:#{@pool2.id}") end + end - render_post_navbar(@post, current_user: @user, pool_id: @pool1.id) + should "render" do + render_post_navbar(@post, current_user: @user) assert_css(".pool-name", text: "Pool: #{@pool1.pretty_name}") assert_css(".pool-name", text: "Pool: #{@pool2.pretty_name}") end + + should "highlight the selected pool" do + render_post_navbar(@post, current_user: @user, search: "pool:#{@pool1.id}") + + assert_css(".pool-navbar[data-selected=true] .pool-name", text: "Pool: #{@pool1.pretty_name}") + assert_css(".pool-navbar[data-selected=false] .pool-name", text: "Pool: #{@pool2.pretty_name}") + end end context "for a post with favgroups" do - should "render" do + setup do as(@user) do @favgroup1 = create(:favorite_group, creator: @user) @favgroup2 = create(:favorite_group, creator: @user) @post.update(tag_string: "favgroup:#{@favgroup1.id} favgroup:#{@favgroup2.id}") end + end - render_post_navbar(@post, current_user: @user, favgroup_id: @favgroup1.id) + should "render" do + render_post_navbar(@post, current_user: @user, search: "favgroup:#{@favgroup1.id}") assert_css(".favgroup-name", text: "Favgroup: #{@favgroup1.pretty_name}") assert_css(".favgroup-name", text: "Favgroup: #{@favgroup2.pretty_name}") end + + should "highlight the selected favgroup" do + render_post_navbar(@post, current_user: @user, search: "favgroup:#{@favgroup1.id}") + + assert_css(".favgroup-navbar[data-selected=true] .favgroup-name", text: "Favgroup: #{@favgroup1.pretty_name}") + assert_css(".favgroup-navbar[data-selected=false] .favgroup-name", text: "Favgroup: #{@favgroup2.pretty_name}") + end end end end