defmodule DalaDev.Server.ObserverLive.ETS do @moduledoc "LiveView for ETS tables browser." use Phoenix.LiveView, layout: {DalaDev.Server.Layouts, :app} alias DalaDev.Observer @refresh_interval 5_000 @page_size 100 def mount(_params, _session, socket) do if connected?(socket), do: :timer.send_interval(@refresh_interval, self(), :refresh) socket = socket |> assign(:node, Node.self()) |> assign(:available_nodes, [Node.self() | Node.list()]) |> assign(:tables, []) |> assign(:filtered_tables, []) |> assign(:error, nil) |> assign(:loading, false) |> assign(:sort_by, "memory") |> assign(:sort_order, :desc) |> assign(:filter, "") |> assign(:selected_table, nil) {:ok, fetch_tables(socket)} end def handle_params(%{"node" => node_str}, _uri, socket) do try do node = String.to_existing_atom(":#{node_str}") {:noreply, assign(socket, :node, node) |> fetch_tables()} rescue _ -> {:noreply, assign(socket, :error, "Invalid node name: #{node_str}")} end end def handle_params(_params, _uri, socket), do: {:noreply, socket} def handle_info(:refresh, socket), do: {:noreply, fetch_tables(socket)} def handle_event("refresh", _params, socket), do: {:noreply, fetch_tables(socket)} def handle_event("select_node", %{"node" => node_str}, socket) do try do node = String.to_existing_atom(node_str) {:noreply, assign(socket, :node, node) |> fetch_tables()} rescue _ -> {:noreply, assign(socket, :error, "Invalid node: #{node_str}")} end end def handle_event("sort", %{"by" => sort_by}, socket) do current_sort = socket.assigns[:sort_by] {new_sort, new_order} = if sort_by == current_sort do {sort_by, toggle_order(socket.assigns[:sort_order])} else {sort_by, :desc} end socket = socket |> assign(:sort_by, new_sort) |> assign(:sort_order, new_order) {:noreply, apply_sort_and_filter(socket)} end def handle_event("filter", %{"filter" => filter}, socket) do {:noreply, assign(socket, :filter, filter) |> apply_sort_and_filter()} end def handle_event("select_table", %{"id" => table_id}, socket) do {:noreply, assign(socket, :selected_table, table_id)} end def render(assigns) do ~H"""
<%= @error %>
| ID | Name | Type | Size | Memory | Owner | Protection |
|---|---|---|---|---|---|---|
| <%= table.id %> | <%= table.name %> | <%= table.type %> | <%= format_number(table.size) %> | <%= format_bytes(table.memory) %> | <%= table.owner %> | <%= table.protection %> |