Skip to content

Commit

Permalink
Add layouts and Phoenix.VerifiedRoutes
Browse files Browse the repository at this point in the history
  • Loading branch information
esdrasedu committed Aug 7, 2023
1 parent f6215a5 commit eab4b55
Show file tree
Hide file tree
Showing 10 changed files with 8,463 additions and 264 deletions.
61 changes: 0 additions & 61 deletions lib/ash_admin/components/layouts.ex

This file was deleted.

24 changes: 24 additions & 0 deletions lib/ash_admin/layouts.ex
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
defmodule AshAdmin.Layouts do
use AshAdmin.Web, :html

embed_templates "layouts/*"

def live_socket_path(conn) do
[Enum.map(conn.script_name, &["/" | &1]) | conn.private.live_socket_path]
end

def asset_hash("/statics/" <> path) do
file = Application.app_dir(:ash_admin, ["priv", "static", path])
|> File.read!()

:crypto.hash(:md5, file)
|> Base.encode16(case: :lower)
end

def asset_path(conn, asset) do
hash = asset_hash(asset)

ash_admin_path(conn, "#{asset}?vsn=#{hash}")
end

end
29 changes: 29 additions & 0 deletions lib/ash_admin/layouts/root.html.heex
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
<!DOCTYPE html>
<html lang="en" phx-socket={live_socket_path(@conn)}>
<head>
<meta charset="utf-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta
name="viewport"
content="width=device-width, initial-scale=1.0, minimum-scale=1.0"
/>
<meta name="csrf-token" content={get_csrf_token()} />
<title><%= assigns[:page_title] || "Ash Admin" %></title>
<link
href="https://cdnjs.cloudflare.com/ajax/libs/jsoneditor/9.5.1/jsoneditor.min.css"
rel="stylesheet"
type="text/css"
/>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jsoneditor/9.5.1/jsoneditor.min.js"></script>
<link
rel="stylesheet"
href="https://unpkg.com/easymde/dist/easymde.min.css"
/>
<script src="https://unpkg.com/easymde/dist/easymde.min.js"></script>
<link phx-track-static rel="stylesheet" href={asset_path(@conn, "/statics/assets/app.css")} />
<script defer phx-track-static type="text/javascript" src={asset_path(@conn, "/statics/assets/app.js")} />
</head>
<body>
<%= @inner_content %>
</body>
</html>
Original file line number Diff line number Diff line change
@@ -1,49 +1,25 @@
defmodule AshAdmin.PageNotFound do
@moduledoc false
defexception [:message, plug_status: 404]
end
defmodule AshAdmin.ResourceLive.Index do
use AshAdmin.Web, :live_view

defmodule AshAdmin.PageLive do
@moduledoc false
use Phoenix.LiveView
import AshAdmin.Helpers
require Ash.Query

alias AshAdmin.Components.{Resource, TopNav}

require Logger

def mount(socket) do
{:ok, socket}
end

@impl true
def mount(
_params,
%{
"prefix" => prefix
} = session,
session,
socket
) do
otp_app = socket.endpoint.config(:otp_app)

prefix =
case prefix do
"/" ->
session["request_path"]

_ ->
request_path = session["request_path"]
[scope, _] = String.split(request_path, prefix)
scope <> prefix
end

socket = assign(socket, :prefix, prefix)

apis = apis(otp_app)

{:ok,
socket
|> assign(:prefix, prefix)
|> assign(:primary_key, nil)
|> assign(:record, nil)
|> assign(:apis, apis)
Expand All @@ -58,50 +34,70 @@ defmodule AshAdmin.PageLive do
end

@impl true
def render(assigns) do
~H"""
<.live_component
module={TopNav}
id="top_nav"
apis={@apis}
api={@api}
actor_api={@actor_api}
resource={@resource}
tenant={@tenant}
actor_resources={@actor_resources}
authorizing={@authorizing}
actor_paused={@actor_paused}
actor={@actor}
set_tenant="set_tenant"
clear_tenant="clear_tenant"
toggle_authorizing="toggle_authorizing"
toggle_actor_paused="toggle_actor_paused"
clear_actor="clear_actor"
prefix={@prefix}
/>
<.live_component
:if={@resource}
module={Resource}
id={@resource}
resource={@resource}
set_actor="set_actor"
primary_key={@primary_key}
record={@record}
api={@api}
tab={@tab}
action_type={@action_type}
url_path={@url_path}
params={@params}
action={@action}
tenant={@tenant}
actor={unless @actor_paused, do: @actor}
authorizing={@authorizing}
table={@table}
tables={@tables}
polymorphic_actions={@polymorphic_actions}
prefix={@prefix}
/>
"""
def handle_params(params, url, socket) do
url = URI.parse(url)

socket =
socket
|> assign_api(params["api"])
|> assign_resource(params["resource"])
|> assign_action(params["action"], params["action_type"])
|> assign_tables(params["table"])
|> assign(primary_key: params["primary_key"], tab: params["tab"])

socket =
if socket.assigns[:primary_key] do
case decode_primary_key(socket.assigns.resource, socket.assigns[:primary_key]) do
{:ok, primary_key} ->
actor =
if socket.assigns.actor_paused do
nil
else
socket.assigns.actor
end

record =
socket.assigns.resource
|> Ash.Query.filter(^primary_key)
|> Ash.Query.load(to_one_relationships(socket.assigns.resource))
|> Ash.Query.set_tenant(socket.assigns[:tenant])
|> Ash.Query.for_read(
AshAdmin.Helpers.primary_action(socket.assigns.resource, :read).name,
%{},
actor: actor,
authorize?: socket.assigns.authorizing
)
|> socket.assigns.api.read_one()

case record do
{:error, error} ->
Logger.warning(
"Error while loading record on admin dashboard\n: #{Exception.format(:error, error)}"
)

{:ok, _} ->
:ok
end

socket
|> assign(:id, params["primary_key"])
|> assign(:record, record)

_ ->
socket
|> assign(:id, nil)
|> assign(:record, nil)
end
else
socket
|> assign(:id, nil)
|> assign(:record, nil)
end

{:noreply,
socket
|> assign(:url_path, url.path)
|> assign(:params, params)}
end

defp apis(otp_app) do
Expand Down Expand Up @@ -202,73 +198,6 @@ defmodule AshAdmin.PageLive do
end
end

@impl true
def handle_params(params, url, socket) do
url = URI.parse(url)

socket =
socket
|> assign_api(params["api"])
|> assign_resource(params["resource"])
|> assign_action(params["action"], params["action_type"])
|> assign_tables(params["table"])
|> assign(primary_key: params["primary_key"], tab: params["tab"])

socket =
if socket.assigns[:primary_key] do
case decode_primary_key(socket.assigns.resource, socket.assigns[:primary_key]) do
{:ok, primary_key} ->
actor =
if socket.assigns.actor_paused do
nil
else
socket.assigns.actor
end

record =
socket.assigns.resource
|> Ash.Query.filter(^primary_key)
|> Ash.Query.load(to_one_relationships(socket.assigns.resource))
|> Ash.Query.set_tenant(socket.assigns[:tenant])
|> Ash.Query.for_read(
AshAdmin.Helpers.primary_action(socket.assigns.resource, :read).name,
%{},
actor: actor,
authorize?: socket.assigns.authorizing
)
|> socket.assigns.api.read_one()

case record do
{:error, error} ->
Logger.warning(
"Error while loading record on admin dashboard\n: #{Exception.format(:error, error)}"
)

{:ok, _} ->
:ok
end

socket
|> assign(:id, params["primary_key"])
|> assign(:record, record)

_ ->
socket
|> assign(:id, nil)
|> assign(:record, nil)
end
else
socket
|> assign(:id, nil)
|> assign(:record, nil)
end

{:noreply,
socket
|> assign(:url_path, url.path)
|> assign(:params, params)}
end

defp to_one_relationships(resource) do
resource
|> Ash.Resource.Info.relationships()
Expand Down
Loading

0 comments on commit eab4b55

Please sign in to comment.