Packages
phoenix_kit
1.7.199
1.7.210
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
socket={@socket}
flash={@flash}
phoenix_kit_current_scope={assigns[:phoenix_kit_current_scope]}
page_title={gettext("Activity Detail")}
page_subtitle={@entry.action}
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">
<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">{gettext("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">{gettext("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">{gettext("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">
{gettext("Actor (who did it)")}
</div>
<%= if @entry.actor do %>
<div class="flex items-center gap-2">
<.resource_email_link
info={@actor_link}
label={@entry.actor.email}
class="font-semibold"
/>
<%= 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">{gettext("System")}</span>
<% end %>
</div>
<%!-- Target --%>
<div>
<div class="text-xs text-base-content/50 mb-1">
{gettext("Target (who was affected)")}
</div>
<%= if @entry.target do %>
<.resource_email_link
info={@target_link}
label={@entry.target.email}
class="font-semibold"
/>
<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">{gettext("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">{gettext("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">{gettext("ID")}</div>
<%= if @entry.resource_uuid do %>
<div>
<%!-- Deep-link to the underlying resource when it resolves
(same mechanism as the comments moderation admin). --%>
<div :if={@resource_link} class="mb-1">
<.resource_link info={@resource_link} />
</div>
<%= if @resource_user && is_nil(@resource_link) 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">{gettext("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">{gettext("Key")}</th>
<th>{gettext("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">
{gettext("No metadata")}
</div>
<% end %>
</div>
</div>
</div>
</div>
</PhoenixKitWeb.Components.LayoutWrapper.app_layout>