File size: 3,752 Bytes
88211d3 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 | 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_user={@current_user}
current_team={@current_team}
locked?={@locked?}
>
<.form
:let={f}
for={@team_name_form}
method="post"
phx-change="update-team"
phx-submit="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
|