Page type

Form: from a simple record to a sale with line items.

The screen below is the Sale record from the sample app, published on the Online Test. It is the same record that feeds the list view and the PDF on the List view page. It has a customer picked from the database, a date, a calculated total and the sale's line items.

A sale record with its line items on the same screen

The form opens in a side panel, split into sections and two columns. The customer comes from a database list and the date has a mask. The Total isn't typed: it is the sum of the sale's items. All of that is declared like this:

resources/views/…blade.php
<mad-form submit="onSave"><mad-form-section title="Sale record" icon="file-text"><mad-form-grid :cols="2"><mad-dbcombo-field name="cliente_id" label="Customer" model="Pessoa"display="{nome}" order-by="nome" :required="true" /><mad-date-field name="data_venda" label="Sale date" :required="true" /><mad-money-field name="valor_total" label="Total" prefix="$" :readonly="true" /></mad-form-grid></mad-form-section>...</mad-form>
Sale record in a side panel, with the sale's line items right below
Sale 1052 being edited: the 2 items add up exactly to the Total.

Panel, window, full page or under the row

The same form can open four ways. In the controller, one line chooses between a side panel (DRAWER, as above), a centered window (MODAL) or a full page (INTERNAL). In the list view, the row attribute on the edit button opens the form right under the row. You edit quickly and never lose sight of the table.

resources/views/…blade.php
{{-- in the form controller: how it opens --}}protected static string $wrapper = self::DRAWER;   {{-- side panel --}}protected static string $wrapper = self::MODAL;    {{-- centered dialog --}}protected static string $wrapper = self::INTERNAL; {{-- full page --}}{{-- in the list view: the SAME form, attached under the row --}}<mad-nav icon="pencil" label="Edit"navigate="VendaForm::onEdit({id})" row />
Sale record open in a centered window over the list view
Centered window: the same record for sale 1052, with all its items, open over the list view.
Sale form open under row 1052 of the list view
Inline: the form opens attached to sale 1052, and the table continues right below.

The sale's items are saved together with it

The items block (<mad-detail-form>) lets you add, edit and remove items on the same screen. On save, the form reconciles the items on its own: it inserts the new ones, updates the edited ones and deletes the removed ones. For calculated fields, such as the product name and each item's total, the controller has two entry points (onLoadDetail and 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="Product" /><mad-col field="valor_total" label="Total" right money="$" total="sum" /></mad-columns></mad-detail-form>
Sale item panel with product, quantity and amounts
Each item opens in its own panel, with a product from the database, quantity and amounts with a currency mask.

The error shows on the field, without losing what you typed

The validation rules live in the model (Venda::rules()). On save, the server checks the data and the message comes back on the field itself. The page doesn't reload and nothing you typed is lost.

Error message on the Sale date field
Saving without the date: the required-field message appears on the field itself.

Database lists with search, cascade and quick add

A field linked to another table becomes a searchable list (dbcombo). For large lists, the search goes to the server as you type (dbunique-search), and there is also a lookup window with columns (seek). One list can depend on another, like city and state. If the record doesn't exist, the quick add creates it on the spot, without leaving the form:

resources/views/…blade.php
{{-- Declarative cascade --}}<mad-dbcombo-field name="estado_id" model="Estado" display="nome" /><mad-dbcombo-field name="cidade_id" model="Cidade" display="nome"depends-on="estado_id" />{{-- Not found? Quick inline record, without leaving the form --}}<mad-dbcombo-field name="cliente_id" model="Pessoa" display="nome"no-results-quick-register-action="ClienteForm::quickRegister" />
Customer list open with search, highlighting the matched text
Searching "pa" in the customer list: a bakery customer shows up with the match highlighted.

Fields that arrive with masks and formats built in

Currency with a prefix and decimal places, numbers in your locale's format, dates with a calendar, date and time, postal code, color, counter. That is more than 40 field types, and the wizard picks the right one from the column type.

Calendar open on the Sale date field
The date field's calendar, the same in every generated app.

And more

More than 40 ready-made field typesFile and image uploadFields that fill themselves in when you pick a recordLookup in a window with columnsMulti-select as tags, checkboxes or a link tableSections, tabs and layout columnsFields that react to what you type, without reloading the screenYour code in protected blocks stays there when the screen is regenerated

See the list view in detail or explore the page types.

Create an account, build a screen, download the project.

No scheduled demo, no discovery call. If the Laravel that comes out doesn’t pass your team’s review, you lost an afternoon.

  1. Create an accountOpen beta, no credit card.
  2. Build a screenVisually, in code, or by asking the AI.
  3. Download the .zipA Laravel project that runs wherever you want.