MAD Lab
/
Tutor > Estrutura de formulário > Detail form

Detail form

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.

R$

Descrição Qtd Valor unit. Total Ações
Nenhum item adicionado
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.

Item do pedido

R$

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>