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>
Permissions
<:code>{code_for_dropdown()} <:state>@user_changeset = {inspect(@user_changeset, pretty: true)}
<:example>
Permissions {#for option <- @options} <:left_icon> {option.label} <:right_icon> {/for}
<:code>{code_for_dropdown()} <:state>@user_changeset = {inspect(@user_changeset, pretty: true)}
<:example>
Permissions {#for option <- @searched_options} <:left_icon> {option.label} <:right_icon> {/for} <:footer>
<:cancel> <:clear> <:confirm>
<: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>
Permissions <:footer>
<:cancel> <:clear> <:confirm>
<: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>
Permissions {#for option <- @searched_options} <:left_icon> {option.label} <:right_icon> {/for}
<:code>{code_for_dropdown_checkbox()} <:state>@user_changeset = {inspect(@user_changeset, pretty: true)}
<:example>
Permissions <:header> Link 1 Link 2 Link 3 Link 4
<: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 """
Permissions
""" end def code_for_dropdown_search_footer do """
Permissions {#for option <- @searched_options} <:left_icon> {option.label} <:right_icon> {/for} <:footer>
<:cancel> <:clear> <:confirm>
""" 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 """
Permissions <:footer>
<:cancel> <:clear> <:confirm>
""" 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 """
Permissions {#for option <- @searchable_options} <:left_icon> {option.label} <:right_icon> {/for}
""" end def code_for_dropdown_tabs do """
Permissions <:header> Link 1 Link 2 Link 3 Link 4
""" end end