defmodule Moon.Parts.Wizard do
@moduledoc false
use Moon.StatefulComponent
alias __MODULE__
alias Moon.Design.Tabs
@doc "Additional Tailwind classes"
prop(class, :css_class)
@doc "Data-testid attribute for DOM element"
prop(testid, :string)
@doc "Index of the selected step"
prop(selected, :integer, default: 0)
@doc "List of steps, format: [%{title, text}]"
prop(steps, :list, default: [])
@doc "Dark/Light theme switch"
prop(is_dark, :boolean, default: true)
@doc "Next button click event"
prop(on_next, :event)
@doc "Previous button click event"
prop(on_prev, :event)
@doc "Description slot"
slot(description)
@doc "Slot for buttons and so on"
slot(default)
@doc "Slot for tab panels"
slot(content)
@doc "Slot for custom step info rendering"
slot(step)
def render(assigns) do
~F"""
<#slot {@description} />
<:tab_title :let={tabindex: index, title: title}>
<#slot {@step, tabindex: index, title: title}>
{title.title}
{title.text}
#slot>
<:content>
<#slot {@content} />
<#slot context_put={
on_next: @on_next || %{name: "next_page", target: @myself},
on_prev: @on_prev || %{name: "prev_page", target: @myself},
button_values: %{selected: @selected, total: Enum.count(@steps)}
} />
"""
end
def handle_event("next_page", %{"selected" => selected, "total" => tab_count}, socket) do
selected =
if String.to_integer(selected) >= tab_count,
do: String.to_integer(selected),
else: String.to_integer(selected) + 1
{:noreply, assign(socket, selected: selected)}
end
def handle_event("prev_page", %{"selected" => selected}, socket) do
selected = String.to_integer(selected) - 1
{:noreply, assign(socket, selected: selected)}
end
end