diff --git a/lib/music_library/record_sets/record_set.ex b/lib/music_library/record_sets/record_set.ex index 9f9d41f7..5c0cc3e7 100644 --- a/lib/music_library/record_sets/record_set.ex +++ b/lib/music_library/record_sets/record_set.ex @@ -21,4 +21,13 @@ defmodule MusicLibrary.RecordSets.RecordSet do |> cast(attrs, [:name, :description]) |> validate_required([:name]) end + + def count_by_status(record_set) do + record_set.items + |> Enum.frequencies_by(fn item -> + if item.record.purchased_at, do: :collected, else: :wishlisted + end) + |> Map.new() + |> Map.put(:total, Enum.count(record_set.items)) + end end diff --git a/lib/music_library_web/live/record_set_live/index.html.heex b/lib/music_library_web/live/record_set_live/index.html.heex index c3a55c83..4be75e94 100644 --- a/lib/music_library_web/live/record_set_live/index.html.heex +++ b/lib/music_library_web/live/record_set_live/index.html.heex @@ -43,7 +43,7 @@ {record_set.name} - {ngettext("1 record", "%{count} records", length(record_set.items))} + {gettext("%{collected}/%{total} records", RecordSet.count_by_status(record_set))}
- <.link navigate={~p"/collection/#{item.record}"}> + <.link + :if={item.record.purchased_at} + navigate={~p"/collection/#{item.record}"} + > + + + <.link + :if={!item.record.purchased_at} + navigate={~p"/wishlist/#{item.record}"} + > <:toggle> - - <.icon - name="hero-ellipsis-vertical" - class="h-4 w-4 text-white" - aria-hidden="true" - data-slot="icon" - /> - + {gettext("Actions")} + <.icon + name="hero-ellipsis-vertical" + class="size-5 text-zinc-800 dark:text-zinc-200 cursor-pointer" + aria-hidden="true" + data-slot="icon" + /> <.dropdown_button :if={item.position > 0} diff --git a/lib/music_library_web/live/record_set_live/record_picker.ex b/lib/music_library_web/live/record_set_live/record_picker.ex index 4779dfb8..d98a1dee 100644 --- a/lib/music_library_web/live/record_set_live/record_picker.ex +++ b/lib/music_library_web/live/record_set_live/record_picker.ex @@ -3,6 +3,7 @@ defmodule MusicLibraryWeb.RecordSetLive.RecordPicker do alias MusicLibrary.Collection alias MusicLibrary.Records.Record + alias MusicLibrary.Wishlist import MusicLibraryWeb.RecordComponents, only: [format_label: 1, type_label: 1] @@ -15,7 +16,7 @@ defmodule MusicLibraryWeb.RecordSetLive.RecordPicker do {@title}

- {gettext("Search your collection to add a record to this set.")} + {gettext("Search your records to add a record to this set.")}

-
    -
  • {gettext("No records found")} -
  • -
  • -
    - -
    -
    -

    - {record.title} -

    -

    - {Record.artist_names(record)} -

    -

    - {Record.format_release_date(record.release_date)} · {type_label(record.type)} · {format_label( - record.format - )} -

    -
    -
    - <.icon - name="hero-plus-circle" - class="h-5 w-5 text-zinc-400 hover:text-zinc-600 dark:hover:text-zinc-300" - aria-hidden="true" - data-slot="icon" - /> -
    -
  • -
+

+ +
+

+ {gettext("Collected")} +

+
    + <.record_result :for={record <- @collected_results} record={record} myself={@myself} /> +
+
+ +
+

+ {gettext("Wishlisted")} +

+
    + <.record_result :for={record <- @wishlisted_results} record={record} myself={@myself} /> +
+
+
""" end + defp record_result(assigns) do + ~H""" +
  • +
    + +
    +
    +

    + {@record.title} +

    +

    + {Record.artist_names(@record)} +

    +

    + {Record.format_release_date(@record.release_date)} · {type_label(@record.type)} · {format_label( + @record.format + )} +

    +
    +
    + <.icon + name="hero-plus-circle" + class="h-5 w-5 text-zinc-400 hover:text-zinc-600 dark:hover:text-zinc-300" + aria-hidden="true" + data-slot="icon" + /> +
    +
  • + """ + end + @impl true def update(assigns, socket) do existing_record_ids = @@ -102,27 +125,39 @@ defmodule MusicLibraryWeb.RecordSetLive.RecordPicker do socket |> assign(assigns) |> assign(:query, "") - |> assign(:results, []) + |> assign(:collected_results, []) + |> assign(:wishlisted_results, []) |> assign(:existing_record_ids, existing_record_ids)} end @impl true def handle_event("search", %{"query" => query}, socket) do - results = + {collected, wishlisted} = if String.trim(query) == "" do - [] + {[], []} else - query - |> Collection.search_records(limit: 20) - |> Enum.reject(fn record -> + reject = fn record -> MapSet.member?(socket.assigns.existing_record_ids, record.id) - end) + end + + collected = + query + |> Collection.search_records(limit: 20) + |> Enum.reject(reject) + + wishlisted = + query + |> Wishlist.search_records(limit: 20) + |> Enum.reject(reject) + + {collected, wishlisted} end {:noreply, socket |> assign(:query, query) - |> assign(:results, results)} + |> assign(:collected_results, collected) + |> assign(:wishlisted_results, wishlisted)} end def handle_event("add_record", %{"record-id" => record_id}, socket) do @@ -132,8 +167,10 @@ defmodule MusicLibraryWeb.RecordSetLive.RecordPicker do {:ok, updated_set} -> existing_record_ids = MapSet.put(socket.assigns.existing_record_ids, record_id) - results = - Enum.reject(socket.assigns.results, fn record -> record.id == record_id end) + reject = fn record -> record.id == record_id end + + collected_results = Enum.reject(socket.assigns.collected_results, reject) + wishlisted_results = Enum.reject(socket.assigns.wishlisted_results, reject) notify_parent({:added, updated_set}) put_toast!(:info, gettext("Record added to set")) @@ -142,7 +179,8 @@ defmodule MusicLibraryWeb.RecordSetLive.RecordPicker do socket |> assign(:record_set, updated_set) |> assign(:existing_record_ids, existing_record_ids) - |> assign(:results, results)} + |> assign(:collected_results, collected_results) + |> assign(:wishlisted_results, wishlisted_results)} {:error, _changeset} -> put_toast!(:error, gettext("Could not add record to set")) diff --git a/priv/gettext/default.pot b/priv/gettext/default.pot index 37800756..af0897b8 100644 --- a/priv/gettext/default.pot +++ b/priv/gettext/default.pot @@ -270,6 +270,7 @@ msgid "Choose which format to import" msgstr "" #: lib/music_library_web/components/barcode_scanner.ex +#: lib/music_library_web/live/record_set_live/record_picker.ex #: lib/music_library_web/live/scrobbled_tracks_live/index.html.heex #: lib/music_library_web/live/stats_live/index.html.heex #, elixir-autogen, elixir-format @@ -277,6 +278,7 @@ msgid "Collected" msgstr "" #: lib/music_library_web/components/barcode_scanner.ex +#: lib/music_library_web/live/record_set_live/record_picker.ex #: lib/music_library_web/live/scrobbled_tracks_live/index.html.heex #: lib/music_library_web/live/stats_live/index.html.heex #, elixir-autogen, elixir-format @@ -395,7 +397,6 @@ msgid "On Tour" msgstr "" #: lib/music_library_web/components/record_components.ex -#: lib/music_library_web/live/record_set_live/index.html.heex #, elixir-autogen, elixir-format msgid "1 record" msgid_plural "%{count} records" @@ -1778,11 +1779,6 @@ msgstr "" msgid "Save Set" msgstr "" -#: lib/music_library_web/live/record_set_live/record_picker.ex -#, elixir-autogen, elixir-format -msgid "Search your collection to add a record to this set." -msgstr "" - #: lib/music_library_web/components/layouts/app.html.heex #, elixir-autogen, elixir-format msgid "Sets" @@ -1797,3 +1793,13 @@ msgstr "" #, elixir-autogen, elixir-format msgid "e.g. Favorites, Road Trip, Sunday Morning" msgstr "" + +#: lib/music_library_web/live/record_set_live/record_picker.ex +#, elixir-autogen, elixir-format +msgid "Search your records to add a record to this set." +msgstr "" + +#: lib/music_library_web/live/record_set_live/index.html.heex +#, elixir-autogen, elixir-format +msgid "%{collected}/%{total} records" +msgstr "" diff --git a/priv/gettext/en/LC_MESSAGES/default.po b/priv/gettext/en/LC_MESSAGES/default.po index fc82743e..c8740c19 100644 --- a/priv/gettext/en/LC_MESSAGES/default.po +++ b/priv/gettext/en/LC_MESSAGES/default.po @@ -270,6 +270,7 @@ msgid "Choose which format to import" msgstr "" #: lib/music_library_web/components/barcode_scanner.ex +#: lib/music_library_web/live/record_set_live/record_picker.ex #: lib/music_library_web/live/scrobbled_tracks_live/index.html.heex #: lib/music_library_web/live/stats_live/index.html.heex #, elixir-autogen, elixir-format @@ -277,6 +278,7 @@ msgid "Collected" msgstr "" #: lib/music_library_web/components/barcode_scanner.ex +#: lib/music_library_web/live/record_set_live/record_picker.ex #: lib/music_library_web/live/scrobbled_tracks_live/index.html.heex #: lib/music_library_web/live/stats_live/index.html.heex #, elixir-autogen, elixir-format @@ -395,7 +397,6 @@ msgid "On Tour" msgstr "" #: lib/music_library_web/components/record_components.ex -#: lib/music_library_web/live/record_set_live/index.html.heex #, elixir-autogen, elixir-format msgid "1 record" msgid_plural "%{count} records" @@ -1778,11 +1779,6 @@ msgstr "" msgid "Save Set" msgstr "" -#: lib/music_library_web/live/record_set_live/record_picker.ex -#, elixir-autogen, elixir-format -msgid "Search your collection to add a record to this set." -msgstr "" - #: lib/music_library_web/components/layouts/app.html.heex #, elixir-autogen, elixir-format msgid "Sets" @@ -1797,3 +1793,13 @@ msgstr "" #, elixir-autogen, elixir-format msgid "e.g. Favorites, Road Trip, Sunday Morning" msgstr "" + +#: lib/music_library_web/live/record_set_live/record_picker.ex +#, elixir-autogen, elixir-format, fuzzy +msgid "Search your records to add a record to this set." +msgstr "" + +#: lib/music_library_web/live/record_set_live/index.html.heex +#, elixir-autogen, elixir-format +msgid "%{collected}/%{total} records" +msgstr ""