KPIs y métricas
Tarjetas, tiras y filas de indicadores, la estadística que elige su formato, comparativas de tiempo y resúmenes de informe.
Un cuadro de mando se basa en la cifra: número grande, etiqueta corta y una tendencia que indica si va bien o mal. La tarjeta destacada es DnzKpiCard. Para una tira compacta de varios números (cabeceras, pies de ficha), DnzKpiInline. Para agrupar tarjetas en rejilla, DnzKpiRow. Para grupos de estadísticas dentro de una tarjeta, DnzStatsDisplay o DnzStatItem. Cuando el dato decide su propio formato, DnzDynamicStat.
Qué componente uso
| Necesitas | Componente |
|---|---|
| Una cifra destacada, con icono, color y tendencia | DnzKpiCard |
| Varias tarjetas KPI en rejilla que se adapta sola | DnzKpiRow (envuelve DnzKpiCard) |
| Una tira horizontal compacta de números | DnzKpiInline |
| Un grupo de estadísticas valor + etiqueta dentro de una tarjeta | DnzStatsDisplay |
| Un dato suelto con icono y contenido libre como valor | DnzStatItem |
| Un KPI, una gráfica o una tabla según la forma del dato | DnzDynamicStat |
| Comparar tiempo previsto contra tiempo real (semáforo) | DnzTimeComparisonDisplay |
| Progreso real contra progreso esperado en una barra | DnzProgressRhythm |
| Totales de un informe de Flex | DnzSummaryBar |
| Tarjeta pequeña icono + etiqueta + valor | DnzCardKV, en Tarjetas y maquetación |
Casi todos reciben la cifra ya formateada como texto ("1.250 €", "42"). El separador de miles, el símbolo de moneda y los decimales los pones tú. Las excepciones son las variaciones (DeltaPercent), que entran como decimal, y DnzDynamicStat, que formatea según DnzDynamicStatFormatE.
Con más de una tarjeta, coloca los DnzKpiCard dentro de un DnzKpiRow. La rejilla se ajusta al ancho disponible con MinCardWidth.
DnzKpiCard
La tarjeta de un KPI: título, cifra grande, icono opcional, color, etiqueta de variación porcentual y minigráfico de tendencia. Tiene tres modos según cómo la configures.
Cifra, título, variación y descripción en una tarjeta sobria.
<DnzKpiCard Title="Ventas del mes" Value=@($"€ {ventasMes:N0}") Icon="payments" Color="#1565c0" DeltaPercent=@variacionPct DeltaLabel="frente al mes anterior" Tooltip="Facturación del mes en curso" />Con IsCompact=true, una versión de una sola línea para colocar muchas en poco espacio.
<DnzKpiCard IsCompact=true Title="Activas" Value=@activas.STR() Icon="check_circle" Color="#16a34a" Variant="Variant.Text" />Con HighlightColor, la tarjeta entera lleva un degradado y texto en blanco.
<DnzKpiCard Title="MRR" Value=@($"€ {mrr:N0}") Icon="trending_up" HighlightColor="DnzKpiCard.HighlightColorType.Green" Tooltip="Monthly Recurring Revenue" />La variación se colorea sola: positivo en verde, negativo en rojo, cero en gris, con su flecha. Si tu métrica es "cuanto menos mejor" (gastos, tiempos), pon DeltaInvertColors=true.
Parámetros
| Parámetro | Tipo | Por defecto | Qué hace |
|---|---|---|---|
Title | string | "" | Etiqueta de la cifra. |
Value | string | "" | La cifra, ya formateada. |
Icon | string | "" | Icono Material. Vacío, sin icono. |
Color | string | "light-dark(black, var(--rz-text-color))" | Color del texto y del icono (modos estándar y compacto). |
Description | string | "" | Texto pequeño bajo la cifra (modo estándar). |
IsCompact | bool | false | Variante compacta de una línea. |
HighlightColor | HighlightColorType | Undefined | Degradado de fondo. Auto deduce verde o rojo según el valor. |
DeltaPercent | decimal? | null | Porcentaje de cambio. Muestra una etiqueta con flecha y signo. |
DeltaLabel | string | "" | Texto junto a la variación. |
DeltaInvertColors | bool | false | Invierte verde y rojo cuando subir es malo. |
TrendContent | RenderFragment | Contenido libre para un mini-gráfico de tendencia. | |
ButtonText | string | "" | Con texto, muestra un botón de acción al pie (modo estándar). |
ButtonIcon | string | "" | Icono de ese botón. |
OnClick | EventCallback | Se dispara al pulsar el botón. | |
Tooltip | string | "" | Texto emergente al pasar el ratón por la tarjeta. |
Variant | Radzen.Variant? | sin fijar | Variante de la tarjeta base (modos estándar y compacto). |
Class | string | "" | Clases CSS extra de la tarjeta. |
Style | string | "" | Estilo en línea adicional de la tarjeta. |
Acepta atributos extra que se pasan al elemento raíz (el parámetro se llama Attributes). HighlightColorType admite Undefined, Auto, Red, Blue, Green, Yellow, Orange, Purple, Black, White, Gray.
HighlightColorType.Auto mira los dígitos del Value: con algún dígito distinto de cero lo muestra en verde, y rojo si hay un signo menos; sin dígitos, gris. Con formatos poco habituales, fija el color a mano.
DnzKpiRow
Contenedor en rejilla para tus DnzKpiCard. Coloca dentro las tarjetas que necesites; las columnas se ajustan al ancho disponible y bajan de línea cuando no caben.
<DnzKpiRow MinCardWidth="260">
<DnzKpiCard Title="Ventas del mes" Value=@($"€ {ventasMes:N0}") Icon="payments" Color="#1565c0" DeltaPercent=@variacionPct DeltaLabel="frente al mes anterior" />
<DnzKpiCard Title="Tickets emitidos" Value=@ticketsHoy.STR() Icon="receipt_long" Color="#6a1b9a" />
<DnzKpiCard Title="Stock bajo mínimo" Value=@stockBajo.STR() Icon="warning" Color="#e65100" />
</DnzKpiRow>Parámetros
| Parámetro | Tipo | Por defecto | Qué hace |
|---|---|---|---|
ChildContent | RenderFragment | Las tarjetas KPI de la rejilla. | |
MinCardWidth | int | 220 | Ancho mínimo (px) de cada tarjeta. Define cuántas caben por fila. |
Class | string | "" | Clases CSS extra del contenedor. |
Style | string | "" | Estilo en línea adicional (se concatena con la variable de ancho mínimo). |
DnzKpiInline
Tira horizontal compacta de varios números, separados por punto, barra o barra vertical. Para cabeceras de ficha, pies de tarjeta o líneas de metainformación. Los elementos se pasan como lista, no como marcado hijo.
<DnzKpiInline Items=@KpiItems Separator="DnzKpiInline.SeparatorType.Pipe" />
@code {
List<DnzKpiInline.ItemModel> KpiItems = new()
{
new("Horas oficiales", "40h 00m", Icon: "calendar_month"),
new("Realizado", "38h 30m", Icon: "work", ValueColor: "#d97706"),
new("Horas extra", "2h 15m", Icon: "more_time"),
};
}Parámetros
| Parámetro | Tipo | Por defecto | Qué hace |
|---|---|---|---|
Items | List<ItemModel> | new() | Los números a mostrar. |
Separator | SeparatorType | MiddleDot | Separador entre elementos: None, MiddleDot, Pipe, Slash. |
Class | string | "" | Clases CSS extra del contenedor. |
Style | string | "" | Estilo en línea adicional del contenedor. |
TestId | string | "" | data-testid del contenedor. |
ItemModel es un record con Label, Value y, opcionales, Icon, ValueColor, IconColor y Tooltip. Si IconColor va vacío, el icono hereda ValueColor.
DnzStatItem
Un dato suelto: icono a la izquierda, valor grande y etiqueta debajo. El valor es contenido libre (ChildContent), así que dentro cabe un DnzSpanMoney, una etiqueta u otro componente.
<div class="d-flex flex-wrap gap-4">
<DnzStatItem Label="Clientes activos" Icon="people"><span>1.234</span></DnzStatItem>
<DnzStatItem Label="Facturado" Icon="payments"><DnzSpanMoney Amount=@totalFacturado /></DnzStatItem>
<DnzStatItem Label="Pedidos" Icon="shopping_cart"><span>89</span></DnzStatItem>
</div>El Icon acepta un nombre de icono Material o una ruta de imagen: si empieza por / o http, lo muestra como <img>.
Parámetros
| Parámetro | Tipo | Por defecto | Qué hace |
|---|---|---|---|
ChildContent | RenderFragment | El valor, como contenido libre. | |
Label | string | "" | Etiqueta bajo el valor. |
Icon | string | "" | Icono Material, o una URL (/, http) para imagen. |
IconColor | string | "var(--rz-primary)" | Color del icono Material. |
IconSize | string | "40px" | Tamaño del icono (CSS). |
ValueColor | string | "" | Color del valor. Vacío usa el color del tema. |
ValueSize | string | "fs-3" | Clase Bootstrap de tamaño del valor (fs-1, fs-3, fs-5). |
Visible | bool | true | Con false, no se renderiza nada. |
Class | string | "" | Clases CSS extra del contenedor. |
DnzStatsDisplay
Grupo de estadísticas valor + etiqueta + unidad dentro de una tarjeta, repartidas en horizontal. Recibe una lista de StatisticModel y muestra una celda por cada métrica.
<DnzCard>
<DnzCardTitle Title="Resumen" Icon="analytics" Compact=true />
<DnzStatsDisplay Statistics=@stats Variant="Variant.Text" />
</DnzCard>
@code {
private List<DnzStatsDisplay.StatisticModel> stats = new()
{
new() { Value = "12", Label = "Usuarios" },
new() { Value = "45,3", Label = "Base de datos", Unit = "GB" },
new() { Value = "8,1", Label = "Archivos", Unit = "GB" },
};
}Parámetros
| Parámetro | Tipo | Por defecto | Qué hace |
|---|---|---|---|
Statistics | List<StatisticModel> | new() | Las estadísticas a mostrar. Obligatorio (EditorRequired). |
Variant | Variant? | sin fijar | Variante de la tarjeta base. Sin valor, la decide la profundidad de DnzCard. |
StatisticModel tiene tres campos string: Value, Label y Unit.
DnzStatsDisplay.Item
La celda que muestra cada cifra: valor grande, unidad pequeña al lado y etiqueta debajo. DnzStatsDisplay la instancia por ti, una por cada elemento de Statistics.
| Parámetro | Tipo | Por defecto | Qué hace |
|---|---|---|---|
Value | string | "" | El número grande de la celda. |
Label | string | "" | Etiqueta debajo del valor. |
Unit | string | "" | Unidad pequeña junto al valor. Vacía, sin unidad. |
DnzDynamicStat
Recibe un DnzDynamicStatData y elige cómo mostrarlo. Con Render="Auto", una o varias series con un solo valor se muestran como KPI, y las series con categorías, como gráfica hasta 20 categorías y como tabla por encima. Con AllowViewSwitch=true el usuario alterna entre columnas, líneas, anillo, barras apiladas, radar, polar y tabla.
<DnzCard>
<DnzCardTitle Icon="show_chart" Title="Ingresos frente a gastos" />
<DnzDynamicStat Data=@_dataEvolucion Render="DnzDynamicStatRenderE.Chart" ChartType="DnzDynamicStatChartTypeE.Line" AllowViewSwitch=true ChartHeight="280" />
</DnzCard>
@code {
private DnzDynamicStatData _dataEvolucion;
protected override void OnInitialized()
{
_dataEvolucion = new DnzDynamicStatData
{
IsLoaded = true,
Series = new()
{
new DnzDynamicStatSeries
{
Label = "Ingresos", Color = "#16a34a", Format = DnzDynamicStatFormatE.Money,
Items = new() { new("Ene", 48250), new("Feb", 51900), new("Mar", 47300) }
},
new DnzDynamicStatSeries
{
Label = "Gastos", Color = "#dc2626", Format = DnzDynamicStatFormatE.Money,
Items = new() { new("Ene", 31200), new("Feb", 29800), new("Mar", 33500) }
}
}
};
}
}Un solo número se muestra como tarjeta KPI:
<DnzDynamicStat Data=@_ventasMes Title="Ventas del mes" Icon="payments" />
@code {
private DnzDynamicStatData _ventasMes = new()
{
IsLoaded = true,
Series = new() { new DnzDynamicStatSeries { Label = "Ventas", SingleValue = 48250, Format = DnzDynamicStatFormatE.Money } }
};
}Mientras IsLoading es true o Data.IsLoaded es false, muestra un DnzSkeleton. Si Data.ErrorMessage tiene texto, muestra el error en su lugar.
Parámetros
| Parámetro | Tipo | Por defecto | Qué hace |
|---|---|---|---|
Data | DnzDynamicStatData | Obligatorio. Series, filas sin procesar y estado de carga. | |
IsLoading | bool | false | Fuerza el esqueleto de carga. |
Title | string | "" | Título del KPI o de la gráfica. |
Icon | string | "" | Icono Material. |
Color | string | "" | Color del texto en modo KPI. |
Render | DnzDynamicStatRenderE | Auto | Auto, Kpi, Chart o Table. |
ChartType | DnzDynamicStatChartTypeE | Column | Column, Bar, Line, Donut, Spider, PolarArea, StackedBar. |
HighlightColor | DnzKpiCard.HighlightColorType | Undefined | Degradado de fondo en modo KPI. |
IsCompact | bool | false | KPI compacto de una línea. |
Variant | Radzen.Variant? | sin fijar | Variante de la tarjeta en modo KPI. |
Description | string | "" | Texto bajo la cifra en modo KPI. |
ChartHeight | int | 300 | Alto de la gráfica en px. |
ShowLegend | bool | true | Leyenda de la gráfica. |
ShowDataLabels | bool | false | Etiquetas de valor sobre la gráfica. |
PageSize | int | 10 | Filas por página en modo tabla. |
AllowViewSwitch | bool | false | Barra para alternar entre tipos de gráfica y tabla. Solo con datos agrupados. |
OnClick | EventCallback | Se dispara al pulsar el KPI. | |
Class | string | "" | Clases CSS extra. |
Style | string | "" | Estilo en línea adicional. |
Acepta atributos extra (data-testid, aria-*) que van al elemento raíz de cada estado.
Modelo de datos
| Clase | Campos | Para qué |
|---|---|---|
DnzDynamicStatData | Series, Columns, RawRows, ColumnLabels, Total, TimeMs, IsLoaded, ErrorMessage | El paquete completo. IsSingleValue, IsMultiKpi, HasGroupedData y MaxItemCount son propiedades calculadas que usa Render="Auto". |
DnzDynamicStatSeries | Label, Color, Format, SingleValue, Items | Una serie: o un SingleValue (KPI) o una lista de Items (gráfica). GroupedTotal suma los Items. |
DnzDynamicStatDataItem | Category, Value | Un punto de la serie. Constructor new(category, value). |
DnzStatParameter | Field, Aggregation, Label, Color, Format | Descripción de un dato a agregar (Sum, Count, Avg, Min, Max, None) para quien construye el DnzDynamicStatData desde una consulta. |
DnzDynamicStatFormatE admite Auto, Money, Decimal, Integer, Percent y Raw. Los tipos están en DinaZen.Components.DnzDynamicStat.
Rellena el DnzDynamicStatData con IAQuery: una consulta por corte, no por tarjeta. Cada DnzDynamicStat con dos series es una llamada que devuelve dos series.
DnzTimeComparisonDisplay
Compara tiempo planificado contra tiempo real con color de semáforo: verde hasta el 80 %, amarillo hasta el 100 %, rojo al pasarse. Para tareas, partes de trabajo y presupuestos de horas. Los tiempos entran en minutos y se formatean a h y m.
<DnzTimeComparisonDisplay PlannedTime="480" ActualTime="510" Label="Reparación 1042" />Eso muestra 8h 30m / 8h con la etiqueta +30m en rojo y la barra de progreso. Variantes:
Con barra de progreso, etiqueta de diferencia e icono de estado. El modo por defecto.
<DnzTimeComparisonDisplay PlannedTime="120" ActualTime="90" Label="Montaje" />Con Compact=true, todo en una línea para una fila de tabla o un pie de tarjeta.
<DnzTimeComparisonDisplay PlannedTime="120" ActualTime="90" Compact=true />Sin PlannedTime (queda en 0), muestra solo el tiempo real sin comparativa ni barra.
<DnzTimeComparisonDisplay ActualTime="135" Label="Tiempo invertido" />Parámetros
| Parámetro | Tipo | Por defecto | Qué hace |
|---|---|---|---|
PlannedTime | decimal | 0 | Tiempo planificado, en minutos. En 0 desactiva la comparativa. |
ActualTime | decimal | 0 | Tiempo real consumido, en minutos. |
ShowProgressBar | bool | true | Muestra la barra de progreso (solo con tiempo planificado). |
ShowDiff | bool | true | Muestra la etiqueta con la diferencia (+30m, -1h 10m). |
Compact | bool | false | Modo de una sola línea. |
Label | string | "" | Etiqueta encima de la comparativa. Aparece también en el texto emergente. |
Con PlannedTime y ActualTime a 0, el componente no muestra nada.
DnzProgressRhythm
Barra de progreso con marcador de progreso esperado: muestra CurrentProgress como barra y ExpectedProgress como una marca vertical, e indica si vas adelantado, en ritmo o retrasado. Los dos valores son porcentajes (0 a 100). Los textos se cambian por parámetro; los valores por defecto están en inglés.
<DnzProgressRhythm CurrentProgress="62" ExpectedProgress="70" Title="Objetivo trimestral" ExpectedLabel="esperado" GoalAchievedText="Objetivo cumplido" OnTrackText="En ritmo" AheadText="Adelantado" BehindText="Retrasado" />Parámetros
| Parámetro | Tipo | Por defecto | Qué hace |
|---|---|---|---|
CurrentProgress | decimal | 0 | Progreso real, en porcentaje. Por encima de 100 se considera cumplido. |
ExpectedProgress | decimal | 0 | Progreso esperado a día de hoy, en porcentaje. En 0 no muestra la marca ni la comparativa. |
Title | string | "Progress" | Título de la barra. |
ExpectedLabel | string | "expected" | Etiqueta del valor esperado. |
GoalAchievedText | string | "Goal achieved!" | Texto al llegar al 100 %. |
OnTrackText | string | "On track" | Texto cuando real y esperado coinciden. |
AheadText | string | "Ahead by" | Prefijo cuando vas por delante. |
BehindText | string | "Behind by" | Prefijo cuando vas por detrás. |
DnzSummaryBar
Barra de totales para informes de Flex. Lee el ReportContext que publica DnzReportProvider y suma las columnas de dinero, la de minutos, cuenta los true de las booleanas y muestra el rango de la fecha principal.
<DnzReportProvider Client=@Client ReportId="7c1d4e90-2f5a-41b8-bc63-9e0a1b2c3d4f">
<DnzSummaryBar />
</DnzReportProvider>Parámetros
| Parámetro | Tipo | Por defecto | Qué hace |
|---|---|---|---|
Context | ReportContext | Llega por [CascadingParameter] desde DnzReportProvider. No se pasa como atributo. |
DnzSummaryBar solo aparece si el contexto trae filas. Detalle del proveedor en Tablas e informes.