Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
196 changes: 163 additions & 33 deletions app/helpers/search_helper.rb
Original file line number Diff line number Diff line change
@@ -1,43 +1,30 @@
module SearchHelper

# modified from mislav-will_paginate-2.3.2/lib/will_paginate/view_helpers.rb
def search_header(collection, search, item_name, parent=nil)
header = []
if !collection.respond_to?(:total_pages)
header << ts("Recent #{item_name.pluralize}")
elsif collection.total_pages < 2
header << pluralize(collection.total_entries, item_name)
else
total_entries = collection.total_entries
total_entries = collection.unlimited_total_entries if collection.respond_to?(:unlimited_total_entries)
header << ts(" %{start_number} - %{end_number} of %{total} %{things}",
start_number: number_with_delimiter(collection.offset + 1),
end_number: number_with_delimiter(collection.offset + collection.length),
total: number_with_delimiter(total_entries),
things: item_name.pluralize)
end
header << ts("found") if search.present? && search.query.present?
def search_header(collection, item_type:, search: nil, parent: nil, fandom: nil, query_present: nil)
results = search_header_results(collection, item_type)
location = search_header_scope(parent, fandom)
has_query = search_query_present?(search, query_present)

case parent
when Collection
header << ts("in %{collection_link}", collection_link: link_to(parent.title, parent))
when Pseud
header << ts("by %{byline}", byline: parent.byline)
when User
header << ts("by %{username}", username: parent.login)
when Language
header << ts("in %{language}", language: parent.name)
if has_query && location.present?
t("search_helper.search_header.with_query_and_scope_html",
results: results,
location: location)
elsif has_query
t("search_helper.search_header.with_query_html",
results: results)
elsif location.present?
t("search_helper.search_header.with_scope_html",
results: results,
location: location)
else
t("search_helper.search_header.default_html",
results: results)
end

header << ts("in %{tag_link}", tag_link: link_to_tag_with_text(parent, parent.name)) if parent.is_a?(Tag)
# The @fandom version is used when following a fandom link from a user's dashboard, which
# which will take you to a URL like /users/username/works?fandom_id=123.
header << ts("in %{fandom_link}", fandom_link: link_to_tag(@fandom)) if @fandom.present?
header.join(" ").html_safe
end

def search_results_found(results)
ts("%{count} Found", count: number_with_delimiter(results.unlimited_total_entries))
t("search_helper.search_results_found",
count: number_with_delimiter(results.unlimited_total_entries))
end

def random_search_tip
Expand All @@ -61,4 +48,147 @@ def bookmarks_original_path
**params.slice(:tag_id, :collection_id, :pseud_id, :user_id).permit!
)
end

private

def search_header_results(collection, item_type)
if !collection.respond_to?(:total_pages)
search_header_recent(item_type, count: collection.size)
elsif collection.total_pages < 2
search_header_count(item_type, count: collection.total_entries)
else
total_entries = collection.respond_to?(:unlimited_total_entries) ? collection.unlimited_total_entries : collection.total_entries

search_header_range(
item_type,
count: total_entries,
start_number: number_with_delimiter(collection.offset + 1),
end_number: number_with_delimiter(collection.offset + collection.length),
total: number_with_delimiter(total_entries)
)
end
end

def search_header_recent(item_type, count:)
case item_type
when :bookmark
t("search_helper.search_header.items.bookmark.recent", count: count)
when :bookmarked_item
t("search_helper.search_header.items.bookmarked_item.recent", count: count)
when :challenge_signup
t("search_helper.search_header.items.challenge_signup.recent", count: count)
when :collection
t("search_helper.search_header.items.collection.recent", count: count)
when :comment
t("search_helper.search_header.items.comment.recent", count: count)
when :series
t("search_helper.search_header.items.series.recent", count: count)
when :tag_set
t("search_helper.search_header.items.tag_set.recent", count: count)
when :unposted_draft
t("search_helper.search_header.items.unposted_draft.recent", count: count)
when :user
t("search_helper.search_header.items.user.recent", count: count)
when :work
t("search_helper.search_header.items.work.recent", count: count)
else
raise ArgumentError, "Unknown search header item type: #{item_type.inspect}"
end
end

def search_header_count(item_type, count:)
case item_type
when :bookmark
t("search_helper.search_header.items.bookmark.count", count: count)
when :bookmarked_item
t("search_helper.search_header.items.bookmarked_item.count", count: count)
when :challenge_signup
t("search_helper.search_header.items.challenge_signup.count", count: count)
when :collection
t("search_helper.search_header.items.collection.count", count: count)
when :comment
t("search_helper.search_header.items.comment.count", count: count)
when :series
t("search_helper.search_header.items.series.count", count: count)
when :tag_set
t("search_helper.search_header.items.tag_set.count", count: count)
when :unposted_draft
t("search_helper.search_header.items.unposted_draft.count", count: count)
when :user
t("search_helper.search_header.items.user.count", count: count)
when :work
t("search_helper.search_header.items.work.count", count: count)
else
raise ArgumentError, "Unknown search header item type: #{item_type.inspect}"
end
end

def search_header_range(item_type, count:, start_number:, end_number:, total:)
case item_type
when :bookmark
t("search_helper.search_header.items.bookmark.range",
count: count, start_number: start_number, end_number: end_number, total: total)
when :bookmarked_item
t("search_helper.search_header.items.bookmarked_item.range",
count: count, start_number: start_number, end_number: end_number, total: total)
when :challenge_signup
t("search_helper.search_header.items.challenge_signup.range",
count: count, start_number: start_number, end_number: end_number, total: total)
when :collection
t("search_helper.search_header.items.collection.range",
count: count, start_number: start_number, end_number: end_number, total: total)
when :comment
t("search_helper.search_header.items.comment.range",
count: count, start_number: start_number, end_number: end_number, total: total)
when :series
t("search_helper.search_header.items.series.range",
count: count, start_number: start_number, end_number: end_number, total: total)
when :tag_set
t("search_helper.search_header.items.tag_set.range",
count: count, start_number: start_number, end_number: end_number, total: total)
when :unposted_draft
t("search_helper.search_header.items.unposted_draft.range",
count: count, start_number: start_number, end_number: end_number, total: total)
when :user
t("search_helper.search_header.items.user.range",
count: count, start_number: start_number, end_number: end_number, total: total)
when :work
t("search_helper.search_header.items.work.range",
count: count, start_number: start_number, end_number: end_number, total: total)
else
raise ArgumentError, "Unknown search header item type: #{item_type.inspect}"
end
end

def search_header_scope(parent, fandom)
scopes = []

case parent
when Collection
scopes << t("search_helper.search_header.scope.collection_html", collection_link: link_to(parent.title, parent))
when Pseud
scopes << t("search_helper.search_header.scope.pseud", byline: parent.byline)
when User
scopes << t("search_helper.search_header.scope.user", username: parent.login)
when Language
scopes << t("search_helper.search_header.scope.language", language: parent.name)
end

scopes << t("search_helper.search_header.scope.tag_html", tag_link: link_to_tag_with_text(parent, parent.name)) if parent.is_a?(Tag)
# The @fandom version is used when following a fandom link from a user's dashboard,
# which will take you to a URL like /users/username/works?fandom_id=123.
scopes << t("search_helper.search_header.scope.fandom_html", fandom_link: link_to_tag(fandom)) if fandom.present?

scopes.compact.reduce do |combined_scope, scope|
t("search_helper.search_header.scope.combined_html",
first_scope: combined_scope,
second_scope: scope)
end
end

def search_query_present?(search, query_present)
return query_present unless query_present.nil?

search.present? && search.respond_to?(:query) && search.query.present?
end
end
4 changes: 2 additions & 2 deletions app/views/admin/admin_users/_user_creations_summary.html.erb
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
# an empty listbox with pagination if the admin manually enters the wrong URL.
# This is consistent with pagination on other site pages. %>
<div class="work listbox group" id="works-summary">
<h3 class="heading"><%= search_header(@works, nil, "Work") %></h3>
<h3 class="heading"><%= search_header(@works, item_type: :work) %></h3>
<%= render "works/work_abbreviated_list", works: works %>
<%= will_paginate(works, param_name: "works_page", params: { anchor: "works-summary" }) %>
</div>
Expand All @@ -14,7 +14,7 @@
# create a clear that causes wonky styling when there are only a few
# comments. %>
<div class="comments listbox group" id="comments-summary">
<h3 class="heading"><%= search_header(@comments, nil, "Comment") %></h3>
<h3 class="heading"><%= search_header(@comments, item_type: :comment) %></h3>
<%= render "comments/comment_abbreviated_list", comments: comments %>
<%= will_paginate(comments, param_name: "comments_page", params: { anchor: "comments-summary" }) %>
</div>
Expand Down
4 changes: 2 additions & 2 deletions app/views/bookmarks/index.html.erb
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,9 @@

<h2 class="heading">
<% if @bookmarkable_items %>
<%= search_header @bookmarkable_items, @search, "Bookmarked Item", @owner %>
<%= search_header @bookmarkable_items, item_type: :bookmarked_item, search: @search, parent: @owner %>
<% else %>
<%= search_header @bookmarks, @search, "Bookmark", @owner %>
<%= search_header @bookmarks, item_type: :bookmark, search: @search, parent: @owner %>
<% end %>
</h2>
<!-- /descriptions-->
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
<!--descriptions-->
<h2 class="heading">
<% if @query %>
<%= search_header @challenge_signups, nil, t(".heading.for_search") %>
<%= search_header @challenge_signups, item_type: :challenge_signup, query_present: @query.present? %>
<% else %>
<%= t(".heading.for_collection", collection: @collection.title) %>
<% end %>
Expand Down
2 changes: 1 addition & 1 deletion app/views/collections/index.html.erb
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@
<% if @collections.empty? %>
<%= ts("Sorry, there were no collections found.") %>
<% else %>
<%= search_header @collections, @query, ts("Collection") %>
<%= search_header @collections, item_type: :collection, search: @search %>
<% end %>
</h3>
<!--/descriptions-->
Expand Down
4 changes: 3 additions & 1 deletion app/views/kudos/index.html.erb
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
<h2 class="heading">
<%= search_header(@kudos, nil, "User") %> Who Left Kudos on <%= link_to(@work.title, @work) %>
<%= t(".page_heading_html",
users: search_header(@kudos, item_type: :user),
work_link: link_to(@work.title, @work)) %>
</h2>

<% if @guest_kudos_count.positive? %>
Expand Down
4 changes: 2 additions & 2 deletions app/views/owned_tag_sets/index.html.erb
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
<% elsif @restriction %>
<%= ts('Tag Sets Used In This Challenge') %>
<% elsif @query %>
<%= search_header @tag_sets, nil, ts('Tag Set') %> <%= link_to_help 'tagset-about' %>
<%= search_header @tag_sets, item_type: :tag_set, query_present: @query.present? %> <%= link_to_help "tagset-about" %>
<% else %>
<%= ts('Tag Sets') %> <%= link_to_help 'tagset-about' %> <%= ts('in the %{archive_name}', :archive_name => ArchiveConfig.APP_NAME) %>
<% end %>
Expand Down Expand Up @@ -51,4 +51,4 @@
<% end %>
<% end %>
<!--/content-->
</div>
</div>
2 changes: 1 addition & 1 deletion app/views/series/index.html.erb
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@

<h2 class="heading">
<% if @user %>
<%= search_header @series, nil, "Series", @pseud ? @pseud : @user %>
<%= search_header @series, item_type: :series, parent: (@pseud || @user) %>
<% else %>
<%=h "View All Series" %>
<% end %>
Expand Down
2 changes: 1 addition & 1 deletion app/views/works/drafts.html.erb
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
<!--Descriptive page names, messages and instructions-->
<h2 class="heading"><%= search_header @works, nil, t(".page_heading") %></h2>
<h2 class="heading"><%= search_header @works, item_type: :unposted_draft %></h2>

<p class="caution notice">
<strong><%= t(".please_note") %></strong>
Expand Down
2 changes: 1 addition & 1 deletion app/views/works/index.html.erb
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
<%= render "muted/muted_items_notice" %>

<h2 class="heading">
<%= search_header @works, @search, "Work", @owner %>
<%= search_header @works, item_type: :work, search: @search, parent: @owner, fandom: @fandom %>
</h2>
<!-- /end descriptions-->

Expand Down
Loading
Loading