Page type

List view: filter, group, sum and export on the same screen.

The screen below is from the sample app, published on the Online Test, with 52 sales. They are the same sales as in the PDF exported at the end of the page. Colored statuses, formatted dates and amounts, totals and filters come from a few lines of configuration.

52 sales with status, dates and totals already formatted

Dates and amounts come formatted, and the status gets a colored badge. The Registered column shows how long ago the sale came in ("1 month ago"). You also get footer totals, filters, search, export and row actions. Each column is declared on one line:

resources/views/…blade.php
<mad-grid self per-page="15" searchable><mad-columns><mad-col field="{cliente->nome}" label="Customer" sort filter /><mad-col field="data_venda" label="Sale date" date="m/d/Y" center sort /><mad-col field="status" label="Status" center sortbadge="pago:success:Paid|pendente:warning:Pending|cancelado:danger:Canceled" /><mad-col field="itens" label="Items" center total="sum" /><mad-col field="valor_total" label="Total" right money="$" total="sum" col-filter=">=" /><mad-col field="created_at" label="Registered" transform="GridTransformer::registradaHa" /><mad-col field="{tenant->name}" label="Tenant" display-condition="GridTransformer::multiTenant" /></mad-columns></mad-grid>
Sales list view with colored statuses, formatted dates, amounts and totals
The 52 sales with colored status, formatted date and amount, relative time and the filters at the top.

Filters that stay visible while you work

The filters sit in a bar above the table. Each one appears as a tag that, when clicked, opens the right field for that data. There are 11 field types, and the bar can change layout, as you can see just below:

TextFree searchFixed list of optionsDatabase list with searchList from a tableRecord lookupDateDate rangeNumberToggleCheckbox
resources/views/…blade.php
<mad-grid-filters style="toolbar" name="filtros"><mad-search-field name="busca" label="Search" /><mad-select-field name="status" label="Status" :items="['pago' => 'Paid', ...]" /><mad-dbcombo-field name="cliente_id" label="Customer" model="Pessoa" display="{nome}" /><mad-daterange-field name_start="dt_ini" name_end="dt_fim" label="Period" presets /><mad-number-field name="valor_min" label="Minimum amount" /></mad-grid-filters>
Status filter open, showing the list of options
Status filter: a fixed list of options, with Apply and Cancel.
Period filter open, with ready-made ranges
Period filter, with ready-made ranges to pick from.
Customer filter open, with search in the customer list
Customer filter: the list comes from the customers table, with search.

The same filters, six layouts

The filters can appear six ways, and you switch between them by changing a single attribute, style. The values are toolbar, chips, drawer, modal, sidebar-left and sidebar-right.

Filters as a toolbar, inline above the table
Toolbar: the filters sit inline, above the table, in the default layout.
Filters as chips, with the add-filter button and the list of fields
Chips: each filter only appears when you click "+ Add filter".
Filters in a panel that slides in from the side of the screen
Side drawer: all the fields together, in a panel that slides in from the edge.
Filters in a centered window, with the fields in two columns
Centered window: the fields laid out in two columns.
Filters in a fixed column to the left of the table
Left column: the filters stay fixed in a 260px column beside the table.
Filters in a fixed column to the right of the table
Right column: the same column, on the other side of the table.

You see the active filter and the totals adjust

After applying, the tag shows the chosen value ("Status: paid"). The table fetches the data again and the footer totals follow. The filter stays there for as long as the user's session lasts.

Table filtered by the Paid status, with the active filter tag and updated totals
Filtered by "Paid": 24 sales remain, with the footer totals recalculated.

Filter straight from the column header

Besides the bar, each filterable column has its own filter in the header. It also works on columns that come from another table, like Customer. And it can use an operator: on Total, the filter brings the values greater than or equal to what you type (col-filter=">=").

Filter open in the header of the Customer column
Filter in the Customer header, a column that comes from the customers table.
Filter with an operator open in the header of the Total column
Total filter with the greater-than-or-equal operator.

Sort with a click on the header

One click sorts the column and another reverses the order. An indicator in the header shows which column is active. Sorting happens on the server, so it applies to all the sales, not just the ones on the page.

List view sorted by Total
Sales sorted by Total, with the indicator in the column header.

One search for the whole table

A single field looks for the term in the text columns you choose. Here, "PIX" brings only the sales paid by Pix.

Search for PIX in the sales list view
Search for "PIX": only the sales with that payment method remain.

Sales grouped by salesperson, with subtotals

With two attributes, the table groups the rows. Each group shows how many records it has and its subtotals, and you can collapse a group with one click:

resources/views/…blade.php
<mad-grid self group-by="vendedor" group-total>
Table grouped by salesperson with item and amount subtotals in each group
Grouped by salesperson: each group with the count and the sum of Items and Total.

Footer totals that respect the filter

Mark a column with total="sum" and the footer adds up the values. The calculation respects the filter, the search and the page you are on. Besides the sum, you can show the average, count, minimum and maximum (avg, count, min, max).

Table footer with the totals for Items and Total
The footer with the sum of Items and the sum of Total.

Dates that say how long ago

When the default format isn't enough, a PHP method decides what the cell shows. In the Registered column, the date becomes readable text, like "1 month ago" or "in 2 days". The method receives the value and the whole row (($value, $row)) and works for any column.

app/Control/…php
// App\Transformer\GridTransformer — generated in the Transformers panelpublic static function registradaHa(mixed $value, object $row): string{return \Carbon\Carbon::parse((string) $value)->locale('en')->diffForHumans();}
Registered column with relative dates
Registered column: the creation date shows up as relative time.

Columns that only appear when they make sense

A method that answers yes or no decides whether the column appears (display-condition). Here, Tenant and Unit only appear when the app runs in multi-tenant mode. See the same table with and without those columns:

resources/views/…blade.php
<mad-col field="{tenant->name}" label="Tenant"display-condition="GridTransformer::multiTenant" />// no-args method that returns bool — decides whether the whole column existspublic static function multiTenant(): bool { return false; }
Table with the Tenant and Unit columns
With the condition on, Tenant and Unit appear.
Table without the Tenant and Unit columns
With the condition off, both columns disappear from the table and from the export.

Export to CSV, Excel or PDF

The Export button generates all three formats. The file comes out with whatever filters, search and sorting are active on the screen.

Export menu with CSV, Excel and PDF
The list view's Export menu, with the CSV, Excel and PDF options.

The PDF comes out ready to circulate in the company

These are the same 52 sales, exported. The PDF has the app's name at the top, the groups with subtotals, the colored status, alternating rows, the grand total and Page X of Y numbering. It runs 4 pages, and the table header repeats on each one.

First page of the exported PDF: sales report grouped by customer, with subtotals and colored statuses
Page 1 of the exported PDF: sales grouped by customer, with item and amount subtotals and each sale's status.
Page 2 of the exported PDF Page 3 of the exported PDF Page 4 of the exported PDF, with the grand total
Open the exported PDF (4 pages, in Portuguese)

Edit the value without leaving the table

In the columns you mark as editable, the value changes right there in the cell. The editor opens on a double click, on a single click, or stays always visible. There are 12 editor types:

TextOption listDateDate and timeNumberNumber with prefix and suffixCurrencyLong textDatabase listDatabase lookupColorCounter with + and -
Currency editor open in the Total cell after a double click
Double click on Total: the currency field opens in the cell itself, with the currency prefix.

And more

Columns calculated from other columnsUsers choose which columns they want to seeCard mode, with title, image and highlightRow actions that appear depending on the dataAdjustable number of rows per pageFilters kept during each user's session

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.