From 8bd32b68c9e44d54467fe7cd67ed191ea3491bab Mon Sep 17 00:00:00 2001 From: hq1 Date: Mon, 28 Oct 2024 10:07:18 +0100 Subject: [PATCH] Bring back premium feature notices in tiles (#4742) * Lost tapes: bring back premium feature notices in tiles * Ensure that e-mail CTA is only presented to business/enterprise customers * Format * Fix typespecs * Add t() type to EnterprisePlan * Reduce Plan.t() definition Found no reason for it to be there. --- lib/plausible/billing/enterprise_plan.ex | 2 ++ lib/plausible/billing/plan.ex | 2 +- lib/plausible/billing/plans.ex | 2 ++ .../components/billing/notice.ex | 25 ++++++++++--------- .../templates/site/settings_funnels.html.heex | 11 ++++---- .../templates/site/settings_props.html.heex | 13 +++++----- .../live/funnel_settings_test.exs | 14 +++++++++++ .../live/props_settings_test.exs | 13 ++++++++++ 8 files changed, 58 insertions(+), 24 deletions(-) diff --git a/lib/plausible/billing/enterprise_plan.ex b/lib/plausible/billing/enterprise_plan.ex index 2a224cce2dc8..9589c1e0d82d 100644 --- a/lib/plausible/billing/enterprise_plan.ex +++ b/lib/plausible/billing/enterprise_plan.ex @@ -2,6 +2,8 @@ defmodule Plausible.Billing.EnterprisePlan do use Ecto.Schema import Ecto.Changeset + @type t() :: %__MODULE__{} + @required_fields [ :user_id, :paddle_plan_id, diff --git a/lib/plausible/billing/plan.ex b/lib/plausible/billing/plan.ex index 78a6b8551c5a..132a7c585d33 100644 --- a/lib/plausible/billing/plan.ex +++ b/lib/plausible/billing/plan.ex @@ -4,7 +4,7 @@ defmodule Plausible.Billing.Plan do use Ecto.Schema import Ecto.Changeset - @type t() :: %__MODULE__{} | :enterprise + @type t() :: %__MODULE__{} embedded_schema do # Due to grandfathering, we sometimes need to check the "generation" (e.g. diff --git a/lib/plausible/billing/plans.ex b/lib/plausible/billing/plans.ex index 901ed2d968b8..15f56e4964ae 100644 --- a/lib/plausible/billing/plans.ex +++ b/lib/plausible/billing/plans.ex @@ -105,6 +105,8 @@ defmodule Plausible.Billing.Plans do end) end + @spec get_subscription_plan(nil | Subscription.t()) :: + nil | :free_10k | Plan.t() | EnterprisePlan.t() def get_subscription_plan(nil), do: nil def get_subscription_plan(subscription) do diff --git a/lib/plausible_web/components/billing/notice.ex b/lib/plausible_web/components/billing/notice.ex index 409d4b4bcf21..eafd5b28e4a3 100644 --- a/lib/plausible_web/components/billing/notice.ex +++ b/lib/plausible_web/components/billing/notice.ex @@ -302,17 +302,24 @@ defmodule PlausibleWeb.Components.Billing.Notice do defp upgrade_call_to_action(assigns) do billable_user = Plausible.Users.with_subscription(assigns.billable_user) - plan = - Plans.get_regular_plan(billable_user.subscription, only_non_expired: true) - - trial? = Plausible.Users.on_trial?(assigns.billable_user) - growth? = plan && plan.kind == :growth + upgrade_assistance_required? = + case Plans.get_subscription_plan(billable_user.subscription) do + %Plausible.Billing.Plan{kind: :business} -> true + %Plausible.Billing.EnterprisePlan{} -> true + _ -> false + end cond do assigns.billable_user.id !== assigns.current_user.id -> ~H"please reach out to the site owner to upgrade their subscription" - growth? || trial? -> + upgrade_assistance_required? -> + ~H""" + please contact hello@plausible.io + to upgrade your subscription + """ + + true -> ~H""" please <.link @@ -322,12 +329,6 @@ defmodule PlausibleWeb.Components.Billing.Notice do upgrade your subscription """ - - true -> - ~H""" - please contact hello@plausible.io - to upgrade your subscription - """ end end diff --git a/lib/plausible_web/templates/site/settings_funnels.html.heex b/lib/plausible_web/templates/site/settings_funnels.html.heex index d583c341a4fc..e668b3e21c9d 100644 --- a/lib/plausible_web/templates/site/settings_funnels.html.heex +++ b/lib/plausible_web/templates/site/settings_funnels.html.heex @@ -12,12 +12,13 @@ Compose Goals into Funnels + +
- <%= live_render(@conn, PlausibleWeb.Live.FunnelSettings, session: %{"site_id" => @site.id, "domain" => @site.domain} ) %> diff --git a/lib/plausible_web/templates/site/settings_props.html.heex b/lib/plausible_web/templates/site/settings_props.html.heex index 35ffc1a21107..fe39e4cc62df 100644 --- a/lib/plausible_web/templates/site/settings_props.html.heex +++ b/lib/plausible_web/templates/site/settings_props.html.heex @@ -13,13 +13,14 @@ create custom metrics. + +
- <%= live_render(@conn, PlausibleWeb.Live.PropsSettings, id: "props-form", session: %{"site_id" => @site.id, "domain" => @site.domain} diff --git a/test/plausible_web/live/funnel_settings_test.exs b/test/plausible_web/live/funnel_settings_test.exs index f46c714de9a2..245cae47525e 100644 --- a/test/plausible_web/live/funnel_settings_test.exs +++ b/test/plausible_web/live/funnel_settings_test.exs @@ -10,6 +10,18 @@ defmodule PlausibleWeb.Live.FunnelSettingsTest do describe "GET /:domain/settings/funnels" do setup [:create_user, :log_in, :create_site] + @tag :ee_only + test "premium feature notice renders", %{conn: conn, site: site, user: user} do + user + |> Plausible.Auth.User.end_trial() + |> Plausible.Repo.update!() + + conn = get(conn, "/#{site.domain}/settings/funnels") + resp = conn |> html_response(200) |> text() + + assert resp =~ "please upgrade your subscription" + end + test "lists funnels for the site and renders help link", %{conn: conn, site: site} do {:ok, _} = setup_funnels(site) conn = get(conn, "/#{site.domain}/settings/funnels") @@ -18,6 +30,8 @@ defmodule PlausibleWeb.Live.FunnelSettingsTest do assert resp =~ "Compose Goals into Funnels" assert resp =~ "From blog to signup" assert resp =~ "From signup to blog" + refute resp =~ "Your account does not have access" + refute resp =~ "please upgrade your subscription" assert element_exists?(resp, "a[href=\"https://plausible.io/docs/funnel-analysis\"]") end diff --git a/test/plausible_web/live/props_settings_test.exs b/test/plausible_web/live/props_settings_test.exs index 79b578d875c3..8154e38a7b6b 100644 --- a/test/plausible_web/live/props_settings_test.exs +++ b/test/plausible_web/live/props_settings_test.exs @@ -6,6 +6,18 @@ defmodule PlausibleWeb.Live.PropsSettingsTest do describe "GET /:domain/settings/properties" do setup [:create_user, :log_in, :create_site] + @tag :ee_only + test "premium feature notice renders", %{conn: conn, site: site, user: user} do + user + |> Plausible.Auth.User.end_trial() + |> Plausible.Repo.update!() + + conn = get(conn, "/#{site.domain}/settings/properties") + resp = conn |> html_response(200) |> text() + + assert resp =~ "please upgrade your subscription" + end + test "lists props for the site and renders links", %{conn: conn, site: site} do {:ok, site} = Plausible.Props.allow(site, ["amount", "logged_in", "is_customer"]) conn = get(conn, "/#{site.domain}/settings/properties") @@ -21,6 +33,7 @@ defmodule PlausibleWeb.Live.PropsSettingsTest do assert resp =~ "amount" assert resp =~ "logged_in" assert resp =~ "is_customer" + refute resp =~ "please upgrade your subscription" end test "lists props with disallow actions", %{conn: conn, site: site} do