Packages
phoenix_kit
1.2.4
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/settings_live.ex
defmodule PhoenixKitWeb.Live.SettingsLive do
use PhoenixKitWeb, :live_view
alias PhoenixKit.Utils.Routes
alias PhoenixKit.Utils.Date, as: UtilsDate
alias PhoenixKit.Settings
# Embedded schema for form validation
defmodule SettingsForm do
use Ecto.Schema
import Ecto.Changeset
@primary_key false
embedded_schema do
field :project_title, :string
field :time_zone, :string
field :date_format, :string
field :time_format, :string
end
def changeset(form, attrs) do
form
|> cast(attrs, [:project_title, :time_zone, :date_format, :time_format])
|> validate_required([:project_title, :time_zone, :date_format, :time_format])
end
end
def mount(_params, session, socket) do
# Get current path for navigation
current_path = get_current_path(socket, session)
# Load current settings from database
current_settings = Settings.list_all_settings()
defaults = Settings.get_defaults()
setting_options = Settings.get_setting_options()
# Merge defaults with current settings to ensure all keys exist
merged_settings = Map.merge(defaults, current_settings)
# Create form changeset
changeset = create_settings_changeset(merged_settings)
socket =
socket
|> assign(:current_path, current_path)
|> assign(:page_title, "Settings")
|> assign(:settings, merged_settings)
# Track saved values separately
|> assign(:saved_settings, merged_settings)
|> assign(:setting_options, setting_options)
|> assign(:changeset, changeset)
|> assign(:saving, false)
|> assign(:project_title, merged_settings["project_title"] || "PhoenixKit")
{:ok, socket}
end
def handle_params(_params, _url, socket) do
{:noreply, socket}
end
def handle_event("validate_settings", %{"settings" => settings_params}, socket) do
# Update the changeset with new values for validation
changeset = create_settings_changeset(settings_params) |> Map.put(:action, :validate)
# Update the current settings to reflect the pending changes (but don't save to DB)
socket =
socket
|> assign(:settings, settings_params)
|> assign(:changeset, changeset)
{:noreply, socket}
end
def handle_event("save_settings", %{"settings" => settings_params}, socket) do
socket = assign(socket, :saving, true)
case update_all_settings(settings_params) do
{:ok, updated_settings} ->
# Update socket with new settings
changeset = create_settings_changeset(updated_settings)
socket =
socket
|> assign(:settings, updated_settings)
# Update saved values
|> assign(:saved_settings, updated_settings)
|> assign(:changeset, changeset)
|> assign(:saving, false)
|> assign(:project_title, updated_settings["project_title"] || "PhoenixKit")
|> put_flash(:info, "Settings updated successfully")
{:noreply, socket}
{:error, errors} ->
error_msg = format_error_message(errors)
socket =
socket
|> assign(:saving, false)
|> put_flash(:error, error_msg)
{:noreply, socket}
end
end
def handle_event("reset_to_defaults", _params, socket) do
# Get default settings
defaults = Settings.get_defaults()
# Update all settings to defaults in database
case update_all_settings(defaults) do
{:ok, updated_settings} ->
# Update socket with default settings
changeset = create_settings_changeset(updated_settings)
socket =
socket
|> assign(:settings, updated_settings)
|> assign(:saved_settings, updated_settings)
|> assign(:changeset, changeset)
|> assign(:project_title, updated_settings["project_title"] || "PhoenixKit")
|> put_flash(:info, "Settings reset to defaults successfully")
{:noreply, socket}
{:error, errors} ->
error_msg = format_error_message(errors)
socket =
socket
|> put_flash(:error, error_msg)
{:noreply, socket}
end
end
defp get_current_path(_socket, _session) do
# For SettingsLive, always return settings path
Routes.path("/admin/settings")
end
# Create a changeset for form validation
defp create_settings_changeset(settings) do
# Convert string keys to atoms for the embedded schema
attrs = atomize_keys(settings)
# Create the form struct with current values
form_data = struct(SettingsForm, attrs)
# Create changeset
SettingsForm.changeset(form_data, attrs)
end
# Helper to convert string keys to atoms for changeset
defp atomize_keys(map) when is_map(map) do
Map.new(map, fn {k, v} -> {String.to_atom(k), v} end)
end
# Update all settings in the database
defp update_all_settings(settings_params) do
updated_settings =
Enum.reduce(settings_params, %{}, fn {key, value}, acc ->
case Settings.update_setting(key, value) do
{:ok, _setting} -> Map.put(acc, key, value)
{:error, _changeset} -> acc
end
end)
if map_size(updated_settings) == map_size(settings_params) do
{:ok, updated_settings}
else
{:error, ["Some settings failed to update"]}
end
end
# Format error messages for display
defp format_error_message(errors) when is_list(errors) do
errors
|> List.first()
|> to_string()
end
# Helper functions for template to show dropdown labels
def get_timezone_label(value, setting_options) do
Settings.get_timezone_label(value, setting_options)
end
def get_option_label(value, options) do
Settings.get_option_label(value, options)
end
# Helper functions for template to show current format examples
def get_current_date_example(format) do
UtilsDate.format_date(Date.utc_today(), format)
end
def get_current_time_example(format) do
UtilsDate.format_time(Time.utc_now(), format)
end
end