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} {/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