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

NecesitasComponente
Una caja de búsqueda que no consulte en cada teclaDnzSearchInput
Subir uno o varios ficheros y registrarlos en DinaupDnzFileUploaderButton
Mostrar un fichero ya subido con icono, tamaño y descargaDnzFileName
Editar texto rico (HTML)DnzHtmlEditor
Recortar, rotar o mejorar una imagenDnzImageEditor, DnzImageEditorDialog
Editar una lista de etiquetasDnzTagListEditor
Editar pares clave/valor como JSONDnzJsonKVEditor
Mostrar una lista de pasos numeradosDnzStepper, DnzStepperStep
La ficha completa de una sección, con guardadoDnzFormView
Elegir un valor, una fila o una fichaSelectores

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ámetroTipoPor defectoQué hace
ValuestringnullTexto actual del campo.
Placeholderstring"Buscar..."Texto guía cuando está vacío.
BounceValueChangedEventCallback<string>Se dispara 500 ms después de la última tecla, con el texto escrito.
OnTypingEventCallbackSe dispara en cada tecla, antes de la espera. Para activar un indicador de "buscando".
Classstring""Clases CSS del contenedor.
Stylestring""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ámetroTipoPor defectoQué hace
ClientDinaupClientCnullCliente que registra el fichero subido (File_UploadURLAsync). Sin él, los ficheros suben a S3 sin registrarse.
PresignEndpointstring"/file/upload/sign"Endpoint que firma la subida a S3.
OnFilesUploadedEventCallback<List<DinaupFileDTO>>Se dispara cuando termina el lote, con los ficheros ya registrados.
OnEachFileUploadedEventCallback<PresignUploadResult>Se dispara por cada fichero subido. Con delegado, tú gestionas el registro y se salta el lote.
AcceptExtensionsstring[][]Extensiones permitidas (.pdf, .png). Vacío admite todas.
MaxSizeByteslong157286400 (150 MB)Tamaño máximo por fichero.
MaxFilesint1000Número máximo de ficheros por subida.
DisabledboolfalseInhabilita el botón.
ButtonTextstringnullTexto del botón.
ButtonIconstring"attach_file"Icono del botón.
ButtonStyleButtonStyleSecondaryEstilo Radzen del botón.
ButtonSizeButtonSizeSmallTamaño Radzen del botón.
ButtonVariantVariantOutlinedVariante visual del botón.
UseDashboardboolfalseAbre el panel de Uppy (arrastrar y soltar) en vez de un botón simple.
NotestringnullNota opcional para el panel.
EditBeforeUploadbooltrueCon una sola imagen, la pasa por el editor antes de subir.
OnErrorEventCallback<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ámetroTipoPor defectoQué hace
DnzFileNameDisplaystring""Nombre del fichero. La extensión decide el icono.
FileSizelong?nullTamaño en bytes. Se formatea solo (KB, MB).
DownloadURLstring""URL de descarga. Con valor, muestra el botón de descarga.
OnClickEventCallbackAcción propia. Solo se usa si no hay DownloadURL.
OnClick_Iconstring"arrow_right"Icono del botón de la acción propia.
HorizontalboolfalseDisposición en línea, más compacta.
IsCompactboolfalseVariante 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ámetroTipoPor defectoQué hace
ValuestringnullHTML editado. Úsalo con @bind-Value.
ValueChangedEventCallback<string>Se dispara al cambiar el contenido.
Contextstring""Contexto que reciben las herramientas de texto (IDnzTextTool.ProcessAsync(value, context)).
EditorStylestring"min-height:300px;"Estilo del área de edición (altura mínima).
UploadUrlstring"upload/image"Endpoint donde sube las imágenes pegadas o insertadas.
Classstring""Clases CSS del contenedor.
Stylestring""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ámetroTipoPor defectoQué hace
ImageUrlstringnullURL de la imagen a cargar.
ImageBytesbyte[]nullImagen en bytes, alternativa a ImageUrl.
PresignEndpointstringnullEndpoint de firma para las herramientas que pasan por S3.
ExternalToolsIEnumerable<IDnzImageTool>nullHerramientas extra en la barra (Id, Name, Icon, Description, Order).
OnSaveEventCallback<byte[]>Se dispara al guardar, con los bytes del resultado.
OnCancelEventCallbackSe dispara al cancelar.
StylestringnullEstilo 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ámetroTipoPor defectoQué hace
ImageUrlstringnullURL de la imagen a editar.
ImageBytesbyte[]nullImagen en bytes, alternativa a ImageUrl.
PresignEndpointstringnullEndpoint 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ámetroTipoPor defectoQué hace
ValueList<string>new()La lista de etiquetas. Úsalo con @bind-Value.
ValueChangedEventCallback<List<string>>Se dispara al añadir o quitar una etiqueta.
Titlestring""Título de la cabecera. Vacío no muestra cabecera ni botón Clear.
Iconstring""Icono junto al título.
Placeholderstring"Add item..."Texto guía del campo.
EmptyTextstring"No items"Texto cuando no hay etiquetas.
ReadOnlyboolfalseSolo lectura (oculta el campo y las X).
ValidatorFunc<string, string>nullDevuelve un mensaje de error si el valor no vale, o vacío si vale.
TransformFunc<string, string>nullTransforma cada valor antes de añadirlo (Trim, ToLower).
AllowMultiPastebooltruePegar varias etiquetas a la vez separadas por ,, ;, salto de línea o tabulador.
Classstring""Clases CSS del contenedor.
Stylestring""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ámetroTipoPor defectoQué hace
Valuestring"{}"El JSON con los pares. Úsalo con @bind-Value.
ValueChangedEventCallback<string>Se dispara al editar, añadir o quitar un par. Devuelve el JSON indentado.
ReadOnlyboolfalseSolo lectura.
Classstring""Clases CSS del contenedor.
Stylestring""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ámetroTipoPor defectoQué hace
ChildContentRenderFragmentLos 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ámetroTipoPor defectoQué hace
Indexint0Número que se muestra en el círculo.
ChildContentRenderFragmentContenido 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ámetroTipoPor defectoQué hace
ClientDinaupClientCObligatorio. Cliente ya inicializado.
SectionIdstring""GUID de la sección a cargar. Excluyente con Token.
DatoIdstring""GUID del registro a editar. Vacío abre un alta.
Tokenstring""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.
UserIdstring""ID del usuario en cuyo nombre se abre.
OnFormatearCodigoFunc<string, Task<string>>nullGancho para formatear códigos contables (subcuenta).
OnClosedEventCallback<DinaupFormResult>Se dispara al cerrar el formulario, con el resultado.
OnAnnotationOpenEventCallback<DinaupAnnotationRequest>Se dispara al abrir comentarios, ficheros o galería. Recibe SectionId, RowId, Type y Client.
WindowIdstringnullID de la ventana flotante que lo contiene.
PreFillValuesDictionary<string, string>nullValores a precargar en un alta (clave del campo a valor). Solo con DatoId vacío.
PreFillListList<Dictionary<string, string>>nullFilas a precargar en los campos de lista de un alta. Solo con DatoId vacío.
AttachFileIdGuidGuid.EmptyID 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ámetroTipoQué hace
TabDinaup.VirtualFormDTO.TabObligatorio. La pestaña a renderizar.
ClientDinaupClientCObligatorio. Cliente ya inicializado.
OnTabChangedEventCallback<Dinaup.VirtualFormDTO.Tab>Cuando cambia un control de la pestaña.
OnButtonClickEventCallback<string>Al pulsar un botón de la pestaña.
OnDeleteItemPrimaryListEventCallback<string>Al borrar un elemento de la lista principal.
OnMostrarDialogRequiereGuardarEventCallback<string>Cuando una acción exige guardar primero.
OnOpenListItemEventCallback<Dinaup.VirtualFormDTO.FormDetail>Al abrir un elemento de una lista.
OnAddItemEventCallbackAl añadir un elemento a una lista.
OnFormatearCodigoFunc<string, Task<string>>Gancho para formatear códigos contables.
MovilboolMaqueta móvil. No es un parámetro: llega en cascada (DnzFormMovil) desde DnzFormView.

Relacionado

  • Selectores: elegir opciones (enum, memoria o catálogo remoto), con DnzSearchInput por dentro.
  • Tablas e informes: mostrar un informe del SDK como tabla, tarjetas o gráfica.
  • Diálogos y ventanas: dónde abrir DnzFormView en ventana flotante.
  • Patrones de uso: ejemplos que combinan estos componentes con el SDK.
  • Cliente Dinaup: conexión, WriteOperations y File_UploadURLAsync para guardar lo que capturan estos componentes.

→ Componentes · DinaZen · SDK .NET

En esta página