Entrada de datos y formularios
Componentes para capturar datos: búsqueda diferida, subida de ficheros, texto rico, imagen, etiquetas, JSON, pasos y la ficha dinámica de Flex.
Lo que el usuario teclea, pega o sube. Esta familia agrupa los componentes de entrada autónomos de DinaZen: una caja de búsqueda, un botón de subida, un editor de etiquetas, un recortador de imagen. Incluye también el formulario dinámico de Flex, que muestra una ficha completa a partir del GUID de una sección.
Casi todos son componentes de dos vías: reciben el dato con Value y avisan del cambio con ValueChanged. En Razor eso se escribe @bind-Value=@Modelo.Campo.
Los que suben ficheros (DnzFileUploaderButton, DnzImageEditor) usan un endpoint de firma que autoriza la subida directa a S3. El fichero no viaja por SignalR. Por defecto apuntan a /file/upload/sign.
Qué componente uso
| Necesitas | Componente |
|---|---|
| Una caja de búsqueda que no consulte en cada tecla | DnzSearchInput |
| Subir uno o varios ficheros y registrarlos en Dinaup | DnzFileUploaderButton |
| Mostrar un fichero ya subido con icono, tamaño y descarga | DnzFileName |
| Editar texto rico (HTML) | DnzHtmlEditor |
| Recortar, rotar o mejorar una imagen | DnzImageEditor, DnzImageEditorDialog |
| Editar una lista de etiquetas | DnzTagListEditor |
| Editar pares clave/valor como JSON | DnzJsonKVEditor |
| Mostrar una lista de pasos numerados | DnzStepper, DnzStepperStep |
| La ficha completa de una sección, con guardado | DnzFormView |
| Elegir un valor, una fila o una ficha | Selectores |
DnzSearchInput
Caja de búsqueda con icono de lupa que espera 500 ms tras la última tecla (debounce): no consulta en cada pulsación. Para filtrar una tabla o una lista sin saturar el servidor.
<DnzSearchInput Placeholder="Buscar cliente" BounceValueChanged=@OnBuscar />
@code {
private string _filtro = "";
private async Task OnBuscar(string texto)
{
_filtro = texto;
await RecargarListaAsync();
}
}Parámetros
| Parámetro | Tipo | Por defecto | Qué hace |
|---|---|---|---|
Value | string | null | Texto actual del campo. |
Placeholder | string | "Buscar..." | Texto guía cuando está vacío. |
BounceValueChanged | EventCallback<string> | Se dispara 500 ms después de la última tecla, con el texto escrito. | |
OnTyping | EventCallback | Se dispara en cada tecla, antes de la espera. Para activar un indicador de "buscando". | |
Class | string | "" | Clases CSS del contenedor. |
Style | string | "" | Estilo en línea del contenedor. |
Los atributos extra (autofocus, maxlength) se pasan al <input>.
Conecta la recarga a BounceValueChanged: la espera ya la hace Dinaup.Debouncer. No añadas tu propio temporizador.
DnzFileUploaderButton
Botón que abre el selector nativo, sube los ficheros a S3 (firma más Uppy) y devuelve los DinaupFileDTO ya registrados en Dinaup con Client.File_UploadURLAsync. Si subes una sola imagen, abre antes el editor de imagen.
<DnzFileUploaderButton Client=@Client OnFilesUploaded=@OnFicherosSubidos AcceptExtensions=@(new[] { ".pdf", ".docx", ".xlsx" }) MaxFiles="5" MaxSizeBytes=@(50L * 1024 * 1024) ButtonText="Adjuntar documento" ButtonIcon="upload_file" OnError=@OnErrorSubida />
@code {
private async Task OnFicherosSubidos(List<DinaupFileDTO> ficheros)
{
foreach (var f in ficheros)
Factura.Adjuntos.Add(f);
await InvokeAsync(StateHasChanged);
}
private void OnErrorSubida(string mensaje)
{
NotificationService.Notify(NotificationSeverity.Error, "Subida", mensaje);
}
}Parámetros
| Parámetro | Tipo | Por defecto | Qué hace |
|---|---|---|---|
Client | DinaupClientC | null | Cliente que registra el fichero subido (File_UploadURLAsync). Sin él, los ficheros suben a S3 sin registrarse. |
PresignEndpoint | string | "/file/upload/sign" | Endpoint que firma la subida a S3. |
OnFilesUploaded | EventCallback<List<DinaupFileDTO>> | Se dispara cuando termina el lote, con los ficheros ya registrados. | |
OnEachFileUploaded | EventCallback<PresignUploadResult> | Se dispara por cada fichero subido. Con delegado, tú gestionas el registro y se salta el lote. | |
AcceptExtensions | string[] | [] | Extensiones permitidas (.pdf, .png). Vacío admite todas. |
MaxSizeBytes | long | 157286400 (150 MB) | Tamaño máximo por fichero. |
MaxFiles | int | 1000 | Número máximo de ficheros por subida. |
Disabled | bool | false | Inhabilita el botón. |
ButtonText | string | null | Texto del botón. |
ButtonIcon | string | "attach_file" | Icono del botón. |
ButtonStyle | ButtonStyle | Secondary | Estilo Radzen del botón. |
ButtonSize | ButtonSize | Small | Tamaño Radzen del botón. |
ButtonVariant | Variant | Outlined | Variante visual del botón. |
UseDashboard | bool | false | Abre el panel de Uppy (arrastrar y soltar) en vez de un botón simple. |
Note | string | null | Nota opcional para el panel. |
EditBeforeUpload | bool | true | Con una sola imagen, la pasa por el editor antes de subir. |
OnError | EventCallback<string> | Se dispara con el mensaje cuando falla una subida o el registro. |
Acepta atributos extra que se pasan al elemento raíz.
Sin Client, los ficheros llegan a S3 pero Dinaup no los conoce. Para registrarlos a mano, usa OnEachFileUploaded y llama tú a File_UploadURLAsync(url, fileName).
DnzFileName
Muestra un fichero ya subido: icono según su extensión, nombre, tamaño y un botón de descarga o una acción propia. Es lo que muestras en una lista de adjuntos; no sube nada.
@foreach (var adjunto in Factura.Adjuntos)
{
<DnzFileName DnzFileNameDisplay=@adjunto.Name FileSize=@adjunto.SizeInBytes DownloadURL=@adjunto.url_original Horizontal=true @key=@adjunto.Id />
}Parámetros
| Parámetro | Tipo | Por defecto | Qué hace |
|---|---|---|---|
DnzFileNameDisplay | string | "" | Nombre del fichero. La extensión decide el icono. |
FileSize | long? | null | Tamaño en bytes. Se formatea solo (KB, MB). |
DownloadURL | string | "" | URL de descarga. Con valor, muestra el botón de descarga. |
OnClick | EventCallback | Acción propia. Solo se usa si no hay DownloadURL. | |
OnClick_Icon | string | "arrow_right" | Icono del botón de la acción propia. |
Horizontal | bool | false | Disposición en línea, más compacta. |
IsCompact | bool | false | Variante mínima (icono, nombre y tamaño en una fila). |
DnzHtmlEditor
Editor de texto rico (RadzenHtmlEditor) con la barra de herramientas de Dinaup (DnzHtmlEditorToolbar). Para descripciones largas, plantillas de correo o notas de un cliente.
<DnzHtmlEditor @bind-Value=@Plantilla.Cuerpo EditorStyle="min-height:400px;" UploadUrl="upload/image" />Parámetros
| Parámetro | Tipo | Por defecto | Qué hace |
|---|---|---|---|
Value | string | null | HTML editado. Úsalo con @bind-Value. |
ValueChanged | EventCallback<string> | Se dispara al cambiar el contenido. | |
Context | string | "" | Contexto que reciben las herramientas de texto (IDnzTextTool.ProcessAsync(value, context)). |
EditorStyle | string | "min-height:300px;" | Estilo del área de edición (altura mínima). |
UploadUrl | string | "upload/image" | Endpoint donde sube las imágenes pegadas o insertadas. |
Class | string | "" | Clases CSS del contenedor. |
Style | string | "" | Estilo en línea del contenedor. |
La barra obtiene por inyección de dependencias las implementaciones de IDnzTextTool (Id, Name, Icon, Description) registradas en la app y las muestra como botones. Así una app añade "resumir" o "traducir" sin modificar DinaZen.
DnzImageEditor
Editor de imagen embebido: recorte, rotación, volteo, mejora automática y herramientas externas (IDnzImageTool). Trabaja sobre una URL o sobre byte[]. Lo habitual es usarlo dentro del diálogo; suelto solo cuando forma parte de la pantalla.
<DnzImageEditor @ref=_editor ImageUrl=@Producto.FotoUrl PresignEndpoint="/file/upload/sign" OnSave=@OnImagenGuardada Style="height:600px;" />
@code {
private DnzImageEditor _editor;
private async Task Guardar()
{
var bytes = await _editor.GetResultBytesAsync();
await PersistirAsync(bytes);
}
}Parámetros
| Parámetro | Tipo | Por defecto | Qué hace |
|---|---|---|---|
ImageUrl | string | null | URL de la imagen a cargar. |
ImageBytes | byte[] | null | Imagen en bytes, alternativa a ImageUrl. |
PresignEndpoint | string | null | Endpoint de firma para las herramientas que pasan por S3. |
ExternalTools | IEnumerable<IDnzImageTool> | null | Herramientas extra en la barra (Id, Name, Icon, Description, Order). |
OnSave | EventCallback<byte[]> | Se dispara al guardar, con los bytes del resultado. | |
OnCancel | EventCallback | Se dispara al cancelar. | |
Style | string | null | Estilo en línea (sobre todo la altura). |
Acepta atributos extra que se pasan al elemento raíz.
Por @ref tienes GetResultBytesAsync(), que devuelve el byte[] del lienzo, y UploadResultToS3Async(signEndpoint), que lo sube a S3 y devuelve un PresignUploadResult.
DnzImageEditorDialog
El editor de imagen envuelto en un diálogo modal con aceptar y cerrar. No lo pones en el marcado: lo abres con un método estático y devuelve el resultado.
@code {
private async Task EditarFoto()
{
var bytes = await DnzImageEditorDialog.OpenAsync(DialogService, imageUrl: Producto.FotoUrl);
if (bytes.IsNull()) return;
await PersistirAsync(bytes);
}
}@code {
private async Task EditarYSubir()
{
var result = await DnzImageEditorDialog.OpenAndUploadToS3Async(DialogService, "/file/upload/sign", imageUrl: Producto.FotoUrl);
if (result.IsNull()) return;
Producto.FotoUrl = result.Url;
}
}Parámetros
| Parámetro | Tipo | Por defecto | Qué hace |
|---|---|---|---|
ImageUrl | string | null | URL de la imagen a editar. |
ImageBytes | byte[] | null | Imagen en bytes, alternativa a ImageUrl. |
PresignEndpoint | string | null | Endpoint de firma. Con valor, aceptar sube a S3 y devuelve PresignUploadResult. |
Métodos estáticos
Task<byte[]> DnzImageEditorDialog.OpenAsync(DialogService dialogService, string imageUrl = null, byte[] imageBytes = null)
Task<PresignUploadResult> DnzImageEditorDialog.OpenAndUploadToS3Async(DialogService dialogService, string presignEndpoint, string imageUrl = null)Los dos devuelven null si el usuario cancela.
DnzTagListEditor
Editor de una lista de etiquetas (List<string>). Escribes y pulsas Enter para añadir, pulsas la X para quitar. Admite pegar varias separadas por coma, punto y coma, salto de línea o tabulador, validación por valor y transformación.
<DnzTagListEditor @bind-Value=@Producto.Etiquetas Title="Etiquetas" Icon="sell" Placeholder="Añade una etiqueta y pulsa Enter" Transform=@(v => v.Trim().ToLower()) />Parámetros
| Parámetro | Tipo | Por defecto | Qué hace |
|---|---|---|---|
Value | List<string> | new() | La lista de etiquetas. Úsalo con @bind-Value. |
ValueChanged | EventCallback<List<string>> | Se dispara al añadir o quitar una etiqueta. | |
Title | string | "" | Título de la cabecera. Vacío no muestra cabecera ni botón Clear. |
Icon | string | "" | Icono junto al título. |
Placeholder | string | "Add item..." | Texto guía del campo. |
EmptyText | string | "No items" | Texto cuando no hay etiquetas. |
ReadOnly | bool | false | Solo lectura (oculta el campo y las X). |
Validator | Func<string, string> | null | Devuelve un mensaje de error si el valor no vale, o vacío si vale. |
Transform | Func<string, string> | null | Transforma cada valor antes de añadirlo (Trim, ToLower). |
AllowMultiPaste | bool | true | Pegar varias etiquetas a la vez separadas por ,, ;, salto de línea o tabulador. |
Class | string | "" | Clases CSS del contenedor. |
Style | string | "" | Estilo en línea del contenedor. |
Acepta atributos extra que se pasan al elemento raíz.
DnzJsonKVEditor
Editor de pares clave/valor que entra y sale como JSON (string). Para metadatos sueltos, configuración de una integración o cabeceras HTTP. Trae Copy, Paste e Import de un JSON pegado.
<DnzJsonKVEditor @bind-Value=@Integracion.MetadatosJson />Parámetros
| Parámetro | Tipo | Por defecto | Qué hace |
|---|---|---|---|
Value | string | "{}" | El JSON con los pares. Úsalo con @bind-Value. |
ValueChanged | EventCallback<string> | Se dispara al editar, añadir o quitar un par. Devuelve el JSON indentado. | |
ReadOnly | bool | false | Solo lectura. |
Class | string | "" | Clases CSS del contenedor. |
Style | string | "" | Estilo en línea del contenedor. |
Acepta atributos extra que se pasan al elemento raíz.
DnzStepper
Lista vertical de pasos numerados con la línea que los une. Es presentacional: muestra un proceso, no controla un asistente ni navega. Los pasos van dentro como DnzStepperStep.
<DnzStepper>
<DnzStepperStep Index="1">
<strong>Crea la factura</strong>
<p>Elige cliente y añade las líneas.</p>
</DnzStepperStep>
<DnzStepperStep Index="2">
<strong>Revisa los importes</strong>
<p>Comprueba bases, IVA y total.</p>
</DnzStepperStep>
<DnzStepperStep Index="3">
<strong>Emite y envía</strong>
<p>Genera el PDF y mándalo al cliente.</p>
</DnzStepperStep>
</DnzStepper>Parámetros
| Parámetro | Tipo | Por defecto | Qué hace |
|---|---|---|---|
ChildContent | RenderFragment | Los DnzStepperStep que componen la lista. |
Acepta atributos extra que se pasan al elemento raíz.
DnzStepperStep
Un paso suelto dentro del DnzStepper: el círculo numerado y el contenido al lado.
<DnzStepperStep Index="2">
<strong>Configura el almacén</strong>
<p>Define ubicaciones y stock inicial.</p>
</DnzStepperStep>Parámetros
| Parámetro | Tipo | Por defecto | Qué hace |
|---|---|---|---|
Index | int | 0 | Número que se muestra en el círculo. |
ChildContent | RenderFragment | Contenido del paso (título, descripción). |
Acepta atributos extra que se pasan al elemento raíz.
DnzFormView
El formulario dinámico de Flex. No declaras campos: recibe el GUID de una sección y el cliente, y muestra la ficha completa (cabecera, pestañas, controles, listas, botones, guardar y cancelar) tal cual está definida en Dinaup. Es lo que usas para dar de alta o editar un registro de cualquier sección sin escribir un <input>.
<DnzFormView Client=@Client SectionId=@SectionsD.EntidadesD._SectionID DatoId=@ClienteId OnClosed=@OnFichaCerrada />
@code {
private void OnFichaCerrada(DinaupFormResult result)
{
if (result.Reason == DinaupFormCloseReason.Saved)
RecargarLista();
}
}Parámetros
| Parámetro | Tipo | Por defecto | Qué hace |
|---|---|---|---|
Client | DinaupClientC | Obligatorio. Cliente ya inicializado. | |
SectionId | string | "" | GUID de la sección a cargar. Excluyente con Token. |
DatoId | string | "" | GUID del registro a editar. Vacío abre un alta. |
Token | string | "" | Adopta un formulario que ya existe en el servidor (subventana de alta, cola de agregado, selector de relación) en lugar de abrir uno. Excluyente con SectionId. |
UserId | string | "" | ID del usuario en cuyo nombre se abre. |
OnFormatearCodigo | Func<string, Task<string>> | null | Gancho para formatear códigos contables (subcuenta). |
OnClosed | EventCallback<DinaupFormResult> | Se dispara al cerrar el formulario, con el resultado. | |
OnAnnotationOpen | EventCallback<DinaupAnnotationRequest> | Se dispara al abrir comentarios, ficheros o galería. Recibe SectionId, RowId, Type y Client. | |
WindowId | string | null | ID de la ventana flotante que lo contiene. |
PreFillValues | Dictionary<string, string> | null | Valores a precargar en un alta (clave del campo a valor). Solo con DatoId vacío. |
PreFillList | List<Dictionary<string, string>> | null | Filas a precargar en los campos de lista de un alta. Solo con DatoId vacío. |
AttachFileId | Guid | Guid.Empty | ID de un fichero a adjuntar al guardar. |
Acepta atributos extra que se pasan al elemento raíz. Métodos públicos por @ref: LoadForm() recarga la ficha y List_AddNewItem(Dictionary<string, string> addValues = null) añade una fila a la lista primaria.
DinaupFormResult trae Reason (Cancelled, Saved, Error, SessionExpired), RowId, SectionId, WasModified y Title.
Las fechas con hora se eligen en la hora de la empresa (ICultureService, Madrid por defecto) y se guardan convertidas a UTC. Los botones Ahora, Hoy y Mañana del selector toman esa hora, no el reloj del servidor. Un campo confidencial o de contraseña se muestra oculto con DnzControlSensible, con un botón para verlo y otro para copiarlo. Ver DnzControl.
La maqueta de escritorio de un formulario de Flex pide 1000 px de ancho (el min-width de .dnz-form-view). Por debajo de ese ancho real del contenedor, el componente cambia a la maqueta móvil: pestañas apiladas y un campo por fila. Reserva ese ancho al abrirlo en un diálogo o en una ventana estrecha.
En vez de incrustarlo en el marcado, lo habitual es abrirlo como modal o como ventana flotante con sus métodos estáticos:
@code {
private async Task EditarCliente(string clienteId)
{
var result = await DnzFormView.OpenAsync(DialogService, Client, SectionsD.EntidadesD._SectionID, clienteId);
if (result.Reason == DinaupFormCloseReason.Saved)
RecargarLista();
}
}Firma:
Task<DinaupFormResult> DnzFormView.OpenAsync(DialogService dialogService, DinaupClientC client, string sectionId, string datoId = "", string title = "", string width = "min(96%, 1100px)", string height = "min(90%, 1000px)")@code {
private void AbrirFichaFlotante(string clienteId)
{
DnzFormView.OpenAsWindow(WindowManager, Client, SectionsD.EntidadesD._SectionID, clienteId, title: "Cliente");
}
}Firma:
string DnzFormView.OpenAsWindow(DnzWindowManagerService windowManager, DinaupClientC client, string sectionId, string datoId = "", string title = "", string icon = "")Devuelve el windowId.
Antes de abrir o guardar, DnzFormView consulta el DnzInterceptorService (OnOpenRecord, OnOpenNewRecord, OnFormSaved, OnGetFormExtensions). Detalle en Tablas e informes.
DnzFormTab
La pieza interna con la que DnzFormView renderiza cada pestaña: título, contenedores, controles y botones. No la montas tú; está aquí para reconocerla al depurar. Los contenedores y controles que muestra (DnzContainer, DnzControl) están en Tarjetas y maquetación.
| Parámetro | Tipo | Qué hace |
|---|---|---|
Tab | Dinaup.VirtualFormDTO.Tab | Obligatorio. La pestaña a renderizar. |
Client | DinaupClientC | Obligatorio. Cliente ya inicializado. |
OnTabChanged | EventCallback<Dinaup.VirtualFormDTO.Tab> | Cuando cambia un control de la pestaña. |
OnButtonClick | EventCallback<string> | Al pulsar un botón de la pestaña. |
OnDeleteItemPrimaryList | EventCallback<string> | Al borrar un elemento de la lista principal. |
OnMostrarDialogRequiereGuardar | EventCallback<string> | Cuando una acción exige guardar primero. |
OnOpenListItem | EventCallback<Dinaup.VirtualFormDTO.FormDetail> | Al abrir un elemento de una lista. |
OnAddItem | EventCallback | Al añadir un elemento a una lista. |
OnFormatearCodigo | Func<string, Task<string>> | Gancho para formatear códigos contables. |
Movil | bool | Maqueta móvil. No es un parámetro: llega en cascada (DnzFormMovil) desde DnzFormView. |
Relacionado
- Selectores: elegir opciones (enum, memoria o catálogo remoto), con
DnzSearchInputpor dentro. - Tablas e informes: mostrar un informe del SDK como tabla, tarjetas o gráfica.
- Diálogos y ventanas: dónde abrir
DnzFormViewen ventana flotante. - Patrones de uso: ejemplos que combinan estos componentes con el SDK.
- Cliente Dinaup: conexión,
WriteOperationsyFile_UploadURLAsyncpara guardar lo que capturan estos componentes.
→ Componentes · DinaZen · SDK .NET