Packages

phoenix_kit

1.7.64
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 sync web index.ex
Raw

lib/modules/sync/web/index.ex

defmodule PhoenixKit.Modules.Sync.Web.Index do
@moduledoc """
Landing page for DB Sync module.
Provides access to:
- Manage Connections: Create and manage permanent connections with other sites
- Transfer History: View all data transfers with approval workflow
"""
use PhoenixKitWeb, :live_view
use Gettext, backend: PhoenixKitWeb.Gettext
alias PhoenixKit.Modules.Sync
alias PhoenixKit.Modules.Sync.Connections
alias PhoenixKit.Settings
alias PhoenixKit.Utils.Routes
@impl true
def mount(params, _session, socket) do
locale = params["locale"] || "en"
project_title = Settings.get_project_title()
config = Sync.get_config()
# Get connection stats
stats = get_connection_stats()
socket =
socket
|> assign(:page_title, "DB Sync")
|> assign(:project_title, project_title)
|> assign(:current_locale, locale)
|> assign(:current_path, Routes.path("/admin/sync", locale: locale))
|> assign(:config, config)
|> assign(:stats, stats)
{:ok, socket}
end
@impl true
def handle_params(_params, _url, socket) do
{:noreply, socket}
end
defp get_connection_stats do
default_stats = %{
total_senders: 0,
total_receivers: 0,
active_senders: 0,
active_receivers: 0
}
with {:ok, sender_connections} <- safe_list_connections("sender"),
{:ok, receiver_connections} <- safe_list_connections("receiver") do
active_senders = Enum.count(sender_connections, &(&1.status == "active"))
active_receivers = Enum.count(receiver_connections, &(&1.status == "active"))
%{
total_senders: length(sender_connections),
total_receivers: length(receiver_connections),
active_senders: active_senders,
active_receivers: active_receivers
}
else
_ -> default_stats
end
end
defp safe_list_connections(direction) do
{:ok, Connections.list_connections(direction: direction)}
rescue
_ -> {:error, :unavailable}
end
@impl true
def render(assigns) do
~H"""
<PhoenixKitWeb.Components.LayoutWrapper.app_layout
flash={@flash}
phoenix_kit_current_scope={assigns[:phoenix_kit_current_scope]}
page_title="{@project_title} - DB Sync"
current_path={@current_path}
project_title={@project_title}
current_locale={@current_locale}
>
<div class="container flex flex-col mx-auto px-4 py-6">
<%!-- Header Section --%>
<header class="w-full relative mb-6">
<.link
navigate={Routes.path("/admin")}
class="btn btn-ghost btn-sm -mb-12"
>
<.icon name="hero-arrow-left" class="w-4 h-4" />
</.link>
<div class="text-center">
<h1 class="text-4xl font-bold text-base-content mb-3">DB Sync</h1>
<p class="text-lg text-base-content/70">
Sync data between PhoenixKit instances with permanent connections
</p>
</div>
</header>
<%= if not @config.enabled do %>
<div class="alert alert-warning mb-6">
<.icon name="hero-exclamation-triangle" class="w-5 h-5" />
<span>
DB Sync module is disabled. Enable it in
<.link navigate={Routes.path("/admin/modules")} class="link link-primary">
Modules
</.link>
to use this feature.
</span>
</div>
<% end %>
<%!-- Stats Overview (commented out for now - will add back later)
<%= if @config.enabled do %>
<div class="grid gap-4 md:grid-cols-3 max-w-3xl mx-auto mb-8">
<div class="stat bg-base-100 rounded-box shadow">
<div class="stat-figure text-primary">
<.icon name="hero-arrow-up-tray" class="w-8 h-8" />
</div>
<div class="stat-title">Sender Connections</div>
<div class="stat-value text-primary">{@stats.total_senders}</div>
<div class="stat-desc">{@stats.active_senders} active</div>
</div>
<div class="stat bg-base-100 rounded-box shadow">
<div class="stat-figure text-secondary">
<.icon name="hero-arrow-down-tray" class="w-8 h-8" />
</div>
<div class="stat-title">Receiver Connections</div>
<div class="stat-value text-secondary">{@stats.total_receivers}</div>
<div class="stat-desc">{@stats.active_receivers} active</div>
</div>
<div class="stat bg-base-100 rounded-box shadow">
<div class="stat-figure text-success">
<.icon name="hero-check-circle" class="w-8 h-8" />
</div>
<div class="stat-title">Total Active</div>
<div class="stat-value text-success">
{@stats.active_senders + @stats.active_receivers}
</div>
<div class="stat-desc">connections ready</div>
</div>
</div>
<% end %>
--%>
<%!-- Main Actions --%>
<div class="grid gap-6 md:grid-cols-2 max-w-4xl mx-auto">
<%!-- Manage Connections Card --%>
<div class={[
"card bg-base-100 shadow-xl",
if(not @config.enabled, do: "opacity-50 pointer-events-none")
]}>
<div class="card-body items-center text-center">
<div class="text-6xl mb-4">
<.icon name="hero-link" class="w-16 h-16 text-primary" />
</div>
<h2 class="card-title text-2xl">Manage Connections</h2>
<p class="text-base-content/70 mb-4">
Create sender connections to share your data with other sites.
Receiver connections are created automatically when remote sites connect.
</p>
<div class="card-actions">
<.link
navigate={Routes.path("/admin/sync/connections", locale: @current_locale)}
class="btn btn-primary btn-lg"
>
<.icon name="hero-cog-6-tooth" class="w-5 h-5" /> Manage Connections
</.link>
</div>
</div>
</div>
<%!-- Transfer History Card --%>
<div class={[
"card bg-base-100 shadow-xl",
if(not @config.enabled, do: "opacity-50 pointer-events-none")
]}>
<div class="card-body items-center text-center">
<div class="text-6xl mb-4">
<.icon name="hero-clock" class="w-16 h-16 text-secondary" />
</div>
<h2 class="card-title text-2xl">Transfer History</h2>
<p class="text-base-content/70 mb-4">
View all data transfers and monitor sync activity.
Track records transferred and connection statistics.
</p>
<div class="card-actions">
<.link
navigate={Routes.path("/admin/sync/history", locale: @current_locale)}
class="btn btn-secondary btn-lg"
>
<.icon name="hero-queue-list" class="w-5 h-5" /> View History
</.link>
</div>
</div>
</div>
</div>
<%!-- How It Works Section --%>
<div class="mt-12 max-w-4xl mx-auto">
<div class="card bg-base-200">
<div class="card-body">
<h3 class="card-title text-lg">
<.icon name="hero-information-circle" class="w-5 h-5" />
How Cross-Site Connections Work
</h3>
<div class="grid gap-6 md:grid-cols-2 mt-4">
<div>
<h4 class="font-bold text-primary mb-2 flex items-center gap-2">
<.icon name="hero-arrow-up-tray" class="w-5 h-5" /> As a Sender
</h4>
<ol class="list-decimal list-inside space-y-2 text-sm text-base-content/80">
<li>Create a <strong>sender connection</strong> with a name</li>
<li>Enter the remote site's URL</li>
<li>The remote site is <strong>notified automatically</strong></li>
<li>They can now pull data from your tables</li>
</ol>
</div>
<div>
<h4 class="font-bold text-secondary mb-2 flex items-center gap-2">
<.icon name="hero-arrow-down-tray" class="w-5 h-5" /> As a Receiver
</h4>
<ol class="list-decimal list-inside space-y-2 text-sm text-base-content/80">
<li>When another site creates a connection to you</li>
<li>A <strong>receiver connection</strong> appears automatically</li>
<li>Use it to sync data from their site</li>
<li>Choose conflict strategy when importing</li>
</ol>
</div>
</div>
<div class="divider"></div>
<div class="text-sm text-base-content/70">
<strong>Security:</strong> All connections use token-based authentication.
</div>
</div>
</div>
</div>
</div>
</PhoenixKitWeb.Components.LayoutWrapper.app_layout>
"""
end
end