lib/pyro/extension/form/field.ex

if Code.ensure_loaded?(Ash) do
  defmodule Pyro.Resource.Form.Field do
    @moduledoc """
    The configuration of a form field in the `Pyro.Resource` extension.
    """
    defstruct [
      :name,
      :type,
      :options,
      :label,
      :description,
      :path,
      :class,
      :input_class,
      :autofocus,
      :prompt,
      :autocomplete_search_action,
      :autocomplete_search_arg,
      :autocomplete_option_label_key,
      :autocomplete_option_value_key
    ]

    @type field_type ::
            :default | :long_text | :short_text | :autocomplete | :select | :nested_form

    @type t :: %__MODULE__{
            name: atom(),
            type: field_type(),
            options: list(),
            label: String.t(),
            description: String.t(),
            path: [atom()],
            class: String.t(),
            input_class: String.t(),
            autofocus: boolean(),
            prompt: String.t(),
            autocomplete_search_action: atom(),
            autocomplete_search_arg: atom(),
            autocomplete_option_label_key: atom(),
            autocomplete_option_value_key: atom()
          }

    @schema [
      name: [
        type: :atom,
        required: true,
        doc: "The name of the field to be modified"
      ],
      type: [
        type: {:in, [:default, :long_text, :short_text, :autocomplete, :select, :nested_form]},
        required: false,
        doc: "The type of the value in the form.",
        default: :default
      ],
      options: [
        type: {:list, :any},
        required: false,
        doc: "The options for a select type input.",
        default: []
      ],
      label: [
        type: :string,
        required: false,
        doc: "Override the default extracted label."
      ],
      description: [
        type: :string,
        required: false,
        doc: "Override the default extracted description."
      ],
      class: [
        type: :string,
        required: false,
        doc: "Merge/override the default class."
      ],
      input_class: [
        type: :string,
        required: false,
        doc: "Merge/override the default input class."
      ],
      autofocus: [
        type: :boolean,
        required: false,
        default: false,
        doc: "Autofocus the field."
      ],
      prompt: [
        type: :string,
        required: false,
        doc: "Override the default prompt."
      ],
      path: [
        type: {:list, :atom},
        required: false,
        doc: "Override the default path (nested paths are appended)."
      ],
      autocomplete_search_action: [
        type: :atom,
        default: :autocomplete,
        doc: "Set the autocomplete search action name."
      ],
      autocomplete_search_arg: [
        type: :atom,
        default: :search,
        doc: "Set the autocomplete search argument key."
      ],
      autocomplete_option_label_key: [
        type: :atom,
        required: false,
        default: :label,
        doc: "Override the default autocomplete key used as a label."
      ],
      autocomplete_option_value_key: [
        type: :atom,
        required: false,
        default: :id,
        doc: "Override the default autocomplete key used as a value."
      ]
    ]

    def schema, do: @schema
  end
end