Download all files FTP

This commit is contained in:
2026-04-13 15:50:16 +02:00
parent d8382136b2
commit cb5b386424
6906 changed files with 1956223 additions and 40713 deletions

View File

@@ -0,0 +1,640 @@
<?php
/**
* @package Duplicator
*/
defined("ABSPATH") or die("");
use Duplicator\Addons\ProBase\License\License;
use Duplicator\Controllers\SchedulePageController;
use Duplicator\Controllers\StoragePageController;
use Duplicator\Controllers\ToolsPageController;
use Duplicator\Core\Controllers\ControllersManager;
use Duplicator\Libs\Snap\SnapJson;
use Duplicator\Models\Storages\AbstractStorageEntity;
use Duplicator\Models\Storages\StoragesUtil;
use Duplicator\Views\ViewHelper;
/**
* Variables
*
* @var Duplicator\Core\Controllers\ControllersManager $ctrlMng
* @var Duplicator\Core\Views\TplMng $tplMng
* @var array<string, mixed> $tplData
* @var DUP_PRO_Schedule_Entity $schedule
* @var bool $blur
*/
$blur = $tplData['blur'];
$schedule = $tplData['schedule'];
$copyScheduleList = DUP_PRO_Schedule_Entity::getAll(
0,
0,
null,
function (DUP_PRO_Schedule_Entity $s) use ($schedule) {
return $s->getId() != $schedule->getId();
}
);
$templatesPageUrl = ToolsPageController::getInstance()->getMenuLink(ToolsPageController::L2_SLUG_TEMPLATE);
$schedulesListURL = ControllersManager::getMenuLink(
ControllersManager::SCHEDULES_SUBMENU_SLUG
);
$scheduleCopyBaseURL = SchedulePageController::getInstance()->getCopyActionUrl($schedule->getId());
$frequency_note = __(
'If you have a large site, it\'s recommended you schedule backups during lower traffic periods.
If you\'re on a shared host then be aware that running multiple schedules too close together
(i.e. every 10 minutes) may alert your host to a spike in system resource usage.
Be sure that your schedules do not overlap and give them plenty of time to run.',
'duplicator-pro'
);
$editTemplateUrl = ControllersManager::getMenuLink(
ControllersManager::TOOLS_SUBMENU_SLUG,
ToolsPageController::L2_SLUG_TEMPLATE,
null,
array(ControllersManager::QUERY_STRING_INNER_PAGE => 'edit')
);
$min_frequency = 0;
$max_frequency = (
License::can(License::CAPABILITY_SHEDULE_HOURLY) ?
DUP_PRO_Schedule_Entity::REPEAT_HOURLY :
DUP_PRO_Schedule_Entity::REPEAT_MONTHLY
);
$frequencyUpgradMsg = sprintf(
__(
'Hourly frequency isn\'t available at the <b>%1$s</b> license level.',
'duplicator-pro'
),
License::getLicenseToString()
) .
' <b>' .
sprintf(
_x(
'To enable this option %1$supgrade%2$s the License.',
'%1$s and %2$s represents the opening and closing HTML tags for an anchor or link',
'duplicator-pro'
),
'<a href="' . esc_url(License::getUpsellURL()) . '" target="_blank">',
'</a>'
) .
'</b>';
$langLocalDefaultMsg = __('Recovery Point Capable', 'duplicator-pro');
?>
<form
id="dup-schedule-form"
class="dup-monitored-form <?php echo ($blur ? 'dup-mock-blur' : ''); ?>"
action="<?php echo esc_url(ControllersManager::getCurrentLink()); ?>"
method="post"
data-parsley-ui-enabled="true"
>
<?php $tplData['actions'][SchedulePageController::ACTION_EDIT_SAVE]->getActionNonceFileds(); ?>
<input type="hidden" name="schedule_id" value="<?php echo esc_attr($schedule->getId()); ?>">
<!-- ====================
TOOL-BAR -->
<table class="dpro-edit-toolbar dup-schedule-edit-toolbar">
<tr>
<td>
<select id="dup-schedule-copy-select" name="duppro-source-schedule-id">
<option value="-1" selected="selected">
<?php esc_html_e('Copy From', 'duplicator-pro'); ?>
</option>
<?php foreach ($copyScheduleList as $copy_schedule) { ?>
<option value="<?php echo (int) $copy_schedule->getId(); ?>">
<?php echo esc_html($copy_schedule->name); ?>
</option>
<?php } ?>
</select>
<input
id="dup-schedule-copy-btn"
type="button"
class="button action"
value="<?php esc_html_e("Apply", 'duplicator-pro') ?>"
disabled
>
</td>
<td>
<div class="btnnav">
<a href="<?php echo esc_url($schedulesListURL); ?>" class="button dup-schedule-schedules">
<i class="far fa-clock fa-sm"></i> <?php esc_html_e('Schedules', 'duplicator-pro'); ?>
</a>
<?php if ($schedule->getId() != -1) : ?>
<a
href="<?php echo esc_url(SchedulePageController::getInstance()->getEditUrl()); ?>"
class="button"
>
<?php esc_html_e("Add New", 'duplicator-pro'); ?>
</a>
<?php endif; ?>
</div>
</td>
</tr>
</table>
<hr class="dpro-edit-toolbar-divider" />
<!-- ===============================
SETTINGS -->
<table class="form-table">
<tr valign="top">
<th scope="row"><label><?php esc_html_e('Schedule Name', 'duplicator-pro'); ?></label></th>
<td>
<input
type="text"
id="schedule-name"
name="name"
value="<?php echo esc_attr($schedule->name); ?>"
required data-parsley-group="standard"
autocomplete="off"
>
</td>
</tr>
<tr valign="top">
<th scope="row"><label><?php esc_html_e('Package Template', 'duplicator-pro'); ?></label></th>
<td>
<table class="schedule-template">
<tr>
<td>
<select id="schedule-template-selector" name="template_id" required>
<?php
$templates = DUP_PRO_Package_Template_Entity::getAllWithoutManualMode();
if (count($templates) == 0) {
$no_templates = __('No Templates Found', 'duplicator-pro');
printf('<option value="">%1$s</option>', esc_html($no_templates));
} else {
echo "<option value='' selected='true'>" . esc_html__("&lt;Choose A Template&gt;", 'duplicator-pro') . "</option>";
foreach ($templates as $template) {
?>
<option
<?php selected($schedule->template_id, $template->getId()); ?>
value="<?php echo (int) $template->getId(); ?>"
>
<?php echo esc_html($template->name); ?>
</option>
<?php
}
}
?>
</select>
<br />
<small>
<a href="<?php echo esc_url($templatesPageUrl); ?>" target="edit-template">
[<?php esc_attr_e("Show All Templates", 'duplicator-pro') ?>]
</a>
</small>
</td>
<td>
<a
id="schedule-template-edit-btn"
href="javascript:void(0)"
onclick="DupPro.Schedule.EditTemplate()"
style="display:none"
class="pack-temp-btns button button-small"
title="<?php esc_attr_e("Edit Selected Template", 'duplicator-pro') ?>"
>
<i class="far fa-edit"></i>
</a>
<a
id="schedule-template-add-btn"
href="<?php echo esc_url($editTemplateUrl); ?>"
class="pack-temp-btns button button-small"
title="<?php esc_attr_e("Add New Template", 'duplicator-pro') ?>"
target="edit-template"
>
<i class="far fa-plus-square"></i>
</a>
<a
id="schedule-template-sync-btn"
href="javascript:window.location.reload()"
class="pack-temp-btns button button-small"
title="<?php esc_attr_e("Refresh Template List", 'duplicator-pro') ?>"
>
<i class="fas fa-sync-alt"></i>
</a>
<i
class="fas fa-question-circle fa-sm"
data-tooltip-title="<?php esc_attr_e("Template Details", 'duplicator-pro'); ?>"
data-tooltip="<?php
esc_attr_e(
'The template specifies which files and database tables should be included in the archive.<br/><br/>
Choose from an existing template or create a new one by clicking the "Add New Template" button.
To edit a template, select it and then click the "Edit Selected Template" button.',
'duplicator-pro'
);
?>">
</i>
</td>
</tr>
</table>
</td>
</tr>
<tr>
<th scope="row"><label><?php esc_html_e('Storage', 'duplicator-pro'); ?></label></th>
<td>
<!-- ===============================
STORAGE -->
<table class="widefat package-tbl schedule-package-tbl">
<thead>
<tr>
<th style="width:125px;padding-left:45px"><?php esc_html_e('Type', 'duplicator-pro') ?></th>
<th style="width:275px;"><?php esc_html_e('Name', 'duplicator-pro') ?></th>
<th><?php esc_html_e('Location', 'duplicator-pro') ?></th>
</tr>
</thead>
<tbody>
<?php
$i = 0;
$storages = AbstractStorageEntity::getAll(0, 0, [StoragesUtil::class, 'sortByPriority']);
foreach ($storages as $storage) :
//Sometime storage is authorized
// then server downgrade to lower php version
// For ex. When storage is added PHP CURL extension enabled
// But now It is disabled, It cause to fatal error
// in the Package creation step 1
if (!$storage->isSupported()) {
continue;
}
$i++;
$is_valid = $storage->isValid();
$is_checked = in_array($storage->getId(), $schedule->storage_ids);
$mincheck = ($i == 1) ? 'data-parsley-mincheck="1" data-parsley-required="true"' : '';
$lbl_id = "storage_chk_{$storage->getId()}";
$storageEditUrl = StoragePageController::getEditUrl($storage);
?>
<tr class="package-row <?php echo ($i % 2) ? 'alternate' : ''; ?>">
<td>
<input data-parsley-errors-container="#schedule_storage_error_container" <?php echo $mincheck ?>
id="<?php echo esc_attr($lbl_id); ?>" name="_storage_ids[]"
type="checkbox" value="<?php echo (int) $storage->getId(); ?>"
<?php checked($is_checked); ?> class="delete-chk" /> &nbsp; &nbsp;
<label for="<?php echo esc_attr($lbl_id); ?>">
<?php
echo $storage->getStypeIcon() . '&nbsp;' . esc_html($storage->getStypeName());
echo ($storage->isLocal())
? "<sup title='" . esc_attr($langLocalDefaultMsg) . "'>" . ViewHelper::disasterIcon(false, ['fa-fw', 'fa-sm'])
. "</sup>"
: '';
?>
</label>
</td>
<td>
<a href="<?php echo esc_url($storageEditUrl); ?>" target="_blank">
<?php
echo ($is_valid == false) ? '<i class="fa fa-exclamation-triangle fa-sm"></i> ' : '';
echo esc_html($storage->getName());
?>
</a>
</td>
<td><?php echo $storage->getHtmlLocationLink(); ?>
</td>
</tr>
<?php endforeach; ?>
</tbody>
</table>
<div id="schedule_storage_error_container" class="duplicator-error-container"></div>
</td>
</tr>
<tr valign="top">
<th scope="row"><label><?php esc_html_e("Repeats", 'duplicator-pro'); ?></label></th>
<td>
<select
id="change-mode"
name="repeat_type"
onchange="DupPro.Schedule.ChangeMode()"
data-parsley-range='<?php printf('[%1$s, %2$s]', (int) $min_frequency, (int) $max_frequency); ?>'
data-parsley-error-message="<?php echo esc_attr($frequencyUpgradMsg); ?>"
>
<option
value="<?php echo (int) DUP_PRO_Schedule_Entity::REPEAT_HOURLY; ?>"
<?php selected($schedule->repeat_type, DUP_PRO_Schedule_Entity::REPEAT_HOURLY) ?>
>
<?php esc_html_e("Hourly", 'duplicator-pro'); ?>
</option>
<option
value="<?php echo (int) DUP_PRO_Schedule_Entity::REPEAT_DAILY; ?>"
<?php selected($schedule->repeat_type, DUP_PRO_Schedule_Entity::REPEAT_DAILY) ?>
>
<?php esc_html_e("Daily", 'duplicator-pro'); ?>
</option>
<option
value="<?php echo (int) DUP_PRO_Schedule_Entity::REPEAT_WEEKLY; ?>"
<?php selected($schedule->repeat_type, DUP_PRO_Schedule_Entity::REPEAT_WEEKLY) ?>
>
<?php esc_html_e("Weekly", 'duplicator-pro'); ?>
</option>
<option
value="<?php echo (int) DUP_PRO_Schedule_Entity::REPEAT_MONTHLY; ?>"
<?php selected($schedule->repeat_type, DUP_PRO_Schedule_Entity::REPEAT_MONTHLY) ?>
>
<?php esc_html_e("Monthly", 'duplicator-pro'); ?>
</option>
</select>
</td>
</tr>
<tr>
<th></th>
<td style="padding-top:0px; padding-bottom:10px;">
<!-- ===============================
DAILY -->
<div id="repeat-hourly-area" class="repeater-area">
<?php
esc_html_e('Every', 'duplicator-pro');
$hour_intervals = array(
1,
2,
4,
6,
12,
);
?>
<select name="_run_every_hours" data-parsley-ui-enabled="false">
<?php foreach ($hour_intervals as $hour_interval) { ?>
<option <?php selected($hour_interval, (int) $schedule->run_every); ?> value="<?php echo (int) $hour_interval; ?>">
<?php echo (int) $hour_interval; ?>
</option>
<?php } ?>
</select>
<?php
esc_html_e('hours', 'duplicator-pro');
$tipContent = __('Package will build every x hours starting at 00:00.', 'duplicator-pro') . '<br/><br/>' . $frequency_note;
?>
<i
class="fas fa-question-circle fa-sm"
data-tooltip-title="<?php esc_attr_e("Frequency Note", 'duplicator-pro'); ?>"
data-tooltip="<?php echo esc_attr($tipContent); ?>"
>
</i>
<br />
</div>
<!-- ===============================
DAILY -->
<div id="repeat-daily-area" class="repeater-area">
<?php esc_html_e('Every', 'duplicator-pro'); ?>
<select name="_run_every_days" data-parsley-ui-enabled="false">
<?php for ($i = 1; $i < 30; $i++) { ?>
<option <?php selected($i, (int) $schedule->run_every); ?> value="<?php echo (int) $i; ?>">
<?php echo (int) $i; ?>
</option>
<?php } ?>
</select>
<?php esc_html_e('days', 'duplicator-pro'); ?>
<i
class="fas fa-question-circle fa-sm"
data-tooltip-title="<?php esc_attr_e("Frequency Note", 'duplicator-pro'); ?>"
data-tooltip="<?php echo esc_attr($frequency_note) ?>"
>
</i>
<br />
</div>
<!-- ===============================
WEEKLY -->
<div id="repeat-weekly-area" class="repeater-area">
<!-- RSR Cron does not support counting by week - just days and months so removing (for now?)-->
<div class="weekday-div">
<input
<?php checked($schedule->is_day_set('mon')); ?>
value="mon" name="weekday[]"
type="checkbox"
id="repeat-weekly-mon"
data-parsley-group="weekly" required data-parsley-class-handler="#repeat-weekly-area"
data-parsley-error-message="<?php esc_attr_e('At least one day must be checked.', 'duplicator-pro'); ?>"
data-parsley-no-focus data-parsley-errors-container="#weekday-errors"
>
<label for="repeat-weekly-mon"><?php esc_html_e('Monday', 'duplicator-pro'); ?></label>
</div>
<div class="weekday-div">
<input <?php checked($schedule->is_day_set('tue')); ?> value="tue" name="weekday[]" type="checkbox" id="repeat-weekly-tue" />
<label for="repeat-weekly-tue"><?php esc_html_e('Tuesday', 'duplicator-pro'); ?></label>
</div>
<div class="weekday-div">
<input <?php checked($schedule->is_day_set('wed')); ?> value="wed" name="weekday[]" type="checkbox" id="repeat-weekly-wed" />
<label for="repeat-weekly-wed"><?php esc_html_e('Wednesday', 'duplicator-pro'); ?></label>
</div>
<div class="weekday-div">
<input <?php checked($schedule->is_day_set('thu')); ?> value="thu" name="weekday[]" type="checkbox" id="repeat-weekly-thu" />
<label for="repeat-weekly-thu"><?php esc_html_e('Thursday', 'duplicator-pro'); ?></label>
</div>
<div class="weekday-div" style="clear:both">
<input <?php checked($schedule->is_day_set('fri')); ?> value="fri" name="weekday[]" type="checkbox" id="repeat-weekly-fri" />
<label for="repeat-weekly-fri"><?php esc_html_e('Friday', 'duplicator-pro'); ?></label>
</div>
<div class="weekday-div">
<input <?php checked($schedule->is_day_set('sat')); ?> value="sat" name="weekday[]" type="checkbox" id="repeat-weekly-sat" />
<label for="repeat-weekly-sat"><?php esc_html_e('Saturday', 'duplicator-pro'); ?></label>
</div>
<div class="weekday-div">
<input <?php checked($schedule->is_day_set('sun')); ?> value="sun" name="weekday[]" type="checkbox" id="repeat-weekly-sun" />
<label for="repeat-weekly-sun"><?php esc_html_e('Sunday', 'duplicator-pro'); ?></label>
</div>
</div>
<div style="padding-top:3px; clear:both;" id="weekday-errors"></div>
<!-- ===============================
MONTHLY -->
<div id="repeat-monthly-area" class="repeater-area">
<div style="float:left; margin-right:5px;"><?php esc_html_e('Day', 'duplicator-pro'); ?>
<select name="day_of_month">
<?php for ($i = 1; $i <= 31; $i++) { ?>
<option <?php selected($i, $schedule->day_of_month); ?> value="<?php echo (int) $i; ?>">
<?php echo (int) $i; ?>
</option>
<?php } ?>
</select>
</div>
<div style="display:inline-block">
<?php esc_html_e('of every', 'duplicator-pro'); ?>
<select name="_run_every_months" data-parsley-ui-enabled="false">
<?php for ($i = 1; $i <= 12; $i++) { ?>
<option <?php selected($i, $schedule->run_every); ?> value="<?php echo (int) $i; ?>">
<?php echo (int) $i; ?>
</option>
<?php } ?>
</select>
<?php esc_html_e('month(s)', 'duplicator-pro'); ?>
</div>
</div>
</td>
</tr>
<tr valign="top" id="start-time-row">
<th scope="row"><label><?php esc_html_e('Start Time', 'duplicator-pro'); ?></label></th>
<td>
<select name="_start_time" style="margin-top:-2px; height:27px">
<?php
$start_hour = $schedule->get_start_time_piece(0);
$start_min = $schedule->get_start_time_piece(1);
$mins = 0;
// Add setting to use 24 hour vs AM/PM
// the interval for hours is '1'
for ($hours = 0; $hours < 24; $hours++) {
?>
<option <?php selected($hours, $start_hour); ?> value="<?php echo (int) $hours; ?>">
<?php printf('%02d:%02d', (int) $hours, (int) $mins); ?>
</option>
<?php } ?>
</select>
<i class="dpro-edit-info">
<?php esc_html_e("Current Server Time Stamp is", 'duplicator-pro'); ?>&nbsp;
<?php echo esc_html(date_i18n('Y-m-d H:i:s')); ?>
</i>
</td>
</tr>
<tr>
<td>
</td>
<td>
<p class="description" style="width:800px">
<?php
printf(
esc_html_x(
'%1$sNote:%2$s Schedules require web site traffic in order to start a build.
If you set a start time of 06:00 daily but do not get any traffic till 10:00 then the build will not start until 10:00.
If you have low traffic consider setting up a cron job to periodically hit your site or
check out the free web monitoring tools found on our %3$spartners page%4$s.',
'%1$s and %2$s represent opening and closing bold tags, %3$s and %4$s represent opening and closing anchor tags',
'duplicator-pro'
),
'<b>',
'</b>',
'<a href="' . esc_url(DUPLICATOR_PRO_DUPLICATOR_DOCS_URL . 'what-services-and-products-complement-the-duplicator/')
. '" target="_blank">',
'</a>'
);
?>
</p>
</td>
</tr>
<tr valign="top">
<th scope="row"><label><?php esc_html_e('Recovery Status', 'duplicator-pro'); ?></label></th>
<td class="dup-recovery-template">
<?php
if (($template = $schedule->getTemplate()) !== false) {
$schedule->recoveableHtmlInfo();
} else {
esc_html_e('Unavailable', 'duplicator-pro');
?>
<i class="fas fa-question-circle fa-sm"
data-tooltip-title="<?php esc_attr_e("Recovery Status", 'duplicator-pro'); ?>"
data-tooltip="<?php esc_attr_e('Status is unavailable. Please save the schedule to view recovery status', 'duplicator-pro');
?>"></i>
<?php } ?>
</td>
</tr>
<tr valign="top">
<th scope="row"><label for="schedule-active"><?php esc_html_e('Activated', 'duplicator-pro'); ?></label></th>
<td>
<input name="_active" id="schedule-active" type="checkbox" <?php checked($schedule->active); ?>>
<label for="schedule-active"><?php esc_html_e('Enable This Schedule', 'duplicator-pro'); ?></label><br />
<i class="dpro-edit-info"> <?php esc_html_e('When checked this schedule will run', 'duplicator-pro'); ?></i>
</td>
</tr>
</table><br />
<button
id="dup-pro-save-schedule"
class="button button-primary"
type="submit"
>
<?php esc_html_e('Save Schedule', 'duplicator-pro'); ?>
</button>
</form>
<script>
jQuery(document).ready(function ($) {
DupPro.Schedule.ChangeMode = function () {
var mode = $("#change-mode option:selected").val();
var animate = 400;
$('#repeat-hourly-area, #repeat-daily-area, #repeat-weekly-area, #repeat-monthly-area').hide();
n = $("#repeat-weekly-area input:checked").length;
if (n == 0) {
// Hack so parsely will ignore weekly if it isnt selected
$('#repeat-weekly-mon').prop("checked", true);
}
switch (mode) {
case "0":
$('#repeat-daily-area').show(animate);
$('#start-time-row').show(animate);
break;
case "1":
$('#repeat-weekly-area').show(animate);
$('#start-time-row').show(animate);
break;
case "2":
$('#repeat-monthly-area').show(animate);
$('#start-time-row').show(animate);
break;
case "3":
$('#repeat-hourly-area').show(animate);
$('#start-time-row').hide(animate);
break;
}
}
$('#dup-schedule-copy-select').on('change', function (e) {
let copyId = parseInt($(this).val());
$('#dup-schedule-copy-btn').prop('disabled', (copyId <= 0));
});
/*$('#dup-schedule-copy-select').change(function (evente) {
event.preventDefault();
alert('changed val ' + $(this).val());
$('#dup-schedule-copy-btn').prop('disabled', ($(this).val() > 0));
});*/
$('#dup-schedule-copy-btn').click(function (event) {
event.preventDefault();
let copyId = $('#dup-schedule-copy-select').val();
document.location.href = <?php echo json_encode($scheduleCopyBaseURL); ?> + '&duppro-source-schedule-id=' + copyId;
});
DupPro.Schedule.EditTemplate = function () {
var templateID = $('#schedule-template-selector').val();
var url = <?php echo SnapJson::jsonEncode($editTemplateUrl); ?> + '&package_template_id=' + templateID;
window.open(url, 'edit-template');
};
DupPro.Schedule.ToggleTemplateEditBtn = function () {
$('#schedule-template-edit-btn, #schedule-template-add-btn, #schedule-template-sync-btn').hide();
if ($("#schedule-template-selector").val() > 0) {
$('#schedule-template-edit-btn').show();
} else {
$('#schedule-template-add-btn, #schedule-template-sync-btn').show();
}
}
//INIT
$('#dup-schedule-form').parsley({
excluded: ':disabled'
});
$("#repeat-daily-date, #repeat-daily-on-date").datepicker({
showOn: "both",
buttonText: "<i class='fa fa-calendar'></i>"
});
DupPro.Schedule.ChangeMode();
jQuery('#schedule-name').focus().select();
DupPro.Schedule.ToggleTemplateEditBtn();
$("#schedule-template-selector").change(function () {
DupPro.Schedule.ToggleTemplateEditBtn()
});
});
</script>

View File

@@ -0,0 +1,617 @@
<?php
/**
* @package Duplicator
*/
defined("ABSPATH") or die("");
use Duplicator\Ajax\ServicesSchedule;
use Duplicator\Controllers\PackagesPageController;
use Duplicator\Controllers\SchedulePageController;
use Duplicator\Controllers\SettingsPageController;
use Duplicator\Controllers\ToolsPageController;
use Duplicator\Core\CapMng;
use Duplicator\Core\Controllers\ControllersManager;
use Duplicator\Libs\Snap\SnapJson;
use Duplicator\Models\Storages\AbstractStorageEntity;
/**
* Variables
*
* @var Duplicator\Core\Controllers\ControllersManager $ctrlMng
* @var Duplicator\Core\Views\TplMng $tplMng
* @var array<string, mixed> $tplData
* @var bool $blur
*/
$blur = $tplData['blur'];
$active_schedules = DUP_PRO_Schedule_Entity::get_active();
$active_count = count($active_schedules);
$schedules = DUP_PRO_Schedule_Entity::getAll();
$schedule_count = DUP_PRO_Schedule_Entity::count();
$active_package = DUP_PRO_Package::get_next_active_package();
$active_schedule_id = -1;
if ($active_package != null) {
$active_schedule_id = $active_package->schedule_id;
}
$packagesPageUrl = PackagesPageController::getInstance()->getMenuLink();
$scheduleEditBaseURL = SchedulePageController::getInstance()->getEditBaseUrl();
$scheduleCopyBaseURL = SchedulePageController::getInstance()->getCopyActionUrl();
$settingsScheudleUrl = ControllersManager::getMenuLink(
ControllersManager::SETTINGS_SUBMENU_SLUG,
SettingsPageController::L2_SLUG_SCHEDULE
);
$templatesPageUrl = ToolsPageController::getInstance()->getMenuLink(ToolsPageController::L2_SLUG_TEMPLATE);
?>
<!-- ====================
TOOL-BAR -->
<table class="dpro-edit-toolbar <?php echo ($blur ? 'dup-mock-blur' : ''); ?>">
<tr>
<td>
<select id="bulk_action">
<option value="-1" selected="selected">
<?php esc_html_e("Bulk Actions", 'duplicator-pro'); ?>
</option>
<option value="<?php echo (int) ServicesSchedule::SCHEDULE_BULK_ACTIVATE; ?>" title="Activate selected schedules(s)">
<?php esc_html_e("Activate", 'duplicator-pro'); ?>
</option>
<option value="<?php echo (int) ServicesSchedule::SCHEDULE_BULK_DEACTIVATE; ?>" title="Deactivate selected schedules(s)">
<?php esc_html_e("Deactivate", 'duplicator-pro'); ?>
</option>
<option value="<?php echo (int) ServicesSchedule::SCHEDULE_BULK_DELETE; ?>" title="Delete selected schedules(s)">
<?php esc_html_e("Delete", 'duplicator-pro'); ?>
</option>
</select>
<input
type="button"
id="dup-schedule-bulk-apply"
class="button action"
value="<?php esc_attr_e("Apply", 'duplicator-pro') ?>"
onclick="DupPro.Schedule.BulkAction()"
>
<span class="btn-separator"></span>
<?php if (CapMng::can(CapMng::CAP_SETTINGS, false)) { ?>
<a
href="<?php echo esc_url($settingsScheudleUrl); ?>"
class="button grey-icon dup-schedule-settings"
title="<?php esc_attr_e("Settings", 'duplicator-pro') ?>"
>
<i class="fas fa-sliders-h fa-fw"></i>
</a>
<?php } ?>
<a
href="<?php echo esc_url($templatesPageUrl); ?>"
id="btn-logs-dialog"
class="button dup-schedule-templates"
title="<?php esc_attr_e("Templates", 'duplicator-pro') ?>"
>
<i class="far fa-clone"></i>
</a>
</td>
<td>
<div class="btnnav">
<a href="<?php echo esc_url($scheduleEditBaseURL); ?>" class="button dup-schedule-add-new">
<?php esc_attr_e("Add New", 'duplicator-pro'); ?>
</a>
</div>
</td>
</tr>
</table>
<form
id="dup-schedule-form"
class="<?php echo ($blur ? 'dup-mock-blur' : ''); ?>"
action="<?php echo esc_url(ControllersManager::getCurrentLink()); ?>"
method="post"
>
<input type="hidden" id="dup-schedule-form-action" name="action" value="" />
<input type="hidden" id="dup-schedule-selected-schedule" name="schedule_id" value="-1" />
<!-- ====================
LIST ALL SCHEDULES -->
<table class="widefat schedule-tbl">
<thead>
<tr>
<th style='width:10px;'><input type="checkbox" id="dpro-chk-all" title="Select all packages" onclick="DupPro.Schedule.SetDeleteAll(this)"></th>
<th style='width:255px;'><?php esc_html_e('Name', 'duplicator-pro'); ?></th>
<th><?php esc_html_e('Storage', 'duplicator-pro'); ?></th>
<th><?php esc_html_e('Runs Next', 'duplicator-pro'); ?></th>
<th><?php esc_html_e('Last Ran', 'duplicator-pro'); ?></th>
<th><?php esc_html_e('Active', 'duplicator-pro'); ?></th>
<th class="dup-col-recovery" ><?php esc_html_e('Recovery', 'duplicator-pro'); ?></th>
</tr>
</thead>
<tbody>
<?php if ($schedule_count <= 0) : ?>
<tr>
<td colspan="7" class="dup-schedules-no-schedule">
<h2>
<i class="far fa-clock fa-sm"></i> <?php esc_html_e('No Schedules Found', 'duplicator-pro') ?> <br />
<a href="<?php echo esc_url($scheduleEditBaseURL); ?>">
[<?php esc_html_e('Create New Schedule', 'duplicator-pro') ?>]
</a>
</h2>
</td>
</tr>
<?php endif; ?>
<?php
$i = 0;
foreach ($schedules as $schedule) :
$i++;
$icon_display = (($schedule->getId() == $active_schedule_id) ? 'inline' : 'none');
?>
<tr class="schedule-row <?php echo ($i % 2) ? 'alternate' : ''; ?>">
<td>
<input name="selected_id[]" type="checkbox" value="<?php echo (int) $schedule->getId() ?>" class="item-chk" />
</td>
<td>
<i
id="<?php echo "icon-{" . (int) $schedule->getId() . "}-status"; ?>"
class="fas fa-cog fa-spin schedule-status-icon"
style="display:<?php echo esc_attr($icon_display); ?>; margin-right:4px;">
</i>
<a
id="<?php echo "text-{" . (int) $schedule->getId() . "}"; ?>"
href="javascript:void(0);"
onclick="DupPro.Schedule.Edit('<?php echo (int) $schedule->getId() ?>');"
class="name"
>
<?php echo esc_html($schedule->name); ?>
</a>
<div class="sub-menu">
<span class="link-style dup-schedule-quick-view" onclick="DupPro.Schedule.QuickView('<?php echo (int) $schedule->getId() ?>');">
<?php esc_html_e('Quick View', 'duplicator-pro'); ?>
</span> |
<span class="link-style dup-schedule-edit" onclick="DupPro.Schedule.Edit('<?php echo (int) $schedule->getId() ?>');">
<?php esc_html_e('Edit', 'duplicator-pro'); ?>
</span> |
<span class="link-style dup-schedule-copy" onclick="DupPro.Schedule.Copy('<?php echo (int) $schedule->getId(); ?>');">
<?php esc_html_e('Copy', 'duplicator-pro'); ?>
</span> |
<span class="link-style dup-schedule-delete" onclick="DupPro.Schedule.Delete('<?php echo (int) $schedule->getId(); ?>');">
<?php esc_html_e('Delete', 'duplicator-pro'); ?>
</span> |
<span class="link-style dup-schedule-run-now" onclick="DupPro.Schedule.RunNow('<?php echo (int) $schedule->getId(); ?>');">
<?php esc_html_e('Run Now', 'duplicator-pro'); ?>
</span>
</div>
</td>
<td>
<?php
if (count($schedule->storage_ids) > 0 && strlen(implode('', $schedule->storage_ids)) != 0) {
foreach ($schedule->storage_ids as $storage_id) {
if (($storage = AbstractStorageEntity::getById($storage_id)) === false) {
continue;
}
echo esc_html($storage->getName());
echo '<br/>';
}
} else {
$txt_DeleteStorage = __('No Storage', 'duplicator-pro');
echo "<a href='javascript:void(0)' onclick='DupPro.Schedule.showDeleteStorageMessage()'>"
. "<i class='fa fa-info-circle fa-fw fa-sm'></i>"
. "<u>" . esc_html($txt_DeleteStorage) . "</u></a>";
}
?>
</td>
<td>
<?php echo esc_html($schedule->get_next_run_time_string()); ?>
</td>
<td id="schedule-<?php echo (int) $schedule->getId() ?>-last-ran-string">
<?php echo esc_html($schedule->get_last_ran_string()); ?>
</td>
<td>
<b>
<?php if ($schedule->active) { ?>
<span class="green" ><?php esc_html_e('Yes', 'duplicator-pro'); ?></span>
<?php } else { ?>
<span class="maroon" ><?php esc_html_e('No', 'duplicator-pro'); ?></span>
<?php } ?>
</b>
</td>
<td class="dup-col-recovery" >
<?php $schedule->recoveableHtmlInfo(true); ?>
</td>
</tr>
<tr id='detail-<?php echo (int) $schedule->getId() ?>' class='<?php echo ($i % 2) ? 'alternate' : ''; ?> schedule-detail'>
<td colspan="5">
<?php
$template = DUP_PRO_Package_Template_Entity::getById($schedule->template_id);
?>
<table style="line-height: 15px">
<tr>
<td><b><?php esc_html_e('Package Template:', 'duplicator-pro'); ?></b></td>
<td colspan="3"><?php echo esc_html($template->name); ?></td>
</tr>
<tr>
<td><b><?php esc_html_e('Summary:', 'duplicator-pro'); ?></b></td>
<td colspan="3"><?php echo sprintf(esc_html__('Runs %1$s', 'duplicator-pro'), esc_html($schedule->get_repeat_text())); ?></td>
</tr>
<tr>
<td><b><?php esc_html_e('Last Ran:', 'duplicator-pro') ?></b></td>
<td><?php echo esc_html($schedule->get_last_ran_string()); ?></td>
</tr>
<tr>
<td><b><?php esc_html_e('Times Run:', 'duplicator-pro') ?></b></td>
<td><?php echo (int) $schedule->times_run; ?></td>
</tr>
</table>
</td>
</tr>
<?php endforeach; ?>
</tbody>
<tfoot>
<tr>
<th colspan="7" style="text-align:right; white-space: nowrap; font-size:12px">
<?php
printf(
esc_html_x(
'Total: %1$s | Active: %2$s | Time: %3$s',
'%1$s represents total schedules, %2$s represents active schedules, %3$s represents current time',
'duplicator-pro'
),
(int) $schedule_count,
(int) $active_count,
'<span id="dpro-clock-container"></span>'
);
?>
</th>
</tr>
</tfoot>
</table>
</form>
<?php
$alert1 = new DUP_PRO_UI_Dialog();
$alert1->title = __('Bulk Action Required', 'duplicator-pro');
$alert1->message = __('Please select an action from the "Bulk Actions" drop down menu!', 'duplicator-pro');
$alert1->initAlert();
$alert2 = new DUP_PRO_UI_Dialog();
$alert2->title = __('Selection Required', 'duplicator-pro');
$alert2->wrapperClassButtons = 'dpro-dlg-noschedule-sel-bulk-action-btns';
$alert2->message = __('Please select at least one schedule to perform the action on!', 'duplicator-pro');
$alert2->initAlert();
$alert3 = new DUP_PRO_UI_Dialog();
$alert3->title = __('No Storage', 'duplicator-pro');
$alert3->message = __('All storage types associated with this schedule have been deleted.&nbsp;', 'duplicator-pro');
$alert3->message .= __('To enable this schedule please assign a valid storage type.', 'duplicator-pro');
$alert3->message .= '<br/><br/>';
$alert3->initAlert();
$confirm1 = new DUP_PRO_UI_Dialog();
$confirm1->title = __('Delete Schedule?', 'duplicator-pro');
$confirm1->wrapperClassButtons = 'dpro-dlg-delete-schedules-btns';
$confirm1->message = __('Are you sure you want to delete the selected schedule(s)?', 'duplicator-pro');
$confirm1->message .= '<br/>';
$confirm1->message .= '<small><i>' . __('Note: This action removes all schedules.', 'duplicator-pro') . '</i></small>';
$confirm1->progressText = __('Removing Schedules, Please Wait...', 'duplicator-pro');
$confirm1->jsCallback = 'DupPro.Schedule.BulkDelete()';
$confirm1->initConfirm();
$confirm4 = new DUP_PRO_UI_Dialog();
$confirm4->title = __('Activate Schedule?', 'duplicator-pro');
$confirm4->wrapperClassButtons = 'dpro-dlg-activate-schedules-btns';
$confirm4->message = __('Are you sure you want to activate the selected schedule(s)?', 'duplicator-pro');
$confirm4->message .= '<br/>';
$confirm4->message .= '<small><i>' . __('Note: This action activates all schedules.', 'duplicator-pro') . '</i></small>';
$confirm4->progressText = __('Activating Schedules, Please Wait...', 'duplicator-pro');
$confirm4->jsCallback = 'DupPro.Schedule.BulkActivate()';
$confirm4->initConfirm();
$confirm5 = new DUP_PRO_UI_Dialog();
$confirm5->title = __('Deactivate Schedule?', 'duplicator-pro');
$confirm5->wrapperClassButtons = 'dpro-dlg-deactivate-schedules-btns';
$confirm5->message = __('Are you sure you want to deactivate the selected schedule(s)?', 'duplicator-pro');
$confirm5->message .= '<br/>';
$confirm5->message .= '<small><i>' . __('Note: This action deactivates all schedules.', 'duplicator-pro') . '</i></small>';
$confirm5->progressText = __('Deactivating Schedules, Please Wait...', 'duplicator-pro');
$confirm5->jsCallback = 'DupPro.Schedule.BulkDeactivate()';
$confirm5->initConfirm();
$confirm2 = new DUP_PRO_UI_Dialog();
$confirm2->title = __('RUN SCHEDULE?', 'duplicator-pro');
$confirm2->message = __('Are you sure you want to run schedule now?', 'duplicator-pro');
$confirm2->progressText = __('Running Schedule, Please Wait...', 'duplicator-pro');
$confirm2->jsCallback = 'DupPro.Schedule.Run(this)';
$confirm2->initConfirm();
$confirm3 = new DUP_PRO_UI_Dialog();
$confirm3->title = $confirm1->title;
$confirm3->message = __('Are you sure you want to delete this schedule?', 'duplicator-pro');
$confirm3->progressText = $confirm1->progressText;
$confirm3->jsCallback = 'DupPro.Schedule.DeleteThis(this)';
$confirm3->initConfirm();
$schedule_bulk_action_nonce = wp_create_nonce('duplicator_pro_schedule_bulk_action');
?>
<script>
jQuery(document).ready(function ($) {
/*METHOD: Shows quick view summary */
DupPro.Schedule.QuickView = function (id) {
$('#detail-' + id).toggle();
};
/*METHOD: Run the schedule now and redirect to packages page */
DupPro.Schedule.RunNow = function (schedule_id) {
<?php $confirm2->showConfirm(); ?>
$("#<?php echo esc_js($confirm2->getID()); ?>-confirm").attr('data-id', schedule_id);
};
DupPro.Schedule.Run = function (e) {
var schedule_id = $(e).attr('data-id');
$('#icon-' + schedule_id + '-status').show();
$('#text-' + schedule_id).html("<?php esc_html_e('Queueing Now - Please Wait...', 'duplicator-pro') ?>");
var data = {
action: 'duplicator_pro_run_schedule_now',
schedule_id: schedule_id,
nonce: '<?php echo esc_js(wp_create_nonce('duplicator_pro_run_schedule_now')); ?>'
}
$.ajax({
type: "POST",
url: ajaxurl,
timeout: 10000000,
data: data
}).done(function (respData) {
try {
var data = DupPro.parseJSON(respData);
} catch (err) {
console.error(err);
console.error('JSON parse failed for response data: ' + respData);
return false;
}
window.location.href = <?php echo SnapJson::jsonEncode($packagesPageUrl); ?>;
});
};
/*METHOD: Deletes a single schedule */
DupPro.Schedule.Delete = function (id) {
<?php $confirm3->showConfirm(); ?>
$("#<?php echo esc_js($confirm3->getID()); ?>-confirm").attr('data-id', id);
};
DupPro.Schedule.DeleteThis = function (e) {
var id = $(e).attr('data-id');
$.ajax({
type: "POST",
url: ajaxurl,
dataType: "json",
data: {
action: 'duplicator_pro_schedule_bulk_action',
perform: <?php echo (int) ServicesSchedule::SCHEDULE_BULK_DELETE; ?>,
schedule_ids: [id],
nonce: '<?php echo esc_js($schedule_bulk_action_nonce); ?>'
},
}).done(function (data) {
$('#dup-schedule-form').submit();
});
};
// Creats a comma seperate list of all selected package ids
DupPro.Schedule.SelectedList = function () {
var arr = [];
$("input[name^='selected_id[]']").each(function () {
if ($(this).is(':checked')) {
arr.push($(this).val());
}
});
return arr;
};
// Bulk delete
DupPro.Schedule.BulkDelete = function () {
var list = DupPro.Schedule.SelectedList();
$.ajax({
type: "POST",
url: ajaxurl,
dataType: "json",
data: {
action: 'duplicator_pro_schedule_bulk_action',
perform: <?php echo (int) ServicesSchedule::SCHEDULE_BULK_DELETE; ?>,
schedule_ids: list,
nonce: '<?php echo esc_js($schedule_bulk_action_nonce); ?>'
},
}).done(function (data) {
$('#dup-schedule-form').submit();
});
};
// Bulk activate
DupPro.Schedule.BulkActivate = function () {
var list = DupPro.Schedule.SelectedList();
$.ajax({
type: "POST",
url: ajaxurl,
dataType: "json",
data: {
action: 'duplicator_pro_schedule_bulk_action',
perform: <?php echo (int) ServicesSchedule::SCHEDULE_BULK_ACTIVATE; ?>,
schedule_ids: list,
nonce: '<?php echo esc_js($schedule_bulk_action_nonce); ?>'
},
}).done(function (data) {
if (data.success) {
$('#dup-schedule-form').submit();
} else {
if (data.message.length > 0) {
$('#<?php echo esc_js($confirm4->getID()); ?>-progress').hide();
$('#<?php echo esc_js($confirm4->getMessageID()); ?>').html(data.message);
}
}
});
};
// Bulk deactivate
DupPro.Schedule.BulkDeactivate = function () {
var list = DupPro.Schedule.SelectedList();
$.ajax({
type: "POST",
url: ajaxurl,
dataType: "json",
data: {
action: 'duplicator_pro_schedule_bulk_action',
perform: <?php echo (int) ServicesSchedule::SCHEDULE_BULK_DEACTIVATE; ?>,
schedule_ids: list,
nonce: '<?php echo esc_js($schedule_bulk_action_nonce); ?>'
},
}).done(function (data) {
$('#dup-schedule-form').submit();
});
};
/*METHOD: Bulk action response */
DupPro.Schedule.BulkAction = function () {
var list = DupPro.Schedule.SelectedList();
if (list.length == 0) {
<?php $alert2->showAlert(); ?>
return;
}
var action = $('#bulk_action').val(),
checked = ($('.item-chk:checked').length > 0);
if (action == -1 ) {
<?php $alert1->showAlert(); ?>
return;
}
if (checked) {
switch (action) {
case '<?php echo (int) ServicesSchedule::SCHEDULE_BULK_DELETE; ?>':
<?php $confirm1->showConfirm(); ?>
break;
case '<?php echo (int) ServicesSchedule::SCHEDULE_BULK_ACTIVATE; ?>':
<?php $confirm4->showConfirm(); ?>
break;
case '<?php echo (int) ServicesSchedule::SCHEDULE_BULK_DEACTIVATE; ?>':
<?php $confirm5->showConfirm(); ?>
break;
default:
<?php $alert2->showAlert(); ?>
break;
}
}
};
/*METHOD: Edit a single schedule */
DupPro.Schedule.Edit = function (id) {
document.location.href = <?php echo json_encode($scheduleEditBaseURL); ?> + '&schedule_id=' + id;
};
/*METHOD: Copy a schedule */
DupPro.Schedule.Copy = function (id) {
document.location.href = <?php echo json_encode($scheduleCopyBaseURL); ?> + '&duppro-source-schedule-id=' + id;
};
/*METHOD: Set delete all */
DupPro.Schedule.SetDeleteAll = function (chkbox) {
$('.item-chk').each(function () {
this.checked = chkbox.checked;
});
};
/*METHOD: Shows the delete storage message*/
DupPro.Schedule.showDeleteStorageMessage = function() {
<?php $alert3->showAlert(); ?>
};
/*METHOD: Enableds the update flag to track proccessing */
DupPro.Schedule.SetUpdateInterval = function (period) {
console.log('setting interval to ' + period);
if (DupPro.Schedule.setIntervalID != -1) {
clearInterval(DupPro.Schedule.setIntervalID);
DupPro.Schedule.setIntervalID = -1
}
DupPro.Schedule.setIntervalID = setInterval(DupPro.Schedule.UpdateSchedules, period * 1000);
};
/*METHOD: Checks the schedule status */
DupPro.Schedule.UpdateSchedules = function () {
var data = {
action: 'duplicator_pro_get_schedule_infos',
nonce: '<?php echo esc_js(wp_create_nonce('duplicator_pro_get_schedule_infos')); ?>'
};
$.ajax({
type: "POST",
url: ajaxurl,
data: data,
success: function (respData) {
try {
var schedule_infos = DupPro.parseJSON(respData);
} catch (err) {
console.error(err);
console.error('JSON parse failed for response data: ' + respData);
console.log("error");
console.log(data);
$(".schedule-status-icon").css('display', 'none');
DupPro.Schedule.SetUpdateInterval(60);
return false;
}
activeSchedulePresent = false;
for (schedule_info_key in schedule_infos) {
var schedule_info = schedule_infos[schedule_info_key];
var is_running_selector = "#icon-" + schedule_info.schedule_id + "-status";
var last_ran_selector = "#schedule-" + schedule_info.schedule_id + "-last-ran-string";
if (schedule_info.is_running) {
$(is_running_selector).show();
activeSchedulePresent = true;
} else {
$(is_running_selector).hide();
}
$(last_ran_selector).text(schedule_info.last_ran_string);
}
if (activeSchedulePresent) {
DupPro.Schedule.SetUpdateInterval(10);
} else {
DupPro.Schedule.SetUpdateInterval(60);
}
},
error: function (data) {
console.log("error");
console.log(data);
$(".schedule-status-icon").css('display', 'none');
DupPro.Schedule.SetUpdateInterval(60);
}
});
};
//INIT: startup items
$("tr.schedule-row").hover(
function () {
$(this).find(".sub-menu").show();
},
function () {
$(this).find(".sub-menu").hide();
}
);
DupPro.UI.Clock(DupPro._WordPressInitTime);
DupPro.Schedule.setIntervalID = -1;
DupPro.Schedule.UpdateSchedules();
});
</script>