Packages

phoenix_kit

1.7.27
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
phoenix_kit lib modules shop web settings.ex
Raw

lib/modules/shop/web/settings.ex

defmodule PhoenixKit.Modules.Shop.Web.Settings do
@moduledoc """
E-Commerce module settings LiveView.
Allows configuration of e-commerce settings including inventory tracking.
"""
use PhoenixKitWeb, :live_view
alias PhoenixKit.Modules.Billing
alias PhoenixKit.Modules.Shop
alias PhoenixKit.Settings
alias PhoenixKit.Utils.Routes
@impl true
def mount(_params, _session, socket) do
config = Shop.get_config()
socket =
socket
|> assign(:page_title, "E-Commerce Settings")
|> assign(:enabled, config.enabled)
|> assign(:inventory_tracking, config.inventory_tracking)
|> assign(:billing_enabled, billing_enabled?())
{:ok, socket}
end
@impl true
def handle_event("toggle_enabled", _params, socket) do
new_enabled = !socket.assigns.enabled
if new_enabled and not billing_enabled?() do
# Cannot enable Shop without Billing
{:noreply,
socket
|> assign(:enabled, false)
|> put_flash(:error, "Please enable Billing module first")}
else
result =
if new_enabled do
Shop.enable_system()
else
Shop.disable_system()
end
case result do
:ok ->
socket =
socket
|> assign(:enabled, new_enabled)
|> put_flash(
:info,
if(new_enabled, do: "E-Commerce module enabled", else: "E-Commerce module disabled")
)
{:noreply, socket}
_ ->
{:noreply,
socket
|> assign(:enabled, false)
|> put_flash(:error, "Failed to update E-Commerce status")}
end
end
end
@impl true
def handle_event("toggle_inventory_tracking", _params, socket) do
new_value = !socket.assigns.inventory_tracking
value_str = if(new_value, do: "true", else: "false")
case Settings.update_setting("shop_inventory_tracking", value_str) do
{:ok, _} ->
{:noreply,
socket
|> assign(:inventory_tracking, new_value)
|> put_flash(
:info,
if(new_value, do: "Inventory tracking enabled", else: "Inventory tracking disabled")
)}
{:error, _} ->
{:noreply, put_flash(socket, :error, "Failed to update inventory setting")}
end
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="p-6 max-w-4xl mx-auto">
<%!-- Header --%>
<div class="flex items-center justify-between mb-8">
<div>
<h1 class="text-3xl font-bold text-base-content">E-Commerce Settings</h1>
<p class="text-base-content/70 mt-1">Configure your e-commerce store</p>
</div>
<.link navigate={Routes.path("/admin/shop")} class="btn btn-outline">
<.icon name="hero-arrow-left" class="w-5 h-5 mr-2" /> Back to Dashboard
</.link>
</div>
<%!-- Module Status --%>
<div class="card bg-base-100 shadow-lg mb-6">
<div class="card-body">
<div class="flex items-center justify-between">
<div>
<h2 class="card-title">Module Status</h2>
<p class="text-base-content/70">Enable or disable the E-Commerce module</p>
</div>
<div class="flex items-center gap-4">
<span class={[
"badge badge-lg",
if(@enabled, do: "badge-success", else: "badge-neutral")
]}>
{if @enabled, do: "Enabled", else: "Disabled"}
</span>
<div class="flex flex-col items-end gap-1">
<input
type="checkbox"
class="toggle toggle-primary toggle-lg"
checked={@enabled}
disabled={not @billing_enabled}
phx-click="toggle_enabled"
/>
<%= if not @billing_enabled do %>
<.link
navigate={Routes.path("/admin/modules")}
class="badge badge-warning badge-sm hover:badge-error"
>
Billing Required
</.link>
<% end %>
</div>
</div>
</div>
</div>
</div>
<%!-- Inventory Settings --%>
<div class="card bg-base-100 shadow-lg mb-6">
<div class="card-body">
<h2 class="card-title mb-4">
<.icon name="hero-archive-box" class="w-6 h-6" /> Inventory
</h2>
<div class="flex items-center justify-between">
<div>
<p class="font-medium">Track Inventory</p>
<p class="text-sm text-base-content/60">
Enable stock tracking for products (Phase 2)
</p>
</div>
<input
type="checkbox"
class="toggle toggle-primary"
checked={@inventory_tracking}
phx-click="toggle_inventory_tracking"
/>
</div>
</div>
</div>
<%!-- Info about Billing --%>
<div class="alert alert-info mb-6">
<.icon name="hero-information-circle" class="w-6 h-6" />
<div>
<h3 class="font-bold">Currency & Tax Settings</h3>
<p class="text-sm">
Currency and tax configuration is managed in the
<.link navigate={Routes.path("/admin/settings/billing")} class="link font-medium">
Billing module settings
</.link>
</p>
</div>
</div>
<%!-- Phase 2 Features --%>
<div class="card bg-base-200/50 border-2 border-dashed border-base-300">
<div class="card-body text-center">
<.icon name="hero-clock" class="w-12 h-12 mx-auto text-base-content/50 mb-3" />
<h3 class="text-lg font-medium text-base-content/70">Coming Soon</h3>
<p class="text-sm text-base-content/50">
Variants, inventory management, cart, and checkout will be available in Phase 2
</p>
</div>
</div>
</div>
</PhoenixKitWeb.Components.LayoutWrapper.app_layout>
"""
end
defp billing_enabled? do
Code.ensure_loaded?(Billing) and
function_exported?(Billing, :enabled?, 0) and
Billing.enabled?()
rescue
_ -> false
end
end