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.
This commit is contained in:
hq1 2024-10-28 10:07:18 +01:00 committed by GitHub
parent 0404522b5a
commit 8bd32b68c9
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
8 changed files with 58 additions and 24 deletions

View File

@ -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,

View File

@ -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.

View File

@ -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

View File

@ -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 <a href="mailto:hello@plausible.io" class="underline">hello@plausible.io</a>
to upgrade your subscription
"""
true ->
~H"""
please
<.link
@ -322,12 +329,6 @@ defmodule PlausibleWeb.Components.Billing.Notice do
upgrade your subscription
</.link>
"""
true ->
~H"""
please contact <a href="mailto:hello@plausible.io" class="underline">hello@plausible.io</a>
to upgrade your subscription
"""
end
end

View File

@ -12,12 +12,13 @@
Compose Goals into Funnels
</:subtitle>
<PlausibleWeb.Components.Billing.Notice.premium_feature
billable_user={@site.owner}
current_user={@current_user}
feature_mod={Plausible.Billing.Feature.Funnels}
/>
<div :if={Plausible.Billing.Feature.Funnels.enabled?(@site)}>
<PlausibleWeb.Components.Billing.Notice.premium_feature
billable_user={@site.owner}
current_user={@current_user}
feature_mod={Plausible.Billing.Feature.Funnels}
/>
<%= live_render(@conn, PlausibleWeb.Live.FunnelSettings,
session: %{"site_id" => @site.id, "domain" => @site.domain}
) %>

View File

@ -13,13 +13,14 @@
create custom metrics.
</:subtitle>
<PlausibleWeb.Components.Billing.Notice.premium_feature
billable_user={@site.owner}
current_user={@current_user}
feature_mod={Plausible.Billing.Feature.Props}
grandfathered?
/>
<div :if={Plausible.Billing.Feature.Props.enabled?(@site)}>
<PlausibleWeb.Components.Billing.Notice.premium_feature
billable_user={@site.owner}
current_user={@current_user}
feature_mod={Plausible.Billing.Feature.Props}
grandfathered?
/>
<%= live_render(@conn, PlausibleWeb.Live.PropsSettings,
id: "props-form",
session: %{"site_id" => @site.id, "domain" => @site.domain}

View File

@ -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

View File

@ -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