mirror of
https://github.com/plausible/analytics.git
synced 2024-12-27 19:47:26 +03:00
9d97dc1912
* 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>
48 lines
1.0 KiB
Elixir
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
|