Confirmar a exclusão no modal / caixa de diálogo usando o Twitter Bootstrap?

284

Eu tenho uma tabela HTML de linhas vinculadas às linhas do banco de dados. Gostaria de ter um link "excluir linha" para cada linha, mas gostaria de confirmar com o usuário antecipadamente.

Existe alguma maneira de fazer isso usando o diálogo modal do Twitter Bootstrap?

SWL
fonte
4
jsfiddle.net/MjmVr/363
joni jones
3
Depois de me deparar com essa pergunta, eu queria conversar com (o que me parece) uma "correção" tão simples e mais simplificada para esse problema. Eu lutei com ele por um tempo e depois percebi o quão simples pode ser: basta colocar o botão de envio do formulário na caixa de diálogo modal e, em seguida, o botão enviar no próprio formulário não faz nada além de acionar a janela da caixa de diálogo ... problema resolvido.
22816 Michael Doleman
@jonijones este exemplo não está funcionando para mim (a mensagem de confirmação não é exibida após o clique do primeiro botão) - testada em cromo
egmfrs

Respostas:

396

GET receita

Para esta tarefa, você pode usar plugins e extensões de inicialização já disponíveis. Ou você pode criar seu próprio pop-up de confirmação com apenas 3 linhas de código. Confira.

Digamos que tenhamos esses links (observe em data-hrefvez de href) ou botões para os quais queremos receber a confirmação de exclusão:

<a href="#" data-href="delete.php?id=23" data-toggle="modal" data-target="#confirm-delete">Delete record #23</a>

<button class="btn btn-default" data-href="/delete.php?id=54" data-toggle="modal" data-target="#confirm-delete">
    Delete record #54
</button>

Aqui #confirm-deleteaponta para uma div pop-up modal no seu HTML. Ele deve ter um botão "OK" configurado assim:

<div class="modal fade" id="confirm-delete" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
    <div class="modal-dialog">
        <div class="modal-content">
            <div class="modal-header">
                ...
            </div>
            <div class="modal-body">
                ...
            </div>
            <div class="modal-footer">
                <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button>
                <a class="btn btn-danger btn-ok">Delete</a>
            </div>
        </div>
    </div>
</div>

Agora você só precisa desse pequeno javascript para tornar confirmada uma ação de exclusão:

$('#confirm-delete').on('show.bs.modal', function(e) {
    $(this).find('.btn-ok').attr('href', $(e.relatedTarget).data('href'));
});

O show.bs.modalbotão de exclusão do evento ativado hrefé definido como URL com o ID de registro correspondente.

Demo: http://plnkr.co/edit/NePR0BQf3VmKtuMmhVR7?p=preview


Receita POST

Sei que, em alguns casos, pode ser necessário executar a solicitação POST ou DELETE em vez de GET. Ainda é bastante simples, sem muito código. Dê uma olhada na demonstração abaixo com esta abordagem:

// Bind click to OK button within popup
$('#confirm-delete').on('click', '.btn-ok', function(e) {

  var $modalDiv = $(e.delegateTarget);
  var id = $(this).data('recordId');

  $modalDiv.addClass('loading');
  $.post('/api/record/' + id).then(function() {
     $modalDiv.modal('hide').removeClass('loading');
  });
});

// Bind to modal opening to set necessary data properties to be used to make request
$('#confirm-delete').on('show.bs.modal', function(e) {
  var data = $(e.relatedTarget).data();
  $('.title', this).text(data.recordTitle);
  $('.btn-ok', this).data('recordId', data.recordId);
});

Demo: http://plnkr.co/edit/V4GUuSueuuxiGr4L9LmG?p=preview


Bootstrap 2.3

Aqui está uma versão original do código que eu criei quando estava respondendo a essa pergunta para o modal Bootstrap 2.3.

$('#modal').on('show', function() {
    var id = $(this).data('id'),
        removeBtn = $(this).find('.danger');
    removeBtn.attr('href', removeBtn.attr('href').replace(/(&|\?)ref=\d*/, '$1ref=' + id));
});

Demo : http://jsfiddle.net/MjmVr/1595/

dfsq
fonte
1
Isso funciona quase perfeitamente, mas mesmo na versão menor (como no meu site), o ID não é passado para o botão Sim no modal. Percebi que você está tentando substituir & ref em vez de ? Ref, então tentei mudar isso, mas ainda não está funcionando. Estou faltando alguma outra coisa aqui? Caso contrário, isso é ótimo, então TIA por sua ajuda!
SWL
Obrigado @dfsq - isso funcionou lindamente. A caixa de diálogo não está oculta ao clicar no botão 'não', então mudei o href para # em vez de ocultar modal e que também funciona. Obrigado novamente por sua ajuda.
SWL
22
Um ajuste é a solicitação de exclusão final, que deve resultar em uma postagem, não em um GEt, como você faria com um link. Se você permitir Excluir em um GET, terceiros mal-intencionados poderão criar links facilmente em sites ou e-mails que fazem com que o usuário exclua coisas involuntariamente. Pode parecer bobagem, mas há cenários em que isso seria um sério problema de segurança.
AaronLS 14/03
2
Você pode dar uma olhada no Vex . Muito mais simples de fazer o que você está pedindo: jsfiddle.net/adamschwartz/hQump .
12113 Adam
3
Tentou diminuir o voto por usar um GET para executar uma ação destrutiva. Existem muitas e diferentes razões pelas quais você nunca deve fazer isso.
NickG
158

http://bootboxjs.com/ - trabalhos mais recentes com o Bootstrap 3.0.0

O exemplo mais simples possível:

bootbox.alert("Hello world!"); 

Do site:

A biblioteca expõe três métodos projetados para imitar seus equivalentes JavaScript nativos. Suas assinaturas exatas de método são flexíveis, pois cada uma pode usar vários parâmetros para personalizar rótulos e especificar padrões, mas geralmente são chamados assim:

bootbox.alert(message, callback)
bootbox.prompt(message, callback)
bootbox.confirm(message, callback)

Aqui está um trecho dele em ação (clique em "Executar trecho de código" abaixo):

$(function() {
  bootbox.alert("Hello world!");
});
<!-- required includes -->
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.2/js/bootstrap.min.js"></script>
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.2/css/bootstrap.min.css" rel="stylesheet"/>

<!-- bootbox.js at 4.4.0 -->
<script src="https://rawgit.com/makeusabrew/bootbox/f3a04a57877cab071738de558581fbc91812dce9/bootbox.js"></script>

Rifat
fonte
2
Infelizmente, no momento em que você precisa de texto em inglês no título e nos botões, você precisa modificar o JS ou começar a parametrizar quase o mesmo que adicionar o html de inicialização e o JS. :)
Johncl
31
  // ---------------------------------------------------------- Generic Confirm  

  function confirm(heading, question, cancelButtonTxt, okButtonTxt, callback) {

    var confirmModal = 
      $('<div class="modal hide fade">' +    
          '<div class="modal-header">' +
            '<a class="close" data-dismiss="modal" >&times;</a>' +
            '<h3>' + heading +'</h3>' +
          '</div>' +

          '<div class="modal-body">' +
            '<p>' + question + '</p>' +
          '</div>' +

          '<div class="modal-footer">' +
            '<a href="#" class="btn" data-dismiss="modal">' + 
              cancelButtonTxt + 
            '</a>' +
            '<a href="#" id="okButton" class="btn btn-primary">' + 
              okButtonTxt + 
            '</a>' +
          '</div>' +
        '</div>');

    confirmModal.find('#okButton').click(function(event) {
      callback();
      confirmModal.modal('hide');
    });

    confirmModal.modal('show');     
  };

  // ---------------------------------------------------------- Confirm Put To Use

  $("i#deleteTransaction").live("click", function(event) {
    // get txn id from current table row
    var id = $(this).data('id');

    var heading = 'Confirm Transaction Delete';
    var question = 'Please confirm that you wish to delete transaction ' + id + '.';
    var cancelButtonTxt = 'Cancel';
    var okButtonTxt = 'Confirm';

    var callback = function() {
      alert('delete confirmed ' + id);
    };

    confirm(heading, question, cancelButtonTxt, okButtonTxt, callback);

  });
jousby
fonte
1
É um post antigo, mas eu quero a mesma coisa, mas quando eu uso o código acima, o diálogo modal mostra dosent?
Saurabh
28

Eu perceberia que é uma pergunta muito antiga, mas desde que me perguntei hoje sobre um método mais eficiente de lidar com os modais de inicialização. Eu fiz algumas pesquisas e encontrei algo melhor do que as soluções mostradas acima, que podem ser encontradas neste link:

http://www.petefreitag.com/item/809.cfm

Primeiro carregue o jquery

$(document).ready(function() {
    $('a[data-confirm]').click(function(ev) {
        var href = $(this).attr('href');

        if (!$('#dataConfirmModal').length) {
            $('body').append('<div id="dataConfirmModal" class="modal" role="dialog" aria-labelledby="dataConfirmLabel" aria-hidden="true"><div class="modal-header"><button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button><h3 id="dataConfirmLabel">Please Confirm</h3></div><div class="modal-body"></div><div class="modal-footer"><button class="btn" data-dismiss="modal" aria-hidden="true">Cancel</button><a class="btn btn-primary" id="dataConfirmOK">OK</a></div></div>');
        } 
        $('#dataConfirmModal').find('.modal-body').text($(this).attr('data-confirm'));
        $('#dataConfirmOK').attr('href', href);
        $('#dataConfirmModal').modal({show:true});
        return false;
    });
});

Em seguida, basta fazer qualquer pergunta / confirmação para href:

<a href="/any/url/delete.php?ref=ID" data-confirm="Are you sure you want to delete?">Delete</a>

Dessa forma, o modal de confirmação é muito mais universal e, portanto, pode ser facilmente reutilizado em outras partes do seu site.

Arjan
fonte
4
Por favor, não publique código de outras fontes sem atribuição: petefreitag.com/item/809.cfm .
Webb: A. Webb
4
Mesmo que a operação tenha esquecido a atribuição a princípio, isso foi a coisa perfeita para mim. Funciona como um encanto.
Janis Peisenieks
3
Eu acho que não é uma boa ideia itens apagar com uma solicitação HTTP GET
Miguel Prz
7
Momma me disse para não clique em nenhum link fusão a frio
Mike Purcell
3
@BenY Não se trata de saber se o usuário tem permissão para fazer as coisas ou não, é sobre usuários mal-intencionados que já têm permissão para fazer coisas sendo enganadas em clicar em links em outros sites, e-mails etc. para que o usuário mal-intencionado possa tirar proveito das permissões desses usuários.
Brett
17

Graças à solução de @ Jousby , também consegui fazer a minha funcionar, mas descobri que precisava melhorar um pouco a marcação modal do Bootstrap da solução para torná-la renderizada corretamente, conforme demonstrado nos exemplos oficiais .

Então, aqui está minha versão modificada da confirmfunção genérica que funcionou bem:

/* Generic Confirm func */
  function confirm(heading, question, cancelButtonTxt, okButtonTxt, callback) {

    var confirmModal = 
      $('<div class="modal fade">' +        
          '<div class="modal-dialog">' +
          '<div class="modal-content">' +
          '<div class="modal-header">' +
            '<a class="close" data-dismiss="modal" >&times;</a>' +
            '<h3>' + heading +'</h3>' +
          '</div>' +

          '<div class="modal-body">' +
            '<p>' + question + '</p>' +
          '</div>' +

          '<div class="modal-footer">' +
            '<a href="#!" class="btn" data-dismiss="modal">' + 
              cancelButtonTxt + 
            '</a>' +
            '<a href="#!" id="okButton" class="btn btn-primary">' + 
              okButtonTxt + 
            '</a>' +
          '</div>' +
          '</div>' +
          '</div>' +
        '</div>');

    confirmModal.find('#okButton').click(function(event) {
      callback();
      confirmModal.modal('hide');
    }); 

    confirmModal.modal('show');    
  };  
/* END Generic Confirm func */
nemesisfixx
fonte
3
Ótima solução aqui. Fiz algumas pequenas modificações para lidar com um retorno de chamada para o link de cancelamento. Uma pequena recomendação use #! em vez de # no seu href para impedir que a página role para o topo.
Domenic D.
Se eu pudesse duplicar a votação, eu o faria. Agradável e elegante. Obrigado.
Nigel Johnson
Solução muito boa. Mais uma melhoria que posso sugerir é adicionar outro argumento: btnType = "btn-primary"e depois alterar o código para o botão OK conter class="btn ' + btnType + '". Dessa forma, pode-se passar um argumento opcional para alterar a aparência do botão OK, como btn-dangerpara uma exclusão.
IamNaN 15/07/19
Obrigado. Eu tive que trocar as tags <h3> e <a> (h3 primeiro) para que isso fosse renderizado corretamente.
Dave Dawkins
10

Achei isso útil e fácil de usar, além de bonito: http://maxailloud.github.io/confirm-bootstrap/ .

Para usá-lo, inclua o arquivo .js na sua página e execute:

$('your-link-selector').confirmModal();

Existem várias opções que você pode aplicar a ele, para torná-lo melhor ao confirmar a exclusão, eu uso:

$('your-link-selector').confirmModal({
    confirmTitle: 'Please confirm',
    confirmMessage: 'Are you sure you want to delete this?',
    confirmStyle: 'danger',
    confirmOk: '<i class="icon-trash icon-white"></i> Delete',
    confirmCallback: function (target) {
         //perform the deletion here, or leave this option
         //out to just follow link..
    }
});
Mark Rhodes
fonte
essa é uma boa lib
loretoparisi
4

Eu posso lidar facilmente com esse tipo de tarefa usando a biblioteca bootbox.js. No início, você precisa incluir o arquivo JS da caixa de inicialização. Em sua função de manipulador de eventos, basta escrever o seguinte código:

    bootbox.confirm("Are you sure to want to delete , function(result) {

    //here result will be true
    // delete process code goes here

    });

Bootboxjs offical local

karim_fci
fonte
2

A solução a seguir é melhor que o bootbox.js , porque

  • Ele pode fazer tudo o que o bootbox.js pode fazer;
  • A sintaxe de uso é mais simples
  • Permite controlar de forma elegante a cor da sua mensagem usando "erro", "aviso" ou "informação"
  • O Bootbox tem 986 linhas, o meu apenas 110 linhas

digimango.messagebox.js :

const dialogTemplate = '\
    <div class ="modal" id="digimango_messageBox" role="dialog">\
        <div class ="modal-dialog">\
            <div class ="modal-content">\
                <div class ="modal-body">\
                    <p class ="text-success" id="digimango_messageBoxMessage">Some text in the modal.</p>\
                    <p><textarea id="digimango_messageBoxTextArea" cols="70" rows="5"></textarea></p>\
                </div>\
                <div class ="modal-footer">\
                    <button type="button" class ="btn btn-primary" id="digimango_messageBoxOkButton">OK</button>\
                    <button type="button" class ="btn btn-default" data-dismiss="modal" id="digimango_messageBoxCancelButton">Cancel</button>\
                </div>\
            </div>\
        </div>\
    </div>';


// See the comment inside function digimango_onOkClick(event) {
var digimango_numOfDialogsOpened = 0;


function messageBox(msg, significance, options, actionConfirmedCallback) {
    if ($('#digimango_MessageBoxContainer').length == 0) {
        var iDiv = document.createElement('div');
        iDiv.id = 'digimango_MessageBoxContainer';
        document.getElementsByTagName('body')[0].appendChild(iDiv);
        $("#digimango_MessageBoxContainer").html(dialogTemplate);
    }

    var okButtonName, cancelButtonName, showTextBox, textBoxDefaultText;

    if (options == null) {
        okButtonName = 'OK';
        cancelButtonName = null;
        showTextBox = null;
        textBoxDefaultText = null;
    } else {
        okButtonName = options.okButtonName;
        cancelButtonName = options.cancelButtonName;
        showTextBox = options.showTextBox;
        textBoxDefaultText = options.textBoxDefaultText;
    }

    if (showTextBox == true) {
        if (textBoxDefaultText == null)
            $('#digimango_messageBoxTextArea').val('');
        else
            $('#digimango_messageBoxTextArea').val(textBoxDefaultText);

        $('#digimango_messageBoxTextArea').show();
    }
    else
        $('#digimango_messageBoxTextArea').hide();

    if (okButtonName != null)
        $('#digimango_messageBoxOkButton').html(okButtonName);
    else
        $('#digimango_messageBoxOkButton').html('OK');

    if (cancelButtonName == null)
        $('#digimango_messageBoxCancelButton').hide();
    else {
        $('#digimango_messageBoxCancelButton').show();
        $('#digimango_messageBoxCancelButton').html(cancelButtonName);
    }

    $('#digimango_messageBoxOkButton').unbind('click');
    $('#digimango_messageBoxOkButton').on('click', { callback: actionConfirmedCallback }, digimango_onOkClick);

    $('#digimango_messageBoxCancelButton').unbind('click');
    $('#digimango_messageBoxCancelButton').on('click', digimango_onCancelClick);

    var content = $("#digimango_messageBoxMessage");

    if (significance == 'error')
        content.attr('class', 'text-danger');
    else if (significance == 'warning')
        content.attr('class', 'text-warning');
    else
        content.attr('class', 'text-success');

    content.html(msg);

    if (digimango_numOfDialogsOpened == 0)
        $("#digimango_messageBox").modal();

    digimango_numOfDialogsOpened++;
}

function digimango_onOkClick(event) {
    // JavaScript's nature is unblocking. So the function call in the following line will not block,
    // thus the last line of this function, which is to hide the dialog, is executed before user
    // clicks the "OK" button on the second dialog shown in the callback. Therefore we need to count
    // how many dialogs is currently showing. If we know there is still a dialog being shown, we do
    // not execute the last line in this function.
    if (typeof (event.data.callback) != 'undefined')
        event.data.callback($('#digimango_messageBoxTextArea').val());

    digimango_numOfDialogsOpened--;

    if (digimango_numOfDialogsOpened == 0)
        $('#digimango_messageBox').modal('hide');
}

function digimango_onCancelClick() {
    digimango_numOfDialogsOpened--;

    if (digimango_numOfDialogsOpened == 0)
        $('#digimango_messageBox').modal('hide');
}

Para usar digimango.messagebox.js :

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title>A useful generic message box</title>
    <meta http-equiv="Content-Type" content="text/html;charset=UTF-8" />

    <link rel="stylesheet" type="text/css" href="~/Content/bootstrap.min.css" media="screen" />
    <script src="~/Scripts/jquery-1.10.2.min.js" type="text/javascript"></script>
    <script src="~/Scripts/bootstrap.js" type="text/javascript"></script>
    <script src="~/Scripts/bootbox.js" type="text/javascript"></script>

    <script src="~/Scripts/digimango.messagebox.js" type="text/javascript"></script>


    <script type="text/javascript">
        function testAlert() {
            messageBox('Something went wrong!', 'error');
        }

        function testAlertWithCallback() {
            messageBox('Something went wrong!', 'error', null, function () {
                messageBox('OK clicked.');
            });
        }

        function testConfirm() {
            messageBox('Do you want to proceed?', 'warning', { okButtonName: 'Yes', cancelButtonName: 'No' }, function () {
                messageBox('Are you sure you want to proceed?', 'warning', { okButtonName: 'Yes', cancelButtonName: 'No' });
            });
        }

        function testPrompt() {
            messageBox('How do you feel now?', 'normal', { showTextBox: true }, function (userInput) {
                messageBox('User entered "' + userInput + '".');
            });
        }

        function testPromptWithDefault() {
            messageBox('How do you feel now?', 'normal', { showTextBox: true, textBoxDefaultText: 'I am good!' }, function (userInput) {
                messageBox('User entered "' + userInput + '".');
            });
        }

    </script>
</head>

<body>
    <a href="#" onclick="testAlert();">Test alert</a> <br/>
    <a href="#" onclick="testAlertWithCallback();">Test alert with callback</a> <br />
    <a href="#" onclick="testConfirm();">Test confirm</a> <br/>
    <a href="#" onclick="testPrompt();">Test prompt</a><br />
    <a href="#" onclick="testPromptWithDefault();">Test prompt with default text</a> <br />
</body>

</html>
insira a descrição da imagem aqui

Cara boba
fonte
1

Você pode tentar mais reutilizável minha solução com a função de retorno de chamada . Nesta função, você pode usar a solicitação POST ou alguma lógica. Bibliotecas usadas: JQuery 3> e Bootstrap 3> .

https://jsfiddle.net/axnikitenko/gazbyv8v/

Código html para teste:

...
<body>
    <a href='#' id="remove-btn-a-id" class="btn btn-default">Test Remove Action</a>
</body>
...

Javascript:

$(function () {
    function remove() {
        alert('Remove Action Start!');
    }
    // Example of initializing component data
    this.cmpModalRemove = new ModalConfirmationComponent('remove-data', remove,
        'remove-btn-a-id', {
            txtModalHeader: 'Header Text For Remove', txtModalBody: 'Body For Text Remove',
            txtBtnConfirm: 'Confirm', txtBtnCancel: 'Cancel'
        });
    this.cmpModalRemove.initialize();
});

//----------------------------------------------------------------------------------------------------------------------
// COMPONENT SCRIPT
//----------------------------------------------------------------------------------------------------------------------
/**
 * Script processing data for confirmation dialog.
 * Used libraries: JQuery 3> and Bootstrap 3>.
 *
 * @param name unique component name at page scope
 * @param callback function which processing confirm click
 * @param actionBtnId button for open modal dialog
 * @param text localization data, structure:
 *              > txtModalHeader - text at header of modal dialog
 *              > txtModalBody - text at body of modal dialog
 *              > txtBtnConfirm - text at button for confirm action
 *              > txtBtnCancel - text at button for cancel action
 *
 * @constructor
 * @author Aleksey Nikitenko
 */
function ModalConfirmationComponent(name, callback, actionBtnId, text) {
    this.name = name;
    this.callback = callback;
    // Text data
    this.txtModalHeader =   text.txtModalHeader;
    this.txtModalBody =     text.txtModalBody;
    this.txtBtnConfirm =    text.txtBtnConfirm;
    this.txtBtnCancel =     text.txtBtnCancel;
    // Elements
    this.elmActionBtn = $('#' + actionBtnId);
    this.elmModalDiv = undefined;
    this.elmConfirmBtn = undefined;
}

/**
 * Initialize needed data for current component object.
 * Generate html code and assign actions for needed UI
 * elements.
 */
ModalConfirmationComponent.prototype.initialize = function () {
    // Generate modal html and assign with action button
    $('body').append(this.getHtmlModal());
    this.elmActionBtn.attr('data-toggle', 'modal');
    this.elmActionBtn.attr('data-target', '#'+this.getModalDivId());
    // Initialize needed elements
    this.elmModalDiv =  $('#'+this.getModalDivId());
    this.elmConfirmBtn = $('#'+this.getConfirmBtnId());
    // Assign click function for confirm button
    var object = this;
    this.elmConfirmBtn.click(function() {
        object.elmModalDiv.modal('toggle'); // hide modal
        object.callback(); // run callback function
    });
};

//----------------------------------------------------------------------------------------------------------------------
// HTML GENERATORS
//----------------------------------------------------------------------------------------------------------------------
/**
 * Methods needed for get html code of modal div.
 *
 * @returns {string} html code
 */
ModalConfirmationComponent.prototype.getHtmlModal = function () {
    var result = '<div class="modal fade" id="' + this.getModalDivId() + '"';
    result +=' tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">';
    result += '<div class="modal-dialog"><div class="modal-content"><div class="modal-header">';
    result += this.txtModalHeader + '</div><div class="modal-body">' + this.txtModalBody + '</div>';
    result += '<div class="modal-footer">';
    result += '<button type="button" class="btn btn-default" data-dismiss="modal">';
    result += this.txtBtnCancel + '</button>';
    result += '<button id="'+this.getConfirmBtnId()+'" type="button" class="btn btn-danger">';
    result += this.txtBtnConfirm + '</button>';
    return result+'</div></div></div></div>';
};

//----------------------------------------------------------------------------------------------------------------------
// UTILITY
//----------------------------------------------------------------------------------------------------------------------
/**
 * Get id element with name prefix for this component.
 *
 * @returns {string} element id
 */
ModalConfirmationComponent.prototype.getModalDivId = function () {
    return this.name + '-modal-id';
};

/**
 * Get id element with name prefix for this component.
 *
 * @returns {string} element id
 */
ModalConfirmationComponent.prototype.getConfirmBtnId = function () {
    return this.name + '-confirm-btn-id';
};
Alexey Nikitenko
fonte
0

Quando se trata de um projeto relevante, podemos precisar de algo reutilizável . Isso é algo que eu vim com a ajuda do SO.

confirmDelete.jsp

<!-- Modal Dialog -->
<div class="modal fade" id="confirmDelete" role="dialog" aria-labelledby="confirmDeleteLabel"
 aria-hidden="true">
<div class="modal-dialog">
    <div class="modal-content">
        <div class="modal-header">
            <button type="button" class="close" data-dismiss="modal"
                    aria-hidden="true">&times;</button>
            <h4 class="modal-title">Delete Parmanently</h4>
        </div>
        <div class="modal-body" style="height: 75px">
            <p>Are you sure about this ?</p>
        </div>
        <div class="modal-footer">
            <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button>
            <button type="button" class="btn btn-danger" id="confirm-delete-ok">Ok
            </button>
        </div>
    </div>
</div>

<script type="text/javascript">

    var url_for_deletion = "#";
    var success_redirect = window.location.href;

$('#confirmDelete').on('show.bs.modal', function (e) {
    var message = $(e.relatedTarget).attr('data-message');
    $(this).find('.modal-body p').text(message);
    var title = $(e.relatedTarget).attr('data-title');
    $(this).find('.modal-title').text(title);

    if (typeof  $(e.relatedTarget).attr('data-url') != 'undefined') {
        url_for_deletion = $(e.relatedTarget).attr('data-url');
    }
    if (typeof  $(e.relatedTarget).attr('data-success-url') != 'undefined') {
        success_redirect = $(e.relatedTarget).attr('data-success-url');
    }

});

<!-- Form confirm (yes/ok) handler, submits form -->
$('#confirmDelete').find('.modal-footer #confirm-delete-ok').on('click', function () {
    $.ajax({
        method: "delete",
        url: url_for_deletion,
    }).success(function (data) {
        window.location.href = success_redirect;
    }).fail(function (error) {
        console.log(error);
    });
    $('#confirmDelete').modal('hide');
    return false;
});
<script/>

reusingPage.jsp

<a href="#" class="table-link danger"
data-toggle="modal"
data-target="#confirmDelete"
data-title="Delete Something"
data-message="Are you sure you want to inactivate this something?"
data-url="client/32"
id="delete-client-32">
</a>
<!-- jQuery should come before this -->
<%@ include file="../some/path/confirmDelete.jsp" %>

Nota: Isso usa o método http delete para solicitação de exclusão, você pode alterá-lo de javascript ou pode enviá-lo usando um atributo de dados como no título de dados ou no URL de dados etc, para dar suporte a qualquer solicitação.

Maleen Abewardana
fonte
0

Se você quiser fazê-lo com o atalho mais fácil, poderá fazê-lo com este plugin .


Mas este plugin é uma implementação alternativa usando o Bootstrap Modal . E a implementação real do Bootstrap também é muito fácil, por isso não gosto de usar este plug-in porque ele adiciona conteúdo JS em excesso na página, o que diminui o tempo de carregamento da página.


Idéia

Eu gosto de implementá-lo sozinho dessa maneira:

  1. Se o usuário clicar em s em um botão para excluir um item da lista, uma chamada JS colocará o ID do item (ou quaisquer outros dados essenciais) em um formulário no modal.
  2. Em seguida, no pop-up, haverá 2 botões para confirmação.

    • Sim enviará o formulário (com ajax ou envio direto de formulário)
    • Não apenas descartará o modal

O código será assim (usando o Bootstrap ) -

<link rel="stylesheet" href="http://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css">
  <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
  <script src="http://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>

<script>
$(document).ready(function()
{
    $("button").click(function()
    {
        //Say - $('p').get(0).id - this delete item id
        $("#delete_item_id").val( $('p').get(0).id );
        $('#delete_confirmation_modal').modal('show');
    });
});
</script>

<p id="1">This is a item to delete.</p>

<button type="button" class="btn btn-danger">Delete</button>

<!-- Delete Modal content-->

<div class="modal fade" id="delete_confirmation_modal" role="dialog" style="display: none;">
	<div class="modal-dialog" style="margin-top: 260.5px;">
				<div class="modal-content">
			<div class="modal-header">
				<button type="button" class="close" data-dismiss="modal">×</button>
				<h4 class="modal-title">Do you really want to delete this Category?</h4>
			</div>
			<form role="form" method="post" action="category_delete" id="delete_data">
				<input type="hidden" id="delete_item_id" name="id" value="12">
				<div class="modal-footer">
					<button type="submit" class="btn btn-danger">Yes</button>
					<button type="button" class="btn btn-primary" data-dismiss="modal">No</button>
				</div>
			</form>
		</div>

	</div>
</div>

Você deve alterar a ação do formulário de acordo com seus requisitos.

Happy coading :)

Abrar Jahin
fonte
0

Receita POST com navegação para a página de destino e arquivo Blade reutilizável

A resposta do dfsq é muito boa. Eu o modifiquei um pouco para atender às minhas necessidades: eu realmente precisava de um modal para o caso em que, depois de clicar, o usuário também fosse navegado para a página correspondente. Executar a consulta de forma assíncrona nem sempre é o que é necessário.

Usando Bladeeu criei o arquivo resources/views/includes/confirmation_modal.blade.php:

<div class="modal fade" id="confirmation-modal" tabindex="-1" role="dialog" aria-labelledby="confirmation-modal-label" aria-hidden="true">
    <div class="modal-dialog">
        <div class="modal-content">
            <div class="modal-header">
                <h4>{{ $headerText }}</h4>
            </div>
            <div class="modal-body">
                {{ $bodyText }}
            </div>
            <div class="modal-footer">
                <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button>
                <form action="" method="POST" style="display:inline">
                    {{ method_field($verb) }}
                    {{ csrf_field() }}
                    <input type="submit" class="btn btn-danger btn-ok" value="{{ $confirmButtonText }}" />
                </form>
            </div>
        </div>
    </div>
</div>

<script>
    $('#confirmation-modal').on('show.bs.modal', function(e) {
        href = $(e.relatedTarget).data('href');

        // change href of button to corresponding target
        $(this).find('form').attr('action', href);
    });
</script>

Agora, usá-lo é direto:

<a data-href="{{ route('data.destroy', ['id' => $data->id]) }}" data-toggle="modal" data-target="#confirmation-modal" class="btn btn-sm btn-danger">Remove</a>

Não mudou muito aqui e o modal pode ser incluído assim:

@include('includes.confirmation_modal', ['headerText' => 'Delete Data?', 'bodyText' => 'Do you really want to delete these data? This operation is irreversible.',
'confirmButtonText' => 'Remove Data', 'verb' => 'DELETE'])

Apenas colocando o verbo lá, ele o usa. Dessa forma, o CSRF também é utilizado.

Me ajudou, talvez ajude outra pessoa.

Gelo fogo
fonte