mad-select-check-field
Multi-select com checkboxes no dropdown.
Multi-select com checkboxes no dropdown e display condensado no control (Item1, Item2, Item3 +4 itens).
Visual esperado
| Estado | Aparencia |
|---|---|
| Dropdown aberto | Cada option renderizada como checkbox (modo check do widget MAD Select, ativado via data-mad-selectcheck). Usuario marca/desmarca multiplos. |
| Control fechado | Uma linha compacta: Item1, Item2, Item3 +4 itens |
Diferente do <mad-multi-search-field> que mostra chips individuais com botao remove.
Diferenca entre as duas variantes
<mad-select-check-field> |
<mad-dbselect-check-field> |
|
|---|---|---|
| Origem das options | :options array PHP |
Auto-query Eloquent (render-time) |
| Quando usar | Enum, lista hardcoded | Lista do banco (pequena/media) |
Para listas grandes com busca AJAX, usar <mad-dbmulti-search-field>.
<mad-select-check-field> — Options manuais
Props
| Prop | Tipo | Default | Descricao |
|---|---|---|---|
| name | string | '' | Nome do campo (obrigatorio, envia como name[]) |
| label | string | '' | Label do campo |
| options | array | [] | Mapa [valor => label] |
| selected | array/string | [] | IDs pre-selecionados (aceita array ou CSV) |
| max-display | int | 3 | Itens visiveis no control antes do +X itens |
| placeholder | string | 'Selecione...' | Placeholder |
| max-size | int | 0 | Maximo de selecoes (0 = ilimitado) |
| mode | string | 'comma' | comma ou table |
| pivot-model | string | '' | Model Eloquent da pivot (mode=table) |
| foreign-key | string | '' | FK do pai (mode=table) |
| item-key | string | '' | FK do item (mode=table) |
| database | string | MAIN_DATABASE | Conexao da pivot |
| hint | string | '' | Texto de ajuda |
| error | string | '' | Mensagem de erro |
| required | bool | false | |
| disabled | bool | false | |
| attrs | string | '' | Attrs extras |
| id | string | auto | ID do <select> (default gerado: mad_<name>_<random>) |
Uso basico
@php
$frutas = ['maca' => 'Maçã', 'banana' => 'Banana', 'uva' => 'Uva', 'manga' => 'Manga'];
@endphp
<mad-select-check-field name="frutas" label="Frutas favoritas" :options="$frutas" />
Com max-display customizado
<mad-select-check-field name="permissoes" label="Permissoes"
:options="$permissoes" max-display="2"
:selected="['read', 'write', 'delete']" />
{{-- Aparece: "Ler, Escrever +1 item" --}}
Com limite de selecoes
<mad-select-check-field name="tags" label="Ate 5 tags"
:options="$tagOptions" max-size="5" />
<mad-dbselect-check-field> — Auto-query do banco
Props DB (alem das props do select-check)
| Prop | Tipo | Default | Descricao |
|---|---|---|---|
| model | string | '' | Classe do model Eloquent (obrigatorio) |
| database | string | MAIN_DATABASE | Conexao |
| key | string | 'id' | Campo PK |
| display | string | 'nome' | Campo de exibicao. Aceita template {nome} ({sigla}) |
| order-by | string | '' | Ordenacao SQL |
| query | Builder | null | Eloquent/Query Builder pronto (prioridade sobre model) |
| filters | array | [] | Atalho [['campo','op','val'], ...] — vira query internamente |
Uso basico
<mad-dbselect-check-field name="categorias" label="Categorias"
model="Categoria" display="nome" order-by="nome" />
Com filtros e template
<mad-dbselect-check-field name="tipos" label="Tipos ativos"
model="TipoProduto" display="{nome} (#{id})"
:filters="[['ativo', '=', 'T']]" order-by="nome" />
Com query Eloquent (filtro avancado)
Para condicoes que filters nao cobre (joins, orWhere, escopos do model), passe um Builder pronto via :query — ele tem prioridade sobre model:
<mad-dbselect-check-field name="categorias" label="Categorias"
:query="Categoria::query()->where('ativo', true)->orderBy('nome')"
display="nome" />
Mode table (pivot 1:N)
Persistencia automatica via form->save($parent) — mesmo padrao do <mad-multi-search-field mode="table">.
<mad-dbselect-check-field name="categorias" label="Categorias do produto"
model="Categoria" display="nome"
mode="table"
pivot-model="ProdutoCategoria"
foreign-key="produto_id"
item-key="categoria_id" />
public function onSave(): MadResponse
{
$produto = Produto::findOrNew($this->registroId);
$this->form->save($produto); // cuida das categorias automaticamente
return MadToast::success('Salvo!');
}
Comparacao com outros multi-selects
| Cenario | Componente |
|---|---|
| Chips visuais (poucos itens, remove individual) | <mad-multi-search-field> |
| Linha compacta "+X itens" (options em memoria) | <mad-select-check-field> |
| Linha compacta "+X itens" (do banco) | <mad-dbselect-check-field> |
| Checkboxes verticais em lista | <mad-checkbox-group-field> / <mad-dbcheckbox-group-field> |
| Lista grande (200+) com busca AJAX | <mad-dbmulti-search-field> |
| Busca com modal grid + paginacao | <mad-seek> (multi) |
Arquitetura
- Widget proprietario MAD Select (componente Alpine.js
madSelect(), definido emmad-ui.js) em modocheck— ativado pelo atributodata-mad-selectcheckno<select multiple>nativo (classesmad-input mad-bscno select original) - O
<select>nativo continua sendo a unica fonte de verdade (options/selected); o Alpine so projeta a UI por cima dele (_madCreateSelectmove o select pra dentro de um wrapper.mad-sele monta o control/dropdown) - No modo
check, cada<option>vira um<li class="mad-sel-option">com<input type="checkbox" class="mad-sel-checkbox">dentro do dropdown - Control fechado mostra
summaryText(): junta os primeirosmax-displayitems com,e acrescenta+X item(s)quando sobram mais selecionados que o limite - Marcar uma option no modo
checknao fecha o dropdown (só o modo single fecha após selecionar) — permite marcar varias seguidas - Items ja selecionados continuam visiveis no dropdown no modo
check(o filtro que some com os ja selecionados em outros modos multi não se aplica aocheck) - Registra como
'multi-search'noMadFormRegistry→ compartilha persistencia mode comma/table com o multi-search-field
JS
Inicializacao via _madInitSelectCheck(root) (definida em assets/builder-ui/mad-ui.js, que delega pra _madCreateSelect). Chamada em:
DOMContentLoaded- Apos abrir modal/drawer ou processar resposta com wrapper modal/drawer (
mad.js) - Apos abrir o popover de filtro do grid (
_madPositionFilterPopover)
CSS
Classes do wrapper gerado pelo MAD Select (.mad-sel-* — o <select> original some dentro como .mad-sel-native):
.mad-sel-control— control visivel que substitui o<select>na tela.mad-sel-summary— texto condensado exibido quando o dropdown esta fechado (gerado porsummaryText()).mad-sel-dropdown— dropdown teleportado pro<body>(escapa de containers comoverflow:auto).mad-sel-option— cada linha do dropdown;.mad-sel-checkboxé o checkbox renderizado dentro dela no modocheck
NUNCA fazer
{{-- ERRADO: select nativo multiple para multi-selecao com muitas opcoes --}}
<select name="frutas[]" multiple>
@foreach($frutas as $v => $l)<option value="{{ $v }}">{{ $l }}</option>@endforeach
</select>
{{-- CERTO --}}
<mad-select-check-field name="frutas" :options="$frutas" />
{{-- ERRADO: usar multi-search quando quer linha compacta com "+X itens" --}}
<mad-multi-search-field name="frutas" :options="$frutas" />
{{-- Mostra chips individuais --}}
{{-- CERTO: select-check tem linha condensada --}}
<mad-select-check-field name="frutas" :options="$frutas" />
{{-- ERRADO: options carregadas manualmente no controller quando dbselect-check resolve --}}
@php $cats = Categoria::pluck('nome', 'id')->all(); @endphp
<mad-select-check-field name="cats" :options="$cats" />
{{-- CERTO: dbselect-check carrega sozinho --}}
<mad-dbselect-check-field name="cats" model="Categoria" display="nome" />
{{-- ERRADO: montar o select multiplo na mao e inicializar o widget via JS --}}
<select id="x" multiple data-mad-selectcheck></select>
<script>_madInitSelectCheck(document.body);</script>
{{-- CERTO --}}
<mad-select-check-field name="x" :options="$opts" />
No-results create + quick register
Ambos <mad-select-check-field> e <mad-dbselect-check-field> aceitam as
props de no-results (mesma API de todos os selects MAD que usam o widget MAD
Select — ver dbcombo-rules.md para detalhes):
| Prop | Default |
|---|---|
no-results-create-action |
'' |
no-results-create-label |
'Cadastrar novo' |
no-results-create-icon |
'plus' |
no-results-create-class |
'mad-btn mad-btn-primary mad-btn-sm' |
no-results-quick-register-action |
'' |
no-results-quick-register-label |
'Adicionar' |
no-results-quick-register-icon |
'check' |
no-results-quick-register-class |
'mad-btn mad-btn-success mad-btn-sm' |
no-results-message |
'' |
<mad-dbselect-check-field name="categorias" label="Categorias"
model="Categoria" display="nome"
no-results-create-action="CategoriaForm::show"
no-results-quick-register-action="CategoriaForm::quickRegister" />