Campos de formulário
mad-select-field com options fixas (:items).
Options fixas via :items — sem ida ao banco (compare com mad-dbselect-field no grupo DB).
<mad-select-field name="prioridade" label="Prioridade" placeholder="Selecione..."
:items="['baixa' => 'Baixa', 'media' => 'Média', 'alta' => 'Alta', 'critica' => 'Crítica']"
hint="Options fixas via :items — sem ida ao banco (compare com mad-dbselect-field no grupo DB)." />
mad-radio-field inline e na variante as=button (toggle segmentado).
inline deixa as opções lado a lado.
as=button vira um toggle segmentado, visual de mad-segmented.
<mad-form-grid :cols="2">
<mad-radio-field name="tipo_pessoa" label="Tipo de pessoa" inline
:options="['F' => 'Física', 'J' => 'Jurídica']"
hint="inline deixa as opções lado a lado." />
<mad-radio-field name="periodo" label="Período" as="button"
:options="['dia' => 'Dia', 'sem' => 'Semana', 'mes' => 'Mês']"
hint="as=button vira um toggle segmentado, visual de mad-segmented." />
</mad-form-grid>
mad-checkbox-field (booleano simples) e mad-switch-field (toggle) lado a lado.
Boolean simples — marca ou desmarca (value/value-off default 1/0).
Mesma ideia do checkbox, em visual de toggle on/off.
<mad-form-grid :cols="2">
<mad-checkbox-field name="aceite_termos" label="Aceito os termos de uso"
hint="Boolean simples — marca ou desmarca (value/value-off default 1/0)." />
<mad-switch-field name="notificacoes" label="Receber notificações" variant="primary"
hint="Mesma ideia do checkbox, em visual de toggle on/off." />
</mad-form-grid>
mad-checkbox-group-field com várias opções fixas marcáveis ao mesmo tempo.
Várias opções fixas marcáveis ao mesmo tempo — layout=horizontal alinha lado a lado.
<mad-checkbox-group-field name="permissoes" label="Permissões" layout="horizontal"
:options="['read' => 'Ler', 'write' => 'Escrever', 'delete' => 'Excluir', 'export' => 'Exportar']"
hint="Várias opções fixas marcáveis ao mesmo tempo — layout=horizontal alinha lado a lado." />
mad-select-check-field: multi-seleção compacta com contador '+X itens'.
mode=comma (padrão): control compacto mostra os N primeiros + '+X itens' (max-display=2 aqui).
<mad-select-check-field name="categorias_interesse" label="Categorias de interesse"
:options="['eletronicos' => 'Eletrônicos', 'papelaria' => 'Papelaria', 'moveis' => 'Móveis', 'vestuario' => 'Vestuário', 'alimentos' => 'Alimentos', 'ferramentas' => 'Ferramentas']"
:selected="['eletronicos', 'papelaria']"
:max-display="2"
hint="mode=comma (padrão): control compacto mostra os N primeiros + '+X itens' (max-display=2 aqui)." />
mad-sort-list-field: arraste para reordenar.
Arraste para reordenar. :items aqui é um mapa chave => rótulo — diferente do formato de linhas do mad-checklist-field abaixo.
<mad-sort-list-field name="ordem_etapas" label="Ordem das etapas do pedido"
:items="['recebido' => 'Recebido', 'separacao' => 'Em separação', 'enviado' => 'Enviado', 'entregue' => 'Entregue']"
:selected="['recebido', 'separacao', 'enviado', 'entregue']"
hint="Arraste para reordenar. :items aqui é um mapa chave => rótulo — diferente do formato de linhas do mad-checklist-field abaixo." />
mad-checklist-field: lista com busca, contador e colunas customizadas (mad-col).
| Categoria | Departamento | |
|---|---|---|
| Nenhum item | ||
items é uma LISTA DE LINHAS (cada uma precisa de 'id') — as colunas vêm dos mad-col filhos, com busca e contador prontos.
@php
// GOTCHA do compilador: <mad-checklist-field> com filhos <mad-col> passa
// por uma extração via regex que corta a tag no PRIMEIRO ">" que encontrar
// — inclusive o "=>" de um array PHP escrito inline em :items="[...]".
// Por isso os itens vêm de uma variável (:items="$tutorSelecaoCategorias"),
// sem nenhum "=>" na lista de atributos da tag.
$tutorSelecaoCategorias = [
['id' => 1, 'nome' => 'Eletrônicos', 'depto' => 'Bens duráveis'],
['id' => 2, 'nome' => 'Papelaria', 'depto' => 'Consumo'],
['id' => 3, 'nome' => 'Móveis', 'depto' => 'Bens duráveis'],
['id' => 4, 'nome' => 'Vestuário', 'depto' => 'Consumo'],
['id' => 5, 'nome' => 'Ferramentas', 'depto' => 'Bens duráveis'],
];
@endphp
<mad-checklist-field name="categorias_check" label="Categorias favoritas" height="220px"
:items="$tutorSelecaoCategorias" :selected="['1', '3']"
hint="items é uma LISTA DE LINHAS (cada uma precisa de 'id') — as colunas vêm dos mad-col filhos, com busca e contador prontos.">
<mad-col field="nome" label="Categoria" />
<mad-col field="depto" label="Departamento" />
</mad-checklist-field>
mad-form com submit real — dispara TutorFormsSelecao::onSubmitDemo.
<mad-form submit="onSubmitDemo">
<mad-form-grid :cols="2">
<mad-select-field name="prioridade_wire" label="Prioridade"
:items="['baixa' => 'Baixa', 'alta' => 'Alta']" required />
<mad-switch-field name="urgente_wire" label="Marcar como urgente" />
</mad-form-grid>
<mad-form-actions align="right">
<mad-btn type="submit" variant="primary" icon="send">Enviar (onSubmitDemo)</mad-btn>
</mad-form-actions>
</mad-form>
/**
* Submit do exemplo "Ação wire" — lê $this->form->getData() e devolve um
* toast com o payload recebido (arrays de multi-seleção viram "a+b").
*/
public function onSubmitDemo(): MadResponse
{
$data = $this->form->getData();
$preenchidos = [];
foreach ((array) $data as $campo => $valor) {
if (is_array($valor)) {
$valor = implode('+', $valor);
}
$valor = trim((string) $valor);
if ($valor !== '') {
$preenchidos[] = "{$campo}={$valor}";
}
}
$resumo = $preenchidos !== [] ? implode(' | ', $preenchidos) : 'nenhum campo preenchido';
return (new MadResponse())
->toast("Form recebido: {$resumo}", 'success', 'onSubmitDemo');
}
Código-fonte completo da página
<?php
namespace App\Control\Tutor;
use App\Support\Tutor\TutorPage;
use Mad\Form\MadForm;
use Mad\Http\MadResponse;
/**
* TutorFormsSelecao — página "Seleção" do catálogo (grupo forms).
*
* Cobre os 8 campos de seleção do catálogo: mad-select-field, mad-radio-field,
* mad-checkbox-field, mad-checkbox-group-field, mad-switch-field,
* mad-select-check-field, mad-sort-list-field e mad-checklist-field.
*/
class TutorFormsSelecao extends TutorPage
{
protected string $catalogKey = 'forms_selecao';
public MadForm $form;
public function mount(array $params = []): void
{
$this->form = new MadForm('tutor_forms_selecao');
}
/**
* Submit do exemplo "Ação wire" — lê $this->form->getData() e devolve um
* toast com o payload recebido (arrays de multi-seleção viram "a+b").
*/
public function onSubmitDemo(): MadResponse
{
$data = $this->form->getData();
$preenchidos = [];
foreach ((array) $data as $campo => $valor) {
if (is_array($valor)) {
$valor = implode('+', $valor);
}
$valor = trim((string) $valor);
if ($valor !== '') {
$preenchidos[] = "{$campo}={$valor}";
}
}
$resumo = $preenchidos !== [] ? implode(' | ', $preenchidos) : 'nenhum campo preenchido';
return (new MadResponse())
->toast("Form recebido: {$resumo}", 'success', 'onSubmitDemo');
}
}
<x-tutor-page page="forms_selecao">
<x-tutor-demo demo="tutor.examples.forms-selecao.select"
title="Select" desc="mad-select-field com options fixas (:items)." />
<x-tutor-demo demo="tutor.examples.forms-selecao.radio"
title="Radio" desc="mad-radio-field inline e na variante as=button (toggle segmentado)." />
<x-tutor-demo demo="tutor.examples.forms-selecao.checkbox-switch"
title="Checkbox + Switch" desc="mad-checkbox-field (booleano simples) e mad-switch-field (toggle) lado a lado." />
<x-tutor-demo demo="tutor.examples.forms-selecao.checkbox-group"
title="Grupo de checkboxes" desc="mad-checkbox-group-field com várias opções fixas marcáveis ao mesmo tempo." />
<x-tutor-demo demo="tutor.examples.forms-selecao.select-check"
title="Select com checkboxes" desc="mad-select-check-field: multi-seleção compacta com contador '+X itens'." />
<x-tutor-demo demo="tutor.examples.forms-selecao.sort-list"
title="Lista ordenável" desc="mad-sort-list-field: arraste para reordenar." />
<x-tutor-demo demo="tutor.examples.forms-selecao.checklist"
title="Checklist com colunas" desc="mad-checklist-field: lista com busca, contador e colunas customizadas (mad-col)." />
<x-tutor-demo demo="tutor.examples.forms-selecao.wire-submit"
title="Ação wire" desc="mad-form com submit real — dispara TutorFormsSelecao::onSubmitDemo."
php="TutorFormsSelecao::onSubmitDemo" />
</x-tutor-page>