philomena/lib/philomena_web/views/app_view.ex

161 lines
4.3 KiB
Elixir
Raw Normal View History

2019-08-18 20:14:36 +02:00
defmodule PhilomenaWeb.AppView do
2019-12-08 02:49:28 +01:00
alias PhilomenaWeb.Router.Helpers, as: Routes
2019-10-01 03:21:48 +02:00
use Phoenix.HTML
2019-08-18 20:14:36 +02:00
@time_strings %{
seconds: "less than a minute",
minute: "about a minute",
minutes: "%d minutes",
hour: "about an hour",
hours: "about %d hours",
day: "a day",
days: "%d days",
month: "about a month",
months: "%d months",
year: "about a year",
years: "%d years"
}
2019-11-27 06:51:20 +01:00
@months %{
1 => "January",
2 => "February",
3 => "March",
4 => "April",
5 => "May",
6 => "June",
7 => "July",
8 => "August",
9 => "September",
10 => "October",
11 => "November",
12 => "December"
}
2019-08-18 20:14:36 +02:00
def pretty_time(time) do
2019-12-08 21:32:54 +01:00
now = NaiveDateTime.utc_now()
seconds = NaiveDateTime.diff(now, time, :second)
2019-08-18 20:14:36 +02:00
relation = if seconds < 0, do: "from now", else: "ago"
2019-11-27 06:51:20 +01:00
time = time |> DateTime.from_naive!("Etc/UTC")
2019-08-18 20:14:36 +02:00
2019-12-08 21:32:54 +01:00
words = distance_of_time_in_words(now, time)
2019-08-18 20:14:36 +02:00
2019-11-27 06:51:20 +01:00
content_tag(:time, "#{words} #{relation}", datetime: DateTime.to_iso8601(time), title: datetime_string(time))
2019-08-18 20:14:36 +02:00
end
2019-10-01 03:21:48 +02:00
2019-12-08 21:32:54 +01:00
def distance_of_time_in_words(time_2, time_1) do
seconds = abs(NaiveDateTime.diff(time_2, time_1, :second))
minutes = div(seconds, 60)
hours = div(minutes, 60)
days = div(hours, 24)
months = div(days, 30)
years = div(days, 365)
cond do
seconds < 45 -> String.replace(@time_strings[:seconds], "%d", to_string(seconds))
seconds < 90 -> String.replace(@time_strings[:minute], "%d", to_string(1))
minutes < 45 -> String.replace(@time_strings[:minutes], "%d", to_string(minutes))
minutes < 90 -> String.replace(@time_strings[:hour], "%d", to_string(1))
hours < 24 -> String.replace(@time_strings[:hours], "%d", to_string(hours))
hours < 42 -> String.replace(@time_strings[:day], "%d", to_string(1))
days < 30 -> String.replace(@time_strings[:days], "%d", to_string(days))
days < 45 -> String.replace(@time_strings[:month], "%d", to_string(1))
days < 365 -> String.replace(@time_strings[:months], "%d", to_string(months))
days < 548 -> String.replace(@time_strings[:year], "%d", to_string(1))
true -> String.replace(@time_strings[:years], "%d", to_string(years))
end
end
2019-10-01 03:21:48 +02:00
def can?(conn, action, model) do
Canada.Can.can?(conn.assigns.current_user, action, model)
end
2019-10-09 17:51:14 +02:00
2019-12-08 16:14:19 +01:00
def map_join(enumerable, joiner, map_fn) do
enumerable
|> Enum.map(map_fn)
|> Enum.intersperse(joiner)
end
2019-12-05 14:55:49 +01:00
def number_with_delimiter(nil), do: "0"
2019-10-09 17:51:14 +02:00
def number_with_delimiter(number) do
number
|> to_charlist()
|> Enum.reverse()
|> Enum.chunk_every(3)
|> Enum.map(&Enum.reverse(&1))
|> Enum.reverse()
|> Enum.join(",")
end
def pluralize(singular, plural, count) do
if count == 1 do
singular
else
plural
end
end
2019-11-15 16:15:21 +01:00
def button_to(text, route, args \\ []) do
2019-10-09 17:51:14 +02:00
method = Keyword.get(args, :method, "get")
class = Keyword.get(args, :class, nil)
data = Keyword.get(args, :data, [])
form_for(nil, route, [method: method, class: "button_to"], fn _f ->
submit text, class: class, data: data
end)
end
2019-11-27 06:51:20 +01:00
2019-12-09 05:41:35 +01:00
def escape_nl2br(nil), do: nil
2019-12-06 04:05:21 +01:00
def escape_nl2br(text) do
text
|> String.split("\n")
|> Enum.map(&html_escape/1)
|> Enum.map(&safe_to_string/1)
|> Enum.join("<br/>")
|> raw()
end
2019-11-27 06:51:20 +01:00
defp datetime_string(time) do
:io_lib.format("~2..0B:~2..0B:~2..0B, ~s ~B, ~B", [
time.hour,
time.minute,
time.second,
@months[time.month],
time.day,
time.year
])
|> to_string()
end
2019-12-05 21:06:18 +01:00
2019-12-05 21:25:37 +01:00
defp text_or_na(nil), do: "N/A"
2019-12-10 17:29:54 +01:00
defp text_or_na(text), do: to_string(text)
2019-12-05 21:25:37 +01:00
2019-12-08 02:49:28 +01:00
def link_to_ip(conn, ip) do
2019-12-10 17:29:54 +01:00
link(to: Routes.ip_profile_path(conn, :show, to_string(ip))) do
[
content_tag(:i, "", class: "fas fa-network-wired"),
" ",
text_or_na(ip)
]
end
2019-12-05 21:06:18 +01:00
end
2019-12-08 02:49:28 +01:00
def link_to_fingerprint(conn, fp) do
2019-12-10 17:29:54 +01:00
link(to: Routes.fingerprint_profile_path(conn, :show, fp)) do
[
content_tag(:i, "", class: "fas fa-desktop"),
" ",
String.slice(text_or_na(fp), 0..6)
]
end
2019-12-05 21:06:18 +01:00
end
def blank?(nil), do: true
def blank?(""), do: true
def blank?([]), do: true
def blank?(map) when is_map(map), do: map == %{}
def blank?(str) when is_binary(str), do: String.trim(str) == ""
def blank?(_object), do: false
def present?(object), do: not blank?(object)
2019-08-19 03:43:06 +02:00
end