查看源代码 Phoenix.LiveDashboard.PageBuilder 行为 (LiveDashboard v0.8.4)
页面构建器是构建自定义仪表板页面的默认机制。
每个仪表板页面都是一个 LiveView,它具有用于自定义菜单外观和自动刷新的额外回调。
自定义页面的一个简单直接的例子是随仪表板一起提供的 Phoenix.LiveDashboard.EtsPage
defmodule Phoenix.LiveDashboard.EtsPage do
@moduledoc false
use Phoenix.LiveDashboard.PageBuilder
@impl true
def menu_link(_, _) do
{:ok, "ETS"}
end
@impl true
def render(assigns) do
~H"""
<.live_table
id="ets-table"
dom_id="ets-table"
page={@page}
title="ETS"
row_fetcher={&fetch_ets/2}
row_attrs={&row_attrs/1}
rows_name="tables"
>
<:col field={:name} header="Name or module" />
<:col field={:protection} />
<:col field={:type} />
<:col field={:size} text_align="right" sortable={:desc} />
<:col field={:memory} text_align="right" sortable={:desc} :let={ets}>
<%= format_words(ets[:memory]) %>
</:col>
<:col field={:owner} :let={ets} >
<%= encode_pid(ets[:owner]) %>
</:col>
</.live_table>
"""
end
defp fetch_ets(params, node) do
%{search: search, sort_by: sort_by, sort_dir: sort_dir, limit: limit} = params
# Here goes the code that goes through all ETS tables, searches
# (if not nil), sorts, and limits them.
#
# It must return a tuple where the first element is list with
# the current entries (up to limit) and an integer with the
# total amount of entries.
# ...
end
defp row_attrs(table) do
[
{"phx-click", "show_info"},
{"phx-value-info", encode_ets(table[:id])},
{"phx-page-loading", true}
]
end
end
定义页面后,必须在您的 live_dashboard
路由中声明它,如下所示
live_dashboard "/dashboard",
additional_pages: [
route_name: MyAppWeb.MyCustomPage
]
或者
live_dashboard "/dashboard",
additional_pages: [
route_name: {MyAppWeb.MyCustomPage, some_option: ...}
]
元组的第二个参数将传递给 init/1
回调。如果没有给出元组,init/1
将接收一个空列表。
use 宏的选项
使用 PageBuilder
模块时,可以提供以下选项
refresher?
- 布尔值,用于启用或禁用页面中的自动刷新。
组件
页面可以在 render/1
回调中返回任何有效的 HEEx 模板,并且它也可以使用与该页面一起列出的组件。
我们目前支持 card/1
、fields_card/1
、row/1
、shared_usage_card/1
和 usage_card/1
;以及直播组件 live_layered_graph/1
、live_nav_bar/1
和 live_table/1
。
助手
页面构建提供了一些辅助程序。支持的辅助程序是:live_dashboard_path/2
、live_dashboard_path/3
、encode_app/1
、encode_ets/1
、encode_pid/1
、encode_port/1
和 encode_socket/1
。
总结
函数
对 URL 编码应用程序。
对 URL 编码 ETS 引用。
对 URL 编码 PID。
对 URL 编码端口。
对 URL 编码套接字。
计算当前页面的路由路径。
计算当前页面的路由路径,并合并参数。
组件
@spec card(assigns :: Socket.assigns()) :: Phoenix.LiveView.Rendered.t()
卡片组件。
您可以在主页和操作系统数据页面上看到它。
属性
title
(:string
) - 卡片上方的标题。默认为nil
。hint
(:string
) - 显示在标题附近的文本提示。默认为nil
。inner_title
(:string
) - 卡片内部的标题。默认为nil
。inner_hint
(:string
) - 显示在内部标题附近的文本提示。默认为nil
。dom_id
(:string
) - HTML 主标签的 id 属性。默认为nil
。
插槽
inner_block
(必需) - 卡片将显示的值。
@spec card_title(assigns :: Socket.assigns()) :: Phoenix.LiveView.Rendered.t()
卡片标题组件。
属性
title
(:string
) - 卡片上方的标题。默认为nil
。hint
(:string
) - 显示在标题附近的文本提示。默认为nil
。
字段卡片组件。
您可以在主页的环境部分看到它。
属性
fields
(:list
) (必需) - 将在卡片内显示的键值元素列表。title
(:string
) - 卡片上方的标题。默认为nil
。hint
(:string
) - 显示在标题附近的文本提示。默认为nil
。inner_title
(:string
) - 卡片内部的标题。默认为nil
。inner_hint
(:string
) - 显示在内部标题附近的文本提示。默认为nil
。
@spec hint(assigns :: Socket.assigns()) :: Phoenix.LiveView.Rendered.t()
提示弹出文本组件
属性
text
(:string
) (必需) - 在提示中显示的文本。
标签值列表。
您可以在端口或进程页面上的模态中看到它。
插槽
elem
(必需) - 列表中每个元素的值。接受属性label
(:string
) (必需) - elem 的标签。
@spec live_layered_graph(assigns :: Socket.assigns()) :: Phoenix.LiveView.Rendered.t()
用于绘制分层图的组件。
这对于表示管道很有用,就像我们在 BroadwayDashboard 中一样,其中每层都指向下方层的节点。它从上到下绘制层。
层的计算和位置是根据选项自动完成的。
属性
id
(:any
) (必需) - 因为是一个有状态的Phoenix.LiveComponent
,所以需要一个唯一的 id。title
(:string
) - 组件的标题。默认为nil
。hint
(:string
) - 显示在标题附近的文本提示。默认为nil
。layers
(:list
) (必需) - 一个带有节点的层图。它们代表我们的图结构(见示例)。每层都是节点列表,其中每个节点都具有以下字段:id
- 给定节点的 ID。:children
- 子节点的 ID。:data
- 字符串或映射。如果它是一个映射,则必需的字段是detail
和label
。
show_grid?
(:boolean
) - 启用或禁用网格显示。这对于开发很有用。默认为false
。y_label_offset
(:integer
) - 相对于其圆心,标签位置的“y”偏移量。默认为5
。y_detail_offset
(:integer
) - 相对于其圆心,详细信息位置的“y”偏移量。默认为18
。background
(:any
) - 一个函数,它根据节点的数据计算节点的背景。默认:fn _node_data -> "gray" end
."format_label
(:any
) - 格式化标签的函数。默认为一个函数,该函数返回标签或数据(如果数据是二进制的)。format_detail
(:any
) - 格式化详细信息字段的函数。只有在数据是映射时才会调用此函数。默认:fn node_data -> node_data.detail end
。
示例
iex> layers = [
...> [
...> %{
...> id: "a1",
...> data: "a1",
...> children: ["b1"]
...> }
...> ],
...> [
...> %{
...> id: "b1"
...> data: %{
...> detail: 0,
...> label: "b1"
...> },
...> children: []
...> }
...> ]
...> ]
@spec live_table(assigns :: Socket.assigns()) :: Phoenix.LiveView.Rendered.t()
表格直播组件。
您可以在应用程序、进程、套接字页面以及许多其他页面上看到它。
属性
id
(:any
) (必需) - 因为是一个有状态的Phoenix.LiveComponent
,所以需要一个唯一的 id。page
(Phoenix.LiveDashboard.PageBuilder
) (必需) - 仪表板页面。row_fetcher
(:any
) (必需) - 一个接收参数和节点并返回一个包含行和总数量的元组的函数:(params(), node() -> {list(), integer() | binary()})
。如果该函数需要保持状态,可以选择将其定义为一个元组,其中第一个元素是函数,第二个元素是初始状态。在这种情况下,该函数将接收状态作为第三个参数,并且必须返回一个包含行、总数量和下一次调用的新状态的元组:{(params(), node(), term() -> {list(), integer() | binary(), term()}), term()}
rows_name
(:string
) - 用于命名行表示的字符串。默认情况下,它将从当前页面计算得出。row_attrs
(:any
) - 一个列表,其中包含表格行的 HTML 属性。它也可以是一个接收行作为参数并返回一个包含 HTML 属性名称和值的 2 元素元组的列表的函数。默认为
nil
。default_sort_by
(:any
) - 要排序的默认列。默认为第一个可排序列。默认为nil
。title
(:string
) (必填) - 表格的标题。limit
(:any
) - 可以设置为false
来禁用limit
。默认值为[50, 100, 500, 1000, 5000]
。search
(:boolean
) - 一个布尔值,指示是否启用搜索功能。默认为true
。hint
(:string
) - 显示在标题附近的文本提示。默认为nil
。dom_id
(:string
) - HTML 主标签的 id 属性。默认为nil
。
插槽
col
(必填) - 表格的列。接受属性field
(:atom
) (必填) - 列的标识符。sortable
(:atom
) - 设置后,列标题可点击,它将重新获取按新顺序排列的行。至少需要一列。必须为以下之一::asc
或:desc
。header
(:string
) - 在当前列中显示的标签。默认值根据:field
计算得出。text_align
(:string
) - 列中文本的文本对齐方式。默认值:nil
。必须为以下之一:"left"
、"center"
、"right"
或"justify"
。
@spec row(assigns :: Socket.assigns()) :: Phoenix.LiveView.Rendered.t()
行组件。
您可以在主页和操作系统数据页面中看到它。
插槽
col
(必填) - 组件列表。它可以接收最多 3 个组件。每个元素将是一列。
@spec usage_card(assigns :: Socket.assigns()) :: Phoenix.LiveView.Rendered.t()
使用卡片组件。
您可以在主页和操作系统数据页面中看到它。
属性
title
(:string
) - 卡片上方的标题。默认为nil
。hint
(:string
) - 显示在标题附近的文本提示。默认为nil
。dom_id
(:string
) (必填) - 此卡片中所有用法的唯一标识符。csp_nonces
(:any
) (必填) - CSP nonce 的副本 (@csp_nonces
),用于安全地渲染页面。
插槽
usage
(必填) - 要显示的用法列表。接受属性current
(:integer
) (必填) - 用法的当前值。limit
(:integer
) (必填) - 用法的最大值。dom_id
(:string
) (必填) - 用法的唯一标识符,将与dom_id
拼接。percent
(:string
) - 用法的使用百分比。title
(:string
) - 用法的标题。hint
(:string
) - 在用法标题旁边显示的文本提示。
类型
回调
@callback handle_event(event :: binary(), unsigned_params(), socket :: Socket.t()) :: {:noreply, Socket.t()} | {:reply, map(), Socket.t()}
调用事件时调用的回调。
请注意,show_info
事件由 Phoenix.LiveDashboard.PageBuilder
自动处理,但 info
参数 (phx-value-info
) 需要使用其中一个 encode_*
辅助函数进行编码。
有关更多详细信息,请参阅 Phoenix.LiveView 绑定
@callback handle_info(msg :: term(), socket :: Socket.t()) :: {:noreply, Socket.t()}
@callback handle_params(unsigned_params(), uri :: String.t(), socket :: Socket.t()) :: {:noreply, Socket.t()}
@callback handle_refresh(socket :: Socket.t()) :: {:noreply, Socket.t()}
启用自动刷新时调用的回调。
@callback init(term()) :: {:ok, session()} | {:ok, session(), requirements()}
在路由器中声明页面时调用的回调。
它接收路由器选项,并且必须返回元组 {:ok, session, requirements}
。
页面会话将被序列化到客户端,并在 mount
时接收。
requirements 是一个可选的关键字,用于检测节点的状态。
此检测的结果将作为第二个参数传递给 menu_link/2
回调。可能的返回值是
:applications
正在运行或未运行的应用程序列表。:modules
已加载或未加载的模块列表。:pids
处于活动状态或非活动状态的进程列表。
@callback mount(unsigned_params(), session(), socket :: Socket.t()) :: {:ok, Socket.t()} | {:ok, Socket.t(), keyword()}
@callback render(assigns :: Socket.assigns()) :: Phoenix.LiveView.Rendered.t()
函数
对 URL 编码应用程序。
示例
此函数可用于为事件值编码应用程序。
<button phx-click="show-info" phx-value-info=<%= encode_app(@my_app) %>/>
对 URL 编码 ETS 引用。
示例
此函数可用于为事件值编码 ETS 引用。
<button phx-click="show-info" phx-value-info=<%= encode_ets(@reference) %>/>
对 URL 编码 PID。
示例
此函数可用于为事件值编码 PID。
<button phx-click="show-info" phx-value-info=<%= encode_pid(@pid) %>/>
对 URL 编码端口。
示例
此函数可用于为事件值编码端口。
<button phx-click="show-info" phx-value-info=<%= encode_port(@port) %>/>
对 URL 编码套接字。
示例
此函数可用于为事件值编码 @socket
。
<button phx-click="show-info" phx-value-info=<%= encode_socket(@socket) %>/>
@spec live_dashboard_path( Socket.t(), page :: %Phoenix.LiveDashboard.PageBuilder{ allow_destructive_actions: term(), info: term(), module: term(), node: term(), params: term(), route: term(), tick: term() } ) :: binary()
计算当前页面的路由路径。
@spec live_dashboard_path( Socket.t(), page :: %Phoenix.LiveDashboard.PageBuilder{ allow_destructive_actions: term(), info: term(), module: term(), node: term(), params: term(), route: term(), tick: term() }, map() | Keyword.t() ) :: binary()
计算当前页面的路由路径,并合并参数。