first commit
This commit is contained in:
@@ -0,0 +1,26 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
*
|
||||
* @package templates/default
|
||||
*/
|
||||
|
||||
defined('ABSPATH') || defined('DUPXABSPATH') || exit;
|
||||
|
||||
dupxTplRender('scripts/modules/page-components');
|
||||
dupxTplRender('scripts/modules/ajax-functions');
|
||||
dupxTplRender('scripts/modules/progress-bar');
|
||||
dupxTplRender('scripts/modules/params-module');
|
||||
dupxTplRender('scripts/modules/system-validation-module');
|
||||
dupxTplRender('scripts/modules/extraction-module');
|
||||
dupxTplRender('scripts/modules/top-page-messages');
|
||||
dupxTplRender('scripts/modules/cpanel');
|
||||
dupxTplRender('scripts/modules/package-deploy');
|
||||
dupxTplRender('scripts/modules/db-test');
|
||||
dupxTplRender('scripts/modules/db-charset');
|
||||
dupxTplRender('scripts/modules/db-install');
|
||||
dupxTplRender('scripts/modules/site-replace-and-update');
|
||||
dupxTplRender('scripts/modules/final-tests');
|
||||
dupxTplRender('scripts/modules/UrlListMapping');
|
||||
dupxTplRender('scripts/modules/multisite-items-map');
|
||||
dupxTplRender('scripts/modules/confirm-dialog');
|
||||
@@ -0,0 +1,291 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
*
|
||||
* @package Duplicator/Installer
|
||||
*/
|
||||
|
||||
defined('ABSPATH') || defined('DUPXABSPATH') || exit;
|
||||
|
||||
?>
|
||||
<script>
|
||||
class UrlListMapping {
|
||||
wrapperNode = null;
|
||||
itemListNode = null;
|
||||
addItemNode = null;
|
||||
addButton = null;
|
||||
newItemTeplate = null;
|
||||
listInfo = null;
|
||||
inputName = '';
|
||||
|
||||
constructor(mainWrapper, inputName) {
|
||||
if (mainWrapper.length == 0) {
|
||||
throw 'Wrapper node don\'t exists';
|
||||
}
|
||||
if (inputName.length == 0) {
|
||||
throw 'Input name is empty';
|
||||
}
|
||||
this.wrapperNode = mainWrapper;
|
||||
this.inputName = inputName;
|
||||
this.itemListNode = this.wrapperNode.find('.overwrite_sites_list');
|
||||
this.listInfo = this.itemListNode.data('list-info');
|
||||
this.addItemNode = this.itemListNode.find('.overwrite_site_item.add_item');
|
||||
this.initAddButton();
|
||||
}
|
||||
|
||||
initAddButton() {
|
||||
let thisObj = this;
|
||||
|
||||
this.addButton = this.addItemNode.find('.add_button');
|
||||
this.newItemTeplate = jQuery(this.addButton.data('new-item'));
|
||||
|
||||
this.addButton.click(function (event) {
|
||||
event.stopPropagation();
|
||||
thisObj.addItem();
|
||||
return false;
|
||||
});
|
||||
|
||||
this.getItemsList().each(function () {
|
||||
thisObj.initItemEvents(jQuery(this));
|
||||
});
|
||||
}
|
||||
|
||||
addItem() {
|
||||
if (!this.canAddNewItem()) {
|
||||
return;
|
||||
}
|
||||
|
||||
let itemList = this.getItemsList();
|
||||
let newItem = this.newItemTeplate.clone();
|
||||
|
||||
newItem.find(':disabled').prop('disabled', false);
|
||||
newItem.insertBefore(this.addItemNode);
|
||||
DUPX.initJsSelect(newItem.find('.js-select'));
|
||||
|
||||
this.setSourceIdOptionsEnabled(itemList, newItem, true);
|
||||
this.changeSelectSourceId();
|
||||
|
||||
this.setTargetIdOptionsEnabled(itemList, newItem, true);
|
||||
this.changeSelectTargetId();
|
||||
|
||||
this.initItemEvents(newItem);
|
||||
this.setAddItemButtonStatus();
|
||||
this.setRemoveItemButtonStatus();
|
||||
this.updateLimitMessages();
|
||||
DUPX.reavelidateOnChangeAction();
|
||||
}
|
||||
|
||||
initItemEvents(item) {
|
||||
let thisObj = this;
|
||||
let sourceId = item.find('.source_id');
|
||||
let targetId = item.find('.target_id');
|
||||
let newSlug = item.find('.new_slug');
|
||||
let sourceNoteSlug = item.find('.source-site-note .site-slug');
|
||||
let targetNoteSlug = item.find('.target-site-note .site-slug');
|
||||
|
||||
item.find('.del_item').click(function (event) {
|
||||
event.stopPropagation();
|
||||
thisObj.removeItem(item);
|
||||
return false;
|
||||
});
|
||||
|
||||
sourceId.change(function () {
|
||||
let currentVal = parseInt(jQuery(this).val());
|
||||
thisObj.changeSelectSourceId();
|
||||
let currentData = thisObj.listInfo.sourceInfo.sites['id_' + currentVal];
|
||||
sourceNoteSlug.text(currentData.domain + currentData.path);
|
||||
});
|
||||
|
||||
targetId.change(function () {
|
||||
let currentVal = parseInt(jQuery(this).val());
|
||||
thisObj.changeSelectTargetId();
|
||||
item.find('.new-slug-wrapper').toggleClass('no-display', (currentVal > 0));
|
||||
if (currentVal < 1) {
|
||||
newSlug.trigger('input');
|
||||
} else {
|
||||
let currentData = thisObj.listInfo.targetInfo.sites['id_' + currentVal];
|
||||
targetNoteSlug.text(currentData.domain + currentData.path);
|
||||
}
|
||||
});
|
||||
|
||||
newSlug.on('input',function(e){
|
||||
let newText = '';
|
||||
let newVal = jQuery(this).val();
|
||||
switch (parseInt(targetId.val())) {
|
||||
case -1:
|
||||
newText = (newVal.length == 0 ? '_____/_____' : newVal);
|
||||
break;
|
||||
case 0:
|
||||
newText = thisObj.listInfo.targetInfo.urlPrefix +
|
||||
(newVal.length == 0 ? '_____' : newVal) +
|
||||
thisObj.listInfo.targetInfo.urlPostfix;
|
||||
break;
|
||||
default:
|
||||
return;
|
||||
}
|
||||
targetNoteSlug.text(newText)
|
||||
});
|
||||
|
||||
sourceId.trigger('change');
|
||||
targetId.trigger('change');
|
||||
}
|
||||
|
||||
changeSelectSourceId() {
|
||||
let thisObj = this;
|
||||
let itemList = this.getItemsList();
|
||||
|
||||
itemList.each(function () {
|
||||
thisObj.setSourceIdOptionsEnabled(itemList, jQuery(this), false);
|
||||
});
|
||||
}
|
||||
|
||||
setSourceIdOptionsEnabled(itemList, currentItem, autoSelect) {
|
||||
let selectObj = currentItem.find('.source_id');
|
||||
let alreadySelectedIds = itemList.not(currentItem).find('.source_id').map(function(idx, elem) {
|
||||
return parseInt(jQuery(elem).val());
|
||||
}).get();
|
||||
|
||||
selectObj.find('option').each(function () {
|
||||
let currentValue = parseInt(jQuery(this).attr('value'));
|
||||
let isAlreadySelected = (jQuery.inArray(currentValue, alreadySelectedIds) > -1);
|
||||
jQuery(this).prop('disabled', isAlreadySelected);
|
||||
});
|
||||
|
||||
if (autoSelect) {
|
||||
selectObj.find('option:not([disabled]):first').prop('selected', true);
|
||||
selectObj.trigger('change');
|
||||
}
|
||||
}
|
||||
|
||||
changeSelectTargetId(selectObj) {
|
||||
let thisObj = this;
|
||||
let itemList = this.getItemsList();
|
||||
|
||||
itemList.each(function () {
|
||||
thisObj.setTargetIdOptionsEnabled(itemList, jQuery(this), false);
|
||||
});
|
||||
}
|
||||
|
||||
setTargetIdOptionsEnabled(itemList, currentItem, autoSelect) {
|
||||
let selectObj = currentItem.find('.target_id');
|
||||
let alreadySelectedIds = itemList.not(currentItem).find('.target_id').map(function(idx, elem) {
|
||||
return parseInt(jQuery(elem).val());
|
||||
}).get();
|
||||
|
||||
selectObj.find('option').each(function () {
|
||||
let currentValue = parseInt(jQuery(this).attr('value'));
|
||||
if (currentValue == 0 || currentValue == -1) {
|
||||
return;
|
||||
}
|
||||
let isAlreadySelected = (jQuery.inArray(currentValue, alreadySelectedIds) > -1);
|
||||
jQuery(this).prop('disabled', isAlreadySelected);
|
||||
});
|
||||
|
||||
if (autoSelect) {
|
||||
selectObj.find('option:not([disabled]):first').prop('selected', true);
|
||||
selectObj.trigger('change');
|
||||
}
|
||||
}
|
||||
|
||||
updateFormData(formData) {
|
||||
if (this.wrapperNode.length == 0) {
|
||||
return formData;
|
||||
}
|
||||
let itemsList = this.getItemsList();
|
||||
if (itemsList.length == 0) {
|
||||
return formData;
|
||||
}
|
||||
let paramValue = [];
|
||||
let nameSourceId = itemsList.first().find('.source_id').attr('name').replace(/(.+)\[\]/, '$1');
|
||||
let nameTargetId = itemsList.first().find('.target_id').attr('name').replace(/(.+)\[\]/, '$1');
|
||||
let nameNewSlug = itemsList.first().find('.new_slug').attr('name').replace(/(.+)\[\]/, '$1');
|
||||
|
||||
itemsList.each(function() {
|
||||
let node = jQuery(this);
|
||||
let newObj = {
|
||||
'sourceId': node.find('.source_id').val(),
|
||||
'targetId': node.find('.target_id').val(),
|
||||
'newSlug' : node.find('.new_slug').val()
|
||||
};
|
||||
paramValue.push(newObj);
|
||||
});
|
||||
delete formData[nameSourceId];
|
||||
delete formData[nameTargetId];
|
||||
delete formData[nameNewSlug];
|
||||
formData[this.inputName] = JSON.stringify(paramValue);
|
||||
|
||||
return formData;
|
||||
}
|
||||
|
||||
getItemsList() {
|
||||
return this.itemListNode.find('.overwrite_site_item:not(.title):not(.add_item)');
|
||||
}
|
||||
|
||||
canAddNewItem() {
|
||||
let numItems = this.getItemsList().length;
|
||||
return (
|
||||
numItems < this.listInfo.sourceInfo.numSites &&
|
||||
numItems < this.listInfo.hardLimit
|
||||
);
|
||||
}
|
||||
|
||||
canRemoveItem() {
|
||||
return (this.getItemsList().length > this.listInfo.minListItems);
|
||||
}
|
||||
|
||||
setAddItemButtonStatus() {
|
||||
this.addButton.prop('disabled', !this.canAddNewItem());
|
||||
}
|
||||
|
||||
setRemoveItemButtonStatus() {
|
||||
let thisObj = this;
|
||||
|
||||
this.getItemsList().each(function () {
|
||||
jQuery(this).find('.del_item').toggleClass('disabled', !thisObj.canRemoveItem());
|
||||
});
|
||||
}
|
||||
|
||||
updateLimitMessages() {
|
||||
let numItems = this.getItemsList().length;
|
||||
if (numItems >= this.listInfo.sourceInfo.numSites) {
|
||||
this.addItemNode.find('.overwrite_site_empty_list_msg').addClass('no-display');
|
||||
this.addItemNode.find('.overwrite_site_full_list_msg').removeClass('no-display');
|
||||
this.addItemNode.find('.overwrite_site_soft_limit_msg').addClass('no-display');
|
||||
this.addItemNode.find('.overwrite_site_hard_limit_msg').addClass('no-display');
|
||||
} else if (numItems == 0) {
|
||||
this.addItemNode.find('.overwrite_site_empty_list_msg').removeClass('no-display');
|
||||
this.addItemNode.find('.overwrite_site_full_list_msg').addClass('no-display');
|
||||
this.addItemNode.find('.overwrite_site_soft_limit_msg').addClass('no-display');
|
||||
this.addItemNode.find('.overwrite_site_hard_limit_msg').addClass('no-display');
|
||||
} else if (numItems >= this.listInfo.hardLimit) {
|
||||
this.addItemNode.find('.overwrite_site_empty_list_msg').addClass('no-display');
|
||||
this.addItemNode.find('.overwrite_site_full_list_msg').addClass('no-display');
|
||||
this.addItemNode.find('.overwrite_site_soft_limit_msg').addClass('no-display');
|
||||
this.addItemNode.find('.overwrite_site_hard_limit_msg').removeClass('no-display');
|
||||
} else if (numItems >= this.listInfo.softLimit) {
|
||||
this.addItemNode.find('.overwrite_site_empty_list_msg').addClass('no-display');
|
||||
this.addItemNode.find('.overwrite_site_full_list_msg').addClass('no-display');
|
||||
this.addItemNode.find('.overwrite_site_soft_limit_msg').removeClass('no-display');
|
||||
this.addItemNode.find('.overwrite_site_hard_limit_msg').addClass('no-display');
|
||||
} else {
|
||||
this.addItemNode.find('.overwrite_site_empty_list_msg').addClass('no-display');
|
||||
this.addItemNode.find('.overwrite_site_full_list_msg').addClass('no-display');
|
||||
this.addItemNode.find('.overwrite_site_soft_limit_msg').addClass('no-display');
|
||||
this.addItemNode.find('.overwrite_site_hard_limit_msg').addClass('no-display');
|
||||
}
|
||||
}
|
||||
|
||||
removeItem(itemNode) {
|
||||
if (!this.canRemoveItem()) {
|
||||
return;
|
||||
}
|
||||
itemNode.remove();
|
||||
this.changeSelectSourceId();
|
||||
this.changeSelectTargetId();
|
||||
this.setAddItemButtonStatus();
|
||||
this.setRemoveItemButtonStatus();
|
||||
this.updateLimitMessages();
|
||||
DUPX.reavelidateOnChangeAction();
|
||||
}
|
||||
}
|
||||
</script>
|
||||
@@ -0,0 +1,87 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
*
|
||||
* @package templates/default
|
||||
*/
|
||||
|
||||
defined('ABSPATH') || defined('DUPXABSPATH') || exit;
|
||||
|
||||
use Duplicator\Installer\Core\Security;
|
||||
use Duplicator\Libs\Snap\SnapJson;
|
||||
|
||||
?>
|
||||
<script>
|
||||
$(document).ready(function () {
|
||||
|
||||
DUPX.iframeInjectHTML = function(iframeObjs, htmlToInject) {
|
||||
if (iframeObjs.length == 0) return;
|
||||
var iframeObj = iframeObjs[0];
|
||||
var iframeDoc = iframeObj.document;
|
||||
if (iframeObj.contentDocument) {
|
||||
iframeDoc = iframeObj.contentDocument;
|
||||
} else if (iframeObj.contentWindow) {
|
||||
iframeDoc = iframeObj.contentWindow.document;
|
||||
}
|
||||
if (iframeDoc) {
|
||||
iframeDoc.open();
|
||||
iframeDoc.write(htmlToInject);
|
||||
iframeDoc.close();
|
||||
}
|
||||
};
|
||||
|
||||
DUPX.ajaxError = {
|
||||
wrapper: $('#ajaxerr-area'),
|
||||
tryAgainButton: $('#ajax-error-try-again'),
|
||||
preContent: $('#ajaxerr-data .pre-content'),
|
||||
htmlContent: $('#ajaxerr-data .html-content'),
|
||||
iframeContent: $('#ajaxerr-data .iframe-content'),
|
||||
show: function () {
|
||||
this.wrapper.removeClass('no-display');
|
||||
},
|
||||
hide: function () {
|
||||
this.wrapper.addClass('no-display');
|
||||
},
|
||||
update: function (result, textStatus, jqXHR, tryAgainButtonCallback) {
|
||||
this.wrapper.find('.message').html(result.message);
|
||||
if (result.errorContent.pre.length) {
|
||||
this.preContent.text(result.errorContent.pre).removeClass('no-display');
|
||||
} else {
|
||||
this.preContent.addClass('no-display');
|
||||
}
|
||||
|
||||
if (result.errorContent.html.length) {
|
||||
this.htmlContent.html(result.errorContent.html).removeClass('no-display');
|
||||
} else {
|
||||
this.htmlContent.addClass('no-display');
|
||||
}
|
||||
|
||||
if (result.errorContent.iframe.length) {
|
||||
DUPX.iframeInjectHTML(this.iframeContent, result.errorContent.iframe);
|
||||
this.iframeContent.removeClass('no-display');
|
||||
} else {
|
||||
this.iframeContent.addClass('no-display');
|
||||
}
|
||||
|
||||
if (typeof tryAgainButtonCallback === "function") {
|
||||
this.tryAgainButton.off().one('click', tryAgainButtonCallback).removeClass('no-display');
|
||||
} else {
|
||||
this.tryAgainButton.off().addClass('no-display');
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
DUPX.ajaxErrorDisplayRestart = function (result, textStatus, jqXHR) {
|
||||
DUPX.pageComponents.showError(result, textStatus, jqXHR, function () {
|
||||
window.location.href = <?php echo SnapJson::jsonEncode(Security::getInstance()->getBootUrl()); ?>;
|
||||
});
|
||||
};
|
||||
|
||||
DUPX.ajaxErrorDisplayHideError = function (result, textStatus, jqXHR) {
|
||||
DUPX.pageComponents.showError(result, textStatus, jqXHR, function () {
|
||||
DUPX.pageComponents.showContent();
|
||||
});
|
||||
};
|
||||
|
||||
});
|
||||
</script>
|
||||
@@ -0,0 +1,74 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
*
|
||||
* @package templates/default
|
||||
*/
|
||||
|
||||
use Duplicator\Libs\Snap\SnapJson;
|
||||
|
||||
defined('ABSPATH') || defined('DUPXABSPATH') || exit;
|
||||
?>
|
||||
<script>
|
||||
DUPX.confirmDialog = {
|
||||
content: null,
|
||||
advCheckCheckbox: null,
|
||||
loadAndOpen: function () {
|
||||
const confirmDialogAction = <?php echo SnapJson::jsonEncode(DUPX_Ctrl_ajax::ACTION_PROCEED_CONFIRM_DIALOG); ?>;
|
||||
const confirmDialogToken = <?php echo SnapJson::jsonEncode(DUPX_Ctrl_ajax::generateToken(DUPX_Ctrl_ajax::ACTION_PROCEED_CONFIRM_DIALOG)); ?>;
|
||||
|
||||
let thisObj = this;
|
||||
|
||||
if (this.content !== null) {
|
||||
this.content.remove();
|
||||
this.content = null;
|
||||
}
|
||||
|
||||
DUPX.StandarJsonAjaxWrapper(
|
||||
confirmDialogAction,
|
||||
confirmDialogToken,
|
||||
{},
|
||||
function (data) {
|
||||
thisObj.content = $(data.actionData);
|
||||
thisObj.advCheckCheckbox = thisObj.content.find("#dialog-adv-confirm-check");
|
||||
thisObj.open();
|
||||
}
|
||||
);
|
||||
},
|
||||
open: function () {
|
||||
if (this.content.length == 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
let thisObj = this;
|
||||
|
||||
this.content.dialog({
|
||||
resizable: false,
|
||||
height: "auto",
|
||||
width: 700,
|
||||
modal: true,
|
||||
position: {my: 'top', at: 'top+150'},
|
||||
buttons: {
|
||||
"OkButton": {
|
||||
text: "OK",
|
||||
id: "db-install-dialog-confirm-button",
|
||||
click: function () {
|
||||
if (thisObj.advCheckCheckbox.length > 0 && !thisObj.advCheckCheckbox.is(":checked")) {
|
||||
return;
|
||||
}
|
||||
$(this).dialog("close");
|
||||
DUPX.deployStep1();
|
||||
}
|
||||
},
|
||||
"CancelButton": {
|
||||
text: "Cancel",
|
||||
id: "db-install-dialog-cancel-button",
|
||||
click: function () {
|
||||
$(this).dialog("close");
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
};
|
||||
</script>
|
||||
@@ -0,0 +1,316 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
*
|
||||
* @package templates/default
|
||||
*/
|
||||
|
||||
defined('ABSPATH') || defined('DUPXABSPATH') || exit;
|
||||
|
||||
use Duplicator\Installer\Core\Params\PrmMng;
|
||||
use Duplicator\Libs\Snap\SnapJson;
|
||||
|
||||
$paramsManager = PrmMng::getInstance();
|
||||
$archiveConfig = DUPX_ArchiveConfig::getInstance();
|
||||
?>
|
||||
<script>
|
||||
|
||||
const cpnlHostInputId = <?php echo SnapJson::jsonEncode($paramsManager->getFormItemId(PrmMng::PARAM_CPNL_HOST)); ?>;
|
||||
const cpnlUserInputId = <?php echo SnapJson::jsonEncode($paramsManager->getFormItemId(PrmMng::PARAM_CPNL_USER)); ?>;
|
||||
const cpnlPassInputId = <?php echo SnapJson::jsonEncode($paramsManager->getFormItemId(PrmMng::PARAM_CPNL_PASS)); ?>;
|
||||
const cpnlDbHostInputId = <?php echo SnapJson::jsonEncode($paramsManager->getFormItemId(PrmMng::PARAM_CPNL_DB_HOST)); ?>;
|
||||
const cpnlDbUserInputId = <?php echo SnapJson::jsonEncode($paramsManager->getFormItemId(PrmMng::PARAM_CPNL_DB_USER_TXT)); ?>;
|
||||
const cpnlDbPassInputId = <?php echo SnapJson::jsonEncode($paramsManager->getFormItemId(PrmMng::PARAM_CPNL_DB_PASS)); ?>;
|
||||
const cpnlDbActionInputId = <?php echo SnapJson::jsonEncode($paramsManager->getFormItemId(PrmMng::PARAM_CPNL_DB_ACTION)); ?>;
|
||||
const cpnlDbNameWrapperId = <?php echo SnapJson::jsonEncode($paramsManager->getFormWrapperId(PrmMng::PARAM_CPNL_DB_NAME_TXT)); ?>;
|
||||
const cpnlDbNameInputId = <?php echo SnapJson::jsonEncode($paramsManager->getFormItemId(PrmMng::PARAM_CPNL_DB_NAME_TXT)); ?>;
|
||||
const cpnlDbNameSelWrapperId = <?php echo SnapJson::jsonEncode($paramsManager->getFormWrapperId(PrmMng::PARAM_CPNL_DB_NAME_SEL)); ?>;
|
||||
const cpnlDbNameSelInputId = <?php echo SnapJson::jsonEncode($paramsManager->getFormItemId(PrmMng::PARAM_CPNL_DB_NAME_SEL)); ?>;
|
||||
const cpnlPrefixInputId = <?php echo SnapJson::jsonEncode($paramsManager->getFormItemId(PrmMng::PARAM_CPNL_PREFIX)); ?>;
|
||||
const cpnlDbUserWrapperId = <?php echo SnapJson::jsonEncode($paramsManager->getFormWrapperId(PrmMng::PARAM_CPNL_DB_USER_TXT)); ?>;
|
||||
const cpnlDbUserSelWrapperId = <?php echo SnapJson::jsonEncode($paramsManager->getFormWrapperId(PrmMng::PARAM_CPNL_DB_USER_SEL)); ?>;
|
||||
const cpnlDbUserSelInputId = <?php echo SnapJson::jsonEncode($paramsManager->getFormItemId(PrmMng::PARAM_CPNL_DB_USER_SEL)); ?>;
|
||||
const cpnlDbUserCheckInputId = <?php echo SnapJson::jsonEncode($paramsManager->getFormItemId(PrmMng::PARAM_CPNL_DB_USER_CHK)); ?>;
|
||||
const cpnlIgnorePrefixInputId = <?php echo SnapJson::jsonEncode($paramsManager->getFormItemId(PrmMng::PARAM_CPNL_IGNORE_PREFIX)); ?>;
|
||||
|
||||
var cpnlPrefix = '';
|
||||
var CPNL_TOKEN;
|
||||
var CPNL_DBINFO = null;
|
||||
var CPNL_DBUSERS = null;
|
||||
var CPNL_CONNECTED = false;
|
||||
var CPNL_PREFIX = false;
|
||||
|
||||
/**
|
||||
* Returns the windows active url */
|
||||
DUPX.getcPanelURL = function (button)
|
||||
{
|
||||
var loc = window.location;
|
||||
var newVal = loc.protocol + '//' + loc.hostname + ':2038';
|
||||
$(button).parent().find('input').val(newVal);
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* Performs cpnl connection and updates UI */
|
||||
DUPX.cpnlConnect = function ()
|
||||
{
|
||||
$('#s2-cpnl-connect-btn').attr('readonly', 'true').val('Connecting... Please Wait!');
|
||||
$('a#s2-cpnl-status-msg').hide();
|
||||
|
||||
var apiAccountActive = function (data)
|
||||
{
|
||||
var html = "";
|
||||
var error = "Unknown Error";
|
||||
var cpnlPrefix = "";
|
||||
var validHost = false;
|
||||
var validUser = false;
|
||||
|
||||
if (typeof data == 'undefined') {
|
||||
error = "Unknown error, unable to retrive data request.";
|
||||
CPNL_CONNECTED = false;
|
||||
} else if (data.hasOwnProperty('status') && data.status == 0) {
|
||||
error = data.hasOwnProperty('statusText') ? data.statusText : "Unknown error, unable to retrive status text.";
|
||||
CPNL_CONNECTED = false;
|
||||
} else if (data.hasOwnProperty('result')) {
|
||||
validHost = data.result.valid_host;
|
||||
validUser = data.result.valid_user;
|
||||
CPNL_DBINFO = data.result.hasOwnProperty('dbinfo') ? data.result.dbinfo : null;
|
||||
CPNL_DBUSERS = data.result.hasOwnProperty('dbusers') ? data.result.dbusers : null;
|
||||
CPNL_CONNECTED = validHost && validUser;
|
||||
}
|
||||
|
||||
html += validHost ? "<b>Host:</b> <div class='dupx-pass'>Success</div> "
|
||||
: "<b>Host:</b> <div class='dupx-fail'>Unable to Connect</div> ";
|
||||
html += validUser ? "<b>Account:</b> <div class='dupx-pass'>Found</div><br/>"
|
||||
: "<b>Account:</b> <div class='dupx-fail'>Not Found</div><br/>";
|
||||
|
||||
if (CPNL_CONNECTED)
|
||||
{
|
||||
var setupDBName = '<?php echo json_encode($paramsManager->getValue(PrmMng::PARAM_CPNL_DB_NAME_TXT)); ?>';
|
||||
var setupDBUser = '<?php echo json_encode($paramsManager->getValue(PrmMng::PARAM_CPNL_DB_USER_TXT)); ?>';
|
||||
var $dbNameSelect = $("#" + cpnlDbNameSelInputId);
|
||||
var $dbUserSelect = $("#" + cpnlDbUserSelInputId);
|
||||
|
||||
//Set Prefix data
|
||||
if (data.result.is_prefix_on.status)
|
||||
{
|
||||
cpnlPrefix = $('#' + cpnlUserInputId).val() + "_";
|
||||
$('#' + cpnlPrefixInputId).val(cpnlPrefix);
|
||||
var dbnameTxt = $("#" + cpnlDbNameInputId).val();
|
||||
var dbuserTxt = $("#" + cpnlDbUserInputId).val();
|
||||
|
||||
$("#cpnl-prefix-dbname, #cpnl-prefix-dbuser").show().html(cpnlPrefix);
|
||||
if (dbnameTxt.indexOf(cpnlPrefix) != -1) {
|
||||
$("#" + cpnlDbNameInputId).val(dbnameTxt.replace(cpnlPrefix, ''));
|
||||
}
|
||||
if (dbuserTxt.indexOf(cpnlPrefix) != -1) {
|
||||
$("#" + cpnlDbUserInputId).val(dbuserTxt.replace(cpnlPrefix, ''));
|
||||
}
|
||||
CPNL_PREFIX = true;
|
||||
} else {
|
||||
$("#cpnl-prefix-dbname, #cpnl-prefix-dbuser").hide().html("");
|
||||
$('#' + cpnlIgnorePrefixInputId).attr('checked', 'true');
|
||||
$('#' + cpnlIgnorePrefixInputId).attr('onclick', 'return false;');
|
||||
$('#' + cpnlIgnorePrefixInputId).attr('onkeydown', 'return false;');
|
||||
var $label = $('label[for="cpnl_ignore_prefix"]');
|
||||
$label.css('color', 'gray');
|
||||
$label.html($label.text() + ' <i>(this option has been set to readonly by host)</i>');
|
||||
CPNL_PREFIX = false;
|
||||
}
|
||||
|
||||
//Enable database inputs and show header green go icon
|
||||
DUPX.cpnlToggleLogin('on');
|
||||
$('a#s2-cpnl-status-msg').html('<div class="status-badge success"></div>');
|
||||
$('div#s2-cpnl-status-details-msg').html(html);
|
||||
$("div[data-target='#s2-cpnl-area']").trigger('click');
|
||||
|
||||
//Load DB Names
|
||||
$dbNameSelect.find('option').remove().end();
|
||||
$dbNameSelect.append($("<option selected></option>").val("").text("-- Select Database --"));
|
||||
$.each(CPNL_DBINFO, function (key, value)
|
||||
{
|
||||
(setupDBName == value.db)
|
||||
? $dbNameSelect.append($("<option selected></option>").val(value.db).text(value.db))
|
||||
: $dbNameSelect.append($("<option></option>").val(value.db).text(value.db));
|
||||
});
|
||||
|
||||
//Load DB Users
|
||||
$dbUserSelect.find('option').remove().end();
|
||||
$dbUserSelect.append($("<option selected></option>").val("").text("-- Select User --"));
|
||||
$.each(CPNL_DBUSERS, function (key, value)
|
||||
{
|
||||
(setupDBUser == value.user)
|
||||
? $dbUserSelect.append($("<option selected></option>").val(value.user).text(value.user))
|
||||
: $dbUserSelect.append($("<option></option>").val(value.user).text(value.user));
|
||||
});
|
||||
|
||||
//Warn on host name mismatch
|
||||
var address = window.location.hostname.replace('www.', '');
|
||||
($("#" + cpnlHostInputId).val().indexOf(address) == -1)
|
||||
? $('#cpnl-host-warn').show()
|
||||
: $('#cpnl-host-warn').hide();
|
||||
} else
|
||||
{
|
||||
//Auto message display
|
||||
html += "<b>Details:</b> Unable to connect. Error status is: '" + error + "'. <br/>";
|
||||
$('a#s2-cpnl-status-msg').html('<div class="status-badge fail"></div>');
|
||||
$('div#s2-cpnl-status-details-msg').html(html);
|
||||
$('div#s2-cpnl-status-details').show(500);
|
||||
//Inputs
|
||||
DUPX.cpnlToggleLogin('off');
|
||||
}
|
||||
$('a#s2-cpnl-status-msg').show(200);
|
||||
$('#s2-cpnl-connect-btn').removeAttr('readonly').val('Connect');
|
||||
}
|
||||
|
||||
DUPX.requestAPI({
|
||||
operation: '/cpnl/create_token/',
|
||||
timeout: 10000,
|
||||
params: {
|
||||
host: $("#" + cpnlHostInputId).val(),
|
||||
user: $('#' + cpnlUserInputId).val(),
|
||||
pass: $('#' + cpnlPassInputId).val()
|
||||
},
|
||||
callback: function (data) {
|
||||
CPNL_TOKEN = data.result;
|
||||
DUPX.requestAPI({
|
||||
operation: '/cpnl/get_setup_data/',
|
||||
timeout: 30000,
|
||||
params: {token: data.result},
|
||||
callback: apiAccountActive
|
||||
});
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
/**
|
||||
* Enables/Disables database setup and cPanel login inputs */
|
||||
DUPX.cpnlToggleLogin = function (state)
|
||||
{
|
||||
//Change btn enabled
|
||||
if (state == 'on') {
|
||||
$('#' + cpnlHostInputId + ', #' + cpnlUserInputId + ', #' + cpnlPassInputId).addClass('readonly').attr('readonly', 'true');
|
||||
$('#s2-cpnl-connect-btn').addClass('disabled').attr('disabled', 'true');
|
||||
$('#s2-cpnl-change-btn').removeAttr('disabled').removeClass('disabled').show();
|
||||
//Enable cPanel Database
|
||||
$('#s2-cpnl-db-opts td').css('color', 'black');
|
||||
$('#s2-cpnl-db-opts input, #s2-cpnl-db-opts select').removeAttr('disabled');
|
||||
$('#cpnl-host-get-lnk').hide();
|
||||
}
|
||||
//Change btn disabled
|
||||
else {
|
||||
$('#' + cpnlHostInputId + ', #' + cpnlUserInputId + ', #' + cpnlPassInputId).removeClass('readonly').removeAttr('readonly');
|
||||
$('#s2-cpnl-connect-btn').removeAttr('disabled', 'true').removeClass('disabled');
|
||||
$('#s2-cpnl-change-btn').addClass('disabled').attr('disabled', 'true');
|
||||
//Disable cPanel Database
|
||||
$('#s2-cpnl-db-opts td').css('color', 'silver');
|
||||
$('#s2-cpnl-db-opts input, #s2-cpnl-db-opts select').attr('disabled', 'true');
|
||||
$('#cpnl-host-get-lnk').show();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Updates action status */
|
||||
DUPX.cpnlDBActionChange = function ()
|
||||
{
|
||||
var action = $('#' + cpnlDbActionInputId).val();
|
||||
$('#s2-cpnl-db-opts .s2-warning-manualdb').hide();
|
||||
$('#s2-cpnl-db-opts .s2-warning-emptydb').hide();
|
||||
$('#s2-cpnl-db-opts .s2-warning-renamedb').hide();
|
||||
|
||||
switch (action) {
|
||||
case 'create' :
|
||||
$('#' + cpnlDbNameInputId).val('');
|
||||
$('#' + cpnlDbNameWrapperId).show();
|
||||
$('#' + cpnlDbNameSelWrapperId).hide();
|
||||
break;
|
||||
case 'empty' :
|
||||
$('#' + cpnlDbNameSelInputId).trigger('change');
|
||||
$('#' + cpnlDbNameWrapperId).hide();
|
||||
$('#' + cpnlDbNameSelWrapperId).show();
|
||||
$('#s2-cpnl-db-opts .s2-warning-emptydb').show();
|
||||
break;
|
||||
case 'rename' :
|
||||
$('#' + cpnlDbNameSelInputId).trigger('change');
|
||||
$('#' + cpnlDbNameWrapperId).hide();
|
||||
$('#' + cpnlDbNameSelWrapperId).show();
|
||||
$('#s2-cpnl-db-opts .s2-warning-renamedb').show();
|
||||
break;
|
||||
case 'manual' :
|
||||
$('#' + cpnlDbNameSelInputId).trigger('change');
|
||||
$('#' + cpnlDbNameWrapperId).hide();
|
||||
$('#' + cpnlDbNameSelWrapperId).show();
|
||||
$('#s2-cpnl-db-opts .s2-warning-manualdb').show();
|
||||
break;
|
||||
}
|
||||
};
|
||||
|
||||
DUPX.cpnlPrefixIgnore = function ()
|
||||
{
|
||||
if ($('#' + cpnlIgnorePrefixInputId).prop('checked')) {
|
||||
CPNL_PREFIX = false;
|
||||
$("#cpnl-prefix-dbname, #cpnl-prefix-dbuser").hide();
|
||||
} else {
|
||||
CPNL_PREFIX = true;
|
||||
$("#cpnl-prefix-dbname, #cpnl-prefix-dbuser").show();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Toggle the DB user name type */
|
||||
DUPX.cpnlDBUserToggle = function ()
|
||||
{
|
||||
$('#' + cpnlDbUserWrapperId + ', #' + cpnlDbUserSelWrapperId).hide();
|
||||
$('#' + cpnlDbUserSelInputId + ', #' + cpnlDbUserInputId).removeAttr('disabled');
|
||||
$('#' + cpnlDbUserSelInputId + ', #' + cpnlDbUserInputId).removeAttr('required');
|
||||
|
||||
$('#' + cpnlDbUserInputId).attr('required', 'true');
|
||||
$('#' + cpnlDbPassInputId).attr({
|
||||
'required': 'true'
|
||||
});
|
||||
|
||||
//Use existing
|
||||
if ($('#' + cpnlDbUserCheckInputId).prop('checked')) {
|
||||
$('#' + cpnlDbUserInputId).val('');
|
||||
$('#' + cpnlDbUserWrapperId).show();
|
||||
$('#' + cpnlDbUserSelWrapperId).hide();
|
||||
//Create New
|
||||
} else {
|
||||
$('#' + cpnlDbUserSelInputId).trigger('changed');
|
||||
$('#' + cpnlDbUserWrapperId).hide();
|
||||
$('#' + cpnlDbUserSelWrapperId).show();
|
||||
}
|
||||
}
|
||||
|
||||
//DOCUMENT LOAD
|
||||
$(document).ready(function ()
|
||||
{
|
||||
//Custom Validator
|
||||
window.Parsley.addValidator('cpnluser', {
|
||||
validateString: function (value) {
|
||||
var prefix = CPNL_PREFIX
|
||||
? $('#' + cpnlUserInputId).val() + "_" + value
|
||||
: value;
|
||||
return (prefix.length <= 24);
|
||||
},
|
||||
messages: {
|
||||
en: 'Database user cannot be more that 24 characters including prefix'
|
||||
}
|
||||
});
|
||||
|
||||
//Attach Events
|
||||
$("#" + cpnlDbActionInputId).on("change", DUPX.cpnlDBActionChange);
|
||||
$("#" + cpnlDbUserCheckInputId).click(DUPX.cpnlDBUserToggle);
|
||||
|
||||
DUPX.cpnlDBActionChange();
|
||||
DUPX.cpnlDBUserToggle();
|
||||
DUPX.cpnlToggleLogin('off');
|
||||
|
||||
$("input[name='cpnl-dbmysqlmode']").click(function () {
|
||||
($(this).val() == 'CUSTOM')
|
||||
? $('#cpnl-dbmysqlmode_3_view').show()
|
||||
: $('#cpnl-dbmysqlmode_3_view').hide();
|
||||
});
|
||||
|
||||
});
|
||||
</script>
|
||||
@@ -0,0 +1,43 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
*
|
||||
* @package templates/default
|
||||
*/
|
||||
|
||||
defined('ABSPATH') || defined('DUPXABSPATH') || exit;
|
||||
|
||||
use Duplicator\Installer\Core\Params\Descriptors\ParamDescDatabase;
|
||||
use Duplicator\Installer\Core\Params\PrmMng;
|
||||
use Duplicator\Libs\Snap\SnapJson;
|
||||
|
||||
$paramsManager = PrmMng::getInstance();
|
||||
?>
|
||||
<script>
|
||||
const dbCharsetDefaultID = <?php echo SnapJson::jsonEncode($paramsManager->getFormItemId(PrmMng::PARAM_DB_CHARSET)); ?>;
|
||||
const dbCollateDefaultID = <?php echo SnapJson::jsonEncode($paramsManager->getFormItemId(PrmMng::PARAM_DB_COLLATE)); ?>;
|
||||
|
||||
$(document).ready(function ()
|
||||
{
|
||||
$('#' + dbCharsetDefaultID).on('change', function () {
|
||||
let collateDefault = $(this).find(':selected').data('collation-default');
|
||||
let collations = $(this).find(':selected').data('collations');
|
||||
let collateObj = $('#' + dbCollateDefaultID);
|
||||
|
||||
collateObj.empty();
|
||||
$("<option></option>")
|
||||
.appendTo(collateObj)
|
||||
.attr('value', '')
|
||||
.text(<?php echo json_encode(ParamDescDatabase::EMPTY_COLLATION_LABEL); ?> + ' [' + collateDefault + ']')
|
||||
.prop('selected', true);
|
||||
|
||||
for (let i = 0; i < collations.length; i++) {
|
||||
let label = collations[i] + (collations[i] === collateDefault ? <?php echo json_encode(ParamDescDatabase::DEFAULT_COLLATE_POSTFIX); ?> : '');
|
||||
$("<option></option>")
|
||||
.appendTo(collateObj)
|
||||
.attr('value', collations[i])
|
||||
.text(label);
|
||||
}
|
||||
});
|
||||
});
|
||||
</script>
|
||||
@@ -0,0 +1,124 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
*
|
||||
* @package templates/default
|
||||
*/
|
||||
|
||||
defined('ABSPATH') || defined('DUPXABSPATH') || exit;
|
||||
|
||||
use Duplicator\Installer\Core\Params\PrmMng;
|
||||
use Duplicator\Libs\Snap\SnapJson;
|
||||
|
||||
$paramsManager = PrmMng::getInstance();
|
||||
?>
|
||||
<script>
|
||||
DUPX.startAjaxDbInstall = function (isTheFirstCall, successCallback)
|
||||
{
|
||||
if (isTheFirstCall) {
|
||||
DUPX.pageComponents.resetTopMessages().showProgress({
|
||||
'title': 'Installing Database',
|
||||
'perc': '0%',
|
||||
'secondary': 'Bytes processed: 0',
|
||||
'bottomText':
|
||||
'<i>Keep this window open during the creation process.</i><br/>' +
|
||||
'<i>This can take several minutes.</i>'
|
||||
});
|
||||
}
|
||||
|
||||
let dbInstallAction = <?php echo SnapJson::jsonEncode(DUPX_Ctrl_ajax::ACTION_DBINSTALL); ?>;
|
||||
let dbInstallToken = <?php echo SnapJson::jsonEncode(DUPX_Ctrl_ajax::generateToken(DUPX_Ctrl_ajax::ACTION_DBINSTALL)); ?>;
|
||||
|
||||
let retryAttemp = 0;
|
||||
|
||||
DUPX.StandarJsonAjaxWrapper(
|
||||
dbInstallAction,
|
||||
dbInstallToken,
|
||||
{},
|
||||
function (data) {
|
||||
DUPX.progress.update({
|
||||
'perc': data.actionData.perc,
|
||||
'secondary': data.actionData.queryOffset
|
||||
});
|
||||
console.log('dbinstall data', data);
|
||||
|
||||
if (data.actionData.is_error) {
|
||||
const result = {
|
||||
'success': false,
|
||||
'message': 'DB INSTALL ERROR: ' + data.actionData.error_msg,
|
||||
'errorContent': {
|
||||
'pre': '',
|
||||
'html': '',
|
||||
'iframe': ''
|
||||
},
|
||||
'actionData': null
|
||||
};
|
||||
DUPX.ajaxErrorDisplayHideError(result, null, null);
|
||||
} else if (data.actionData.continue_chunking) {
|
||||
DUPX.startAjaxDbInstall(false, successCallback);
|
||||
} else if (data.actionData.pass) {
|
||||
if (typeof successCallback === "function") {
|
||||
successCallback(data);
|
||||
} else {
|
||||
alert('db install complete');
|
||||
}
|
||||
} else {
|
||||
const result = {
|
||||
'success': false,
|
||||
'message': 'DB INSTALL ERROR: not passed',
|
||||
'errorContent': {
|
||||
'pre': '',
|
||||
'html': '',
|
||||
'iframe': ''
|
||||
},
|
||||
'actionData': null
|
||||
};
|
||||
DUPX.ajaxErrorDisplayHideError(result, null, null);
|
||||
}
|
||||
},
|
||||
function (result, textStatus, jqXHR) {
|
||||
let default_timeout_message = '';
|
||||
let status = "<b>Server Code:</b> " + jqXHR.status + "<br/>";
|
||||
status += "<b>Status:</b> " + jqXHR.statusText + "<br/>";
|
||||
status += "<b>Response:</b> " + jqXHR.responseText + "<hr/>";
|
||||
|
||||
if (textStatus && textStatus.toLowerCase() == "timeout" || textStatus.toLowerCase() == "service unavailable") {
|
||||
status += "<b>Recommendation:</b><br/>";
|
||||
status += "To resolve this problem please follow the instructions showing " +
|
||||
"<a target='_blank' href='https://duplicator.com/knowledge-base/how-to-fix-database-connection-issues'>in the FAQ</a>.<br/><br/>";
|
||||
} else if ((jqXHR.status == 403) || (jqXHR.status == 500)) {
|
||||
status += "<b>Recommendation</b><br/>";
|
||||
status += "See <a target='_blank' href='https://duplicator.com/knowledge-base/how-to-resolve-403-500-timeout-issues-on-step-3'>" +
|
||||
"this section</a> " +
|
||||
"of the Technical FAQ for possible resolutions.<br/><br/>"
|
||||
} else if (jqXHR.status == 0) {
|
||||
status += "<b>Recommendation</b><br/>";
|
||||
status += "This may be a server timeout and performing a 'Manual Extract' install can avoid timeouts. " +
|
||||
"See <a target='_blank' href='https://duplicator.com/knowledge-base/how-to-fix-installer-archive-extraction-issues'>" +
|
||||
"this section</a> " +
|
||||
"of the FAQ for a description of how to do that.<br/><br/>"
|
||||
}
|
||||
|
||||
result.errorContent.html += status;
|
||||
DUPX.ajaxErrorDisplayHideError(result, textStatus, jqXHR);
|
||||
},
|
||||
{
|
||||
retryOnFailure: true,
|
||||
numberOfAttempts: 2,
|
||||
delayRetryOnFailure: 5000,
|
||||
callbackOnRetry: function (data, textStatus, jqXHR, options) {
|
||||
retryAttemp++;
|
||||
|
||||
DUPX.progress.update({
|
||||
'notice': 'Db install failed: ' + data.message + ',<br>' +
|
||||
'wait ' + (options.delayRetryOnFailure / 1000) + ' seconds and retry.<br>' +
|
||||
'<b>' + DUPX.stringifyNumber(retryAttemp) + ' attempt</b>'
|
||||
});
|
||||
console.log('Callback on retry', data);
|
||||
}
|
||||
}
|
||||
);
|
||||
|
||||
};
|
||||
|
||||
</script>
|
||||
@@ -0,0 +1,143 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
*
|
||||
* @package templates/default
|
||||
*/
|
||||
|
||||
defined('ABSPATH') || defined('DUPXABSPATH') || exit;
|
||||
|
||||
use Duplicator\Installer\Core\InstState;
|
||||
use Duplicator\Installer\Core\Params\PrmMng;
|
||||
use Duplicator\Libs\Snap\SnapJson;
|
||||
|
||||
$paramsManager = PrmMng::getInstance();
|
||||
|
||||
if (InstState::getInstance()->getMode() === InstState::MODE_OVR_INSTALL) {
|
||||
$overwriteData = $paramsManager->getValue(PrmMng::PARAM_OVERWRITE_SITE_DATA);
|
||||
$ovr_dbhost = $overwriteData['dbhost'];
|
||||
$ovr_dbname = $overwriteData['dbname'];
|
||||
$ovr_dbuser = $overwriteData['dbuser'];
|
||||
$ovr_dbpass = $overwriteData['dbpass'];
|
||||
} else {
|
||||
$ovr_dbhost = '';
|
||||
$ovr_dbname = '';
|
||||
$ovr_dbuser = '';
|
||||
$ovr_dbpass = '';
|
||||
}
|
||||
?>
|
||||
<script>
|
||||
const fileExtractMode = <?php echo SnapJson::jsonEncode(InstState::dbDoNothing()); ?>;
|
||||
|
||||
DUPX.toggleFileExtractMode = function(enable = false)
|
||||
{
|
||||
if (enable) {
|
||||
$('.requires-db-hide').hide();
|
||||
$('.requires-db-disable').prop('disabled', true);
|
||||
$('.requires-no-db').show();
|
||||
$('#label-for-advanced').trigger('click');
|
||||
} else {
|
||||
$('.requires-db-hide').show();
|
||||
$('.requires-db-disable').prop('disabled', false);
|
||||
$('.requires-no-db').hide();
|
||||
}
|
||||
}
|
||||
|
||||
const dbViewModeInputId = <?php echo SnapJson::jsonEncode($paramsManager->getFormItemId(PrmMng::PARAM_DB_VIEW_MODE)); ?>;
|
||||
const dbHostInputId = <?php echo SnapJson::jsonEncode($paramsManager->getFormItemId(PrmMng::PARAM_DB_HOST)); ?>;
|
||||
const dbNameInputId = <?php echo SnapJson::jsonEncode($paramsManager->getFormItemId(PrmMng::PARAM_DB_NAME)); ?>;
|
||||
const dbUserInputId = <?php echo SnapJson::jsonEncode($paramsManager->getFormItemId(PrmMng::PARAM_DB_USER)); ?>;
|
||||
const dbPassInputId = <?php echo SnapJson::jsonEncode($paramsManager->getFormItemId(PrmMng::PARAM_DB_PASS)); ?>;
|
||||
const dbActionInputId = <?php echo SnapJson::jsonEncode($paramsManager->getFormItemId(PrmMng::PARAM_DB_ACTION)); ?>;
|
||||
|
||||
DUPX.basicDBActionChange = function ()
|
||||
{
|
||||
var action = $('#' + dbActionInputId).val();
|
||||
$('.s2-basic-pane .s2-warning-manualdb').hide();
|
||||
$('.s2-basic-pane .s2-warning-emptydb').hide();
|
||||
$('.s2-basic-pane .s2-warning-renamedb').hide();
|
||||
|
||||
DUPX.toggleFileExtractMode(fileExtractMode);
|
||||
switch (action)
|
||||
{
|
||||
case 'create' :
|
||||
break;
|
||||
case 'empty' :
|
||||
$('.s2-basic-pane .s2-warning-emptydb').show(300);
|
||||
break;
|
||||
case 'rename' :
|
||||
$('.s2-basic-pane .s2-warning-renamedb').show(300);
|
||||
break;
|
||||
case 'manual' :
|
||||
$('.s2-basic-pane .s2-warning-manualdb').show(300);
|
||||
break;
|
||||
case 'dbdonothing':
|
||||
DUPX.toggleFileExtractMode(true);
|
||||
break;
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
//DOCUMENT INIT
|
||||
$(document).ready(function ()
|
||||
{
|
||||
$("#" + dbActionInputId).on("change", DUPX.basicDBActionChange);
|
||||
DUPX.basicDBActionChange();
|
||||
|
||||
DUPX.checkOverwriteParameters = function (dbhost, dbname, dbuser, dbpass)
|
||||
{
|
||||
$("#" + dbHostInputId).val(<?php echo SnapJson::jsonEncode($ovr_dbhost); ?>).prop('readonly', true);
|
||||
$("#" + dbNameInputId).val(<?php echo SnapJson::jsonEncode($ovr_dbname); ?>).prop('readonly', true);
|
||||
$("#" + dbUserInputId).val(<?php echo SnapJson::jsonEncode($ovr_dbuser); ?>).prop('readonly', true);
|
||||
$("#" + dbPassInputId).val(<?php echo SnapJson::jsonEncode($ovr_dbpass); ?>).prop('readonly', true);
|
||||
$("#s2-db-basic-setup").show();
|
||||
};
|
||||
|
||||
DUPX.fillInPlaceHolders = function ()
|
||||
{
|
||||
$("#" + dbHostInputId).attr('placeholder', <?php echo SnapJson::jsonEncode($ovr_dbhost); ?>).prop('readonly', false);
|
||||
$("#" + dbNameInputId).attr('placeholder', <?php echo SnapJson::jsonEncode($ovr_dbname); ?>).prop('readonly', false);
|
||||
$("#" + dbUserInputId).attr('placeholder', <?php echo SnapJson::jsonEncode($ovr_dbuser); ?>).prop('readonly', false);
|
||||
$("#" + dbPassInputId).attr('placeholder', <?php echo SnapJson::jsonEncode($ovr_dbpass); ?>).prop('readonly', false);
|
||||
};
|
||||
|
||||
DUPX.resetParameters = function ()
|
||||
{
|
||||
$("#" + dbHostInputId).val('').attr('placeholder', '').prop('readonly', false);
|
||||
$("#" + dbNameInputId).val('').attr('placeholder', '').prop('readonly', false);
|
||||
$("#" + dbUserInputId).val('').attr('placeholder', '').prop('readonly', false);
|
||||
$("#" + dbPassInputId).val('').attr('placeholder', '').prop('readonly', false);
|
||||
};
|
||||
|
||||
<?php if (InstState::getInstance()->getMode() === InstState::MODE_OVR_INSTALL) : ?>
|
||||
DUPX.fillInPlaceHolders();
|
||||
<?php endif; ?>
|
||||
|
||||
DUPX.togglePanels = function ()
|
||||
{
|
||||
if ($('#' + dbViewModeInputId).val() == 'basic') {
|
||||
$('#' + dbViewModeInputId).val("cpnl").change();
|
||||
} else {
|
||||
$('#' + dbViewModeInputId).val("basic").change();
|
||||
}
|
||||
}
|
||||
|
||||
$('#' + dbViewModeInputId).change(function () {
|
||||
switch ($(this).val()) {
|
||||
case 'cpnl':
|
||||
$('.s2-cpnl-pane').removeClass('no-display');
|
||||
$('.s2-basic-pane').addClass('no-display');
|
||||
$('#' + dbViewModeInputId + "_0").removeClass("active");
|
||||
$('#' + dbViewModeInputId + "_1").addClass("active");
|
||||
break;
|
||||
case 'basic':
|
||||
default:
|
||||
$('.s2-cpnl-pane').addClass('no-display');
|
||||
$('.s2-basic-pane').removeClass('no-display');
|
||||
$('#' + dbViewModeInputId + "_1").removeClass("active");
|
||||
$('#' + dbViewModeInputId + "_0").addClass("active");
|
||||
break;
|
||||
}
|
||||
});
|
||||
});
|
||||
</script>
|
||||
@@ -0,0 +1,163 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
*
|
||||
* @package templates/default
|
||||
*/
|
||||
|
||||
defined('ABSPATH') || defined('DUPXABSPATH') || exit;
|
||||
|
||||
use Duplicator\Installer\Core\Params\PrmMng;
|
||||
use Duplicator\Libs\Snap\SnapJson;
|
||||
|
||||
$paramsManager = PrmMng::getInstance();
|
||||
$processedStr = DUPX_Extraction::getInitialFileProcessedString();
|
||||
?>
|
||||
<script>
|
||||
DUPX.startAjaxExtraction = function(isTheFirstCall, successCallback) {
|
||||
if (isTheFirstCall) {
|
||||
DUPX.pageComponents.resetTopMessages().showProgress({
|
||||
'title': 'Extracting Backup Files',
|
||||
'perc': '0%',
|
||||
'secondary': <?php echo json_encode($processedStr); ?>,
|
||||
'bottomText': '<i>Keep this window open during the extraction process.</i><br/>' +
|
||||
'<i>This can take several minutes.</i>'
|
||||
});
|
||||
}
|
||||
|
||||
let extractionAction = <?php echo SnapJson::jsonEncode(DUPX_Ctrl_ajax::ACTION_EXTRACTION); ?>;
|
||||
let extractionToken = <?php echo SnapJson::jsonEncode(DUPX_Ctrl_ajax::generateToken(DUPX_Ctrl_ajax::ACTION_EXTRACTION)); ?>;
|
||||
|
||||
let retryAttemp = 0;
|
||||
|
||||
DUPX.StandarJsonAjaxWrapper(
|
||||
extractionAction,
|
||||
extractionToken, {},
|
||||
function(data, textStatus, jqXHR) {
|
||||
DUPX.progress.update({
|
||||
'perc': data.actionData.perc,
|
||||
'secondary': data.actionData.processedFiles,
|
||||
'notice': ''
|
||||
});
|
||||
|
||||
switch (data.actionData.pass) {
|
||||
case 1:
|
||||
if (typeof successCallback === "function") {
|
||||
successCallback(data);
|
||||
} else {
|
||||
alert('extraction complete');
|
||||
}
|
||||
break;
|
||||
case -1:
|
||||
DUPX.startAjaxExtraction(false, successCallback);
|
||||
break;
|
||||
default:
|
||||
const result = {
|
||||
'success': false,
|
||||
'message': 'Unknow pass value :' + data.actionData.pass,
|
||||
'errorContent': {
|
||||
'pre': '',
|
||||
'html': '',
|
||||
'iframe': ''
|
||||
},
|
||||
'actionData': null
|
||||
};
|
||||
DUPX.ajaxErrorDisplayHideError(result, textStatus, jqXHR);
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
},
|
||||
function(result, textStatus, jqXHR) {
|
||||
let default_timeout_message = '';
|
||||
let status = "<b>Server Code:</b> " + jqXHR.status + "<br/>";
|
||||
|
||||
status += "<b>Status:</b> " + jqXHR.statusText + "<br/>";
|
||||
|
||||
if (textStatus && textStatus.toLowerCase() == "timeout" || textStatus.toLowerCase() == "service unavailable") {
|
||||
default_timeout_message = "<b>Recommendation:</b><br/>";
|
||||
default_timeout_message += "See <a target='_blank' href='" +
|
||||
"https://duplicator.com/knowledge-base/how-to-fix-installer-archive-extraction-issues'>";
|
||||
default_timeout_message += "this FAQ item</a> for possible resolutions.";
|
||||
default_timeout_message += "<hr>";
|
||||
default_timeout_message += "<b>Additional Resources...</b><br/>";
|
||||
default_timeout_message += "With thousands of different permutations it's difficult to try and debug/diagnose a server. " +
|
||||
"If you're running into timeout issues and need help we suggest you follow these steps:<br/><br/>";
|
||||
default_timeout_message += "<ol>";
|
||||
default_timeout_message += "<li><strong>Contact Host:</strong> Tell your host that you're running into PHP/Web " +
|
||||
"Server timeout issues and ask them if they have any recommendations</li>";
|
||||
default_timeout_message += "<li><strong>Dedicated Help:</strong> " +
|
||||
"If you're in a time-crunch we suggest that you contact " +
|
||||
"<a target='_blank' href='https://duplicator.com/knowledge-base/how-should-i-get-help-for-each-duplicator-product'>" +
|
||||
"professional server administrator</a>. A dedicated resource like this will be able to work with you around " +
|
||||
"the clock to the solve the issue much faster than we can in most cases.</li>";
|
||||
default_timeout_message += "<li><strong>Consider Upgrading:</strong> If you're on a budget host then you may run into constraints. " +
|
||||
"If you're running a larger or more complex site it might be worth upgrading to a " +
|
||||
"<a target='_blank' href='https://duplicator.com/knowledge-base/how-to-handle-server-timeout-issues'>" +
|
||||
"managed VPS server</a>. These systems will pretty much give you full control to use the software without constraints and " +
|
||||
"come with excellent support from the hosting company.</li>";
|
||||
default_timeout_message += "<li><strong>Contact SnapCreek:</strong> We will try our best to help configure and " +
|
||||
"point users in the right direction, however these types of issues can be time-consuming and " +
|
||||
"can take time from our support staff.</li>";
|
||||
default_timeout_message += "</ol>";
|
||||
|
||||
if (page) {
|
||||
switch (page) {
|
||||
default:
|
||||
status += default_timeout_message;
|
||||
break;
|
||||
case 'extract':
|
||||
status += "<b>Recommendation:</b><br/>";
|
||||
status += "See <a target='_blank' href='https://duplicator.com/knowledge-base/how-to-handle-various-install-scenarios'>" +
|
||||
"this FAQ item</a> for possible resolutions.<br/><br/>";
|
||||
break;
|
||||
case 'ping':
|
||||
status += "<b>Recommendation:</b><br/>";
|
||||
status += "See " +
|
||||
"<a target='_blank' href='https://duplicator.com/knowledge-base/how-to-read-fix-various-http-status-codes'>" +
|
||||
"this FAQ item</a> for possible resolutions.<br/><br/>";
|
||||
break;
|
||||
case 'delete-site':
|
||||
status += "<b>Recommendation:</b><br/>";
|
||||
status += "See " +
|
||||
"<a target='_blank' href='https://duplicator.com/knowledge-base/how-to-resolve-403-500-timeout-issues-on-step-3'>" +
|
||||
"this FAQ item</a> for possible resolutions.<br/><br/>";
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
status += default_timeout_message;
|
||||
}
|
||||
|
||||
} else if ((jqXHR.status == 403) || (jqXHR.status == 500)) {
|
||||
status += "<b>Recommendation:</b><br/>";
|
||||
status += "See " +
|
||||
"<a target='_blank' href='https://duplicator.com/knowledge-base/how-to-resolve-403-500-timeout-issues-on-step-3'>" +
|
||||
"this FAQ item</a> for possible resolutions.<br/><br/>"
|
||||
} else if ((jqXHR.status == 0) || (jqXHR.status == 200)) {
|
||||
status += "<b>Recommendation:</b><br/>";
|
||||
status += "Possible server timeout! Performing a 'Manual Extraction' can avoid timeouts. ";
|
||||
status += "See " +
|
||||
"<a target='_blank' href='https://duplicator.com/knowledge-base/how-to-handle-various-install-scenarios'>" +
|
||||
"this FAQ item</a> for a complete overview.<br/><br/>"
|
||||
}
|
||||
|
||||
result.errorContent.html += status;
|
||||
DUPX.ajaxErrorDisplayHideError(result, textStatus, jqXHR);
|
||||
}, {
|
||||
retryOnFailure: true,
|
||||
numberOfAttempts: 2,
|
||||
delayRetryOnFailure: 5000,
|
||||
callbackOnRetry: function(data, textStatus, jqXHR, options) {
|
||||
retryAttemp++;
|
||||
|
||||
DUPX.progress.update({
|
||||
'notice': 'Extraction failed: ' + data.message + ',<br>' +
|
||||
'wait ' + (options.delayRetryOnFailure / 1000) + ' seconds and retry.<br>' +
|
||||
'<b>' + DUPX.stringifyNumber(retryAttemp) + ' attempt</b>'
|
||||
});
|
||||
console.log('Callback on retry', data);
|
||||
}
|
||||
}
|
||||
);
|
||||
};
|
||||
</script>
|
||||
@@ -0,0 +1,113 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
*
|
||||
* @package templates/default
|
||||
*/
|
||||
|
||||
defined('ABSPATH') || defined('DUPXABSPATH') || exit;
|
||||
|
||||
use Duplicator\Libs\Snap\SnapJson;
|
||||
?>
|
||||
<script>
|
||||
DUPX.finalTests = {
|
||||
frontendTest: <?php echo json_encode(\Duplicator\Installer\Utils\Tests\WP\TestsExecuter::getFrontendUrl()); ?>,
|
||||
backendTest: <?php echo json_encode(\Duplicator\Installer\Utils\Tests\WP\TestsExecuter::getBackendUrl()); ?>,
|
||||
afterCallback: null,
|
||||
testsResults: {
|
||||
'wp_frontend': {
|
||||
'success': false
|
||||
},
|
||||
'wp_backend': {
|
||||
'success': false
|
||||
}
|
||||
},
|
||||
test: function (doneCallback) {
|
||||
this.doneCallback = doneCallback;
|
||||
DUPX.finalTests.prepareTest();
|
||||
},
|
||||
prepareTest: function () {
|
||||
DUPX.pageComponents.showProgress({
|
||||
'title': 'Final WordPress Tests',
|
||||
'bottomText':
|
||||
'<i>Keep this window open.</i><br/>' +
|
||||
'<i>This can take several minutes.</i>'
|
||||
});
|
||||
|
||||
let action = <?php echo SnapJson::jsonEncode(DUPX_Ctrl_ajax::ACTION_FINAL_TESTS_PREPARE); ?>;
|
||||
let token = <?php echo SnapJson::jsonEncode(DUPX_Ctrl_ajax::generateToken(DUPX_Ctrl_ajax::ACTION_FINAL_TESTS_PREPARE)); ?>;
|
||||
|
||||
DUPX.StandarJsonAjaxWrapper(
|
||||
action,
|
||||
token,
|
||||
{},
|
||||
function (data) {
|
||||
console.log(data);
|
||||
console.log('link frontend', DUPX.finalTests.frontendTest);
|
||||
console.log('link backend', DUPX.finalTests.backendTest);
|
||||
|
||||
DUPX.finalTests.executeTest(DUPX.finalTests.frontendTest, DUPX.finalTests.testsResults.wp_frontend, function () {
|
||||
DUPX.finalTests.executeTest(DUPX.finalTests.backendTest, DUPX.finalTests.testsResults.wp_backend, DUPX.finalTests.cleanTest);
|
||||
});
|
||||
},
|
||||
DUPX.ajaxErrorDisplayHideError,
|
||||
{
|
||||
timeOut: 10000
|
||||
}
|
||||
);
|
||||
},
|
||||
executeTest: function (urlTest, resultData, doneCallback) {
|
||||
jQuery.ajax({
|
||||
type: "GET",
|
||||
url: urlTest,
|
||||
dataType: "json",
|
||||
timeout: 10000,
|
||||
success: function (result, textStatus, jqXHR) {
|
||||
resultData.success = result;
|
||||
|
||||
if (typeof doneCallback === "function") {
|
||||
doneCallback(resultData);
|
||||
} else {
|
||||
alert('test complete');
|
||||
}
|
||||
},
|
||||
error: function (jqXHR, textStatus, errorThrown) {
|
||||
resultData.success = false;
|
||||
|
||||
if (typeof doneCallback === "function") {
|
||||
doneCallback(resultData);
|
||||
} else {
|
||||
alert('test complete');
|
||||
}
|
||||
}
|
||||
});
|
||||
},
|
||||
cleanTest: function () {
|
||||
console.log('tests results', DUPX.finalTests.testsResults);
|
||||
DUPX.pageComponents.showProgress({
|
||||
'title': 'Cleanup Tests',
|
||||
'bottomText':
|
||||
'<i>Keep this window open.</i><br/>' +
|
||||
'<i>This can take several minutes.</i>'
|
||||
});
|
||||
|
||||
let action = <?php echo SnapJson::jsonEncode(DUPX_Ctrl_ajax::ACTION_FINAL_TESTS_AFTER); ?>;
|
||||
let token = <?php echo SnapJson::jsonEncode(DUPX_Ctrl_ajax::generateToken(DUPX_Ctrl_ajax::ACTION_FINAL_TESTS_AFTER)); ?>;
|
||||
|
||||
DUPX.StandarJsonAjaxWrapper(
|
||||
action,
|
||||
token,
|
||||
{},
|
||||
function (data) {
|
||||
if (typeof DUPX.finalTests.doneCallback === "function") {
|
||||
DUPX.finalTests.doneCallback();
|
||||
}
|
||||
},
|
||||
DUPX.ajaxErrorDisplayHideError,
|
||||
{
|
||||
timeOut: 10000
|
||||
}
|
||||
);
|
||||
}
|
||||
};
|
||||
</script>
|
||||
@@ -0,0 +1,39 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
*
|
||||
* @package Duplicator/Installer
|
||||
*/
|
||||
|
||||
defined('ABSPATH') || defined('DUPXABSPATH') || exit;
|
||||
|
||||
use Duplicator\Installer\Core\Params\PrmMng;
|
||||
use Duplicator\Libs\Snap\SnapJson;
|
||||
|
||||
$paramsManager = PrmMng::getInstance();
|
||||
?>
|
||||
<script>
|
||||
const subsiteOwrMapWrapper = <?php echo SnapJson::jsonEncode($paramsManager->getFormWrapperId(PrmMng::PARAM_SUBSITE_OVERWRITE_MAPPING)); ?>;
|
||||
const subsiteOwrMapInputName = <?php echo SnapJson::jsonEncode(PrmMng::PARAM_SUBSITE_OVERWRITE_MAPPING); ?>;
|
||||
|
||||
const muReplaceMapWrapper = <?php echo SnapJson::jsonEncode($paramsManager->getFormWrapperId(PrmMng::PARAM_MU_REPLACE)); ?>;
|
||||
const muReplaceMapInputName = <?php echo SnapJson::jsonEncode(PrmMng::PARAM_MU_REPLACE); ?>;
|
||||
|
||||
(function($) {
|
||||
$(document).ready(function() {
|
||||
let owrWrapperNode = $('#' + subsiteOwrMapWrapper)
|
||||
if (owrWrapperNode.length) {
|
||||
DUPX.owrMapper = new UrlListMapping(owrWrapperNode, subsiteOwrMapInputName);
|
||||
} else {
|
||||
DUPX.owrMapper = null;
|
||||
}
|
||||
|
||||
let muReplaceMapNode = $('#' + muReplaceMapWrapper)
|
||||
if (muReplaceMapNode.length) {
|
||||
DUPX.muReplaceMap = new UrlListMapping(muReplaceMapNode, muReplaceMapInputName);
|
||||
} else {
|
||||
DUPX.muReplaceMap = null;
|
||||
}
|
||||
});
|
||||
})(jQuery);
|
||||
</script>
|
||||
@@ -0,0 +1,30 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
*
|
||||
* @package templates/default
|
||||
*/
|
||||
|
||||
defined('ABSPATH') || defined('DUPXABSPATH') || exit;
|
||||
|
||||
use Duplicator\Installer\Core\Params\PrmMng;
|
||||
use Duplicator\Libs\Snap\SnapJson;
|
||||
|
||||
$paramsManager = PrmMng::getInstance();
|
||||
?>
|
||||
<script>
|
||||
const createNewInputId = <?php echo SnapJson::jsonEncode($paramsManager->getFormItemId(PrmMng::PARAM_WP_ADMIN_CREATE_NEW)); ?>;
|
||||
$(document).ready(function () {
|
||||
let fieldsWrapper = $("#new-admin-fields-wrapper");
|
||||
$('#' + createNewInputId).change(function () {
|
||||
if ($(this).prop('checked')) {
|
||||
fieldsWrapper.find('.param-wrapper').removeClass('param-wrapper-disabled').addClass('param-wrapper-enabled');
|
||||
fieldsWrapper.find('.new-admin-field, .new-admin-field > input').prop('disabled', false);
|
||||
} else {
|
||||
fieldsWrapper.find('.param-wrapper').removeClass('param-wrapper-enabled').addClass('param-wrapper-disabled');
|
||||
fieldsWrapper.find('.new-admin-field, .new-admin-field > input').prop('disabled', true).val('').trigger('keyup').trigger('blur');
|
||||
}
|
||||
});
|
||||
});
|
||||
</script>
|
||||
|
||||
@@ -0,0 +1,36 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
*
|
||||
* @package templates/default
|
||||
*/
|
||||
|
||||
defined('ABSPATH') || defined('DUPXABSPATH') || exit;
|
||||
|
||||
use Duplicator\Installer\Core\Params\PrmMng;
|
||||
|
||||
$paramsManager = PrmMng::getInstance();
|
||||
?>
|
||||
<script>
|
||||
DUPX.multipleStepDeploy = function (formObj, nextStepPrams) {
|
||||
DUPX.sendParamsStep1(formObj, function () {
|
||||
DUPX.startAjaxExtraction(true, function (data) {
|
||||
DUPX.redirectMainInstaller('post', nextStepPrams);
|
||||
});
|
||||
});
|
||||
};
|
||||
|
||||
DUPX.oneStepDeploy = function (formObj, nextStepPrams) {
|
||||
DUPX.sendParamsStep1(formObj, function () {
|
||||
DUPX.startAjaxExtraction(true, function () {
|
||||
DUPX.startAjaxDbInstall(true, function () {
|
||||
DUPX.siteProcessingReplaceData(true, function () {
|
||||
DUPX.finalTests.test(function () {
|
||||
DUPX.redirectMainInstaller('post', nextStepPrams);
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
};
|
||||
</script>
|
||||
@@ -0,0 +1,44 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
*
|
||||
* @package templates/default
|
||||
*/
|
||||
|
||||
defined('ABSPATH') || defined('DUPXABSPATH') || exit;
|
||||
?>
|
||||
<script>
|
||||
DUPX.pageComponents = {
|
||||
pageContent: null,
|
||||
init: function () {
|
||||
this.pageContent = $('#main-content-wrapper');
|
||||
},
|
||||
resetTopMessages: function () {
|
||||
DUPX.topMessages.empty();
|
||||
return this;
|
||||
},
|
||||
showProgress: function (options) {
|
||||
this.pageContent.hide();
|
||||
DUPX.ajaxError.hide();
|
||||
DUPX.progress.show(options);
|
||||
return this;
|
||||
},
|
||||
showError: function (result, textStatus, jqXHR, tryAgainButtonCallback) {
|
||||
DUPX.ajaxError.update(result, textStatus, jqXHR, tryAgainButtonCallback);
|
||||
DUPX.progress.hide();
|
||||
this.pageContent.hide();
|
||||
DUPX.ajaxError.show();
|
||||
return this;
|
||||
},
|
||||
showContent: function () {
|
||||
DUPX.progress.hide();
|
||||
DUPX.ajaxError.hide();
|
||||
this.pageContent.show();
|
||||
return this;
|
||||
}
|
||||
};
|
||||
|
||||
$(document).ready(function () {
|
||||
DUPX.pageComponents.init();
|
||||
});
|
||||
</script>
|
||||
@@ -0,0 +1,396 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
*
|
||||
* @package templates/default
|
||||
*/
|
||||
|
||||
defined('ABSPATH') || defined('DUPXABSPATH') || exit;
|
||||
|
||||
use Duplicator\Installer\Core\InstState;
|
||||
use Duplicator\Installer\Core\Params\PrmMng;
|
||||
use Duplicator\Installer\Core\Params\Items\ParamFormTables;
|
||||
use Duplicator\Libs\Snap\SnapJson;
|
||||
|
||||
$paramsManager = PrmMng::getInstance();
|
||||
?>
|
||||
<script>
|
||||
const wpUserNameInputId = <?php echo SnapJson::jsonEncode($paramsManager->getFormItemId(PrmMng::PARAM_WP_ADMIN_NAME)); ?>;
|
||||
const wpPwdInputId = <?php echo SnapJson::jsonEncode($paramsManager->getFormItemId(PrmMng::PARAM_WP_ADMIN_PASSWORD)); ?>;
|
||||
const wpMailInputId = <?php echo SnapJson::jsonEncode($paramsManager->getFormItemId(PrmMng::PARAM_WP_ADMIN_MAIL)); ?>;
|
||||
const archiveEngineActionWraper = <?php echo SnapJson::jsonEncode($paramsManager->getFormWrapperId(PrmMng::PARAM_ARCHIVE_ACTION)); ?>;
|
||||
const extractSkipModeWrapper = <?php echo SnapJson::jsonEncode($paramsManager->getFormWrapperId(PrmMng::PARAM_ARCHIVE_ENGINE_SKIP_WP_FILES)); ?>;
|
||||
|
||||
const autoCleanInputId = <?php echo SnapJson::jsonEncode($paramsManager->getFormItemId(PrmMng::PARAM_AUTO_CLEAN_INSTALLER_FILES)); ?>;
|
||||
const tablesItemClass = <?php echo SnapJson::jsonEncode(
|
||||
($paramsManager->getFormItemId(PrmMng::PARAM_DB_TABLES) . ParamFormTables::TABLE_ITEM_POSTFIX)
|
||||
); ?>;
|
||||
const tablesNameClass = <?php echo SnapJson::jsonEncode(
|
||||
($paramsManager->getFormItemId(PrmMng::PARAM_DB_TABLES) . ParamFormTables::TABLE_NAME_POSTFIX_TNAME)
|
||||
); ?>;
|
||||
const tablesNameInputName = <?php echo SnapJson::jsonEncode(PrmMng::PARAM_DB_TABLES); ?>;
|
||||
const tablesExtractClass = <?php echo SnapJson::jsonEncode(
|
||||
($paramsManager->getFormItemId(PrmMng::PARAM_DB_TABLES) . ParamFormTables::TABLE_NAME_POSTFIX_EXTRACT)
|
||||
); ?>;
|
||||
const tablesExtractInputName = <?php echo SnapJson::jsonEncode(PrmMng::PARAM_DB_TABLES . ParamFormTables::TABLE_NAME_POSTFIX_EXTRACT); ?>;
|
||||
const tablesReplaceClass = <?php echo SnapJson::jsonEncode(
|
||||
($paramsManager->getFormItemId(PrmMng::PARAM_DB_TABLES) . ParamFormTables::TABLE_NAME_POSTFIX_REPLACE)
|
||||
); ?>;
|
||||
const tablesReplaceInputName = <?php echo SnapJson::jsonEncode(PrmMng::PARAM_DB_TABLES . ParamFormTables::TABLE_NAME_POSTFIX_REPLACE); ?>;
|
||||
|
||||
const installTypeInputWrapper = <?php echo SnapJson::jsonEncode($paramsManager->getFormWrapperId(PrmMng::PARAM_INST_TYPE)); ?>;
|
||||
const subsiteIdInputId = <?php echo SnapJson::jsonEncode($paramsManager->getFormItemId(PrmMng::PARAM_SUBSITE_ID)); ?>;
|
||||
const subsiteIdWrapper = <?php echo SnapJson::jsonEncode($paramsManager->getFormWrapperId(PrmMng::PARAM_SUBSITE_ID)); ?>;
|
||||
const userModeWrapper = <?php echo SnapJson::jsonEncode($paramsManager->getFormWrapperId(PrmMng::PARAM_USERS_MODE)); ?>;
|
||||
const tablePrefixWrapper = <?php echo SnapJson::jsonEncode($paramsManager->getFormWrapperId(PrmMng::PARAM_DB_TABLE_PREFIX)); ?>;
|
||||
const tablePrefixInputId = <?php echo SnapJson::jsonEncode($paramsManager->getFormItemId(PrmMng::PARAM_DB_TABLE_PREFIX)); ?>;
|
||||
|
||||
DUPX.setTablesFormData = function(formData) {
|
||||
let tablesList = [];
|
||||
|
||||
$('.' + tablesItemClass).each(function() {
|
||||
let newObj = {
|
||||
'name' : $(this).find('.' + tablesNameClass).val(),
|
||||
'extract' : $(this).find('.' + tablesExtractClass).is(':checked'),
|
||||
'replace' : $(this).find('.' + tablesReplaceClass).is(':checked')
|
||||
};
|
||||
|
||||
tablesList.push(newObj);
|
||||
});
|
||||
|
||||
delete formData[tablesExtractInputName];
|
||||
delete formData[tablesReplaceInputName];
|
||||
formData[tablesNameInputName] = JSON.stringify(tablesList);
|
||||
return formData;
|
||||
};
|
||||
|
||||
DUPX.sendParamsStep1 = function(form, setParamOkCallback) {
|
||||
DUPX.pageComponents.resetTopMessages().showProgress({
|
||||
'title': 'Parameters update',
|
||||
'bottomText': '<i>Keep this window open.</i><br/>' +
|
||||
'<i>This can take several minutes.</i>'
|
||||
});
|
||||
let setParamAction = <?php echo SnapJson::jsonEncode(DUPX_Ctrl_ajax::ACTION_SET_PARAMS_S1); ?>;
|
||||
let setParamToken = <?php echo SnapJson::jsonEncode(DUPX_Ctrl_ajax::generateToken(DUPX_Ctrl_ajax::ACTION_SET_PARAMS_S1)); ?>;
|
||||
|
||||
var formData = form.serializeJSON();
|
||||
if (DUPX.owrMapper !== null) {
|
||||
formData = DUPX.owrMapper.updateFormData(formData);
|
||||
}
|
||||
if (DUPX.muReplaceMap !== null) {
|
||||
formData = DUPX.muReplaceMap.updateFormData(formData);
|
||||
}
|
||||
|
||||
DUPX.StandarJsonAjaxWrapper(
|
||||
setParamAction,
|
||||
setParamToken,
|
||||
formData,
|
||||
function(data) {
|
||||
if (data.actionData.isValid) {
|
||||
if (typeof setParamOkCallback === "function") {
|
||||
setParamOkCallback();
|
||||
}
|
||||
} else {
|
||||
DUPX.pageComponents.showContent();
|
||||
DUPX.topMessages.add(data.actionData.nextStepMessagesHtml);
|
||||
}
|
||||
|
||||
return true;
|
||||
},
|
||||
DUPX.ajaxErrorDisplayHideError
|
||||
);
|
||||
};
|
||||
|
||||
DUPX.sendParamsStep2 = function(form, setParamOkCallback) {
|
||||
DUPX.pageComponents.resetTopMessages().showProgress({
|
||||
'title': 'Parameters update',
|
||||
'bottomText': '<i>Keep this window open.</i><br/>' +
|
||||
'<i>This can take several minutes.</i>'
|
||||
});
|
||||
let setParamAction = <?php echo SnapJson::jsonEncode(DUPX_Ctrl_ajax::ACTION_SET_PARAMS_S2); ?>;
|
||||
let setParamToken = <?php echo SnapJson::jsonEncode(DUPX_Ctrl_ajax::generateToken(DUPX_Ctrl_ajax::ACTION_SET_PARAMS_S2)); ?>;
|
||||
|
||||
var formData = form.serializeJSON();
|
||||
|
||||
formData = DUPX.setTablesFormData(formData);
|
||||
|
||||
DUPX.StandarJsonAjaxWrapper(
|
||||
setParamAction,
|
||||
setParamToken,
|
||||
formData,
|
||||
function(data) {
|
||||
if (data.actionData.isValid) {
|
||||
if (typeof setParamOkCallback === "function") {
|
||||
setParamOkCallback();
|
||||
}
|
||||
} else {
|
||||
DUPX.pageComponents.showContent();
|
||||
DUPX.topMessages.add(data.actionData.nextStepMessagesHtml);
|
||||
}
|
||||
|
||||
return true;
|
||||
},
|
||||
DUPX.ajaxErrorDisplayHideError
|
||||
);
|
||||
};
|
||||
|
||||
DUPX.sendParamsStep3 = function(form, setParamOkCallback) {
|
||||
let setParamAction = <?php echo SnapJson::jsonEncode(DUPX_Ctrl_ajax::ACTION_SET_PARAMS_S3); ?>;
|
||||
let setParamToken = <?php echo SnapJson::jsonEncode(DUPX_Ctrl_ajax::generateToken(DUPX_Ctrl_ajax::ACTION_SET_PARAMS_S3)); ?>;
|
||||
|
||||
//Validation
|
||||
var wp_username = $.trim($("#" + wpUserNameInputId).val()).length || 0;
|
||||
var wp_password = $.trim($("#" + wpPwdInputId).val()).length || 0;
|
||||
var wp_mail = $.trim($("#" + wpMailInputId).val()).length || 0;
|
||||
|
||||
if (wp_username >= 1) {
|
||||
if (wp_username < 4) {
|
||||
alert("The New Admin Account 'Username' must be four or more characters");
|
||||
return false;
|
||||
} else if (wp_password < 6) {
|
||||
alert("The New Admin Account 'Password' must be six or more characters");
|
||||
return false;
|
||||
} else if (wp_mail === 0) {
|
||||
alert("The New Admin Account 'mail' is required");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
var nonHttp = false;
|
||||
var failureText = '';
|
||||
|
||||
/* IMPORTANT - not trimming the value for good - just in the check */
|
||||
$('input[name="search[]"]').each(function() {
|
||||
var val = $(this).val();
|
||||
if (val.trim() != "") {
|
||||
if (val.length < 3) {
|
||||
failureText = "Custom search fields must be at least three characters.";
|
||||
}
|
||||
if (val.toLowerCase().indexOf('http') != 0) {
|
||||
nonHttp = true;
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
$('input[name="replace[]"]').each(function() {
|
||||
var val = $(this).val();
|
||||
if (val.trim() != "") {
|
||||
// Replace fields can be anything
|
||||
if (val.toLowerCase().indexOf('http') != 0) {
|
||||
nonHttp = true;
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
if (failureText != '') {
|
||||
alert(failureText);
|
||||
return false;
|
||||
}
|
||||
|
||||
if (nonHttp) {
|
||||
if (confirm('One or more custom search and replace strings are not URLs. Are you sure you want to continue?') == false) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
if ($('input[type=radio][name=replace_mode]:checked').val() == 'mapping') {
|
||||
$("#new-url-container").remove();
|
||||
} else if ($('input[type=radio][name=replace_mode]:checked').val() == 'legacy') {
|
||||
$("#subsite-map-container").remove();
|
||||
}
|
||||
|
||||
DUPX.pageComponents.resetTopMessages().showProgress({
|
||||
'title': 'Parameters update',
|
||||
'bottomText': '<i>Keep this window open.</i><br/>' +
|
||||
'<i>This can take several minutes.</i>'
|
||||
});
|
||||
|
||||
var formData = form.serializeJSON();
|
||||
|
||||
DUPX.StandarJsonAjaxWrapper(
|
||||
setParamAction,
|
||||
setParamToken,
|
||||
formData,
|
||||
function(data) {
|
||||
if (data.actionData.isValid) {
|
||||
if (typeof setParamOkCallback === "function") {
|
||||
setParamOkCallback();
|
||||
}
|
||||
} else {
|
||||
DUPX.pageComponents.showContent();
|
||||
DUPX.topMessages.add(data.actionData.nextStepMessagesHtml);
|
||||
}
|
||||
|
||||
return true;
|
||||
},
|
||||
DUPX.ajaxErrorDisplayHideError
|
||||
);
|
||||
};
|
||||
|
||||
DUPX.setAutoCleanFiles = function() {
|
||||
DUPX.pageComponents.resetTopMessages().showProgress({
|
||||
'title': 'Send migration data',
|
||||
'bottomText': '<i>Keep this window open.</i>'
|
||||
});
|
||||
let setParamAction = <?php echo SnapJson::jsonEncode(DUPX_Ctrl_ajax::ACTION_SET_AUTO_CLEAN_FILES); ?>;
|
||||
let setParamToken = <?php echo SnapJson::jsonEncode(DUPX_Ctrl_ajax::generateToken(DUPX_Ctrl_ajax::ACTION_SET_AUTO_CLEAN_FILES)); ?>;
|
||||
|
||||
var formData = {
|
||||
<?php echo SnapJson::jsonEncode(PrmMng::PARAM_AUTO_CLEAN_INSTALLER_FILES); ?>: $('#' + autoCleanInputId).prop('checked')
|
||||
};
|
||||
|
||||
DUPX.StandarJsonAjaxWrapper(
|
||||
setParamAction,
|
||||
setParamToken,
|
||||
formData,
|
||||
function(data) {
|
||||
DUPX.pageComponents.showContent();
|
||||
if (!data.actionData.isValid) {
|
||||
DUPX.topMessages.add(data.actionData.nextStepMessagesHtml);
|
||||
}
|
||||
return true;
|
||||
},
|
||||
function(result, textStatus, jqXHR) {
|
||||
if (jqXHR.status === 404) {
|
||||
// ON 404 installer files are already removed on first login
|
||||
DUPX.pageComponents.showContent();
|
||||
} else {
|
||||
DUPX.ajaxErrorDisplayHideError(result, textStatus, jqXHR);
|
||||
}
|
||||
}
|
||||
);
|
||||
};
|
||||
|
||||
$(document).ready(function() {
|
||||
// prepare per animation
|
||||
if ($('#overwrite-subsite-on-multisite-wrapper').hasClass('no-display')) {
|
||||
$('#overwrite-subsite-on-multisite-wrapper').removeClass('no-display').hide();
|
||||
}
|
||||
if ($('#url-multisite-mapping-wrapper').hasClass('no-display')) {
|
||||
$('#url-multisite-mapping-wrapper').removeClass('no-display').hide();
|
||||
}
|
||||
|
||||
$('.select-all-import').click(function () {
|
||||
let node = $(this);
|
||||
let tbody = $('#plugins_list_table_selector').find('tbody');
|
||||
|
||||
tbody.find('.' + tablesExtractClass).prop('checked',node.is(':checked'));
|
||||
|
||||
$(this).closest('thead').find('.select-all-replace')
|
||||
.prop('checked', !node.is(':checked')).trigger('click')
|
||||
.prop('disabled', !node.is(':checked'));
|
||||
|
||||
tbody.find('.' + tablesReplaceClass).prop('disabled', !node.is(':checked'));
|
||||
});
|
||||
|
||||
$('.select-all-replace').click(function () {
|
||||
let node = $(this);
|
||||
let tbody = $('#plugins_list_table_selector').find('tbody');
|
||||
|
||||
tbody.find('.' + tablesReplaceClass).prop('checked',node.is(':checked'));
|
||||
});
|
||||
|
||||
$('#' + installTypeInputWrapper + ' input[type=radio]').change(function() {
|
||||
let selectedVal = $(this).val();
|
||||
switch (parseInt(selectedVal)) {
|
||||
case <?php echo InstState::TYPE_SINGLE; ?>:
|
||||
$('#' + subsiteIdInputId).prop('disabled', true);
|
||||
$('#' + subsiteIdWrapper).removeClass('param-wrapper-enabled').addClass('param-wrapper-disabled');
|
||||
$('#' + tablePrefixInputId).prop('disabled', false);
|
||||
$('#' + tablePrefixWrapper).removeClass('param-wrapper-disabled');
|
||||
$('#overwrite-subsite-on-multisite-wrapper').hide();
|
||||
$('#url-multisite-mapping-wrapper').hide();
|
||||
break;
|
||||
case <?php echo InstState::TYPE_MSUBDOMAIN; ?>:
|
||||
case <?php echo InstState::TYPE_MSUBFOLDER; ?>:
|
||||
$('#' + subsiteIdInputId).prop('disabled', true);
|
||||
$('#' + subsiteIdWrapper).removeClass('param-wrapper-enabled').addClass('param-wrapper-disabled');
|
||||
$('#' + tablePrefixInputId).prop('disabled', false);
|
||||
$('#' + tablePrefixWrapper).removeClass('param-wrapper-disabled');
|
||||
$('#overwrite-subsite-on-multisite-wrapper').hide();
|
||||
$('#url-multisite-mapping-wrapper').show();
|
||||
break;
|
||||
case <?php echo InstState::TYPE_RBACKUP_SINGLE; ?>:
|
||||
case <?php echo InstState::TYPE_RBACKUP_MSUBDOMAIN; ?>:
|
||||
case <?php echo InstState::TYPE_RBACKUP_MSUBFOLDER; ?>:
|
||||
case <?php echo InstState::TYPE_RECOVERY_SINGLE; ?>:
|
||||
case <?php echo InstState::TYPE_RECOVERY_MSUBDOMAIN; ?>:
|
||||
case <?php echo InstState::TYPE_RECOVERY_MSUBFOLDER; ?>:
|
||||
$('#' + subsiteIdInputId).prop('disabled', true);
|
||||
$('#' + subsiteIdWrapper).removeClass('param-wrapper-enabled').addClass('param-wrapper-disabled');
|
||||
$('#' + tablePrefixInputId).prop('disabled', true);
|
||||
$('#' + tablePrefixWrapper).removeClass('param-wrapper-enabled').addClass('param-wrapper-disabled');
|
||||
$('#overwrite-subsite-on-multisite-wrapper').hide();
|
||||
$('#url-multisite-mapping-wrapper').hide();
|
||||
break;
|
||||
case <?php echo InstState::TYPE_STANDALONE; ?>:
|
||||
$('#' + subsiteIdInputId).prop('disabled', false);
|
||||
$('#' + subsiteIdWrapper).removeClass('param-wrapper-disabled').addClass('param-wrapper-enabled');
|
||||
$('#' + tablePrefixInputId).prop('disabled', false);
|
||||
$('#' + tablePrefixWrapper).removeClass('param-wrapper-disabled');
|
||||
$('#overwrite-subsite-on-multisite-wrapper').hide();
|
||||
$('#url-multisite-mapping-wrapper').hide();
|
||||
break;
|
||||
case <?php echo InstState::TYPE_SINGLE_ON_SUBDOMAIN; ?>:
|
||||
case <?php echo InstState::TYPE_SINGLE_ON_SUBFOLDER; ?>:
|
||||
case <?php echo InstState::TYPE_SUBSITE_ON_SUBDOMAIN; ?>:
|
||||
case <?php echo InstState::TYPE_SUBSITE_ON_SUBFOLDER; ?>:
|
||||
$('#' + subsiteIdInputId).prop('disabled', true);
|
||||
$('#' + subsiteIdWrapper).removeClass('param-wrapper-enabled').addClass('param-wrapper-disabled');
|
||||
$('#' + tablePrefixInputId).prop('disabled', true);
|
||||
$('#' + tablePrefixWrapper).addClass('param-wrapper-disabled');
|
||||
$('#overwrite-subsite-on-multisite-wrapper').fadeIn("slow");
|
||||
$('#url-multisite-mapping-wrapper').hide();
|
||||
break;
|
||||
case <?php echo InstState::TYPE_NOT_SET; ?>:
|
||||
default:
|
||||
alert('installer state not valid ' + this.value);
|
||||
}
|
||||
|
||||
$('#overview-description-wrapper .overview-description').removeClass('no-display').hide();
|
||||
$('#overview-description-wrapper .install-type-' + selectedVal).fadeIn("slow");
|
||||
|
||||
});
|
||||
|
||||
$('.param-form-type-tablessel .' + tablesExtractClass).each(function() {
|
||||
let extractInput = $(this);
|
||||
let replaceInput = extractInput.closest('.' + tablesItemClass).find('.' + tablesReplaceClass);
|
||||
|
||||
extractInput.change(function() {
|
||||
if (extractInput.is(':checked')) {
|
||||
replaceInput.prop('disabled', false);
|
||||
replaceInput.prop('checked', true);
|
||||
} else {
|
||||
replaceInput.prop('disabled', true);
|
||||
replaceInput.prop('checked', false);
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
$('.param-form-type-bgroup').each(function() {
|
||||
let wrapperObj = $(this);
|
||||
let buttons = wrapperObj.find('button');
|
||||
let inputObj = wrapperObj.find('input[type="hidden"]');
|
||||
buttons.click(function() {
|
||||
buttons.removeClass('active');
|
||||
$(this).addClass('active');
|
||||
inputObj.val($(this).val()).trigger('change');
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
$('#' + archiveEngineActionWraper + ', #' + extractSkipModeWrapper).each(function() {
|
||||
let paramWrapper = $(this);
|
||||
let noteWrapper = paramWrapper.find('.sub-note');
|
||||
|
||||
paramWrapper.find('.input-item').change(function() {
|
||||
noteWrapper.find('.dynamic-sub-note').addClass('no-display');
|
||||
noteWrapper.find('.dynamic-sub-note-' + $(this).val()).removeClass('no-display');
|
||||
});
|
||||
});
|
||||
|
||||
$('#' + autoCleanInputId).change(function() {
|
||||
DUPX.setAutoCleanFiles();
|
||||
});
|
||||
});
|
||||
</script>
|
||||
@@ -0,0 +1,109 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
*
|
||||
* @package templates/default
|
||||
*/
|
||||
|
||||
defined('ABSPATH') || defined('DUPXABSPATH') || exit;
|
||||
?>
|
||||
<script>
|
||||
DUPX.progress = {
|
||||
progressObj: null,
|
||||
data: {},
|
||||
init: function () {
|
||||
if (this.progressObj === null) {
|
||||
this.progressObj = $('#progress-area');
|
||||
}
|
||||
},
|
||||
hide: function () {
|
||||
this.init();
|
||||
this.progressObj.addClass('no-display');
|
||||
},
|
||||
show: function (options) {
|
||||
$("html, body").animate({scrollTop: 0}, "slow");
|
||||
|
||||
this.init();
|
||||
options = (typeof options !== 'undefined') ? options : {}
|
||||
this.data = $.extend(true, {}, this.defaults, options);
|
||||
|
||||
this.update(this.data);
|
||||
|
||||
this.progressObj.removeClass('no-display');
|
||||
},
|
||||
update: function (options) {
|
||||
this.init();
|
||||
options = (typeof options !== 'undefined') ? options : {};
|
||||
|
||||
if ('title' in options) {
|
||||
if (options.title.length) {
|
||||
this.progressObj.find('#progress-title').text(options.title);
|
||||
} else {
|
||||
this.progressObj.find('#progress-title').empty();
|
||||
}
|
||||
}
|
||||
|
||||
if ('perc' in options) {
|
||||
if (options.perc.length) {
|
||||
this.progressObj.find('#progress-pct').text(options.perc);
|
||||
} else {
|
||||
this.progressObj.find('#progress-pct').empty();
|
||||
}
|
||||
}
|
||||
|
||||
if ('secondary' in options) {
|
||||
if (options.secondary.length) {
|
||||
this.progressObj.find('#secondary-progress-text').text(options.secondary);
|
||||
} else {
|
||||
this.progressObj.find('#secondary-progress-text').empty();
|
||||
}
|
||||
}
|
||||
|
||||
if ('notice' in options) {
|
||||
if (options.notice.length) {
|
||||
this.progressObj.find('#progress-notice').html(options.notice);
|
||||
} else {
|
||||
this.progressObj.find('#progress-notice').empty();
|
||||
}
|
||||
}
|
||||
|
||||
if ('progressBar' in options) {
|
||||
if (options.progressBar) {
|
||||
this.animateProgressBar()
|
||||
} else {
|
||||
this.progressObj.find("#progress-bar").empty();
|
||||
}
|
||||
// add or remove bar
|
||||
}
|
||||
|
||||
if ('bottomText' in options) {
|
||||
this.progressObj.find('#progress-bottom-text').empty().html(options.bottomText);
|
||||
}
|
||||
|
||||
this.data = $.extend(true, {}, this.defaults, options);
|
||||
},
|
||||
animateProgressBar: function () {
|
||||
//Create Progress Bar
|
||||
var $mainbar = this.progressObj.find("#progress-bar");
|
||||
$mainbar.progressbar({value: 100});
|
||||
$mainbar.height(25);
|
||||
runAnimation($mainbar);
|
||||
|
||||
function runAnimation($pb) {
|
||||
$pb.css({"padding-left": "0%", "padding-right": "90%"});
|
||||
$pb.progressbar("option", "value", 100);
|
||||
$pb.animate({paddingLeft: "90%", paddingRight: "0%"}, 3500, "linear", function () {
|
||||
runAnimation($pb);
|
||||
});
|
||||
}
|
||||
},
|
||||
defaults: {
|
||||
'title': 'Wait',
|
||||
'perc': '',
|
||||
'secondary': '',
|
||||
'notice': '',
|
||||
'progressBar': false,
|
||||
'bottomText': ''
|
||||
}
|
||||
};
|
||||
</script>
|
||||
@@ -0,0 +1,98 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
*
|
||||
* @package templates/default
|
||||
*/
|
||||
|
||||
defined('ABSPATH') || defined('DUPXABSPATH') || exit;
|
||||
|
||||
use Duplicator\Installer\Core\Params\PrmMng;
|
||||
use Duplicator\Libs\Snap\SnapJson;
|
||||
|
||||
$paramsManager = PrmMng::getInstance();
|
||||
?>
|
||||
<script>
|
||||
var siteProcessingReplaceLastChunkPos = 0;
|
||||
|
||||
DUPX.siteProcessingReplaceData = function (isTheFirstCall, successCallback) {
|
||||
if (isTheFirstCall) {
|
||||
|
||||
DUPX.pageComponents.resetTopMessages().showProgress({
|
||||
'title': 'Processing Data Replacement',
|
||||
'perc': '0%',
|
||||
'secondary': '',
|
||||
'bottomText':
|
||||
'<i>Keep this window open during the replacement process.</i><br/>' +
|
||||
'<i>This can take several minutes.</i>'
|
||||
});
|
||||
}
|
||||
|
||||
let action = <?php echo SnapJson::jsonEncode(DUPX_Ctrl_ajax::ACTION_WEBSITE_UPDATE); ?>;
|
||||
let token = <?php echo SnapJson::jsonEncode(DUPX_Ctrl_ajax::generateToken(DUPX_Ctrl_ajax::ACTION_WEBSITE_UPDATE)); ?>;
|
||||
|
||||
let retryAttemp = 0;
|
||||
|
||||
DUPX.StandarJsonAjaxWrapper(
|
||||
action,
|
||||
token,
|
||||
{},
|
||||
function (data, textStatus, jqXHR) {
|
||||
DUPX.progress.update({
|
||||
'perc': data.actionData.step3.progress_perc + '%',
|
||||
'secondary': ''
|
||||
});
|
||||
|
||||
if (data.actionData.step3.chunk == 1) {
|
||||
if (JSON.stringify(siteProcessingReplaceLastChunkPos) !== JSON.stringify(data.actionData.step3.chunkPos)) {
|
||||
var siteProcessingReplaceLastChunkPos = data.actionData.step3.chunkPos;
|
||||
DUPX.siteProcessingReplaceData(false, successCallback);
|
||||
} else {
|
||||
console.error('Chunk is stuck: ' + data.actionData);
|
||||
let status = "<b>Server Code:</b> " + jqXHR.status + "<br/>";
|
||||
status += "<b>Status:</b> " + jqXHR.statusText + "<br/>";
|
||||
status += "<b>Response:</b> " + jqXHR.responseText + "<hr/>";
|
||||
status += "Chunking is stuck<br>";
|
||||
|
||||
const result = {
|
||||
'success': false,
|
||||
'message': 'DB INSTALL ERROR: ' + data.actionData.error_msg,
|
||||
'errorContent': {
|
||||
'pre': '',
|
||||
'html': status,
|
||||
'iframe': ''
|
||||
},
|
||||
'actionData': null
|
||||
};
|
||||
DUPX.ajaxErrorDisplayHideError(result, null, null);
|
||||
return false;
|
||||
}
|
||||
} else if (data.actionData.step3.pass == 1) {
|
||||
if (typeof successCallback === "function") {
|
||||
successCallback(data.actionData);
|
||||
} else {
|
||||
alert('Processing complete');
|
||||
}
|
||||
} else {
|
||||
DUPX.hideProgressBar();
|
||||
}
|
||||
},
|
||||
DUPX.ajaxErrorDisplayHideError,
|
||||
{
|
||||
retryOnFailure: true,
|
||||
numberOfAttempts: 2,
|
||||
delayRetryOnFailure: 5000,
|
||||
callbackOnRetry: function (data, textStatus, jqXHR, options) {
|
||||
retryAttemp++;
|
||||
|
||||
DUPX.progress.update({
|
||||
'notice': 'failed processing data replacement: ' + data.message + ',<br>' +
|
||||
'wait ' + (options.delayRetryOnFailure / 1000) + ' seconds and retry.<br>' +
|
||||
'<b>' + DUPX.stringifyNumber(retryAttemp) + ' attempt</b>'
|
||||
});
|
||||
console.log('Callback on retry', data);
|
||||
}
|
||||
}
|
||||
);
|
||||
};
|
||||
</script>
|
||||
@@ -0,0 +1,59 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
*
|
||||
* @package templates/default
|
||||
*/
|
||||
|
||||
defined('ABSPATH') || defined('DUPXABSPATH') || exit;
|
||||
|
||||
use Duplicator\Installer\Core\Params\PrmMng;
|
||||
use Duplicator\Libs\Snap\SnapJson;
|
||||
|
||||
$paramsManager = PrmMng::getInstance();
|
||||
?>
|
||||
<script>
|
||||
const validateAction = <?php echo SnapJson::jsonEncode(DUPX_Ctrl_ajax::ACTION_VALIDATE); ?>;
|
||||
const validateToken = <?php echo SnapJson::jsonEncode(DUPX_Ctrl_ajax::generateToken(DUPX_Ctrl_ajax::ACTION_VALIDATE)); ?>;
|
||||
|
||||
DUPX.initialValidateAction = function (validateCallback, showContentOnResult, resetTopMessage) {
|
||||
if (resetTopMessage) {
|
||||
DUPX.pageComponents.resetTopMessages();
|
||||
}
|
||||
DUPX.pageComponents.showProgress({
|
||||
'title': 'System validation',
|
||||
'bottomText':
|
||||
'<i>Keep this window open during the validation process.</i><br/>' +
|
||||
'<i>This can take several minutes.</i>'
|
||||
});
|
||||
|
||||
DUPX.StandarJsonAjaxWrapper(
|
||||
validateAction,
|
||||
validateToken,
|
||||
{},
|
||||
function (data) {
|
||||
if (showContentOnResult) {
|
||||
DUPX.pageComponents.showContent();
|
||||
DUPX.topMessages.add(data.actionData.nextStepMessagesHtml);
|
||||
}
|
||||
if (typeof validateCallback === "function") {
|
||||
validateCallback(data.actionData);
|
||||
} else {
|
||||
alert('Validate ' + data.actionData.mainText);
|
||||
}
|
||||
},
|
||||
DUPX.ajaxErrorDisplayRestart
|
||||
);
|
||||
};
|
||||
|
||||
DUPX.setValidationBadge = function (selector, newClass) {
|
||||
let item = $(selector);
|
||||
if (!item.length) {
|
||||
return;
|
||||
}
|
||||
item.removeClass('wait fail warn hwarn good pass success');
|
||||
if (newClass) {
|
||||
item.addClass(newClass);
|
||||
}
|
||||
};
|
||||
</script>
|
||||
@@ -0,0 +1,24 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
*
|
||||
* @package templates/default
|
||||
*/
|
||||
|
||||
defined('ABSPATH') || defined('DUPXABSPATH') || exit;
|
||||
?>
|
||||
<script>
|
||||
DUPX.topMessages = {
|
||||
wrapper: null,
|
||||
empty: function () {
|
||||
this.wrapper.empty();
|
||||
},
|
||||
add: function (html) {
|
||||
this.wrapper.html(html);
|
||||
}
|
||||
};
|
||||
|
||||
$(document).ready(function () {
|
||||
DUPX.topMessages.wrapper = $('#page-top-messages');
|
||||
});
|
||||
</script>
|
||||
@@ -0,0 +1,57 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
*
|
||||
* @package templates/default
|
||||
*/
|
||||
|
||||
defined('ABSPATH') || defined('DUPXABSPATH') || exit;
|
||||
|
||||
use Duplicator\Installer\Core\Security;
|
||||
use Duplicator\Installer\Core\Params\PrmMng;
|
||||
use Duplicator\Installer\Utils\SecureCsrf;
|
||||
use Duplicator\Libs\Snap\SnapJson;
|
||||
|
||||
$nextStepPrams = [
|
||||
PrmMng::PARAM_CTRL_ACTION => 'ctrl-step1',
|
||||
Security::CTRL_TOKEN => SecureCsrf::generate('ctrl-step1'),
|
||||
PrmMng::PARAM_STEP_ACTION => DUPX_CTRL::ACTION_STEP_INIZIALIZED,
|
||||
];
|
||||
?>
|
||||
<script>
|
||||
$(document).ready(function () {
|
||||
const secureAction = <?php echo SnapJson::jsonEncode(DUPX_Ctrl_ajax::ACTION_PWD_CHECK); ?>;
|
||||
const secureToken = <?php echo SnapJson::jsonEncode(DUPX_Ctrl_ajax::generateToken(DUPX_Ctrl_ajax::ACTION_PWD_CHECK)); ?>;
|
||||
const passForm = $('#i1-pass-form');
|
||||
/**
|
||||
* Submits the password for validation
|
||||
*/
|
||||
DUPX.checkPassword = function ()
|
||||
{
|
||||
passForm.parsley().validate();
|
||||
if (!passForm.parsley().isValid()) {
|
||||
return;
|
||||
}
|
||||
var formData = passForm.serializeJSON();
|
||||
|
||||
DUPX.StandarJsonAjaxWrapper(
|
||||
secureAction,
|
||||
secureToken,
|
||||
formData,
|
||||
function (data) {
|
||||
if (data.actionData) {
|
||||
DUPX.redirectMainInstaller('post', <?php echo SnapJson::jsonEncode($nextStepPrams); ?>);
|
||||
} else {
|
||||
$('#pwd-check-fail').show();
|
||||
}
|
||||
},
|
||||
DUPX.ajaxErrorDisplayHideError
|
||||
);
|
||||
};
|
||||
|
||||
passForm.submit(function (event) {
|
||||
event.preventDefault();
|
||||
DUPX.checkPassword();
|
||||
});
|
||||
});
|
||||
</script>
|
||||
@@ -0,0 +1,36 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
*
|
||||
* @package templates/default
|
||||
*/
|
||||
|
||||
defined('ABSPATH') || defined('DUPXABSPATH') || exit;
|
||||
|
||||
use Duplicator\Installer\Core\InstState;
|
||||
use Duplicator\Installer\Core\Security;
|
||||
use Duplicator\Installer\Core\Params\PrmMng;
|
||||
use Duplicator\Installer\Utils\SecureCsrf;
|
||||
use Duplicator\Libs\Snap\SnapJson;
|
||||
|
||||
if (!InstState::dbDoNothing()) {
|
||||
$nextStepParams = [
|
||||
PrmMng::PARAM_CTRL_ACTION => 'ctrl-step2',
|
||||
Security::CTRL_TOKEN => SecureCsrf::generate('ctrl-step2'),
|
||||
];
|
||||
} else {
|
||||
$nextStepParams = [
|
||||
PrmMng::PARAM_CTRL_ACTION => 'ctrl-step4',
|
||||
Security::CTRL_TOKEN => SecureCsrf::generate('ctrl-step4'),
|
||||
];
|
||||
}
|
||||
?>
|
||||
<script>
|
||||
DUPX.deployStep1 = function () {
|
||||
<?php if (!InstState::dbDoNothing()) { ?>
|
||||
DUPX.multipleStepDeploy($('#s1-input-form'), <?php echo SnapJson::jsonEncode($nextStepParams); ?>);
|
||||
<?php } else { ?>
|
||||
DUPX.oneStepDeploy($('#s1-input-form'), <?php echo SnapJson::jsonEncode($nextStepParams); ?>);
|
||||
<?php } ?>
|
||||
};
|
||||
</script>
|
||||
@@ -0,0 +1,328 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
*
|
||||
* @package templates/default
|
||||
*/
|
||||
|
||||
defined('ABSPATH') || defined('DUPXABSPATH') || exit;
|
||||
|
||||
use Duplicator\Installer\Core\Security;
|
||||
use Duplicator\Installer\Core\Params\PrmMng;
|
||||
use Duplicator\Installer\Utils\SecureCsrf;
|
||||
use Duplicator\Libs\Snap\SnapJson;
|
||||
|
||||
$paramsManager = PrmMng::getInstance();
|
||||
?>
|
||||
<script>
|
||||
const urlNewInputId = <?php echo SnapJson::jsonEncode($paramsManager->getFormItemId(PrmMng::PARAM_URL_NEW)); ?>;
|
||||
const pathNewInputId = <?php echo SnapJson::jsonEncode($paramsManager->getFormItemId(PrmMng::PARAM_PATH_NEW)); ?>;
|
||||
const exeSafeModeInputId = <?php echo SnapJson::jsonEncode($paramsManager->getFormItemId(PrmMng::PARAM_SAFE_MODE)); ?>;
|
||||
const htConfigInputId = <?php echo SnapJson::jsonEncode($paramsManager->getFormItemId(PrmMng::PARAM_HTACCESS_CONFIG)); ?>;
|
||||
const htConfigWrapperId = <?php echo SnapJson::jsonEncode($paramsManager->getFormWrapperId(PrmMng::PARAM_HTACCESS_CONFIG)); ?>;
|
||||
const otConfigInputId = <?php echo SnapJson::jsonEncode($paramsManager->getFormItemId(PrmMng::PARAM_OTHER_CONFIG)); ?>;
|
||||
const otConfigWrapperId = <?php echo SnapJson::jsonEncode($paramsManager->getFormWrapperId(PrmMng::PARAM_OTHER_CONFIG)); ?>;
|
||||
const archiveEngineInputId = <?php echo SnapJson::jsonEncode($paramsManager->getFormItemId(PrmMng::PARAM_ARCHIVE_ENGINE)); ?>;
|
||||
const validationShowInputId = <?php echo SnapJson::jsonEncode($paramsManager->getFormItemId(PrmMng::PARAM_VALIDATION_SHOW_ALL)); ?>;
|
||||
const acceptContinueInputId = <?php echo SnapJson::jsonEncode($paramsManager->getFormItemId(PrmMng::PARAM_ACCEPT_TERM_COND)); ?>;
|
||||
|
||||
$(document).ready(function () {
|
||||
let validateArea = $('#validate-area');
|
||||
let validateAreaHeader = $('#validate-area-header');
|
||||
let overviewAreaHeader = $('#overview-area-header');
|
||||
let basicSetupAreaHeader = $('#base-setup-area-header');
|
||||
let optionsAreaHeader = $('#options-area-header');
|
||||
let validateNoResult = validateArea.find('#validate-no-result');
|
||||
let stepActions = $('.bottom-step-action');
|
||||
let step1Form = $('#s1-input-form');
|
||||
|
||||
DUPX.beforeUnloadCheck(true);
|
||||
|
||||
DUPX.onSafeModeSwitch = function ()
|
||||
{
|
||||
var safeObj = $('#' + exeSafeModeInputId)
|
||||
var mode = safeObj ? parseInt(safeObj.val()) : 0;
|
||||
var htWr = $('#' + htConfigWrapperId);
|
||||
var otWr = $('#' + otConfigWrapperId);
|
||||
|
||||
switch (mode) {
|
||||
case 1:
|
||||
case 2:
|
||||
htWr.find('#' + htConfigInputId + '_0').prop("checked", true);
|
||||
htWr.find('input').prop("disabled", true);
|
||||
otWr.find('#' + otConfigInputId + '_0').prop("checked", true);
|
||||
otWr.find('input').prop("disabled", true);
|
||||
break;
|
||||
case 0:
|
||||
default:
|
||||
htWr.find('input').prop("disabled", false);
|
||||
otWr.find('input').prop("disabled", false);
|
||||
break;
|
||||
}
|
||||
console.log("mode set to" + mode);
|
||||
};
|
||||
|
||||
DUPX.toggleSetupType = function ()
|
||||
{
|
||||
var val = $("input:radio[name='setup_type']:checked").val();
|
||||
$('div.s1-setup-type-sub').hide();
|
||||
$('#s1-setup-type-sub-' + val).show(200);
|
||||
};
|
||||
|
||||
/**
|
||||
* Sets the focus to the next available input as needed. */
|
||||
DUPX.autoFocusInput = function ()
|
||||
{
|
||||
var $host = $('#param_item_dbhost');
|
||||
var $name = $('#param_item_dbname');
|
||||
var $user = $('#param_item_dbuser');
|
||||
var $pass = $('#param_item_dbpass');
|
||||
|
||||
function _setFocus($input) {
|
||||
if ($input && $input.val() !== undefined && $input.val().length === 0) {
|
||||
$input.focus();
|
||||
}
|
||||
}
|
||||
_setFocus($pass);
|
||||
_setFocus($user);
|
||||
_setFocus($name);
|
||||
_setFocus($host);
|
||||
}
|
||||
|
||||
/**
|
||||
* Accetps Usage Warning */
|
||||
DUPX.acceptWarning = function (agreeMsg)
|
||||
{
|
||||
if ($("#" + acceptContinueInputId).is(':checked')) {
|
||||
$("#s1-deploy-btn").removeAttr("disabled");
|
||||
$("#s1-deploy-btn").removeAttr("title");
|
||||
} else {
|
||||
$("#s1-deploy-btn").attr("disabled", "true");
|
||||
$("#s1-deploy-btn").attr("title", agreeMsg);
|
||||
}
|
||||
};
|
||||
|
||||
DUPX.setPageActions = function (inputActions) {
|
||||
let actions = $.extend({}, {
|
||||
'error': false,
|
||||
'validate': false,
|
||||
'hwarn': false,
|
||||
'next': false
|
||||
}, inputActions);
|
||||
|
||||
stepActions.addClass('no-display');
|
||||
if (actions.next) {
|
||||
stepActions.filter("#next_action").removeClass('no-display');
|
||||
}
|
||||
if (actions.validate) {
|
||||
stepActions.filter("#validate_action").removeClass('no-display');
|
||||
}
|
||||
if (actions.hwarn) {
|
||||
stepActions.filter("#hard_warning_action").removeClass('no-display');
|
||||
}
|
||||
if (actions.error) {
|
||||
stepActions.filter("#error_action").removeClass('no-display');
|
||||
}
|
||||
}
|
||||
|
||||
DUPX.openValidateArea = function () {
|
||||
if (validateAreaHeader.hasClass('open')) {
|
||||
validateAreaHeader.trigger('click');
|
||||
}
|
||||
}
|
||||
|
||||
DUPX.closeValidateArea = function () {
|
||||
if (validateAreaHeader.hasClass('close')) {
|
||||
validateAreaHeader.trigger('click');
|
||||
}
|
||||
}
|
||||
|
||||
DUPX.openBasicSetupArea = function () {
|
||||
if (basicSetupAreaHeader.hasClass('open')) {
|
||||
basicSetupAreaHeader.trigger('click');
|
||||
}
|
||||
}
|
||||
|
||||
DUPX.closeBasicSetupArea = function () {
|
||||
if (basicSetupAreaHeader.hasClass('close')) {
|
||||
basicSetupAreaHeader.trigger('click');
|
||||
}
|
||||
}
|
||||
|
||||
DUPX.closeOptionsSetupArea = function () {
|
||||
if (optionsAreaHeader.hasClass('close')) {
|
||||
optionsAreaHeader.trigger('click');
|
||||
}
|
||||
}
|
||||
|
||||
DUPX.resetValidationResult = function () {
|
||||
DUPX.setValidationBadge('#validate-global-badge-status', false);
|
||||
$('.database-setup-title').removeClass('warning');
|
||||
validateArea.find('#validation-result').empty().append(validateNoResult);
|
||||
}
|
||||
|
||||
DUPX.autoUpdateOnMainChanges = function () {
|
||||
var originalUrlMainVal = $('#' + urlNewInputId).val();
|
||||
var urlRegex = new RegExp('^' + originalUrlMainVal, '');
|
||||
|
||||
$('.auto-updatable').each(function () {
|
||||
$(this).data('original-default-value', $(this).find('input').val());
|
||||
});
|
||||
|
||||
$('#' + urlNewInputId).bind("keyup change", function () {
|
||||
var newUrlVal = $(this).val().replace(/\/$/, '');
|
||||
$('.auto-updatable.autoupdate-enabled[data-auto-update-from-input="' + urlNewInputId + '"]').each(function () {
|
||||
let originalVal = $(this).data('original-default-value');
|
||||
$(this).find('input').val(originalVal.replace(urlRegex, newUrlVal));
|
||||
});
|
||||
});
|
||||
|
||||
var orginalPathMainVal = $('#' + pathNewInputId).val();
|
||||
var pathRegex = new RegExp('^' + orginalPathMainVal, '');
|
||||
|
||||
$('#' + pathNewInputId).bind("keyup change", function () {
|
||||
var newPathlVal = $(this).val().replace(/\/$/, '');
|
||||
$('.auto-updatable.autoupdate-enabled[data-auto-update-from-input="' + pathNewInputId + '"]').each(function () {
|
||||
let originalVal = $(this).data('original-default-value');
|
||||
$(this).find('input').val(originalVal.replace(pathRegex, newPathlVal));
|
||||
});
|
||||
});
|
||||
};
|
||||
|
||||
DUPX.onValidateResult = function (validateData) {
|
||||
validateNoResult.detach();
|
||||
validateArea.find('#validation-result').empty().append(validateData.htmlResult);
|
||||
validateArea.find("*[data-type='toggle']").click(DUPX.toggleClick);
|
||||
DUPX.setValidationBadge('#validate-global-badge-status', validateData.mainBagedClass);
|
||||
|
||||
if (validateData.categoriesLevels.database == 0) {
|
||||
$('.database-setup-title').addClass('warning');
|
||||
DUPX.openBasicSetupArea();
|
||||
} else {
|
||||
DUPX.closeBasicSetupArea();
|
||||
}
|
||||
DUPX.closeOptionsSetupArea();
|
||||
|
||||
switch (validateData.mainLevel) {
|
||||
case <?php echo DUPX_Validation_abstract_item::LV_PASS; ?>:
|
||||
case <?php echo DUPX_Validation_abstract_item::LV_GOOD; ?>:
|
||||
DUPX.openValidateArea();
|
||||
DUPX.setPageActions({'next': true});
|
||||
break;
|
||||
case <?php echo DUPX_Validation_abstract_item::LV_SOFT_WARNING; ?>:
|
||||
DUPX.openValidateArea();
|
||||
DUPX.setPageActions({'next': true});
|
||||
break;
|
||||
case <?php echo DUPX_Validation_abstract_item::LV_HARD_WARNING; ?>:
|
||||
DUPX.openValidateArea();
|
||||
DUPX.setPageActions({'hwarn': true, 'next': true});
|
||||
break;
|
||||
case <?php echo DUPX_Validation_abstract_item::LV_FAIL; ?>:
|
||||
default:
|
||||
DUPX.openValidateArea();
|
||||
DUPX.setPageActions({'error': true, 'validate': true});
|
||||
}
|
||||
};
|
||||
|
||||
DUPX.reavelidateOnChangeAction = function (oldValue, obj) {
|
||||
if (obj == null || obj.val() !== oldValue) {
|
||||
DUPX.resetValidationResult();
|
||||
DUPX.setPageActions({'validate': true});
|
||||
}
|
||||
return (obj == null ? true : obj.val());
|
||||
}
|
||||
|
||||
DUPX.revalidateOnChange = function () {
|
||||
$('.revalidate-on-change').each(function () {
|
||||
$(this).find('input, select, textarea').each(function () {
|
||||
if ($(this).is(':checkbox, :radio')) {
|
||||
$(this).bind("click", function () {
|
||||
DUPX.reavelidateOnChangeAction(false, $(this));
|
||||
});
|
||||
} else {
|
||||
var oldValue = $(this).val();
|
||||
$(this).bind("keyup change", function () {
|
||||
oldValue = DUPX.reavelidateOnChangeAction(oldValue, $(this));
|
||||
});
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
//INIT Routines
|
||||
$("*[data-type='toggle']").click(DUPX.toggleClick);
|
||||
$(".tabs").tabs();
|
||||
|
||||
DUPX.acceptWarning();
|
||||
DUPX.toggleSetupType();
|
||||
|
||||
DUPX.autoUpdateOnMainChanges();
|
||||
DUPX.revalidateOnChange();
|
||||
DUPX.autoFocusInput();
|
||||
|
||||
validateArea.on("click", '#' + validationShowInputId, function () {
|
||||
if ($(this).is(":checked")) {
|
||||
validateArea.removeClass('show-warnings').addClass('show-all');
|
||||
} else {
|
||||
validateArea.removeClass('show-all').addClass('show-warnings');
|
||||
}
|
||||
});
|
||||
|
||||
$('#s1-deploy-btn').click(function () {
|
||||
DUPX.confirmDialog.loadAndOpen();
|
||||
});
|
||||
|
||||
$('#validate-button').click(function () {
|
||||
DUPX.sendParamsStep1(step1Form, function () {
|
||||
<?php
|
||||
// reload page to reinit interface
|
||||
$onValidatePrams = [
|
||||
PrmMng::PARAM_CTRL_ACTION => 'ctrl-step1',
|
||||
Security::CTRL_TOKEN => SecureCsrf::generate('ctrl-step1'),
|
||||
PrmMng::PARAM_STEP_ACTION => DUPX_CTRL::ACTION_STEP_ON_VALIDATE,
|
||||
];
|
||||
?>
|
||||
let onValidateParam = <?php echo SnapJson::jsonEncode($onValidatePrams); ?>;
|
||||
DUPX.redirectMainInstaller('post', onValidateParam);
|
||||
});
|
||||
});
|
||||
|
||||
$('.s1-switch-template-btn').click(function () {
|
||||
let tplButton = $(this);
|
||||
if (tplButton.hasClass('active') || !tplButton.data('template')) {
|
||||
return;
|
||||
}
|
||||
<?php
|
||||
$switchPrams = [
|
||||
PrmMng::PARAM_CTRL_ACTION => 'ctrl-step1',
|
||||
Security::CTRL_TOKEN => SecureCsrf::generate('ctrl-step1'),
|
||||
PrmMng::PARAM_STEP_ACTION => DUPX_CTRL::ACTION_STEP_SET_TEMPLATE,
|
||||
];
|
||||
?>
|
||||
let redirectParam = <?php echo SnapJson::jsonEncode($switchPrams); ?>;
|
||||
redirectParam[<?php echo SnapJson::jsonEncode(PrmMng::PARAM_TEMPLATE); ?>] = tplButton.data('template');
|
||||
DUPX.redirectMainInstaller('post', redirectParam);
|
||||
});
|
||||
|
||||
validateArea.on("click", ".test-title", function () {
|
||||
let content = $(this).closest('.test-wrapper').find('.test-content');
|
||||
let faIcon = $(this).find('> .fa');
|
||||
if (content.hasClass('no-display')) {
|
||||
faIcon.removeClass('fa-caret-right').addClass('fa-caret-down');
|
||||
content.removeClass('no-display');
|
||||
} else {
|
||||
faIcon.removeClass('fa-caret-down').addClass('fa-caret-right');
|
||||
content.addClass('no-display');
|
||||
}
|
||||
});
|
||||
|
||||
<?php
|
||||
if (DUPX_Validation_manager::validateOnLoad()) {
|
||||
?>
|
||||
|
||||
DUPX.initialValidateAction(DUPX.onValidateResult, true, true);
|
||||
<?php } ?>
|
||||
});
|
||||
</script>
|
||||
<?php
|
||||
dupxTplRender('scripts/step1-deploy');
|
||||
@@ -0,0 +1,40 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
*
|
||||
* @package templates/default
|
||||
*/
|
||||
|
||||
defined('ABSPATH') || defined('DUPXABSPATH') || exit;
|
||||
|
||||
use Duplicator\Installer\Core\Security;
|
||||
use Duplicator\Installer\Core\Params\PrmMng;
|
||||
use Duplicator\Installer\Utils\SecureCsrf;
|
||||
use Duplicator\Libs\Snap\SnapJson;
|
||||
|
||||
$paramsManager = PrmMng::getInstance();
|
||||
|
||||
$nextStepPrams = [
|
||||
PrmMng::PARAM_CTRL_ACTION => 'ctrl-step3',
|
||||
Security::CTRL_TOKEN => SecureCsrf::generate('ctrl-step3'),
|
||||
];
|
||||
?><script>
|
||||
$("#tabs").tabs({
|
||||
create: function (event, ui) {
|
||||
$("#tabs").removeClass('no-display');
|
||||
}
|
||||
});
|
||||
|
||||
DUPX.beforeUnloadCheck(true);
|
||||
|
||||
DUPX.runDeployment = function () {
|
||||
//Validate input data
|
||||
var formInput = $('#s2-input-form');
|
||||
|
||||
DUPX.sendParamsStep2(formInput, function () {
|
||||
DUPX.startAjaxDbInstall(true, function () {
|
||||
DUPX.redirectMainInstaller('post', <?php echo SnapJson::jsonEncode($nextStepPrams); ?>);
|
||||
});
|
||||
});
|
||||
};
|
||||
</script>
|
||||
@@ -0,0 +1,116 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
*
|
||||
* @package templates/default
|
||||
*/
|
||||
|
||||
defined('ABSPATH') || defined('DUPXABSPATH') || exit;
|
||||
|
||||
use Duplicator\Installer\Core\Security;
|
||||
use Duplicator\Installer\Core\Params\PrmMng;
|
||||
use Duplicator\Installer\Utils\SecureCsrf;
|
||||
use Duplicator\Libs\Snap\SnapJson;
|
||||
|
||||
$paramsManager = PrmMng::getInstance();
|
||||
|
||||
$nextStepPrams = [
|
||||
PrmMng::PARAM_CTRL_ACTION => 'ctrl-step4',
|
||||
Security::CTRL_TOKEN => SecureCsrf::generate('ctrl-step4'),
|
||||
];
|
||||
|
||||
dupxTplRender('scripts/modules/new-admin-user');
|
||||
?>
|
||||
<script>
|
||||
DUPX.runSiteUpdate = function ()
|
||||
{
|
||||
DUPX.sendParamsStep3($('#s3-input-form'), function () {
|
||||
DUPX.siteProcessingReplaceData(true, function () {
|
||||
DUPX.finalTests.test(function () {
|
||||
DUPX.redirectMainInstaller('post', <?php echo SnapJson::jsonEncode($nextStepPrams); ?>);
|
||||
});
|
||||
});
|
||||
});
|
||||
};
|
||||
|
||||
DUPX.beforeUnloadCheck(true);
|
||||
|
||||
var searchReplaceIndex = 1;
|
||||
|
||||
/**
|
||||
* Adds a search and replace line */
|
||||
DUPX.addSearchReplace = function ()
|
||||
{
|
||||
$("#search-replace-table").append("<tr valign='top' id='search-" + searchReplaceIndex + "'>" +
|
||||
"<td style='width:80px;padding-top:20px'>Search:</td>" +
|
||||
"<td style='padding-top:20px'>" +
|
||||
"<input class=\"w95\" type='text' name='search[]' style='margin-right:5px' />" +
|
||||
"<a href='javascript:DUPX.removeSearchReplace(" + searchReplaceIndex + ")'><i class='fa fa-minus-circle'></i></a>" +
|
||||
"</td>" +
|
||||
"</tr>" +
|
||||
"<tr valign='top' id='replace-" + searchReplaceIndex + "'>" +
|
||||
"<td>Replace:</td>" +
|
||||
"<td>" +
|
||||
"<input class=\"w95\" type='text' name='replace[]' />" +
|
||||
"</td>" +
|
||||
"</tr> ");
|
||||
|
||||
searchReplaceIndex++;
|
||||
};
|
||||
|
||||
/**
|
||||
* Removes a search and replace line */
|
||||
DUPX.removeSearchReplace = function (index)
|
||||
{
|
||||
$("#search-" + index).remove();
|
||||
$("#replace-" + index).remove();
|
||||
};
|
||||
|
||||
//DOCUMENT LOAD
|
||||
$(document).ready(function () {
|
||||
$("#tabs").tabs({
|
||||
create: function (event, ui) {
|
||||
$("#tabs").removeClass('no-display');
|
||||
}
|
||||
});
|
||||
|
||||
$("*[data-type='toggle']").click(DUPX.toggleClick);
|
||||
|
||||
$('.strength-pwd-check .pwd-simulation').password({
|
||||
'closestSelector': '.input-container',
|
||||
'minimumLength': <?php echo DUPX_Constants::MIN_NEW_PASSWORD_LEN; ?>,
|
||||
'enterPass': 'Type your password',
|
||||
'shortPass': 'The password is too short',
|
||||
'steps': {
|
||||
13: 'Weak',
|
||||
50: 'Good',
|
||||
80: 'Strong'
|
||||
}
|
||||
});
|
||||
|
||||
$('input[type=radio][name=replace_mode]').change(function () {
|
||||
if (this.value == 'mapping') {
|
||||
$("#subsite-map-container").show();
|
||||
$("#new-url-container").hide();
|
||||
} else if (this.value == 'legacy') {
|
||||
$("#new-url-container").show();
|
||||
$("#subsite-map-container").hide();
|
||||
}
|
||||
});
|
||||
|
||||
$('#param_item_mode_chunking').change(function () {
|
||||
if (this.value == '2') {
|
||||
$('#progress-area .progress-perc').show();
|
||||
} else {
|
||||
$('#progress-area .progress-perc').hide();
|
||||
}
|
||||
});
|
||||
$('#param_item_mode_chunking').change();
|
||||
|
||||
// Sync new urls link
|
||||
var inputs_new_urls = $(".sync_url_new");
|
||||
inputs_new_urls.keyup(function () {
|
||||
inputs_new_urls.val($(this).val());
|
||||
});
|
||||
});
|
||||
</script>
|
||||
@@ -0,0 +1,22 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
*
|
||||
* @package templates/default
|
||||
*/
|
||||
|
||||
defined('ABSPATH') || defined('DUPXABSPATH') || exit;
|
||||
?><script>
|
||||
//DOCUMENT LOAD
|
||||
$(document).ready(function () {
|
||||
DUPX.beforeUnloadCheck(false);
|
||||
|
||||
$('[data-go-step-one-url]').click(function () {
|
||||
document.location.href = decodeURIComponent($(this).data('go-step-one-url'));
|
||||
});
|
||||
|
||||
//INIT Routines
|
||||
$("*[data-type='toggle']").click(DUPX.toggleClick);
|
||||
$("#tabs").tabs();
|
||||
});
|
||||
</script>
|
||||
Reference in New Issue
Block a user