Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion config/config.exs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
use Mix.Config
import Config

config :phoenix, :json_library, Jason

Expand Down
4 changes: 2 additions & 2 deletions dev.exs
Original file line number Diff line number Diff line change
Expand Up @@ -131,7 +131,7 @@ defmodule DemoWeb.PageView do
end

defmodule EmbeddedLive.Switch do
use Phoenix.LiveView, layout: {DemoWeb.LayoutView, "live.html"}
use Phoenix.LiveView, layout: {DemoWeb.LayoutView, :live}

on_mount PhoenixProfiler

Expand Down Expand Up @@ -204,7 +204,7 @@ defmodule DemoWeb.AppLive.Hooks do
end

defmodule DemoWeb.AppLive.Index do
use Phoenix.LiveView, layout: {DemoWeb.LayoutView, "live.html"}
use Phoenix.LiveView, layout: {DemoWeb.LayoutView, :live}
use Phoenix.HTML
alias DemoWeb.Router.Helpers, as: Routes

Expand Down
4 changes: 2 additions & 2 deletions dev/templates/layout/app.html.heex
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
<main class="container">
<p class="alert alert-info" role="alert"><%= get_flash(@conn, :info) %></p>
<p class="alert alert-danger" role="alert"><%= get_flash(@conn, :error) %></p>
<p class="alert alert-info" role="alert"><%= Phoenix.Flash.get(@flash, :info) %></p>
<p class="alert alert-danger" role="alert"><%= Phoenix.Flash.get(@flash, :error) %></p>
<%= @inner_content %>
</main>
226 changes: 133 additions & 93 deletions lib/phoenix_profiler/dashboard.ex
Original file line number Diff line number Diff line change
Expand Up @@ -104,7 +104,7 @@ if Code.ensure_loaded?(Phoenix.LiveDashboard) do
end

@impl true
def render_page(assigns) do
def render(assigns) do
if assigns[:error] do
render_error(assigns)
else
Expand All @@ -116,10 +116,20 @@ if Code.ensure_loaded?(Phoenix.LiveDashboard) do
name: name, render: fn -> render_endpoint_or_error(assigns) end, method: :redirect}
end

nav_bar(items: items)
profiler_nav_bar(%{items: items, page: assigns[:page]})
end
end

defp profiler_nav_bar(assigns) do
~H"""
<.live_nav_bar id="profiler_nav_bar" page={@page}>
<:item name={name} :for={{name, item} <- @items}>
<%= item[:render].() %>
</:item>
</.live_nav_bar>
"""
end

defp render_endpoint_or_error(assigns) do
if assigns[:error] do
render_error(assigns)
Expand Down Expand Up @@ -161,20 +171,22 @@ if Code.ensure_loaded?(Phoenix.LiveDashboard) do
"This token is not available for this endpoint on this node."
end

card(value: error_message)
assigns = Map.put(assigns, :error_message, error_message)

~H"""
<.card><%= @error_message %></.card>
"""
end

defp render_profile_nav(assigns) do
nav_bar(
items: [
request: [
name: "Request / Response",
render: fn -> render_panel(:request, assigns) end
]
],
nav_param: :panel,
extra_params: [:nav, :token]
)
# TODO Where does name: "Request / Response" go?
~H"""
<.live_nav_bar id={@id} page={@page}>
<:item name="items">
<%= render_panel(:request, assigns) %>
</:item>
</.live_nav_bar>
"""
end

defp render_todo do
Expand All @@ -184,93 +196,121 @@ if Code.ensure_loaded?(Phoenix.LiveDashboard) do
defp render_panel(:request, assigns) do
conn = assigns.profile.conn

nav_bar(
items: [
path_params: [
name: "Path Params",
render: fn -> render_params_table(conn, :path_params) end
],
query_params: [
name: "Query Params",
render: fn -> render_params_table(conn, :query_params) end
],
body_params: [
name: "Body Params",
render: fn -> render_params_table(conn, :body_params) end
],
request_headers: [
name: "Request Headers",
render: fn -> render_params_table(conn, :req_headers, "Request Headers") end
],
request_cookies: [
name: "Request Cookies",
render: fn -> render_params_table(conn, :req_cookies, "Request Cookies") end
],
session: [
name: "Session",
render: fn -> render_todo() end
],
response_headers: [
name: "Response Headers",
render: fn ->
render_params_table(conn, :resp_headers, "Response Headers")
end
],
response_cookies: [
name: "Response Cookies",
render: fn ->
render_params_table(conn, :resp_cookies, "Response Cookies")
end
],
flashes: [
name: "Flashes",
render: fn -> render_todo() end
]
items = [
path_params: [
name: "Path Params",
render: fn -> render_params_table(conn, :path_params) end
],
query_params: [
name: "Query Params",
render: fn -> render_params_table(conn, :query_params) end
],
body_params: [
name: "Body Params",
render: fn -> render_params_table(conn, :body_params) end
],
request_headers: [
name: "Request Headers",
render: fn -> render_params_table(conn, :req_headers, "Request Headers") end
],
request_cookies: [
name: "Request Cookies",
render: fn -> render_params_table(conn, :req_cookies, "Request Cookies") end
],
session: [
name: "Session",
render: fn -> render_todo() end
],
response_headers: [
name: "Response Headers",
render: fn ->
render_params_table(conn, :resp_headers, "Response Headers")
end
],
response_cookies: [
name: "Response Cookies",
render: fn ->
render_params_table(conn, :resp_cookies, "Response Cookies")
end
],
nav_param: :tab,
extra_params: [:nav, :panel, :token]
)
flashes: [
name: "Flashes",
render: fn -> render_todo() end
]
]

assigns = Map.put(assigns, :items, items)

~H"""
<.live_nav_bar id={@id} page={@page}>
<:item name={name} :for={{name, item} <- @items}>
<%= item[:render].() %>
</:item>
</.live_nav_bar>
"""
end

defp render_profiles_table(assigns) do
table(
columns: columns(),
id: :phxprof_requests_table,
row_attrs: &row_attrs/1,
row_fetcher: fn params, node -> fetch_profiles(params, assigns.endpoint, node) end,
rows_name: "requests",
title: "Requests"
)
~H"""
<.live_table
id="phxprof_requests_table"
title="Requests"
page={@page}
row_attrs={&row_attrs/1}
row_fetcher={fn params, node -> fetch_profiles(params, assigns.endpoint, node) end}
rows_name="requests"
>
<:col
:for={col <- columns()}
field={col.field}
header={col[:header]}
sortable={col[:sortable]}
:let={value}
>
<%= render_profile_column(col, value) %>
</:col>
</.live_table>
"""
end

defp render_profile_column(col, data) do
value = data[col.field]

if col[:format] do
col.format.(value)
else
value
end
end

defp render_params_table(conn, field, title \\ nil) do
table(
id: :"#{field}_table",
columns: [
%{
field: :key,
sortable: :asc
},
%{
field: :value,
sortable: nil
}
],
row_fetcher: fn %{sort_by: sort_by, sort_dir: sort_dir}, _node ->
rows =
case Map.get(conn, field) do
%Plug.Conn.Unfetched{} ->
[]

params when is_map(params) or is_list(params) ->
params = for {key, value} <- params, do: %{key: pp(key), value: pp(value)}
Utils.sort_by(params, fn params -> params[sort_by] end, sort_dir)
end

{rows, length(rows)}
end,
title: title || Phoenix.Naming.humanize(field)
)
row_fetcher = fn %{sort_by: sort_by, sort_dir: sort_dir}, _node ->
rows =
case Map.get(conn, field) do
%Plug.Conn.Unfetched{} ->
[]

params when is_map(params) or is_list(params) ->
params = for {key, value} <- params, do: %{key: pp(key), value: pp(value)}
Utils.sort_by(params, fn params -> params[sort_by] end, sort_dir)
end

{rows, length(rows)}
end

assigns = %{conn: conn, field: field, title: title, row_fetcher: row_fetcher, page: conn}

~H"""
<.live_table
id={"#{@field}_table"}
title={@title || Phoenix.Naming.humanize(@field)}
page={@page}
row_fetcher={@row_fetcher}
>
<:col field={:key} sortable={:asc} />
<:col field={:value} />
</.live_table>
"""
end

# for printing
Expand Down
7 changes: 4 additions & 3 deletions mix.exs
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ defmodule PhoenixProfiler.MixProject do
app: :phoenix_profiler,
version: @version,
elixir: "~> 1.8",
compilers: [:phoenix] ++ Mix.compilers(),
compilers: Mix.compilers(),
elixirc_paths: elixirc_paths(Mix.env()),
package: package(),
deps: deps(),
Expand Down Expand Up @@ -41,10 +41,11 @@ defmodule PhoenixProfiler.MixProject do
phoenix() ++
[
{:phoenix_html, ">= 3.2.0 and < 4.0.0"},
{:phoenix_live_view, "~> 0.18.0 or ~> 0.17.0 or ~> 0.16.0"},
{:phoenix_live_dashboard, "~> 0.7.0 or ~> 0.6.0 or ~> 0.5.0", optional: true},
{:phoenix_live_view, "~> 0.19.0 or ~> 0.18.0 or ~> 0.17.0 or ~> 0.16.0"},
{:phoenix_live_dashboard, "~> 0.8", optional: true},
# Dev Dependencies
{:phoenix_live_reload, "~> 1.3", only: :dev},
{:phoenix_view, "~> 2.0", only: :test, optional: true},
{:plug_cowboy, "~> 2.0", only: :dev},
{:jason, "~> 1.0", only: [:dev, :test, :docs]},
{:ex_doc, "~> 0.25", only: :docs},
Expand Down
Loading