Blame | Letzte Änderung | Log anzeigen | RSS feed
/*!* Bootstrap Confirmation* Copyright 2013 Nimit Suwannagate <ethaizone@hotmail.com>* Copyright 2014-2016 Damien "Mistic" Sorel <http://www.strangeplanet.fr>* Licensed under the Apache License, Version 2.0 (the "License")*/(function ($) {'use strict';// Confirmation extends popover.jsif (!$.fn.popover) throw new Error('Confirmation requires popover.js');// CONFIRMATION PUBLIC CLASS DEFINITION// ===============================var Confirmation = function (element, options) {options.trigger = 'click';this.init('confirmation', element, options);// keep trace of selectorsthis.options._isDelegate = false;if (options.selector) { // container of buttonsthis.options._selector = this._options._selector = options._root_selector +' '+ options.selector;}else if (options._selector) { // children of containerthis.options._selector = options._selector;this.options._isDelegate = true;}else { // standalonethis.options._selector = options._root_selector;}var that = this;if (!this.options.selector) {// store copied attributesthis.options._attributes = {};if (this.options.copyAttributes) {if (typeof this.options.copyAttributes === 'string') {this.options.copyAttributes = this.options.copyAttributes.split(' ');}}else {this.options.copyAttributes = [];}this.options.copyAttributes.forEach(function(attr) {this.options._attributes[attr] = this.$element.attr(attr);}, this);// cancel original eventthis.$element.on(that.options.trigger, function(e, ack) {if (!ack) {e.preventDefault();e.stopPropagation();e.stopImmediatePropagation();}});// manage singletonthis.$element.on('show.bs.confirmation', function(e) {if (that.options.singleton) {// close all other popover already initialized$(that.options._selector).not($(this)).filter(function() {return $(this).data('bs.confirmation') !== undefined;}).confirmation('hide');}});}if (!this.options._isDelegate) {// manage popoutthis.eventBody = false;this.uid = this.$element[0].id || this.getUID('group_');this.$element.on('shown.bs.confirmation', function(e) {if (that.options.popout && !that.eventBody) {var $this = $(this);that.eventBody = $('body').on('click.bs.confirmation.'+that.uid, function(e) {if ($(that.options._selector).is(e.target)) {return;}// close all popover already initialized$(that.options._selector).filter(function() {return $(this).data('bs.confirmation') !== undefined;}).confirmation('hide');$('body').off('click.bs.'+that.uid);that.eventBody = false;});}});}};Confirmation.DEFAULTS = $.extend({}, $.fn.popover.Constructor.DEFAULTS, {placement: 'top',title: 'Are you sure?',html: true,popout: false,singleton: false,copyAttributes: 'href target',onConfirm: $.noop,onCancel: $.noop,btnOkClass: 'btn-xs btn-primary',btnOkIcon: 'glyphicon glyphicon-ok',btnOkLabel: 'Yes',btnCancelClass: 'btn-xs btn-default',btnCancelIcon: 'glyphicon glyphicon-remove',btnCancelLabel: 'No',template:'<div class="popover confirmation">' +'<div class="arrow"></div>' +'<h3 class="popover-title"></h3>' +'<div class="popover-content text-center">'+'<div class="btn-group">'+'<a class="btn" data-apply="confirmation"></a>'+'<a class="btn" data-dismiss="confirmation"></a>'+'</div>'+'</div>'+'</div>'});Confirmation.prototype = $.extend({}, $.fn.popover.Constructor.prototype);Confirmation.prototype.constructor = Confirmation;Confirmation.prototype.getDefaults = function () {return Confirmation.DEFAULTS;};Confirmation.prototype.setContent = function () {var that = this,$tip = this.tip(),o = this.options;$tip.find('.popover-title')[o.html ? 'html' : 'text'](this.getTitle());// configure 'ok' button$tip.find('[data-apply="confirmation"]').addClass(o.btnOkClass).html(o.btnOkLabel).attr(this.options._attributes).prepend($('<i></i>').addClass(o.btnOkIcon), ' ').off('click').one('click', function(e) {that.getOnConfirm.call(that).call(that.$element);that.$element.trigger('confirmed.bs.confirmation');that.$element.trigger(that.options.trigger, [true]);that.$element.confirmation('hide');});// configure 'cancel' button$tip.find('[data-dismiss="confirmation"]').addClass(o.btnCancelClass).html(o.btnCancelLabel).prepend($('<i></i>').addClass(o.btnCancelIcon), ' ').off('click').one('click', function(e) {that.getOnCancel.call(that).call(that.$element);if (that.inState) that.inState.click = false; // Bootstrap 3.3.5that.$element.trigger('canceled.bs.confirmation');that.$element.confirmation('hide');});$tip.removeClass('fade top bottom left right in');// IE8 doesn't accept hiding via the `:empty` pseudo selector, we have to do// this manually by checking the contents.if (!$tip.find('.popover-title').html()) {$tip.find('.popover-title').hide();}};Confirmation.prototype.getOnConfirm = function() {if (this.$element.attr('data-on-confirm')) {return getFunctionFromString(this.$element.attr('data-on-confirm'));}else {return this.options.onConfirm;}};Confirmation.prototype.getOnCancel = function() {if (this.$element.attr('data-on-cancel')) {return getFunctionFromString(this.$element.attr('data-on-cancel'));}else {return this.options.onCancel;}};/** Generates an anonymous function from a function name* function name may contain dots (.) to navigate through objects* root context is window*/function getFunctionFromString(functionName) {var context = window,namespaces = functionName.split('.'),func = namespaces.pop();for (var i=0, l=namespaces.length; i<l; i++) {context = context[namespaces[i]];}return function() {context[func].call(this);};}// CONFIRMATION PLUGIN DEFINITION// =========================var old = $.fn.confirmation;$.fn.confirmation = function (option) {var options = (typeof option == 'object' && option) || {};options._root_selector = this.selector;return this.each(function () {var $this = $(this),data = $this.data('bs.confirmation');if (!data && option == 'destroy') {return;}if (!data) {$this.data('bs.confirmation', (data = new Confirmation(this, options)));}if (typeof option == 'string') {data[option]();if (option == 'hide' && data.inState) { //data.inState doesn't exist in Bootstrap < 3.3.5data.inState.click = false;}}});};$.fn.confirmation.Constructor = Confirmation;// CONFIRMATION NO CONFLICT// ===================$.fn.confirmation.noConflict = function () {$.fn.confirmation = old;return this;};}(jQuery));