diff --git a/lib/music_library/scrobble_rules.ex b/lib/music_library/scrobble_rules.ex
index 31a16488..328e5ada 100644
--- a/lib/music_library/scrobble_rules.ex
+++ b/lib/music_library/scrobble_rules.ex
@@ -15,6 +15,7 @@ defmodule MusicLibrary.ScrobbleRules do
type: atom(),
enabled: boolean(),
query: String.t(),
+ order: :inserted_at | :alphabetical,
offset: non_neg_integer(),
limit: non_neg_integer()
]
@@ -22,7 +23,8 @@ defmodule MusicLibrary.ScrobbleRules do
@spec list_scrobble_rules(list_opts()) :: [ScrobbleRule.t()]
def list_scrobble_rules(opts \\ []) do
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)
query =
@@ -494,6 +496,14 @@ defmodule MusicLibrary.ScrobbleRules do
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,
# never user input. All user-derived values use parameterized ? placeholders.
# sobelow_skip ["SQL.Query"]
diff --git a/lib/music_library_web/live/scrobble_rules_live/index.ex b/lib/music_library_web/live/scrobble_rules_live/index.ex
index ca35cf09..0b779cd6 100644
--- a/lib/music_library_web/live/scrobble_rules_live/index.ex
+++ b/lib/music_library_web/live/scrobble_rules_live/index.ex
@@ -42,6 +42,31 @@ defmodule MusicLibraryWeb.ScrobbleRulesLive.Index do
+
+ <.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" />
+ {gettext("A->Z")}
+
+ <.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" />
+ {gettext("Updated")}
+
+
+
+
- merge_query(query)
+ |> merge_order(order)
|> merge_pagination(params, total_rules)
load_and_assign_rules(socket, list_params)
@@ -189,6 +216,7 @@ defmodule MusicLibraryWeb.ScrobbleRulesLive.Index do
rules =
ScrobbleRules.list_scrobble_rules(
query: list_params.query,
+ order: list_params.order,
offset: offset,
limit: list_params.page_size
)
@@ -203,7 +231,7 @@ defmodule MusicLibraryWeb.ScrobbleRulesLive.Index do
def back_path(list_params) do
qs =
list_params
- |> Map.take([:page, :page_size, :query])
+ |> Map.take([:page, :page_size, :query, :order])
|> Enum.filter(fn {_, v} -> v not in ["", nil] end)
~p"/scrobble-rules?#{qs}"
@@ -287,11 +315,25 @@ defmodule MusicLibraryWeb.ScrobbleRulesLive.Index do
qs =
@default_list_params
|> 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}")}
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]
defp type_badge(assigns) do
diff --git a/priv/gettext/default.pot b/priv/gettext/default.pot
index e52a1ef4..0285a483 100644
--- a/priv/gettext/default.pot
+++ b/priv/gettext/default.pot
@@ -344,6 +344,7 @@ msgstr ""
#: lib/music_library_web/live/collection_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
#, elixir-autogen, elixir-format
msgid "A->Z"
@@ -1687,6 +1688,7 @@ msgid "%{collected}/%{total} records"
msgstr ""
#: lib/music_library_web/live/record_set_live/index.ex
+#: lib/music_library_web/live/scrobble_rules_live/index.ex
#, elixir-autogen, elixir-format
msgid "Updated"
msgstr ""
diff --git a/priv/gettext/en/LC_MESSAGES/default.po b/priv/gettext/en/LC_MESSAGES/default.po
index 069f1063..4520c3ed 100644
--- a/priv/gettext/en/LC_MESSAGES/default.po
+++ b/priv/gettext/en/LC_MESSAGES/default.po
@@ -344,6 +344,7 @@ msgstr ""
#: lib/music_library_web/live/collection_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
#, elixir-autogen, elixir-format
msgid "A->Z"
@@ -1687,6 +1688,7 @@ msgid "%{collected}/%{total} records"
msgstr ""
#: 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
msgid "Updated"
msgstr ""