Tipo de página

Formulario: del registro simple a la venta con ítems.

La pantalla de abajo es el Registro de venta de la app de ejemplo, publicada en la Prueba online. Es el mismo registro que alimenta el listado y el PDF de la página de Listado. Tiene cliente elegido de la base de datos, fecha, total calculado y los ítems de la venta.

Un registro de venta con los ítems en la misma pantalla

El formulario se abre en un panel lateral, dividido en secciones y en dos columnas. El cliente viene de una lista de la base de datos y la fecha tiene máscara. El Valor total no se escribe: es la suma de los ítems de la venta. Todo eso queda declarado así:

resources/views/…blade.php
<mad-form submit="onSave"><mad-form-section title="Registro de venta" icon="file-text"><mad-form-grid :cols="2"><mad-dbcombo-field name="cliente_id" label="Cliente" model="Pessoa"display="{nome}" order-by="nome" :required="true" /><mad-date-field name="data_venda" label="Fecha de la venta" :required="true" /><mad-money-field name="valor_total" label="Valor total" prefix="$" :readonly="true" /></mad-form-grid></mad-form-section>...</mad-form>
Registro de venta en un panel lateral, con los ítems de la venta justo debajo
Venta 1052 en edición: los 2 ítems suman exactamente el Valor total.

Panel, ventana, página completa o debajo de la fila

El mismo formulario puede abrirse de cuatro maneras. En el controller, una línea elige entre panel lateral (DRAWER, como arriba), ventana central (MODAL) o página completa (INTERNAL). En el listado, el atributo row en el botón de editar abre el formulario justo debajo de la fila. Editas rápido y no pierdes la tabla de vista.

resources/views/…blade.php
{{-- en el controller del form: cómo se abre --}}protected static string $wrapper = self::DRAWER;   {{-- panel lateral --}}protected static string $wrapper = self::MODAL;    {{-- diálogo central --}}protected static string $wrapper = self::INTERNAL; {{-- página completa --}}{{-- en el listado: el MISMO form, anexado debajo de la fila --}}<mad-nav icon="pencil" label="Editar"navigate="VendaForm::onEdit({id})" row />
Registro de venta abierto en una ventana central sobre el listado
Ventana central: el mismo registro de la venta 1052, con todos los ítems, abierto sobre el listado.
Formulario de venta abierto debajo de la fila 1052 del listado
En la fila: el formulario se abre pegado a la venta 1052, y la tabla continúa justo debajo.

Los ítems de la venta se guardan junto con ella

El bloque de ítems (<mad-detail-form>) te deja agregar, editar y quitar los ítems en la misma pantalla. Al guardar, el formulario ajusta los ítems solo: inserta los nuevos, actualiza los editados y borra los quitados. Para campos calculados, como el nombre del producto y el total de cada ítem, el controller tiene dos puntos de entrada (onLoadDetail y onSaveDetail).

resources/views/…blade.php
<mad-detail-form name="dfVendaItem" model="VendaItem"foreign-key="venda_id" mode="drawer" addable removable editable><mad-detail-fields><mad-form-grid :cols="2"><mad-dbcombo-field name="produto_id" model="Produto" display="{nome}" :required="true" /><mad-numeric-field name="quantidade" :decimals="2" :required="true" /><mad-money-field name="valor_unitario" prefix="$" :required="true" /><mad-money-field name="valor_total" prefix="$" :readonly="true" /></mad-form-grid></mad-detail-fields><mad-columns><mad-col field="produto_nome" label="Producto" /><mad-col field="valor_total" label="Valor total" right money="$" total="sum" /></mad-columns></mad-detail-form>
Panel del ítem de la venta con producto, cantidad y valores
Cada ítem se abre en su propio panel, con producto de la base de datos, cantidad y valores con máscara de moneda.

El error aparece en el campo, sin perder lo que escribiste

Las reglas de validación quedan en el model (Venda::rules()). Al guardar, el servidor revisa los datos y el mensaje vuelve en el propio campo. La página no se recarga y nada de lo que escribiste se pierde.

Mensaje de error en el campo Fecha de la venta
Guardar sin la fecha: el mensaje de campo obligatorio aparece en el propio campo.

Listas de la base de datos con búsqueda, cascada y registro rápido

Un campo ligado a otra tabla se vuelve una lista con búsqueda (dbcombo). Para listas grandes, la búsqueda va al servidor mientras escribes (dbunique-search), y también hay una ventana de búsqueda con columnas (seek). Una lista puede depender de otra, como ciudad y estado. Si el registro no existe, el registro rápido lo crea al instante, sin salir del formulario:

resources/views/…blade.php
{{-- Cascada declarativa --}}<mad-dbcombo-field name="estado_id" model="Estado" display="nome" /><mad-dbcombo-field name="cidade_id" model="Cidade" display="nome"depends-on="estado_id" />{{-- ¿No lo encontró? Registro rápido inline, sin salir del form --}}<mad-dbcombo-field name="cliente_id" model="Pessoa" display="nome"no-results-quick-register-action="ClienteForm::quickRegister" />
Lista de clientes abierta con búsqueda, resaltando el fragmento encontrado
Búsqueda por “pa” en la lista de clientes: Padaria Pão da Vila aparece con el fragmento resaltado.

Campos que ya llegan con máscara y formato

Moneda con prefijo y decimales, número con formato local, fecha con calendario, fecha y hora, código postal, color, contador. Son más de 40 tipos de campo, y el asistente elige el correcto a partir del tipo de la columna.

Calendario abierto en el campo Fecha de la venta
El calendario del campo de fecha, igual en cualquier app generada.

Y más

Más de 40 tipos de campo listosCarga de archivos e imágenesCampos que se completan solos al elegir un registroBúsqueda en una ventana con columnasSelección múltiple en etiquetas, casillas de verificación o tabla de enlaceSecciones, pestañas y columnas de diseñoCampos que reaccionan a lo que escribes, sin recargar la pantallaTu código en bloques protegidos sigue ahí cuando la pantalla se genera de nuevo

Mira el listado en detalle o conoce los tipos de página.

Crea la cuenta, arma una pantalla, descarga el proyecto.

Sin demo agendada ni llamada de descubrimiento. Si el Laravel que sale no pasa la revisión de tu equipo, perdiste una tarde.

  1. Crea la cuentaBeta abierta, sin tarjeta.
  2. Arma una pantallaEn el editor visual, en código o pidiéndoselo a la IA.
  3. Descarga el .zipUn proyecto Laravel que corre donde quieras.