Estrutura de formulário
mad-detail-form
mad-detail-fields
Modo inline
mad-detail-form embutido na página + mad-detail-fields; auto-carrega os itens reais do pedido de demonstração.
resources/views/tutor/examples/estrutura-detail-form/inline.blade.php
<mad-form submit="onSubmitDetailFormInline">
<mad-form-section title="Pedido (mestre)" icon="shopping-cart">
<mad-form-grid :cols="2">
<mad-form-grid-item :span="2">
<mad-input-field name="descricao" label="Descrição" required />
</mad-form-grid-item>
<mad-dbselect-field name="cliente_id" label="Cliente"
model="TutorDemoCliente" database="business" display="{nome}" order-by="nome" required />
<mad-dbselect-field name="estado_id" label="Estado"
model="TutorDemoEstadoPedido" database="business" display="{nome}" order-by="ordem" required />
</mad-form-grid>
</mad-form-section>
<mad-form-section title="Itens (modo inline)" icon="list"
subtitle="grid embutida na própria página; auto-carrega os itens reais do pedido de demonstração">
<mad-detail-form name="itens_inline" model="TutorDemoPedidoItem" foreign-key="pedido_id" database="business"
mode="inline" form-cols="2" form-title="Item do pedido" add-label="Adicionar item"
addable removable editable>
<mad-detail-fields>
<mad-form-grid :cols="2">
<mad-input-field name="descricao" label="Descrição" required />
<mad-number-field name="qtd" label="Qtd" step="1" />
<mad-money-field name="valor_unit" label="Valor unit." prefix="R$" />
</mad-form-grid>
</mad-detail-fields>
<mad-col field="descricao" label="Descrição" />
<mad-col field="qtd" label="Qtd" width="80px" />
<mad-col field="valor_unit" label="Valor unit." width="130px" money="R$" />
<mad-col field="total" label="Total" width="130px" money="R$" total="sum" />
</mad-detail-form>
</mad-form-section>
<mad-form-actions align="right">
<mad-btn type="submit" variant="primary" icon="send">Enviar (onSubmitDetailFormInline)</mad-btn>
</mad-form-actions>
</mad-form>
app/control/Tutor/TutorEstruturaDetailForm.php
/**
* Submit do exemplo "Modo inline" — lê os itens via getFieldList() (sem
* persistir) e devolve um toast com o resumo do payload recebido.
*/
public function onSubmitDetailFormInline(): MadResponse
{
$itens = $this->form->getFieldList('itens_inline');
$qtdTotal = 0.0;
$valorTotal = 0.0;
foreach ($itens as $row) {
$qtd = (float) ($row['qtd'] ?? 0);
$qtdTotal += $qtd;
$valorTotal += $qtd * (float) ($row['valor_unit'] ?? 0);
}
$resumo = count($itens) . ' item(ns), qtd total ' . rtrim(rtrim(number_format($qtdTotal, 2, ',', '.'), '0'), ',')
. ', valor total R$ ' . number_format($valorTotal, 2, ',', '.');
return (new MadResponse())
->toast("Detail form recebido: {$resumo}", 'success', 'onSubmitDetailFormInline');
}
Modo drawer
mesmo model+foreign-key, mode=drawer — adicionar/editar item abre um drawer lateral.
| Descrição | Qtd | Valor unit. | Total | Ações |
|---|---|---|---|---|
|
|
||||
|
Nenhum item adicionado
|
||||
resources/views/tutor/examples/estrutura-detail-form/drawer.blade.php
<mad-detail-form name="itens_drawer" model="TutorDemoPedidoItem" foreign-key="pedido_id" database="business"
mode="drawer" form-cols="2" form-title="Item do pedido" add-label="Adicionar item"
addable removable editable>
<mad-detail-fields>
<mad-form-grid :cols="2">
<mad-input-field name="descricao" label="Descrição" required />
<mad-number-field name="qtd" label="Qtd" step="1" />
<mad-money-field name="valor_unit" label="Valor unit." prefix="R$" />
</mad-form-grid>
</mad-detail-fields>
<mad-col field="descricao" label="Descrição" />
<mad-col field="qtd" label="Qtd" width="80px" />
<mad-col field="valor_unit" label="Valor unit." width="130px" money="R$" />
<mad-col field="total" label="Total" width="130px" money="R$" total="sum" />
</mad-detail-form>
Modo modal
mesmo model+foreign-key, mode=modal — adicionar/editar item abre um modal centralizado.
| Descrição | Qtd | Valor unit. | Total | Ações |
|---|---|---|---|---|
|
|
||||
|
Nenhum item adicionado
|
||||
resources/views/tutor/examples/estrutura-detail-form/modal.blade.php
<mad-detail-form name="itens_modal" model="TutorDemoPedidoItem" foreign-key="pedido_id" database="business"
mode="modal" form-cols="3" form-title="Item do pedido" add-label="Adicionar item"
addable removable editable>
<mad-detail-fields>
<mad-form-grid :cols="3">
<mad-input-field name="descricao" label="Descrição" required />
<mad-number-field name="qtd" label="Qtd" step="1" />
<mad-money-field name="valor_unit" label="Valor unit." prefix="R$" />
</mad-form-grid>
</mad-detail-fields>
<mad-col field="descricao" label="Descrição" />
<mad-col field="qtd" label="Qtd" width="80px" />
<mad-col field="valor_unit" label="Valor unit." width="130px" money="R$" />
<mad-col field="total" label="Total" width="130px" money="R$" total="sum" />
</mad-detail-form>
Código-fonte completo da página
app/control/Tutor/TutorEstruturaDetailForm.php
<?php
namespace App\Control\Tutor;
use App\Models\TutorDemo\TutorDemoPedido;
use App\Support\Tutor\TutorDemoSeed;
use App\Support\Tutor\TutorPage;
use Mad\Form\MadForm;
use Mad\Http\MadResponse;
/**
* TutorEstruturaDetailForm — cobre <mad-detail-form> nos 3 modos
* (inline/drawer/modal) e <mad-detail-fields>.
*
* Os 3 exemplos apontam pro MESMO model+foreign-key (TutorDemoPedidoItem via
* pedido_id) e por isso auto-carregam os MESMOS itens reais — a diferença
* entre eles é só a UX (grid embutida vs drawer vs modal). Nenhum exemplo
* chama $form->save(): o submit do exemplo "inline" só lê o payload via
* getFieldList() e devolve toast (nível demo, sem persistência).
*/
class TutorEstruturaDetailForm extends TutorPage
{
protected string $catalogKey = 'estrutura_detail_form';
public MadForm $form;
public function mount(array $params = []): void
{
TutorDemoSeed::ensure();
$this->form = new MadForm('tutor_estrutura_detail_form');
$pedido = TutorDemoPedido::query()->has('itens')->oldest('id')->first();
if ($pedido) {
// fill() com OBJETO Eloquent guarda o _sourceRecord — é o que os
// <mad-detail-form> abaixo usam pra auto-carregar os itens reais
// (model + foreign-key, sem precisar de rows explícitas).
$this->form->fill($pedido);
}
}
/**
* Submit do exemplo "Modo inline" — lê os itens via getFieldList() (sem
* persistir) e devolve um toast com o resumo do payload recebido.
*/
public function onSubmitDetailFormInline(): MadResponse
{
$itens = $this->form->getFieldList('itens_inline');
$qtdTotal = 0.0;
$valorTotal = 0.0;
foreach ($itens as $row) {
$qtd = (float) ($row['qtd'] ?? 0);
$qtdTotal += $qtd;
$valorTotal += $qtd * (float) ($row['valor_unit'] ?? 0);
}
$resumo = count($itens) . ' item(ns), qtd total ' . rtrim(rtrim(number_format($qtdTotal, 2, ',', '.'), '0'), ',')
. ', valor total R$ ' . number_format($valorTotal, 2, ',', '.');
return (new MadResponse())
->toast("Detail form recebido: {$resumo}", 'success', 'onSubmitDetailFormInline');
}
}
resources/views/tutor/estrutura/detail-form.blade.php
<x-tutor-page page="estrutura_detail_form">
<x-tutor-demo demo="tutor.examples.estrutura-detail-form.inline"
title="Modo inline" desc="mad-detail-form embutido na página + mad-detail-fields; auto-carrega os itens reais do pedido de demonstração."
php="TutorEstruturaDetailForm::onSubmitDetailFormInline" />
<x-tutor-demo demo="tutor.examples.estrutura-detail-form.drawer"
title="Modo drawer" desc="mesmo model+foreign-key, mode=drawer — adicionar/editar item abre um drawer lateral." />
<x-tutor-demo demo="tutor.examples.estrutura-detail-form.modal"
title="Modo modal" desc="mesmo model+foreign-key, mode=modal — adicionar/editar item abre um modal centralizado." />
</x-tutor-page>