Packages
phoenix_kit
1.7.113
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/storage/web/dimension_form.ex
defmodule PhoenixKitWeb.Live.Modules.Storage.DimensionForm do
@moduledoc """
Dimension form LiveView for storage dimension management.
Provides form interface for creating and editing dimension presets.
"""
use PhoenixKitWeb, :live_view
use Gettext, backend: PhoenixKitWeb.Gettext
alias PhoenixKit.Modules.Storage
alias PhoenixKit.Settings
alias PhoenixKit.Utils.Routes
def mount(params, _session, socket) do
dimension_uuid = params["id"]
dimension_type =
case socket.assigns[:live_action] do
:new_image -> "image"
:new_video -> "video"
_ -> nil
end
mode = if dimension_uuid, do: :edit, else: :new
# Get project title from settings
project_title = Settings.get_project_title()
socket =
socket
|> assign(:mode, mode)
|> assign(:dimension_uuid, dimension_uuid)
|> assign(:current_locale, "en")
|> assign(:current_path, Routes.path("/admin/settings/media/dimensions"))
|> assign(:project_title, project_title)
|> assign(:dimension, load_dimension_data(mode, dimension_uuid))
|> assign(:dimension_type, dimension_type)
|> assign_form()
{:ok, socket}
end
def handle_event("validate", %{"dimension" => dimension_params}, socket) do
dimension_params = normalize_dimension_params(dimension_params)
changeset =
case socket.assigns.mode do
:new ->
Storage.change_dimension(%Storage.Dimension{}, dimension_params)
:edit ->
dimension = Storage.get_dimension(socket.assigns.dimension_uuid)
Storage.change_dimension(dimension, dimension_params)
end
socket =
socket
|> assign(:changeset, changeset)
|> assign_format_fields(changeset)
{:noreply, socket}
end
def handle_event("save", %{"dimension" => dimension_params}, socket) do
dimension_params = normalize_dimension_params(dimension_params)
case socket.assigns.mode do
:new -> create_dimension(socket, dimension_params)
:edit -> update_dimension(socket, dimension_params)
end
end
defp create_dimension(socket, dimension_params) do
case Storage.create_dimension(dimension_params) do
{:ok, _dimension} ->
socket =
socket
|> put_flash(:info, "Dimension created successfully")
|> push_navigate(to: Routes.path("/admin/settings/media/dimensions"))
{:noreply, socket}
{:error, changeset} ->
socket =
socket
|> assign(:changeset, changeset)
|> put_flash(:error, "Failed to create dimension")
{:noreply, socket}
end
end
defp update_dimension(socket, dimension_params) do
dimension = Storage.get_dimension(socket.assigns.dimension_uuid)
case Storage.update_dimension(dimension, dimension_params) do
{:ok, _dimension} ->
socket =
socket
|> put_flash(:info, "Dimension updated successfully")
|> push_navigate(to: Routes.path("/admin/settings/media/dimensions"))
{:noreply, socket}
{:error, changeset} ->
socket =
socket
|> assign(:changeset, changeset)
|> put_flash(:error, "Failed to update dimension")
{:noreply, socket}
end
end
defp load_dimension_data(:new, _dimension_uuid), do: nil
defp load_dimension_data(:edit, dimension_uuid) do
Storage.get_dimension(dimension_uuid)
end
defp assign_form(%{assigns: %{mode: :new, dimension_type: dimension_type}} = socket) do
# Set applies_to based on dimension_type
initial_attrs =
case dimension_type do
"image" -> %{applies_to: "image"}
"video" -> %{applies_to: "video"}
_ -> %{}
end
changeset = Storage.change_dimension(%Storage.Dimension{}, initial_attrs)
socket
|> assign(:changeset, changeset)
|> assign(:page_title, page_title_with_type(:new, dimension_type))
|> assign(:form_action, page_title_with_type(:new, dimension_type))
|> assign_format_fields(changeset)
end
defp assign_form(%{assigns: %{mode: :edit, dimension: dimension}} = socket) do
changeset = Storage.change_dimension(dimension, %{})
dimension_type = dimension.applies_to
socket
|> assign(:changeset, changeset)
|> assign(:dimension_type, dimension_type)
|> assign(:page_title, "Edit Storage Dimension")
|> assign(:form_action, "Update Dimension")
|> assign_format_fields(changeset)
end
defp assign_format_fields(socket, changeset) do
socket
|> assign(
:current_alternatives,
Ecto.Changeset.get_field(changeset, :alternative_formats) || []
)
|> assign(:primary_format, Ecto.Changeset.get_field(changeset, :format))
end
defp normalize_dimension_params(params) do
params
|> then(fn p ->
case p["maintain_aspect_ratio"] do
"true" -> Map.put(p, "maintain_aspect_ratio", true)
"false" -> Map.put(p, "maintain_aspect_ratio", false)
_ -> p
end
end)
|> then(fn p ->
alt = p["alternative_formats"] || []
Map.put(p, "alternative_formats", Enum.reject(alt, &(&1 == "")))
end)
end
defp page_title_with_type(:new, "image"), do: "Add Image Dimension"
defp page_title_with_type(:new, "video"), do: "Add Video Dimension"
defp page_title_with_type(:new, _), do: "Add Storage Dimension"
# Helper function for input validation styling
defp input_class(changeset, field) do
if Keyword.has_key?(changeset.errors, field) do
"input-error"
else
""
end
end
# Helper function to get field value from changeset or data
defp get_field_value(changeset, field) do
case changeset do
%Ecto.Changeset{} ->
Ecto.Changeset.get_field(changeset, field)
_ ->
nil
end
end
# Helper function to render error messages
defp render_error(changeset, field) do
if Keyword.has_key?(changeset.errors, field) do
errors =
changeset.errors
|> Keyword.get_values(field)
|> Enum.map_join(", ", &extract_error_message/1)
content = """
<p class="mt-2 flex gap-2 text-sm text-error phx-no-feedback:hidden">
<svg class="mt-0.5 h-4 w-4 flex-none" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke="currentColor">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 8v4m0 4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z" />
</svg>
#{errors}
</p>
"""
Phoenix.HTML.raw(content)
else
""
end
end
defp extract_error_message({message, _}), do: message
end