Packages
phoenix_kit
1.7.113
1.7.209
1.7.208
1.7.207
1.7.206
1.7.205
1.7.204
1.7.203
1.7.202
1.7.201
1.7.200
1.7.199
1.7.198
1.7.197
1.7.196
1.7.194
1.7.193
1.7.192
1.7.191
1.7.190
1.7.189
1.7.187
1.7.186
1.7.185
1.7.184
1.7.183
1.7.182
1.7.181
1.7.180
1.7.179
1.7.178
1.7.177
1.7.176
1.7.175
1.7.174
1.7.173
1.7.172
1.7.171
1.7.170
1.7.169
1.7.168
1.7.167
1.7.166
1.7.165
1.7.164
1.7.162
1.7.161
1.7.160
1.7.159
1.7.157
1.7.156
1.7.155
1.7.154
1.7.153
1.7.152
1.7.151
1.7.150
1.7.149
1.7.146
1.7.145
1.7.144
1.7.143
1.7.138
1.7.133
1.7.132
1.7.131
1.7.130
1.7.128
1.7.126
1.7.125
1.7.121
1.7.120
1.7.119
1.7.118
1.7.117
1.7.116
1.7.115
1.7.114
1.7.113
1.7.112
1.7.111
1.7.110
1.7.109
1.7.108
1.7.107
1.7.106
1.7.105
1.7.104
1.7.103
1.7.102
1.7.101
1.7.100
1.7.99
1.7.98
1.7.97
1.7.96
1.7.95
1.7.94
1.7.93
1.7.92
1.7.91
1.7.90
1.7.89
1.7.88
1.7.87
1.7.86
1.7.85
1.7.84
1.7.83
1.7.82
1.7.81
1.7.80
1.7.79
1.7.78
1.7.77
1.7.76
1.7.75
1.7.74
1.7.71
1.7.70
1.7.69
1.7.66
1.7.65
1.7.64
1.7.63
1.7.62
1.7.61
1.7.59
1.7.58
1.7.57
1.7.56
1.7.55
1.7.54
1.7.53
1.7.52
1.7.51
1.7.49
1.7.44
1.7.43
1.7.42
1.7.41
1.7.39
1.7.38
1.7.37
1.7.36
1.7.34
1.7.33
1.7.31
1.7.30
1.7.29
1.7.28
1.7.27
1.7.26
1.7.25
1.7.24
1.7.23
1.7.22
1.7.21
1.7.20
1.7.19
1.7.18
1.7.17
1.7.16
1.7.15
1.7.14
1.7.13
1.7.12
1.7.11
1.7.10
1.7.9
1.7.8
1.7.7
1.7.6
1.7.5
1.7.4
1.7.3
1.7.2
1.7.1
1.7.0
1.6.20
1.6.19
1.6.18
1.6.17
1.6.16
1.6.15
1.6.14
1.6.13
1.6.12
1.6.11
1.6.10
1.6.9
1.6.8
1.6.7
1.6.6
1.6.5
1.6.4
1.6.3
1.5.2
1.5.1
1.5.0
1.4.9
1.4.8
1.4.7
1.4.6
1.4.5
1.4.4
1.4.3
1.4.2
1.4.1
1.4.0
1.3.2
1.3.1
1.3.0
1.2.10
1.2.9
1.2.8
1.2.7
1.2.5
1.2.4
1.2.2
1.2.1
1.2.0
1.1.0
1.0.0
A foundation for building Elixir Phoenix apps — SaaS, social networks, ERP systems, marketplaces, and more
Current section
Files
Jump to
Current section
Files
lib/phoenix_kit_web/live/activity/show.html.heex
<PhoenixKitWeb.Components.LayoutWrapper.app_layout
flash={@flash}
phoenix_kit_current_scope={assigns[:phoenix_kit_current_scope]}
page_title="Activity Detail"
current_path={@url_path}
project_title={@project_title}
current_locale={assigns[:current_locale]}
>
<div class="container flex flex-col mx-auto px-4 py-6">
<.admin_page_header
back={Routes.path("/admin/activity")}
title="Activity Detail"
subtitle={@entry.action}
/>
<div class="max-w-4xl mx-auto w-full space-y-6">
<%!-- Action & Status --%>
<div class="card bg-base-100 shadow-sm">
<div class="card-body">
<div class="flex flex-wrap items-center gap-3 mb-4">
<span class={"badge badge-lg #{action_badge_color(@entry.action)}"}>
{@entry.action}
</span>
<%= if @entry.module do %>
<span class="badge badge-outline">{@entry.module}</span>
<% end %>
<%= if @entry.mode do %>
<span class={"badge #{mode_badge_color(@entry.mode)}"}>{@entry.mode}</span>
<% end %>
</div>
<div class="grid grid-cols-1 md:grid-cols-2 gap-4">
<%!-- Activity UUID --%>
<div>
<div class="text-xs text-base-content/50 mb-1">Activity ID</div>
<code class="text-sm break-all">{@entry.uuid}</code>
</div>
<%!-- Timestamp --%>
<div>
<div class="text-xs text-base-content/50 mb-1">Date & Time</div>
<div class="text-sm">
{Calendar.strftime(@entry.inserted_at, "%B %d, %Y at %H:%M:%S UTC")}
</div>
</div>
</div>
</div>
</div>
<%!-- People --%>
<div class="card bg-base-100 shadow-sm">
<div class="card-body">
<h3 class="font-semibold text-lg mb-4">People</h3>
<div class="grid grid-cols-1 md:grid-cols-2 gap-4">
<%!-- Actor --%>
<div>
<div class="text-xs text-base-content/50 mb-1">Actor (who did it)</div>
<%= if @entry.actor do %>
<div class="flex items-center gap-2">
<span class="font-semibold">{@entry.actor.email}</span>
<%= if @entry.metadata["actor_role"] do %>
<span class={[
"badge badge-xs",
if(@entry.metadata["actor_role"] == "admin",
do: "badge-warning",
else: "badge-ghost"
)
]}>
{@entry.metadata["actor_role"]}
</span>
<% end %>
</div>
<div class="text-xs text-base-content/40 mt-0.5">
{to_string(@entry.actor_uuid)}
</div>
<% else %>
<span class="text-base-content/50">System</span>
<% end %>
</div>
<%!-- Target --%>
<div>
<div class="text-xs text-base-content/50 mb-1">Target (who was affected)</div>
<%= if @entry.target do %>
<div class="font-semibold">{@entry.target.email}</div>
<div class="text-xs text-base-content/40 mt-0.5">
{to_string(@entry.target_uuid)}
</div>
<% else %>
<span class="text-base-content/30">—</span>
<% end %>
</div>
</div>
</div>
</div>
<%!-- Subject --%>
<div class="card bg-base-100 shadow-sm">
<div class="card-body">
<h3 class="font-semibold text-lg mb-4">Subject</h3>
<div class="grid grid-cols-1 md:grid-cols-2 gap-4">
<div>
<div class="text-xs text-base-content/50 mb-1">Type</div>
<%= if @entry.resource_type do %>
<span class="badge badge-ghost">{@entry.resource_type}</span>
<% else %>
<span class="text-base-content/30">—</span>
<% end %>
</div>
<div>
<div class="text-xs text-base-content/50 mb-1">ID</div>
<%= if @entry.resource_uuid do %>
<div>
<%= if @resource_user do %>
<span class="font-semibold">{@resource_user.email}</span>
<% end %>
<div class="text-xs text-base-content/40 mt-0.5">
{to_string(@entry.resource_uuid)}
</div>
</div>
<% else %>
<span class="text-base-content/30">—</span>
<% end %>
</div>
</div>
</div>
</div>
<%!-- Metadata --%>
<div class="card bg-base-100 shadow-sm">
<div class="card-body">
<h3 class="font-semibold text-lg mb-4">Metadata</h3>
<%= if @entry.metadata && map_size(@entry.metadata) > 0 do %>
<div class="overflow-x-auto">
<table class="table table-sm">
<thead>
<tr>
<th class="w-1/3">Key</th>
<th>Value</th>
</tr>
</thead>
<tbody>
<%= for {key, value} <- Enum.sort(@entry.metadata) do %>
<tr>
<td class="font-mono text-sm text-base-content/70">{key}</td>
<td class="text-sm break-all">{to_string(value)}</td>
</tr>
<% end %>
</tbody>
</table>
</div>
<% else %>
<div class="text-center py-4 text-base-content/50">
No metadata
</div>
<% end %>
</div>
</div>
</div>
</div>
</PhoenixKitWeb.Components.LayoutWrapper.app_layout>