analytics/lib/plausible_web/live/team_setup.ex

133 lines
3.6 KiB
Elixir

defmodule PlausibleWeb.Live.TeamSetup do
@moduledoc """
LiveView for Team setup
"""
use PlausibleWeb, :live_view
alias Plausible.Repo
alias Plausible.Teams
alias Plausible.Teams.Management.Layout
alias PlausibleWeb.Router.Helpers, as: Routes
def mount(_params, _session, socket) do
current_user = socket.assigns.current_user
current_team = socket.assigns.current_team
socket =
case current_team do
%Teams.Team{setup_complete: true} ->
socket
|> put_flash(:success, "Your team is now created")
|> redirect(to: Routes.settings_path(socket, :team_general))
%Teams.Team{} ->
team_name_form =
current_team
|> Teams.Team.name_changeset(%{name: "#{current_user.name}'s Team"})
|> Repo.update!()
|> Teams.Team.name_changeset(%{})
|> to_form()
layout = Layout.init(current_team)
assign(socket,
team_name_form: team_name_form,
team_layout: layout,
current_team: current_team
)
_ ->
socket
|> put_flash(:error, "You cannot create any team just yet")
|> redirect(to: Routes.site_path(socket, :index))
end
socket =
if current_team do
{:ok, my_role} = Teams.Memberships.team_role(current_team, current_user)
assign(socket, my_role: my_role)
else
socket
end
{:ok, socket}
end
def render(assigns) do
assigns = assign(assigns, :locked?, Plausible.Teams.Billing.solo?(assigns.current_team))
~H"""
<.focus_box padding?={false}>
<:title>
<div class="pt-8 px-8 flex justify-between">
<div>Create a new team</div>
<div class="ml-auto">
<.docs_info slug="users-roles" />
</div>
</div>
</:title>
<:subtitle>
<p class="px-8">
Name your team, add team members and assign roles. When ready, click "Create Team" to send invitations
</p>
</:subtitle>
<div class="relative -mt-8 pt-4 pb-8 px-8">
<PlausibleWeb.Components.Billing.feature_gate
current_role={@current_team_role}
current_team={@current_team}
locked?={@locked?}
>
<.form
:let={f}
for={@team_name_form}
method="post"
phx-change="update-team"
phx-blur="update-team"
id="update-team-form"
class="mt-4 mb-8"
>
<.input
type="text"
placeholder={"#{@current_user.name}'s Team"}
autofocus={not @locked?}
field={f[:name]}
label="Name"
width="w-full"
phx-debounce="500"
/>
</.form>
<.label class="mb-2">
Team Members
</.label>
{live_render(@socket, PlausibleWeb.Live.TeamManagement,
id: "team-management-setup",
container: {:div, id: "team-setup"},
session: %{
"mode" => "team-setup"
}
)}
</PlausibleWeb.Components.Billing.feature_gate>
</div>
</.focus_box>
"""
end
def handle_event("update-team", %{"team" => %{"name" => name}}, socket) do
changeset = Teams.Team.name_changeset(socket.assigns.current_team, %{name: name})
socket =
case Repo.update(changeset) do
{:ok, team} ->
assign(socket, team_name_form: to_form(changeset), current_team: team)
{:error, changeset} ->
assign(socket, team_name_form: to_form(changeset))
end
{:noreply, socket}
end
end