mirror of
https://github.com/plausible/analytics.git
synced 2024-12-27 19:47:26 +03:00
24a8aa2821
* Reapply "Sentry context in live views (#3672)" This reverts commit 5449fead160064b8a0081c458cc5dcd34399eb0b. * Make sure `:selection_made` is handled in `GoalSettings.Form` That was a bit unepexcted.. normally `handle_info` is injected by the LiveView use macro and it discards any message gracefully. After switching to `use PlausibleWeb, :live_view` we're also using `PlausibleWeb.Live.Flash` that happens to inject its own receive clause for closing the flash. Which then renders the original, overridable, `handle_info` catch-all obsolete. * Update LV SentryContext only on connected sockets (first mount already has the right context coming from Sentry plug) * Make sure Live.ChoosePlan passes `current_user_id` session key
172 lines
4.4 KiB
Elixir
172 lines
4.4 KiB
Elixir
defmodule PlausibleWeb.Live.PropsSettings do
|
|
@moduledoc """
|
|
LiveView allowing listing, allowing and disallowing custom event properties.
|
|
"""
|
|
|
|
use PlausibleWeb, :live_view
|
|
use Phoenix.HTML
|
|
|
|
alias PlausibleWeb.Live.Components.ComboBox
|
|
|
|
def mount(
|
|
_params,
|
|
%{"site_id" => site_id, "domain" => domain, "current_user_id" => user_id},
|
|
socket
|
|
) do
|
|
socket =
|
|
socket
|
|
|> assign_new(:site, fn ->
|
|
Plausible.Sites.get_for_user!(user_id, domain, [:owner, :admin, :super_admin])
|
|
end)
|
|
|> assign_new(:all_props, fn %{site: site} ->
|
|
site.allowed_event_props || []
|
|
end)
|
|
|> assign_new(:displayed_props, fn %{all_props: props} ->
|
|
props
|
|
end)
|
|
|
|
{:ok,
|
|
assign(socket,
|
|
site_id: site_id,
|
|
domain: domain,
|
|
current_user_id: user_id,
|
|
add_prop?: false,
|
|
filter_text: ""
|
|
)}
|
|
end
|
|
|
|
def render(assigns) do
|
|
~H"""
|
|
<section id="props-settings-main">
|
|
<.flash_messages flash={@flash} />
|
|
<%= if @add_prop? do %>
|
|
<%= live_render(
|
|
@socket,
|
|
PlausibleWeb.Live.PropsSettings.Form,
|
|
id: "props-form",
|
|
session: %{
|
|
"current_user_id" => @current_user_id,
|
|
"domain" => @domain,
|
|
"site_id" => @site_id,
|
|
"rendered_by" => self()
|
|
}
|
|
) %>
|
|
<% end %>
|
|
|
|
<.live_component
|
|
module={PlausibleWeb.Live.PropsSettings.List}
|
|
id="props-list"
|
|
props={@displayed_props}
|
|
domain={@domain}
|
|
filter_text={@filter_text}
|
|
/>
|
|
</section>
|
|
"""
|
|
end
|
|
|
|
def handle_event("allow", %{"prop" => prop}, socket) do
|
|
case Plausible.Props.allow(socket.assigns.site, prop) do
|
|
{:ok, site} ->
|
|
send_update(ComboBox, id: :prop_input, display_value: "", submit_value: "")
|
|
|
|
{:noreply,
|
|
assign(socket,
|
|
site: site,
|
|
form: new_form(site)
|
|
)}
|
|
|
|
{:error, changeset} ->
|
|
{:noreply,
|
|
assign(socket,
|
|
form: to_form(Map.put(changeset, :action, :validate))
|
|
)}
|
|
end
|
|
end
|
|
|
|
def handle_event("add-prop", _value, socket) do
|
|
{:noreply, assign(socket, add_prop?: true)}
|
|
end
|
|
|
|
def handle_event("filter", %{"filter-text" => filter_text}, socket) do
|
|
new_list =
|
|
ComboBox.StaticSearch.suggest(
|
|
filter_text,
|
|
socket.assigns.all_props
|
|
)
|
|
|
|
{:noreply, assign(socket, displayed_props: new_list, filter_text: filter_text)}
|
|
end
|
|
|
|
def handle_event("reset-filter-text", _params, socket) do
|
|
{:noreply, assign(socket, filter_text: "", displayed_props: socket.assigns.all_props)}
|
|
end
|
|
|
|
def handle_event("disallow-prop", %{"prop" => prop}, socket) do
|
|
{:ok, site} = Plausible.Props.disallow(socket.assigns.site, prop)
|
|
|
|
socket =
|
|
socket
|
|
|> put_live_flash(:success, "Property removed successfully")
|
|
|> assign(
|
|
all_props: Enum.reject(socket.assigns.all_props, &(&1 == prop)),
|
|
displayed_props: Enum.reject(socket.assigns.displayed_props, &(&1 == prop)),
|
|
site: site
|
|
)
|
|
|
|
{:noreply, socket}
|
|
end
|
|
|
|
def handle_event("allow-existing-props", _params, socket) do
|
|
{:ok, site} = Plausible.Props.allow_existing_props(socket.assigns.site)
|
|
|
|
{:noreply,
|
|
assign(socket,
|
|
site: site
|
|
)}
|
|
end
|
|
|
|
def handle_info(:cancel_add_prop, socket) do
|
|
{:noreply, assign(socket, add_prop?: false)}
|
|
end
|
|
|
|
def handle_info({:props_allowed, props}, socket) when is_list(props) do
|
|
socket =
|
|
socket
|
|
|> assign(
|
|
add_prop?: false,
|
|
filter_text: "",
|
|
all_props: props,
|
|
displayed_props: props,
|
|
site: %{socket.assigns.site | allowed_event_props: props}
|
|
)
|
|
|> put_live_flash(:success, "Properties added successfully")
|
|
|
|
{:noreply, socket}
|
|
end
|
|
|
|
def handle_info(
|
|
{:prop_allowed, prop},
|
|
%{assigns: %{site: site}} = socket
|
|
)
|
|
when is_binary(prop) do
|
|
allowed_event_props = [prop | site.allowed_event_props || []]
|
|
|
|
socket =
|
|
socket
|
|
|> assign(
|
|
add_prop?: false,
|
|
filter_text: "",
|
|
all_props: allowed_event_props,
|
|
displayed_props: allowed_event_props,
|
|
site: %{site | allowed_event_props: allowed_event_props}
|
|
)
|
|
|> put_live_flash(:success, "Property added successfully")
|
|
|
|
{:noreply, socket}
|
|
end
|
|
|
|
defp new_form(site) do
|
|
to_form(Plausible.Props.allow_changeset(site, []))
|
|
end
|
|
end
|