lib/moon_web/examples/design/form/checkbox_example/multiple_live.ex

defmodule MoonWeb.Examples.Design.Form.CheckboxExample.MultipleLive do
  @moduledoc """
  https://fly.io/phoenix-files/making-a-checkboxgroup-input/
  """

  use Phoenix.LiveComponent

  alias MoonWeb.Schema.User

  def handle_event("changed", %{"user" => params}, socket) do
    {:noreply, assign(socket, user: to_form(User.changeset(%User{}, params)))}
  end

  attr :user, Phoenix.HTML.Form, default: to_form(User.changeset(%User{permissions: [1, 2, 3]}))

  attr :permissions, :list,
    default: [
      %{value: 1, key: "Read"},
      %{value: 2, key: "Write"},
      %{value: 3, key: "Update"},
      %{value: 4, key: "Delete"},
      %{value: 5, key: "Nuclear war", disabled: true}
    ]

  def render(assigns) do
    ~H"""
    <div>
      <.form for={@user} phx-change="changed" phx-target={@myself}>
        <%= for perm <- @permissions do %>
          <label for={"user_permissions_#{perm.value}"}>
            <input
              type="checkbox"
              value={perm.value}
              name="user[permissions][]"
              id={"user_permissions_#{perm.value}"}
              checked={perm.value in (@user[:permissions].value || [])}
            />
            <%= perm.key %>
          </label>
        <% end %>
        <pre>@user = <%= inspect(@user, pretty: true) %></pre>
      </.form>
    </div>
    """
  end

  def code() do
    """

    """
  end
end