Tipo de página

Formulário: do cadastro simples à venda com itens.

A tela abaixo é o Cadastro de venda do app de exemplo, publicado no Teste Online. É o mesmo cadastro que alimenta a listagem e o PDF da página de Listagem. Tem cliente escolhido do banco, data, total calculado e os itens da venda.

Um cadastro de venda com os itens na mesma tela

O formulário abre num painel lateral, dividido em seções e em duas colunas. O cliente vem de uma lista do banco e a data tem máscara. O Valor Total não se digita: é a soma dos itens da venda. Tudo isso fica declarado assim:

resources/views/…blade.php
<mad-form submit="onSave"><mad-form-section title="Cadastro de venda" 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="Data da Venda" :required="true" /><mad-money-field name="valor_total" label="Valor Total" prefix="R$" :readonly="true" /></mad-form-grid></mad-form-section>...</mad-form>
Cadastro de venda num painel lateral, com os itens da venda logo abaixo
Venda 1052 em edição: os 2 itens somam exatamente o Valor Total de R$ 13.386,62.

Painel, janela, página inteira ou embaixo da linha

O mesmo formulário pode abrir de quatro jeitos. No controller, uma linha escolhe entre painel lateral (DRAWER, como acima), janela central (MODAL) ou página inteira (INTERNAL). Na listagem, o atributo row no botão de editar abre o formulário logo embaixo da linha. Você edita rápido e não perde a tabela de vista.

resources/views/…blade.php
{{-- no controller do form: como ele abre --}}protected static string $wrapper = self::DRAWER;   {{-- painel lateral --}}protected static string $wrapper = self::MODAL;    {{-- diálogo central --}}protected static string $wrapper = self::INTERNAL; {{-- página inteira --}}{{-- na listagem: o MESMO form, anexado embaixo da linha --}}<mad-nav icon="pencil" label="Editar"navigate="VendaForm::onEdit({id})" row />
Cadastro de venda aberto numa janela central sobre a listagem
Janela central: o mesmo cadastro da venda 1052, com todos os itens, aberto sobre a listagem.
Formulário de venda aberto embaixo da linha 1052 da listagem
Na linha: o formulário abre colado na venda 1052, e a tabela continua logo abaixo.

Os itens da venda são gravados junto com ela

O bloco de itens (<mad-detail-form>) deixa você adicionar, editar e remover os itens na mesma tela. Ao salvar, o formulário acerta os itens sozinho: inclui os novos, atualiza os editados e apaga os removidos. Para campos calculados, como o nome do produto e o total de cada item, o controller tem dois pontos de entrada (onLoadDetail e 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="R$" :required="true" /><mad-money-field name="valor_total" prefix="R$" :readonly="true" /></mad-form-grid></mad-detail-fields><mad-columns><mad-col field="produto_nome" label="Produto" /><mad-col field="valor_total" label="Valor Total" right money="R$" total="sum" /></mad-columns></mad-detail-form>
Painel do item da venda com produto, quantidade e valores
Cada item abre no seu próprio painel, com produto do banco, quantidade e valores com máscara de moeda.

O erro aparece no campo, sem perder o que você digitou

As regras de validação ficam no model (Venda::rules()). Ao salvar, o servidor confere os dados e a mensagem volta no próprio campo. A página não recarrega e nada do que foi digitado se perde.

Mensagem de erro no campo Data da Venda
Salvar sem a data: a mensagem "O campo data venda é obrigatório." aparece no próprio campo.

Listas do banco com busca, cascata e cadastro rápido

Um campo ligado a outra tabela vira uma lista com busca (dbcombo). Para listas grandes, a busca vai ao servidor enquanto você digita (dbunique-search), e também há uma janela de pesquisa com colunas (seek). Uma lista pode depender de outra, como cidade e estado. Se o registro não existe, o cadastro rápido cria na hora, sem sair do formulário:

resources/views/…blade.php
{{-- Cascata 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" />{{-- Não achou? Cadastro rápido inline, sem sair do form --}}<mad-dbcombo-field name="cliente_id" model="Pessoa" display="nome"no-results-quick-register-action="ClienteForm::quickRegister" />
Lista de clientes aberta com busca, destacando o trecho encontrado
Busca por "pa" na lista de clientes: Padaria Pão da Vila aparece com o trecho destacado.

Campos que já chegam com máscara e formato

Moeda com prefixo e casas decimais, número no formato brasileiro, data com calendário, data e hora, CEP, cor, contador. São mais de 40 tipos de campo, e o assistente escolhe o certo a partir do tipo da coluna.

Calendário aberto no campo Data da Venda
O calendário do campo de data, igual em qualquer app gerado.

E mais

Mais de 40 tipos de campo prontosUpload de arquivo e imagemCampos preenchidos sozinhos ao escolher um registroPesquisa numa janela com colunasSeleção múltipla em etiquetas, caixas de marcação ou tabela de ligaçãoSeções, abas e colunas de layoutCampos que reagem ao que você digita, sem recarregar a telaSeu código em blocos protegidos continua lá quando a tela é gerada de novo

Veja a listagem em detalhe ou conheça os tipos de página.

Crie a conta, monte uma tela, baixe o projeto.

Sem demo agendada e sem call de descoberta. Se o Laravel que sair não passar na revisão do seu time, você perdeu uma tarde.

  1. Crie a contaBeta aberto, sem cartão.
  2. Monte uma telaNo visual, no código ou pedindo à IA.
  3. Baixe o .zipUm projeto Laravel que roda onde você quiser.