mad-search-field
Search box texto livre para filtros.
Search box de texto livre: um <input type="search"> com ícone de lupa e botão de limpar (x), pensado para toolbars de filtro/listagem. Não é um select — não recebe :options, não tem dropdown e não seleciona um valor de uma lista. Para isso use <mad-unique-search-field> (options em memória) ou <mad-dbcombo-field> / <mad-dbunique-search-field> (busca no banco).
Integra com MadForm via mad:model automático e registra-se no MadFormRegistry como tipo 'search'. Suporta preenchimento de valor inicial via MadRenderContext (ex: $form->fill($record) ou re-render após onReload).
Props
| Prop | Tipo | Default | Descrição |
|---|---|---|---|
| name | string | '' | Nome do campo |
| label | string | '' | Label |
| placeholder | string | 'Pesquisar...' | Placeholder |
| width | string | '' | Largura CSS do wrapper |
| max-width | string | '' | max-width CSS do wrapper |
| hint | string | '' | Texto de ajuda abaixo do campo |
| error | string | '' | Mensagem de erro (aplica estilo de erro) |
| required | bool | false | Campo obrigatório (mostra asterisco) |
| disabled | bool | false | Campo desabilitado |
| attrs | string | '' | Atributos HTML extras |
Uso básico
<mad-search-field name="busca" label="Buscar" placeholder="Nome ou código..." />
Em filtro de listagem
<mad-form submit="onReload">
<mad-form-grid :cols="2">
<mad-search-field name="busca" label="Busca rápida" placeholder="Nome, email, CPF..." />
<mad-dbcombo-field name="status" label="Status" model="Estado" display="nome" />
</mad-form-grid>
<mad-form-actions>
<mad-btn type="submit" variant="primary" icon="search">Buscar</mad-btn>
</mad-form-actions>
</mad-form>
public function onReload(): MadResponse
{
$data = $this->form->getData();
$registros = SystemUsers::query()
->when($data['busca'] ?? null, fn ($q, $busca) => $q->where('nome', 'like', "%{$busca}%"))
->get();
return $this->grid->reload($registros);
}
Sem label (toolbar compacta)
<mad-search-field name="q" placeholder="Pesquisar..." width="240px" />
Eventos
<mad-search-field> é um <input> simples — aceita mad:change="metodo" via attrs (mecanismo genérico do MAD, igual a qualquer outro input), disparado no evento nativo change (blur com valor alterado, ou Enter):
<mad-search-field name="busca" label="Buscar"
attrs='mad:change="onBuscaChange"' />
public function onBuscaChange(string $value): MadResponse
{
return $this->grid->reload(
SystemUsers::where('nome', 'like', "%{$value}%")->get()
);
}
Comportamento
- Ícone de lupa: fixo à esquerda do input (Lucide
search), puramente visual. - Botão de limpar (x): aparece somente quando o campo tem valor (estado Alpine local). Ao clicar, zera o valor e dispara manualmente um evento
inputno campo — garante quemad:model/mad:model.livee outros listeners reajam à limpeza mesmo sem digitação do usuário. mad:modelautomático: seattrsnão tivermad:model/data-mad-model, o componente injetamad:model="<name>"sozinho — não precise declarar.- Valor inicial: resolvido via
MadRenderContext(preenchido por$form->fill($record)ou re-render do form), igual a<mad-input-field>. - Validação: client-side limitada a
required(asterisco visual). Validação real é server-side, no controller.
Quando usar search-field vs outros campos de busca
| Cenário | Usar |
|---|---|
| Texto livre para filtrar uma listagem/grid (não seleciona valor) | <mad-search-field> |
| Selecionar 1 valor de uma lista já em memória, com busca | <mad-unique-search-field> |
| Selecionar 1 valor com busca server-side (lista grande, 200+) | <mad-dbunique-search-field> |
| Selecionar 1 valor de uma query do banco (lista média, client-side) | <mad-dbcombo-field> |
| Selecionar múltiplos valores com busca | <mad-multi-search-field> |
| Texto livre com autocomplete/sugestões do banco | <mad-dbentry-field> |
| Busca com modal grid (várias colunas, paginação) | <mad-seek> |
NUNCA fazer
{{-- ERRADO: usar search-field para selecionar um valor de uma lista --}}
<mad-search-field name="cliente_id" label="Cliente" />
{{-- search-field é texto livre, não tem :options nem dropdown --}}
{{-- CERTO: unique-search ou dbcombo selecionam de uma lista --}}
<mad-unique-search-field name="cliente_id" label="Cliente" :options="$clientes" />
<mad-dbcombo-field name="cliente_id" label="Cliente" model="Cliente" display="nome" />
{{-- ERRADO: passar :options para search-field (prop não existe no componente) --}}
<mad-search-field name="busca" :options="$itens" />
{{-- CERTO: search-field não recebe options — é só um input de texto --}}
<mad-search-field name="busca" label="Buscar" />
{{-- ERRADO: input nativo reimplementando ícone + botão de limpar --}}
<div style="position:relative;">
<input type="search" name="busca">
<button type="button" onclick="this.previousElementSibling.value=''">x</button>
</div>
{{-- CERTO --}}
<mad-search-field name="busca" label="Buscar" />