Panel

El panel del admin

La parte visual de la administración en Filament se centra en uno o varios paneles, que son el núcleo desde donde un administrador o los roles autorizados pueden ver y gestionar los recursos de la aplicación.

Cuando instalamos Filament, se crea automáticamente un panel de administración por defecto, al cual se accede directamente desde la URL:

1
/admin

Además de este panel inicial, se pueden crear más paneles según las necesidades del proyecto.
Por ejemplo:

  • Un panel para administradores internos (/admin).
  • Un panel separado para clientes o usuarios externos (/client).
  • Incluso un panel para profesores y otro para estudiantes en una plataforma educativa.

Sin embargo, en muchos casos un único panel es suficiente para centralizar toda la gestión.
Dentro de cada panel se pueden añadir y organizar diferentes elementos que Filament pone a disposición, como:

  • Widgets para mostrar gráficos, estadísticas y métricas.
  • Recursos (Resources) para gestionar modelos de base de datos con formularios y tablas.
  • Clusters para agrupar secciones de administración.
  • Pages para pantallas personalizadas.
  • Navegación configurable para organizar menús y accesos.

En resumen, el panel es el punto de entrada y la interfaz principal de Filament para administrar y visualizar recursos de la aplicación de manera estructurada y personalizable.


Ejemplo mínimo de PanelProvider

Un ejemplo básico de cómo definir un panel de administración en Filament mediante un AdminPanelProvider.
En este archivo se configura el ID del panel, la ruta de acceso (/admin) y los métodos discover... para cargar automáticamente recursos, páginas y widgets:

<?php

namespace App\Providers\Filament;

use Filament\Panel;
use Filament\PanelProvider;

class AdminPanelProvider extends PanelProvider
{
    public function panel(Panel $panel): Panel
    {
        return $panel
            ->default() // Define este panel como el principal
            ->id('admin') // Identificador único del panel
            ->path('admin') // Ruta de acceso al panel (/admin)
            ->discoverResources(
                in: app_path('Filament/Resources'),
                for: 'App\\Filament\\Resources'
            )
            ->discoverPages(
                in: app_path('Filament/Pages'),
                for: 'App\\Filament\\Pages'
            )
            ->discoverWidgets(
                in: app_path('Filament/Widgets'),
                for: 'App\\Filament\\Widgets'
            );
    }
}

Ejemplo con múltiples paneles

Filament permite tener varios paneles en la misma aplicación.
Esto resulta útil cuando distintos tipos de usuarios necesitan interfaces separadas.
Por ejemplo:

  • Un panel de administración (/admin) para gestionar todos los recursos.
  • Un panel de clientes (/client) con acceso restringido a ciertos recursos o páginas.
<?php

namespace App\Providers\Filament;

use Filament\Panel;
use Filament\PanelProvider;

class AdminPanelProvider extends PanelProvider
{
    public function panel(Panel $panel): Panel
    {
        return $panel
            ->default()
            ->id('admin')
            ->path('admin')
            ->discoverResources(
                in: app_path('Filament/Admin/Resources'),
                for: 'App\\Filament\\Admin\\Resources'
            )
            ->discoverPages(
                in: app_path('Filament/Admin/Pages'),
                for: 'App\\Filament\\Admin\\Pages'
            );
    }
}

class ClientPanelProvider extends PanelProvider
{
    public function panel(Panel $panel): Panel
    {
        return $panel
            ->id('client')
            ->path('client')
            ->discoverResources(
                in: app_path('Filament/Client/Resources'),
                for: 'App\\Filament\\Client\\Resources'
            )
            ->discoverPages(
                in: app_path('Filament/Client/Pages'),
                for: 'App\\Filament\\Client\\Pages'
            );
    }
}

En este caso:

  • El panel admin se accede desde /admin.
  • El panel cliente se accede desde /client.

Cada uno carga sus propios Resources, Pages y Widgets según la carpeta y namespace definidos.


Configurar el path de Filament en el panel

Cuando instalamos Filament 4, automáticamente se crea un provider en
app/Providers/Filament/AdminPanelProvider.php .

Este archivo define las rutas, el nombre del panel, colores y la URL base donde se monta el panel de administración.

Dentro del método panel() encontramos la definición:

use Filament\Panel;
use Filament\PanelProvider;

class AdminPanelProvider extends PanelProvider
{
    public function panel(Panel $panel): Panel
    {
        return $panel
            ->id('admin')
            ->path('admin') // Aquí definimos el path base
            ->login()
            ->colors([
                'primary' => '#4f46e5',
            ]);
    }
}

En este ejemplo, el panel está disponible en la URL:

http://tusitio.com/admin

Si modificamos ->path(‘admin’) a ->path(‘dashboard’) , el panel pasará a estar en:

http://tusitio.com/dashboard

Cambiar la página inicial del panel

Por defecto, cuando accedemos a /admin , Filament muestra su página Dashboard.
Si queremos que cargue una página personalizada (por ejemplo, AdminHome), tenemos que crearla primero:

namespace App\Filament\Pages;

use Filament\Pages\Page;

class AdminHome extends Page
{
    protected static ?string $navigationIcon = 'heroicon-o-home';
    protected static string $view = 'filament.pages.admin-home';
    protected static ?string $title = 'Inicio del panel';
    protected static ?string $navigationLabel = 'Inicio';
}

Y su vista Blade:

<x-filament-panels::page>
    <h1 class="text-2xl font-bold">¡Bienvenido, {{ auth()->user()->name }}!</h1>
    <p class="text-gray-500">Este es tu panel de administración.</p>
</x-filament-panels::page>

Luego, en el AdminPanelProvider , añadimos:

->homeUrl(fn () => route('filament.admin.pages.admin-home'))

De esta forma, cuando un usuario entre a /admin , la página que verá primero será AdminHome y no el Dashboard por defecto.


Resumen

  • El path del panel se define con ->path(‘admin’) .
  • La página inicial se puede personalizar con ->homeUrl() .
  • Filament carga sus rutas automáticamente, no hace falta definirlas en web.php .

1 - Navegación

Navegación en el panel

En el panel de administración de Filament, la navegación es el conjunto de menús y botones que nos permiten acceder a los recursos, páginas o clústeres que hemos creado.

Filament nos permite organizar y personalizar cómo se muestran estos elementos en el panel.


Agrupar recursos con $navigationGroup

La forma más sencilla de agrupar recursos es mediante el atributo:

protected static ?string $navigationGroup = 'Usuarios';

O bien, con un método dinámico que incluso se puede traducir:

public static function getNavigationGroup(): ?string
{
return __('Gestión de Datos');
}

De esta forma, los recursos aparecen agrupados en el menú lateral bajo la etiqueta indicada.


Uso de Clusters

A partir de Filament 4 existe una forma más avanzada de organizar la navegación: los Clusters.

Un Cluster es un módulo separado dentro del panel, que agrupa varios recursos y páginas bajo un mismo menú principal.
Se diferencia de $navigationGroup porque:

  • $navigationGroup solo organiza visualmente recursos dentro del mismo panel.
  • Un Cluster crea un espacio modular independiente, ideal cuando se tienen varios conjuntos grandes de recursos (ej: Usuarios, Pedidos, Configuración).
  • Permite añadir recursos, páginas e incluso dashboards personalizados dentro del mismo módulo.

Ejemplo de Cluster:

class UserCluster extends Cluster
{
protected static ?string $navigationIcon = 'heroicon-o-users';
protected static ?string $navigationLabel = 'Usuarios';
}

Y en un recurso dentro de ese clúster:

protected static ?string $cluster = \App\Filament\Clusters\UserCluster::class;

Convención recomendada:

  • Nombre de la clase en inglés, singular y terminado en Cluster (ej: UserCluster).
  • Etiqueta visible traducida (Usuarios).

Personalización de la navegación

Cada recurso o cluster puede modificar cómo aparece en el menú con varios atributos:

  • Icono del recurso

    protected static ?string $navigationIcon = 'heroicon-o-user';

  • Etiqueta personalizada

    protected static ?string $navigationLabel = 'Estudiantes';

  • Orden dentro del menú

    protected static ?int $navigationSort = 1;

  • Control de visibilidad

    public static function canViewNavigation(): bool
    {
    return auth()->user()->hasRole('admin');
    }


Posición de la navegación en el panel

En el AdminPanelProvider, podemos decidir dónde se ubica el menú de navegación:

  • Menú lateral izquierdo (por defecto):
$panel->sidebarCollapsibleOnDesktop();
  • Menú lateral derecho:
$panel->sidebarPosition('right');
  • Navegación en la parte superior (horizontal):
$panel->topNavigation();

Resumen

  • $navigationGroup → agrupa recursos dentro de la misma navegación.
  • Clusters → crean módulos separados, más potentes para grandes aplicaciones.
  • Atributos útiles:
    • navigationIcon, navigationLabel, navigationSort, canViewNavigation.
  • Posición del menú:
    • Lateral izquierdo (default).
    • Lateral derecho (sidebarPosition('right')).
    • Superior horizontal (topNavigation()).

De esta manera podemos construir una navegación organizada, modular y adaptable a las necesidades de cada proyecto en Filament.

Diferencias principales

  • $navigationGroup

    • Agrupa solo a nivel visual.
    • Todos los recursos conviven en el mismo “espacio”.
    • Menú más sencillo, útil para proyectos pequeños/medianos.
  • Cluster

    • Crea módulos separados con sus propios recursos y páginas.
    • Útil para proyectos grandes con muchas secciones.
    • Más escalable y organizado, similar a módulos de un CMS.