mirror of
https://github.com/cwinfo/powerdns-admin.git
synced 2025-01-08 19:35:40 +00:00
259 lines
7.4 KiB
JavaScript
259 lines
7.4 KiB
JavaScript
|
/*!
|
||
|
* Bootstrap Confirmation
|
||
|
* Copyright 2013 Nimit Suwannagate <ethaizone@hotmail.com>
|
||
|
* Copyright 2014 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) {
|
||
|
this.init('confirmation', element, options);
|
||
|
|
||
|
var that = this;
|
||
|
|
||
|
if (!this.options.selector) {
|
||
|
// get existing href and target
|
||
|
if (this.$element.attr('href')) {
|
||
|
this.options.href = this.$element.attr('href');
|
||
|
this.$element.removeAttr('href');
|
||
|
if (this.$element.attr('target')) {
|
||
|
this.options.target = this.$element.attr('target');
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// cancel original event
|
||
|
this.$element.on(that.options.trigger, function(e, ack) {
|
||
|
if (!ack) {
|
||
|
e.preventDefault();
|
||
|
e.stopPropagation();
|
||
|
e.stopImmediatePropagation();
|
||
|
}
|
||
|
});
|
||
|
|
||
|
// trigger original event on confirm
|
||
|
this.$element.on('confirmed.bs.confirmation', function(e) {
|
||
|
$(this).trigger(that.options.trigger, [true]);
|
||
|
});
|
||
|
|
||
|
// 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,
|
||
|
href: false,
|
||
|
popout: false,
|
||
|
singleton: false,
|
||
|
target: '_self',
|
||
|
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;
|
||
|
};
|
||
|
|
||
|
// custom init keeping trace of selectors
|
||
|
Confirmation.prototype.init = function(type, element, options) {
|
||
|
$.fn.popover.Constructor.prototype.init.call(this, type, element, options);
|
||
|
|
||
|
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;
|
||
|
}
|
||
|
};
|
||
|
|
||
|
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)
|
||
|
.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.leave(that);
|
||
|
});
|
||
|
|
||
|
// add href to confirm button if needed
|
||
|
if (o.href && o.href != "#") {
|
||
|
$tip.find('[data-apply="confirmation"]').attr({
|
||
|
href: o.href,
|
||
|
target: o.target
|
||
|
});
|
||
|
}
|
||
|
|
||
|
// 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);
|
||
|
that.$element.trigger('canceled.bs.confirmation');
|
||
|
that.leave(that);
|
||
|
});
|
||
|
|
||
|
$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]();
|
||
|
}
|
||
|
});
|
||
|
};
|
||
|
|
||
|
$.fn.confirmation.Constructor = Confirmation;
|
||
|
|
||
|
|
||
|
// CONFIRMATION NO CONFLICT
|
||
|
// ===================
|
||
|
|
||
|
$.fn.confirmation.noConflict = function () {
|
||
|
$.fn.confirmation = old;
|
||
|
return this;
|
||
|
};
|
||
|
|
||
|
}(jQuery));
|