defmodule MoonWeb.Pages.Components.Select.DropdownPage do
@moduledoc false
use MoonWeb, :live_view
alias Moon.Components.Button
alias Moon.Components.Checkbox
alias Moon.Components.Form
alias Moon.Components.Field
alias Moon.Components.FieldLabel
alias Moon.Components.Select.Dropdown
alias Moon.Components.Select.Dropdown.Footer
alias Moon.Components.ListItems.SingleLineItem
alias Moon.Components.Tabs
alias Moon.Components.Tabs.TabLink
alias MoonWeb.Components.ExampleAndCode
alias MoonWeb.Components.Page
alias MoonWeb.Pages.Tutorials.AddDataUsingForm.User
alias MoonWeb.Components.ComponentPageDescription
data(breadcrumbs, :any,
default: [
%{
to: "#",
name: "Components"
},
%{
to: "/components/select/dropdown",
name: "Multi Select"
}
]
)
data(search_string, :string, default: "")
def mount(_params, _session, socket) do
user_changeset = User.changeset(%User{}, %{permissions: [1, 2], role: 1})
{:ok,
assign(socket,
user_changeset: user_changeset,
radio_form_changeset: user_changeset,
options: User.available_permissions(),
searched_options: User.available_permissions(),
options_with_left_icon: User.available_permissions_with_left_icon(),
searched_options_with_left_icon: User.available_permissions_with_left_icon(),
search_string: "",
tab_id: "1",
selected: [],
latest_params: nil
)}
end
def handle_params(_params, uri, socket) do
{:noreply, assign(socket, uri: uri)}
end
def render(assigns) do
~F"""
Dropdowns is a custom select component that allows users to make single or multiple selections.
An option that's been selected can represent a corresponding value in forms or be used to filter/sort content.containers as Popovers, Sidebars, Drawers, Dialogs etc.
<:example>
<:code>{code_for_dropdown()}
<:state>@user_changeset = {inspect(@user_changeset, pretty: true)}
<:example>
<:code>{code_for_dropdown()}
<:state>@user_changeset = {inspect(@user_changeset, pretty: true)}
<:example>
<:code>{code_for_dropdown_search_footer()}
<:state>@user_changeset = {inspect(@user_changeset, pretty: true)}
<:example>
<:code>{code_for_with_search_and_footer_data_and_form_for_atom_form_dropdown()}
<:state>@user_changeset = {inspect(@user_changeset, pretty: true)}
<:example>
<:code>{code_for_dropdown_search_footer_and_data_and_form_changeset()}
<:state>@user_changeset = {inspect(@user_changeset, pretty: true)}
<:example>
<:code>{code_for_dropdown_radio_button()}
<:state>{state_for_dropdown_radio_button(assigns)}
<:example>
<:code>{code_for_dropdown_checkbox()}
<:state>@user_changeset = {inspect(@user_changeset, pretty: true)}
<:example>
<:code>{code_for_dropdown_tabs()}
<:state>@user_changeset = {inspect(@user_changeset, pretty: true)}
"""
end
def handle_event("update_selected", params, socket) do
%{"selected_params" => selected_params} = params
selected = selected_params["selected"] || []
{:noreply, assign(socket, selected: selected)}
end
def handle_event(
"form_update",
params,
socket
) do
user_params = params["user"] || %{permissions: []}
user_changeset = User.changeset(%User{}, user_params)
{:noreply, assign(socket, user_changeset: user_changeset, latest_params: user_params)}
end
def handle_event(
"form_submit",
%{
"user" => user_params
},
socket
) do
user_changeset = User.changeset(%User{}, user_params)
{:noreply, assign(socket, user_changeset: user_changeset)}
end
def handle_event("form_radio_update", params, socket) do
user_params = params["user"] || %{"role" => nil}
user_changeset = User.changeset(%User{}, user_params)
{:noreply, assign(socket, radio_form_changeset: user_changeset, latest_params: user_params)}
end
def handle_event("clear_selections", _params, socket) do
user_changeset = User.changeset(%User{}, %{"permissions" => []})
{:noreply, assign(socket, user_changeset: user_changeset)}
end
def handle_event(
"update_search",
%{"value" => search_string},
socket
) do
options = socket.assigns.options
options_with_left_icon = socket.assigns.options_with_left_icon
searched_options =
options
|> Enum.filter(&String.contains?(String.downcase(&1.label), String.downcase(search_string)))
searched_options_with_left_icon =
options_with_left_icon
|> Enum.filter(&String.contains?(String.downcase(&1.label), String.downcase(search_string)))
{:noreply,
assign(socket,
searched_options: searched_options,
searched_options_with_left_icon: searched_options_with_left_icon,
search_string: search_string
)}
end
def handle_event("clicked_tab", %{"item_id" => tab_id}, socket) do
{:noreply, assign(socket, tab_id: tab_id)}
end
def code_for_dropdown do
"""
"""
end
def code_for_dropdown_search_footer do
"""
"""
end
def code_for_with_search_and_footer_data_and_form_for_atom_form_dropdown do
"""
"""
end
def code_for_dropdown_search_footer_and_data_and_form_changeset do
"""
"""
end
def code_for_dropdown_radio_button do
"""
"""
end
def state_for_dropdown_radio_button(assigns) do
"""
@radio_form_changeset = #{inspect(assigns.radio_form_changeset, pretty: true)}
@latest_params = #{inspect(assigns.latest_params, pretty: true)}
"""
end
def code_for_dropdown_checkbox do
"""
"""
end
def code_for_dropdown_tabs do
"""
"""
end
end