Packages
ash_admin
0.13.18
1.1.0
1.0.0-rc.0
0.14.0
0.13.26
0.13.25
0.13.24
0.13.23
0.13.22
0.13.21
0.13.20
0.13.19
0.13.18
0.13.17
0.13.16
0.13.15
0.13.14
0.13.13
0.13.12
0.13.11
0.13.10
0.13.9
0.13.8
0.13.7
0.13.6
0.13.5
0.13.4
0.13.3
0.13.2
0.13.1
0.13.0
0.12.6
0.12.5
0.12.4
0.12.3
0.12.2
0.12.1
0.12.0
0.11.11
0.11.10
0.11.9
0.11.8
0.11.7
0.11.6
0.11.5
0.11.4
0.11.3
0.11.2
0.11.1
0.11.0
0.10.12
0.10.11
0.10.10
retired
0.10.10-rc.1
0.10.10-rc.0
0.10.9
0.10.8
0.10.7
0.10.6
0.10.5
0.10.4
0.10.3
0.10.2
0.10.1
0.10.0
0.9.8
0.9.7
0.9.6
0.9.5
0.9.4
0.9.3
0.9.2
0.9.1
0.9.0
0.8.1
0.8.0
0.7.1
0.7.0
0.6.2
0.6.1
0.6.0-rc.2
0.6.0-rc.1
0.6.0-rc.0
0.5.2
0.5.1-rc.0
0.5.0
0.4.5-rc.0
0.4.4
0.4.2
0.4.0
0.3.0-rc.0
0.2.22
0.2.21
0.2.20
0.2.19
0.2.18
0.2.17
0.2.16-rc.1
0.2.16-rc.0
0.2.15
0.2.14
0.2.13
0.2.12
0.2.11
0.2.10
0.2.9
0.2.8
0.2.7
0.2.6
0.2.5
0.2.4
0.2.3
0.2.1
0.1.6
0.1.5
0.1.3
0.1.2
0.1.0
A super-admin UI for Ash Framework, built with Phoenix LiveView.
Current section
Files
Jump to
Current section
Files
lib/ash_admin/components/resource/resource.ex
defmodule AshAdmin.Components.Resource do
@moduledoc false
use Phoenix.LiveComponent
require Ash.Query
alias AshAdmin.Components.Resource.{DataTable, Form, GenericAction, Info, Nav, Show}
# prop hide_filter, :boolean, default: true
attr :resource, :any, required: true
attr :domain, :any, required: true
attr :action, :any
attr :actor, :any, required: true
attr :authorizing, :boolean, required: true
attr :tenant, :string, required: true
attr :url_path, :string, default: ""
attr :params, :map, default: %{}
attr :primary_key, :any, default: nil
attr :record, :any, default: nil
attr :table, :any, default: nil
attr :tables, :any, default: nil
attr :prefix, :any, default: nil
attr :action_type, :atom
attr :polymorphic_actions, :any
def render(assigns) do
~H"""
<div class="flex flex-col">
<Nav.nav resource={@resource} domain={@domain} action={@action} table={@table} prefix={@prefix} />
<div class="flex-1 p-6">
<div :if={@record && match?({:error, error} when not is_nil(error), @record)}>
<p>Error loading record</p>
</div>
<div :if={
@record && match?({:ok, record} when not is_nil(record), @record) &&
@action_type == :update
}>
<% {:ok, record} = @record %>
<.live_component
module={Form}
polymorphic_actions={@polymorphic_actions}
type={:update}
record={record}
resource={@resource}
url_path={@url_path}
params={@params}
action={@action}
domain={@domain}
id={update_id(@resource)}
actor={@actor}
authorizing={@authorizing}
tenant={@tenant}
table={@table}
tables={@tables}
prefix={@prefix}
/>
</div>
<div :if={
@record && match?({:ok, record} when not is_nil(record), @record) && @action_type == :destroy
}>
<% {:ok, record} = @record %>
<.live_component
module={Form}
polymorphic_actions={@polymorphic_actions}
type={:destroy}
record={record}
resource={@resource}
url_path={@url_path}
action={@action}
params={@params}
domain={@domain}
id={destroy_id(@resource)}
actor={@actor}
authorizing={@authorizing}
tenant={@tenant}
table={@table}
tables={@tables}
prefix={@prefix}
/>
</div>
<.live_component
:if={match?({:ok, %_{}}, @record) && @action_type == :read}
module={Show}
resource={@resource}
domain={@domain}
id={show_id(@resource)}
record={unwrap(@record)}
actor={@actor}
authorizing={@authorizing}
tenant={@tenant}
table={@table}
prefix={@prefix}
/>
<Info.info :if={is_nil(@action_type)} resource={@resource} domain={@domain} prefix={@prefix} />
<.live_component
:if={@action_type == :create}
module={Form}
type={:create}
resource={@resource}
url_path={@url_path}
params={@params}
domain={@domain}
action={@action}
id={create_id(@resource)}
actor={@actor}
authorizing={@authorizing}
tenant={@tenant}
table={@table}
tables={@tables}
prefix={@prefix}
polymorphic_actions={@polymorphic_actions}
/>
<.live_component
:if={@action_type == :read && !match?({:ok, %_{}}, @record)}
module={DataTable}
polymorphic_actions={@polymorphic_actions}
resource={@resource}
action={@action}
actor={@actor}
domain={@domain}
url_path={@url_path}
params={@params}
id={data_table_id(@resource)}
authorizing={@authorizing}
table={@table}
tables={@tables}
prefix={@prefix}
tenant={@tenant}
/>
<.live_component
:if={@action_type == :action}
module={GenericAction}
id={action_id(@resource)}
resource={@resource}
action={@action}
actor={@actor}
domain={@domain}
url_path={@url_path}
params={@params}
authorizing={@authorizing}
table={@table}
prefix={@prefix}
tenant={@tenant}
/>
</div>
</div>
"""
end
def mount(socket) do
{:ok, assign(socket, :filter_open, false)}
end
defp unwrap({:ok, val}), do: val
defp data_table_id(resource) do
"#{resource}_table"
end
defp action_id(resource) do
"#{resource}_action"
end
defp create_id(resource) do
"#{resource}_create"
end
defp update_id(resource) do
"#{resource}_update"
end
defp destroy_id(resource) do
"#{resource}_destroy"
end
defp show_id(resource) do
"#{resource}_show"
end
end