diff --git a/elixir/apps/web/lib/web/live/resources/show.ex b/elixir/apps/web/lib/web/live/resources/show.ex index 1262f9271..1dc184385 100644 --- a/elixir/apps/web/lib/web/live/resources/show.ex +++ b/elixir/apps/web/lib/web/live/resources/show.ex @@ -121,20 +121,14 @@ defmodule Web.Resources.Show do Address Description <:value> - @resource.address_description - end - } - target="_blank" - class={link_style()} - > + <%= if http_link?(@resource.address_description) do %> + <.link class={link_style()} navigate={@resource.address_description} target="_blank"> + <%= @resource.address_description %> + <.icon name="hero-arrow-top-right-on-square" class="mb-3 w-3 h-3" /> + + <% else %> <%= @resource.address_description %> - <.icon name="hero-arrow-top-right-on-square" class="mb-3 w-3 h-3" /> - + <% end %> <.vertical_table_row> @@ -340,4 +334,16 @@ defmodule Web.Resources.Show do {:noreply, push_navigate(socket, to: ~p"/#{socket.assigns.account}/resources")} end end + + defp http_link?(nil), do: false + + defp http_link?(address_description) do + uri = URI.parse(address_description) + + if not is_nil(uri.scheme) and not is_nil(uri.host) and String.starts_with?(uri.scheme, "http") do + true + else + false + end + end end diff --git a/elixir/apps/web/test/web/live/resources/show_test.exs b/elixir/apps/web/test/web/live/resources/show_test.exs index 650e85765..8b7a1b918 100644 --- a/elixir/apps/web/test/web/live/resources/show_test.exs +++ b/elixir/apps/web/test/web/live/resources/show_test.exs @@ -118,12 +118,53 @@ defmodule Web.Live.Resources.ShowTest do assert table["name"] =~ resource.name assert table["address"] =~ resource.address assert table["created"] =~ actor.name + assert table["address description"] =~ resource.address_description for filter <- resource.filters do assert String.downcase(table["traffic restriction"]) =~ Atom.to_string(filter.protocol) end end + test "omits address_description row if null", %{ + account: account, + identity: identity, + conn: conn + } do + resource = Fixtures.Resources.create_resource(account: account, address_description: nil) + + {:ok, lv, _html} = + conn + |> authorize_conn(identity) + |> live(~p"/#{account}/resources/#{resource}") + + table = + lv + |> element("#resource") + |> render() + |> vertical_table_to_map() + + assert table["address description"] == "" + end + + test "renders link for address_descriptions that look like links", %{ + account: account, + identity: identity, + conn: conn + } do + resource = + Fixtures.Resources.create_resource( + account: account, + address_description: "http://example.com" + ) + + {:ok, _lv, html} = + conn + |> authorize_conn(identity) + |> live(~p"/#{account}/resources/#{resource}") + + assert Floki.find(html, "a[href='https://example.com']") + end + test "renders traffic filters on show page even when traffic filters disabled", %{ account: account, identity: identity,