Packages

phoenix_kit

1.7.21
1.7.210 1.7.209 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 phoenix_kit_web helpers media_selector_helper.ex
Raw

lib/phoenix_kit_web/helpers/media_selector_helper.ex

defmodule PhoenixKitWeb.Helpers.MediaSelectorHelper do
@moduledoc """
Helper functions for integrating the media selector component.
Provides convenience functions to generate media selector URLs,
parse returned selections, and handle media selector integration
from any LiveView or controller.
## Examples
# In a LiveView template
<.link navigate={MediaSelectorHelper.media_selector_url(@current_path, mode: :single)}>
Select Featured Image
</.link>
# In handle_params to receive selection
def handle_params(params, _uri, socket) do
case MediaSelectorHelper.parse_selected_media(params) do
{:ok, [file_id]} ->
socket
|> assign(:featured_image_id, file_id)
|> put_flash(:info, "Image selected!")
{:ok, file_ids} ->
socket
|> assign(:gallery_ids, file_ids)
|> put_flash(:info, "\#{length(file_ids)} images selected!")
:none ->
socket
end
end
"""
alias PhoenixKit.Utils.Routes
@doc """
Generates a URL to the media selector page.
## Parameters
- `return_to` - The URL to return to after selection (required)
- `opts` - Keyword list of options:
- `:mode` - Selection mode: `:single` or `:multiple` (default: `:single`)
- `:filter` - File type filter: `:image`, `:video`, or `:all` (default: `:all`)
- `:selected` - List of pre-selected file IDs (optional)
## Examples
# Single image selection
media_selector_url("/admin/blog/edit", mode: :single, filter: :image)
#=> "/admin/media/selector?return_to=%2Fadmin%2Fblog%2Fedit&mode=single&filter=image"
# Multiple selection with pre-selected files
media_selector_url("/admin/gallery", mode: :multiple, selected: ["id1", "id2"])
#=> "/admin/media/selector?return_to=%2Fadmin%2Fgallery&mode=multiple&selected=id1%2Cid2"
"""
def media_selector_url(return_to, opts \\ []) do
mode = Keyword.get(opts, :mode, :single)
filter = Keyword.get(opts, :filter, :all)
selected = Keyword.get(opts, :selected, [])
base_url = Routes.path("/admin/media/selector")
params = build_query_params(return_to, mode, filter, selected)
"#{base_url}?#{params}"
end
@doc """
Parses the selected media from LiveView params.
Returns `{:ok, [file_ids]}` if media was selected, or `:none` if no selection.
## Examples
parse_selected_media(%{"selected_media" => "id1,id2,id3"})
#=> {:ok, ["id1", "id2", "id3"]}
parse_selected_media(%{"selected_media" => "single-id"})
#=> {:ok, ["single-id"]}
parse_selected_media(%{})
#=> :none
"""
def parse_selected_media(%{"selected_media" => selected_media})
when is_binary(selected_media) do
file_ids =
selected_media
|> String.split(",")
|> Enum.map(&String.trim/1)
|> Enum.reject(&(&1 == ""))
case file_ids do
[] -> :none
ids -> {:ok, ids}
end
end
def parse_selected_media(_params), do: :none
@doc """
Extracts the first file ID from selected media.
Useful for single-selection scenarios where you only need one file ID.
## Examples
get_first_selected(%{"selected_media" => "id1,id2,id3"})
#=> {:ok, "id1"}
get_first_selected(%{"selected_media" => "single-id"})
#=> {:ok, "single-id"}
get_first_selected(%{})
#=> :none
"""
def get_first_selected(params) do
case parse_selected_media(params) do
{:ok, [first_id | _]} -> {:ok, first_id}
:none -> :none
end
end
# Private Functions
defp build_query_params(return_to, mode, filter, selected) do
params = [
{"return_to", return_to},
{"mode", to_string(mode)},
{"filter", to_string(filter)}
]
params =
if Enum.any?(selected) do
selected_string = Enum.join(selected, ",")
params ++ [{"selected", selected_string}]
else
params
end
URI.encode_query(params)
end
end