Implementação
Introdução
Esta feature foi desenvolvida para adicionar um sistema de ordenação aos módulos do painel.
Ela permite tanto ordenações simples, entre registros do mesmo módulo, quanto ordenações complexas, envolvendo relações entre diferentes níveis ou modelos.
Por exemplo, é possível ordenar produtos dentro de uma seção (seção → produto), onde o sistema primeiro filtra os registros pela seção selecionada e, em seguida, aplica a ordenação nos produtos.
Também há suporte para ordenação recursiva dentro da própria model, permitindo cenários em que uma model possui um relacionamento com ela mesma (como um item pai e seus filhos), resultando em uma estrutura de ordenação potencialmente infinita
Configuração no controller
Para habilitar o sistema de ordenação em um módulo, é necessário implementar no controller uma função pública chamada orderConfig()
Essa função é responsável por retornar duas arrays principais que controlam todo o comportamento da ordenação: $generalConfig e $configLevels.
$generalConfig
A array $generalConfig contém configurações gerais da ordenação.
Atualmente, possui apenas uma propriedade possível:
$generalConfig = ['selfGroupedRecords' => false];
| Propriedade | Tipo | Descrição |
|---|---|---|
| selfGroupedRecords | bool | Define se a ordenação será recursiva dentro do mesmo módulo (por exemplo, quando um registro pode ter outro como “pai”). |
$configLevels
A array $configLevels é onde é definida toda a lógica de ordenação.
Cada item dentro dela representa um nível de ordenação — ou seja:
-
Se for uma ordenação simples (sem níveis adicionais ou recursivos), haverá apenas um nível.
-
Se for uma ordenação hierárquica (por exemplo, seção → produto), haverá um nível para cada relação.
💡 Observações:
- A ordem dos itens na array define a hierarquia dos níveis.
O primeiro item representa o primeiro nível da ordenação, o segundo item o segundo nível, e assim por diante. - A chave de cada nível deve ser um identificador em camelCase, de preferência o nome do módulo.
Cada nível da configuração deve conter as seguintes propriedades:
$configLevels = [
'levelOne' => [
'label' => 'Nivel 1',
'model' => SubmodulesTest::class,
'sortable' => true,
'labelBtnNextLevel' => 'Ordernar itens do nível 1',
'breadcrumbColumnName' => 'name',
'order' => ['column' => 'order', 'type' => 'ASC'],
'AdditionalQuery' => function ($q) { $q->where('id', 1); },
'columnsToList' => [
[
'name' => 'active',
'label' => 'Status'
],
[
'name' => 'id',
'label' => '#'
],
[
'name' => 'name',
'label' => 'Título'
],
],
],
'levelTwo' => [
'label' => 'Nivel 2',
'model' => NivelDoi::class,
'sortable' => true,
'order' => ['column' => 'order', 'type' => 'ASC'],
'breadcrumbColumnName' => 'name',
'columnsToList' => [
[
'name' => 'active',
'label' => 'Status'
],
[
'name' => 'id',
'label' => '#'
],
[
'name' => 'name',
'label' => 'Título'
],
],
],
// Adicione mais níveis aqui, se necessário
];
| Propriedade | Tipo | Descrição |
|---|---|---|
| label | string | Nome descritivo do nível. |
| model | Model | Instância da model correspondente ao nível. |
| sortable | bool | Define se o nível atual pode ser ordenado (true / false). |
| labelBtnNextLevel |
string (opcional) |
Texto exibido no botão que permite avançar para o próximo nível. |
| breadcrumbColumnName | string | Coluna usada para exibir o nome no breadcrumb. |
| order | array | Define a ordenação padrão da listagem (['column' => 'id', 'type' => 'asc']). |
| columnToList | array | Define as colunas exibidas na listagem de ordenação. Cada item deve conter name (coluna no banco) e label (rótulo exibido no frontend). |
| additionalQuery |
closure (opcional) |
Permite aplicar filtros adicionais na query de listagem. |
public function orderConfig()
{
$generalConfig = ['selfGroupedRecords' => false];
$configLevels = [
'author' => [
'label' => 'Autores',
'model' => Author::class,
'sortable' => true,
'order' => ['column' => 'order', 'type' => 'ASC'],
'breadcrumbColumnName' => 'title',
'columnsToList' => [
[
'name' => 'active',
'label' => 'Status'
],
[
'name' => 'id',
'label' => '#'
],
[
'name' => 'name',
'label' => 'Título'
],
],
],
// Adicione mais níveis aqui, se necessário
];
return ['generalConfig' => $generalConfig, 'configLevels' => $configLevels];
}