<div class="mx-auto flex flex-col justify-center items-center space-y-4 max-w-3xl"> <h1 class="title text-2xl title-primary-500"> <%= gettext("Invites") %> </h1> <%= if @invites |> Enum.empty?() do %> <h1 class="title text-xl text-primary-600"> <%= gettext("No invites") %> <%= display_emoji("😔") %> </h1> <.link patch={~p"/invites/new"} class="btn btn-primary"> <%= dgettext("actions", "Invite someone new!") %> </.link> <% else %> <.link patch={~p"/invites/new"} class="btn btn-primary"> <%= dgettext("actions", "Create Invite") %> </.link> <% end %> <div class="flex flex-col justify-center items-stretch space-y-4"> <.invite_card :for={invite <- @invites} invite={invite} current_user={@current_user} use_count={Map.get(@use_counts, invite.id)} > <:code_actions> <form phx-submit="copy_to_clipboard"> <button type="submit" class="mx-2 my-1 btn btn-primary" phx-click={JS.dispatch("cannery:clipcopy", to: "#code-#{invite.id}")} aria-label={ dgettext("actions", "Copy invite link for %{invite_name}", invite_name: invite.name) } > <%= dgettext("actions", "Copy to clipboard") %> </button> </form> </:code_actions> <.link patch={~p"/invites/edit/#{invite}"} class="text-primary-600 link" aria-label={ dgettext("actions", "Edit invite for %{invite_name}", invite_name: invite.name) } > <i class="fa-fw fa-lg fas fa-edit"></i> </.link> <.link href="#" class="text-primary-600 link" phx-click="delete_invite" phx-value-id={invite.id} data-confirm={ dgettext("prompts", "Are you sure you want to delete the invite for %{invite_name}?", invite_name: invite.name ) } aria-label={ dgettext("actions", "Delete invite for %{invite_name}", invite_name: invite.name) } > <i class="fa-fw fa-lg fas fa-trash"></i> </.link> <.link href="#" class="btn btn-primary" phx-click={if invite.disabled_at, do: "enable_invite", else: "disable_invite"} phx-value-id={invite.id} > <%= if invite.disabled_at, do: gettext("Enable"), else: gettext("Disable") %> </.link> <.link :if={invite.disabled_at |> is_nil() and not (invite.uses_left |> is_nil())} href="#" class="btn btn-primary" phx-click="set_unlimited" phx-value-id={invite.id} data-confirm={ dgettext("prompts", "Are you sure you want to make %{invite_name} unlimited?", invite_name: invite.name ) } > <%= dgettext("actions", "Set Unlimited") %> </.link> </.invite_card> </div> <%= unless @admins |> Enum.empty?() do %> <hr class="hr" /> <h1 class="title text-2xl text-primary-600"> <%= gettext("Admins") %> </h1> <div class="flex flex-col justify-center items-stretch space-y-4"> <.user_card :for={admin <- @admins} user={admin}> <.link href="#" class="text-primary-600 link" phx-click="delete_user" phx-value-id={admin.id} data-confirm={ dgettext( "prompts", "Are you sure you want to delete %{email}? This action is permanent!", email: admin.email ) } > <i class="fa-fw fa-lg fas fa-trash"></i> </.link> </.user_card> </div> <% end %> <%= unless @users |> Enum.empty?() do %> <hr class="hr" /> <h1 class="title text-2xl text-primary-600"> <%= gettext("Users") %> </h1> <div class="flex flex-col justify-center items-stretch space-y-4"> <.user_card :for={user <- @users} user={user}> <.link href="#" class="text-primary-600 link" phx-click="delete_user" phx-value-id={user.id} data-confirm={ dgettext( "prompts", "Are you sure you want to delete %{email}? This action is permanent!", email: user.email ) } > <i class="fa-fw fa-lg fas fa-trash"></i> </.link> </.user_card> </div> <% end %> </div> <.modal :if={@live_action in [:new, :edit]} return_to={~p"/invites"}> <.live_component module={CanneryWeb.InviteLive.FormComponent} id={@invite.id || :new} title={@page_title} action={@live_action} invite={@invite} return_to={~p"/invites"} current_user={@current_user} /> </.modal>