Docs›Services›MadConfirm
Services

MadConfirm

Confirmação com botões custom — builder PHP sobre MadDialog (JS puro, sem libs externas).

Mad\Ui\MadConfirm é o builder fluente por trás de MadMessage::confirm() — monta um diálogo modal (tipo warning, via MadDialog) com um ou mais botões, cada um disparando um método PHP do componente alvo via MadWire.call() quando clicado. Não é instanciado diretamente — sempre via MadMessage::confirm(...).

Não confundir com `window.madConfirm()`

O JS global madConfirm(mensagem, opções) (e o atributo data-mad-confirm usado por mad:click/mad-act via confirm="...") é um diálogo client-side simples (Promise<boolean>, sim/não) que decide se uma ação local prossegue — não chama o servidor e não tem botões customizados. O Mad\Ui\MadConfirm desta página é uma classe PHP que roda dentro de uma action e decide, no servidor, quais métodos cada botão dispara. São dois mecanismos diferentes com nomes parecidos.

Uso básico — confirmar/cancelar

use Mad\Ui\MadMessage;
use Mad\Http\MadResponse;

public function onExcluir(int $id): MadResponse
{
    return MadMessage::confirm('Excluir', 'Confirmar exclusão do registro #' . $id . '?', $this)
        ->onConfirm('deletar', [$id])  // botão primário — chama $this->deletar($id)
        ->onCancel()                   // botão secundário — só fecha o diálogo
        ->build();
}

public function deletar(int $id): MadResponse
{
    Produto::destroy($id);

    return MadToast::success('Excluído!')->removeRow($id, static::class);
}

API

MétodoRetornoDescrição
button($label, $action, $params = [], $variant = 'secondary', $madId = '')staticAdiciona um botão genérico que chama $action do componente alvo.
onConfirm($action, $params = [], $label = 'Confirmar', $variant = 'primary', $madId = '')staticAtalho para o botão de confirmação principal (destaque, lado direito).
onCancel($label = 'Cancelar')staticBotão que só fecha o diálogo — não chama nenhum método PHP.
build()MadResponseFinaliza o builder — obrigatório chamar por último.

$variant aceita as mesmas variantes de botão do resto do framework: primary, secondary, destructive, ghost, outline. Sem nenhum botão adicionado, build() cai no fallback de um único botão "OK" que só fecha o diálogo.

O ícone do diálogo vem do 4º argumento de MadMessage::confirm($title, $content, $component, $icon) — nome de ícone Lucide, default alert-triangle. O type do dialog é sempre warning em MadConfirm (não é configurável).

Múltiplos botões

Quando a confirmação tem mais de duas saídas possíveis, encadeie vários button():

use Mad\Ui\MadMessage;
use Mad\Http\MadResponse;

public function onPublicar(int $id): MadResponse
{
    return MadMessage::confirm('Publicar', 'Escolha como deseja prosseguir:', $this)
        ->button('Publicar agora',  'publicar',       [$id], 'primary')
        ->button('Salvar rascunho', 'salvarRascunho', [$id])              // variant default: secondary
        ->onCancel('Fechar')
        ->build();
}

Direcionando para outro componente

Por padrão os botões chamam métodos do componente passado como terceiro argumento de MadMessage::confirm() (normalmente $this). Cada button()/onConfirm() aceita um $madId próprio para sobrescrever esse alvo por botão — ou você pode passar uma string de mad-id direto no confirm():

// O 3º parâmetro de MadMessage::confirm() aceita string (mad-id explícito) —
// útil quando o botão precisa chamar um método de OUTRO componente da tela,
// não do componente que disparou o diálogo.
return MadMessage::confirm('Aprovar pedido', 'Confirmar aprovação?', 'pedido-detalhe-123')
    ->onConfirm('aprovar', [$pedidoId])
    ->build();

O que build() gera

build() serializa título/ícone/mensagem com json_encode (seguro contra HTML/aspas) e monta os callbacks dos botões como expressões JS MadWire.call(madId, action, params) — o resultado é um MadResponse com um único op script chamando MadDialog.show(...):

// build() monta e devolve um MadResponse com um único op script:
MadDialog.show({
    "type": "warning",
    "title": "Excluir",
    "message": "Confirmar exclusão do registro #42?",
    "icon": "alert-triangle",
    "buttons": [
        { "label": "Confirmar", "type": "primary",   "callback": () => MadWire.call("cmp-a1b2", "deletar", [42]) },
        { "label": "Cancelar",  "type": "secondary", "callback": null }
    ]
});

Próximos passos