# `FrappeUIPhx.Field`
[🔗](https://github.com/moacirbishopcamata/frappe_ui_phx/blob/v0.3.1/lib/frappe_ui_phx/field.ex#L1)

Costura entre `Phoenix.HTML.FormField` (changeset/Ecto) e os controles.

`assign_field/1` deriva `id`, `name`, `value` e `errors` do `field` quando
presente; sem `field`, mantém `name`/`value`/`id` avulsos. Erros só aparecem
depois que o campo foi usado (`Phoenix.Component.used_input?/1`), igual ao
`core_components` gerado pelo Phoenix.

# `assign_field`

```elixir
@spec assign_field(map(), keyword()) :: map()
```

Deriva `id`, `name`, `value` e `errors` de um `Phoenix.HTML.FormField` (`field`).

Precedência quando há `field` (valor explícito do chamador **vence** o do campo, exceto onde indicado):

| atributo | fonte |
|---|---|
| `id` | `id` explícito, senão `field.id` |
| `name` | sempre o do campo (com `[]` se `multiple: true`) |
| `value` | `value` explícito, senão `field.value` |
| `errors` | sempre os do campo, traduzidos, só se o campo foi usado (`used_input?/1`) |

Sem `field`, `name`/`value`/`errors` ficam como o chamador passou (ou `nil`/`[]`).
Opções: `multiple: true` acrescenta `[]` ao `name` (MultiSelect, Select múltiplo).

# `errors`

```elixir
@spec errors(Phoenix.HTML.FormField.t()) :: [String.t()]
```

Mensagens de erro já traduzidas de um `FormField`, só se o campo foi usado.

# `require_id!`

```elixir
@spec require_id!(map(), String.t()) :: map()
```

Garante um `id` DOM válido (de `id` ou do `field`) em componentes que o usam em
hooks, popovers ou seletores. Falha alto, nomeando o componente.

---

*Consult [api-reference.md](api-reference.md) for complete listing*
