defmodule ExshomeWeb.Components do @moduledoc """ Generic application components. """ alias Phoenix.LiveView use Phoenix.HTML import Phoenix.LiveView.Helpers import ExshomeWeb.ErrorHelpers def button(assigns) do extra = assigns_to_attributes(assigns, [:class]) assigns = LiveView.assign(assigns, :extra, extra) ~H""" """ end def live_form(assigns) do extra = assigns_to_attributes(assigns, [:changeset, :fields]) assigns = LiveView.assign(assigns, :extra, extra) ~H""" <.form let={f} for={@changeset} phx-change="validate" phx-submit="save" class="flex items-center flex-col max-h-full w-full overflow-x-hidden overflow-y-auto my-2" {@extra} > <%= for {field, data} <- @fields do %>
<%= render_field(f, field, data) %>
<%= error_tag(f, field) %> <% end %> <.button type="submit" phx_disable_with="Saving..."> Save """ end defp render_field(form, field, data) when is_atom(field) do type = if data[:allowed_values], do: :select, else: :text render_field(form, field, type, data) end defp render_field(form, field, :select, data) do select(form, field, data[:allowed_values].(), class: "w-full p-2 bg-gray-100 dark:bg-gray-800 rounded-lg shadow-md dark:shadow-gray-700" ) end defp render_field(form, field, :text, _data) do text_input(form, field, class: "w-full p-2 rounded-lg bg-gray-100 dark:bg-gray-800 shadow-md dark:shadow-gray-700" ) end end