defmodule GitGudWeb.OrgLive.Index do
use GitGudWeb, :live_view
alias GitGud.Organizations
alias GitGud.Organizations.Organization
@impl true
def mount(_params, _session, socket) do
user = socket.assigns.current_scope.user
{:ok,
socket
|> stream(:orgs, Organizations.list_organizations_for(user))
|> assign_form(Organization.changeset(%Organization{}, %{}))
|> assign(:page_title, "Organizations")}
end
defp assign_form(socket, cs), do: assign(socket, :form, to_form(cs))
@impl true
def handle_event("validate", %{"organization" => attrs}, socket) do
cs = %Organization{} |> Organization.changeset(attrs) |> Map.put(:action, :validate)
{:noreply, assign_form(socket, cs)}
end
def handle_event("save", %{"organization" => attrs}, socket) do
case Organizations.create_organization(socket.assigns.current_scope.user, attrs) do
{:ok, org} ->
{:noreply,
socket
|> stream_insert(:orgs, org, at: 0)
|> assign_form(Organization.changeset(%Organization{}, %{}))
|> put_flash(:info, "Organization created.")}
{:error, cs} ->
{:noreply, assign_form(socket, cs)}
end
end
@impl true
def render(assigns) do
~H"""
<Layouts.app flash={@flash} current_scope={@current_scope}>
<div class="space-y-6 max-w-xl">
<h1 class="text-xl font-semibold">Organizations</h1>
<.form for={@form} id="new-org-form" phx-change="validate" phx-submit="save" class="space-y-3">
<.input field={@form[:handle]} label="Handle" required placeholder="acme" />
<.input field={@form[:name]} label="Display name" />
<.input field={@form[:description]} label="Description" />
<.input
field={@form[:visibility]}
type="select"
label="Visibility"
options={[
{"Public — anyone, no login required", "public"},
{"Internal — any signed-in user", "internal"},
{"Private — members only", "private"}
]}
/>
<p class="text-xs opacity-70">
Repos in this org can't be more open than the org itself.
</p>
<button type="submit" class="btn btn-sm btn-primary">Create organization</button>
</.form>
<ul id="orgs" phx-update="stream" class="divide-y divide-base-300">
<li class="hidden only:block py-6 opacity-60 text-sm">Not in any organizations yet.</li>
<li :for={{id, org} <- @streams.orgs} id={id} class="py-3">
<.link
navigate={~p"/orgs/#{org.handle}"}
class="font-mono link link-hover"
>
{org.handle}
</.link>
<p :if={org.name} class="text-sm">{org.name}</p>
</li>
</ul>
</div>
</Layouts.app>
"""
end
end
2.8 KiB · text
5af55d9