|
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255 |
- /*!
- * 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.js
- if (!$.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 selectors
- this.options._isDelegate = false;
- if (options.selector) { // container of buttons
- this.options._selector = this._options._selector = options._root_selector +' '+ options.selector;
- }
- else if (options._selector) { // children of container
- this.options._selector = options._selector;
- this.options._isDelegate = true;
- }
- else { // standalone
- this.options._selector = options._root_selector;
- }
-
- var that = this;
-
- if (!this.options.selector) {
- // store copied attributes
- this.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 event
- this.$element.on(that.options.trigger, function(e, ack) {
- if (!ack) {
- e.preventDefault();
- e.stopPropagation();
- e.stopImmediatePropagation();
- }
- });
-
- // manage singleton
- this.$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 popout
- this.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.5
- that.$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.5
- data.inState.click = false;
- }
- }
- });
- };
-
- $.fn.confirmation.Constructor = Confirmation;
-
-
- // CONFIRMATION NO CONFLICT
- // ===================
-
- $.fn.confirmation.noConflict = function () {
- $.fn.confirmation = old;
- return this;
- };
-
- }(jQuery));
|