Saltar al contenido
Curso escrito

Dashboard con Filament 5: widgets, gráficos y PDF

Un dashboard de Filament 5 con KPIs, gráficos de Chart.js y filtro de periodo que se exporta a un PDF decente con spatie/laravel-pdf y DomPDF, con el código en piezas pequeñas y testeadas.

Laravel13 PHP8.5 Laravel Sail1.68 Filament5 Livewire4 Tailwind CSS4 Chart.js4 spatie/laravel-pdf2 DomPDF3 Pest5 Laravel Pint1.32 Larastan3.12
Lecciones
14
Lectura
273 min
Nivel
Intermedio
Actualizado
dashboard-filament-pdf · proyecto final
Archivos
.env.example L2
.gitignore L10
app/Enums/
OrderStatus.php L3
SalesChannel.php L3
+64 archivos más
Lecciones
  1. 01 Dashboard en Filament 5 sin plugins: qué vamos a construir y por qué no usar ApexCharts
  2. 02 Instalar Filament 5 en Laravel 13 con Sail, Pest, Pint y Larastan
  3. 03 Datos para el dashboard: modelos, factories y un seeder con 13 meses de pedidos
  4. 04 Comparar periodos en Laravel: la clase Period con Carbon y sus tests
+10 lecciones más

Hola, bienvenido. Empezamos un nuevo curso en CursosDesarrolloWeb.es, y en este curso vamos a construir un dashboard con Filament 5 que no se parezca al de la documentación, y a exportarlo a un PDF que se pueda enviar a un cliente, con los gráficos dentro y usando solo PHP en el servidor.

Imagina que tienes un panel de administración hecho con Filament para una tienda y el cliente te pide 2 cosas. La primera, ver cómo va el negocio nada más entrar: ingresos, pedidos, ticket medio y clientes nuevos, cómo ha ido todo respecto al periodo anterior y qué productos se venden más. La segunda, que todo eso se lo puedas mandar en un PDF a final de mes. La primera la resuelves a medias con los widgets que trae Filament, porque los de estadísticas dan poco juego y los gráficos salen con el aspecto por defecto de Chart.js. La segunda es más complicada: DomPDF no ejecuta JavaScript, así que los gráficos no aparecen, y no entiende flexbox ni grid, así que el layout del panel se deshace. La salida habitual es instalar plugins, y con ellos entran dependencias que no controlas y, en el caso de ApexCharts, una licencia que ya no es MIT.

En este curso lo resolvemos con lo que Filament y Laravel ya traen, y de paso hacemos algo que casi nadie hace en Filament: repartir el código del dashboard en piezas pequeñas con sus tests, en lugar de un widget gigante que consulta, calcula y pinta.

¿Qué vamos a construir?

dashboard-pdf, una aplicación Laravel 13 con Sail, Filament 5 y Pest, con un panel cuyo dashboard muestra las ventas de una tienda. El curso tiene 3 secciones.

En la primera preparamos la base: el proyecto, los datos con 13 meses de pedidos para que los gráficos tengan forma, un objeto Period que comparten el filtro, los widgets y el PDF, y una clase de métrica por cada KPI, con sus tests.

En la segunda construimos el dashboard: un filtro de periodo que se aplica a todos los widgets, KPIs con variación respecto al periodo anterior, icono, color y sparkline, 3 gráficos de Chart.js con el periodo anterior superpuesto, callbacks en RawJs y un plugin propio de pocas líneas, una tabla con los productos más vendidos y la maquetación, con el color y la tipografía del panel.

Así queda el dashboard al terminar:

Dashboard terminado en Filament 5, con el filtro de periodo, las 4 tarjetas KPI, los 3 gráficos, la tabla de productos y el botón Descargar PDF

Y en la tercera, el PDF: el navegador exporta cada gráfico a PNG y lo envía al servidor junto con el periodo, y un servicio que no sabe nada de Filament convierte una plantilla Blade diseñada para el PDF en un PDF A4 con spatie/laravel-pdf y DomPDF. Sin Node, sin Chrome y sin servicios externos, así que funciona en cualquier hosting con PHP.

Esta es la primera página del informe que descarga el botón:

Primera página del informe PDF en A4: cabecera con el título Informe de ventas y el periodo, la fila de 4 tarjetas KPI con valor, variación y periodo anterior, el gráfico de ingresos por día a todo el ancho y, debajo, el donut de pedidos por estado y las barras de ventas por canal lado a lado

El truco del botón que lo descarga está en una sola línea: exporta los gráficos en el navegador y se los manda al servidor en la misma llamada, con un método de Filament que no aparece en su documentación:

Ejemplo El botón Descargar PDF
Action::make('downloadPdf')
->label('Descargar PDF')
->icon(Heroicon::OutlinedArrowDownTray)
->alpineClickHandler('$wire.downloadPdf(window.exportDashboardCharts())'),

En la lección 13 veremos qué hace cada parte y por qué no sirve actionJs(), que es el método que cita la documentación.

Cada comando lo tienes en su lección con el botón de copiar, cada archivo aparece completo con lo que cambia resaltado, y al terminar puedes descargar el proyecto. No vamos a complicarnos la vida, pero sí vamos a hacer las cosas bien, para que lo apliques en tu día a día desde el minuto cero.

Para quién es

Si ya has creado paneles con Filament 4 o 5 y ahora te piden un dashboard que luzca y un informe en PDF, o quieres dejar de hacer dashboards con un widget que lo hace todo, este curso es para ti. Necesitas Filament a nivel de haber creado un panel con recursos, Laravel en tu día a día (Eloquent, factories, Blade y tests con Pest), Sail y Docker, y un poco de JavaScript para la parte de exportar los gráficos. Si todavía no has hecho tu primer panel, empieza por Gestión de cursos con Filament 4 (se abre en una pestaña nueva), que es donde se construye el primer dashboard.

Así que, si te interesa, te espero dentro del curso. Espero que te haya gustado esta introducción y nos vemos dentro. Un saludo.

Temario

El curso, lección a lección

14 lecciones · 273 min
Busca en el texto, el código y los comandos de todas las lecciones Solo para suscriptores