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

NecesitasComponente
Una cifra destacada, con icono, color y tendenciaDnzKpiCard
Varias tarjetas KPI en rejilla que se adapta solaDnzKpiRow (envuelve DnzKpiCard)
Una tira horizontal compacta de númerosDnzKpiInline
Un grupo de estadísticas valor + etiqueta dentro de una tarjetaDnzStatsDisplay
Un dato suelto con icono y contenido libre como valorDnzStatItem
Un KPI, una gráfica o una tabla según la forma del datoDnzDynamicStat
Comparar tiempo previsto contra tiempo real (semáforo)DnzTimeComparisonDisplay
Progreso real contra progreso esperado en una barraDnzProgressRhythm
Totales de un informe de FlexDnzSummaryBar
Tarjeta pequeña icono + etiqueta + valorDnzCardKV, 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ámetroTipoPor defectoQué hace
Titlestring""Etiqueta de la cifra.
Valuestring""La cifra, ya formateada.
Iconstring""Icono Material. Vacío, sin icono.
Colorstring"light-dark(black, var(--rz-text-color))"Color del texto y del icono (modos estándar y compacto).
Descriptionstring""Texto pequeño bajo la cifra (modo estándar).
IsCompactboolfalseVariante compacta de una línea.
HighlightColorHighlightColorTypeUndefinedDegradado de fondo. Auto deduce verde o rojo según el valor.
DeltaPercentdecimal?nullPorcentaje de cambio. Muestra una etiqueta con flecha y signo.
DeltaLabelstring""Texto junto a la variación.
DeltaInvertColorsboolfalseInvierte verde y rojo cuando subir es malo.
TrendContentRenderFragmentContenido libre para un mini-gráfico de tendencia.
ButtonTextstring""Con texto, muestra un botón de acción al pie (modo estándar).
ButtonIconstring""Icono de ese botón.
OnClickEventCallbackSe dispara al pulsar el botón.
Tooltipstring""Texto emergente al pasar el ratón por la tarjeta.
VariantRadzen.Variant?sin fijarVariante de la tarjeta base (modos estándar y compacto).
Classstring""Clases CSS extra de la tarjeta.
Stylestring""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ámetroTipoPor defectoQué hace
ChildContentRenderFragmentLas tarjetas KPI de la rejilla.
MinCardWidthint220Ancho mínimo (px) de cada tarjeta. Define cuántas caben por fila.
Classstring""Clases CSS extra del contenedor.
Stylestring""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ámetroTipoPor defectoQué hace
ItemsList<ItemModel>new()Los números a mostrar.
SeparatorSeparatorTypeMiddleDotSeparador entre elementos: None, MiddleDot, Pipe, Slash.
Classstring""Clases CSS extra del contenedor.
Stylestring""Estilo en línea adicional del contenedor.
TestIdstring""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ámetroTipoPor defectoQué hace
ChildContentRenderFragmentEl valor, como contenido libre.
Labelstring""Etiqueta bajo el valor.
Iconstring""Icono Material, o una URL (/, http) para imagen.
IconColorstring"var(--rz-primary)"Color del icono Material.
IconSizestring"40px"Tamaño del icono (CSS).
ValueColorstring""Color del valor. Vacío usa el color del tema.
ValueSizestring"fs-3"Clase Bootstrap de tamaño del valor (fs-1, fs-3, fs-5).
VisiblebooltrueCon false, no se renderiza nada.
Classstring""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ámetroTipoPor defectoQué hace
StatisticsList<StatisticModel>new()Las estadísticas a mostrar. Obligatorio (EditorRequired).
VariantVariant?sin fijarVariante 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ámetroTipoPor defectoQué hace
Valuestring""El número grande de la celda.
Labelstring""Etiqueta debajo del valor.
Unitstring""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ámetroTipoPor defectoQué hace
DataDnzDynamicStatDataObligatorio. Series, filas sin procesar y estado de carga.
IsLoadingboolfalseFuerza el esqueleto de carga.
Titlestring""Título del KPI o de la gráfica.
Iconstring""Icono Material.
Colorstring""Color del texto en modo KPI.
RenderDnzDynamicStatRenderEAutoAuto, Kpi, Chart o Table.
ChartTypeDnzDynamicStatChartTypeEColumnColumn, Bar, Line, Donut, Spider, PolarArea, StackedBar.
HighlightColorDnzKpiCard.HighlightColorTypeUndefinedDegradado de fondo en modo KPI.
IsCompactboolfalseKPI compacto de una línea.
VariantRadzen.Variant?sin fijarVariante de la tarjeta en modo KPI.
Descriptionstring""Texto bajo la cifra en modo KPI.
ChartHeightint300Alto de la gráfica en px.
ShowLegendbooltrueLeyenda de la gráfica.
ShowDataLabelsboolfalseEtiquetas de valor sobre la gráfica.
PageSizeint10Filas por página en modo tabla.
AllowViewSwitchboolfalseBarra para alternar entre tipos de gráfica y tabla. Solo con datos agrupados.
OnClickEventCallbackSe dispara al pulsar el KPI.
Classstring""Clases CSS extra.
Stylestring""Estilo en línea adicional.

Acepta atributos extra (data-testid, aria-*) que van al elemento raíz de cada estado.

Modelo de datos

ClaseCamposPara qué
DnzDynamicStatDataSeries, Columns, RawRows, ColumnLabels, Total, TimeMs, IsLoaded, ErrorMessageEl paquete completo. IsSingleValue, IsMultiKpi, HasGroupedData y MaxItemCount son propiedades calculadas que usa Render="Auto".
DnzDynamicStatSeriesLabel, Color, Format, SingleValue, ItemsUna serie: o un SingleValue (KPI) o una lista de Items (gráfica). GroupedTotal suma los Items.
DnzDynamicStatDataItemCategory, ValueUn punto de la serie. Constructor new(category, value).
DnzStatParameterField, Aggregation, Label, Color, FormatDescripció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ámetroTipoPor defectoQué hace
PlannedTimedecimal0Tiempo planificado, en minutos. En 0 desactiva la comparativa.
ActualTimedecimal0Tiempo real consumido, en minutos.
ShowProgressBarbooltrueMuestra la barra de progreso (solo con tiempo planificado).
ShowDiffbooltrueMuestra la etiqueta con la diferencia (+30m, -1h 10m).
CompactboolfalseModo de una sola línea.
Labelstring""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ámetroTipoPor defectoQué hace
CurrentProgressdecimal0Progreso real, en porcentaje. Por encima de 100 se considera cumplido.
ExpectedProgressdecimal0Progreso esperado a día de hoy, en porcentaje. En 0 no muestra la marca ni la comparativa.
Titlestring"Progress"Título de la barra.
ExpectedLabelstring"expected"Etiqueta del valor esperado.
GoalAchievedTextstring"Goal achieved!"Texto al llegar al 100 %.
OnTrackTextstring"On track"Texto cuando real y esperado coinciden.
AheadTextstring"Ahead by"Prefijo cuando vas por delante.
BehindTextstring"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ámetroTipoPor defectoQué hace
ContextReportContextLlega por [CascadingParameter] desde DnzReportProvider. No se pasa como atributo.

DnzSummaryBar solo aparece si el contexto trae filas. Detalle del proveedor en Tablas e informes.


Relacionado

En esta página