Vistas especializadas
Gantt, código resaltado, selectores de periodo y rango de fechas, documentos dinámicos, visores y las piezas de horarios de RRHH.
Piezas que van más allá de listar y editar registros. La planificación en línea de tiempo con DnzGenericGantt. El código resaltado para documentar dentro de la app. Los selectores de periodo y de rango que alimentan informes y cuadros de mando. Los documentos dinámicos de Flex, los visores y las piezas de horarios de RRHH.
Qué componente uso
| Necesito | Componente |
|---|---|
| Mostrar tareas o recursos en una línea de tiempo con zoom y navegación | DnzGenericGantt |
| Un fragmento de código con resaltado, copiar y números de línea | DnzHighlightCode |
| Lo mismo con aspecto de ventana (temas, título, pie) | DnzCodeWindow |
| Elegir un rango de fechas (solo día) con rangos predefinidos | DnzDateRangeSelector |
| Elegir un rango con fecha y hora | DnzDateTimeRangeSelector |
| Una tarjeta con el selector de rango, carga y hora de la última actualización | DnzDateRangeCard |
| Navegar por periodos (día, semana, mes, trimestre, año, rango) | DnzPeriodSelector |
| Moverse mes a mes con flechas | DnzMonthNavSelector |
| Ejecutar y mostrar un documento dinámico de Flex | DnzDynamicDocumentView |
| Mostrar el HTML de un documento ya generado, con impresión | DnzDynamicDocumentResultView |
| Ver un Word, Excel o PowerPoint por URL | DnzOfficeDocumentViewer |
| Vista previa de un correo (para, asunto y cuerpo HTML) | DnzEmailPreview |
| Línea de tiempo de 24 h con barras, cuadrante semanal, editor de tramos, comparativa esperado frente a real | familia Rrhh |
DnzGenericGantt
Línea de tiempo tipo Gantt: filas por grupo (empleado, recurso, tarea) y barras por intervalo de tiempo, con barra superior para navegar, cambiar de vista (horas, semana, mes, año) y hacer zoom. Arranca en vista de horas sobre el día de hoy de la empresa (ICultureService), no el del servidor.
Recibe dos listas: los Groups (las filas) y los SourceItems (las barras). Cada elemento se asocia a su fila por GroupId.
@inject Dinaup.CultureService.ICultureService RegionService
<DnzGenericGantt Groups=@_grupos SourceItems=@_citas OnItemClick=@AbrirCita />
@code {
private List<GanttGroup> _grupos = new();
private List<GanttItem> _citas = new();
protected override void OnInitialized()
{
// El día de la empresa: el contenedor corre en UTC y DateTime.Today daría el del servidor
var hoy = RegionService.LocalNow().Date;
_grupos.Add(new GanttGroup { Id = "tecnico-1", Text = "Laura (Taller A)" });
_grupos.Add(new GanttGroup { Id = "tecnico-2", Text = "Marcos (Taller B)" });
_citas.Add(new GanttItem("c-1001", "tecnico-1", "Revisión 8430-KLM", hoy.AddHours(9), hoy.AddHours(11), null));
_citas.Add(new GanttItem("c-1002", "tecnico-2", "ITV 1190-ZRT", hoy.AddHours(10), hoy.AddHours(12), null, "background:#0d6efd;color:#fff"));
}
private void AbrirCita(GanttItem item)
{
var cita = item.Data;
}
}| Parámetro | Tipo | Por defecto | Para qué |
|---|---|---|---|
Groups | List<GanttGroup> | null | Filas del Gantt. GanttGroup tiene Id, Text, Data y un Template opcional (RenderFragment<GanttGroup>) para mostrar la celda de la fila. |
SourceItems | List<GanttItem> | null | Barras a colocar. Cada GanttItem se vincula a su fila por GroupId y lleva From, To, Text, Tooltip, RowStyle (CSS en línea de la barra) y Data. |
OnItemClick | EventCallback<GanttItem> | Se dispara al pulsar una barra. Recupera tu entidad desde item.Data. |
GanttItem se construye con new GanttItem(id, groupId, text, from, to, data, styleX = ""). El último parámetro es el CSS en línea de la barra. Los tipos están en DinaZen.Components.Gantt.Models.
Por encima de 20.000 elementos el componente no dibuja las barras y muestra un aviso de demasiados resultados. Filtra antes de pasarle los datos.
DnzGanttToolBar
Barra de control del Gantt: flechas anterior y siguiente, botón Hoy (el día de la empresa), selector de vista (Hour, Week, Month, Year) y zoom. La monta DnzGenericGantt; solo la instancias si construyes tu propio Gantt sobre GanttViewport.
@inject Dinaup.CultureService.ICultureService RegionService
<DnzGanttToolBar Viewport=@_viewport ViewportChanged=@OnViewportChanged />
@code {
private GanttViewport _viewport = new() { ViewMode = GanttViewMode.Hour };
protected override void OnInitialized()
{
_viewport.FocusDate = RegionService.LocalNow().Date;
}
private void OnViewportChanged(GanttViewport vp) => _viewport = vp;
}| Parámetro | Tipo | Por defecto | Para qué |
|---|---|---|---|
Viewport | GanttViewport | Obligatorio. Estado actual: FocusDate, ViewMode y Zoom (100 por defecto). GetRange() devuelve el intervalo visible. | |
ViewportChanged | EventCallback<GanttViewport> | Se dispara al navegar, cambiar de vista o cambiar el zoom, con una copia nueva de GanttViewport. |
GanttViewMode tiene Hour, Day, Week, Month y Year; la barra ofrece Hour, Week, Month y Year.
DnzHighlightCode
Bloque de código con resaltado de sintaxis (highlight.js), cabecera con el lenguaje y el nombre de fichero, botón de copiar y números de línea opcionales. Para documentar dentro de la app.
<DnzHighlightCode Code=@_snippet Language="csharp" DnzFileName="Program.cs" ShowLineNumbers=true />
@code {
private string _snippet = "builder.Services.AddDinaZen();";
}| Parámetro | Tipo | Por defecto | Para qué |
|---|---|---|---|
Code | string | "" | El código a mostrar. |
Language | string | "" | Lenguaje del resaltado: csharp, razor, bash, json, sql, vb. Acepta alias (cs, js, cshtml, vbnet). |
DnzFileName | string | "" | Nombre de fichero en la cabecera (Program.cs). |
ShowCopy | bool | true | Muestra el botón de copiar al portapapeles. |
ShowLineNumbers | bool | false | Muestra la columna de números de línea. |
Size | DnzHighlightCodeSize | Default | Tamaño del bloque: Small, Default o Large. |
Acepta atributos extra que se pasan al elemento raíz.
razor y cshtml se resaltan como XML por dentro. Tú pasas Language="razor".
DnzCodeWindow
Lo mismo que DnzHighlightCode con estética de ventana: los tres puntos de la barra de título, título, temas de color y un pie opcional. Para páginas de presentación o demostraciones donde el código es parte del diseño.
<DnzCodeWindow Code=@_setup Language="csharp" Title="Program.cs" Theme="DnzCodeWindow.DnzCodeWindowTheme.Dracula" ShowLineNumbers=true>
<span class="text-muted">Registra DinaZen en el arranque.</span>
</DnzCodeWindow>
@code {
private string _setup = "builder.Services.AddDinaZen();";
}| Parámetro | Tipo | Por defecto | Para qué |
|---|---|---|---|
Code | string | "" | El código a mostrar. |
Language | string | "" | Lenguaje del resaltado. Mismos alias que DnzHighlightCode, más py, go, rs y dockerfile. |
Title | string | "" | Título de la ventana (nombre de fichero o descripción). |
ShowCopy | bool | true | Muestra el botón de copiar. |
ShowLineNumbers | bool | false | Muestra los números de línea. |
Tilted | bool | false | Aplica un efecto 3D inclinado. |
Size | DnzCodeWindowSize | Default | Small, Default o Large. |
Theme | DnzCodeWindowTheme | Dark | Tema visual: Dark, Light, Monokai o Dracula. |
ChildContent | RenderFragment | Contenido del pie de la ventana (nota, enlace). | |
Class | string | "" | Clases CSS extra. |
Para un fragmento copiable en una ficha o subpágina, DnzHighlightCode es más plano y ocupa menos. Para una página de presentación, DnzCodeWindow con Theme y Tilted.
DnzDateRangeSelector
Selector de rango de fechas (solo día) con un desplegable de rangos predefinidos: Hoy, Ayer, Últimos 7 días, Últimos 30 días, Este mes, Mes pasado, Este trimestre, Trimestre pasado, Este año, Año pasado y Personalizado. Con Personalizado aparecen dos selectores Desde y Hasta. Devuelve el rango calculado como DateOnly. Los rangos cuentan desde el día de la empresa (ICultureService), no desde el del servidor, que va en UTC.
<DnzDateRangeSelector @bind-SelectedPreset=@_preset OnRangeChanged=@CargarFacturas />
@code {
private DnzDateRangeSelector.DateRangePreset _preset = DnzDateRangeSelector.DateRangePreset.Last30Days;
private async Task CargarFacturas((DateOnly From, DateOnly To) rango)
{
await RecargarAsync(rango.From, rango.To);
}
}| Parámetro | Tipo | Por defecto | Para qué |
|---|---|---|---|
SelectedPreset | DateRangePreset | Last7Days | Rango predefinido activo. Enlazable con @bind-SelectedPreset. |
SelectedPresetChanged | EventCallback<DateRangePreset> | Se dispara al cambiar de rango predefinido (lo usa el enlace @bind). | |
OnRangeChanged | EventCallback<(DateOnly From, DateOnly To)> | Se dispara con el rango calculado cada vez que cambia. Aquí recargas tus datos. |
Acepta atributos extra que se pasan al elemento raíz. DateRangePreset tiene Today, Yesterday, Last7Days, Last30Days, ThisMonth, LastMonth, ThisQuarter, LastQuarter, ThisYear, LastYear y Custom.
OnRangeChanged se dispara también en el primer renderizado con el rango predefinido por defecto, así que el listado carga sin llamadas manuales.
DnzDateTimeRangeSelector
Igual que el anterior, con hora: los selectores personalizados incluyen HH:mm y el rango se devuelve como DateTime. Para intervalos que importan al minuto: registros, fichajes, eventos, auditoría.
<DnzDateTimeRangeSelector @bind-SelectedPreset=@_preset OnRangeChanged=@CargarEventos />
@code {
private DnzDateTimeRangeSelector.DateTimeRangePreset _preset = DnzDateTimeRangeSelector.DateTimeRangePreset.Today;
private async Task CargarEventos((DateTime From, DateTime To) rango)
{
await RecargarAsync(rango.From, rango.To);
}
}| Parámetro | Tipo | Por defecto | Para qué |
|---|---|---|---|
SelectedPreset | DateTimeRangePreset | Last7Days | Rango predefinido activo. Enlazable con @bind-SelectedPreset. |
SelectedPresetChanged | EventCallback<DateTimeRangePreset> | Se dispara al cambiar de rango predefinido. | |
OnRangeChanged | EventCallback<(DateTime From, DateTime To)> | Se dispara con el rango calculado (con hora) cada vez que cambia. |
Acepta atributos extra que se pasan al elemento raíz. DateTimeRangePreset tiene los mismos valores que DateRangePreset.
Si el dato es por día (ventas, stock, facturación) usa DnzDateRangeSelector. Si necesitas el minuto (registros, fichajes, trazabilidad) usa DnzDateTimeRangeSelector. Uno devuelve DateOnly y el otro DateTime.
DnzDateRangeCard
Tarjeta (DnzCard) con título, icono, un DnzDateRangeSelector integrado, un DnzLoader mientras Loading es true y la hora de la última actualización, en la hora de la empresa. Devuelve el rango como DateTime: From a las 00:00 y To al final del día.
<DnzDateRangeCard Title="Historial" Icon="history" DefaultPreset="DnzDateRangeSelector.DateRangePreset.Last30Days" Loading=@_loading OnRangeChanged=@OnRangeChanged>
<HistorialTablaU Data=@_filas />
</DnzDateRangeCard>
@code {
private bool _loading;
private List<FilaDTO> _filas = new();
private async Task OnRangeChanged((DateTime From, DateTime To) rango)
{
_loading = true;
_filas = await CargarAsync(rango.From, rango.To);
_loading = false;
}
}| Parámetro | Tipo | Por defecto | Para qué |
|---|---|---|---|
Title | string | "" | Título de la tarjeta. |
Icon | string | "" | Icono Material del título. |
ChildContent | RenderFragment | Contenido de la tarjeta bajo el selector. | |
Loading | bool | false | Sustituye el contenido por un DnzLoader. |
DefaultPreset | DnzDateRangeSelector.DateRangePreset | Last7Days | Rango predefinido inicial. |
PresetChanged | EventCallback<DnzDateRangeSelector.DateRangePreset> | Se dispara al cambiar de rango predefinido. | |
OnRangeChanged | EventCallback<(DateTime From, DateTime To)> | Se dispara con el rango calculado. |
Acepta atributos extra que se pasan al elemento raíz.
DnzPeriodSelector
Navegador de periodo con granularidad: día, semana, mes, trimestre, año o rango libre. Emite un PeriodSelection con el rango resuelto, sin repetir el mismo periodo dos veces seguidas.
<DnzPeriodSelector OnChanged=@OnPeriodoChanged InitialGrain="DnzPeriodSelector.PeriodGrain.Mes" />
@code {
private async Task OnPeriodoChanged(DnzPeriodSelector.PeriodSelection periodo)
{
await CargarAsync(periodo.Start, periodo.End);
}
}| Parámetro | Tipo | Por defecto | Para qué |
|---|---|---|---|
OnChanged | EventCallback<PeriodSelection> | Se dispara cada vez que cambia el periodo, con Grain, Start, End y Label. | |
InitialGrain | PeriodGrain | Mes | Granularidad inicial: Dia, Semana, Mes, Trimestre, Anio o Rango. |
InitialStart | DateOnly? | null | Periodo inicial (para restaurar estado desde la URL). Basta el inicio: el fin se deriva de la granularidad. |
InitialEnd | DateOnly? | null | Fin del periodo inicial. Solo con granularidad Rango. |
Today | DateOnly | hoy | Fecha de referencia. Sin asignar, el día de la empresa (ICultureService.DateOnlyNow()), no el del servidor. Inyectable para pruebas. |
Acepta atributos extra que se pasan al elemento raíz. PeriodSelection es un record (PeriodGrain Grain, DateOnly Start, DateOnly End, string Label).
DnzMonthNavSelector
Tira mínima para moverse mes a mes: flecha atrás, el mes como desplegable y flecha adelante. Emite siempre el día 1 del mes elegido. Las pulsaciones seguidas de flecha se acumulan durante DelaySalto milisegundos antes de emitir, para no lanzar una carga por cada mes intermedio.
@inject Dinaup.CultureService.ICultureService RegionService
<DnzMonthNavSelector @bind-Value=@_mes />
@code {
private DateOnly _mes;
protected override void OnInitialized()
{
_mes = RegionService.DateOnlyNow();
}
}| Parámetro | Tipo | Por defecto | Para qué |
|---|---|---|---|
Value | DateOnly | Mes mostrado. Admite cualquier día del mes; el componente lo normaliza al día 1. Sin asignar, muestra el mes actual de la empresa. | |
ValueChanged | EventCallback<DateOnly> | Emite el día 1 del mes elegido. Pensado para @bind-Value. | |
DelaySalto | int | 2000 | Milisegundos que se acumulan los saltos de flecha antes de emitir. 0 emite al momento. |
Class | string | "" | Clases CSS extra. |
Style | string | "" | Estilo en línea adicional. |
Acepta atributos extra que se pasan al elemento raíz.
DnzDynamicDocumentView
Ejecuta un documento dinámico de Flex por su DocId y muestra el resultado en un iframe, con botones de imprimir, enviar por correo y enviar a firmar. Los botones de correo y firma solo aparecen si la app registra los ganchos correspondientes en DnzInterceptorService o pasa los EventCallback.
<DnzDynamicDocumentView Client=@Client DocId="2b7e1a40-6c3d-4f8e-9a12-0c5d6e7f8a9b" VariableValues=@(new() { ["FacturaId"] = facturaId }) />| Parámetro | Tipo | Por defecto | Para qué |
|---|---|---|---|
Client | DinaupClientC | null | Cliente que ejecuta el documento. No hace falta con PreloadedResult. |
DocId | string | "" | GUID del documento dinámico. No hace falta con PreloadedResult. |
PreloadedResult | DynamicDocumentsGetResponse | null | Resultado ya obtenido. Con valor, no llama a la API. |
VariableValues | Dictionary<string, string> | new() | Variables para la ejecución. Las que falten se piden con DnzResponseQuestions. |
CompatibleDocuments | List<DinaupDynamicDocumentDTO> | null | Documentos alternativos para el desplegable de cambio de plantilla. |
AutoPrint | bool | false | Lanza la impresión al cargar. |
Embedded | bool | false | Oculta cabecera y pie cuando el visor va dentro de otra pantalla. |
OnSendEmail | EventCallback<DinaupDocumentRequest> | Enviar por correo con el HTML como cuerpo. | |
OnSendEmailWithAttachment | EventCallback<DinaupDocumentRequest> | Enviar por correo con el PDF adjunto. |
Métodos estáticos:
Task DnzDynamicDocumentView.OpenAsync(DialogService dialogService, DinaupClientC client, string docId, Dictionary<string, string> variableValues = null, List<DinaupDynamicDocumentDTO> compatibleDocuments = null, EventCallback<DinaupDocumentRequest>? onSendEmail = null, EventCallback<DinaupDocumentRequest>? onSendEmailWithAttachment = null, string width = "85%", string height = "80%")
Task DnzDynamicDocumentView.OpenPreloadedAsync(DialogService dialogService, DynamicDocumentsGetResponse result, string title = "Documento", string width = "80%", string height = "90%")
string DnzDynamicDocumentView.OpenAsWindow(DnzWindowManagerService windowManager, DinaupClientC client, string docId, Dictionary<string, string> variableValues = null, List<DinaupDynamicDocumentDTO> compatibleDocuments = null, string title = "Documento", string icon = "description")UpdateAsync() por @ref vuelve a ejecutar el documento.
DnzDynamicDocumentResultView
Muestra el HTML de un documento ya generado con un botón Imprimir / Guardar PDF.
| Parámetro | Tipo | Por defecto | Para qué |
|---|---|---|---|
HTML | string | null | HTML del documento. |
AutoImprimir | bool | false | Lanza la impresión al cargar. |
DnzOfficeDocumentViewer
Muestra un documento de Office (Word, Excel, PowerPoint) por URL pública dentro de un iframe del visor view.officeapps.live.com.
<DnzOfficeDocumentViewer DocumentUrl=@adjunto.url_original />| Parámetro | Tipo | Por defecto | Para qué |
|---|---|---|---|
DocumentUrl | string | "" | Obligatorio. URL pública del documento. |
EmptyMessage | string | "No document URL provided." | Texto cuando DocumentUrl va vacío. |
DnzEmailPreview
Vista previa de un correo: cabecera con Para y asunto, y el cuerpo HTML debajo. La versión en diálogo con botón de confirmar está en Diálogos y ventanas.
| Parámetro | Tipo | Por defecto | Para qué |
|---|---|---|---|
Body | string | "" | HTML completo del correo, plantilla incluida. |
Destinatario | string | "" | Dirección del destinatario. |
Asunto | string | "" | Asunto. |
Height | string | "400px" | Alto del cuerpo. |
Piezas de RRHH
Componentes de horarios y fichajes que Play usa en Recursos Humanos. Reciben datos ya procesados, sin dependencias de servicios. Están en DinaZen.Components.Rrhh y sus modelos, en DinaZen.Components.Rrhh.Models.
| Componente | Qué muestra | Parámetros principales |
|---|---|---|
DnzTimelineRrhh | Contenedor de línea de tiempo de 24 h con eje de horas y rejilla. Dentro van los DnzTimelineBarRrhh. | ChildContent, Height (36), StartHour (0), EndHour (24), Step, ShowAxis (true), NowMarker: TimeOnly? |
DnzTimelineBarRrhh | Barra horizontal posicionada por Start y End (TimeOnly?). Sin fin y con fecha de hoy, se alarga hasta la hora actual: la de Now o, sin él, la de la empresa (ICultureService.LocalNow()). | Date, Start, End (obligatorios), Style: TimelineBarStyleRrhh (None, Holiday, SickLeave, Rest, OfficialShift, ActualShift, Absence, Vacation, Punch), OnClick, ShowPhantomTime, ShowLabel, AxisStartHour, AxisEndHour, Now, Class, TestId |
DnzWeeklyScheduleGridRrhh | Cuadrante semanal agrupado por día con franjas horarias. | Items: IEnumerable<ScheduleItemRrhh> (obligatorio; Day, From, To), Culture, FirstDayOfWeek (lunes) |
DnzTimeIntervalEditorRrhh | Editor de varios tramos horarios con orden automático, indicador de descanso entre tramos, plantillas y categorías. | Intervals: List<TimeIntervalRrhh> con @bind-Intervals, Categories, SubCategories, Templates, AllowAdd, AllowRemove, AllowSort, AutoSort, ReadOnly, ShowToolbar, ShowGapIndicator, GapLabel ("descanso"), GapFillCategory, IntervalTypeTemplate, ExtraButtons, CategorySelector, TestId |
DnzComparisonCardRrhh | Tarjeta "esperado frente a realizado": las dos franjas sobre un eje de horas, con diferencia y avisos. | Title ("Turno"), CategoryBadge, ExpectedStart, ExpectedEnd, ActualStart, ActualEnd, ShowAbsenceBadge y los textos ExpectedLabel, ActualLabel, ExpectedEmptyText, ActualEmptyText, OnTimeText, EarlyText, LateText, AbsenceText, AlertExpectedNoActual, AlertActualNoExpected |
TimeIntervalRrhh se construye con new TimeIntervalRrhh(start, end, category) y tiene Start, End, Category, SubCategoryId, Abierto y Duration. TimeIntervalTemplateRrhh(name, icon, params (startH, startM, endH, endM, category)[] intervals) define una plantilla de tramos.