first commit
This commit is contained in:
@@ -0,0 +1,440 @@
|
||||
<?php
|
||||
defined("ABSPATH") or die("");
|
||||
?>
|
||||
<script>
|
||||
/*! ============================================================================
|
||||
* DESCRIPTION: Methods and Objects in this file are global and common in nature
|
||||
* use this file to place all shared methods and varibles
|
||||
* UNIQUE NAMESPACE */
|
||||
DupPro = {};
|
||||
DupPro.Pack = {
|
||||
DownloadFile : function (url, fileName='') {
|
||||
var link = document.createElement('a');
|
||||
link.className = "dpro-dnload-menu-item";
|
||||
link.href = url;
|
||||
if (fileName !== '') {
|
||||
link.download = fileName;
|
||||
}
|
||||
document.body.appendChild(link);
|
||||
link.click();
|
||||
document.body.removeChild(link);
|
||||
return false;
|
||||
}
|
||||
};
|
||||
DupPro.Schedule = {};
|
||||
DupPro.Settings = {};
|
||||
DupPro.Storage = {};
|
||||
DupPro.Storage.Dropbox = {};
|
||||
DupPro.Storage.OneDrive = {};
|
||||
DupPro.Storage.S3 = {};
|
||||
DupPro.Storage.Local = {};
|
||||
DupPro.Support = {};
|
||||
DupPro.Template = {};
|
||||
DupPro.Tools = {};
|
||||
DupPro.UI = {};
|
||||
|
||||
//New Format
|
||||
Duplicator = {};
|
||||
Duplicator.Util = {};
|
||||
Duplicator.Debug = {};
|
||||
Duplicator.Storage = {};
|
||||
Duplicator.UI = {};
|
||||
Duplicator.UI.Ctrl = {};
|
||||
Duplicator.Help = {};
|
||||
|
||||
(function ($) {
|
||||
|
||||
/* ============================================================================
|
||||
* BASE NAMESPACE: All methods at the top of the Duplicator Namespace
|
||||
* ============================================================================ */
|
||||
|
||||
DupPro._WordPressInitDateTime = '<?php echo esc_js(current_time("D M d Y H:i:s O")) ?>';
|
||||
DupPro._WordPressInitTime = '<?php echo esc_js(current_time("H:i:s")) ?>';
|
||||
DupPro._ServerInitDateTime = '<?php echo esc_js(date("D M d Y H:i:s O")) ?>';
|
||||
DupPro._ClientInitDateTime = new Date();
|
||||
|
||||
DupPro.parseJSON = function (mixData) {
|
||||
try {
|
||||
var parsed = JSON.parse(mixData);
|
||||
return parsed;
|
||||
} catch (e) {
|
||||
console.log("JSON parse failed - 1");
|
||||
console.log(mixData);
|
||||
}
|
||||
|
||||
if (mixData.indexOf('[') > -1 && mixData.indexOf('{') > -1) {
|
||||
if (mixData.indexOf('{') < mixData.indexOf('[')) {
|
||||
var startBracket = '{';
|
||||
var endBracket = '}';
|
||||
} else {
|
||||
var startBracket = '[';
|
||||
var endBracket = ']';
|
||||
}
|
||||
} else if (mixData.indexOf('[') > -1 && mixData.indexOf('{') === -1) {
|
||||
var startBracket = '[';
|
||||
var endBracket = ']';
|
||||
} else {
|
||||
var startBracket = '{';
|
||||
var endBracket = '}';
|
||||
}
|
||||
|
||||
var jsonStartPos = mixData.indexOf(startBracket);
|
||||
var jsonLastPos = mixData.lastIndexOf(endBracket);
|
||||
if (jsonStartPos > -1 && jsonLastPos > -1) {
|
||||
var expectedJsonStr = mixData.slice(jsonStartPos, jsonLastPos + 1);
|
||||
try {
|
||||
var parsed = JSON.parse(expectedJsonStr);
|
||||
return parsed;
|
||||
} catch (e) {
|
||||
console.log("JSON parse failed - 2");
|
||||
console.log(mixData);
|
||||
throw e;
|
||||
// errorCallback(xHr, textstatus, 'extract');
|
||||
return false;
|
||||
}
|
||||
}
|
||||
// errorCallback(xHr, textstatus, 'extract');
|
||||
throw "could not parse the JSON";
|
||||
return false;
|
||||
}
|
||||
|
||||
DupPro.escapeHtml = function(str) {
|
||||
return str
|
||||
.replace(/&/g, "&")
|
||||
.replace(/</g, "<")
|
||||
.replace(/>/g, ">")
|
||||
.replace(/"/g, """)
|
||||
.replace(/'/g, "'");
|
||||
};
|
||||
|
||||
/**
|
||||
*
|
||||
* @param string message // html message conent
|
||||
* @param string errLevel // notice warning error
|
||||
* @param function updateCallback // called after message content is updated
|
||||
*
|
||||
* @returns void
|
||||
*/
|
||||
DupPro.addAdminMessage = function (message, errLevel, options) {
|
||||
let settings = $.extend({}, {
|
||||
'isDismissible': true,
|
||||
'hideDelay': 0, // 0 no hide or millisec
|
||||
'updateCallback': false
|
||||
}, options);
|
||||
|
||||
var classErrLevel = 'notice';
|
||||
switch (errLevel) {
|
||||
case 'error':
|
||||
classErrLevel = 'notice-error';
|
||||
break;
|
||||
case 'warning':
|
||||
classErrLevel = 'update-nag';
|
||||
break;
|
||||
case 'notice':
|
||||
default:
|
||||
classErrLevel = 'updated notice-success';
|
||||
break;
|
||||
}
|
||||
|
||||
var noticeCLasses = 'dpro-admin-notice notice ' + classErrLevel + ' no_display';
|
||||
if (settings.isDismissible) {
|
||||
noticeCLasses += ' is-dismissible';
|
||||
}
|
||||
|
||||
var msgNode = $('<div class="' + noticeCLasses + '">' +
|
||||
'<div class="margin-top-1 margin-bottom-1 msg-content">' + message + '</div>' +
|
||||
'</div>');
|
||||
var dismissButton = $('<button type="button" class="notice-dismiss">' +
|
||||
'<span class="screen-reader-text">Dismiss this notice.</span>' +
|
||||
'</button>');
|
||||
|
||||
var anchor = $("#wpcontent");
|
||||
if (anchor.find('.wrap').length) {
|
||||
anchor = anchor.find('.wrap').first();
|
||||
}
|
||||
|
||||
if (anchor.find('h1').length) {
|
||||
anchor = anchor.find('h1').first();
|
||||
msgNode.insertAfter(anchor);
|
||||
} else {
|
||||
msgNode.prependTo(anchor);
|
||||
}
|
||||
|
||||
if (settings.isDismissible) {
|
||||
dismissButton.appendTo(msgNode).click(function () {
|
||||
dismissButton.closest('.is-dismissible').fadeOut("slow", function () {
|
||||
$(this).remove();
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
if (typeof settings.updateCallback === "function") {
|
||||
settings.updateCallback(msgNode);
|
||||
}
|
||||
|
||||
$("body, html").animate({scrollTop: 0}, 500);
|
||||
$(msgNode).css('display', 'none').removeClass("no_display").fadeIn("slow", function () {
|
||||
if (settings.hideDelay > 0) {
|
||||
setTimeout(function () {
|
||||
dismissButton.closest('.is-dismissible').fadeOut("slow", function () {
|
||||
$(this).remove();
|
||||
});
|
||||
}, settings.hideDelay);
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
/**
|
||||
*
|
||||
* @param string filename
|
||||
* @param string content
|
||||
* @param string mimeType // text/html, text/plain
|
||||
* @returns {undefined}
|
||||
*/
|
||||
DupPro.downloadContentAsfile = function (filename, content, mimeType) {
|
||||
mimeType = (typeof mimeType !== 'undefined') ? mimeType : 'text/plain';
|
||||
var element = document.createElement('a');
|
||||
element.setAttribute('href', 'data:' + mimeType + ';charset=utf-8,' + encodeURIComponent(content));
|
||||
element.setAttribute('download', filename);
|
||||
|
||||
element.style.display = 'none';
|
||||
document.body.appendChild(element);
|
||||
element.click();
|
||||
document.body.removeChild(element);
|
||||
}
|
||||
|
||||
|
||||
DupPro.openWindow = function () {
|
||||
$("[data-dup-open-window]").each(function () {
|
||||
let url = $(this).data('dup-open-window');
|
||||
let name = $(this).data('dup-window-name');
|
||||
|
||||
$(this).click(function () {
|
||||
window.open(url, name);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
DupPro.passwordToggle = function () {
|
||||
$('.dup-password-toggle').each(function () {
|
||||
let inputElem = $(this).find('input');
|
||||
let buttonElem = $(this).find('button');
|
||||
let iconElem = $(this).find('button i');
|
||||
|
||||
buttonElem.click(function () {
|
||||
if (inputElem.attr('type') == 'password') {
|
||||
inputElem.attr('type','text');
|
||||
iconElem.removeClass('fa-eye').addClass('fa-eye-slash');
|
||||
} else {
|
||||
inputElem.attr('type','password');
|
||||
iconElem.removeClass('fa-eye-slash').addClass('fa-eye');
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
})(jQuery);
|
||||
</script>
|
||||
|
||||
<?php
|
||||
require_once(DUPLICATOR____PATH . '/assets/js/duplicator/dup.ui.php');
|
||||
require_once(DUPLICATOR____PATH . '/assets/js/duplicator/dup.ui.ctrl.php');
|
||||
require_once(DUPLICATOR____PATH . '/assets/js/duplicator/dup.util.php');
|
||||
?>
|
||||
<script>
|
||||
<?php
|
||||
require_once(DUPLICATOR____PATH . '/assets/js/modal-box.js');
|
||||
require_once(DUPLICATOR____PATH . '/assets/js/dynamic-help.js');
|
||||
?>
|
||||
</script>
|
||||
|
||||
<script>
|
||||
//Init
|
||||
jQuery(document).ready(function ($)
|
||||
{
|
||||
DupPro.openWindow();
|
||||
|
||||
//INIT: DupPro Tabs
|
||||
$("div[data-dpro-tabs='true']").each(function ()
|
||||
{
|
||||
//Load Tab Setup
|
||||
var $root = $(this);
|
||||
var $lblRoot = $root.find('ul:first-child')
|
||||
var $lblKids = $lblRoot.children('li');
|
||||
var $lblButton = $lblKids.find('button');
|
||||
var $pnls = $root.children('div');
|
||||
|
||||
//Apply Styles
|
||||
$root.addClass('categorydiv');
|
||||
$lblRoot.addClass('category-tabs');
|
||||
$pnls.addClass('tabs-panel').css('display', 'none');
|
||||
|
||||
//Init accessibility improvement
|
||||
$lblKids.each(function () {
|
||||
var $content = $(this).text();
|
||||
$(this).html("<button role='tabs' aria-selected='false'>" +
|
||||
"<span class='screen-reader-text'><?php esc_html_e('Toggle Tab: ', 'duplicator-pro') ?></span> "+$content+
|
||||
"</button>")
|
||||
})
|
||||
|
||||
//Activate first tab
|
||||
$lblKids.eq(0).addClass('tabs').css('font-weight', 'bold');
|
||||
$lblKids.eq(0).find('button').attr("aria-selected", true)
|
||||
$pnls.eq(0).show();
|
||||
|
||||
//Initialize tab click event
|
||||
var _clickEvt = function (evt)
|
||||
{
|
||||
var $target = $(evt.target);
|
||||
if (evt.target.nodeName === 'BUTTON') {
|
||||
$target = $(evt.target).parent();
|
||||
}
|
||||
var $lbls = $target.parent().children('li');
|
||||
var $pnls = $target.parent().parent().children('div');
|
||||
var index = $target.index();
|
||||
|
||||
$lbls.removeClass('tabs').css('font-weight', 'normal');
|
||||
$lbls.find("button").attr("aria-selected", false);
|
||||
|
||||
$lbls.eq(index).addClass('tabs').css('font-weight', 'bold');
|
||||
$lbls.eq(index).find("button").attr("aria-selected", true);
|
||||
|
||||
$pnls.hide();
|
||||
$pnls.eq(index).show();
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
//Attach Events
|
||||
$lblKids.click(_clickEvt);
|
||||
$lblButton.on("click", _clickEvt);
|
||||
});
|
||||
|
||||
//INIT: Toggle MetaBoxes
|
||||
$('div.dup-box div.dup-box-title').each(function () {
|
||||
var $title = $(this);
|
||||
var $panel = $title.parent().find('.dup-box-panel');
|
||||
var $arrow = $title.find('.dup-box-arrow');
|
||||
|
||||
$title.click(DupPro.UI.ToggleMetaBox);
|
||||
//$arrow.on("keypress", DupPro.UI.ToggleMetaBox)
|
||||
$arrow.attr("aria-haspopup", true);
|
||||
|
||||
if ($panel.is(":visible")) {
|
||||
$arrow.attr("aria-expanded", true);
|
||||
$arrow.append('<i class="fa fa-caret-up"></i>');
|
||||
} else {
|
||||
$arrow.attr("aria-expanded", false);
|
||||
$arrow.append('<i class="fa fa-caret-down"></i>')
|
||||
}
|
||||
});
|
||||
|
||||
DuplicatorTooltip.load();
|
||||
DupPro.passwordToggle();
|
||||
|
||||
//HANDLEBARS HELPERS
|
||||
if (typeof (Handlebars) != "undefined") {
|
||||
|
||||
function _handleBarscheckCondition(v1, operator, v2) {
|
||||
switch (operator) {
|
||||
case '==':
|
||||
return (v1 == v2);
|
||||
case '===':
|
||||
return (v1 === v2);
|
||||
case '!==':
|
||||
return (v1 !== v2);
|
||||
case '<':
|
||||
return (v1 < v2);
|
||||
case '<=':
|
||||
return (v1 <= v2);
|
||||
case '>':
|
||||
return (v1 > v2);
|
||||
case '>=':
|
||||
return (v1 >= v2);
|
||||
case '&&':
|
||||
return (v1 && v2);
|
||||
case '||':
|
||||
return (v1 || v2);
|
||||
case 'obj||':
|
||||
v1 = typeof (v1) == 'object' ? v1.length : v1;
|
||||
v2 = typeof (v2) == 'object' ? v2.length : v2;
|
||||
return (v1 != 0 || v2 != 0);
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
Handlebars.registerHelper('ifCond', function (v1, operator, v2, options) {
|
||||
return _handleBarscheckCondition(v1, operator, v2)
|
||||
? options.fn(this)
|
||||
: options.inverse(this);
|
||||
});
|
||||
|
||||
Handlebars.registerHelper('if_eq', function (a, b, opts) {
|
||||
return (a == b) ? opts.fn(this) : opts.inverse(this);
|
||||
});
|
||||
Handlebars.registerHelper('if_neq', function (a, b, opts) {
|
||||
return (a != b) ? opts.fn(this) : opts.inverse(this);
|
||||
});
|
||||
}
|
||||
|
||||
//Prevent notice boxes from flashing as its re-positioned in DOM
|
||||
$('div.dpro-wpnotice-box').show(300);
|
||||
|
||||
$('.dup-pseudo-checkbox').each(function () {
|
||||
let checkbox = $(this);
|
||||
checkbox.attr("tabindex", 0);
|
||||
checkbox.attr("role", "checkbox")
|
||||
|
||||
checkbox.on('click', function(e) {
|
||||
e.stopPropagation();
|
||||
if (checkbox.hasClass('disabled')) {
|
||||
return;
|
||||
}
|
||||
checkbox.toggleClass('checked');
|
||||
});
|
||||
|
||||
checkbox.on('keypress', function(e) {
|
||||
e.stopPropagation();
|
||||
e.preventDefault();
|
||||
if (checkbox.hasClass('disabled')) {
|
||||
return;
|
||||
}
|
||||
checkbox.toggleClass('checked');
|
||||
});
|
||||
|
||||
checkbox.closest('label').on('click', function () {
|
||||
checkbox.trigger('click');
|
||||
});
|
||||
});
|
||||
|
||||
/**
|
||||
* Register a change event handler for all forms with the class 'dup-monitored-form'.
|
||||
* This will set a flag to indicate that the form has unsaved changes.
|
||||
*/
|
||||
$('form.dup-monitored-form').each(function (index, form) {
|
||||
DupPro.UI.formOnChangeValues($(form), function() {
|
||||
DupPro.UI.hasUnsavedChanges = true;
|
||||
});
|
||||
});
|
||||
|
||||
/**
|
||||
* When a form is submitting, we want to clear the unsaved changes flag.
|
||||
* Otherwise, the user will be prompted to save changes when they are not actually leaving the page.
|
||||
*/
|
||||
window.addEventListener('submit', function (e) {
|
||||
DupPro.UI.hasUnsavedChanges = false;
|
||||
});
|
||||
|
||||
/**
|
||||
* Check if we have unsaved changes, and if so, prevent the user from navigating away from the page.
|
||||
*/
|
||||
window.addEventListener('beforeunload', function (e) {
|
||||
if (DupPro.UI.hasUnsavedChanges) {
|
||||
e.preventDefault();
|
||||
// Most browsers ignore the value, but historically some browsers are known to honor this value. So it's here as a backup
|
||||
e.returnValue = '<?php echo esc_js(__('Changes you made may not be saved.', 'duplicator-pro')) ?>';
|
||||
}
|
||||
});
|
||||
});
|
||||
</script>
|
||||
Reference in New Issue
Block a user