diff --git a/config/runtime.exs b/config/runtime.exs index fd1eee218..88b70b978 100644 --- a/config/runtime.exs +++ b/config/runtime.exs @@ -606,6 +606,7 @@ if config_env() in [:dev, :staging, :prod, :test] do ecto_repo: Plausible.Repo, router: PlausibleWeb.Router, admin_title: "Plausible Admin", + extensions: [Plausible.CrmExtensions], resources: [ auth: [ resources: [ diff --git a/lib/plausible/auth/user_admin.ex b/lib/plausible/auth/user_admin.ex index dd9bf98fb..8301d18a1 100644 --- a/lib/plausible/auth/user_admin.ex +++ b/lib/plausible/auth/user_admin.ex @@ -36,7 +36,6 @@ defmodule Plausible.Auth.UserAdmin do trial_expiry_date: %{name: "Trial expiry", value: &format_date(&1.trial_expiry_date)}, subscription_plan: %{value: &subscription_plan/1}, subscription_status: %{value: &subscription_status/1}, - usage: %{value: &usage_link/1}, grace_period: %{value: &grace_period_status/1}, accept_traffic_until: %{ name: "Accept traffic until", @@ -110,12 +109,7 @@ defmodule Plausible.Auth.UserAdmin do quota = PlausibleWeb.AuthView.subscription_quota(user.subscription) interval = PlausibleWeb.AuthView.subscription_interval(user.subscription) - manage_url = - Plausible.Billing.PaddleApi.vendors_domain() <> - "/subscriptions/customers/manage/" <> - user.subscription.paddle_subscription_id - - {:safe, ~s(#{quota} \(#{interval}\))} + {:safe, ~s(#{quota} \(#{interval}\))} else "--" end @@ -124,7 +118,13 @@ defmodule Plausible.Auth.UserAdmin do defp subscription_status(user) do cond do user.subscription -> - PlausibleWeb.AuthView.present_subscription_status(user.subscription.status) + status_str = PlausibleWeb.AuthView.present_subscription_status(user.subscription.status) + + if user.subscription.paddle_subscription_id do + {:safe, ~s(#{status_str})} + else + status_str + end Plausible.Users.on_trial?(user) -> "On trial" @@ -134,13 +134,9 @@ defmodule Plausible.Auth.UserAdmin do end end - on_ee do - defp usage_link(user) do - path = PlausibleWeb.Router.Helpers.admin_path(PlausibleWeb.Endpoint, :usage, user.id) - {:safe, ~s(Usage)} - end - else - defp usage_link(_), do: nil + defp manage_url(%{paddle_subscription_id: paddle_id} = _subscription) do + Plausible.Billing.PaddleApi.vendors_domain() <> + "/subscriptions/customers/manage/" <> paddle_id end defp format_date(nil), do: "--" diff --git a/lib/plausible/crm_extensions.ex b/lib/plausible/crm_extensions.ex new file mode 100644 index 000000000..3f1988876 --- /dev/null +++ b/lib/plausible/crm_extensions.ex @@ -0,0 +1,32 @@ +defmodule Plausible.CrmExtensions do + @moduledoc """ + Extensions for Kaffy CRM + """ + + use Plausible + + on_ee do + def javascripts(%{assigns: %{context: "auth", resource: "user", entry: %{} = user}}) do + [ + Phoenix.HTML.raw(""" + + """) + ] + end + end + + def javascripts(_) do + [] + end +end diff --git a/lib/plausible_web/controllers/admin_controller.ex b/lib/plausible_web/controllers/admin_controller.ex index a10fd7bf2..865417f8c 100644 --- a/lib/plausible_web/controllers/admin_controller.ex +++ b/lib/plausible_web/controllers/admin_controller.ex @@ -17,39 +17,47 @@ defmodule PlausibleWeb.AdminController do team_members: Quota.Limits.team_member_limit(user) } - html_response = usage_and_limits_html(user, usage, limits) + html_response = usage_and_limits_html(user, usage, limits, params["embed"] == "true") conn |> put_resp_content_type("text/html") |> send_resp(200, html_response) end - defp usage_and_limits_html(user, usage, limits) do - """ - - - - - - - Usage - user:#{user.id} - - - - + defp usage_and_limits_html(user, usage, limits, embed?) do + content = """ - - - """ + + if embed? do + content + else + """ + + + + + + + Usage - user:#{user.id} + + + + + #{content} + + + + """ + end end defp features_usage(features_module_list) do diff --git a/lib/plausible_web/views/auth_view.ex b/lib/plausible_web/views/auth_view.ex index 31f9fd8f6..bf3a72e42 100644 --- a/lib/plausible_web/views/auth_view.ex +++ b/lib/plausible_web/views/auth_view.ex @@ -9,14 +9,20 @@ defmodule PlausibleWeb.AuthView do def subscription_quota(nil, _options), do: "Free trial" def subscription_quota(subscription, options) do - subscription - |> Plausible.Billing.Quota.Limits.monthly_pageview_limit() - |> PlausibleWeb.StatsView.large_number_format() - |> then(fn quota -> - if Keyword.get(options, :format) == :long, - do: "#{quota} pageviews", - else: quota - end) + pageview_limit = Plausible.Billing.Quota.Limits.monthly_pageview_limit(subscription) + + quota = + if pageview_limit == :unlimited do + "unlimited" + else + PlausibleWeb.StatsView.large_number_format(pageview_limit) + end + + if Keyword.get(options, :format) == :long do + "#{quota} pageviews" + else + quota + end end def subscription_interval(subscription) do diff --git a/lib/plausible_web/views/stats_view.ex b/lib/plausible_web/views/stats_view.ex index 6400d2625..f85c805cb 100644 --- a/lib/plausible_web/views/stats_view.ex +++ b/lib/plausible_web/views/stats_view.ex @@ -35,7 +35,7 @@ defmodule PlausibleWeb.StatsView do "#{billions}B" end - true -> + is_integer(n) -> Integer.to_string(n) end end diff --git a/test/plausible_web/controllers/admin_controller_test.exs b/test/plausible_web/controllers/admin_controller_test.exs index 90321bb1e..c76030109 100644 --- a/test/plausible_web/controllers/admin_controller_test.exs +++ b/test/plausible_web/controllers/admin_controller_test.exs @@ -11,6 +11,20 @@ defmodule PlausibleWeb.AdminControllerTest do conn = get(conn, "/crm/auth/user/1/usage") assert response(conn, 403) == "Not allowed" end + + @tag :ee_only + test "returns usage data as a standalone page", %{conn: conn, user: user} do + patch_env(:super_admin_user_ids, [user.id]) + conn = get(conn, "/crm/auth/user/#{user.id}/usage") + assert response(conn, 200) =~ "