Packages
ash_admin
0.13.15
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/metadata_table.ex
defmodule AshAdmin.Components.Resource.MetadataTable do
@moduledoc false
use Phoenix.Component
import AshAdmin.Helpers
alias AshAdmin.CoreComponents
attr :resource, :any, required: true
def attribute_table(assigns) do
~H"""
<div :if={Enum.any?(attributes(@resource))}>
<.h1>Attributes</.h1>
<.table>
<thead>
<tr>
<.th>Name</.th>
<.th>Type</.th>
<.th>Description</.th>
<.th>Primary Key</.th>
<.th>Private</.th>
<.th>Allow Nil</.th>
<.th>Writable</.th>
</tr>
</thead>
<tbody>
<tr
:for={{attribute, index} <- Enum.with_index(attributes(@resource))}
class={classes("bg-gray-200": rem(index, 2) == 0)}
>
<.th scope="row">
{attribute.name}
</.th>
<.td>
{attribute_type(attribute)}
</.td>
<.td class="max-w-sm min-w-sm text-gray-500">
{attribute.description}
</.td>
<.td>
<CoreComponents.icon
name={if attribute.primary_key?, do: "hero-check", else: "hero-x-mark"}
class="h-4 w-4 text-gray-500"
/>
</.td>
<.td>
<CoreComponents.icon
name={if !attribute.public?, do: "hero-check", else: "hero-x-mark"}
class="h-4 w-4 text-gray-500"
/>
</.td>
<.td>
<CoreComponents.icon
name={if attribute.allow_nil?, do: "hero-check", else: "hero-x-mark"}
class="h-4 w-4 text-gray-500"
/>
</.td>
<.td>
<CoreComponents.icon
name={if attribute.writable?, do: "hero-check", else: "hero-x-mark"}
class="h-4 w-4 text-gray-500"
/>
</.td>
</tr>
</tbody>
</.table>
</div>
"""
end
attr :resource, :any, required: true
attr :domain, :any, required: true
attr :prefix, :any, required: true
def relationship_table(assigns) do
~H"""
<div :if={Enum.any?(relationships(@resource))} class="w-full">
<.h1>Relationships</.h1>
<.table>
<thead>
<tr>
<.th>Name</.th>
<.th>Type</.th>
<.th>Destination</.th>
<.th>Description</.th>
</tr>
</thead>
<tbody>
<tr
:for={{relationship, index} <- Enum.with_index(relationships(@resource))}
class={classes("bg-gray-200": rem(index, 2) == 0)}
>
<.th scope="row">
{relationship.name}
</.th>
<.td>
{relationship.type}
</.td>
<.td>
<.link navigate={"#{@prefix}?domain=#{AshAdmin.Domain.name(relationship.domain || Ash.Resource.Info.domain(relationship.destination) || @domain)}&resource=#{AshAdmin.Resource.name(relationship.destination)}"}>
{AshAdmin.Resource.name(relationship.destination)}
</.link>
</.td>
<.td class="max-w-sm min-w-sm text-gray-500">
{relationship.description}
</.td>
</tr>
</tbody>
</.table>
</div>
"""
end
slot :inner_block
def h1(assigns) do
~H"""
<h1 class="text-3xl rounded-t py-8">
{render_slot(@inner_block)}
</h1>
"""
end
slot :inner_block
def table(assigns) do
~H"""
<table class="table-auto w-full">
{render_slot(@inner_block)}
</table>
"""
end
attr :scope, :string, default: "col"
slot :inner_block
def th(assigns) do
~H"""
<th scope={@scope} class="px-2 py-3 text-left text-sm font-semibold text-gray-900">
{render_slot(@inner_block)}
</th>
"""
end
attr :class, :string, default: ""
slot :inner_block
def td(assigns) do
~H"""
<td class={classes(["px-2 py-3 text-left text-sm text-gray-900", @class])}>
{render_slot(@inner_block)}
</td>
"""
end
defp attributes(resource) do
resource
|> Ash.Resource.Info.attributes()
|> Enum.sort_by(&(not &1.public?))
end
defp attribute_type(attribute) do
case attribute.type do
{:array, type} ->
"list of " <> String.trim_leading(inspect(type), "Ash.Type.")
type ->
String.trim_leading(inspect(type), "Ash.Type.")
end
end
defp relationships(resource) do
resource
|> Ash.Resource.Info.relationships()
|> Enum.sort_by(&(not &1.public?))
end
end