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
This commit is contained in:
@@ -1,14 +1,10 @@
|
|||||||
class PostNavbarComponent < ApplicationComponent
|
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)
|
||||||
|
|
||||||
def initialize(post:, current_user:, search: nil, pool_id: nil, favgroup_id: nil)
|
|
||||||
@post = post
|
@post = post
|
||||||
@current_user = current_user
|
@current_user = current_user
|
||||||
@search = search.presence || "status:any"
|
@search = search.presence || "status:any"
|
||||||
@pool_id = pool_id&.to_i
|
|
||||||
@favgroup_id = favgroup_id&.to_i
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def render?
|
def render?
|
||||||
@@ -16,24 +12,30 @@ class PostNavbarComponent < ApplicationComponent
|
|||||||
end
|
end
|
||||||
|
|
||||||
def pools
|
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]
|
[pool.id == pool_id ? 0 : 1, pool.is_series? ? 0 : 1, pool.name]
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def favgroups
|
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]
|
[favgroup.id == favgroup_id ? 0 : 1, favgroup.name]
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def has_search_navbar?
|
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
|
end
|
||||||
|
|
||||||
def has_order_metatag?
|
def pool_id
|
||||||
PostQueryBuilder.new(search).has_metatag?(:order, :ordfav, :ordpool)
|
@pool_id ||= query.find_metatag(:pool, :ordpool)&.to_i
|
||||||
end
|
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
|
end
|
||||||
|
|||||||
@@ -16,11 +16,11 @@
|
|||||||
|
|
||||||
<%= tag.li class: "pool-navbar pool-category-#{pool.category}", "data-selected": selected do %>
|
<%= tag.li class: "pool-navbar pool-category-#{pool.category}", "data-selected": selected do %>
|
||||||
<span class="first">
|
<span class="first">
|
||||||
<%= 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" %>
|
||||||
</span>
|
</span>
|
||||||
|
|
||||||
<span class="prev">
|
<span class="prev">
|
||||||
<%= 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)}" %>
|
||||||
</span>
|
</span>
|
||||||
|
|
||||||
<span class="pool-name">
|
<span class="pool-name">
|
||||||
@@ -28,11 +28,11 @@
|
|||||||
</span>
|
</span>
|
||||||
|
|
||||||
<span class="next">
|
<span class="next">
|
||||||
<%= 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)}" %>
|
||||||
</span>
|
</span>
|
||||||
|
|
||||||
<span class="last">
|
<span class="last">
|
||||||
<%= 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}" %>
|
||||||
</span>
|
</span>
|
||||||
<% end %>
|
<% end %>
|
||||||
<% end %>
|
<% end %>
|
||||||
@@ -46,11 +46,11 @@
|
|||||||
|
|
||||||
<%= tag.li class: "favgroup-navbar", "data-selected": selected do %>
|
<%= tag.li class: "favgroup-navbar", "data-selected": selected do %>
|
||||||
<span class="first">
|
<span class="first">
|
||||||
<%= 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" %>
|
||||||
</span>
|
</span>
|
||||||
|
|
||||||
<span class="prev">
|
<span class="prev">
|
||||||
<%= 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)] %>
|
||||||
</span>
|
</span>
|
||||||
|
|
||||||
<span class="favgroup-name">
|
<span class="favgroup-name">
|
||||||
@@ -58,11 +58,11 @@
|
|||||||
</span>
|
</span>
|
||||||
|
|
||||||
<span class="next">
|
<span class="next">
|
||||||
<%= 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)] %>
|
||||||
</span>
|
</span>
|
||||||
|
|
||||||
<span class="last">
|
<span class="last">
|
||||||
<%= 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" %>
|
||||||
</span>
|
</span>
|
||||||
<% end %>
|
<% end %>
|
||||||
<% end %>
|
<% end %>
|
||||||
|
|||||||
@@ -3,18 +3,16 @@
|
|||||||
class PostPreviewComponent < ApplicationComponent
|
class PostPreviewComponent < ApplicationComponent
|
||||||
with_collection_parameter :post
|
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
|
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
|
@post = post
|
||||||
@tags = tags
|
@tags = tags.presence
|
||||||
@show_deleted = show_deleted
|
@show_deleted = show_deleted
|
||||||
@show_cropped = show_cropped
|
@show_cropped = show_cropped
|
||||||
@link_target = link_target
|
@link_target = link_target
|
||||||
@pool = pool
|
@pool = pool
|
||||||
@pool_id = pool_id
|
|
||||||
@favgroup_id = favgroup_id
|
|
||||||
@similarity = similarity.round(1) if similarity.present?
|
@similarity = similarity.round(1) if similarity.present?
|
||||||
@recommended = recommended.round(1) if recommended.present?
|
@recommended = recommended.round(1) if recommended.present?
|
||||||
@compact = compact
|
@compact = compact
|
||||||
@@ -31,16 +29,6 @@ class PostPreviewComponent < ApplicationComponent
|
|||||||
{ class: [classes, *preview_class].compact.join(" "), **data_attributes }
|
{ class: [classes, *preview_class].compact.join(" "), **data_attributes }
|
||||||
end
|
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
|
def cropped_url
|
||||||
if show_cropped && post.has_cropped? && !current_user.disable_cropped_thumbnails?
|
if show_cropped && post.has_cropped? && !current_user.disable_cropped_thumbnails?
|
||||||
post.crop_file_url
|
post.crop_file_url
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
<%= tag.article id: "post_#{post.id}", **article_attrs do -%>
|
<%= 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 -%>
|
||||||
<picture>
|
<picture>
|
||||||
<%= tag.source media: "(max-width: 660px)", srcset: cropped_url -%>
|
<%= tag.source media: "(max-width: 660px)", srcset: cropped_url -%>
|
||||||
<%= tag.source media: "(min-width: 660px)", srcset: post.preview_file_url -%>
|
<%= tag.source media: "(min-width: 660px)", srcset: post.preview_file_url -%>
|
||||||
|
|||||||
@@ -949,8 +949,8 @@ class PostQueryBuilder
|
|||||||
metatags.select { |term| term.name.in?(names.map(&:to_s)) }
|
metatags.select { |term| term.name.in?(names.map(&:to_s)) }
|
||||||
end
|
end
|
||||||
|
|
||||||
def find_metatag(metatag)
|
def find_metatag(*metatags)
|
||||||
select_metatags(metatag).first.try(:value)
|
select_metatags(*metatags).first.try(:value)
|
||||||
end
|
end
|
||||||
|
|
||||||
def has_metatag?(*metatag_names)
|
def has_metatag?(*metatag_names)
|
||||||
|
|||||||
@@ -19,7 +19,7 @@
|
|||||||
<% if @favorite_group.post_count == 0 %>
|
<% if @favorite_group.post_count == 0 %>
|
||||||
<%= render "post_sets/blank" %>
|
<%= render "post_sets/blank" %>
|
||||||
<% else %>
|
<% 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) %>
|
<%= numbered_paginator(@posts) %>
|
||||||
<% end %>
|
<% end %>
|
||||||
|
|||||||
@@ -24,7 +24,7 @@
|
|||||||
<% if @pool.post_count == 0 %>
|
<% if @pool.post_count == 0 %>
|
||||||
<%= render "post_sets/blank" %>
|
<%= render "post_sets/blank" %>
|
||||||
<% else %>
|
<% 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) %>
|
<%= numbered_paginator(@posts) %>
|
||||||
<% end %>
|
<% end %>
|
||||||
|
|||||||
@@ -39,7 +39,7 @@
|
|||||||
|
|
||||||
<% content_for(:content) do %>
|
<% content_for(:content) do %>
|
||||||
<% if !CurrentUser.user.new_post_navigation_layout %>
|
<% 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 %>
|
<% end %>
|
||||||
|
|
||||||
<%= render "posts/partials/show/notices", :post => @post %>
|
<%= render "posts/partials/show/notices", :post => @post %>
|
||||||
@@ -83,7 +83,7 @@
|
|||||||
<% end %>
|
<% end %>
|
||||||
|
|
||||||
<% if CurrentUser.user.new_post_navigation_layout %>
|
<% 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 %>
|
<% end %>
|
||||||
|
|
||||||
<menu id="post-sections">
|
<menu id="post-sections">
|
||||||
|
|||||||
@@ -20,33 +20,51 @@ class PostNavbarComponentTest < ViewComponent::TestCase
|
|||||||
end
|
end
|
||||||
|
|
||||||
context "for a post with pools" do
|
context "for a post with pools" do
|
||||||
should "render" do
|
setup do
|
||||||
as(@user) do
|
as(@user) do
|
||||||
@pool1 = create(:pool, category: "series")
|
@pool1 = create(:pool, category: "series")
|
||||||
@pool2 = create(:pool, category: "collection")
|
@pool2 = create(:pool, category: "collection")
|
||||||
@post.update(tag_string: "pool:#{@pool1.id} pool:#{@pool2.id}")
|
@post.update(tag_string: "pool:#{@pool1.id} pool:#{@pool2.id}")
|
||||||
end
|
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: #{@pool1.pretty_name}")
|
||||||
assert_css(".pool-name", text: "Pool: #{@pool2.pretty_name}")
|
assert_css(".pool-name", text: "Pool: #{@pool2.pretty_name}")
|
||||||
end
|
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
|
end
|
||||||
|
|
||||||
context "for a post with favgroups" do
|
context "for a post with favgroups" do
|
||||||
should "render" do
|
setup do
|
||||||
as(@user) do
|
as(@user) do
|
||||||
@favgroup1 = create(:favorite_group, creator: @user)
|
@favgroup1 = create(:favorite_group, creator: @user)
|
||||||
@favgroup2 = create(:favorite_group, creator: @user)
|
@favgroup2 = create(:favorite_group, creator: @user)
|
||||||
@post.update(tag_string: "favgroup:#{@favgroup1.id} favgroup:#{@favgroup2.id}")
|
@post.update(tag_string: "favgroup:#{@favgroup1.id} favgroup:#{@favgroup2.id}")
|
||||||
end
|
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: #{@favgroup1.pretty_name}")
|
||||||
assert_css(".favgroup-name", text: "Favgroup: #{@favgroup2.pretty_name}")
|
assert_css(".favgroup-name", text: "Favgroup: #{@favgroup2.pretty_name}")
|
||||||
end
|
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
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
Reference in New Issue
Block a user