defmodule MoonWeb.Examples.Light.TableExample.Checkboxes do
@moduledoc false
use Moon.Light.LiveComponent
use MoonWeb, :example
alias Moon.Components.Renderers.Datetime
alias Moon.Components.Lego
attr(:selected, :list, default: [])
attr(:models, :list,
default:
Enum.map(1..5, fn x ->
%{id: x, name: "Name #{x}", created_at: DateTime.utc_now()}
end)
)
attr(:checked, :list, default: [])
def render(assigns) do
~H"""
<.table items={@models} selected={@checked}>
<:cols :let={model} name="id" label="ID">
<.moon module={Lego.Checkbox} is_selected={"#{model.id}" in @checked} />
<.moon module={Lego.Title} title={model.id} />
<:cols :let={model} name="name" label="Name">
<%= model.name %>
<:cols :let={model} name="created_at" label="Created at">
<.moon module={Datetime} value={model.created_at} />
"""
end
def mount(socket) do
{:ok, assign(socket, checked: [])}
end
def handle_event("checkbox_click", %{"id" => id}, socket) do
checked =
if id in socket.assigns[:checked] do
Enum.filter(socket.assigns[:checked], &(&1 != id))
else
[id | socket.assigns[:checked]]
end
{:noreply, assign(socket, checked: checked)}
end
end