analytics/lib/plausible_web/views/text_helpers.ex
Adrian Gruntkowski 9d97dc1912
Move limit enforcement to accepting site ownership transfer (#3612)
* Move limit enforcement to accepting site ownerhsip transfer

* enforce pageview limit on ownership transfer accept

* Refactor plan limit check logic

* Extract `ensure_can_take_ownership` to `Invitations` context and refactor

* Improve styling of exceeded limits notice in invitation dialog and disable button

* styling improvements to notice

* make transfer_ownership return transfer to self error

* do not allow transferring to user without active subscription WIP

* Add missing typespec and improve existing ones

* Fix formatting

* Explicitly label direct match on function argument for clarity

* Slightly refactor `CreateInvitation.bulk_transfer_ownership_direct`

* Exclude quota enforcement tests from small build test suite

* Remove unused return type from `invite_error()` union type

* Do not block plan upgrade when there's pending ownership transfer

* Don't block and only warn about missing features on transfer

* Remove `x-init` attribute used for debugging

* Add tests for `Quota.monthly_pageview_usage/2`

* Test and improve site admin ownership transfer actions

* Extend tests for `AcceptInvitation.transfer_ownership`

* Test transfer ownership controller level accept action error cases

* Test choosing plan by user without sites but with a pending ownership transfer

* Test invitation x-data in sites LV

* Remove sitelocker trigger in invitation acceptance code and simplify logic

* Add Quota test for `user.allow_next_upgrade_override` being set

* ignore pageview limit only when subscribing to plan

* Use sandbox Paddle instance for staging

* Use sandbox paddle key for staging and dev

---------

Co-authored-by: Robert Joonas <robertjoonas16@gmail.com>
2023-12-20 14:56:49 +00:00

48 lines
1.0 KiB
Elixir

defmodule PlausibleWeb.TextHelpers do
@moduledoc false
@spec pretty_join([String.t()]) :: String.t()
@doc """
Turns a list of strings into a string and replaces the last comma
with the word "and".
### Examples:
iex> ["one"] |> PlausibleWeb.TextHelpers.pretty_join()
"one"
iex> ["one", "two"] |> PlausibleWeb.TextHelpers.pretty_join()
"one and two"
iex> ["one", "two", "three"] |> PlausibleWeb.TextHelpers.pretty_join()
"one, two and three"
"""
def pretty_join([str]), do: str
def pretty_join(list) do
[last_string | rest] = Enum.reverse(list)
rest_string =
rest
|> Enum.reverse()
|> Enum.join(", ")
"#{rest_string} and #{last_string}"
end
def pretty_list(list) do
list
|> Enum.map(&String.replace("#{&1}", "_", " "))
|> pretty_join()
end
def format_date_range(date_range) do
"#{format_date(date_range.first)} - #{format_date(date_range.last)}"
end
def format_date(date) do
Timex.format!(date, "{Mshort} {D}, {YYYY}")
end
end