Packages
phoenix_kit
1.7.31
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/modules/db/web/index.html.heex
<PhoenixKitWeb.Components.LayoutWrapper.app_layout
flash={@flash}
phoenix_kit_current_scope={assigns[:phoenix_kit_current_scope]}
page_title={"#{@project_title} - DB"}
current_path={@current_path}
project_title={@project_title}
current_locale={@current_locale}
>
<div class="container flex-col mx-auto px-4 py-6">
<%!-- Header Section --%>
<header class="w-full relative mb-6">
<.link
navigate={PhoenixKit.Utils.Routes.path("/admin")}
class="btn btn-outline btn-primary btn-sm absolute left-0 top-0 -mb-12"
>
<.icon name="hero-arrow-left" class="w-4 h-4 mr-2" /> Back to Dashboard
</.link>
<div class="text-center">
<h1 class="text-4xl font-bold text-base-content mb-3">DB</h1>
<p class="text-lg text-base-content">Explore database tables and their contents</p>
</div>
</header>
<%!-- Actions --%>
<div class="flex justify-end mb-6">
<.link
navigate={PhoenixKit.Utils.Routes.path("/admin/db/activity")}
class="btn btn-outline btn-primary btn-sm"
>
<.icon name="hero-signal" class="w-4 h-4 mr-2" /> Live Activity
</.link>
</div>
<div class="grid gap-4 md:grid-cols-4">
<div class="stat bg-base-100 shadow rounded-box">
<div class="stat-title">Tables</div>
<div class="stat-value text-primary">
<.formatted_number number={@stats.table_count} />
</div>
<div class="stat-desc">Application tables</div>
</div>
<div class="stat bg-base-100 shadow rounded-box">
<div class="stat-title">Rows</div>
<div class="stat-value text-secondary">
<.formatted_number number={@stats.approx_rows} format={:short} />
</div>
<div class="stat-desc">Summed live tuples</div>
</div>
<div class="stat bg-base-100 shadow rounded-box">
<div class="stat-title">Tables Size</div>
<div class="stat-value text-accent"><.file_size bytes={@stats.total_size_bytes} /></div>
<div class="stat-desc">App data + indexes</div>
</div>
<div class="stat bg-base-100 shadow rounded-box">
<div class="stat-title">Database Size</div>
<div class="stat-value text-info"><.file_size bytes={@stats.database_size_bytes} /></div>
<div class="stat-desc">Full pg_database_size</div>
</div>
</div>
<div class="bg-base-100 rounded-box shadow border border-base-200">
<div class="p-4 border-b border-base-200">
<.form for={%{}} phx-change="search">
<.input
name="search"
label="Search tables"
value={@search}
placeholder="Filter by schema or table name"
phx-debounce="300"
/>
</.form>
</div>
<div class="overflow-x-auto">
<table class="table">
<thead>
<tr>
<th>Table</th>
<th class="text-right">Rows</th>
<th class="text-right">Size</th>
<th></th>
</tr>
</thead>
<tbody>
<%= if Enum.empty?(@tables.entries) do %>
<tr>
<td colspan="4" class="text-center py-8 text-base-content/70">
No tables found.
</td>
</tr>
<% else %>
<%= for entry <- @tables.entries do %>
<tr class="hover">
<td>
<.link
navigate={
PhoenixKit.Utils.Routes.path("/admin/db/#{entry.schema}/#{entry.name}")
}
class="font-semibold link link-hover"
>
{entry.schema}.{entry.name}
</.link>
</td>
<td class="text-right">
<.formatted_number number={entry.approx_rows} format={:short} />
</td>
<td class="text-right text-base-content/70">
<.file_size bytes={entry.size_bytes} />
</td>
<td class="text-right">
<.link
navigate={
PhoenixKit.Utils.Routes.path("/admin/db/#{entry.schema}/#{entry.name}")
}
class="btn btn-ghost btn-sm"
>
<.icon name="hero-eye" class="w-4 h-4" />
</.link>
</td>
</tr>
<% end %>
<% end %>
</tbody>
</table>
</div>
<div class="flex flex-col md:flex-row md:items-center md:justify-between gap-3 px-4 py-3 border-t border-base-200">
<div class="text-sm text-base-content/70">
Page {@tables.page} of {@tables.total_pages} •
<.formatted_number number={@tables.total_entries} /> tables
</div>
<div class="btn-group">
<button
class="btn btn-sm"
phx-click="change_page"
phx-value-page={@tables.page - 1}
disabled={@tables.page <= 1}
>
« Prev
</button>
<button
class="btn btn-sm"
phx-click="change_page"
phx-value-page={@tables.page + 1}
disabled={@tables.page >= @tables.total_pages}
>
Next »
</button>
</div>
</div>
</div>
</div>
</PhoenixKitWeb.Components.LayoutWrapper.app_layout>