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