diff --git a/lib/observer_web/apps.ex b/lib/observer_web/apps.ex index ffe62e1..681dd1c 100644 --- a/lib/observer_web/apps.ex +++ b/lib/observer_web/apps.ex @@ -190,8 +190,6 @@ defmodule ObserverWeb.Apps do }) end - # coveralls-ignore-stop - defp monitored_by(port) when is_port(port) do new(%{ id: port, @@ -201,6 +199,8 @@ defmodule ObserverWeb.Apps do }) end + # coveralls-ignore-stop + defp monitored_by(pid) when is_pid(pid) do new(%{ id: pid, @@ -226,6 +226,7 @@ defmodule ObserverWeb.Apps do }) end + # coveralls-ignore-start defp structure_links(port) when is_port(port) do new(%{ id: port, @@ -234,6 +235,8 @@ defmodule ObserverWeb.Apps do }) end + # coveralls-ignore-stop + defp structure_links(pid) when is_pid(pid) do new(%{id: pid}) end @@ -273,8 +276,9 @@ defmodule ObserverWeb.Apps do end end - defp name(port) when is_port(port), do: port |> inspect |> String.trim_leading("#Port") # coveralls-ignore-start + defp name(port) when is_port(port), do: port |> inspect |> String.trim_leading("#Port") + defp name(reference) when is_reference(reference), do: reference |> inspect |> String.trim_leading("#Reference") diff --git a/lib/observer_web/apps/helper.ex b/lib/observer_web/apps/helper.ex index 95912a0..53786d0 100644 --- a/lib/observer_web/apps/helper.ex +++ b/lib/observer_web/apps/helper.ex @@ -8,6 +8,7 @@ defmodule ObserverWeb.Apps.Helper do alias Jason.Encoder + # coveralls-ignore-start defimpl Encoder, for: PID do @doc """ JSON encodes a `PID`. @@ -50,24 +51,19 @@ defmodule ObserverWeb.Apps.Helper do end end + # coveralls-ignore-stop + @doc """ Formats function information as readable string. Only name will be return if only `name` is given. - Example: - ```bash - iex> format_function {Logger, :log, 2} - "Logger.log/2" - ``` - ```bash - iex> format_function :format_function - "format_function" - ``` - ```bash - iex> format_function nil - nil - ``` + ## Examples + iex> alias ObserverWeb.Apps.Helper + ...> assert "Elixir.Logger.log/2" == Helper.format_function({Logger, :log, 2}) + ...> assert "format_function" == Helper.format_function(:format_function) + ...> assert nil == Helper.format_function(nil) + """ @spec format_function(nil | {atom, atom, integer} | atom) :: String.t() | nil def format_function(nil), do: nil diff --git a/lib/web/components/core.ex b/lib/web/components/core.ex index f298adf..3375f18 100644 --- a/lib/web/components/core.ex +++ b/lib/web/components/core.ex @@ -197,8 +197,9 @@ defmodule Observer.Web.Components.Core do attr :type, :string, default: "text", - values: ~w(checkbox color date datetime-local email file month number password - range search select tel text textarea time url week select-undefined-class) + values: + ~w(checkbox color date datetime-local email file month number password + range search select tel text textarea time url week select-undefined-class text-custom-search) attr :field, Phoenix.HTML.FormField, doc: "a form field struct retrieved from the form, for example: @form[:email]" @@ -297,6 +298,27 @@ defmodule Observer.Web.Components.Core do """ end + def input(%{type: "text-custom-search"} = assigns) do + ~H""" +
+ <.label for={@id}>{@label} + +
+ """ + end + # All other inputs text, datetime-local, url, password, etc. are handled here... def input(assigns) do ~H""" diff --git a/lib/web/components/multi_select_list.ex b/lib/web/components/multi_select_list.ex index 1c2d81e..9b79f33 100644 --- a/lib/web/components/multi_select_list.ex +++ b/lib/web/components/multi_select_list.ex @@ -8,6 +8,7 @@ defmodule Observer.Web.Components.MultiSelectList do """ use Phoenix.Component + alias Observer.Web.Components.Core alias Phoenix.LiveView.JS attr :id, :string, required: true @@ -15,8 +16,28 @@ defmodule Observer.Web.Components.MultiSelectList do attr :selected, :list, required: true attr :unselected, :list, required: true attr :show_options, :boolean, required: true + attr :form_search, :map, default: %{} def content(assigns) do + elements_to_filter = Map.keys(assigns.form_search.params) + + filtered_unselected = + Enum.map(assigns.unselected, fn %{name: name, keys: keys} = element -> + if name in elements_to_filter do + filtered_keys = + Enum.filter(keys, &String.contains?(&1, assigns.form_search.params[name])) + + %{element | keys: filtered_keys} + else + element + end + end) + + assigns = + assigns + |> assign(elements_to_filter: elements_to_filter) + |> assign(unselected: filtered_unselected) + ~H"""
@@ -122,13 +143,27 @@ defmodule Observer.Web.Components.MultiSelectList do
<%= for item <- @unselected do %>
-
- <%= if item[:info] do %> -
{item.name} - {item.info}:
- <% else %> -
{item.name}:
- <% end %> +
+ <.form + for={@form_search} + id={"multi-select-list-search-form-#{@id}-#{item.name}"} + phx-change="form-multi-select-list-update-search" + class="flex" + > + <%= if item[:info] do %> +
{item.name} + {item.info}:
+ <% else %> +
{item.name}:
+ <% end %> + <%= if item.name in @elements_to_filter do %> + + <% end %> +
<%= for key <- item.keys do %> diff --git a/lib/web/helpers.ex b/lib/web/helpers.ex index 3dd8721..51f9b8d 100644 --- a/lib/web/helpers.ex +++ b/lib/web/helpers.ex @@ -7,6 +7,16 @@ defmodule Observer.Web.Helpers do @doc """ Prepare parsed params for URI encoding. + + ## Examples + + iex> alias Observer.Web.Helpers + ...> assert [nodes: "web-1,web-2"] = Helpers.encode_params(nodes: ~w(web-1 web-2)) + ...> assert [args: "a++x"] = Helpers.encode_params(args: [~w(a), "x"]) + ...> assert [args: "a,b++x"] = Helpers.encode_params(args: [~w(a b), "x"]) + ...> assert [args: "a,b,c++x"] = Helpers.encode_params(args: [~w(a b c), "x"]) + ...> assert [args: "a"] = Helpers.encode_params(args: [~w(a)]) + ...> assert [args: :hi] = Helpers.encode_params([args: :hi]) """ def encode_params(params) do for {key, val} <- params, val != nil, val != "" do @@ -28,6 +38,15 @@ defmodule Observer.Web.Helpers do Routing is based on a socket and prefix tuple stored in the process dictionary. Proper routing can be disabled for testing by setting the value to `:nowhere`. + + ## Examples + + iex> alias Observer.Web.Helpers + ...> assert "/" = Helpers.observer_path(:root, :any) + ...> assert_raise RuntimeError, ~r/nothing stored in the :routing key/, fn -> Helpers.observer_path(nil, ["path", "to", "resource"]) end + ...> Process.put(:routing, :nowhere) + ...> assert "/" = Helpers.observer_path(:tracing, ["path", "to", "resource"]) + ...> assert "/" = Helpers.observer_path(["/", "tracing"], ["path", "to", "resource"]) """ def observer_path(route, params \\ %{}) diff --git a/lib/web/pages/apps/page.ex b/lib/web/pages/apps/page.ex index 8c16f75..4c988f9 100644 --- a/lib/web/pages/apps/page.ex +++ b/lib/web/pages/apps/page.ex @@ -87,7 +87,7 @@ defmodule Observer.Web.Apps.Page do <:inner_form> <.form for={@form} - id="observer-update-form" + id="apps-update-form" class="flex ml-2 mr-2 text-xs text-center whitespace-nowrap gap-5" phx-change="form-update" > @@ -102,8 +102,8 @@ defmodule Observer.Web.Apps.Page do <:inner_button>