mad-pagination
Paginação standalone para listagens custom.
Componente de paginacao standalone para listagens custom (cards, timelines, grids manuais). Renderiza botoes prev/next + numeros com janela e ellipsis.
MadDataGrid ja tem paginacao embutida
Se voce esta usando <mad-grid self> (MadDataGrid), NAO use este componente. O grid ja tem paginacao no footer controlada pela prop $perPage e pelo state interno.
Use <mad-pagination> apenas em listagens custom onde voce monta o HTML manualmente (ex: galeria de cards, lista de posts, timeline paginada).
Props
| Prop | Tipo | Default | Descricao |
|---|---|---|---|
| page | int | 1 | Pagina atual (1-based) |
| total | int | 1 | Numero total de paginas |
| window | int | 2 | Quantidade de paginas visiveis ao redor da atual |
| class | string | '' | Classes CSS extras |
Ao clicar num botao, chama madPaginate(n) (funcao global JS) — voce precisa definir essa funcao ou substituir o slot.
Uso basico
<mad-pagination :page="$pagina" :total="$totalPaginas" />
Com janela maior
{{-- Mostra 5 paginas ao redor da atual --}}
<mad-pagination :page="$pagina" :total="$totalPaginas" :window="5" />
Em listagem custom com mad:click
Como o componente usa onclick="madPaginate(n)", voce precisa de um handler global. Para integrar com MadComponent, defina window.madPaginate no Blade:
@php
$perPage = 12;
$pagina = $pagina ?? 1;
$paginator = Produto::orderBy('nome')->paginate($perPage, ['*'], 'page', $pagina);
$items = $paginator->items();
$total = $paginator->lastPage();
@endphp
<div style="display:grid;grid-template-columns:repeat(4,1fr);gap:16px;">
@foreach($items as $p)
<mad-card>
<h3>{{ $p->nome }}</h3>
</mad-card>
@endforeach
</div>
<mad-pagination :page="$pagina" :total="$total" />
<script>
window.madPaginate = function (n) {
Mad.call('onPaginate', { pagina: n });
};
</script>
public int $pagina = 1;
public function onPaginate(int $pagina): void
{
$this->pagina = $pagina;
}
Slot custom (substitui o conteudo todo)
Quando precisa de botoes diferentes (ex: "Anterior" / "Proximo" com texto), passe conteudo no slot:
<mad-pagination :page="$pagina" :total="$total">
<mad-btn variant="ghost" icon="chevron-left"
:disabled="$pagina <= 1"
:attrs="'onclick=madPaginate(' . ($pagina - 1) . ')'">
Anterior
</mad-btn>
<span style="padding:0 12px;">Pagina {{ $pagina }} de {{ $total }}</span>
<mad-btn variant="ghost" icon-end="chevron-right"
:disabled="$pagina >= $total"
:attrs="'onclick=madPaginate(' . ($pagina + 1) . ')'">
Proximo
</mad-btn>
</mad-pagination>
Resumo de decisao
| Cenario | Usar |
|---|---|
| Listagem padrao com tabela | <mad-grid self> (MadDataGrid — paginacao automatica) |
| Galeria de cards / timeline / lista custom | <mad-pagination> + handler madPaginate |
| Botoes prev/next sem numeros | <mad-pagination> com slot custom |
| Infinite scroll | NAO usar — implementar com mad:click="onLoadMore" em <mad-btn> |
NUNCA fazer
{{-- ERRADO: usar <mad-pagination> dentro de listagem com MadDataGrid --}}
<mad-grid self per-page="15">
<mad-columns>...</mad-columns>
</mad-grid>
<mad-pagination :page="$pagina" :total="$total" />
{{-- CERTO: o MadDataGrid ja tem paginacao no footer --}}
<mad-grid self per-page="15">
<mad-columns>...</mad-columns>
</mad-grid>
{{-- ERRADO: montar paginacao manual com HTML --}}
<ul class="pagination">
<li><a href="?page=1">1</a></li>
<li><a href="?page=2">2</a></li>
</ul>
{{-- CERTO --}}
<mad-pagination :page="$pagina" :total="$total" />
{{-- ERRADO: esquecer de definir window.madPaginate em listagens custom --}}
<mad-pagination :page="$p" :total="$t" />
{{-- → clique nos botoes lanca "madPaginate is not defined" --}}
{{-- CERTO: definir o handler --}}
<mad-pagination :page="$p" :total="$t" />
<script>window.madPaginate = function(n) { Mad.call('onPaginate', { pagina: n }); };</script>
{{-- ERRADO: calcular paginas manualmente em vez de usar o paginator do Laravel --}}
@php $total = (int) ceil(Produto::count() / $perPage); @endphp
{{-- CERTO: LengthAwarePaginator ja calcula lastPage() --}}
@php $total = Produto::paginate($perPage)->lastPage(); @endphp