defmodule Moon.Components.Select.MultiSelect.Labels.SelectedLabel do
@moduledoc false
use Moon.StatelessComponent
alias Moon.Components.Label
alias Moon.Components.Select.Helpers, as: SelectHelpers
alias Moon.Icons.ControlsClose
alias Phoenix.LiveView.JS
prop(select_id, :string)
prop(option, :any)
prop(size, :string)
prop(disabled, :boolean)
prop(selected_label_background_color_class, :css_class)
prop(selected_label_text_color_class, :css_class)
def render(assigns) do
~F"""
{#if @option}
{@option.label}
<:right_icon>
{/if}
"""
end
end
defmodule Moon.Components.Select.MultiSelect.Labels do
@moduledoc false
use Moon.StatelessComponent
alias Moon.Components.Select.Helpers, as: SelectHelpers
alias __MODULE__.SelectedLabel
prop(select_id, :string)
prop(options, :list, default: [])
prop(value, :list, default: [])
prop(size, :string)
prop(prompt, :string)
prop(disabled, :boolean)
prop(selected_label_background_color_class, :css_class)
prop(selected_label_text_color_class, :css_class)
def render(assigns) do
~F"""
{#if @value && @value != []}
{#if @prompt}
{@prompt}
{/if}
{#for v <- @value}
{/for}
{#else}
{@prompt}
{/if}
"""
end
end
# https://www.figma.com/file/S3q1SkVngbwHuwpxHKCsgtJj/Moon---Components?node-id=22819%3A17501
defmodule Moon.Components.Select.MultiSelect do
@moduledoc false
use Moon.StatefulComponent
alias Moon.Autolayouts.PullAside
alias Moon.Autolayouts.TopToDown
alias Moon.Components.FieldBorder
alias Moon.Components.Popover
alias Moon.Components.Select.Dropdown
alias Moon.Components.Select.Helpers, as: SelectHelpers
alias __MODULE__.Labels
prop(field, :atom, from_context: {Surface.Components.Form.Field, :field})
prop(form, :form, from_context: {Surface.Components.Form, :form})
prop(label, :string)
prop(options, :any, default: [])
prop(value, :any)
prop(prompt, :string)
prop(error, :string)
prop(disabled, :boolean, default: false)
prop(required, :boolean)
prop(class, :string)
prop(size, :string, values: ~w(small medium large xlarge), default: "medium")
prop(popover_placement, :string, default: "bottom-start")
prop(popover_class, :string)
prop(field_border_class, :string, default: FieldBorder.get_default_states_class())
prop(field_border_color_class, :string, values: Moon.colors(), default: "goku")
prop(selected_label_background_color_class, :css_class, default: "bulma")
prop(selected_label_text_color_class, :css_class, default: "goku")
prop(searched_options, :any, default: nil)
prop(on_search_change, :event)
prop(search_string, :string, default: nil)
prop(with, :string, default: nil)
prop(search_min_width, :css_class, default: "min-w-[144px]")
data(open, :boolean, default: false)
slot(default)
def render(assigns) do
~F"""
{Phoenix.HTML.Form.multiple_select(@form, @field, SelectHelpers.get_formatted_options(@options),
class: "hidden",
id: @id
)}
<:left>
<:right>
<:content>
"""
end
def handle_event("close", _params, socket) do
socket = assign(socket, open: false)
{:noreply, socket}
end
def handle_event("toggle_open", _params, socket) do
if socket.assigns.disabled == false do
{:noreply, assign(socket, open: !socket.assigns.open)}
else
{:noreply, socket}
end
end
defp get_disabled_class(disabled) do
if disabled do
"opacity-60 cursor-not-allowed"
end
end
end