mad-sort-list-field
Lista ordenável via drag-and-drop.
Lista ordenavel via drag-and-drop. O usuario reordena (e opcionalmente seleciona) itens, e a ordem e persistida via inputs hidden name[].
Props
| Prop | Tipo | Default | Descricao |
|---|---|---|---|
| name | string | '' | Nome do campo (obrigatorio). Inputs gerados como name[] |
| label | string | '' | Label do campo |
| items | array | [] | Mapa chave => label dos itens disponiveis |
| selected | array/string | [] | Chaves pre-selecionadas/ordenadas (array ou CSV). Aparecem primeiro na ordem informada |
| orientation | string | 'vertical' | vertical ou horizontal |
| limit | int | -1 | Maximo de itens (-1 = sem limite) |
| hint | string | '' | Texto de ajuda |
| error | string | '' | Mensagem de erro |
| required | bool | false | Campo obrigatorio |
| disabled | bool | false | Campo desabilitado (aplica pointer-events:none) |
| width | string | '' | Largura do .mad-field (numero puro = px) |
| max-width | string | '' | Largura maxima do .mad-field |
Itens manuais
@php
$colunas = [
'id' => 'Codigo',
'nome' => 'Nome',
'email' => 'Email',
'fone' => 'Telefone',
];
@endphp
<mad-sort-list-field name="ordem_colunas" label="Ordem das colunas" :items="$colunas" />
Com ordem persistida (selected)
A prop selected define quais itens aparecem primeiro e em que ordem. Os demais entram no fim.
<mad-sort-list-field name="ordem_colunas" label="Ordem das colunas"
:items="$colunas" :selected="['nome', 'email', 'id']" />
Aceita CSV tambem:
<mad-sort-list-field name="ordem" :items="$colunas" selected="nome,email,id" />
Via model (auto-query) — <mad-dbsort-list-field>
Quando os itens vem do banco, use a variante DB em vez de montar o mapa na mao. Ela carrega os itens no render (Eloquent/QuerySource) e renderiza o mesmo visual.
| Prop DB | Default | Descricao |
|---|---|---|
| model | '' | Classe do model Eloquent (obrigatorio sem :query) |
| database | MAIN_DATABASE | Conexao |
| key | 'id' | Campo da PK |
| display | 'nome' | Campo exibido; aceita template {nome} ({codigo}) |
| order-by | display | Campo de ordenacao |
| order | '' | Direcao (asc/desc; valor fora do par cai em asc) |
| filters | [] | Atalho [['campo','op','val'], ...] |
| query | null | Eloquent/Query Builder pronto (alternativa a model + filters) |
As props de lista (name, label, selected, orientation, limit, hint,
error, required, disabled) sao as mesmas do <mad-sort-list-field>.
<mad-dbsort-list-field name="categorias" label="Ordem das categorias"
model="Categoria" display="nome" order-by="ordem"
:filters="[['ativo', '=', '1']]"
:selected="$registro->categorias_ordem ?? []" />
Com itens ja em memoria, o caminho manual continua valendo:
@php
$itens = Categoria::where('ativo', '1')->orderBy('ordem')->get();
$opcoes = [];
foreach ($itens as $c) {
$opcoes[(string) $c->id] = $c->nome;
}
@endphp
<mad-sort-list-field name="categorias" label="Ordem das categorias"
:items="$opcoes" :selected="$registro->categorias_ordem ?? []" />
Horizontal
<mad-sort-list-field name="etapas" label="Etapas do fluxo"
:items="$etapas" orientation="horizontal" />
Com limite
<mad-sort-list-field name="top3" label="Top 3 favoritos"
:items="$opcoes" :limit="3" />
Dentro de formulario
<mad-form submit="onSave">
<mad-sort-list-field name="ordem_campos" label="Ordem dos campos"
:items="$campos" :selected="$config->ordem_campos ?? []" required />
<mad-btn type="submit" variant="primary" icon="save">Salvar</mad-btn>
</mad-form>
public function onSave(): MadResponse
{
$data = $this->form->getData();
// $data->ordem_campos === ['nome', 'email', 'id'] (na ordem do drag)
$config = Config::findOrNew($this->registroId);
$config->ordem_campos = implode(',', (array) $data->ordem_campos);
$config->save();
return (new MadResponse())->toast('Salvo!', 'success')->closeDrawer();
}
NUNCA fazer
{{-- ERRADO: montar lista drag-and-drop manualmente com Sortable.js --}}
<ul id="lista">
@foreach($items as $k => $v)
<li data-key="{{ $k }}">{{ $v }}</li>
@endforeach
</ul>
<script>new Sortable(document.getElementById('lista'), {...});</script>
{{-- CERTO --}}
<mad-sort-list-field name="ordem" :items="$items" />
{{-- ERRADO: usar checkboxes + numero de ordem --}}
@foreach($items as $k => $v)
<input type="checkbox" name="sel[]" value="{{ $k }}">
<input type="number" name="ordem[{{ $k }}]">
@endforeach
{{-- CERTO --}}
<mad-sort-list-field name="ordem" :items="$items" :selected="$selecionados" />
{{-- ERRADO: passar items como lista indexada (perde a chave) --}}
<mad-sort-list-field name="x" :items="['Nome', 'Email']" />
{{-- CERTO: mapa chave => label --}}
<mad-sort-list-field name="x" :items="['nome' => 'Nome', 'email' => 'Email']" />