ML-174: add empty action to record set dropdown menu
Add RecordSets.empty_record_set/1 that bulk-deletes all items in a set via a single DELETE query and returns the reloaded empty set. Add Empty button with confirmation prompt to both index and show view dropdowns.
This commit is contained in:
@@ -88,6 +88,14 @@ defmodule MusicLibrary.RecordSets do
|
||||
end
|
||||
end
|
||||
|
||||
@spec empty_record_set(RecordSet.t()) :: {:ok, RecordSet.t()}
|
||||
def empty_record_set(%RecordSet{} = record_set) do
|
||||
from(i in RecordSetItem, where: i.record_set_id == ^record_set.id)
|
||||
|> Repo.delete_all()
|
||||
|
||||
{:ok, get_record_set!(record_set.id)}
|
||||
end
|
||||
|
||||
@spec delete_record_set(RecordSet.t()) :: {:ok, RecordSet.t()} | {:error, Changeset.t()}
|
||||
def delete_record_set(%RecordSet{} = record_set) do
|
||||
Repo.delete(record_set)
|
||||
|
||||
@@ -221,6 +221,11 @@ defmodule MusicLibraryWeb.RecordSetLive.Index do
|
||||
{:noreply, push_patch(socket, to: ~p"/record-sets?#{qs}")}
|
||||
end
|
||||
|
||||
def handle_event("empty_set", %{"id" => id}, socket) do
|
||||
{:ok, updated_set} = RecordSets.empty_record_set(%RecordSet{id: id})
|
||||
{:noreply, update_record_set_in_list(socket, updated_set)}
|
||||
end
|
||||
|
||||
def handle_event("delete_set", %{"id" => id}, socket) do
|
||||
record_set = RecordSets.get_record_set!(id)
|
||||
{:ok, _} = RecordSets.delete_record_set(record_set)
|
||||
@@ -319,6 +324,13 @@ defmodule MusicLibraryWeb.RecordSetLive.Index do
|
||||
{gettext("Edit")}
|
||||
</.dropdown_link>
|
||||
<.dropdown_separator />
|
||||
<.dropdown_button
|
||||
phx-click="empty_set"
|
||||
phx-value-id={@record_set.id}
|
||||
data-confirm={gettext("Remove all records from this set?")}
|
||||
>
|
||||
{gettext("Empty")}
|
||||
</.dropdown_button>
|
||||
<.dropdown_button
|
||||
phx-click="delete_set"
|
||||
phx-value-id={@record_set.id}
|
||||
|
||||
@@ -48,6 +48,12 @@ defmodule MusicLibraryWeb.RecordSetLive.Show do
|
||||
{gettext("Edit")}
|
||||
</.dropdown_link>
|
||||
<.dropdown_separator />
|
||||
<.dropdown_button
|
||||
phx-click="empty_set"
|
||||
data-confirm={gettext("Remove all records from this set?")}
|
||||
>
|
||||
{gettext("Empty")}
|
||||
</.dropdown_button>
|
||||
<.dropdown_button
|
||||
phx-click="delete_set"
|
||||
data-confirm={gettext("Are you sure?")}
|
||||
@@ -236,6 +242,15 @@ defmodule MusicLibraryWeb.RecordSetLive.Show do
|
||||
end
|
||||
|
||||
@impl true
|
||||
def handle_event("empty_set", _params, socket) do
|
||||
{:ok, updated_set} = RecordSets.empty_record_set(socket.assigns.record_set)
|
||||
|
||||
{:noreply,
|
||||
socket
|
||||
|> assign(:record_set, updated_set)
|
||||
|> put_toast(:info, gettext("Set emptied"))}
|
||||
end
|
||||
|
||||
def handle_event("delete_set", _params, socket) do
|
||||
case RecordSets.delete_record_set(socket.assigns.record_set) do
|
||||
{:ok, _} ->
|
||||
|
||||
Reference in New Issue
Block a user