mitgliederverwaltung/lib/mv_web/live/user_live/index.ex
Moritz ccf2d61d84
Some checks failed
continuous-integration/drone/push Build is failing
WIP feat: account live view - basic functionality
2025-07-17 22:16:22 +02:00

61 lines
1.7 KiB
Elixir

defmodule MvWeb.UserLive.Index do
use MvWeb, :live_view
@impl true
def render(assigns) do
~H"""
<Layouts.app flash={@flash}>
<.header>
{gettext("Listing Users")}
<:actions>
<.button variant="primary" navigate={~p"/users/new"}>
<.icon name="hero-plus" /> {gettext("New User")}
</.button>
</:actions>
</.header>
<.table
id="users"
rows={@streams.users}
row_click={fn {_id, user} -> JS.navigate(~p"/users/#{user}") end}
>
<:col :let={{_id, user}} label={gettext("Email")}>{user.email}</:col>
<:col :let={{_id, user}} label={gettext("OIDC ID")}>{user.oidc_id}</:col>
<:action :let={{_id, user}}>
<div class="sr-only">
<.link navigate={~p"/users/#{user}"}>{gettext("Show")}</.link>
</div>
<.link navigate={~p"/users/#{user}/edit"}>{gettext("Edit")}</.link>
</:action>
<:action :let={{id, user}}>
<.link
phx-click={JS.push("delete", value: %{id: user.id}) |> hide("##{id}")}
data-confirm={gettext("Are you sure?")}
>
{gettext("Delete")}
</.link>
</:action>
</.table>
</Layouts.app>
"""
end
@impl true
def mount(_params, _session, socket) do
{:ok,
socket
|> assign(:page_title, gettext("Listing Users"))
|> stream(:users, Ash.read!(Mv.Accounts.User, domain: Mv.Accounts))}
end
@impl true
def handle_event("delete", %{"id" => id}, socket) do
user = Ash.get!(Mv.Accounts.User, id, domain: Mv.Accounts)
Ash.destroy!(user, domain: Mv.Accounts)
{:noreply, stream_delete(socket, :users, user)}
end
end