Stats overview widget de Filament al límite: variación, icono, color y sparkline
Hola, bienvenido. El stats overview widget de Filament 5 pinta cada KPI como un Stat, y un Stat admite bastante más que un número: una descripción con su icono, un color, un icono junto a la etiqueta y una sparkline con chart(). En esta lección vamos a usar todo eso con los 4 KPIs del curso, ingresos, pedidos, ticket medio y clientes nuevos, cada uno con su variación respecto al periodo anterior y leyendo el filtro de la lección 6.
Y lo vamos a hacer sin una sola consulta en el widget: las métricas de la lección 5 ya calculan el valor, el anterior y la serie diaria, y el widget solo coloca cada dato en su sitio. Al final veremos hasta dónde llega el Stat, y lo que se queda fuera es lo que resolveremos en la lección 8.
Lo que da de sí un Stat
Un Stat se crea con Stat::make(), que recibe la etiqueta y el valor, y se completa con métodos encadenados. Cada uno de ellos tiene ya su dato en lo que construimos en la lección 5, en Kpi, en KpiResult o en Trend:
Método de Stat |
Qué pinta | De dónde sale |
|---|---|---|
make($label, $value) |
La etiqueta y el valor grande | Kpi::label() y Kpi::format() del valor |
icon() |
Un icono junto a la etiqueta | Kpi::icon() |
description() |
Una línea bajo el valor | La variación con Format::percent() y el valor anterior |
descriptionIcon() |
Un icono junto a la descripción | Trend::icon(): flecha arriba, flecha abajo o guion |
color() |
El color de la descripción, su icono y la sparkline | Trend::color(): success, danger o gray |
chart() |
La sparkline, con Chart.js | KpiResult::$sparkline, un valor por día |
Fíjate en la última columna: no hay nada que calcular. El color de la tendencia lo decide Trend, sin que el widget compare números, y el formato del valor lo decide cada Kpi, que sabe si es dinero o un recuento. Por eso el widget va a quedar en menos de 50 líneas y por eso, en la lección 8, otro widget completamente distinto va a poder pintar los mismos KPIs sin repetir ni una regla.
Lo único nuevo que necesitamos son 2 piezas pequeñas. La primera, una forma de que cada widget obtenga su Period del filtro de la página sin tocar el array de pageFilters; la segunda, el formato de la variación en porcentaje, que todavía no existe en Format. Las creamos en ese orden y después el widget, que las usa.
- 02El trait InteractsWithPeriod
- 03La variación con Format::percent()
- 04El widget SalesOverview
- 05Tests del widget con pest-plugin-livewire
- 06Las 4 cajas en el navegador
- 07Hasta dónde llega Stat