defmodule Paleta.Components.Form do @moduledoc """ A simple form component that wraps a form tag and provides a default layout """ use Phoenix.Component slot(:inner_block, required: true) slot(:actions, required: false) do attr(:align, :atom, values: [:left, :center, :right]) end attr(:for, :any, default: %{}) attr(:as, :atom, default: :form) attr(:event, :string, default: "save") attr(:target, :map, default: nil) attr(:rest, :global, include: ~w(autocomplete name rel action enctype method novalidate target), doc: "the arbitrary HTML attributes to apply to the form tag" ) @doc """ Renders a simple form with a default layout. ## Examples <.simple_form> """ def simple_form(%{actions: []} = assigns) do assigns |> assign(:actions_align, :right) |> do_simple_form() end def simple_form(%{actions: [actions]} = assigns) do assigns |> assign(:actions_align, Map.get(actions, :align, :right)) |> do_simple_form() end defp do_simple_form(assigns) do ~H"""
<.form :let={f} for={@for} as={@as} phx-submit={@event} phx-target={@target} role="form text-left" {@rest} >
<%= render_slot(@inner_block, f) %>
<%= render_slot(@actions || %{}, f) %>
""" end slot(:inner_block, required: true) def form_actions(assigns) do ~H"""
<%= render_slot(@inner_block) %>
""" end attr(:label, :string, default: "Cancel") attr(:cancel_url, :string, default: "/") def cancel_button(assigns) do ~H""" <.link navigate={@cancel_url} class="btn min-w-[7rem] rounded-full border border-slate-300 font-medium text-slate-800 hover:bg-slate-150 focus:bg-slate-150 active:bg-slate-150/80 dark:border-navy-450 dark:text-navy-50 dark:hover:bg-navy-500 dark:focus:bg-navy-500 dark:active:bg-navy-500/90" > <%= @label %> """ end attr(:label, :string, default: "Save") attr(:in_progress_label, :string, default: "Saving...") def save_button(assigns) do ~H""" """ end attr(:label, :string, default: "Delete") attr(:in_progress_label, :string, default: "Deleting...") def delete_button(assigns) do ~H""" """ end end