mirror of
https://github.com/philomena-dev/philomena.git
synced 2025-01-19 22:27:59 +01:00
tag search
This commit is contained in:
parent
7892df9b9f
commit
d3b45e303d
2 changed files with 185 additions and 18 deletions
|
@ -6,20 +6,25 @@ defmodule PhilomenaWeb.TagController do
|
||||||
import Ecto.Query
|
import Ecto.Query
|
||||||
|
|
||||||
def index(conn, params) do
|
def index(conn, params) do
|
||||||
{:ok, query} = Tags.Query.compile(params["tq"] || "*")
|
query_string = params["tq"] || "*"
|
||||||
|
|
||||||
tags =
|
with {:ok, query} <- Tags.Query.compile(query_string) do
|
||||||
Tag.search_records(
|
tags =
|
||||||
%{
|
Tag.search_records(
|
||||||
query: query,
|
%{
|
||||||
size: 250,
|
query: query,
|
||||||
sort: [%{images: :desc}, %{name: :asc}]
|
size: 250,
|
||||||
},
|
sort: [%{images: :desc}, %{name: :asc}]
|
||||||
%{conn.assigns.pagination | page_size: 250},
|
},
|
||||||
Tag
|
%{conn.assigns.pagination | page_size: 250},
|
||||||
)
|
Tag
|
||||||
|
)
|
||||||
|
|
||||||
render(conn, "index.html", tags: tags)
|
render(conn, "index.html", tags: tags)
|
||||||
|
else
|
||||||
|
{:error, msg} ->
|
||||||
|
render(conn, "index.html", tags: [], error: msg)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def show(conn, %{"id" => slug}) do
|
def show(conn, %{"id" => slug}) do
|
||||||
|
|
|
@ -1,6 +1,168 @@
|
||||||
= render PhilomenaWeb.TagView, "_tag_list.html", tags: @tags
|
h1 Tags
|
||||||
.block
|
|
||||||
.block__header.block__header--light.flex
|
= form_for :tags, Routes.tag_path(@conn, :index), [method: "get", class: "hform", enforce_utf8: false], fn f ->
|
||||||
= render PhilomenaWeb.PaginationView, "_pagination.html", page: @tags, route: fn p -> Routes.tag_path(@conn, :index, p) end
|
.field
|
||||||
span.block__header__title
|
= text_input f, :tq, name: :tq, value: @conn.params["tq"] || "*", class: "input hform__text", placeholder: "Search tags", autocapitalize: "none"
|
||||||
= render PhilomenaWeb.PaginationView, "_pagination_info.html", page: @tags
|
= submit "Search", class: "hform__button button", data: [disable_with: false]
|
||||||
|
|
||||||
|
.fieldlabel
|
||||||
|
' For more information, see the
|
||||||
|
a href="/search/syntax" search syntax documentation
|
||||||
|
' . Wildcards are supported in all literal fields.
|
||||||
|
' Search results are sorted by image count, then by name alphabetically.
|
||||||
|
|
||||||
|
h2 Search Results
|
||||||
|
|
||||||
|
= cond do
|
||||||
|
- Enum.any?(@tags) ->
|
||||||
|
- route = fn p -> Routes.tag_path(@conn, :index, p) end
|
||||||
|
- pagination = render PhilomenaWeb.PaginationView, "_pagination.html", page: @tags, route: route
|
||||||
|
|
||||||
|
= render PhilomenaWeb.TagView, "_tag_list.html", tags: @tags
|
||||||
|
|
||||||
|
.block
|
||||||
|
.block__header.block__header--light.flex
|
||||||
|
= pagination
|
||||||
|
span.block__header__title
|
||||||
|
= render PhilomenaWeb.PaginationView, "_pagination_info.html", page: @tags
|
||||||
|
|
||||||
|
- assigns[:error] ->
|
||||||
|
p
|
||||||
|
' Oops, there was an error evaluating your query:
|
||||||
|
pre = assigns[:error]
|
||||||
|
|
||||||
|
- true ->
|
||||||
|
p
|
||||||
|
' No tags found!
|
||||||
|
|
||||||
|
h3 Default search
|
||||||
|
p
|
||||||
|
' If you do not specify a field to search over, the search engine will
|
||||||
|
' search for tags with a name that is similar to the query's
|
||||||
|
em word stems
|
||||||
|
' . For example,
|
||||||
|
code winged humanization
|
||||||
|
' ,
|
||||||
|
code wings
|
||||||
|
' , and
|
||||||
|
code> spread wings
|
||||||
|
' would all be matched by a search for
|
||||||
|
code wing
|
||||||
|
' , but
|
||||||
|
code> sewing
|
||||||
|
' would not be.
|
||||||
|
|
||||||
|
h3 Allowed fields
|
||||||
|
table.table
|
||||||
|
thead
|
||||||
|
tr
|
||||||
|
th Field Selector
|
||||||
|
th Type
|
||||||
|
th Description
|
||||||
|
th Example
|
||||||
|
tbody
|
||||||
|
tr
|
||||||
|
td
|
||||||
|
code alias_of
|
||||||
|
td Literal
|
||||||
|
td Matches the name of the target tag, if this tag is aliased.
|
||||||
|
td
|
||||||
|
code = link "alias_of:twilight sparkle", to: Routes.tag_path(@conn, :index, tq: "alias_of:twilight sparkle")
|
||||||
|
tr
|
||||||
|
td
|
||||||
|
code aliased
|
||||||
|
td Boolean
|
||||||
|
td Matches when this tag is aliased.
|
||||||
|
td
|
||||||
|
code = link "aliased:true", to: Routes.tag_path(@conn, :index, tq: "aliased:true")
|
||||||
|
tr
|
||||||
|
td
|
||||||
|
code aliases
|
||||||
|
td Literal
|
||||||
|
td Matches the name of any of this tag's aliases.
|
||||||
|
td
|
||||||
|
code = link "aliases:ts", to: Routes.tag_path(@conn, :index, tq: "aliases:ts")
|
||||||
|
tr
|
||||||
|
td
|
||||||
|
code analyzed_name
|
||||||
|
td Full Text
|
||||||
|
td Matches the name of this tag. This is the default field.
|
||||||
|
td
|
||||||
|
code = link "analyzed_name:wing", to: Routes.tag_path(@conn, :index, tq: "analyzed_name:wing")
|
||||||
|
tr
|
||||||
|
td
|
||||||
|
code category
|
||||||
|
td Literal
|
||||||
|
td Matches the category this tag belongs to.
|
||||||
|
td
|
||||||
|
code = link "category:origin", to: Routes.tag_path(@conn, :index, tq: "category:origin")
|
||||||
|
tr
|
||||||
|
td
|
||||||
|
code description
|
||||||
|
td Full Text
|
||||||
|
td Matches the text of the full description for this tag.
|
||||||
|
td
|
||||||
|
code = link "description:species", to: Routes.tag_path(@conn, :index, tq: "description:species")
|
||||||
|
tr
|
||||||
|
td
|
||||||
|
code id
|
||||||
|
td Numeric Range
|
||||||
|
td Matches the numeric surrogate key for this tag.
|
||||||
|
td
|
||||||
|
code = link "id:40482", to: Routes.tag_path(@conn, :index, tq: "id:40482")
|
||||||
|
tr
|
||||||
|
td
|
||||||
|
code images
|
||||||
|
td Numeric Range
|
||||||
|
td Matches tags with the specified image count.
|
||||||
|
td
|
||||||
|
code = link "images.lte:1000", to: Routes.tag_path(@conn, :index, tq: "images.lte:1000")
|
||||||
|
tr
|
||||||
|
td
|
||||||
|
code implied_by
|
||||||
|
td Literal
|
||||||
|
td Matches this tag if it is implied by the given tag.
|
||||||
|
td
|
||||||
|
code = link "implied_by:transparent background", to: Routes.tag_path(@conn, :index, tq: "implied_by:transparent background")
|
||||||
|
tr
|
||||||
|
td
|
||||||
|
code implies
|
||||||
|
td Literal
|
||||||
|
td Matches this tag if it implies the given tag.
|
||||||
|
td
|
||||||
|
code = link "implies:shipping", to: Routes.tag_path(@conn, :index, tq: "implies:shipping")
|
||||||
|
tr
|
||||||
|
td
|
||||||
|
code name
|
||||||
|
td Literal
|
||||||
|
td Matches the exact name of this tag.
|
||||||
|
td
|
||||||
|
code = link "name:safe", to: Routes.tag_path(@conn, :index, tq: "name:safe")
|
||||||
|
tr
|
||||||
|
td
|
||||||
|
code name_in_namespace
|
||||||
|
td Literal
|
||||||
|
td Matches the name of this tag with any namespace component removed.
|
||||||
|
td
|
||||||
|
code = link "name_in_namespace:johnjoseco", to: Routes.tag_path(@conn, :index, tq: "name_in_namespace:johnjoseco")
|
||||||
|
tr
|
||||||
|
td
|
||||||
|
code namespace
|
||||||
|
td Literal
|
||||||
|
td Matches tags with the given namespace.
|
||||||
|
td
|
||||||
|
code = link "namespace:artist", to: Routes.tag_path(@conn, :index, tq: "namespace:artist")
|
||||||
|
tr
|
||||||
|
td
|
||||||
|
code short_description
|
||||||
|
td Full Text
|
||||||
|
td Matches the text of the short description for this tag.
|
||||||
|
td
|
||||||
|
code = link "short_description:gender", to: Routes.tag_path(@conn, :index, tq: "short_description:gender")
|
||||||
|
tr
|
||||||
|
td
|
||||||
|
code slug
|
||||||
|
td Literal
|
||||||
|
td Matches the slug of this tag.
|
||||||
|
td
|
||||||
|
code = link "slug:-fwslash-mlp-fwslash-", to: Routes.tag_path(@conn, :index, tq: "slug:-fwslash-mlp-fwslash-")
|
Loading…
Reference in a new issue