Packages

Live error monitoring to watch your Phoenix app going up in flames in real time! Open source version of error aggregation services. Hooks into Elixir's Logger to provide accurate error reporting all throughout your application.

Current section

Files

Jump to
flames lib flames_web dashboard helpers.ex
Raw

lib/flames_web/dashboard/helpers.ex

defmodule Flames.Dashboard.Helpers do
use Phoenix.Component
attr :type, :string, default: nil
attr :color, :atom, default: :red
attr :class, :string, default: nil
attr :rest, :global, include: ~w(disabled form name value)
slot(:inner_block, required: true)
def button(assigns) do
~H"""
<button
type={@type || "button"}
class={[
"inline-block px-6 py-2.5 text-white font-medium text-xs leading-tight uppercase rounded shadow-md hover:shadow-lg focus:shadow-lg focus:outline-none focus:ring-0 active:shadow-lg transition duration-150 ease-in-out",
button_classes_for_color(@color),
@class
]}
{@rest}
>
<%= render_slot(@inner_block) %>
</button>
"""
end
def button_classes_for_color(:red) do
"bg-rose-600 active:bg-rose-800 focus:bg-rose-700 hover:bg-rose-700"
end
def button_classes_for_color(:amber) do
"bg-amber-600 active:bg-amber-800 focus:bg-amber-700 hover:bg-amber-700"
end
def button_classes_for_color(_) do
"bg-yellow-500 active:bg-yellow-800 focus:bg-yellow-700 hover:bg-yellow-700"
end
attr :level, :string
def level(assigns) do
~H"""
<span class={[
"text-xs inline-block py-1 px-2.5 leading-none text-center whitespace-nowrap align-baseline font-bold text-white rounded uppercase",
color_for_level(@level)
]}>
<%= @level %>
</span>
"""
end
def color_for_level("error"), do: "bg-rose-600"
def color_for_level("warn"), do: "bg-amber-400"
def color_for_level("warning"), do: "bg-amber-400"
def color_for_level(_other), do: "bg-gradient-to-r from-amber-400 to-rose-600"
def display_timestamp(%DateTime{} = timestamp) do
timestamp
|> DateTime.to_naive()
|> display_timestamp()
end
def display_timestamp(%NaiveDateTime{} = timestamp) do
timezone = Application.get_env(:flames, :timezone, "Etc/UTC")
timestamp
|> DateTime.from_naive!("Etc/UTC")
|> DateTime.shift_zone!(timezone)
|> Calendar.strftime("%a %b %d, %Y %I:%M %p")
end
def display_module(atom) when is_atom(atom) do
atom
|> Atom.to_string()
|> display_module()
end
def display_module(atom) when is_binary(atom) do
if String.starts_with?(atom, ":") || String.starts_with?(atom, "Elixir.") do
String.to_existing_atom(atom) |> inspect()
else
atom
end
end
def last_incident_timestamp(%Flames.Error{
incidents: [%Flames.Error.Incident{timestamp: timestamp} | _]
}) do
display_timestamp(timestamp)
end
def last_incident_timestamp(%Flames.Error{timestamp: timestamp}) do
display_timestamp(timestamp)
end
def last_incident_timestamp(_error) do
"(Unknown)"
end
end