Add sorting optoins to scrobble rules page
This commit is contained in:
@@ -15,6 +15,7 @@ defmodule MusicLibrary.ScrobbleRules do
|
|||||||
type: atom(),
|
type: atom(),
|
||||||
enabled: boolean(),
|
enabled: boolean(),
|
||||||
query: String.t(),
|
query: String.t(),
|
||||||
|
order: :inserted_at | :alphabetical,
|
||||||
offset: non_neg_integer(),
|
offset: non_neg_integer(),
|
||||||
limit: non_neg_integer()
|
limit: non_neg_integer()
|
||||||
]
|
]
|
||||||
@@ -22,7 +23,8 @@ defmodule MusicLibrary.ScrobbleRules do
|
|||||||
@spec list_scrobble_rules(list_opts()) :: [ScrobbleRule.t()]
|
@spec list_scrobble_rules(list_opts()) :: [ScrobbleRule.t()]
|
||||||
def list_scrobble_rules(opts \\ []) do
|
def list_scrobble_rules(opts \\ []) do
|
||||||
query =
|
query =
|
||||||
from(r in ScrobbleRule, order_by: [desc: r.inserted_at])
|
from(r in ScrobbleRule)
|
||||||
|
|> order_scrobble_rules(Keyword.get(opts, :order, :inserted_at))
|
||||||
|> filter_scrobble_rules(opts)
|
|> filter_scrobble_rules(opts)
|
||||||
|
|
||||||
query =
|
query =
|
||||||
@@ -494,6 +496,14 @@ defmodule MusicLibrary.ScrobbleRules do
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
defp order_scrobble_rules(query, :alphabetical) do
|
||||||
|
from r in query, order_by: [asc: r.match_value]
|
||||||
|
end
|
||||||
|
|
||||||
|
defp order_scrobble_rules(query, _inserted_at) do
|
||||||
|
from r in query, order_by: [desc: r.inserted_at]
|
||||||
|
end
|
||||||
|
|
||||||
# column and json_path are hardcoded string literals from internal callers,
|
# column and json_path are hardcoded string literals from internal callers,
|
||||||
# never user input. All user-derived values use parameterized ? placeholders.
|
# never user input. All user-derived values use parameterized ? placeholders.
|
||||||
# sobelow_skip ["SQL.Query"]
|
# sobelow_skip ["SQL.Query"]
|
||||||
|
|||||||
@@ -42,6 +42,31 @@ defmodule MusicLibraryWeb.ScrobbleRulesLive.Index do
|
|||||||
</div>
|
</div>
|
||||||
</header>
|
</header>
|
||||||
|
|
||||||
|
<div class="flex items-end justify-between gap-6 mt-6">
|
||||||
|
<.button_group>
|
||||||
|
<.button
|
||||||
|
patch={order_path(@list_params, :alphabetical)}
|
||||||
|
size="sm"
|
||||||
|
class={[
|
||||||
|
@list_params.order == :alphabetical && "bg-zinc-100! dark:bg-zinc-700!"
|
||||||
|
]}
|
||||||
|
>
|
||||||
|
<.icon name="hero-user-solid" class="icon" aria-hidden="true" data-slot="icon" />
|
||||||
|
<span class="sr-only sm:not-sr-only">{gettext("A->Z")}</span>
|
||||||
|
</.button>
|
||||||
|
<.button
|
||||||
|
patch={order_path(@list_params, :inserted_at)}
|
||||||
|
size="sm"
|
||||||
|
class={[
|
||||||
|
@list_params.order == :inserted_at && "bg-zinc-100! dark:bg-zinc-700!"
|
||||||
|
]}
|
||||||
|
>
|
||||||
|
<.icon name="hero-clock" class="icon" aria-hidden="true" data-slot="icon" />
|
||||||
|
<span class="sr-only sm:not-sr-only">{gettext("Updated")}</span>
|
||||||
|
</.button>
|
||||||
|
</.button_group>
|
||||||
|
</div>
|
||||||
|
|
||||||
<div class="mt-6 space-y-4">
|
<div class="mt-6 space-y-4">
|
||||||
<ul phx-update="stream" id="scrobble-rules-list" class="space-y-4">
|
<ul phx-update="stream" id="scrobble-rules-list" class="space-y-4">
|
||||||
<li
|
<li
|
||||||
@@ -172,12 +197,14 @@ defmodule MusicLibraryWeb.ScrobbleRulesLive.Index do
|
|||||||
|
|
||||||
defp apply_action(socket, :index, params) do
|
defp apply_action(socket, :index, params) do
|
||||||
query = params["query"]
|
query = params["query"]
|
||||||
|
order = parse_order(params["order"] || "inserted_at")
|
||||||
|
|
||||||
total_rules = ScrobbleRules.count_scrobble_rules(query: query)
|
total_rules = ScrobbleRules.count_scrobble_rules(query: query)
|
||||||
|
|
||||||
list_params =
|
list_params =
|
||||||
@default_list_params
|
@default_list_params
|
||||||
|> merge_query(query)
|
|> merge_query(query)
|
||||||
|
|> merge_order(order)
|
||||||
|> merge_pagination(params, total_rules)
|
|> merge_pagination(params, total_rules)
|
||||||
|
|
||||||
load_and_assign_rules(socket, list_params)
|
load_and_assign_rules(socket, list_params)
|
||||||
@@ -189,6 +216,7 @@ defmodule MusicLibraryWeb.ScrobbleRulesLive.Index do
|
|||||||
rules =
|
rules =
|
||||||
ScrobbleRules.list_scrobble_rules(
|
ScrobbleRules.list_scrobble_rules(
|
||||||
query: list_params.query,
|
query: list_params.query,
|
||||||
|
order: list_params.order,
|
||||||
offset: offset,
|
offset: offset,
|
||||||
limit: list_params.page_size
|
limit: list_params.page_size
|
||||||
)
|
)
|
||||||
@@ -203,7 +231,7 @@ defmodule MusicLibraryWeb.ScrobbleRulesLive.Index do
|
|||||||
def back_path(list_params) do
|
def back_path(list_params) do
|
||||||
qs =
|
qs =
|
||||||
list_params
|
list_params
|
||||||
|> Map.take([:page, :page_size, :query])
|
|> Map.take([:page, :page_size, :query, :order])
|
||||||
|> Enum.filter(fn {_, v} -> v not in ["", nil] end)
|
|> Enum.filter(fn {_, v} -> v not in ["", nil] end)
|
||||||
|
|
||||||
~p"/scrobble-rules?#{qs}"
|
~p"/scrobble-rules?#{qs}"
|
||||||
@@ -287,11 +315,25 @@ defmodule MusicLibraryWeb.ScrobbleRulesLive.Index do
|
|||||||
qs =
|
qs =
|
||||||
@default_list_params
|
@default_list_params
|
||||||
|> Map.put(:query, query)
|
|> Map.put(:query, query)
|
||||||
|> Map.take([:query, :page, :page_size])
|
|> Map.put(:order, socket.assigns.list_params.order)
|
||||||
|
|> Map.take([:query, :page, :page_size, :order])
|
||||||
|
|
||||||
{:noreply, push_patch(socket, to: ~p"/scrobble-rules?#{qs}")}
|
{:noreply, push_patch(socket, to: ~p"/scrobble-rules?#{qs}")}
|
||||||
end
|
end
|
||||||
|
|
||||||
|
defp parse_order("alphabetical"), do: :alphabetical
|
||||||
|
defp parse_order(_), do: :inserted_at
|
||||||
|
|
||||||
|
defp order_path(list_params, order) do
|
||||||
|
qs =
|
||||||
|
list_params
|
||||||
|
|> Map.take([:query])
|
||||||
|
|> Map.put(:order, order)
|
||||||
|
|> Enum.filter(fn {_, v} -> v not in ["", nil] end)
|
||||||
|
|
||||||
|
~p"/scrobble-rules?#{qs}"
|
||||||
|
end
|
||||||
|
|
||||||
attr :type, :atom, required: true, values: [:album, :artist]
|
attr :type, :atom, required: true, values: [:album, :artist]
|
||||||
|
|
||||||
defp type_badge(assigns) do
|
defp type_badge(assigns) do
|
||||||
|
|||||||
@@ -344,6 +344,7 @@ msgstr ""
|
|||||||
|
|
||||||
#: lib/music_library_web/live/collection_live/index.ex
|
#: lib/music_library_web/live/collection_live/index.ex
|
||||||
#: lib/music_library_web/live/record_set_live/index.ex
|
#: lib/music_library_web/live/record_set_live/index.ex
|
||||||
|
#: lib/music_library_web/live/scrobble_rules_live/index.ex
|
||||||
#: lib/music_library_web/live/wishlist_live/index.ex
|
#: lib/music_library_web/live/wishlist_live/index.ex
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "A->Z"
|
msgid "A->Z"
|
||||||
@@ -1687,6 +1688,7 @@ msgid "%{collected}/%{total} records"
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/music_library_web/live/record_set_live/index.ex
|
#: lib/music_library_web/live/record_set_live/index.ex
|
||||||
|
#: lib/music_library_web/live/scrobble_rules_live/index.ex
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Updated"
|
msgid "Updated"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|||||||
@@ -344,6 +344,7 @@ msgstr ""
|
|||||||
|
|
||||||
#: lib/music_library_web/live/collection_live/index.ex
|
#: lib/music_library_web/live/collection_live/index.ex
|
||||||
#: lib/music_library_web/live/record_set_live/index.ex
|
#: lib/music_library_web/live/record_set_live/index.ex
|
||||||
|
#: lib/music_library_web/live/scrobble_rules_live/index.ex
|
||||||
#: lib/music_library_web/live/wishlist_live/index.ex
|
#: lib/music_library_web/live/wishlist_live/index.ex
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "A->Z"
|
msgid "A->Z"
|
||||||
@@ -1687,6 +1688,7 @@ msgid "%{collected}/%{total} records"
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/music_library_web/live/record_set_live/index.ex
|
#: lib/music_library_web/live/record_set_live/index.ex
|
||||||
|
#: lib/music_library_web/live/scrobble_rules_live/index.ex
|
||||||
#, elixir-autogen, elixir-format, fuzzy
|
#, elixir-autogen, elixir-format, fuzzy
|
||||||
msgid "Updated"
|
msgid "Updated"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|||||||
Reference in New Issue
Block a user