Working on received marker
This commit is contained in:
@@ -101,4 +101,19 @@ defmodule Wish.Wishlist do
|
|||||||
def change_item(%Item{} = item, attrs \\ %{}) do
|
def change_item(%Item{} = item, attrs \\ %{}) do
|
||||||
Item.changeset(item, attrs)
|
Item.changeset(item, attrs)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@doc """
|
||||||
|
Toggles the "received" state of an item.
|
||||||
|
|
||||||
|
## Examples
|
||||||
|
|
||||||
|
iex> toggle_received(item)
|
||||||
|
{:ok, %Item{}}
|
||||||
|
|
||||||
|
"""
|
||||||
|
|
||||||
|
def toggle_received(%Item{} = item) do
|
||||||
|
Item.toggle_received_changeset(item)
|
||||||
|
|> Repo.update()
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -19,4 +19,9 @@ defmodule Wish.Wishlist.Item do
|
|||||||
|> cast(attrs, [:title, :description, :url, :received, :desire, :image_url])
|
|> cast(attrs, [:title, :description, :url, :received, :desire, :image_url])
|
||||||
|> validate_required([:url])
|
|> validate_required([:url])
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def toggle_received_changeset(item) do
|
||||||
|
new_state = !item.received
|
||||||
|
change(item, received: new_state)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -3,13 +3,28 @@ defmodule WishWeb.HomeLive.Details do
|
|||||||
|
|
||||||
alias Wish.Wishlist
|
alias Wish.Wishlist
|
||||||
|
|
||||||
|
@impl true
|
||||||
def mount(_params, _session, socket) do
|
def mount(_params, _session, socket) do
|
||||||
{:ok, socket}
|
{:ok, socket}
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@impl true
|
||||||
def handle_params(%{"id" => id}, _, socket) do
|
def handle_params(%{"id" => id}, _, socket) do
|
||||||
{:noreply,
|
{:noreply,
|
||||||
socket
|
socket
|
||||||
|> assign(:item, Wishlist.get_item!(id))}
|
|> assign(:item, Wishlist.get_item!(id))}
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@impl true
|
||||||
|
def handle_event("toggle_received", %{"id" => id}, socket) do
|
||||||
|
item = Wishlist.get_item!(id)
|
||||||
|
|
||||||
|
case Wishlist.toggle_received(item) do
|
||||||
|
{:ok, updated_item} ->
|
||||||
|
{:noreply, assign(socket, :item, updated_item)}
|
||||||
|
|
||||||
|
{:error, _} ->
|
||||||
|
{:noreply, socket}
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -8,3 +8,7 @@
|
|||||||
<div :if={@item.image_url}>
|
<div :if={@item.image_url}>
|
||||||
<img src={@item.image_url} />
|
<img src={@item.image_url} />
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<.button phx-click={JS.push("toggle_received", value: %{"id" => @item.id})}>
|
||||||
|
Toggle Received
|
||||||
|
</.button>
|
||||||
|
|||||||
@@ -18,4 +18,17 @@ defmodule WishWeb.HomeLive.Index do
|
|||||||
|
|
||||||
{:noreply, assign(socket, :display, new_state)}
|
{:noreply, assign(socket, :display, new_state)}
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@impl true
|
||||||
|
def handle_event("toggle_received", %{"id" => id}, socket) do
|
||||||
|
item = Wishlist.get_item!(id)
|
||||||
|
|
||||||
|
case Wishlist.toggle_received(item) do
|
||||||
|
{:ok, updated_item} ->
|
||||||
|
{:noreply, assign(socket, :item, updated_item)}
|
||||||
|
|
||||||
|
{:error, _} ->
|
||||||
|
{:noreply, socket}
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -16,9 +16,9 @@
|
|||||||
}
|
}
|
||||||
id="items-grid"
|
id="items-grid"
|
||||||
>
|
>
|
||||||
<.link
|
<div
|
||||||
:for={item <- @items}
|
:for={item <- @items}
|
||||||
navigate={~p"/details/#{item}"}
|
phx-click={JS.navigate(~p"/details/#{item}")}
|
||||||
class={[
|
class={[
|
||||||
"p-2 rounded hover:bg-zinc-100 active:bg-zinc-200",
|
"p-2 rounded hover:bg-zinc-100 active:bg-zinc-200",
|
||||||
case @display do
|
case @display do
|
||||||
@@ -37,6 +37,24 @@
|
|||||||
class="rounded"
|
class="rounded"
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
|
<%= if item.received do %>
|
||||||
|
<div class="bg-red-400 text-white">
|
||||||
|
<.icon name="hero-check-circle" />Received
|
||||||
|
</div>
|
||||||
|
<% end %>
|
||||||
|
<div class="flex flex-row justify-between">
|
||||||
<%= item.title %>
|
<%= item.title %>
|
||||||
</.link>
|
<div phx-click={JS.toggle(to: "#dropdown-#{item.id}")} class="relative">
|
||||||
|
<.icon name="hero-ellipsis-vertical" class="w-7 h-7" />
|
||||||
|
<div
|
||||||
|
id={"dropdown-#{item.id}"}
|
||||||
|
class="absolute z-10 bg-white origin-top right-0 whitespace-nowrap"
|
||||||
|
phx-click={JS.push("toggle_received", value: %{"id" => item.id})}
|
||||||
|
hidden
|
||||||
|
>
|
||||||
|
Mark visible
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
Reference in New Issue
Block a user