Packages
phoenix_kit
1.7.80
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/shop/web/dashboard.ex
defmodule PhoenixKit.Modules.Shop.Web.Dashboard do
@moduledoc """
E-Commerce module dashboard LiveView.
Displays e-commerce statistics and quick access to management features.
"""
use PhoenixKitWeb, :live_view
alias PhoenixKit.Modules.Shop
alias PhoenixKit.Utils.Routes
@impl true
def mount(_params, _session, socket) do
if connected?(socket), do: :timer.send_interval(30_000, self(), :refresh_stats)
stats = Shop.get_dashboard_stats()
socket =
socket
|> assign(:page_title, "E-Commerce")
|> assign(:stats, stats)
|> assign(:enabled, Shop.enabled?())
{:ok, socket}
end
@impl true
def handle_info(:refresh_stats, socket) do
stats = Shop.get_dashboard_stats()
{:noreply, assign(socket, :stats, stats)}
end
@impl true
def render(assigns) do
~H"""
<PhoenixKitWeb.Components.LayoutWrapper.app_layout
flash={@flash}
phoenix_kit_current_scope={@phoenix_kit_current_scope}
current_path={@url_path}
current_locale={@current_locale}
page_title={@page_title}
>
<div class="container flex-col mx-auto px-4 py-6 max-w-7xl">
<.admin_page_header
back={Routes.path("/admin")}
title="E-Commerce"
subtitle="Manage your e-commerce store"
/>
<%!-- Controls Bar --%>
<div class="bg-base-200 rounded-lg p-6 mb-6">
<div class="flex flex-col lg:flex-row gap-4 justify-end">
<.link navigate={Routes.path("/admin/shop/products/new")} class="btn btn-primary">
<.icon name="hero-plus" class="w-4 h-4 mr-2" /> Add Product
</.link>
</div>
</div>
<%!-- Stats Grid --%>
<div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-6 mb-8">
<%!-- Total Products --%>
<div class="card bg-base-100 shadow-xl">
<div class="card-body">
<div class="flex items-center justify-between">
<div>
<p class="text-base-content/70 text-sm">Total Products</p>
<p class="text-3xl font-bold text-base-content">{@stats.total_products}</p>
</div>
<div class="bg-primary/10 p-3 rounded-lg">
<.icon name="hero-cube" class="w-8 h-8 text-primary" />
</div>
</div>
</div>
</div>
<%!-- Active Products --%>
<div class="card bg-base-100 shadow-xl">
<div class="card-body">
<div class="flex items-center justify-between">
<div>
<p class="text-base-content/70 text-sm">Active Products</p>
<p class="text-3xl font-bold text-success">{@stats.active_products}</p>
</div>
<div class="bg-success/10 p-3 rounded-lg">
<.icon name="hero-check-circle" class="w-8 h-8 text-success" />
</div>
</div>
</div>
</div>
<%!-- Draft Products --%>
<div class="card bg-base-100 shadow-xl">
<div class="card-body">
<div class="flex items-center justify-between">
<div>
<p class="text-base-content/70 text-sm">Draft Products</p>
<p class="text-3xl font-bold text-warning">{@stats.draft_products}</p>
</div>
<div class="bg-warning/10 p-3 rounded-lg">
<.icon name="hero-pencil-square" class="w-8 h-8 text-warning" />
</div>
</div>
</div>
</div>
<%!-- Categories --%>
<div class="card bg-base-100 shadow-xl">
<div class="card-body">
<div class="flex items-center justify-between">
<div>
<p class="text-base-content/70 text-sm">Categories</p>
<p class="text-3xl font-bold text-base-content">{@stats.total_categories}</p>
</div>
<div class="bg-info/10 p-3 rounded-lg">
<.icon name="hero-folder" class="w-8 h-8 text-info" />
</div>
</div>
</div>
</div>
</div>
<%!-- Product Types Grid --%>
<div class="grid grid-cols-1 md:grid-cols-2 gap-6 mb-8">
<%!-- Physical Products --%>
<div class="card bg-base-100 shadow-xl">
<div class="card-body">
<h2 class="card-title">
<.icon name="hero-truck" class="w-6 h-6" /> Physical Products
</h2>
<p class="text-4xl font-bold text-primary">{@stats.physical_products}</p>
<p class="text-base-content/70">Products requiring shipping</p>
</div>
</div>
<%!-- Digital Products --%>
<div class="card bg-base-100 shadow-xl">
<div class="card-body">
<h2 class="card-title">
<.icon name="hero-arrow-down-tray" class="w-6 h-6" /> Digital Products
</h2>
<p class="text-4xl font-bold text-secondary">{@stats.digital_products}</p>
<p class="text-base-content/70">Downloadable products</p>
</div>
</div>
</div>
<%!-- Quick Actions --%>
<div class="card bg-base-100 shadow-xl">
<div class="card-body">
<h2 class="card-title text-xl mb-6">Quick Actions</h2>
<div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-4">
<.link
navigate={Routes.path("/admin/shop/products")}
class="btn btn-outline btn-lg justify-start"
>
<.icon name="hero-cube" class="w-5 h-5 mr-2" /> Products
</.link>
<.link
navigate={Routes.path("/admin/shop/categories")}
class="btn btn-outline btn-lg justify-start"
>
<.icon name="hero-folder" class="w-5 h-5 mr-2" /> Categories
</.link>
<.link
navigate={Routes.path("/admin/shop/carts")}
class="btn btn-outline btn-lg justify-start"
>
<.icon name="hero-shopping-cart" class="w-5 h-5 mr-2" /> Carts
</.link>
<.link
navigate={Routes.path("/admin/shop/imports")}
class="btn btn-outline btn-lg justify-start"
>
<.icon name="hero-cloud-arrow-up" class="w-5 h-5 mr-2" /> CSV Import
</.link>
<.link
navigate={Routes.path("/admin/shop/settings")}
class="btn btn-outline btn-lg justify-start"
>
<.icon name="hero-cog-6-tooth" class="w-5 h-5 mr-2" /> Settings
</.link>
</div>
</div>
</div>
</div>
</PhoenixKitWeb.Components.LayoutWrapper.app_layout>
"""
end
end